ZGlmZiAtLWdpdCBhLy5naXRodWIvYWN0aW9ucy9vbl9ob3N0X3Rlc3QvYWN0aW9uLnlhbWwgYi8uZ2l0aHViL2FjdGlvbnMvb25faG9zdF90ZXN0L2FjdGlvbi55YW1sCmluZGV4IGExMGE4YmYuLjdkZjVlMmYgMTAwNjQ0Ci0tLSBhLy5naXRodWIvYWN0aW9ucy9vbl9ob3N0X3Rlc3QvYWN0aW9uLnlhbWwKKysrIGIvLmdpdGh1Yi9hY3Rpb25zL29uX2hvc3RfdGVzdC9hY3Rpb24ueWFtbApAQCAtNjAsMTEgKzYwLDE2IEBACiAgICAgICBydW46IHwKICAgICAgICAgZWNobyAiUFlUSE9OUEFUSD0kR0lUSFVCX1dPUktTUEFDRSIgPj4gJEdJVEhVQl9FTlYKICAgICAgICAgZWNobyAiVEVTVF9SRVNVTFRTX0RJUj0ke0dJVEhVQl9XT1JLU1BBQ0V9L3VuaXQtdGVzdC1yZXN1bHRzIiA+PiAkR0lUSFVCX0VOVgorICAgICAgICBlY2hvICJDT1ZFUkFHRV9ESVI9JHtHSVRIVUJfV09SS1NQQUNFfS9jb3ZlcmFnZSIgPj4gJEdJVEhVQl9FTlYKICAgICAgICAgZWNobyAiVEVTVF9SRVBPUlRfRklMRT0ke0dJVEhVQl9XT1JLU1BBQ0V9LyR7e21hdHJpeC5wbGF0Zm9ybX19LSR7e21hdHJpeC5zaGFyZH19IiA+PiAkR0lUSFVCX0VOVgogICAgIC0gbmFtZTogUnVuIFRlc3RzCiAgICAgICBzaGVsbDogYmFzaAogICAgICAgcnVuOiB8CiAgICAgICAgIHNldCAteAorICAgICAgICAjIFN0YXJib2FyZCB0b29sY2hhaW5zIGFyZSBkb3dubG9hZGVkIHRvIGEgZGlmZmVyZW50IGRpciBvbiBnaXRodWIuIENyZWF0ZSBhIHN5bWxpbmsgdG8gcmVhc3N1cmUgb3VyIHRvb2xpbmcgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmUuCisgICAgICAgIGlmIFsgLWQgL3Jvb3Qvc3RhcmJvYXJkLXRvb2xjaGFpbnMgXTsgdGhlbgorICAgICAgICAgIGxuIC1zIC9yb290L3N0YXJib2FyZC10b29sY2hhaW5zIC9naXRodWIvaG9tZS9zdGFyYm9hcmQtdG9vbGNoYWlucworICAgICAgICBmaQogICAgICAgICBsb2FkZXJfYXJncz0nJwogICAgICAgICBpZiBbICIke0NPQkFMVF9CT09UTE9BREVSfSIgIT0gIm51bGwiIF07IHRoZW4KICAgICAgICAgICBsb2FkZXJfYXJncz0iLS1sb2FkZXJfcGxhdGZvcm0gJHtDT0JBTFRfQk9PVExPQURFUn0gLS1sb2FkZXJfY29uZmlnICR7e21hdHJpeC5jb25maWd9fSIKQEAgLTc3LDYgKzgyLDEwIEBACiAgICAgICAgICAgeHZmYi1ydW4gLWEgLS1zZXJ2ZXItYXJncz0iLXNjcmVlbiAwIDE5MjB4MTA4MHgyNGkgK3JlbmRlciArZXh0ZW5zaW9uIEdMWCAtbm9yZXNldCIgcHl0aG9uMyAkR0lUSFVCX1dPUktTUEFDRS9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL2JsYWNrX2JveF90ZXN0cy5weSAtLXBsYXRmb3JtICR7e21hdHJpeC50YXJnZXRfcGxhdGZvcm19fSAtLWNvbmZpZyAke3ttYXRyaXguY29uZmlnfX0gJHtsb2FkZXJfYXJnc30gLS10ZXN0X3NldCB3cHQKICAgICAgICAgZWxpZiBbWyAiJHt7bWF0cml4LnNoYXJkfX0iID09ICdldmVyZ3JlZW4nIF1dOyB0aGVuCiAgICAgICAgICAgeHZmYi1ydW4gLWEgLS1zZXJ2ZXItYXJncz0iLXNjcmVlbiAwIDE5MjB4MTA4MHgyNGkgK3JlbmRlciArZXh0ZW5zaW9uIEdMWCAtbm9yZXNldCIgcHl0aG9uMyAkR0lUSFVCX1dPUktTUEFDRS9jb2JhbHQvZXZlcmdyZWVuX3Rlc3RzL2V2ZXJncmVlbl90ZXN0cy5weSAtLXBsYXRmb3JtICR7e21hdHJpeC50YXJnZXRfcGxhdGZvcm19fSAtLWNvbmZpZyAke3ttYXRyaXguY29uZmlnfX0gJHtsb2FkZXJfYXJnc30gLS1uby1jYW5fbW91bnRfdG1wZnMKKyAgICAgICAgZWxpZiBbWyAiJHt7bWF0cml4LnNoYXJkfX0iID09ICdldmVyZ3JlZW4tYXMtYmxhY2tib3gnIF1dOyB0aGVuCisgICAgICAgICAgeHZmYi1ydW4gLWEgLS1zZXJ2ZXItYXJncz0iLXNjcmVlbiAwIDE5MjB4MTA4MHgyNGkgK3JlbmRlciArZXh0ZW5zaW9uIEdMWCAtbm9yZXNldCIgcHl0aG9uMyAkR0lUSFVCX1dPUktTUEFDRS9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL2JsYWNrX2JveF90ZXN0cy5weSAtLXBsYXRmb3JtICR7e21hdHJpeC50YXJnZXRfcGxhdGZvcm19fSAtLWNvbmZpZyAke3ttYXRyaXguY29uZmlnfX0gJHtsb2FkZXJfYXJnc30gLS10ZXN0X3NldCBldmVyZ3JlZW4KKyAgICAgICAgZWxpZiBbWyAiJHt7bWF0cml4LnNoYXJkfX0iID09ICdjb3ZlcmFnZScgXV07IHRoZW4KKyAgICAgICAgICB4dmZiLXJ1biAtYSAtLXNlcnZlci1hcmdzPSItc2NyZWVuIDAgMTkyMHgxMDgweDI0aSArcmVuZGVyICtleHRlbnNpb24gR0xYIC1ub3Jlc2V0IiBweXRob24zICR7R0lUSFVCX1dPUktTUEFDRX0vc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkgLS1wbGF0Zm9ybSAke3ttYXRyaXgudGFyZ2V0X3BsYXRmb3JtfX0gLS1jb25maWcgJHt7bWF0cml4LmNvbmZpZ319IC1yICR7bG9hZGVyX2FyZ3N9IC0teG1sX291dHB1dF9kaXI9JHtURVNUX1JFU1VMVFNfRElSfSAtLWNvdmVyYWdlX2Rpcj0ke0NPVkVSQUdFX0RJUn0gLS1jb3ZlcmFnZV9yZXBvcnQKICAgICAgICAgZWxzZQogICAgICAgICAgIGlmIFtbICIke3tpbnB1dHMub3N9fSIgPT0gJ3dpbmRvd3MnIF1dOyB0aGVuCiAgICAgICAgICAgICBweXRob24zICR7R0lUSFVCX1dPUktTUEFDRX0vc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkgLS1wbGF0Zm9ybSAke3ttYXRyaXgudGFyZ2V0X3BsYXRmb3JtfX0gLS1jb25maWcgJHt7bWF0cml4LmNvbmZpZ319IC1zICR7e21hdHJpeC5zaGFyZH19IC1yCkBAIC05NywzICsxMDYsMTQgQEAKICAgICAgIHdpdGg6CiAgICAgICAgIG5hbWU6IHVuaXQtdGVzdC1yZXBvcnRzCiAgICAgICAgIHBhdGg6ICR7e2Vudi5URVNUX1JFUE9SVF9GSUxFfX0KKyAgICAtIG5hbWU6IFVwbG9hZCBjb3ZlcmFnZSBodG1sIHJlcG9ydAorICAgICAgaWY6IHN1Y2Nlc3MoKSAmJiBtYXRyaXguc2hhcmQgPT0gJ2NvdmVyYWdlJworICAgICAgdXNlczogYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjMKKyAgICAgIHdpdGg6CisgICAgICAgIG5hbWU6IGNvdmVyYWdlLXJlcG9ydAorICAgICAgICBwYXRoOiAke3tlbnYuQ09WRVJBR0VfRElSfX0vaHRtbAorICAgIC0gbmFtZTogVXBsb2FkIHRvIENvZGVjb3YKKyAgICAgIGlmOiBzdWNjZXNzKCkgJiYgbWF0cml4LnNoYXJkID09ICdjb3ZlcmFnZScKKyAgICAgIHVzZXM6IGNvZGVjb3YvY29kZWNvdi1hY3Rpb25AdjMKKyAgICAgIHdpdGg6CisgICAgICAgIGZpbGVzOiAke3tlbnYuQ09WRVJBR0VfRElSfX0vcmVwb3J0LnR4dApkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9jb25maWcvZXZlcmdyZWVuLXg2NC5qc29uIGIvLmdpdGh1Yi9jb25maWcvZXZlcmdyZWVuLXg2NC5qc29uCmluZGV4IGYzMTcxZWMuLmNkMzNkMjQgMTAwNjQ0Ci0tLSBhLy5naXRodWIvY29uZmlnL2V2ZXJncmVlbi14NjQuanNvbgorKysgYi8uZ2l0aHViL2NvbmZpZy9ldmVyZ3JlZW4teDY0Lmpzb24KQEAgLTIsNyArMiwxNiBAQAogICAiZG9ja2VyX3NlcnZpY2UiOiAiYnVpbGQtbGludXgtZXZlcmdyZWVuIiwKICAgIm9uX2hvc3RfdGVzdCI6IHRydWUsCiAgICJib290bG9hZGVyIjogImxpbnV4LXg2NHgxMSIsCi0gICJvbl9ob3N0X3Rlc3Rfc2hhcmRzIjogWyIwIiwgIjEiLCAiMiIsICIzIiwgImJsYWNrYm94IiwgIndwdCIsICJldmVyZ3JlZW4iXSwKKyAgIm9uX2hvc3RfdGVzdF9zaGFyZHMiOiBbCisgICAgIjAiLAorICAgICIxIiwKKyAgICAiMiIsCisgICAgIjMiLAorICAgICJibGFja2JveCIsCisgICAgIndwdCIsCisgICAgImV2ZXJncmVlbiIsCisgICAgImV2ZXJncmVlbi1hcy1ibGFja2JveCIKKyAgXSwKICAgInBsYXRmb3JtcyI6IFsKICAgICAiZXZlcmdyZWVuLXg2NCIsCiAgICAgImV2ZXJncmVlbi14NjQtc2J2ZXJzaW9uLTE1IiwKZGlmZiAtLWdpdCBhLy5naXRodWIvY29uZmlnL2xpbnV4LWNvdmVyYWdlLmpzb24gYi8uZ2l0aHViL2NvbmZpZy9saW51eC1jb3ZlcmFnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzkwMDYKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aHViL2NvbmZpZy9saW51eC1jb3ZlcmFnZS5qc29uCkBAIC0wLDAgKzEsMTYgQEAKK3sKKyAgImRvY2tlcl9zZXJ2aWNlIjogImJ1aWxkLWxpbnV4IiwKKyAgIm9uX2hvc3RfdGVzdCI6IHRydWUsCisgICJvbl9ob3N0X3Rlc3Rfc2hhcmRzIjogWyJjb3ZlcmFnZSJdLAorICAicGxhdGZvcm1zIjogWworICAgICJsaW51eC1jb3ZlcmFnZSIKKyAgXSwKKyAgImluY2x1ZGVzIjogWworICAgIHsKKyAgICAgICJuYW1lIjoibGludXgiLAorICAgICAgInBsYXRmb3JtIjoibGludXgtY292ZXJhZ2UiLAorICAgICAgInRhcmdldF9wbGF0Zm9ybSI6ImxpbnV4LXg2NHgxMSIsCisgICAgICAiZXh0cmFfZ25fYXJndW1lbnRzIjoidXNlX2NsYW5nX2NvdmVyYWdlPXRydWUiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS8uZ2l0aHViL2NvbmZpZy9saW51eC1tb2R1bGFyLmpzb24gYi8uZ2l0aHViL2NvbmZpZy9saW51eC1tb2R1bGFyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzZjliMQotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvY29uZmlnL2xpbnV4LW1vZHVsYXIuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisgICJkb2NrZXJfc2VydmljZSI6ICJidWlsZC1saW51eCIsCisgICJvbl9ob3N0X3Rlc3QiOiB0cnVlLAorICAib25faG9zdF90ZXN0X3NoYXJkcyI6IFsiMCIsICIxIiwgIjIiLCAiMyIsICJ3cHQiXSwKKyAgInBsYXRmb3JtcyI6IFsKKyAgICAibGludXgteDY0eDExLW1vZHVsYXIiCisgIF0sCisgICJpbmNsdWRlcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6Im1vZHVsYXIiLAorICAgICAgInBsYXRmb3JtIjoibGludXgteDY0eDExLW1vZHVsYXIiLAorICAgICAgInRhcmdldF9wbGF0Zm9ybSI6ImxpbnV4LXg2NHgxMSIsCisgICAgICAiZXh0cmFfZ25fYXJndW1lbnRzIjoiYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluPXRydWUiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS8uZ2l0aHViL3dvcmtmbG93cy9hbmRyb2lkLnlhbWwgYi8uZ2l0aHViL3dvcmtmbG93cy9hbmRyb2lkLnlhbWwKaW5kZXggZjk0ZGM3ZS4uNDYyMjIwMSAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvYW5kcm9pZC55YW1sCisrKyBiLy5naXRodWIvd29ya2Zsb3dzL2FuZHJvaWQueWFtbApAQCAtMiw3ICsyLDcgQEAKIAogb246CiAgIHB1bGxfcmVxdWVzdDoKLSAgICB0eXBlczogW3JlYWR5X2Zvcl9yZXZpZXcsIG9wZW5lZCwgcmVvcGVuZWQsIHN5bmNocm9uaXplLCBsYWJlbGVkXQorICAgIHR5cGVzOiBbb3BlbmVkLCByZW9wZW5lZCwgc3luY2hyb25pemUsIGxhYmVsZWRdCiAgICAgYnJhbmNoZXM6CiAgICAgICAtIG1haW4KICAgICAgIC0gZmVhdHVyZS8qCmRpZmYgLS1naXQgYS8uZ2l0aHViL3dvcmtmbG93cy9ldmVyZ3JlZW4ueWFtbCBiLy5naXRodWIvd29ya2Zsb3dzL2V2ZXJncmVlbi55YW1sCmluZGV4IGVmMTJmZGYuLjIyZTU2ZTQgMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL2V2ZXJncmVlbi55YW1sCisrKyBiLy5naXRodWIvd29ya2Zsb3dzL2V2ZXJncmVlbi55YW1sCkBAIC0yLDcgKzIsNyBAQAogCiBvbjoKICAgcHVsbF9yZXF1ZXN0OgotICAgIHR5cGVzOiBbcmVhZHlfZm9yX3Jldmlldywgb3BlbmVkLCByZW9wZW5lZCwgc3luY2hyb25pemUsIGxhYmVsZWRdCisgICAgdHlwZXM6IFtvcGVuZWQsIHJlb3BlbmVkLCBzeW5jaHJvbml6ZSwgbGFiZWxlZF0KICAgICBicmFuY2hlczoKICAgICAgIC0gbWFpbgogICAgICAgLSBmZWF0dXJlLyoKZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL2xpbnV4LnlhbWwgYi8uZ2l0aHViL3dvcmtmbG93cy9saW51eC55YW1sCmluZGV4IGNmMTgzNDEuLmUxNTA0MWQgMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL2xpbnV4LnlhbWwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MvbGludXgueWFtbApAQCAtMiw3ICsyLDcgQEAKIAogb246CiAgIHB1bGxfcmVxdWVzdDoKLSAgICB0eXBlczogW3JlYWR5X2Zvcl9yZXZpZXcsIG9wZW5lZCwgcmVvcGVuZWQsIHN5bmNocm9uaXplLCBsYWJlbGVkXQorICAgIHR5cGVzOiBbb3BlbmVkLCByZW9wZW5lZCwgc3luY2hyb25pemUsIGxhYmVsZWRdCiAgICAgYnJhbmNoZXM6CiAgICAgICAtIG1haW4KICAgICAgIC0gZmVhdHVyZS8qCkBAIC00NiwzICs0NiwyNyBAQAogICAgIHdpdGg6CiAgICAgICBwbGF0Zm9ybTogbGludXgtZ2NjLTYtMwogICAgICAgbmlnaHRseTogJHt7IGdpdGh1Yi5ldmVudC5pbnB1dHMubmlnaHRseSB9fQorICAjIFRPRE8oYi8yODU2MzI3ODApOiBFbmFibGUgYmxhY2tib3ggdGVzdHMgZm9yIG1vZHVsYXIgbGludXggd29ya2Zsb3dzLgorICBsaW51eC1tb2R1bGFyOgorICAgIHVzZXM6IC4vLmdpdGh1Yi93b3JrZmxvd3MvbWFpbi55YW1sCisgICAgcGVybWlzc2lvbnM6CisgICAgICBwYWNrYWdlczogd3JpdGUKKyAgICAgIHB1bGwtcmVxdWVzdHM6IHdyaXRlCisgICAgd2l0aDoKKyAgICAgIHBsYXRmb3JtOiBsaW51eC1tb2R1bGFyCisgICAgICBuaWdodGx5OiAke3sgZ2l0aHViLmV2ZW50LmlucHV0cy5uaWdodGx5IH19CisgICAgICBtb2R1bGFyOiB0cnVlCisgIGxpbnV4LWNvdmVyYWdlOgorICAgICMgUnVuIG9uIG1haW4gYnJhbmNoIGZvciBwdXNoZXMsIFBScyBhbmQgbWFudWFsIGludm9jYXRpb25zLgorICAgIGlmOiB8CisgICAgICR7eyBnaXRodWIucmVmID09ICdyZWZzL2hlYWRzL21haW4nICYmCisgICAgICAgICAoZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3B1c2gnIHx8CisgICAgICAgICBnaXRodWIuZXZlbnRfbmFtZSA9PSAncHVsbF9yZXF1ZXN0JyB8fAorICAgICAgICAgKGdpdGh1Yi5ldmVudF9uYW1lID09ICd3b3JrZmxvd19kaXNwYXRjaCcgJiYgaW5wdXRzLm5pZ2h0bHkgPT0gJ2ZhbHNlJykpIH19CisgICAgdXNlczogLi8uZ2l0aHViL3dvcmtmbG93cy9tYWluLnlhbWwKKyAgICBwZXJtaXNzaW9uczoKKyAgICAgIHBhY2thZ2VzOiB3cml0ZQorICAgICAgcHVsbC1yZXF1ZXN0czogd3JpdGUKKyAgICB3aXRoOgorICAgICAgcGxhdGZvcm06IGxpbnV4LWNvdmVyYWdlCisgICAgICBuaWdodGx5OiAke3sgZ2l0aHViLmV2ZW50LmlucHV0cy5uaWdodGx5IH19CmRpZmYgLS1naXQgYS8uZ2l0aHViL3dvcmtmbG93cy9tYWluLnlhbWwgYi8uZ2l0aHViL3dvcmtmbG93cy9tYWluLnlhbWwKaW5kZXggZDE4N2JiNS4uYjUwMWMxZCAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvbWFpbi55YW1sCisrKyBiLy5naXRodWIvd29ya2Zsb3dzL21haW4ueWFtbApAQCAtMjQsNiArMjQsMTEgQEAKICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCiAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICBkZWZhdWx0OiAiIgorICAgICAgbW9kdWxhcjoKKyAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoaXMgaXMgYSBtb2R1bGFyIGJ1aWxkLicKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogZmFsc2UKIAogIyBHbG9iYWwgZW52IHZhcnMuCiBlbnY6CkBAIC01NiwxNSArNjEsMTIgQEAKICAgICAgIEdJVEhVQl9UT0tFTjogJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19CiAgICAgICBHSVRIVUJfUFJfUkVQT19VUkw6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmJhc2UucmVwby51cmwgfX0KICAgICAgIEdJVEhVQl9FVkVOVF9OVU1CRVI6ICR7eyBnaXRodWIuZXZlbnQubnVtYmVyIH19Ci0gICAgIyBBbGwgdHJpZ2dlcnMgZXhjZXB0IGRyYWZ0IFBScywgdW5sZXNzIFBSIGlzIGxhYmVsZWQgd2l0aCBydW50ZXN0CiAgICAgaWY6IHwKLSAgICAgIGdpdGh1Yi5ldmVudF9uYW1lICE9ICdwdWxsX3JlcXVlc3QnIHx8CisgICAgICBnaXRodWIuZXZlbnQuYWN0aW9uICE9ICdsYWJlbGVkJyB8fAogICAgICAgKAotICAgICAgICBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmRyYWZ0ID09IGZhbHNlIHx8Ci0gICAgICAgICgKLSAgICAgICAgICBnaXRodWIuZXZlbnQuYWN0aW9uID09ICdsYWJlbGVkJyAmJgotICAgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdydW50ZXN0JwotICAgICAgICApCisgICAgICAgIGdpdGh1Yi5ldmVudC5hY3Rpb24gPT0gJ2xhYmVsZWQnICYmCisgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdydW50ZXN0JyB8fAorICAgICAgICBnaXRodWIuZXZlbnQubGFiZWwubmFtZSA9PSAnb25fZGV2aWNlJwogICAgICAgKQogICAgIHN0ZXBzOgogICAgICAgLSBpZDogY2hlY2tvdXQKQEAgLTI1MCw3ICsyNTIsNyBAQAogICAgICAgICAgIHR5cGU6IG9uZGV2aWNlCiAgICAgICAgICAgb3M6IGxpbnV4CiAKLSAgIyBSdW5zIG9uLWhvc3QgaW50ZWdyYXRpb24gYW5kIHVuaXQgdGVzdHMuCisgICMgUnVucyBvbi1kZXZpY2UgaW50ZWdyYXRpb24gYW5kIHVuaXQgdGVzdHMuCiAgIG9uLWRldmljZS10ZXN0OgogICAgIG5lZWRzOiBbaW5pdGlhbGl6ZSwgYnVpbGRdCiAgICAgIyBSdW4gT0RUIHdoZW4gb25fZGV2aWNlIGxhYmVsIGlzIGFwcGxpZWQgb24gUFIuCkBAIC0yNzYsNiArMjc4LDcgQEAKICAgICBlbnY6CiAgICAgICBDT0JBTFRfQk9PVExPQURFUjogJHt7IG5lZWRzLmluaXRpYWxpemUub3V0cHV0cy5ib290bG9hZGVyIH19CiAgICAgICBPTl9ERVZJQ0VfVEVTVF9BVFRFTVBUUzogJHt7IG5lZWRzLmluaXRpYWxpemUub3V0cHV0cy5vbl9kZXZpY2VfdGVzdF9hdHRlbXB0cyB9fQorICAgICAgTU9EVUxBUl9CVUlMRDogJHt7IGlucHV0cy5tb2R1bGFyICYmIDEgfHwgMCB9fQogICAgIHN0ZXBzOgogICAgICAgLSBuYW1lOiBDaGVja291dAogICAgICAgICB1c2VzOiBrYWlkb2tlcnQvY2hlY2tvdXRAdjMuNS45OTkKQEAgLTMwNiw2ICszMDksNyBAQAogICAgICAgIyB3aXRoIHBlcm1pc3Npb24gZGVuaWVkIGVycm9yLgogICAgICAgSE9NRTogL3Jvb3QKICAgICAgIENPQkFMVF9CT09UTE9BREVSOiAke3tuZWVkcy5pbml0aWFsaXplLm91dHB1dHMuYm9vdGxvYWRlcn19CisgICAgICBNT0RVTEFSX0JVSUxEOiAke3sgaW5wdXRzLm1vZHVsYXIgJiYgMSB8fCAwIH19CiAgICAgc3RlcHM6CiAgICAgICAtIG5hbWU6IENoZWNrb3V0CiAgICAgICAgIHVzZXM6IGthaWRva2VydC9jaGVja291dEB2My41Ljk5OQpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvbWFpbl93aW4ueWFtbCBiLy5naXRodWIvd29ya2Zsb3dzL21haW5fd2luLnlhbWwKaW5kZXggNDgyN2YzZC4uMzI4NWYxYSAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvbWFpbl93aW4ueWFtbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy9tYWluX3dpbi55YW1sCkBAIC0xNCw2ICsxNCwxMSBAQAogICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgZGVmYXVsdDogJ2ZhbHNlJworICAgICAgbW9kdWxhcjoKKyAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoaXMgaXMgYSBtb2R1bGFyIGJ1aWxkLicKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogZmFsc2UKIAogIyBHbG9iYWwgZW52IHZhcnMuCiBlbnY6CkBAIC00OSwxMyArNTQsMTAgQEAKICAgICAgIEdJVEhVQl9FVkVOVF9OVU1CRVI6ICR7eyBnaXRodWIuZXZlbnQubnVtYmVyIH19CiAgICAgIyBBbGwgdHJpZ2dlcnMgZXhjZXB0IGRyYWZ0IFBScywgdW5sZXNzIFBSIGlzIGxhYmVsZWQgd2l0aCBydW50ZXN0CiAgICAgaWY6IHwKLSAgICAgIGdpdGh1Yi5ldmVudF9uYW1lICE9ICdwdWxsX3JlcXVlc3QnIHx8CisgICAgICBnaXRodWIuZXZlbnQuYWN0aW9uICE9ICdsYWJlbGVkJyB8fAogICAgICAgKAotICAgICAgICBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmRyYWZ0ID09IGZhbHNlIHx8Ci0gICAgICAgICgKLSAgICAgICAgICBnaXRodWIuZXZlbnQuYWN0aW9uID09ICdsYWJlbGVkJyAmJgotICAgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdydW50ZXN0JwotICAgICAgICApCisgICAgICAgIGdpdGh1Yi5ldmVudC5hY3Rpb24gPT0gJ2xhYmVsZWQnICYmCisgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdydW50ZXN0JwogICAgICAgKQogICAgIHN0ZXBzOgogICAgICAgLSBpZDogQ2hlY2tvdXQKQEAgLTE3MSw2ICsxNzMsOCBAQAogICAgICAgICBzaGFyZDogJHt7IGZyb21Kc29uKG5lZWRzLmluaXRpYWxpemUub3V0cHV0cy5vbl9ob3N0X3Rlc3Rfc2hhcmRzKSB9fQogICAgICAgICBjb25maWc6IFtkZXZlbF0KICAgICAgICAgaW5jbHVkZTogJHt7IGZyb21Kc29uKG5lZWRzLmluaXRpYWxpemUub3V0cHV0cy5pbmNsdWRlcykgfX0KKyAgICBlbnY6CisgICAgICBNT0RVTEFSX0JVSUxEOiAke3sgaW5wdXRzLm1vZHVsYXIgJiYgMSB8fCAwIH19CiAgICAgc3RlcHM6CiAgICAgICAtIG5hbWU6IENoZWNrb3V0CiAgICAgICAgIHVzZXM6IGthaWRva2VydC9jaGVja291dEB2My41Ljk5OQpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvcmFzcGktMi55YW1sIGIvLmdpdGh1Yi93b3JrZmxvd3MvcmFzcGktMi55YW1sCmluZGV4IDYyZDA3MDguLmFjNDJhYzggMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL3Jhc3BpLTIueWFtbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy9yYXNwaS0yLnlhbWwKQEAgLTIsNyArMiw3IEBACiAKIG9uOgogICBwdWxsX3JlcXVlc3Q6Ci0gICAgdHlwZXM6IFtyZWFkeV9mb3JfcmV2aWV3LCBvcGVuZWQsIHJlb3BlbmVkLCBzeW5jaHJvbml6ZSwgbGFiZWxlZF0KKyAgICB0eXBlczogW29wZW5lZCwgcmVvcGVuZWQsIHN5bmNocm9uaXplLCBsYWJlbGVkXQogICAgIGJyYW5jaGVzOgogICAgICAgLSBtYWluCiAgICAgICAtIGZlYXR1cmUvKgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3Mvc3R1Yi55YW1sIGIvLmdpdGh1Yi93b3JrZmxvd3Mvc3R1Yi55YW1sCmluZGV4IGMxMDVhNTkuLjhjNDBhNGUgMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL3N0dWIueWFtbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy9zdHViLnlhbWwKQEAgLTIsNyArMiw3IEBACiAKIG9uOgogICBwdWxsX3JlcXVlc3Q6Ci0gICAgdHlwZXM6IFtyZWFkeV9mb3JfcmV2aWV3LCBvcGVuZWQsIHJlb3BlbmVkLCBzeW5jaHJvbml6ZSwgbGFiZWxlZF0KKyAgICB0eXBlczogW29wZW5lZCwgcmVvcGVuZWQsIHN5bmNocm9uaXplLCBsYWJlbGVkXQogICAgIGJyYW5jaGVzOgogICAgICAgLSBtYWluCiAgICAgICAtIGZlYXR1cmUvKgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3Mvd2luMzIueWFtbCBiLy5naXRodWIvd29ya2Zsb3dzL3dpbjMyLnlhbWwKaW5kZXggNDQ5YTlkMi4uYjUyMjk5MiAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3Mvd2luMzIueWFtbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy93aW4zMi55YW1sCkBAIC0yLDcgKzIsNyBAQAogCiBvbjoKICAgcHVsbF9yZXF1ZXN0OgotICAgIHR5cGVzOiBbcmVhZHlfZm9yX3Jldmlldywgb3BlbmVkLCByZW9wZW5lZCwgc3luY2hyb25pemUsIGxhYmVsZWRdCisgICAgdHlwZXM6IFtvcGVuZWQsIHJlb3BlbmVkLCBzeW5jaHJvbml6ZSwgbGFiZWxlZF0KICAgICBicmFuY2hlczoKICAgICAgIC0gbWFpbgogICAgICAgLSBmZWF0dXJlLyoKZGlmZiAtLWdpdCBhL0NPTlRSSUJVVElORy5tZCBiL0NPTlRSSUJVVElORy5tZAppbmRleCAzMzJkNmFiLi45YjgyNzQ5IDEwMDY0NAotLS0gYS9DT05UUklCVVRJTkcubWQKKysrIGIvQ09OVFJJQlVUSU5HLm1kCkBAIC0xLDY0ICsxLDk1IEBACi0jIENvbnRyaWJ1dGluZyB0byBDb2JhbHQKKyMgQ29udHJpYnV0aW5nIGd1aWRlbGluZXMKIAotV2UnZCBsb3ZlIHRvIGhlYXIgYWJvdXQgaG93IHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8gQ29iYWx0ISBJdCdzIHdvcnRoCi1yZWFkaW5nIHRocm91Z2ggdGhpcyBtb2Rlc3QgZG9jdW1lbnQgZmlyc3QsIHRvIHVuZGVyc3RhbmQgdGhlIHByb2Nlc3MgYW5kIHRvCi1tYWtlIHN1cmUgeW91IGtub3cgd2hhdCB0byBleHBlY3QuCisjIyBQdWxsIFJlcXVlc3QgQ2hlY2tsaXN0CiAKK0JlZm9yZSBzZW5kaW5nIHlvdXIgcHVsbCByZXF1ZXN0cywgbWFrZSBzdXJlIHlvdSBkbyB0aGUgZm9sbG93aW5nOgogCi0jIyBCZWZvcmUgWW91IENvbnRyaWJ1dGUKKy0gICBSZWFkIHRoZSBbY29udHJpYnV0aW5nIGd1aWRlbGluZXNdKENPTlRSSUJVVElORy5tZCkuCistICAgRW5zdXJlIHlvdSBoYXZlIHNpZ25lZCB0aGUKKyAgICBbQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQgKENMQSldKGh0dHBzOi8vY2xhLmRldmVsb3BlcnMuZ29vZ2xlLmNvbS8pLgorLSAgIENoZWNrIGlmIHlvdXIgY2hhbmdlcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZToKKyAgICAtICAgW0dlbmVyYWwgZ3VpZGVsaW5lc10oI2dlbmVyYWwtZ3VpZGVsaW5lcy1hbmQtcGhpbG9zb3BoeS1mb3ItY29udHJpYnV0aW9uKS4KKyAgICAtICAgW0NvZGluZyBTdHlsZV0oI2NvZGluZy1zdHlsZSkuCistICAgUnVuIHRoZSBbdW5pdCB0ZXN0c10oI3J1bm5pbmctdW5pdC10ZXN0cykuCiAKLSMjIyBBcyBhbiBJbmRpdmlkdWFsCisjIyMgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnRzCiAKLUJlZm9yZSBDb2JhbHQgY2FuIHVzZSB5b3VyIGNvZGUsIGFzIGFuIHVuYWZmaWxpYXRlZCBpbmRpdmlkdWFsLCB5b3UgbXVzdCBzaWduCi10aGUgW0dvb2dsZSBJbmRpdmlkdWFsIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50XShodHRwczovL2NsYS5kZXZlbG9wZXJzLmdvb2dsZS5jb20vYWJvdXQvZ29vZ2xlLWluZGl2aWR1YWwpIChDTEEpLCB3aGljaCB5b3UgY2FuIGRvIG9ubGluZS4KK1dlJ2QgbG92ZSB0byBhY2NlcHQgeW91ciBwYXRjaGVzISBCZWZvcmUgd2UgY2FuIHRha2UgdGhlbSwgd2UgaGF2ZSB0byBqdW1wIGEgY291cGxlIG9mIGxlZ2FsIGh1cmRsZXMuCiAKLSMjIyBBcyBhIENvbXBhbnkKK1BsZWFzZSBmaWxsIG91dCBlaXRoZXIgdGhlIGluZGl2aWR1YWwgb3IgY29ycG9yYXRlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpLgogCi1JZiB5b3UgYXJlIGEgY29tcGFueSB0aGF0IHdpc2hlcyB0byBoYXZlIG9uZSBvciBtb3JlIGVtcGxveWVlcyBjb250cmlidXRlIHRvCi1Db2JhbHQgb24tdGhlLWNsb2NrLCB0aGF0IGlzIGNvdmVyZWQgYnkgYSBkaWZmZXJlbnQgYWdyZWVtZW50LCB0aGUKLVtTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50XShodHRwczovL2NsYS5kZXZlbG9wZXJzLmdvb2dsZS5jb20vYWJvdXQvZ29vZ2xlLWNvcnBvcmF0ZSkuCisgICogSWYgeW91IGFyZSBhbiBpbmRpdmlkdWFsIHdyaXRpbmcgb3JpZ2luYWwgc291cmNlIGNvZGUgYW5kIHlvdSdyZSBzdXJlIHlvdSBvd24gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSwgdGhlbiB5b3UnbGwgbmVlZCB0byBzaWduIGFuIFtpbmRpdmlkdWFsIENMQV0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vbGVnYWwvaW5kaXZpZHVhbC1jbGEtdjEuMC5odG1sKS4KKyAgKiBJZiB5b3Ugd29yayBmb3IgYSBjb21wYW55IHRoYXQgd2FudHMgdG8gYWxsb3cgeW91IHRvIGNvbnRyaWJ1dGUgeW91ciB3b3JrLCB0aGVuIHlvdSdsbCBuZWVkIHRvIHNpZ24gYSBbY29ycG9yYXRlIENMQV0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vbGVnYWwvY29ycG9yYXRlLWNsYS12MS4wLmh0bWwpLgogCi0jIyMgV2hhdCBpcyBhIENMQT8KK0ZvbGxvdyBlaXRoZXIgb2YgdGhlIHR3byBsaW5rcyBhYm92ZSB0byBhY2Nlc3MgdGhlIGFwcHJvcHJpYXRlIENMQSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBob3cgdG8gc2lnbiBhbmQgcmV0dXJuIGl0LiBPbmNlIHdlIHJlY2VpdmUgaXQsIHdlJ2xsIGJlIGFibGUgdG8gYWNjZXB0IHlvdXIgcHVsbCByZXF1ZXN0cy4KIAotVGhlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IGlzIG5lY2Vzc2FyeSBtYWlubHkgYmVjYXVzZSB5b3Ugb3duIHRoZQotY29weXJpZ2h0IHRvIHlvdXIgY2hhbmdlcywgZXZlbiBhZnRlciB5b3VyIGNvbnRyaWJ1dGlvbiBiZWNvbWVzIHBhcnQgb2Ygb3VyCi1jb2RlYmFzZSwgc28gd2UgbmVlZCB5b3VyIHBlcm1pc3Npb24gdG8gdXNlIGFuZCBkaXN0cmlidXRlIHlvdXIgY29kZS4gV2UgYWxzbwotbmVlZCB0byBiZSBzdXJlIG9mIHZhcmlvdXMgb3RoZXIgdGhpbmdzIOKAlCBmb3IgaW5zdGFuY2UgdGhhdCB5b3UnbGwgdGVsbCB1cyBpZgoteW91IGtub3cgdGhhdCB5b3VyIGNvZGUgaW5mcmluZ2VzIG9uIG90aGVyIHBlb3BsZSdzIHBhdGVudHMuIFlvdSBkb24ndCBoYXZlIHRvCi1zaWduIHRoZSBDTEEgdW50aWwgYWZ0ZXIgeW91J3ZlIHN1Ym1pdHRlZCB5b3VyIGNvZGUgZm9yIHJldmlldyBhbmQgYSBtZW1iZXIgaGFzCi1hcHByb3ZlZCBpdCwgYnV0IHlvdSBtdXN0IGRvIGl0IGJlZm9yZSB3ZSBjYW4gcHV0IHlvdXIgY29kZSBpbnRvIG91ciBjb2RlYmFzZS4KLUJlZm9yZSB5b3Ugc3RhcnQgd29ya2luZyBvbiBhIGxhcmdlciBjb250cmlidXRpb24sIHlvdSBzaG91bGQgZ2V0IGluIHRvdWNoIHdpdGgKLXVzIGZpcnN0IHdpdGggeW91ciBpZGVhIHNvIHRoYXQgd2UgY2FuIGhlbHAgb3V0IGFuZCBwb3NzaWJseSBndWlkZQoteW91LiBDb29yZGluYXRpbmcgdXAgZnJvbnQgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gYXZvaWQgZnJ1c3RyYXRpb24gbGF0ZXIgb24uCisqKipOT1RFKioqOiBPbmx5IG9yaWdpbmFsIHNvdXJjZSBjb2RlIGZyb20geW91IGFuZCBvdGhlciBwZW9wbGUgdGhhdCBoYXZlIHNpZ25lZCB0aGUgQ0xBIGNhbiBiZSBhY2NlcHRlZCBpbnRvIHRoZSBtYWluIHJlcG9zaXRvcnkuCiAKKyMjIyBDb21tdW5pdHkgR3VpZGVsaW5lcwogCi0jIyMgQ29kZSBSZXZpZXdzCitUaGlzIHByb2plY3QgZm9sbG93cworW0dvb2dsZSdzIE9wZW4gU291cmNlIENvbW11bml0eSBHdWlkZWxpbmVzXShodHRwczovL29wZW5zb3VyY2UuZ29vZ2xlL2NvbmR1Y3QvKS4KIAotQWxsIHN1Ym1pc3Npb25zLCBpbmNsdWRpbmcgc3VibWlzc2lvbnMgYnkgcHJvamVjdCBtZW1iZXJzLCByZXF1aXJlIHJldmlldy4gV2UKLWN1cnJlbnRseSB1c2UgW0dlcnJpdCBDb2RlIFJldmlld10oaHR0cHM6Ly93d3cuZ2Vycml0Y29kZXJldmlldy5jb20vKSBmb3IgdGhpcwotcHVycG9zZS4gQ3VycmVudGx5LCB0ZWFtLW1lbWJlciBzdWJtaXNzaW9ucyBnbyB0aHJvdWdoIHByaXZhdGUgcmV2aWV3cywgYW5kCi1leHRlcm5hbCBzdWJtaXNzaW9ucyBnbyB0aHJvdWdoIHB1YmxpYyByZXZpZXdzLgorIyMjIENvbnRyaWJ1dGluZyBjb2RlCiAKK0lmIHlvdSBoYXZlIGltcHJvdmVtZW50cyB0byBDb2JhbHQsIHNlbmQgdXMgeW91ciBwdWxsIHJlcXVlc3RzISBGb3IgdGhvc2UKK2p1c3QgZ2V0dGluZyBzdGFydGVkLCBHaXRodWIgaGFzIGEKK1tob3cgdG9dKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL3VzaW5nLXB1bGwtcmVxdWVzdHMvKS4KIAotIyMgU3VibWlzc2lvbiBQcm9jZXNzCitDb2JhbHQgdGVhbSBtZW1iZXJzIHdpbGwgYmUgYXNzaWduZWQgdG8gcmV2aWV3IHlvdXIgcHVsbCByZXF1ZXN0cy4gQSB0ZWFtCittZW1iZXIgd2lsbCBuZWVkIHRvIGFwcHJvdmUgdGhlIHdvcmtmbG93IHJ1bnMgZm9yIGVhY2ggcHVsbCByZXF1ZXN0LiBPbmNlIHRoZQorcHVsbCByZXF1ZXN0cyBhcmUgYXBwcm92ZWQgYW5kIHBhc3MgKmFsbCogcHJlc3VibWl0IGNoZWNrcywgYSBDb2JhbHQKK3RlYW0gbWVtYmVyIHdpbGwgbWVyZ2UgdGhlIHB1bGwgcmVxdWVzdC4KIAotV2UgYWRtaXQgdGhhdCB0aGlzIHN1Ym1pc3Npb24gcHJvY2VzcyBpcyBjdXJyZW50bHkgbm90IGNvbXBsZXRlbHkgb3B0aW1pemVkIHRvCi1tYWtlIGNvbnRyaWJ1dGlvbnMgZWFzeSwgYW5kIHdlIGhvcGUgdG8gbWFrZSBpbXByb3ZlbWVudHMgdG8gaXQgaW4gdGhlCi1mdXR1cmUuIEl0IHdpbGwgYWx3YXlzIGluY2x1ZGUgc29tZSBmb3JtIG9mIHNpZ25pbmcgdGhlIENMQSBhbmQgc3VibWl0dGluZyB0aGUKLWNvZGUgZm9yIHJldmlldyBiZWZvcmUgbWVyZ2luZyBjaGFuZ2VzIGludG8gdGhlIENvYmFsdCBtYXN0ZXIgdHJlZS4KKyMjIyBDb250cmlidXRpb24gZ3VpZGVsaW5lcyBhbmQgc3RhbmRhcmRzCiAKLSAgMS4gRW5zdXJlIHlvdSBvciB5b3VyIGNvbXBhbnkgaGF2ZSBzaWduZWQgdGhlIGFwcHJvcHJpYXRlIENMQSAoc2VlICJCZWZvcmUgWW91Ci0gICAgIENvbnRyaWJ1dGUiIGFib3ZlKS4KLSAgMS4gUmViYXNlIHlvdXIgY2hhbmdlcyBkb3duIGludG8gYSBzaW5nbGUgZ2l0IGNvbW1pdC4KLSAgMS4gUnVuIGBnaXQgY2xhbmctZm9ybWF0IEhFQUR+YCB0byBhcHBseSBkZWZhdWx0IEMrKyBmb3JtYXR0aW5nIHJ1bGVzLAotICAgICBmb2xsb3dlZCBieSBgZ2l0IGNvbW1pdCAtYSAtLWFtZW5kYCB0byBzcXVhc2ggYW55IGZvcm1hdHRpbmcgY2hhbmdlcwotICAgICBpbnRvIHlvdXIgY29tbWl0LgotICAxLiBSdW4gYGdpdCBwdXNoIG9yaWdpbiBIRUFEOnJlZnMvZm9yL21hc3RlcmAgdG8gdXBsb2FkIHRoZSByZXZpZXcgdG8KLSAgICAgW0NvYmFsdCdzIEdlcnJpdCBpbnN0YW5jZV0oaHR0cHM6Ly9jb2JhbHQtcmV2aWV3Lmdvb2dsZXNvdXJjZS5jb20vKS4KLSAgMS4gU29tZW9uZSBmcm9tIHRoZSBtYWludGFpbmVycyB0ZWFtIHdpbGwgcmV2aWV3IHRoZSBjb2RlLCBwdXR0aW5nIHVwIGNvbW1lbnRzCi0gICAgIG9uIGFueSB0aGluZ3MgdGhhdCBuZWVkIHRvIGNoYW5nZSBmb3Igc3VibWlzc2lvbi4KLSAgMS4gSWYgeW91IG5lZWQgdG8gbWFrZSBjaGFuZ2VzLCBtYWtlIHRoZW0gbG9jYWxseSwgdGVzdCB0aGVtLCB0aGVuIGBnaXQgY29tbWl0Ci0gICAgIC0tYW1lbmRgIHRvIGFkZCB0aGVtIHRvIHRoZSAqZXhpc3RpbmcqIGNvbW1pdC4gVGhlbiByZXR1cm4gdG8gc3RlcCAyLgotICAxLiBJZiB5b3UgZG8gbm90IG5lZWQgdG8gbWFrZSBhbnkgbW9yZSBjaGFuZ2VzLCBhIG1haW50YWluZXIgd2lsbCBpbnRlZ3JhdGUKLSAgICAgdGhlIGNoYW5nZSBpbnRvIG91ciBwcml2YXRlIHJlcG9zaXRvcnksIGFuZCBpdCB3aWxsIGdldCBwdXNoZWQgb3V0IHRvIHRoZQotICAgICBwdWJsaWMgcmVwb3NpdG9yeSBhZnRlciBzb21lIHRpbWUuCitCZWZvcmUgc2VuZGluZyB5b3VyIHB1bGwgcmVxdWVzdCBmb3IKK1tyZXZpZXddKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvcHVsbHMpLAorbWFrZSBzdXJlIHlvdXIgY2hhbmdlcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBndWlkZWxpbmVzIGFuZCBmb2xsb3cgdGhlCitDb2JhbHQgY29kaW5nIHN0eWxlLgorCisjIyMjIEdlbmVyYWwgZ3VpZGVsaW5lcyBhbmQgcGhpbG9zb3BoeSBmb3IgY29udHJpYnV0aW9uCisKKyogICBJbmNsdWRlIHVuaXQgdGVzdHMgd2hlbiB5b3UgY29udHJpYnV0ZSBuZXcgZmVhdHVyZXMsIGFzIHRoZXkgaGVscCB0bzoKKyAgICAxLiAgIFByb3ZlIHRoYXQgeW91ciBjb2RlIHdvcmtzIGNvcnJlY3RseQorICAgIDEuICAgR3VhcmQgYWdhaW5zdCBmdXR1cmUgYnJlYWtpbmcgY2hhbmdlcyB0byBsb3dlciB0aGUgbWFpbnRlbmFuY2UgY29zdC4KKyogICBCdWcgZml4ZXMgYWxzbyBnZW5lcmFsbHkgcmVxdWlyZSB1bml0IHRlc3RzLCBiZWNhdXNlIHRoZSBwcmVzZW5jZSBvZiBidWdzCisgICAgdXN1YWxseSBpbmRpY2F0ZXMgaW5zdWZmaWNpZW50IHRlc3QgY292ZXJhZ2UuCisqICAgV2hlbiB5b3UgY29udHJpYnV0ZSBhIG5ldyBmZWF0dXJlIHRvIENvYmFsdCwgdGhlIG1haW50ZW5hbmNlIGJ1cmRlbiBpcworICAgIChieSBkZWZhdWx0KSB0cmFuc2ZlcnJlZCB0byB0aGUgQ29iYWxidCB0ZWFtLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJlbmVmaXQKKyAgICBvZiB0aGUgY29udHJpYnV0aW9uIG11c3QgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgY29zdCBvZiBtYWludGFpbmluZyB0aGUKKyAgICBmZWF0dXJlLgorKiAgIEFzIGV2ZXJ5IFBSIHJlcXVpcmVzIHNldmVyYWwgQ1BVL0dQVSBob3VycyBvZiBDSSB0ZXN0aW5nLCB3ZSBkaXNjb3VyYWdlCisgICAgc3VibWl0dGluZyBQUnMgdG8gZml4IG9uZSB0eXBvLCBvbmUgd2FybmluZyxldGMuIFdlIHJlY29tbWVuZCBmaXhpbmcgdGhlCisgICAgc2FtZSBpc3N1ZSBhdCB0aGUgZmlsZSBsZXZlbCBhdCBsZWFzdCAoZS5nLjogZml4IGFsbCB0eXBvcyBpbiBhIGZpbGUsIGZpeAorICAgIGFsbCBjb21waWxlciB3YXJuaW5nIGluIGEgZmlsZSwgZXRjLikKKworIyMjIyBMaWNlbnNlCisKK0luY2x1ZGUgYSBsaWNlbnNlIGF0IHRoZSB0b3Agb2YgbmV3IGZpbGVzLiBDaGVjayBleGlzdGluZyBmaWxlcyBmb3IgbGljZW5zZSBleGFtcGxlcy4KKworIyMjIyBDb2Rpbmcgc3R5bGUKKworQ29iYWx0IGZvbGxvd3MgdGhlCitbQ2hyb21pdW0gc3R5bGUgZ3VpZGVdKGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9IRUFEL3N0eWxlZ3VpZGUvc3R5bGVndWlkZS5tZCkuCisKK0NvYmFsdCB1c2VzIHByZS1jb21taXQgdG8gZW5zdXJlIGdvb2QgY29kaW5nIHN0eWxlLiBDcmVhdGUgYSBweXRob24gMyB2aXJ0dWFsCitlbnZpcm9ubWVudCBmb3Igd29ya2luZyB3aXRoIENvYmFsdCwgdGhlbiBpbnN0YWxsIGBwcmUtY29tbWl0YCB3aXRoOgorCitgYGBiYXNoCiskIHByZS1jb21taXQgaW5zdGFsbCAtdCBwb3N0LWNoZWNrb3V0IC10IHByZS1jb21taXQgLXQgcHJlLXB1c2ggLS1hbGxvdy1taXNzaW5nLWNvbmZpZworYGBgCisKK2BwcmUtY29tbWl0YCB3aWxsIG1vc3RseSBydW4gYXV0b21hdGljYWxseSwgYW5kIGNhbiBhbHNvIGJlIGludm9rZWQgbWFudWFsbHkuCitZb3UgY2FuIGZpbmQgZG9jdW1lbnRhdGlvbiBhYm91dCBpdCBhdCBodHRwczovL3ByZS1jb21taXQuY29tLy4KKworIyMjIyBSdW5uaW5nIHVuaXQgdGVzdHMKKworRmlyc3QsIGVuc3VyZSBEb2NrZXIgYW5kIGRvY2tlci1jb21wb3NlIGFyZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uIFRoZW4sCit5b3UgY2FuIHJ1biB1bml0IHRlc3RzIGZvciBvdXIgbGludXggcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHVzaW5nOgorCitgYGBiYXNoCiskIGRvY2tlci1jb21wb3NlIHVwIC0tYnVpbGQgLS1uby1zdGFydCBsaW51eC14NjR4MTEtdW5pdHRlc3QKKyQgUExBVEZPUk09bGludXgteDY0eDExIENPTkZJRz1kZXZlbCBUQVJHRVQ9YWxsIGRvY2tlci1jb21wb3NlIHJ1biBsaW51eC14NjR4MTEKKyQgUExBVEZPUk09bGludXgteDY0eDExIENPTkZJRz1kZXZlbCBkb2NrZXItY29tcG9zZSBydW4gbGludXgteDY0eDExLXVuaXR0ZXN0CitgYGAKZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCBmY2ZlNGE2Li4wYTM0OWEzIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xLDQgKzEsMTQgQEAKLSMgQ29iYWx0IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8tQnVpbGQlMjBTdGF0dXMtYmx1ZXZpb2xldCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9ibG9iL21haW4vQlVJTERfU1RBVFVTLm1kKQorIyBDb2JhbHQgWyFbQnVpbGQgTWF0cml4XShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLy1CdWlsZCUyME1hdHJpeC1ibHVldmlvbGV0KV0oaHR0cHM6Ly9naXRodWIuY29tL3lvdXR1YmUvY29iYWx0L2Jsb2IvbWFpbi9CVUlMRF9TVEFUVVMubWQpCisKK1shW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naXRodWIveW91dHViZS9jb2JhbHQvYnJhbmNoL21haW4vZ3JhcGgvYmFkZ2Uuc3ZnP3Rva2VuPVJSNk1LS05ZTlYpXShodHRwczovL2NvZGVjb3YuaW8vZ2l0aHViL3lvdXR1YmUvY29iYWx0KQorWyFbbGludF0oaHR0cHM6Ly9naXRodWIuY29tL3lvdXR1YmUvY29iYWx0L2FjdGlvbnMvd29ya2Zsb3dzL2xpbnQueWFtbC9iYWRnZS5zdmc/YnJhbmNoPW1haW4mZXZlbnQ9cHVzaCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9saW50LnlhbWw/cXVlcnk9ZXZlbnQlM0FwdXNoK2JyYW5jaCUzQW1haW4pCitbIVtqYXZhXShodHRwczovL2dpdGh1Yi5jb20veW91dHViZS9jb2JhbHQvYWN0aW9ucy93b3JrZmxvd3MvZ3JhZGxlLnlhbWwvYmFkZ2Uuc3ZnP2JyYW5jaD1tYWluJmV2ZW50PXB1c2gpXShodHRwczovL2dpdGh1Yi5jb20veW91dHViZS9jb2JhbHQvYWN0aW9ucy93b3JrZmxvd3MvZ3JhZGxlLnlhbWw/cXVlcnk9ZXZlbnQlM0FwdXNoK2JyYW5jaCUzQW1haW4pCitbIVtweXRob25dKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9weXRlc3QueWFtbC9iYWRnZS5zdmc/YnJhbmNoPW1haW4mZXZlbnQ9cHVzaCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9weXRlc3QueWFtbD9xdWVyeT1ldmVudCUzQXB1c2grYnJhbmNoJTNBbWFpbikgXAorWyFbYW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL3lvdXR1YmUvY29iYWx0L2FjdGlvbnMvd29ya2Zsb3dzL2FuZHJvaWQueWFtbC9iYWRnZS5zdmc/YnJhbmNoPW1haW4mZXZlbnQ9cHVzaCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9hbmRyb2lkLnlhbWw/cXVlcnk9ZXZlbnQlM0FwdXNoK2JyYW5jaCUzQW1haW4pCitbIVtldmVyZ3JlZW5dKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9ldmVyZ3JlZW4ueWFtbC9iYWRnZS5zdmc/YnJhbmNoPW1haW4mZXZlbnQ9cHVzaCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9ldmVyZ3JlZW4ueWFtbD9xdWVyeT1ldmVudCUzQXB1c2grYnJhbmNoJTNBbWFpbikKK1shW2xpbnV4XShodHRwczovL2dpdGh1Yi5jb20veW91dHViZS9jb2JhbHQvYWN0aW9ucy93b3JrZmxvd3MvbGludXgueWFtbC9iYWRnZS5zdmc/YnJhbmNoPW1haW4mZXZlbnQ9cHVzaCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9saW51eC55YW1sP3F1ZXJ5PWV2ZW50JTNBcHVzaCticmFuY2glM0FtYWluKQorWyFbcmFzcGktMl0oaHR0cHM6Ly9naXRodWIuY29tL3lvdXR1YmUvY29iYWx0L2FjdGlvbnMvd29ya2Zsb3dzL3Jhc3BpLTIueWFtbC9iYWRnZS5zdmc/YnJhbmNoPW1haW4mZXZlbnQ9cHVzaCldKGh0dHBzOi8vZ2l0aHViLmNvbS95b3V0dWJlL2NvYmFsdC9hY3Rpb25zL3dvcmtmbG93cy9yYXNwaS0yLnlhbWw/cXVlcnk9ZXZlbnQlM0FwdXNoK2JyYW5jaCUzQW1haW4pCitbIVt3aW4zMl0oaHR0cHM6Ly9naXRodWIuY29tL3lvdXR1YmUvY29iYWx0L2FjdGlvbnMvd29ya2Zsb3dzL3dpbjMyLnlhbWwvYmFkZ2Uuc3ZnP2JyYW5jaD1tYWluJmV2ZW50PXB1c2gpXShodHRwczovL2dpdGh1Yi5jb20veW91dHViZS9jb2JhbHQvYWN0aW9ucy93b3JrZmxvd3Mvd2luMzIueWFtbD9xdWVyeT1ldmVudCUzQXB1c2grYnJhbmNoJTNBbWFpbikKIAogIyMgT3ZlcnZpZXcKIApkaWZmIC0tZ2l0IGEvYmFzZS9CVUlMRC5nbiBiL2Jhc2UvQlVJTEQuZ24KaW5kZXggMjU3NTlhYy4uYjdjZmU5NSAxMDA2NDQKLS0tIGEvYmFzZS9CVUlMRC5nbgorKysgYi9iYXNlL0JVSUxELmduCkBAIC0zMSw5ICszMSw5IEBACiAgIGltcG9ydCgiLy9idWlsZC9jb25maWcvYWxsb2NhdG9yLmduaSIpCiAgIGltcG9ydCgiLy9idWlsZC9jb25maWcvanVtYm8uZ25pIikKICAgaW1wb3J0KCIvL2J1aWxkL3RpbWVzdGFtcC5nbmkiKQotICBpbXBvcnQoIi8vdGVzdGluZy9saWJmdXp6ZXIvZnV6emVyX3Rlc3QuZ25pIikKLSAgaW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQogfQoraW1wb3J0KCIvL3Rlc3RpbmcvbGliZnV6emVyL2Z1enplcl90ZXN0LmduaSIpCitpbXBvcnQoIi8vdGVzdGluZy90ZXN0LmduaSIpCiAKIGRlY2xhcmVfYXJncygpIHsKICAgIyBJbmRpY2F0ZXMgaWYgdGhlIExvY2F0aW9uIG9iamVjdCBjb250YWlucyB0aGUgc291cmNlIGNvZGUgaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL2Jhc2Uvc2VxdWVuY2VkX3Rhc2tfcnVubmVyX3VuaXR0ZXN0LmNjIGIvYmFzZS9zZXF1ZW5jZWRfdGFza19ydW5uZXJfdW5pdHRlc3QuY2MKaW5kZXggNGRjYzdlNS4uYmVjOThlNCAxMDA2NDQKLS0tIGEvYmFzZS9zZXF1ZW5jZWRfdGFza19ydW5uZXJfdW5pdHRlc3QuY2MKKysrIGIvYmFzZS9zZXF1ZW5jZWRfdGFza19ydW5uZXJfdW5pdHRlc3QuY2MKQEAgLTQxLDYgKzQxLDcgQEAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZsYWdPbkRlbGV0ZSk7CiB9OwogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoU2VxdWVuY2VkVGFza1J1bm5lclRlc3QpOwogY2xhc3MgU2VxdWVuY2VkVGFza1J1bm5lclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgcHJvdGVjdGVkOgogICBTZXF1ZW5jZWRUYXNrUnVubmVyVGVzdCgpIDogZm9yZWlnbl90aHJlYWRfKCJmb3JlaWduIikge30KZGlmZiAtLWdpdCBhL2Jhc2Uvc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5jYyBiL2Jhc2Uvc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5jYwppbmRleCBkNGJhZjIzLi4zYzFkODMyIDEwMDY0NAotLS0gYS9iYXNlL3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuY2MKKysrIGIvYmFzZS9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmNjCkBAIC0xMiw2ICsxMiw3IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorI2luY2x1ZGUgImJhc2UvZGVidWcvc3RhY2tfdHJhY2UuaCIKICNpbmNsdWRlICJiYXNlL3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaCIKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgpAQCAtNDcsNyArNDgsMTcgQEAKIAogICBpZiAodGFza19tYXlfcnVuKSB7CiAgICAgLy8gV2FpdCBmb3IgdGhlIHRhc2sgdG8gY29tcGxldGUgYmVmb3JlIHByb2NlZWRpbmcuCi0gICAgdGFza19maW5pc2hlZC5XYWl0KCk7CisgICAgZG8geworICAgICAgaWYgKHRhc2tfZmluaXNoZWQuVGltZWRXYWl0KGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMDAwKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWYgIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKyAgICAgIGlmICghU2JTeXN0ZW1Jc0RlYnVnZ2VyQXR0YWNoZWQoKSkgeworICAgICAgICBiYXNlOjpkZWJ1Zzo6U3RhY2tUcmFjZSB0cmFjZTsKKyAgICAgICAgdHJhY2UuUHJpbnRXaXRoUHJlZml4KCJbdGFzayBydW5uZXIgZGVhZGxvY2tdIik7CisgICAgICB9CisjZW5kaWYgLy8gIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKyAgICB9IHdoaWxlICh0cnVlKTsKICAgfQogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9iYXNlL3Rlc3QvZ3Rlc3RfdXRpbC5oIGIvYmFzZS90ZXN0L2d0ZXN0X3V0aWwuaAppbmRleCAyNTYxMGM2Li40NDkwNzEzIDEwMDY0NAotLS0gYS9iYXNlL3Rlc3QvZ3Rlc3RfdXRpbC5oCisrKyBiL2Jhc2UvdGVzdC9ndGVzdF91dGlsLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNlbHNlCiAvLyBEQ0hFQ0tfSVNfT04oKSAmJiBkZWZpbmVkKEdURVNUX0hBU19ERUFUSF9URVNUKSAmJiAhZGVmaW5lZChPU19BTkRST0lEKQogCisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogLy8gTWFjcm8gY29waWVkIGZyb20gZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIGFzIGl0J3MgKDEpIGludGVybmFsIGZvciBub3cKIC8vIGFuZCAoMikgb25seSBkZWZpbmVkIGlmICFHVEVTVF9IQVNfREVBVEhfVEVTVCB3aGljaCBpcyBvbmx5IGEgc3Vic2V0IG9mIHRoZQogLy8gY29uZGl0aW9ucyBpbiB3aGljaCBpdCdzIG5lZWRlZCBoZXJlLgpAQCAtNTAsNiArNTEsNyBAQAogICAgIHRlcm1pbmF0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorI2VuZGlmIC8vICFHVEVTVF9PU19TVEFSQk9BUkQKIAogI2RlZmluZSBFWFBFQ1RfRENIRUNLX0RFQVRIKHN0YXRlbWVudCkgXAogICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1Qoc3RhdGVtZW50LCAiQ2hlY2sgZmFpbGVkIiwgKQpkaWZmIC0tZ2l0IGEvYmFzZS90ZXN0L3NlcXVlbmNlZF90YXNrX3J1bm5lcl90ZXN0X3RlbXBsYXRlLmggYi9iYXNlL3Rlc3Qvc2VxdWVuY2VkX3Rhc2tfcnVubmVyX3Rlc3RfdGVtcGxhdGUuaAppbmRleCBhNTEwMDMwLi5mZjAwNjFmIDEwMDY0NAotLS0gYS9iYXNlL3Rlc3Qvc2VxdWVuY2VkX3Rhc2tfcnVubmVyX3Rlc3RfdGVtcGxhdGUuaAorKysgYi9iYXNlL3Rlc3Qvc2VxdWVuY2VkX3Rhc2tfcnVubmVyX3Rlc3RfdGVtcGxhdGUuaApAQCAtMzUsNiArMzUsNyBAQAogICBUeXBlIHR5cGU7CiB9OwogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoU2VxdWVuY2VkVGFza1RyYWNrZXIpOwogLy8gVXRpbGl0eSBjbGFzcyB1c2VkIGluIHRoZSB0ZXN0cyBiZWxvdy4KIGNsYXNzIFNlcXVlbmNlZFRhc2tUcmFja2VyIDogcHVibGljIFJlZkNvdW50ZWRUaHJlYWRTYWZlPFNlcXVlbmNlZFRhc2tUcmFja2VyPiB7CiAgcHVibGljOgpAQCAtMTEyLDYgKzExMyw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoU2VxdWVuY2VkVGFza1J1bm5lclRlc3QpOwogdGVtcGxhdGUgPHR5cGVuYW1lIFRhc2tSdW5uZXJUZXN0RGVsZWdhdGU+CiBjbGFzcyBTZXF1ZW5jZWRUYXNrUnVubmVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICBwcm90ZWN0ZWQ6CkBAIC0zMTIsNiArMzE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRUYXNrQWZ0ZXJMb25nVGFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRUYXNrQWZ0ZXJNYW55TG9uZ1Rhc2tzKTsKIAorR1RFU1RfQUxMT1dfVU5JTlNUQU5USUFURURfUEFSQU1FVEVSSVpFRF9URVNUKFNlcXVlbmNlZFRhc2tSdW5uZXJEZWxheWVkVGVzdCk7CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFza1J1bm5lclRlc3REZWxlZ2F0ZT4KIGNsYXNzIFNlcXVlbmNlZFRhc2tSdW5uZXJEZWxheWVkVGVzdAogICAgIDogcHVibGljIFNlcXVlbmNlZFRhc2tSdW5uZXJUZXN0PFRhc2tSdW5uZXJUZXN0RGVsZWdhdGU+IHt9OwpkaWZmIC0tZ2l0IGEvYmFzZS90ZXN0L3Rhc2tfcnVubmVyX3Rlc3RfdGVtcGxhdGUuaCBiL2Jhc2UvdGVzdC90YXNrX3J1bm5lcl90ZXN0X3RlbXBsYXRlLmgKaW5kZXggNDY3MDUyMi4uNDE3NWZkOCAxMDA2NDQKLS0tIGEvYmFzZS90ZXN0L3Rhc2tfcnVubmVyX3Rlc3RfdGVtcGxhdGUuaAorKysgYi9iYXNlL3Rlc3QvdGFza19ydW5uZXJfdGVzdF90ZW1wbGF0ZS5oCkBAIC0xMDYsNiArMTA2LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIHRlc3QKIAorR1RFU1RfQUxMT1dfVU5JTlNUQU5USUFURURfUEFSQU1FVEVSSVpFRF9URVNUKFRhc2tSdW5uZXJUZXN0KTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUYXNrUnVubmVyVGVzdERlbGVnYXRlPgogY2xhc3MgVGFza1J1bm5lclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgcHJvdGVjdGVkOgpAQCAtMTc5LDYgKzE4MCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0CiAKK0dURVNUX0FMTE9XX1VOSU5TVEFOVElBVEVEX1BBUkFNRVRFUklaRURfVEVTVChUYXNrUnVubmVyQWZmaW5pdHlUZXN0KTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUYXNrUnVubmVyVGVzdERlbGVnYXRlPgogY2xhc3MgVGFza1J1bm5lckFmZmluaXR5VGVzdCA6IHB1YmxpYyBUYXNrUnVubmVyVGVzdDxUYXNrUnVubmVyVGVzdERlbGVnYXRlPiB7fTsKIApkaWZmIC0tZ2l0IGEvYnVpbGQvY29uZmlnL2FuZHJvaWQvaW50ZXJuYWxfcnVsZXMuZ25pIGIvYnVpbGQvY29uZmlnL2FuZHJvaWQvaW50ZXJuYWxfcnVsZXMuZ25pCmluZGV4IDA2YzA3MDIuLjc1YWI4NTUgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NvbmZpZy9hbmRyb2lkL2ludGVybmFsX3J1bGVzLmduaQorKysgYi9idWlsZC9jb25maWcvYW5kcm9pZC9pbnRlcm5hbF9ydWxlcy5nbmkKQEAgLTE1LDcgKzE1LDcgQEAKIGltcG9ydCgiLy9idWlsZC90b29sY2hhaW4va3l0aGUuZ25pIikKIGltcG9ydCgiLy9idWlsZC91dGlsL2dlbmVyYXRlX3dyYXBwZXIuZ25pIikKIGltcG9ydCgiLy9idWlsZF9vdmVycmlkZXMvYnVpbGQuZ25pIikKLWlmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbikgeworaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSB7CiAgIGltcG9ydCgiLy9idWlsZC90b29sY2hhaW4vY29uY3VycmVudF9saW5rcy5nbmkiKQogfQogYXNzZXJ0KGlzX2FuZHJvaWQpCmRpZmYgLS1naXQgYS9idWlsZC9jb25maWcvY292ZXJhZ2UvQlVJTEQuZ24gYi9idWlsZC9jb25maWcvY292ZXJhZ2UvQlVJTEQuZ24KaW5kZXggMDljMjI3ZC4uZmEwODMzZSAxMDA2NDQKLS0tIGEvYnVpbGQvY29uZmlnL2NvdmVyYWdlL0JVSUxELmduCisrKyBiL2J1aWxkL2NvbmZpZy9jb3ZlcmFnZS9CVUlMRC5nbgpAQCAtMzAsNSArMzAsMTMgQEAKICAgICAgICMgVE9ETyhjcmJ1Zy5jb20vMTE5NDMwMSk6IFJlbW92ZSB0aGlzIGZsYWcuCiAgICAgICBjZmxhZ3MgKz0gWyAiLWZuby11c2UtY3hhLWF0ZXhpdCIgXQogICAgIH0KKworICAgIGlmICh1c2luZ19vbGRfY29tcGlsZXIpIHsKKyAgICAgICMgVGhlc2UgY29tcGlsZXIgZmxhZ3MgYXJlbid0IHN1cHBvcnRlZCBieSB0aGUgb2xkZXIgY2xhbmcgY29tcGlsZXIuCisgICAgICBjZmxhZ3MgLT0gWworICAgICAgICAiLWxpbWl0ZWQtY292ZXJhZ2UtZXhwZXJpbWVudGFsPXRydWUiLAorICAgICAgICAiLWZuby11c2UtY3hhLWF0ZXhpdCIsCisgICAgICBdCisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9idWlsZC9jb25maWcvd2luL0JVSUxELmduIGIvYnVpbGQvY29uZmlnL3dpbi9CVUlMRC5nbgppbmRleCA1MDAzNTAyLi44ZjdjNTk3IDEwMDY0NAotLS0gYS9idWlsZC9jb25maWcvd2luL0JVSUxELmduCisrKyBiL2J1aWxkL2NvbmZpZy93aW4vQlVJTEQuZ24KQEAgLTYwMiw2ICs2MDIsOCBAQAogICAgICAgY2ZsYWdzID0gWwogICAgICAgICAiL3dkNDgwMCIsCiAgICAgICAgICIvd2Q0ODM0IiwKKyAgICAgICAgIi93ZDQ4NTgiLAorICAgICAgICAiL3dkNTIwOCIKICAgICAgIF0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2J1aWxkL2NvbmZpZy93aW4vdmlzdWFsX3N0dWRpb192ZXJzaW9uLmduaSBiL2J1aWxkL2NvbmZpZy93aW4vdmlzdWFsX3N0dWRpb192ZXJzaW9uLmduaQppbmRleCAxM2NhMjUyLi4xMWY1ZjAyIDEwMDY0NAotLS0gYS9idWlsZC9jb25maWcvd2luL3Zpc3VhbF9zdHVkaW9fdmVyc2lvbi5nbmkKKysrIGIvYnVpbGQvY29uZmlnL3dpbi92aXN1YWxfc3R1ZGlvX3ZlcnNpb24uZ25pCkBAIC00MSw3ICs0MSwxMCBAQAogICAgIH0gZWxzZSB7CiAgICAgICBfdmlzX3N0ZF95ZWFyID0gIjIwMTciCiAgICAgfQotICAgIF9kZWZhdWx0X3Zpc3VhbF9zdHVkaW9fcGF0aCA9ICJDOi9Qcm9ncmFtIEZpbGVzICh4ODYpL01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLyRfdmlzX3N0ZF95ZWFyL1Byb2Zlc3Npb25hbCIKKyAgICBfZGVmYXVsdF92aXN1YWxfc3R1ZGlvX3BhdGggPSBnZXRlbnYoIlZTMjAyMklOU1RBTExESVIiKQorICAgIGlmIChfZGVmYXVsdF92aXN1YWxfc3R1ZGlvX3BhdGggPT0gIiIpIHsKKyAgICAgIF9kZWZhdWx0X3Zpc3VhbF9zdHVkaW9fcGF0aCA9ICJDOi9Qcm9ncmFtIEZpbGVzICh4ODYpL01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLyRfdmlzX3N0ZF95ZWFyL1Byb2Zlc3Npb25hbCIKKyAgICB9CiAgIH0KIAogICBkZWNsYXJlX2FyZ3MoKSB7CmRpZmYgLS1naXQgYS9idWlsZC9ub2NvbXBpbGUuZ25pIGIvYnVpbGQvbm9jb21waWxlLmduaQppbmRleCBkMzZiNWExLi40ZjE3ODM3IDEwMDY0NAotLS0gYS9idWlsZC9ub2NvbXBpbGUuZ25pCisrKyBiL2J1aWxkL25vY29tcGlsZS5nbmkKQEAgLTYxLDkgKzYxLDcgQEAKIGltcG9ydCgiLy9idWlsZC9jb25maWcvY2xhbmcvY2xhbmcuZ25pIikKIGltcG9ydCgiLy9idWlsZC9jb25maWcvcHl0aG9uLmduaSIpCiBpbXBvcnQoIi8vYnVpbGQvdG9vbGNoYWluL3Rvb2xjaGFpbi5nbmkiKQotaWYgKCFpc19zdGFyYm9hcmQpIHsKLSAgaW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQotfQoraW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQogCiBkZWNsYXJlX2FyZ3MoKSB7CiAgICMgVE9ETyhjcmJ1Zy5jb20vMTA1Mzg4KTogbWFrZSBzdXJlIG5vLWNvbXBpbGUgdGVzdCBpcyBub3QgZmxha3kuCmRpZmYgLS1naXQgYS9idWlsZC90b29sY2hhaW4vQlVJTEQuZ24gYi9idWlsZC90b29sY2hhaW4vQlVJTEQuZ24KaW5kZXggNmNmOGYxYi4uMDBmM2UxMSAxMDA2NDQKLS0tIGEvYnVpbGQvdG9vbGNoYWluL0JVSUxELmduCisrKyBiL2J1aWxkL3Rvb2xjaGFpbi9CVUlMRC5nbgpAQCAtMTEsNyArMTEsNyBAQAogICBhY3Rpb25fcG9vbF9kZXB0aCA9IC0xCiB9CiAKLWlmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbikgeworaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSB7CiAgIGlmIChhY3Rpb25fcG9vbF9kZXB0aCA9PSAtMSB8fCAodXNlX2dvbWEgfHwgdXNlX3JiZSkpIHsKICAgICBhY3Rpb25fcG9vbF9kZXB0aCA9IGV4ZWNfc2NyaXB0KCJnZXRfY3B1X2NvdW50LnB5IiwgW10sICJ2YWx1ZSIpCiAgIH0KZGlmZiAtLWdpdCBhL2J1aWxkL3Rvb2xjaGFpbi9nY2NfdG9vbGNoYWluLmduaSBiL2J1aWxkL3Rvb2xjaGFpbi9nY2NfdG9vbGNoYWluLmduaQppbmRleCA4OTFjZjM0Li5kZjcyMjk2IDEwMDY0NAotLS0gYS9idWlsZC90b29sY2hhaW4vZ2NjX3Rvb2xjaGFpbi5nbmkKKysrIGIvYnVpbGQvdG9vbGNoYWluL2djY190b29sY2hhaW4uZ25pCkBAIC0xMTYsNiArMTE2LDEwIEBACiAjICAgICAgdGhhdCB0aGUgc25hcmwgdG9vbCB3aWxsIGFjY2VwdC4KIHRlbXBsYXRlKCJnY2NfdG9vbGNoYWluIikgewogICB0b29sY2hhaW4odGFyZ2V0X25hbWUpIHsKKyAgICBpc19zdGFyYm9hcmRfdG9vbGNoYWluID0gdGFyZ2V0X25hbWUgPT0gInN0YXJib2FyZCIKKyAgICBpZiAoIWJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbikgeworICAgICAgbm90X25lZWRlZChbImlzX3N0YXJib2FyZF90b29sY2hhaW4iXSkKKyAgICB9CiAgICAgYXNzZXJ0KGRlZmluZWQoaW52b2tlci5hciksICJnY2NfdG9vbGNoYWluKCkgbXVzdCBzcGVjaWZ5IGEgXCJhclwiIHZhbHVlIikKICAgICBhc3NlcnQoZGVmaW5lZChpbnZva2VyLmNjKSwgImdjY190b29sY2hhaW4oKSBtdXN0IHNwZWNpZnkgYSBcImNjXCIgdmFsdWUiKQogICAgIGFzc2VydChkZWZpbmVkKGludm9rZXIuY3h4KSwgImdjY190b29sY2hhaW4oKSBtdXN0IHNwZWNpZnkgYSBcImN4eFwiIHZhbHVlIikKQEAgLTE0NSw2ICsxNDksNyBAQAogICAgIHRvb2xjaGFpbl9hcmdzID0gewogICAgICAgIyBQb3B1bGF0ZSB0b29sY2hhaW4gYXJncyBmcm9tIHRoZSBpbnZva2VyLgogICAgICAgZm9yd2FyZF92YXJpYWJsZXNfZnJvbShpbnZva2VyX3Rvb2xjaGFpbl9hcmdzLCAiKiIpCisgICAgICBidWlsZF93aXRoX3NlcGFyYXRlX2NvYmFsdF90b29sY2hhaW4gPSBidWlsZF93aXRoX3NlcGFyYXRlX2NvYmFsdF90b29sY2hhaW4KIAogICAgICAgIyBUaGUgaG9zdCB0b29sY2hhaW4gdmFsdWUgY29tcHV0ZWQgYnkgdGhlIGRlZmF1bHQgdG9vbGNoYWluJ3Mgc2V0dXAKICAgICAgICMgbmVlZHMgdG8gYmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkIHRvIGFsbCBzZWNvbmRhcnkgdG9vbGNoYWlucyB0bwpAQCAtMzg2LDcgKzM5MSw3IEBACiAgICAgICAjIFRPRE8oYi8yMDY2NDI5OTQpOiBzZWUgaWYgd2UgY2FuIHJlbW92ZSB0aGlzIGNvbmRpdGlvbi4gSXQncyBuZWVkZWQgZm9yCiAgICAgICAjIG5vdyB0byBhZGQgY2ZsYWdzIGZvciBldmVyZ3JlZW4gcGxhdGZvcm1zIGJ1dCB3ZSBoYXZlbid0IHlldCBkZWNpZGVkCiAgICAgICAjIHdoZXRoZXIgY2ZsYWdzIHNob3VsZCBiZSBhZGRlZCBoZXJlIGZvciBhbGwgcGxhdGZvcm1zLgotICAgICAgaWYgKGlzX3N0YXJib2FyZCAmJiBzYl9pc19ldmVyZ3JlZW4pIHsKKyAgICAgIGlmIChpc19zdGFyYm9hcmQgJiYgc2JfaXNfZXZlcmdyZWVuICYmICFpc19zdGFyYm9hcmRfdG9vbGNoYWluKSB7CiAgICAgICAgIGNvbW1hbmQgPSAiJGFzbSAtTU1EIC1NRiAkZGVwZmlsZSAke3JlYnVpbGRfc3RyaW5nfXt7ZGVmaW5lc319IHt7aW5jbHVkZV9kaXJzfX0ge3tjZmxhZ3N9fSB7e2FzbWZsYWdzfX0ke2V4dHJhX2FzbWZsYWdzfSAtYyB7e3NvdXJjZX19IC1vIHt7b3V0cHV0fX0iCiAgICAgICB9IGVsc2UgewogICAgICAgICBjb21tYW5kID0gIiRhc20gLU1NRCAtTUYgJGRlcGZpbGUgJHtyZWJ1aWxkX3N0cmluZ317e2RlZmluZXN9fSB7e2luY2x1ZGVfZGlyc319IHt7YXNtZmxhZ3N9fSR7ZXh0cmFfYXNtZmxhZ3N9IC1jIHt7c291cmNlfX0gLW8ge3tvdXRwdXR9fSIKQEAgLTQ1NSw3ICs0NjAsNyBAQAogICAgICAgIyBUT0RPKGIvMjA2NjQyOTk0KTogc2VlIGlmIHdlIGNhbiByZW1vdmUgdGhpcyBjb25kaXRpb24uIEl0J3MgbmVlZGVkIGZvcgogICAgICAgIyBub3cgYmVjYXVzZSB3ZSB1c2UgdGhlIGxkLmxsZCBsaW5rZXIgZm9yIGV2ZXJncmVlbiBwbGF0Zm9ybXMgYW5kIG5lZWQgdG8KICAgICAgICMgcGFzcyBvcHRpb25zIGFzIGBvcHRpb25gIGluc3RlYWQgb2YgYC1XbCxvcHRpb25gLgotICAgICAgaWYgKGlzX3N0YXJib2FyZCAmJiBzYl9pc19ldmVyZ3JlZW4pIHsKKyAgICAgIGlmIChpc19zdGFyYm9hcmQgJiYgc2JfaXNfZXZlcmdyZWVuICYmICFpc19zdGFyYm9hcmRfdG9vbGNoYWluKSB7CiAgICAgICAgIGxpbmtfY29tbWFuZCA9ICIkbGQgLXNoYXJlZCAtc29uYW1lPVwiJHNvbmFtZVwiIHt7bGRmbGFnc319JHtleHRyYV9sZGZsYWdzfSAtbyBcIiR1bnN0cmlwcGVkX3NvZmlsZVwiIEBcIiRyc3BmaWxlXCIiCiAgICAgICB9IGVsc2UgewogICAgICAgICBsaW5rX2NvbW1hbmQgPSAiJGxkIC1zaGFyZWQgLVdsLC1zb25hbWU9XCIkc29uYW1lXCIge3tsZGZsYWdzfX0ke2V4dHJhX2xkZmxhZ3N9IC1vIFwiJHVuc3RyaXBwZWRfc29maWxlXCIgQFwiJHJzcGZpbGVcIiIKQEAgLTQ4OSw3ICs0OTQsNyBAQAogICAgICAgICAjIFRPRE8oYi8yMDY2NDI5OTQpOiBzZWUgaWYgd2UgY2FuIHJlbW92ZSB0aGlzIGNvbmRpdGlvbi4gSXQncyBuZWVkZWQgZm9yCiAgICAgICAgICMgbm93IGJlY2F1c2Ugd2UgdXNlIHRoZSBsZC5sbGQgbGlua2VyIGZvciBldmVyZ3JlZW4gcGxhdGZvcm1zIGFuZCBuZWVkCiAgICAgICAgICMgdG8gcGFzcyBvcHRpb25zIGFzIGBvcHRpb25gIGluc3RlYWQgb2YgYC1XbCxvcHRpb25gLgotICAgICAgfSBlbHNlIGlmIChpc19zdGFyYm9hcmQgJiYgc2JfaXNfZXZlcmdyZWVuKSB7CisgICAgICB9IGVsc2UgaWYgKGlzX3N0YXJib2FyZCAmJiBzYl9pc19ldmVyZ3JlZW4gJiYgIWlzX3N0YXJib2FyZF90b29sY2hhaW4pIHsKICAgICAgICAgcnNwZmlsZV9jb250ZW50ID0gIi0td2hvbGUtYXJjaGl2ZSB7e2lucHV0c319IHt7c29saWJzfX0gLS1uby13aG9sZS1hcmNoaXZlIHt7bGlic319JHRhaWxfbGliX2RlcGVuZGVuY2llcyIKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJzcGZpbGVfY29udGVudCA9ICItV2wsLS13aG9sZS1hcmNoaXZlIHt7aW5wdXRzfX0ge3tzb2xpYnN9fSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIHt7bGlic319JHRhaWxfbGliX2RlcGVuZGVuY2llcyIKZGlmZiAtLWdpdCBhL2J1aWxkX292ZXJyaWRlcy9ndGVzdC5nbmkgYi9idWlsZF9vdmVycmlkZXMvZ3Rlc3QuZ25pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OThkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZF9vdmVycmlkZXMvZ3Rlc3QuZ25pCkBAIC0wLDAgKzEsMTUgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIyBFeGNsdWRlIHN1cHBvcnQgZm9yIHJlZ2lzdGVyaW5nIG1haW4gZnVuY3Rpb24gaW4gbXVsdGktcHJvY2VzcyB0ZXN0cy4KK2d0ZXN0X2luY2x1ZGVfbXVsdGlwcm9jZXNzID0gdHJ1ZQorCisjIEV4Y2x1ZGUgc3VwcG9ydCBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgb3BlcmF0aW9ucyBhY3Jvc3MgdW5pdCB0ZXN0cy4KK2d0ZXN0X2luY2x1ZGVfcGxhdGZvcm1fdGVzdCA9IGZhbHNlCisKKyMgRXhjbHVkZSBzdXBwb3J0IGZvciB0ZXN0aW5nIE9iamVjdGl2ZSBDIGNvZGUgb24gT1MgWCBhbmQgaU9TLgorZ3Rlc3RfaW5jbHVkZV9vYmpjX3N1cHBvcnQgPSB0cnVlCisKKyMgRXhjbHVkZSBzdXBwb3J0IGZvciBmbHVzaGluZyBjb3ZlcmFnZSBmaWxlcyBvbiBpT1MuCitndGVzdF9pbmNsdWRlX2lvc19jb3ZlcmFnZSA9IHRydWUKZGlmZiAtLWdpdCBhL2NvYmFsdC9CVUlMRC5nbiBiL2NvYmFsdC9CVUlMRC5nbgppbmRleCBjZWNmZTQ5Li44NjdmNDVlIDEwMDY0NAotLS0gYS9jb2JhbHQvQlVJTEQuZ24KKysrIGIvY29iYWx0L0JVSUxELmduCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgIjpkZWZhdWx0IiwKICAgICAiLy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZzpiaW5kaW5nc190ZXN0IiwKICAgICAiLy9jb2JhbHQvYnJvd3Nlcjpicm93c2VyX3Rlc3QiLAorICAgICIvL2NvYmFsdC9icm93c2VyL21ldHJpY3M6bWV0cmljc190ZXN0IiwKICAgICAiLy9jb2JhbHQvY3Nzb206Y3Nzb21fdGVzdCIsCiAgICAgIi8vY29iYWx0L2RlbW9zL3NpbXBsZV9zYW5kYm94IiwKICAgICAiLy9jb2JhbHQvZG9tOmRvbV90ZXN0IiwKQEAgLTc5LDggKzgwLDEwIEBACiAgICAgICAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvY29tcGlsZXItcnQ6Y29tcGlsZXJfcnQiLAogICAgICAgIi8vdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYmN4eDpjeHgiLAogICAgICAgIi8vdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYmN4eGFiaTpjeHhhYmkiLAotICAgICAgIi8vdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYnVud2luZDp1bndpbmRfZXZlcmdyZWVuIiwKICAgICAgICIvL3RoaXJkX3BhcnR5L211c2w6YyIsCiAgICAgXQorICAgIGlmICghYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluKSB7CisgICAgICBkZXBzICs9IFsgIi8vdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYnVud2luZDp1bndpbmRfZXZlcmdyZWVuIiBdCisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9jb2JhbHQvQ0hBTkdFTE9HLm1kIGIvY29iYWx0L0NIQU5HRUxPRy5tZAppbmRleCAwYTc3MzU4Li5jMjFmNjIwIDEwMDY0NAotLS0gYS9jb2JhbHQvQ0hBTkdFTE9HLm1kCisrKyBiL2NvYmFsdC9DSEFOR0VMT0cubWQKQEAgLTIsNiArMiwxMiBAQAogCiBUaGlzIGRvY3VtZW50IHJlY29yZHMgYWxsIG5vdGFibGUgY2hhbmdlcyBtYWRlIHRvIENvYmFsdCBzaW5jZSB0aGUgbGFzdCByZWxlYXNlLgogCisjIyBWZXJzaW9uIDI0CisgLSAqKkNvYmFsdCBoYXMgZXhwZXJpbWVudGFsIFdlYiBBc3NlbWJseSBjYXBhYmlsaXR5CisKKyAgIFdlYiBBc3NlbWJseSBpcyBlbmFibGVkIGFzIGV4cGVyaW1lbnRhbCBjYXBhYmFsaXR5IG9uIGFuZHJvaWQtYXJtIGFuZAorICAgZGV2ZWxvcG1lbnQgYnVpbGQgY29uZmlndXJhdGlvbnMuCisKICMjIFZlcnNpb24gMjMKICAtICoqQ29iYWx0IG5vdyB1c2VzIEdOIChHZW5lcmF0ZSBOaW5qYSkgbWV0YS1idWlsZCBzeXN0ZW0qKgogCmRpZmYgLS1naXQgYS9jb2JhbHQvYWNjb3VudC9hY2NvdW50X21hbmFnZXIuY2MgYi9jb2JhbHQvYWNjb3VudC9hY2NvdW50X21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjdiZjEuLjAwMDAwMDAKLS0tIGEvY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3VzZXIuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYWNjb3VudCB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga01heFZhbHVlTGVuZ3RoID0gNjQgKiAxMDI0OwotCi1zdGQ6OnN0cmluZyBHZXRDdXJyZW50VXNlclByb3BlcnR5KFNiVXNlclByb3BlcnR5SWQgcHJvcGVydHlfaWQpIHsKLSAgU2JVc2VyIHVzZXIgPSBTYlVzZXJHZXRDdXJyZW50KCk7Ci0KLSAgaWYgKCFTYlVzZXJJc1ZhbGlkKHVzZXIpKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgaW50IHNpemUgPSBTYlVzZXJHZXRQcm9wZXJ0eVNpemUodXNlciwgcHJvcGVydHlfaWQpOwotICBpZiAoIXNpemUgfHwgc2l6ZSA+IGtNYXhWYWx1ZUxlbmd0aCkgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHZhbHVlKG5ldyBjaGFyW3NpemVdKTsKLSAgaWYgKCFTYlVzZXJHZXRQcm9wZXJ0eSh1c2VyLCBwcm9wZXJ0eV9pZCwgdmFsdWUuZ2V0KCksIHNpemUpKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdmFsdWUuZ2V0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1BY2NvdW50TWFuYWdlcjo6QWNjb3VudE1hbmFnZXIoKSB7fQotCi1zdGQ6OnN0cmluZyBBY2NvdW50TWFuYWdlcjo6R2V0QXZhdGFyVVJMKCkgewotICByZXR1cm4gR2V0Q3VycmVudFVzZXJQcm9wZXJ0eShrU2JVc2VyUHJvcGVydHlBdmF0YXJVcmwpOwotfQotCi1zdGQ6OnN0cmluZyBBY2NvdW50TWFuYWdlcjo6R2V0VXNlcm5hbWUoKSB7Ci0gIHJldHVybiBHZXRDdXJyZW50VXNlclByb3BlcnR5KGtTYlVzZXJQcm9wZXJ0eVVzZXJOYW1lKTsKLX0KLQotc3RkOjpzdHJpbmcgQWNjb3VudE1hbmFnZXI6OkdldFVzZXJJZCgpIHsKLSAgcmV0dXJuIEdldEN1cnJlbnRVc2VyUHJvcGVydHkoa1NiVXNlclByb3BlcnR5VXNlcklkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFjY291bnQKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIGIvY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjlkZTMuLjAwMDAwMDAKLS0tIGEvY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgQ09CQUxUX0FDQ09VTlRfQUNDT1VOVF9NQU5BR0VSX0hfCi0jZGVmaW5lIENPQkFMVF9BQ0NPVU5UX0FDQ09VTlRfTUFOQUdFUl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBhY2NvdW50IHsKLQotLy8gR2x1ZSBmb3IgaDV2Y2MgdG8gZ2V0IHByb3BlcnRpZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuCi0vLyBUaGUgQWNjb3VudE1hbmFnZXIgd2lsbCBiZSBvd25lZCBieSBCcm93c2VyTW9kdWxlLgotY2xhc3MgQWNjb3VudE1hbmFnZXIgewotIHB1YmxpYzoKLSAgQWNjb3VudE1hbmFnZXIoKTsKLSAgQWNjb3VudE1hbmFnZXIoY29uc3QgQWNjb3VudE1hbmFnZXImKSA9IGRlbGV0ZTsKLSAgQWNjb3VudE1hbmFnZXImIG9wZXJhdG9yPShjb25zdCBBY2NvdW50TWFuYWdlciYpID0gZGVsZXRlOwotCi0gIH5BY2NvdW50TWFuYWdlcigpIHt9Ci0KLSAgLy8gR2V0IHRoZSBhdmF0YXIgVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCwgaWYgYW55LgotICBzdGQ6OnN0cmluZyBHZXRBdmF0YXJVUkwoKTsKLQotICAvLyBHZXQgdGhlIHVzZXJuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC4gRHVlIHRvIHJlc3RyaWN0aW9ucyBvbgotICAvLyBzb21lIHBsYXRmb3JtcywgdGhpcyBtYXkgcmV0dXJuIHRoZSB1c2VyIElEIG9yIGFuIGVtcHR5IHN0cmluZy4KLSAgc3RkOjpzdHJpbmcgR2V0VXNlcm5hbWUoKTsKLQotICAvLyBHZXQgdGhlIHVzZXIgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LgotICBzdGQ6OnN0cmluZyBHZXRVc2VySWQoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2NvdW50Ci19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gQ09CQUxUX0FDQ09VTlRfQUNDT1VOVF9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXJpYWxpemVfc2NyaXB0X3ZhbHVlX2ludGVyZmFjZS5oIGIvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VyaWFsaXplX3NjcmlwdF92YWx1ZV9pbnRlcmZhY2UuaAppbmRleCA3ODJlZGIyLi45ZWU1NWRiIDEwMDY0NAotLS0gYS9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXJpYWxpemVfc2NyaXB0X3ZhbHVlX2ludGVyZmFjZS5oCisrKyBiL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcmlhbGl6ZV9zY3JpcHRfdmFsdWVfaW50ZXJmYWNlLmgKQEAgLTM1LDI0ICszNSwxOSBAQAogIHB1YmxpYzoKICAgU2VyaWFsaXplU2NyaXB0VmFsdWVJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAKLSAgc2l6ZV90IHNlcmlhbGl6ZWRfc2l6ZSgpIHsgcmV0dXJuIGRhdGFfYnVmZmVyXy0+c2l6ZTsgfQotCiAgIHZvaWQgU2VyaWFsaXplVGVzdChjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyJiB2YWx1ZSkgewotICAgIGRhdGFfYnVmZmVyXyA9IHN0ZDo6bW92ZShzY3JpcHQ6OlNlcmlhbGl6ZVNjcmlwdFZhbHVlKHZhbHVlKSk7CiAgICAgaXNvbGF0ZV8gPSBzY3JpcHQ6OkdldElzb2xhdGUodmFsdWUpOworICAgIHN0cnVjdHVyZWRfY2xvbmVfID0gc3RkOjptYWtlX3VuaXF1ZTxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4odmFsdWUpOwogICB9CiAKLSAgY29uc3Qgc2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlciogRGVzZXJpYWxpemVUZXN0KCkgewotICAgIGRlc2VyaWFsaXplZF8ucmVzZXQoCi0gICAgICAgIHNjcmlwdDo6RGVzZXJpYWxpemVTY3JpcHRWYWx1ZShpc29sYXRlXywgKmRhdGFfYnVmZmVyXykpOwotICAgIHJldHVybiBkZXNlcmlhbGl6ZWRfLmdldCgpOworICBjb25zdCBzY3JpcHQ6OkhhbmRsZTxzY3JpcHQ6OlZhbHVlSGFuZGxlPiBEZXNlcmlhbGl6ZVRlc3QoKSB7CisgICAgcmV0dXJuIHN0cnVjdHVyZWRfY2xvbmVfLT5EZXNlcmlhbGl6ZShpc29sYXRlXyk7CiAgIH0KIAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoU2VyaWFsaXplU2NyaXB0VmFsdWVJbnRlcmZhY2UpOwogCiAgcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6RGF0YUJ1ZmZlcj4gZGF0YV9idWZmZXJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcj4gZGVzZXJpYWxpemVkXzsKKyAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPiBzdHJ1Y3R1cmVkX2Nsb25lXzsKICAgdjg6Oklzb2xhdGUqIGlzb2xhdGVfOwogfTsKIApkaWZmIC0tZ2l0IGEvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VyaWFsaXplX3NjcmlwdF92YWx1ZV90ZXN0LmNjIGIvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VyaWFsaXplX3NjcmlwdF92YWx1ZV90ZXN0LmNjCmluZGV4IDk2ZTBkYzYuLmE5ZTRiMDkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcmlhbGl6ZV9zY3JpcHRfdmFsdWVfdGVzdC5jYworKysgYi9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXJpYWxpemVfc2NyaXB0X3ZhbHVlX3Rlc3QuY2MKQEAgLTM2LDEwICszNiwxOSBAQAogVEVTVF9GKFNlcmlhbGl6ZVNjcmlwdFZhbHVlVGVzdCwgU2VyaWFsaXplKSB7CiAgIC8vIFN0b3JlcyBzZXJpYWxpemVkIHJlc3VsdCB0aGF0IGlzIHRoZW4gdXNlZCBieSB8ZGVzZXJpYWxpemVUZXN0KCl8LgogICBFdmFsdWF0ZVNjcmlwdChSIigKLSAgICAgIHRlc3Quc2VyaWFsaXplVGVzdCh7YTogWydzb21ldGhpbmcnXSwgYjogbmV3IFVpbnQ4QXJyYXkoWzQyXSl9KTsKK3dpbmRvdy5hcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigyKTsKK3dpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTsKK3sKKyAgbmV3IFVpbnQ4QXJyYXkod2luZG93LmFycmF5QnVmZmVyKS5maWxsKDEwKTsKKyAgbmV3IFVpbnQ4QXJyYXkod2luZG93LnNoYXJlZEFycmF5QnVmZmVyKS5maWxsKDIwKTsKK30KK3Rlc3Quc2VyaWFsaXplVGVzdCh7CisgIGE6IFsnc29tZXRoaW5nJ10sCisgIGI6IG5ldyBVaW50OEFycmF5KFs0Ml0pLAorICBjOiB3aW5kb3cuYXJyYXlCdWZmZXIsCisgIGQ6IHdpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlciwKK30pOwogICAgICkiKTsKLSAgLy8gU2FuaXR5IGNoZWNrIHRoZSBzZXJpYWxpemVkIHNpemUuCi0gIEVYUEVDVF9FUSgzMiwgdGVzdF9tb2NrKCkuc2VyaWFsaXplZF9zaXplKCkpOwogICBFeHBlY3RUcnVlKCIhKHRlc3QuZGVzZXJpYWxpemVUZXN0KCkgaW5zdGFuY2VvZiBBcnJheSkiKTsKICAgRXhwZWN0VHJ1ZSgidGVzdC5kZXNlcmlhbGl6ZVRlc3QoKSBpbnN0YW5jZW9mIE9iamVjdCIpOwogICBFeHBlY3RUcnVlKCJ0ZXN0LmRlc2VyaWFsaXplVGVzdCgpLmEgaW5zdGFuY2VvZiBBcnJheSIpOwpAQCAtNDgsNiArNTcsNDQgQEAKICAgRXhwZWN0VHJ1ZSgidGVzdC5kZXNlcmlhbGl6ZVRlc3QoKS5iIGluc3RhbmNlb2YgVWludDhBcnJheSIpOwogICBFeHBlY3RUcnVlKCIhKHRlc3QuZGVzZXJpYWxpemVUZXN0KCkuYiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSIpOwogICBFeHBlY3RUcnVlKCI0MiA9PT0gdGVzdC5kZXNlcmlhbGl6ZVRlc3QoKS5iWzBdIik7CisgIEV4cGVjdFRydWUoInRlc3QuZGVzZXJpYWxpemVUZXN0KCkuYyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIik7CisgIEV4cGVjdFRydWUoInRlc3QuZGVzZXJpYWxpemVUZXN0KCkuZCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyIik7CisgIEV2YWx1YXRlU2NyaXB0KFIiKAord2luZG93Lm90aGVyQXJyYXlCdWZmZXIgPSB0ZXN0LmRlc2VyaWFsaXplVGVzdCgpLmM7Cit3aW5kb3cub3RoZXJTaGFyZWRBcnJheUJ1ZmZlciA9IHRlc3QuZGVzZXJpYWxpemVUZXN0KCkuZDsKK2NvbnN0IGFycmF5QnVmZmVyVG9TdHJpbmcgPSBhcnJheUJ1ZmZlciA9PgorICAgIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKS50b1N0cmluZygpOword2luZG93LnN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93LmFycmF5QnVmZmVyKTsKK3dpbmRvdy5vdGhlclN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93Lm90aGVyQXJyYXlCdWZmZXIpOword2luZG93LnNoYXJlZFN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93LnNoYXJlZEFycmF5QnVmZmVyKTsKK3dpbmRvdy5vdGhlclNoYXJlZFN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93Lm90aGVyU2hhcmVkQXJyYXlCdWZmZXIpOworICAgICkiKTsKKyAgRXhwZWN0VHJ1ZSgiMiA9PT0gd2luZG93LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGgiKTsKKyAgRXhwZWN0VHJ1ZSgiMiA9PT0gd2luZG93Lm90aGVyQXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCIpOworICBFeHBlY3RUcnVlKCI0ID09PSB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCIpOworICBFeHBlY3RUcnVlKCI0ID09PSB3aW5kb3cub3RoZXJTaGFyZWRBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoIik7CisgIEV4cGVjdFRydWUoIicxMCwxMCcgPT09IHdpbmRvdy5zdHJpbmciKTsKKyAgRXhwZWN0VHJ1ZSgiJzEwLDEwJyA9PT0gd2luZG93Lm90aGVyU3RyaW5nIik7CisgIEV4cGVjdFRydWUoIicyMCwyMCwyMCwyMCcgPT09IHdpbmRvdy5zaGFyZWRTdHJpbmciKTsKKyAgRXhwZWN0VHJ1ZSgiJzIwLDIwLDIwLDIwJyA9PT0gd2luZG93Lm90aGVyU2hhcmVkU3RyaW5nIik7CisgIEV2YWx1YXRlU2NyaXB0KFIiKAorY29uc3QgdXBkYXRlQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlciA9PiB7CisgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTsKKyB2aWV3LmZvckVhY2goKHgsIGkpID0+IHsKKyAgdmlld1tpXSA9IHggKyBpICogMTA7CisgfSk7Cit9OwordXBkYXRlQXJyYXlCdWZmZXIod2luZG93Lm90aGVyQXJyYXlCdWZmZXIpOwordXBkYXRlQXJyYXlCdWZmZXIod2luZG93Lm90aGVyU2hhcmVkQXJyYXlCdWZmZXIpOword2luZG93LnN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93LmFycmF5QnVmZmVyKTsKK3dpbmRvdy5vdGhlclN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93Lm90aGVyQXJyYXlCdWZmZXIpOword2luZG93LnNoYXJlZFN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93LnNoYXJlZEFycmF5QnVmZmVyKTsKK3dpbmRvdy5vdGhlclNoYXJlZFN0cmluZyA9IGFycmF5QnVmZmVyVG9TdHJpbmcod2luZG93Lm90aGVyU2hhcmVkQXJyYXlCdWZmZXIpOworICAgICkiKTsKKyAgRXhwZWN0VHJ1ZSgiJzEwLDEwJyA9PT0gd2luZG93LnN0cmluZyIpOworICBFeHBlY3RUcnVlKCInMTAsMjAnID09PSB3aW5kb3cub3RoZXJTdHJpbmciKTsKKyAgRXhwZWN0VHJ1ZSgiJzIwLDMwLDQwLDUwJyA9PT0gd2luZG93LnNoYXJlZFN0cmluZyIpOworICBFeHBlY3RUcnVlKCInMjAsMzAsNDAsNTAnID09PSB3aW5kb3cub3RoZXJTaGFyZWRTdHJpbmciKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvYmxhY2tfYm94X3Rlc3RzLnB5IGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9ibGFja19ib3hfdGVzdHMucHkKaW5kZXggZDhjZWE1MS4uOTliMTFjNCAxMDA3NTUKLS0tIGEvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9ibGFja19ib3hfdGVzdHMucHkKKysrIGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9ibGFja19ib3hfdGVzdHMucHkKQEAgLTQ2LDkgKzQ2LDcgQEAKICAgICAjIFRPRE8oYi8yODM3ODgwNTkpOiBlbmFibGUgd2hlbiB0aGVyZSBhcmUgR2l0SHViIGpvYnMgdG8gcnVuIGludGVncmF0aW9uCiAgICAgIyBhbmQgQmxhY2sgQm94IFRlc3RzIG9uIGV2ZXJncmVlbi1hcm0taGFyZGZwLgogICAgICMnZXZlcmdyZWVuLWFybS9kZXZlbCcsCi0gICAgIyBUT0RPKGIvMjgzMTQ0OTAxKTogZW5hYmxlIHdoZW4gdGhlIFN0YXJib2FyZCAxNiBiaW5hcmllcyBhcmUgcmVsZWFzZWQgZm9yCi0gICAgIyBFdmVyZ3JlZW4uCi0gICAgIydldmVyZ3JlZW4teDY0L2RldmVsJywKKyAgICAnZXZlcmdyZWVuLXg2NC9kZXZlbCcsCiBdCiAKIF9QT1JUX1NFTEVDVElPTl9SRVRSWV9MSU1JVCA9IDEwCkBAIC04Nyw2ICs4NSw3IEBACiAgICAgJ3NlcnZpY2Vfd29ya2VyX2ZldGNoX21haW5fcmVzb3VyY2VfdGVzdCcsCiAgICAgJ3NlcnZpY2Vfd29ya2VyX2ZldGNoX3Rlc3QnLAogICAgICdzZXJ2aWNlX3dvcmtlcl9tZXNzYWdlX3Rlc3QnLAorICAgICdzZXJ2aWNlX3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdCcsCiAgICAgJ3NlcnZpY2Vfd29ya2VyX3Rlc3QnLAogICAgICdzZXJ2aWNlX3dvcmtlcl9wZXJzaXN0X3Rlc3QnLAogICAgICdzb2Z0X21pY19wbGF0Zm9ybV9zZXJ2aWNlX3Rlc3QnLApAQCAtOTYsNiArOTUsNyBAQAogICAgICd3ZWJfd29ya2VyX3Rlc3QnLAogICAgICd3b3JrZXJfY3NwX3Rlc3QnLAogICAgICd3b3JrZXJfbG9hZF90ZXN0JywKKyAgICAnd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0JywKIF0KICMgVGhlc2UgYXJlIHZlcnkgZGlmZmVyZW50IGFuZCByZXF1aXJlIGEgY3VzdG9tIGNvbmZpZyArIHByb3h5CiBfV1BUX1RFU1RTID0gWwpkaWZmIC0tZ2l0IGEvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zZXJ2aWNlX3dvcmtlcl9jb250cm9sbGVyX2FjdGl2YXRpb25fdGVzdF93b3JrZXIuanMgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3NlcnZpY2Vfd29ya2VyX2NvbnRyb2xsZXJfYWN0aXZhdGlvbl90ZXN0X3dvcmtlci5qcwppbmRleCA0YmRhM2UwLi5hMWZhYjM4IDEwMDY0NAotLS0gYS9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3NlcnZpY2Vfd29ya2VyX2NvbnRyb2xsZXJfYWN0aXZhdGlvbl90ZXN0X3dvcmtlci5qcworKysgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3NlcnZpY2Vfd29ya2VyX2NvbnRyb2xsZXJfYWN0aXZhdGlvbl90ZXN0X3dvcmtlci5qcwpAQCAtMjMsNCArMjMsNSBAQAogCiBzZWxmLm9uYWN0aXZhdGUgPSBmdW5jdGlvbiAoZSkgewogICBjb25zb2xlLmxvZygnb25hY3RpdmF0ZSBldmVudCByZWNlaXZlZCcsIGUpOworICBzZWxmLmNsaWVudHMuY2xhaW0oKTsKIH0KZGlmZiAtLWdpdCBhL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdGRhdGEvc2VydmljZV93b3JrZXJfZmV0Y2hfdGVzdC5qcyBiL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdGRhdGEvc2VydmljZV93b3JrZXJfZmV0Y2hfdGVzdC5qcwppbmRleCA2YjljYTdkLi45NGVkYTU5IDEwMDY0NAotLS0gYS9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3NlcnZpY2Vfd29ya2VyX2ZldGNoX3Rlc3QuanMKKysrIGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zZXJ2aWNlX3dvcmtlcl9mZXRjaF90ZXN0LmpzCkBAIC0zNSw3ICszNSw3IEBACiB9KTsKIAogbGV0IGZldGNoRXZlbnRDb3VudCA9IDA7Ci1sZXQgZXhjZXB0U2NyaXB0SW50ZXJjZXB0ZWQgPSBmYWxzZTsKK2xldCBleHBlY3RTY3JpcHRJbnRlcmNlcHRlZCA9IGZhbHNlOwogCiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7CiAgIGlmIChldmVudC5kYXRhID09PSAnc3RhcnQtdGVzdCcpIHsKQEAgLTU4LDIxICs1OCwyMSBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzaG91bGRJbnRlcmNlcHQgPSB0cnVlOwotICAgIGV4Y2VwdFNjcmlwdEludGVyY2VwdGVkID0gdHJ1ZTsKKyAgICBleHBlY3RTY3JpcHRJbnRlcmNlcHRlZCA9IHRydWU7CiAgICAgcG9zdE1lc3NhZ2Uoe3Rlc3Q6ICdjaGVjay1zY3JpcHQtaW50ZXJjZXB0ZWQnfSk7CiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChldmVudC5kYXRhID09PSAnc2NyaXB0LWludGVyY2VwdGVkJykgewotICAgIGlmICghZXhjZXB0U2NyaXB0SW50ZXJjZXB0ZWQpIHsKKyAgICBpZiAoIWV4cGVjdFNjcmlwdEludGVyY2VwdGVkKSB7CiAgICAgICBwb3N0TWVzc2FnZSgnc2NyaXB0LWludGVyY2VwdGVkLXVuZXhwZWN0ZWQnKTsKICAgICB9CiAgICAgc2hvdWxkSW50ZXJjZXB0ID0gZmFsc2U7Ci0gICAgZXhjZXB0U2NyaXB0SW50ZXJjZXB0ZWQgPSBmYWxzZTsKKyAgICBleHBlY3RTY3JpcHRJbnRlcmNlcHRlZCA9IGZhbHNlOwogICAgIHBvc3RNZXNzYWdlKHt0ZXN0OiAnY2hlY2stc2NyaXB0LW5vdC1pbnRlcmNlcHRlZCd9KQogICAgIHJldHVybjsKICAgfQogICBpZiAoZXZlbnQuZGF0YSA9PT0gJ3NjcmlwdC1ub3QtaW50ZXJjZXB0ZWQnKSB7Ci0gICAgaWYgKGV4Y2VwdFNjcmlwdEludGVyY2VwdGVkKSB7CisgICAgaWYgKGV4cGVjdFNjcmlwdEludGVyY2VwdGVkKSB7CiAgICAgICBwb3N0TWVzc2FnZSgnc2NyaXB0LW5vdC1pbnRlcmNlcHRlZC11bmV4cGVjdGVkJyk7CiAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zZXJ2aWNlX3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5odG1sIGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zZXJ2aWNlX3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3NlcnZpY2Vfd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0Lmh0bWwKQEAgLTAsMCArMSwxMTQgQEAKKzwhRE9DVFlQRSBodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgVGVzdHMgcG9zdE1lc3NhZ2UoKSBmb3Igc2VydmljZSB3b3JrZXJzLgorLS0+CisKKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT5Db2JhbHQgU2VydmljZSBXb3JrZXIgcG9zdE1lc3NhZ2UoKSBUZXN0PC90aXRsZT4KKyAgPHNjcmlwdCBzcmM9J2JsYWNrX2JveF9qc190ZXN0X3V0aWxzLmpzJz48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8c2NyaXB0PgorICAgIGg1dmNjLnN0b3JhZ2UuY2xlYXJTZXJ2aWNlV29ya2VyQ2FjaGUoKTsKKworICAgIGNvbnN0IHVucmVnaXN0ZXJBbGwgPSAoKSA9PiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5nZXRSZWdpc3RyYXRpb25zKCkudGhlbihyZWdpc3RyYXRpb25zID0+CisgICAgICAgIFByb21pc2UuYWxsKHJlZ2lzdHJhdGlvbnMubWFwKHIgPT4gci51bnJlZ2lzdGVyKCkpKSk7CisgICAgY29uc3QgdW5yZWdpc3RlckFuZE5vdFJlYWNoZWQgPSAoKSA9PiB1bnJlZ2lzdGVyQWxsKCkudGhlbihub3RSZWFjaGVkKTsKKworICAgIGNvbnN0IHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHVucmVnaXN0ZXJBbmROb3RSZWFjaGVkLCAxMDAwMCk7CisgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlciA9IG51bGw7CisgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXcgPSBudWxsOworICAgIHdpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3cgPSBuZXcgU2hhcmVkQXJyYXlCdWZmZXIoNCk7CisgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXcgPSBuZXcgVWludDhBcnJheSh3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV2luZG93KTsKKyAgICB3aW5kb3cuYWN0aXZlU2VydmljZVdvcmtlciA9IG51bGw7CisgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIub25tZXNzYWdlID0gZXZlbnQgPT4geworICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ2NoZWNrLWRhdGEnKSB7CisgICAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhLmRhdGE7CisgICAgICAgIGFzc2VydEVxdWFsKDEsIGRhdGEubnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoMiwgZGF0YS5hcnJheS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbCgyLCBkYXRhLmFycmF5WzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoMywgZGF0YS5hcnJheVsxXSk7CisgICAgICAgIGFzc2VydEVxdWFsKCdhYmMnLCBkYXRhLnN0cmluZyk7CisgICAgICAgIGFzc2VydEVxdWFsKDMsIGRhdGEuYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7CisgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEuYXJyYXlCdWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbCg0LCBhcnJheUJ1ZmZlclZpZXdbMF0pOworICAgICAgICBhc3NlcnRFcXVhbCg1LCBhcnJheUJ1ZmZlclZpZXdbMV0pOworICAgICAgICBhc3NlcnRFcXVhbCg2LCBhcnJheUJ1ZmZlclZpZXdbMl0pOworICAgICAgICBhc3NlcnRFcXVhbCg1LCBkYXRhLnNoYXJlZEFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOworICAgICAgICB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyID0gZGF0YS5zaGFyZWRBcnJheUJ1ZmZlcjsKKyAgICAgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXcgPSBuZXcgVWludDhBcnJheSh3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyKTsKKyAgICAgICAgd2luZG93LmFjdGl2ZVNlcnZpY2VXb3JrZXIucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHR5cGU6ICd1cGRhdGUtc2hhcmVkLWFycmF5LWJ1ZmZlcnMnLAorICAgICAgICAgIGluZGV4OiAxLAorICAgICAgICAgIHZhbHVlOiA0MiwKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICd1cGRhdGUtc2hhcmVkLWFycmF5LWJ1ZmZlcnMtZG9uZScpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWwoNDIsIHdpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3dWaWV3WzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoNDIsIHdpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlckZyb21Xb3JrZXJWaWV3WzFdKTsKKyAgICAgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXdbMF0gPSA0NzsKKyAgICAgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXdbMF0gPSA0NzsKKyAgICAgICAgd2luZG93LmFjdGl2ZVNlcnZpY2VXb3JrZXIucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHR5cGU6ICdjaGVjay1zaGFyZWQtYXJyYXktYnVmZmVycycsCisgICAgICAgICAgaW5kZXg6IDAsCisgICAgICAgICAgdmFsdWU6IDQ3LAorICAgICAgICB9KQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnY2hlY2stc2hhcmVkLWFycmF5LWJ1ZmZlcnMtZG9uZScpIHsKKyAgICAgICAgdW5yZWdpc3RlckFsbCgpLnRoZW4oKCkgPT4geworICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOworICAgICAgICAgIG9uRW5kVGVzdCgpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXZlbnQuZGF0YSkpOworICAgICAgdW5yZWdpc3RlckFuZE5vdFJlYWNoZWQoKTsKKyAgICB9OworCisgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHkudGhlbihyZWdpc3RyYXRpb24gPT4geworICAgICAgd2luZG93LmFjdGl2ZVNlcnZpY2VXb3JrZXIgPSByZWdpc3RyYXRpb24uYWN0aXZlOworICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMyk7CisgICAgICBjb25zdCBhcnJheUJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7CisgICAgICBhcnJheUJ1ZmZlclZpZXdbMF0gPSA0OworICAgICAgYXJyYXlCdWZmZXJWaWV3WzFdID0gNTsKKyAgICAgIGFycmF5QnVmZmVyVmlld1syXSA9IDY7CisgICAgICB3aW5kb3cuYWN0aXZlU2VydmljZVdvcmtlci5wb3N0TWVzc2FnZSh7CisgICAgICAgIHR5cGU6ICdjaGVjay1kYXRhJywKKyAgICAgICAgZGF0YTogeworICAgICAgICAgIG51bWJlcjogMSwKKyAgICAgICAgICBhcnJheTogWzIsIDNdLAorICAgICAgICAgIHN0cmluZzogJ2FiYycsCisgICAgICAgICAgYXJyYXlCdWZmZXIsCisgICAgICAgICAgc2hhcmVkQXJyYXlCdWZmZXI6IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvdywKKyAgICAgICAgfSwKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdW5yZWdpc3RlckFsbCgpLnRoZW4oKCkgPT4geworICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoJ3NlcnZpY2Vfd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0LmpzJykuY2F0Y2goKCkgPT4geworICAgICAgICB1bnJlZ2lzdGVyQW5kTm90UmVhY2hlZCgpOworICAgICAgfSk7CisgICAgfSk7CisKKyAgICBzZXR1cEZpbmlzaGVkKCk7CisgIDwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zZXJ2aWNlX3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5qcyBiL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdGRhdGEvc2VydmljZV93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzMDJhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdGRhdGEvc2VydmljZV93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QuanMKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjb25zdCBwb3N0TWVzc2FnZSA9IG1lc3NhZ2UgPT4geworICBjb25zdCBvcHRpb25zID0geworICAgIGluY2x1ZGVVbmNvbnRyb2xsZWQ6IGZhbHNlLCB0eXBlOiAnd2luZG93JworICB9OworICBzZWxmLmNsaWVudHMubWF0Y2hBbGwob3B0aW9ucykudGhlbihjbGllbnRzID0+IHsKKyAgICBjbGllbnRzLmZvckVhY2goYyA9PiB7CisgICAgICBjLnBvc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0pOworICB9KTsKK307CisKK3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigiaW5zdGFsbCIsIGV2ZW50ID0+IHsKKyAgc2VsZi5za2lwV2FpdGluZygpOworfSk7CisKK3NlbGYuYWRkRXZlbnRMaXN0ZW5lcignYWN0aXZhdGUnLCBldmVudCA9PiB7CisgIHNlbGYuY2xpZW50cy5jbGFpbSgpOworfSk7CisKK2NvbnN0IGFzc2VydEVxdWFsID0gKGV4cGVjdGVkLCBhY3R1YWwpID0+IHsKKyAgaWYgKGV4cGVjdGVkICE9PSBhY3R1YWwpIHsKKyAgICBwb3N0TWVzc2FnZShgJHthY3R1YWx9IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICR7ZXhwZWN0ZWR9YCk7CisgIH0KK307CisKK2NvbnN0IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig1KTsKK2NvbnN0IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXcgPSBuZXcgVWludDhBcnJheShzaGFyZWRBcnJheUJ1ZmZlckZyb21Xb3JrZXIpOworbGV0IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvdyA9IG51bGw7CitsZXQgc2hhcmVkQXJyYXlCdWZmZXJGcm9tV2luZG93VmlldyA9IG51bGw7CisKK3NlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHsKKyAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ2NoZWNrLWRhdGEnKSB7CisgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTsKKyAgICBhc3NlcnRFcXVhbCgxLCBkYXRhLm51bWJlcik7CisgICAgYXNzZXJ0RXF1YWwoMiwgZGF0YS5hcnJheS5sZW5ndGgpOworICAgIGFzc2VydEVxdWFsKDIsIGRhdGEuYXJyYXlbMF0pOworICAgIGFzc2VydEVxdWFsKDMsIGRhdGEuYXJyYXlbMV0pOworICAgIGFzc2VydEVxdWFsKCdhYmMnLCBkYXRhLnN0cmluZyk7CisgICAgYXNzZXJ0RXF1YWwoMywgZGF0YS5hcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsKKyAgICBjb25zdCBhcnJheUJ1ZmZlckZyb21XaW5kb3dWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5hcnJheUJ1ZmZlcik7CisgICAgYXNzZXJ0RXF1YWwoNCwgYXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1swXSk7CisgICAgYXNzZXJ0RXF1YWwoNSwgYXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1sxXSk7CisgICAgYXNzZXJ0RXF1YWwoNiwgYXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1syXSk7CisgICAgYXNzZXJ0RXF1YWwoNCwgZGF0YS5zaGFyZWRBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsKKyAgICBzaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3cgPSBkYXRhLnNoYXJlZEFycmF5QnVmZmVyOworICAgIHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXcgPSBuZXcgVWludDhBcnJheShzaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3cpOworICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDMpOworICAgIGNvbnN0IGFycmF5QnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTsKKyAgICBhcnJheUJ1ZmZlclZpZXdbMF0gPSA0OworICAgIGFycmF5QnVmZmVyVmlld1sxXSA9IDU7CisgICAgYXJyYXlCdWZmZXJWaWV3WzJdID0gNjsKKyAgICBwb3N0TWVzc2FnZSh7CisgICAgICB0eXBlOiAnY2hlY2stZGF0YScsCisgICAgICBkYXRhOiB7CisgICAgICAgIG51bWJlcjogMSwKKyAgICAgICAgYXJyYXk6IFsyLCAzXSwKKyAgICAgICAgc3RyaW5nOiAnYWJjJywKKyAgICAgICAgYXJyYXlCdWZmZXIsCisgICAgICAgIHNoYXJlZEFycmF5QnVmZmVyOiBzaGFyZWRBcnJheUJ1ZmZlckZyb21Xb3JrZXIsCisgICAgICB9LAorICAgIH0pOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAndXBkYXRlLXNoYXJlZC1hcnJheS1idWZmZXJzJykgeworICAgIGNvbnN0IHtpbmRleCwgdmFsdWV9ID0gZXZlbnQuZGF0YTsKKyAgICBzaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3dWaWV3W2luZGV4XSA9IHZhbHVlOworICAgIHNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXdbaW5kZXhdID0gdmFsdWU7CisgICAgcG9zdE1lc3NhZ2Uoe3R5cGU6ICd1cGRhdGUtc2hhcmVkLWFycmF5LWJ1ZmZlcnMtZG9uZSd9KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ2NoZWNrLXNoYXJlZC1hcnJheS1idWZmZXJzJykgeworICAgIGNvbnN0IHtpbmRleCwgdmFsdWV9ID0gZXZlbnQuZGF0YTsKKyAgICBhc3NlcnRFcXVhbCh2YWx1ZSwgc2hhcmVkQXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1tpbmRleF0pOworICAgIGFzc2VydEVxdWFsKHZhbHVlLCBzaGFyZWRBcnJheUJ1ZmZlckZyb21Xb3JrZXJWaWV3W2luZGV4XSk7CisgICAgcG9zdE1lc3NhZ2Uoe3R5cGU6ICdjaGVjay1zaGFyZWQtYXJyYXktYnVmZmVycy1kb25lJ30pOworICAgIHJldHVybjsKKyAgfQorICBwb3N0TWVzc2FnZShgVW5leHBlY3RlZCBtZXNzYWdlICR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZGF0YSl9LmApOworfSk7CmRpZmYgLS1naXQgYS9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5odG1sIGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVmOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QuaHRtbApAQCAtMCwwICsxLDk5IEBACis8IURPQ1RZUEUgaHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgIFRlc3RzIHBvc3RNZXNzYWdlKCkgZm9yIHdvcmtlcnMuCistLT4KKworPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPkNvYmFsdCBXb3JrZXIgcG9zdE1lc3NhZ2UoKSBUZXN0PC90aXRsZT4KKyAgPHNjcmlwdCBzcmM9J2JsYWNrX2JveF9qc190ZXN0X3V0aWxzLmpzJz48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8c2NyaXB0PgorICAgIGNvbnN0IHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KG5vdFJlYWNoZWQsIDEwMDAwKTsKKyAgICB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyID0gbnVsbDsKKyAgICB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyVmlldyA9IG51bGw7CisgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvdyA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTsKKyAgICB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV2luZG93VmlldyA9IG5ldyBVaW50OEFycmF5KHdpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3cpOworICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIoJ3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5qcycpOworICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZXZlbnQgPT4geworICAgICAgaWYgKGV2ZW50LmRhdGEgPT09ICdyZWFkeScpIHsKKyAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMyk7CisgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTsKKyAgICAgICAgYXJyYXlCdWZmZXJWaWV3WzBdID0gNDsKKyAgICAgICAgYXJyYXlCdWZmZXJWaWV3WzFdID0gNTsKKyAgICAgICAgYXJyYXlCdWZmZXJWaWV3WzJdID0gNjsKKyAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICB0eXBlOiAnY2hlY2stZGF0YScsCisgICAgICAgICAgZGF0YTogeworICAgICAgICAgICAgbnVtYmVyOiAxLAorICAgICAgICAgICAgYXJyYXk6IFsyLCAzXSwKKyAgICAgICAgICAgIHN0cmluZzogJ2FiYycsCisgICAgICAgICAgICBhcnJheUJ1ZmZlciwKKyAgICAgICAgICAgIHNoYXJlZEFycmF5QnVmZmVyOiBzaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3csCisgICAgICAgICAgfSwKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICdjaGVjay1kYXRhJykgeworICAgICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YS5kYXRhOworICAgICAgICBhc3NlcnRFcXVhbCgxLCBkYXRhLm51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFsKDIsIGRhdGEuYXJyYXkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoMiwgZGF0YS5hcnJheVswXSk7CisgICAgICAgIGFzc2VydEVxdWFsKDMsIGRhdGEuYXJyYXlbMV0pOworICAgICAgICBhc3NlcnRFcXVhbCgnYWJjJywgZGF0YS5zdHJpbmcpOworICAgICAgICBhc3NlcnRFcXVhbCgzLCBkYXRhLmFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOworICAgICAgICBjb25zdCBhcnJheUJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShkYXRhLmFycmF5QnVmZmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoNCwgYXJyYXlCdWZmZXJWaWV3WzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoNSwgYXJyYXlCdWZmZXJWaWV3WzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoNiwgYXJyYXlCdWZmZXJWaWV3WzJdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWwoNSwgZGF0YS5zaGFyZWRBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsKKyAgICAgICAgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlciA9IGRhdGEuc2hhcmVkQXJyYXlCdWZmZXI7CisgICAgICAgIHdpbmRvdy5zaGFyZWRBcnJheUJ1ZmZlckZyb21Xb3JrZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkod2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlcik7CisgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7CisgICAgICAgICAgdHlwZTogJ3VwZGF0ZS1zaGFyZWQtYXJyYXktYnVmZmVycycsCisgICAgICAgICAgaW5kZXg6IDEsCisgICAgICAgICAgdmFsdWU6IDQyLAorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ3VwZGF0ZS1zaGFyZWQtYXJyYXktYnVmZmVycy1kb25lJykgeworICAgICAgICBhc3NlcnRFcXVhbCg0Miwgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXdbMV0pOworICAgICAgICBhc3NlcnRFcXVhbCg0Miwgd2luZG93LnNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXdbMV0pOworICAgICAgICB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1swXSA9IDQ3OworICAgICAgICB3aW5kb3cuc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyVmlld1swXSA9IDQ3OworICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeworICAgICAgICAgIHR5cGU6ICdjaGVjay1zaGFyZWQtYXJyYXktYnVmZmVycycsCisgICAgICAgICAgaW5kZXg6IDAsCisgICAgICAgICAgdmFsdWU6IDQ3LAorICAgICAgICB9KQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnY2hlY2stc2hhcmVkLWFycmF5LWJ1ZmZlcnMtZG9uZScpIHsKKyAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CisgICAgICAgIG9uRW5kVGVzdCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShldmVudC5kYXRhKSk7CisgICAgICBub3RSZWFjaGVkKCk7CisgICAgfSk7CisKKyAgICBzZXR1cEZpbmlzaGVkKCk7CisgIDwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QuanMgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA3ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QuanMKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjb25zdCBhc3NlcnRFcXVhbCA9IChleHBlY3RlZCwgYWN0dWFsKSA9PiB7CisgIGlmIChleHBlY3RlZCAhPT0gYWN0dWFsKSB7CisgICAgc2VsZi5wb3N0TWVzc2FnZShgJHthY3R1YWx9IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICR7ZXhwZWN0ZWR9YCk7CisgIH0KK307CisKK2NvbnN0IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig1KTsKK2NvbnN0IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlclZpZXcgPSBuZXcgVWludDhBcnJheShzaGFyZWRBcnJheUJ1ZmZlckZyb21Xb3JrZXIpOworbGV0IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvdyA9IG51bGw7CitsZXQgc2hhcmVkQXJyYXlCdWZmZXJGcm9tV2luZG93VmlldyA9IG51bGw7CisKK3NlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHsKKyAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ2NoZWNrLWRhdGEnKSB7CisgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTsKKyAgICBhc3NlcnRFcXVhbCgxLCBkYXRhLm51bWJlcik7CisgICAgYXNzZXJ0RXF1YWwoMiwgZGF0YS5hcnJheS5sZW5ndGgpOworICAgIGFzc2VydEVxdWFsKDIsIGRhdGEuYXJyYXlbMF0pOworICAgIGFzc2VydEVxdWFsKDMsIGRhdGEuYXJyYXlbMV0pOworICAgIGFzc2VydEVxdWFsKCdhYmMnLCBkYXRhLnN0cmluZyk7CisgICAgYXNzZXJ0RXF1YWwoMywgZGF0YS5hcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsKKyAgICBjb25zdCBhcnJheUJ1ZmZlckZyb21XaW5kb3dWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5hcnJheUJ1ZmZlcik7CisgICAgYXNzZXJ0RXF1YWwoNCwgYXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1swXSk7CisgICAgYXNzZXJ0RXF1YWwoNSwgYXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1sxXSk7CisgICAgYXNzZXJ0RXF1YWwoNiwgYXJyYXlCdWZmZXJGcm9tV2luZG93Vmlld1syXSk7CisgICAgYXNzZXJ0RXF1YWwoNCwgZGF0YS5zaGFyZWRBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsKKyAgICBzaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3cgPSBkYXRhLnNoYXJlZEFycmF5QnVmZmVyOworICAgIHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXcgPSBuZXcgVWludDhBcnJheShzaGFyZWRBcnJheUJ1ZmZlckZyb21XaW5kb3cpOworICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDMpOworICAgIGNvbnN0IGFycmF5QnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTsKKyAgICBhcnJheUJ1ZmZlclZpZXdbMF0gPSA0OworICAgIGFycmF5QnVmZmVyVmlld1sxXSA9IDU7CisgICAgYXJyYXlCdWZmZXJWaWV3WzJdID0gNjsKKyAgICBzZWxmLnBvc3RNZXNzYWdlKHsKKyAgICAgIHR5cGU6ICdjaGVjay1kYXRhJywKKyAgICAgIGRhdGE6IHsKKyAgICAgICAgbnVtYmVyOiAxLAorICAgICAgICBhcnJheTogWzIsIDNdLAorICAgICAgICBzdHJpbmc6ICdhYmMnLAorICAgICAgICBhcnJheUJ1ZmZlciwKKyAgICAgICAgc2hhcmVkQXJyYXlCdWZmZXI6IHNoYXJlZEFycmF5QnVmZmVyRnJvbVdvcmtlciwKKyAgICAgIH0sCisgICAgfSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICd1cGRhdGUtc2hhcmVkLWFycmF5LWJ1ZmZlcnMnKSB7CisgICAgY29uc3Qge2luZGV4LCB2YWx1ZX0gPSBldmVudC5kYXRhOworICAgIHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXdbaW5kZXhdID0gdmFsdWU7CisgICAgc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyVmlld1tpbmRleF0gPSB2YWx1ZTsKKyAgICBzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiAndXBkYXRlLXNoYXJlZC1hcnJheS1idWZmZXJzLWRvbmUnfSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICdjaGVjay1zaGFyZWQtYXJyYXktYnVmZmVycycpIHsKKyAgICBjb25zdCB7aW5kZXgsIHZhbHVlfSA9IGV2ZW50LmRhdGE7CisgICAgYXNzZXJ0RXF1YWwodmFsdWUsIHNoYXJlZEFycmF5QnVmZmVyRnJvbVdpbmRvd1ZpZXdbaW5kZXhdKTsKKyAgICBhc3NlcnRFcXVhbCh2YWx1ZSwgc2hhcmVkQXJyYXlCdWZmZXJGcm9tV29ya2VyVmlld1tpbmRleF0pOworICAgIHNlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6ICdjaGVjay1zaGFyZWQtYXJyYXktYnVmZmVycy1kb25lJ30pOworICAgIHJldHVybjsKKyAgfQorICBzZWxmLnBvc3RNZXNzYWdlKGBVbmV4cGVjdGVkIG1lc3NhZ2UgJHtKU09OLnN0cmluZ2lmeShldmVudC5kYXRhKX0uYCk7Cit9KTsKKworc2VsZi5wb3N0TWVzc2FnZSgncmVhZHknKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvc2VydmljZV93b3JrZXJfcG9zdF9tZXNzYWdlX3Rlc3QucHkgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3NlcnZpY2Vfd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjZjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3NlcnZpY2Vfd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0LnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiVGVzdHMgU2VydmljZSBXb3JrZXIgcG9zdE1lc3NhZ2UoKSBmdW5jdGlvbmFsaXR5LiIiIgorCitmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMgaW1wb3J0IGJsYWNrX2JveF90ZXN0cworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzLnRocmVhZGVkX3dlYl9zZXJ2ZXIgaW1wb3J0IFRocmVhZGVkV2ViU2VydmVyCisKKworY2xhc3MgU2VydmljZVdvcmtlclBvc3RNZXNzYWdlVGVzdChibGFja19ib3hfdGVzdHMuQmxhY2tCb3hUZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3Rfc2VydmljZV93b3JrZXJfcG9zdF9tZXNzYWdlKHNlbGYpOgorICAgIHdpdGggVGhyZWFkZWRXZWJTZXJ2ZXIoYmluZGluZ19hZGRyZXNzPXNlbGYuR2V0QmluZGluZ0FkZHJlc3MoKSkgYXMgc2VydmVyOgorICAgICAgdXJsID0gc2VydmVyLkdldFVSTCgKKyAgICAgICAgICBmaWxlX25hbWU9J3Rlc3RkYXRhL3NlcnZpY2Vfd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0Lmh0bWwnKQorICAgICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcih1cmw9dXJsKSBhcyBydW5uZXI6CisgICAgICAgIHJ1bm5lci5XYWl0Rm9ySlNUZXN0c1NldHVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCmRpZmYgLS1naXQgYS9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5weSBiL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZDVmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3dvcmtlcl9wb3N0X21lc3NhZ2VfdGVzdC5weQpAQCAtMCwwICsxLDI3IEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIlRlc3RzIFdvcmtlciBwb3N0TWVzc2FnZSgpIGZ1bmN0aW9uYWxpdHkuIiIiCisKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cyBpbXBvcnQgYmxhY2tfYm94X3Rlc3RzCitmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMudGhyZWFkZWRfd2ViX3NlcnZlciBpbXBvcnQgVGhyZWFkZWRXZWJTZXJ2ZXIKKworCitjbGFzcyBXb3JrZXJQb3N0TWVzc2FnZVRlc3QoYmxhY2tfYm94X3Rlc3RzLkJsYWNrQm94VGVzdENhc2UpOgorCisgIGRlZiB0ZXN0X3dvcmtlcl9wb3N0X21lc3NhZ2Uoc2VsZik6CisgICAgd2l0aCBUaHJlYWRlZFdlYlNlcnZlcihiaW5kaW5nX2FkZHJlc3M9c2VsZi5HZXRCaW5kaW5nQWRkcmVzcygpKSBhcyBzZXJ2ZXI6CisgICAgICB1cmwgPSBzZXJ2ZXIuR2V0VVJMKGZpbGVfbmFtZT0ndGVzdGRhdGEvd29ya2VyX3Bvc3RfbWVzc2FnZV90ZXN0Lmh0bWwnKQorICAgICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcih1cmw9dXJsKSBhcyBydW5uZXI6CisgICAgICAgIHJ1bm5lci5XYWl0Rm9ySlNUZXN0c1NldHVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9CVUlMRC5nbiBiL2NvYmFsdC9icm93c2VyL0JVSUxELmduCmluZGV4IDBiNjY0NDUuLjViMDE1ZTggMTAwNjQ0Ci0tLSBhL2NvYmFsdC9icm93c2VyL0JVSUxELmduCisrKyBiL2NvYmFsdC9icm93c2VyL0JVSUxELmduCkBAIC0xNTQsMTIgKzE1NCwxMyBAQAogICAgICI6YnJvd3Nlcl9zd2l0Y2hlcyIsCiAgICAgIjpnZW5lcmF0ZWRfYmluZGluZ3MiLAogICAgICI6Z2VuZXJhdGVkX3R5cGVzIiwKLSAgICAiLy9jb2JhbHQvYWNjb3VudCIsCiAgICAgIi8vY29iYWx0L2F1ZGlvIiwKICAgICAiLy9jb2JhbHQvYmFzZSIsCiAgICAgIi8vY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzOmJyb3dzZXJfbWVtb3J5X3NldHRpbmdzIiwKICAgICAiLy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlcjptZW1vcnlfdHJhY2tlcl90b29sIiwKKyAgICAiLy9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzIiwKICAgICAiLy9jb2JhbHQvYnVpbGQ6Y29iYWx0X2J1aWxkX2lkIiwKKyAgICAiLy9jb2JhbHQvYnVpbGQ6Y29iYWx0X2J1aWxkX2luZm8iLAogICAgICIvL2NvYmFsdC9jYWNoZSIsCiAgICAgIi8vY29iYWx0L2NvbmZpZ3VyYXRpb24iLAogICAgICIvL2NvYmFsdC9jc3NfcGFyc2VyIiwKQEAgLTE5Niw2ICsxOTcsOCBAQAogICAgICIvL2NvYmFsdC93ZWJzb2NrZXQiLAogICAgICIvL2NvYmFsdC93b3JrZXIiLAogICAgICIvL2NvYmFsdC94aHIiLAorICAgICIvL2NvbXBvbmVudHMvbWV0cmljcyIsCisgICAgIi8vY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIiLAogICAgICIvL2NyeXB0byIsCiAgICAgIi8vbmIiLAogICAgICIvL25ldCIsCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYyBiL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCmluZGV4IDNmNWY0MTMuLjY5YTUyYzAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCisrKyBiL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXRyaWNzL3N0YXRpc3RpY3NfcmVjb3JkZXIuaCIKKyNpbmNsdWRlICJiYXNlL21ldHJpY3MvdXNlcl9tZXRyaWNzLmgiCiAjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKQEAgLTU5LDExICs2MCwxMyBAQAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2RldmljZV9hdXRoZW50aWNhdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9hdXRvX21lbV9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL3Rvb2wuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L2NhY2hlL2NhY2hlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIgpAQCAtNzMsNiArNzYsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L2lucHV0X2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF90cmFjZV90b19maWxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dhdGNoZG9nL3dhdGNoZG9nLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3Nfc2VydmljZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vZGV2aWNlX3R5cGUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3N5c3RlbV9wcm9wZXJ0eS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCkBAIC01OTksMzUgKzYwMywyOCBAQAogICB9CiB9CiAKLXZvaWQgQWRkQ3Jhc2hIYW5kbGVyQXBwbGljYXRpb25TdGF0ZShiYXNlOjpBcHBsaWNhdGlvblN0YXRlIHN0YXRlKSB7Ci0gIGF1dG8gY3Jhc2hfaGFuZGxlcl9leHRlbnNpb24gPQotICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQ29iYWx0RXh0ZW5zaW9uQ3Jhc2hIYW5kbGVyQXBpKj4oCi0gICAgICAgICAgU2JTeXN0ZW1HZXRFeHRlbnNpb24oa0NvYmFsdEV4dGVuc2lvbkNyYXNoSGFuZGxlck5hbWUpKTsKLSAgaWYgKCFjcmFzaF9oYW5kbGVyX2V4dGVuc2lvbikgewotICAgIERMT0coSU5GTykgPDwgIk5vIGNyYXNoIGhhbmRsZXIgZXh0ZW5zaW9uLCBub3Qgc2VuZGluZyBhcHBsaWNhdGlvbiBzdGF0ZS4iOwotICAgIHJldHVybjsKLSAgfQotCit2b2lkIEFkZENyYXNoTG9nQXBwbGljYXRpb25TdGF0ZShiYXNlOjpBcHBsaWNhdGlvblN0YXRlIHN0YXRlKSB7CiAgIHN0ZDo6c3RyaW5nIGFwcGxpY2F0aW9uX3N0YXRlID0gc3RkOjpzdHJpbmcoR2V0QXBwbGljYXRpb25TdGF0ZVN0cmluZyhzdGF0ZSkpOwogICBhcHBsaWNhdGlvbl9zdGF0ZS5wdXNoX2JhY2soJ1wwJyk7CiAKLSAgaWYgKGNyYXNoX2hhbmRsZXJfZXh0ZW5zaW9uLT52ZXJzaW9uID4gMSkgewotICAgIGlmIChjcmFzaF9oYW5kbGVyX2V4dGVuc2lvbi0+U2V0U3RyaW5nKCJhcHBsaWNhdGlvbl9zdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25fc3RhdGUuY19zdHIoKSkpIHsKLSAgICAgIERMT0coSU5GTykgPDwgIlNlbnQgYXBwbGljYXRpb24gc3RhdGUgdG8gY3Jhc2ggaGFuZGxlci4iOwotICAgICAgcmV0dXJuOworICBhdXRvIGNyYXNoX2hhbmRsZXJfZXh0ZW5zaW9uID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENvYmFsdEV4dGVuc2lvbkNyYXNoSGFuZGxlckFwaSo+KAorICAgICAgICAgIFNiU3lzdGVtR2V0RXh0ZW5zaW9uKGtDb2JhbHRFeHRlbnNpb25DcmFzaEhhbmRsZXJOYW1lKSk7CisgIGlmIChjcmFzaF9oYW5kbGVyX2V4dGVuc2lvbiAmJiBjcmFzaF9oYW5kbGVyX2V4dGVuc2lvbi0+dmVyc2lvbiA+PSAyKSB7CisgICAgaWYgKCFjcmFzaF9oYW5kbGVyX2V4dGVuc2lvbi0+U2V0U3RyaW5nKCJhcHBsaWNhdGlvbl9zdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX3N0YXRlLmNfc3RyKCkpKSB7CisgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3Qgc2VuZCBhcHBsaWNhdGlvbiBzdGF0ZSB0byBjcmFzaCBoYW5kbGVyLiI7CiAgICAgfQorICAgIHJldHVybjsKICAgfQotICBETE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHNlbmQgYXBwbGljYXRpb24gc3RhdGUgdG8gY3Jhc2ggaGFuZGxlci4iOworCisgIC8vIENyYXNoIGhhbmRsZXIgaXMgbm90IHN1cHBvcnRlZCwgZmFsbGJhY2sgdG8gY3Jhc2ggbG9nIGRpY3Rpb25hcnkuCisgIGg1dmNjOjpDcmFzaExvZ0RpY3Rpb25hcnk6OkdldEluc3RhbmNlKCktPlNldFN0cmluZygiYXBwbGljYXRpb25fc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25fc3RhdGUpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAotLy8gSGVscGVyIHN0dWIgdG8gZGlzYWJsZSBoaXN0b2dyYW0gdHJhY2tpbmcgaW4gU3RhdGlzdGljc1JlY29yZGVyCi1zdHJ1Y3QgUmVjb3JkQ2hlY2tlclN0dWIgOiBwdWJsaWMgYmFzZTo6UmVjb3JkSGlzdG9ncmFtQ2hlY2tlciB7Ci0gIGJvb2wgU2hvdWxkUmVjb3JkKHVpbnQ2NF90KSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQotfTsKLQogLy8gU3RhdGljIHVzZXIgbG9ncwogc3NpemVfdCBBcHBsaWNhdGlvbjo6YXZhaWxhYmxlX21lbW9yeV8gPSAwOwogaW50NjQgQXBwbGljYXRpb246OmxpZmV0aW1lX2luX21zXyA9IDA7CkBAIC02OTEsMTEgKzY4OCw2IEBACiAgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlID0gYmFzZTo6R2V0U3lzdGVtTGFuZ3VhZ2UoKTsKICAgYmFzZTo6TG9jYWxpemVkU3RyaW5nczo6R2V0SW5zdGFuY2UoKS0+SW5pdGlhbGl6ZShsYW5ndWFnZSk7CiAKLSAgLy8gRGlzYWJsZSBoaXN0b2dyYW0gdHJhY2tpbmcgYmVmb3JlIFRhc2tTY2hlZHVsZXIgY3JlYXRlcyBTdGF0aXN0aWNzUmVjb3JkZXIKLSAgLy8gaW5zdGFuY2VzLgotICBhdXRvIHJlY29yZF9jaGVja2VyID0gc3RkOjptYWtlX3VuaXF1ZTxSZWNvcmRDaGVja2VyU3R1Yj4oKTsKLSAgYmFzZTo6U3RhdGlzdGljc1JlY29yZGVyOjpTZXRSZWNvcmRDaGVja2VyKHN0ZDo6bW92ZShyZWNvcmRfY2hlY2tlcikpOwotCiAgIC8vIEEgb25lLXBlci1wcm9jZXNzIHRhc2sgc2NoZWR1bGVyIGlzIG5lZWRlZCBmb3IgdXNhZ2Ugb2YgQVBJcyBpbgogICAvLyBiYXNlL3Bvc3RfdGFzay5oIHdoaWNoIHdpbGwgYmUgdXNlZCBieSBzb21lIG5ldCBBUElzIGxpa2UKICAgLy8gVVJMUmVxdWVzdENvbnRleHQ7CkBAIC03MDYsNiArNjk4LDkgQEAKICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8cGVyc2lzdGVudF9zdG9yYWdlOjpQZXJzaXN0ZW50U2V0dGluZ3M+KAogICAgICAgICAgIGtQZXJzaXN0ZW50U2V0dGluZ3NKc29uKTsKIAorICAvLyBJbml0aWFsaXplIHRlbGVtZXRyeS9tZXRyaWNzLgorICBJbml0TWV0cmljcygpOworCiAgIC8vIEluaXRpYWxpemVzIFdhdGNoZG9nLgogICB3YXRjaGRvZzo6V2F0Y2hkb2cqIHdhdGNoZG9nID0KICAgICAgIHdhdGNoZG9nOjpXYXRjaGRvZzo6Q3JlYXRlSW5zdGFuY2UocGVyc2lzdGVudF9zZXR0aW5nc18uZ2V0KCkpOwpAQCAtNzI3LDcgKzcyMiw2IEBACiAgIHVuY29uc3VtZWRfZGVlcF9saW5rXyA9IEdldEluaXRpYWxEZWVwTGluaygpOwogICBETE9HKElORk8pIDw8ICJJbml0aWFsIGRlZXAgbGluazogIiA8PCB1bmNvbnN1bWVkX2RlZXBfbGlua187CiAKLSAgc3RvcmFnZTo6U3RvcmFnZU1hbmFnZXI6Ok9wdGlvbnMgc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnM7CiAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGU6Ok9wdGlvbnMgbmV0d29ya19tb2R1bGVfb3B0aW9uczsKICAgLy8gQ3JlYXRlIHRoZSBtYWluIGNvbXBvbmVudHMgb2Ygb3VyIGJyb3dzZXIuCiAgIEJyb3dzZXJNb2R1bGU6Ok9wdGlvbnMgb3B0aW9uczsKQEAgLTc2NCw3ICs3NTgsNyBAQAogCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQogICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goYnJvd3Nlcjo6c3dpdGNoZXM6OmtOdWxsU2F2ZWdhbWUpKSB7Ci0gICAgc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnMuc2F2ZWdhbWVfb3B0aW9ucy5mYWN0b3J5ID0KKyAgICBuZXR3b3JrX21vZHVsZV9vcHRpb25zLnN0b3JhZ2VfbWFuYWdlcl9vcHRpb25zLnNhdmVnYW1lX29wdGlvbnMuZmFjdG9yeSA9CiAgICAgICAgICZzdG9yYWdlOjpTYXZlZ2FtZUZha2U6OkNyZWF0ZTsKICAgfQogCkBAIC03OTgsMTQgKzc5MiwxNiBAQAogICB9IGVsc2UgewogICAgIHBhcnRpdGlvbl9rZXkgPSBiYXNlOjpHZXRBcHBsaWNhdGlvbktleShpbml0aWFsX3VybCk7CiAgIH0KLSAgc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnMuc2F2ZWdhbWVfb3B0aW9ucy5pZCA9IHBhcnRpdGlvbl9rZXk7CisgIG5ldHdvcmtfbW9kdWxlX29wdGlvbnMuc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnMuc2F2ZWdhbWVfb3B0aW9ucy5pZCA9CisgICAgICBwYXJ0aXRpb25fa2V5OwogCiAgIGJhc2U6Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBkZWZhdWx0X2tleSA9CiAgICAgICBiYXNlOjpHZXRBcHBsaWNhdGlvbktleShHVVJMKGtEZWZhdWx0VVJMKSk7CiAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaCgKICAgICAgICAgICBicm93c2VyOjpzd2l0Y2hlczo6a0ZvcmNlTWlncmF0aW9uRm9yU3RvcmFnZVBhcnRpdGlvbmluZykgfHwKICAgICAgIHBhcnRpdGlvbl9rZXkgPT0gZGVmYXVsdF9rZXkpIHsKLSAgICBzdG9yYWdlX21hbmFnZXJfb3B0aW9ucy5zYXZlZ2FtZV9vcHRpb25zLmZhbGxiYWNrX3RvX2RlZmF1bHRfaWQgPSB0cnVlOworICAgIG5ldHdvcmtfbW9kdWxlX29wdGlvbnMuc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnMuc2F2ZWdhbWVfb3B0aW9ucworICAgICAgICAuZmFsbGJhY2tfdG9fZGVmYXVsdF9pZCA9IHRydWU7CiAgIH0KIAogICAvLyBVc2VyIGNhbiBzcGVjaWZ5IGFuIGV4dHJhIHNlYXJjaCBwYXRoIGVudHJ5IGZvciBmaWxlcyBsb2FkZWQgdmlhIGZpbGU6Ly8uCkBAIC05MDYsMTUgKzkwMiwxMSBAQAogICBvcHRpb25zLndlYl9tb2R1bGVfb3B0aW9ucy5jb2xsZWN0X3VubG9hZF9ldmVudF90aW1lX2NhbGxiYWNrID0gYmFzZTo6QmluZCgKICAgICAgICZBcHBsaWNhdGlvbjo6Q29sbGVjdFVubG9hZEV2ZW50VGltaW5nSW5mbywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CiAKLSAgYWNjb3VudF9tYW5hZ2VyXy5yZXNldChuZXcgYWNjb3VudDo6QWNjb3VudE1hbmFnZXIoKSk7Ci0KLSAgc3RvcmFnZV9tYW5hZ2VyXy5yZXNldChuZXcgc3RvcmFnZTo6U3RvcmFnZU1hbmFnZXIoc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnMpKTsKLQogICBjb2JhbHQ6OmJyb3dzZXI6OlVzZXJBZ2VudFBsYXRmb3JtSW5mbyBwbGF0Zm9ybV9pbmZvOwogCiAgIG5ldHdvcmtfbW9kdWxlXy5yZXNldChuZXcgbmV0d29yazo6TmV0d29ya01vZHVsZSgKICAgICAgIENyZWF0ZVVzZXJBZ2VudFN0cmluZyhwbGF0Zm9ybV9pbmZvKSwgR2V0Q2xpZW50SGludEhlYWRlcnMocGxhdGZvcm1faW5mbyksCi0gICAgICBzdG9yYWdlX21hbmFnZXJfLmdldCgpLCAmZXZlbnRfZGlzcGF0Y2hlcl8sIG5ldHdvcmtfbW9kdWxlX29wdGlvbnMpKTsKKyAgICAgICZldmVudF9kaXNwYXRjaGVyXywgbmV0d29ya19tb2R1bGVfb3B0aW9ucykpOwogCiAgIEFkZENyYXNoSGFuZGxlckFubm90YXRpb25zKHBsYXRmb3JtX2luZm8pOwogCkBAIC05MzgsMTUgKzkzMCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY2hlY2tfZGVsYXlfc2VjKSk7CiAgIH0KICNlbmRpZgotICBicm93c2VyX21vZHVsZV8ucmVzZXQobmV3IEJyb3dzZXJNb2R1bGUoCi0gICAgICBpbml0aWFsX3VybCwKLSAgICAgIChzaG91bGRfcHJlbG9hZCA/IGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlQ29uY2VhbGVkCi0gICAgICAgICAgICAgICAgICAgICAgOiBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQpLAotICAgICAgJmV2ZW50X2Rpc3BhdGNoZXJfLCBhY2NvdW50X21hbmFnZXJfLmdldCgpLCBuZXR3b3JrX21vZHVsZV8uZ2V0KCksCisgIGJyb3dzZXJfbW9kdWxlXy5yZXNldCgKKyAgICAgIG5ldyBCcm93c2VyTW9kdWxlKGluaXRpYWxfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgKHNob3VsZF9wcmVsb2FkID8gYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVDb25jZWFsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRfZGlzcGF0Y2hlcl8sIG5ldHdvcmtfbW9kdWxlXy5nZXQoKSwKICNpZiBTQl9JUyhFVkVSR1JFRU4pCi0gICAgICB1cGRhdGVyX21vZHVsZV8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVyX21vZHVsZV8uZ2V0KCksCiAjZW5kaWYKLSAgICAgIG9wdGlvbnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpKTsKIAogICBVcGRhdGVVc2VyQWdlbnQoKTsKIApAQCAtMTA1Niw2ICsxMDQ4LDEwIEBACiAgIC8vIGZvciB0aGUgZGVidWdnZXIgdG8gbGFuZC4KICAgd2F0Y2hkb2c6OldhdGNoZG9nOjpEZWxldGVJbnN0YW5jZSgpOwogCisgIC8vIEV4cGxpY2l0bHkgZGVsZXRlIHRoZSBnbG9iYWwgbWV0cmljcyBzZXJ2aWNlcyBtYW5hZ2VyIGhlcmUgdG8gZ2l2ZSBpdAorICAvLyBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCBsYXRlIGxvZ3MgYW5kIHBlcnNpc3QgbWV0cmljcy4KKyAgbWV0cmljczo6Q29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlcjo6RGVsZXRlSW5zdGFuY2UoKTsKKwogI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHR0VSKSAmJiBkZWZpbmVkKFNUQVJCT0FSRF9BTExPV1NfTUVNT1JZX1RSQUNLSU5HKQogICBtZW1vcnlfdHJhY2tlcl90b29sXy5yZXNldChOVUxMKTsKICNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfREVCVUdHRVIpICYmIGRlZmluZWQoU1RBUkJPQVJEX0FMTE9XU19NRU1PUllfVFJBQ0tJTkcpCkBAIC0xMDg0LDYgKzEwODAsOCBAQAogICBldmVudF9kaXNwYXRjaGVyXy5SZW1vdmVFdmVudENhbGxiYWNrKAogICAgICAgYmFzZTo6RGF0ZVRpbWVDb25maWd1cmF0aW9uQ2hhbmdlZEV2ZW50OjpUeXBlSWQoKSwKICAgICAgIG9uX2RhdGVfdGltZV9jb25maWd1cmF0aW9uX2NoYW5nZWRfZXZlbnRfY2FsbGJhY2tfKTsKKyAgYnJvd3Nlcl9tb2R1bGVfLnJlc2V0KCk7CisgIG5ldHdvcmtfbW9kdWxlXy5yZXNldCgpOwogfQogCiB2b2lkIEFwcGxpY2F0aW9uOjpTdGFydChTYlRpbWVNb25vdG9uaWMgdGltZXN0YW1wKSB7CkBAIC0xMjEyLDcgKzEyMTAsNyBAQAogICAgIGNhc2Uga1NiRXZlbnRUeXBlU3RvcDoKICAgICAgIExPRyhJTkZPKSA8PCAiR290IHF1aXQgZXZlbnQuIjsKICAgICAgIGlmICh3YXRjaGRvZykgd2F0Y2hkb2ctPlVwZGF0ZVN0YXRlKGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RvcHBlZCk7Ci0gICAgICBBZGRDcmFzaEhhbmRsZXJBcHBsaWNhdGlvblN0YXRlKGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RvcHBlZCk7CisgICAgICBBZGRDcmFzaExvZ0FwcGxpY2F0aW9uU3RhdGUoYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdG9wcGVkKTsKICAgICAgIFF1aXQoKTsKICAgICAgIExPRyhJTkZPKSA8PCAiRmluaXNoZWQgcXVpdHRpbmcuIjsKICAgICAgIGJyZWFrOwpAQCAtMTI4Nyw3ICsxMjg1LDcgQEAKICAgICAgIHJldHVybjsKICAgfQogICBpZiAod2F0Y2hkb2cpIHdhdGNoZG9nLT5VcGRhdGVTdGF0ZShicm93c2VyX21vZHVsZV8tPkdldEFwcGxpY2F0aW9uU3RhdGUoKSk7Ci0gIEFkZENyYXNoSGFuZGxlckFwcGxpY2F0aW9uU3RhdGUoYnJvd3Nlcl9tb2R1bGVfLT5HZXRBcHBsaWNhdGlvblN0YXRlKCkpOworICBBZGRDcmFzaExvZ0FwcGxpY2F0aW9uU3RhdGUoYnJvd3Nlcl9tb2R1bGVfLT5HZXRBcHBsaWNhdGlvblN0YXRlKCkpOwogfQogCiB2b2lkIEFwcGxpY2F0aW9uOjpPbldpbmRvd1NpemVDaGFuZ2VkRXZlbnQoY29uc3QgYmFzZTo6RXZlbnQqIGV2ZW50KSB7CkBAIC0xNTQ5LDYgKzE1NDcsMzAgQEAKICAgfQogfQogCit2b2lkIEFwcGxpY2F0aW9uOjpJbml0TWV0cmljcygpIHsKKyAgLy8gTXVzdCBiZSBjYWxsZWQgZWFybHkgYXMgaXQgaW5pdGlhbGl6ZXMgZ2xvYmFsIHN0YXRlIHdoaWNoIGlzIHRoZW4gcmVhZCBieQorICAvLyBhbGwgdGhyZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KKyAgLy8gUmVjb3JkQWN0aW9uIHRhc2sgcnVubmVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBtZXRyaWMgaW5pdGlhbGl6YXRpb24uCisgIGJhc2U6OlNldFJlY29yZEFjdGlvblRhc2tSdW5uZXIoYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCkpOworICBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfID0KKyAgICAgIG1ldHJpY3M6OkNvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OkdldEluc3RhbmNlKCk7CisgIC8vIEJlZm9yZSBpbml0aWFsaXppbmcgbWV0cmljcyBtYW5hZ2VyLCBzZXQgYW55IHBlcnNpc3RlZCBzZXR0aW5ncyBsaWtlIGlmCisgIC8vIGl0J3MgZW5hYmxlZCBvciB1cGxvYWQgaW50ZXJ2YWwuCisgIGJvb2wgaXNfbWV0cmljc19lbmFibGVkID0gcGVyc2lzdGVudF9zZXR0aW5nc18tPkdldFBlcnNpc3RlbnRTZXR0aW5nQXNCb29sKAorICAgICAgbWV0cmljczo6a01ldHJpY0VuYWJsZWRTZXR0aW5nTmFtZSwgZmFsc2UpOworICBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfLT5TZXRVcGxvYWRJbnRlcnZhbCgKKyAgICAgIHBlcnNpc3RlbnRfc2V0dGluZ3NfLT5HZXRQZXJzaXN0ZW50U2V0dGluZ0FzSW50KAorICAgICAgICAgIG1ldHJpY3M6OmtNZXRyaWNFdmVudEludGVydmFsU2V0dGluZ05hbWUsIDMwMCkpOworICBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfLT5Ub2dnbGVNZXRyaWNzRW5hYmxlZChpc19tZXRyaWNzX2VuYWJsZWQpOworICAvLyBNZXRyaWMgcmVjb3JkaW5nIHN0YXRlIGluaXRpYWxpemF0aW9uIF9tdXN0XyBoYXBwZW4gYmVmb3JlIHdlIGJvb3RzdHJhcAorICAvLyBvdGhlcndpc2Ugd2UgY3Jhc2guCisgIG1ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl8tPkdldE1ldHJpY3NTZXJ2aWNlKCkKKyAgICAgIC0+SW5pdGlhbGl6ZU1ldHJpY3NSZWNvcmRpbmdTdGF0ZSgpOworICAvLyBVcGRhdGVVcGxvYWRQZXJtaXNzaW9ucyBib290c3RyYXBzIHRoZSB3aG9sZSBtZXRyaWMgcmVwb3J0aW5nLCBzY2hlZHVsaW5nLAorICAvLyBhbmQgdXBsb2FkaW5nIGN5Y2xlLgorICBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfLT5VcGRhdGVVcGxvYWRQZXJtaXNzaW9ucyhpc19tZXRyaWNzX2VuYWJsZWQpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAogCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oIGIvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uaAppbmRleCAwNGEwOGNhLi43Y2EyZDVkIDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oCisrKyBiL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmgKQEAgLTI0LDEwICsyNCwxMCBAQAogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2V2ZW50X2Rpc3BhdGNoZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL3Rvb2wuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIgogI2luY2x1ZGUgImNvYmFsdC9wZXJzaXN0ZW50X3N0b3JhZ2UvcGVyc2lzdGVudF9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCIKQEAgLTk2LDEyICs5Niw2IEBACiAgIC8vIEEgY29uZHVpdCBmb3Igc3lzdGVtIGV2ZW50cy4KICAgYmFzZTo6RXZlbnREaXNwYXRjaGVyIGV2ZW50X2Rpc3BhdGNoZXJfOwogCi0gIC8vIEFjY291bnQgbWFuYWdlci4KLSAgc3RkOjp1bmlxdWVfcHRyPGFjY291bnQ6OkFjY291bnRNYW5hZ2VyPiBhY2NvdW50X21hbmFnZXJfOwotCi0gIC8vIFN0b3JhZ2UgbWFuYWdlciB1c2VkIGJ5IHRoZSBuZXR3b3JrIG1vZHVsZSBiZWxvdy4KLSAgc3RkOjp1bmlxdWVfcHRyPHN0b3JhZ2U6OlN0b3JhZ2VNYW5hZ2VyPiBzdG9yYWdlX21hbmFnZXJfOwotCiAgIC8vIFNldHMgdXAgdGhlIG5ldHdvcmsgY29tcG9uZW50IGZvciByZXF1ZXN0aW5nIGludGVybmV0IHJlc291cmNlcy4KICAgc3RkOjp1bmlxdWVfcHRyPG5ldHdvcms6Ok5ldHdvcmtNb2R1bGU+IG5ldHdvcmtfbW9kdWxlXzsKIApAQCAtMjMxLDYgKzIyNSwxNSBAQAogICB2b2lkIERpc3BhdGNoRGVlcExpbmsoY29uc3QgY2hhciogbGluaywgU2JUaW1lTW9ub3RvbmljIHRpbWVzdGFtcCk7CiAgIHZvaWQgRGlzcGF0Y2hEZWVwTGlua0lmTm90Q29uc3VtZWQoKTsKIAorCisgIC8vIEluaXRpYWxpemVzIGFsbCBjb2RlIG5lY2Vzc2FyeSB0byBzdGFydCB0ZWxlbWV0cnkvbWV0cmljcyBnYXRoZXJpbmcgYW5kCisgIC8vIHJlcG9ydGluZy4gU2VlIGdvL2NvYmFsdC10ZWxlbWV0cnkuCisgIHZvaWQgSW5pdE1ldHJpY3MoKTsKKworICAvLyBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbWV0cmljcyBtYW5hZ2VyLCB0aGUgaGlnaGVzdCBsZXZlbCBjb250cm9sIHBvaW50CisgIC8vIGZvciBtZXRyaWNzL3RlbGVtZXRyeS4KKyAgbWV0cmljczo6Q29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlciogbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyXzsKKwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXBwbGljYXRpb24pOwogfTsKIApkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MgYi9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYwppbmRleCBhNGYzOTM0Li5lOGYxYzI4IDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYworKysgYi9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYwpAQCAtMjE0LDcgKzIxNCw2IEBACiBCcm93c2VyTW9kdWxlOjpCcm93c2VyTW9kdWxlKGNvbnN0IEdVUkwmIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QXBwbGljYXRpb25TdGF0ZSBpbml0aWFsX2FwcGxpY2F0aW9uX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpFdmVudERpc3BhdGNoZXIqIGV2ZW50X2Rpc3BhdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQ6OkFjY291bnRNYW5hZ2VyKiBhY2NvdW50X21hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUqIG5ldHdvcmtfbW9kdWxlLAogI2lmIFNCX0lTKEVWRVJHUkVFTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcjo6VXBkYXRlck1vZHVsZSogdXBkYXRlcl9tb2R1bGUsCkBAIC0yMjYsNyArMjI1LDYgQEAKICAgICAgIG9wdGlvbnNfKG9wdGlvbnMpLAogICAgICAgc2VsZl9tZXNzYWdlX2xvb3BfKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpLAogICAgICAgZXZlbnRfZGlzcGF0Y2hlcl8oZXZlbnRfZGlzcGF0Y2hlciksCi0gICAgICBhY2NvdW50X21hbmFnZXJfKGFjY291bnRfbWFuYWdlciksCiAgICAgICBpc19yZW5kZXJlZF8oZmFsc2UpLAogICAgICAgaXNfd2ViX21vZHVsZV9yZW5kZXJlZF8oZmFsc2UpLAogICAgICAgY2FuX3BsYXlfdHlwZV9oYW5kbGVyXyhtZWRpYTo6TWVkaWFNb2R1bGU6OkNyZWF0ZUNhblBsYXlUeXBlSGFuZGxlcigpKSwKQEAgLTQ1OSw3ICs0NTcsMTcgQEAKICAgU2JDb3JlRHVtcFVucmVnaXN0ZXJIYW5kbGVyKEJyb3dzZXJNb2R1bGU6OkNvcmVEdW1wSGFuZGxlciwgdGhpcyk7CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHR0VSKQorICBpZiAoZGVidWdfY29uc29sZV8pIHsKKyAgICBsaWZlY3ljbGVfb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihkZWJ1Z19jb25zb2xlXy5nZXQoKSk7CisgIH0KKyAgZGVidWdfY29uc29sZV8ucmVzZXQoKTsKKyNlbmRpZgorICBEZXN0cm95U3BsYXNoU2NyZWVuKCk7CiAgIC8vIE1ha2Ugc3VyZSB0aGUgV2ViTW9kdWxlIGlzIGRlc3Ryb3llZCBiZWZvcmUgdGhlIFNlcnZpY2VXb3JrZXJSZWdpc3RyeQorICBpZiAod2ViX21vZHVsZV8pIHsKKyAgICBsaWZlY3ljbGVfb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcih3ZWJfbW9kdWxlXy5nZXQoKSk7CisgIH0KICAgd2ViX21vZHVsZV8ucmVzZXQoKTsKIH0KIApAQCAtNTQ0LDcgKzU1Miw3IEBACiAgIC8vIFNob3cgYSBzcGxhc2ggc2NyZWVuIHdoaWxlIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSB3ZWIgcGFnZSB0byBsb2FkLgogICBjb25zdCBWaWV3cG9ydFNpemUgdmlld3BvcnRfc2l6ZSA9IEdldFZpZXdwb3J0U2l6ZSgpOwogCi0gIERlc3Ryb3lTcGxhc2hTY3JlZW4oYmFzZTo6VGltZURlbHRhKCkpOworICBEZXN0cm95U3BsYXNoU2NyZWVuKCk7CiAgIGlmIChvcHRpb25zXy5lbmFibGVfc3BsYXNoX3NjcmVlbl9vbl9yZWxvYWRzIHx8CiAgICAgICBtYWluX3dlYl9tb2R1bGVfZ2VuZXJhdGlvbl8gPT0gMSkgewogICAgIGJhc2U6Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiB0b3BpYyA9IFNldFNwbGFzaFNjcmVlblRvcGljRmFsbGJhY2sodXJsKTsKQEAgLTYyMSw4ICs2MjksOCBAQAogCiAgIG9wdGlvbnMud2ViX29wdGlvbnMud2ViX3NldHRpbmdzID0gJndlYl9zZXR0aW5nc187CiAgIG9wdGlvbnMud2ViX29wdGlvbnMubmV0d29ya19tb2R1bGUgPSBuZXR3b3JrX21vZHVsZV87Ci0gIG9wdGlvbnMud2ViX29wdGlvbnMuc2VydmljZV93b3JrZXJfam9icyA9Ci0gICAgICBzZXJ2aWNlX3dvcmtlcl9yZWdpc3RyeV8tPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKKyAgb3B0aW9ucy53ZWJfb3B0aW9ucy5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0ID0KKyAgICAgIHNlcnZpY2Vfd29ya2VyX3JlZ2lzdHJ5Xy0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOwogICBvcHRpb25zLndlYl9vcHRpb25zLnBsYXRmb3JtX2luZm8gPSBwbGF0Zm9ybV9pbmZvXy5nZXQoKTsKICAgd2ViX21vZHVsZV8ucmVzZXQobmV3IFdlYk1vZHVsZSgiTWFpbldlYk1vZHVsZSIpKTsKICAgLy8gV2FpdCBmb3Igc2VydmljZSB3b3JrZXIgdG8gc3RhcnQgaWYgb25lIGV4aXN0cy4KQEAgLTc5OSw3ICs4MDcsNyBAQAogICBpZiAoc3BsYXNoX3NjcmVlbl8pIHsKICAgICBpZiAob25fc2NyZWVuX2tleWJvYXJkX3Nob3dfY2FsbGVkXykgewogICAgICAgLy8gSGlkZSB0aGUgc3BsYXNoIHNjcmVlbiBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgotICAgICAgRGVzdHJveVNwbGFzaFNjcmVlbihiYXNlOjpUaW1lRGVsdGEoKSk7CisgICAgICBEZXN0cm95U3BsYXNoU2NyZWVuKCk7CiAgICAgfSBlbHNlIGlmICghc3BsYXNoX3NjcmVlbl8tPlNodXRkb3duU2lnbmFsZWQoKSkgewogICAgICAgc3BsYXNoX3NjcmVlbl8tPlNodXRkb3duKCk7CiAgICAgfQpAQCAtOTQ3LDcgKzk1NSw3IEBACiAgIC8vIE9ubHkgaW5qZWN0IHNob3duIGV2ZW50cyB0byB0aGUgbWFpbiBXZWJNb2R1bGUuCiAgIG9uX3NjcmVlbl9rZXlib2FyZF9zaG93X2NhbGxlZF8gPSB0cnVlOwogICBpZiAoc3BsYXNoX3NjcmVlbl8gJiYgc3BsYXNoX3NjcmVlbl8tPlNodXRkb3duU2lnbmFsZWQoKSkgewotICAgIERlc3Ryb3lTcGxhc2hTY3JlZW4oYmFzZTo6VGltZURlbHRhKCkpOworICAgIERlc3Ryb3lTcGxhc2hTY3JlZW4oKTsKICAgfQogICBpZiAod2ViX21vZHVsZV8pIHsKICAgICB3ZWJfbW9kdWxlXy0+SW5qZWN0T25TY3JlZW5LZXlib2FyZFNob3duRXZlbnQoZXZlbnQtPnRpY2tldCgpKTsKQEAgLTEzNjQsNyArMTM3Miw3IEBACiAgICAgfQogICAgIHNwbGFzaF9zY3JlZW5fbGF5ZXJfLT5SZXNldCgpOwogICAgIFN1Ym1pdEN1cnJlbnRSZW5kZXJUcmVlVG9SZW5kZXJlcigpOwotICAgIHNwbGFzaF9zY3JlZW5fLnJlc2V0KE5VTEwpOworICAgIHNwbGFzaF9zY3JlZW5fLnJlc2V0KCk7CiAgIH0KIH0KIApAQCAtMTc3NCw2ICsxNzgyLDExIEBACiAgIC8vIEZpcnN0IGZyZWV6ZSBhbGwgb3VyIHdlYiBtb2R1bGVzIHdoaWNoIGltcGxpZXMgdGhhdCB0aGV5IHdpbGwgcmVsZWFzZQogICAvLyB0aGVpciByZXNvdXJjZSBwcm92aWRlciBhbmQgYWxsIHJlc291cmNlcyBjcmVhdGVkIHRocm91Z2ggaXQuCiAgIEZPUl9FQUNIX09CU0VSVkVSKExpZmVjeWNsZU9ic2VydmVyLCBsaWZlY3ljbGVfb2JzZXJ2ZXJzXywgRnJlZXplKHRpbWVzdGFtcCkpOworCisgIGlmIChuZXR3b3JrX21vZHVsZV8pIHsKKyAgICAvLyBTeW5jaHJvbm91c2x5IHdhaXQgZm9yIHN0b3JhZ2UgdG8gZmx1c2ggYmVmb3JlIHJldHVybmluZyBmcm9tIGZyZWV6aW5nLgorICAgIG5ldHdvcmtfbW9kdWxlXy0+c3RvcmFnZV9tYW5hZ2VyKCktPkZsdXNoU3luY2hyb25vdXMoKTsKKyAgfQogfQogCiB2b2lkIEJyb3dzZXJNb2R1bGU6OlJldmVhbEludGVybmFsKFNiVGltZU1vbm90b25pYyB0aW1lc3RhbXApIHsKQEAgLTIwNzIsNyArMjA4NSw2IEBACiAjaWYgU0JfSVMoRVZFUkdSRUVOKQogICBoNXZjY19zZXR0aW5ncy51cGRhdGVyX21vZHVsZSA9IHVwZGF0ZXJfbW9kdWxlXzsKICNlbmRpZgotICBoNXZjY19zZXR0aW5ncy5hY2NvdW50X21hbmFnZXIgPSBhY2NvdW50X21hbmFnZXJfOwogICBoNXZjY19zZXR0aW5ncy5ldmVudF9kaXNwYXRjaGVyID0gZXZlbnRfZGlzcGF0Y2hlcl87CiAKICAgaDV2Y2Nfc2V0dGluZ3MudXNlcl9hZ2VudF9kYXRhID0gc2V0dGluZ3MtPmNvbnRleHQoKQpkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaCBiL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmgKaW5kZXggNGIwMWE5MC4uMDBmZDVjZSAxMDA2NDQKLS0tIGEvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaAorKysgYi9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKICNpbmNsdWRlICJiYXNlL3RpbWVyL3RpbWVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvYWNjZXNzaWJpbGl0eV9jYXB0aW9uX3NldHRpbmdzX2NoYW5nZWRfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9hcHBsaWNhdGlvbl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2RhdGVfdGltZV9jb25maWd1cmF0aW9uX2NoYW5nZWRfZXZlbnQuaCIKQEAgLTY2LDcgKzY1LDYgQEAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2FycmF5X2J1ZmZlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCIKICNpbmNsdWRlICJjb2JhbHQvdWlfbmF2aWdhdGlvbi9zY3JvbGxfZW5naW5lL3Njcm9sbF9lbmdpbmUuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL3dlYl9zZXR0aW5ncy5oIgpAQCAtMTI3LDcgKzEyNSw2IEBACiAgIEJyb3dzZXJNb2R1bGUoY29uc3QgR1VSTCYgdXJsLAogICAgICAgICAgICAgICAgIGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKICAgICAgICAgICAgICAgICBiYXNlOjpFdmVudERpc3BhdGNoZXIqIGV2ZW50X2Rpc3BhdGNoZXIsCi0gICAgICAgICAgICAgICAgYWNjb3VudDo6QWNjb3VudE1hbmFnZXIqIGFjY291bnRfbWFuYWdlciwKICAgICAgICAgICAgICAgICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwKICNpZiBTQl9JUyhFVkVSR1JFRU4pCiAgICAgICAgICAgICAgICAgdXBkYXRlcjo6VXBkYXRlck1vZHVsZSogdXBkYXRlcl9tb2R1bGUsCkBAIC0zNDIsNyArMzM5LDcgQEAKICAgYm9vbCBUcnlVUkxIYW5kbGVycyhjb25zdCBHVVJMJiB1cmwpOwogCiAgIC8vIERlc3Ryb3lzIHRoZSBzcGxhc2ggc2NyZWVuLCBpZiBjdXJyZW50bHkgZGlzcGxheWVkLgotICB2b2lkIERlc3Ryb3lTcGxhc2hTY3JlZW4oYmFzZTo6VGltZURlbHRhIGNsb3NlX3RpbWUpOworICB2b2lkIERlc3Ryb3lTcGxhc2hTY3JlZW4oYmFzZTo6VGltZURlbHRhIGNsb3NlX3RpbWUgPSBiYXNlOjpUaW1lRGVsdGEoKSk7CiAKICAgLy8gQ2FsbGVkIHdoZW4gd2ViIG1vZHVsZSBoYXMgcmVjZWl2ZWQgd2luZG93LmNsb3NlKCkuCiAgIHZvaWQgT25XaW5kb3dDbG9zZShiYXNlOjpUaW1lRGVsdGEgY2xvc2VfdGltZSk7CkBAIC01MTcsOCArNTE0LDYgQEAKIAogICBiYXNlOjpFdmVudERpc3BhdGNoZXIqIGV2ZW50X2Rpc3BhdGNoZXJfOwogCi0gIGFjY291bnQ6OkFjY291bnRNYW5hZ2VyKiBhY2NvdW50X21hbmFnZXJfOwotCiAgIC8vIFdoZXRoZXIgdGhlIGJyb3dzZXIgbW9kdWxlIGhhcyB5ZXQgcmVuZGVyZWQgYW55dGhpbmcuIE9uIHRoZSB2ZXJ5IGZpcnN0CiAgIC8vIHJlbmRlciwgd2UgaGlkZSB0aGUgc3lzdGVtIHNwbGFzaCBzY3JlZW4uCiAgIGJvb2wgaXNfcmVuZGVyZWRfOwpkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvY2xpZW50X2hpbnRfaGVhZGVycy5jYyBiL2NvYmFsdC9icm93c2VyL2NsaWVudF9oaW50X2hlYWRlcnMuY2MKaW5kZXggOGRjN2RjYy4uOTk3OTRkNSAxMDA2NDQKLS0tIGEvY29iYWx0L2Jyb3dzZXIvY2xpZW50X2hpbnRfaGVhZGVycy5jYworKysgYi9jb2JhbHQvYnJvd3Nlci9jbGllbnRfaGludF9oZWFkZXJzLmNjCkBAIC00MywxMCArNDMsMTEgQEAKICAgICBjb25zdCBVc2VyQWdlbnRQbGF0Zm9ybUluZm8mIHBsYXRmb3JtX2luZm8pIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGhlYWRlcnM7CiAKLSAgQWRkSGVhZGVyKGhlYWRlcnMsICJGaXJtd2FyZS1WZXJzaW9uLURldGFpbHMiLAotICAgICAgICAgICAgcGxhdGZvcm1faW5mby5maXJtd2FyZV92ZXJzaW9uX2RldGFpbHMoKSk7CisgIEFkZEhlYWRlcihoZWFkZXJzLCAiQW5kcm9pZC1CdWlsZC1GaW5nZXJwcmludCIsCisgICAgICAgICAgICBwbGF0Zm9ybV9pbmZvLmFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoKSk7CiAKLSAgQWRkSGVhZGVyKGhlYWRlcnMsICJPUy1FeHBlcmllbmNlIiwgcGxhdGZvcm1faW5mby5vc19leHBlcmllbmNlKCkpOworICBBZGRIZWFkZXIoaGVhZGVycywgIkFuZHJvaWQtT1MtRXhwZXJpZW5jZSIsCisgICAgICAgICAgICBwbGF0Zm9ybV9pbmZvLmFuZHJvaWRfb3NfZXhwZXJpZW5jZSgpKTsKIAogICByZXR1cm4gaGVhZGVyczsKIH0KZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL2NsaWVudF9oaW50X2hlYWRlcnNfdGVzdC5jYyBiL2NvYmFsdC9icm93c2VyL2NsaWVudF9oaW50X2hlYWRlcnNfdGVzdC5jYwppbmRleCBmOTY2MjZhLi43Y2IyNmU5IDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9jbGllbnRfaGludF9oZWFkZXJzX3Rlc3QuY2MKKysrIGIvY29iYWx0L2Jyb3dzZXIvY2xpZW50X2hpbnRfaGVhZGVyc190ZXN0LmNjCkBAIC0yNywxNCArMjcsMTQgQEAKIAogVEVTVChDbGllbnRIaW50SGVhZGVyc1Rlc3QsIEdldENsaWVudEhpbnRIZWFkZXJzKSB7CiAgIFVzZXJBZ2VudFBsYXRmb3JtSW5mbyBwbGF0Zm9ybV9pbmZvOwotICBwbGF0Zm9ybV9pbmZvLnNldF9maXJtd2FyZV92ZXJzaW9uX2RldGFpbHMoImFiYy9kZWY6MTIzLjQ1Ni94eS16Iik7Ci0gIHBsYXRmb3JtX2luZm8uc2V0X29zX2V4cGVyaWVuY2UoIkFtYXRpIik7CisgIHBsYXRmb3JtX2luZm8uc2V0X2FuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoImFiYy9kZWY6MTIzLjQ1Ni94eS16Iik7CisgIHBsYXRmb3JtX2luZm8uc2V0X2FuZHJvaWRfb3NfZXhwZXJpZW5jZSgiQW1hdGkiKTsKIAogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaGVhZGVycyA9IEdldENsaWVudEhpbnRIZWFkZXJzKHBsYXRmb3JtX2luZm8pOwogICBFWFBFQ1RfVEhBVChoZWFkZXJzLAogICAgICAgICAgICAgICBVbm9yZGVyZWRFbGVtZW50c0FyZSgKLSAgICAgICAgICAgICAgICAgICJTZWMtQ0gtVUEtQ28tRmlybXdhcmUtVmVyc2lvbi1EZXRhaWxzOmFiYy9kZWY6MTIzLjQ1Ni94eS16IiwKLSAgICAgICAgICAgICAgICAgICJTZWMtQ0gtVUEtQ28tT1MtRXhwZXJpZW5jZTpBbWF0aSIpKTsKKyAgICAgICAgICAgICAgICAgICJTZWMtQ0gtVUEtQ28tQW5kcm9pZC1CdWlsZC1GaW5nZXJwcmludDphYmMvZGVmOjEyMy40NTYveHkteiIsCisgICAgICAgICAgICAgICAgICAiU2VjLUNILVVBLUNvLUFuZHJvaWQtT1MtRXhwZXJpZW5jZTpBbWF0aSIpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9pZGxfZmlsZXMuZ25pIGIvY29iYWx0L2Jyb3dzZXIvaWRsX2ZpbGVzLmduaQppbmRleCBiNjQwODZkLi40NjYzZDA5IDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9pZGxfZmlsZXMuZ25pCisrKyBiL2NvYmFsdC9icm93c2VyL2lkbF9maWxlcy5nbmkKQEAgLTE2Miw2ICsxNjIsNyBAQAogICAiLy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnX2FycmF5LmlkbCIsCiAgICIvL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaWRsIiwKICAgIi8vY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaWRsIiwKKyAgIi8vY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaWRsIiwKICAgIi8vY29iYWx0L2g1dmNjL2g1dmNjX3BsYXRmb3JtX3NlcnZpY2UuaWRsIiwKICAgIi8vY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuaWRsIiwKICAgIi8vY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmlkbCIsCkBAIC0zMTIsNiArMzEzLDcgQEAKICAgIi8vY29iYWx0L2VuY29kaW5nL3RleHRfZGVjb2Rlcl9vcHRpb25zLmlkbCIsCiAgICIvL2NvYmFsdC9lbmNvZGluZy90ZXh0X2VuY29kZXJfZW5jb2RlX2ludG9fcmVzdWx0LmlkbCIsCiAgICIvL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF90eXBlLmlkbCIsCisgICIvL2NvYmFsdC9oNXZjYy9oNXZjY19tZXRyaWNfdHlwZS5pZGwiLAogICAiLy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3RvcmFnZV9yZXNvdXJjZV90eXBlX3F1b3RhX2J5dGVzX2RpY3Rpb25hcnkuaWRsIiwKICAgIi8vY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2Vfc2V0X3F1b3RhX3Jlc3BvbnNlLmlkbCIsCiAgICIvL2NvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlX3dyaXRlX3Rlc3RfcmVzcG9uc2UuaWRsIiwKZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL2xpZmVjeWNsZV9jb25zb2xlX2NvbW1hbmRzLmNjIGIvY29iYWx0L2Jyb3dzZXIvbGlmZWN5Y2xlX2NvbnNvbGVfY29tbWFuZHMuY2MKaW5kZXggMzc4NGUyOS4uMDEwNDk3MSAxMDA2NDQKLS0tIGEvY29iYWx0L2Jyb3dzZXIvbGlmZWN5Y2xlX2NvbnNvbGVfY29tbWFuZHMuY2MKKysrIGIvY29iYWx0L2Jyb3dzZXIvbGlmZWN5Y2xlX2NvbnNvbGVfY29tbWFuZHMuY2MKQEAgLTIzLDI0ICsyMyw0MSBAQAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgYnJvd3NlciB7CiAKLWNvbnN0IGNoYXIga1BhdXNlQ29tbWFuZFtdID0gInBhdXNlIjsKLWNvbnN0IGNoYXIga1BhdXNlQ29tbWFuZFNob3J0SGVscFtdID0gIlNlbmRzIGEgcmVxdWVzdCB0byBwYXVzZSBDb2JhbHQuIjsKLWNvbnN0IGNoYXIga1BhdXNlQ29tbWFuZExvbmdIZWxwW10gPQotICAgICJTZW5kcyBhIHJlcXVlc3QgdG8gdGhlIHBsYXRmb3JtIHRvIHBhdXNlIENvYmFsdCwgaW5kaWNhdGluZyB0aGF0IGl0IGlzICIKK2NvbnN0IGNoYXIga0JsdXJDb21tYW5kW10gPSAiYmx1ciI7Citjb25zdCBjaGFyIGtCbHVyQ29tbWFuZFNob3J0SGVscFtdID0gIlNlbmRzIGEgcmVxdWVzdCB0byBibHVyIENvYmFsdC4iOworY29uc3QgY2hhciBrQmx1ckNvbW1hbmRMb25nSGVscFtdID0KKyAgICAiU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSB0byBibHVyIENvYmFsdCwgaW5kaWNhdGluZyB0aGF0IGl0IGlzICIKICAgICAibm90IGluIGZvY3VzIGFuZCBzZW5kaW5nIGEgYmx1ciBldmVudCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uLiI7CiAKLWNvbnN0IGNoYXIga1VucGF1c2VDb21tYW5kW10gPSAidW5wYXVzZSI7Ci1jb25zdCBjaGFyIGtVbnBhdXNlQ29tbWFuZFNob3J0SGVscFtdID0gIlNlbmRzIGEgcmVxdWVzdCB0byB1bnBhdXNlIENvYmFsdC4iOwotY29uc3QgY2hhciBrVW5wYXVzZUNvbW1hbmRMb25nSGVscFtdID0KLSAgICAiU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSB0byB1bnBhdXNlIENvYmFsdCwgcmVzdWx0aW5nIGluIGEgZm9jdXMgIgorY29uc3QgY2hhciBrRm9jdXNDb21tYW5kW10gPSAiZm9jdXMiOworY29uc3QgY2hhciBrRm9jdXNDb21tYW5kU2hvcnRIZWxwW10gPSAiU2VuZHMgYSByZXF1ZXN0IHRvIGZvY3VzIENvYmFsdC4iOworY29uc3QgY2hhciBrRm9jdXNDb21tYW5kTG9uZ0hlbHBbXSA9CisgICAgIlNlbmRzIGEgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gdG8gZm9jdXMgQ29iYWx0LCByZXN1bHRpbmcgaW4gYSBGb2N1cyAiCiAgICAgImV2ZW50IGJlaW5nIHNlbnQgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbi4iOwogCi1jb25zdCBjaGFyIGtTdXNwZW5kQ29tbWFuZFtdID0gInN1c3BlbmQiOwotY29uc3QgY2hhciBrU3VzcGVuZENvbW1hbmRTaG9ydEhlbHBbXSA9ICJTZW5kcyBhIHJlcXVlc3QgdG8gc3VzcGVuZCBDb2JhbHQuIjsKLWNvbnN0IGNoYXIga1N1c3BlbmRDb21tYW5kTG9uZ0hlbHBbXSA9Ci0gICAgIlNlbmRzIGEgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gdG8gc3VzcGVuZCBDb2JhbHQsIGluZGljYXRpbmcgdGhhdCBpdCBpcyAiCitjb25zdCBjaGFyIGtDb25jZWFsQ29tbWFuZFtdID0gImNvbmNlYWwiOworY29uc3QgY2hhciBrQ29uY2VhbENvbW1hbmRTaG9ydEhlbHBbXSA9ICJTZW5kcyBhIHJlcXVlc3QgdG8gY29uY2VhbCBDb2JhbHQuIjsKK2NvbnN0IGNoYXIga0NvbmNlYWxDb21tYW5kTG9uZ0hlbHBbXSA9CisgICAgIlNlbmRzIGEgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gdG8gY29uY2VhbCBDb2JhbHQsIGluZGljYXRpbmcgdGhhdCBpdCBpcyAiCiAgICAgIm5vdCB2aXNpYmxlIGFuZCBzZW5kaW5nIGEgaGlkZGVuIGV2ZW50IHRvIHRoZSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgIgotICAgICJDb2JhbHQgbWF5IGJlY29tZSB1bnJlc3BvbnNpdmUgYWZ0ZXIgdGhpcyBjYWxsIGFuZCB5b3Ugd2lsbCBuZWVkIHRvICIKKyAgICAiQ29iYWx0IG1heSBiZWNvbWUgdW5yZXNwb25zaXZlIGFmdGVyIHRoaXMgY2FsbCBpbiB3aGljaCBjYXNlIHlvdSB3aWxsICIKKyAgICAibmVlZCB0byByZXN1bWUgaXQgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkuIjsKKworY29uc3QgY2hhciBrRnJlZXplQ29tbWFuZFtdID0gImZyZWV6ZSI7Citjb25zdCBjaGFyIGtGcmVlemVDb21tYW5kU2hvcnRIZWxwW10gPSAiU2VuZHMgYSByZXF1ZXN0IHRvIGZyZWV6ZSBDb2JhbHQuIjsKK2NvbnN0IGNoYXIga0ZyZWV6ZUNvbW1hbmRMb25nSGVscFtdID0KKyAgICAiU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSB0byBmcmVlemUgQ29iYWx0LCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgIgorICAgICJub3QgdmlzaWJsZSwgc2VuZGluZyBhIGhpZGRlbiBldmVudCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uLCBhbmQgaGFsdCAiCisgICAgInByb2Nlc3NpbmcuICBOb3RlIHRoYXQgQ29iYWx0IG1heSBiZWNvbWUgdW5yZXNwb25zaXZlIGFmdGVyIHRoaXMgY2FsbCBpbiAiCisgICAgIndoaWNoIGNhc2UgeW91IHdpbGwgbmVlZCB0byByZXN1bWUgaXQgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkuIjsKKworY29uc3QgY2hhciBrUmV2ZWFsQ29tbWFuZFtdID0gInJldmVhbCI7Citjb25zdCBjaGFyIGtSZXZlYWxDb21tYW5kU2hvcnRIZWxwW10gPSAiU2VuZHMgYSByZXF1ZXN0IHRvIHJldmVhbCBDb2JhbHQuIjsKK2NvbnN0IGNoYXIga1JldmVhbENvbW1hbmRMb25nSGVscFtdID0KKyAgICAiU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSB0byByZXZlYWwgQ29iYWx0LCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgIgorICAgICJ2aXNpYmxlIGJ1dCBub3QgZm9jdWVzLCBhbmQgc2VuZGluZyBhIHZpc2libGUgZXZlbnQgdG8gdGhlIHdlYiAiCisgICAgImFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0ICIKKyAgICAiQ29iYWx0IG1heSBiZSB1bnJlc3BvbnNpdmUgaW4gd2hpY2ggY2FzZSB5b3Ugd2lsbCBuZWVkIHRvICIKICAgICAicmVzdW1lIGl0IGluIGEgcGxhdGZvcm0tc3BlY2lmaWMgd2F5LiI7CiAKIGNvbnN0IGNoYXIga1F1aXRDb21tYW5kW10gPSAicXVpdCI7CkBAIC01MCwzMSArNjcsMzcgQEAKICAgICAiZW5kaW5nIHRoZSBwcm9jZXNzIChwZWFjZWZ1bGx5KS4iOwogCiBuYW1lc3BhY2UgewotLy8gVGhpcyBpcyB0ZW1wb3JhcnkgdGhhdCB3aWxsIGJlIGNoYW5nZWQgaW4gbGF0ZXIgQ0xzLCBmb3IgbWFwcGluZyBTdGFyYm9hcmQKLS8vIENvbmNlYWxlZCBzdGF0ZSBzdXBwb3J0IG9udG8gQ29iYWx0IHdpdGhvdXQgQ29uY2VhbGVkIHN0YXRlIHN1cHBvcnQgdG8gYmUKLS8vIGFibGUgdG8gdGVzdCB0aGUgZm9ybWVyLgotdm9pZCBPblBhdXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKm1lc3NhZ2UqLykgeyBTYlN5c3RlbVJlcXVlc3RCbHVyKCk7IH0KLQotdm9pZCBPblVucGF1c2UoY29uc3Qgc3RkOjpzdHJpbmcmIC8qbWVzc2FnZSovKSB7IFNiU3lzdGVtUmVxdWVzdEZvY3VzKCk7IH0KLQotdm9pZCBPblN1c3BlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIC8qbWVzc2FnZSovKSB7Ci0gIExPRyhJTkZPKSA8PCAiQ29uY2VhbGluZyBDb2JhbHQgdGhyb3VnaCB0aGUgY29uc29sZSwgYnV0IHlvdSB3aWxsIG5lZWQgdG8gIgotICAgICAgICAgICAgPDwgInJldmVhbCBDb2JhbHQgdXNpbmcgYSBwbGF0Zm9ybS1zcGVjaWZpYyBtZXRob2QuIjsKK3ZvaWQgT25CbHVyKGNvbnN0IHN0ZDo6c3RyaW5nJikgeyBTYlN5c3RlbVJlcXVlc3RCbHVyKCk7IH0KK3ZvaWQgT25Gb2N1cyhjb25zdCBzdGQ6OnN0cmluZyYpIHsgU2JTeXN0ZW1SZXF1ZXN0Rm9jdXMoKTsgfQordm9pZCBPbkNvbmNlYWwoY29uc3Qgc3RkOjpzdHJpbmcmKSB7CisgIExPRyhXQVJOSU5HKQorICAgICAgPDwgIkNvbmNlYWxpbmcgQ29iYWx0IHRocm91Z2ggdGhlIGNvbnNvbGUuICBOb3RlIHRoYXQgQ29iYWx0IG1heSAiCisgICAgICAgICAiYmVjb21lIHVucmVzcG9uc2l2ZSBhZnRlciB0aGlzIGNhbGwgaW4gd2hpY2ggY2FzZSB5b3Ugd2lsbCAiCisgICAgICAgICAibmVlZCB0byByZXN1bWUgaXQgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkuIjsKICAgU2JTeXN0ZW1SZXF1ZXN0Q29uY2VhbCgpOwogfQotCit2b2lkIE9uRnJlZXplKGNvbnN0IHN0ZDo6c3RyaW5nJikgeworICBMT0coV0FSTklORykgPDwgIkZyZWV6aW5nIENvYmFsdCB0aHJvdWdoIHRoZSBjb25zb2xlLiAgTm90ZSB0aGF0IENvYmFsdCBtYXkgIgorICAgICAgICAgICAgICAgICAgImJlY29tZSB1bnJlc3BvbnNpdmUgYWZ0ZXIgdGhpcyBjYWxsIGluIHdoaWNoIGNhc2UgeW91IHdpbGwgIgorICAgICAgICAgICAgICAgICAgIm5lZWQgdG8gcmVzdW1lIGl0IGluIGEgcGxhdGZvcm0tc3BlY2lmaWMgd2F5LiI7CisgIFNiU3lzdGVtUmVxdWVzdEZyZWV6ZSgpOworfQordm9pZCBPblJldmVhbChjb25zdCBzdGQ6OnN0cmluZyYpIHsgU2JTeXN0ZW1SZXF1ZXN0UmV2ZWFsKCk7IH0KIHZvaWQgT25RdWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKm1lc3NhZ2UqLykgeyBTYlN5c3RlbVJlcXVlc3RTdG9wKDApOyB9CiB9ICAvLyBuYW1lc3BhY2UKIAogTGlmZWN5Y2xlQ29uc29sZUNvbW1hbmRzOjpMaWZlY3ljbGVDb25zb2xlQ29tbWFuZHMoKQotICAgIDogcGF1c2VfY29tbWFuZF9oYW5kbGVyXyhrUGF1c2VDb21tYW5kLCBiYXNlOjpCaW5kKCZPblBhdXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BhdXNlQ29tbWFuZFNob3J0SGVscCwga1BhdXNlQ29tbWFuZExvbmdIZWxwKSwKLSAgICAgIHVucGF1c2VfY29tbWFuZF9oYW5kbGVyXyhrVW5wYXVzZUNvbW1hbmQsIGJhc2U6OkJpbmQoT25VbnBhdXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVW5wYXVzZUNvbW1hbmRTaG9ydEhlbHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1VucGF1c2VDb21tYW5kTG9uZ0hlbHApLAotICAgICAgc3VzcGVuZF9jb21tYW5kX2hhbmRsZXJfKGtTdXNwZW5kQ29tbWFuZCwgYmFzZTo6QmluZChPblN1c3BlbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTdXNwZW5kQ29tbWFuZFNob3J0SGVscCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU3VzcGVuZENvbW1hbmRMb25nSGVscCksCisgICAgOiBibHVyX2NvbW1hbmRfaGFuZGxlcl8oa0JsdXJDb21tYW5kLCBiYXNlOjpCaW5kKE9uQmx1ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JsdXJDb21tYW5kU2hvcnRIZWxwLCBrQmx1ckNvbW1hbmRMb25nSGVscCksCisgICAgICBmb2N1c19jb21tYW5kX2hhbmRsZXJfKGtGb2N1c0NvbW1hbmQsIGJhc2U6OkJpbmQoT25Gb2N1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGb2N1c0NvbW1hbmRTaG9ydEhlbHAsIGtGb2N1c0NvbW1hbmRMb25nSGVscCksCisgICAgICBjb25jZWFsX2NvbW1hbmRfaGFuZGxlcl8oa0NvbmNlYWxDb21tYW5kLCBiYXNlOjpCaW5kKE9uQ29uY2VhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NvbmNlYWxDb21tYW5kU2hvcnRIZWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb25jZWFsQ29tbWFuZExvbmdIZWxwKSwKKyAgICAgIGZyZWV6ZV9jb21tYW5kX2hhbmRsZXJfKGtGcmVlemVDb21tYW5kLCBiYXNlOjpCaW5kKE9uRnJlZXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGcmVlemVDb21tYW5kU2hvcnRIZWxwLCBrRnJlZXplQ29tbWFuZExvbmdIZWxwKSwKKyAgICAgIHJldmVhbF9jb21tYW5kX2hhbmRsZXJfKGtSZXZlYWxDb21tYW5kLCBiYXNlOjpCaW5kKE9uUmV2ZWFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXZlYWxDb21tYW5kU2hvcnRIZWxwLCBrUmV2ZWFsQ29tbWFuZExvbmdIZWxwKSwKICAgICAgIHF1aXRfY29tbWFuZF9oYW5kbGVyXyhrUXVpdENvbW1hbmQsIGJhc2U6OkJpbmQoT25RdWl0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVpdENvbW1hbmRTaG9ydEhlbHAsIGtRdWl0Q29tbWFuZExvbmdIZWxwKSB7fQogCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9saWZlY3ljbGVfY29uc29sZV9jb21tYW5kcy5oIGIvY29iYWx0L2Jyb3dzZXIvbGlmZWN5Y2xlX2NvbnNvbGVfY29tbWFuZHMuaAppbmRleCAzZThiYWM0Li5kYTIwMTViIDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9saWZlY3ljbGVfY29uc29sZV9jb21tYW5kcy5oCisrKyBiL2NvYmFsdC9icm93c2VyL2xpZmVjeWNsZV9jb25zb2xlX2NvbW1hbmRzLmgKQEAgLTI5LDExICsyOSwxMiBAQAogICBMaWZlY3ljbGVDb25zb2xlQ29tbWFuZHMoKTsKIAogIHByaXZhdGU6Ci0gIGRlYnVnOjpjb25zb2xlOjpDb25zb2xlQ29tbWFuZE1hbmFnZXI6OkNvbW1hbmRIYW5kbGVyIHBhdXNlX2NvbW1hbmRfaGFuZGxlcl87CisgIGRlYnVnOjpjb25zb2xlOjpDb25zb2xlQ29tbWFuZE1hbmFnZXI6OkNvbW1hbmRIYW5kbGVyIGJsdXJfY29tbWFuZF9oYW5kbGVyXzsKKyAgZGVidWc6OmNvbnNvbGU6OkNvbnNvbGVDb21tYW5kTWFuYWdlcjo6Q29tbWFuZEhhbmRsZXIgZm9jdXNfY29tbWFuZF9oYW5kbGVyXzsKICAgZGVidWc6OmNvbnNvbGU6OkNvbnNvbGVDb21tYW5kTWFuYWdlcjo6Q29tbWFuZEhhbmRsZXIKLSAgICAgIHVucGF1c2VfY29tbWFuZF9oYW5kbGVyXzsKLSAgZGVidWc6OmNvbnNvbGU6OkNvbnNvbGVDb21tYW5kTWFuYWdlcjo6Q29tbWFuZEhhbmRsZXIKLSAgICAgIHN1c3BlbmRfY29tbWFuZF9oYW5kbGVyXzsKKyAgICAgIGNvbmNlYWxfY29tbWFuZF9oYW5kbGVyXzsKKyAgZGVidWc6OmNvbnNvbGU6OkNvbnNvbGVDb21tYW5kTWFuYWdlcjo6Q29tbWFuZEhhbmRsZXIgZnJlZXplX2NvbW1hbmRfaGFuZGxlcl87CisgIGRlYnVnOjpjb25zb2xlOjpDb25zb2xlQ29tbWFuZE1hbmFnZXI6OkNvbW1hbmRIYW5kbGVyIHJldmVhbF9jb21tYW5kX2hhbmRsZXJfOwogICBkZWJ1Zzo6Y29uc29sZTo6Q29uc29sZUNvbW1hbmRNYW5hZ2VyOjpDb21tYW5kSGFuZGxlciBxdWl0X2NvbW1hbmRfaGFuZGxlcl87CiB9OwogCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9tYWluLmNjIGIvY29iYWx0L2Jyb3dzZXIvbWFpbi5jYwppbmRleCA3Zjg3YmMwLi43ZDBkMGEwIDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9tYWluLmNjCisrKyBiL2NvYmFsdC9icm93c2VyL21haW4uY2MKQEAgLTg2LDYgKzg2LDcgQEAKICAgTE9HKElORk8pIDw8ICJTdG9wcGluZyBhcHBsaWNhdGlvbi4iOwogICBkZWxldGUgZ19hcHBsaWNhdGlvbjsKICAgZ19hcHBsaWNhdGlvbiA9IE5VTEw7CisgIExPRyhJTkZPKSA8PCAiQXBwbGljYXRpb24gc3RvcHBlZC4iOwogfQogCiB2b2lkIEhhbmRsZVN0YXJib2FyZEV2ZW50KGNvbnN0IFNiRXZlbnQqIHN0YXJib2FyZF9ldmVudCkgewpkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3NldHRpbmdzL2F1dG9fbWVtLmggYi9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvYXV0b19tZW0uaAppbmRleCA4MDE0ZTE0Li42NGNhMWUxIDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvYXV0b19tZW0uaAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfc2V0dGluZ3MvYXV0b19tZW0uaApAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9hdXRvX21lbV9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV9zZXR0aW5ncy9tZW1vcnlfc2V0dGluZ3MuaCIKICNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgYnJvd3NlciB7CmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL0JVSUxELmduIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9CVUlMRC5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI1ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9CVUlMRC5nbgpAQCAtMCwwICsxLDY1IEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOiN3d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzdGF0aWNfbGlicmFyeSgibWV0cmljcyIpIHsKKyAgc291cmNlcyA9IFsKKyAgICAiY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuY2MiLAorICAgICJjb2JhbHRfZW5hYmxlZF9zdGF0ZV9wcm92aWRlci5oIiwKKyAgICAiY29iYWx0X21ldHJpY3NfbG9nX3VwbG9hZGVyLmNjIiwKKyAgICAiY29iYWx0X21ldHJpY3NfbG9nX3VwbG9hZGVyLmgiLAorICAgICJjb2JhbHRfbWV0cmljc19zZXJ2aWNlX2NsaWVudC5jYyIsCisgICAgImNvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmgiLAorICAgICJjb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyLmNjIiwKKyAgICAiY29iYWx0X21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5oIiwKKyAgICAiY29iYWx0X21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuY2MiLAorICAgICJjb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudC5oIiwKKyAgICAiY29iYWx0X21ldHJpY3NfdXBsb2FkZXJfY2FsbGJhY2suaCIsCisgIF0KKworICBkZXBzID0gWworICAgICIvL2Jhc2UiLAorICAgICIvL2NvYmFsdC9icm93c2VyOmdlbmVyYXRlZF90eXBlcyIsCisgICAgIi8vY29iYWx0L2g1dmNjOm1ldHJpY19ldmVudF9oYW5kbGVyX3dyYXBwZXIiLAorICAgICIvL2NvbXBvbmVudHMvbWV0cmljcyIsCisgICAgIi8vY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIiLAorICAgICIvL2NvbXBvbmVudHMvcHJlZnMiLAorICAgICIvL3RoaXJkX3BhcnR5L21ldHJpY3NfcHJvdG8iLAorICBdCit9CisKK3RhcmdldChndGVzdF90YXJnZXRfdHlwZSwgIm1ldHJpY3NfdGVzdCIpIHsKKyAgdGVzdG9ubHkgPSB0cnVlCisgIGhhc19wZWRhbnRpY193YXJuaW5ncyA9IHRydWUKKworICBzb3VyY2VzID0gWworICAgICJjb2JhbHRfbWV0cmljc19sb2dfdXBsb2FkZXJfdGVzdC5jYyIsCisgICAgImNvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50X3Rlc3QuY2MiLAorICAgICJjb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudF90ZXN0LmNjIiwKKyAgXQorCisgIGRlcHMgPSBbCisgICAgIjptZXRyaWNzIiwKKyAgICAiLy9iYXNlIiwKKyAgICAiLy9jb2JhbHQvYnJvd3NlcjpnZW5lcmF0ZWRfdHlwZXMiLAorICAgICIvL2NvYmFsdC9oNXZjYyIsCisgICAgIi8vY29iYWx0L2g1dmNjOm1ldHJpY19ldmVudF9oYW5kbGVyX3dyYXBwZXIiLAorICAgICIvL2NvYmFsdC90ZXN0OnJ1bl9hbGxfdW5pdHRlc3RzIiwKKyAgICAiLy9jb21wb25lbnRzL21ldHJpY3MiLAorICAgICIvL2NvbXBvbmVudHMvcHJlZnM6dGVzdF9zdXBwb3J0IiwKKyAgICAiLy90ZXN0aW5nL2dtb2NrIiwKKyAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKKyAgICAiLy90aGlyZF9wYXJ0eS9tZXRyaWNzX3Byb3RvIiwKKyAgICAiLy90aGlyZF9wYXJ0eS96bGliL2dvb2dsZTpjb21wcmVzc2lvbl91dGlscyIsCisgIF0KK30KZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuY2MgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9lbmFibGVkX3N0YXRlX3Byb3ZpZGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTQwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9lbmFibGVkX3N0YXRlX3Byb3ZpZGVyLmNjCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuaCIKKworI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9lbmFibGVkX3N0YXRlX3Byb3ZpZGVyLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJyb3dzZXIgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitib29sIENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyOjpJc0NvbnNlbnRHaXZlbigpIGNvbnN0IHsKKyAgcmV0dXJuIGlzX2NvbnNlbnRfZ2l2ZW5fOworfQorCitib29sIENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyOjpJc1JlcG9ydGluZ0VuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiBpc19yZXBvcnRpbmdfZW5hYmxlZF87Cit9CisKK3ZvaWQgQ29iYWx0RW5hYmxlZFN0YXRlUHJvdmlkZXI6OlNldENvbnNlbnRHaXZlbihib29sIGlzX2NvbnNlbnRfZ2l2ZW4pIHsKKyAgaXNfY29uc2VudF9naXZlbl8gPSBpc19jb25zZW50X2dpdmVuOworfQordm9pZCBDb2JhbHRFbmFibGVkU3RhdGVQcm92aWRlcjo6U2V0UmVwb3J0aW5nRW5hYmxlZCgKKyAgICBib29sIGlzX3JlcG9ydGluZ19lbmFibGVkKSB7CisgIGlzX3JlcG9ydGluZ19lbmFibGVkXyA9IGlzX3JlcG9ydGluZ19lbmFibGVkOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuaCBiL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmFjOTJmCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfZW5hYmxlZF9zdGF0ZV9wcm92aWRlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9FTkFCTEVEX1NUQVRFX1BST1ZJREVSX0hfCisjZGVmaW5lIENPQkFMVF9CUk9XU0VSX01FVFJJQ1NfQ09CQUxUX0VOQUJMRURfU1RBVEVfUFJPVklERVJfSF8KKworI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9lbmFibGVkX3N0YXRlX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYnJvd3NlciB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKKy8vIEEgQ29iYWx0IGltcGxlbWVudGF0aW9uIG9mIEVuYWJsZWRTdGF0ZVByb3ZpZGVyLiBUaGlzIGNsYXNzIGlzIHRoZSBwcmltYXJ5CisvLyBlbnRyeSBwb2ludCBpbnRvIGVuYWJsaW5nL2Rpc2FibGluZyBtZXRyaWNzIGNvbGxlY3Rpb24gYW5kIHVwbG9hZGluZy4KK2NsYXNzIENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyIDogcHVibGljIDo6bWV0cmljczo6RW5hYmxlZFN0YXRlUHJvdmlkZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ29iYWx0RW5hYmxlZFN0YXRlUHJvdmlkZXIoYm9vbCBpc19jb25zZW50X2dpdmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcG9ydGluZ19lbmFibGVkKQorICAgICAgOiBpc19jb25zZW50X2dpdmVuXyhpc19jb25zZW50X2dpdmVuKSwKKyAgICAgICAgaXNfcmVwb3J0aW5nX2VuYWJsZWRfKGlzX3JlcG9ydGluZ19lbmFibGVkKSB7fQorCisgIENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyKGNvbnN0IENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyJikgPSBkZWxldGU7CisgIENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyJiBvcGVyYXRvcj0oY29uc3QgQ29iYWx0RW5hYmxlZFN0YXRlUHJvdmlkZXImKSA9CisgICAgICBkZWxldGU7CisKKyAgfkNvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyKCkgb3ZlcnJpZGV7fTsKKworICAvLyBJbmRpY2F0ZXMgdXNlciBjb25zZW50IHRvIGNvbGxlY3QgYW5kIHJlcG9ydCBtZXRyaWNzLiBJbiBDb2JhbHQsIGNvbnNlbnQKKyAgLy8gaXMgaW5oZXJpdGVkIHRocm91Z2ggdGhlIHdlYiBhcHBsaWNhdGlvbiwgc28gdGhpcyBpcyB1c3VhbGx5IHRydWUuCisgIGJvb2wgSXNDb25zZW50R2l2ZW4oKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBXaGV0aGVyIG1ldHJpYyBjb2xsZWN0aW9uIGlzIGVuYWJsZWQuIFRoaXMgaXMgd2hhdCBjb250cm9scworICAvLyByZWNvcmRpbmcvYWdncmVnYXRpb24gb2YgbWV0cmljcy4KKyAgYm9vbCBJc1JlcG9ydGluZ0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBTZXR0ZXJzIGZvciBjb25zZW50IGFuZCByZXBvcnRpbmcgY29udHJvbHMuCisgIHZvaWQgU2V0Q29uc2VudEdpdmVuKGJvb2wgaXNfY29uc2VudF9naXZlbik7CisgIHZvaWQgU2V0UmVwb3J0aW5nRW5hYmxlZChib29sIGlzX3JlcG9ydGluZ19lbmFibGVkKTsKKworIHByaXZhdGU6CisgIGJvb2wgaXNfY29uc2VudF9naXZlbl8gPSBmYWxzZTsKKyAgYm9vbCBpc19yZXBvcnRpbmdfZW5hYmxlZF8gPSBmYWxzZTsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBicm93c2VyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0JST1dTRVJfTUVUUklDU19DT0JBTFRfRU5BQkxFRF9TVEFURV9QUk9WSURFUl9IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19sb2dfdXBsb2FkZXIuY2MgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDc2ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19sb2dfdXBsb2FkZXIuY2MKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19sb2dfdXBsb2FkZXIuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3NfdXBsb2FkZXJfY2FsbGJhY2suaCIKKyNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfbWV0cmljX3R5cGUuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbG9nX2RlY29kZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19sb2dfdXBsb2FkZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tZXRyaWNzX3Byb3RvL2Nocm9tZV91c2VyX21ldHJpY3NfZXh0ZW5zaW9uLnBiLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbWV0cmljc19wcm90by9yZXBvcnRpbmdfaW5mby5wYi5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyOjpDb2JhbHRNZXRyaWNzTG9nVXBsb2FkZXIoCisgICAgOjptZXRyaWNzOjpNZXRyaWNzTG9nVXBsb2FkZXI6Ok1ldHJpY1NlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSwKKyAgICBjb25zdCA6Om1ldHJpY3M6Ok1ldHJpY3NMb2dVcGxvYWRlcjo6VXBsb2FkQ2FsbGJhY2smIG9uX3VwbG9hZF9jb21wbGV0ZSkKKyAgICA6IHNlcnZpY2VfdHlwZV8oc2VydmljZV90eXBlKSwgb25fdXBsb2FkX2NvbXBsZXRlXyhvbl91cGxvYWRfY29tcGxldGUpIHt9CisKK3ZvaWQgQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyOjpVcGxvYWRMb2coCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbXByZXNzZWRfbG9nX2RhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2dfaGFzaCwKKyAgICBjb25zdCA6Om1ldHJpY3M6OlJlcG9ydGluZ0luZm8mIHJlcG9ydGluZ19pbmZvKSB7CisgIGlmIChzZXJ2aWNlX3R5cGVfID09IDo6bWV0cmljczo6TWV0cmljc0xvZ1VwbG9hZGVyOjpVTUEpIHsKKyAgICBzdGQ6OnN0cmluZyB1bmNvbXByZXNzZWRfc2VyaWFsaXplZF9wcm90bzsKKyAgICA6Om1ldHJpY3M6OkRlY29kZUxvZ0RhdGEoY29tcHJlc3NlZF9sb2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuY29tcHJlc3NlZF9zZXJpYWxpemVkX3Byb3RvKTsKKyAgICBpZiAodXBsb2FkX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKKyAgICAgIHVwbG9hZF9oYW5kbGVyXy0+UnVuKGg1dmNjOjpINXZjY01ldHJpY1R5cGU6OmtINXZjY01ldHJpY1R5cGVVbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRfc2VyaWFsaXplZF9wcm90byk7CisgICAgfQorICB9CisKKyAgLy8gQXJndW1lbnRzIHRvIGNhbGxiYWNrIGRvbid0IG1hdHRlciBtdWNoIGhlcmUgYXMgd2UncmUgbm90IHJlYWxseSBkb2luZworICAvLyBhbnl0aGluZyBidXQgZm9yd2FyZGluZyB0byB0aGUgSDV2Y2MgQVBJLiBSdW4oaHR0cCByZXNwb25zZSBjb2RlLCBuZXQKKyAgLy8gY29kZSwgYW5kIHdhcyBodHRwcykuCisgIG9uX3VwbG9hZF9jb21wbGV0ZV8uUnVuKC8qc3RhdHVzKi8gMjAwLCAvKiBlcnJvcl9jb2RlICovIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2FzX2h0dHBzKi8gdHJ1ZSk7Cit9CisKK3ZvaWQgQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyOjpTZXRPblVwbG9hZEhhbmRsZXIoCisgICAgY29uc3QgQ29iYWx0TWV0cmljc1VwbG9hZGVyQ2FsbGJhY2sqIHVwbG9hZF9oYW5kbGVyKSB7CisgIHVwbG9hZF9oYW5kbGVyXyA9IHVwbG9hZF9oYW5kbGVyOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3NfbG9nX3VwbG9hZGVyLmggYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzE2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlci5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9NRVRSSUNTX0xPR19VUExPQURFUl9IXworI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9NRVRSSUNTX0xPR19VUExPQURFUl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ19waWVjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3NfdXBsb2FkZXJfY2FsbGJhY2suaCIKKyNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvbWV0cmljX2V2ZW50X2hhbmRsZXJfd3JhcHBlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX2xvZ191cGxvYWRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21ldHJpY3NfcHJvdG8vcmVwb3J0aW5nX2luZm8ucGIuaCIKKworCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworY2xhc3MgUmVwb3J0aW5nSW5mbzsKKworLy8gQSBDb2JhbHQgaW1wbGVtZW50YXRpb24gb2YgTWV0cmljc0xvZ1VwbG9hZGVyIHRoYXQgaW50ZXJjZXB0cyBtZXRyaWMncyBsb2dzCisvLyB3aGVuIHRoZXkncmUgcmVhZHkgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyIGFuZCBmb3J3YXJkcyB0aGVtIHRvIHRoZSB3ZWIKKy8vIGNsaWVudCB2aWEgdGhlIEg1dmNjIEFQSS4KK2NsYXNzIENvYmFsdE1ldHJpY3NMb2dVcGxvYWRlciA6IHB1YmxpYyA6Om1ldHJpY3M6Ok1ldHJpY3NMb2dVcGxvYWRlciB7CisgcHVibGljOgorICBDb2JhbHRNZXRyaWNzTG9nVXBsb2FkZXIoCisgICAgICA6Om1ldHJpY3M6Ok1ldHJpY3NMb2dVcGxvYWRlcjo6TWV0cmljU2VydmljZVR5cGUgc2VydmljZV90eXBlLAorICAgICAgY29uc3QgOjptZXRyaWNzOjpNZXRyaWNzTG9nVXBsb2FkZXI6OlVwbG9hZENhbGxiYWNrJiBvbl91cGxvYWRfY29tcGxldGUpOworCisgIHZpcnR1YWwgfkNvYmFsdE1ldHJpY3NMb2dVcGxvYWRlcigpIHt9CisKKyAgLy8gVXBsb2FkcyBhIGxvZyB3aXRoIHRoZSBzcGVjaWZpZWQgfGNvbXByZXNzZWRfbG9nX2RhdGF8IGFuZCB8bG9nX2hhc2h8LgorICAvLyB8bG9nX2hhc2h8IGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBoZXgtZW5jb2RlZCBTSEExIGhhc2ggb2YgdGhlIGxvZyBkYXRhCisgIC8vIGJlZm9yZSBjb21wcmVzc2lvbi4KKyAgdm9pZCBVcGxvYWRMb2coY29uc3Qgc3RkOjpzdHJpbmcmIGNvbXByZXNzZWRfbG9nX2RhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2dfaGFzaCwKKyAgICAgICAgICAgICAgICAgY29uc3QgOjptZXRyaWNzOjpSZXBvcnRpbmdJbmZvJiByZXBvcnRpbmdfaW5mbyk7CisKKyAgLy8gU2V0cyB0aGUgZXZlbnQgaGFuZGxlciB3cmFwcGVyIHRvIGJlIGNhbGxlZCB3aGVuIG1ldHJpY3MgYXJlIHJlYWR5IGZvcgorICAvLyB1cGxvYWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBKYXZhU2NyaXB0IEg1dmNjIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uLgorICB2b2lkIFNldE9uVXBsb2FkSGFuZGxlcigKKyAgICAgIGNvbnN0IENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrKiBtZXRyaWNfZXZlbnRfaGFuZGxlcik7CisKKyBwcml2YXRlOgorICBjb25zdCA6Om1ldHJpY3M6Ok1ldHJpY3NMb2dVcGxvYWRlcjo6TWV0cmljU2VydmljZVR5cGUgc2VydmljZV90eXBlXzsKKyAgY29uc3QgOjptZXRyaWNzOjpNZXRyaWNzTG9nVXBsb2FkZXI6OlVwbG9hZENhbGxiYWNrIG9uX3VwbG9hZF9jb21wbGV0ZV87CisgIGNvbnN0IENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrKiB1cGxvYWRfaGFuZGxlcl8gPSBudWxscHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBicm93c2VyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0JST1dTRVJfTUVUUklDU19DT0JBTFRfTUVUUklDU19MT0dfVVBMT0FERVJfSF8KZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3NfbG9nX3VwbG9hZGVyX3Rlc3QuY2MgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlcl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjI3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlcl90ZXN0LmNjCkBAIC0wLDAgKzEsMTE1IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYmFzZS90ZXN0L21vY2tfY2FsbGJhY2suaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3VwbG9hZGVyX2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tZXRyaWNzX3Byb3RvL2Nocm9tZV91c2VyX21ldHJpY3NfZXh0ZW5zaW9uLnBiLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbWV0cmljc19wcm90by9yZXBvcnRpbmdfaW5mby5wYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3psaWIvZ29vZ2xlL2NvbXByZXNzaW9uX3V0aWxzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJyb3dzZXIgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCit1c2luZyBjb2JhbHQ6Omg1dmNjOjpINXZjY01ldHJpY3M7Cit1c2luZyBjb2JhbHQ6Omg1dmNjOjpNZXRyaWNFdmVudEhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6Omg1dmNjOjpNZXRyaWNFdmVudEhhbmRsZXJXcmFwcGVyOwordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpFcTsKK3VzaW5nIDo6dGVzdGluZzo6U3RyRXE7Cit1c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7CisKKworY2xhc3MgQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICB1cGxvYWRlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPENvYmFsdE1ldHJpY3NMb2dVcGxvYWRlcj4oCisgICAgICAgIDo6bWV0cmljczo6TWV0cmljc0xvZ1VwbG9hZGVyOjpNZXRyaWNTZXJ2aWNlVHlwZTo6VU1BLAorICAgICAgICBiYXNlOjpCaW5kKCZDb2JhbHRNZXRyaWNzTG9nVXBsb2FkZXJUZXN0OjpVcGxvYWRDb21wbGV0ZUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQorCisgIHZvaWQgVXBsb2FkQ29tcGxldGVDYWxsYmFjayhpbnQgcmVzcG9uc2VfY29kZSwgaW50IGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhc19odHRwcykgeworICAgIGNhbGxiYWNrX2NvdW50XysrOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDb2JhbHRNZXRyaWNzTG9nVXBsb2FkZXI+IHVwbG9hZGVyXzsKKyAgaW50IGNhbGxiYWNrX2NvdW50XyA9IDA7Cit9OworCitURVNUX0YoQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyVGVzdCwgVHJpZ2dlcnNVcGxvYWRIYW5kbGVyKSB7CisgIGJhc2U6Ok1vY2tDYWxsYmFjazxDb2JhbHRNZXRyaWNzVXBsb2FkZXJDYWxsYmFjaz4gbW9ja191cGxvYWRfaGFuZGxlcjsKKyAgY29uc3QgYXV0byBjYiA9IG1vY2tfdXBsb2FkX2hhbmRsZXIuR2V0KCk7CisgIHVwbG9hZGVyXy0+U2V0T25VcGxvYWRIYW5kbGVyKCZjYik7CisgIDo6bWV0cmljczo6UmVwb3J0aW5nSW5mbyBkdW1teV9yZXBvcnRpbmdfaW5mbzsKKyAgOjptZXRyaWNzOjpDaHJvbWVVc2VyTWV0cmljc0V4dGVuc2lvbiB1bWFfbG9nOworICB1bWFfbG9nLnNldF9zZXNzaW9uX2lkKDEyMzQpOworICB1bWFfbG9nLnNldF9jbGllbnRfaWQoMTIzNCk7CisgIHN0ZDo6c3RyaW5nIGNvbXByZXNzZWRfbWVzc2FnZTsKKyAgY29tcHJlc3Npb246Okd6aXBDb21wcmVzcyh1bWFfbG9nLlNlcmlhbGl6ZUFzU3RyaW5nKCksICZjb21wcmVzc2VkX21lc3NhZ2UpOworICBFWFBFQ1RfQ0FMTChtb2NrX3VwbG9hZF9oYW5kbGVyLAorICAgICAgICAgICAgICBSdW4oRXEoaDV2Y2M6Okg1dmNjTWV0cmljVHlwZTo6a0g1dmNjTWV0cmljVHlwZVVtYSksCisgICAgICAgICAgICAgICAgICBTdHJFcSh1bWFfbG9nLlNlcmlhbGl6ZUFzU3RyaW5nKCkpKSkKKyAgICAgIC5UaW1lcygxKTsKKyAgdXBsb2FkZXJfLT5VcGxvYWRMb2coY29tcHJlc3NlZF9tZXNzYWdlLCAiZmFrZV9oYXNoIiwgZHVtbXlfcmVwb3J0aW5nX2luZm8pOworICBBU1NFUlRfRVEoY2FsbGJhY2tfY291bnRfLCAxKTsKKworICA6Om1ldHJpY3M6OkNocm9tZVVzZXJNZXRyaWNzRXh0ZW5zaW9uIHVtYV9sb2cyOworICB1bWFfbG9nMi5zZXRfc2Vzc2lvbl9pZCg0NTYpOworICB1bWFfbG9nMi5zZXRfY2xpZW50X2lkKDU2Nyk7CisgIHN0ZDo6c3RyaW5nIGNvbXByZXNzZWRfbWVzc2FnZTI7CisgIGNvbXByZXNzaW9uOjpHemlwQ29tcHJlc3ModW1hX2xvZzIuU2VyaWFsaXplQXNTdHJpbmcoKSwgJmNvbXByZXNzZWRfbWVzc2FnZTIpOworICBFWFBFQ1RfQ0FMTChtb2NrX3VwbG9hZF9oYW5kbGVyLAorICAgICAgICAgICAgICBSdW4oRXEoaDV2Y2M6Okg1dmNjTWV0cmljVHlwZTo6a0g1dmNjTWV0cmljVHlwZVVtYSksCisgICAgICAgICAgICAgICAgICBTdHJFcSh1bWFfbG9nMi5TZXJpYWxpemVBc1N0cmluZygpKSkpCisgICAgICAuVGltZXMoMSk7CisgIHVwbG9hZGVyXy0+VXBsb2FkTG9nKGNvbXByZXNzZWRfbWVzc2FnZTIsICJmYWtlX2hhc2giLCBkdW1teV9yZXBvcnRpbmdfaW5mbyk7CisgIEFTU0VSVF9FUShjYWxsYmFja19jb3VudF8sIDIpOworfQorCitURVNUX0YoQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyVGVzdCwgVW5rbm93bk1ldHJpY1R5cGVEb2VzbnRUcmlnZ2VyVXBsb2FkKSB7CisgIHVwbG9hZGVyXy5yZXNldChuZXcgQ29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyKAorICAgICAgOjptZXRyaWNzOjpNZXRyaWNzTG9nVXBsb2FkZXI6Ok1ldHJpY1NlcnZpY2VUeXBlOjpVS00sCisgICAgICBiYXNlOjpCaW5kKCZDb2JhbHRNZXRyaWNzTG9nVXBsb2FkZXJUZXN0OjpVcGxvYWRDb21wbGV0ZUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpOworICBiYXNlOjpNb2NrQ2FsbGJhY2s8Q29iYWx0TWV0cmljc1VwbG9hZGVyQ2FsbGJhY2s+IG1vY2tfdXBsb2FkX2hhbmRsZXI7CisgIGNvbnN0IGF1dG8gY2IgPSBtb2NrX3VwbG9hZF9oYW5kbGVyLkdldCgpOworICB1cGxvYWRlcl8tPlNldE9uVXBsb2FkSGFuZGxlcigmY2IpOworICA6Om1ldHJpY3M6OlJlcG9ydGluZ0luZm8gZHVtbXlfcmVwb3J0aW5nX2luZm87CisgIDo6bWV0cmljczo6Q2hyb21lVXNlck1ldHJpY3NFeHRlbnNpb24gdW1hX2xvZzsKKyAgdW1hX2xvZy5zZXRfc2Vzc2lvbl9pZCgxMjM0KTsKKyAgdW1hX2xvZy5zZXRfY2xpZW50X2lkKDEyMzQpOworICBzdGQ6OnN0cmluZyBjb21wcmVzc2VkX21lc3NhZ2U7CisgIGNvbXByZXNzaW9uOjpHemlwQ29tcHJlc3ModW1hX2xvZy5TZXJpYWxpemVBc1N0cmluZygpLCAmY29tcHJlc3NlZF9tZXNzYWdlKTsKKyAgRVhQRUNUX0NBTEwobW9ja191cGxvYWRfaGFuZGxlciwgUnVuKF8sIF8pKS5UaW1lcygwKTsKKyAgdXBsb2FkZXJfLT5VcGxvYWRMb2coY29tcHJlc3NlZF9tZXNzYWdlLCAiZmFrZV9oYXNoIiwgZHVtbXlfcmVwb3J0aW5nX2luZm8pOworICAvLyBFdmVuIHRob3VnaCB3ZSBkb24ndCB1cGxvYWQgdGhpcyBsb2csIHdlIHN0aWxsIG5lZWQgdG8gdHJpZ2dlciB0aGUgY29tcGxldGUKKyAgLy8gY2FsbGJhY2sgc28gdGhlIG1ldHJpYyBjb2RlIGNhbiBrZWVwIHJ1bm5pbmcuCisgIEFTU0VSVF9FUShjYWxsYmFja19jb3VudF8sIDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZV9jbGllbnQuY2MgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGQyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmNjCkBAIC0wLDAgKzEsMjE2IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zaW5nbGV0b24uaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nMTYuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3NfdXBsb2FkZXJfY2FsbGJhY2suaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvZW5hYmxlZF9zdGF0ZV9wcm92aWRlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX2xvZ191cGxvYWRlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX3ByZWZfbmFtZXMuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19yZXBvcnRpbmdfZGVmYXVsdF9zdGF0ZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19zZXJ2aWNlX2NsaWVudC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX3N0YXRlX21hbmFnZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL2luX21lbW9yeV9wcmVmX3N0b3JlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3JlZ2lzdHJ5X3NpbXBsZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2VfZmFjdG9yeS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21ldHJpY3NfcHJvdG8vc3lzdGVtX3Byb2ZpbGUucGIuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYnJvd3NlciB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKKy8vIFRoZSBpbnRlcnZhbCBpbiBiZXR3ZWVuIHVwbG9hZCBhdHRlbXB0cy4gVGhhdCBpcywgZXZlcnkgaW50ZXJ2YWwgaW4gd2hpY2gKKy8vIHdlIHBhY2thZ2UgdXAgdGhlIG5ldywgdW5sb2dnZWQsIG1ldHJpY3MgYW5kIGF0dGVtcHQgdXBsb2FkaW5nIHRoZW0uIEluCisvLyBDb2JhbHQncyBjYXNlLCB0aGlzIGlzIHRoZSBzaG9ydGVzdCBpbnRlcnZhbCBpbiB3aGljaCB3ZSdsbCBjYWxsIHRoZSBINXZjYworLy8gVXBsb2FkIEhhbmRsZXIuCitjb25zdCBpbnQga1N0YW5kYXJkVXBsb2FkSW50ZXJ2YWxTZWNvbmRzID0gNSAqIDYwOyAgLy8gNSBtaW51dGVzLgorCit2b2lkIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpTZXRPblVwbG9hZEhhbmRsZXIoCisgICAgY29uc3QgQ29iYWx0TWV0cmljc1VwbG9hZGVyQ2FsbGJhY2sqIHVwbG9hZGVyX2NhbGxiYWNrKSB7CisgIHVwbG9hZF9oYW5kbGVyXyA9IHVwbG9hZGVyX2NhbGxiYWNrOworICBpZiAobG9nX3VwbG9hZGVyXykgeworICAgIGxvZ191cGxvYWRlcl8tPlNldE9uVXBsb2FkSGFuZGxlcih1cGxvYWRfaGFuZGxlcl8pOworICB9Cit9CisKK0NvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudCgKKyAgICA6Om1ldHJpY3M6Ok1ldHJpY3NTdGF0ZU1hbmFnZXIqIHN0YXRlX21hbmFnZXIsIFByZWZTZXJ2aWNlKiBsb2NhbF9zdGF0ZSkKKyAgICA6IG1ldHJpY3Nfc3RhdGVfbWFuYWdlcl8oc3RhdGVfbWFuYWdlcikgeworICBtZXRyaWNzX3NlcnZpY2VfID0gc3RkOjptYWtlX3VuaXF1ZTw6Om1ldHJpY3M6Ok1ldHJpY3NTZXJ2aWNlPigKKyAgICAgIG1ldHJpY3Nfc3RhdGVfbWFuYWdlcl8sIHRoaXMsIGxvY2FsX3N0YXRlKTsKK30KKworOjptZXRyaWNzOjpNZXRyaWNzU2VydmljZSogQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OkdldE1ldHJpY3NTZXJ2aWNlKCkgeworICByZXR1cm4gbWV0cmljc19zZXJ2aWNlXy5nZXQoKTsKK30KKwordWttOjpVa21TZXJ2aWNlKiBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6R2V0VWttU2VydmljZSgpIHsKKyAgLy8gVE9ETyhiLzI4NDQ2NzE0Mik6IFVLTSBkaXNhYmxlZCBpbiBDb2JhbHQgY3VycmVudGx5LCByZXBsYWNlIHdoZW4gVUtNCisgIC8vIGlzIHN1cHBvcnRlZC4KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OlNldE1ldHJpY3NDbGllbnRJZCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2xpZW50X2lkKSB7CisgIC8vIFRPRE8oYi8yODYwNjYwMzUpOiBXaGF0IHRvIGRvIHdpdGggY2xpZW50IGlkIGhlcmU/Cit9CisKKy8vIFRPRE8oYi8yODY4ODQ1NDIpOiBBdWRpdCBhbGwgc3R1YiBpbXBsZW1lbnRhdGlvbnMgaW4gdGhpcyBjbGFzcyBhbmQgcmVhZmZpcm0KKy8vIHRoZXkncmUgbm90IG5lZWRlZCBhbmQvb3IgYWRkIGEgcmVhc29uYWJsZSBpbXBsZW1lbnRhdGlvbi4KK2ludDMyX3QgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OkdldFByb2R1Y3QoKSB7CisgIC8vIE5vdGUsIFByb2R1Y3QgaXMgYSBDaHJvbWUgY29uY2VwdCBhbmQgc2ltaWxhciBkaW1lbnNpb25zIHdpbGwgZ2V0IGxvZ2dlZAorICAvLyBlbHNld2hlcmUgZG93bnN0cmVhbS4gVGhpcyB2YWx1ZSBkb2Vzbid0IG1hdHRlci4KKyAgcmV0dXJuIDA7Cit9CisKK3N0ZDo6c3RyaW5nIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpHZXRBcHBsaWNhdGlvbkxvY2FsZSgpIHsKKyAgLy8gVGhlIGxvY2FsZSB3aWxsIGJlIHBvcHVsYXRlZCBieSB0aGUgd2ViIGNsaWVudCwgc28gcmV0dXJuIHZhbHVlIGlzCisgIC8vIGluY29uc2VxdWVudGlhbC4KKyAgcmV0dXJuICJlbi1VUyI7Cit9CisKK2Jvb2wgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OkdldEJyYW5kKHN0ZDo6c3RyaW5nKiBicmFuZF9jb2RlKSB7CisgIC8vICJmYWxzZSIgbWVhbnMgbm8gYnJhbmQgY29kZSBhdmFpbGFibGUuIFdlIHNldCB0aGUgYnJhbmQgd2hlbiB1cGxvYWRpbmcKKyAgLy8gdmlhIEdFTC4KKyAgcmV0dXJuIGZhbHNlOworfQorCis6Om1ldHJpY3M6OlN5c3RlbVByb2ZpbGVQcm90bzo6Q2hhbm5lbAorQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OkdldENoYW5uZWwoKSB7CisgIC8vIFdlIGFyZW4ndCBDaHJvbWUgYW5kIGRvbid0IGZvbGxvdyB0aGUgc2FtZSByZWxlYXNlIGNoYW5uZWwgY29uY2VwdC4KKyAgLy8gUmV0dXJuIHZhbHVlIGhlcmUgaXMgdW51c2VkIGluIGRvd25zdHJlYW0gbG9nZ2luZy4KKyAgcmV0dXJuIDo6bWV0cmljczo6U3lzdGVtUHJvZmlsZVByb3RvOjpDSEFOTkVMX1VOS05PV047Cit9CisKK3N0ZDo6c3RyaW5nIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpHZXRWZXJzaW9uU3RyaW5nKCkgeworICAvLyBXZSBhc3N1bWUgdGhlIHdlYiBjbGllbnQgd2lsbCBsb2cgdGhlIENvYmFsdCB2ZXJzaW9uIGFsb25nIHdpdGggaXRzIHBheWxvYWQKKyAgLy8gc28gdGhpcyBmaWVsZCBpcyBub3QgdGhhdCBpbXBvcnRhbnQuCisgIHJldHVybiAiMS4wIjsKK30KKwordm9pZCBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6T25FbnZpcm9ubWVudFVwZGF0ZSgKKyAgICBzdGQ6OnN0cmluZyogc2VyaWFsaXplZF9lbnZpcm9ubWVudCkgeworICAvLyBFbnZpcm9ubWVudCB1cGRhdGVzIGFyZSBzZXJpYWxpemVkIFN5c3RlbVByb2ZpbGVQcm90byBjaGFuZ2VzLiBBbGwKKyAgLy8gc3lzdGVtIGluZm8gc2hvdWxkIGJlIHJlcG9ydGVkIHdpdGggdGhlIHdlYiBjbGllbnQsIHNvIHRoaXMgaXMgYSBuby1vcC4KK30KKwordm9pZCBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6Q29sbGVjdEZpbmFsTWV0cmljc0ZvckxvZygKKyAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkb25lX2NhbGxiYWNrKSB7CisgIC8vIEFueSBob29rcyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGVhY2ggbmV3IGxvZyBpcyB1cGxvYWRlZCwgZ29lcyBoZXJlLgorICAvLyBDaHJvbWUgdXNlcyB0aGlzIHRvIHVwZGF0ZSBtZW1vcnkgaGlzdG9ncmFtcy4gUmVnYXJkbGVzcywgeW91IG11c3QgY2FsbAorICAvLyBkb25lX2NhbGxiYWNrIHdoZW4gZG9uZSBlbHNlIHRoZSB1cGxvYWRlciB3aWxsIG5ldmVyIGdldCBpbnZva2VkLgorICBzdGQ6Om1vdmUoZG9uZV9jYWxsYmFjaykuUnVuKCk7CisKKyAgLy8gTWV0cmljc1NlcnZpY2Ugd2lsbCBzaHV0IGl0c2VsZiBkb3duIGlmIHRoZSBhcHAgZG9lc24ndCBwZXJpb2RpY2FsbHkgdGVsbAorICAvLyBpdCBpdCdzIG5vdCBpZGxlLiBJbiBDb2JhbHQncyBjYXNlLCB3ZSBkb24ndCB3YW50IHRoaXMgYmVoYXZpb3IuIFdhdGNoCisgIC8vIHNlc3Npb25zIGZvciBMUiBjYW4gaGFwcGVuIGZvciBleHRlbmRlZCBwZXJpb2RzIG9mIHRpbWUgd2l0aCBubyBhY3Rpb24gYnkKKyAgLy8gdGhlIHVzZXIuIFNvLCB3ZSBhbHdheXMganVzdCBzZXQgdGhlIGFwcCBhcyAibm9uLWlkbGUiIGltbWVkaWF0ZWx5IGFmdGVyCisgIC8vIGVhY2ggbWV0cmljIGxvZyBpcyBmaW5hbGl6ZWQuCisgIEdldE1ldHJpY3NTZXJ2aWNlKCktPk9uQXBwbGljYXRpb25Ob3RJZGxlKCk7Cit9CisKK3N0ZDo6c3RyaW5nIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpHZXRNZXRyaWNzU2VydmVyVXJsKCkgeworICAvLyBDb2JhbHQgZG9lc24ndCB1cGxvYWQgYW55dGhpbmcgaXRzZWxmLCBzbyBhbnkgVVJMcyBhcmUgbm8tb3BzLgorICByZXR1cm4gIiI7Cit9CisKK3N0ZDo6c3RyaW5nIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpHZXRJbnNlY3VyZU1ldHJpY3NTZXJ2ZXJVcmwoKSB7CisgIC8vIENvYmFsdCBkb2Vzbid0IHVwbG9hZCBhbnl0aGluZyBpdHNlbGYsIHNvIGFueSBVUkxzIGFyZSBuby1vcHMuCisgIHJldHVybiAiIjsKK30KKworc3RkOjp1bmlxdWVfcHRyPDo6bWV0cmljczo6TWV0cmljc0xvZ1VwbG9hZGVyPgorQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OkNyZWF0ZVVwbG9hZGVyKAorICAgIGJhc2U6OlN0cmluZ1BpZWNlIHNlcnZlcl91cmwsIGJhc2U6OlN0cmluZ1BpZWNlIGluc2VjdXJlX3NlcnZlcl91cmwsCisgICAgYmFzZTo6U3RyaW5nUGllY2UgbWltZV90eXBlLAorICAgIDo6bWV0cmljczo6TWV0cmljc0xvZ1VwbG9hZGVyOjpNZXRyaWNTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsCisgICAgY29uc3QgOjptZXRyaWNzOjpNZXRyaWNzTG9nVXBsb2FkZXI6OlVwbG9hZENhbGxiYWNrJiBvbl91cGxvYWRfY29tcGxldGUpIHsKKyAgYXV0byB1cGxvYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q29iYWx0TWV0cmljc0xvZ1VwbG9hZGVyPigKKyAgICAgIHNlcnZpY2VfdHlwZSwgb25fdXBsb2FkX2NvbXBsZXRlKTsKKyAgbG9nX3VwbG9hZGVyXyA9IHVwbG9hZGVyLmdldCgpOworICBpZiAodXBsb2FkX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKKyAgICBsb2dfdXBsb2FkZXJfLT5TZXRPblVwbG9hZEhhbmRsZXIodXBsb2FkX2hhbmRsZXJfKTsKKyAgfQorICByZXR1cm4gdXBsb2FkZXI7Cit9CisKK2Jhc2U6OlRpbWVEZWx0YSBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6R2V0U3RhbmRhcmRVcGxvYWRJbnRlcnZhbCgpIHsKKyAgcmV0dXJuIGN1c3RvbV91cGxvYWRfaW50ZXJ2YWxfICE9IFVJTlQzMl9NQVgKKyAgICAgICAgICAgICA/IGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoY3VzdG9tX3VwbG9hZF9pbnRlcnZhbF8pCisgICAgICAgICAgICAgOiBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKGtTdGFuZGFyZFVwbG9hZEludGVydmFsU2Vjb25kcyk7Cit9CisKK2Jvb2wgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OklzUmVwb3J0aW5nUG9saWN5TWFuYWdlZCgpIHsKKyAgLy8gQ29uY2VwdCBvZiAibWFuYWdlZCIgcmVwb3J0aW5nIHBvbGljeSBub3QgYXBwbGljYWJsZSB0byBDb2JhbHQuCisgIHJldHVybiBmYWxzZTsKK30KKworOjptZXRyaWNzOjpFbmFibGVNZXRyaWNzRGVmYXVsdAorQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OkdldE1ldHJpY3NSZXBvcnRpbmdEZWZhdWx0U3RhdGUoKSB7CisgIC8vIE1ldHJpY3MgYWx3YXlzIGVuYWJsZWQgZm9yIENvYmFsdCwgYnV0IHRoaXMgImRlZmF1bHQgc3RhdGUiIGlzIHVudXNlZCwKKyAgLy8gc28gaXQncyBvbmx5IHNldCB0byBpdHMgc2VtYW50aWNhbGx5IGNvcnJlY3Qgc3RhdGUgKGNoZWNrZWQpIG91dCBvZgorICAvLyBwcmluY2lwbGUuCisgIHJldHVybiA6Om1ldHJpY3M6OkVuYWJsZU1ldHJpY3NEZWZhdWx0OjpPUFRfT1VUOworfQorCitib29sIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpJc1VNQUNlbGx1bGFyVXBsb2FkTG9naWNFbmFibGVkKCkgeworICAvLyBDb2JhbHQgd2lsbCBuZXZlciBydW4gaW4gYSBzcGVjaWFsIHdheSBmb3IgY2VsbHVsYXIgY29ubmVjdGlvbnMuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6U3luY1N0YXRlQWxsb3dzVWttKCkgeworICAvLyBVS00gY3VycmVudGx5IG5vdCB1c2VkLiBWYWx1ZSBkb2Vzbid0IG1hdHRlciBoZXJlLgorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ6OlN5bmNTdGF0ZUFsbG93c0V4dGVuc2lvblVrbSgpIHsKKyAgLy8gVE9ETyhiLzI4NDQ2NzE0Mik6IFJldmlzaXQgd2hlbiBlbmFibGluZyBVS00uCisgIC8vIFVLTSBjdXJyZW50bHkgbm90IHVzZWQuIFZhbHVlIGRvZXNuJ3QgbWF0dGVyIGhlcmUuCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6CisgICAgQXJlTm90aWZpY2F0aW9uTGlzdGVuZXJzRW5hYmxlZE9uQWxsUHJvZmlsZXMoKSB7CisgIC8vIE5vdGlmaWNhdGlvbiBsaXN0ZW5lcnMgY3VycmVudGx5IHVudXNlZC4KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnN0cmluZyBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudDo6R2V0QXBwUGFja2FnZU5hbWUoKSB7CisgIC8vIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlzIGxvZ2dlZCBlbHNld2hlcmUsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBlbXB0eS4KKyAgcmV0dXJuICIiOworfQorCit2b2lkIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50OjpTZXRVcGxvYWRJbnRlcnZhbCh1aW50MzJfdCBpbnRlcnZhbF9zZWNvbmRzKSB7CisgIGlmIChpbnRlcnZhbF9zZWNvbmRzID4gMCkgeworICAgIGN1c3RvbV91cGxvYWRfaW50ZXJ2YWxfID0gaW50ZXJ2YWxfc2Vjb25kczsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZV9jbGllbnQuaCBiL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZV9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzg2MGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlX2NsaWVudC5oCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0JST1dTRVJfTUVUUklDU19DT0JBTFRfTUVUUklDU19TRVJWSUNFX0NMSUVOVF9IXworI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9NRVRSSUNTX1NFUlZJQ0VfQ0xJRU5UX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZzE2LmgiCisjaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9lbmFibGVkX3N0YXRlX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19sb2dfdXBsb2FkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3VwbG9hZGVyX2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3NfbG9nX3VwbG9hZGVyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3NfcmVwb3J0aW5nX2RlZmF1bHRfc3RhdGUuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19zZXJ2aWNlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3Nfc2VydmljZV9jbGllbnQuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19zdGF0ZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbWV0cmljc19wcm90by9zeXN0ZW1fcHJvZmlsZS5wYi5oIgorCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJyb3dzZXIgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitjbGFzcyBNZXRyaWNzTG9nVXBsb2FkZXI7CitjbGFzcyBNZXRyaWNzU2VydmljZTsKKworLy8gQSBDb2JhbHQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgTWV0cmljcyBTZXJ2aWNlIENsaWVudC4gVGhpcyBpcyB0aGUKKy8vIHByaW1hcnkgaW50ZXJhY3Rpb24gcG9pbnQgdG8gcHJvdmlkZSAiZW1iZWRkZXIiIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucworLy8gdG8gc3VwcG9ydCB0aGUgbWV0cmljJ3Mgc2VydmljZS4KK2NsYXNzIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50IDogcHVibGljIDo6bWV0cmljczo6TWV0cmljc1NlcnZpY2VDbGllbnQgeworIHB1YmxpYzoKKyAgfkNvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50KCkgb3ZlcnJpZGV7fTsKKworICAvLyBTZXRzIHRoZSB1cGxvYWRlciBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIG1ldHJpY3MgYXJlIHJlYWR5IGZvcgorICAvLyB1cGxvYWQuCisgIHZvaWQgU2V0T25VcGxvYWRIYW5kbGVyKAorICAgICAgY29uc3QgQ29iYWx0TWV0cmljc1VwbG9hZGVyQ2FsbGJhY2sqIHVwbG9hZGVyX2NhbGxiYWNrKTsKKworICAvLyBSZXR1cm5zIHRoZSBNZXRyaWNzU2VydmljZSBpbnN0YW5jZSB0aGF0IHRoaXMgY2xpZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgLy8gV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRlc3RpbmcgY29udGV4dHMsIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBtdXN0IGJlIHZhbGlkCisgIC8vIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QgKHR5cGljYWxseSwgdGhlIGVtYmVkZGVyJ3MgY2xpZW50CisgIC8vIGltcGxlbWVudGF0aW9uIHdpbGwgb3duIHRoZSBNZXRyaWNzU2VydmljZSBpbnN0YW5jZSBiZWluZyByZXR1cm5lZCkuCisgIDo6bWV0cmljczo6TWV0cmljc1NlcnZpY2UqIEdldE1ldHJpY3NTZXJ2aWNlKCkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgVWttU2VydmljZSBpbnN0YW5jZSB0aGF0IHRoaXMgY2xpZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgdWttOjpVa21TZXJ2aWNlKiBHZXRVa21TZXJ2aWNlKCkgb3ZlcnJpZGU7CisKKyAgLy8gUmVnaXN0ZXJzIHRoZSBjbGllbnQgaWQgd2l0aCBvdGhlciBzZXJ2aWNlcyAoZS5nLiBjcmFzaCByZXBvcnRpbmcpLCBjYWxsZWQKKyAgLy8gd2hlbiBtZXRyaWNzIHJlY29yZGluZyBnZXRzIGVuYWJsZWQuCisgIHZvaWQgU2V0TWV0cmljc0NsaWVudElkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGllbnRfaWQpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgdGhlIHByb2R1Y3QgdmFsdWUgdG8gdXNlIGluIHVwbG9hZGVkIHJlcG9ydHMsIHdoaWNoIHdpbGwgYmUgdXNlZCB0bworICAvLyBzZXQgdGhlIENocm9tZVVzZXJNZXRyaWNzRXh0ZW5zaW9uLnByb2R1Y3QgZmllbGQuIFNlZSBjb21tZW50cyBvbiB0aGF0CisgIC8vIGZpZWxkIG9uIHdoeSBpdCdzIGFuIGludDMyX3QgcmF0aGVyIHRoYW4gYW4gZW51bS4KKyAgaW50MzJfdCBHZXRQcm9kdWN0KCkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBsb2NhbGUgKGUuZy4gImVuLVVTIikuCisgIHN0ZDo6c3RyaW5nIEdldEFwcGxpY2F0aW9uTG9jYWxlKCkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0cmlldmVzIHRoZSBicmFuZCBjb2RlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RhbGwsIHJldHVybmluZworICAvLyBmYWxzZSBpZiBubyBicmFuZCBjb2RlIGlzIGF2YWlsYWJsZS4KKyAgYm9vbCBHZXRCcmFuZChzdGQ6OnN0cmluZyogYnJhbmRfY29kZSkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgcmVsZWFzZSBjaGFubmVsIChlLmcuIHN0YWJsZSwgYmV0YSwgZXRjKSBvZiB0aGUgYXBwbGljYXRpb24uCisgIDo6bWV0cmljczo6U3lzdGVtUHJvZmlsZVByb3RvOjpDaGFubmVsIEdldENoYW5uZWwoKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBhcyBhIHN0cmluZy4KKyAgc3RkOjpzdHJpbmcgR2V0VmVyc2lvblN0cmluZygpIG92ZXJyaWRlOworCisgIC8vIENhbGxlZCBieSB0aGUgbWV0cmljcyBzZXJ2aWNlIHdoZW4gYSBuZXcgZW52aXJvbm1lbnQgaGFzIGJlZW4gcmVjb3JkZWQuCisgIC8vIFRha2VzIHRoZSBzZXJpYWxpemVkIGVudmlyb25tZW50IGFzIGEgcGFyYW1ldGVyLiBUaGUgY29udGVudHMgb2YKKyAgLy8gfHNlcmlhbGl6ZWRfZW52aXJvbm1lbnR8IGFyZSBjb25zdW1lZCBieSB0aGUgY2FsbCwgYnV0IHRoZSBjYWxsZXIgbWFpbnRhaW5zCisgIC8vIG93bmVyc2hpcC4KKyAgdm9pZCBPbkVudmlyb25tZW50VXBkYXRlKHN0ZDo6c3RyaW5nKiBzZXJpYWxpemVkX2Vudmlyb25tZW50KSBvdmVycmlkZTsKKworICAvLyBDYWxsZWQgYnkgdGhlIG1ldHJpY3Mgc2VydmljZSB0byByZWNvcmQgYSBjbGVhbiBzaHV0ZG93bi4KKyAgdm9pZCBPbkxvZ0NsZWFuU2h1dGRvd24oKSBvdmVycmlkZSB7fQorCisgIC8vIENhbGxlZCBwcmlvciB0byBhIG1ldHJpY3MgbG9nIGJlaW5nIGNsb3NlZCwgYWxsb3dpbmcgdGhlIGNsaWVudCB0bworICAvLyBjb2xsZWN0IGV4dHJhIGhpc3RvZ3JhbXMgdGhhdCB3aWxsIGdvIGluIHRoYXQgbG9nLiBBc3luY2hyb25vdXMgQVBJIC0KKyAgLy8gdGhlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY2FsbCB8ZG9uZV9jYWxsYmFja3wgd2hlbiBjb21wbGV0ZS4KKyAgdm9pZCBDb2xsZWN0RmluYWxNZXRyaWNzRm9yTG9nKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRvbmVfY2FsbGJhY2spIG92ZXJyaWRlOworCisgIC8vIEdldCB0aGUgVVJMIG9mIHRoZSBtZXRyaWNzIHNlcnZlci4KKyAgc3RkOjpzdHJpbmcgR2V0TWV0cmljc1NlcnZlclVybCgpIG92ZXJyaWRlOworCisgIC8vIEdldCB0aGUgZmFsbGJhY2sgSFRUUCBVUkwgb2YgdGhlIG1ldHJpY3Mgc2VydmVyLgorICBzdGQ6OnN0cmluZyBHZXRJbnNlY3VyZU1ldHJpY3NTZXJ2ZXJVcmwoKSBvdmVycmlkZTsKKworICAvLyBDcmVhdGVzIGEgTWV0cmljc0xvZ1VwbG9hZGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIChzZWUgY29tbWVudHMgb24KKyAgLy8gTWV0cmljc0xvZ1VwbG9hZGVyIGZvciBkZXRhaWxzKS4KKyAgc3RkOjp1bmlxdWVfcHRyPDo6bWV0cmljczo6TWV0cmljc0xvZ1VwbG9hZGVyPiBDcmVhdGVVcGxvYWRlcigKKyAgICAgIGJhc2U6OlN0cmluZ1BpZWNlIHNlcnZlcl91cmwsIGJhc2U6OlN0cmluZ1BpZWNlIGluc2VjdXJlX3NlcnZlcl91cmwsCisgICAgICBiYXNlOjpTdHJpbmdQaWVjZSBtaW1lX3R5cGUsCisgICAgICA6Om1ldHJpY3M6Ok1ldHJpY3NMb2dVcGxvYWRlcjo6TWV0cmljU2VydmljZVR5cGUgc2VydmljZV90eXBlLAorICAgICAgY29uc3QgOjptZXRyaWNzOjpNZXRyaWNzTG9nVXBsb2FkZXI6OlVwbG9hZENhbGxiYWNrJiBvbl91cGxvYWRfY29tcGxldGUpCisgICAgICBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBpbnRlcnZhbCBiZXR3ZWVuIHVwbG9hZCBhdHRlbXB0cy4KKyAgYmFzZTo6VGltZURlbHRhIEdldFN0YW5kYXJkVXBsb2FkSW50ZXJ2YWwoKSBvdmVycmlkZTsKKworICAvLyBDYWxsZWQgb24gcGx1Z2luIGxvYWRpbmcgZXJyb3JzLgorICB2b2lkIE9uUGx1Z2luTG9hZGluZ0Vycm9yKGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBwbHVnaW5fcGF0aCkgb3ZlcnJpZGUge30KKworICAvLyBDYWxsZWQgb24gcmVuZGVyZXIgY3Jhc2hlcyBpbiBzb21lIGVtYmVkZGVycyAoZS5nLiwgdGhvc2UgdGhhdCBkbyBub3QgdXNlCisgIC8vIC8vY29udGVudCBhbmQgdGh1cyBkbyBub3QgaGF2ZSAvL2NvbnRlbnQncyBub3RpZmljYXRpb24gc3lzdGVtIGF2YWlsYWJsZQorICAvLyBhcyBhIG1lY2hhbmlzbSBmb3Igb2JzZXJ2aW5nIHJlbmRlcmVyIGNyYXNoZXMpLgorICB2b2lkIE9uUmVuZGVyZXJQcm9jZXNzQ3Jhc2goKSBvdmVycmlkZSB7fQorCisgIC8vIFJldHVybnMgd2hldGhlciBtZXRyaWNzIHJlcG9ydGluZyBpcyBtYW5hZ2VkIGJ5IHBvbGljeS4KKyAgYm9vbCBJc1JlcG9ydGluZ1BvbGljeU1hbmFnZWQoKSBvdmVycmlkZTsKKworICAvLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbWV0cmljcyByZXBvcnRpbmcgY2hlY2tib3gKKyAgLy8gc2hvd24gZHVyaW5nIGZpcnN0LXJ1bi4KKyAgOjptZXRyaWNzOjpFbmFibGVNZXRyaWNzRGVmYXVsdCBHZXRNZXRyaWNzUmVwb3J0aW5nRGVmYXVsdFN0YXRlKCkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB3aGV0aGVyIGNlbGx1bGFyIGxvZ2ljIGlzIGVuYWJsZWQgZm9yIG1ldHJpY3MgcmVwb3J0aW5nLgorICBib29sIElzVU1BQ2VsbHVsYXJVcGxvYWRMb2dpY0VuYWJsZWQoKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHN5bmMgaXMgaW4gYSBzdGF0ZSB0aGF0IGFsbG93cyBVS00gdG8gYmUgZW5hYmxlZC4KKyAgLy8gU2VlIC8vY29tcG9uZW50cy91a20vb2JzZXJ2ZXJzL3N5bmNfZGlzYWJsZV9vYnNlcnZlci5oIGZvciBkZXRhaWxzLgorICBib29sIFN5bmNTdGF0ZUFsbG93c1VrbSgpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgc3luYyBpcyBpbiBhIHN0YXRlIHRoYXQgYWxsb3dzIFVLTSB0byBjYXB0dXJlIGV4dGVuc2lvbnMuCisgIC8vIFNlZSAvL2NvbXBvbmVudHMvdWttL29ic2VydmVycy9zeW5jX2Rpc2FibGVfb2JzZXJ2ZXIuaCBmb3IgZGV0YWlscy4KKyAgYm9vbCBTeW5jU3RhdGVBbGxvd3NFeHRlbnNpb25Va20oKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIHdoZXRoZXIgVUtNIG5vdGlmaWNhdGlvbiBsaXN0ZW5lcnMgd2VyZSBhdHRhY2hlZCB0byBhbGwgcHJvZmlsZXMuCisgIGJvb2wgQXJlTm90aWZpY2F0aW9uTGlzdGVuZXJzRW5hYmxlZE9uQWxsUHJvZmlsZXMoKSBvdmVycmlkZTsKKworICAvLyBHZXRzIHRoZSBDaHJvbWUgcGFja2FnZSBuYW1lIGZvciBBbmRyb2lkLiBSZXR1cm5zIGVtcHR5IHN0cmluZyBmb3Igb3RoZXIKKyAgLy8gcGxhdGZvcm1zLgorICBzdGQ6OnN0cmluZyBHZXRBcHBQYWNrYWdlTmFtZSgpIG92ZXJyaWRlOworCisgIC8vIFNldHRlciB0byBvdmVycmlkZSB0aGUgdXBsb2FkIGludGVydmFsIGRlZmF1bHQKKyAgLy8gKGtTdGFuZGFyZFVwbG9hZEludGVydmFsU2Vjb25kcykuCisgIHZvaWQgU2V0VXBsb2FkSW50ZXJ2YWwodWludDMyX3QgaW50ZXJ2YWxfc2Vjb25kcyk7CisKKyAgZXhwbGljaXQgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQoCisgICAgICA6Om1ldHJpY3M6Ok1ldHJpY3NTdGF0ZU1hbmFnZXIqIHN0YXRlX21hbmFnZXIsIFByZWZTZXJ2aWNlKiBsb2NhbF9zdGF0ZSk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgTWV0cmljc1N0YXRlTWFuYWdlciwgbXVzdCBvdXRsaXZlIHRoZSBNZXRyaWNzIFNlcnZpY2UuCisgIDo6bWV0cmljczo6TWV0cmljc1N0YXRlTWFuYWdlciogbWV0cmljc19zdGF0ZV9tYW5hZ2VyXzsKKworICAvLyBUaGUgTWV0cmljc1NlcnZpY2UgdGhhdCB8dGhpc3wgaXMgYSBjbGllbnQgb2YuCisgIHN0ZDo6dW5pcXVlX3B0cjw6Om1ldHJpY3M6Ok1ldHJpY3NTZXJ2aWNlPiBtZXRyaWNzX3NlcnZpY2VfOworCisgIENvYmFsdE1ldHJpY3NMb2dVcGxvYWRlciogbG9nX3VwbG9hZGVyXyA9IG51bGxwdHI7CisKKyAgY29uc3QgQ29iYWx0TWV0cmljc1VwbG9hZGVyQ2FsbGJhY2sqIHVwbG9hZF9oYW5kbGVyXyA9IG51bGxwdHI7CisKKyAgdWludDMyX3QgY3VzdG9tX3VwbG9hZF9pbnRlcnZhbF8gPSBVSU5UMzJfTUFYOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudCk7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9CUk9XU0VSX01FVFJJQ1NfQ09CQUxUX01FVFJJQ1NfU0VSVklDRV9DTElFTlRfSF8KZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZV9jbGllbnRfdGVzdC5jYyBiL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZV9jbGllbnRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDQ4MDhlCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlX2NsaWVudF90ZXN0LmNjCkBAIC0wLDAgKzEsMTI1IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcmVmcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9tZXRyaWNzL3VzZXJfbWV0cmljcy5oIgorI2luY2x1ZGUgImJhc2UvdGVzdC90ZXN0X3NpbXBsZV90YXNrX3J1bm5lci5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX2xvZ191cGxvYWRlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9jbGllbnRfaW5mby5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19zdGF0ZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy90ZXN0aW5nX3ByZWZfc2VydmljZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21ldHJpY3NfcHJvdG8vc3lzdGVtX3Byb2ZpbGUucGIuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYnJvd3NlciB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKK3ZvaWQgVGVzdFN0b3JlTWV0cmljc0NsaWVudEluZm8oY29uc3QgOjptZXRyaWNzOjpDbGllbnRJbmZvJiBjbGllbnRfaW5mbykgeworICAvLyBDbGllbnRJbmZvIGlzIGEgd2F5IHRvIGdldCBkYXRhIGludG8gdGhlIG1ldHJpY3MgY29tcG9uZW50LCBidXQgZ29lcyB1bnVzZWQKKyAgLy8gaW4gQ29iYWx0LiBEbyBub3RoaW5nIHdpdGggaXQgZm9yIG5vdy4KK30KKworc3RkOjp1bmlxdWVfcHRyPDo6bWV0cmljczo6Q2xpZW50SW5mbz4gVGVzdExvYWRNZXRyaWNzQ2xpZW50SW5mbygpIHsKKyAgLy8gQ2xpZW50SW5mbyBpcyBhIHdheSB0byBnZXQgZGF0YSBpbnRvIHRoZSBtZXRyaWNzIGNvbXBvbmVudCwgYnV0IGdvZXMgdW51c2VkCisgIC8vIGluIENvYmFsdC4KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NsYXNzIENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnRUZXN0KCkge30KKyAgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnRUZXN0KGNvbnN0IENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50VGVzdCYpID0KKyAgICAgIGRlbGV0ZTsKKyAgQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnRUZXN0JiBvcGVyYXRvcj0oCisgICAgICBjb25zdCBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudFRlc3QmKSA9IGRlbGV0ZTsKKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHRhc2tfcnVubmVyXyA9IGJhc2U6Ok1ha2VSZWZDb3VudGVkPGJhc2U6OlRlc3RTaW1wbGVUYXNrUnVubmVyPigpOworICAgIC8vIFJlcXVpcmVkIGJ5IE1ldHJpY3NTZXJ2aWNlQ2xpZW50LgorICAgIGJhc2U6OlNldFJlY29yZEFjdGlvblRhc2tSdW5uZXIodGFza19ydW5uZXJfKTsKKyAgICBlbmFibGVkX3N0YXRlX3Byb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q29iYWx0RW5hYmxlZFN0YXRlUHJvdmlkZXI+KGZhbHNlLCBmYWxzZSk7CisgICAgOjptZXRyaWNzOjpNZXRyaWNzU2VydmljZTo6UmVnaXN0ZXJQcmVmcyhwcmVmc18ucmVnaXN0cnkoKSk7CisgICAgbWV0cmljc19zdGF0ZV9tYW5hZ2VyXyA9IDo6bWV0cmljczo6TWV0cmljc1N0YXRlTWFuYWdlcjo6Q3JlYXRlKAorICAgICAgICAmcHJlZnNfLCBlbmFibGVkX3N0YXRlX3Byb3ZpZGVyXy5nZXQoKSwgYmFzZTo6c3RyaW5nMTYoKSwKKyAgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmVGVzdFN0b3JlTWV0cmljc0NsaWVudEluZm8pLAorICAgICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZUZXN0TG9hZE1ldHJpY3NDbGllbnRJbmZvKSk7CisKKyAgICBjbGllbnRfID0gc3RkOjptYWtlX3VuaXF1ZTxDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudD4oCisgICAgICAgIG1ldHJpY3Nfc3RhdGVfbWFuYWdlcl8uZ2V0KCksICZwcmVmc18pOworICB9CisKKyAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHt9CisKKworIHByb3RlY3RlZDoKKyAgc2NvcGVkX3JlZnB0cjxiYXNlOjpUZXN0U2ltcGxlVGFza1J1bm5lcj4gdGFza19ydW5uZXJfOworICBUZXN0aW5nUHJlZlNlcnZpY2VTaW1wbGUgcHJlZnNfOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnQ+IGNsaWVudF87CisgIHN0ZDo6dW5pcXVlX3B0cjw6Om1ldHJpY3M6Ok1ldHJpY3NTdGF0ZU1hbmFnZXI+IG1ldHJpY3Nfc3RhdGVfbWFuYWdlcl87CisgIHN0ZDo6dW5pcXVlX3B0cjxDb2JhbHRFbmFibGVkU3RhdGVQcm92aWRlcj4gZW5hYmxlZF9zdGF0ZV9wcm92aWRlcl87Cit9OworCitURVNUX0YoQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnRUZXN0LCBVa21TZXJ2aWNlQ29uc3RydWN0ZWRQcm9wZXJseSkgeworICAvLyBUT0RPKGIvMjg0NDY3MTQyKTogQWRkIFVLTSB0ZXN0cyB3aGVuIHN1cHBvcnQgaXMgYWRkZWQuCisgIEFTU0VSVF9FUShjbGllbnRfLT5HZXRVa21TZXJ2aWNlKCksIG51bGxwdHIpOworICBBU1NFUlRfRkFMU0UoY2xpZW50Xy0+U3luY1N0YXRlQWxsb3dzVWttKCkpOworICBBU1NFUlRfRkFMU0UoY2xpZW50Xy0+U3luY1N0YXRlQWxsb3dzRXh0ZW5zaW9uVWttKCkpOworfQorCisvLyBUT0RPKGIvMjg2ODg0NTQyKTogSWYgd2UgYWRkIHN5c3RlbSBwcm9maWxlIGluZm8sIHVwZGF0ZSB0aGlzIHRlc3QuCitURVNUX0YoQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnRUZXN0LCBUZXN0U3R1YmJlZFN5c3RlbUZpZWxkcykgeworICBBU1NFUlRfRVEoY2xpZW50Xy0+R2V0UHJvZHVjdCgpLCAwKTsKKyAgQVNTRVJUX0VRKGNsaWVudF8tPkdldEFwcGxpY2F0aW9uTG9jYWxlKCksICJlbi1VUyIpOworICBzdGQ6OnN0cmluZyBicmFuZF9jb2RlOworICBBU1NFUlRfRkFMU0UoY2xpZW50Xy0+R2V0QnJhbmQoJmJyYW5kX2NvZGUpKTsKKyAgQVNTRVJUX0VRKGJyYW5kX2NvZGUuc2l6ZSgpLCAwKTsKKyAgQVNTRVJUX0VRKGNsaWVudF8tPkdldENoYW5uZWwoKSwKKyAgICAgICAgICAgIDo6bWV0cmljczo6U3lzdGVtUHJvZmlsZVByb3RvOjpDSEFOTkVMX1VOS05PV04pOworICBBU1NFUlRfRVEoY2xpZW50Xy0+R2V0VmVyc2lvblN0cmluZygpLCAiMS4wIik7CisgIEFTU0VSVF9FUShjbGllbnRfLT5HZXRNZXRyaWNzU2VydmVyVXJsKCksICIiKTsKKyAgQVNTRVJUX0VRKGNsaWVudF8tPkdldEluc2VjdXJlTWV0cmljc1NlcnZlclVybCgpLCAiIik7CisgIEFTU0VSVF9GQUxTRShjbGllbnRfLT5Jc1JlcG9ydGluZ1BvbGljeU1hbmFnZWQoKSk7CisgIEFTU0VSVF9FUShjbGllbnRfLT5HZXRNZXRyaWNzUmVwb3J0aW5nRGVmYXVsdFN0YXRlKCksCisgICAgICAgICAgICA6Om1ldHJpY3M6OkVuYWJsZU1ldHJpY3NEZWZhdWx0OjpPUFRfT1VUKTsKKyAgQVNTRVJUX0ZBTFNFKGNsaWVudF8tPklzVU1BQ2VsbHVsYXJVcGxvYWRMb2dpY0VuYWJsZWQoKSk7CisgIEFTU0VSVF9GQUxTRShjbGllbnRfLT5BcmVOb3RpZmljYXRpb25MaXN0ZW5lcnNFbmFibGVkT25BbGxQcm9maWxlcygpKTsKKyAgQVNTRVJUX0VRKGNsaWVudF8tPkdldEFwcFBhY2thZ2VOYW1lKCksICIiKTsKK30KKworVEVTVF9GKENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50VGVzdCwgVXBsb2FkSW50ZXJ2YWxDYW5CZU92ZXJyaWRlbikgeworICBBU1NFUlRfRVEoY2xpZW50Xy0+R2V0U3RhbmRhcmRVcGxvYWRJbnRlcnZhbCgpLkluU2Vjb25kcygpLCAzMDApOworICBjbGllbnRfLT5TZXRVcGxvYWRJbnRlcnZhbCg0Mik7CisgIEFTU0VSVF9FUShjbGllbnRfLT5HZXRTdGFuZGFyZFVwbG9hZEludGVydmFsKCkuSW5TZWNvbmRzKCksIDQyKTsKKyAgY2xpZW50Xy0+U2V0VXBsb2FkSW50ZXJ2YWwoVUlOVDMyX01BWCk7CisgIC8vIFVJTlQzMl9NQVggaXMgdGhlIHNlbnRpbmVsIHZhbHVlIHRvIHJldmVydCBiYWNrIHRvIHRoZSBkZWZhdWx0IG9mIDUgbWluLgorICBBU1NFUlRfRVEoY2xpZW50Xy0+R2V0U3RhbmRhcmRVcGxvYWRJbnRlcnZhbCgpLkluU2Vjb25kcygpLCAzMDApOworfQorCitURVNUX0YoQ29iYWx0TWV0cmljc1NlcnZpY2VDbGllbnRUZXN0LCBVcGxvYWRJbnRlcnZhbE9mWmVyb0lzSWdub3JlZCkgeworICBBU1NFUlRfRVEoY2xpZW50Xy0+R2V0U3RhbmRhcmRVcGxvYWRJbnRlcnZhbCgpLkluU2Vjb25kcygpLCAzMDApOworICBjbGllbnRfLT5TZXRVcGxvYWRJbnRlcnZhbCgwKTsKKyAgQVNTRVJUX0VRKGNsaWVudF8tPkdldFN0YW5kYXJkVXBsb2FkSW50ZXJ2YWwoKS5JblNlY29uZHMoKSwgMzAwKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBicm93c2VyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuY2MgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NGQwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5jYwpAQCAtMCwwICsxLDk4IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZV9jbGllbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJyb3dzZXIgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyKiBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjppbnN0YW5jZV8gPSBudWxscHRyOworCitDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyKCkKKyAgICA6IHRhc2tfcnVubmVyXyhiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKSksCisgICAgICBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXI6Ok1ldHJpY3NTZXJ2aWNlc01hbmFnZXIoCisgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50PigpKSB7fQorCisKKy8vIFN0YXRpYyBTaW5nbGV0b24gZ2V0dGVyIGZvciBtZXRyaWNzIHNlcnZpY2VzIG1hbmFnZXIuCitDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyKiBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpIHsKKyAgaWYgKGluc3RhbmNlXyA9PSBudWxscHRyKSB7CisgICAgaW5zdGFuY2VfID0gbmV3IENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXIoKTsKKyAgfQorICByZXR1cm4gaW5zdGFuY2VfOworfQorCit2b2lkIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OkRlbGV0ZUluc3RhbmNlKCkgeyBkZWxldGUgaW5zdGFuY2VfOyB9CisKK3ZvaWQgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlcjo6U2V0T25VcGxvYWRIYW5kbGVyKAorICAgIGNvbnN0IENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrKiB1cGxvYWRlcl9jYWxsYmFjaykgeworICBpbnN0YW5jZV8tPnRhc2tfcnVubmVyXy0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kKCZDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpTZXRPblVwbG9hZEhhbmRsZXJJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChpbnN0YW5jZV8pLCB1cGxvYWRlcl9jYWxsYmFjaykpOworfQorCit2b2lkIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OlNldE9uVXBsb2FkSGFuZGxlckludGVybmFsKAorICAgIGNvbnN0IENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrKiB1cGxvYWRlcl9jYWxsYmFjaykgeworICBDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudCogY2xpZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50Kj4oR2V0TWV0cmljc1NlcnZpY2VDbGllbnQoKSk7CisgIERDSEVDSyhjbGllbnQpOworICBjbGllbnQtPlNldE9uVXBsb2FkSGFuZGxlcih1cGxvYWRlcl9jYWxsYmFjayk7Cit9CisKK3ZvaWQgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlcjo6VG9nZ2xlTWV0cmljc0VuYWJsZWQoYm9vbCBpc19lbmFibGVkKSB7CisgIGluc3RhbmNlXy0+dGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJkNvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OlRvZ2dsZU1ldHJpY3NFbmFibGVkSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaW5zdGFuY2VfKSwgaXNfZW5hYmxlZCkpOworfQordm9pZCBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpUb2dnbGVNZXRyaWNzRW5hYmxlZEludGVybmFsKAorICAgIGJvb2wgaXNfZW5hYmxlZCkgeworICBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50KiBjbGllbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudCo+KAorICAgICAgICAgIEdldE1ldHJpY3NTZXJ2aWNlc01hbmFnZXJDbGllbnQoKSk7CisgIERDSEVDSyhjbGllbnQpOworICBjbGllbnQtPkdldEVuYWJsZWRTdGF0ZVByb3ZpZGVyKCktPlNldENvbnNlbnRHaXZlbihpc19lbmFibGVkKTsKKyAgY2xpZW50LT5HZXRFbmFibGVkU3RhdGVQcm92aWRlcigpLT5TZXRSZXBvcnRpbmdFbmFibGVkKGlzX2VuYWJsZWQpOworICBVcGRhdGVVcGxvYWRQZXJtaXNzaW9ucyhpc19lbmFibGVkKTsKK30KKwordm9pZCBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpTZXRVcGxvYWRJbnRlcnZhbCgKKyAgICB1aW50MzJfdCBpbnRlcnZhbF9zZWNvbmRzKSB7CisgIGluc3RhbmNlXy0+dGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJkNvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OlNldFVwbG9hZEludGVydmFsSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaW5zdGFuY2VfKSwgaW50ZXJ2YWxfc2Vjb25kcykpOworfQorCit2b2lkIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OlNldFVwbG9hZEludGVydmFsSW50ZXJuYWwoCisgICAgdWludDMyX3QgaW50ZXJ2YWxfc2Vjb25kcykgeworICBicm93c2VyOjptZXRyaWNzOjpDb2JhbHRNZXRyaWNzU2VydmljZUNsaWVudCogY2xpZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PGJyb3dzZXI6Om1ldHJpY3M6OkNvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50Kj4oCisgICAgICAgICAgR2V0TWV0cmljc1NlcnZpY2VDbGllbnQoKSk7CisgIERDSEVDSyhjbGllbnQpOworICBjbGllbnQtPlNldFVwbG9hZEludGVydmFsKGludGVydmFsX3NlY29uZHMpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyLmggYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTMxMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyLmgKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyNpZm5kZWYgQ09CQUxUX0JST1dTRVJfTUVUUklDU19DT0JBTFRfTUVUUklDU19TRVJWSUNFU19NQU5BR0VSX0hfCisjZGVmaW5lIENPQkFMVF9CUk9XU0VSX01FVFJJQ1NfQ09CQUxUX01FVFJJQ1NfU0VSVklDRVNfTUFOQUdFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYmFzZS8vbWVtb3J5L3Njb3BlZF9yZWZwdHIuaCIKKyNpbmNsdWRlICJiYXNlL3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc191cGxvYWRlcl9jYWxsYmFjay5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuaCIKKworCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworCisvLyBQZXJzaXN0ZW50IHNldHRpbmcgbmFtZSBmb3IgdGhlIG1ldHJpYyBldmVudC91cGxvYWQgaW50ZXJ2YWwuCitjb25zdGV4cHIgY2hhciBrTWV0cmljRXZlbnRJbnRlcnZhbFNldHRpbmdOYW1lW10gPSAibWV0cmljRXZlbnRJbnRlcnZhbCI7CisKKy8vIFBlcnNpc3RlbnQgc2V0dGluZyBuYW1lIGZvciB3aGV0aGVyIG1ldHJpY3MgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCitjb25zdGV4cHIgY2hhciBrTWV0cmljRW5hYmxlZFNldHRpbmdOYW1lW10gPSAibWV0cmljc0VuYWJsZWRTdGF0ZSI7CisKKy8vIEEgc3RhdGljIHdyYXBwZXIgYXJvdW5kIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXIuIFdlIG5lZWQgYSB3YXkKKy8vIHRvIHByb3ZpZGUgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhlICJDb2JhbHRpZmllZCIgTWV0cmljc1NlcnZpY2VzTWFuYWdlciAoYW5kCisvLyBpdHMgcHVibGljIEFQSXMpIHRvIGNvbnRyb2wgbWV0cmljcyBiZWhhdmlvciBvdXRzaWRlIG9mIC8vY29iYWx0L2Jyb3dzZXIKKy8vIChlLmcuLCB2aWEgSDV2Y2MpLiBOb3RlLCBpdCdzIGltcG9ydGFudCB0aGF0IGFsbCBwdWJsaWMgbWV0aG9kcyBleGVjdXRlCisvLyBvbiB0aGUgc2FtZSB0aHJlYWQgaW4gd2hpY2ggQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlciB3YXMgY29uc3RydWN0ZWQuCisvLyBUaGlzIGlzIGEgcmVxdWlyZW1lbnQgb2YgdGhlIG1ldHJpY3MgY2xpZW50IGNvZGUuCitjbGFzcyBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyCisgICAgOiBwdWJsaWMgbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyOjpNZXRyaWNzU2VydmljZXNNYW5hZ2VyIHsKKyBwdWJsaWM6CisgIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXIoKTsKKworICAvLyBTdGF0aWMgU2luZ2xldG9uIGdldHRlciBmb3IgbWV0cmljcyBzZXJ2aWNlcyBtYW5hZ2VyLgorICBzdGF0aWMgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlciogR2V0SW5zdGFuY2UoKTsKKworICAvLyBEZXN0cnVjdHMgdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyLgorICBzdGF0aWMgdm9pZCBEZWxldGVJbnN0YW5jZSgpOworCisgIC8vIFNldHMgdGhlIHVwbG9hZCBoYW5kbGVyIG9udG8gdGhlIGN1cnJlbnQgc3RhdGljIGluc3RhbmNlIG9mCisgIC8vIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXIuCisgIHN0YXRpYyB2b2lkIFNldE9uVXBsb2FkSGFuZGxlcigKKyAgICAgIGNvbnN0IENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrKiB1cGxvYWRlcl9jYWxsYmFjayk7CisKKyAgLy8gVG9nZ2xlcyB3aGV0aGVyIG1ldHJpYyByZXBvcnRpbmcgaXMgZW5hYmxlZCB2aWEKKyAgLy8gQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlci4KKyAgc3RhdGljIHZvaWQgVG9nZ2xlTWV0cmljc0VuYWJsZWQoYm9vbCBpc19lbmFibGVkKTsKKworICAvLyBTZXRzIHRoZSB1cGxvYWQgaW50ZXJ2YWwgZm9yIG1ldHJpY3MgcmVwb3J0aW5nLiBUaGF0IGlzLCBob3cgb2Z0ZW4gYXJlCisgIC8vIG1ldHJpY3Mgc25hcHNob3R0ZWQgYW5kIGF0dGVtcHRlZCB0byB1cGxvYWQuCisgIHN0YXRpYyB2b2lkIFNldFVwbG9hZEludGVydmFsKHVpbnQzMl90IGludGVydmFsX3NlY29uZHMpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTZXRPblVwbG9hZEhhbmRsZXJJbnRlcm5hbCgKKyAgICAgIGNvbnN0IENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrKiB1cGxvYWRlcl9jYWxsYmFjayk7CisKKyAgdm9pZCBUb2dnbGVNZXRyaWNzRW5hYmxlZEludGVybmFsKGJvb2wgaXNfZW5hYmxlZCk7CisKKyAgdm9pZCBTZXRVcGxvYWRJbnRlcnZhbEludGVybmFsKHVpbnQzMl90IGludGVydmFsX3NlY29uZHMpOworCisgIHN0YXRpYyBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyKiBpbnN0YW5jZV87CisKKyAgLy8gVGhlIHRhc2sgcnVubmVyIG9mIHRoZSB0aHJlYWQgdGhpcyBjbGFzcyB3YXMgY29uc3RydWN0ZWQgb24uIEFsbCBsb2dpYworICAvLyBpbnRlcmFjdGluZyB3aXRoIGNvbnRhaW5pbmcgbWV0cmljcyBjbGFzc2VzIG11c3QgYmUgaW52b2tlZCBvbiB0aGlzCisgIC8vIHRhc2tfcnVubmVyIHRocmVhZC4KKyAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiBjb25zdCB0YXNrX3J1bm5lcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9NRVRSSUNTX1NFUlZJQ0VTX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuY2MgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmNjCkBAIC0wLDAgKzEsMTEyIEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrX2ZvcndhcmQuaCIKKyNpbmNsdWRlICJiYXNlL21ldHJpY3MvZmllbGRfdHJpYWwuaCIKKyNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL2NsaWVudF9pbmZvLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3Nfc2VydmljZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX3NlcnZpY2VfY2xpZW50LmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3Nfc3RhdGVfbWFuYWdlci5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3ByZWZzL2luX21lbW9yeV9wcmVmX3N0b3JlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3JlZ2lzdHJ5X3NpbXBsZS5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvcHJlZnMvcHJlZl9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9wcmVmcy9wcmVmX3NlcnZpY2VfZmFjdG9yeS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworc3RkOjp1bmlxdWVfcHRyPDo6bWV0cmljczo6TWV0cmljc1NlcnZpY2VDbGllbnQ+CitDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50OjpDcmVhdGVNZXRyaWNzU2VydmljZUNsaWVudCgpIHsKKyAgSW5pdGlhbGl6ZU1ldHJpY3NTdGF0ZU1hbmFnZXJBbmRMb2NhbFN0YXRlKCk7CisgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPENvYmFsdE1ldHJpY3NTZXJ2aWNlQ2xpZW50PigKKyAgICAgIG1ldHJpY3Nfc3RhdGVfbWFuYWdlcl8uZ2V0KCksIGxvY2FsX3N0YXRlXy5nZXQoKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxjb25zdCBiYXNlOjpGaWVsZFRyaWFsOjpFbnRyb3B5UHJvdmlkZXI+CitDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50OjpDcmVhdGVFbnRyb3B5UHJvdmlkZXIoKSB7CisgIC8vIENvYmFsdCBkb2Vzbid0IHVzZSBGaWVsZFRyaWFscywgc28gdGhpcyBpcyBhIG5vb3AuCisgIE5PVElNUExFTUVOVEVEKCk7CisgIHJldHVybiBudWxscHRyOworfQorCisvLyBSZXR1cm5zIHdoZXRoZXIgbWV0cmljcyByZXBvcnRpbmcgaXMgZW5hYmxlZC4KK2Jvb2wgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudDo6SXNNZXRyaWNzUmVwb3J0aW5nRW5hYmxlZCgpIHsKKyAgcmV0dXJuIGVuYWJsZWRfc3RhdGVfcHJvdmlkZXJfLT5Jc1JlcG9ydGluZ0VuYWJsZWQoKTsKK30KKworLy8gUmV0dXJucyB3aGV0aGVyIG1ldHJpY3MgY29uc2VudCBpcyBnaXZlbi4KK2Jvb2wgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudDo6SXNNZXRyaWNzQ29uc2VudEdpdmVuKCkgeworICByZXR1cm4gZW5hYmxlZF9zdGF0ZV9wcm92aWRlcl8tPklzQ29uc2VudEdpdmVuKCk7Cit9CisKKy8vIElmIHRoZSB1c2VyIGhhcyBmb3JjZWQgbWV0cmljcyBjb2xsZWN0aW9uIG9uIHZpYSB0aGUgb3ZlcnJpZGUgZmxhZy4KK2Jvb2wgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudDo6SXNNZXRyaWNzUmVwb3J0aW5nRm9yY2VFbmFibGVkKCkgeworICAvLyBUT0RPKGIvMjg2MDkxMDk2KTogQWRkIHN1cHBvcnQgZm9yIG1ldHJpY3MgbG9nZ2luZyBmb3JjaW5nLgorICByZXR1cm4gZmFsc2U7Cit9CisKKwordm9pZCBTdG9yZU1ldHJpY3NDbGllbnRJbmZvKGNvbnN0IDo6bWV0cmljczo6Q2xpZW50SW5mbyYgY2xpZW50X2luZm8pIHsKKyAgLy8gQ2xpZW50SW5mbyBpcyBhIHdheSB0byBnZXQgZGF0YSBpbnRvIHRoZSBtZXRyaWNzIGNvbXBvbmVudCwgYnV0IGdvZXMgdW51c2VkCisgIC8vIGluIENvYmFsdC4gRG8gbm90aGluZyB3aXRoIGl0IGZvciBub3cuCit9CisKK3N0ZDo6dW5pcXVlX3B0cjw6Om1ldHJpY3M6OkNsaWVudEluZm8+IExvYWRNZXRyaWNzQ2xpZW50SW5mbygpIHsKKyAgLy8gQ2xpZW50SW5mbyBpcyBhIHdheSB0byBnZXQgZGF0YSBpbnRvIHRoZSBtZXRyaWNzIGNvbXBvbmVudCwgYnV0IGdvZXMgdW51c2VkCisgIC8vIGluIENvYmFsdC4KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKzo6bWV0cmljczo6TWV0cmljc1N0YXRlTWFuYWdlcioKK0NvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXJDbGllbnQ6OkdldE1ldHJpY3NTdGF0ZU1hbmFnZXJGb3JUZXN0aW5nKCkgeworICByZXR1cm4gR2V0TWV0cmljc1N0YXRlTWFuYWdlcigpOworfQorCit2b2lkIENvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXJDbGllbnQ6OgorICAgIEluaXRpYWxpemVNZXRyaWNzU3RhdGVNYW5hZ2VyQW5kTG9jYWxTdGF0ZSgpIHsKKyAgaWYgKCFtZXRyaWNzX3N0YXRlX21hbmFnZXJfKSB7CisgICAgUHJlZlNlcnZpY2VGYWN0b3J5IHByZWZfc2VydmljZV9mYWN0b3J5OworICAgIHByZWZfc2VydmljZV9mYWN0b3J5LnNldF91c2VyX3ByZWZzKAorICAgICAgICBiYXNlOjpNYWtlUmVmQ291bnRlZDxJbk1lbW9yeVByZWZTdG9yZT4oKSk7CisKKyAgICBhdXRvIHByZWZfcmVnaXN0cnkgPSBiYXNlOjpNYWtlUmVmQ291bnRlZDxQcmVmUmVnaXN0cnlTaW1wbGU+KCk7CisKKyAgICAvLyBOb3RlLCB3ZSBtYWlubHkgY3JlYXRlIHRoZSBQcmVmIHN0b3JlIGhlcmUgdG8gYXBwZWFzZSBtZXRyaWNzIHN0YXRlCisgICAgLy8gbWFuYWdlci4gV2UgZG9uJ3QgcmVhbGx5IHVzZSBpdCB0aGUgc2FtZSB3YXkgQ2hyb21pdW0gZG9lcy4KKyAgICBsb2NhbF9zdGF0ZV8gPSBwcmVmX3NlcnZpY2VfZmFjdG9yeS5DcmVhdGUocHJlZl9yZWdpc3RyeSk7CisgICAgOjptZXRyaWNzOjpNZXRyaWNzU2VydmljZTo6UmVnaXN0ZXJQcmVmcyhwcmVmX3JlZ2lzdHJ5LmdldCgpKTsKKworICAgIG1ldHJpY3Nfc3RhdGVfbWFuYWdlcl8gPSA6Om1ldHJpY3M6Ok1ldHJpY3NTdGF0ZU1hbmFnZXI6OkNyZWF0ZSgKKyAgICAgICAgbG9jYWxfc3RhdGVfLmdldCgpLCBlbmFibGVkX3N0YXRlX3Byb3ZpZGVyXy5nZXQoKSwgYmFzZTo6c3RyaW5nMTYoKSwKKyAgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmU3RvcmVNZXRyaWNzQ2xpZW50SW5mbyksCisgICAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkxvYWRNZXRyaWNzQ2xpZW50SW5mbykpOworICB9Cit9CisKKzo6bWV0cmljczo6TWV0cmljc1N0YXRlTWFuYWdlcioKK0NvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXJDbGllbnQ6OkdldE1ldHJpY3NTdGF0ZU1hbmFnZXIoKSB7CisgIEluaXRpYWxpemVNZXRyaWNzU3RhdGVNYW5hZ2VyQW5kTG9jYWxTdGF0ZSgpOworICByZXR1cm4gbWV0cmljc19zdGF0ZV9tYW5hZ2VyXy5nZXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBicm93c2VyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmggYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhMmFlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuaApAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9NRVRSSUNTX1NFUlZJQ0VTX01BTkFHRVJfQ0xJRU5UX0hfCisjZGVmaW5lIENPQkFMVF9CUk9XU0VSX01FVFJJQ1NfQ09CQUxUX01FVFJJQ1NfU0VSVklDRVNfTUFOQUdFUl9DTElFTlRfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy9maWVsZF90cmlhbC5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X2VuYWJsZWRfc3RhdGVfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19zdGF0ZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudC5oIgorCituYW1lc3BhY2UgbWV0cmljcyB7CitjbGFzcyBNZXRyaWNzU2VydmljZUNsaWVudDsKK2NsYXNzIEVuYWJsZWRTdGF0ZVByb3ZpZGVyOworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKKworCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworLy8gQ29iYWx0IGltcGxlbWVudGF0aW9uIG9mIE1ldHJpY3NTZXJ2aWNlc01hbmFnZXJDbGllbnQuIFRvcCBsZXZlbCBtYW5hZ2VyCisvLyBvZiBtZXRyaWNzIHJlcG9ydGluZyBzdGF0ZSBhbmQgdXBsb2FkaW5nLgorY2xhc3MgQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudAorICAgIDogcHVibGljIG1ldHJpY3Nfc2VydmljZXNfbWFuYWdlcjo6TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudCB7CisgcHVibGljOgorICBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50KCkKKyAgICAgIDogZW5hYmxlZF9zdGF0ZV9wcm92aWRlcl8oCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyPihmYWxzZSwgZmFsc2UpKSB7fQorCisgIH5Db2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50KCkgb3ZlcnJpZGUge30KKworICBzdGQ6OnVuaXF1ZV9wdHI8OjptZXRyaWNzOjpNZXRyaWNzU2VydmljZUNsaWVudD4gQ3JlYXRlTWV0cmljc1NlcnZpY2VDbGllbnQoKQorICAgICAgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBiYXNlOjpGaWVsZFRyaWFsOjpFbnRyb3B5UHJvdmlkZXI+CisgIENyZWF0ZUVudHJvcHlQcm92aWRlcigpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgd2hldGhlciBtZXRyaWNzIHJlcG9ydGluZyBpcyBlbmFibGVkLgorICBib29sIElzTWV0cmljc1JlcG9ydGluZ0VuYWJsZWQoKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIHdoZXRoZXIgbWV0cmljcyBjb25zZW50IGlzIGdpdmVuLgorICBib29sIElzTWV0cmljc0NvbnNlbnRHaXZlbigpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgd2hldGhlciB0aGVyZSBhcmUgYW55IEluY29nbml0byBicm93c2Vycy90YWJzIG9wZW4uIENvYmFsdCBoYXMgbm8KKyAgLy8gaWNvZ25pdG8gbW9kZS4KKyAgYm9vbCBJc0luY29nbml0b1Nlc3Npb25BY3RpdmUoKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIFVwZGF0ZSB0aGUgcnVubmluZyBzdGF0ZSBvZiBtZXRyaWNzIHNlcnZpY2VzIG1hbmFnZWQgYnkgdGhlIGVtYmVkZGVyLCBmb3IKKyAgLy8gZXhhbXBsZSwgY3Jhc2ggcmVwb3J0aW5nLgorICB2b2lkIFVwZGF0ZVJ1bm5pbmdTZXJ2aWNlcyhib29sIG1heV9yZWNvcmQsIGJvb2wgbWF5X3VwbG9hZCkgb3ZlcnJpZGUge30KKworICAvLyBJZiB0aGUgdXNlciBoYXMgZm9yY2VkIG1ldHJpY3MgY29sbGVjdGlvbiBvbiB2aWEgdGhlIG92ZXJyaWRlIGZsYWcuCisgIGJvb2wgSXNNZXRyaWNzUmVwb3J0aW5nRm9yY2VFbmFibGVkKCkgb3ZlcnJpZGU7CisKKyAgQ29iYWx0RW5hYmxlZFN0YXRlUHJvdmlkZXIqIEdldEVuYWJsZWRTdGF0ZVByb3ZpZGVyKCkgeworICAgIHJldHVybiBlbmFibGVkX3N0YXRlX3Byb3ZpZGVyXy5nZXQoKTsKKyAgfQorCisgIC8vIFRlc3RpbmcgZ2V0dGVyIGZvciBzdGF0ZSBtYW5hZ2VyLgorICA6Om1ldHJpY3M6Ok1ldHJpY3NTdGF0ZU1hbmFnZXIqIEdldE1ldHJpY3NTdGF0ZU1hbmFnZXJGb3JUZXN0aW5nKCk7CisKKyBwcml2YXRlOgorICB2b2lkIEluaXRpYWxpemVNZXRyaWNzU3RhdGVNYW5hZ2VyQW5kTG9jYWxTdGF0ZSgpOworCisgIDo6bWV0cmljczo6TWV0cmljc1N0YXRlTWFuYWdlciogR2V0TWV0cmljc1N0YXRlTWFuYWdlcigpOworCisgIC8vIE1ldHJpY3NTdGF0ZU1hbmFnZXIgd2hpY2ggaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIHNlcnZpY2UgY29uc3RydWN0b3JzLgorICBzdGQ6OnVuaXF1ZV9wdHI8OjptZXRyaWNzOjpNZXRyaWNzU3RhdGVNYW5hZ2VyPiBtZXRyaWNzX3N0YXRlX21hbmFnZXJfOworCisgIC8vIEVuYWJsZWRTdGF0ZVByb3ZpZGVyIHRvIGNvbW11bmljYXRlIGlmIHRoZSBjbGllbnQgaGFzIGNvbnNlbnRlZCB0byBtZXRyaWNzCisgIC8vIHJlcG9ydGluZywgYW5kIGlmIGl0J3MgZW5hYmxlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPENvYmFsdEVuYWJsZWRTdGF0ZVByb3ZpZGVyPiBlbmFibGVkX3N0YXRlX3Byb3ZpZGVyXzsKKworICAvLyBBbnkgcHJlZnMvc3RhdGUgc3BlY2lmaWMgdG8gQ29iYWx0IE1ldHJpY3MuCisgIHN0ZDo6dW5pcXVlX3B0cjxQcmVmU2VydmljZT4gbG9jYWxfc3RhdGVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBicm93c2VyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0JST1dTRVJfTUVUUklDU19DT0JBTFRfTUVUUklDU19TRVJWSUNFU19NQU5BR0VSX0NMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudF90ZXN0LmNjIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmY4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50X3Rlc3QuY2MKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3JlZnB0ci5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy91c2VyX21ldHJpY3MuaCIKKyNpbmNsdWRlICJiYXNlL3Rlc3QvdGVzdF9zaW1wbGVfdGFza19ydW5uZXIuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL21ldHJpY3MvbWV0cmljc19zZXJ2aWNlX2NsaWVudC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworCitjbGFzcyBDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICB0YXNrX3J1bm5lcl8gPSBiYXNlOjpNYWtlUmVmQ291bnRlZDxiYXNlOjpUZXN0U2ltcGxlVGFza1J1bm5lcj4oKTsKKyAgICAvLyBSZXF1aXJlZCBieSBNZXRyaWNzU2VydmljZUNsaWVudC4KKyAgICBiYXNlOjpTZXRSZWNvcmRBY3Rpb25UYXNrUnVubmVyKHRhc2tfcnVubmVyXyk7CisgICAgY2xpZW50XyA9IHN0ZDo6bWFrZV91bmlxdWU8Q29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudD4oKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQorCisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50PiBjbGllbnRfOworICBzY29wZWRfcmVmcHRyPGJhc2U6OlRlc3RTaW1wbGVUYXNrUnVubmVyPiB0YXNrX3J1bm5lcl87Cit9OworCitURVNUX0YoQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudFRlc3QsCisgICAgICAgRW5hYmxlZFN0YXRlUHJvdmlkZXJTdGF0ZUlzUHJlc2VydmVkKSB7CisgIGF1dG8gcHJvdmlkZXIgPSBjbGllbnRfLT5HZXRFbmFibGVkU3RhdGVQcm92aWRlcigpOworICBwcm92aWRlci0+U2V0Q29uc2VudEdpdmVuKHRydWUpOworICBwcm92aWRlci0+U2V0UmVwb3J0aW5nRW5hYmxlZCh0cnVlKTsKKyAgRVhQRUNUX1RSVUUoY2xpZW50Xy0+SXNNZXRyaWNzQ29uc2VudEdpdmVuKCkpOworICBFWFBFQ1RfVFJVRShjbGllbnRfLT5Jc01ldHJpY3NSZXBvcnRpbmdFbmFibGVkKCkpOworCisgIHByb3ZpZGVyLT5TZXRDb25zZW50R2l2ZW4oZmFsc2UpOworICBwcm92aWRlci0+U2V0UmVwb3J0aW5nRW5hYmxlZChmYWxzZSk7CisgIEVYUEVDVF9GQUxTRShjbGllbnRfLT5Jc01ldHJpY3NDb25zZW50R2l2ZW4oKSk7CisgIEVYUEVDVF9GQUxTRShjbGllbnRfLT5Jc01ldHJpY3NSZXBvcnRpbmdFbmFibGVkKCkpOworfQorCitURVNUX0YoQ29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudFRlc3QsIEZvcmNlRW5hYmxlZFN0YXRlSXNDb3JyZWN0KSB7CisgIC8vIFRPRE8oYi8yODYwOTEwOTYpOiBBZGQgdGVzdHMgZm9yIGZvcmNlIGVuYWJsaW5nIG9uIHRoZSBjb21tYW5kLWxpbmUuCisgIEVYUEVDVF9GQUxTRShjbGllbnRfLT5Jc01ldHJpY3NSZXBvcnRpbmdGb3JjZUVuYWJsZWQoKSk7Cit9CisKK1RFU1RfRihDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyQ2xpZW50VGVzdCwKKyAgICAgICBNZXRyaWNzU2VydmljZUNsaWVudEFuZFN0YXRlTWFuYWdlckFyZUNvbnN0cnVjdGVkUHJvcGVybHkpIHsKKyAgYXV0byBtZXRyaWNzX2NsaWVudCA9IGNsaWVudF8tPkNyZWF0ZU1ldHJpY3NTZXJ2aWNlQ2xpZW50KCk7CisgIEFTU0VSVF9ORShtZXRyaWNzX2NsaWVudCwgbnVsbHB0cik7CisKKyAgYXV0byBwcm92aWRlciA9IGNsaWVudF8tPkdldEVuYWJsZWRTdGF0ZVByb3ZpZGVyKCk7CisgIHByb3ZpZGVyLT5TZXRDb25zZW50R2l2ZW4odHJ1ZSk7CisgIHByb3ZpZGVyLT5TZXRSZXBvcnRpbmdFbmFibGVkKHRydWUpOworCisgIEFTU0VSVF9UUlVFKAorICAgICAgY2xpZW50Xy0+R2V0TWV0cmljc1N0YXRlTWFuYWdlckZvclRlc3RpbmcoKS0+SXNNZXRyaWNzUmVwb3J0aW5nRW5hYmxlZCgpKTsKKworICBwcm92aWRlci0+U2V0Q29uc2VudEdpdmVuKGZhbHNlKTsKKyAgcHJvdmlkZXItPlNldFJlcG9ydGluZ0VuYWJsZWQoZmFsc2UpOworCisgIEFTU0VSVF9GQUxTRSgKKyAgICAgIGNsaWVudF8tPkdldE1ldHJpY3NTdGF0ZU1hbmFnZXJGb3JUZXN0aW5nKCktPklzTWV0cmljc1JlcG9ydGluZ0VuYWJsZWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc191cGxvYWRlcl9jYWxsYmFjay5oIGIvY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc191cGxvYWRlcl9jYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTgwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnJvd3Nlci9tZXRyaWNzL2NvYmFsdF9tZXRyaWNzX3VwbG9hZGVyX2NhbGxiYWNrLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9CUk9XU0VSX01FVFJJQ1NfQ09CQUxUX01FVFJJQ1NfVVBMT0FERVJfQ0FMTEJBQ0tfSF8KKyNkZWZpbmUgQ09CQUxUX0JST1dTRVJfTUVUUklDU19DT0JBTFRfTUVUUklDU19VUExPQURFUl9DQUxMQkFDS19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19tZXRyaWNfdHlwZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBicm93c2VyIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKwordHlwZWRlZiBiYXNlOjpSZXBlYXRpbmdDYWxsYmFjazx2b2lkKAorICAgIGNvbnN0IGNvYmFsdDo6aDV2Y2M6Okg1dmNjTWV0cmljVHlwZSYgbWV0cmljX3R5cGUsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRfcHJvdG8pPgorICAgIENvYmFsdE1ldHJpY3NVcGxvYWRlckNhbGxiYWNrOworCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfQlJPV1NFUl9NRVRSSUNTX0NPQkFMVF9NRVRSSUNTX1VQTE9BREVSX0NBTExCQUNLX0hfCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyeS5jYyBiL2NvYmFsdC9icm93c2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJ5LmNjCmluZGV4IDIzYTFhMWMuLmY1ZGQ0NjggMTAwNjQ0Ci0tLSBhL2NvYmFsdC9icm93c2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJ5LmNjCisrKyBiL2NvYmFsdC9icm93c2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJ5LmNjCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCiAjaW5jbHVkZSAiYmFzZS90cmFjZV9ldmVudC90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGJyb3dzZXIgewpAQCAtMzQsNyArMzMsNyBAQAogCiB2b2lkIFNlcnZpY2VXb3JrZXJSZWdpc3RyeTo6V2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AoKSB7CiAgIC8vIENsZWFyIGFsbCBtZW1iZXIgdmFyaWFibGVzIGFsbG9jYXRlZCBmcm9tIHRoZSB0aHJlYWQuCi0gIHNlcnZpY2Vfd29ya2VyX2pvYnNfLnJlc2V0KCk7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLnJlc2V0KCk7CiB9CiAKIFNlcnZpY2VXb3JrZXJSZWdpc3RyeTo6U2VydmljZVdvcmtlclJlZ2lzdHJ5KApAQCAtNzUsMjAgKzc0LDIwIEBACiAgIGRlc3RydWN0aW9uX29ic2VydmVyX2FkZGVkXy5XYWl0KCk7CiAgIERDSEVDS19ORSh0aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKICAgdGhyZWFkXy5TdG9wKCk7Ci0gIERDSEVDSyghc2VydmljZV93b3JrZXJfam9ic18pOworICBEQ0hFQ0soIXNlcnZpY2Vfd29ya2VyX2NvbnRleHRfKTsKIH0KIAogdm9pZCBTZXJ2aWNlV29ya2VyUmVnaXN0cnk6OkVuc3VyZVNlcnZpY2VXb3JrZXJTdGFydGVkKAogICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgY29uc3QgR1VSTCYgY2xpZW50X3VybCwKICAgICBiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KSB7Ci0gIHNlcnZpY2Vfd29ya2VyX2pvYnMoKS0+RW5zdXJlU2VydmljZVdvcmtlclN0YXJ0ZWQoc3RvcmFnZV9rZXksIGNsaWVudF91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV9ldmVudCk7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKS0+RW5zdXJlU2VydmljZVdvcmtlclN0YXJ0ZWQoc3RvcmFnZV9rZXksIGNsaWVudF91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV9ldmVudCk7CiB9CiAKLXdvcmtlcjo6U2VydmljZVdvcmtlckpvYnMqIFNlcnZpY2VXb3JrZXJSZWdpc3RyeTo6c2VydmljZV93b3JrZXJfam9icygpIHsKK3dvcmtlcjo6U2VydmljZVdvcmtlckNvbnRleHQqIFNlcnZpY2VXb3JrZXJSZWdpc3RyeTo6c2VydmljZV93b3JrZXJfY29udGV4dCgpIHsKICAgLy8gRW5zdXJlIHRoYXQgdGhlIHRocmVhZCBoYWQgYSBjaGFuY2UgdG8gYWxsb2NhdGUgdGhlIG9iamVjdC4KICAgZGVzdHJ1Y3Rpb25fb2JzZXJ2ZXJfYWRkZWRfLldhaXQoKTsKLSAgcmV0dXJuIHNlcnZpY2Vfd29ya2VyX2pvYnNfLmdldCgpOworICByZXR1cm4gc2VydmljZV93b3JrZXJfY29udGV4dF8uZ2V0KCk7CiB9CiAKIHZvaWQgU2VydmljZVdvcmtlclJlZ2lzdHJ5OjpJbml0aWFsaXplKApAQCAtOTYsNyArOTUsNyBAQAogICAgIHdlYjo6VXNlckFnZW50UGxhdGZvcm1JbmZvKiBwbGF0Zm9ybV9pbmZvLCBjb25zdCBHVVJMJiB1cmwpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiU2VydmljZVdvcmtlclJlZ2lzdHJ5OjpJbml0aWFsaXplKCkiKTsKICAgRENIRUNLX0VRKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcCgpKTsKLSAgc2VydmljZV93b3JrZXJfam9ic18ucmVzZXQobmV3IHdvcmtlcjo6U2VydmljZVdvcmtlckpvYnMoCisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLnJlc2V0KG5ldyB3b3JrZXI6OlNlcnZpY2VXb3JrZXJDb250ZXh0KAogICAgICAgd2ViX3NldHRpbmdzLCBuZXR3b3JrX21vZHVsZSwgcGxhdGZvcm1faW5mbywgbWVzc2FnZV9sb29wKCksIHVybCkpOwogfQogCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyeS5oIGIvY29iYWx0L2Jyb3dzZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cnkuaAppbmRleCA4YzM3MDgzLi41YjU3MTE4IDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyeS5oCisrKyBiL2NvYmFsdC9icm93c2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJ5LmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWIvd2ViX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGJyb3dzZXIgewpAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIGNsaWVudF91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCk7CiAKLSAgd29ya2VyOjpTZXJ2aWNlV29ya2VySm9icyogc2VydmljZV93b3JrZXJfam9icygpOworICB3b3JrZXI6OlNlcnZpY2VXb3JrZXJDb250ZXh0KiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0KCk7CiAKICBwcml2YXRlOgogICAvLyBDYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yIHRvIHBlcmZvcm0gYW55IG90aGVyIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIG9uCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICBiYXNlOjpXYWl0YWJsZUV2ZW50OjpSZXNldFBvbGljeTo6TUFOVUFMLAogICAgICAgYmFzZTo6V2FpdGFibGVFdmVudDo6SW5pdGlhbFN0YXRlOjpOT1RfU0lHTkFMRUR9OwogCi0gIHN0ZDo6dW5pcXVlX3B0cjx3b3JrZXI6OlNlcnZpY2VXb3JrZXJKb2JzPiBzZXJ2aWNlX3dvcmtlcl9qb2JzXzsKKyAgc3RkOjp1bmlxdWVfcHRyPHdvcmtlcjo6U2VydmljZVdvcmtlckNvbnRleHQ+IHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKZGlmZiAtLWdpdCBhL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5jYyBiL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5jYwppbmRleCAzMGI0YjM5Li4wMjg0YWE2IDEwMDY0NAotLS0gYS9jb2JhbHQvYnJvd3Nlci91c2VyX2FnZW50X3BsYXRmb3JtX2luZm8uY2MKKysrIGIvY29iYWx0L2Jyb3dzZXIvdXNlcl9hZ2VudF9wbGF0Zm9ybV9pbmZvLmNjCkBAIC0yODIsOSArMjgyLDkgQEAKICAgICByZXN1bHQgPSBwbGF0Zm9ybV9pbmZvX2V4dGVuc2lvbi0+R2V0RmlybXdhcmVWZXJzaW9uRGV0YWlscygKICAgICAgICAgdmFsdWUsIGtTeXN0ZW1Qcm9wZXJ0eU1heExlbmd0aCk7CiAgICAgaWYgKHJlc3VsdCkgewotICAgICAgaW5mby5zZXRfZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzKHZhbHVlKTsKKyAgICAgIGluZm8uc2V0X2FuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQodmFsdWUpOwogICAgIH0KLSAgICBpbmZvLnNldF9vc19leHBlcmllbmNlKHBsYXRmb3JtX2luZm9fZXh0ZW5zaW9uLT5HZXRPc0V4cGVyaWVuY2UoKSk7CisgICAgaW5mby5zZXRfYW5kcm9pZF9vc19leHBlcmllbmNlKHBsYXRmb3JtX2luZm9fZXh0ZW5zaW9uLT5HZXRPc0V4cGVyaWVuY2UoKSk7CiAgIH0KIAogICBpbmZvLnNldF9jb2JhbHRfdmVyc2lvbihDT0JBTFRfVkVSU0lPTik7CkBAIC00MjIsMTIgKzQyMiwxMiBAQAogICAgICAgICB9IGVsc2UgaWYgKCFpbnB1dC5maXJzdC5jb21wYXJlKCJldmVyZ3JlZW5fdmVyc2lvbiIpKSB7CiAgICAgICAgICAgaW5mby5zZXRfZXZlcmdyZWVuX3ZlcnNpb24oaW5wdXQuc2Vjb25kKTsKICAgICAgICAgICBMT0coSU5GTykgPDwgIlNldCBldmVyZ3JlZW4gdmVyc2lvbiB0byAiIDw8IGlucHV0LnNlY29uZDsKLSAgICAgICAgfSBlbHNlIGlmICghaW5wdXQuZmlyc3QuY29tcGFyZSgiZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzIikpIHsKLSAgICAgICAgICBpbmZvLnNldF9maXJtd2FyZV92ZXJzaW9uX2RldGFpbHMoaW5wdXQuc2Vjb25kKTsKLSAgICAgICAgICBMT0coSU5GTykgPDwgIlNldCBmaXJtd2FyZSB2ZXJzaW9uIGRldGFpbHMgdG8gIiA8PCBpbnB1dC5zZWNvbmQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlucHV0LmZpcnN0LmNvbXBhcmUoIm9zX2V4cGVyaWVuY2UiKSkgewotICAgICAgICAgIGluZm8uc2V0X29zX2V4cGVyaWVuY2UoaW5wdXQuc2Vjb25kKTsKLSAgICAgICAgICBMT0coSU5GTykgPDwgIlNldCBvcyBleHBlcmllbmNlIHRvICIgPDwgaW5wdXQuc2Vjb25kOworICAgICAgICB9IGVsc2UgaWYgKCFpbnB1dC5maXJzdC5jb21wYXJlKCJhbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50IikpIHsKKyAgICAgICAgICBpbmZvLnNldF9hbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50KGlucHV0LnNlY29uZCk7CisgICAgICAgICAgTE9HKElORk8pIDw8ICJTZXQgYW5kcm9pZCBidWlsZCBmaW5nZXJwcmludCB0byAiIDw8IGlucHV0LnNlY29uZDsKKyAgICAgICAgfSBlbHNlIGlmICghaW5wdXQuZmlyc3QuY29tcGFyZSgiYW5kcm9pZF9vc19leHBlcmllbmNlIikpIHsKKyAgICAgICAgICBpbmZvLnNldF9hbmRyb2lkX29zX2V4cGVyaWVuY2UoaW5wdXQuc2Vjb25kKTsKKyAgICAgICAgICBMT0coSU5GTykgPDwgIlNldCBhbmRyb2lkIG9zIGV4cGVyaWVuY2UgdG8gIiA8PCBpbnB1dC5zZWNvbmQ7CiAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0LmZpcnN0LmNvbXBhcmUoImNvYmFsdF92ZXJzaW9uIikpIHsKICAgICAgICAgICBpbmZvLnNldF9jb2JhbHRfdmVyc2lvbihpbnB1dC5zZWNvbmQpOwogICAgICAgICAgIExPRyhJTkZPKSA8PCAiU2V0IGNvYmFsdCB0eXBlIHRvICIgPDwgaW5wdXQuc2Vjb25kOwpAQCAtNTQyLDE1ICs1NDIsMTUgQEAKICAgZXZlcmdyZWVuX3ZlcnNpb25fID0gU2FuaXRpemUoZXZlcmdyZWVuX3ZlcnNpb24sIGlzVENIQVIpOwogfQogCi12b2lkIFVzZXJBZ2VudFBsYXRmb3JtSW5mbzo6c2V0X2Zpcm13YXJlX3ZlcnNpb25fZGV0YWlscygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzKSB7Ci0gIGZpcm13YXJlX3ZlcnNpb25fZGV0YWlsc18gPQotICAgICAgU2FuaXRpemUoZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzLCBpc1ZDSEFSb3JTcGFjZSk7Cit2b2lkIFVzZXJBZ2VudFBsYXRmb3JtSW5mbzo6c2V0X2FuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQpIHsKKyAgYW5kcm9pZF9idWlsZF9maW5nZXJwcmludF8gPQorICAgICAgU2FuaXRpemUoYW5kcm9pZF9idWlsZF9maW5nZXJwcmludCwgaXNWQ0hBUm9yU3BhY2UpOwogfQogCi12b2lkIFVzZXJBZ2VudFBsYXRmb3JtSW5mbzo6c2V0X29zX2V4cGVyaWVuY2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX2V4cGVyaWVuY2UpIHsKLSAgb3NfZXhwZXJpZW5jZV8gPSBTYW5pdGl6ZShvc19leHBlcmllbmNlLCBpc1RDSEFSKTsKK3ZvaWQgVXNlckFnZW50UGxhdGZvcm1JbmZvOjpzZXRfYW5kcm9pZF9vc19leHBlcmllbmNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbmRyb2lkX29zX2V4cGVyaWVuY2UpIHsKKyAgYW5kcm9pZF9vc19leHBlcmllbmNlXyA9IFNhbml0aXplKGFuZHJvaWRfb3NfZXhwZXJpZW5jZSwgaXNUQ0hBUik7CiB9CiAKIHZvaWQgVXNlckFnZW50UGxhdGZvcm1JbmZvOjpzZXRfY29iYWx0X3ZlcnNpb24oCmRpZmYgLS1naXQgYS9jb2JhbHQvYnJvd3Nlci91c2VyX2FnZW50X3BsYXRmb3JtX2luZm8uaCBiL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5oCmluZGV4IDI2YjBiNjQuLmU1NzY4YTQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5oCisrKyBiL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5oCkBAIC03NiwxMCArNzYsMTIgQEAKICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZXJncmVlbl92ZXJzaW9uKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBldmVyZ3JlZW5fdmVyc2lvbl87CiAgIH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpcm13YXJlX3ZlcnNpb25fZGV0YWlscygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnRfOwogICB9Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBvc19leHBlcmllbmNlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gb3NfZXhwZXJpZW5jZV87IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfb3NfZXhwZXJpZW5jZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gYW5kcm9pZF9vc19leHBlcmllbmNlXzsKKyAgfQogICBjb25zdCBzdGQ6OnN0cmluZyYgY29iYWx0X3ZlcnNpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBjb2JhbHRfdmVyc2lvbl87IH0KICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvYmFsdF9idWlsZF92ZXJzaW9uX251bWJlcigpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gY29iYWx0X2J1aWxkX3ZlcnNpb25fbnVtYmVyXzsKQEAgLTExMSw5ICsxMTMsOSBAQAogICB2b2lkIHNldF9ldmVyZ3JlZW5fdHlwZShjb25zdCBzdGQ6OnN0cmluZyYgZXZlcmdyZWVuX3R5cGUpOwogICB2b2lkIHNldF9ldmVyZ3JlZW5fZmlsZV90eXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVyZ3JlZW5fZmlsZV90eXBlKTsKICAgdm9pZCBzZXRfZXZlcmdyZWVuX3ZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZXJncmVlbl92ZXJzaW9uKTsKLSAgdm9pZCBzZXRfZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpcm13YXJlX3ZlcnNpb25fZGV0YWlscyk7Ci0gIHZvaWQgc2V0X29zX2V4cGVyaWVuY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG9zX2V4cGVyaWVuY2UpOworICB2b2lkIHNldF9hbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50KAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQpOworICB2b2lkIHNldF9hbmRyb2lkX29zX2V4cGVyaWVuY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfb3NfZXhwZXJpZW5jZSk7CiAgIHZvaWQgc2V0X2NvYmFsdF92ZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2JhbHRfdmVyc2lvbik7CiAgIHZvaWQgc2V0X2NvYmFsdF9idWlsZF92ZXJzaW9uX251bWJlcigKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2JhbHRfYnVpbGRfdmVyc2lvbl9udW1iZXIpOwpAQCAtMTM4LDggKzE0MCw4IEBACiAgIHN0ZDo6c3RyaW5nIGV2ZXJncmVlbl90eXBlXzsKICAgc3RkOjpzdHJpbmcgZXZlcmdyZWVuX2ZpbGVfdHlwZV87CiAgIHN0ZDo6c3RyaW5nIGV2ZXJncmVlbl92ZXJzaW9uXzsKLSAgc3RkOjpzdHJpbmcgZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzXzsgIC8vIE9ubHkgdmlhIENsaWVudCBIaW50cwotICBzdGQ6OnN0cmluZyBvc19leHBlcmllbmNlXzsgICAgICAgICAgICAgLy8gT25seSB2aWEgQ2xpZW50IEhpbnRzCisgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnRfOyAgLy8gT25seSB2aWEgQ2xpZW50IEhpbnRzCisgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfb3NfZXhwZXJpZW5jZV87ICAgICAgLy8gT25seSB2aWEgQ2xpZW50IEhpbnRzCiAKICAgc3RkOjpzdHJpbmcgY29iYWx0X3ZlcnNpb25fOwogICBzdGQ6OnN0cmluZyBjb2JhbHRfYnVpbGRfdmVyc2lvbl9udW1iZXJfOwpkaWZmIC0tZ2l0IGEvY29iYWx0L2J1aWxkL0JVSUxELmduIGIvY29iYWx0L2J1aWxkL0JVSUxELmduCmluZGV4IDZjNmUxZTguLjdiNmEwMDIgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9idWlsZC9CVUlMRC5nbgorKysgYi9jb2JhbHQvYnVpbGQvQlVJTEQuZ24KQEAgLTIzLDMgKzIzLDkgQEAKICAgICBjb2JhbHRfdmVyc2lvbiwKICAgXQogfQorCithY3Rpb24oImNvYmFsdF9idWlsZF9pbmZvIikgeworICBzY3JpcHQgPSAiYnVpbGRfaW5mby5weSIKKyAgb3V0cHV0cyA9IFsgIiRyb290X2dlbl9kaXIvYnVpbGRfaW5mby5qc29uIiBdCisgIGFyZ3MgPSBbIHJlYmFzZV9wYXRoKG91dHB1dHNbMF0sIHJvb3RfYnVpbGRfZGlyKSBdCit9CmRpZmYgLS1naXQgYS9jb2JhbHQvYnVpbGQvYnVpbGRfaW5mby5weSBiL2NvYmFsdC9idWlsZC9idWlsZF9pbmZvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlZGNjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvYnVpbGQvYnVpbGRfaW5mby5weQpAQCAtMCwwICsxLDExOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIkdlbmVyYXRlcyBhIENvYmFsdCBCdWlsZCBJbmZvIGpzb24uIiIiCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCitGSUxFX0RJUiA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKK0NPTU1JVF9DT1VOVF9CVUlMRF9JRF9PRkZTRVQgPSAxMDAwMDAwCisKK19CVUlMRF9JRF9QQVRURVJOID0gJ15CVUlMRF9OVU1CRVI9KFsxLTldWzAtOV17Nix9KSQnCitfR0lUX1JFVl9QQVRURVJOID0gJ15HaXRPcmlnaW4tUmV2SWQ6IChbMC05YS1mXXs0MH0pJCcKKworCitkZWYgZ2V0X2J1aWxkX2lkX2FuZF9naXRfcmV2X2Zyb21fY29tbWl0cyhjd2QpOgorICAjIEJ1aWxkIGlkIGFuZCBnaXQgcmV2IG11c3QgY29tZSBmcm9tIHRoZSBzYW1lIGNvbW1pdC4KKyAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICBbJ2dpdCcsICdsb2cnLCAnLS1ncmVwJywgX0JVSUxEX0lEX1BBVFRFUk4sICctMScsICctRScsICctLXByZXR0eT0lYiddLAorICAgICAgY3dkPWN3ZCkuZGVjb2RlKCkKKworICAjIEdldHMgYnVpbGQgaWQuCisgIGNvbXBpbGVkX2J1aWxkX2lkX3BhdHRlcm4gPSByZS5jb21waWxlKF9CVUlMRF9JRF9QQVRURVJOLCBmbGFncz1yZS5NVUxUSUxJTkUpCisgIG1hdGNoX2J1aWxkX2lkID0gY29tcGlsZWRfYnVpbGRfaWRfcGF0dGVybi5zZWFyY2gob3V0cHV0KQorICBpZiBub3QgbWF0Y2hfYnVpbGRfaWQ6CisgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgYnVpbGRfaWQgPSBtYXRjaF9idWlsZF9pZC5ncm91cCgxKQorCisgICMgR2V0cyBnaXQgcmV2LgorICBjb21waWxlZF9naXRfcmV2X3BhdHRlcm4gPSByZS5jb21waWxlKF9HSVRfUkVWX1BBVFRFUk4sIGZsYWdzPXJlLk1VTFRJTElORSkKKyAgbWF0Y2hfZ2l0X3JldiA9IGNvbXBpbGVkX2dpdF9yZXZfcGF0dGVybi5zZWFyY2gob3V0cHV0KQorICBpZiBub3QgbWF0Y2hfZ2l0X3JldjoKKyAgICBnaXRfcmV2ID0gJycKKyAgZWxzZToKKyAgICBnaXRfcmV2ID0gbWF0Y2hfZ2l0X3Jldi5ncm91cCgxKQorCisgIHJldHVybiBidWlsZF9pZCwgZ2l0X3JldgorCisKK2RlZiBnZXRfYnVpbGRfaWRfZnJvbV9jb21taXRfY291bnQoY3dkKToKKyAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWydnaXQnLCAncmV2LWxpc3QnLCAnLS1jb3VudCcsICdIRUFEJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1jd2QpCisgIGJ1aWxkX2lkID0gaW50KG91dHB1dC5zdHJpcCgpLmRlY29kZSgpKSArIENPTU1JVF9DT1VOVF9CVUlMRF9JRF9PRkZTRVQKKyAgcmV0dXJuIGJ1aWxkX2lkCisKKworZGVmIF9nZXRfbGFzdF9jb21taXRfd2l0aF9mb3JtYXQocGxhY2Vob2xkZXIsIGN3ZCk6CisgIG91dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgWydnaXQnLCAnbG9nJywgJy0xJywgZictLXByZXR0eT1mb3JtYXQ6e3BsYWNlaG9sZGVyfSddLCBjd2Q9Y3dkKQorICByZXR1cm4gb3V0cHV0LnN0cmlwKCkuZGVjb2RlKCkKKworCitkZWYgX2dldF9oYXNoX2Zyb21fbGFzdF9jb21taXQoY3dkKToKKyAgcmV0dXJuIF9nZXRfbGFzdF9jb21taXRfd2l0aF9mb3JtYXQociclSCcsIGN3ZD1jd2QpCisKKworZGVmIF9nZXRfYXV0aG9yX2Zyb21fbGFzdF9jb21taXQoY3dkKToKKyAgcmV0dXJuIF9nZXRfbGFzdF9jb21taXRfd2l0aF9mb3JtYXQociclYW4nLCBjd2Q9Y3dkKQorCisKK2RlZiBfZ2V0X3N1YmplY3RfZnJvbV9sYXN0X2NvbW1pdChjd2QpOgorICByZXR1cm4gX2dldF9sYXN0X2NvbW1pdF93aXRoX2Zvcm1hdChyJyVzJywgY3dkPWN3ZCkKKworCitkZWYgbWFpbihvdXRwdXRfcGF0aCwgY3dkPUZJTEVfRElSKToKKyAgIiIiV3JpdGVzIGEgQ29iYWx0IGJ1aWxkX2luZm8ganNvbiBmaWxlLiIiIgorICBidWlsZF9yZXYgPSBfZ2V0X2hhc2hfZnJvbV9sYXN0X2NvbW1pdChjd2Q9Y3dkKQorICBidWlsZF9pZCwgZ2l0X3JldiA9IGdldF9idWlsZF9pZF9hbmRfZ2l0X3Jldl9mcm9tX2NvbW1pdHMoY3dkPWN3ZCkKKyAgaWYgYnVpbGRfaWQgaXMgTm9uZToKKyAgICBidWlsZF9pZCA9IGdldF9idWlsZF9pZF9mcm9tX2NvbW1pdF9jb3VudChjd2Q9Y3dkKQorICAgIGdpdF9yZXYgPSBidWlsZF9yZXYKKyAgYnVpbGRfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLmN0aW1lKCkKKyAgYXV0aG9yID0gX2dldF9hdXRob3JfZnJvbV9sYXN0X2NvbW1pdChjd2Q9Y3dkKQorICBjb21taXQgPSBfZ2V0X3N1YmplY3RfZnJvbV9sYXN0X2NvbW1pdChjd2Q9Y3dkKQorCisgIGluZm9fanNvbiA9IHsKKyAgICAgICdidWlsZF9pZCc6IGJ1aWxkX2lkLAorICAgICAgJ2J1aWxkX3Jldic6IGJ1aWxkX3JldiwKKyAgICAgICdnaXRfcmV2JzogZ2l0X3JldiwKKyAgICAgICdidWlsZF90aW1lJzogYnVpbGRfdGltZSwKKyAgICAgICdhdXRob3InOiBhdXRob3IsCisgICAgICAnY29tbWl0JzogY29tbWl0CisgIH0KKworICB3aXRoIG9wZW4ob3V0cHV0X3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKKyAgICBmLndyaXRlKGpzb24uZHVtcHMoaW5mb19qc29uLCBpbmRlbnQ9NCkpCisKKyAgIyBTdXBwb3J0cyBsZWdhY3kgYnVpbGRfaW5mby50eHQuCisgIG91dHB1dF90ZXh0X3BhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICBvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpLCAnYnVpbGRfaW5mby50eHQnKQorICB3aXRoIG9wZW4ob3V0cHV0X3RleHRfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgorICAgIGYud3JpdGUoZicnJ1wKK0J1aWxkIElEOiB7YnVpbGRfaWR9CitCdWlsZCBSZXY6IHtidWlsZF9yZXZ9CitHaXQgUmV2OiB7Z2l0X3Jldn0KK0J1aWxkIFRpbWU6IHtidWlsZF90aW1lfQorQXV0aG9yOiB7YXV0aG9yfQorQ29tbWl0OiB7Y29tbWl0fQorJycnKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oc3lzLmFyZ3ZbMV0pCmRpZmYgLS1naXQgYS9jb2JhbHQvYnVpbGQvY29iYWx0X2NvbmZpZ3VyYXRpb24ucHkgYi9jb2JhbHQvYnVpbGQvY29iYWx0X2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggYWRhYTM2MS4uOTFiOTBhNiAxMDA2NDQKLS0tIGEvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLnB5CisrKyBiL2NvYmFsdC9idWlsZC9jb2JhbHRfY29uZmlndXJhdGlvbi5weQpAQCAtMTI5LDYgKzEyOSw3IEBACiAgICAgICAgICdtZWRpYV9zZXNzaW9uX3Rlc3QnLAogICAgICAgICAnbWVkaWFfc3RyZWFtX3Rlc3QnLAogICAgICAgICAnbWVtb3J5X3N0b3JlX3Rlc3QnLAorICAgICAgICAnbWV0cmljc190ZXN0JywKICAgICAgICAgJ25iX3Rlc3QnLAogICAgICAgICAnbmV0X3VuaXR0ZXN0cycsCiAgICAgICAgICduZXR3b3JrX3Rlc3QnLApkaWZmIC0tZ2l0IGEvY29iYWx0L2J1aWxkL2dldF9idWlsZF9pZC5weSBiL2NvYmFsdC9idWlsZC9nZXRfYnVpbGRfaWQucHkKaW5kZXggNWU1YzcxNy4uZjQ4ZTMwYyAxMDA3NTUKLS0tIGEvY29iYWx0L2J1aWxkL2dldF9idWlsZF9pZC5weQorKysgYi9jb2JhbHQvYnVpbGQvZ2V0X2J1aWxkX2lkLnB5CkBAIC0xNCw0OCArMTQsMTMgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAiIiJQcmludHMgb3V0IHRoZSBDb2JhbHQgQnVpbGQgSUQuIiIiCiAKLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3VicHJvY2VzcwotCi1fRklMRV9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCi1DT01NSVRfQ09VTlRfQlVJTERfTlVNQkVSX09GRlNFVCA9IDEwMDAwMDAKLQotIyBNYXRjaGVzIG51bWJlcnMgPiAxMDAwMDAwLiBUaGUgcGF0dGVybiBpcyBiYXNpYyBzbyBnaXQgbG9nIC0tZ3JlcCBpcyBhYmxlIHRvCi0jIGludGVycHJldCBpdC4KLUdJVF9CVUlMRF9OVU1CRVJfUEFUVEVSTiA9IHInWzEtOV0nICsgcidbMC05XScgKiA2ICsgcidbMC05XSonCi1CVUlMRF9OVU1CRVJfVEFHX1BBVFRFUk4gPSByJ15CVUlMRF9OVU1CRVI9e30kJwotCi0jIGdpdCBsb2cgLS1ncmVwIGNhbid0IGhhbmRsZSBjYXB0dXJlIGdyb3Vwcy4KLUJVSUxEX05VQkVSX1BBVFRFUk5fV0lUSF9DQVBUVVJFID0gZicoe0dJVF9CVUlMRF9OVU1CRVJfUEFUVEVSTn0pJworZnJvbSBjb2JhbHQuYnVpbGQgaW1wb3J0IGJ1aWxkX2luZm8KIAogCi1kZWYgZ2V0X2J1aWxkX251bWJlcl9mcm9tX2NvbW1pdHMoY3dkPV9GSUxFX0RJUik6Ci0gIGZ1bGxfcGF0dGVybiA9IEJVSUxEX05VTUJFUl9UQUdfUEFUVEVSTi5mb3JtYXQoR0lUX0JVSUxEX05VTUJFUl9QQVRURVJOKQotICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKLSAgICAgIFsnZ2l0JywgJ2xvZycsICctLWdyZXAnLCBmdWxsX3BhdHRlcm4sICctMScsICctLXByZXR0eT0lYiddLAotICAgICAgY3dkPWN3ZCkuZGVjb2RlKCkKLQotICBmdWxsX3BhdHRlcm5fd2l0aF9jYXB0dXJlID0gcmUuY29tcGlsZSgKLSAgICAgIEJVSUxEX05VTUJFUl9UQUdfUEFUVEVSTi5mb3JtYXQoQlVJTERfTlVCRVJfUEFUVEVSTl9XSVRIX0NBUFRVUkUpLAotICAgICAgZmxhZ3M9cmUuTVVMVElMSU5FKQotICBtYXRjaCA9IGZ1bGxfcGF0dGVybl93aXRoX2NhcHR1cmUuc2VhcmNoKG91dHB1dCkKLSAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpIGlmIG1hdGNoIGVsc2UgTm9uZQotCi0KLWRlZiBnZXRfYnVpbGRfbnVtYmVyX2Zyb21fY29tbWl0X2NvdW50KGN3ZD1fRklMRV9ESVIpOgotICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2dpdCcsICdyZXYtbGlzdCcsICctLWNvdW50JywgJ0hFQUQnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWN3ZCkKLSAgYnVpbGRfbnVtYmVyID0gaW50KG91dHB1dC5zdHJpcCgpLmRlY29kZSgndXRmLTgnKSkKLSAgcmV0dXJuIGJ1aWxkX251bWJlciArIENPTU1JVF9DT1VOVF9CVUlMRF9OVU1CRVJfT0ZGU0VUCi0KLQotZGVmIG1haW4oY3dkPV9GSUxFX0RJUik6Ci0gIGJ1aWxkX251bWJlciA9IGdldF9idWlsZF9udW1iZXJfZnJvbV9jb21taXRzKGN3ZD1jd2QpCi0KK2RlZiBtYWluKGN3ZD1idWlsZF9pbmZvLkZJTEVfRElSKToKKyAgYnVpbGRfbnVtYmVyLCBfID0gYnVpbGRfaW5mby5nZXRfYnVpbGRfaWRfYW5kX2dpdF9yZXZfZnJvbV9jb21taXRzKGN3ZD1jd2QpCiAgIGlmIG5vdCBidWlsZF9udW1iZXI6Ci0gICAgYnVpbGRfbnVtYmVyID0gZ2V0X2J1aWxkX251bWJlcl9mcm9tX2NvbW1pdF9jb3VudChjd2Q9Y3dkKQotCisgICAgYnVpbGRfbnVtYmVyID0gYnVpbGRfaW5mby5nZXRfYnVpbGRfaWRfZnJvbV9jb21taXRfY291bnQoY3dkPWN3ZCkKICAgcmV0dXJuIGJ1aWxkX251bWJlcgogCiAKZGlmZiAtLWdpdCBhL2NvYmFsdC9idWlsZC9nZXRfYnVpbGRfaWRfdGVzdC5weSBiL2NvYmFsdC9idWlsZC9nZXRfYnVpbGRfaWRfdGVzdC5weQppbmRleCBmOWVhOGMzLi41NjIxNzlmIDEwMDY0NAotLS0gYS9jb2JhbHQvYnVpbGQvZ2V0X2J1aWxkX2lkX3Rlc3QucHkKKysrIGIvY29iYWx0L2J1aWxkL2dldF9idWlsZF9pZF90ZXN0LnB5CkBAIC0yMSw5ICsyMSwxMCBAQAogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKIAorZnJvbSBjb2JhbHQuYnVpbGQgaW1wb3J0IGJ1aWxkX2luZm8KIGZyb20gY29iYWx0LmJ1aWxkIGltcG9ydCBnZXRfYnVpbGRfaWQKIAotX1RFU1RfQlVJTERfTlVNQkVSID0gMTIzNCArIGdldF9idWlsZF9pZC5DT01NSVRfQ09VTlRfQlVJTERfTlVNQkVSX09GRlNFVAorX1RFU1RfQlVJTERfTlVNQkVSID0gMTIzNCArIGJ1aWxkX2luZm8uQ09NTUlUX0NPVU5UX0JVSUxEX0lEX09GRlNFVAogCiAKICMgVE9ETyhiLzI4MjA0MDYzOCk6IGZpeCBhbmQgcmUtZW5hYmxlZCB0aGlzCkBAIC01OCw3ICs1OSw3IEBACiAKICAgZGVmIHRlc3RHZXRCdWlsZE51bWJlckZyb21Db21taXRzU3VubnlEYXkoc2VsZik6CiAgICAgc2VsZi5tYWtlX2NvbW1pdF93aXRoX2J1aWxkX251bWJlcigpCi0gICAgYnVpbGRfbnVtYmVyID0gZ2V0X2J1aWxkX2lkLmdldF9idWlsZF9udW1iZXJfZnJvbV9jb21taXRzKAorICAgIGJ1aWxkX251bWJlciwgXyA9IGJ1aWxkX2luZm8uZ2V0X2J1aWxkX2lkX2FuZF9naXRfcmV2X2Zyb21fY29tbWl0cygKICAgICAgICAgY3dkPXNlbGYudGVzdF9kaXIubmFtZSkKICAgICBzZWxmLmFzc2VydEVxdWFsKGludChidWlsZF9udW1iZXIpLCBfVEVTVF9CVUlMRF9OVU1CRVIpCiAKQEAgLTY2LDE3ICs2NywxNyBAQAogICAgIG51bV9jb21taXRzID0gNQogICAgIGZvciBpIGluIHJhbmdlKG51bV9jb21taXRzKToKICAgICAgIHNlbGYubWFrZV9jb21taXRfd2l0aF9idWlsZF9udW1iZXIoCi0gICAgICAgICAgZ2V0X2J1aWxkX2lkLkNPTU1JVF9DT1VOVF9CVUlMRF9OVU1CRVJfT0ZGU0VUICsgaSkKLSAgICBidWlsZF9udW1iZXIgPSBnZXRfYnVpbGRfaWQuZ2V0X2J1aWxkX251bWJlcl9mcm9tX2NvbW1pdHMoCisgICAgICAgICAgYnVpbGRfaW5mby5DT01NSVRfQ09VTlRfQlVJTERfSURfT0ZGU0VUICsgaSkKKyAgICBidWlsZF9udW1iZXIsIF8gPSBidWlsZF9pbmZvLmdldF9idWlsZF9pZF9hbmRfZ2l0X3Jldl9mcm9tX2NvbW1pdHMoCiAgICAgICAgIGN3ZD1zZWxmLnRlc3RfZGlyLm5hbWUpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgaW50KGJ1aWxkX251bWJlciksCi0gICAgICAgIG51bV9jb21taXRzICsgZ2V0X2J1aWxkX2lkLkNPTU1JVF9DT1VOVF9CVUlMRF9OVU1CRVJfT0ZGU0VUIC0gMSkKKyAgICAgICAgbnVtX2NvbW1pdHMgKyBidWlsZF9pbmZvLkNPTU1JVF9DT1VOVF9CVUlMRF9JRF9PRkZTRVQgLSAxKQogCiAgIGRlZiB0ZXN0R2V0QnVpbGROdW1iZXJGcm9tQ29tbWl0c1JhaW55RGF5SW52YWxpZEJ1aWxkTnVtYmVyKHNlbGYpOgogICAgIHNlbGYubWFrZV9jb21taXQoKQogICAgIHNlbGYubWFrZV9jb21taXQoZidCVUlMRF9OVU1CRVI9e19URVNUX0JVSUxEX05VTUJFUn0nKQotICAgIGJ1aWxkX251bWJlciA9IGdldF9idWlsZF9pZC5nZXRfYnVpbGRfbnVtYmVyX2Zyb21fY29tbWl0cygKKyAgICBidWlsZF9udW1iZXIsIF8gPSBidWlsZF9pbmZvLmdldF9idWlsZF9pZF9hbmRfZ2l0X3Jldl9mcm9tX2NvbW1pdHMoCiAgICAgICAgIGN3ZD1zZWxmLnRlc3RfZGlyLm5hbWUpCiAgICAgc2VsZi5hc3NlcnRJc05vbmUoYnVpbGRfbnVtYmVyKQogCkBAIC04NCwxMSArODUsMTAgQEAKICAgICBudW1fY29tbWl0cyA9IDUKICAgICBmb3IgXyBpbiByYW5nZShudW1fY29tbWl0cyk6CiAgICAgICBzZWxmLm1ha2VfY29tbWl0KCkKLSAgICBidWlsZF9udW1iZXIgPSBnZXRfYnVpbGRfaWQuZ2V0X2J1aWxkX251bWJlcl9mcm9tX2NvbW1pdF9jb3VudCgKKyAgICBidWlsZF9udW1iZXIgPSBidWlsZF9pbmZvLmdldF9idWlsZF9pZF9mcm9tX2NvbW1pdF9jb3VudCgKICAgICAgICAgY3dkPXNlbGYudGVzdF9kaXIubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBidWlsZF9udW1iZXIsCi0gICAgICAgIG51bV9jb21taXRzICsgZ2V0X2J1aWxkX2lkLkNPTU1JVF9DT1VOVF9CVUlMRF9OVU1CRVJfT0ZGU0VUKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVpbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgbnVtX2NvbW1pdHMgKyBidWlsZF9pbmZvLkNPTU1JVF9DT1VOVF9CVUlMRF9JRF9PRkZTRVQpCiAKICAgZGVmIHRlc3RDb21taXRzT3V0cmFua0NvbW1pdENvdW50KHNlbGYpOgogICAgIHNlbGYubWFrZV9jb21taXQoKQpAQCAtMTAyLDkgKzEwMiw4IEBACiAgICAgZm9yIF8gaW4gcmFuZ2UobnVtX2NvbW1pdHMpOgogICAgICAgc2VsZi5tYWtlX2NvbW1pdCgpCiAgICAgYnVpbGRfbnVtYmVyID0gZ2V0X2J1aWxkX2lkLm1haW4oY3dkPXNlbGYudGVzdF9kaXIubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBidWlsZF9udW1iZXIsCi0gICAgICAgIG51bV9jb21taXRzICsgZ2V0X2J1aWxkX2lkLkNPTU1JVF9DT1VOVF9CVUlMRF9OVU1CRVJfT0ZGU0VUKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVpbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgbnVtX2NvbW1pdHMgKyBidWlsZF9pbmZvLkNPTU1JVF9DT1VOVF9CVUlMRF9JRF9PRkZTRVQpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL2NvYmFsdC9kZWJ1Zy9CVUlMRC5nbiBiL2NvYmFsdC9kZWJ1Zy9CVUlMRC5nbgppbmRleCA5MWM1NTg2Li4yYzQ4Yzg1IDEwMDY0NAotLS0gYS9jb2JhbHQvZGVidWcvQlVJTEQuZ24KKysrIGIvY29iYWx0L2RlYnVnL0JVSUxELmduCkBAIC0xNyw2ICsxNyw4IEBACiAgIHNvdXJjZXMgPSBbCiAgICAgImJhY2tlbmQvYWdlbnRfYmFzZS5jYyIsCiAgICAgImJhY2tlbmQvYWdlbnRfYmFzZS5oIiwKKyAgICAiYmFja2VuZC9jb2JhbHRfYWdlbnQuY2MiLAorICAgICJiYWNrZW5kL2NvYmFsdF9hZ2VudC5oIiwKICAgICAiYmFja2VuZC9jb21tYW5kX21hcC5oIiwKICAgICAiYmFja2VuZC9jc3NfYWdlbnQuY2MiLAogICAgICJiYWNrZW5kL2Nzc19hZ2VudC5oIiwKZGlmZiAtLWdpdCBhL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvYmFsdF9hZ2VudC5jYyBiL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvYmFsdF9hZ2VudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzkwMWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29iYWx0X2FnZW50LmNjCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2NvYmFsdF9hZ2VudC5oIgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvY29uc29sZS9jb21tYW5kX21hbmFnZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvanNvbl9vYmplY3QuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZGVidWcgeworbmFtZXNwYWNlIGJhY2tlbmQgeworCitDb2JhbHRBZ2VudDo6Q29iYWx0QWdlbnQoRGVidWdEaXNwYXRjaGVyKiBkaXNwYXRjaGVyKQorICAgIDogQWdlbnRCYXNlKCJDb2JhbHQiLCBkaXNwYXRjaGVyKSB7CisgIGNvbW1hbmRzX1siZ2V0Q29uc29sZUNvbW1hbmRzIl0gPQorICAgICAgYmFzZTo6QmluZCgmQ29iYWx0QWdlbnQ6OkdldENvbnNvbGVDb21tYW5kcywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CisgIGNvbW1hbmRzX1sic2VuZENvbnNvbGVDb21tYW5kIl0gPQorICAgICAgYmFzZTo6QmluZCgmQ29iYWx0QWdlbnQ6OlNlbmRDb25zb2xlQ29tbWFuZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CisgIC8vIGRpc3BhdGNoZXJfLT5BZGREb21haW4oZG9tYWluXywgY29tbWFuZHNfLkJpbmQoKSk7Cit9CisKK3ZvaWQgQ29iYWx0QWdlbnQ6OkdldENvbnNvbGVDb21tYW5kcyhDb21tYW5kIGNvbW1hbmQpIHsKKyAgSlNPTk9iamVjdCByZXNwb25zZShuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOworICBKU09OTGlzdCBsaXN0KG5ldyBiYXNlOjpMaXN0VmFsdWUoKSk7CisKKyAgY29uc29sZTo6Q29uc29sZUNvbW1hbmRNYW5hZ2VyKiBjb21tYW5kX21hbmFnZXIgPQorICAgICAgY29uc29sZTo6Q29uc29sZUNvbW1hbmRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOworICBEQ0hFQ0soY29tbWFuZF9tYW5hZ2VyKTsKKyAgaWYgKGNvbW1hbmRfbWFuYWdlcikgeworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb21tYW5kcyA9IGNvbW1hbmRfbWFuYWdlci0+R2V0UmVnaXN0ZXJlZENvbW1hbmRzKCk7CisgICAgZm9yIChhdXRvJiBjb21tYW5kX25hbWUgOiBjb21tYW5kcykgeworICAgICAgSlNPTk9iamVjdCBjb25zb2xlX2NvbW1hbmQobmV3IGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSgpKTsKKyAgICAgIGNvbnNvbGVfY29tbWFuZC0+U2V0U3RyaW5nKCJjb21tYW5kIiwgY29tbWFuZF9uYW1lKTsKKyAgICAgIGNvbnNvbGVfY29tbWFuZC0+U2V0U3RyaW5nKCJzaG9ydEhlbHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9tYW5hZ2VyLT5HZXRTaG9ydEhlbHAoY29tbWFuZF9uYW1lKSk7CisgICAgICBjb25zb2xlX2NvbW1hbmQtPlNldFN0cmluZygibG9uZ0hlbHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9tYW5hZ2VyLT5HZXRMb25nSGVscChjb21tYW5kX25hbWUpKTsKKyAgICAgIGxpc3QtPkFwcGVuZChzdGQ6Om1vdmUoY29uc29sZV9jb21tYW5kKSk7CisgICAgfQorICB9CisKKyAgSlNPTk9iamVjdCBjb21tYW5kcyhuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCkpOworICBjb21tYW5kcy0+U2V0KCJjb21tYW5kcyIsIHN0ZDo6bW92ZShsaXN0KSk7CisgIHJlc3BvbnNlLT5TZXQoInJlc3VsdCIsIHN0ZDo6bW92ZShjb21tYW5kcykpOworICBjb21tYW5kLlNlbmRSZXNwb25zZShyZXNwb25zZSk7Cit9CisKK3ZvaWQgQ29iYWx0QWdlbnQ6OlNlbmRDb25zb2xlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKKyAgSlNPTk9iamVjdCBwYXJhbXMgPSBKU09OUGFyc2UoY29tbWFuZC5HZXRQYXJhbXMoKSk7CisgIGlmIChwYXJhbXMpIHsKKyAgICBzdGQ6OnN0cmluZyBjb25zb2xlX2NvbW1hbmQ7CisgICAgaWYgKHBhcmFtcy0+R2V0U3RyaW5nKCJjb21tYW5kIiwgJmNvbnNvbGVfY29tbWFuZCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICBwYXJhbXMtPkdldFN0cmluZygibWVzc2FnZSIsICZtZXNzYWdlKTsKKyAgICAgIGNvbnNvbGU6OkNvbnNvbGVDb21tYW5kTWFuYWdlciogY29uc29sZV9jb21tYW5kX21hbmFnZXIgPQorICAgICAgICAgIGNvbnNvbGU6OkNvbnNvbGVDb21tYW5kTWFuYWdlcjo6R2V0SW5zdGFuY2UoKTsKKyAgICAgIERDSEVDSyhjb25zb2xlX2NvbW1hbmRfbWFuYWdlcik7CisgICAgICBjb25zb2xlX2NvbW1hbmRfbWFuYWdlci0+SGFuZGxlQ29tbWFuZChjb25zb2xlX2NvbW1hbmQsIG1lc3NhZ2UpOworICAgICAgY29tbWFuZC5TZW5kUmVzcG9uc2UoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgY29tbWFuZC5TZW5kRXJyb3JSZXNwb25zZShDb21tYW5kOjprSW52YWxpZFBhcmFtcywgIk1pc3NpbmcgY29tbWFuZC4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKK30gIC8vIG5hbWVzcGFjZSBkZWJ1ZworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29iYWx0X2FnZW50LmggYi9jb2JhbHQvZGVidWcvYmFja2VuZC9jb2JhbHRfYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y4NjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2RlYnVnL2JhY2tlbmQvY29iYWx0X2FnZW50LmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9ERUJVR19CQUNLRU5EX0NPQkFMVF9BR0VOVF9IXworI2RlZmluZSBDT0JBTFRfREVCVUdfQkFDS0VORF9DT0JBTFRfQUdFTlRfSF8KKworI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2FnZW50X2Jhc2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19kaXNwYXRjaGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2NvbW1hbmQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZGVidWcvanNvbl9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvdy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkZWJ1ZyB7CituYW1lc3BhY2UgYmFja2VuZCB7CisKKy8vIEltcGxlbWVudHMgYSBzbWFsbCBwYXJ0IG9mIHRoZSB0aGUgIlJ1bnRpbWUiIGluc3BlY3RvciBwcm90b2NvbCBkb21haW4gd2l0aAorLy8ganVzdCBlbm91Z2ggdG8gc3VwcG9ydCBjb25zb2xlIGlucHV0LiBXaGVuIHVzaW5nIHRoZSBWOCBKYXZhU2NyaXB0IGVuZ2luZSwKKy8vIHRoaXMgY2xhc3MgaXMgbm90IG5lZWRlZCBzaW5jZSB0aGUgVjggaW5zcGVjdG9yIGltcGxlbWVudHMgdGhlIFJ1bnRpbWUgZG9tYWluCisvLyBmb3IgdXMuCisvLworLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L1J1bnRpbWUKK2NsYXNzIENvYmFsdEFnZW50IDogcHVibGljIEFnZW50QmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDb2JhbHRBZ2VudChEZWJ1Z0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBHZXRDb25zb2xlQ29tbWFuZHMoQ29tbWFuZCBjb21tYW5kKTsKKyAgdm9pZCBTZW5kQ29uc29sZUNvbW1hbmQoQ29tbWFuZCBjb21tYW5kKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCit9ICAvLyBuYW1lc3BhY2UgZGVidWcKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfREVCVUdfQkFDS0VORF9DT0JBTFRfQUdFTlRfSF8KZGlmZiAtLWdpdCBhL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5jYyBiL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5jYwppbmRleCA1NmU4YjI2Li5lYTc2N2FmIDEwMDY0NAotLS0gYS9jb2JhbHQvZGVidWcvYmFja2VuZC9kZWJ1Z19tb2R1bGUuY2MKKysrIGIvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmNjCkBAIC0yMyw2ICsyMyw3IEBACiBuYW1lc3BhY2UgYmFja2VuZCB7CiAKIG5hbWVzcGFjZSB7Citjb25zdGV4cHIgY2hhciBrQ29iYWx0QWdlbnRbXSA9ICJDb2JhbHRBZ2VudCI7CiBjb25zdGV4cHIgY2hhciBrU2NyaXB0RGVidWdnZXJBZ2VudFtdID0gIlNjcmlwdERlYnVnZ2VyQWdlbnQiOwogY29uc3RleHByIGNoYXIga0xvZ0FnZW50W10gPSAiTG9nQWdlbnQiOwogY29uc3RleHByIGNoYXIga0RvbUFnZW50W10gPSAiRG9tQWdlbnQiOwpAQCAtMTQwLDYgKzE0MSw3IEBACiAgIC8vIGRpcmVjdGx5IGhhbmRsZSBvbmUgb3IgbW9yZSBwcm90b2NvbCBkb21haW5zLgogICBzY3JpcHRfZGVidWdnZXJfYWdlbnRfLnJlc2V0KAogICAgICAgbmV3IFNjcmlwdERlYnVnZ2VyQWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCksIHNjcmlwdF9kZWJ1Z2dlcl8uZ2V0KCkpKTsKKyAgY29iYWx0X2FnZW50Xy5yZXNldChuZXcgQ29iYWx0QWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCkpKTsKICAgbG9nX2FnZW50Xy5yZXNldChuZXcgTG9nQWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCkpKTsKICAgZG9tX2FnZW50Xy5yZXNldChuZXcgRE9NQWdlbnQoZGVidWdfZGlzcGF0Y2hlcl8uZ2V0KCkpKTsKICAgY3NzX2FnZW50XyA9IFdyYXBSZWZDb3VudGVkKG5ldyBDU1NBZ2VudChkZWJ1Z19kaXNwYXRjaGVyXy5nZXQoKSkpOwpAQCAtMTc4LDYgKzE4MCw3IEBACiAgIGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSogYWdlbnRzX3N0YXRlID0KICAgICAgIGRhdGEuZGVidWdnZXJfc3RhdGUgPT0gbnVsbHB0ciA/IG51bGxwdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZGVidWdnZXJfc3RhdGUtPmFnZW50c19zdGF0ZS5nZXQoKTsKKyAgY29iYWx0X2FnZW50Xy0+VGhhdyhSZW1vdmVBZ2VudFN0YXRlKGtDb2JhbHRBZ2VudCwgYWdlbnRzX3N0YXRlKSk7CiAgIHNjcmlwdF9kZWJ1Z2dlcl9hZ2VudF8tPlRoYXcoCiAgICAgICBSZW1vdmVBZ2VudFN0YXRlKGtTY3JpcHREZWJ1Z2dlckFnZW50LCBhZ2VudHNfc3RhdGUpKTsKICAgbG9nX2FnZW50Xy0+VGhhdyhSZW1vdmVBZ2VudFN0YXRlKGtMb2dBZ2VudCwgYWdlbnRzX3N0YXRlKSk7CkBAIC0yMDAsNiArMjAzLDcgQEAKIAogICBkZWJ1Z2dlcl9zdGF0ZS0+YWdlbnRzX3N0YXRlLnJlc2V0KG5ldyBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUoKSk7CiAgIGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSogYWdlbnRzX3N0YXRlID0gZGVidWdnZXJfc3RhdGUtPmFnZW50c19zdGF0ZS5nZXQoKTsKKyAgU3RvcmVBZ2VudFN0YXRlKGFnZW50c19zdGF0ZSwga0NvYmFsdEFnZW50LCBjb2JhbHRfYWdlbnRfLT5GcmVlemUoKSk7CiAgIFN0b3JlQWdlbnRTdGF0ZShhZ2VudHNfc3RhdGUsIGtTY3JpcHREZWJ1Z2dlckFnZW50LAogICAgICAgICAgICAgICAgICAgc2NyaXB0X2RlYnVnZ2VyX2FnZW50Xy0+RnJlZXplKCkpOwogICBTdG9yZUFnZW50U3RhdGUoYWdlbnRzX3N0YXRlLCBrTG9nQWdlbnQsIGxvZ19hZ2VudF8tPkZyZWV6ZSgpKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX21vZHVsZS5oIGIvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmgKaW5kZXggZGExNzc4YS4uNDczNjk2OCAxMDA2NDQKLS0tIGEvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmgKKysrIGIvY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfbW9kdWxlLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2RlYnVnZ2VyX2hvb2tzLmgiCisjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvY29iYWx0X2FnZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvY3NzX2FnZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2JhY2tlbmQvZGVidWdfYmFja2VuZC5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9iYWNrZW5kL2RlYnVnX2Rpc3BhdGNoZXIuaCIKQEAgLTEzNCw2ICsxMzUsNyBAQAogCiAgIC8vIFdyYXBwYWJsZSBvYmplY3QgcHJvdmlkaW5nIG5hdGl2ZSBoZWxwZXJzIGZvciBiYWNrZW5kIEphdmFTY3JpcHQuCiAgIHNjb3BlZF9yZWZwdHI8RGVidWdCYWNrZW5kPiBkZWJ1Z19iYWNrZW5kXzsKKyAgc3RkOjp1bmlxdWVfcHRyPENvYmFsdEFnZW50PiBjb2JhbHRfYWdlbnRfOwogICBzdGQ6OnVuaXF1ZV9wdHI8TG9nQWdlbnQ+IGxvZ19hZ2VudF87CiAgIHN0ZDo6dW5pcXVlX3B0cjxET01BZ2VudD4gZG9tX2FnZW50XzsKICAgc2NvcGVkX3JlZnB0cjxDU1NBZ2VudD4gY3NzX2FnZW50XzsKZGlmZiAtLWdpdCBhL2NvYmFsdC9kZW1vcy9jb250ZW50L211bHRpLWVuY3J5cHRlZC12aWRlby9tdWx0aS1lbmNyeXB0ZWQtdmlkZW8uaHRtbCBiL2NvYmFsdC9kZW1vcy9jb250ZW50L211bHRpLWVuY3J5cHRlZC12aWRlby9tdWx0aS1lbmNyeXB0ZWQtdmlkZW8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU1MDRmCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2RlbW9zL2NvbnRlbnQvbXVsdGktZW5jcnlwdGVkLXZpZGVvL211bHRpLWVuY3J5cHRlZC12aWRlby5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBodG1sPgorPCEtLQorIHwgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIHwKKyB8IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHwgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIHwgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgfAorIHwgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIHwKKyB8IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyB8IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgfCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyB8IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyB8IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPk11bHRpIEVuY3J5cHRlZCBWaWRlbzwvdGl0bGU+CisgICAgPHN0eWxlPgorICAgICAgICBib2R5IHsKKyAgICAgICAgICBtYXJnaW46IDA7CisgICAgICAgIH0KKworICAgICAgICAjcGxheWVyLWxheWVyIHsKKyAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIH0KKworICAgICAgICB2aWRlbyB7CisgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgICB9CisKKyAgICAgICAgI3VpLWxheWVyIHsKKyAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgdG9wOiAxNSU7CisgICAgICAgICAgaGVpZ2h0OiA4NSU7CisgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzMywgMzMsIDMzLCAuNzUpOworICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CisgICAgICAgIH0KKworICAgICAgICAuaXRlbSB7CisgICAgICAgICAgd2lkdGg6IDQyNnB4OworICAgICAgICAgIGhlaWdodDogMjQwcHg7CisgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgIG1hcmdpbjogMjRweDsKKyAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJwbGF5ZXItbGF5ZXIiPgorICAgICAgPHZpZGVvIGNsYXNzPSJwcmltYXJ5IiBpZD0icHJpbWFyeS12aWRlbyIgbXV0ZWQ9IjEiIGF1dG9wbGF5PSIxIj48L3ZpZGVvPgorICAgIDwvZGl2PgorICAgIDxkaXYgaWQ9InVpLWxheWVyIj4KKyAgICAgIDxkaXYgY2xhc3M9Iml0ZW0iIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRDQ0Ij4KKyAgICAgICAgPHZpZGVvIGNsYXNzPSJzZWNvbmRhcnkiIGlkPSJzZWNvbmRhcnktdmlkZW8tMSIgbXV0ZWQ9IjEiIGF1dG9wbGF5PSIxIj48L3ZpZGVvPgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJpdGVtIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzRENCI+CisgICAgICAgIDx2aWRlbyBjbGFzcz0ic2Vjb25kYXJ5IiBpZD0ic2Vjb25kYXJ5LXZpZGVvLTIiIG11dGVkPSIxIiBhdXRvcGxheT0iMSI+PC92aWRlbz4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0iaXRlbSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM0NEQiPgorICAgICAgICA8dmlkZW8gY2xhc3M9InNlY29uZGFyeSIgaWQ9InNlY29uZGFyeS12aWRlby0zIiBtdXRlZD0iMSIgYXV0b3BsYXk9IjEiPjwvdmlkZW8+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8c2NyaXB0IHNyYz0ibXVsdGktZW5jcnlwdGVkLXZpZGVvLmpzIj48L3NjcmlwdD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29iYWx0L2RlbW9zL2NvbnRlbnQvbXVsdGktZW5jcnlwdGVkLXZpZGVvL211bHRpLWVuY3J5cHRlZC12aWRlby5qcyBiL2NvYmFsdC9kZW1vcy9jb250ZW50L211bHRpLWVuY3J5cHRlZC12aWRlby9tdWx0aS1lbmNyeXB0ZWQtdmlkZW8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4ZDExYwotLS0gL2Rldi9udWxsCisrKyBiL2NvYmFsdC9kZW1vcy9jb250ZW50L211bHRpLWVuY3J5cHRlZC12aWRlby9tdWx0aS1lbmNyeXB0ZWQtdmlkZW8uanMKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnVuY3Rpb24gZmV0Y2hBcnJheUJ1ZmZlcihtZXRob2QsIHVybCwgYm9keSwgY2FsbGJhY2spIHsKKyAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKKyAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbigpIHsKKyAgICBjYWxsYmFjayh4aHIucmVzcG9uc2UpOworICB9KTsKKyAgeGhyLm9wZW4obWV0aG9kLCB1cmwpOworICB4aHIuc2VuZChib2R5KTsKK30KKworZnVuY3Rpb24gZXh0cmFjdExpY2Vuc2UobGljZW5zZUFycmF5QnVmZmVyKSB7CisgIHZhciBsaWNlbnNlQXJyYXkgPSBuZXcgVWludDhBcnJheShsaWNlbnNlQXJyYXlCdWZmZXIpOworICB2YXIgbGljZW5zZVN0YXJ0SW5kZXggPSBsaWNlbnNlQXJyYXkubGVuZ3RoIC0gMjsKKyAgd2hpbGUgKGxpY2Vuc2VTdGFydEluZGV4ID49IDApIHsKKyAgICBpZiAobGljZW5zZUFycmF5W2xpY2Vuc2VTdGFydEluZGV4XSA9PSAxMyAmJgorICAgICAgICBsaWNlbnNlQXJyYXlbbGljZW5zZVN0YXJ0SW5kZXggKyAxXSA9PSAxMCkgeworICAgICAgbGljZW5zZVN0YXJ0SW5kZXggKz0gMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAtLWxpY2Vuc2VTdGFydEluZGV4OworICB9CisKKyAgcmV0dXJuIGxpY2Vuc2VBcnJheS5zdWJhcnJheShsaWNlbnNlU3RhcnRJbmRleCk7Cit9CisKK3ZhciB2aWRlb0NvbnRlbnRUeXBlID0gJ3ZpZGVvL21wNDsgY29kZWNzPSJhdmMxLjY0MDAyOCInOwordmFyIGF1ZGlvQ29udGVudFR5cGUgPSAnYXVkaW8vbXA0OyBjb2RlY3M9Im1wNGEuNDAuMiInOworCitmdW5jdGlvbiBwbGF5KHZpZGVvRWxlbWVudElkLCBrZXlTeXN0ZW0pIHsKKyAgbmF2aWdhdG9yLnJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2VzcyhrZXlTeXN0ZW0sIFt7CisgICAgJ2luaXREYXRhVHlwZXMnOiBbJ2NlbmMnXSwKKyAgICAndmlkZW9DYXBhYmlsaXRpZXMnOiBbeydjb250ZW50VHlwZSc6IHZpZGVvQ29udGVudFR5cGV9XSwKKyAgICAnYXVkaW9DYXBhYmlsaXRpZXMnOiBbeydjb250ZW50VHlwZSc6IGF1ZGlvQ29udGVudFR5cGV9XQorICB9XSkudGhlbihmdW5jdGlvbihtZWRpYUtleVN5c3RlbUFjY2VzcykgeworICAgIHJldHVybiBtZWRpYUtleVN5c3RlbUFjY2Vzcy5jcmVhdGVNZWRpYUtleXMoKTsKKyAgfSkudGhlbihmdW5jdGlvbihtZWRpYUtleXMpIHsKKyAgICB2YXIgdmlkZW9FbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmlkZW9FbGVtZW50SWQpOworCisgICAgaWYgKHZpZGVvRWxlbWVudElkICE9ICdwcmltYXJ5LXZpZGVvJykgeworICAgICAgdmlkZW9FbGVtZW50LnNldE1heFZpZGVvQ2FwYWJpbGl0aWVzKCd3aWR0aD0xMjgwOyBoZWlnaHQ9NzIwJyk7CisgICAgfQorCisgICAgaWYgKG1lZGlhS2V5cy5nZXRNZXRyaWNzKSB7CisgICAgICBjb25zb2xlLmxvZygnRm91bmQgZ2V0TWV0cmljcygpLCBjYWxsaW5nIGl0IC4uLicpOworICAgICAgdHJ5IHsKKyAgICAgICAgbWVkaWFLZXlzLmdldE1ldHJpY3MoKTsKKyAgICAgICAgY29uc29sZS5sb2coJ0NhbGxpbmcgZ2V0TWV0cmljcygpIHN1Y2NlZWRlZC4nKTsKKyAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICBjb25zb2xlLmxvZygnQ2FsbGluZyBnZXRNZXRyaWNzKCkgZmFpbGVkLicpOworICAgICAgfQorICAgIH0KKworICAgIHZpZGVvRWxlbWVudC5zZXRNZWRpYUtleXMobWVkaWFLZXlzKTsKKworICAgIG1lZGlhS2V5U2Vzc2lvbiA9IG1lZGlhS2V5cy5jcmVhdGVTZXNzaW9uKCk7CisgICAgbWVkaWFLZXlTZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihtZXNzYWdlRXZlbnQpIHsKKyAgICAgIHZhciBsaWNlbnNlU2VydmVyVXJsID0gJ2h0dHBzOi8vZGFzaC1tc2UtdGVzdC5hcHBzcG90LmNvbS9hcGkvZHJtL3dpZGV2aW5lP2RybV9zeXN0ZW09d2lkZXZpbmUmc291cmNlPVlPVVRVQkUmaXA9MC4wLjAuMCZpcGJpdHM9MCZleHBpcmU9MTkwMDAwMDAwMDAma2V5PXRlc3Rfa2V5MSZzcGFyYW1zPWlwLGlwYml0cyxleHBpcmUsZHJtX3N5c3RlbSxzb3VyY2UsdmlkZW9faWQmdmlkZW9faWQ9MDM2ODEyNjJkYzQxMmMwNiZzaWduYXR1cmU9OUM0QkU5OUU2RjUxN0I1MUZFRDFGMEIzQjMxOTY2RDNDNURBQjlENi42QTFGMzBCQjM1RjNBMzlBNENBODE0QjczMTQ1MEQ0Q0JEMTk4RkZEJzsKKyAgICAgIGZldGNoQXJyYXlCdWZmZXIoJ1BPU1QnLCBsaWNlbnNlU2VydmVyVXJsLCBtZXNzYWdlRXZlbnQubWVzc2FnZSwKKyAgICAgICAgICBmdW5jdGlvbihsaWNlbnNlQXJyYXlCdWZmZXIpIHsKKyAgICAgICAgICAgIG1lZGlhS2V5U2Vzc2lvbi51cGRhdGUoZXh0cmFjdExpY2Vuc2UobGljZW5zZUFycmF5QnVmZmVyKSk7CisgICAgICAgICAgfSk7CisgICAgfSk7CisKKyAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZW5jcnlwdGVkJywgZnVuY3Rpb24oZW5jcnlwdGVkRXZlbnQpIHsKKyAgICAgIG1lZGlhS2V5U2Vzc2lvbi5nZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgICAgZW5jcnlwdGVkRXZlbnQuaW5pdERhdGFUeXBlLCBlbmNyeXB0ZWRFdmVudC5pbml0RGF0YSk7CisgICAgfSk7CisKKyAgICB2YXIgbWVkaWFTb3VyY2UgPSBuZXcgTWVkaWFTb3VyY2UoKTsKKyAgICBtZWRpYVNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCdzb3VyY2VvcGVuJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgdmlkZW9Tb3VyY2VCdWZmZXIgPSBtZWRpYVNvdXJjZS5hZGRTb3VyY2VCdWZmZXIodmlkZW9Db250ZW50VHlwZSk7CisgICAgICBmZXRjaEFycmF5QnVmZmVyKCdHRVQnLAorICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8veXQtZGFzaC1tc2UtdGVzdC5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9tZWRpYS9vb3BzX2NlbmMtMjAxMjExMTQtMTQ1LW5vLWNsZWFyLXN0YXJ0Lm1wNCcsCisgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2aWRlb0FycmF5QnVmZmVyKSB7CisgICAgICAgIHZpZGVvU291cmNlQnVmZmVyLmFwcGVuZEJ1ZmZlcih2aWRlb0FycmF5QnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICB2YXIgYXVkaW9Tb3VyY2VCdWZmZXIgPSBtZWRpYVNvdXJjZS5hZGRTb3VyY2VCdWZmZXIoYXVkaW9Db250ZW50VHlwZSk7CisgICAgICBmZXRjaEFycmF5QnVmZmVyKCdHRVQnLAorICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8veXQtZGFzaC1tc2UtdGVzdC5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9tZWRpYS9vb3BzX2NlbmMtMjAxMjExMTQtMTQ4Lm1wNCcsCisgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihhdWRpb0FycmF5QnVmZmVyKSB7CisgICAgICAgIGF1ZGlvU291cmNlQnVmZmVyLmFwcGVuZEJ1ZmZlcihhdWRpb0FycmF5QnVmZmVyKTsKKyAgICAgIH0pOworICAgIH0pOworCisgICAgdmlkZW9FbGVtZW50LnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwobWVkaWFTb3VyY2UpOworICAgIHZpZGVvRWxlbWVudC5wbGF5KCk7CisgIH0pOworfQorCitwbGF5KCdwcmltYXJ5LXZpZGVvJywgJ2NvbS53aWRldmluZS5hbHBoYScpOword2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgIHBsYXkoJ3NlY29uZGFyeS12aWRlby0xJywgJ2NvbS55b3V0dWJlLndpZGV2aW5lLmwzJyk7Cit9LCAxMDAwMCk7Cit3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgcGxheSgnc2Vjb25kYXJ5LXZpZGVvLTInLCAnY29tLnlvdXR1YmUud2lkZXZpbmUubDMnKTsKK30sIDIwMDAwKTsKK3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICBwbGF5KCdzZWNvbmRhcnktdmlkZW8tMycsICdjb20ueW91dHViZS53aWRldmluZS5sMycpOworfSwgMzAwMDApOwpkaWZmIC0tZ2l0IGEvY29iYWx0L2RlbW9zL2NvbnRlbnQvdGVsZW1ldHJ5L2luZGV4Lmh0bWwgYi9jb2JhbHQvZGVtb3MvY29udGVudC90ZWxlbWV0cnkvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc0NGE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2RlbW9zL2NvbnRlbnQvdGVsZW1ldHJ5L2luZGV4Lmh0bWwKQEAgLTAsMCArMSw3MCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CisKKzxoZWFkPgorICAgIDx0aXRsZT5Db2JhbHQgVGVsZW1ldHJ5IERlbW88L3RpdGxlPgorICAgIDxzdHlsZT4KKyAgICAgICAgYm9keSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKyAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7CisgICAgICAgIH0KKworICAgICAgICBoMSB7CisgICAgICAgICAgICBmb250LXNpemU6IDJlbTsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICB9CisKKyAgICAgICAgI2xvZyB7CisgICAgICAgICAgICBjb2xvcjogYmx1ZTsKKyAgICAgICAgICAgIGZvbnQtc2l6ZTogMWVtOworICAgICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgICAgICAgfQorICAgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCisgICAgPGgxPkxPRyBPVVRQVVQ6PC9oMT4KKyAgICA8ZGl2IGlkPSJsb2ciPjwvZGl2PgorCisgICAgPHNjcmlwdD4KKyAgICAgICAgY29uc3QgTE9HX0NPTlRBSU5FUiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2cnKTsKKyAgICAgICAgY29uc3QgRVZFTlRfSU5URVJWQUxfU0VDUyA9IDEwOworCisgICAgICAgIGZ1bmN0aW9uIG1ldHJpY0V2ZW50SGFuZGxlcihtZXRyaWNUeXBlLCBwYXlsb2FkKSB7CisgICAgICAgICAgICBsb2coYE5ldyBtZXRyaWMgcGF5bG9hZCByZWNlaXZlZDogbWV0cmljVHlwZTogJHttZXRyaWNUeXBlfSwgcGF5bG9hZDogJHtwYXlsb2FkfWApOworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHsKKyAgICAgICAgICAgIGxvZygnSW5pdGlhbGl6aW5nIHdpbmRvdy5oNXZjYy5tZXRyaWNzLicpOworICAgICAgICAgICAgbGV0IHRpbWVyID0gMDsKKyAgICAgICAgICAgIGxldCBpbnRlcnZhbCA9IDEwMDAwOworICAgICAgICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4geworICAgICAgICAgICAgICAgIHRpbWVyICs9IGludGVydmFsOworICAgICAgICAgICAgICAgIGxvZyhgdGltZXI6ICR7dGltZXIgLyAxMDAwfXNgKTsKKyAgICAgICAgICAgIH0sIGludGVydmFsKTsKKworICAgICAgICAgICAgY29uc3QgbWV0cmljcyA9IHdpbmRvdy5oNXZjYy5tZXRyaWNzOworICAgICAgICAgICAgbG9nKGBHZXR0aW5nIG1ldHJpY3MgZW5hYmxlZCBzdGF0ZSBtZXRyaWNzLmlzRW5hYmxlZCgpOiAke21ldHJpY3MuaXNFbmFibGVkKCl9YCk7CisgICAgICAgICAgICBsb2coJ0VuYWJsaW5nIG1ldHJpY3MgcmVwb3J0aW5nOiBtZXRyaWNzLmVuYWJsZSgpJyk7CisgICAgICAgICAgICBtZXRyaWNzLmVuYWJsZSgpOworICAgICAgICAgICAgbG9nKGBTZXR0aW5nIG1ldHJpYyBldmVudCBpbnRlcnZhbDogbWV0cmljcy5zZXRNZXRyaWNFdmVudEludGVydmFsKCR7RVZFTlRfSU5URVJWQUxfU0VDU30pYCk7CisgICAgICAgICAgICBsb2coYE5vdGUgdGhhdCB0aGUgZmlyc3QgdXBsb2FkIGludGVydmFsIHdpbGwgYWx3YXlzIGJlIDYwIHNlY29uZHMsIHJlZ2FyZGxlc3Mgb2YgbWV0cmljRXZlbnRJbnRlcnZhbC5gKTsKKyAgICAgICAgICAgIG1ldHJpY3Muc2V0TWV0cmljRXZlbnRJbnRlcnZhbChFVkVOVF9JTlRFUlZBTF9TRUNTKTsKKyAgICAgICAgICAgIGxvZygnQmluZGluZyBtZXRyaWMgZXZlbnQgaGFuZGxlcjogbWV0cmljcy5vbk1ldHJpY0V2ZW50KG1ldHJpY0V2ZW50SGFuZGxlciknKTsKKyAgICAgICAgICAgIG1ldHJpY3Mub25NZXRyaWNFdmVudChtZXRyaWNFdmVudEhhbmRsZXIpOworICAgICAgICAgICAgbG9nKGBHZXR0aW5nIG1ldHJpY3MgZW5hYmxlZCBzdGF0ZSBtZXRyaWNzLmlzRW5hYmxlZCgpOiAke21ldHJpY3MuaXNFbmFibGVkKCl9YCk7CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBsb2cobG9nVGV4dCkgeworICAgICAgICAgICAgbGV0IGxvZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgICAgICAgbG9nLnRleHRDb250ZW50ID0gbG9nVGV4dDsKKyAgICAgICAgICAgIExPR19DT05UQUlORVIuYXBwZW5kQ2hpbGQobG9nKTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXQoKTsKKyAgICA8L3NjcmlwdD4KKzwvYm9keT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29iYWx0L2RvYy9jdmFscy5tZCBiL2NvYmFsdC9kb2MvY3ZhbHMubWQKaW5kZXggNDdlYjU1YS4uNmFjY2Q4ZiAxMDA2NDQKLS0tIGEvY29iYWx0L2RvYy9jdmFscy5tZAorKysgYi9jb2JhbHQvZG9jL2N2YWxzLm1kCkBAIC03NSw3ICs3NSw3IEBACiAKICMjIyMgUHVibGljQ1ZhbHMKIAotKiAgICoqQ291bnQuRE9NLkV2ZW50TGlzdGVuZXJzKiogLSBUaGUgdG90YWwgbnVtYmVyIG9mIEV2ZW50TGlzdGVuZXJzIGluCisqICAgKipDb3VudC5XRUIuRXZlbnRMaXN0ZW5lcnMqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgRXZlbnRMaXN0ZW5lcnMgaW4KICAgICBleGlzdGVuY2UgZ2xvYmFsbHkuIFRoaXMgaW5jbHVkZXMgb25lcyB0aGF0IGFyZSBwZW5kaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4KICogICAqKkNvdW50LkRPTS5Ob2RlcyoqIC0gVGhlIHRvdGFsIG51bWJlciBvZiBOb2RlcyBpbiBleGlzdGVuY2UgZ2xvYmFsbHkuIFRoaXMKICAgICBpbmNsdWRlcyBvbmVzIHRoYXQgYXJlIHBlbmRpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLgpAQCAtOTEsNyArOTEsNyBAQAogCiAjIyMjIERlYnVnQ1ZhbHMKIAotKiAgICoqQ291bnQuRE9NLkFjdGl2ZUphdmFTY3JpcHRFdmVudHMqKiAtIFRoZSBudW1iZXIgb2YgSmF2YVNjcmlwdCBldmVudHMgdGhhdAorKiAgICoqQ291bnQuV0VCLkFjdGl2ZUphdmFTY3JpcHRFdmVudHMqKiAtIFRoZSBudW1iZXIgb2YgSmF2YVNjcmlwdCBldmVudHMgdGhhdAogICAgIGFyZSBjdXJyZW50bHkgcnVubmluZy4KICogICAqKkNvdW50LkRPTS5BdHRycyoqIC0gVGhlIHRvdGFsIG51bWJlciBvZiBBdHRycyBpbiBleGlzdGVuY2UgZ2xvYmFsbHkuIFRoaXMKICAgICBpbmNsdWRlcyBvbmVzIHRoYXQgYXJlIHBlbmRpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLgpkaWZmIC0tZ2l0IGEvY29iYWx0L2RvYy9kZXZpY2VfYXV0aGVudGljYXRpb24ubWQgYi9jb2JhbHQvZG9jL2RldmljZV9hdXRoZW50aWNhdGlvbi5tZAppbmRleCA2ZWY4NGE1Li5mOTBhYTU0IDEwMDY0NAotLS0gYS9jb2JhbHQvZG9jL2RldmljZV9hdXRoZW50aWNhdGlvbi5tZAorKysgYi9jb2JhbHQvZG9jL2RldmljZV9hdXRoZW50aWNhdGlvbi5tZApAQCAtMzQsOCArMzQsMTcgQEAKIGZ1bmN0aW9uIHRvIHNpZ24gdGhlIG1lc3NhZ2UgdXNpbmcgdGhlIHNlY3JldCBrZXkuICBUaGlzIG1ldGhvZCBpcyBwcmVmZXJyZWQKIHNpbmNlIGl0IGVuYWJsZXMgaW1wbGVtZW50YXRpb25zIHdoZXJlIHRoZSBrZXkgZXhpc3RzIG9ubHkgaW4gc2VjdXJlIGhhcmR3YXJlCiBhbmQgbmV2ZXIgZW50ZXJzIHRoZSBzeXN0ZW0ncyBtYWluIG1lbW9yeS4gIEEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB3aGljaAotZGVwZW5kcyBvbiBCb3JpbmdTU0wgZXhpc3RzIGF0Ci1baW50ZXJuYWwvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9pbnRlcm5hbC9zeXN0ZW1fc2lnbl93aXRoX2NlcnRpZmljYXRpb25fc2VjcmV0X2tleS5jY10oLi4vLi4vaW50ZXJuYWwvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9pbnRlcm5hbC9zeXN0ZW1fc2lnbl93aXRoX2NlcnRpZmljYXRpb25fc2VjcmV0X2tleS5jYykuCitkZXBlbmRzIG9uIEJvcmluZ1NTTCwgaXMgYXMgZm9sbG93czoKKworYGBgQysrCitib29sIFNiU3lzdGVtU2lnbldpdGhDZXJ0aWZpY2F0aW9uU2VjcmV0S2V5KAorICAgIGNvbnN0IHVpbnQ4X3QqIG1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlX3NpemVfaW5fYnl0ZXMsCisgICAgdWludDhfdCogZGlnZXN0LCBzaXplX3QgZGlnZXN0X3NpemVfaW5fYnl0ZXMpIHsKKyAgcmV0dXJuIHN0YXJib2FyZDo6c2hhcmVkOjpkZXZpY2VhdXRoOjpTaWduV2l0aENlcnRpZmljYXRpb25TZWNyZXRLZXkoCisgICAgICBrQmFzZTY0RW5jb2RlZENlcnRpZmljYXRpb25TZWNyZXQsCisgICAgICBtZXNzYWdlLCBtZXNzYWdlX3NpemVfaW5fYnl0ZXMsIGRpZ2VzdCwgZGlnZXN0X3NpemVfaW5fYnl0ZXMpOworfQorYGBgCiAKICMjIyBDb2JhbHQgc2lnbmluZwogCmRpZmYgLS1naXQgYS9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmNjIGIvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5jYwppbmRleCA4OTJkYWQ5Li40ODc5MjIxIDEwMDY0NAotLS0gYS9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmNjCisrKyBiL2NvYmFsdC9kb20va2V5Ym9hcmRfZXZlbnQuY2MKQEAgLTMzNyw2ICszMzcsMTAgQEAKICAgICAgIHJldHVybiAiTWVkaWFTdG9wIjsKICAgICBjYXNlIGtleWNvZGU6OmtNZWRpYVBsYXlQYXVzZToKICAgICAgIHJldHVybiAiTWVkaWFQbGF5UGF1c2UiOworI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1CisgICAgY2FzZSBrZXljb2RlOjprTWVkaWFSZWNvcmQ6CisgICAgICByZXR1cm4gIk1lZGlhUmVjb3JkIjsKKyNlbmRpZgogICAgIGNhc2Uga2V5Y29kZTo6a01lZGlhTGF1bmNoTWFpbDoKICAgICAgIHJldHVybiAiTGF1bmNoTWFpbCI7CiAgICAgY2FzZSBrZXljb2RlOjprTWVkaWFMYXVuY2hNZWRpYVNlbGVjdDoKZGlmZiAtLWdpdCBhL2NvYmFsdC9kb20va2V5Ym9hcmRfZXZlbnRfdGVzdC5jYyBiL2NvYmFsdC9kb20va2V5Ym9hcmRfZXZlbnRfdGVzdC5jYwppbmRleCBhZDFkYjFmLi4wZjk4NDNlIDEwMDY0NAotLS0gYS9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50X3Rlc3QuY2MKKysrIGIvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudF90ZXN0LmNjCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5oIgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW5zLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9nbG9iYWxfc3RhdHMuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50X2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWNvZGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvZG9tL2dsb2JhbF9zdGF0cy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTEzNCw2ICsxMzQsMTUgQEAKICAgRVhQRUNUX0VRKGtleWJvYXJkX2V2ZW50X3NwYWNlLT5rZXlfaWRlbnRpZmllcigpLCAiICIpOwogICBFWFBFQ1RfRVEoa2V5Ym9hcmRfZXZlbnRfc3BhY2UtPmtleSgpLCAiICIpOwogICBFWFBFQ1RfRVEoa2V5Ym9hcmRfZXZlbnRfc3BhY2UtPmNvZGUoKSwgIlNwYWNlIik7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQorICBpbml0LnNldF9rZXlfY29kZShrZXljb2RlOjprTWVkaWFSZWNvcmQpOworICBzY29wZWRfcmVmcHRyPEtleWJvYXJkRXZlbnQ+IGtleWJvYXJkX2V2ZW50X3JlY29yZCA9CisgICAgICBuZXcgS2V5Ym9hcmRFdmVudCgia2V5ZG93biIsIGluaXQpOworICBFWFBFQ1RfRVEoa2V5Ym9hcmRfZXZlbnRfcmVjb3JkLT5rZXlfaWRlbnRpZmllcigpLCAiTWVkaWFSZWNvcmQiKTsKKyAgRVhQRUNUX0VRKGtleWJvYXJkX2V2ZW50X3JlY29yZC0+a2V5KCksICJNZWRpYVJlY29yZCIpOworICBFWFBFQ1RfRVEoa2V5Ym9hcmRfZXZlbnRfcmVjb3JkLT5jb2RlKCksICJNZWRpYVJlY29yZCIpOworI2VuZGlmCiB9CiAKIFRFU1RfRihLZXlib2FyZEV2ZW50VGVzdCwgQ2FuR2V0QWx0S2V5KSB7CmRpZmYgLS1naXQgYS9jb2JhbHQvZG9tL2tleWNvZGUuaCBiL2NvYmFsdC9kb20va2V5Y29kZS5oCmluZGV4IDJkZDJiMmYuLmFmZGExOGYgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9kb20va2V5Y29kZS5oCisrKyBiL2NvYmFsdC9kb20va2V5Y29kZS5oCkBAIC0yMDAsNiArMjAwLDkgQEAKICAgLy8gTm90IHByZXNlbnQgaW4gV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlcywgYnV0IHdvdWxkIGJlIHVzZWQgYnkgdGhlIGNsaWVudC4KICAga01lZGlhUmV3aW5kID0gMHhFMywKICAga01lZGlhRmFzdEZvcndhcmQgPSAweEU0LAorI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1CisgIGtNZWRpYVJlY29yZCA9IDB4MUEwLAorI2VuZGlmCiB9OwogCiB9ICAvLyBuYW1lc3BhY2Uga2V5Y29kZQpkaWZmIC0tZ2l0IGEvY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmggYi9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaAppbmRleCBlYThkZmQzLi4zNmQ5NTlkIDEwMDY0NAotLS0gYS9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaAorKysgYi9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaApAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CiAgIHZvaWQgRGVsZXRlKGNvbnN0IGxvYWRlcjo6T3JpZ2luJiBvcmlnaW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOwogICB2b2lkIENsZWFyKGNvbnN0IGxvYWRlcjo6T3JpZ2luJiBvcmlnaW4pOwotICB2b2lkIEZsdXNoKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKTsKKyAgdm9pZCBGbHVzaChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjayA9IGJhc2U6OkNsb3N1cmUoKSk7CiAKICBwcml2YXRlOgogICB2b2lkIEluaXQoKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9kb20vdXNlcl9hZ2VudF9kYXRhX3Rlc3QuY2MgYi9jb2JhbHQvZG9tL3VzZXJfYWdlbnRfZGF0YV90ZXN0LmNjCmluZGV4IGNkNjg4NmYuLmRmMDU5NWEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9kb20vdXNlcl9hZ2VudF9kYXRhX3Rlc3QuY2MKKysrIGIvY29iYWx0L2RvbS91c2VyX2FnZW50X2RhdGFfdGVzdC5jYwpAQCAtNDAsMTEgKzQwLDEwIEBACiAKICAgICAvLyBJbmplY3QgSDV2Y2MgaW50ZXJmYWNlIHRvIG1ha2UgaXQgYWxzbyBhY2Nlc3NpYmxlIHZpYSBXaW5kb3cKICAgICBoNXZjYzo6SDV2Y2M6OlNldHRpbmdzIGg1dmNjX3NldHRpbmdzOwotICAgIGg1dmNjX3NldHRpbmdzLm5ldHdvcmtfbW9kdWxlID0gTlVMTDsKKyAgICBoNXZjY19zZXR0aW5ncy5uZXR3b3JrX21vZHVsZSA9IG51bGxwdHI7CiAjaWYgU0JfSVMoRVZFUkdSRUVOKQotICAgIGg1dmNjX3NldHRpbmdzLnVwZGF0ZXJfbW9kdWxlID0gTlVMTDsKKyAgICBoNXZjY19zZXR0aW5ncy51cGRhdGVyX21vZHVsZSA9IG51bGxwdHI7CiAjZW5kaWYKLSAgICBoNXZjY19zZXR0aW5ncy5hY2NvdW50X21hbmFnZXIgPSBOVUxMOwogICAgIGg1dmNjX3NldHRpbmdzLmV2ZW50X2Rpc3BhdGNoZXIgPSBldmVudF9kaXNwYXRjaGVyKCk7CiAgICAgaDV2Y2Nfc2V0dGluZ3MudXNlcl9hZ2VudF9kYXRhID0gd2luZG93KCktPm5hdmlnYXRvcigpLT51c2VyX2FnZW50X2RhdGEoKTsKICAgICBoNXZjY19zZXR0aW5ncy5nbG9iYWxfZW52aXJvbm1lbnQgPSBnbG9iYWxfZW52aXJvbm1lbnQoKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9oNXZjYy9CVUlMRC5nbiBiL2NvYmFsdC9oNXZjYy9CVUlMRC5nbgppbmRleCA3ZWNjMWVlLi5mMDgxY2U0IDEwMDY0NAotLS0gYS9jb2JhbHQvaDV2Y2MvQlVJTEQuZ24KKysrIGIvY29iYWx0L2g1dmNjL0JVSUxELmduCkBAIC00OSw2ICs0OSw4IEBACiAgICAgImg1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuY2MiLAogICAgICJoNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmgiLAogICAgICJoNXZjY19ldmVudF9saXN0ZW5lcl9jb250YWluZXIuaCIsCisgICAgImg1dmNjX21ldHJpY3MuY2MiLAorICAgICJoNXZjY19tZXRyaWNzLmgiLAogICAgICJoNXZjY19wbGF0Zm9ybV9zZXJ2aWNlLmNjIiwKICAgICAiaDV2Y2NfcGxhdGZvcm1fc2VydmljZS5oIiwKICAgICAiaDV2Y2NfcnVudGltZS5jYyIsCkBAIC02OSw5ICs3MSwxMSBAQAogICBjb25maWdzICs9IFsgIjpoNXZjY19pbnRlcm5hbF9jb25maWciIF0KICAgcHVibGljX2NvbmZpZ3MgPSBbICI6aDV2Y2NfZXh0ZXJuYWxfY29uZmlnIiBdCiAgIGRlcHMgPSBbCi0gICAgIi8vY29iYWx0L2FjY291bnQiLAorICAgICI6bWV0cmljX2V2ZW50X2hhbmRsZXJfd3JhcHBlciIsCisgICAgIjpzY3JpcHRfY2FsbGJhY2tfd3JhcHBlciIsCiAgICAgIi8vY29iYWx0L2Jhc2UiLAogICAgICIvL2NvYmFsdC9icm93c2VyOmJyb3dzZXJfc3dpdGNoZXMiLAorICAgICIvL2NvYmFsdC9icm93c2VyL21ldHJpY3MiLAogICAgICIvL2NvYmFsdC9idWlsZDpjb2JhbHRfYnVpbGRfaWQiLAogICAgICIvL2NvYmFsdC9jYWNoZSIsCiAgICAgIi8vY29iYWx0L2NvbmZpZ3VyYXRpb24iLApAQCAtMTA3LDMgKzExMSwxOSBAQAogICAgIGRlcHMgKz0gWyAiLy9jb2JhbHQvdXBkYXRlciIgXQogICB9CiB9CisKK3NvdXJjZV9zZXQoInNjcmlwdF9jYWxsYmFja193cmFwcGVyIikgeworICBzb3VyY2VzID0gWyAic2NyaXB0X2NhbGxiYWNrX3dyYXBwZXIuaCIgXQorCisgIGRlcHMgPSBbICIvL2NvYmFsdC9zY3JpcHQiIF0KK30KKworc291cmNlX3NldCgibWV0cmljX2V2ZW50X2hhbmRsZXJfd3JhcHBlciIpIHsKKyAgc291cmNlcyA9IFsgIm1ldHJpY19ldmVudF9oYW5kbGVyX3dyYXBwZXIuaCIgXQorCisgIGRlcHMgPSBbCisgICAgIjpzY3JpcHRfY2FsbGJhY2tfd3JhcHBlciIsCisgICAgIi8vY29iYWx0L2Jyb3dzZXI6Z2VuZXJhdGVkX3R5cGVzIiwKKyAgICAiLy9jb2JhbHQvc2NyaXB0IiwKKyAgXQorfQpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuaCBiL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfc2VydmVyLmgKaW5kZXggMDg2YjFjNy4uMjBlODlhZCAxMDA2NDQKLS0tIGEvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuaAorKysgYi9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX3NlcnZlci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5oIgorI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9zY3JpcHRfY2FsbGJhY2tfd3JhcHBlci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2Vudmlyb25tZW50X3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKQEAgLTM1LDE3ICszNiw2IEBACiBuYW1lc3BhY2UgaDV2Y2MgewogbmFtZXNwYWNlIGRpYWwgewogCi0vLyBUZW1wbGF0ZSBib2lsZXJwbGF0ZSBmb3Igd3JhcHBpbmcgYSBzY3JpcHQgY2FsbGJhY2sgc2FmZWx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTY3JpcHRDYWxsYmFja1dyYXBwZXIKLSAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTY3JpcHRDYWxsYmFja1dyYXBwZXI8VD4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8VD4gU2NyaXB0VmFsdWU7Ci0gIFNjcmlwdENhbGxiYWNrV3JhcHBlcihzY3JpcHQ6OldyYXBwYWJsZSogd3JhcHBhYmxlLCBjb25zdCBTY3JpcHRWYWx1ZSYgZnVuYykKLSAgICAgIDogY2FsbGJhY2sod3JhcHBhYmxlLCBmdW5jKSB7fQotICB0eXBlbmFtZSBTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlIGNhbGxiYWNrOwotfTsKLQogY2xhc3MgRGlhbFNlcnZlciA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSwKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYmFzZTo6U3VwcG9ydHNXZWFrUHRyPERpYWxTZXJ2ZXI+IHsKICBwdWJsaWM6CmRpZmYgLS1naXQgYS9jb2JhbHQvaDV2Y2MvaDV2Y2MuY2MgYi9jb2JhbHQvaDV2Y2MvaDV2Y2MuY2MKaW5kZXggZmRjMDg5My4uOGQ5NTdiOCAxMDA2NDQKLS0tIGEvY29iYWx0L2g1dmNjL2g1dmNjLmNjCisrKyBiL2NvYmFsdC9oNXZjYy9oNXZjYy5jYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc291cmNlX2NvZGUuaCIKICNlbmRpZgogCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaCIKICNpbmNsdWRlICJjb2JhbHQvcGVyc2lzdGVudF9zdG9yYWdlL3BlcnNpc3RlbnRfc2V0dGluZ3MuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0yNiwxMCArMjcsMTEgQEAKIAogSDV2Y2M6Okg1dmNjKGNvbnN0IFNldHRpbmdzJiBzZXR0aW5ncykgewogICBhY2Nlc3NpYmlsaXR5XyA9IG5ldyBINXZjY0FjY2Vzc2liaWxpdHkoc2V0dGluZ3MuZXZlbnRfZGlzcGF0Y2hlcik7Ci0gIGFjY291bnRfaW5mb18gPSBuZXcgSDV2Y2NBY2NvdW50SW5mbyhzZXR0aW5ncy5hY2NvdW50X21hbmFnZXIpOworICBhY2NvdW50X2luZm9fID0gbmV3IEg1dmNjQWNjb3VudEluZm8oKTsKICAgYXVkaW9fY29uZmlnX2FycmF5XyA9IG5ldyBINXZjY0F1ZGlvQ29uZmlnQXJyYXkoKTsKICAgY192YWxfID0gbmV3IGRvbTo6Q1ZhbFZpZXcoKTsKICAgY3Jhc2hfbG9nXyA9IG5ldyBINXZjY0NyYXNoTG9nKCk7CisgIG1ldHJpY3NfID0gbmV3IEg1dmNjTWV0cmljcyhzZXR0aW5ncy5wZXJzaXN0ZW50X3NldHRpbmdzKTsKICAgcnVudGltZV8gPSBuZXcgSDV2Y2NSdW50aW1lKHNldHRpbmdzLmV2ZW50X2Rpc3BhdGNoZXIpOwogICBzZXR0aW5nc18gPQogICAgICAgbmV3IEg1dmNjU2V0dGluZ3Moc2V0dGluZ3Muc2V0X3dlYl9zZXR0aW5nX2Z1bmMsIHNldHRpbmdzLm1lZGlhX21vZHVsZSwKQEAgLTczLDYgKzc1LDcgQEAKICAgdHJhY2VyLT5UcmFjZShhdWRpb19jb25maWdfYXJyYXlfKTsKICAgdHJhY2VyLT5UcmFjZShjX3ZhbF8pOwogICB0cmFjZXItPlRyYWNlKGNyYXNoX2xvZ18pOworICB0cmFjZXItPlRyYWNlKG1ldHJpY3NfKTsKICAgdHJhY2VyLT5UcmFjZShydW50aW1lXyk7CiAgIHRyYWNlci0+VHJhY2Uoc2V0dGluZ3NfKTsKICAgdHJhY2VyLT5UcmFjZShzdG9yYWdlXyk7CmRpZmYgLS1naXQgYS9jb2JhbHQvaDV2Y2MvaDV2Y2MuaCBiL2NvYmFsdC9oNXZjYy9oNXZjYy5oCmluZGV4IDc4MzZkYTcuLjBkNjBhN2MgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9oNXZjYy9oNXZjYy5oCisrKyBiL2NvYmFsdC9oNXZjYy9oNXZjYy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWdfYXJyYXkuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfY3Jhc2hfbG9nLmgiCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlLmgiCkBAIC01MSw3ICs1Miw2IEBACiAjaWYgU0JfSVMoRVZFUkdSRUVOKQogICAgICAgICAgIHVwZGF0ZXJfbW9kdWxlKE5VTEwpLAogI2VuZGlmCi0gICAgICAgICAgYWNjb3VudF9tYW5hZ2VyKE5VTEwpLAogICAgICAgICAgIGV2ZW50X2Rpc3BhdGNoZXIoTlVMTCksCiAgICAgICAgICAgdXNlcl9hZ2VudF9kYXRhKE5VTEwpLAogICAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudChOVUxMKSB7CkBAIC02Myw3ICs2Myw2IEBACiAjaWYgU0JfSVMoRVZFUkdSRUVOKQogICAgIHVwZGF0ZXI6OlVwZGF0ZXJNb2R1bGUqIHVwZGF0ZXJfbW9kdWxlOwogI2VuZGlmCi0gICAgYWNjb3VudDo6QWNjb3VudE1hbmFnZXIqIGFjY291bnRfbWFuYWdlcjsKICAgICBiYXNlOjpFdmVudERpc3BhdGNoZXIqIGV2ZW50X2Rpc3BhdGNoZXI7CiAgICAgd2ViOjpOYXZpZ2F0b3JVQURhdGEqIHVzZXJfYWdlbnRfZGF0YTsKICAgICBzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQ7CkBAIC04Miw2ICs4MSw3IEBACiAgIH0KICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206OkNWYWxWaWV3PiYgY192YWwoKSBjb25zdCB7IHJldHVybiBjX3ZhbF87IH0KICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxINXZjY0NyYXNoTG9nPiYgY3Jhc2hfbG9nKCkgY29uc3QgeyByZXR1cm4gY3Jhc2hfbG9nXzsgfQorICBjb25zdCBzY29wZWRfcmVmcHRyPEg1dmNjTWV0cmljcz4mIG1ldHJpY3MoKSBjb25zdCB7IHJldHVybiBtZXRyaWNzXzsgfQogICBjb25zdCBzY29wZWRfcmVmcHRyPEg1dmNjUnVudGltZT4mIHJ1bnRpbWUoKSBjb25zdCB7IHJldHVybiBydW50aW1lXzsgfQogICBjb25zdCBzY29wZWRfcmVmcHRyPEg1dmNjU2V0dGluZ3M+JiBzZXR0aW5ncygpIGNvbnN0IHsgcmV0dXJuIHNldHRpbmdzXzsgfQogICBjb25zdCBzY29wZWRfcmVmcHRyPEg1dmNjU3RvcmFnZT4mIHN0b3JhZ2UoKSBjb25zdCB7IHJldHVybiBzdG9yYWdlXzsgfQpAQCAtMTAyLDYgKzEwMiw3IEBACiAgIHNjb3BlZF9yZWZwdHI8SDV2Y2NBdWRpb0NvbmZpZ0FycmF5PiBhdWRpb19jb25maWdfYXJyYXlfOwogICBzY29wZWRfcmVmcHRyPGRvbTo6Q1ZhbFZpZXc+IGNfdmFsXzsKICAgc2NvcGVkX3JlZnB0cjxINXZjY0NyYXNoTG9nPiBjcmFzaF9sb2dfOworICBzY29wZWRfcmVmcHRyPEg1dmNjTWV0cmljcz4gbWV0cmljc187CiAgIHNjb3BlZF9yZWZwdHI8SDV2Y2NSdW50aW1lPiBydW50aW1lXzsKICAgc2NvcGVkX3JlZnB0cjxINXZjY1NldHRpbmdzPiBzZXR0aW5nc187CiAgIHNjb3BlZF9yZWZwdHI8SDV2Y2NTdG9yYWdlPiBzdG9yYWdlXzsKZGlmZiAtLWdpdCBhL2NvYmFsdC9oNXZjYy9oNXZjYy5pZGwgYi9jb2JhbHQvaDV2Y2MvaDV2Y2MuaWRsCmluZGV4IDkyMDFhMzYuLjE4OGU2NmIgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9oNXZjYy9oNXZjYy5pZGwKKysrIGIvY29iYWx0L2g1dmNjL2g1dmNjLmlkbApAQCAtMzYsNiArMzYsNyBAQAogICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NBdWRpb0NvbmZpZ0FycmF5IGF1ZGlvQ29uZmlnOwogICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NDcmFzaExvZyBjcmFzaExvZzsKICAgcmVhZG9ubHkgYXR0cmlidXRlIENWYWxWaWV3IGNWYWw7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBINXZjY01ldHJpY3MgbWV0cmljczsKICAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjUnVudGltZSBydW50aW1lOwogICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NTZXR0aW5ncyBzZXR0aW5nczsKICAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjU3RvcmFnZSBzdG9yYWdlOwpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5jYyBiL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uY2MKaW5kZXggNzA1YjQ4OC4uYzZiNjMwMyAxMDA2NDQKLS0tIGEvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5jYworKysgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9pbmZvLmNjCkBAIC0xNCwyNyArMTQsNTIgQEAKIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uaCIKIAotI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvdXNlci5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBoNXZjYyB7CiAKLUg1dmNjQWNjb3VudEluZm86Okg1dmNjQWNjb3VudEluZm8oYWNjb3VudDo6QWNjb3VudE1hbmFnZXIqIGFjY291bnRfbWFuYWdlcikKLSAgICA6IGFjY291bnRfbWFuYWdlcl8oYWNjb3VudF9tYW5hZ2VyKSB7fQorbmFtZXNwYWNlIHsKK2NvbnN0IGludCBrTWF4VmFsdWVMZW5ndGggPSA2NCAqIDEwMjQ7CisKK3N0ZDo6c3RyaW5nIEdldEN1cnJlbnRVc2VyUHJvcGVydHkoU2JVc2VyUHJvcGVydHlJZCBwcm9wZXJ0eV9pZCkgeworICBTYlVzZXIgdXNlciA9IFNiVXNlckdldEN1cnJlbnQoKTsKKworICBpZiAoIVNiVXNlcklzVmFsaWQodXNlcikpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBpbnQgc2l6ZSA9IFNiVXNlckdldFByb3BlcnR5U2l6ZSh1c2VyLCBwcm9wZXJ0eV9pZCk7CisgIGlmICghc2l6ZSB8fCBzaXplID4ga01heFZhbHVlTGVuZ3RoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gdmFsdWUobmV3IGNoYXJbc2l6ZV0pOworICBpZiAoIVNiVXNlckdldFByb3BlcnR5KHVzZXIsIHByb3BlcnR5X2lkLCB2YWx1ZS5nZXQoKSwgc2l6ZSkpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSB2YWx1ZS5nZXQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0g1dmNjQWNjb3VudEluZm86Okg1dmNjQWNjb3VudEluZm8oKSB7fQogCiBzdGQ6OnN0cmluZyBINXZjY0FjY291bnRJbmZvOjphdmF0YXJfdXJsKCkgY29uc3QgewotICBEQ0hFQ0soYWNjb3VudF9tYW5hZ2VyXyk7Ci0gIHJldHVybiBhY2NvdW50X21hbmFnZXJfLT5HZXRBdmF0YXJVUkwoKTsKKyAgcmV0dXJuIEdldEN1cnJlbnRVc2VyUHJvcGVydHkoa1NiVXNlclByb3BlcnR5QXZhdGFyVXJsKTsKIH0KIAogc3RkOjpzdHJpbmcgSDV2Y2NBY2NvdW50SW5mbzo6dXNlcm5hbWUoKSBjb25zdCB7Ci0gIERDSEVDSyhhY2NvdW50X21hbmFnZXJfKTsKLSAgcmV0dXJuIGFjY291bnRfbWFuYWdlcl8tPkdldFVzZXJuYW1lKCk7CisgIHJldHVybiBHZXRDdXJyZW50VXNlclByb3BlcnR5KGtTYlVzZXJQcm9wZXJ0eVVzZXJOYW1lKTsKIH0KIAogc3RkOjpzdHJpbmcgSDV2Y2NBY2NvdW50SW5mbzo6dXNlcl9pZCgpIGNvbnN0IHsKLSAgRENIRUNLKGFjY291bnRfbWFuYWdlcl8pOwotICByZXR1cm4gYWNjb3VudF9tYW5hZ2VyXy0+R2V0VXNlcklkKCk7CisgIHJldHVybiBHZXRDdXJyZW50VXNlclByb3BlcnR5KGtTYlVzZXJQcm9wZXJ0eVVzZXJJZCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBoNXZjYwpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5oIGIvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5oCmluZGV4IGM5NWU3N2MuLjY2MzQyMTcgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uaAorKysgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9pbmZvLmgKQEAgLTE3LDcgKzE3LDYgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMjUsNyArMjQsNyBAQAogCiBjbGFzcyBINXZjY0FjY291bnRJbmZvIDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IEg1dmNjQWNjb3VudEluZm8oYWNjb3VudDo6QWNjb3VudE1hbmFnZXIqIGFjY291bnRfbWFuYWdlcik7CisgIEg1dmNjQWNjb3VudEluZm8oKTsKICAgc3RkOjpzdHJpbmcgYXZhdGFyX3VybCgpIGNvbnN0OwogICBzdGQ6OnN0cmluZyB1c2VybmFtZSgpIGNvbnN0OwogICBzdGQ6OnN0cmluZyB1c2VyX2lkKCkgY29uc3Q7CkBAIC0zMyw3ICszMiw2IEBACiAgIERFRklORV9XUkFQUEFCTEVfVFlQRShINXZjY0FjY291bnRJbmZvKTsKIAogIHByaXZhdGU6Ci0gIGFjY291bnQ6OkFjY291bnRNYW5hZ2VyKiBhY2NvdW50X21hbmFnZXJfOwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSDV2Y2NBY2NvdW50SW5mbyk7CiB9OwogCmRpZmYgLS1naXQgYS9jb2JhbHQvaDV2Y2MvaDV2Y2NfY3Jhc2hfbG9nLmNjIGIvY29iYWx0L2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5jYwppbmRleCAyN2M2OTgxLi5iYWNjYmFjIDEwMDY0NAotLS0gYS9jb2JhbHQvaDV2Y2MvaDV2Y2NfY3Jhc2hfbG9nLmNjCisrKyBiL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuY2MKQEAgLTMxLDcwICszMSw0OSBAQAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgaDV2Y2MgewogCi0vLyBXZSBrZWVwIGEgZ2xvYmFsIG1hcHBpbmcgb2YgYWxsIHJlZ2lzdGVyZWQgbG9ncy4gIFdoZW4gYSBjcmFzaCBvY2N1cnMsIHdlCi0vLyB3aWxsIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbWFwcGluZyBpbiB0aGlzIGRpY3Rpb25hcnkgdG8gZXh0cmFjdCBhbGwKLS8vIGxvZ2dlZCBlbnRyaWVzIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBzeXN0ZW0ncyBjcmFzaCBsb2dnZXIgdmlhIFN0YXJib2FyZC4KLWNsYXNzIENyYXNoTG9nRGljdGlvbmFyeSB7Ci0gcHVibGljOgotICBzdGF0aWMgQ3Jhc2hMb2dEaWN0aW9uYXJ5KiBHZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gYmFzZTo6U2luZ2xldG9uPENyYXNoTG9nRGljdGlvbmFyeSwgYmFzZTo6RGVmYXVsdFNpbmdsZXRvblRyYWl0czwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyYXNoTG9nRGljdGlvbmFyeT4gPjo6Z2V0KCk7Ci0gIH0KK0NyYXNoTG9nRGljdGlvbmFyeSogQ3Jhc2hMb2dEaWN0aW9uYXJ5OjpHZXRJbnN0YW5jZSgpIHsKKyAgcmV0dXJuIGJhc2U6OlNpbmdsZXRvbjxDcmFzaExvZ0RpY3Rpb25hcnksIGJhc2U6OkRlZmF1bHRTaW5nbGV0b25UcmFpdHM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jhc2hMb2dEaWN0aW9uYXJ5Pj46OmdldCgpOworfQogCi0gIHZvaWQgU2V0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobXV0ZXhfKTsKLSAgICAvLyBXaGlsZSB0aGUgbG9jayBwcmV2ZW50cyBjb250ZW50aW9uIGJldHdlZW4gb3RoZXIgY2FsbHMgdG8gU2V0U3RyaW5nKCksCi0gICAgLy8gdGhlIGF0b21pY3MgZ3VhcmQgYWdhaW5zdCBPbkNyYXNoKCksIHdoaWNoIGRvZXNuJ3QgYWNxdWlyZSB8bXV0ZXhffCwgZnJvbQotICAgIC8vIGFjY2Vzc2luZyB0aGUgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLiAgSW4gdGhlIGNhc2UgdGhhdCBPbkNyYXNoKCkgaXMKLSAgICAvLyBiZWluZyBjYWxsZWQsIHdlIGdpdmUgdXAgYW5kIHNraXAgYWRkaW5nIHRoZSBkYXRhLgotICAgIGlmIChiYXNlOjpzdWJ0bGU6OkFjcXVpcmVfQ29tcGFyZUFuZFN3YXAoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDAsIDEpID09IDApIHsKLSAgICAgIHN0cmluZ19sb2dfbWFwX1trZXldID0gdmFsdWU7Ci0gICAgICBiYXNlOjpzdWJ0bGU6OlJlbGVhc2VfU3RvcmUoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDApOwotICAgIH0KK3ZvaWQgQ3Jhc2hMb2dEaWN0aW9uYXJ5OjpTZXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobXV0ZXhfKTsKKyAgLy8gV2hpbGUgdGhlIGxvY2sgcHJldmVudHMgY29udGVudGlvbiBiZXR3ZWVuIG90aGVyIGNhbGxzIHRvIFNldFN0cmluZygpLAorICAvLyB0aGUgYXRvbWljcyBndWFyZCBhZ2FpbnN0IE9uQ3Jhc2goKSwgd2hpY2ggZG9lc24ndCBhY3F1aXJlIHxtdXRleF98LCBmcm9tCisgIC8vIGFjY2Vzc2luZyB0aGUgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLiAgSW4gdGhlIGNhc2UgdGhhdCBPbkNyYXNoKCkgaXMKKyAgLy8gYmVpbmcgY2FsbGVkLCB3ZSBnaXZlIHVwIGFuZCBza2lwIGFkZGluZyB0aGUgZGF0YS4KKyAgaWYgKGJhc2U6OnN1YnRsZTo6QWNxdWlyZV9Db21wYXJlQW5kU3dhcCgmYWNjZXNzaW5nX2xvZ19kYXRhXywgMCwgMSkgPT0gMCkgeworICAgIHN0cmluZ19sb2dfbWFwX1trZXldID0gdmFsdWU7CisgICAgYmFzZTo6c3VidGxlOjpSZWxlYXNlX1N0b3JlKCZhY2Nlc3NpbmdfbG9nX2RhdGFfLCAwKTsKICAgfQorfQogCi0gcHJpdmF0ZToKLSAgQ3Jhc2hMb2dEaWN0aW9uYXJ5KCkgOiBhY2Nlc3NpbmdfbG9nX2RhdGFfKDApIHsKK0NyYXNoTG9nRGljdGlvbmFyeTo6Q3Jhc2hMb2dEaWN0aW9uYXJ5KCkgOiBhY2Nlc3NpbmdfbG9nX2RhdGFfKDApIHsKICNpZiBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKLSAgICBTYkNvcmVEdW1wUmVnaXN0ZXJIYW5kbGVyKCZDb3JlRHVtcEhhbmRsZXIsIHRoaXMpOworICBTYkNvcmVEdW1wUmVnaXN0ZXJIYW5kbGVyKCZDb3JlRHVtcEhhbmRsZXIsIHRoaXMpOwogI2VuZGlmCi0gIH0KK30KIAotICBzdGF0aWMgdm9pZCBDb3JlRHVtcEhhbmRsZXIodm9pZCogY29udGV4dCkgewotICAgIENyYXNoTG9nRGljdGlvbmFyeSogY3Jhc2hfbG9nX2RpY3Rpb25hcnkgPQotICAgICAgICBzdGF0aWNfY2FzdDxDcmFzaExvZ0RpY3Rpb25hcnkqPihjb250ZXh0KTsKLSAgICBjcmFzaF9sb2dfZGljdGlvbmFyeS0+T25DcmFzaCgpOwotICB9Cit2b2lkIENyYXNoTG9nRGljdGlvbmFyeTo6Q29yZUR1bXBIYW5kbGVyKHZvaWQqIGNvbnRleHQpIHsKKyAgQ3Jhc2hMb2dEaWN0aW9uYXJ5KiBjcmFzaF9sb2dfZGljdGlvbmFyeSA9CisgICAgICBzdGF0aWNfY2FzdDxDcmFzaExvZ0RpY3Rpb25hcnkqPihjb250ZXh0KTsKKyAgY3Jhc2hfbG9nX2RpY3Rpb25hcnktPk9uQ3Jhc2goKTsKK30KIAotICB2b2lkIE9uQ3Jhc2goKSB7Cit2b2lkIENyYXNoTG9nRGljdGlvbmFyeTo6T25DcmFzaCgpIHsKICNpZiBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKLSAgICAvLyBDaGVjayB0aGF0IHdlJ3JlIG5vdCBhbHJlYWR5IHVwZGF0aW5nIGxvZyBkYXRhLiAgSWYgd2UgYXJlLCB3ZSBqdXN0Ci0gICAgLy8gZ2l2ZSB1cCBhbmQgc2tpcCByZWNvcmRpbmcgYW55IGNyYXNoIGRhdGEsIGJ1dCBob3BlZnVsbHkgdGhpcyBpcyByYXJlLgotICAgIGlmIChiYXNlOjpzdWJ0bGU6OkFjcXVpcmVfQ29tcGFyZUFuZFN3YXAoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDAsIDEpID09IDApIHsKLSAgICAgIGZvciAoU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc3RyaW5nX2xvZ19tYXBfLmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ZXIgIT0gc3RyaW5nX2xvZ19tYXBfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgU2JDb3JlRHVtcExvZ1N0cmluZyhpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBiYXNlOjpzdWJ0bGU6OlJlbGVhc2VfU3RvcmUoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDApOworICAvLyBDaGVjayB0aGF0IHdlJ3JlIG5vdCBhbHJlYWR5IHVwZGF0aW5nIGxvZyBkYXRhLiAgSWYgd2UgYXJlLCB3ZSBqdXN0CisgIC8vIGdpdmUgdXAgYW5kIHNraXAgcmVjb3JkaW5nIGFueSBjcmFzaCBkYXRhLCBidXQgaG9wZWZ1bGx5IHRoaXMgaXMgcmFyZS4KKyAgaWYgKGJhc2U6OnN1YnRsZTo6QWNxdWlyZV9Db21wYXJlQW5kU3dhcCgmYWNjZXNzaW5nX2xvZ19kYXRhXywgMCwgMSkgPT0gMCkgeworICAgIGZvciAoU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc3RyaW5nX2xvZ19tYXBfLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IHN0cmluZ19sb2dfbWFwXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBTYkNvcmVEdW1wTG9nU3RyaW5nKGl0ZXItPmZpcnN0LmNfc3RyKCksIGl0ZXItPnNlY29uZC5jX3N0cigpKTsKICAgICB9Ci0jZW5kaWYKKyAgICBiYXNlOjpzdWJ0bGU6OlJlbGVhc2VfU3RvcmUoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDApOwogICB9Ci0KLSAgZnJpZW5kIHN0cnVjdCBiYXNlOjpEZWZhdWx0U2luZ2xldG9uVHJhaXRzPENyYXNoTG9nRGljdGlvbmFyeT47Ci0KLSAgYmFzZTo6c3VidGxlOjpBdG9taWMzMiBhY2Nlc3NpbmdfbG9nX2RhdGFfOwotCi0gIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgdGhlIEg1VkNDIGludGVyZmFjZSBhdCB0aGUKLSAgLy8gc2FtZSB0aW1lLCBhbmQgdGhleSB3aWxsIGFsbCBmb3J3YXJkIHRvIHRoaXMgZ2xvYmFsIHNpbmdsZXRvbiwgc28gd2UKLSAgLy8gdXNlIHRoaXMgbXV0ZXggdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzLgotICBiYXNlOjpMb2NrIG11dGV4XzsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gU3RyaW5nTWFwOwotICAvLyBLZWVwcyB0cmFjayBvZiBhbGwgc3RyaW5nIHZhbHVlcyB0byBiZSBsb2dnZWQgd2hlbiBhIGNyYXNoIG9jY3Vycy4KLSAgU3RyaW5nTWFwIHN0cmluZ19sb2dfbWFwXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ3Jhc2hMb2dEaWN0aW9uYXJ5KTsKLX07CisjZW5kaWYKK30KIAogYm9vbCBINXZjY0NyYXNoTG9nOjpTZXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5oIGIvY29iYWx0L2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5oCmluZGV4IGI4NWMwYzUuLmJiMjBhNDggMTAwNjQ0Ci0tLSBhL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaAorKysgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfY3Jhc2hfbG9nLmgKQEAgLTE1LDggKzE1LDEwIEBACiAjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19DUkFTSF9MT0dfSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0NSQVNIX0xPR19IXwogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3NpbmdsZXRvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF90eXBlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL3dhdGNoZG9nX3JlcGxhY2UuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2Mvd2F0Y2hkb2dfc3RhdGUuaCIKQEAgLTI2LDYgKzI4LDM4IEBACiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBoNXZjYyB7CiAKKy8vIFdlIGtlZXAgYSBnbG9iYWwgbWFwcGluZyBvZiBhbGwgcmVnaXN0ZXJlZCBsb2dzLiAgV2hlbiBhIGNyYXNoIG9jY3Vycywgd2UKKy8vIHdpbGwgaXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXBwaW5nIGluIHRoaXMgZGljdGlvbmFyeSB0byBleHRyYWN0IGFsbAorLy8gbG9nZ2VkIGVudHJpZXMgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN5c3RlbSdzIGNyYXNoIGxvZ2dlciB2aWEgU3RhcmJvYXJkLgorY2xhc3MgQ3Jhc2hMb2dEaWN0aW9uYXJ5IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDcmFzaExvZ0RpY3Rpb25hcnkqIEdldEluc3RhbmNlKCk7CisKKyAgdm9pZCBTZXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworIHByaXZhdGU6CisgIENyYXNoTG9nRGljdGlvbmFyeSgpOworCisgIHN0YXRpYyB2b2lkIENvcmVEdW1wSGFuZGxlcih2b2lkKiBjb250ZXh0KTsKKworICB2b2lkIE9uQ3Jhc2goKTsKKworICBmcmllbmQgc3RydWN0IGJhc2U6OkRlZmF1bHRTaW5nbGV0b25UcmFpdHM8Q3Jhc2hMb2dEaWN0aW9uYXJ5PjsKKworICBiYXNlOjpzdWJ0bGU6OkF0b21pYzMyIGFjY2Vzc2luZ19sb2dfZGF0YV87CisKKyAgLy8gSXQgaXMgcG9zc2libGUgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gY2FsbCB0aGUgSDVWQ0MgaW50ZXJmYWNlIGF0IHRoZQorICAvLyBzYW1lIHRpbWUsIGFuZCB0aGV5IHdpbGwgYWxsIGZvcndhcmQgdG8gdGhpcyBnbG9iYWwgc2luZ2xldG9uLCBzbyB3ZQorICAvLyB1c2UgdGhpcyBtdXRleCB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MuCisgIGJhc2U6OkxvY2sgbXV0ZXhfOworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBTdHJpbmdNYXA7CisgIC8vIEtlZXBzIHRyYWNrIG9mIGFsbCBzdHJpbmcgdmFsdWVzIHRvIGJlIGxvZ2dlZCB3aGVuIGEgY3Jhc2ggb2NjdXJzLgorICBTdHJpbmdNYXAgc3RyaW5nX2xvZ19tYXBfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDcmFzaExvZ0RpY3Rpb25hcnkpOworfTsKKwogY2xhc3MgSDV2Y2NDcmFzaExvZyA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CiAgcHVibGljOgogICBINXZjY0NyYXNoTG9nKCkge30KZGlmZiAtLWdpdCBhL2NvYmFsdC9oNXZjYy9oNXZjY19tZXRyaWNfdHlwZS5pZGwgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfbWV0cmljX3R5cGUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWZmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfbWV0cmljX3R5cGUuaWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhlIHZhcmlvdXMgbWV0cmljIHR5cGVzIHdlIHN1cHBvcnQgdG8gYmUgcHVibGlzaGVkIHRocm91Z2ggdGhlIEg1dmNjTWV0cmljcworLy8gQVBJLgorZW51bSBINXZjY01ldHJpY1R5cGUgeworICAvLyAvL3RoaXJkX3BhcnR5L21ldHJpY3NfcHJvdG8vY2hyb21lX3VzZXJfbWV0cmljc19leHRlbnNpb24ucHJvdG8KKyAgLy8gQ2hyb21lVXNlck1ldHJpY3NFeHRlbnNpb24gcHJvdG8uCisgICJVTUEiLAorICAvLyAvL3RoaXJkX3BhcnR5L21ldHJpY3NfcHJvdG8vdWttL3JlcG9ydC5wcm90byBSZXBvcnQgcHJvdG8uCisgICJVS00iCit9OwpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuY2MgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfbWV0cmljcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkwNjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuY2MKQEAgLTAsMCArMSw4NCBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWV0cmljcy9jb2JhbHRfbWV0cmljc19zZXJ2aWNlX2NsaWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5oIgorI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19tZXRyaWNfdHlwZS5oIgorI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9tZXRyaWNfZXZlbnRfaGFuZGxlcl93cmFwcGVyLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGg1dmNjIHsKKwordm9pZCBINXZjY01ldHJpY3M6Ok9uTWV0cmljRXZlbnQoCisgICAgY29uc3QgaDV2Y2M6Ok1ldHJpY0V2ZW50SGFuZGxlcldyYXBwZXI6OlNjcmlwdFZhbHVlJiBldmVudF9oYW5kbGVyKSB7CisgIGlmICghdXBsb2FkZXJfY2FsbGJhY2tfKSB7CisgICAgcnVuX2V2ZW50X2hhbmRsZXJfY2FsbGJhY2tfID0gc3RkOjptYWtlX3VuaXF1ZTwKKyAgICAgICAgY29iYWx0Ojpicm93c2VyOjptZXRyaWNzOjpDb2JhbHRNZXRyaWNzVXBsb2FkZXJDYWxsYmFjaz4oCisgICAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkg1dmNjTWV0cmljczo6UnVuRXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKKyAgICBicm93c2VyOjptZXRyaWNzOjpDb2JhbHRNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpCisgICAgICAgIC0+U2V0T25VcGxvYWRIYW5kbGVyKHJ1bl9ldmVudF9oYW5kbGVyX2NhbGxiYWNrXy5nZXQoKSk7CisgIH0KKworICB1cGxvYWRlcl9jYWxsYmFja18gPQorICAgICAgbmV3IGg1dmNjOjpNZXRyaWNFdmVudEhhbmRsZXJXcmFwcGVyKHRoaXMsIGV2ZW50X2hhbmRsZXIpOworfQorCit2b2lkIEg1dmNjTWV0cmljczo6UnVuRXZlbnRIYW5kbGVyKAorICAgIGNvbnN0IGNvYmFsdDo6aDV2Y2M6Okg1dmNjTWV0cmljVHlwZSYgbWV0cmljX3R5cGUsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRfcHJvdG8pIHsKKyAgdGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJkg1dmNjTWV0cmljczo6UnVuRXZlbnRIYW5kbGVySW50ZXJuYWwsIGJhc2U6OlVucmV0YWluZWQodGhpcyksCisgICAgICAgICAgICAgICAgIG1ldHJpY190eXBlLCBzZXJpYWxpemVkX3Byb3RvKSk7Cit9CisKK3ZvaWQgSDV2Y2NNZXRyaWNzOjpSdW5FdmVudEhhbmRsZXJJbnRlcm5hbCgKKyAgICBjb25zdCBjb2JhbHQ6Omg1dmNjOjpINXZjY01ldHJpY1R5cGUmIG1ldHJpY190eXBlLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkX3Byb3RvKSB7CisgIHVwbG9hZGVyX2NhbGxiYWNrXy0+Y2FsbGJhY2sudmFsdWUoKS5SdW4obWV0cmljX3R5cGUsIHNlcmlhbGl6ZWRfcHJvdG8pOworfQorCit2b2lkIEg1dmNjTWV0cmljczo6RW5hYmxlKCkgeyBUb2dnbGVNZXRyaWNzRW5hYmxlZCh0cnVlKTsgfQorCit2b2lkIEg1dmNjTWV0cmljczo6RGlzYWJsZSgpIHsgVG9nZ2xlTWV0cmljc0VuYWJsZWQoZmFsc2UpOyB9CisKK3ZvaWQgSDV2Y2NNZXRyaWNzOjpUb2dnbGVNZXRyaWNzRW5hYmxlZChib29sIGlzX2VuYWJsZWQpIHsKKyAgcGVyc2lzdGVudF9zZXR0aW5nc18tPlNldFBlcnNpc3RlbnRTZXR0aW5nKAorICAgICAgYnJvd3Nlcjo6bWV0cmljczo6a01ldHJpY0VuYWJsZWRTZXR0aW5nTmFtZSwKKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6VmFsdWU+KGlzX2VuYWJsZWQpKTsKKyAgYnJvd3Nlcjo6bWV0cmljczo6Q29iYWx0TWV0cmljc1NlcnZpY2VzTWFuYWdlcjo6R2V0SW5zdGFuY2UoKQorICAgICAgLT5Ub2dnbGVNZXRyaWNzRW5hYmxlZChpc19lbmFibGVkKTsKK30KKworYm9vbCBINXZjY01ldHJpY3M6OklzRW5hYmxlZCgpIHsKKyAgcmV0dXJuIGJyb3dzZXI6Om1ldHJpY3M6OkNvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OkdldEluc3RhbmNlKCkKKyAgICAgIC0+SXNNZXRyaWNzUmVwb3J0aW5nRW5hYmxlZCgpOworfQorCit2b2lkIEg1dmNjTWV0cmljczo6U2V0TWV0cmljRXZlbnRJbnRlcnZhbCh1aW50MzJfdCBpbnRlcnZhbF9zZWNvbmRzKSB7CisgIHBlcnNpc3RlbnRfc2V0dGluZ3NfLT5TZXRQZXJzaXN0ZW50U2V0dGluZygKKyAgICAgIGJyb3dzZXI6Om1ldHJpY3M6OmtNZXRyaWNFdmVudEludGVydmFsU2V0dGluZ05hbWUsCisgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJhc2U6OlZhbHVlPihzdGF0aWNfY2FzdDxpbnQ+KGludGVydmFsX3NlY29uZHMpKSk7CisgIGJyb3dzZXI6Om1ldHJpY3M6OkNvYmFsdE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OkdldEluc3RhbmNlKCkKKyAgICAgIC0+U2V0VXBsb2FkSW50ZXJ2YWwoaW50ZXJ2YWxfc2Vjb25kcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBoNXZjYworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaCBiL2NvYmFsdC9oNXZjYy9oNXZjY19tZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmNjllYQotLS0gL2Rldi9udWxsCisrKyBiL2NvYmFsdC9oNXZjYy9oNXZjY19tZXRyaWNzLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19NRVRSSUNTX0hfCisjZGVmaW5lIENPQkFMVF9INVZDQ19INVZDQ19NRVRSSUNTX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Rhc2tfcnVubmVyX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21ldHJpY3MvY29iYWx0X21ldHJpY3NfdXBsb2FkZXJfY2FsbGJhY2suaCIKKyNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfbWV0cmljX3R5cGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvbWV0cmljX2V2ZW50X2hhbmRsZXJfd3JhcHBlci5oIgorI2luY2x1ZGUgImNvYmFsdC9wZXJzaXN0ZW50X3N0b3JhZ2UvcGVyc2lzdGVudF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgaDV2Y2MgeworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgaDV2Y2NfbWV0cmljcy5pZGwgaW50ZXJmYWNlLiBTdXBwb3J0cyBpbnRlcmFjdGlvbnMKKy8vIHdpdGggdGhlIHdlYiBjbGllbnQgcmVsYXRlZCB0byBtZXRyaWNzIGxvZ2dpbmcuCitjbGFzcyBINXZjY01ldHJpY3MgOiBwdWJsaWMgc2NyaXB0OjpXcmFwcGFibGUgeworIHB1YmxpYzoKKyAgLy8gUmVxdWlyZWQgdG8gcHV0IGEgdHlwZWRlZiB1bmRlciB0aGUgSDV2Y2NNZXRyaWNzIGNsYXNzIGFzIGV4cGVjdGVkIGJ5IHRoZQorICAvLyBJREwgZGVmaW5pdGlvbi4gVGhlICJNZXRyaWNFdmVudEhhbmRsZXIiIHR5cGVkZWYgaXMgZXhwbGljaXRseSBzZXBhcmF0ZQorICAvLyBzbyBpdCBjYW4gYmUgdXNlZCBieSBvdGhlciBjbGFzc2VzIG91dHNpZGUgSDV2Y2Mgd2l0aG91dCBicmluZ2luZyBINXZjYyBpbgorICAvLyBpdHMgZW50aXJldHkuCisgIHR5cGVkZWYgTWV0cmljRXZlbnRIYW5kbGVyIEg1dmNjTWV0cmljRXZlbnRIYW5kbGVyOworCisgIGV4cGxpY2l0IEg1dmNjTWV0cmljcygKKyAgICAgIHBlcnNpc3RlbnRfc3RvcmFnZTo6UGVyc2lzdGVudFNldHRpbmdzKiBwZXJzaXN0ZW50X3NldHRpbmdzKQorICAgICAgOiB0YXNrX3J1bm5lcl8oYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCkpLAorICAgICAgICBwZXJzaXN0ZW50X3NldHRpbmdzXyhwZXJzaXN0ZW50X3NldHRpbmdzKSB7fQorCisgIEg1dmNjTWV0cmljcyhjb25zdCBINXZjY01ldHJpY3MmKSA9IGRlbGV0ZTsKKyAgSDV2Y2NNZXRyaWNzJiBvcGVyYXRvcj0oY29uc3QgSDV2Y2NNZXRyaWNzJikgPSBkZWxldGU7CisKKyAgLy8gQmluZHMgYW4gZXZlbnQgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeSB0aW1lIENvYmFsdCB3YW50cyB0bworICAvLyB1cGxvYWQgYSBtZXRyaWNzIHBheWxvYWQuCisgIHZvaWQgT25NZXRyaWNFdmVudCgKKyAgICAgIGNvbnN0IE1ldHJpY0V2ZW50SGFuZGxlcldyYXBwZXI6OlNjcmlwdFZhbHVlJiBldmVudF9oYW5kbGVyKTsKKworICAvLyBFbmFibGUgQ29iYWx0IG1ldHJpY3MgbG9nZ2luZy4KKyAgdm9pZCBFbmFibGUoKTsKKworICAvLyBEaXNhYmxlIENvYmFsdCBtZXRyaWNzIGxvZ2dpbmcuCisgIHZvaWQgRGlzYWJsZSgpOworCisgIC8vIFJldHVybnMgY3VycmVudCBlbmFibGVkIHN0YXRlIG9mIG1ldHJpY3MgbG9nZ2luZy9yZXBvcnRpbmcuCisgIGJvb2wgSXNFbmFibGVkKCk7CisKKyAgLy8gU2V0cyB0aGUgaW50ZXJ2YWwgaW4gd2hpY2ggbWV0cmljcyB3aWxsIGJlIGFnZ3JlZ2F0ZWQgYW5kIHNlbnQgdG8gdGhlCisgIC8vIG1ldHJpYyBldmVudCBoYW5kbGVyLgorICB2b2lkIFNldE1ldHJpY0V2ZW50SW50ZXJ2YWwodWludDMyIGludGVydmFsX3NlY29uZHMpOworCisgIERFRklORV9XUkFQUEFCTEVfVFlQRShINXZjY01ldHJpY3MpOworCisgcHJpdmF0ZToKKyAgLy8gSW50ZXJuYWwgY29udmVuaWVuY2UgbWV0aG9kIGZvciB0b2dnbGluZyBlbmFibGVkL2Rpc2FibGVkIHN0YXRlLgorICB2b2lkIFRvZ2dsZU1ldHJpY3NFbmFibGVkKGJvb2wgaXNfZW5hYmxlZCk7CisKKyAgdm9pZCBSdW5FdmVudEhhbmRsZXIoY29uc3QgY29iYWx0OjpoNXZjYzo6SDV2Y2NNZXRyaWNUeXBlJiBtZXRyaWNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRfcHJvdG8pOworCisgIHZvaWQgUnVuRXZlbnRIYW5kbGVySW50ZXJuYWwoCisgICAgICBjb25zdCBjb2JhbHQ6Omg1dmNjOjpINXZjY01ldHJpY1R5cGUmIG1ldHJpY190eXBlLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRfcHJvdG8pOworCisgIHNjb3BlZF9yZWZwdHI8aDV2Y2M6Ok1ldHJpY0V2ZW50SGFuZGxlcldyYXBwZXI+IHVwbG9hZGVyX2NhbGxiYWNrXzsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Y29iYWx0Ojpicm93c2VyOjptZXRyaWNzOjpDb2JhbHRNZXRyaWNzVXBsb2FkZXJDYWxsYmFjaz4KKyAgICAgIHJ1bl9ldmVudF9oYW5kbGVyX2NhbGxiYWNrXzsKKworICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IGNvbnN0IHRhc2tfcnVubmVyXzsKKworICBwZXJzaXN0ZW50X3N0b3JhZ2U6OlBlcnNpc3RlbnRTZXR0aW5ncyogcGVyc2lzdGVudF9zZXR0aW5nc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaDV2Y2MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfSDVWQ0NfSDVWQ0NfTUVUUklDU19IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaWRsIGIvY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY3MuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWExMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvaDV2Y2MvaDV2Y2NfbWV0cmljcy5pZGwKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBEZWZpbmVzIGFuIGludGVyZmFjZSB0byBzdXBwb3J0IGludGVyYWN0aW9ucyB3aXRoIENvYmFsdCBtZXRyaWMgbG9nZ2luZy4KKy8vIEZvciBleGFtcGxlLCBhIGNhbGxiYWNrIEFQSSBzdWNoIHRoYXQgdGhlIHdlYiBjbGllbnQgY2FuIGludGVyY2VwdCBhbmQKKy8vIHByb2Nlc3MgbWV0cmljcyBzZW50IGZyb20gQ29iYWx0LgorCitpbnRlcmZhY2UgSDV2Y2NNZXRyaWNzIHsKKyAgLy8gSW50ZXJmYWNlIGZvciB3ZWIgY2xpZW50IHRvIGJpbmQgYW4gZXZlbnQgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZAorICAvLyBldmVyeSB0aW1lIENvYmFsdCB3YW50cyB0byB1cGxvYWQgYSBtZXRyaWNzIHBheWxvYWQuIE9ubHkgb25lIGV2ZW50CisgIC8vIGhhbmRsZXIgY2FsbGJhY2sgY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYW55IHRpbWUuIER1cGxpY2F0ZSBjYWxscyB0bworICAvLyBvbk1ldHJpY0V2ZW50IHdpbGwgb3ZlcnJpZGUgYW55IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjay4KKyAgLy8KKyAgLy8gRXhhbXBsZSB1c2FnZSBpbiBKUzoKKyAgLy8KKyAgLy8gICB3aW5kb3cuaDV2Y2MubWV0cmljcy5vbk1ldHJpY0V2ZW50KChtZXRyaWNUeXBlLCBwYXlsb2FkKSA9PiB7CisgIC8vICAgICBpZiAobWV0cmljVHlwZSA9PSAnVU1BJykgeworICAvLyAgICAgICAvLyBsb2cgVU1BIHBheWxvYWQgaGVyZS4uLgorICAvLyAgICAgfQorICAvLyAgIH0pOworICB2b2lkIG9uTWV0cmljRXZlbnQoSDV2Y2NNZXRyaWNFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKTsKKworICAvLyBFbmFibGUgQ29iYWx0IG1ldHJpY3MgbG9nZ2luZy4gTWV0cmljcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgc2hvdWxkCisgIC8vIGJlIGVuYWJsZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4gV2hlbiBlbmFibGVkLCBhdCByZWd1bGFyIGludGVydmFscywgdGhlCisgIC8vIGJvdW5kIG9uTWV0cmljRXZlbnQgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCB0ZWxlbWV0cnkgcGF5bG9hZHMgdG8KKyAgLy8gYmUgdXBsb2FkZWQgYW5kIGxvZ2dlZCBvbiB0aGUgc2VydmVyLiBCb3RoIHRoZSBlbmFibGUvZGlzYWJsZSBzZXR0aW5ncworICAvLyBhcmUgcGVyc2lzdGVudCBvciAic3RpY2t5Ii4gVGhhdCBpcywgeW91IG9ubHkgaGF2ZSB0byBjYWxsIHRoZW0gb25jZQorICAvLyBhbmQgdGhhdCBzZXR0aW5nIHdpbGwgcGVyc2lzdCB0aHJvdWdoIG11bHRpcGxlIGFwcCBsaWZlY3ljbGVzIHVudGlsIHRoZQorICAvLyBlbmFibGUvZGlzYWJsZSBBUElzIGFyZSBleHBsaWNpdGx5IGNhbGxlZCBhZ2Fpbi4KKyAgdm9pZCBlbmFibGUoKTsKKworICAvLyBEaXNhYmxlIENvYmFsdCBtZXRyaWNzIGxvZ2dpbmcuIElmIGRpc2FibGVkLCB0aGUgbWV0cmljIGV2ZW50IGhhbmRsZXIKKyAgLy8gc2hvdWxkIG5ldmVyIGdldCBjYWxsZWQgYWZ0ZXJ3YXJkLgorICB2b2lkIGRpc2FibGUoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGVuYWJsZWQgc3RhdGUgb2YgbWV0cmljcyByZXBvcnRpbmcuCisgIGJvb2xlYW4gaXNFbmFibGVkKCk7CisKKyAgLy8gU2V0cyB0aGUgZnJlcXVlbmN5IGluIHdoaWNoIENvYmFsdCBtZXRyaWNzIHdpbGwgYmUgc25hcHNob3R0ZWQgYW5kIHNlbnQgdG8KKyAgLy8gdGhlIG1ldHJpYyBldmVudCBoYW5kbGVyLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMgaWYgbm90IHNldC4gTXVzdCBiZSA+IDAsCisgIC8vIGVsc2Ugd2lsbCBiZSBpZ25vcmVkLiBUaGlzIHNldHRpbmcgaXMgcGVyc2lzdGVudC4gVGhhdCBpcywgaXQncyAic3RpY2t5IgorICAvLyBhbmQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaCBtdWx0aXBsZSBhcHAgbGlmZXRpbWVzIHVubGVzcyBpdCdzIGNhbGxlZAorICAvLyBhZ2FpbiB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgorICB2b2lkIHNldE1ldHJpY0V2ZW50SW50ZXJ2YWwodW5zaWduZWQgbG9uZyBpbnRlcnZhbFNlY29uZHMpOworfTsKKworLy8gQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgbmV3IG1ldHJpYyBwYXlsb2FkIGlzIHJlYWR5IHRvIGJlIHB1Ymxpc2hlZC4gVGhlCisvLyBwYXlsb2FkIGlzIGEgc2VyaWFsaXplZCBwcm90b2J1ZiBhbmQgdGhlIG1ldHJpYyB0eXBlIHNob3VsZCBnaXZlIHRoZSBjb25zdW1lcgorLy8gYSBoaW50IG9uIGhvdyB0byBkZXNlcmlhbGl6ZSBpdC4gU2VlIGg1dmNjX21ldHJpY190eXBlLmlkbCBmb3IgbW9yZSBpbmZvLgorY2FsbGJhY2sgSDV2Y2NNZXRyaWNFdmVudEhhbmRsZXIgPQorICAgIHZvaWQoSDV2Y2NNZXRyaWNUeXBlIG1ldHJpY1R5cGUsIERPTVN0cmluZyBtZXRyaWNQYXlsb2FkKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lLmNjIGIvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuY2MKaW5kZXggZmFmNTZjZS4uMTVmNjgyYiAxMDA2NDQKLS0tIGEvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuY2MKKysrIGIvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuY2MKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgRlJPTV9IRVJFLAogICAgICAgICBiYXNlOjpCaW5kKCZINXZjY1J1bnRpbWU6Ok9uRGVlcExpbmtFdmVudCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpQYXNzZWQoJmRlZXBfbGlua19ldmVudCkpKTsKKyAgICAgICAgICAgICAgICAgICBiYXNlOjpQYXNzZWQoc3RkOjptb3ZlKGRlZXBfbGlua19ldmVudCkpKSk7CiAgICAgcmV0dXJuOwogICB9CiAgIE9uRGVlcExpbmtFdmVudChzdGQ6Om1vdmUoZGVlcF9saW5rX2V2ZW50KSk7CmRpZmYgLS1naXQgYS9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc2V0dGluZ3MuY2MgYi9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc2V0dGluZ3MuY2MKaW5kZXggNTc0ODUyZC4uNGJhYmZkOSAxMDA2NDQKLS0tIGEvY29iYWx0L2g1dmNjL2g1dmNjX3NldHRpbmdzLmNjCisrKyBiL2NvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5jYwpAQCAtOTUsNyArOTUsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgcGVyc2lzdGVudF9zZXR0aW5nc18tPlNldFBlcnNpc3RlbnRTZXR0aW5nKAogICAgICAgICAgIG5ldHdvcms6OmtDbGllbnRIaW50SGVhZGVyc0VuYWJsZWRQZXJzaXN0ZW50U2V0dGluZ3NLZXksCi0gICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxiYXNlOjpWYWx1ZT4odmFsdWUgIT0gMCkpOworICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8YmFzZTo6VmFsdWU+KHZhbHVlKSk7CisgICAgICAvLyBUZWxsIE5ldHdvcmtNb2R1bGUgKGlmIGV4aXN0cykgdG8gcmUtcXVlcnkgcGVyc2lzdGVudCBzZXR0aW5ncy4KKyAgICAgIGlmIChuZXR3b3JrX21vZHVsZV8pIHsKKyAgICAgICAgbmV0d29ya19tb2R1bGVfCisgICAgICAgICAgICAtPlNldEVuYWJsZUNsaWVudEhpbnRIZWFkZXJzRmxhZ3NGcm9tUGVyc2lzdGVudFNldHRpbmdzKCk7CisgICAgICB9CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2NvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlLmNjIGIvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuY2MKaW5kZXggMGJiNjYwYy4uMmMxZjMzMiAxMDA2NDQKLS0tIGEvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuY2MKKysrIGIvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuY2MKQEAgLTEyOCwxMCArMTI4LDExIEBACiAKIHZvaWQgSDV2Y2NTdG9yYWdlOjpGbHVzaChjb25zdCBiYXNlOjpPcHRpb25hbDxib29sPiYgc3luYykgewogICBpZiAoc3luYy52YWx1ZV9vcihmYWxzZSkgPT0gdHJ1ZSkgewotICAgIERMT0coV0FSTklORykgPDwgIlN5bmNocm9ub3VzIGZsdXNoIGlzIG5vdCBzdXBwb3J0ZWQuIjsKKyAgICAvLyBTeW5jaHJvbm91c2x5IHdhaXQgZm9yIHN0b3JhZ2UgdG8gZmx1c2ggYmVmb3JlIHJldHVybmluZy4KKyAgICBuZXR3b3JrX21vZHVsZV8tPnN0b3JhZ2VfbWFuYWdlcigpLT5GbHVzaFN5bmNocm9ub3VzKCk7CisgIH0gZWxzZSB7CisgICAgbmV0d29ya19tb2R1bGVfLT5zdG9yYWdlX21hbmFnZXIoKS0+Rmx1c2hOb3coKTsKICAgfQotCi0gIG5ldHdvcmtfbW9kdWxlXy0+c3RvcmFnZV9tYW5hZ2VyKCktPkZsdXNoTm93KGJhc2U6OkNsb3N1cmUoKSk7CiB9CiAKIGJvb2wgSDV2Y2NTdG9yYWdlOjpHZXRDb29raWVzRW5hYmxlZCgpIHsKZGlmZiAtLWdpdCBhL2NvYmFsdC9oNXZjYy9tZXRyaWNfZXZlbnRfaGFuZGxlcl93cmFwcGVyLmggYi9jb2JhbHQvaDV2Y2MvbWV0cmljX2V2ZW50X2hhbmRsZXJfd3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDgyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvaDV2Y2MvbWV0cmljX2V2ZW50X2hhbmRsZXJfd3JhcHBlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfSDVWQ0NfTUVUUklDX0VWRU5UX0hBTkRMRVJfV1JBUFBFUl9IXworI2RlZmluZSBDT0JBTFRfSDVWQ0NfTUVUUklDX0VWRU5UX0hBTkRMRVJfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX21ldHJpY190eXBlLmgiCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL3NjcmlwdF9jYWxsYmFja193cmFwcGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBoNXZjYyB7CisKKy8vIEg1dmNjTWV0cmljIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGVkZWYuCit0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKGNvbnN0IEg1dmNjTWV0cmljVHlwZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJik+CisgICAgTWV0cmljRXZlbnRIYW5kbGVyOworCisvLyBUeXBlZGVmIGZvciB0aGUgU2NyaXB0Q2FsbGJhY2tXcmFwcGVyIGNhbGxiYWNrLgordHlwZWRlZiBTY3JpcHRDYWxsYmFja1dyYXBwZXI8TWV0cmljRXZlbnRIYW5kbGVyPiBNZXRyaWNFdmVudEhhbmRsZXJXcmFwcGVyOworCit9ICAvLyBuYW1lc3BhY2UgaDV2Y2MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfSDVWQ0NfTUVUUklDX0VWRU5UX0hBTkRMRVJfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L2g1dmNjL3NjcmlwdF9jYWxsYmFja193cmFwcGVyLmggYi9jb2JhbHQvaDV2Y2Mvc2NyaXB0X2NhbGxiYWNrX3dyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTNjNjkzCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L2g1dmNjL3NjcmlwdF9jYWxsYmFja193cmFwcGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9INVZDQ19TQ1JJUFRfQ0FMTEJBQ0tfV1JBUFBFUl9IXworI2RlZmluZSBDT0JBTFRfSDVWQ0NfU0NSSVBUX0NBTExCQUNLX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGg1dmNjIHsKKworLy8gVGVtcGxhdGUgYm9pbGVycGxhdGUgZm9yIHdyYXBwaW5nIGEgc2NyaXB0IGNhbGxiYWNrIHNhZmVseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU2NyaXB0Q2FsbGJhY2tXcmFwcGVyCisgICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2NyaXB0Q2FsbGJhY2tXcmFwcGVyPFQ+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPFQ+IFNjcmlwdFZhbHVlOworICBTY3JpcHRDYWxsYmFja1dyYXBwZXIoc2NyaXB0OjpXcmFwcGFibGUqIHdyYXBwYWJsZSwgY29uc3QgU2NyaXB0VmFsdWUmIGZ1bmMpCisgICAgICA6IGNhbGxiYWNrKHdyYXBwYWJsZSwgZnVuYykge30KKyAgdHlwZW5hbWUgU2NyaXB0VmFsdWU6OlJlZmVyZW5jZSBjYWxsYmFjazsKK307CisKK30gIC8vIG5hbWVzcGFjZSBoNXZjYworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9INVZDQ19TQ1JJUFRfQ0FMTEJBQ0tfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L2xheW91dC9CVUlMRC5nbiBiL2NvYmFsdC9sYXlvdXQvQlVJTEQuZ24KaW5kZXggYjk1MDU3ZS4uNzk2NjM2NSAxMDA2NDQKLS0tIGEvY29iYWx0L2xheW91dC9CVUlMRC5nbgorKysgYi9jb2JhbHQvbGF5b3V0L0JVSUxELmduCkBAIC0xNDYsNiArMTQ2LDYgQEAKICAgICAiLy9jb2JhbHQvbWF0aCIsCiAgICAgIi8vY29iYWx0L3Rlc3Q6cnVuX2FsbF91bml0dGVzdHMiLAogICAgICIvL3Rlc3RpbmcvZ21vY2siLAotICAgICIvL3Rlc3RpbmcvZ21vY2siLAorICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAogICBdCiB9CmRpZmYgLS1naXQgYS9jb2JhbHQvbGF5b3V0L3RvcG1vc3RfZXZlbnRfdGFyZ2V0LmNjIGIvY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5jYwppbmRleCBkN2NlOTJlLi4zOTgxZGU0IDEwMDY0NAotLS0gYS9jb2JhbHQvbGF5b3V0L3RvcG1vc3RfZXZlbnRfdGFyZ2V0LmNjCisrKyBiL2NvYmFsdC9sYXlvdXQvdG9wbW9zdF9ldmVudF90YXJnZXQuY2MKQEAgLTU3LDcgKzU3LDggQEAKICAgZG9jdW1lbnQtPkRvU3luY2hyb25vdXNMYXlvdXQoKTsKIAogICBodG1sX2VsZW1lbnRfID0gZG9jdW1lbnQtPmh0bWwoKTsKLSAgQ29uc2lkZXJFbGVtZW50KGh0bWxfZWxlbWVudF8sIGNvb3JkaW5hdGUpOworICBib29sIGNvbnNpZGVyX29ubHlfZml4ZWRfZWxlbWVudHMgPSBmYWxzZTsKKyAgQ29uc2lkZXJFbGVtZW50KGh0bWxfZWxlbWVudF8sIGNvb3JkaW5hdGUsIGNvbnNpZGVyX29ubHlfZml4ZWRfZWxlbWVudHMpOwogICBib3hfID0gTlVMTDsKICAgcmVuZGVyX3NlcXVlbmNlXy5jbGVhcigpOwogICBzY29wZWRfcmVmcHRyPGRvbTo6SFRNTEVsZW1lbnQ+IHRvcG1vc3RfZWxlbWVudDsKQEAgLTE3OCw4ICsxNzksOCBAQAogICB9CiB9OwogCi1ib29sIFNob3VsZENvbnNpZGVyRWxlbWVudEFuZENoaWxkcmVuKGRvbTo6RWxlbWVudCogZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0aDo6VmVjdG9yMmRGKiBjb29yZGluYXRlKSB7Citib29sIENhblRhcmdldEVsZW1lbnRBbmRDaGlsZHJlbihkb206OkVsZW1lbnQqIGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRoOjpWZWN0b3IyZEYqIGNvb3JkaW5hdGUpIHsKICAgTGF5b3V0Qm94ZXMqIGxheW91dF9ib3hlcyA9IEdldExheW91dEJveGVzSWZOb3RFbXB0eShlbGVtZW50KTsKICAgY29uc3QgQm94ZXMgYm94ZXMgPSBsYXlvdXRfYm94ZXMtPmJveGVzKCk7CiAgIGNvbnN0IEJveCogYm94ID0gYm94ZXMuZnJvbnQoKTsKQEAgLTQzNCwxNyArNDM1LDQzIEBACiAgIHJldHVybiBjb21wbGV0ZV9tYXRyaXg7CiB9CiAKK2Jvb2wgTGF5b3V0Qm94ZXNBcmVGaXhlZChMYXlvdXRCb3hlcyogbGF5b3V0X2JveGVzKSB7CisgIGNvbnN0IEJveGVzIGJveGVzID0gbGF5b3V0X2JveGVzLT5ib3hlcygpOworICBjb25zdCBCb3gqIGJveCA9IGJveGVzLmZyb250KCk7CisgIGlmICghYm94LT5jb21wdXRlZF9zdHlsZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIGJveC0+Y29tcHV0ZWRfc3R5bGUoKS0+cG9zaXRpb24oKSA9PSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRGaXhlZCgpOworfQorCitib29sIFNob3VsZENvbnNpZGVyRWxlbWVudEFuZENoaWxkcmVuKGRvbTo6RWxlbWVudCogZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0aDo6VmVjdG9yMmRGKiBjb29yZGluYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnNpZGVyX29ubHlfZml4ZWRfZWxlbWVudHMpIHsKKyAgTGF5b3V0Qm94ZXMqIGxheW91dF9ib3hlcyA9IEdldExheW91dEJveGVzSWZOb3RFbXB0eShlbGVtZW50KTsKKyAgaWYgKCFsYXlvdXRfYm94ZXMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzX2ZpeGVkX2VsZW1lbnQgPSBMYXlvdXRCb3hlc0FyZUZpeGVkKGxheW91dF9ib3hlcyk7CisgIGlmIChjb25zaWRlcl9vbmx5X2ZpeGVkX2VsZW1lbnRzICYmICFpc19maXhlZF9lbGVtZW50KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBDYW5UYXJnZXRFbGVtZW50QW5kQ2hpbGRyZW4oZWxlbWVudCwgY29vcmRpbmF0ZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiB2b2lkIFRvcG1vc3RFdmVudFRhcmdldDo6Q29uc2lkZXJFbGVtZW50KGRvbTo6RWxlbWVudCogZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6VmVjdG9yMmRGJiBjb29yZGluYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlZlY3RvcjJkRiYgY29vcmRpbmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zaWRlcl9vbmx5X2ZpeGVkX2VsZW1lbnRzKSB7CiAgIGlmICghZWxlbWVudCkgcmV0dXJuOwogICBtYXRoOjpWZWN0b3IyZEYgZWxlbWVudF9jb29yZGluYXRlKGNvb3JkaW5hdGUpOwogICBMYXlvdXRCb3hlcyogbGF5b3V0X2JveGVzID0gR2V0TGF5b3V0Qm94ZXNJZk5vdEVtcHR5KGVsZW1lbnQpOwotICBpZiAobGF5b3V0X2JveGVzKSB7Ci0gICAgaWYgKCFTaG91bGRDb25zaWRlckVsZW1lbnRBbmRDaGlsZHJlbihlbGVtZW50LCAmZWxlbWVudF9jb29yZGluYXRlKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KKyAgYm9vbCBjb25zaWRlcl9lbGVtZW50X2FuZF9jaGlsZHJlbiA9IFNob3VsZENvbnNpZGVyRWxlbWVudEFuZENoaWxkcmVuKAorICAgICAgZWxlbWVudCwgJmVsZW1lbnRfY29vcmRpbmF0ZSwgY29uc2lkZXJfb25seV9maXhlZF9lbGVtZW50cyk7CisKKyAgaWYgKGNvbnNpZGVyX2VsZW1lbnRfYW5kX2NoaWxkcmVuKSB7CiAgICAgc2NvcGVkX3JlZnB0cjxkb206OkhUTUxFbGVtZW50PiBodG1sX2VsZW1lbnQgPSBlbGVtZW50LT5Bc0hUTUxFbGVtZW50KCk7CiAgICAgaWYgKGh0bWxfZWxlbWVudCAmJiBodG1sX2VsZW1lbnQtPkNhbkJlRGVzaWduYXRlZEJ5UG9pbnRlcklmRGlzcGxheWVkKCkpIHsKICAgICAgIENvbnNpZGVyQm94ZXMoaHRtbF9lbGVtZW50LCBsYXlvdXRfYm94ZXMsIGVsZW1lbnRfY29vcmRpbmF0ZSk7CkBAIC00NTMsNyArNDgwLDggQEAKIAogICBmb3IgKGRvbTo6RWxlbWVudCogY2hpbGRfZWxlbWVudCA9IGVsZW1lbnQtPmZpcnN0X2VsZW1lbnRfY2hpbGQoKTsKICAgICAgICBjaGlsZF9lbGVtZW50OyBjaGlsZF9lbGVtZW50ID0gY2hpbGRfZWxlbWVudC0+bmV4dF9lbGVtZW50X3NpYmxpbmcoKSkgewotICAgIENvbnNpZGVyRWxlbWVudChjaGlsZF9lbGVtZW50LCBlbGVtZW50X2Nvb3JkaW5hdGUpOworICAgIENvbnNpZGVyRWxlbWVudChjaGlsZF9lbGVtZW50LCBlbGVtZW50X2Nvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICFjb25zaWRlcl9lbGVtZW50X2FuZF9jaGlsZHJlbik7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5oIGIvY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5oCmluZGV4IDFkMWRkOWIuLjJhODE0OGEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9sYXlvdXQvdG9wbW9zdF9ldmVudF90YXJnZXQuaAorKysgYi9jb2JhbHQvbGF5b3V0L3RvcG1vc3RfZXZlbnRfdGFyZ2V0LmgKQEAgLTUxLDggKzUxLDggQEAKICAgdm9pZCBDYW5jZWxTY3JvbGxzSW5QYXJlbnROYXZJdGVtcygKICAgICAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpIVE1MRWxlbWVudD4gdGFyZ2V0X2VsZW1lbnQpOwogCi0gIHZvaWQgQ29uc2lkZXJFbGVtZW50KGRvbTo6RWxlbWVudCogZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6VmVjdG9yMmRGJiBjb29yZGluYXRlKTsKKyAgdm9pZCBDb25zaWRlckVsZW1lbnQoZG9tOjpFbGVtZW50KiBlbGVtZW50LCBjb25zdCBtYXRoOjpWZWN0b3IyZEYmIGNvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc2lkZXJfb25seV9maXhlZF9lbGVtZW50cyk7CiAgIHZvaWQgQ29uc2lkZXJCb3hlcyhjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6SFRNTEVsZW1lbnQ+JiBodG1sX2VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRCb3hlcyogbGF5b3V0X2JveGVzLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6VmVjdG9yMmRGJiBjb29yZGluYXRlKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3NuYXBzaG90LmNjIGIvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfc25hcHNob3QuY2MKaW5kZXggYTYwMDM5NS4uZGI0OWU3NiAxMDA2NDQKLS0tIGEvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfc25hcHNob3QuY2MKKysrIGIvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfc25hcHNob3QuY2MKQEAgLTgwLDcgKzgwLDcgQEAKICAgYnJvd3Nlcjo6VXNlckFnZW50UGxhdGZvcm1JbmZvIHBsYXRmb3JtX2luZm87CiAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUgbmV0d29ya19tb2R1bGUoCiAgICAgICBicm93c2VyOjpDcmVhdGVVc2VyQWdlbnRTdHJpbmcocGxhdGZvcm1faW5mbyksCi0gICAgICBicm93c2VyOjpHZXRDbGllbnRIaW50SGVhZGVycyhwbGF0Zm9ybV9pbmZvKSwgTlVMTCwgTlVMTCwgbmV0X29wdGlvbnMpOworICAgICAgYnJvd3Nlcjo6R2V0Q2xpZW50SGludEhlYWRlcnMocGxhdGZvcm1faW5mbyksIG51bGxwdHIsIG5ldF9vcHRpb25zKTsKIAogICAvLyBVc2UgMTI4TSBvZiBpbWFnZSBjYWNoZSB0byBtaW5pbWl6ZSB0aGUgZWZmZWN0IG9mIGltYWdlIGxvYWRpbmcuCiAgIGNvbnN0IHNpemVfdCBrSW1hZ2VDYWNoZUNhcGFjaXR5ID0gMTI4ICogMTAyNCAqIDEwMjQ7CmRpZmYgLS1naXQgYS9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF90ZXN0cy5jYyBiL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmNjCmluZGV4IDVjOWQwZjEuLjY2NzllM2YgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmNjCisrKyBiL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmNjCkBAIC0yMTEsNiArMjExLDcgQEAKICAgUnVuVGVzdChHZXRQYXJhbSgpLCBncmFwaGljc19jb250ZXh0XywgcGl4ZWxfdGVzdGVyX29wdGlvbnMpOwogfQogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoTGF5b3V0RXhhY3QpOwogLy8gVGhpcyB0ZXN0IGRvZXMgYW4gZXhhY3QgcGl4ZWwgY29tcGFyZSB3aXRoIHRoZSBleHBlY3RlZCBvdXRwdXQuCiBjbGFzcyBMYXlvdXRFeGFjdCA6IHB1YmxpYyBMYXlvdXQge307CiBURVNUX1AoTGF5b3V0RXhhY3QsIFRlc3QpIHsKZGlmZiAtLWdpdCBhL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL3NlcnZpY2Utd29ya2Vycy93ZWJfcGxhdGZvcm1fdGVzdHMudHh0IGIvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvc2VydmljZS13b3JrZXJzL3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKaW5kZXggMTEzMmMxNS4uZjgyMWRmMSAxMDA2NDQKLS0tIGEvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvc2VydmljZS13b3JrZXJzL3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKKysrIGIvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvc2VydmljZS13b3JrZXJzL3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKQEAgLTEsMTkgKzEsMjkgQEAKICMgU2VydmljZSBXb3JrZXIgQVBJIHRlc3RzCiAKK3NlcnZpY2Utd29ya2VyL2FjdGl2YXRpb24tYWZ0ZXItcmVnaXN0cmF0aW9uLmh0dHBzLmh0bWwsIFBBU1MKK3NlcnZpY2Utd29ya2VyL2FjdGl2YXRlLWV2ZW50LWFmdGVyLWluc3RhbGwtc3RhdGUtY2hhbmdlLmh0dHBzLmh0bWwsIFBBU1MKIHNlcnZpY2Utd29ya2VyL2NsaWVudHMtbWF0Y2hhbGwtb24tZXZhbHVhdGlvbi5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9mZXRjaC1ldmVudC1hZGQtYXN5bmMuaHR0cHMuaHRtbCwgUEFTUworc2VydmljZS13b3JrZXIvaW1wb3J0LXNjcmlwdHMtY3Jvc3Mtb3JpZ2luLmh0dHBzLmh0bWwsIFBBU1MKIHNlcnZpY2Utd29ya2VyL2ltcG9ydC1zY3JpcHRzLXJlc291cmNlLW1hcC5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9pbXBvcnQtc2NyaXB0cy11cGRhdGVkLWZsYWcuaHR0cHMuaHRtbCwgUEFTUworc2VydmljZS13b3JrZXIvbXVsdGlwbGUtdXBkYXRlLmh0dHBzLmh0bWwsIFBBU1MKIHNlcnZpY2Utd29ya2VyL3JlZ2lzdGVyLWRlZmF1bHQtc2NvcGUuaHR0cHMuaHRtbCwgUEFTUworc2VydmljZS13b3JrZXIvcmVnaXN0ZXItd2FpdC1mb3JldmVyLWluLWluc3RhbGwtd29ya2VyLmh0dHBzLmh0bWwsIFBBU1MKIHNlcnZpY2Utd29ya2VyL3JlZ2lzdHJhdGlvbi1iYXNpYy5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9yZWdpc3RyYXRpb24tc2VjdXJpdHktZXJyb3IuaHR0cHMuaHRtbCwgUEFTUworc2VydmljZS13b3JrZXIvcmVnaXN0cmF0aW9uLXNlcnZpY2Utd29ya2VyLWF0dHJpYnV0ZXMuaHR0cHMuaHRtbCwgUEFTUwogc2VydmljZS13b3JrZXIvcmVnaXN0cmF0aW9uLXNjcmlwdC11cmwuaHR0cHMuaHRtbCwgUEFTUwogc2VydmljZS13b3JrZXIvcmVqZWN0aW9ucy5odHRwcy5odG1sLCBQQVNTCitzZXJ2aWNlLXdvcmtlci9zZXJ2aWNld29ya2Vyb2JqZWN0LXNjcmlwdHVybC5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9zZXJ2aWNlLXdvcmtlci1jc3AtZGVmYXVsdC5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9zZXJ2aWNlLXdvcmtlci1jc3AtY29ubmVjdC5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9zZXJ2aWNlLXdvcmtlci1jc3Atc2NyaXB0Lmh0dHBzLmh0bWwsIFBBU1MKK3NlcnZpY2Utd29ya2VyL3NlcnZpY2Utd29ya2VyLWhlYWRlci5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9TZXJ2aWNlLVdvcmtlci1BbGxvd2VkLWhlYWRlci5odHRwcy5odG1sLCBQQVNTCiBzZXJ2aWNlLXdvcmtlci9za2lwLXdhaXRpbmctd2l0aG91dC1jbGllbnQuaHR0cHMuaHRtbCwgUEFTUworc2VydmljZS13b3JrZXIvc3RhdGUuaHR0cHMuaHRtbCwgUEFTUworc2VydmljZS13b3JrZXIvc3luY2VkLXN0YXRlLmh0dHBzLmh0bWwsIFBBU1MKIHNlcnZpY2Utd29ya2VyL3VuY29udHJvbGxlZC1wYWdlLmh0dHBzLmh0bWwsIFBBU1MKIHNlcnZpY2Utd29ya2VyL3VucmVnaXN0ZXIuaHR0cHMuaHRtbCwgUEFTUwogc2VydmljZS13b3JrZXIvdXBkYXRlLW5vLWNhY2hlLXJlcXVlc3QtaGVhZGVycy5odHRwcy5odG1sLCBQQVNTCkBAIC0yOCwxNyArMzgsNyBAQAogc2VydmljZS13b3JrZXIvaW1wb3J0LXNjcmlwdHMtbWltZS10eXBlcy5odHRwcy5odG1sLCBESVNBQkxFCiAKICMgYi8yMzQ3ODg0NzkgSW1wbGVtZW50IHdhaXRpbmcgZm9yIHVwZGF0ZSB3b3JrZXIgc3RhdGUgdGFza3MgaW4gSW5zdGFsbCBhbGdvcml0aG0uCi1zZXJ2aWNlLXdvcmtlci9hY3RpdmF0aW9uLWFmdGVyLXJlZ2lzdHJhdGlvbi5odHRwcy5odG1sLCBESVNBQkxFCi1zZXJ2aWNlLXdvcmtlci9hY3RpdmF0ZS1ldmVudC1hZnRlci1pbnN0YWxsLXN0YXRlLWNoYW5nZS5odHRwcy5odG1sLCBESVNBQkxFCi1zZXJ2aWNlLXdvcmtlci9pbXBvcnQtc2NyaXB0cy1jcm9zcy1vcmlnaW4uaHR0cHMuaHRtbCwgRElTQUJMRQogc2VydmljZS13b3JrZXIvaW1wb3J0LXNjcmlwdHMtcmVkaXJlY3QuaHR0cHMuaHRtbCwgRElTQUJMRQotc2VydmljZS13b3JrZXIvbXVsdGlwbGUtdXBkYXRlLmh0dHBzLmh0bWwsIERJU0FCTEUKLXNlcnZpY2Utd29ya2VyL3JlZ2lzdGVyLXdhaXQtZm9yZXZlci1pbi1pbnN0YWxsLXdvcmtlci5odHRwcy5odG1sLCBESVNBQkxFCi1zZXJ2aWNlLXdvcmtlci9yZWdpc3RyYXRpb24tc2VydmljZS13b3JrZXItYXR0cmlidXRlcy5odHRwcy5odG1sLCBESVNBQkxFCi1zZXJ2aWNlLXdvcmtlci9zZXJ2aWNlLXdvcmtlci1oZWFkZXIuaHR0cHMuaHRtbCwgRElTQUJMRQotc2VydmljZS13b3JrZXIvc3RhdGUuaHR0cHMuaHRtbCwgRElTQUJMRQotc2VydmljZS13b3JrZXIvc3luY2VkLXN0YXRlLmh0dHBzLmh0bWwsIERJU0FCTEUKLXNlcnZpY2Utd29ya2VyL3NlcnZpY2V3b3JrZXJvYmplY3Qtc2NyaXB0dXJsLmh0dHBzLmh0bWwsIERJU0FCTEUKIAogIyAiTW9kdWxlIiB0eXBlIG9mIGRlZGljYXRlZCB3b3JrZXIgaXMgc3VwcG9ydGVkIGluIENvYmFsdAogc2VydmljZS13b3JrZXIvZGVkaWNhdGVkLXdvcmtlci1zZXJ2aWNlLXdvcmtlci1pbnRlcmNlcHRpb24uaHR0cHMuaHRtbCwgRElTQUJMRQpAQCAtNjUsMTAgKzY1LDEwIEBACiAjIGIvMjY1ODQxNjA3IFVuaGFuZGxlZCByZWplY3Rpb24gd2l0aCB2YWx1ZTogb2JqZWN0ICJUeXBlRXJyb3IiCiBzZXJ2aWNlLXdvcmtlci9zYW1lLXNpdGUtY29va2llcy5odHRwcy5odG1sLCBESVNBQkxFCiAKLSMgYi8yNjU4NDQ2NjIKKyMgYi8yNjU4NDQ2NjIgRXhwZWN0ZWQgZmFsc2UsIGdvdCB0cnVlCiBzZXJ2aWNlLXdvcmtlci9pbnRlcmZhY2UtcmVxdWlyZW1lbnRzLXN3Lmh0dHBzLmh0bWwsIERJU0FCTEUKIAotIyBiLzI2NTg0Nzg0NgorIyBiLzI2NTg0Nzg0NiBTZWN1cml0eUVycm9yIFJlYWNoZWQgdW5yZWFjaGFibGUgY29kZQogc2VydmljZS13b3JrZXIvbmF2aWdhdGUtd2luZG93Lmh0dHBzLmh0bWwsIERJU0FCTEUKIAogIyBiLzI2NzIzMDQxOSBFcnJvciB0eXBlIGluY29ycmVjdApkaWZmIC0tZ2l0IGEvY29iYWx0L2xheW91dF90ZXN0cy93ZWJfcGxhdGZvcm1fdGVzdHMuY2MgYi9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0cy5jYwppbmRleCAwNWMyMzc2Li40NTVjMzdlIDEwMDY0NAotLS0gYS9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0cy5jYworKysgYi9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0cy5jYwpAQCAtMjMyLDggKzIzMiw4IEBACiAKICAgd2ViX21vZHVsZV9vcHRpb25zLndlYl9vcHRpb25zLndlYl9zZXR0aW5ncyA9ICZ3ZWJfc2V0dGluZ3M7CiAgIHdlYl9tb2R1bGVfb3B0aW9ucy53ZWJfb3B0aW9ucy5uZXR3b3JrX21vZHVsZSA9ICZuZXR3b3JrX21vZHVsZTsKLSAgd2ViX21vZHVsZV9vcHRpb25zLndlYl9vcHRpb25zLnNlcnZpY2Vfd29ya2VyX2pvYnMgPQotICAgICAgc2VydmljZV93b3JrZXJfcmVnaXN0cnktPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKKyAgd2ViX21vZHVsZV9vcHRpb25zLndlYl9vcHRpb25zLnNlcnZpY2Vfd29ya2VyX2NvbnRleHQgPQorICAgICAgc2VydmljZV93b3JrZXJfcmVnaXN0cnktPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKTsKICAgd2ViX21vZHVsZV9vcHRpb25zLndlYl9vcHRpb25zLnBsYXRmb3JtX2luZm8gPSBwbGF0Zm9ybV9pbmZvLmdldCgpOwogCiAgIC8vIFByZXBhcmUgYSBzbG90IGZvciBvdXIgcmVzdWx0cyB0byBiZSBwbGFjZWQgd2hlbiByZWFkeS4KZGlmZiAtLWdpdCBhL2NvYmFsdC9sb2FkZXIvY29yc19wcmVmbGlnaHQuY2MgYi9jb2JhbHQvbG9hZGVyL2NvcnNfcHJlZmxpZ2h0LmNjCmluZGV4IDkzZjk2ZDIuLjk4MGY0ZDkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9sb2FkZXIvY29yc19wcmVmbGlnaHQuY2MKKysrIGIvY29iYWx0L2xvYWRlci9jb3JzX3ByZWZsaWdodC5jYwpAQCAtMjgwLDcgKzI4MCw4IEBACiAgIHVybF9mZXRjaGVyXyA9IG5ldDo6VVJMRmV0Y2hlcjo6Q3JlYXRlKHVybF8sIG5ldDo6VVJMRmV0Y2hlcjo6T1BUSU9OUywgdGhpcyk7CiAgIHVybF9mZXRjaGVyXy0+U2V0UmVxdWVzdENvbnRleHQoCiAgICAgICBuZXR3b3JrX21vZHVsZV8tPnVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyKCkuZ2V0KCkpOwotICBuZXR3b3JrX21vZHVsZV8tPkFkZENsaWVudEhpbnRIZWFkZXJzKCp1cmxfZmV0Y2hlcl8pOworICBuZXR3b3JrX21vZHVsZV8tPkFkZENsaWVudEhpbnRIZWFkZXJzKCp1cmxfZmV0Y2hlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yazo6a0NhbGxUeXBlUHJlZmxpZ2h0KTsKICAgdXJsX2ZldGNoZXJfLT5BZGRFeHRyYVJlcXVlc3RIZWFkZXIoa09yaWdpbmhlYWRlcm5hbWUgKyBvcmlnaW5fKTsKICAgLy8gMy4gTGV0IGhlYWRlcnMgYmUgdGhlIG5hbWVzIG9mIHJlcXVlc3QncyBoZWFkZXIgbGlzdCdzIGhlYWRlcnMsCiAgIC8vICAgIGV4Y2x1ZGluZyBDT1JTLXNhZmVsaXN0ZWQgcmVxdWVzdC1oZWFkZXJzIGFuZCBkdXBsaWNhdGVzLCBzb3J0ZWQKZGlmZiAtLWdpdCBhL2NvYmFsdC9sb2FkZXIvbmV0X2ZldGNoZXIuY2MgYi9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCmluZGV4IGQ4MjVmYzQuLjg3MjE5NGEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9sb2FkZXIvbmV0X2ZldGNoZXIuY2MKKysrIGIvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5jYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgICAgIG5ldDo6TE9BRF9ET19OT1RfU0VORF9DT09LSUVTIHwgbmV0OjpMT0FEX0RPX05PVF9TRU5EX0FVVEhfREFUQTsKICAgICB1cmxfZmV0Y2hlcl8tPlNldExvYWRGbGFncyhrRGlzYWJsZUNvb2tpZXNMb2FkRmxhZ3MpOwogICB9Ci0gIG5ldHdvcmtfbW9kdWxlLT5BZGRDbGllbnRIaW50SGVhZGVycygqdXJsX2ZldGNoZXJfKTsKKyAgbmV0d29ya19tb2R1bGUtPkFkZENsaWVudEhpbnRIZWFkZXJzKCp1cmxfZmV0Y2hlcl8sIG5ldHdvcms6OmtDYWxsVHlwZUxvYWRlcik7CiAKICAgLy8gRGVsYXkgdGhlIGFjdHVhbCBzdGFydCB1bnRpbCB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlLiBPdGhlcndpc2Ugd2UgbWlnaHQKICAgLy8gY2FsbCBoYW5kbGVyJ3MgY2FsbGJhY2tzIGF0IGFuIHVuZXhwZWN0ZWQgdGltZS0gZS5nLiByZWNlaXZpbmcgT25FcnJvcigpCmRpZmYgLS1naXQgYS9jb2JhbHQvbWVkaWEvQlVJTEQuZ24gYi9jb2JhbHQvbWVkaWEvQlVJTEQuZ24KaW5kZXggZWUxNjI1ZS4uODEzYmFhMiAxMDA2NDQKLS0tIGEvY29iYWx0L21lZGlhL0JVSUxELmduCisrKyBiL2NvYmFsdC9tZWRpYS9CVUlMRC5nbgpAQCAtNDgsNiArNDgsNyBAQAogICAgICJiYXNlL3NicGxheWVyX2ludGVyZmFjZS5jYyIsCiAgICAgImJhc2Uvc2JwbGF5ZXJfaW50ZXJmYWNlLmgiLAogICAgICJiYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjIiwKKyAgICAiYmFzZS9zYnBsYXllcl9waXBlbGluZS5oIiwKICAgICAiYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5jYyIsCiAgICAgImJhc2Uvc2JwbGF5ZXJfc2V0X2JvdW5kc19oZWxwZXIuaCIsCiAgICAgImRlY29kZXJfYnVmZmVyX2FsbG9jYXRvci5jYyIsCmRpZmYgLS1naXQgYS9jb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZS5oIGIvY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmUuaAppbmRleCBiOTMwMTA3Li5kMGY5MTc1IDEwMDY0NAotLS0gYS9jb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZS5oCisrKyBiL2NvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lLmgKQEAgLTkyLDIzICs5MiwxMiBAQAogICAgICAgT25FbmNyeXB0ZWRNZWRpYUluaXREYXRhRW5jb3VudGVyZWRDQjsKICNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKIAotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxQaXBlbGluZT4gQ3JlYXRlKAotICAgICAgU2JQbGF5ZXJJbnRlcmZhY2UqIGludGVyZmFjZSwgUGlwZWxpbmVXaW5kb3cgd2luZG93LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiYgdGFza19ydW5uZXIsCi0gICAgICBjb25zdCBHZXREZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlckZ1bmMmCi0gICAgICAgICAgZ2V0X2RlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl9mdW5jLAotICAgICAgYm9vbCBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZCwgYm9vbCBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZSwKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQotICAgICAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsLCBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fcmVtb3RlLAotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAxNQotICAgICAgTWVkaWFMb2cqIG1lZGlhX2xvZywgRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIGRlY29kZV90YXJnZXRfcHJvdmlkZXIpOwotCiAgIHZpcnR1YWwgflBpcGVsaW5lKCkge30KIAotICB2aXJ0dWFsIHZvaWQgU3VzcGVuZCgpIHt9CisgIHZpcnR1YWwgdm9pZCBTdXNwZW5kKCkgPSAwOwogICAvLyBUT0RPOiBUaGlzIGlzIHRlbXBvcmFyeSBmb3Igc3VwcG9ydGluZyBiYWNrZ3JvdW5kIG1lZGlhIHBsYXliYWNrLgogICAvLyAgICAgICBOZWVkIHRvIGJlIHJlbW92ZWQgd2l0aCBtZWRpYSByZWZhY3Rvci4KLSAgdmlydHVhbCB2b2lkIFJlc3VtZShQaXBlbGluZVdpbmRvdyB3aW5kb3cpIHt9CisgIHZpcnR1YWwgdm9pZCBSZXN1bWUoUGlwZWxpbmVXaW5kb3cgd2luZG93KSA9IDA7CiAKICAgLy8gQnVpbGQgYSBwaXBlbGluZSB0byB1c2luZyB0aGUgZ2l2ZW4gZmlsdGVyIGNvbGxlY3Rpb24gdG8gY29uc3RydWN0IGEgZmlsdGVyCiAgIC8vIGNoYWluLCBleGVjdXRpbmcgfHNlZWtfY2J8IHdoZW4gdGhlIGluaXRpYWwgc2Vlay9wcmVyb2xsIGhhcyBjb21wbGV0ZWQuCkBAIC0yMzEsMTAgKzIyMCwxMiBAQAogICB2aXJ0dWFsIFBpcGVsaW5lU3RhdGlzdGljcyBHZXRTdGF0aXN0aWNzKCkgY29uc3QgPSAwOwogCiAgIC8vIEdldCB0aGUgU2V0Qm91bmRzQ0IgdXNlZCB0byBzZXQgdGhlIGJvdW5kcyBvZiB0aGUgdmlkZW8gZnJhbWUuCi0gIHZpcnR1YWwgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSB7IHJldHVybiBTZXRCb3VuZHNDQigpOyB9CisgIHZpcnR1YWwgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSA9IDA7CiAKLSAgLy8gVXBkYXRlcyB0aGUgcGxheWVyJ3MgcHJlZmVyZW5jZSBmb3IgZGVjb2RlLXRvLXRleHR1cmUgdmVyc3VzIHB1bmNoIHRocm91Z2guCi0gIHZpcnR1YWwgdm9pZCBTZXREZWNvZGVUb1RleHR1cmVPdXRwdXRNb2RlKGJvb2wgZW5hYmxlZCkge30KKyAgLy8gQ29iYWx0IGJ5IGRlZmF1bHQgZG9lc24ndCBoYXZlIHByZWZlcmVuY2Ugb24gdGhlIG91dHB1dCBtb2RlIHVzZWQgYnkKKyAgLy8gU2JQbGF5ZXIuICBPbmNlIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5IHNldHMgdGhlIHByZWZlcnJlZCBvdXRwdXQKKyAgLy8gbW9kZSB0byBkZWNvZGUtdG8tdGV4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFNldFByZWZlcnJlZE91dHB1dE1vZGVUb0RlY29kZVRvVGV4dHVyZSgpID0gMDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfYnJpZGdlLmNjIGIvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfYnJpZGdlLmNjCmluZGV4IDFmYjRjODEuLmZhZDdmZGEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX2JyaWRnZS5jYworKysgYi9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9icmlkZ2UuY2MKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9zdGF0aXN0aWNzLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZm9ybWF0X3N1cHBvcnRfcXVlcnlfbWV0cmljcy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbWVkaWEuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc3RyaW5nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCkBAIC0zOCw2ICszOSw4IEBACiAKIG5hbWVzcGFjZSB7CiAKK3VzaW5nIHN0YXJib2FyZDo6R2V0UGxheWVyT3V0cHV0TW9kZU5hbWU7CisKIGNsYXNzIFN0YXRpc3RpY3NXcmFwcGVyIHsKICBwdWJsaWM6CiAgIHN0YXRpYyBTdGF0aXN0aWNzV3JhcHBlciogR2V0SW5zdGFuY2UoKTsKQEAgLTE3Nyw3ICsxODAsNyBAQAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIHRhc2tfcnVubmVyLAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsIFNiV2luZG93IHdpbmRvdywgSG9zdCogaG9zdCwKICAgICBTYlBsYXllclNldEJvdW5kc0hlbHBlciogc2V0X2JvdW5kc19oZWxwZXIsIGJvb2wgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmQsCi0gICAgYm9vbCBwcmVmZXJfZGVjb2RlX3RvX3RleHR1cmUsCisgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIGRlZmF1bHRfb3V0cHV0X21vZGUsCiAgICAgY29uc3QgT25FbmNyeXB0ZWRNZWRpYUluaXREYXRhRW5jb3VudGVyZWRDQiYKICAgICAgICAgb25fZW5jcnlwdGVkX21lZGlhX2luaXRfZGF0YV9lbmNvdW50ZXJlZF9jYiwKICAgICBEZWNvZGVUYXJnZXRQcm92aWRlciogY29uc3QgZGVjb2RlX3RhcmdldF9wcm92aWRlciwKQEAgLTIwMCw3ICsyMDMsNyBAQAogICBEQ0hFQ0soaG9zdF8pOwogICBEQ0hFQ0soc2V0X2JvdW5kc19oZWxwZXJfKTsKIAotICBvdXRwdXRfbW9kZV8gPSBDb21wdXRlU2JVcmxQbGF5ZXJPdXRwdXRNb2RlKHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSk7CisgIG91dHB1dF9tb2RlXyA9IENvbXB1dGVTYlVybFBsYXllck91dHB1dE1vZGUoZGVmYXVsdF9vdXRwdXRfbW9kZSk7CiAKICAgQ3JlYXRlVXJsUGxheWVyKHVybF8pOwogCkBAIC0yMjAsNyArMjIzLDcgQEAKICAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHZpZGVvX21pbWVfdHlwZSwKICAgICBTYldpbmRvdyB3aW5kb3csIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sIEhvc3QqIGhvc3QsCiAgICAgU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXIqIHNldF9ib3VuZHNfaGVscGVyLCBib29sIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kLAotICAgIGJvb2wgcHJlZmVyX2RlY29kZV90b190ZXh0dXJlLAorICAgIFNiUGxheWVyT3V0cHV0TW9kZSBkZWZhdWx0X291dHB1dF9tb2RlLAogICAgIERlY29kZVRhcmdldFByb3ZpZGVyKiBjb25zdCBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyLAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzLCBzdGQ6OnN0cmluZyBwaXBlbGluZV9pZGVudGlmaWVyKQogICAgIDogc2JwbGF5ZXJfaW50ZXJmYWNlXyhpbnRlcmZhY2UpLApAQCAtMjYxLDcgKzI2NCw3IEBACiAgICAgVXBkYXRlVmlkZW9Db25maWcodmlkZW9fY29uZmlnLCB2aWRlb19taW1lX3R5cGUpOwogICB9CiAKLSAgb3V0cHV0X21vZGVfID0gQ29tcHV0ZVNiUGxheWVyT3V0cHV0TW9kZShwcmVmZXJfZGVjb2RlX3RvX3RleHR1cmUpOworICBvdXRwdXRfbW9kZV8gPSBDb21wdXRlU2JQbGF5ZXJPdXRwdXRNb2RlKGRlZmF1bHRfb3V0cHV0X21vZGUpOwogCiAgIENyZWF0ZVBsYXllcigpOwogCkBAIC0xMTkwLDcgKzExOTMsNyBAQAogCiAjaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKIFNiUGxheWVyT3V0cHV0TW9kZSBTYlBsYXllckJyaWRnZTo6Q29tcHV0ZVNiVXJsUGxheWVyT3V0cHV0TW9kZSgKLSAgICBib29sIHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSkgeworICAgIFNiUGxheWVyT3V0cHV0TW9kZSBkZWZhdWx0X291dHB1dF9tb2RlKSB7CiAgIC8vIFRyeSB0byBjaG9vc2UgdGhlIG91dHB1dCBtb2RlIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGluIHZhbHVlIG9mCiAgIC8vIHxwcmVmZXJfZGVjb2RlX3RvX3RleHR1cmV8LiAgSWYgdGhlIHByZWZlcnJlZCBvdXRwdXQgbW9kZSBpcyB1bmF2YWlsYWJsZQogICAvLyB0aG91Z2gsIGZhbGxiYWNrIHRvIGFuIG91dHB1dCBtb2RlIHRoYXQgaXMgYXZhaWxhYmxlLgpAQCAtMTE5OSw3ICsxMjAyLDggQEAKICAgICAgICAgICBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQpKSB7CiAgICAgb3V0cHV0X21vZGUgPSBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQ7CiAgIH0KLSAgaWYgKChwcmVmZXJfZGVjb2RlX3RvX3RleHR1cmUgfHwgb3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQpICYmCisgIGlmICgoZGVmYXVsdF9vdXRwdXRfbW9kZSA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlIHx8CisgICAgICAgb3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQpICYmCiAgICAgICBzYnBsYXllcl9pbnRlcmZhY2VfLT5HZXRVcmxQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKAogICAgICAgICAgIGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpKSB7CiAgICAgb3V0cHV0X21vZGUgPSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlOwpAQCAtMTIxMSw5ICsxMjE1LDEwIEBACiAjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCiAKIFNiUGxheWVyT3V0cHV0TW9kZSBTYlBsYXllckJyaWRnZTo6Q29tcHV0ZVNiUGxheWVyT3V0cHV0TW9kZSgKLSAgICBib29sIHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSkgY29uc3QgeworICAgIFNiUGxheWVyT3V0cHV0TW9kZSBkZWZhdWx0X291dHB1dF9tb2RlKSBjb25zdCB7CiAgIFNiUGxheWVyQ3JlYXRpb25QYXJhbSBjcmVhdGlvbl9wYXJhbSA9IHt9OwogICBjcmVhdGlvbl9wYXJhbS5kcm1fc3lzdGVtID0gZHJtX3N5c3RlbV87CisKICNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQogICBjcmVhdGlvbl9wYXJhbS5hdWRpb19zdHJlYW1faW5mbyA9IGF1ZGlvX3N0cmVhbV9pbmZvXzsKICAgY3JlYXRpb25fcGFyYW0udmlkZW9fc3RyZWFtX2luZm8gPSB2aWRlb19zdHJlYW1faW5mb187CkBAIC0xMjIyLDEzICsxMjI3LDM0IEBACiAgIGNyZWF0aW9uX3BhcmFtLnZpZGVvX3NhbXBsZV9pbmZvID0gdmlkZW9fc3RyZWFtX2luZm9fOwogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAxNQogCi0gIC8vIFRyeSB0byBjaG9vc2UgfGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmV8IHdoZW4KLSAgLy8gfHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZXwgaXMgdHJ1ZS4KLSAgaWYgKHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSkgewotICAgIGNyZWF0aW9uX3BhcmFtLm91dHB1dF9tb2RlID0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZTsKLSAgfSBlbHNlIHsKLSAgICBjcmVhdGlvbl9wYXJhbS5vdXRwdXRfbW9kZSA9IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dDsKKyAgaWYgKGRlZmF1bHRfb3V0cHV0X21vZGUgIT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSAmJgorICAgICAgdmlkZW9fc3RyZWFtX2luZm9fLmNvZGVjICE9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmUpIHsKKyAgICBTQl9EQ0hFQ0sodmlkZW9fc3RyZWFtX2luZm9fLm1pbWUpOworICAgIFNCX0RDSEVDSyh2aWRlb19zdHJlYW1faW5mb18ubWF4X3ZpZGVvX2NhcGFiaWxpdGllcyk7CisKKyAgICAvLyBTZXQgdGhlIGBkZWZhdWx0X291dHB1dF9tb2RlYCB0byBga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZWAgaWYKKyAgICAvLyBhbnkgb2YgdGhlIG1pbWUgYXNzb2NpYXRlZCB3aXRoIGl0IGhhcyBgZGVjb2RlLXRvLXRleHR1cmU9dHJ1ZWAgc2V0LgorICAgIC8vIFRPRE8oYi8yMzI1NTkxNzcpOiBNYWtlIHRoZSBjaGVjayBiZWxvdyBtb3JlIGZsZXhpYmxlLCB0byB3b3JrIHdpdGgKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgb3RoZXIgd2VsbCBmb3JtZWQgaW5wdXRzIChlLmcuIHdpdGggZXh0cmEgc3BhY2UpLgorICAgIGJvb2wgaXNfZGVjb2RlX3RvX3RleHR1cmVfcHJlZmVycmVkID0KKyAgICAgICAgc3Ryc3RyKHZpZGVvX3N0cmVhbV9pbmZvXy5taW1lLCAiZGVjb2RlLXRvLXRleHR1cmU9dHJ1ZSIpIHx8CisgICAgICAgIHN0cnN0cih2aWRlb19zdHJlYW1faW5mb18ubWF4X3ZpZGVvX2NhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICJkZWNvZGUtdG8tdGV4dHVyZT10cnVlIik7CisKKyAgICBpZiAoaXNfZGVjb2RlX3RvX3RleHR1cmVfcHJlZmVycmVkKSB7CisgICAgICBTQl9MT0coSU5GTykgPDwgIlNldHRpbmcgYGRlZmF1bHRfb3V0cHV0X21vZGVgIGZyb20gXCIiCisgICAgICAgICAgICAgICAgICAgPDwgR2V0UGxheWVyT3V0cHV0TW9kZU5hbWUoZGVmYXVsdF9vdXRwdXRfbW9kZSkgPDwgIlwiIHRvIFwiIgorICAgICAgICAgICAgICAgICAgIDw8IEdldFBsYXllck91dHB1dE1vZGVOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKQorICAgICAgICAgICAgICAgICAgIDw8ICJcIiBiZWNhdXNlIG1pbWUgaXMgc2V0IHRvIFwiIiA8PCB2aWRlb19zdHJlYW1faW5mb18ubWltZQorICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgYW5kIG1heF92aWRlb19jYXBhYmlsaXRpZXMgaXMgc2V0IHRvIFwiIgorICAgICAgICAgICAgICAgICAgIDw8IHZpZGVvX3N0cmVhbV9pbmZvXy5tYXhfdmlkZW9fY2FwYWJpbGl0aWVzIDw8ICJcIiI7CisgICAgICBkZWZhdWx0X291dHB1dF9tb2RlID0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZTsKKyAgICB9CiAgIH0KKworICBjcmVhdGlvbl9wYXJhbS5vdXRwdXRfbW9kZSA9IGRlZmF1bHRfb3V0cHV0X21vZGU7CisKICAgYXV0byBvdXRwdXRfbW9kZSA9CiAgICAgICBzYnBsYXllcl9pbnRlcmZhY2VfLT5HZXRQcmVmZXJyZWRPdXRwdXRNb2RlKCZjcmVhdGlvbl9wYXJhbSk7CiAgIENIRUNLX05FKGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLCBvdXRwdXRfbW9kZSk7CmRpZmYgLS1naXQgYS9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9icmlkZ2UuaCBiL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX2JyaWRnZS5oCmluZGV4IGNhNzE2M2UuLmE0OGU1M2MgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX2JyaWRnZS5oCisrKyBiL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX2JyaWRnZS5oCkBAIC03Miw3ICs3Miw4IEBACiAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIHRhc2tfcnVubmVyLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXJsLCBTYldpbmRvdyB3aW5kb3csIEhvc3QqIGhvc3QsCiAgICAgICAgICAgICAgICAgIFNiUGxheWVyU2V0Qm91bmRzSGVscGVyKiBzZXRfYm91bmRzX2hlbHBlciwKLSAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZCwgYm9vbCBwcmVmZXJfZGVjb2RlX3RvX3RleHR1cmUsCisgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmQsCisgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBkZWZhdWx0X291dHB1dF9tb2RlLAogICAgICAgICAgICAgICAgICBjb25zdCBPbkVuY3J5cHRlZE1lZGlhSW5pdERhdGFFbmNvdW50ZXJlZENCJgogICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX21lZGlhX2luaXRfZGF0YV9lbmNvdW50ZXJlZF9jYiwKICAgICAgICAgICAgICAgICAgRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIGNvbnN0IGRlY29kZV90YXJnZXRfcHJvdmlkZXIsCkBAIC04OSw3ICs5MCw4IEBACiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2aWRlb19taW1lX3R5cGUsIFNiV2luZG93IHdpbmRvdywKICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwgSG9zdCogaG9zdCwKICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXIqIHNldF9ib3VuZHNfaGVscGVyLAotICAgICAgICAgICAgICAgICBib29sIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kLCBib29sIHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZCwKKyAgICAgICAgICAgICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIGRlZmF1bHRfb3V0cHV0X21vZGUsCiAgICAgICAgICAgICAgICAgIERlY29kZVRhcmdldFByb3ZpZGVyKiBjb25zdCBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcywKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGlwZWxpbmVfaWRlbnRpZmllcik7CkBAIC0yMzQsMTIgKzIzNiwxMiBAQAogCiAjaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKICAgU2JQbGF5ZXJPdXRwdXRNb2RlIENvbXB1dGVTYlVybFBsYXllck91dHB1dE1vZGUoCi0gICAgICBib29sIHByZWZlcl9kZWNvZGVfdG9fdGV4dHVyZSk7CisgICAgICBTYlBsYXllck91dHB1dE1vZGUgZGVmYXVsdF9vdXRwdXRfbW9kZSk7CiAjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCiAgIC8vIFJldHVybnMgdGhlIG91dHB1dCBtb2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgdmlkZW8gd2l0aCB0aGUgZ2l2ZW4KICAgLy8gc3BlY2lmaWNhdGlvbnMuCiAgIFNiUGxheWVyT3V0cHV0TW9kZSBDb21wdXRlU2JQbGF5ZXJPdXRwdXRNb2RlKAotICAgICAgYm9vbCBwcmVmZXJfZGVjb2RlX3RvX3RleHR1cmUpIGNvbnN0OworICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIGRlZmF1bHRfb3V0cHV0X21vZGUpIGNvbnN0OwogCiAgIHZvaWQgTG9nU3RhcnR1cExhdGVuY3koKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MgYi9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYwppbmRleCA5NTIzYTllLi45NDU5ZWJiIDEwMDY0NAotLS0gYS9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYworKysgYi9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYwpAQCAtMTIsNDYgKzEyLDIzIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmgiCisKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIiAgLy8gRm9yIENPTVBJTEVfQVNTRVJUCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL3Rhc2tfcnVubmVyLmgiCi0jaW5jbHVkZSAiYmFzZS90aW1lL3RpbWUuaCIKICNpbmNsdWRlICJiYXNlL3RyYWNlX2V2ZW50L3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvY192YWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9zdGFydHVwX3RpbWVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L21hdGgvc2l6ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGxheWJhY2tfc3RhdGlzdGljcy5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX2JyaWRnZS5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9tZWRpYS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc3RyaW5nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvYmFzZS9iaW5kX3RvX2N1cnJlbnRfbG9vcC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtL21lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvYmFzZS9kZW11eGVyLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtL21lZGlhL2Jhc2UvbWVkaWFfbG9nLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9iYXNlL3Jhbmdlcy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtL21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9jb2JhbHQvdWkvZ2Z4L2dlb21ldHJ5L3JlY3QuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9jb2JhbHQvdWkvZ2Z4L2dlb21ldHJ5L3NpemUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbWVkaWEgewpAQCAtNzMsMjUgKzUwLDYgQEAKIAogdW5zaWduZWQgaW50IGdfcGlwZWxpbmVfaWRlbnRpZmllcl9jb3VudGVyID0gMDsKIAotLy8gVXNlZCB0byBwb3N0IHBhcmFtZXRlcnMgdG8gU2JQbGF5ZXJQaXBlbGluZTo6U3RhcnRUYXNrKCkgYXMgdGhlIG51bWJlciBvZgotLy8gcGFyYW1ldGVycyBleGNlZWQgd2hhdCBiYXNlOjpCaW5kKCkgY2FuIHN1cHBvcnQuCi1zdHJ1Y3QgU3RhcnRUYXNrUGFyYW1ldGVycyB7Ci0gIERlbXV4ZXIqIGRlbXV4ZXI7Ci0gIFNldERybVN5c3RlbVJlYWR5Q0Igc2V0X2RybV9zeXN0ZW1fcmVhZHlfY2I7Ci0gIDo6bWVkaWE6OlBpcGVsaW5lU3RhdHVzQ0IgZW5kZWRfY2I7Ci0gIEVycm9yQ0IgZXJyb3JfY2I7Ci0gIFBpcGVsaW5lOjpTZWVrQ0Igc2Vla19jYjsKLSAgUGlwZWxpbmU6OkJ1ZmZlcmluZ1N0YXRlQ0IgYnVmZmVyaW5nX3N0YXRlX2NiOwotICBiYXNlOjpDbG9zdXJlIGR1cmF0aW9uX2NoYW5nZV9jYjsKLSAgYmFzZTo6Q2xvc3VyZSBvdXRwdXRfbW9kZV9jaGFuZ2VfY2I7Ci0gIGJhc2U6OkNsb3N1cmUgY29udGVudF9zaXplX2NoYW5nZV9jYjsKLSAgc3RkOjpzdHJpbmcgbWF4X3ZpZGVvX2NhcGFiaWxpdGllczsKLSNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQotICBzdGQ6OnN0cmluZyBzb3VyY2VfdXJsOwotICBib29sIGlzX3VybF9iYXNlZDsKLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKLX07Ci0KICNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQogYm9vbCBIYXNSZW1vdGVBdWRpb091dHB1dHMoCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb25zKSB7CkBAIC0xMjMsMjg0ICs4MSw3IEBACiB9CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CiAKLS8vIFNiUGxheWVyUGlwZWxpbmUgaXMgYSBQaXBlbGluZUJhc2UgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoZSBTYlBsYXllcgotLy8gaW50ZXJmYWNlIGludGVybmFsbHkuCi1jbGFzcyBNRURJQV9FWFBPUlQgU2JQbGF5ZXJQaXBlbGluZSA6IHB1YmxpYyBQaXBlbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIERlbXV4ZXJIb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU2JQbGF5ZXJCcmlkZ2U6Okhvc3QgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIG1lZGlhIHBpcGVsaW5lIHRoYXQgd2lsbCBleGVjdXRlIG9uIHx0YXNrX3J1bm5lcnwuCi0gIFNiUGxheWVyUGlwZWxpbmUoCi0gICAgICBTYlBsYXllckludGVyZmFjZSogaW50ZXJmYWNlLCBQaXBlbGluZVdpbmRvdyB3aW5kb3csCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiB0YXNrX3J1bm5lciwKLSAgICAgIGNvbnN0IEdldERlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyRnVuYyYKLSAgICAgICAgICBnZXRfZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyX2Z1bmMsCi0gICAgICBib29sIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kLCBib29sIGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlLAotI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1Ci0gICAgICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fbG9jYWwsIFNiVGltZSBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGUsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1Ci0gICAgICBNZWRpYUxvZyogbWVkaWFfbG9nLCBEZWNvZGVUYXJnZXRQcm92aWRlciogZGVjb2RlX3RhcmdldF9wcm92aWRlcik7Ci0gIH5TYlBsYXllclBpcGVsaW5lKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdXNwZW5kKCkgb3ZlcnJpZGU7Ci0gIC8vIFRPRE86IFRoaXMgaXMgdGVtcG9yYXJ5IGZvciBzdXBwb3J0aW5nIGJhY2tncm91bmQgbWVkaWEgcGxheWJhY2suCi0gIC8vICAgICAgIE5lZWQgdG8gYmUgcmVtb3ZlZCB3aXRoIG1lZGlhIHJlZmFjdG9yLgotICB2b2lkIFJlc3VtZShQaXBlbGluZVdpbmRvdyB3aW5kb3cpIG92ZXJyaWRlOwotCi0gIHZvaWQgU3RhcnQoRGVtdXhlciogZGVtdXhlciwKLSAgICAgICAgICAgICBjb25zdCBTZXREcm1TeXN0ZW1SZWFkeUNCJiBzZXRfZHJtX3N5c3RlbV9yZWFkeV9jYiwKLSAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwgY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IsCi0gICAgICAgICAgICAgY29uc3QgU2Vla0NCJiBzZWVrX2NiLCBjb25zdCBCdWZmZXJpbmdTdGF0ZUNCJiBidWZmZXJpbmdfc3RhdGVfY2IsCi0gICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZHVyYXRpb25fY2hhbmdlX2NiLAotICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIG91dHB1dF9tb2RlX2NoYW5nZV9jYiwKLSAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBjb250ZW50X3NpemVfY2hhbmdlX2NiLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzKSBvdmVycmlkZTsKLSNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQotICB2b2lkIFN0YXJ0KGNvbnN0IFNldERybVN5c3RlbVJlYWR5Q0ImIHNldF9kcm1fc3lzdGVtX3JlYWR5X2NiLAotICAgICAgICAgICAgIGNvbnN0IE9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkQ0ImCi0gICAgICAgICAgICAgICAgIGVuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfZW5jb3VudGVyZWRfY2IsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV91cmwsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVuZGVkX2NiLAotICAgICAgICAgICAgIGNvbnN0IEVycm9yQ0ImIGVycm9yX2NiLCBjb25zdCBTZWVrQ0ImIHNlZWtfY2IsCi0gICAgICAgICAgICAgY29uc3QgQnVmZmVyaW5nU3RhdGVDQiYgYnVmZmVyaW5nX3N0YXRlX2NiLAotICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGR1cmF0aW9uX2NoYW5nZV9jYiwKLSAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBvdXRwdXRfbW9kZV9jaGFuZ2VfY2IsCi0gICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgY29udGVudF9zaXplX2NoYW5nZV9jYikgb3ZlcnJpZGU7Ci0jZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCi0KLSAgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIHN0b3BfY2IpIG92ZXJyaWRlOwotICB2b2lkIFNlZWsoVGltZURlbHRhIHRpbWUsIGNvbnN0IFNlZWtDQiYgc2Vla19jYik7Ci0gIGJvb2wgSGFzQXVkaW8oKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBIYXNWaWRlbygpIGNvbnN0IG92ZXJyaWRlOwotCi0gIGZsb2F0IEdldFBsYXliYWNrUmF0ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBvdmVycmlkZTsKLSAgZmxvYXQgR2V0Vm9sdW1lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgb3ZlcnJpZGU7Ci0KLSAgVGltZURlbHRhIEdldE1lZGlhVGltZSgpIG92ZXJyaWRlOwotICA6Om1lZGlhOjpSYW5nZXM8VGltZURlbHRhPiBHZXRCdWZmZXJlZFRpbWVSYW5nZXMoKSBvdmVycmlkZTsKLSAgVGltZURlbHRhIEdldE1lZGlhRHVyYXRpb24oKSBjb25zdCBvdmVycmlkZTsKLSNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQotICBUaW1lRGVsdGEgR2V0TWVkaWFTdGFydERhdGUoKSBjb25zdCBvdmVycmlkZTsKLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKLSAgdm9pZCBHZXROYXR1cmFsVmlkZW9TaXplKGdmeDo6U2l6ZSogb3V0X3NpemUpIGNvbnN0IG92ZXJyaWRlOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0QXVkaW9Db25uZWN0b3JzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCBvdmVycmlkZTsKLSAgUGlwZWxpbmVTdGF0aXN0aWNzIEdldFN0YXRpc3RpY3MoKSBjb25zdCBvdmVycmlkZTsKLSAgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSBvdmVycmlkZTsKLSAgdm9pZCBTZXREZWNvZGVUb1RleHR1cmVPdXRwdXRNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICB2b2lkIFN0YXJ0VGFzayhTdGFydFRhc2tQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpOwotICB2b2lkIFNldFZvbHVtZVRhc2soZmxvYXQgdm9sdW1lKTsKLSAgdm9pZCBTZXRQbGF5YmFja1JhdGVUYXNrKGZsb2F0IHZvbHVtZSk7Ci0gIHZvaWQgU2V0RHVyYXRpb25UYXNrKFRpbWVEZWx0YSBkdXJhdGlvbik7Ci0KLSAgLy8gRGVtdXhlckhvc3QgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgT25CdWZmZXJlZFRpbWVSYW5nZXNDaGFuZ2VkKAotICAgICAgY29uc3QgOjptZWRpYTo6UmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4mIHJhbmdlcykgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0RHVyYXRpb24oVGltZURlbHRhIGR1cmF0aW9uKSBvdmVycmlkZTsKLSAgdm9pZCBPbkRlbXV4ZXJFcnJvcihQaXBlbGluZVN0YXR1cyBlcnJvcikgb3ZlcnJpZGU7Ci0KLSNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQotICB2b2lkIENyZWF0ZVVybFBsYXllcihjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX3VybCk7Ci0gIHZvaWQgU2V0RHJtU3lzdGVtKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pOwotI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQotICB2b2lkIENyZWF0ZVBsYXllcihTYkRybVN5c3RlbSBkcm1fc3lzdGVtKTsKLQotICB2b2lkIE9uRGVtdXhlckluaXRpYWxpemVkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgT25EZW11eGVyU2Vla2VkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgT25EZW11eGVyU3RvcHBlZCgpOwotICB2b2lkIE9uRGVtdXhlclN0cmVhbVJlYWQoCi0gICAgICBEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsIGludCBtYXhfbnVtYmVyX2J1ZmZlcnNfdG9fcmVhZCwKLSAgICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+PiYgYnVmZmVycyk7Ci0gIC8vIFNiUGxheWVyQnJpZGdlOjpIb3N0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIE9uTmVlZERhdGEoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgaW50IG1heF9udW1iZXJfb2ZfYnVmZmVyc190b193cml0ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QbGF5ZXJTdGF0dXMoU2JQbGF5ZXJTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QbGF5ZXJFcnJvcihTYlBsYXllckVycm9yIGVycm9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGU7Ci0KLSAgLy8gVXNlZCB0byBtYWtlIGEgZGVsYXllZCBjYWxsIHRvIE9uTmVlZERhdGEoKSBpZiB8YXVkaW9fcmVhZF9kZWxheWVkX3wgaXMKLSAgLy8gdHJ1ZS4gSWYgfGF1ZGlvX3JlYWRfZGVsYXllZF98IGlzIGZhbHNlLCB0aGF0IG1lYW5zIHRoZSBkZWxheWVkIGNhbGwgaGFzCi0gIC8vIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhIHNlZWsuCi0gIHZvaWQgRGVsYXllZE5lZWREYXRhKGludCBtYXhfbnVtYmVyX29mX2J1ZmZlcnNfdG9fd3JpdGUpOwotCi0gIHZvaWQgVXBkYXRlRGVjb2RlckNvbmZpZyhEZW11eGVyU3RyZWFtKiBzdHJlYW0pOwotICB2b2lkIENhbGxTZWVrQ0IoUGlwZWxpbmVTdGF0dXMgc3RhdHVzLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk7Ci0gIHZvaWQgQ2FsbEVycm9yQ0IoUGlwZWxpbmVTdGF0dXMgc3RhdHVzLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgdm9pZCBTdXNwZW5kVGFzayhiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KTsKLSAgdm9pZCBSZXN1bWVUYXNrKFBpcGVsaW5lV2luZG93IHdpbmRvdywgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCk7Ci0KLSAgLy8gU3RvcmUgdGhlIG1lZGlhIHRpbWUgcmV0cmlldmVkIGJ5IEdldE1lZGlhVGltZSBzbyB3ZSBjYW4gY2FjaGUgaXQgYXMgYW4KLSAgLy8gZXN0aW1hdGUgYW5kIGF2b2lkIGNhbGxpbmcgU2JQbGF5ZXJHZXRJbmZvIHRvbyBmcmVxdWVudGx5LgotICB2b2lkIFN0b3JlTWVkaWFUaW1lKFRpbWVEZWx0YSBtZWRpYV90aW1lKTsKLQotICAvLyBSZXRyaWV2ZSB0aGUgc3RhdGlzdGljcyBhcyBhIHN0cmluZyBhbmQgYXBwZW5kIHRvIG1lc3NhZ2UuCi0gIHN0ZDo6c3RyaW5nIEFwcGVuZFN0YXRpc3RpY3NTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIGNvbnN0OwotCi0gIC8vIEdldCBpbmZvcm1hdGlvbiBvbiB0aGUgdGltZSBzaW5jZSBhcHAgc3RhcnQgYW5kIHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0Ci0gIC8vIHBsYXliYWNrIHJlc3VtZS4KLSAgc3RkOjpzdHJpbmcgR2V0VGltZUluZm9ybWF0aW9uKCkgY29uc3Q7Ci0KLSAgdm9pZCBSdW5TZXREcm1TeXN0ZW1SZWFkeUNCKERybVN5c3RlbVJlYWR5Q0IgZHJtX3N5c3RlbV9yZWFkeV9jYik7Ci0KLSAgdm9pZCBTZXRSZWFkSW5Qcm9ncmVzcyhEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsIGJvb2wgaW5fcHJvZ3Jlc3MpOwotICBib29sIEdldFJlYWRJblByb2dyZXNzKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgY29uc3Q7Ci0KLSAgLy8gQW4gaWRlbnRpZmllciBzdHJpbmcgZm9yIHRoZSBwaXBlbGluZSwgdXNlZCBpbiBDVmFsIHRvIGlkZW50aWZ5IG11bHRpcGxlCi0gIC8vIHBpcGVsaW5lcy4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgcGlwZWxpbmVfaWRlbnRpZmllcl87Ci0KLSAgLy8gQSB3cmFwcGVkIGludGVyZmFjZSBvZiBzdGFyYm9hcmQgcGxheWVyIGZ1bmN0aW9ucywgd2hpY2ggd2lsbCBiZSB1c2VkIGluCi0gIC8vIHVuZGVybHlpbmcgU2JQbGF5ZXJCcmlkZ2UuCi0gIFNiUGxheWVySW50ZXJmYWNlKiBzYnBsYXllcl9pbnRlcmZhY2VfOwotCi0gIC8vIE1lc3NhZ2UgbG9vcCB1c2VkIHRvIGV4ZWN1dGUgcGlwZWxpbmUgdGFza3MuICBJdCBpcyB0aHJlYWQtc2FmZS4KLSAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiB0YXNrX3J1bm5lcl87Ci0KLSAgLy8gV2hldGhlciB3ZSBzaG91bGQgc2F2ZSBEZWNvZGVyQnVmZmVycyBmb3IgcmVzdW1lIGFmdGVyIHN1c3BlbmQuCi0gIGNvbnN0IGJvb2wgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmRfOwotCi0gIC8vIFdoZXRoZXIgd2UgZW5hYmxlIGJhdGNoZWQgc2FtcGxlIHdyaXRlIGZ1bmN0aW9uYWxpdHkuCi0gIGNvbnN0IGJvb2wgYWxsb3dfYmF0Y2hlZF9zYW1wbGVfd3JpdGVfOwotCi0gIC8vIFRoZSB3aW5kb3cgdGhpcyBwbGF5ZXIgYXNzb2NpYXRlcyB3aXRoLiAgSXQgc2hvdWxkIG9ubHkgYmUgYXNzaWduZWQgaW4gdGhlCi0gIC8vIGR0b3IgYW5kIGFjY2Vzc2VkIG9uY2UgYnkgU2JQbGF5ZXJDcmVhdGUoKS4KLSAgUGlwZWxpbmVXaW5kb3cgd2luZG93XzsKLQotICAvLyBDYWxsIHRvIGdldCB0aGUgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciBmb3IgU2JQbGF5ZXJDcmVhdGUoKS4KLSAgY29uc3QgR2V0RGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXJGdW5jCi0gICAgICBnZXRfZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyX2Z1bmNfOwotCi0gIC8vIExvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIGZvciB0aGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMuCi0gIG11dGFibGUgYmFzZTo6TG9jayBsb2NrXzsKLQotICAvLyBBbW91bnQgb2YgYXZhaWxhYmxlIGJ1ZmZlcmVkIGRhdGEuICBTZXQgYnkgZmlsdGVycy4KLSAgOjptZWRpYTo6UmFuZ2VzPFRpbWVEZWx0YT4gYnVmZmVyZWRfdGltZV9yYW5nZXNfOwotCi0gIC8vIFRydWUgd2hlbiBBZGRCdWZmZXJlZEJ5dGVSYW5nZSgpIGhhcyBiZWVuIGNhbGxlZCBtb3JlIHJlY2VudGx5IHRoYW4KLSAgLy8gRGlkTG9hZGluZ1Byb2dyZXNzKCkuCi0gIG11dGFibGUgYm9vbCBkaWRfbG9hZGluZ19wcm9ncmVzc187Ci0KLSAgLy8gVmlkZW8ncyBuYXR1cmFsIHdpZHRoIGFuZCBoZWlnaHQuICBTZXQgYnkgZmlsdGVycy4KLSAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZV87Ci0KLSAgLy8gQ3VycmVudCB2b2x1bWUgbGV2ZWwgKGZyb20gMC4wZiB0byAxLjBmKS4gIFRoaXMgdmFsdWUgaXMgc2V0IGltbWVkaWF0ZWx5Ci0gIC8vIHZpYSBTZXRWb2x1bWUoKSBhbmQgYSB0YXNrIGlzIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NhZ2UgbG9vcCB0byBub3RpZnkgdGhlCi0gIC8vIGZpbHRlcnMuCi0gIGJhc2U6OkNWYWw8ZmxvYXQ+IHZvbHVtZV87Ci0KLSAgLy8gQ3VycmVudCBwbGF5YmFjayByYXRlICg+PSAwLjBmKS4gIFRoaXMgdmFsdWUgaXMgc2V0IGltbWVkaWF0ZWx5IHZpYQotICAvLyBTZXRQbGF5YmFja1JhdGUoKSBhbmQgYSB0YXNrIGlzIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NhZ2UgbG9vcCB0byBub3RpZnkKLSAgLy8gdGhlIGZpbHRlcnMuCi0gIGJhc2U6OkNWYWw8ZmxvYXQ+IHBsYXliYWNrX3JhdGVfOwotCi0gIC8vIFRoZSBzYXZlZCBhdWRpbyBhbmQgdmlkZW8gZGVtdXhlciBzdHJlYW1zLiAgTm90ZSB0aGF0IGl0IGlzIHNhZmUgdG8gc3RvcmUKLSAgLy8gcmF3IHBvaW50ZXJzIG9mIHRoZSBkZW11eGVyIHN0cmVhbXMsIGFzIHRoZSBEZW11eGVyIGd1YXJhbnRlZXMgdGhhdCBpdHMKLSAgLy8gfERlbXV4ZXJTdHJlYW18cyBsaXZlIGFzIGxvbmcgYXMgdGhlIERlbXV4ZXIgaXRzZWxmLgotICBEZW11eGVyU3RyZWFtKiBhdWRpb19zdHJlYW1fID0gbnVsbHB0cjsKLSAgRGVtdXhlclN0cmVhbSogdmlkZW9fc3RyZWFtXyA9IG51bGxwdHI7Ci0KLSAgbXV0YWJsZSBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdGlzdGljc187Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IGFjY2Vzc2VkIGJ5IHRhc2tzIHBvc3RlZCB0bwotICAvLyB8dGFza19ydW5uZXJffC4KLQotICAvLyBUZW1wb3JhcnkgY2FsbGJhY2sgdXNlZCBmb3IgU3RvcCgpLgotICBiYXNlOjpDbG9zdXJlIHN0b3BfY2JfOwotCi0gIC8vIFBlcm1hbmVudCBjYWxsYmFja3MgcGFzc2VkIGluIHZpYSBTdGFydCgpLgotICBTZXREcm1TeXN0ZW1SZWFkeUNCIHNldF9kcm1fc3lzdGVtX3JlYWR5X2NiXzsKLSAgUGlwZWxpbmVTdGF0dXNDQiBlbmRlZF9jYl87Ci0gIEVycm9yQ0IgZXJyb3JfY2JfOwotICBCdWZmZXJpbmdTdGF0ZUNCIGJ1ZmZlcmluZ19zdGF0ZV9jYl87Ci0gIGJhc2U6OkNsb3N1cmUgZHVyYXRpb25fY2hhbmdlX2NiXzsKLSAgYmFzZTo6Q2xvc3VyZSBvdXRwdXRfbW9kZV9jaGFuZ2VfY2JfOwotICBiYXNlOjpDbG9zdXJlIGNvbnRlbnRfc2l6ZV9jaGFuZ2VfY2JfOwotICBiYXNlOjpPcHRpb25hbDxib29sPiBkZWNvZGVfdG9fdGV4dHVyZV9vdXRwdXRfbW9kZV87Ci0jaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKLSAgU2JQbGF5ZXJCcmlkZ2U6Ok9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkQ0IKLSAgICAgIG9uX2VuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfZW5jb3VudGVyZWRfY2JfOwotI2VuZGlmICAvLyAgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKLQotICAvLyBEZW11eGVyIHJlZmVyZW5jZSB1c2VkIGZvciBzZXR0aW5nIHRoZSBwcmVsb2FkIHZhbHVlLgotICBEZW11eGVyKiBkZW11eGVyXyA9IG51bGxwdHI7Ci0gIGJvb2wgYXVkaW9fcmVhZF9pbl9wcm9ncmVzc18gPSBmYWxzZTsKLSAgYm9vbCBhdWRpb19yZWFkX2RlbGF5ZWRfID0gZmFsc2U7Ci0gIGJvb2wgdmlkZW9fcmVhZF9pbl9wcm9ncmVzc18gPSBmYWxzZTsKLSAgYmFzZTo6Q1ZhbDxUaW1lRGVsdGE+IGR1cmF0aW9uXzsKLQotI2lmIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCi0gIFRpbWVEZWx0YSBzdGFydF9kYXRlXzsKLSAgYm9vbCBpc191cmxfYmFzZWRfOwotI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQotCi0gIHNjb3BlZF9yZWZwdHI8U2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXI+IHNldF9ib3VuZHNfaGVscGVyXzsKLQotICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gV01QSSB0aHJlYWQgYnV0IGFsbAotICAvLyBtb2RpZmljYXRpb25zIHRvIHRoZW0gaGFwcGVucyBvbiB0aGUgcGlwZWxpbmUgdGhyZWFkLiAgU28gYW55IGFjY2VzcyBvZgotICAvLyB0aGVtIGZyb20gdGhlIFdNUEkgdGhyZWFkIGFuZCBhbnkgbW9kaWZpY2F0aW9uIHRvIHRoZW0gb24gdGhlIHBpcGVsaW5lCi0gIC8vIHRocmVhZCBoYXMgdG8gZ3VhcmRlZCBieSBsb2NrLiAgQWNjZXNzIHRvIHRoZW0gZnJvbSB0aGUgcGlwZWxpbmUgdGhyZWFkCi0gIC8vIG5lZWRuJ3QgdG8gYmUgZ3VhcmRlZC4KLQotICAvLyBUZW1wb3JhcnkgY2FsbGJhY2sgdXNlZCBmb3IgU3RhcnQoKSBhbmQgU2VlaygpLgotICBTZWVrQ0Igc2Vla19jYl87Ci0gIFRpbWVEZWx0YSBzZWVrX3RpbWVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8U2JQbGF5ZXJCcmlkZ2U+IHBsYXllcl9icmlkZ2VfOwotICBib29sIGlzX2luaXRpYWxfcHJlcm9sbF8gPSB0cnVlOwotICBiYXNlOjpDVmFsPGJvb2w+IHN0YXJ0ZWRfOwotICBiYXNlOjpDVmFsPGJvb2w+IHN1c3BlbmRlZF87Ci0gIGJhc2U6OkNWYWw8Ym9vbD4gc3RvcHBlZF87Ci0gIGJhc2U6OkNWYWw8Ym9vbD4gZW5kZWRfOwotICBiYXNlOjpDVmFsPFNiUGxheWVyU3RhdGU+IHBsYXllcl9zdGF0ZV87Ci0KLSAgRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIGRlY29kZV90YXJnZXRfcHJvdmlkZXJfOwotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKLSAgY29uc3QgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsXzsKLSAgY29uc3QgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3JlbW90ZV87Ci0KLSAgLy8gVGhlIHR3byB2YXJpYWJsZXMgYmVsb3cgc2hvdWxkIGFsd2F5cyBjb250YWluIHRoZSBzYW1lIHZhbHVlLiAgVGhleSBhcmUKLSAgLy8ga2VwdCBhcyBzZXBhcmF0ZSB2YXJpYWJsZXMgc28gd2UgY2FuIGtlZXAgdGhlIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGFzCi0gIC8vIGlzLCB3aGljaCBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3Jvc3MgbXVsdGlwbGUgU3RhcmJvYXJkIHZlcnNpb25zLgotICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fID0gMDsKLSAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2Zvcl9wcmVyb2xsXyA9IGF1ZGlvX3dyaXRlX2R1cmF0aW9uXzsKLSNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTUKLSAgLy8gUmVhZCBhdWRpbyBmcm9tIHRoZSBzdHJlYW0gaWYgfHRpbWVzdGFtcF9vZl9sYXN0X3dyaXR0ZW5fYXVkaW9ffCBpcyBsZXNzCi0gIC8vIHRoYW4gfHNlZWtfdGltZV98ICsgfGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2Zvcl9wcmVyb2xsX3wsIHRoaXMgZWZmZWN0aXZlbHkKLSAgLy8gYWxsb3dzIDEwIHNlY29uZHMgb2YgYXVkaW8gdG8gYmUgd3JpdHRlbiB0byB0aGUgU2JQbGF5ZXIgYWZ0ZXIgcGxheWJhY2sKLSAgLy8gc3RhcnR1cCBvciBzZWVrLgotICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fZm9yX3ByZXJvbGxfID0gMTAgKiBrU2JUaW1lU2Vjb25kOwotICAvLyBEb24ndCByZWFkIGF1ZGlvIGZyb20gdGhlIHN0cmVhbSBtb3JlIHRoYW4gfGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3wgYWhlYWQgb2YKLSAgLy8gdGhlIGN1cnJlbnQgbWVkaWEgdGltZSBkdXJpbmcgcGxheWluZy4KLSAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uXyA9IGtTYlRpbWVTZWNvbmQ7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1Ci0gIC8vIE9ubHkgY2FsbCBHZXRNZWRpYVRpbWUoKSBmcm9tIE9uTmVlZERhdGEgaWYgaXQgaGFzIGJlZW4KLSAgLy8gfGtNZWRpYVRpbWVDaGVja0ludGVydmFsfCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIEdldE1lZGlhVGltZSgpLgotICBzdGF0aWMgY29uc3QgU2JUaW1lIGtNZWRpYVRpbWVDaGVja0ludGVydmFsID0gMC4xICoga1NiVGltZVNlY29uZDsKLSAgLy8gVGltZXN0YW1wIGZvciB0aGUgbGFzdCB3cml0dGVuIGF1ZGlvLgotICBTYlRpbWUgdGltZXN0YW1wX29mX2xhc3Rfd3JpdHRlbl9hdWRpb18gPSAwOwotCi0gIC8vIExhc3QgbWVkaWEgdGltZSByZXBvcnRlZCBieSBHZXRNZWRpYVRpbWUoKS4KLSAgYmFzZTo6Q1ZhbDxTYlRpbWU+IGxhc3RfbWVkaWFfdGltZV87Ci0gIC8vIFRpbWUgd2hlbiB3ZSBsYXN0IGNoZWNrZWQgdGhlIG1lZGlhIHRpbWUuCi0gIFNiVGltZSBsYXN0X3RpbWVfbWVkaWFfdGltZV9yZXRyaWV2ZWRfID0gMDsKLSAgLy8gQ291bnRlciBmb3IgcmV0cm9ncmFkZSBtZWRpYSB0aW1lLgotICBzaXplX3QgcmV0cm9ncmFkZV9tZWRpYV90aW1lX2NvdW50ZXJfID0gMDsKLSAgLy8gVGhlIG1heGltdW0gdmlkZW8gcGxheWJhY2sgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGZvciB0aGUgcGxheWJhY2suCi0gIGJhc2U6OkNWYWw8c3RkOjpzdHJpbmc+IG1heF92aWRlb19jYXBhYmlsaXRpZXNfOwotCi0gIFBsYXliYWNrU3RhdGlzdGljcyBwbGF5YmFja19zdGF0aXN0aWNzXzsKLQotICBTYlRpbWVNb25vdG9uaWMgbGFzdF9yZXN1bWVfdGltZV8gPSAtMTsKLQotICBTYlRpbWVNb25vdG9uaWMgc2V0X2RybV9zeXN0ZW1fcmVhZHlfY2JfdGltZV8gPSAtMTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2JQbGF5ZXJQaXBlbGluZSk7Ci19OworfSAgLy8gbmFtZXNwYWNlCiAKIFNiUGxheWVyUGlwZWxpbmU6OlNiUGxheWVyUGlwZWxpbmUoCiAgICAgU2JQbGF5ZXJJbnRlcmZhY2UqIGludGVyZmFjZSwgUGlwZWxpbmVXaW5kb3cgd2luZG93LApAQCAtNDA4LDYgKzg5LDcgQEAKICAgICBjb25zdCBHZXREZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlckZ1bmMmCiAgICAgICAgIGdldF9kZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfZnVuYywKICAgICBib29sIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kLCBib29sIGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlLAorICAgIGJvb2wgZm9yY2VfcHVuY2hfb3V0X2J5X2RlZmF1bHQsCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKICAgICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fbG9jYWwsIFNiVGltZSBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGUsCiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CkBAIC00NjQsNiArMTQ2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVfaWRlbnRpZmllcl8uY19zdHIoKSksCiAgICAgICAgICAgIiIsICJUaGUgbWF4IHZpZGVvIGNhcGFiaWxpdGllcyByZXF1aXJlZCBmb3IgdGhlIG1lZGlhIHBpcGVsaW5lLiIpLAogICAgICAgcGxheWJhY2tfc3RhdGlzdGljc18ocGlwZWxpbmVfaWRlbnRpZmllcl8pIHsKKyAgaWYgKGZvcmNlX3B1bmNoX291dF9ieV9kZWZhdWx0KSB7CisgICAgZGVmYXVsdF9vdXRwdXRfbW9kZV8gPSBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQ7CisgIH0KICNpZiBTQl9BUElfVkVSU0lPTiA8IDE1CiAgIFNiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb24oYXVkaW9fd3JpdGVfZHVyYXRpb25fKTsKICAgTE9HKElORk8pIDw8ICJTZXR0aW5nIGF1ZGlvIHdyaXRlIGR1cmF0aW9uIHRvICIgPDwgYXVkaW9fd3JpdGVfZHVyYXRpb25fCkBAIC04ODcsMTUgKzU3MiwxNSBAQAogICByZXR1cm4gYmFzZTo6QmluZCgmU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXI6OlNldEJvdW5kcywgc2V0X2JvdW5kc19oZWxwZXJfKTsKIH0KIAotdm9pZCBTYlBsYXllclBpcGVsaW5lOjpTZXREZWNvZGVUb1RleHR1cmVPdXRwdXRNb2RlKGJvb2wgZW5hYmxlZCkgewotICBUUkFDRV9FVkVOVDEoImNvYmFsdDo6bWVkaWEiLAotICAgICAgICAgICAgICAgIlNiUGxheWVyUGlwZWxpbmU6OlNldERlY29kZVRvVGV4dHVyZU91dHB1dE1vZGUiLCAibW9kZSIsCi0gICAgICAgICAgICAgICBlbmFibGVkKTsKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2V0UHJlZmVycmVkT3V0cHV0TW9kZVRvRGVjb2RlVG9UZXh0dXJlKCkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6bWVkaWEiLAorICAgICAgICAgICAgICAgIlNiUGxheWVyUGlwZWxpbmU6OlNldFByZWZlcnJlZE91dHB1dE1vZGVUb0RlY29kZVRvVGV4dHVyZSIpOwogCiAgIGlmICghdGFza19ydW5uZXJfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKICAgICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlNldERlY29kZVRvVGV4dHVyZU91dHB1dE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBlbmFibGVkKSk7CisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgYmFzZTo6QmluZCgmU2JQbGF5ZXJQaXBlbGluZTo6U2V0UHJlZmVycmVkT3V0cHV0TW9kZVRvRGVjb2RlVG9UZXh0dXJlLAorICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtOTAzLDcgKzU4OCw3IEBACiAgIC8vIG1vZGUgdG9vIGxhdGUuCiAgIERDSEVDSyghcGxheWVyX2JyaWRnZV8pOwogCi0gIGRlY29kZV90b190ZXh0dXJlX291dHB1dF9tb2RlXyA9IGVuYWJsZWQ7CisgIGRlZmF1bHRfb3V0cHV0X21vZGVfID0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZTsKIH0KIAogdm9pZCBTYlBsYXllclBpcGVsaW5lOjpTdGFydFRhc2soU3RhcnRUYXNrUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB7CkBAIC0xMDE3LDkgKzcwMiw4IEBACiAgICAgcGxheWVyX2JyaWRnZV8ucmVzZXQobmV3IFNiUGxheWVyQnJpZGdlKAogICAgICAgICBzYnBsYXllcl9pbnRlcmZhY2VfLCB0YXNrX3J1bm5lcl8sIHNvdXJjZV91cmwsIHdpbmRvd18sIHRoaXMsCiAgICAgICAgIHNldF9ib3VuZHNfaGVscGVyXy5nZXQoKSwgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmRfLAotICAgICAgICAqZGVjb2RlX3RvX3RleHR1cmVfb3V0cHV0X21vZGVfLAotICAgICAgICBvbl9lbmNyeXB0ZWRfbWVkaWFfaW5pdF9kYXRhX2VuY291bnRlcmVkX2NiXywgZGVjb2RlX3RhcmdldF9wcm92aWRlcl8sCi0gICAgICAgIHBpcGVsaW5lX2lkZW50aWZpZXJfKSk7CisgICAgICAgIGRlZmF1bHRfb3V0cHV0X21vZGVfLCBvbl9lbmNyeXB0ZWRfbWVkaWFfaW5pdF9kYXRhX2VuY291bnRlcmVkX2NiXywKKyAgICAgICAgZGVjb2RlX3RhcmdldF9wcm92aWRlcl8sIHBpcGVsaW5lX2lkZW50aWZpZXJfKSk7CiAgICAgaWYgKHBsYXllcl9icmlkZ2VfLT5Jc1ZhbGlkKCkpIHsKICAgICAgIFNldFBsYXliYWNrUmF0ZVRhc2socGxheWJhY2tfcmF0ZV8pOwogICAgICAgU2V0Vm9sdW1lVGFzayh2b2x1bWVfKTsKQEAgLTExMjMsOCArODA3LDggQEAKICAgICAgICAgZ2V0X2RlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl9mdW5jXywgYXVkaW9fY29uZmlnLAogICAgICAgICBhdWRpb19taW1lX3R5cGUsIHZpZGVvX2NvbmZpZywgdmlkZW9fbWltZV90eXBlLCB3aW5kb3dfLCBkcm1fc3lzdGVtLAogICAgICAgICB0aGlzLCBzZXRfYm91bmRzX2hlbHBlcl8uZ2V0KCksIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kXywKLSAgICAgICAgKmRlY29kZV90b190ZXh0dXJlX291dHB1dF9tb2RlXywgZGVjb2RlX3RhcmdldF9wcm92aWRlcl8sCi0gICAgICAgIG1heF92aWRlb19jYXBhYmlsaXRpZXNfLCBwaXBlbGluZV9pZGVudGlmaWVyXykpOworICAgICAgICBkZWZhdWx0X291dHB1dF9tb2RlXywgZGVjb2RlX3RhcmdldF9wcm92aWRlcl8sIG1heF92aWRlb19jYXBhYmlsaXRpZXNfLAorICAgICAgICBwaXBlbGluZV9pZGVudGlmaWVyXykpOwogICAgIGlmIChwbGF5ZXJfYnJpZGdlXy0+SXNWYWxpZCgpKSB7CiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKICAgICAgIC8vIFRPRE8oYi8yNjc2Nzg0OTcpOiBXaGVuIGBwbGF5ZXJfYnJpZGdlXy0+R2V0QXVkaW9Db25maWd1cmF0aW9ucygpYApAQCAtMTcwNSwyOCArMTM4OSw1IEBACiAgIHJldHVybiB2aWRlb19yZWFkX2luX3Byb2dyZXNzXzsKIH0KIAotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotc2NvcGVkX3JlZnB0cjxQaXBlbGluZT4gUGlwZWxpbmU6OkNyZWF0ZSgKLSAgICBTYlBsYXllckludGVyZmFjZSogaW50ZXJmYWNlLCBQaXBlbGluZVdpbmRvdyB3aW5kb3csCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiYgdGFza19ydW5uZXIsCi0gICAgY29uc3QgR2V0RGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXJGdW5jJgotICAgICAgICBnZXRfZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyX2Z1bmMsCi0gICAgYm9vbCBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZCwgYm9vbCBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZSwKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQotICAgIFNiVGltZSBhdWRpb193cml0ZV9kdXJhdGlvbl9sb2NhbCwgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3JlbW90ZSwKLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTUKLSAgICBNZWRpYUxvZyogbWVkaWFfbG9nLCBEZWNvZGVUYXJnZXRQcm92aWRlciogZGVjb2RlX3RhcmdldF9wcm92aWRlcikgewotICByZXR1cm4gbmV3IFNiUGxheWVyUGlwZWxpbmUoCi0gICAgICBpbnRlcmZhY2UsIHdpbmRvdywgdGFza19ydW5uZXIsCi0gICAgICBnZXRfZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyX2Z1bmMsCi0gICAgICBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZCwgYWxsb3dfYmF0Y2hlZF9zYW1wbGVfd3JpdGUsCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKLSAgICAgIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsLCBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGUsCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1Ci0gICAgICBtZWRpYV9sb2csIGRlY29kZV90YXJnZXRfcHJvdmlkZXIpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmggYi9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTE5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5oCkBAIC0wLDAgKzEsMzU2IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0JBU0VfU0JQTEFZRVJfUElQRUxJTkVfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX0JBU0VfU0JQTEFZRVJfUElQRUxJTkVfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgorI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgorI2luY2x1ZGUgImJhc2UvdGFza19ydW5uZXIuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL2NfdmFsLmgiCisjaW5jbHVkZSAiY29iYWx0L21hdGgvc2l6ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGxheWJhY2tfc3RhdGlzdGljcy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX2JyaWRnZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtL21lZGlhL2Jhc2UvZGVtdXhlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtL21lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9iYXNlL21lZGlhX2xvZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtL21lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvYmFzZS9yYW5nZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bS9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvY29iYWx0L3VpL2dmeC9nZW9tZXRyeS9yZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW0vbWVkaWEvY29iYWx0L3VpL2dmeC9nZW9tZXRyeS9zaXplLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gU2JQbGF5ZXJQaXBlbGluZSBpcyBhIFBpcGVsaW5lQmFzZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIFNiUGxheWVyCisvLyBpbnRlcmZhY2UgaW50ZXJuYWxseS4KK2NsYXNzIE1FRElBX0VYUE9SVCBTYlBsYXllclBpcGVsaW5lIDogcHVibGljIFBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjptZWRpYTo6RGVtdXhlckhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTYlBsYXllckJyaWRnZTo6SG9zdCB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgbWVkaWEgcGlwZWxpbmUgdGhhdCB3aWxsIGV4ZWN1dGUgb24gfHRhc2tfcnVubmVyfC4KKyAgU2JQbGF5ZXJQaXBlbGluZSgKKyAgICAgIFNiUGxheWVySW50ZXJmYWNlKiBpbnRlcmZhY2UsIFBpcGVsaW5lV2luZG93IHdpbmRvdywKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIHRhc2tfcnVubmVyLAorICAgICAgY29uc3QgR2V0RGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXJGdW5jJgorICAgICAgICAgIGdldF9kZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfZnVuYywKKyAgICAgIGJvb2wgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmQsIGJvb2wgYWxsb3dfYmF0Y2hlZF9zYW1wbGVfd3JpdGUsCisgICAgICBib29sIGZvcmNlX3B1bmNoX291dF9ieV9kZWZhdWx0LAorI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1CisgICAgICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fbG9jYWwsIFNiVGltZSBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGUsCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CisgICAgICBNZWRpYUxvZyogbWVkaWFfbG9nLCBEZWNvZGVUYXJnZXRQcm92aWRlciogZGVjb2RlX3RhcmdldF9wcm92aWRlcik7CisgIH5TYlBsYXllclBpcGVsaW5lKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBTdXNwZW5kKCkgb3ZlcnJpZGU7CisgIC8vIFRPRE86IFRoaXMgaXMgdGVtcG9yYXJ5IGZvciBzdXBwb3J0aW5nIGJhY2tncm91bmQgbWVkaWEgcGxheWJhY2suCisgIC8vICAgICAgIE5lZWQgdG8gYmUgcmVtb3ZlZCB3aXRoIG1lZGlhIHJlZmFjdG9yLgorICB2b2lkIFJlc3VtZShQaXBlbGluZVdpbmRvdyB3aW5kb3cpIG92ZXJyaWRlOworCisgIHZvaWQgU3RhcnQoRGVtdXhlciogZGVtdXhlciwKKyAgICAgICAgICAgICBjb25zdCBTZXREcm1TeXN0ZW1SZWFkeUNCJiBzZXRfZHJtX3N5c3RlbV9yZWFkeV9jYiwKKyAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwgY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IsCisgICAgICAgICAgICAgY29uc3QgU2Vla0NCJiBzZWVrX2NiLCBjb25zdCBCdWZmZXJpbmdTdGF0ZUNCJiBidWZmZXJpbmdfc3RhdGVfY2IsCisgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZHVyYXRpb25fY2hhbmdlX2NiLAorICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIG91dHB1dF9tb2RlX2NoYW5nZV9jYiwKKyAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBjb250ZW50X3NpemVfY2hhbmdlX2NiLAorICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzKSBvdmVycmlkZTsKKyNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQorICB2b2lkIFN0YXJ0KGNvbnN0IFNldERybVN5c3RlbVJlYWR5Q0ImIHNldF9kcm1fc3lzdGVtX3JlYWR5X2NiLAorICAgICAgICAgICAgIGNvbnN0IE9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkQ0ImCisgICAgICAgICAgICAgICAgIGVuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfZW5jb3VudGVyZWRfY2IsCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV91cmwsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVuZGVkX2NiLAorICAgICAgICAgICAgIGNvbnN0IEVycm9yQ0ImIGVycm9yX2NiLCBjb25zdCBTZWVrQ0ImIHNlZWtfY2IsCisgICAgICAgICAgICAgY29uc3QgQnVmZmVyaW5nU3RhdGVDQiYgYnVmZmVyaW5nX3N0YXRlX2NiLAorICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGR1cmF0aW9uX2NoYW5nZV9jYiwKKyAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBvdXRwdXRfbW9kZV9jaGFuZ2VfY2IsCisgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgY29udGVudF9zaXplX2NoYW5nZV9jYikgb3ZlcnJpZGU7CisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCisKKyAgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIHN0b3BfY2IpIG92ZXJyaWRlOworICB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFNlZWtDQiYgc2Vla19jYik7CisgIGJvb2wgSGFzQXVkaW8oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBIYXNWaWRlbygpIGNvbnN0IG92ZXJyaWRlOworCisgIGZsb2F0IEdldFBsYXliYWNrUmF0ZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0Vm9sdW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgb3ZlcnJpZGU7CisKKyAgYmFzZTo6VGltZURlbHRhIEdldE1lZGlhVGltZSgpIG92ZXJyaWRlOworICA6Om1lZGlhOjpSYW5nZXM8YmFzZTo6VGltZURlbHRhPiBHZXRCdWZmZXJlZFRpbWVSYW5nZXMoKSBvdmVycmlkZTsKKyAgYmFzZTo6VGltZURlbHRhIEdldE1lZGlhRHVyYXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQorICBiYXNlOjpUaW1lRGVsdGEgR2V0TWVkaWFTdGFydERhdGUoKSBjb25zdCBvdmVycmlkZTsKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKKyAgdm9pZCBHZXROYXR1cmFsVmlkZW9TaXplKGdmeDo6U2l6ZSogb3V0X3NpemUpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0QXVkaW9Db25uZWN0b3JzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgUGlwZWxpbmVTdGF0aXN0aWNzIEdldFN0YXRpc3RpY3MoKSBjb25zdCBvdmVycmlkZTsKKyAgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRQcmVmZXJyZWRPdXRwdXRNb2RlVG9EZWNvZGVUb1RleHR1cmUoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIFVzZWQgdG8gcG9zdCBwYXJhbWV0ZXJzIHRvIFNiUGxheWVyUGlwZWxpbmU6OlN0YXJ0VGFzaygpIGFzIHRoZSBudW1iZXIgb2YKKyAgLy8gcGFyYW1ldGVycyBleGNlZWQgd2hhdCBiYXNlOjpCaW5kKCkgY2FuIHN1cHBvcnQuCisgIHN0cnVjdCBTdGFydFRhc2tQYXJhbWV0ZXJzIHsKKyAgICA6Om1lZGlhOjpEZW11eGVyKiBkZW11eGVyOworICAgIFNldERybVN5c3RlbVJlYWR5Q0Igc2V0X2RybV9zeXN0ZW1fcmVhZHlfY2I7CisgICAgOjptZWRpYTo6UGlwZWxpbmVTdGF0dXNDQiBlbmRlZF9jYjsKKyAgICBFcnJvckNCIGVycm9yX2NiOworICAgIFBpcGVsaW5lOjpTZWVrQ0Igc2Vla19jYjsKKyAgICBQaXBlbGluZTo6QnVmZmVyaW5nU3RhdGVDQiBidWZmZXJpbmdfc3RhdGVfY2I7CisgICAgYmFzZTo6Q2xvc3VyZSBkdXJhdGlvbl9jaGFuZ2VfY2I7CisgICAgYmFzZTo6Q2xvc3VyZSBvdXRwdXRfbW9kZV9jaGFuZ2VfY2I7CisgICAgYmFzZTo6Q2xvc3VyZSBjb250ZW50X3NpemVfY2hhbmdlX2NiOworICAgIHN0ZDo6c3RyaW5nIG1heF92aWRlb19jYXBhYmlsaXRpZXM7CisjaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VfdXJsOworICAgIGJvb2wgaXNfdXJsX2Jhc2VkOworI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQorICB9OworCisgIHZvaWQgU3RhcnRUYXNrKFN0YXJ0VGFza1BhcmFtZXRlcnMgcGFyYW1ldGVycyk7CisgIHZvaWQgU2V0Vm9sdW1lVGFzayhmbG9hdCB2b2x1bWUpOworICB2b2lkIFNldFBsYXliYWNrUmF0ZVRhc2soZmxvYXQgdm9sdW1lKTsKKyAgdm9pZCBTZXREdXJhdGlvblRhc2soYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKTsKKworICAvLyBEZW11eGVySG9zdCBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBPbkJ1ZmZlcmVkVGltZVJhbmdlc0NoYW5nZWQoCisgICAgICBjb25zdCA6Om1lZGlhOjpSYW5nZXM8YmFzZTo6VGltZURlbHRhPiYgcmFuZ2VzKSBvdmVycmlkZTsKKyAgdm9pZCBTZXREdXJhdGlvbihiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24pIG92ZXJyaWRlOworICB2b2lkIE9uRGVtdXhlckVycm9yKFBpcGVsaW5lU3RhdHVzIGVycm9yKSBvdmVycmlkZTsKKworI2lmIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCisgIHZvaWQgQ3JlYXRlVXJsUGxheWVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfdXJsKTsKKyAgdm9pZCBTZXREcm1TeXN0ZW0oU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7CisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCisgIHZvaWQgQ3JlYXRlUGxheWVyKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pOworCisgIHZvaWQgT25EZW11eGVySW5pdGlhbGl6ZWQoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKKyAgdm9pZCBPbkRlbXV4ZXJTZWVrZWQoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKKyAgdm9pZCBPbkRlbXV4ZXJTdG9wcGVkKCk7CisgIHZvaWQgT25EZW11eGVyU3RyZWFtUmVhZCgKKyAgICAgIDo6bWVkaWE6OkRlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSwgaW50IG1heF9udW1iZXJfYnVmZmVyc190b19yZWFkLAorICAgICAgOjptZWRpYTo6RGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNjb3BlZF9yZWZwdHI8OjptZWRpYTo6RGVjb2RlckJ1ZmZlcj4+JiBidWZmZXJzKTsKKyAgLy8gU2JQbGF5ZXJCcmlkZ2U6Okhvc3QgaW1wbGVtZW50YXRpb24uCisgIHZvaWQgT25OZWVkRGF0YSg6Om1lZGlhOjpEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bWJlcl9vZl9idWZmZXJzX3RvX3dyaXRlKSBvdmVycmlkZTsKKyAgdm9pZCBPblBsYXllclN0YXR1cyhTYlBsYXllclN0YXRlIHN0YXRlKSBvdmVycmlkZTsKKyAgdm9pZCBPblBsYXllckVycm9yKFNiUGxheWVyRXJyb3IgZXJyb3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZTsKKworICAvLyBVc2VkIHRvIG1ha2UgYSBkZWxheWVkIGNhbGwgdG8gT25OZWVkRGF0YSgpIGlmIHxhdWRpb19yZWFkX2RlbGF5ZWRffCBpcworICAvLyB0cnVlLiBJZiB8YXVkaW9fcmVhZF9kZWxheWVkX3wgaXMgZmFsc2UsIHRoYXQgbWVhbnMgdGhlIGRlbGF5ZWQgY2FsbCBoYXMKKyAgLy8gYmVlbiBjYW5jZWxsZWQgZHVlIHRvIGEgc2Vlay4KKyAgdm9pZCBEZWxheWVkTmVlZERhdGEoaW50IG1heF9udW1iZXJfb2ZfYnVmZmVyc190b193cml0ZSk7CisKKyAgdm9pZCBVcGRhdGVEZWNvZGVyQ29uZmlnKDo6bWVkaWE6OkRlbXV4ZXJTdHJlYW0qIHN0cmVhbSk7CisgIHZvaWQgQ2FsbFNlZWtDQihQaXBlbGluZVN0YXR1cyBzdGF0dXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKKyAgdm9pZCBDYWxsRXJyb3JDQihQaXBlbGluZVN0YXR1cyBzdGF0dXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKKworICB2b2lkIFN1c3BlbmRUYXNrKGJhc2U6OldhaXRhYmxlRXZlbnQqIGRvbmVfZXZlbnQpOworICB2b2lkIFJlc3VtZVRhc2soUGlwZWxpbmVXaW5kb3cgd2luZG93LCBiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KTsKKworICAvLyBTdG9yZSB0aGUgbWVkaWEgdGltZSByZXRyaWV2ZWQgYnkgR2V0TWVkaWFUaW1lIHNvIHdlIGNhbiBjYWNoZSBpdCBhcyBhbgorICAvLyBlc3RpbWF0ZSBhbmQgYXZvaWQgY2FsbGluZyBTYlBsYXllckdldEluZm8gdG9vIGZyZXF1ZW50bHkuCisgIHZvaWQgU3RvcmVNZWRpYVRpbWUoYmFzZTo6VGltZURlbHRhIG1lZGlhX3RpbWUpOworCisgIC8vIFJldHJpZXZlIHRoZSBzdGF0aXN0aWNzIGFzIGEgc3RyaW5nIGFuZCBhcHBlbmQgdG8gbWVzc2FnZS4KKyAgc3RkOjpzdHJpbmcgQXBwZW5kU3RhdGlzdGljc1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgY29uc3Q7CisKKyAgLy8gR2V0IGluZm9ybWF0aW9uIG9uIHRoZSB0aW1lIHNpbmNlIGFwcCBzdGFydCBhbmQgdGhlIHRpbWUgc2luY2UgdGhlIGxhc3QKKyAgLy8gcGxheWJhY2sgcmVzdW1lLgorICBzdGQ6OnN0cmluZyBHZXRUaW1lSW5mb3JtYXRpb24oKSBjb25zdDsKKworICB2b2lkIFJ1blNldERybVN5c3RlbVJlYWR5Q0IoRHJtU3lzdGVtUmVhZHlDQiBkcm1fc3lzdGVtX3JlYWR5X2NiKTsKKworICB2b2lkIFNldFJlYWRJblByb2dyZXNzKDo6bWVkaWE6OkRlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSwgYm9vbCBpbl9wcm9ncmVzcyk7CisgIGJvb2wgR2V0UmVhZEluUHJvZ3Jlc3MoOjptZWRpYTo6RGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSBjb25zdDsKKworICAvLyBBbiBpZGVudGlmaWVyIHN0cmluZyBmb3IgdGhlIHBpcGVsaW5lLCB1c2VkIGluIENWYWwgdG8gaWRlbnRpZnkgbXVsdGlwbGUKKyAgLy8gcGlwZWxpbmVzLgorICBjb25zdCBzdGQ6OnN0cmluZyBwaXBlbGluZV9pZGVudGlmaWVyXzsKKworICAvLyBBIHdyYXBwZWQgaW50ZXJmYWNlIG9mIHN0YXJib2FyZCBwbGF5ZXIgZnVuY3Rpb25zLCB3aGljaCB3aWxsIGJlIHVzZWQgaW4KKyAgLy8gdW5kZXJseWluZyBTYlBsYXllckJyaWRnZS4KKyAgU2JQbGF5ZXJJbnRlcmZhY2UqIHNicGxheWVyX2ludGVyZmFjZV87CisKKyAgLy8gTWVzc2FnZSBsb29wIHVzZWQgdG8gZXhlY3V0ZSBwaXBlbGluZSB0YXNrcy4gIEl0IGlzIHRocmVhZC1zYWZlLgorICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IHRhc2tfcnVubmVyXzsKKworICAvLyBXaGV0aGVyIHdlIHNob3VsZCBzYXZlIERlY29kZXJCdWZmZXJzIGZvciByZXN1bWUgYWZ0ZXIgc3VzcGVuZC4KKyAgY29uc3QgYm9vbCBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZF87CisKKyAgLy8gV2hldGhlciB3ZSBlbmFibGUgYmF0Y2hlZCBzYW1wbGUgd3JpdGUgZnVuY3Rpb25hbGl0eS4KKyAgY29uc3QgYm9vbCBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZV87CisKKyAgLy8gVGhlIGRlZmF1bHQgb3V0cHV0IG1vZGUgcGFzc2VkIHRvIGBTYlBsYXllckdldFByZWZlcnJlZE91dHB1dE1vZGUoKWAuCisgIFNiUGxheWVyT3V0cHV0TW9kZSBkZWZhdWx0X291dHB1dF9tb2RlXyA9IGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkOworCisgIC8vIFRoZSB3aW5kb3cgdGhpcyBwbGF5ZXIgYXNzb2NpYXRlcyB3aXRoLiAgSXQgc2hvdWxkIG9ubHkgYmUgYXNzaWduZWQgaW4gdGhlCisgIC8vIGR0b3IgYW5kIGFjY2Vzc2VkIG9uY2UgYnkgU2JQbGF5ZXJDcmVhdGUoKS4KKyAgUGlwZWxpbmVXaW5kb3cgd2luZG93XzsKKworICAvLyBDYWxsIHRvIGdldCB0aGUgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciBmb3IgU2JQbGF5ZXJDcmVhdGUoKS4KKyAgY29uc3QgR2V0RGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXJGdW5jCisgICAgICBnZXRfZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyX2Z1bmNfOworCisgIC8vIExvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIGZvciB0aGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMuCisgIG11dGFibGUgYmFzZTo6TG9jayBsb2NrXzsKKworICAvLyBBbW91bnQgb2YgYXZhaWxhYmxlIGJ1ZmZlcmVkIGRhdGEuICBTZXQgYnkgZmlsdGVycy4KKyAgOjptZWRpYTo6UmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gYnVmZmVyZWRfdGltZV9yYW5nZXNfOworCisgIC8vIFRydWUgd2hlbiBBZGRCdWZmZXJlZEJ5dGVSYW5nZSgpIGhhcyBiZWVuIGNhbGxlZCBtb3JlIHJlY2VudGx5IHRoYW4KKyAgLy8gRGlkTG9hZGluZ1Byb2dyZXNzKCkuCisgIG11dGFibGUgYm9vbCBkaWRfbG9hZGluZ19wcm9ncmVzc187CisKKyAgLy8gVmlkZW8ncyBuYXR1cmFsIHdpZHRoIGFuZCBoZWlnaHQuICBTZXQgYnkgZmlsdGVycy4KKyAgZ2Z4OjpTaXplIG5hdHVyYWxfc2l6ZV87CisKKyAgLy8gQ3VycmVudCB2b2x1bWUgbGV2ZWwgKGZyb20gMC4wZiB0byAxLjBmKS4gIFRoaXMgdmFsdWUgaXMgc2V0IGltbWVkaWF0ZWx5CisgIC8vIHZpYSBTZXRWb2x1bWUoKSBhbmQgYSB0YXNrIGlzIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NhZ2UgbG9vcCB0byBub3RpZnkgdGhlCisgIC8vIGZpbHRlcnMuCisgIGJhc2U6OkNWYWw8ZmxvYXQ+IHZvbHVtZV87CisKKyAgLy8gQ3VycmVudCBwbGF5YmFjayByYXRlICg+PSAwLjBmKS4gIFRoaXMgdmFsdWUgaXMgc2V0IGltbWVkaWF0ZWx5IHZpYQorICAvLyBTZXRQbGF5YmFja1JhdGUoKSBhbmQgYSB0YXNrIGlzIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NhZ2UgbG9vcCB0byBub3RpZnkKKyAgLy8gdGhlIGZpbHRlcnMuCisgIGJhc2U6OkNWYWw8ZmxvYXQ+IHBsYXliYWNrX3JhdGVfOworCisgIC8vIFRoZSBzYXZlZCBhdWRpbyBhbmQgdmlkZW8gZGVtdXhlciBzdHJlYW1zLiAgTm90ZSB0aGF0IGl0IGlzIHNhZmUgdG8gc3RvcmUKKyAgLy8gcmF3IHBvaW50ZXJzIG9mIHRoZSBkZW11eGVyIHN0cmVhbXMsIGFzIHRoZSBEZW11eGVyIGd1YXJhbnRlZXMgdGhhdCBpdHMKKyAgLy8gfERlbXV4ZXJTdHJlYW18cyBsaXZlIGFzIGxvbmcgYXMgdGhlIERlbXV4ZXIgaXRzZWxmLgorICA6Om1lZGlhOjpEZW11eGVyU3RyZWFtKiBhdWRpb19zdHJlYW1fID0gbnVsbHB0cjsKKyAgOjptZWRpYTo6RGVtdXhlclN0cmVhbSogdmlkZW9fc3RyZWFtXyA9IG51bGxwdHI7CisKKyAgbXV0YWJsZSBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdGlzdGljc187CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IGFjY2Vzc2VkIGJ5IHRhc2tzIHBvc3RlZCB0bworICAvLyB8dGFza19ydW5uZXJffC4KKworICAvLyBUZW1wb3JhcnkgY2FsbGJhY2sgdXNlZCBmb3IgU3RvcCgpLgorICBiYXNlOjpDbG9zdXJlIHN0b3BfY2JfOworCisgIC8vIFBlcm1hbmVudCBjYWxsYmFja3MgcGFzc2VkIGluIHZpYSBTdGFydCgpLgorICBTZXREcm1TeXN0ZW1SZWFkeUNCIHNldF9kcm1fc3lzdGVtX3JlYWR5X2NiXzsKKyAgUGlwZWxpbmVTdGF0dXNDQiBlbmRlZF9jYl87CisgIEVycm9yQ0IgZXJyb3JfY2JfOworICBCdWZmZXJpbmdTdGF0ZUNCIGJ1ZmZlcmluZ19zdGF0ZV9jYl87CisgIGJhc2U6OkNsb3N1cmUgZHVyYXRpb25fY2hhbmdlX2NiXzsKKyAgYmFzZTo6Q2xvc3VyZSBvdXRwdXRfbW9kZV9jaGFuZ2VfY2JfOworICBiYXNlOjpDbG9zdXJlIGNvbnRlbnRfc2l6ZV9jaGFuZ2VfY2JfOworICBiYXNlOjpPcHRpb25hbDxib29sPiBkZWNvZGVfdG9fdGV4dHVyZV9vdXRwdXRfbW9kZV87CisjaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKKyAgU2JQbGF5ZXJCcmlkZ2U6Ok9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YUVuY291bnRlcmVkQ0IKKyAgICAgIG9uX2VuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfZW5jb3VudGVyZWRfY2JfOworI2VuZGlmICAvLyAgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKKworICAvLyBEZW11eGVyIHJlZmVyZW5jZSB1c2VkIGZvciBzZXR0aW5nIHRoZSBwcmVsb2FkIHZhbHVlLgorICBEZW11eGVyKiBkZW11eGVyXyA9IG51bGxwdHI7CisgIGJvb2wgYXVkaW9fcmVhZF9pbl9wcm9ncmVzc18gPSBmYWxzZTsKKyAgYm9vbCBhdWRpb19yZWFkX2RlbGF5ZWRfID0gZmFsc2U7CisgIGJvb2wgdmlkZW9fcmVhZF9pbl9wcm9ncmVzc18gPSBmYWxzZTsKKyAgYmFzZTo6Q1ZhbDxiYXNlOjpUaW1lRGVsdGE+IGR1cmF0aW9uXzsKKworI2lmIFNCX0hBUyhQTEFZRVJfV0lUSF9VUkwpCisgIGJhc2U6OlRpbWVEZWx0YSBzdGFydF9kYXRlXzsKKyAgYm9vbCBpc191cmxfYmFzZWRfOworI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQorCisgIHNjb3BlZF9yZWZwdHI8U2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXI+IHNldF9ib3VuZHNfaGVscGVyXzsKKworICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gV01QSSB0aHJlYWQgYnV0IGFsbAorICAvLyBtb2RpZmljYXRpb25zIHRvIHRoZW0gaGFwcGVucyBvbiB0aGUgcGlwZWxpbmUgdGhyZWFkLiAgU28gYW55IGFjY2VzcyBvZgorICAvLyB0aGVtIGZyb20gdGhlIFdNUEkgdGhyZWFkIGFuZCBhbnkgbW9kaWZpY2F0aW9uIHRvIHRoZW0gb24gdGhlIHBpcGVsaW5lCisgIC8vIHRocmVhZCBoYXMgdG8gZ3VhcmRlZCBieSBsb2NrLiAgQWNjZXNzIHRvIHRoZW0gZnJvbSB0aGUgcGlwZWxpbmUgdGhyZWFkCisgIC8vIG5lZWRuJ3QgdG8gYmUgZ3VhcmRlZC4KKworICAvLyBUZW1wb3JhcnkgY2FsbGJhY2sgdXNlZCBmb3IgU3RhcnQoKSBhbmQgU2VlaygpLgorICBTZWVrQ0Igc2Vla19jYl87CisgIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWVfOworICBzdGQ6OnVuaXF1ZV9wdHI8U2JQbGF5ZXJCcmlkZ2U+IHBsYXllcl9icmlkZ2VfOworICBib29sIGlzX2luaXRpYWxfcHJlcm9sbF8gPSB0cnVlOworICBiYXNlOjpDVmFsPGJvb2w+IHN0YXJ0ZWRfOworICBiYXNlOjpDVmFsPGJvb2w+IHN1c3BlbmRlZF87CisgIGJhc2U6OkNWYWw8Ym9vbD4gc3RvcHBlZF87CisgIGJhc2U6OkNWYWw8Ym9vbD4gZW5kZWRfOworICBiYXNlOjpDVmFsPFNiUGxheWVyU3RhdGU+IHBsYXllcl9zdGF0ZV87CisKKyAgRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIGRlY29kZV90YXJnZXRfcHJvdmlkZXJfOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKKyAgY29uc3QgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsXzsKKyAgY29uc3QgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3JlbW90ZV87CisKKyAgLy8gVGhlIHR3byB2YXJpYWJsZXMgYmVsb3cgc2hvdWxkIGFsd2F5cyBjb250YWluIHRoZSBzYW1lIHZhbHVlLiAgVGhleSBhcmUKKyAgLy8ga2VwdCBhcyBzZXBhcmF0ZSB2YXJpYWJsZXMgc28gd2UgY2FuIGtlZXAgdGhlIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGFzCisgIC8vIGlzLCB3aGljaCBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3Jvc3MgbXVsdGlwbGUgU3RhcmJvYXJkIHZlcnNpb25zLgorICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fID0gMDsKKyAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2Zvcl9wcmVyb2xsXyA9IGF1ZGlvX3dyaXRlX2R1cmF0aW9uXzsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTUKKyAgLy8gUmVhZCBhdWRpbyBmcm9tIHRoZSBzdHJlYW0gaWYgfHRpbWVzdGFtcF9vZl9sYXN0X3dyaXR0ZW5fYXVkaW9ffCBpcyBsZXNzCisgIC8vIHRoYW4gfHNlZWtfdGltZV98ICsgfGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2Zvcl9wcmVyb2xsX3wsIHRoaXMgZWZmZWN0aXZlbHkKKyAgLy8gYWxsb3dzIDEwIHNlY29uZHMgb2YgYXVkaW8gdG8gYmUgd3JpdHRlbiB0byB0aGUgU2JQbGF5ZXIgYWZ0ZXIgcGxheWJhY2sKKyAgLy8gc3RhcnR1cCBvciBzZWVrLgorICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fZm9yX3ByZXJvbGxfID0gMTAgKiBrU2JUaW1lU2Vjb25kOworICAvLyBEb24ndCByZWFkIGF1ZGlvIGZyb20gdGhlIHN0cmVhbSBtb3JlIHRoYW4gfGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3wgYWhlYWQgb2YKKyAgLy8gdGhlIGN1cnJlbnQgbWVkaWEgdGltZSBkdXJpbmcgcGxheWluZy4KKyAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uXyA9IGtTYlRpbWVTZWNvbmQ7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CisgIC8vIE9ubHkgY2FsbCBHZXRNZWRpYVRpbWUoKSBmcm9tIE9uTmVlZERhdGEgaWYgaXQgaGFzIGJlZW4KKyAgLy8gfGtNZWRpYVRpbWVDaGVja0ludGVydmFsfCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIEdldE1lZGlhVGltZSgpLgorICBzdGF0aWMgY29uc3QgU2JUaW1lIGtNZWRpYVRpbWVDaGVja0ludGVydmFsID0gMC4xICoga1NiVGltZVNlY29uZDsKKyAgLy8gVGltZXN0YW1wIGZvciB0aGUgbGFzdCB3cml0dGVuIGF1ZGlvLgorICBTYlRpbWUgdGltZXN0YW1wX29mX2xhc3Rfd3JpdHRlbl9hdWRpb18gPSAwOworCisgIC8vIExhc3QgbWVkaWEgdGltZSByZXBvcnRlZCBieSBHZXRNZWRpYVRpbWUoKS4KKyAgYmFzZTo6Q1ZhbDxTYlRpbWU+IGxhc3RfbWVkaWFfdGltZV87CisgIC8vIFRpbWUgd2hlbiB3ZSBsYXN0IGNoZWNrZWQgdGhlIG1lZGlhIHRpbWUuCisgIFNiVGltZSBsYXN0X3RpbWVfbWVkaWFfdGltZV9yZXRyaWV2ZWRfID0gMDsKKyAgLy8gQ291bnRlciBmb3IgcmV0cm9ncmFkZSBtZWRpYSB0aW1lLgorICBzaXplX3QgcmV0cm9ncmFkZV9tZWRpYV90aW1lX2NvdW50ZXJfID0gMDsKKyAgLy8gVGhlIG1heGltdW0gdmlkZW8gcGxheWJhY2sgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGZvciB0aGUgcGxheWJhY2suCisgIGJhc2U6OkNWYWw8c3RkOjpzdHJpbmc+IG1heF92aWRlb19jYXBhYmlsaXRpZXNfOworCisgIFBsYXliYWNrU3RhdGlzdGljcyBwbGF5YmFja19zdGF0aXN0aWNzXzsKKworICBTYlRpbWVNb25vdG9uaWMgbGFzdF9yZXN1bWVfdGltZV8gPSAtMTsKKworICBTYlRpbWVNb25vdG9uaWMgc2V0X2RybV9zeXN0ZW1fcmVhZHlfY2JfdGltZV8gPSAtMTsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2JQbGF5ZXJQaXBlbGluZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQkFTRV9TQlBMQVlFUl9QSVBFTElORV9IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5jYyBiL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuY2MKaW5kZXggMDBkYjlmZS4uYTk1MmQyYiAxMDA2NDQKLS0tIGEvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5jYworKysgYi9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmNjCkBAIC0xODksNiArMTg5LDExIEBACiAgICAgTE9HKElORk8pIDw8IChhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZV8gPyAiRW5hYmxpbmciIDogIkRpc2FibGluZyIpCiAgICAgICAgICAgICAgIDw8ICIgYmF0Y2hlZCBzYW1wbGUgd3JpdGUuIjsKICAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChuYW1lID09ICJGb3JjZVB1bmNoT3V0QnlEZWZhdWx0IikgeworICAgIGZvcmNlX3B1bmNoX291dF9ieV9kZWZhdWx0XyA9IHZhbHVlOworICAgIExPRyhJTkZPKSA8PCAiRm9yY2UgcHVuY2ggb3V0IGJ5IGRlZmF1bHQgOiAiCisgICAgICAgICAgICAgIDw8IChmb3JjZV9wdW5jaF9vdXRfYnlfZGVmYXVsdF8gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKICAgfSBlbHNlIGlmIChuYW1lID09ICJFbmFibGVNZXRyaWNzIikgewogICAgIHNicGxheWVyX2ludGVyZmFjZV8tPkVuYWJsZUNWYWxTdGF0cyh2YWx1ZSk7CiAgICAgTE9HKElORk8pIDw8ICh2YWx1ZSA/ICJFbmFibGluZyIgOiAiRGlzYWJsaW5nIikKQEAgLTIwNyw2ICsyMTIsNyBAQAogICAgIHJldHVybiB0cnVlOwogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAxNQogICB9CisKICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0yMjMsNyArMjI5LDcgQEAKICAgICAgIGJhc2U6OkJpbmQoJk1lZGlhTW9kdWxlOjpHZXRTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyLAogICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKICAgICAgIGNsaWVudCwgdGhpcywgb3B0aW9uc18uYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmQsCi0gICAgICBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZV8sCisgICAgICBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZV8sIGZvcmNlX3B1bmNoX291dF9ieV9kZWZhdWx0XywKICNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQogICAgICAgYXVkaW9fd3JpdGVfZHVyYXRpb25fbG9jYWxfLCBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGVfLAogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAxNQpkaWZmIC0tZ2l0IGEvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5oIGIvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5oCmluZGV4IDU5YTc1M2UuLmNjNWRiNzEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaAorKysgYi9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmgKQEAgLTEyMyw2ICsxMjMsMTQgQEAKICAgYm9vbCBzdXNwZW5kZWRfID0gZmFsc2U7CiAKICAgYm9vbCBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZV8gPSBmYWxzZTsKKyAgLy8gV2hlbiBzZXQgdG8gYGZhbHNlYCAodGhlIGRlZmF1bHQgdmFsdWUpLCBDb2JhbHQgY2FsbHMKKyAgLy8gYFNiUGxheWVyR2V0UHJlZmVycmVkT3V0cHV0TW9kZSgpYCB3aXRoIGBrU2JQbGF5ZXJPdXRwdXRNb2RlSW52YWxpZGAgd2hlbgorICAvLyB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIG9uIG91dHB1dCBtb2RlLgorICAvLyBXaGVuIHNldCB0byBgdHJ1ZWAgdmlhIGBoNXZjYy5zZXR0aW5nc2AsIENvYmFsdCBjYWxscworICAvLyBgU2JQbGF5ZXJHZXRQcmVmZXJyZWRPdXRwdXRNb2RlKClgIHdpdGggYGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dGAgd2hlbgorICAvLyB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIG9uIG91dHB1dCBtb2RlLiAgVGhpcyBhbGxvd3MgdXMgdG8gZmFsbGJhY2sgdG8gdGhlCisgIC8vIHByZXZpb3VzIGJlaGF2aW9yLgorICBib29sIGZvcmNlX3B1bmNoX291dF9ieV9kZWZhdWx0XyA9IGZhbHNlOwogCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKICAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsXyA9IGtTYlBsYXllcldyaXRlRHVyYXRpb25Mb2NhbDsKZGlmZiAtLWdpdCBhL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjIGIvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKaW5kZXggYjE3ZjgyZS4uOGExMjFhNiAxMDA2NDQKLS0tIGEvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKKysrIGIvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJiYXNlL3RyYWNlX2V2ZW50L3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvaW5zdGFuY2VfY291bnRlci5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9wcm9ncmVzc2l2ZS9kYXRhX3NvdXJjZV9yZWFkZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvcHJvZ3Jlc3NpdmUvZGVtdXhlcl9leHRlbnNpb25fd3JhcHBlci5oIgpAQCAtMTE4LDYgKzExOSw3IEBACiAgICAgICAgIGdldF9kZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfZnVuYywKICAgICBXZWJNZWRpYVBsYXllckNsaWVudCogY2xpZW50LCBXZWJNZWRpYVBsYXllckRlbGVnYXRlKiBkZWxlZ2F0ZSwKICAgICBib29sIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kLCBib29sIGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlLAorICAgIGJvb2wgZm9yY2VfcHVuY2hfb3V0X2J5X2RlZmF1bHQsCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKICAgICBTYlRpbWUgYXVkaW9fd3JpdGVfZHVyYXRpb25fbG9jYWwsIFNiVGltZSBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGUsCiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CkBAIC0xMzAsNiArMTMyLDcgQEAKICAgICAgIGRlbGVnYXRlXyhkZWxlZ2F0ZSksCiAgICAgICBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZF8oYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmQpLAogICAgICAgYWxsb3dfYmF0Y2hlZF9zYW1wbGVfd3JpdGVfKGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlKSwKKyAgICAgIGZvcmNlX3B1bmNoX291dF9ieV9kZWZhdWx0Xyhmb3JjZV9wdW5jaF9vdXRfYnlfZGVmYXVsdCksCiAgICAgICBwcm94eV8obmV3IFdlYk1lZGlhUGxheWVyUHJveHkobWFpbl9sb29wXy0+dGFza19ydW5uZXIoKSwgdGhpcykpLAogICAgICAgbWVkaWFfbG9nXyhtZWRpYV9sb2cpLAogICAgICAgaXNfbG9jYWxfc291cmNlXyhmYWxzZSksCkBAIC0xNDUsMTQgKzE0OCwxNSBAQAogICBtZWRpYV9sb2dfLT5BZGRFdmVudDw6Om1lZGlhOjpNZWRpYUxvZ0V2ZW50OjprV2ViTWVkaWFQbGF5ZXJDcmVhdGVkPigpOwogCiAgIHBpcGVsaW5lX3RocmVhZF8uU3RhcnQoKTsKLSAgcGlwZWxpbmVfID0KLSAgICAgIFBpcGVsaW5lOjpDcmVhdGUoaW50ZXJmYWNlLCB3aW5kb3csIHBpcGVsaW5lX3RocmVhZF8udGFza19ydW5uZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZF8sIGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlXywKKyAgcGlwZWxpbmVfID0gbmV3IFNiUGxheWVyUGlwZWxpbmUoCisgICAgICBpbnRlcmZhY2UsIHdpbmRvdywgcGlwZWxpbmVfdGhyZWFkXy50YXNrX3J1bm5lcigpLAorICAgICAgZ2V0X2RlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl9mdW5jLAorICAgICAgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmRfLCBhbGxvd19iYXRjaGVkX3NhbXBsZV93cml0ZV8sCisgICAgICBmb3JjZV9wdW5jaF9vdXRfYnlfZGVmYXVsdF8sCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fd3JpdGVfZHVyYXRpb25fbG9jYWwsIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3JlbW90ZSwKKyAgICAgIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsLCBhdWRpb193cml0ZV9kdXJhdGlvbl9yZW1vdGUsCiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1Ci0gICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX2xvZ18sIGRlY29kZV90YXJnZXRfcHJvdmlkZXJfLmdldCgpKTsKKyAgICAgIG1lZGlhX2xvZ18sIGRlY29kZV90YXJnZXRfcHJvdmlkZXJfLmdldCgpKTsKIAogICAvLyBBbHNvIHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgfG1haW5fbG9vcF98IGRlc3RydWN0aW9uLgogICBtYWluX2xvb3BfLT5BZGREZXN0cnVjdGlvbk9ic2VydmVyKHRoaXMpOwpAQCAtODA3LDcgKzgxMSw5IEBACiAKICAgc3RhdGVfLnN0YXJ0aW5nID0gdHJ1ZTsKIAotICBwaXBlbGluZV8tPlNldERlY29kZVRvVGV4dHVyZU91dHB1dE1vZGUoY2xpZW50Xy0+UHJlZmVyRGVjb2RlVG9UZXh0dXJlKCkpOworICBpZiAoY2xpZW50Xy0+UHJlZmVyRGVjb2RlVG9UZXh0dXJlKCkpIHsKKyAgICBwaXBlbGluZV8tPlNldFByZWZlcnJlZE91dHB1dE1vZGVUb0RlY29kZVRvVGV4dHVyZSgpOworICB9CiAgIHBpcGVsaW5lXy0+U3RhcnQoCiAgICAgICBCSU5EX1RPX1JFTkRFUl9MT09QKCZXZWJNZWRpYVBsYXllckltcGw6OlNldERybVN5c3RlbVJlYWR5Q0IpLAogICAgICAgQklORF9UT19SRU5ERVJfTE9PUCgKQEAgLTgyNyw3ICs4MzMsOSBAQAogCiAgIHN0YXRlXy5zdGFydGluZyA9IHRydWU7CiAKLSAgcGlwZWxpbmVfLT5TZXREZWNvZGVUb1RleHR1cmVPdXRwdXRNb2RlKGNsaWVudF8tPlByZWZlckRlY29kZVRvVGV4dHVyZSgpKTsKKyAgaWYgKGNsaWVudF8tPlByZWZlckRlY29kZVRvVGV4dHVyZSgpKSB7CisgICAgcGlwZWxpbmVfLT5TZXRQcmVmZXJyZWRPdXRwdXRNb2RlVG9EZWNvZGVUb1RleHR1cmUoKTsKKyAgfQogICBwaXBlbGluZV8tPlN0YXJ0KAogICAgICAgZGVtdXhlciwgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXREcm1TeXN0ZW1SZWFkeUNCKSwKICAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZUVuZGVkKSwKZGlmZiAtLWdpdCBhL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmggYi9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oCmluZGV4IDRmMGM2YTkuLjlkYjQ0MTkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmgKKysrIGIvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaApAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICBXZWJNZWRpYVBsYXllckRlbGVnYXRlKiBkZWxlZ2F0ZSwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmQsCiAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9wdW5jaF9vdXRfYnlfZGVmYXVsdCwKICNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQogICAgICAgICAgICAgICAgICAgICAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX2xvY2FsLAogICAgICAgICAgICAgICAgICAgICAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uX3JlbW90ZSwKQEAgLTI5OCw2ICsyOTksNyBAQAogICBXZWJNZWRpYVBsYXllckRlbGVnYXRlKiBjb25zdCBkZWxlZ2F0ZV87CiAgIGNvbnN0IGJvb2wgYWxsb3dfcmVzdW1lX2FmdGVyX3N1c3BlbmRfOwogICBjb25zdCBib29sIGFsbG93X2JhdGNoZWRfc2FtcGxlX3dyaXRlXzsKKyAgY29uc3QgYm9vbCBmb3JjZV9wdW5jaF9vdXRfYnlfZGVmYXVsdF87CiAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlVGFyZ2V0UHJvdmlkZXI+IGRlY29kZV90YXJnZXRfcHJvdmlkZXJfOwogCiAgIHNjb3BlZF9yZWZwdHI8V2ViTWVkaWFQbGF5ZXJQcm94eT4gcHJveHlfOwpkaWZmIC0tZ2l0IGEvY29iYWx0L21lZGlhL3VybF9mZXRjaGVyX2RhdGFfc291cmNlLmNjIGIvY29iYWx0L21lZGlhL3VybF9mZXRjaGVyX2RhdGFfc291cmNlLmNjCmluZGV4IGE1MmUxZmIuLjY5Y2JmOGIgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9tZWRpYS91cmxfZmV0Y2hlcl9kYXRhX3NvdXJjZS5jYworKysgYi9jb2JhbHQvbWVkaWEvdXJsX2ZldGNoZXJfZGF0YV9zb3VyY2UuY2MKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgc3RkOjptb3ZlKG5ldDo6VVJMRmV0Y2hlcjo6Q3JlYXRlKHVybF8sIG5ldDo6VVJMRmV0Y2hlcjo6R0VULCB0aGlzKSk7CiAgIGZldGNoZXJfLT5TZXRSZXF1ZXN0Q29udGV4dCgKICAgICAgIG5ldHdvcmtfbW9kdWxlXy0+dXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIoKS5nZXQoKSk7Ci0gIG5ldHdvcmtfbW9kdWxlXy0+QWRkQ2xpZW50SGludEhlYWRlcnMoKmZldGNoZXJfKTsKKyAgbmV0d29ya19tb2R1bGVfLT5BZGRDbGllbnRIaW50SGVhZGVycygqZmV0Y2hlcl8sIG5ldHdvcms6OmtDYWxsVHlwZU1lZGlhKTsKICAgc3RkOjp1bmlxdWVfcHRyPGxvYWRlcjo6VVJMRmV0Y2hlclN0cmluZ1dyaXRlcj4gZG93bmxvYWRfZGF0YV93cml0ZXIoCiAgICAgICBuZXcgbG9hZGVyOjpVUkxGZXRjaGVyU3RyaW5nV3JpdGVyKCkpOwogICBmZXRjaGVyXy0+U2F2ZVJlc3BvbnNlV2l0aFdyaXRlcihzdGQ6Om1vdmUoZG93bmxvYWRfZGF0YV93cml0ZXIpKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9uZXR3b3JrL25ldF9wb3N0ZXIuY2MgYi9jb2JhbHQvbmV0d29yay9uZXRfcG9zdGVyLmNjCmluZGV4IGMyZDFhMWIuLjBlNWIwMmYgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9uZXR3b3JrL25ldF9wb3N0ZXIuY2MKKysrIGIvY29iYWx0L25ldHdvcmsvbmV0X3Bvc3Rlci5jYwpAQCAtNDksNyArNDksNyBAQAogICB1cmxfZmV0Y2hlci0+U2V0U3RvcE9uUmVkaXJlY3QodHJ1ZSk7CiAgIHVybF9mZXRjaGVyLT5TZXRSZXF1ZXN0Q29udGV4dCgKICAgICAgIG5ldHdvcmtfbW9kdWxlXy0+dXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIoKS5nZXQoKSk7Ci0gIG5ldHdvcmtfbW9kdWxlXy0+QWRkQ2xpZW50SGludEhlYWRlcnMoKnVybF9mZXRjaGVyKTsKKyAgbmV0d29ya19tb2R1bGVfLT5BZGRDbGllbnRIaW50SGVhZGVycygqdXJsX2ZldGNoZXIsIG5ldHdvcms6OmtDYWxsVHlwZVBvc3QpOwogCiAgIGlmIChkYXRhLnNpemUoKSkgewogICAgIHVybF9mZXRjaGVyLT5TZXRVcGxvYWREYXRhKGNvbnRlbnRfdHlwZSwgZGF0YSk7CmRpZmYgLS1naXQgYS9jb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5jYyBiL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmNjCmluZGV4IGIzNThjMTEuLjE1ZTNkYmQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmNjCisrKyBiL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmNjCkBAIC0zNiw0NSArMzYsNDkgQEAKICNlbmRpZgogfSAgLy8gbmFtZXNwYWNlCiAKLU5ldHdvcmtNb2R1bGU6Ok5ldHdvcmtNb2R1bGUoY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgICA6IHN0b3JhZ2VfbWFuYWdlcl8oTlVMTCksIG9wdGlvbnNfKG9wdGlvbnMpIHsKK05ldHdvcmtNb2R1bGU6Ok5ldHdvcmtNb2R1bGUoY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgOiBvcHRpb25zXyhvcHRpb25zKSB7CiAgIEluaXRpYWxpemUoIk51bGwgdXNlciBhZ2VudCBzdHJpbmcuIiwgTlVMTCk7CiB9CiAKIE5ldHdvcmtNb2R1bGU6Ok5ldHdvcmtNb2R1bGUoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJfYWdlbnRfc3RyaW5nLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2xpZW50X2hpbnRfaGVhZGVycywKLSAgICBzdG9yYWdlOjpTdG9yYWdlTWFuYWdlciogc3RvcmFnZV9tYW5hZ2VyLAogICAgIGJhc2U6OkV2ZW50RGlzcGF0Y2hlciogZXZlbnRfZGlzcGF0Y2hlciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgICA6IGNsaWVudF9oaW50X2hlYWRlcnNfKGNsaWVudF9oaW50X2hlYWRlcnMpLAotICAgICAgc3RvcmFnZV9tYW5hZ2VyXyhzdG9yYWdlX21hbmFnZXIpLAotICAgICAgb3B0aW9uc18ob3B0aW9ucykgeworICAgIDogY2xpZW50X2hpbnRfaGVhZGVyc18oY2xpZW50X2hpbnRfaGVhZGVycyksIG9wdGlvbnNfKG9wdGlvbnMpIHsKICAgSW5pdGlhbGl6ZSh1c2VyX2FnZW50X3N0cmluZywgZXZlbnRfZGlzcGF0Y2hlcik7CiB9CiAKK3ZvaWQgTmV0d29ya01vZHVsZTo6V2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AoKSB7CisjaWYgZGVmaW5lZChESUFMX1NFUlZFUikKKyAgZGlhbF9zZXJ2aWNlX3Byb3h5XyA9IG51bGxwdHI7CisgIGRpYWxfc2VydmljZV8ucmVzZXQoKTsKKyNlbmRpZgorCisgIGNvb2tpZV9qYXJfLnJlc2V0KCk7CisgIG5ldF9wb3N0ZXJfLnJlc2V0KCk7CisgIHVybF9yZXF1ZXN0X2NvbnRleHRfLnJlc2V0KCk7CisgIG5ldHdvcmtfZGVsZWdhdGVfLnJlc2V0KCk7Cit9CisKIE5ldHdvcmtNb2R1bGU6On5OZXR3b3JrTW9kdWxlKCkgewogICAvLyBPcmRlciBvZiBkZXN0cnVjdGlvbiBpcyBpbXBvcnRhbnQgaGVyZS4KICAgLy8gVVJMUmVxdWVzdENvbnRleHQgYW5kIE5ldHdvcmtEZWxlZ2F0ZSBtdXN0IGJlIGRlc3Ryb3llZCBvbiB0aGUgSU8gdGhyZWFkLgogICAvLyBUaGUgT2JqZWN0V2F0Y2hNdWx0aXBsZXhlciBtdXN0IGJlIGRlc3Ryb3llZCBsYXN0LiAgKFRoZSBzb2NrZXRzIG93bmVkCiAgIC8vIGJ5IFVSTFJlcXVlc3RDb250ZXh0IHdpbGwgZGVzdHJveSB0aGVpciBPYmplY3RXYXRjaGVycywgd2hpY2ggbmVlZCB0aGUKICAgLy8gbXVsdGlwbGV4ZXIuKQotICB1cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcl8gPSBOVUxMOwotI2lmIGRlZmluZWQoRElBTF9TRVJWRVIpCi0gIGRpYWxfc2VydmljZV9wcm94eV8gPSBOVUxMOwotICB0YXNrX3J1bm5lcigpLT5EZWxldGVTb29uKEZST01fSEVSRSwgZGlhbF9zZXJ2aWNlXy5yZWxlYXNlKCkpOwotI2VuZGlmCisgIHVybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyXyA9IG51bGxwdHI7CiAKLSAgdGFza19ydW5uZXIoKS0+RGVsZXRlU29vbihGUk9NX0hFUkUsIGNvb2tpZV9qYXJfLnJlbGVhc2UoKSk7Ci0gIHRhc2tfcnVubmVyKCktPkRlbGV0ZVNvb24oRlJPTV9IRVJFLCBuZXRfcG9zdGVyXy5yZWxlYXNlKCkpOwotICB0YXNrX3J1bm5lcigpLT5EZWxldGVTb29uKEZST01fSEVSRSwgdXJsX3JlcXVlc3RfY29udGV4dF8ucmVsZWFzZSgpKTsKLSAgdGFza19ydW5uZXIoKS0+RGVsZXRlU29vbihGUk9NX0hFUkUsIG5ldHdvcmtfZGVsZWdhdGVfLnJlbGVhc2UoKSk7Ci0KLSAgLy8gVGhpcyB3aWxsIHJ1biB0aGUgYWJvdmUgdGFzaywgYW5kIHRoZW4gc3RvcCB0aGUgdGhyZWFkLgotICB0aHJlYWRfLnJlc2V0KE5VTEwpOworICBpZiAodGhyZWFkXykgeworICAgIC8vIFdhaXQgZm9yIGFsbCBwcmV2aW91c2x5IHBvc3RlZCB0YXNrcyB0byBmaW5pc2guCisgICAgdGhyZWFkXy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPldhaXRGb3JGZW5jZSgpOworICAgIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byBXaWxsRGVzdHJveUN1cnJlbnRNZXNzYWdlTG9vcCBpbiB0aGUgdGhyZWFkCisgICAgLy8gYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KKyAgICB0aHJlYWRfLnJlc2V0KCk7CisgIH0KICNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCi0gIG9iamVjdF93YXRjaF9tdWx0aXBsZXhlcl8ucmVzZXQoTlVMTCk7CisgIG9iamVjdF93YXRjaF9tdWx0aXBsZXhlcl8ucmVzZXQoKTsKICNlbmRpZgotICBuZXR3b3JrX3N5c3RlbV8ucmVzZXQoTlVMTCk7CisgIG5ldHdvcmtfc3lzdGVtXy5yZXNldCgpOwogfQogCiBzdGQ6OnN0cmluZyBOZXR3b3JrTW9kdWxlOjpHZXRVc2VyQWdlbnQoKSBjb25zdCB7CkBAIC0xMDEsOCArMTA1LDIwIEBACiAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodXJsX3JlcXVlc3RfY29udGV4dF8uZ2V0KCkpLCBlbmFibGVfcXVpYykpOwogfQogCit2b2lkIE5ldHdvcmtNb2R1bGU6OlNldEVuYWJsZUNsaWVudEhpbnRIZWFkZXJzRmxhZ3NGcm9tUGVyc2lzdGVudFNldHRpbmdzKCkgeworICAvLyBDYWxsZWQgb24gaW5pdGlhbGl6YXRpb24gYW5kIHdoZW4gdGhlIHBlcnNpc3RlbnQgc2V0dGluZyBpcyBjaGFuZ2VkLgorICBpZiAob3B0aW9uc18ucGVyc2lzdGVudF9zZXR0aW5ncyAhPSBudWxscHRyKSB7CisgICAgZW5hYmxlX2NsaWVudF9oaW50X2hlYWRlcnNfZmxhZ3NfLnN0b3JlKAorICAgICAgICBvcHRpb25zXy5wZXJzaXN0ZW50X3NldHRpbmdzLT5HZXRQZXJzaXN0ZW50U2V0dGluZ0FzSW50KAorICAgICAgICAgICAga0NsaWVudEhpbnRIZWFkZXJzRW5hYmxlZFBlcnNpc3RlbnRTZXR0aW5nc0tleSwgMCkpOworICB9Cit9CisKIHZvaWQgTmV0d29ya01vZHVsZTo6SW5pdGlhbGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdXNlcl9hZ2VudF9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RXZlbnREaXNwYXRjaGVyKiBldmVudF9kaXNwYXRjaGVyKSB7CisgIHN0b3JhZ2VfbWFuYWdlcl8ucmVzZXQoCisgICAgICBuZXcgc3RvcmFnZTo6U3RvcmFnZU1hbmFnZXIob3B0aW9uc18uc3RvcmFnZV9tYW5hZ2VyX29wdGlvbnMpKTsKKwogICB0aHJlYWRfLnJlc2V0KG5ldyBiYXNlOjpUaHJlYWQoIk5ldHdvcmtNb2R1bGUiKSk7CiAjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogICBvYmplY3Rfd2F0Y2hfbXVsdGlwbGV4ZXJfLnJlc2V0KG5ldyBiYXNlOjpPYmplY3RXYXRjaE11bHRpcGxleGVyKCkpOwpAQCAtMTExLDYgKzEyNyw4IEBACiAgIGh0dHBfdXNlcl9hZ2VudF9zZXR0aW5nc18ucmVzZXQobmV3IG5ldDo6U3RhdGljSHR0cFVzZXJBZ2VudFNldHRpbmdzKAogICAgICAgb3B0aW9uc18ucHJlZmVycmVkX2xhbmd1YWdlLCB1c2VyX2FnZW50X3N0cmluZykpOwogCisgIFNldEVuYWJsZUNsaWVudEhpbnRIZWFkZXJzRmxhZ3NGcm9tUGVyc2lzdGVudFNldHRpbmdzKCk7CisKICNpZiBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMpCiAgIGJhc2U6OkNvbW1hbmRMaW5lKiBjb21tYW5kX2xpbmUgPSBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKIApAQCAtMTc0LDE1ICsxOTIsMTYgQEAKIAogdm9pZCBOZXR3b3JrTW9kdWxlOjpPbkNyZWF0ZShiYXNlOjpXYWl0YWJsZUV2ZW50KiBjcmVhdGlvbl9ldmVudCkgewogICBEQ0hFQ0sodGFza19ydW5uZXIoKS0+UnVuc1Rhc2tzSW5DdXJyZW50U2VxdWVuY2UoKSk7CisgIGJhc2U6Ok1lc3NhZ2VMb29wQ3VycmVudDo6R2V0KCktPkFkZERlc3RydWN0aW9uT2JzZXJ2ZXIodGhpcyk7CiAKICAgbmV0OjpOZXRMb2cqIG5ldF9sb2cgPSBOVUxMOwogI2lmIGRlZmluZWQoRU5BQkxFX05FVFdPUktfTE9HR0lORykKICAgbmV0X2xvZyA9IG5ldF9sb2dfLmdldCgpOwogI2VuZGlmCiAgIHVybF9yZXF1ZXN0X2NvbnRleHRfLnJlc2V0KAotICAgICAgbmV3IFVSTFJlcXVlc3RDb250ZXh0KHN0b3JhZ2VfbWFuYWdlcl8sIG9wdGlvbnNfLmN1c3RvbV9wcm94eSwgbmV0X2xvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy5pZ25vcmVfY2VydGlmaWNhdGVfZXJyb3JzLCB0YXNrX3J1bm5lcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfLnBlcnNpc3RlbnRfc2V0dGluZ3MpKTsKKyAgICAgIG5ldyBVUkxSZXF1ZXN0Q29udGV4dChzdG9yYWdlX21hbmFnZXJfLmdldCgpLCBvcHRpb25zXy5jdXN0b21fcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0X2xvZywgb3B0aW9uc18uaWdub3JlX2NlcnRpZmljYXRlX2Vycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3J1bm5lcigpLCBvcHRpb25zXy5wZXJzaXN0ZW50X3NldHRpbmdzKSk7CiAgIG5ldHdvcmtfZGVsZWdhdGVfLnJlc2V0KG5ldyBOZXR3b3JrRGVsZWdhdGUob3B0aW9uc18uY29va2llX3BvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy5odHRwc19yZXF1aXJlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy5jb3JzX3BvbGljeSkpOwpAQCAtMjAxLDExICsyMjAsOSBAQAogICBjcmVhdGlvbl9ldmVudC0+U2lnbmFsKCk7CiB9CiAKLXZvaWQgTmV0d29ya01vZHVsZTo6QWRkQ2xpZW50SGludEhlYWRlcnMobmV0OjpVUkxGZXRjaGVyJiB1cmxfZmV0Y2hlcikgY29uc3QgewotICAvLyBDaGVjayBpZiBwZXJzaXN0ZW50IHNldHRpbmcgaXMgZW5hYmxlZCBiZWZvcmUgYWRkaW5nIHRoZSBoZWFkZXJzLgotICBpZiAob3B0aW9uc18ucGVyc2lzdGVudF9zZXR0aW5ncyAhPSBudWxscHRyICYmCi0gICAgICBvcHRpb25zXy5wZXJzaXN0ZW50X3NldHRpbmdzLT5HZXRQZXJzaXN0ZW50U2V0dGluZ0FzQm9vbCgKLSAgICAgICAgICBrQ2xpZW50SGludEhlYWRlcnNFbmFibGVkUGVyc2lzdGVudFNldHRpbmdzS2V5LCBmYWxzZSkpIHsKK3ZvaWQgTmV0d29ya01vZHVsZTo6QWRkQ2xpZW50SGludEhlYWRlcnMoCisgICAgbmV0OjpVUkxGZXRjaGVyJiB1cmxfZmV0Y2hlciwgQ2xpZW50SGludEhlYWRlcnNDYWxsVHlwZSBjYWxsX3R5cGUpIGNvbnN0IHsKKyAgaWYgKGVuYWJsZV9jbGllbnRfaGludF9oZWFkZXJzX2ZsYWdzXy5sb2FkKCkgJiBjYWxsX3R5cGUpIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYWRlciA6IGNsaWVudF9oaW50X2hlYWRlcnNfKSB7CiAgICAgICB1cmxfZmV0Y2hlci5BZGRFeHRyYVJlcXVlc3RIZWFkZXIoaGVhZGVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIGIvY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaAppbmRleCAxMTYyY2FjLi42OWYyMjZkIDEwMDY0NAotLS0gYS9jb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oCisrKyBiL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmgKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay91cmxfcmVxdWVzdF9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvcGVyc2lzdGVudF9zdG9yYWdlL3BlcnNpc3RlbnRfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuaCIKICNpbmNsdWRlICJuZXQvYmFzZS9zdGF0aWNfY29va2llX3BvbGljeS5oIgogI2luY2x1ZGUgInVybC9ndXJsLmgiCiAjaWYgZGVmaW5lZChESUFMX1NFUlZFUikKQEAgLTM4LDI2ICszOSwzNCBAQAogI2luY2x1ZGUgIm5ldC9kaWFsL2RpYWxfc2VydmljZS5oIgogI2VuZGlmCiAjaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L2h0dHBfdXNlcl9hZ2VudF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vYXRvbWljLmgiCiAKIG5hbWVzcGFjZSBiYXNlIHsKIGNsYXNzIFdhaXRhYmxlRXZlbnQ7CiB9ICAvLyBuYW1lc3BhY2UgYmFzZQogCiBuYW1lc3BhY2UgY29iYWx0IHsKLQotbmFtZXNwYWNlIHN0b3JhZ2UgewotY2xhc3MgU3RvcmFnZU1hbmFnZXI7Ci19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotCiBuYW1lc3BhY2UgbmV0d29yayB7CiAKKy8vIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0eXBlIG9mIG5ldHdvcmsgY2FsbCBmb3IgQ2xpZW50IEhpbnQgSGVhZGVycy4KKy8vIFZhbHVlcyBjb3JyZXNwb25kIHRvIGJpdCBtYXNrcyBhZ2FpbnN0IHxlbmFibGVfY2xpZW50X2hpbnRfaGVhZGVyc19mbGFnc198LgorZW51bSBDbGllbnRIaW50SGVhZGVyc0NhbGxUeXBlIDogaW50MzJfdCB7CisgIGtDYWxsVHlwZUxvYWRlciA9ICgxdSA8PCAwKSwKKyAga0NhbGxUeXBlTWVkaWEgPSAoMXUgPDwgMSksCisgIGtDYWxsVHlwZVBvc3QgPSAoMXUgPDwgMiksCisgIGtDYWxsVHlwZVByZWZsaWdodCA9ICgxdSA8PCAzKSwKKyAga0NhbGxUeXBlVXBkYXRlciA9ICgxdSA8PCA0KSwKKyAga0NhbGxUeXBlWEhSID0gKDF1IDw8IDUpLAorfTsKKworLy8gSG9sZHMgYml0IG1hc2sgZmxhZywgcmVhZCBpbnRvIHxlbmFibGVfY2xpZW50X2hpbnRfaGVhZGVyc19mbGFnc198LgogY29uc3QgY2hhciBrQ2xpZW50SGludEhlYWRlcnNFbmFibGVkUGVyc2lzdGVudFNldHRpbmdzS2V5W10gPQogICAgICJjbGllbnRIaW50SGVhZGVyc0VuYWJsZWQiOwogCiBjbGFzcyBOZXR3b3JrU3lzdGVtOwogLy8gTmV0d29ya01vZHVsZSB3cmFwcyB2YXJpb3VzIG5ldHdvcmtpbmctcmVsYXRlZCBjb21wb25lbnRzIHN1Y2ggYXMKIC8vIGEgVVJMIHJlcXVlc3QgY29udGV4dC4gVGhpcyBpcyBvd25lZCBieSBCcm93c2VyTW9kdWxlLgotY2xhc3MgTmV0d29ya01vZHVsZSB7CitjbGFzcyBOZXR3b3JrTW9kdWxlIDogcHVibGljIGJhc2U6Ok1lc3NhZ2VMb29wOjpEZXN0cnVjdGlvbk9ic2VydmVyIHsKICBwdWJsaWM6CiAgIHN0cnVjdCBPcHRpb25zIHsKICAgICBPcHRpb25zKCkKQEAgLTc2LDYgKzg1LDcgQEAKICAgICBzdGQ6OnN0cmluZyBjdXN0b21fcHJveHk7CiAgICAgU2JUaW1lIG1heF9uZXR3b3JrX2RlbGF5OwogICAgIHBlcnNpc3RlbnRfc3RvcmFnZTo6UGVyc2lzdGVudFNldHRpbmdzKiBwZXJzaXN0ZW50X3NldHRpbmdzOworICAgIHN0b3JhZ2U6OlN0b3JhZ2VNYW5hZ2VyOjpPcHRpb25zIHN0b3JhZ2VfbWFuYWdlcl9vcHRpb25zOwogICB9OwogCiAgIC8vIFNpbXBsZSBjb25zdHJ1Y3RvciBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgYnkgdGVzdHMuCkBAIC04NCw3ICs5NCw2IEBACiAgIC8vIENvbnN0cnVjdG9yIGZvciBwcm9kdWN0aW9uIHVzZS4KICAgTmV0d29ya01vZHVsZShjb25zdCBzdGQ6OnN0cmluZyYgdXNlcl9hZ2VudF9zdHJpbmcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjbGllbnRfaGludF9oZWFkZXJzLAotICAgICAgICAgICAgICAgIHN0b3JhZ2U6OlN0b3JhZ2VNYW5hZ2VyKiBzdG9yYWdlX21hbmFnZXIsCiAgICAgICAgICAgICAgICAgYmFzZTo6RXZlbnREaXNwYXRjaGVyKiBldmVudF9kaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMgPSBPcHRpb25zKCkpOwogICB+TmV0d29ya01vZHVsZSgpOwpAQCAtMTA0LDcgKzExMyw5IEBACiAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2VxdWVuY2VkVGFza1J1bm5lcj4gdGFza19ydW5uZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIHRocmVhZF8tPnRhc2tfcnVubmVyKCk7CiAgIH0KLSAgc3RvcmFnZTo6U3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VfbWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIHN0b3JhZ2VfbWFuYWdlcl87IH0KKyAgc3RvcmFnZTo6U3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VfbWFuYWdlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RvcmFnZV9tYW5hZ2VyXy5nZXQoKTsKKyAgfQogICBuZXR3b3JrX2JyaWRnZTo6Q29va2llSmFyKiBjb29raWVfamFyKCkgY29uc3QgeyByZXR1cm4gY29va2llX2phcl8uZ2V0KCk7IH0KICAgbmV0d29ya19icmlkZ2U6OlBvc3RTZW5kZXIgR2V0UG9zdFNlbmRlcigpIGNvbnN0OwogI2lmIGRlZmluZWQoRElBTF9TRVJWRVIpCkBAIC0xMTYsOSArMTI3LDE1IEBACiAKICAgdm9pZCBTZXRFbmFibGVRdWljKGJvb2wgZW5hYmxlX3F1aWMpOwogCi0gIC8vIEFkZHMgdGhlIENsaWVudCBIaW50IEhlYWRlcnMgdG8gdGhlIHByb3ZpZGVkIFVSTEZldGNoZXIuCi0gIC8vIEl0IGlzIGNvbmRpdGlvbmFsIG9uIGtDbGllbnRIaW50SGVhZGVyc0VuYWJsZWRQZXJzaXN0ZW50U2V0dGluZ3NLZXkgIT0gMC4KLSAgdm9pZCBBZGRDbGllbnRIaW50SGVhZGVycyhuZXQ6OlVSTEZldGNoZXImIHVybF9mZXRjaGVyKSBjb25zdDsKKyAgLy8gQ2hlY2tzIHBlcnNpc3RlbnQgc2V0dGluZ3MgdG8gZGV0ZXJtaW5lIGlmIENsaWVudCBIaW50IEhlYWRlcnMgYXJlIGVuYWJsZWQuCisgIHZvaWQgU2V0RW5hYmxlQ2xpZW50SGludEhlYWRlcnNGbGFnc0Zyb21QZXJzaXN0ZW50U2V0dGluZ3MoKTsKKworICAvLyBBZGRzIHRoZSBDbGllbnQgSGludCBIZWFkZXJzIHRvIHRoZSBwcm92aWRlZCBVUkxGZXRjaGVyIGlmIGVuYWJsZWQuCisgIHZvaWQgQWRkQ2xpZW50SGludEhlYWRlcnMobmV0OjpVUkxGZXRjaGVyJiB1cmxfZmV0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRIaW50SGVhZGVyc0NhbGxUeXBlIGNhbGxfdHlwZSkgY29uc3Q7CisKKyAgLy8gRnJvbSBiYXNlOjpNZXNzYWdlTG9vcDo6RGVzdHJ1Y3Rpb25PYnNlcnZlci4KKyAgdm9pZCBXaWxsRGVzdHJveUN1cnJlbnRNZXNzYWdlTG9vcCgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKICAgdm9pZCBJbml0aWFsaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyX2FnZW50X3N0cmluZywKQEAgLTEyNyw3ICsxNDQsOCBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8bmV0d29ya19icmlkZ2U6Ok5ldFBvc3Rlcj4gQ3JlYXRlTmV0UG9zdGVyKCk7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNsaWVudF9oaW50X2hlYWRlcnNfOwotICBzdG9yYWdlOjpTdG9yYWdlTWFuYWdlciogc3RvcmFnZV9tYW5hZ2VyXzsKKyAgc3RhcmJvYXJkOjphdG9taWNfaW50MzJfdCBlbmFibGVfY2xpZW50X2hpbnRfaGVhZGVyc19mbGFnc187CisgIHN0ZDo6dW5pcXVlX3B0cjxzdG9yYWdlOjpTdG9yYWdlTWFuYWdlcj4gc3RvcmFnZV9tYW5hZ2VyXzsKICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OlRocmVhZD4gdGhyZWFkXzsKICAgc3RkOjp1bmlxdWVfcHRyPFVSTFJlcXVlc3RDb250ZXh0PiB1cmxfcmVxdWVzdF9jb250ZXh0XzsKICAgc2NvcGVkX3JlZnB0cjxVUkxSZXF1ZXN0Q29udGV4dEdldHRlcj4gdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXJfOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3BlcnNpc3RlbnRfc3RvcmFnZS9wZXJzaXN0ZW50X3NldHRpbmdzLmNjIGIvY29iYWx0L3BlcnNpc3RlbnRfc3RvcmFnZS9wZXJzaXN0ZW50X3NldHRpbmdzLmNjCmluZGV4IGM0ZGIzNjguLmNlNjRmOTcgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9wZXJzaXN0ZW50X3N0b3JhZ2UvcGVyc2lzdGVudF9zZXR0aW5ncy5jYworKysgYi9jb2JhbHQvcGVyc2lzdGVudF9zdG9yYWdlL3BlcnNpc3RlbnRfc2V0dGluZ3MuY2MKQEAgLTIzLDE5ICsyMywxNSBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vZmlsZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBwZXJzaXN0ZW50X3N0b3JhZ2UgewogCiBuYW1lc3BhY2UgewotCiAvLyBQcm90ZWN0ZWQgcGVyc2lzdGVudCBzZXR0aW5ncyBrZXkgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcGVyc2lzdGVudAogLy8gc2V0dGluZ3MgZmlsZSBoYXMgYmVlbiB2YWxpZGF0ZWQuCiBjb25zdCBjaGFyIGtWYWxpZGF0ZWRbXSA9ICJ2YWxpZGF0ZWQiOwotCi0vLyBTaWduYWxzIHRoZSBnaXZlbiBXYWl0YWJsZUV2ZW50Lgotdm9pZCBTaWduYWxXYWl0YWJsZUV2ZW50KGJhc2U6OldhaXRhYmxlRXZlbnQqIGV2ZW50KSB7IGV2ZW50LT5TaWduYWwoKTsgfQotCiB9ICAvLyBuYW1lc3BhY2UKIAogdm9pZCBQZXJzaXN0ZW50U2V0dGluZ3M6OldpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wKCkgewpAQCAtNjksMjIgKzY1LDYgQEAKICAgbWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZQZXJzaXN0ZW50U2V0dGluZ3M6OkluaXRpYWxpemVXcml0ZWFibGVQcmVmU3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gIC8vIFJlZ2lzdGVyIGFzIGEgZGVzdHJ1Y3Rpb24gb2JzZXJ2ZXIgdG8gc2h1dCBkb3duIHRoZSBXZWIgQWdlbnQgb25jZSBhbGwKLSAgLy8gcGVuZGluZyB0YXNrcyBoYXZlIGJlZW4gZXhlY3V0ZWQgYW5kIHRoZSBtZXNzYWdlIGxvb3AgaXMgYWJvdXQgdG8gYmUKLSAgLy8gZGVzdHJveWVkLiBUaGlzIGFsbG93cyB1cyB0byBzYWZlbHkgc3RvcCB0aGUgdGhyZWFkLCBkcmFpbiB0aGUgdGFzayBxdWV1ZSwKLSAgLy8gdGhlbiBkZXN0cm95IHRoZSBpbnRlcm5hbCBjb21wb25lbnRzIGJlZm9yZSB0aGUgbWVzc2FnZSBsb29wIGlzIHJlc2V0LgotICAvLyBObyBwb3N0ZWQgdGFza3Mgd2lsbCBiZSBleGVjdXRlZCBvbmNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZC4KLSAgbWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmYmFzZTo6TWVzc2FnZUxvb3A6OkFkZERlc3RydWN0aW9uT2JzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQobWVzc2FnZV9sb29wKCkpLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0KLSAgLy8gVGhpcyB3b3JrcyBhbG1vc3QgbGlrZSBhIFBvc3RCbG9ja2luZ1Rhc2ssIGV4Y2VwdCB0aGF0IGFueSBibG9ja2luZyB0aGF0Ci0gIC8vIG1heSBiZSBuZWNlc3NhcnkgaGFwcGVucyB3aGVuIFN0b3AoKSBpcyBjYWxsZWQgaW5zdGVhZCBvZiByaWdodCBub3cuCi0gIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2lnbmFsV2FpdGFibGVFdmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXN0cnVjdGlvbl9vYnNlcnZlcl9hZGRlZF8pKSk7CiB9CiAKIFBlcnNpc3RlbnRTZXR0aW5nczo6flBlcnNpc3RlbnRTZXR0aW5ncygpIHsKQEAgLTk2LDExICs3NiwxOSBAQAogICAvLyB0aGUgZGVzdHJ1Y3Rpb24gb2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQuCiAgIHdyaXRlYWJsZV9wcmVmX3N0b3JlX2luaXRpYWxpemVkXy5XYWl0KCk7CiAgIGRlc3RydWN0aW9uX29ic2VydmVyX2FkZGVkXy5XYWl0KCk7CisgIC8vIFdhaXQgZm9yIGFsbCBwcmV2aW91c2x5IHBvc3RlZCB0YXNrcyB0byBmaW5pc2guCisgIHRocmVhZF8ubWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPldhaXRGb3JGZW5jZSgpOwogICB0aHJlYWRfLlN0b3AoKTsKIH0KIAogdm9pZCBQZXJzaXN0ZW50U2V0dGluZ3M6OkluaXRpYWxpemVXcml0ZWFibGVQcmVmU3RvcmUoKSB7CiAgIERDSEVDS19FUShiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3AoKSk7CisgIC8vIFJlZ2lzdGVyIGFzIGEgZGVzdHJ1Y3Rpb24gb2JzZXJ2ZXIgdG8gc2h1dCBkb3duIHRoZSB0aHJlYWQgb25jZSBhbGwKKyAgLy8gcGVuZGluZyB0YXNrcyBoYXZlIGJlZW4gZXhlY3V0ZWQgYW5kIHRoZSBtZXNzYWdlIGxvb3AgaXMgYWJvdXQgdG8gYmUKKyAgLy8gZGVzdHJveWVkLiBUaGlzIGFsbG93cyB1cyB0byBzYWZlbHkgc3RvcCB0aGUgdGhyZWFkLCBkcmFpbiB0aGUgdGFzayBxdWV1ZSwKKyAgLy8gdGhlbiBkZXN0cm95IHRoZSBpbnRlcm5hbCBjb21wb25lbnRzIGJlZm9yZSB0aGUgbWVzc2FnZSBsb29wIGlzIHJlc2V0LgorICAvLyBObyBwb3N0ZWQgdGFza3Mgd2lsbCBiZSBleGVjdXRlZCBvbmNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZC4KKyAgYmFzZTo6TWVzc2FnZUxvb3BDdXJyZW50OjpHZXQoKS0+QWRkRGVzdHJ1Y3Rpb25PYnNlcnZlcih0aGlzKTsKICAgewogICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhwcmVmX3N0b3JlX2xvY2tfKTsKICAgICBwcmVmX3N0b3JlXyA9IGJhc2U6Ok1ha2VSZWZDb3VudGVkPEpzb25QcmVmU3RvcmU+KApAQCAtMTE0LDYgKzEwMiw3IEBACiAgIGlmICghdmFsaWRhdGVkX2luaXRpYWxfc2V0dGluZ3NfKSB7CiAgICAgc3RhcmJvYXJkOjpTYkZpbGVEZWxldGVSZWN1cnNpdmUocGVyc2lzdGVudF9zZXR0aW5nc19maWxlXy5jX3N0cigpLCB0cnVlKTsKICAgfQorICBkZXN0cnVjdGlvbl9vYnNlcnZlcl9hZGRlZF8uU2lnbmFsKCk7CiB9CiAKIHZvaWQgUGVyc2lzdGVudFNldHRpbmdzOjpWYWxpZGF0ZVBlcnNpc3RlbnRTZXR0aW5ncygpIHsKZGlmZiAtLWdpdCBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9CVUlMRC5nbiBiL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9CVUlMRC5nbgppbmRleCBiOWUyZDhmLi5jZjUwMmYxIDEwMDY0NAotLS0gYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvQlVJTEQuZ24KKysrIGIvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL0JVSUxELmduCkBAIC0yNiwxNiArMjYsMTIgQEAKICAgICAicGJ1ZmZlcl9yZW5kZXJfdGFyZ2V0LmNjIiwKICAgICAicGJ1ZmZlcl9yZW5kZXJfdGFyZ2V0LmgiLAogICAgICJyZW5kZXJfdGFyZ2V0LmgiLAotICAgICJyZXNvdXJjZV9jb250ZXh0LmNjIiwKLSAgICAicmVzb3VyY2VfY29udGV4dC5oIiwKICAgICAidGV4dHVyZS5jYyIsCiAgICAgInRleHR1cmUuaCIsCiAgICAgInRleHR1cmVfZGF0YS5jYyIsCiAgICAgInRleHR1cmVfZGF0YS5oIiwKICAgICAidGV4dHVyZV9kYXRhX2NwdS5jYyIsCiAgICAgInRleHR1cmVfZGF0YV9jcHUuaCIsCi0gICAgInRleHR1cmVfZGF0YV9wYm8uY2MiLAotICAgICJ0ZXh0dXJlX2RhdGFfcGJvLmgiLAogICAgICJ1dGlscy5jYyIsCiAgICAgInV0aWxzLmgiLAogICBdCmRpZmYgLS1naXQgYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5jYyBiL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmNjCmluZGV4IGQ0NjM4OWQuLmRkYWE1OTcgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmNjCisrKyBiL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmNjCkBAIC0xMiwxMiArMTIsMTIgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuaCIKKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgiCi0KICNpbmNsdWRlICJiYXNlL2RlYnVnL2xlYWtfYW5ub3RhdGlvbnMuaCIKICNpbmNsdWRlICJiYXNlL3RyYWNlX2V2ZW50L3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKQEAgLTUzLDE1ICs1MywxNiBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIEdyYXBoaWNzQ29udGV4dEVHTDo6R3JhcGhpY3NDb250ZXh0RUdMKEdyYXBoaWNzU3lzdGVtKiBwYXJlbnRfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDb250ZXh0KiByZXNvdXJjZV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnKQogICAgIDogR3JhcGhpY3NDb250ZXh0KHBhcmVudF9zeXN0ZW0pLAogICAgICAgZGlzcGxheV8oZGlzcGxheSksCiAgICAgICBjb25maWdfKGNvbmZpZyksCiAgICAgICBpc19jdXJyZW50XyhmYWxzZSkgewogICAvLyBDcmVhdGUgYW4gT3BlbkdMIEVTIDIuMCBjb250ZXh0LgogICBFR0xpbnQgY29udGV4dF9hdHRyaWJfbGlzdFtdID0gewotICAgICAgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FLAorICAgICAgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sCisgICAgICAyLAorICAgICAgRUdMX05PTkUsCiAgIH07CiAgIGNvbnRleHRfID0gRUdMX0NBTExfU0lNUExFKAogICAgICAgZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBjb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYl9saXN0KSk7CmRpZmYgLS1naXQgYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oIGIvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuaAppbmRleCA3YzllN2M2Li5kNzExNmFjIDEwMDY0NAotLS0gYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oCisrKyBiL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVuZGVyX3RhcmdldC5oIgotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dC5oIiAgLy8gbm9nbmNoZWNrCkBAIC0zOCw3ICszNyw3IEBACiBjbGFzcyBHcmFwaGljc0NvbnRleHRFR0wgOiBwdWJsaWMgR3JhcGhpY3NDb250ZXh0IHsKICBwdWJsaWM6CiAgIEdyYXBoaWNzQ29udGV4dEVHTChHcmFwaGljc1N5c3RlbSogcGFyZW50X3N5c3RlbSwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgUmVzb3VyY2VDb250ZXh0KiByZXNvdXJjZV9jb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcpOwogICB+R3JhcGhpY3NDb250ZXh0RUdMKCkgb3ZlcnJpZGU7CiAKICAgR3JhcGhpY3NTeXN0ZW1FR0wqIHN5c3RlbV9lZ2woKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uY2MgYi9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3Nfc3lzdGVtLmNjCmluZGV4IGUyM2NmOWMuLmY0ZWQ3MGEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uY2MKKysrIGIvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5jYwpAQCAtMjAwLDE0ICsyMDAsMTUgQEAKIH0KIAogR3JhcGhpY3NTeXN0ZW1FR0w6On5HcmFwaGljc1N5c3RlbUVHTCgpIHsKLSAgcmVzb3VyY2VfY29udGV4dF8ucmVzZXQoKTsKLQorICBMT0coSU5GTykgPDwgIkdyYXBoaWNzU3lzdGVtRUdMOjp+R3JhcGhpY3NTeXN0ZW1FR0woKSI7CiAgIGlmICh3aW5kb3dfc3VyZmFjZV8gIT0gRUdMX05PX1NVUkZBQ0UpIHsKICAgICBFR0xfQ0FMTF9TSU1QTEUoZWdsRGVzdHJveVN1cmZhY2UoZGlzcGxheV8sIHdpbmRvd19zdXJmYWNlXykpOwogICB9CiAKICAgRUdMX0NBTExfU0lNUExFKGVnbFRlcm1pbmF0ZShkaXNwbGF5XykpOwotICBMT0coSU5GTykgPDwgImVnbFRlcm1pbmF0ZSByZXR1cm5lZCAiIDw8IEVHTF9DQUxMX1NJTVBMRShlZ2xHZXRFcnJvcigpKTsKKyAgRUdMaW50IHJlc3VsdCA9IEVHTF9DQUxMX1NJTVBMRShlZ2xHZXRFcnJvcigpKTsKKyAgaWYgKHJlc3VsdCAhPSBFR0xfU1VDQ0VTUykgTE9HKElORk8pIDw8ICJlZ2xUZXJtaW5hdGUgcmV0dXJuZWQgIiA8PCByZXN1bHQ7CisgIExPRyhJTkZPKSA8PCAiR3JhcGhpY3NTeXN0ZW1FR0w6On5HcmFwaGljc1N5c3RlbUVHTCgpIGRvbmUiOwogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8RGlzcGxheT4gR3JhcGhpY3NTeXN0ZW1FR0w6OkNyZWF0ZURpc3BsYXkoCkBAIC0yMzQsOSArMjM1LDggQEAKICAgLy8gdGhhdCBkYXRhIGZyb20gZ3JhcGhpY3MgY29udGV4dHMgY3JlYXRlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLCB3ZSBtdXN0CiAgIC8vIGVuYWJsZSBzaGFyaW5nIGJldHdlZW4gdGhlbSBhbmQgdGhlIHJlc291cmNlIGNvbnRleHQsIHdoaWNoIGlzIHdoeSB3ZQogICAvLyBtdXN0IHBhc3MgaXQgaW4gaGVyZS4KLSAgUmVzb3VyY2VDb250ZXh0KiByZXNvdXJjZV9jb250ZXh0ID0gTlVMTDsKICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxHcmFwaGljc0NvbnRleHQ+KAotICAgICAgbmV3IEdyYXBoaWNzQ29udGV4dEVHTCh0aGlzLCBkaXNwbGF5XywgY29uZmlnXywgcmVzb3VyY2VfY29udGV4dCkpOworICAgICAgbmV3IEdyYXBoaWNzQ29udGV4dEVHTCh0aGlzLCBkaXNwbGF5XywgY29uZmlnXykpOwogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8VGV4dHVyZURhdGFFR0w+IEdyYXBoaWNzU3lzdGVtRUdMOjpBbGxvY2F0ZVRleHR1cmVEYXRhKApkaWZmIC0tZ2l0IGEvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5oIGIvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5oCmluZGV4IDQ5MjA5MDAuLjA0NDUyMzEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uaAorKysgYi9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3Nfc3lzdGVtLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3Nfc3lzdGVtLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2VnbF9hbmRfZ2xlcy5oIgpAQCAtNjEsMTAgKzYwLDYgQEAKICAgLy8gY2FuIGFjdHVhbGx5IGJlIHVzZWQgdG8gY3JlYXRlIGEgc3VyZmFjZS4gIElmIHN1Y2Nlc3NmdWwsIHdlIHN0b3JlIHRoZQogICAvLyBjcmVhdGVkIHN1cmZhY2UgdG8gYXZvaWQgcmUtY3JlYXRpbmcgaXQgd2hlbiBpdCBpcyBuZWVkZWQgbGF0ZXIuCiAgIEVHTFN1cmZhY2Ugd2luZG93X3N1cmZhY2VfOwotCi0gIC8vIEEgc3BlY2lhbCBncmFwaGljcyBjb250ZXh0IHdoaWNoIGlzIHVzZWQgZXhjbHVzaXZlbHkgZm9yIG1hcHBpbmcvdW5tYXBwaW5nCi0gIC8vIHRleHR1cmUgbWVtb3J5LgotICBiYXNlOjpPcHRpb25hbDxSZXNvdXJjZUNvbnRleHQ+IHJlc291cmNlX2NvbnRleHRfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKZGlmZiAtLWdpdCBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmNjIGIvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTdlNmQuLjAwMDAwMDAKLS0tIGEvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgcmVuZGVyZXIgewotbmFtZXNwYWNlIGJhY2tlbmQgewotCi1SZXNvdXJjZUNvbnRleHQ6OlJlc291cmNlQ29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcpCi0gICAgOiBkaXNwbGF5XyhkaXNwbGF5KSwgY29uZmlnXyhjb25maWcpLCB0aHJlYWRfKCJHTFRleHR1cmVSZXNyYyIpIHsKLSAgY29udGV4dF8gPSBDcmVhdGVHTEVTM0NvbnRleHQoZGlzcGxheSwgY29uZmlnLCBFR0xfTk9fQ09OVEVYVCk7Ci0KLSAgLy8gQ3JlYXRlIGEgZHVtbXkgRUdMU3VyZmFjZSBvYmplY3QgdG8gYmUgYXNzaWduZWQgYXMgdGhlIHRhcmdldCBzdXJmYWNlCi0gIC8vIHdoZW4gd2UgbmVlZCB0byBtYWtlIE9wZW5HTCBjYWxscyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYSBzdXJmYWNlIChlLmcuCi0gIC8vIGNyZWF0aW5nIGEgdGV4dHVyZSkuCi0gIEVHTGludCBudWxsX3N1cmZhY2VfYXR0cmliX2xpc3RbXSA9IHsKLSAgICAgIEVHTF9XSURUSCwgMSwgRUdMX0hFSUdIVCwgMSwgRUdMX05PTkUsCi0gIH07Ci0gIG51bGxfc3VyZmFjZV8gPSBFR0xfQ0FMTF9TSU1QTEUoCi0gICAgICBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShkaXNwbGF5LCBjb25maWcsIG51bGxfc3VyZmFjZV9hdHRyaWJfbGlzdCkpOwotICBDSEVDS19FUShFR0xfU1VDQ0VTUywgRUdMX0NBTExfU0lNUExFKGVnbEdldEVycm9yKCkpKTsKLQotICAvLyBTdGFydCB0aGUgcmVzb3VyY2UgY29udGV4dCB0aHJlYWQgYW5kIGltbWVkaWF0ZWx5IG1ha2UgdGhlIHJlc291cmNlIGNvbnRleHQKLSAgLy8gY3VycmVudCBvbiB0aGF0IHRocmVhZCwgc28gdGhhdCBzdWJzZXF1ZW50IGNhbGxzIHRvCi0gIC8vIFJ1blN5bmNocm9ub3VzbHlXaXRoaW5SZXNvdXJjZUNvbnRleHQoKSBjYW4gYXNzdW1lIGl0IGlzIGN1cnJlbnQgYWxyZWFkeS4KLSAgdGhyZWFkXy5TdGFydCgpOwotICB0aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlJlc291cmNlQ29udGV4dDo6TWFrZUN1cnJlbnQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLX0KLQotUmVzb3VyY2VDb250ZXh0Ojp+UmVzb3VyY2VDb250ZXh0KCkgewotICB0aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmUmVzb3VyY2VDb250ZXh0OjpTaHV0ZG93bk9uUmVzb3VyY2VUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi1uYW1lc3BhY2Ugewotdm9pZCBSdW5BbmRTaWduYWwoY29uc3QgYmFzZTo6Q2xvc3VyZSYgZnVuY3Rpb24sIGJhc2U6OldhaXRhYmxlRXZlbnQqIGV2ZW50KSB7Ci0gIGZ1bmN0aW9uLlJ1bigpOwotICBldmVudC0+U2lnbmFsKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBSZXNvdXJjZUNvbnRleHQ6OlJ1blN5bmNocm9ub3VzbHlXaXRoaW5SZXNvdXJjZUNvbnRleHQoCi0gICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZnVuY3Rpb24pIHsKLSAgRENIRUNLX05FKHRocmVhZF8ubWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpCi0gICAgICA8PCAiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aGluIHRoZSByZXNvdXJjZSBjb250ZXh0IHRocmVhZC4iOwotCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgZXZlbnQoYmFzZTo6V2FpdGFibGVFdmVudDo6UmVzZXRQb2xpY3k6Ok1BTlVBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpXYWl0YWJsZUV2ZW50OjpJbml0aWFsU3RhdGU6Ok5PVF9TSUdOQUxFRCk7Ci0gIHRocmVhZF8ubWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZSdW5BbmRTaWduYWwsIGZ1bmN0aW9uLCAmZXZlbnQpKTsKLSAgZXZlbnQuV2FpdCgpOwotfQotCi12b2lkIFJlc291cmNlQ29udGV4dDo6QXNzZXJ0V2l0aGluUmVzb3VyY2VDb250ZXh0KCkgewotICBEQ0hFQ0tfRVEodGhyZWFkXy5tZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VDb250ZXh0OjpNYWtlQ3VycmVudCgpIHsKLSAgRENIRUNLX0VRKHRocmVhZF8ubWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBFR0xfQ0FMTChlZ2xNYWtlQ3VycmVudChkaXNwbGF5XywgbnVsbF9zdXJmYWNlXywgbnVsbF9zdXJmYWNlXywgY29udGV4dF8pKTsKLX0KLQotdm9pZCBSZXNvdXJjZUNvbnRleHQ6OlNodXRkb3duT25SZXNvdXJjZVRocmVhZCgpIHsKLSAgRUdMX0NBTEwoCi0gICAgICBlZ2xNYWtlQ3VycmVudChkaXNwbGF5XywgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCkpOwotCi0gIEVHTF9DQUxMKGVnbERlc3Ryb3lTdXJmYWNlKGRpc3BsYXlfLCBudWxsX3N1cmZhY2VfKSk7Ci0gIEVHTF9DQUxMKGVnbERlc3Ryb3lDb250ZXh0KGRpc3BsYXlfLCBjb250ZXh0XykpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmFja2VuZAotfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVzb3VyY2VfY29udGV4dC5oIGIvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYzA3My4uMDAwMDAwMAotLS0gYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVzb3VyY2VfY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9SRVNPVVJDRV9DT05URVhUX0hfCi0jZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9SRVNPVVJDRV9DT05URVhUX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvZWdsX2FuZF9nbGVzLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHJlbmRlcmVyIHsKLW5hbWVzcGFjZSBiYWNrZW5kIHsKLQotY2xhc3MgVGV4dHVyZURhdGE7Ci1jbGFzcyBSYXdUZXh0dXJlTWVtb3J5OwotCi0vLyBUaGUgUmVzb3VyY2VDb250ZXh0IGNsYXNzIGVuY2Fwc3VsYXRlcyBhIEdMIGNvbnRleHQgYW5kIGEgcHJpdmF0ZSB0aHJlYWQKLS8vIHVwb24gd2hpY2ggdGhhdCBHTCBjb250ZXh0IGlzIGFsd2F5cyBjdXJyZW50LiAgVGhlIEdMIGNvbnRleHQgaXMgYXNzb2NpYXRlZAotLy8gd2l0aCBhIGR1bW15IHN1cmZhY2UuICBUaGUgR0wgY29udGV4dCB3aWxsIGJlIHNoYXJlZCB3aXRoIGFsbCBvdGhlciBjb250ZXh0cwotLy8gY3JlYXRlZCBieSB0aGUgR3JhcGhpY3NTeXN0ZW0gdGhhdCBvd25zIHRoaXMgUmVzb3VyY2VDb250ZXh0LiAgVGhpcyBjbGFzcwotLy8gaXMgdXNlZnVsIHdoZW4gb25lIHdpc2hlcyB0byBjcmVhdGUgYW5kIGFsbG9jYXRlIHBpeGVsIGJ1ZmZlciBkYXRhIChlLmcuIGZvcgotLy8gYSB0ZXh0dXJlKSBmcm9tIGFueSB0aHJlYWQsIHRoYXQgY2FuIGxhdGVyIGJlIGNvbnZlcnRlZCB0byBhIHRleHR1cmUgZm9yCi0vLyBhIHNwZWNpZmljIGdyYXBoaWNzIGNvbnRleHQuICBSZXNvdXJjZSBtYW5hZ2VtZW50IEdMIG9wZXJhdGlvbnMgY2FuIGJlCi0vLyBwZXJmb3JtZWQgKGZyb20gYW55IHRocmVhZCkgYnkgY2FsbGluZyB0aGUgbWV0aG9kCi0vLyBSdW5TeW5jaHJvbm91c2x5V2l0aGluUmVzb3VyY2VDb250ZXh0KCkgYW5kIHBhc3NpbmcgYSBmdW5jdGlvbiB3aGljaCBvbmUKLS8vIHdpc2hlcyB0byBydW4gdW5kZXIgdGhlIHJlc291cmNlIG1hbmFnZW1lbnQgR0wgY29udGV4dC4KLWNsYXNzIFJlc291cmNlQ29udGV4dCB7Ci0gcHVibGljOgotICBSZXNvdXJjZUNvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnKTsKLSAgflJlc291cmNlQ29udGV4dCgpOwotCi0gIEVHTENvbnRleHQgY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRleHRfOyB9Ci0KLSAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIG9uIHRoZSByZXNvdXJjZSBjb250ZXh0Ci0gIC8vIHRocmVhZCwgdW5kZXIgd2hpY2ggaXQgY2FuIGJlIGFzc3VtZWQgdGhhdCB0aGUgcmVzb3VyY2UgY29udGV4dCBpcwotICAvLyBjdXJyZW50LgotICB2b2lkIFJ1blN5bmNocm9ub3VzbHlXaXRoaW5SZXNvdXJjZUNvbnRleHQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgZnVuY3Rpb24pOwotCi0gIC8vIFdoZW4gY2FsbGVkLCBhc3NlcnRzIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSByZXNvdXJjZSBjb250ZXh0Ci0gIC8vIHRocmVhZCwgd2hpY2ggaXMgdGhlIG9ubHkgdGhyZWFkIHdoaWNoIGhhcyB0aGUgcmVzb3VyY2UgY29udGV4dCBjdXJyZW50LgotICB2b2lkIEFzc2VydFdpdGhpblJlc291cmNlQ29udGV4dCgpOwotCi0gcHJpdmF0ZToKLSAgLy8gQ2FsbGVkIG9uY2UgdXBvbiBjb25zdHJ1Y3Rpb24gb24gdGhlIHJlc291cmNlIGNvbnRleHQgdGhyZWFkLgotICB2b2lkIE1ha2VDdXJyZW50KCk7Ci0KLSAgLy8gUmVsZWFzZXMgdGhlIGN1cnJlbnQgY29udGV4dCBmcm9tIHRoZSByZXNvdXJjZSBjb250ZXh0IHRocmVhZCwgYW5kIHRoZW4KLSAgLy8gZGVzdHJveXMgdGhlIHJlc291cmNlIGNvbnRleHQgKGFuZCBkdW1teSBzdXJmYWNlKS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8KLSAgLy8gYmUgY2FsbGVkIGZyb20gdGhlIGRlc3RydWN0b3IuCi0gIHZvaWQgU2h1dGRvd25PblJlc291cmNlVGhyZWFkKCk7Ci0KLSAgRUdMRGlzcGxheSBkaXNwbGF5XzsKLQotICAvLyBUaGUgRUdML09wZW5HTCBFUyBjb250ZXh0IGhvc3RlZCBieSB0aGlzIEdyYXBoaWNzQ29udGV4dEVHTCBvYmplY3QuCi0gIEVHTENvbnRleHQgY29udGV4dF87Ci0gIEVHTENvbmZpZyBjb25maWdfOwotCi0gIC8vIFNpbmNlIHRoaXMgY29udGV4dCB3aWxsIGJlIHVzZWQgb25seSBmb3IgcmVzb3VyY2UgbWFuYWdlbWVudCwgaXQgd2lsbAotICAvLyBub3QgbmVlZCBhbiBvdXRwdXQgc3VyZmFjZSBhc3NvY2lhdGVkIHdpdGggaXQuICBXZSBjcmVhdGUgYSBkdW1teSBzdXJmYWNlCi0gIC8vIHRvIHNhdGlzZnkgRUdMIHJlcXVpcmVtZW50cy4KLSAgRUdMU3VyZmFjZSBudWxsX3N1cmZhY2VfOwotCi0gIC8vIEEgcHJpdmF0ZSB0aHJlYWQgb24gd2hpY2ggYWxsIHJlc291cmNlIG1hbmFnZW1lbnQgR0wgb3BlcmF0aW9ucyBjYW4gYmUKLSAgLy8gcGVyZm9ybWVkLiAgVGhlIHJlc291cmNlIGNvbnRleHQgd2lsbCBhbHdheXMgYmUgY3VycmVudCBvbiB0aGlzIHRocmVhZC4KLSAgYmFzZTo6VGhyZWFkIHRocmVhZF87Ci0KLSAgZnJpZW5kIGNsYXNzIFNjb3BlZE1ha2VDdXJyZW50OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJhY2tlbmQKLX0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9SRVNPVVJDRV9DT05URVhUX0hfCmRpZmYgLS1naXQgYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5jYyBiL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmNjCmluZGV4IDkwMzkzNzcuLjA4YjFlOTUgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmNjCisrKyBiL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmNjCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2ZyYW1lYnVmZmVyX3JlbmRlcl90YXJnZXQuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9wYnVmZmVyX3JlbmRlcl90YXJnZXQuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVzb3VyY2VfY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGEuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgpkaWZmIC0tZ2l0IGEvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YV9wYm8uY2MgYi9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX3Biby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ODY5Zi4uMDAwMDAwMAotLS0gYS9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX3Biby5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZiBkZWZpbmVkKEdMRVMzX1NVUFBPUlRFRCkKLSNlcnJvciAiU3VwcG9ydCBmb3IgZ2xlczMgZmVhdHVyZXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4iCi0KLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX3Biby5oIgotCi0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlICJiYXNlL2JpbmQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oIgotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSByZW5kZXJlciB7Ci1uYW1lc3BhY2UgYmFja2VuZCB7Ci0KLVRleHR1cmVEYXRhUEJPOjpUZXh0dXJlRGF0YVBCTyhSZXNvdXJjZUNvbnRleHQqIHJlc291cmNlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGZvcm1hdCkKLSAgICA6IHJlc291cmNlX2NvbnRleHRfKHJlc291cmNlX2NvbnRleHQpLAotICAgICAgc2l6ZV8oc2l6ZSksCi0gICAgICBmb3JtYXRfKGZvcm1hdCksCi0gICAgICBtYXBwZWRfZGF0YV8oTlVMTCksCi0gICAgICBlcnJvcl8oZmFsc2UpIHsKLSAgZGF0YV9zaXplXyA9IHN0YXRpY19jYXN0PGludDY0PihHZXRQaXRjaEluQnl0ZXMoKSkgKiBzaXplXy5oZWlnaHQoKTsKLQotICByZXNvdXJjZV9jb250ZXh0Xy0+UnVuU3luY2hyb25vdXNseVdpdGhpblJlc291cmNlQ29udGV4dCgKLSAgICAgIGJhc2U6OkJpbmQoJlRleHR1cmVEYXRhUEJPOjpJbml0QW5kTWFwUEJPLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci19Ci0KLXZvaWQgVGV4dHVyZURhdGFQQk86OkluaXRBbmRNYXBQQk8oKSB7Ci0gIHJlc291cmNlX2NvbnRleHRfLT5Bc3NlcnRXaXRoaW5SZXNvdXJjZUNvbnRleHQoKTsKLQotICAvLyBVc2UgdGhlIHJlc291cmNlIGNvbnRleHQgdG8gYWxsb2NhdGUgYSBHTCBwaXhlbCB1bnBhY2sgYnVmZmVyIHdpdGggdGhlCi0gIC8vIHNwZWNpZmllZCBzaXplLgotICBnbEdlbkJ1ZmZlcnMoMSwgJnBpeGVsX2J1ZmZlcl8pOwotICBpZiAoZ2xHZXRFcnJvcigpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgY3JlYXRpbmcgbmV3IGJ1ZmZlci4iOwotICAgIGVycm9yXyA9IHRydWU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgR0xfQ0FMTChnbEJpbmRCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUiwgcGl4ZWxfYnVmZmVyXykpOwotICBnbEJ1ZmZlckRhdGEoR0xfUElYRUxfVU5QQUNLX0JVRkZFUiwgZGF0YV9zaXplXywgMCwgR0xfU1RBVElDX0RSQVcpOwotICBpZiAoZ2xHZXRFcnJvcigpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgYWxsb2NhdGluZyBQQk8gZGF0YSBmb3IgaW1hZ2UuIjsKLSAgICBlcnJvcl8gPSB0cnVlOwotICAgIEdMX0NBTEwoZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIDApKTsKLSAgICBHTF9DQUxMKGdsRGVsZXRlQnVmZmVycygxLCAmcGl4ZWxfYnVmZmVyXykpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIE1hcCB0aGUgR0wgcGl4ZWwgYnVmZmVyIGRhdGEgdG8gQ1BVIGFkZHJlc3NhYmxlIG1lbW9yeS4gIFdlIHBhc3MgdGhlIGZsYWdzCi0gIC8vIE1BUF9JTlZBTElEQVRFX0JVRkZFUl9CSVQgfCBNQVBfVU5TWU5DSFJPTklaRURfQklUIHRvIHRlbGwgR0wgdGhhdCBpdAotICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHByZXZpb3VzIGRhdGEgaW4gdGhlIGJ1ZmZlciBhbmQgaXQgc2hvdWxkbid0IHRyeSB0bwotICAvLyBzeW5jaHJvbml6ZSBleGlzdGluZyBkcmF3IGNhbGxzIHdpdGggaXQsIGJvdGggdGhpbmdzIHdoaWNoIHNob3VsZCBiZQotICAvLyBpbXBsaWVkIGFueXdheXMgc2luY2UgdGhpcyBpcyBhIGJyYW5kIG5ldyBidWZmZXIsIGJ1dCB3ZSBzcGVjaWZ5IGp1c3QgaW4KLSAgLy8gY2FzZS4KLSAgbWFwcGVkX2RhdGFfID0gc3RhdGljX2Nhc3Q8R0x1Ynl0ZSo+KAotICAgICAgZ2xNYXBCdWZmZXJSYW5nZShHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwLCBkYXRhX3NpemVfLAotICAgICAgICAgICAgICAgICAgICAgICBHTF9NQVBfV1JJVEVfQklUIHwgR0xfTUFQX0lOVkFMSURBVEVfQlVGRkVSX0JJVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9NQVBfVU5TWU5DSFJPTklaRURfQklUKSk7Ci0gIGlmIChnbEdldEVycm9yKCkgIT0gR0xfTk9fRVJST1IgfHwgIW1hcHBlZF9kYXRhXykgewotICAgIExPRyhFUlJPUikgPDwgIkVycm9yIG1hcHBpbmcgUEJPIGJ1ZmZlciBkYXRhLiI7Ci0gICAgZXJyb3JfID0gdHJ1ZTsKLSAgICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwKSk7Ci0gICAgR0xfQ0FMTChnbERlbGV0ZUJ1ZmZlcnMoMSwgJnBpeGVsX2J1ZmZlcl8pKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwKSk7Ci19Ci0KLVRleHR1cmVEYXRhUEJPOjp+VGV4dHVyZURhdGFQQk8oKSB7Ci0gIC8vIG1hcHBlZF9kYXRhXyB3aWxsIGJlIG5vbi1udWxsIGlmIENvbnZlcnRUb1RleHR1cmUoKSB3YXMgbmV2ZXIgY2FsbGVkLgotICBpZiAobWFwcGVkX2RhdGFfKSB7Ci0gICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBzdGlsbCBoYXZlIHZhbGlkIG1hcHBlZF9kYXRhXywgd2UgbXVzdCByZWxlYXNlIGl0LAotICAgIC8vIGFuZCB3ZSBkbyBzbyBvbiB0aGUgcmVzb3VyY2UgY29udGV4dC4KLSAgICByZXNvdXJjZV9jb250ZXh0Xy0+UnVuU3luY2hyb25vdXNseVdpdGhpblJlc291cmNlQ29udGV4dCgKLSAgICAgICAgYmFzZTo6QmluZCgmVGV4dHVyZURhdGFQQk86OlVubWFwQW5kRGVsZXRlUEJPLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLX0KLQotdm9pZCBUZXh0dXJlRGF0YVBCTzo6VW5tYXBBbmREZWxldGVQQk8oKSB7Ci0gIHJlc291cmNlX2NvbnRleHRfLT5Bc3NlcnRXaXRoaW5SZXNvdXJjZUNvbnRleHQoKTsKLQotICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCBwaXhlbF9idWZmZXJfKSk7Ci0gIEdMX0NBTEwoZ2xVbm1hcEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSKSk7Ci0gIEdMX0NBTEwoZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIDApKTsKLSAgR0xfQ0FMTChnbERlbGV0ZUJ1ZmZlcnMoMSwgJnBpeGVsX2J1ZmZlcl8pKTsKLX0KLQotR0x1aW50IFRleHR1cmVEYXRhUEJPOjpDb252ZXJ0VG9UZXh0dXJlKEdyYXBoaWNzQ29udGV4dEVHTCogZ3JhcGhpY3NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJncmFfc3VwcG9ydGVkKSB7Ci0gIERDSEVDSyhtYXBwZWRfZGF0YV8pIDw8ICJDb252ZXJ0VG9UZXh0dXJlKCkgc2hvdWxkIG9ubHkgZXZlciBiZSBjYWxsZWQgb25jZS4iOwotCi0gIC8vIFNpbmNlIHdlIHdpc2ggdG8gY3JlYXRlIGEgdGV4dHVyZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBncmFwaGljcyBjb250ZXh0LAotICAvLyB3ZSBkbyB0aGUgdGV4dHVyZSBjcmVhdGlvbiB3b3JrIHVzaW5nIHRoYXQgY29udGV4dC4KLSAgR3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudCBzY29wZWRfbWFrZV9jdXJyZW50KGdyYXBoaWNzX2NvbnRleHQpOwotCi0gIC8vIE91ciB0ZXh0dXJlIGRhdGEgcmVtYWlucyBtYXBwZWQgdW50aWwgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzbyB3ZSBiZWdpbgotICAvLyBieSB1bm1hcHBpbmcgaXQuCi0gIEdMX0NBTEwoZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIHBpeGVsX2J1ZmZlcl8pKTsKLSAgR0xfQ0FMTChnbFVubWFwQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIpKTsKLQotICAvLyBTZXR1cCBvdXIgdGV4dHVyZS4KLSAgR0x1aW50IHRleHR1cmVfaGFuZGxlOwotICBHTF9DQUxMKGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmVfaGFuZGxlKSk7Ci0gIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlX2hhbmRsZSkpOwotICBTZXR1cEluaXRpYWxUZXh0dXJlUGFyYW1ldGVycygpOwotCi0gIC8vIERldGVybWluZSB0aGUgdGV4dHVyZSdzIEdMIGZvcm1hdC4KLSAgaWYgKGZvcm1hdF8gPT0gR0xfQkdSQV9FWFQpIHsKLSAgICBEQ0hFQ0soYmdyYV9zdXBwb3J0ZWQpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSB0ZXh0dXJlLiAgU2luY2UgYSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSIGlzIGN1cnJlbnRseSBib3VuZCwKLSAgLy8gdGhlICJkYXRhIiBmaWVsZCBwYXNzZWQgdG8gZ2xUZXhJbWFnZTJEIHdpbGwgcmVmZXIgdG8gYW4gb2Zmc2V0IGludG8gdGhhdAotICAvLyBidWZmZXIuCi0gIEdMX0NBTEwoZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfUk9XX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldFBpdGNoSW5CeXRlcygpIC8gQnl0ZXNQZXJQaXhlbEZvckdMRm9ybWF0KGZvcm1hdF8pKSk7Ci0gIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBmb3JtYXRfLCBzaXplXy53aWR0aCgpLCBzaXplXy5oZWlnaHQoKSwgMCwKLSAgICAgICAgICAgICAgIGZvcm1hdF8sIEdMX1VOU0lHTkVEX0JZVEUsIDApOwotICBpZiAoZ2xHZXRFcnJvcigpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgY2FsbGluZyBnbFRleEltYWdlMkQoc2l6ZSA9ICgiIDw8IHNpemVfLndpZHRoKCkgPDwgIiwgIgotICAgICAgICAgICAgICAgPDwgc2l6ZV8uaGVpZ2h0KCkgPDwgIikpIjsKLSAgICBHTF9DQUxMKGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmVfaGFuZGxlKSk7Ci0gICAgLy8gMCBpcyBjb25zaWRlcmVkIGJ5IEdMIHRvIGJlIGFuIGludmFsaWQgaGFuZGxlLgotICAgIHRleHR1cmVfaGFuZGxlID0gMDsKLSAgfQotCi0gIEdMX0NBTEwoZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgMCkpOwotICBHTF9DQUxMKGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCkpOwotICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwKSk7Ci0KLSAgLy8gVGhlIGJ1ZmZlciBpcyBub3cgcmVmZXJlbmNlZCBieSB0aGUgdGV4dHVyZSwgYW5kIHdlIG5vIGxvbmdlciBuZWVkIHRvCi0gIC8vIGV4cGxpY2l0bHkgcmVmZXJlbmNlIGl0LgotICBHTF9DQUxMKGdsRGVsZXRlQnVmZmVycygxLCAmcGl4ZWxfYnVmZmVyXykpOwotICBtYXBwZWRfZGF0YV8gPSBOVUxMOwotCi0gIHJldHVybiB0ZXh0dXJlX2hhbmRsZTsKLX0KLQotYm9vbCBUZXh0dXJlRGF0YVBCTzo6Q3JlYXRpb25FcnJvcigpIHsgcmV0dXJuIGVycm9yXzsgfQotCi1SYXdUZXh0dXJlTWVtb3J5UEJPOjpSYXdUZXh0dXJlTWVtb3J5UEJPKFJlc291cmNlQ29udGV4dCogcmVzb3VyY2VfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaW5fYnl0ZXMsIHNpemVfdCBhbGlnbm1lbnQpCi0gICAgOiBzaXplX2luX2J5dGVzXyhzaXplX2luX2J5dGVzKSwKLSAgICAgIGFsaWdubWVudF8oYWxpZ25tZW50KSwKLSAgICAgIHJlc291cmNlX2NvbnRleHRfKHJlc291cmNlX2NvbnRleHQpIHsKLSAgcmVzb3VyY2VfY29udGV4dF8tPlJ1blN5bmNocm9ub3VzbHlXaXRoaW5SZXNvdXJjZUNvbnRleHQoCi0gICAgICBiYXNlOjpCaW5kKCZSYXdUZXh0dXJlTWVtb3J5UEJPOjpJbml0QW5kTWFwUEJPLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci19Ci0KLXZvaWQgUmF3VGV4dHVyZU1lbW9yeVBCTzo6SW5pdEFuZE1hcFBCTygpIHsKLSAgcmVzb3VyY2VfY29udGV4dF8tPkFzc2VydFdpdGhpblJlc291cmNlQ29udGV4dCgpOwotCi0gIGludCBzaXplX3RvX2FsbG9jYXRlID0gc2l6ZV9pbl9ieXRlc18gKyBhbGlnbm1lbnRfOwotCi0gIC8vIEFsbG9jYXRlIGEgR0wgcGl4ZWwgdW5wYWNrIGJ1ZmZlciB3aXRoIHRoZSBzcGVjaWZpZWQgc2l6ZSwgbGVhdmluZyBlbm91Z2gKLSAgLy8gcm9vbSBzdWNoIHRoYXQgd2UgY2FuIGFkanVzdCBmb3IgYWxpZ25tZW50LgotICBHTF9DQUxMKGdsR2VuQnVmZmVycygxLCAmcGl4ZWxfYnVmZmVyXykpOwotICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCBwaXhlbF9idWZmZXJfKSk7Ci0gIEdMX0NBTEwoZ2xCdWZmZXJEYXRhKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIHNpemVfdG9fYWxsb2NhdGUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIEdMX1NUQVRJQ19EUkFXKSk7Ci0KLSAgLy8gTWFwIHRoZSBHTCBwaXhlbCBidWZmZXIgZGF0YSB0byBDUFUgYWRkcmVzc2FibGUgbWVtb3J5LiAgV2UgcGFzcyB0aGUgZmxhZ3MKLSAgLy8gTUFQX0lOVkFMSURBVEVfQlVGRkVSX0JJVCB8IE1BUF9VTlNZTkNIUk9OSVpFRF9CSVQgdG8gdGVsbCBHTCB0aGF0IGl0Ci0gIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgcHJldmlvdXMgZGF0YSBpbiB0aGUgYnVmZmVyIGFuZCBpdCBzaG91bGRuJ3QgdHJ5IHRvCi0gIC8vIHN5bmNocm9uaXplIGV4aXN0aW5nIGRyYXcgY2FsbHMgd2l0aCBpdCwgYm90aCB0aGluZ3Mgd2hpY2ggc2hvdWxkIGJlCi0gIC8vIGltcGxpZWQgYW55d2F5cyBzaW5jZSB0aGlzIGlzIGEgYnJhbmQgbmV3IGJ1ZmZlciwgYnV0IHdlIHNwZWNpZnkganVzdCBpbgotICAvLyBjYXNlLgotICBtYXBwZWRfZGF0YV8gPSBzdGF0aWNfY2FzdDxHTHVieXRlKj4oCi0gICAgICBnbE1hcEJ1ZmZlclJhbmdlKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIDAsIHNpemVfdG9fYWxsb2NhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEdMX01BUF9XUklURV9CSVQgfCBHTF9NQVBfSU5WQUxJREFURV9CVUZGRVJfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX01BUF9VTlNZTkNIUk9OSVpFRF9CSVQpKTsKLSAgRENIRUNLX0VRKEdMX05PX0VSUk9SLCBnbEdldEVycm9yKCkpOwotICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwKSk7Ci0KLSAgLy8gRmluYWxseSwgZGV0ZXJtaW5lIHRoZSBvZmZzZXQgd2l0aGluIHxtYXBwZWRfZGF0YV98IG5lY2Vzc2FyeSB0byBhY2hpZXZlCi0gIC8vIHRoZSBkZXNpcmVkIGFsaWdubWVudC4KLSAgaW50cHRyX3QgYWxpZ25tZW50X3JlbWFpbmRlciA9Ci0gICAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4obWFwcGVkX2RhdGFfKSAlIGFsaWdubWVudF87Ci0gIGFsaWdubWVudF9vZmZzZXRfID0KLSAgICAgIGFsaWdubWVudF9yZW1haW5kZXIgPT0gMCA/IDAgOiBhbGlnbm1lbnRfIC0gYWxpZ25tZW50X3JlbWFpbmRlcjsKLX0KLQotUmF3VGV4dHVyZU1lbW9yeVBCTzo6flJhd1RleHR1cmVNZW1vcnlQQk8oKSB7Ci0gIHJlc291cmNlX2NvbnRleHRfLT5SdW5TeW5jaHJvbm91c2x5V2l0aGluUmVzb3VyY2VDb250ZXh0KAotICAgICAgYmFzZTo6QmluZCgmUmF3VGV4dHVyZU1lbW9yeVBCTzo6RGVzdHJveVBCTywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi12b2lkIFJhd1RleHR1cmVNZW1vcnlQQk86OkRlc3Ryb3lQQk8oKSB7Ci0gIHJlc291cmNlX2NvbnRleHRfLT5Bc3NlcnRXaXRoaW5SZXNvdXJjZUNvbnRleHQoKTsKLQotICBpZiAobWFwcGVkX2RhdGFfKSB7Ci0gICAgLy8gbWFwcGVkX2RhdGFfIHdpbGwgYmUgbm9uLW51bGwgaWYgd2UgbmV2ZXIgY2FsbCBNYWtlQ29uc3QoKSBvbiBpdCwgaW4KLSAgICAvLyB3aGljaCBjYXNlIHdlIHNob3VsZCB1bm1hcCBpdCBiZWZvcmUgY29udGludWluZy4KLSAgICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCBwaXhlbF9idWZmZXJfKSk7Ci0gICAgR0xfQ0FMTChnbFVubWFwQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIpKTsKLSAgICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwKSk7Ci0KLSAgICBtYXBwZWRfZGF0YV8gPSBOVUxMOwotICB9Ci0KLSAgLy8gQ2xlYXIgb3VyIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIGJ1ZmZlci4KLSAgR0xfQ0FMTChnbERlbGV0ZUJ1ZmZlcnMoMSwgJnBpeGVsX2J1ZmZlcl8pKTsKLX0KLQotdm9pZCBSYXdUZXh0dXJlTWVtb3J5UEJPOjpNYWtlQ29uc3QoKSB7Ci0gIERDSEVDSyhtYXBwZWRfZGF0YV8pIDw8ICJNYWtlQ29uc3QoKSBzaG91bGQgb25seSBldmVyIGJlIGNhbGxlZCBvbmNlLiI7Ci0KLSAgcmVzb3VyY2VfY29udGV4dF8tPlJ1blN5bmNocm9ub3VzbHlXaXRoaW5SZXNvdXJjZUNvbnRleHQoCi0gICAgICBiYXNlOjpCaW5kKCZSYXdUZXh0dXJlTWVtb3J5UEJPOjpVbm1hcFBCTywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi12b2lkIFJhd1RleHR1cmVNZW1vcnlQQk86OlVubWFwUEJPKCkgewotICByZXNvdXJjZV9jb250ZXh0Xy0+QXNzZXJ0V2l0aGluUmVzb3VyY2VDb250ZXh0KCk7Ci0KLSAgR0xfQ0FMTChnbEJpbmRCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUiwgcGl4ZWxfYnVmZmVyXykpOwotICBHTF9DQUxMKGdsVW5tYXBCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUikpOwotICBHTF9DQUxMKGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCAwKSk7Ci0KLSAgbWFwcGVkX2RhdGFfID0gTlVMTDsKLX0KLQotR0x1aW50IFJhd1RleHR1cmVNZW1vcnlQQk86OkNyZWF0ZVRleHR1cmUoR3JhcGhpY3NDb250ZXh0RUdMKiBncmFwaGljc19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmdyYV9zdXBwb3J0ZWQpIGNvbnN0IHsKLSAgRENIRUNLKCFtYXBwZWRfZGF0YV8pCi0gICAgICA8PCAiTWFrZUNvbnN0KCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBDcmVhdGVUZXh0dXJlKCkuIjsKLQotICBHTHVpbnQgdGV4dHVyZV9oYW5kbGU7Ci0KLSAgLy8gU2luY2Ugd2Ugd2lzaCB0byBjcmVhdGUgYSB0ZXh0dXJlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGdyYXBoaWNzIGNvbnRleHQsCi0gIC8vIHdlIGRvIHRoZSB0ZXh0dXJlIGNyZWF0aW9uIHdvcmsgdXNpbmcgdGhhdCBjb250ZXh0LgotICBHcmFwaGljc0NvbnRleHRFR0w6OlNjb3BlZE1ha2VDdXJyZW50IHNjb3BlZF9tYWtlX2N1cnJlbnQoZ3JhcGhpY3NfY29udGV4dCk7Ci0KLSAgLy8gT3VyIHRleHR1cmUgZGF0YSByZW1haW5zIG1hcHBlZCB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvIHdlIGJlZ2luCi0gIC8vIGJ5IHVubWFwcGluZyBpdC4KLSAgR0xfQ0FMTChnbEJpbmRCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUiwgcGl4ZWxfYnVmZmVyXykpOwotCi0gIC8vIFNldHVwIG91ciB0ZXh0dXJlLgotICBHTF9DQUxMKGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmVfaGFuZGxlKSk7Ci0gIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlX2hhbmRsZSkpOwotICBTZXR1cEluaXRpYWxUZXh0dXJlUGFyYW1ldGVycygpOwotCi0gIC8vIERldGVybWluZSB0aGUgdGV4dHVyZSdzIEdMIGZvcm1hdC4KLSAgaWYgKGZvcm1hdCA9PSBHTF9CR1JBX0VYVCkgewotICAgIERDSEVDSyhiZ3JhX3N1cHBvcnRlZCk7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIHRleHR1cmUuICBTaW5jZSBhIEdMX1BJWEVMX1VOUEFDS19CVUZGRVIgaXMgY3VycmVudGx5IGJvdW5kLAotICAvLyB0aGUgImRhdGEiIGZpZWxkIHBhc3NlZCB0byBnbFRleEltYWdlMkQgd2lsbCByZWZlciB0byBhbiBvZmZzZXQgaW50byB0aGF0Ci0gIC8vIGJ1ZmZlci4KLSAgR0xfQ0FMTChnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19ST1dfTEVOR1RILAotICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfaW5fYnl0ZXMgLyBCeXRlc1BlclBpeGVsRm9yR0xGb3JtYXQoZm9ybWF0KSkpOwotICBHTF9DQUxMKAotICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGZvcm1hdCwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCAwLAotICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgR0xfVU5TSUdORURfQllURSwKLSAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihhbGlnbm1lbnRfb2Zmc2V0XyArIG9mZnNldCkpKTsKLSAgR0xfQ0FMTChnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19ST1dfTEVOR1RILCAwKSk7Ci0gIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKSk7Ci0gIEdMX0NBTEwoZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIDApKTsKLQotICByZXR1cm4gdGV4dHVyZV9oYW5kbGU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCi19ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBkZWZpbmVkKEdMRVMzX1NVUFBPUlRFRCkKZGlmZiAtLWdpdCBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmggYi9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX3Biby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg2Zjg4Li4wMDAwMDAwCi0tLSBhL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9URVhUVVJFX0RBVEFfUEJPX0hfCi0jZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9URVhUVVJFX0RBVEFfUEJPX0hfCi0KLSNpZiBkZWZpbmVkKEdMRVMzX1NVUFBPUlRFRCkKLSNlcnJvciAiU3VwcG9ydCBmb3IgZ2xlczMgZmVhdHVyZXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4iCi0KLSNpbmNsdWRlIDxHTEVTMy9nbDMuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHJlbmRlcmVyIHsKLW5hbWVzcGFjZSBiYWNrZW5kIHsKLQotLy8gVGV4dHVyZURhdGFQQk9zIG1ha2UgdXNlIG9mIEdMRVMgMy4wIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJzIHRvIGFsbG9jYXRlCi0vLyBwaXhlbCBtZW1vcnkgdGhyb3VnaCB0aGUgR0xFUyBBUEksIGdpdmluZyB0aGUgZHJpdmVyIHRoZSBvcHBvcnR1bml0eSB0bwotLy8gcmV0dXJuIHRvIHVzIEdQVSBtZW1vcnkgKHRob3VnaCBpdCBtdXN0IGJlIGFsc28gYWNjZXNzaWJsZSB2aWEgdGhlIENQVSkuCi0vLyBUaGlzIGFsbG93cyB1cyB0byByZWR1Y2UgdGV4dHVyZSB1cGxvYWRpbmcgd2hlbiBpc3N1aW5nIGdsVGV4SW1hZ2UyZCBjYWxscy4KLWNsYXNzIFRleHR1cmVEYXRhUEJPIDogcHVibGljIFRleHR1cmVEYXRhRUdMIHsKLSBwdWJsaWM6Ci0gIFRleHR1cmVEYXRhUEJPKFJlc291cmNlQ29udGV4dCogcmVzb3VyY2VfY29udGV4dCwgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCk7Ci0gIHZpcnR1YWwgflRleHR1cmVEYXRhUEJPKCk7Ci0KLSAgY29uc3QgbWF0aDo6U2l6ZSYgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHNpemVfOyB9Ci0gIEdMZW51bSBHZXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmb3JtYXRfOyB9Ci0KLSAgaW50IEdldFBpdGNoSW5CeXRlcygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc2l6ZV8ud2lkdGgoKSAqIEJ5dGVzUGVyUGl4ZWxGb3JHTEZvcm1hdChmb3JtYXRfKTsKLSAgfQotCi0gIHVpbnQ4X3QqIEdldE1lbW9yeSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1hcHBlZF9kYXRhXzsgfQotCi0gIEdMdWludCBDb252ZXJ0VG9UZXh0dXJlKEdyYXBoaWNzQ29udGV4dEVHTCogZ3JhcGhpY3NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZ3JhX3N1cHBvcnRlZCk7Ci0KLSAgYm9vbCBDcmVhdGlvbkVycm9yKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICAvLyBQcml2YXRlIG1ldGhvZHMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gcnVuIG9ubHkgb24gdGhlIHJlc291cmNlIGNvbnRleHQKLSAgLy8gdGhyZWFkLgotICB2b2lkIEluaXRBbmRNYXBQQk8oKTsKLSAgdm9pZCBVbm1hcEFuZERlbGV0ZVBCTygpOwotCi0gIFJlc291cmNlQ29udGV4dCogcmVzb3VyY2VfY29udGV4dF87Ci0gIG1hdGg6OlNpemUgc2l6ZV87Ci0gIEdMZW51bSBmb3JtYXRfOwotICBHTHVpbnQgcGl4ZWxfYnVmZmVyXzsKLSAgaW50NjQgZGF0YV9zaXplXzsKLSAgR0x1Ynl0ZSogbWFwcGVkX2RhdGFfOwotICBib29sIGVycm9yXzsKLX07Ci0KLS8vIFNpbWlsYXIgdG8gVGV4dHVyZURhdGFQQk8sIGJ1dCB0aGlzIGFsbG93cyBhIGJpdCBtb3JlIGZsZXhpYmlsaXR5IGFuZCBsZXNzCi0vLyBzdHJ1Y3R1cmUgaW4gdGhlIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCwgdGhvdWdoIGl0IHN0aWxsIGlzIGFsbG9jYXRlZCBhcwotLy8gcGl4ZWwgYnVmZmVyIGRhdGEgKHVzaW5nIEdMX1BJWEVMX1VOUEFDS19CVUZGRVIpLgotY2xhc3MgUmF3VGV4dHVyZU1lbW9yeVBCTyA6IHB1YmxpYyBSYXdUZXh0dXJlTWVtb3J5RUdMIHsKLSBwdWJsaWM6Ci0gIFJhd1RleHR1cmVNZW1vcnlQQk8oUmVzb3VyY2VDb250ZXh0KiByZXNvdXJjZV9jb250ZXh0LCBzaXplX3Qgc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50KTsKLSAgdmlydHVhbCB+UmF3VGV4dHVyZU1lbW9yeVBCTygpOwotCi0gIC8vIFJldHVybnMgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSB0ZXh0dXJlIG1lbW9yeS4KLSAgc2l6ZV90IEdldFNpemVJbkJ5dGVzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gc2l6ZV9pbl9ieXRlc187IH0KLQotICAvLyBSZXR1cm5zIGEgQ1BVLWFjY2Vzc2libGUgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KLSAgdWludDhfdCogR2V0TWVtb3J5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbWFwcGVkX2RhdGFfICsgYWxpZ25tZW50X29mZnNldF87IH0KLQotICBHTHVpbnQgQ3JlYXRlVGV4dHVyZShHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsIGludHB0cl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2luX2J5dGVzLCBib29sIGJncmFfc3VwcG9ydGVkKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBNYWtlQ29uc3QoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIFByaXZhdGUgbWV0aG9kcyB0aGF0IGFyZSBpbnRlbmRlZCB0byBydW4gb25seSBvbiB0aGUgcmVzb3VyY2UgY29udGV4dAotICAvLyB0aHJlYWQuCi0gIHZvaWQgSW5pdEFuZE1hcFBCTygpOwotICB2b2lkIERlc3Ryb3lQQk8oKTsKLSAgdm9pZCBVbm1hcFBCTygpOwotCi0gIHNpemVfdCBzaXplX2luX2J5dGVzXzsKLSAgc2l6ZV90IGFsaWdubWVudF87Ci0gIFJlc291cmNlQ29udGV4dCogcmVzb3VyY2VfY29udGV4dF87Ci0gIEdMdWludCBwaXhlbF9idWZmZXJfOwotICBHTHVieXRlKiBtYXBwZWRfZGF0YV87Ci0KLSAgLy8gVGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hcHBlZCBtZW1vcnkgbmVjZXNzYXJ5IHRvIGFjaGlldmUKLSAgLy8gdGhlIGRlc2lyZWQgYWxpZ25tZW50LgotICBpbnRwdHJfdCBhbGlnbm1lbnRfb2Zmc2V0XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCi19ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBkZWZpbmVkKEdMRVMzX1NVUFBPUlRFRCkKLQotI2VuZGlmICAvLyBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfVEVYVFVSRV9EQVRBX1BCT19IXwpkaWZmIC0tZ2l0IGEvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9tZXNoLmNjIGIvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9tZXNoLmNjCmluZGV4IDIxNWNiY2UuLjI5ZDRiZDggMTAwNjQ0Ci0tLSBhL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfbWVzaC5jYworKysgYi9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX21lc2guY2MKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogCmRpZmYgLS1naXQgYS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX21lc2guaCBiL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfbWVzaC5oCmluZGV4IDVhYTA3NjUuLjJjYTk2MDUgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfbWVzaC5oCisrKyBiL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfbWVzaC5oCkBAIC0xOCw4ICsxOCwxMCBAQAogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX0hBUkRXQVJFX01FU0hfSF8KIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImJhc2Uvc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS92ZXJ0ZXhfYnVmZmVyX29iamVjdC5oIgpAQCAtNTgsOSArNjAsOSBAQAogICBjb25zdCByZW5kZXJfdHJlZTo6TWVzaDo6RHJhd01vZGUgR2V0RHJhd01vZGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIGRyYXdfbW9kZV8gPT0gR0xfVFJJQU5HTEVfRkFOCiAgICAgICAgICAgICAgICA/IHJlbmRlcl90cmVlOjpNZXNoOjpEcmF3TW9kZTo6a0RyYXdNb2RlVHJpYW5nbGVGYW4KLSAgICAgICAgICAgICAgIDogZHJhd19tb2RlXyA9PSBHTF9UUklBTkdMRV9TVFJJUAotICAgICAgICAgICAgICAgICAgICAgPyByZW5kZXJfdHJlZTo6TWVzaDo6RHJhd01vZGU6OmtEcmF3TW9kZVRyaWFuZ2xlU3RyaXAKLSAgICAgICAgICAgICAgICAgICAgIDogcmVuZGVyX3RyZWU6Ok1lc2g6OkRyYXdNb2RlOjprRHJhd01vZGVUcmlhbmdsZXM7CisgICAgICAgICAgIDogZHJhd19tb2RlXyA9PSBHTF9UUklBTkdMRV9TVFJJUAorICAgICAgICAgICAgICAgPyByZW5kZXJfdHJlZTo6TWVzaDo6RHJhd01vZGU6OmtEcmF3TW9kZVRyaWFuZ2xlU3RyaXAKKyAgICAgICAgICAgICAgIDogcmVuZGVyX3RyZWU6Ok1lc2g6OkRyYXdNb2RlOjprRHJhd01vZGVUcmlhbmdsZXM7CiAgIH0KIAogICAvLyBPYnRhaW5zIGEgdmVydGV4IGJ1ZmZlciBvYmplY3QgZnJvbSB0aGlzIG1lc2guIENhbGxlZCByaWdodCBiZWZvcmUgZmlyc3QKZGlmZiAtLWdpdCBhL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19nbG9iYWxfZW52aXJvbm1lbnQuY2MgYi9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCmluZGV4IDJhNTZhNGQuLmMzZGY1MGMgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19nbG9iYWxfZW52aXJvbm1lbnQuY2MKKysrIGIvY29iYWx0L3NjcmlwdC92OGMvdjhjX2dsb2JhbF9lbnZpcm9ubWVudC5jYwpAQCAtNDAsOCArNDAsMzAgQEAKIAogbmFtZXNwYWNlIHsKIAotc3RkOjpzdHJpbmcgRXhjZXB0aW9uVG9TdHJpbmcodjg6Oklzb2xhdGUqIGlzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6VHJ5Q2F0Y2gmIHRyeV9jYXRjaCkgeworc3RkOjpzdHJpbmcgVG9TdHJpbmdPck51bGwodjg6Oklzb2xhdGUqIGlzb2xhdGUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlKSB7CisgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgIXZhbHVlLT5Jc1N0cmluZygpKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHJldHVybiAqdjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGUsIHZhbHVlLkFzPHY4OjpTdHJpbmc+KCkpOworfQorCit1aW50MzJfdCBDcmVhdGVKYXZhU2NyaXB0Q2FjaGVLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGphdmFzY3JpcHRfZW5naW5lX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FjaGVkX2RhdGFfdmVyc2lvbl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3JpZ2luKSB7CisgIHVpbnQzMl90IHJlcyA9IHN0YXJib2FyZDo6TXVybXVySGFzaDJfMzIoamF2YXNjcmlwdF9lbmdpbmVfdmVyc2lvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFzY3JpcHRfZW5naW5lX3ZlcnNpb24uc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZF9kYXRhX3ZlcnNpb25fdGFnKTsKKyAgcmVzID0gc3RhcmJvYXJkOjpNdXJtdXJIYXNoMl8zMihzb3VyY2UuY19zdHIoKSwgc291cmNlLnNpemUoKSwgcmVzKTsKKyAgcmVzID0gc3RhcmJvYXJkOjpNdXJtdXJIYXNoMl8zMihvcmlnaW4uY19zdHIoKSwgb3JpZ2luLnNpemUoKSwgcmVzKTsKKyAgcmV0dXJuIHJlczsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjpzdHJpbmcgVjhjR2xvYmFsRW52aXJvbm1lbnQ6OkV4Y2VwdGlvblRvU3RyaW5nKAorICAgIHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCB2ODo6VHJ5Q2F0Y2gmIHRyeV9jYXRjaCkgewogICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwogICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXhjZXB0aW9uKGlzb2xhdGUsIHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CiAgIHY4OjpMb2NhbDx2ODo6TWVzc2FnZT4gbWVzc2FnZSh0cnlfY2F0Y2guTWVzc2FnZSgpKTsKQEAgLTY1LDI3ICs4Nyw2IEBACiAgIHJldHVybiBzdHJpbmc7CiB9CiAKLXN0ZDo6c3RyaW5nIFRvU3RyaW5nT3JOdWxsKHY4OjpJc29sYXRlKiBpc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSkgewotICBpZiAodmFsdWUuSXNFbXB0eSgpIHx8ICF2YWx1ZS0+SXNTdHJpbmcoKSkgewotICAgIHJldHVybiAiIjsKLSAgfQotICByZXR1cm4gKnY4OjpTdHJpbmc6OlV0ZjhWYWx1ZShpc29sYXRlLCB2YWx1ZS5Bczx2ODo6U3RyaW5nPigpKTsKLX0KLQotdWludDMyX3QgQ3JlYXRlSmF2YVNjcmlwdENhY2hlS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBqYXZhc2NyaXB0X2VuZ2luZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhY2hlZF9kYXRhX3ZlcnNpb25fdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9yaWdpbikgewotICB1aW50MzJfdCByZXMgPSBzdGFyYm9hcmQ6Ok11cm11ckhhc2gyXzMyKGphdmFzY3JpcHRfZW5naW5lX3ZlcnNpb24uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0X2VuZ2luZV92ZXJzaW9uLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRfZGF0YV92ZXJzaW9uX3RhZyk7Ci0gIHJlcyA9IHN0YXJib2FyZDo6TXVybXVySGFzaDJfMzIoc291cmNlLmNfc3RyKCksIHNvdXJjZS5zaXplKCksIHJlcyk7Ci0gIHJlcyA9IHN0YXJib2FyZDo6TXVybXVySGFzaDJfMzIob3JpZ2luLmNfc3RyKCksIG9yaWdpbi5zaXplKCksIHJlcyk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCiBWOGNHbG9iYWxFbnZpcm9ubWVudDo6VjhjR2xvYmFsRW52aXJvbm1lbnQodjg6Oklzb2xhdGUqIGlzb2xhdGUpCiAgICAgOiBpc29sYXRlXyhpc29sYXRlKSwKICAgICAgIGRlc3RydWN0aW9uX2hlbHBlcl8oaXNvbGF0ZSksCmRpZmYgLS1naXQgYS9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfZ2xvYmFsX2Vudmlyb25tZW50LmggYi9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfZ2xvYmFsX2Vudmlyb25tZW50LmgKaW5kZXggYmE5ZTA2My4uMjY1YzJlMSAxMDA2NDQKLS0tIGEvY29iYWx0L3NjcmlwdC92OGMvdjhjX2dsb2JhbF9lbnZpcm9ubWVudC5oCisrKyBiL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19nbG9iYWxfZW52aXJvbm1lbnQuaApAQCAtNTMsNiArNTMsOSBAQAogICAgICAgICBpc29sYXRlLT5HZXREYXRhKGtJc29sYXRlRGF0YUluZGV4KSk7CiAgIH0KIAorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXhjZXB0aW9uVG9TdHJpbmcodjg6Oklzb2xhdGUqIGlzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6VHJ5Q2F0Y2gmIHRyeV9jYXRjaCk7CisKICAgZXhwbGljaXQgVjhjR2xvYmFsRW52aXJvbm1lbnQodjg6Oklzb2xhdGUqIGlzb2xhdGUpOwogICB+VjhjR2xvYmFsRW52aXJvbm1lbnQoKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvY29iYWx0L3NjcmlwdC92OGMvdjhjX3ZhbHVlX2hhbmRsZS5jYyBiL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y192YWx1ZV9oYW5kbGUuY2MKaW5kZXggZDk1ZDY1My4uOTNiZDM3NiAxMDA2NDQKLS0tIGEvY29iYWx0L3NjcmlwdC92OGMvdjhjX3ZhbHVlX2hhbmRsZS5jYworKysgYi9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfdmFsdWVfaGFuZGxlLmNjCkBAIC0xMiwxNCArMTIsMTQgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92OGMvdjhjX3ZhbHVlX2hhbmRsZS5oIgorCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92OGMvdjhjX3ZhbHVlX2hhbmRsZS5oIgotCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy9lbnRyeV9zY29wZS5oIgpAQCAtMTIyLDM5ICsxMjIsODQgQEAKICAgcmV0dXJuIHY4X3ZhbHVlX2hhbmRsZV9ob2xkZXItPnY4X3ZhbHVlKCk7CiB9CiAKLVZhbHVlSGFuZGxlSG9sZGVyKiBEZXNlcmlhbGl6ZVNjcmlwdFZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUJ1ZmZlciYgZGF0YV9idWZmZXIpIHsKK1N0cnVjdHVyZWRDbG9uZTo6U3RydWN0dXJlZENsb25lKGNvbnN0IFZhbHVlSGFuZGxlSG9sZGVyJiB2YWx1ZSkgeworICBkZXNlcmlhbGl6ZV9mYWlsZWRfID0gZmFsc2U7CisgIGlzb2xhdGVfID0gR2V0SXNvbGF0ZSh2YWx1ZSk7CisgIHY4Yzo6RW50cnlTY29wZSBlbnRyeV9zY29wZShpc29sYXRlXyk7CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHY4X3ZhbHVlID0gR2V0VjhWYWx1ZSh2YWx1ZSk7CisgIHY4OjpWYWx1ZVNlcmlhbGl6ZXIgc2VyaWFsaXplcihpc29sYXRlXywgdGhpcyk7CisgIGJvb2wgd3JvdGVfdmFsdWU7CisgIGlmICghc2VyaWFsaXplci5Xcml0ZVZhbHVlKGlzb2xhdGVfLT5HZXRDdXJyZW50Q29udGV4dCgpLCB2OF92YWx1ZSkKKyAgICAgICAgICAgLlRvKCZ3cm90ZV92YWx1ZSkgfHwKKyAgICAgICF3cm90ZV92YWx1ZSkgeworICAgIHNlcmlhbGl6ZV9mYWlsZWRfID0gdHJ1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjpwYWlyPHVpbnQ4X3QqLCBzaXplX3Q+IHBhaXIgPSBzZXJpYWxpemVyLlJlbGVhc2UoKTsKKyAgZGF0YV9idWZmZXJfID0KKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RGF0YUJ1ZmZlcj4oc3RkOjptb3ZlKHBhaXIuZmlyc3QpLCBwYWlyLnNlY29uZCk7CisgIHNlcmlhbGl6ZV9mYWlsZWRfID0gZmFsc2U7Cit9CisKK0hhbmRsZTxWYWx1ZUhhbmRsZT4gU3RydWN0dXJlZENsb25lOjpEZXNlcmlhbGl6ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkgeworICBpZiAoIWRlc2VyaWFsaXplZF8uSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplZF87CisgIH0KKyAgaWYgKGZhaWxlZCgpKSB7CisgICAgcmV0dXJuIEhhbmRsZTxWYWx1ZUhhbmRsZT4oKTsKKyAgfQorICBEQ0hFQ0soaXNvbGF0ZSk7CisgIERDSEVDSyhkYXRhX2J1ZmZlcl8pOworICBpZiAoIWRhdGFfYnVmZmVyXyB8fCAhaXNvbGF0ZSkgeworICAgIHJldHVybiBIYW5kbGU8VmFsdWVIYW5kbGU+KCk7CisgIH0KICAgdjg6OkVzY2FwYWJsZUhhbmRsZVNjb3BlIHNjb3BlKGlzb2xhdGUpOwogICB2ODo6VHJ5Q2F0Y2ggdHJ5X2NhdGNoKGlzb2xhdGUpOwogICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCi0gIHY4OjpWYWx1ZURlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIoaXNvbGF0ZSwgZGF0YV9idWZmZXIucHRyLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYnVmZmVyLnNpemUpOworICB2ODo6VmFsdWVEZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyKGlzb2xhdGUsIGRhdGFfYnVmZmVyXy0+cHRyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYnVmZmVyXy0+c2l6ZSwgdGhpcyk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlOwogICBpZiAoIWRlc2VyaWFsaXplci5SZWFkVmFsdWUoY29udGV4dCkuVG9Mb2NhbCgmdmFsdWUpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7CisgICAgTE9HKFdBUk5JTkcpIDw8IHY4Yzo6VjhjR2xvYmFsRW52aXJvbm1lbnQ6OkV4Y2VwdGlvblRvU3RyaW5nKGlzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jYXRjaCk7CisgICAgZGVzZXJpYWxpemVfZmFpbGVkXyA9IHRydWU7CisgICAgcmV0dXJuIEhhbmRsZTxWYWx1ZUhhbmRsZT4oKTsKICAgfQotICBzY3JpcHQ6OnY4Yzo6VjhjRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGlzb2xhdGUpOwotICBhdXRvKiBob2xkZXIgPSBuZXcgc2NyaXB0Ojp2OGM6OlY4Y1ZhbHVlSGFuZGxlSG9sZGVyKCk7Ci0gIEZyb21KU1ZhbHVlKGlzb2xhdGUsIHNjb3BlLkVzY2FwZSh2YWx1ZSksIHNjcmlwdDo6djhjOjprTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsIGhvbGRlcik7Ci0gIHJldHVybiBob2xkZXI7CisgIGRhdGFfYnVmZmVyXy5yZXNldCgpOworICBiYWNraW5nX3N0b3Jlc18uY2xlYXIoKTsKKyAgdjhjOjpWOGNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoaXNvbGF0ZSk7CisgIGF1dG8qIGRlc2VyaWFsaXplZCA9IG5ldyB2OGM6OlY4Y1ZhbHVlSGFuZGxlSG9sZGVyKCk7CisgIEZyb21KU1ZhbHVlKGlzb2xhdGUsIHNjb3BlLkVzY2FwZSh2YWx1ZSksIHY4Yzo6a05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCBkZXNlcmlhbGl6ZWQpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGRlc2VyaWFsaXplX2ZhaWxlZF8gPSB0cnVlOworICAgIHJldHVybiBIYW5kbGU8VmFsdWVIYW5kbGU+KCk7CisgIH0KKyAgZGVzZXJpYWxpemVkXyA9IEhhbmRsZTxWYWx1ZUhhbmRsZT4oZGVzZXJpYWxpemVkKTsKKyAgcmV0dXJuIGRlc2VyaWFsaXplZF87CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxEYXRhQnVmZmVyPiBTZXJpYWxpemVTY3JpcHRWYWx1ZSgKLSAgICBjb25zdCBWYWx1ZUhhbmRsZUhvbGRlciYgdmFsdWUpIHsKLSAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKHZhbHVlKTsKLSAgc2NyaXB0Ojp2OGM6OkVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZSk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHY4X3ZhbHVlID0gR2V0VjhWYWx1ZSh2YWx1ZSk7Ci0gIHY4OjpWYWx1ZVNlcmlhbGl6ZXIgc2VyaWFsaXplcihpc29sYXRlKTsKLSAgYm9vbCB3cm90ZV92YWx1ZTsKLSAgaWYgKCFzZXJpYWxpemVyLldyaXRlVmFsdWUoaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwgdjhfdmFsdWUpCi0gICAgICAgICAgIC5Ubygmd3JvdGVfdmFsdWUpIHx8Ci0gICAgICAhd3JvdGVfdmFsdWUpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKK3Y4OjpNYXliZTx1aW50MzJfdD4gU3RydWN0dXJlZENsb25lOjpHZXRTaGFyZWRBcnJheUJ1ZmZlcklkKAorICAgIHY4OjpJc29sYXRlKiBpc29sYXRlLAorICAgIHY4OjpMb2NhbDx2ODo6U2hhcmVkQXJyYXlCdWZmZXI+IHNoYXJlZF9hcnJheV9idWZmZXIpIHsKKyAgYXV0byBiYWNraW5nX3N0b3JlID0gc2hhcmVkX2FycmF5X2J1ZmZlci0+R2V0QmFja2luZ1N0b3JlKCk7CisgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBiYWNraW5nX3N0b3Jlc18uc2l6ZSgpOyArK2luZGV4KSB7CisgICAgaWYgKGJhY2tpbmdfc3RvcmVzX1tpbmRleF0gPT0gYmFja2luZ19zdG9yZSkgeworICAgICAgcmV0dXJuIHY4OjpKdXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICB9CiAgIH0KLSAgc3RkOjpwYWlyPHVpbnQ4X3QqLCBzaXplX3Q+IHBhaXIgPSBzZXJpYWxpemVyLlJlbGVhc2UoKTsKLSAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RGF0YUJ1ZmZlcj4oc3RkOjptb3ZlKHBhaXIuZmlyc3QpLCBwYWlyLnNlY29uZCk7CisgIGJhY2tpbmdfc3RvcmVzXy5wdXNoX2JhY2soYmFja2luZ19zdG9yZSk7CisgIHJldHVybiB2ODo6SnVzdDx1aW50MzJfdD4oYmFja2luZ19zdG9yZXNfLnNpemUoKSAtIDEpOworfQorCit2ODo6TWF5YmVMb2NhbDx2ODo6U2hhcmVkQXJyYXlCdWZmZXI+CitTdHJ1Y3R1cmVkQ2xvbmU6OkdldFNoYXJlZEFycmF5QnVmZmVyRnJvbUlkKHY4OjpJc29sYXRlKiBpc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbG9uZV9pZCkgeworICBpZiAoY2xvbmVfaWQgPCBiYWNraW5nX3N0b3Jlc18uc2l6ZSgpKSB7CisgICAgcmV0dXJuIHY4OjpTaGFyZWRBcnJheUJ1ZmZlcjo6TmV3KGlzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShiYWNraW5nX3N0b3Jlc18uYXQoY2xvbmVfaWQpKSk7CisgIH0KKyAgcmV0dXJuIHY4OjpNYXliZUxvY2FsPHY4OjpTaGFyZWRBcnJheUJ1ZmZlcj4oKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdApkaWZmIC0tZ2l0IGEvY29iYWx0L3NjcmlwdC92YWx1ZV9oYW5kbGUuaCBiL2NvYmFsdC9zY3JpcHQvdmFsdWVfaGFuZGxlLmgKaW5kZXggZjBjOGNjZS4uMWIwZmFmYSAxMDA2NDQKLS0tIGEvY29iYWx0L3NjcmlwdC92YWx1ZV9oYW5kbGUuaAorKysgYi9jb2JhbHQvc2NyaXB0L3ZhbHVlX2hhbmRsZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKQEAgLTM4LDE2ICszOSw0OCBAQAogCiB0eXBlZGVmIFNjcmlwdFZhbHVlPFZhbHVlSGFuZGxlPiBWYWx1ZUhhbmRsZUhvbGRlcjsKIAotc3RydWN0IEJ1ZmZlckRlbGV0ZXIgewotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCogYnVmZmVyKSB7IFNiTWVtb3J5RGVhbGxvY2F0ZShidWZmZXIpOyB9Ci19OwotdXNpbmcgRGF0YUJ1ZmZlclB0ciA9IHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10sIEJ1ZmZlckRlbGV0ZXI+OwogCi1zdHJ1Y3QgRGF0YUJ1ZmZlciB7Ci0gIERhdGFCdWZmZXJQdHIgcHRyOwotICBzaXplX3Qgc2l6ZTsKK2NsYXNzIFN0cnVjdHVyZWRDbG9uZSA6IHB1YmxpYyB2ODo6VmFsdWVTZXJpYWxpemVyOjpEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2ODo6VmFsdWVEZXNlcmlhbGl6ZXI6OkRlbGVnYXRlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFN0cnVjdHVyZWRDbG9uZShjb25zdCBWYWx1ZUhhbmRsZUhvbGRlciYgdmFsdWUpOwogCi0gIERhdGFCdWZmZXIodWludDhfdCogcHRyLCBzaXplX3Qgc2l6ZSkgOiBwdHIoRGF0YUJ1ZmZlclB0cihwdHIpKSwgc2l6ZShzaXplKSB7fQorICAvLyB2ODo6VmFsdWVTZXJpYWxpemVyOjpEZWxlZ2F0ZQorICB2b2lkIFRocm93RGF0YUNsb25lRXJyb3Iodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBpc29sYXRlXy0+VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6RXJyb3IobWVzc2FnZSkpOworICB9CisgIHY4OjpNYXliZTx1aW50MzJfdD4gR2V0U2hhcmVkQXJyYXlCdWZmZXJJZCgKKyAgICAgIHY4OjpJc29sYXRlKiBpc29sYXRlLAorICAgICAgdjg6OkxvY2FsPHY4OjpTaGFyZWRBcnJheUJ1ZmZlcj4gc2hhcmVkX2FycmF5X2J1ZmZlcikgb3ZlcnJpZGU7CisKKyAgLy8gdjg6OlZhbHVlRGVzZXJpYWxpemVyOjpEZWxlZ2F0ZQorICB2ODo6TWF5YmVMb2NhbDx2ODo6U2hhcmVkQXJyYXlCdWZmZXI+IEdldFNoYXJlZEFycmF5QnVmZmVyRnJvbUlkKAorICAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUsIHVpbnQzMl90IGNsb25lX2lkKSBvdmVycmlkZTsKKworICBIYW5kbGU8VmFsdWVIYW5kbGU+IERlc2VyaWFsaXplKHY4OjpJc29sYXRlKiBpc29sYXRlKTsKKworICBib29sIGZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHNlcmlhbGl6ZV9mYWlsZWRfIHx8IGRlc2VyaWFsaXplX2ZhaWxlZF87IH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBCdWZmZXJEZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCogYnVmZmVyKSB7IFNiTWVtb3J5RGVhbGxvY2F0ZShidWZmZXIpOyB9CisgIH07CisgIHVzaW5nIERhdGFCdWZmZXJQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdLCBCdWZmZXJEZWxldGVyPjsKKworICBzdHJ1Y3QgRGF0YUJ1ZmZlciB7CisgICAgRGF0YUJ1ZmZlclB0ciBwdHI7CisgICAgc2l6ZV90IHNpemU7CisKKyAgICBEYXRhQnVmZmVyKHVpbnQ4X3QqIHB0ciwgc2l6ZV90IHNpemUpCisgICAgICAgIDogcHRyKERhdGFCdWZmZXJQdHIocHRyKSksIHNpemUoc2l6ZSkge30KKyAgfTsKKworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZV87CisgIEhhbmRsZTxWYWx1ZUhhbmRsZT4gZGVzZXJpYWxpemVkXzsKKyAgc3RkOjp1bmlxdWVfcHRyPERhdGFCdWZmZXI+IGRhdGFfYnVmZmVyXzsKKyAgYm9vbCBzZXJpYWxpemVfZmFpbGVkXyA9IGZhbHNlOworICBib29sIGRlc2VyaWFsaXplX2ZhaWxlZF8gPSBmYWxzZTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPHY4OjpCYWNraW5nU3RvcmU+PiBiYWNraW5nX3N0b3Jlc187CiB9OwogCiAvLyBDb252ZXJ0cyBhICJzaW1wbGUiIG9iamVjdCB0byBhIG1hcCBvZiB0aGUgb2JqZWN0J3MgcHJvcGVydGllcy4gIlNpbXBsZSIKQEAgLTY0LDEwICs5Nyw2IEBACiAKIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKGNvbnN0IFZhbHVlSGFuZGxlSG9sZGVyJiB2YWx1ZSk7CiB2ODo6TG9jYWw8djg6OlZhbHVlPiBHZXRWOFZhbHVlKGNvbnN0IFZhbHVlSGFuZGxlSG9sZGVyJiB2YWx1ZSk7Ci1WYWx1ZUhhbmRsZUhvbGRlciogRGVzZXJpYWxpemVTY3JpcHRWYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFCdWZmZXImIGRhdGFfYnVmZmVyKTsKLXN0ZDo6dW5pcXVlX3B0cjxEYXRhQnVmZmVyPiBTZXJpYWxpemVTY3JpcHRWYWx1ZSgKLSAgICBjb25zdCBWYWx1ZUhhbmRsZUhvbGRlciYgdmFsdWUpOwogCiB9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0CiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL2N2YWxzLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy9jdmFscy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJmYzdmCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy9jdmFscy5tZApAQCAtMCwwICsxLDQzNyBAQAorLS0tCitsYXlvdXQ6IGRvYwordGl0bGU6ICJDb2JhbHQgQ1ZhbHMiCistLS0KKyMgQ29iYWx0IENWYWxzCisKKyMjIE92ZXJ2aWV3CisKK0NWYWxzIGFyZSBnbG9iYWxseSBhY2Nlc3NpYmxlLCB0aHJlYWQtc2FmZSwga2V5LXZhbHVlIHBhaXJzIHdpdGhpbiBDb2JhbHQsIHdoaWNoCithcmUgcHJpbWFyaWx5IHVzZWQgZm9yIG1vbml0b3Jpbmcgc3RhdGUgYW5kIHRyYWNraW5nIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkuCitFYWNoIENWYWwgaXMgZGVmaW5lZCB3aXRoIGEgdW5pcXVlIGtleSBhbmQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBnbG9iYWwKK0NWYWxNYW5hZ2VyLiBUaGUgQ1ZhbE1hbmFnZXIgY2FuIHN1YnNlcXVlbnRseSBiZSBxdWVyaWVkIGZvciB0aGUgY3VycmVudCB2YWx1ZQorb2YgdGhlIGtleSwgd2hpY2ggaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcuIENWYWxzIGNvbWUgaW4gdHdvIHZhcmlldGllczoKKworKiAgICoqUHVibGljQ1ZhbHMqKiAtIGFjdGl2ZSBpbiBhbGwgYnVpbGRzLgorKiAgICoqRGVidWdDVmFscyoqIC0gb25seSBlbmFibGVkIGluIG5vbi1Hb2xkIGJ1aWxkcy4KKworIyMgVXNhZ2UKKworIyMjIERlYnVnIENvbnNvbGUKKworVGhlIGRlYnVnIGNvbnNvbGUgY2FuIGJlIHRvZ2dsZWQgYmV0d2VlbiB0aHJlZSBtb2RlcyAob2ZmLCBvbiwgYW5kIGh1ZCkgYnkKK3ByZXNzaW5nIEN0cmwtTy4gSXQgZGlzcGxheXMgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHJlZ2lzdGVyZWQgQ1ZhbHMsIHVwZGF0aW5nCit0aGVtIGF0IDYwIEh6LiBUaGUgaW5pdGlhbGx5IGRpc3BsYXllZCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkKK2BERUZBVUxUX0FDVElWRV9TRVRgIGluIGBkZWJ1Z192YWx1ZXMvY29uc29sZV92YWx1ZXMuanNgLiBIb3dldmVyLCB0aGlzIGlzCittb2RpZmlhYmxlIGluIHRoZSBkZWJ1ZyBjb25zb2xlIGh1ZC4KKworVGhlIHJlZ2lzdGVyZWQgQ1ZhbHMgY2FuIGJlIHZpZXdlZCBieSBlbnRlcmluZyBgZGVidWcuY3ZhbExpc3QoKWAgaW50byB0aGUgZGVidWcKK2NvbnNvbGUuIEFkZGl0aW9uYWwgQ1ZhbHMgY2FuIGJlIHJlZ2lzdGVyZWQgdmlhCitgZGVidWcuY3ZhbEFkZChzdWJzdHJpbmdUb01hdGNoKWAgYW5kIGNhbiBiZSByZW1vdmVkIHZpYQorYGRlYnVnLmN2YWxSZW1vdmUoc3Vic3RyaW5nVG9NYXRjaClgLiBUaGUgY3VycmVudCByZWdpc3RlcmVkIGxpc3QgY2FuIGJlIHNhdmVkCithcyBhIG5ldyBzZXQgdmlhIGBkZWJ1Zy5jdmFsU2F2ZShzZXRfa2V5KWAuIEF0IHRoYXQgcG9pbnQsIHRoZSBzYXZlZCBzZXQgY2FuCitsYXRlciBiZSBsb2FkZWQgYXMgdGhlIGFjdGl2ZSBzZXQgdmlhIHRoZSBjb21tYW5kLCBgZGVidWcuY3ZhbExvYWQoc2V0X2tleSlgLgorCitBIGZ1bGwgbGlzdCBvZiB0aGUgY29tbWFuZHMgYXZhaWxhYmxlIHZpYSB0aGUgZGVidWcgY29uc29sZSBpcyBzaG93biBieSBlbnRlcmluZworYGRlYnVnLmhlbHAoKWAuCisKKyMjIyBKYXZhU2NyaXB0CisKK0NWYWxzIGFyZSBleHBvc2VkIHRvIEphdmFTY3JpcHQgdmlhIHRoZSBINXZjY0NWYWwgb2JqZWN0LiBUaGlzIHByb3ZpZGVzIGFuCitpbnRlcmZhY2UgZm9yIHJlcXVlc3RpbmcgYWxsIG9mIHRoZSBrZXlzLCB3aGljaCBhcmUgcmV0dXJuZWQgYXMgYW4gYXJyYXksIGFuZAorZm9yIHJldHJpZXZpbmcgYSBzcGVjaWZpYyBDVmFsIHZhbHVlLCB3aGljaCBpcyByZXR1cm5lZCBhcyBhbiBvcHRpb25hbCBzdHJpbmcsCit2aWEgaXRzIENWYWwga2V5LiBXaGlsZSB0aGUgSDV2Y2NDVmFsIG9iamVjdCBpcyB1c2FibGUgaW4gYW55IGJ1aWxkLCBvbmx5IHB1YmxpYworQ1ZhbHMgYXJlIHF1ZXJ5YWJsZSBpbiBHb2xkIGJ1aWxkcy4KKworSGVyZSBhcmUgZXhhbXBsZXMgb2YgaXRzIHVzYWdlOgorCitgYGAKKyAgPiBoNXZjYy5jVmFsLmtleXMoKQorICA8IEg1dmNjQ1ZhbEtleUxpc3RbMTUxXQorCisgID4gaDV2Y2MuY1ZhbC5rZXlzKCkubGVuZ3RoCisgIDwgMTUxCisKKyAgPiBoNXZjYy5jVmFsLmtleXMoKS5pdGVtKDgpCisgIDwgIkNvdW50Lk1haW5XZWJNb2R1bGUuTGF5b3V0LkJveCIKKworICA+IGg1dmNjLmNWYWwuZ2V0VmFsdWUoIkNvdW50Lk1haW5XZWJNb2R1bGUuTGF5b3V0LkJveCIpCisgIDwgIjQ2MyIKK2BgYAorCisjIyBUcmFja2luZyBDYXRlZ29yaWVzCisKKyMjIyBDb2JhbHQKKworIyMjIyBQdWJsaWNDVmFscworCisqICAgKipDb2JhbHQuTGlmZXRpbWUqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgQ29iYWx0IGhhcyBiZWVuCisgICAgcnVubmluZy4KKworIyMjIyBEZWJ1Z0NWYWxzCisKKyogICAqKkNvYmFsdC5TZXJ2ZXIuRGV2VG9vbHMqKiAtIFRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBEZXZUb29scyBzZXJ2ZXIsCisgICAgaWYgaXQgaXMgcnVubmluZy4KKyogICAqKkNvYmFsdC5TZXJ2ZXIuV2ViRHJpdmVyKiogLSBUaGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgV2ViZHJpdmVyCisgICAgc2VydmVyLCBpZiBpdCBpcyBydW5uaW5nLgorCisjIyMgQ291bnQKKworIyMjIyBQdWJsaWNDVmFscworCisqICAgKipDb3VudC5ET00uRXZlbnRMaXN0ZW5lcnMqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgRXZlbnRMaXN0ZW5lcnMgaW4KKyAgICBleGlzdGVuY2UgZ2xvYmFsbHkuIFRoaXMgaW5jbHVkZXMgb25lcyB0aGF0IGFyZSBwZW5kaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyogICAqKkNvdW50LkRPTS5Ob2RlcyoqIC0gVGhlIHRvdGFsIG51bWJlciBvZiBOb2RlcyBpbiBleGlzdGVuY2UgZ2xvYmFsbHkuIFRoaXMKKyAgICBpbmNsdWRlcyBvbmVzIHRoYXQgYXJlIHBlbmRpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLgorKiAgICoqQ291bnQuTWFpbldlYk1vZHVsZS5ET00uSHRtbEVsZW1lbnQqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgSHRtbEVsZW1lbnRzCisgICAgaW4gdGhlIE1haW5XZWJNb2R1bGUuIFRoaXMgaW5jbHVkZXMgZWxlbWVudHMgdGhhdCBhcmUgbm90IGluIHRoZSBkb2N1bWVudAorICAgIGFuZCBvbmVzIHRoYXQgYXJlIHBlbmRpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLgorKiAgICoqQ291bnQuTWFpbldlYk1vZHVsZS5ET00uSHRtbEVsZW1lbnQuRG9jdW1lbnQqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YKKyAgICBIdG1sRWxlbWVudHMgdGhhdCBhcmUgaW4gdGhlIE1haW5XZWJNb2R1bGXigJlzIGRvY3VtZW50LgorKiAgICoqQ291bnQuTWFpbldlYk1vZHVsZS5ET00uSHRtbFNjcmlwdEVsZW1lbnQuRXhlY3V0ZSoqIC0gVGhlIHRvdGFsIG51bWJlciBvZgorICAgIEh0bWxTY3JpcHRFbGVtZW50IGV4ZWN1dGlvbnMgdGhhdCBoYXZlIHJ1biBzaW5jZSBDb2JhbHQgc3RhcnRlZC4KKyogICAqKkNvdW50Lk1haW5XZWJNb2R1bGUuTGF5b3V0LkJveCoqIC0gVGhlIHRvdGFsIG51bWJlciBvZiBCb3hlcyB0aGF0IGFyZSBpbgorICAgIHRoZSBNYWluV2ViTW9kdWxl4oCZcyBjdXJyZW50IGxheW91dC4KKworIyMjIyBEZWJ1Z0NWYWxzCisKKyogICAqKkNvdW50LkRPTS5BY3RpdmVKYXZhU2NyaXB0RXZlbnRzKiogLSBUaGUgbnVtYmVyIG9mIEphdmFTY3JpcHQgZXZlbnRzIHRoYXQKKyAgICBhcmUgY3VycmVudGx5IHJ1bm5pbmcuCisqICAgKipDb3VudC5ET00uQXR0cnMqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgQXR0cnMgaW4gZXhpc3RlbmNlIGdsb2JhbGx5LiBUaGlzCisgICAgaW5jbHVkZXMgb25lcyB0aGF0IGFyZSBwZW5kaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyogICAqKkNvdW50LkRPTS5TdHJpbmdNYXBzKiogLSBUaGUgdG90YWwgbnVtYmVyIG9mIFN0cmluZ01hcHMgaW4gZXhpc3RlbmNlCisgICAgZ2xvYmFsbHkuIFRoaXMgaW5jbHVkZXMgb25lcyB0aGF0IGFyZSBwZW5kaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyogICAqKkNvdW50LkRPTS5Ub2tlbkxpc3RzKiogLSBUaGUgdG90YWwgbnVtYmVyIG9mIFRva2VuTGlzdHMgaW4gZXhpc3RlbmNlCisgICAgZ2xvYmFsbHkuIFRoaXMgaW5jbHVkZXMgb25lcyB0aGF0IGFyZSBwZW5kaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyogICAqKkNvdW50LkRPTS5IdG1sQ29sbGVjdGlvbnMqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgSHRtbENvbGxlY3Rpb25zIGluCisgICAgZXhpc3RlbmNlIGdsb2JhbGx5LiBUaGlzIGluY2x1ZGVzIG9uZXMgdGhhdCBhcmUgcGVuZGluZyBnYXJiYWdlIGNvbGxlY3Rpb24uCisqICAgKipDb3VudC5ET00uTm9kZUxpc3RzKiogLSBUaGUgdG90YWwgbnVtYmVyIG9mIE5vZGVMaXN0cyBpbiBleGlzdGVuY2UKKyAgICBnbG9iYWxseS4gVGhpcyBpbmNsdWRlcyBvbmVzIHRoYXQgYXJlIHBlbmRpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLgorKiAgICoqQ291bnQuRE9NLk5vZGVNYXBzKiogLSBUaGUgdG90YWwgbnVtYmVyIG9mIE5vZGVNYXBzIGluIGV4aXN0ZW5jZSBnbG9iYWxseS4KKyAgICBUaGlzIGluY2x1ZGVzIG9uZXMgdGhhdCBhcmUgcGVuZGluZyBnYXJiYWdlIGNvbGxlY3Rpb24uCisqICAgKipDb3VudC5NYWluV2ViTW9kdWxlLltSRVNPVVJDRV9DQUNIRV9UWVBFXS5QZW5kaW5nQ2FsbGJhY2tzKiogLSBUaGUgbnVtYmVyCisgICAgb2YgbG9hZGluZyBjb21wbGV0ZWQgcmVzb3VyY2VzIHRoYXQgaGF2ZSBwZW5kaW5nIGNhbGxiYWNrcy4KKyogICAqKkNvdW50Lk1haW5XZWJNb2R1bGUuW1JFU09VUkNFX0NBQ0hFX1RZUEVdLlJlc291cmNlLlJlcXVlc3RlZCoqIC0gVGhlIHRvdGFsCisgICAgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgZXZlciBiZWVuIHJlcXVlc3RlZC4KKyogICAqKkNvdW50Lk1haW5XZWJNb2R1bGUuW1JFU09VUkNFX0NBQ0hFX1RZUEVdLlJlc291cmNlLkxvYWRlZCoqIC0gVGhlIHRvdGFsCisgICAgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgZXZlciBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQuCisqICAgKipDb3VudC5NYWluV2ViTW9kdWxlLltSRVNPVVJDRV9DQUNIRV9UWVBFXS5SZXNvdXJjZS5Mb2FkaW5nKiogLSBUaGUgbnVtYmVyCisgICAgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBsb2FkaW5nLgorKiAgICoqQ291bnQuUmVuZGVyZXIuUmFzdGVyaXplLk5ld1JlbmRlclRyZWUqKiAtIFRoZSB0b3RhbCBudW1iZXIgb2YgbmV3IHJlbmRlcgorICAgIHRyZWVzIHRoYXQgaGF2ZSBiZWVuIHJhc3Rlcml6ZWQuCisqICAgKipDb3VudC5WZXJzaW9uQ29tcGF0aWJpbGl0eVZpb2xhdGlvbioqIC0gVGhlIHRvdGFsIG51bWJlciBvZiBDb2JhbHQgdmVyc2lvbgorICAgIGNvbXBhdGliaWxpdHkgdmlvbGF0aW9ucyBlbmNvdW50ZXJlZC4KKyogICAqKkNvdW50LlhIUioqIC0gVGhlIHRvdGFsIG51bWJlciBvZiB4aHI6OlhNTEh0dHBSZXF1ZXN0IGluIGV4aXN0ZW5jZQorICAgIGdsb2JhbGx5LgorCisjIyMgRXZlbnQKKworVGhlIEV2ZW50IGNhdGVnb3J5IGN1cnJlbnRseSBjb25zaXN0cyBvZiBjb3VudHMgYW5kIGR1cmF0aW9ucyAoaW4gbWljcm9zZWNvbmRzKQorZm9yIGlucHV0IGV2ZW50cywgd2hpY2ggYXJlIHRyYWNrZWQgZnJvbSB3aGVuIHRoZSBldmVudCBpcyBmaXJzdCBpbmplY3RlZCBpbnRvCit0aGUgd2luZG93LCB1bnRpbCBhIHJlbmRlciB0cmVlIGlzIGdlbmVyYXRlZCBmcm9tIGl0LiBFYWNoIGV2ZW50IHR5cGUgaXMgdHJhY2tlZAorc2VwYXJhdGVseTsgY3VycmVudCBldmVudCB0eXBlcyBhcmU6ICpLZXlEb3duKiwgKktleVVwKiwgKlBvaW50ZXJEb3duKiwKKypQb2ludGVyVXAqLgorCisjIyMjIFB1YmxpY0NWYWxzCisKKyogICAqKkV2ZW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLlByb2R1Y2VkUmVuZGVyVHJlZSoqIC0gV2hldGhlciBvciBub3QgdGhlCisgICAgZXZlbnQgcHJvZHVjZWQgYSByZW5kZXIgdHJlZS4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkRPTS5IdG1sRWxlbWVudCoqIC0gVGhlIHRvdGFsCisgICAgbnVtYmVyIG9mIEhUTUwgZWxlbWVudHMgYWZ0ZXIgdGhlIGV2ZW50IHByb2R1Y2VzIGl0cyBmaXJzdCByZW5kZXIgdHJlZS4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkRPTS5IdG1sRWxlbWVudC5DcmVhdGVkKiogLSBUaGUKKyAgICBudW1iZXIgb2YgSFRNTCBlbGVtZW50cyBjcmVhdGVkIGR1cmluZyB0aGUgZXZlbnQuCisqICAgKipFdmVudC5Db3VudC5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5ET00uSHRtbEVsZW1lbnQuRGVzdHJveWVkKiogLSBUaGUKKyAgICBudW1iZXIgb2YgSFRNTCBlbGVtZW50cyBkZXN0cm95ZWQgZHVyaW5nIHRoZSBldmVudC4gTk9URTogVGhpcyBudW1iZXIgd2lsbAorICAgIG9ubHkgYmUgbm9uLXplcm8gaWYgR0Mgb2NjdXJzIGR1cmluZyB0aGUgZXZlbnQuCisqICAgKipFdmVudC5Db3VudC5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5ET00uSHRtbEVsZW1lbnQuRG9jdW1lbnQqKiAtIFRoZQorICAgIG51bWJlciBvZiBIVE1MIGVsZW1lbnRzIGluIHRoZSBkb2N1bWVudCBhZnRlciB0aGUgZXZlbnQgcHJvZHVjZXMgaXRzIGZpcnN0CisgICAgcmVuZGVyIHRyZWUuCisqICAgKipFdmVudC5Db3VudC5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5ET00uSHRtbEVsZW1lbnQuRG9jdW1lbnQuQWRkZWQqKiAtCisgICAgVGhlIG51bWJlciBvZiBIVE1MIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBkdXJpbmcgdGhlIGV2ZW50LgorKiAgICoqRXZlbnQuQ291bnQuTWFpbldlYk1vZHVsZS5bRVZFTlRfVFlQRV0uRE9NLkh0bWxFbGVtZW50LkRvY3VtZW50LlJlbW92ZWQqKiAtCisgICAgVGhlIG51bWJlciBvZiBIVE1MIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgZHVyaW5nIHRoZSBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkRPTS5IdG1sRWxlbWVudC5VcGRhdGVNYXRjaGluZ1J1bGVzKiogLQorICAgIFRoZSBudW1iZXIgb2YgSFRNTCBlbGVtZW50cyB0aGF0IGhhZCB0aGVpciBtYXRjaGluZyBydWxlcyB1cGRhdGVkIGR1cmluZyB0aGUKKyAgICBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkRPTS5IdG1sRWxlbWVudC5VcGRhdGVDb21wdXRlZFN0eWxlKiogLQorICAgIFRoZSBudW1iZXIgb2YgSFRNTCBlbGVtZW50cyB0aGF0IGhhZCB0aGVpciBjb21wdXRlZCBzdHlsZSB1cGRhdGVkIGR1cmluZyB0aGUKKyAgICBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkRPTS5IdG1sRWxlbWVudC5HZW5lcmF0ZUh0bWxFbGVtZW50Q29tcHV0ZWRTdHlsZSoqIC0KKyAgICBUaGUgbnVtYmVyIG9mIEhUTUwgZWxlbWVudHMgdGhhdCBoYWQgdGhlaXIgY29tcHV0ZWQgc3R5bGUgZnVsbHkgZ2VuZXJhdGVkCisgICAgZHVyaW5nIHRoZSBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkRPTS5IdG1sRWxlbWVudC5HZW5lcmF0ZVBzZXVkb0VsZW1lbnRDb21wdXRlZFN0eWxlKiogLQorICAgIFRoZSBudW1iZXIgb2YgcHNldWRvIGVsZW1lbnRzIHRoYXQgaGFkIHRoZWlyIGNvbXB1dGVkIHN0eWxlIGZ1bGx5IGdlbmVyYXRlZAorICAgIGR1cmluZyB0aGUgZXZlbnQuCisqICAgKipFdmVudC5Db3VudC5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5MYXlvdXQuQm94KiogLSBUaGUgdG90YWwgbnVtYmVyIG9mCisgICAgTGF5b3V0IGJveGVzIGFmdGVyIHRoZSBldmVudCBwcm9kdWNlcyBpdHMgZmlyc3QgcmVuZGVyIHRyZWUuCisqICAgKipFdmVudC5Db3VudC5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5MYXlvdXQuQm94LkNyZWF0ZWQqKiAtIFRoZSBudW1iZXIKKyAgICBvZiBMYXlvdXQgYm94ZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkxheW91dC5Cb3guRGVzdHJveWVkKiogLSBUaGUgbnVtYmVyCisgICAgb2YgTGF5b3V0IGJveGVzIHRoYXQgd2VyZSBkZXN0cm95ZWQgZHVyaW5nIHRoZSBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkxheW91dC5Cb3guVXBkYXRlU2l6ZSoqIC0gVGhlCisgICAgbnVtYmVyIG9mIHRpbWVzIFVwZGF0ZVNpemUoKSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkxheW91dC5Cb3guUmVuZGVyQW5kQW5pbWF0ZSoqIC0gVGhlCisgICAgbnVtYmVyIG9mIHRpbWVzIFJlbmRlckFuZEFuaW1hdGUoKSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBldmVudC4KKyogICAqKkV2ZW50LkNvdW50Lk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkxheW91dC5Cb3guVXBkYXRlQ3Jvc3NSZWZlcmVuY2VzKiogLQorICAgIFRoZSBudW1iZXIgb2YgdGltZXMgVXBkYXRlQ3Jvc3NSZWZlcmVuY2VzKCkgaXMgY2FsbGVkIGR1cmluZyB0aGUgZXZlbnQuCisqICAgKipFdmVudC5EdXJhdGlvbi5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXSoqIC0gVGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZQorICAgIGV2ZW50IGZyb20gdGhlIGtleXByZXNzIGJlaW5nIGluamVjdGVkIHVudGlsIHRoZSBmaXJzdCByZW5kZXIgdHJlZSBpcworICAgIHJlbmRlcmVkLiBJZiB0aGUgZXZlbnQgZG9lcyBub3QgdHJpZ2dlciBhIHJlLWxheW91dCwgdGhlbiBpdCBvbmx5IGluY2x1ZGVzCisgICAgdGhlIGV2ZW50IGluamVjdGlvbiB0aW1lLgorKiAgICoqRXZlbnQuRHVyYXRpb24uTWFpbldlYk1vZHVsZS5bRVZFTlRfVFlQRV0uRE9NLkluamVjdEV2ZW50KiogLSBUaGUgdGltZQorICAgIHRha2VuIHRvIGluamVjdCB0aGUgZXZlbnQgaW50byB0aGUgd2luZG93IG9iamVjdC4gVGhpcyBtYWlubHkgY29uc2lzdHMgb2YKKyAgICBKYXZhU2NyaXB0IHRpbWUuCisqICAgKipFdmVudC5EdXJhdGlvbi5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5ET00uUnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MqKiAtCisgICAgVGhlIHRpbWUgdGFrZW4gdG8gcnVuIGFuaW1hdGlvbiBmcmFtZSBjYWxsYmFja3MgZHVyaW5nIHRoZSBldmVudC4gVGhpcworICAgIG1haW5seSBjb25zaXN0cyBvZiBKYXZhU2NyaXB0IHRpbWUuCisqICAgKipFdmVudC5EdXJhdGlvbi5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5ET00uVXBkYXRlQ29tcHV0ZWRTdHlsZSoqIC0gVGhlCisgICAgdGltZSB0YWtlbiB0byB1cGRhdGUgdGhlIGNvbXB1dGVkIHN0eWxlcyBvZiBhbGwgSFRNTCBlbGVtZW50cyAod2hpY2ggYWxzbworICAgIGluY2x1ZGVzIHVwZGF0aW5nIHRoZWlyIG1hdGNoaW5nIHJ1bGVzKS4gVGhpcyB3aWxsIHRyYWNrIGNsb3NlbHkgd2l0aCB0aGUKKyAgICBldmVudCBET00gY291bnRzLgorKiAgICoqRXZlbnQuRHVyYXRpb24uTWFpbldlYk1vZHVsZS5bRVZFTlRfVFlQRV0uTGF5b3V0LkJveFRyZWUqKiAtIFRoZSB0aW1lCisgICAgdGFrZW4gdG8gZnVsbHkgbGF5IG91dCB0aGUgYm94IHRyZWUuCisqICAgKipFdmVudC5EdXJhdGlvbi5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5MYXlvdXQuQm94VHJlZS5Cb3hHZW5lcmF0aW9uKiogLQorICAgIFRoZSB0aW1lIHRha2VuIHRvIGdlbmVyYXRlIHRoZSBib3hlcyB3aXRoaW4gdGhlIGJveCB0cmVlLiBUaGlzIHdpbGwgdHJhY2sKKyAgICBjbG9zZWx5IHdpdGggdGhlIG51bWJlciBvZiBib3hlcyBjcmVhdGVkIGR1cmluZyB0aGUgZXZlbnQuIFRoaXMgaXMgaW5jbHVkZWQKKyAgICB3aXRoaW4gdGhlIEJveFRyZWUgdGltZS4KKyogICAqKkV2ZW50LkR1cmF0aW9uLk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkxheW91dC5Cb3hUcmVlLlVwZGF0ZVVzZWRTaXplcyoqIC0KKyAgICBUaGUgdGltZSB0YWtlbiB0byB1cGRhdGUgdGhlIHNpemVzIG9mIHRoZSBib3hlcyB3aXRoaW4gdGhlIGJveCB0cmVlLCB3aGljaAorICAgIGlzIHdoZW4gYWxsIG9mIHRoZSBib3hlcyBhcmUgbGFpZCBvdXQuIFRoaXMgaXMgaW5jbHVkZWQgd2l0aGluIHRoZSBCb3hUcmVlCisgICAgdGltZS4KKyogICAqKkV2ZW50LkR1cmF0aW9uLk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLkxheW91dC5SZW5kZXJBbmRBbmltYXRlKiogLSBUaGUKKyAgICB0aW1lIHRha2VuIHRvIGdlbmVyYXRlIHRoZSByZW5kZXIgdHJlZSBwcm9kdWNlZCBieSB0aGUgZXZlbnQuCisqICAgKipFdmVudC5EdXJhdGlvbi5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5SZW5kZXJlci5SYXN0ZXJpemUqKiAtIFRoZSB0aW1lCisgICAgdGFrZW4gdG8gcmFzdGVyaXplIHRoZSBldmVudOKAmXMgcmVuZGVyIHRyZWUgYWZ0ZXIgaXQgaXMgc3VibWl0dGVkIHRvIHRoZQorICAgIHJlbmRlcmVyLgorKiAgICoqRXZlbnQuRHVyYXRpb24uTWFpbldlYk1vZHVsZS5ET00uVmlkZW9TdGFydERlbGF5KiogLSBUaGUgZGVsYXkgZnJvbSB0aGUKKyAgICBzdGFydCBvZiB0aGUgZXZlbnQgdW50aWwgdGhlIHN0YXJ0IG9mIGEgdmlkZW8uIE5PVEUxOiBUaGlzIGlzIG5vdCBzZXQgdW50aWwKKyAgICBhZnRlciB0aGUgZXZlbnQgY29tcGxldGVzLCBzbyBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHZhbHVlIGRpY3Rpb25hcnkuCisgICAgTk9URTI6IFRoaXMgaXMgbm90IHRyYWNrZWQgYnkgZXZlbnQgdHlwZSwgc28gZWFjaCBuZXcgZXZlbnQgd2lsbCByZXNldCB0aGlzCisgICAgdmFsdWUuCisqICAgKipFdmVudC5UaW1lLk1haW5XZWJNb2R1bGUuW0VWRU5UX1RZUEVdLlN0YXJ0KiogLSBUaW1lIHdoZW4gdGhlIGV2ZW50CisgICAgc3RhcnRlZC4KKworIyMjIyBEZWJ1Z0NWYWxzCisKKyogICAqKkV2ZW50Lk1haW5XZWJNb2R1bGUuSXNQcm9jZXNzaW5nKiogLSBXaGV0aGVyIG9yIG5vdCBhbiBldmVudCBpcyBjdXJyZW50bHkKKyAgICBiZWluZyBwcm9jZXNzZWQuCisqICAgKipFdmVudC5NYWluV2ViTW9kdWxlLltFVkVOVF9UWVBFXS5WYWx1ZURpY3Rpb25hcnkqKiAtIEFsbCBjb3VudHMgYW5kCisgICAgZHVyYXRpb25zIGZvciB0aGlzIGV2ZW50IGFzIGEgSlNPTiBzdHJpbmcuIFRoaXMgaXMgdXNlZCBieSB0aGUKKyAgICB0dl90ZXN0Y2FzZV9ldmVudF9yZWNvcmRlciB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIENWYWwgcmVxdWVzdHMgaXQgbWFrZXMKKyAgICB0byByZXRyaWV2ZSBhbGwgb2YgdGhlIGRhdGEgZm9yIGFuIGV2ZW50LgorCisjIyMgTWFpbldlYk1vZHVsZQorCisjIyMjIERlYnVnQ1ZhbHMKKworKiAgICoqTWFpbldlYk1vZHVsZS5Jc1JlbmRlclRyZWVSYXN0ZXJpemF0aW9uUGVuZGluZyoqIC0gV2hldGhlciBvciBub3QgYSByZW5kZXIKKyAgICB0cmVlIGhhcyBiZWVuIHByb2R1Y2VkIGJ1dCBub3QgeWV0IHJhc3Rlcml6ZWQuCisqICAgKipNYWluV2ViTW9kdWxlLkxheW91dC5Jc1JlbmRlclRyZWVQZW5kaW5nKiogLSBXaGV0aGVyIG9yIG5vdCB0aGUgbGF5b3V0IGlzCisgICAgc2NoZWR1bGVkIHRvIHByb2R1Y2UgYSBuZXcgcmVuZGVyIHRyZWUuCisKKyMjIyBNZWRpYQorCisjIyMjIFB1YmxpY0NWYWxzCisKK1dlIGhhdmUgdmFyaW91cyBTYlBsYXllciBtZXRyaWNzIGF2YWlsYWJsZSB3aGljaCBuZWVkIHRvIGJlIGVuYWJsZWQgZmlyc3QgdXNpbmc6CitgaDV2Y2Muc2V0dGluZ3Muc2V0KCJNZWRpYS5FbmFibGVNZXRyaWNzIiwgMSlgCisKKyogICAqKk1lZGlhLlNiUGxheWVyQ3JlYXRlVGltZS5NaW5pbXVtKioKKyogICAqKk1lZGlhLlNiUGxheWVyQ3JlYXRlVGltZS5NZWRpYW4qKgorKiAgICoqTWVkaWEuU2JQbGF5ZXJDcmVhdGVUaW1lLk1heGltdW0qKgorKiAgICoqTWVkaWEuU2JQbGF5ZXJEZXN0cnVjdGlvblRpbWUuTWluaW11bSoqCisqICAgKipNZWRpYS5TYlBsYXllckRlc3RydWN0aW9uVGltZS5NZWRpYW4qKgorKiAgICoqTWVkaWEuU2JQbGF5ZXJEZXN0cnVjdGlvblRpbWUuTWF4aW11bSoqCisqICAgKipNZWRpYS5TYlBsYXllcldyaXRlU2FtcGxlc1RpbWUuTWluaW11bSoqCisqICAgKipNZWRpYS5TYlBsYXllcldyaXRlU2FtcGxlc1RpbWUuTWVkaWFuKioKKyogICAqKk1lZGlhLlNiUGxheWVyV3JpdGVTYW1wbGVzVGltZS5NYXhpbXVtKioKKworIyMjIyBEZWJ1Z0NWYWxzCisKK01lZGlhIFBpcGVsaW5lIGV4cG9zZXMgbWFueSBTdGF0ZSB2YWx1ZXMsIGhvd2V2ZXIgd2Ugc3VwcG9ydCBtdWx0aXBsZSBwaXBlbGluZXMKK2F0IG9uY2UsIHNvIHdlIGhhdmUgdG8gcXVlcnkgZm9yIHRoZSBjdXJyZW50IHBpcGVsaW5lIG51bWJlciB0byBhY2Nlc3MgdGhlbS4KK1RoaXMgY2FuIGJlIGRvbmUgd2l0aCBgaDV2Y2MuY1ZhbC5rZXlzKCkuZmlsdGVyKGtleSA9Pgora2V5LnN0YXJ0c1dpdGgoIk1lZGlhLlBpcGVsaW5lLiIpICYmIGtleS5lbmRzV2l0aCgiTWF4VmlkZW9DYXBhYmlsaXRpZXMiKSAmJgoraDV2Y2MuY1ZhbC5nZXRWYWx1ZShrZXkpLmxlbmd0aCA9PT0gMClgIChJZiBhIFBpcGVsaW5lIGhhcyBNYXhWaWRlb0NhcGFiaWxpdGllcywKK2l0IGltcGxpZXMgdGhhdCB0aGUgUGlwZWxpbmUgaXMgYSAxMHggcGxheWVyLCBpLmUuIGEgc2Vjb25kYXJ5IHNtYWxsIHBsYXllciwgc28KK2lmIE1heFZpZGVvQ2FwYWJpbGl0aWVzLmxlbmd0aCBpcyAwLCB0aGVuIGl0IG11c3QgYmUgdGhlIHByaW1hcnkgcGlwZWxpbmUuKQorVGhpcyB3aWxsIGdpdmUgYmFjayBhbiBhbnN3ZXIgbGlrZSBgTWVkaWEuUGlwZWxpbmUuMy5NYXhWaWRlb0NhcGFiaWxpdGllc2Agc28KK3RoZSBtYWluIHBpcGVsaW5lIGluIHRoaXMgZXhhbXBsZSBpcyBgM2AuIFdpdGggdGhlIGN1cnJlbnQgcGlwZWxpbmUgbnVtYmVyIHlvdQorY2FuIHRoZW4gYWNjZXNzIChTd2l0Y2hpbmcgb3V0IHBpcGVsaW5lIGZvciB0aGUgb25lIHJldHVybmVkIGZyb20gcHJldmlvdXMKK3F1ZXJ5KToKKworKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5TdGFydGVkKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuU3VzcGVuZGVkKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuU3RvcHBlZCoqCisqICAgKipNZWRpYS5QaXBlbGluZS4zLkVuZGVkKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuUGxheWVyU3RhdGUqKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5Wb2x1bWUqKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5QbGF5YmFja1JhdGUqKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5EdXJhdGlvbioqCisqICAgKipNZWRpYS5QaXBlbGluZS4zLkxhc3RNZWRpYVRpbWUqKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5NYXhWaWRlb0NhcGFiaWxpdGllcyoqCisqICAgKipNZWRpYS5QaXBlbGluZS4zLlNlZWtUaW1lKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuRmlyc3RXcml0dGVuQXVkaW9UaW1lc3RhbXAqKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5GaXJzdFdyaXR0ZW5WaWRlb1RpbWVzdGFtcCoqCisqICAgKipNZWRpYS5QaXBlbGluZS4zLkxhc3RXcml0dGVuQXVkaW9UaW1lc3RhbXAqKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5MYXN0V3JpdHRlblZpZGVvVGltZXN0YW1wKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuVmlkZW9XaWR0aCoqCisqICAgKipNZWRpYS5QaXBlbGluZS4zLlZpZGVvSGVpZ2h0KioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuSXNBdWRpb0Vvc1dyaXR0ZW4qKgorKiAgICoqTWVkaWEuUGlwZWxpbmUuMy5Jc1ZpZGVvRW9zV3JpdHRlbioqCisqICAgKipNZWRpYS5QaXBlbGluZS4zLlBpcGVsaW5lU3RhdHVzKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuQ3VycmVudENvZGVjKioKKyogICAqKk1lZGlhLlBpcGVsaW5lLjMuRXJyb3JNZXNzYWdlKioKKworIyMjIE1lbW9yeQorCisjIyMjIFB1YmxpY0NWYWxzCisKKyogICAqKk1lbW9yeS5DUFUuRnJlZSoqIC0gVGhlIHRvdGFsIENQVSBtZW1vcnkgKGluIGJ5dGVzKSBwb3RlbnRpYWxseSBhdmFpbGFibGUKKyAgICB0byB0aGlzIGFwcGxpY2F0aW9uIG1pbnVzIHRoZSBhbW91bnQgYmVpbmcgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisqICAgKipNZW1vcnkuQ1BVLlVzZWQqKiAtIFRoZSB0b3RhbCBwaHlzaWNhbCBDUFUgbWVtb3J5IChpbiBieXRlcykgdXNlZCBieSB0aGlzCisgICAgYXBwbGljYXRpb24uCisqICAgKipNZW1vcnkuR1BVLkZyZWUqKiAtIFRoZSB0b3RhbCBHUFUgbWVtb3J5IChpbiBieXRlcykgcG90ZW50aWFsbHkgYXZhaWxhYmxlCisgICAgdG8gdGhpcyBhcHBsaWNhdGlvbiBtaW51cyB0aGUgYW1vdW50IGJlaW5nIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBOT1RFOiBPbgorICAgIG1hbnkgcGxhdGZvcm1zLCBHUFUgbWVtb3J5IGluZm9ybWF0aW9uIGlzIHVuYXZhaWxhYmxlLgorKiAgICoqTWVtb3J5LkdQVS5Vc2VkKiogLSBUaGUgdG90YWwgcGh5c2ljYWwgQ1BVIG1lbW9yeSAoaW4gYnl0ZXMpIHVzZWQgYnkgdGhpcworICAgIGFwcGxpY2F0aW9uLiBOT1RFOiBPbiBtYW55IHBsYXRmb3JtcywgR1BVIG1lbW9yeSBpbmZvcm1hdGlvbiBpcyB1bmF2YWlsYWJsZS4KKyogICAqKk1lbW9yeS5KUyoqIC0gVGhlIHRvdGFsIG1lbW9yeSBiZWluZyB1c2VkIGJ5IEphdmFTY3JpcHQuCisqICAgKipNZW1vcnkuRm9udC5Mb2NhbFR5cGVmYWNlQ2FjaGUuQ2FwYWNpdHkqKiAtIFRoZSBjYXBhY2l0eSBpbiBieXRlcyBvZiB0aGUKKyAgICBmb250IGNhY2hlIGZvciB1c2Ugd2l0aCBsb2NhbCB0eXBlZmFjZXMuIFRoaXMgaXMgYSBoYXJkIGNhcCB0aGF0IGNhbiBuZXZlcgorICAgIGJlIGV4Y2VlZGVkLgorKiAgICoqTWVtb3J5LkZvbnQuTG9jYWxUeXBlZmFjZUNhY2hlLlNpemUqKiAtIFRoZSBjdXJyZW50IHNpemUgaW4gYnl0ZXMgb2YgdGhlCisgICAgZm9udCBjYWNoZSBmb3IgdXNlIHdpdGggbG9jYWwgdHlwZWZhY2VzLgorKiAgICoqTWVtb3J5Lk1haW5XZWJNb2R1bGUuRE9NLkh0bWxTY3JpcHRFbGVtZW50LkV4ZWN1dGUqKiAtIFRoZSB0b3RhbCBzaXplIGluCisgICAgYnl0ZXMgb2YgYWxsIHNjcmlwdHMgZXhlY3V0ZWQgYnkgSHRtbFNjcmlwdEVsZW1lbnRzIHNpbmNlIENvYmFsdCBzdGFydGVkLgorKiAgICoqTWVtb3J5Lk1haW5XZWJNb2R1bGUuW1JFU09VUkNFX0NBQ0hFX1RZUEVdLkNhcGFjaXR5KiogLSBUaGUgY2FwYWNpdHkgaW4KKyAgICBieXRlcyBvZiB0aGUgcmVzb3VyY2UgY2FjaGUgc3BlY2lmaWVkIGJ5IFJFU09VUkNFX0NBQ0hFX1RZUEUuIFdoZW4gdGhlCisgICAgcmVzb3VyY2UgY2FjaGUgZXhjZWVkcyB0aGUgY2FwYWNpdHksIHVudXNlZCByZXNvdXJjZXMgYmVpbmcgcHVyZ2VkIGZyb20gaXQuCisqICAgKipNZW1vcnkuTWFpbldlYk1vZHVsZS5bUkVTT1VSQ0VfQ0FDSEVfVFlQRV0uUmVzb3VyY2UuTG9hZGVkKiogLSBUaGUgdG90YWwKKyAgICBzaXplIGluIGJ5dGVzIG9mIGFsbCByZXNvdXJjZXMgZXZlciBsb2FkZWQgYnkgdGhlIHJlc291cmNlIGNhY2hlIHNwZWNpZmllZAorICAgIGJ5IFJFU09VUkNFX0NBQ0hFX1RZUEUuCisqICAgKipNZW1vcnkuTWFpbldlYk1vZHVsZS5bUkVTT1VSQ0VfQ0FDSEVfVFlQRV0uU2l6ZSoqIC0gVGhlIHRvdGFsIG51bWJlciBvZgorICAgIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSByZXNvdXJjZSBjYWNoZSBzcGVjaWZpZWQgYnkgUkVTT1VSQ0VfQ0FDSEVfVFlQRS4KKworIyMjIyBEZWJ1Z0NWYWxzCisKKyogICAqKk1lbW9yeS5YSFIqKiAtIFRoZSB0b3RhbCBtZW1vcnkgYWxsb2NhdGVkIHRvIHhocjo6WE1MSHR0cFJlcXVlc3Qgb2JqZWN0cy4KKyogICAqKk1lbW9yeS5DYWNoZWRTb2Z0d2FyZVJhc3Rlcml6ZXIuQ2FjaGVVc2FnZSoqIC0gVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5CisgICAgY2FjaGVkIHNvZnR3YXJlLXJhc3Rlcml6ZWQgc3VyZmFjZXMuCisqICAgKipNZW1vcnkuQ2FjaGVkU29mdHdhcmVSYXN0ZXJpemVyLkZyYW1lQ2FjaGVVc2FnZSoqIC0gVG90YWwgbWVtb3J5IG9jY3VwaWVkCisgICAgYnkgY2FjaGUgc29mdHdhcmUtcmFzdGVyaXplciBzdXJmYWNlcyB0aGF0IHdlcmUgcmVmZXJlbmNlZCB0aGlzIGZyYW1lLgorCisjIyMgUmVuZGVyZXIKKworIyMjIyBQdWJsaWNDVmFscworCisqICAgKipSZW5kZXJlci5IYXNBY3RpdmVBbmltYXRpb25zKiogLSBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCByZW5kZXIgdHJlZQorICAgIGhhcyBhbmltYXRpb25zLgorKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkR1cmF0aW9uSW50ZXJ2YWwuXCoqKiAtIFRyYWNrcyB0aGUgZHVyYXRpb24gb2YKKyAgICBpbnRlcnZhbHMgYmV0d2VlbiByYXN0ZXJpemF0aW9uIGNhbGxzIGR1cmluZyBhbGwgYW5pbWF0aW9ucyBhbmQgdXBkYXRlcyBpdHMKKyAgICBzdGF0cyB3aXRoIGEgbmV3IHNldCBvZiBlbnRyaWVzIGV2ZXJ5IDYwIGNhbGxzLiBHaXZlbiB0aGF0IGl0IG9ubHkgdXBkYXRlcworICAgIGV2ZXJ5IDYwIHNhbXBsZXMsIGl0IHR5cGljYWxseSBpbmNsdWRlcyBtdWx0aXBsZSBhbmltYXRpb25zLiBUaGlzIHByb3ZpZGVzCisgICAgYW4gYWNjdXJhdGUgdmlldyBvZiB0aGUgZnJhbWVyYXRlIG92ZXIgdGhvc2Ugc2FtcGxlcyBhbmQgaXMgdGhlIHZhbHVlIHVzZWQKKyAgICB3aXRoIHRoZSBGUFMgb3ZlcmxheS4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuRHVyYXRpb25JbnRlcnZhbC5DbnQqKiAtIFRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzCisgICAgICAgIGluY2x1ZGVkIGluIHRoZSBzdGF0cy4gU2hvdWxkIGFsd2F5cyBiZSA2MC4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuRHVyYXRpb25JbnRlcnZhbC5BdmcqKiAtIFRoZSBhdmVyYWdlIGR1cmF0aW9uIG9mCisgICAgICAgIHRoZSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgYW5pbWF0aW9uIHJhc3Rlcml6YXRpb25zIGluY2x1ZGVkIGluIHRoZSBzZXQuCisgICAgKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkR1cmF0aW9uSW50ZXJ2YWwuTWluKiogLSBUaGUgbWluaW11bSBkdXJhdGlvbiBvZgorICAgICAgICB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5EdXJhdGlvbkludGVydmFsLk1heCoqIC0gVGhlIG1heGltdW0gZHVyYXRpb24gb2YKKyAgICAgICAgdGhlIGludGVydmFscyBiZXR3ZWVuIHRoZSBhbmltYXRpb24gcmFzdGVyaXphdGlvbnMgaW5jbHVkZWQgaW4gdGhlIHNldC4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuRHVyYXRpb25JbnRlcnZhbC5QY3QuMjV0aCoqIC0gVGhlIDI1dGggcGVyY2VudGlsZQorICAgICAgICBkdXJhdGlvbiBvZiB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZAorICAgICAgICBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5EdXJhdGlvbkludGVydmFsLlBjdC41MHRoKiogLSBUaGUgNTB0aCBwZXJjZW50aWxlCisgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgYW5pbWF0aW9uIHJhc3Rlcml6YXRpb25zIGluY2x1ZGVkCisgICAgICAgIGluIHRoZSBzZXQuCisgICAgKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkR1cmF0aW9uSW50ZXJ2YWwuUGN0Ljc1dGgqKiAtIFRoZSA3NXRoIHBlcmNlbnRpbGUKKyAgICAgICAgZHVyYXRpb24gb2YgdGhlIGludGVydmFscyBiZXR3ZWVuIHRoZSBhbmltYXRpb24gcmFzdGVyaXphdGlvbnMgaW5jbHVkZWQKKyAgICAgICAgaW4gdGhlIHNldC4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuRHVyYXRpb25JbnRlcnZhbC5QY3QuOTV0aCoqIC0gVGhlIDk1dGggcGVyY2VudGlsZQorICAgICAgICBkdXJhdGlvbiBvZiB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZAorICAgICAgICBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5EdXJhdGlvbkludGVydmFsLlN0ZCoqIC0gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZgorICAgICAgICB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkFuaW1hdGlvbnNJbnRlcnZhbC5cKioqIC0gVHJhY2tzIHRoZSBkdXJhdGlvbiBvZgorICAgIGludGVydmFscyBiZXR3ZWVuIHJhc3Rlcml6YXRpb24gY2FsbHMgZHVyaW5nIGEgc2luZ2xlIGFuaW1hdGlvbiBhbmQgdXBkYXRlcworICAgIGl0cyBzdGF0cyB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy4gVGhlIHN0YXRzIGluY2x1ZGUgYWxsIG9mIHRoZSBhbmltYXRpb27igJlzCisgICAgcmFzdGVyaXphdGlvbiBpbnRlcnZhbHMuIFRoaXMgcHJvdmlkZXMgYW4gYWNjdXJhdGUgdmlldyBvZiB0aGUgZnJhbWVyYXRlCisgICAgZHVyaW5nIHRoZSBhbmltYXRpb24uCisgICAgKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkFuaW1hdGlvbnNJbnRlcnZhbC5DbnQqKiAtIFRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzCisgICAgICAgIGluY2x1ZGVkIGluIHRoZSBzdGF0cy4gQWNjb3VudHMgZm9yIGFsbCByYXN0ZXJpemF0aW9ucyB0aGF0IG9jY3VycmVkCisgICAgICAgIGR1cmluZyB0aGUgYW5pbWF0aW9uLgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zSW50ZXJ2YWwuQXZnKiogLSBUaGUgYXZlcmFnZSBkdXJhdGlvbiBvZgorICAgICAgICB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zSW50ZXJ2YWwuTWluKiogLSBUaGUgbWluaW11bSBkdXJhdGlvbiBvZgorICAgICAgICB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zSW50ZXJ2YWwuTWF4KiogLSBUaGUgbWF4aW11bSBkdXJhdGlvbiBvZgorICAgICAgICB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zSW50ZXJ2YWwuUGN0LjI1dGgqKiAtIFRoZSAyNXRoIHBlcmNlbnRpbGUKKyAgICAgICAgZHVyYXRpb24gb2YgdGhlIGludGVydmFscyBiZXR3ZWVuIHRoZSBhbmltYXRpb24gcmFzdGVyaXphdGlvbnMgaW5jbHVkZWQKKyAgICAgICAgaW4gdGhlIHNldC4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuQW5pbWF0aW9uc0ludGVydmFsLlBjdC41MHRoKiogLSBUaGUgNTB0aCBwZXJjZW50aWxlCisgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBpbnRlcnZhbHMgYmV0d2VlbiB0aGUgYW5pbWF0aW9uIHJhc3Rlcml6YXRpb25zIGluY2x1ZGVkCisgICAgICAgIGluIHRoZSBzZXQuCisgICAgKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkFuaW1hdGlvbnNJbnRlcnZhbC5QY3QuNzV0aCoqIC0gVGhlIDc1dGggcGVyY2VudGlsZQorICAgICAgICBkdXJhdGlvbiBvZiB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZAorICAgICAgICBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zSW50ZXJ2YWwuUGN0Ljk1dGgqKiAtIFRoZSA5NXRoIHBlcmNlbnRpbGUKKyAgICAgICAgZHVyYXRpb24gb2YgdGhlIGludGVydmFscyBiZXR3ZWVuIHRoZSBhbmltYXRpb24gcmFzdGVyaXphdGlvbnMgaW5jbHVkZWQKKyAgICAgICAgaW4gdGhlIHNldC4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuQW5pbWF0aW9uc0ludGVydmFsLlN0ZCoqIC0gVGhlIHN0YW5kYXJkIGRldmlhdGlvbgorICAgICAgICBvZiB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIGFuaW1hdGlvbiByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgc2V0LgorCisjIyMjIERlYnVnQ1ZhbHMKKworKiAgICoqUmVuZGVyZXIuU3VibWlzc2lvblF1ZXVlU2l6ZSoqIC0gVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgcmVuZGVyZXIKKyAgICBzdWJtaXNzaW9uIHF1ZXVlLiBFYWNoIGl0ZW0gaW4gdGhlIHF1ZXVlIGNvbnRhaW5zIGEgcmVuZGVyIHRyZWUgYW5kCisgICAgYXNzb2NpYXRlZCBhbmltYXRpb25zLgorKiAgICoqUmVuZGVyZXIuVG9TdWJtaXNzaW9uVGltZSoqIC0gVGhlIGN1cnJlbnQgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMKKyAgICBiZXR3ZWVuIHRoZSBsYXlvdXQncyBjbG9jayBhbmQgdGhlIHJlbmRlcmVyJ3MgY2xvY2suCisqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuQW5pbWF0aW9ucy5cKioqIC0gVHJhY2tzIHRoZSBkdXJhdGlvbiBvZiBlYWNoCisgICAgcmFzdGVyaXphdGlvbiBjYWxsIGR1cmluZyBhIHNpbmdsZSBhbmltYXRpb24gYW5kIHVwZGF0ZXMgaXRzIHN0YXRzIHdoZW4gdGhlCisgICAgYW5pbWF0aW9uIGVuZHMuIFRoZSBzdGF0cyBhcmUgZHJhd24gZnJvbSBhbGwgb2YgdGhlIGFuaW1hdGlvbuKAmXMKKyAgICByYXN0ZXJpemF0aW9ucy4gR2l2ZW4gdGhhdCB0aGlzIG9ubHkgdHJhY2tzIHRoZSB0aW1lIHNwZW50IGluIHRoZQorICAgIHJhc3Rlcml6ZXIsIGl0IGRvZXMgbm90IHByb3ZpZGUgYXMgYWNjdXJhdGUgYSBwaWN0dXJlIG9mIHRoZSBmcmFtZXJhdGUgYXMKKyAgICBEdXJhdGlvbkludGVydmFsIGFuZCBBbmltYXRpb25zSW50ZXJ2YWwuCisgICAgKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkFuaW1hdGlvbnMuQ250KiogLSBUaGUgbnVtYmVyIG9mIHJhc3Rlcml6YXRpb24KKyAgICAgICAgZHVyYXRpb25zIGluY2x1ZGVkIGluIHRoZSBzdGF0cy4gQWNjb3VudHMgZm9yIGFsbCByYXN0ZXJpemF0aW9ucyB0aGF0CisgICAgICAgIG9jY3VycmVkIGR1cmluZyB0aGUgYW5pbWF0aW9uLgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLkF2ZyoqIC0gVGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgdGhlCisgICAgICAgIHJhc3Rlcml6YXRpb25zIGluY2x1ZGVkIGluIHRoZSBzZXQuCisgICAgKiAgICoqUmVuZGVyZXIuUmFzdGVyaXplLkFuaW1hdGlvbnMuTWluKiogLSBUaGUgbWluaW11bSBkdXJhdGlvbiBvZiB0aGUKKyAgICAgICAgcmFzdGVyaXphdGlvbnMgaW5jbHVkZWQgaW4gdGhlIHNldC4KKyAgICAqICAgKipSZW5kZXJlci5SYXN0ZXJpemUuQW5pbWF0aW9ucy5NYXgqKiAtIFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIHRoZQorICAgICAgICByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLlBjdC4yNXRoKiogLSBUaGUgMjV0aCBwZXJjZW50aWxlCisgICAgICAgIGR1cmF0aW9uIG9mIHRoZSByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLlBjdC41MHRoKiogLSBUaGUgNTB0aCBwZXJjZW50aWxlCisgICAgICAgIGR1cmF0aW9uIG9mIHRoZSByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLlBjdC43NXRoKiogLSBUaGUgNzV0aCBwZXJjZW50aWxlCisgICAgICAgIGR1cmF0aW9uIG9mIHRoZSByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLlBjdC45NXRoKiogLSBUaGUgOTV0aCBwZXJjZW50aWxlCisgICAgICAgIGR1cmF0aW9uIG9mIHRoZSByYXN0ZXJpemF0aW9ucyBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICogICAqKlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLlN0ZCoqIC0gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUKKyAgICAgICAgcmFzdGVyaXphdGlvbiBkdXJhdGlvbnMgaW5jbHVkZWQgaW4gdGhlIHNldC4KKworIyMjIFRpbWUKKworIyMjIyBQdWJsaWNDVmFscworCisqICAgKipUaW1lLkNvYmFsdC5TdGFydCoqIC0gVGltZSB3aGVuIENvYmFsdCB3YXMgbGF1bmNoZWQuCisqICAgKipUaW1lLkJyb3dzZXIuTmF2aWdhdGUqKiAtIFRpbWUgd2hlbiB0aGUgQnJvd3Nlck1vZHVsZeKAmXMgbGFzdCBOYXZpZ2F0ZQorICAgIG9jY3VycmVkLgorKiAgICoqVGltZS5Ccm93c2VyLk9uTG9hZEV2ZW50KiogLSBUaW1lIHdoZW4gdGhlIEJyb3dzZXJNb2R1bGXigJlzIGxhc3QKKyAgICBPbkxvYWRFdmVudCBvY2N1cnJlZC4KKyogICAqKlRpbWUuTWFpbldlYk1vZHVsZS5ET00uSHRtbFNjcmlwdEVsZW1lbnQuRXhlY3V0ZSoqIC0gVGltZSB3aGVuIGFuCisgICAgSHRtbFNjcmlwdEVsZW1lbnQgd2FzIGxhc3QgZXhlY3V0ZWQuCisqICAgKipUaW1lLlJlbmRlcmVyLlJhc3Rlcml6ZS5BbmltYXRpb25zLlN0YXJ0KiogLSBUaW1lIHdoZW4gdGhlIFJlbmRlcmVyIGxhc3QKKyAgICBzdGFydGVkIHBsYXlpbmcgYW5pbWF0aW9ucy4KKyogICAqKlRpbWUuUmVuZGVyZXIuUmFzdGVyaXplLkFuaW1hdGlvbnMuRW5kKiogLSBUaW1lIHdoZW4gdGhlIFJlbmRlcmVyIGxhc3QKKyAgICBzdG9wcGVkIHBsYXlpbmcgYW5pbWF0aW9ucy4KKyogICAqKlRpbWUuUmVuZGVyZXIuUmFzdGVyaXplLk5ld1JlbmRlclRyZWUqKiAtIFRpbWUgd2hlbiB0aGUgbW9zdCByZWNlbnQgcmVuZGVyCisgICAgdHJlZSB3YXMgZmlyc3QgcmFzdGVyaXplZC4KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvZ2VuL2NvYmFsdC9kb2MvZGV2aWNlX2F1dGhlbnRpY2F0aW9uLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy9kZXZpY2VfYXV0aGVudGljYXRpb24ubWQKaW5kZXggZjE1MTNhOS4uYzdkY2I3YyAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy9kZXZpY2VfYXV0aGVudGljYXRpb24ubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy9kZXZpY2VfYXV0aGVudGljYXRpb24ubWQKQEAgLTM4LDggKzM4LDE3IEBACiBmdW5jdGlvbiB0byBzaWduIHRoZSBtZXNzYWdlIHVzaW5nIHRoZSBzZWNyZXQga2V5LiAgVGhpcyBtZXRob2QgaXMgcHJlZmVycmVkCiBzaW5jZSBpdCBlbmFibGVzIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aGUga2V5IGV4aXN0cyBvbmx5IGluIHNlY3VyZSBoYXJkd2FyZQogYW5kIG5ldmVyIGVudGVycyB0aGUgc3lzdGVtJ3MgbWFpbiBtZW1vcnkuICBBIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKLWRlcGVuZHMgb24gQm9yaW5nU1NMIGV4aXN0cyBhdAotW3N0YXJib2FyZC9saW51eC94NjR4MTEvaW50ZXJuYWwvc3lzdGVtX3NpZ25fd2l0aF9jZXJ0aWZpY2F0aW9uX3NlY3JldF9rZXkuY2NdKC4uLy4uL3N0YXJib2FyZC9saW51eC94NjR4MTEvaW50ZXJuYWwvc3lzdGVtX3NpZ25fd2l0aF9jZXJ0aWZpY2F0aW9uX3NlY3JldF9rZXkuY2MpLgorZGVwZW5kcyBvbiBCb3JpbmdTU0wsIGlzIGFzIGZvbGxvd3M6CisKK2BgYEMrKworYm9vbCBTYlN5c3RlbVNpZ25XaXRoQ2VydGlmaWNhdGlvblNlY3JldEtleSgKKyAgICBjb25zdCB1aW50OF90KiBtZXNzYWdlLCBzaXplX3QgbWVzc2FnZV9zaXplX2luX2J5dGVzLAorICAgIHVpbnQ4X3QqIGRpZ2VzdCwgc2l6ZV90IGRpZ2VzdF9zaXplX2luX2J5dGVzKSB7CisgIHJldHVybiBzdGFyYm9hcmQ6OnNoYXJlZDo6ZGV2aWNlYXV0aDo6U2lnbldpdGhDZXJ0aWZpY2F0aW9uU2VjcmV0S2V5KAorICAgICAga0Jhc2U2NEVuY29kZWRDZXJ0aWZpY2F0aW9uU2VjcmV0LAorICAgICAgbWVzc2FnZSwgbWVzc2FnZV9zaXplX2luX2J5dGVzLCBkaWdlc3QsIGRpZ2VzdF9zaXplX2luX2J5dGVzKTsKK30KK2BgYAogCiAjIyMgQ29iYWx0IHNpZ25pbmcKIApkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy9kb2NrZXJfYnVpbGQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL2RvY2tlcl9idWlsZC5tZAppbmRleCA0NTA2OTNmLi45ZjQ5ZjJkIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL2RvY2tlcl9idWlsZC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL2RvY2tlcl9idWlsZC5tZApAQCAtNTgsNyArNTgsMTkgQEAKIAogIyMgUHJlLWJ1aWx0IGltYWdlcwogCi1Ob3RlOiBQcmUtYnVpbHQgaW1hZ2VzIGZyb20gYSBwdWJsaWMgY29udGFpbmVyIHJlZ2lzdHJ5IGFyZSBub3QgeWV0IGF2YWlsYWJsZS4KK1ByZS1idWlsdCBpbWFnZXMgYXJlIGF2YWlsYWJsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vb3Jncy95b3V0dWJlL3BhY2thZ2VzP3JlcG9fbmFtZT1jb2JhbHQKKworRm9yIGV4YW1wbGUsIGEgY29udGFpbmVyIGZvciBidWlsZGluZyBBbmRyb2lkIHBsYXRmb3JtIGZyb20gbWFpbiBicmFuY2ggY2FuIGJlIHB1bGxlZCBhcyBmb2xsb3dzOgorCitgYGAKK2RvY2tlciBwdWxsIGdoY3IuaW8veW91dHViZS9jb2JhbHQvY29iYWx0LWJ1aWxkLWFuZHJvaWQ6bWFpbgorYGBgCisKK1NpbWlsYXJseSwgZnJvbSBMVFMgYnJhbmNoIGZvciBFdmVyZ3JlZW4gcGxhdGZvcm06CisKK2BgYAorZG9ja2VyIHB1bGwgZ2hjci5pby95b3V0dWJlL2NvYmFsdC9jb2JhbHQtYnVpbGQtZXZlcmdyZWVuOjIzLmx0cworYGBgCiAKICMjIFRyb3VibGVzaG9vdGluZwogCkBAIC02Nyw0ICs3OSw0IEBACiAKICAgYGRvY2tlci1jb21wb3NlIHJ1biBsaW51eC14NjR4MTEgL2Jpbi9iYXNoYAogCi1hbmQgdHJ5IHRvIGJ1aWxkIGNvYmFsdCBbd2l0aCB0aGUgdXN1YWwgYGd5cCAvIG5pbmphYCBmbG93XSguLi8uLi9SRUFETUUubWQjYnVpbGRpbmctYW5kLXJ1bm5pbmctdGhlLWNvZGUpLgorYW5kIHRyeSB0byBidWlsZCBjb2JhbHQgW3dpdGggdGhlIHVzdWFsIGBnbiAvIG5pbmphYCBmbG93XSguLi8uLi9SRUFETUUubWQjYnVpbGRpbmctYW5kLXJ1bm5pbmctdGhlLWNvZGUpLgpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9nZW4vY29iYWx0L2RvYy92b2ljZV9zZWFyY2gubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL3ZvaWNlX3NlYXJjaC5tZAppbmRleCA3MTdlM2NjLi41MDM0MjhmIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL3ZvaWNlX3NlYXJjaC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9jb2JhbHQvZG9jL3ZvaWNlX3NlYXJjaC5tZApAQCAtNCwxNiArNCwxMSBAQAogLS0tCiAjIEVuYWJsaW5nIHZvaWNlIHNlYXJjaCBpbiBDb2JhbHQKIAotQ29iYWx0IGVuYWJsZXMgdm9pY2Ugc2VhcmNoIHRocm91Z2ggZWl0aGVyOgorQ29iYWx0IGVuYWJsZXMgdm9pY2Ugc2VhcmNoIHRocm91Z2ggYSBzdWJzZXQgb2YgdGhlCitbTWVkaWFSZWNvcmRlciBXZWIgQVBJXShodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWFzdHJlYW0tcmVjb3JkaW5nLyNtZWRpYXJlY29yZGVyLWFwaSkKIAotMS4gQSBzdWJzZXQgb2YgdGhlIFtNZWRpYVJlY29yZGVyIFdlYiBBUEldKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYXN0cmVhbS1yZWNvcmRpbmcvI21lZGlhcmVjb3JkZXItYXBpKQotMi4gQSBzdWJzZXQgb2YgdGhlIFtTcGVlY2ggUmVjb2duaXRpb24gV2ViIEFQSV0oaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3NwZWVjaC1hcGkvI3NwZWVjaHJlY28tc2VjdGlvbikKLQotT25seSBvbmUgb3IgdGhlIG90aGVyIGNhbiBiZSB1c2VkLCBhbmQgd2UgcmVjb21tZW5kIHRoYXQgdGhlIE1lZGlhUmVjb3JkZXIgQVBJCi1pcyBmb2xsb3dlZCwgYXMgdGhlIFNwZWVjaCBSZWNvZ25pdGlvbiBBUEkgaXMgZGVwcmVjYXRlZCBhcyBvZiBTdGFyYm9hcmQgMTMuCi0KLUluIGJvdGggYXBwcm9hY2hlcywgaW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciB0byBlbmFibGUgdm9pY2UgY29udHJvbCBvciBub3QsCi13ZWIgYXBwcyB3aWxsIGNhbGwgdGhlIFtNZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpXShodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWFjYXB0dXJlLXN0cmVhbXMvI2RvbS1tZWRpYWRldmljZXMtZW51bWVyYXRlZGV2aWNlcyUyOCUyOSkKK0luIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgdG8gZW5hYmxlIHZvaWNlIGNvbnRyb2wgb3Igbm90LCB3ZWIgYXBwcyB3aWxsIGNhbGwgdGhlCitbTWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKV0oaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhY2FwdHVyZS1zdHJlYW1zLyNkb20tbWVkaWFkZXZpY2VzLWVudW1lcmF0ZWRldmljZXMlMjglMjkpCiBXZWIgQVBJIGZ1bmN0aW9uIHdpdGhpbiB3aGljaCBDb2JhbHQgd2lsbCBpbiB0dXJuIGNhbGwgYSBzdWJzZXQgb2YgdGhlCiBbU3RhcmJvYXJkIFNiTWljcm9waG9uZSBBUEldKC4uLy4uL3N0YXJib2FyZC9taWNyb3Bob25lLmgpLgogCkBAIC0yMyw0OCArMTgsNyBAQAogIyMgTWVkaWFSZWNvcmRlciBBUEkKIAogVG8gZW5hYmxlIHRoZSBNZWRpYVJlY29yZGVyIEFQSSBpbiBDb2JhbHQsIHRoZSBjb21wbGV0ZQotW1NiTWljcm9waG9uZSBBUEldKC4uLy4uL3N0YXJib2FyZC9taWNyb3Bob25lLmgpIG11c3QgYmUgaW1wbGVtZW50ZWQsIGFuZAotYFNiU3BlZWNoUmVjb2duaXplcklzU3VwcG9ydGVkKClgIG11c3QgcmV0dXJuIGBmYWxzZWAuCi0KLSMjIFNwZWVjaCBSZWNvZ25pdGlvbiBBUEkgLSBEZXByZWNhdGVkCi0KLSoqVGhlIFNwZWVjaCBSZWNvZ25pdGlvbiBBUEkgaXMgZGVwcmVjYXRlZCBhcyBvZiBTdGFyYm9hcmQgMTMuKioKLQotSW4gb3JkZXIgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB1c2luZyB0aGlzIEFQSSwgcGxhdGZvcm1zIG11c3QgaW1wbGVtZW50IHRoZQotW1N0YXJib2FyZCBTYlNwZWVjaFJlY29nbml6ZXIgQVBJXSguLi8uLi9zdGFyYm9hcmQvc3BlZWNoX3JlY29nbml6ZXIuaCkgYXMgd2VsbAotYXMgYSBzdWJzZXQgb2YgdGhlIFtTYk1pY3JvcGhvbmUgQVBJXSguLi8uLi9zdGFyYm9hcmQvbWljcm9waG9uZS5oKS4KLQotIyMjIFNwZWNpZmljIGluc3RydWN0aW9ucyB0byBlbmFibGUgdm9pY2Ugc2VhcmNoCi0KLTEuIEltcGxlbWVudCBgU2JTcGVlY2hSZWNvZ25pemVySXNTdXBwb3J0ZWQoKWAgdG8gcmV0dXJuIGB0cnVlYCwgYW5kIGltcGxlbWVudAotICAgdGhlIFtTYlNwZWVjaFJlY29nbml6ZXIgQVBJXSguLi8uLi9zdGFyYm9hcmQvc3BlZWNoX3JlY29nbml6ZXIuaCkuCi0yLiBJbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBzdWJzZXQgb2YgdGhlCi0gICBbU2JNaWNyb3Bob25lIEFQSV0oLi4vLi4vc3RhcmJvYXJkL21pY3JvcGhvbmUuaCk6Ci0gICAgLSBgU2JNaWNyb3Bob25lR2V0QXZhaWxhYmxlKClgCi0gICAgLSBgU2JNaWNyb3Bob25lQ3JlYXRlKClgCi0gICAgLSBgU2JNaWNyb3Bob25lRGVzdHJveSgpYAotCi0gICBJbiBwYXJ0aWN1bGFyLCBTYk1pY3JvcGhvbmVDcmVhdGUoKSBtdXN0IHJldHVybiBhIHZhbGlkIG1pY3JvcGhvbmUuICBJdCBpcwotICAgb2theSB0byBzdHViIG91dCB0aGUgb3RoZXIgZnVuY3Rpb25zLCBlLmcuIGhhdmUgYFNiTWljcm9waG9uZU9wZW4oKWAKLSAgIHJldHVybiBgZmFsc2VgLgotMy4gVGhlIFlvdVR1YmUgYXBwIHdpbGwgZGlzcGxheSB0aGUgbWljIGljb24gb24gdGhlIHNlYXJjaCBwYWdlIHdoZW4gaXQgZGV0ZWN0cwotICAgdmFsaWQgbWljcm9waG9uZSBpbnB1dCBkZXZpY2VzIHVzaW5nIGBNZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpYC4KLTQuIFdpdGggYFNiU3BlZWNoUmVjb2duaXplcklzU3VwcG9ydGVkKClgIGltcGxlbWVudGVkIHRvIHJldHVybiBgdHJ1ZWAsIENvYmFsdAotICAgd2lsbCB1c2UgdGhlIHBsYXRmb3JtJ3MKLSAgIFtTdGFyYm9hcmQgU2JTcGVlY2hSZWNvZ25pemVyIEFQSV0oLi4vLi4vc3RhcmJvYXJkL3NwZWVjaF9yZWNvZ25pemVyLmgpCi0gICBpbXBsZW1lbnRhdGlvbiwgYW5kIGl0IHdpbGwgbm90IGFjdHVhbGx5IHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgbWljcm9waG9uZQotICAgdmlhIHRoZSBbU3RhcmJvYXJkIFNiTWljcm9waG9uZSBBUEldKC4uLy4uL3N0YXJib2FyZC9taWNyb3Bob25lLmgpLgotCi0jIyMgRGlmZmVyZW5jZXMgZnJvbSB2ZXJzaW9ucyBvZiBDb2JhbHQgPD0gMTEKLQotSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgQ29iYWx0LCB0aGVyZSB3YXMgbm8gd2F5IHRvIGR5bmFtaWNhbGx5IGRpc2FibGUKLXNwZWVjaCBzdXBwb3J0IGJlc2lkZXMgbW9kaWZ5aW5nIGNvbW1vbiBDb2JhbHQgY29kZSB0byBkeW5hbWljYWxseSBzdHViIG91dCB0aGUKLVNwZWVjaCBSZWNvZ25pdGlvbiBBUEkgd2hlbiB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBtaWNyb3Bob25lIGlucHV0LgotVGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LCB3ZWIgYXBwcyBzaG91bGQgbm93IHJlbHkgb24KLWBNZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpYCB0byBkZXRlcm1pbmUgd2hldGhlciB2b2ljZSBzdXBwb3J0IGlzIGVuYWJsZWQKLW9yIG5vdC4KLQotIyMjIFNwZWVjaCBSZWNvZ25pdGlvbiBBUEkgaXMgZGVwcmVjYXRlZCBpbiBTdGFyYm9hcmQgMTMgIyMjCitbU2JNaWNyb3Bob25lIEFQSV0oLi4vLi4vc3RhcmJvYXJkL21pY3JvcGhvbmUuaCkgbXVzdCBiZSBpbXBsZW1lbnRlZC4KIAogV2ViIGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gdXNlIHRoZSBNZWRpYVJlY29yZGVyIEFQSS4gVGhpcyBpbiB0dXJuIHJlbGllcwogb24gdGhlIFNiTWljcm9waG9uZSBBUEkgYXMgZGV0YWlsZWQgYWJvdmUuCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9zdGFyYm9hcmQvYnVpbGQvZG9jL21pZ3JhdGlvbl9jaGFuZ2VzLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9nZW4vc3RhcmJvYXJkL2J1aWxkL2RvYy9taWdyYXRpb25fY2hhbmdlcy5tZAppbmRleCA4M2YzZGZhLi40NjhkZTEwIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9zdGFyYm9hcmQvYnVpbGQvZG9jL21pZ3JhdGlvbl9jaGFuZ2VzLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvZ2VuL3N0YXJib2FyZC9idWlsZC9kb2MvbWlncmF0aW9uX2NoYW5nZXMubWQKQEAgLTI0LDcgKzI0LDYgQEAKIGBzYl9ldmVyZ3JlZW5gICgwLzEpICAgICAgICAgICAgICAgICAgICAgIHwgYHNiX2lzX2V2ZXJncmVlbmAgKHRydWUvZmFsc2UpICAgICAgICAgICAgICAgICAgICAgICB8IGAvL3N0YXJib2FyZC9idWlsZC9jb25maWcvYmFzZV9jb25maWd1cmF0aW9uLmduaWAKIGBzYl9ldmVyZ3JlZW5fY29tcGF0aWJsZWAgKDAvMSkgICAgICAgICAgIHwgYHNiX2lzX2V2ZXJncmVlbl9jb21wYXRpYmxlYCAodHJ1ZS9mYWxzZSkgICAgICAgICAgICB8IGAvL3N0YXJib2FyZC9idWlsZC9jb25maWcvYmFzZV9jb25maWd1cmF0aW9uLmduaWAKIGBzYl9ldmVyZ3JlZW5fY29tcGF0aWJsZV9saWJ1bndpbmRgICgwLzEpIHwgYHNiX2V2ZXJncmVlbl9jb21wYXRpYmxlX3VzZV9saWJ1bndpbmRgICh0cnVlL2ZhbHNlKSB8IGAvL3N0YXJib2FyZC9idWlsZC9jb25maWcvYmFzZV9jb25maWd1cmF0aW9uLmduaWAKLWBzYl9ldmVyZ3JlZW5fY29tcGF0aWJsZV9saXRlYCAoMC8xKSAgICAgIHwgYHNiX2V2ZXJncmVlbl9jb21wYXRpYmxlX2VuYWJsZV9saXRlYCAodHJ1ZS9mYWxzZSkgICB8IGAvL3N0YXJib2FyZC9idWlsZC9jb25maWcvYmFzZV9jb25maWd1cmF0aW9uLmduaWAKIGBzYl9kaXNhYmxlX2NwcDE0X2F1ZGl0YCAgICAgICAgICAgICAgICAgIHwgKG5vbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiBgc2JfZGlzYWJsZV9taWNyb3Bob25lX2lkbGAgICAgICAgICAgICAgICB8IChub25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogYHN0YXJib2FyZF9wYXRoYCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobm9uZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvZ2VuL3N0YXJib2FyZC9kb2MvYWJzdHJhY3QtdG9vbGNoYWluLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9nZW4vc3RhcmJvYXJkL2RvYy9hYnN0cmFjdC10b29sY2hhaW4ubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJhODMuLjAwMDAwMDAKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9nZW4vc3RhcmJvYXJkL2RvYy9hYnN0cmFjdC10b29sY2hhaW4ubWQKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0tLS0KLWxheW91dDogZG9jCi10aXRsZTogIkFic3RyYWN0IFRvb2xjaGFpbiIKLS0tLQotIyBBYnN0cmFjdCBUb29sY2hhaW4KLQotIyMgTW90aXZhdGlvbgotCi1UaGUgYWltIG9mIGltcGxlbWVudGluZyBhbiBBYnN0cmFjdCBUb29sY2hhaW4gaXMgdG8gYWxsb3cgcG9ydGVycyB0byBhZGQKLW5ldyB0b29sY2hhaW5zIG9yIGN1c3RvbWl6ZSBleGlzdGluZyBvbmVzIHdpdGhvdXQgdGhlIG5lZWQgb2YgbW9kaWZ5aW5nCi1jb21tb24gY29kZS4KLQotSW5pdGlhbGx5IGFsbCB0YXJnZXRzIHdlcmUgZGVmaW5lZCBpbiBvbmUgY29tbW9uIHNoYXJlZCBmaWxlLAotYHNyYy90b29scy9neXAvcHlsaWIvZ3lwL2dlbmVyYXRvci9uaW5qYS5weWAuCi1Nb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3ZXJlIHJlcXVpcmVkIGZvciByZXBsYWNpbmcgYW55IG9mIHRoZSB0b29sY2hhaW4KLWNvbXBvbmVudHMsIGFkZGluZyBwbGF0Zm9ybS1zcGVjaWZpYyB0b29saW5nLCBhZGRpbmcgbmV3IHRvb2xjaGFpbnMsIG9yCi1hY2NvbW1vZGF0aW5nIHBsYXRmb3JtLXNwZWNpZmljIGZsYXZvciBvZiByZWZlcmVuY2UgdG9vbC4gRG9pbmcgdGhpcyBpbiBhCi1zaGFyZWQgZmlsZSBkb2VzIG5vdCBzY2FsZSB3aXRoIHRoZSBudW1iZXIgb2YgcG9ydHMuCi0KLSMjIE92ZXJ2aWV3Ci0KLVRoZSBzb2x1dGlvbiBpbXBsZW1lbnRlZCB0byBzb2x2ZSB0b29sY2hhaW4gYWJzdHJhY3Rpb24gY29uc2lzdHMgb2YgYWRkaW5nIHR3bwotbmV3IGZ1bmN0aW9ucyB0byB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYGd5cF9jb25maWd1cmF0aW9uLnB5YCBmaWxlIGZvdW5kIHVuZGVyOgotCi1gc3RhcmJvYXJkLzxQTEFURk9STT4vZ3lwX2NvbmZpZ3VyYXRpb24ucHlgCi0KLVRoZSBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGFyZToKLQotYEdldEhvc3RUb29sY2hhaW5gIGFuZCBgR2V0VGFyZ2V0VG9vbGNoYWluYAotCi0jIyBFeGFtcGxlCi0KLVRoZSBzaW1wbGVzdCBjb21wbGV0ZSBHQ0MgYmFzZWQgdG9vbGNoYWluLCB3aGVyZSBhIHRhcmdldCBhbmQgaG9zdCBhcmUgdGhlIHNhbWUsCi1hbmQgYWxsIHRvb2xzIGFyZSBpbiB0aGUgUEFUSDoKLQotICBjbGFzcyBFeGFtcGxlUGxhdGZvcm1Db25maWcoc3RhcmJvYXJkLlBsYXRmb3JtQ29uZmlnKQotICAgICMgLi4uCi0KLSAgICBkZWYgR2V0VGFyZ2V0VG9vbGNoYWluKHNlbGYpOgotICAgICAgcmV0dXJuIFsKLSAgICAgICAgc3RhcmJvYXJkLnRvb2xjaGFpbnMuZ251LkNDb21waWxlcigpLAotICAgICAgICBzdGFyYm9hcmQudG9vbGNoYWlucy5nbnUuQ1BsdXNQbHVzQ29tcGlsZXIoKSwKLSAgICAgICAgc3RhcmJvYXJkLnRvb2xjaGFpbnMuZ251LkFzc2VtYmxlcigpLAotICAgICAgICBzdGFyYm9hcmQudG9vbGNoYWlucy5nbnUuU3RhdGljTGlua2VyKCksCi0gICAgICAgIHN0YXJib2FyZC50b29sY2hhaW5zLmdudS5EeW5hbWljTGlua2VyKCksCi0gICAgICAgIHN0YXJib2FyZC50b29sY2hhaW5zLmdudS5CaXNvbigpLAotICAgICAgICBzdGFyYm9hcmQudG9vbGNoYWlucy5nbnUuU3RhbXAoKSwKLSAgICAgICAgc3RhcmJvYXJkLnRvb2xjaGFpbnMuZ251LkNvcHkoKSwKLSAgICAgIF0KLQotICAgIGRlZiBHZXRIb3N0VG9vbGNoYWluKHNlbGYpOgotICAgICAgcmV0dXJuIHNlbGYuR2V0VGFyZ2V0VG9vbGNoYWluKCkKLQotWW91IGNhbiBmaW5kIHJlYWwgZXhhbXBsZXMgb2YgdGhpcyBpbiB0aGUgT3BlbiBTb3VyY2UgcmVwbzoKLVtMaW51eCB4ODYxMV0oaHR0cHM6Ly9jb2JhbHQuZ29vZ2xlc291cmNlLmNvbS9jb2JhbHQvKy9yZWZzL2hlYWRzLzIxLmx0cy4xKy9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9neXBfY29uZmlndXJhdGlvbi5weSkKLQotW1Jhc3BiZXJyeSBQaSAyXShodHRwczovL2NvYmFsdC5nb29nbGVzb3VyY2UuY29tL2NvYmFsdC8rL3JlZnMvaGVhZHMvMjEubHRzLjErL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5KQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9nZW4vc3RhcmJvYXJkL2RvYy9ldmVyZ3JlZW4vY29iYWx0X2V2ZXJncmVlbl9vdmVydmlldy5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvZ2VuL3N0YXJib2FyZC9kb2MvZXZlcmdyZWVuL2NvYmFsdF9ldmVyZ3JlZW5fb3ZlcnZpZXcubWQKaW5kZXggMzcwMjRlYS4uOThkZTMzMCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9nZW4vc3RhcmJvYXJkL2RvYy9ldmVyZ3JlZW4vY29iYWx0X2V2ZXJncmVlbl9vdmVydmlldy5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9zdGFyYm9hcmQvZG9jL2V2ZXJncmVlbi9jb2JhbHRfZXZlcmdyZWVuX292ZXJ2aWV3Lm1kCkBAIC01NTcsNiArNTU3LDE1IEBACiBbYHN1c3BlbmRfc2lnbmFscy5jY2BdKC4uLy4uL3NoYXJlZC9zaWduYWwvc3VzcGVuZF9zaWduYWxzLmNjKQogZm9yIGFuIGV4YW1wbGUuCiAKKyMjIyBDbGVhbmluZyB1cCBhZnRlciB1bmluc3RhbGwKK1doZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHVuaW5zdGFsbGVkIHRoZSB1cGRhdGVzIHNob3VsZCBiZSBjbGVhbnVwIGJ5IGNhbGxpbmcgdGhlCithcHBsaWNhdGlvbiB3aXRoIHRoZSBgLS1yZXNldF9ldmVyZ3JlZW5fdXBkYXRlYCBmbGFnLiBUaGlzIHdvdWxkIHJlbW92ZSBhbGwgZmlsZXMKK3VuZGVyIGBrU2JTeXN0ZW1QYXRoU3RvcmFnZURpcmVjdG9yeWAgYW5kIGV4aXQgdGhlIGFwcC4KKworYGBgCisgIGxvYWRlcl9hcHAgLS1yZXNldF9ldmVyZ3JlZW5fdXBkYXRlCitgYGAKKwogIyMjIE11bHRpLUFwcCBTdXBwb3J0CiBFdmVyZ3JlZW4gY2FuIHN1cHBvcnQgbXVsdGlwbGUgYXBwcyB0aGF0IHNoYXJlIGEgQ29iYWx0IGJpbmFyeS4gVGhpcyBpcyBhIHZlcnkKIGNvbW1vbiB3YXkgdG8gc2F2ZSBzcGFjZSBhbmQga2VlcCBhbGwgeW91ciBDb2JhbHQgYXBwcyB1c2luZyB0aGUgbGF0ZXN0IHZlcnNpb24KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvZ2VuL3N0YXJib2FyZC9kb2MvZXZlcmdyZWVuL2V2ZXJncmVlbl9iaW5hcnlfY29tcHJlc3Npb24ubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9zdGFyYm9hcmQvZG9jL2V2ZXJncmVlbi9ldmVyZ3JlZW5fYmluYXJ5X2NvbXByZXNzaW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzc5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL2dlbi9zdGFyYm9hcmQvZG9jL2V2ZXJncmVlbi9ldmVyZ3JlZW5fYmluYXJ5X2NvbXByZXNzaW9uLm1kCkBAIC0wLDAgKzEsMTE0IEBACistLS0KK2xheW91dDogZG9jCit0aXRsZTogIkV2ZXJncmVlbiBCaW5hcnkgQ29tcHJlc3Npb24iCistLS0KKyMgRXZlcmdyZWVuIEJpbmFyeSBDb21wcmVzc2lvbgorCisjIyBXaGF0IGlzIEV2ZXJncmVlbiBCaW5hcnkgQ29tcHJlc3Npb24/CisKK0V2ZXJncmVlbiBCaW5hcnkgQ29tcHJlc3Npb24gaXMgYSBmZWF0dXJlIHRoYXQgcmVkdWNlcyB0aGUgYW1vdW50IG9mIHNwYWNlIHVzZWQKK29uLWRldmljZSB0byBzdG9yZSBDb2JhbHQgQ29yZSBiaW5hcmllcy4gVGhlIGJpbmFyaWVzIGFyZSBzdG9yZWQgY29tcHJlc3NlZCwKK3VzaW5nIHRoZQorW0xaNCBGcmFtZSBGb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9sejQvbHo0L2Jsb2IvZGV2L2RvYy9sejRfRnJhbWVfZm9ybWF0Lm1kKSwKK2FuZCBkZWNvbXByZXNzZWQgd2hlbiB0aGV5IGFyZSBsb2FkZWQgYW5kIHJ1bi4gVGhpcyBvcHRpb25hbCBmZWF0dXJlIGlzIG9mZiBieQorZGVmYXVsdCBidXQgcGFydG5lcnMgY2FuIGVuYWJsZSBpdCBieSBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdy4KKworIyMgU3RvcmFnZSBTYXZpbmdzCisKK0Fjcm9zcyBhbGwgcmVmZXJlbmNlIGRldmljZXMgdGVzdGVkLCBpbmNsdWRpbmcgUmFzcGJlcnJ5IFBpIDIsIHdlIGhhdmUgc2VlbgorY29tcHJlc3Npb24gcmF0aW9zIGp1c3QgYWJvdmUgMi4wLiBXZSB0aGVyZWZvcmUgZXhwZWN0IHRoYXQgcGFydG5lcnMgY2FuIGhhbHZlCit0aGUgc3BhY2UgdXNlZCBmb3IgQ29iYWx0IGJpbmFyeSBzdG9yYWdlIGJ5IGVuYWJsaW5nIHRoZSBmZWF0dXJlIGZvciBhbGwKK2luc3RhbGxhdGlvbiBzbG90czogdGhlIHN5c3RlbSBpbWFnZSBzbG90IGFuZCB0aGUgd3JpdGFibGUgc2xvdHMuCisKKyMjIENhdmVhdHMKKworIyMjIFBlcmZvcm1hbmNlIENvc3RzCisKK0JlY2F1c2UgdGhlIENvYmFsdCBDb3JlIHNoYXJlZCBsaWJyYXJ5IG11c3QgYmUgZGVjb21wcmVzc2VkIGJlZm9yZSBpdCdzIGxvYWRlZCwKK3RoZXJlIGlzIG5lY2Vzc2FyaWx5IHNvbWUgZWZmZWN0IG9uIHN0YXJ0dXAgbGF0ZW5jeSBhbmQgQ1BVIG1lbW9yeSB1c2FnZS4gQmFzZWQKK29uIG91ciBhbmFseXNpcyBhY3Jvc3MgYSByYW5nZSBvZiBkZXZpY2VzIHRoZXNlIGVmZmVjdHMgYXJlIHJlbGF0aXZlbHkgc21hbGwuCisKK0ZvciBzdGFydHVwIGxhdGVuY3ksIHdlIG1lYXN1cmVkIGFuIGluY3JlYXNlIGluIGBsaWJjb2JhbHRgIGxvYWQgdGltZSBpbiB0aGUKK2h1bmRyZWRzIG9mIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGxvdy1wb3dlcmVkIFJhc3BiZXJyeSBQaSAyIGFuZCBpbiB0aGUgdGVucyBvZgorbWlsbGlzZWNvbmRzIGZvciBtb3JlIHJlcHJlc2VudGF0aXZlLCBoaWdoZXItcG93ZXJlZCBkZXZpY2VzLiBUaGlzIGluY3JlYXNlIGlzCitzbWFsbCBpbiB0aGUgY29udGV4dCBvZiBvdmVyYWxsIGFwcCBsb2FkIHRpbWUuCisKK0ZvciBDUFUgbWVtb3J5IHVzYWdlLCBgbGliY29iYWx0Lmx6NGAgaXMgZGVjb21wcmVzc2VkIHRvIGFuIGluLW1lbW9yeSBFTEYgZmlsZQorYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGxvYWRlZC4gV2UgdGhlcmVmb3JlIGV4cGVjdCBDUFUgbWVtb3J5IHVzYWdlIHRvCit0ZW1wb3JhcmlseSBpbmNyZWFzZSBieSByb3VnaGx5IHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgYGxpYmNvYmFsdGAgYW5kCit0aGVuIHRvIHJldHVybiB0byBhIG5vcm1hbCBsZXZlbCBvbmNlIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZC4gQW5kIHRoaXMgaXMgZXhhY3RseQord2hhdCB3ZSd2ZSBzZWVuIGluIG91ciBhbmFseXNpcy4KKworIyMjIEluY29tcGF0aWJpbGl0aWVzCisKK1RoaXMgZmVhdHVyZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgTWVtb3J5IE1hcHBlZCBmaWxlIGZlYXR1cmUgdGhhdCBpcworY29udHJvbGxlZCBieSB0aGUgYC0tbG9hZGVyX3VzZV9tbWFwX2ZpbGVgIHN3aXRjaC4gV2l0aCBjb21wcmVzc2lvbiwgd2UgbG9zZSB0aGUKK3JlcXVpcmVkIDE6MSBtYXBwaW5nIGJldHdlZW4gdGhlIGZpbGUgYW5kIHZpcnR1YWwgbWVtb3J5LiBTbywKK2AtLWxvYWRlcl91c2VfbW1hcF9maWxlYCBzaG91bGQgbm90IGJlIHNldCBpZiBjb21wcmVzc2lvbiBpcyBlbmFibGVkIGZvciBhbnkKK2luc3RhbGxhdGlvbiBzbG90cyAobmV4dCBzZWN0aW9uKS4KKworIyMgRW5hYmxpbmcgQmluYXJ5IENvbXByZXNzaW9uCisKK1NlcGFyYXRlIHN0ZXBzIGFyZSByZXF1aXJlZCBpbiBvcmRlciBmb3IgYSBwYXJ0bmVyIHRvIGVuYWJsZSBjb21wcmVzc2lvbiBmb3IgYSkKK3RoZSBzeXN0ZW0gaW1hZ2Ugc2xvdCBhbmQgYikgKEV2ZXJncmVlbi1GdWxsIG9ubHkpIHRoZSAyKyB3cml0YWJsZSBzbG90cyBvbiBhCitkZXZpY2UuCisKK0NvbXByZXNzaW9uIGZvciB0aGUgc3lzdGVtIGltYWdlIHNsb3QgaXMgZW5hYmxlZCBieSBpbnN0YWxsaW5nIGBsaWJjb2JhbHQubHo0YAoraW5zdGVhZCBvZiBgbGliY29iYWx0LnNvYCBpbiB0aGUgcmVhZC1vbmx5IHN5c3RlbSBpbWFnZSBzbG90IChpLmUuLCBTTE9UXzApLgorU3RhcnRpbmcgd2l0aCBhIHRvIGJlIGRldGVybWluZWQgQ29iYWx0IDIzIHJlbGVhc2UsIHRoZSBvcGVuLXNvdXJjZSByZWxlYXNlcyBvbgorW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL3lvdXR1YmUvY29iYWx0L3JlbGVhc2VzKSBpbmNsdWRlIHNlcGFyYXRlIENSWAorcGFja2FnZXMsIGRlbm90ZWQgYnkgYSAiY29tcHJlc3NlZCIgc3VmZml4LCB0aGF0IGNvbnRhaW4gdGhlIHByZS1idWlsdCBhbmQKK0xaNC1jb21wcmVzc2VkIENvYmFsdCBDb3JlIGJpbmFyeS4KKworQ29tcHJlc3Npb24gZm9yIHRoZSB3cml0YWJsZSBzbG90cyBpcyBlbmFibGVkIGJ5IGNvbmZpZ3VyaW5nIENvYmFsdCB0byBsYXVuY2gKK3dpdGggdGhlIGAtLXVzZV9jb21wcmVzc2VkX3VwZGF0ZXNgIGZsYWc6CisKK2BgYAorJCAuL2xvYWRlcl9hcHAgLS11c2VfY29tcHJlc3NlZF91cGRhdGVzCitgYGAKKworVGhpcyBmbGFnIGluc3RydWN0cyB0aGUgQ29iYWx0IFVwZGF0ZXIgdG8gcmVxdWVzdCwgZG93bmxvYWQsIGFuZCBpbnN0YWxsCitwYWNrYWdlcyBjb250YWluaW5nIGNvbXByZXNzZWQgQ29iYWx0IENvcmUgYmluYXJpZXMgZnJvbSBHb29nbGUgVXBkYXRlIGFuZAorR29vZ2xlIERvd25sb2Fkcy4gQXMgYSByZXN1bHQsIHRoZSBkZXZpY2UgZW5kcyB1cCB3aXRoIGBsaWJjb2JhbHQubHo0YCBpbnN0ZWFkCitvZiBgbGliY29iYWx0LnNvYCBpbiB0aGUgcmVsZXZhbnQgc2xvdCBhZnRlciBpdHMgbmV4dCB1cGRhdGUuCisKK05vdGUgdGhhdCB0aGUgc3lzdGVtIGltYWdlIHNsb3QgaXMgaW5kZXBlbmRlbnQgZnJvbSB0aGUgd3JpdGFibGUgc2xvdHMgd2l0aAorcmVzcGVjdCB0byB0aGUgY29tcHJlc3Npb24gZmVhdHVyZTogdGhlIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgZm9yIHRoZSBzeXN0ZW0KK2ltYWdlIHNsb3QgYnV0IGRpc2FibGVkIGZvciB0aGUgd3JpdGFibGUgc2xvdHMsIG9yIHZpY2UgdmVyc2EuIEhvd2V2ZXIsIHdlCitleHBlY3QgdGhhdCBwYXJ0bmVycyB3aWxsIHR5cGljYWxseSBlbmFibGUgdGhlIGZlYXR1cmUgZm9yIGFsbCBzbG90cyBpbiBvcmRlciB0bwordGFrZSBmdWxsIGFkdmFudGFnZSBvZiB0aGUgc3RvcmFnZSByZWR1Y3Rpb24uCisKKyMjIERpc2FibGluZyBCaW5hcnkgQ29tcHJlc3Npb24KKworVGhlIGNvbXByZXNzaW9uIGZlYXR1cmUgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBPbmNlIGVuYWJsZWQsIHRob3VnaCwgaXQgY2FuCitiZSBkaXNhYmxlZCBieSB1bmRvaW5nIHRoZSBzdGVwcyByZXF1aXJlZCBmb3IgZW5hYmxlbWVudC4KKworQ29tcHJlc3Npb24gZm9yIHRoZSBzeXN0ZW0gaW1hZ2Ugc2xvdCBpcyBkaXNhYmxlZCBieSBpbnN0YWxsaW5nIHRoZSB1bmNvbXByZXNzZWQKK2BsaWJjb2JhbHQuc29gIGluc3RlYWQgb2YgYGxpYmNvYmFsdC5sejRgIGluIHRoZSByZWFkLW9ubHkgc3lzdGVtIGltYWdlIHNsb3QuCisKK0NvbXByZXNzaW9uIGZvciB0aGUgd3JpdGFibGUgc2xvdHMgaXMgZGlzYWJsZWQgYnkgY29uZmlndXJpbmcgQ29iYWx0IHRvIGxhdW5jaAorKip3aXRob3V0KiogdGhlIGAtLXVzZV9jb21wcmVzc2VkX3VwZGF0ZXNgIGZsYWcuIFRoZSBDb2JhbHQgVXBkYXRlciB3aWxsIHRoZW4gYmUKK2luc3RydWN0ZWQgdG8gcmVxdWVzdCwgZG93bmxvYWQsIGFuZCBpbnN0YWxsIHBhY2thZ2VzIGNvbnRhaW5pbmcgdGhlCit1bmNvbXByZXNzZWQgQ29iYWx0IENvcmUgYmluYXJpZXMuCisKK05vdGUgdGhhdCBkaXNhYmxpbmcgY29tcHJlc3Npb24gZm9yIHRoZSB3cml0YWJsZSBzbG90cyBpcyBldmVudHVhbCBpbiB0aGUgc2Vuc2UKK3RoYXQgdGhlIGNvbXByZXNzZWQgQ29iYWx0IENvcmUgYmluYXJpZXMgaW4gdGhlc2Ugc2xvdHMgd2lsbCByZW1haW4gYW5kIGNvbnRpbnVlCit0byBiZSB1c2VkIHVudGlsIG5ld2VyIHZlcnNpb25zIG9mIENvYmFsdCBDb3JlIGFyZSBhdmFpbGFibGUgb24gR29vZ2xlIFVwZGF0ZQorYW5kIEdvb2dsZSBEb3dubG9hZHMuCisKKyMjIEZBUQorCisjIyMgU2hvdWxkIG11bHRpcGxlIGFwcHMgdGhhdCBzaGFyZSBiaW5hcmllcyBhbHNvIHNoYXJlIGNvbXByZXNzaW9uIHNldHRpbmdzPworCitUaGUgW0NvYmFsdCBFdmVyZ3JlZW4gT3ZlcnZpZXcgZG9jXShjb2JhbHRfZXZlcmdyZWVuX292ZXJ2aWV3Lm1kKSBkZXNjcmliZXMKK211bHRpLWFwcCBzdXBwb3J0LCB3aGVyZSBtdWx0aXBsZSBDb2JhbHQtYmFzZWQgYXBwbGljYXRpb25zIHNoYXJlIENvYmFsdCBDb3JlCitiaW5hcmllcyAoaS5lLiwgdGhleSBzaGFyZSB0aGUgc2FtZSBpbnN0YWxsYXRpb24gc2xvdChzKSkuIFdoZW4gbXVsdGktYXBwCitzdXBwb3J0IGlzIHVzZWQgdGhlbiwgeWVzLCB0aGUgYXBwcyBzaG91bGQgYWxzbyBzaGFyZSBjb21wcmVzc2lvbiBzZXR0aW5ncy4KKworRm9yIHRoZSBzeXN0ZW0gaW1hZ2Ugc2xvdCwgdGhpcyBtZWFucyB0aGF0IGVpdGhlciBgbGliY29iYWx0Lmx6NGAgb3IKK2BsaWJjb2JhbHQuc29gIGlzIGluc3RhbGxlZCBpbiB0aGUgb25lLCBzaGFyZWQgc2xvdC4KKworRm9yIHRoZSB3cml0YWJsZSBzbG90cywgdGhpcyBtZWFucyB0aGF0IHRoZSBsb2FkZXIgYXBwIGlzIGVpdGhlciBsYXVuY2hlZCB3aXRoCitgLS11c2VfY29tcHJlc3NlZF91cGRhdGVzYCBzZXQgZm9yIGFsbCBhcHBzIG9yIGxhdW5jaGVkIHdpdGhvdXQgaXQgZm9yIGFsbCBhcHBzLgorT3RoZXJ3aXNlLCB0aGUgZGlmZmVyZW50IGFwcHMgd291bGQgY29tcGV0ZSB3aXRoIHJlc3BlY3QgdG8gd2hldGhlciB0aGUgd3JpdGFibGUKK3Nsb3RzIGFyZSB1cGdyYWRlZCB0byBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCBiaW5hcmllcy4KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLXB1YmxpYy5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLXB1YmxpYy5tZAppbmRleCA5NGRhYjRlLi4yODVmOTBlIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi1wdWJsaWMubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24tcHVibGljLm1kCkBAIC02NSwxMSArNjUsOSBAQAogCiAjIyBNZWRpYSBDb25maWd1cmF0aW9uCiAKLSBBZnRlciBhIHNlZWsgaXMgdHJpZ2dlcmVkLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhcHBlbmQgdmlkZW8gZnJhbWVzIGZyb20gdGhlIGxhc3Qga2V5IGZyYW1lIGJlZm9yZSB0aGUgc2VlayB0aW1lIGFuZCBhcHBlbmQgYXVkaW8gZnJhbWVzIGZyb20gdGhlIHNlZWsgdGltZSBiZWNhdXNlIHVzdWFsbHkgYWxsIGF1ZGlvIGZyYW1lcyBhcmUga2V5IGZyYW1lcy4gIE9uIHBsYXRmb3JtcyB0aGF0IGNhbm5vdCBkZWNvZGUgdmlkZW8gZnJhbWVzIHdpdGhvdXQgZGlzcGxheWluZyB0aGVtLCB0aGlzIHdpbGwgY2F1c2UgdGhlIHZpZGVvIGJlaW5nIHBsYXllZCB3aXRob3V0IGF1ZGlvIGZvciBzZXZlcmFsIHNlY29uZHMgYWZ0ZXIgc2Vla2luZy4gIFdoZW4gdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZWZpbmVkLCB0aGUgYXBwIHdpbGwgYXBwZW5kIGF1ZGlvIGZyYW1lcyBzdGFydCBmcm9tIHRoZSB0aW1lc3RhbXAgdGhhdCBpcyBiZWZvcmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgdmlkZW8ga2V5IGZyYW1lIGJlaW5nIGFwcGVuZGVkLgotCiB8IFByb3BlcnRpZXMgfAogfCA6LS0tIHwKLXwgKipgU0JfSEFTX1FVSVJLX1NVUFBPUlRfSU5UMTZfQVVESU9fU0FNUExFU2AqKjxicj48YnI+IFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhbGxvd2VkIHRvIHN1cHBvcnQga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVJbnQxNiBvbmx5IHdoZW4gdGhpcyBtYWNybyBpcyBkZWZpbmVkLjxicj48YnI+QnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBpcyB1bmRlZmluZWQuIHwKK3wgKipgU0JfSEFTX1FVSVJLX1NVUFBPUlRfSU5UMTZfQVVESU9fU0FNUExFU2AqKjxicj48YnI+VGhlIGltcGxlbWVudGF0aW9uIGlzIGFsbG93ZWQgdG8gc3VwcG9ydCBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUludDE2IG9ubHkgd2hlbiB0aGlzIG1hY3JvIGlzIGRlZmluZWQuPGJyPjxicj5CeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIHVuZGVmaW5lZC4gfAogCiAKICMjIE1lbW9yeSBDb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvZ24tY29uZmlndXJhdGlvbi5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9nbi1jb25maWd1cmF0aW9uLm1kCmluZGV4IGEwYmJkZTYuLjE4ZGIxZWUgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9nbi1jb25maWd1cmF0aW9uLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9nbi1jb25maWd1cmF0aW9uLm1kCkBAIC0xOSwxMSArMTksMTMgQEAKIHwgKipgZ3Rlc3RfdGFyZ2V0X3R5cGVgKio8YnI+PGJyPiBUaGUgdGFyZ2V0IHR5cGUgZm9yIHRlc3QgdGFyZ2V0cy4gQWxsb3dzIGNoYW5naW5nIHRoZSB0YXJnZXQgdHlwZSBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIG5hdGl2ZSBjb2RlIG1heSByZXF1aXJlIGFuIGFkZGl0aW9uYWwgcGFja2FnaW5nIHN0ZXAgKGV4LiBBbmRyb2lkKS48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGAiZXhlY3V0YWJsZSJgLiB8CiB8ICoqYGhhc19wbGF0Zm9ybV90YXJnZXRzYCoqPGJyPjxicj4gV2hldGhlciB0aGUgcGxhdGZvcm0gaGFzIHBsYXRmb3JtLXNwZWNpZmljIHRhcmdldHMgdG8gZGVwZW5kIG9uLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4gfAogfCAqKmBpbnN0YWxsX3RhcmdldF9wYXRoYCoqPGJyPjxicj4gVGhlIHBhdGggdG8gdGhlIGduaSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluc3RhbGxfdGFyZ2V0IHRlbXBsYXRlIHdoaWNoIGRlZmluZXMgaG93IHRoZSBidWlsZCBzaG91bGQgcHJvZHVjZSB0aGUgaW5zdGFsbC8gZGlyZWN0b3J5Ljxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYCIvL3N0YXJib2FyZC9idWlsZC9pbnN0YWxsL25vX2luc3RhbGwuZ25pImAuIHwKK3wgKipgaXNfY2xhbmdfMTZgKio8YnI+PGJyPiBFbmFibGUgd2hlbiB1c2luZyBjbGFuZyAxNi48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuIHwKIHwgKipgbG9hZGFibGVfbW9kdWxlX2NvbmZpZ3NgKio8YnI+PGJyPiBUYXJnZXQtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIGxvYWRhYmxlX21vZHVsZSB0YXJnZXRzLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYFtdYC4gfAotfCAqKmBwYXRoX3RvX3lhc21gKio8YnI+PGJyPiBXaGVyZSB5YXNtIGNhbiBiZSBmb3VuZCBvbiB0aGUgaG9zdCBkZXZpY2UuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgInlhc20iYC4gfAorfCAqKmBuYXNtX2V4aXN0c2AqKjxicj48YnI+IEVuYWJsZXMgdGhlIG5hc20gY29tcGlsZXIgdG8gYmUgdXNlZCB0byBjb21waWxlIC5hc20gZmlsZXMuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiB8Cit8ICoqYHBhdGhfdG9fbmFzbWAqKjxicj48YnI+IFdoZXJlIHlhc20gY2FuIGJlIGZvdW5kIG9uIHRoZSBob3N0IGRldmljZS48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGAibmFzbSJgLiB8CiB8ICoqYHBsYXRmb3JtX3Rlc3RzX3BhdGhgKio8YnI+PGJyPiBTZXQgdG8gdGhlIHN0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cyB0YXJnZXQgaWYgdGhlIHBsYXRmb3JtIGltcGxlbWVudHMgdGhlbS48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGAiImAuIHwKIHwgKipgc2FiaV9wYXRoYCoqPGJyPjxicj4gV2hlcmUgdGhlIFN0YXJib2FyZCBBQkkgZmlsZSBmb3IgdGhpcyBwbGF0Zm9ybSBjYW4gYmUgZm91bmQuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgInN0YXJib2FyZC9zYWJpL2RlZmF1bHQvc2FiaS5qc29uImAuIHwKLXwgKipgc2JfYXBpX3ZlcnNpb25gKio8YnI+PGJyPiBUaGUgU3RhcmJvYXJkIEFQSSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IGJ1aWxkIGNvbmZpZ3VyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gYnkgYSBTdGFyYm9hcmQgQUJJIGZpbGUuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMTVgLiB8Cit8ICoqYHNiX2FwaV92ZXJzaW9uYCoqPGJyPjxicj4gVGhlIFN0YXJib2FyZCBBUEkgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBidWlsZCBjb25maWd1cmF0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBtZWFudCB0byBiZSBvdmVycmlkZGVuIGJ5IGEgU3RhcmJvYXJkIEFCSSBmaWxlLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYDE2YC4gfAogfCAqKmBzYl9lbmFibGVfYmVuY2htYXJrYCoqPGJyPjxicj4gVXNlZCB0byBlbmFibGUgYmVuY2htYXJrcy48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuIHwKIHwgKipgc2JfZW5hYmxlX2NwcDE3X2F1ZGl0YCoqPGJyPjxicj4gRW5hYmxlcyBhbiBOUExCIGF1ZGl0IG9mIEMrKzE3IHN1cHBvcnQuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuIHwKIHwgKipgc2JfZW5hYmxlX2xpYmAqKjxicj48YnI+IEVuYWJsZXMgZW1iZWRkaW5nIENvYmFsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGhpbiBhbm90aGVyIGFwcC4gVGhpcyByZXF1aXJlcyBhICdsaWInIHN0YXJib2FyZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGxhdGZvcm0uPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiB8CkBAIC0zOSw4ICs0MSwxMCBAQAogfCAqKmBzZXBhcmF0ZV9pbnN0YWxsX3RhcmdldHNfZm9yX2J1bmRsaW5nYCoqPGJyPjxicj4gU2V0IHRvIHRydWUgdG8gc2VwYXJhdGUgaW5zdGFsbCB0YXJnZXQgZGlyZWN0b3JpZXMuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiB8CiB8ICoqYHNoYXJlZF9saWJyYXJ5X2NvbmZpZ3NgKio8YnI+PGJyPiBUYXJnZXQtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHNoYXJlZF9saWJyYXJ5IHRhcmdldHMuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgW11gLiB8CiB8ICoqYHNvdXJjZV9zZXRfY29uZmlnc2AqKjxicj48YnI+IFRhcmdldC1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3Igc291cmNlX3NldCB0YXJnZXRzLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYFtdYC4gfAorfCAqKmBzdGFyYm9hcmRfbGV2ZWxfZmluYWxfZXhlY3V0YWJsZV90eXBlYCoqPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgImV4ZWN1dGFibGUiYC4gfAorfCAqKmBzdGFyYm9hcmRfbGV2ZWxfZ3Rlc3RfdGFyZ2V0X3R5cGVgKio8YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGAiZXhlY3V0YWJsZSJgLiB8CiB8ICoqYHN0YXRpY19saWJyYXJ5X2NvbmZpZ3NgKio8YnI+PGJyPiBUYXJnZXQtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHN0YXRpY19saWJyYXJ5IHRhcmdldHMuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgW11gLiB8CiB8ICoqYHVzZV9za2lhX25leHRgKio8YnI+PGJyPiBGbGFnIHRvIHVzZSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNraWEsIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4gfAogfCAqKmB1c2VfdGhpbl9hcmNoaXZlYCoqPGJyPjxicj4gV2hldGhlciBvciBub3QgdG8gbGluayB3aXRoIHRoaW4gYXJjaGl2ZXMuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuIHwKIHwgKipgdjhfZW5hYmxlX3BvaW50ZXJfY29tcHJlc3Npb25fb3ZlcnJpZGVgKio8YnI+PGJyPiBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgcG9pbnRlciBjb21wcmVzc2lvbiBmb3IgdjguPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuIHwKLXwgKipgeWFzbV9leGlzdHNgKio8YnI+PGJyPiBFbmFibGVzIHRoZSB5YXNtIGNvbXBpbGVyIHRvIGJlIHVzZWQgdG8gY29tcGlsZSAuYXNtIGZpbGVzLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4gfAorfCAqKmB2OF9lbmFibGVfd2ViYXNzZW1ibHlgKio8YnI+PGJyPiBFbmFibGUgV0FTTSBhbmQgaW5zdGFsbCBXZWJBc3NlbWJseSBnbG9iYWwuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiB8CmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9jaGFyYWN0ZXIubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9jaGFyYWN0ZXIubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmRjYWUuLjAwMDAwMDAKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY2hhcmFjdGVyLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS0tLQotbGF5b3V0OiBkb2MKLXRpdGxlOiAiU3RhcmJvYXJkIE1vZHVsZSBSZWZlcmVuY2U6IGNoYXJhY3Rlci5oIgotLS0tCi0KLVByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBjaGFyYWN0ZXJzLgotCi0jIyBGdW5jdGlvbnMgIyMKLQotIyMjIFNiQ2hhcmFjdGVySXNBbHBoYW51bWVyaWMgIyMjCi0KLUluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiA4LWJpdCBjaGFyYWN0ZXIgYGNgIChhcyBhbiBpbnQpIGlzIGFscGhhbnVtZXJpYyBpbgotdGhlIGN1cnJlbnQgbG9jYWxlLgotCi1gY2A6IFRoZSBjaGFyYWN0ZXIgdG8gYmUgZXZhbHVhdGVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1ib29sIFNiQ2hhcmFjdGVySXNBbHBoYW51bWVyaWMoaW50IGMpCi1gYGAKLQotIyMjIFNiQ2hhcmFjdGVySXNEaWdpdCAjIyMKLQotSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIDgtYml0IGNoYXJhY3RlciBgY2AgKGFzIGFuIGludCkgaXMgYSBkZWNpbWFsIGRpZ2l0Ci1pbiB0aGUgY3VycmVudCBsb2NhbGUuCi0KLWBjYDogVGhlIGNoYXJhY3RlciB0byBiZSBldmFsdWF0ZWQuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWJvb2wgU2JDaGFyYWN0ZXJJc0RpZ2l0KGludCBjKQotYGBgCi0KLSMjIyBTYkNoYXJhY3RlcklzSGV4RGlnaXQgIyMjCi0KLUluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiA4LWJpdCBjaGFyYWN0ZXIgYGNgIChhcyBhbiBpbnQpIGlzIGEgaGV4YWRlY2ltYWwgaW4KLXRoZSBjdXJyZW50IGxvY2FsZS4KLQotYGNgOiBUaGUgY2hhcmFjdGVyIHRvIGJlIGV2YWx1YXRlZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotYm9vbCBTYkNoYXJhY3RlcklzSGV4RGlnaXQoaW50IGMpCi1gYGAKLQotIyMjIFNiQ2hhcmFjdGVySXNTcGFjZSAjIyMKLQotSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIDgtYml0IGNoYXJhY3RlciBgY2AgKGFzIGFuIGludCkgaXMgYSBzcGFjZSBpbiB0aGUKLWN1cnJlbnQgbG9jYWxlLgotCi1gY2A6IFRoZSBjaGFyYWN0ZXIgdG8gYmUgZXZhbHVhdGVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1ib29sIFNiQ2hhcmFjdGVySXNTcGFjZShpbnQgYykKLWBgYAotCi0jIyMgU2JDaGFyYWN0ZXJJc1VwcGVyICMjIwotCi1JbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gOC1iaXQgY2hhcmFjdGVyIGBjYCAoYXMgYW4gaW50KSBpcyB1cHBlcmNhc2UgaW4gdGhlCi1jdXJyZW50IGxvY2FsZS4KLQotYGNgOiBUaGUgY2hhcmFjdGVyIHRvIGJlIGV2YWx1YXRlZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotYm9vbCBTYkNoYXJhY3RlcklzVXBwZXIoaW50IGMpCi1gYGAKLQotIyMjIFNiQ2hhcmFjdGVyVG9Mb3dlciAjIyMKLQotQ29udmVydHMgdGhlIGdpdmVuIDgtYml0IGNoYXJhY3RlciAoYXMgYW4gaW50KSB0byBsb3dlcmNhc2UgaW4gdGhlIGN1cnJlbnQKLWxvY2FsZSBhbmQgcmV0dXJucyBhbiA4LWJpdCBjaGFyYWN0ZXIuIElmIHRoZXJlIGlzIG5vIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoZQotY2hhcmFjdGVyLCBvciB0aGUgY2hhcmFjdGVyIGlzIGFscmVhZHkgbG93ZXJjYXNlLCB0aGUgZnVuY3Rpb24ganVzdCByZXR1cm5zIHRoZQotY2hhcmFjdGVyIGFzLWlzLgotCi1gY2A6IFRoZSBjaGFyYWN0ZXIgdG8gYmUgY29udmVydGVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1pbnQgU2JDaGFyYWN0ZXJUb0xvd2VyKGludCBjKQotYGBgCi0KLSMjIyBTYkNoYXJhY3RlclRvVXBwZXIgIyMjCi0KLUNvbnZlcnRzIHRoZSBnaXZlbiA4LWJpdCBjaGFyYWN0ZXIgKGFzIGFuIGludCkgdG8gdXBwZXJjYXNlIGluIHRoZSBjdXJyZW50Ci1sb2NhbGUgYW5kIHJldHVybnMgYW4gOC1iaXQgY2hhcmFjdGVyLiBJZiB0aGVyZSBpcyBubyB1cHBlcmNhc2UgdmVyc2lvbiBvZiB0aGUKLWNoYXJhY3Rlciwgb3IgdGhlIGNoYXJhY3RlciBpcyBhbHJlYWR5IHVwcGVyY2FzZSwgdGhlIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyB0aGUKLWNoYXJhY3RlciBhcy1pcy4KLQotYGNgOiBUaGUgY2hhcmFjdGVyIHRvIGJlIGNvbnZlcnRlZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IFNiQ2hhcmFjdGVyVG9VcHBlcihpbnQgYykKLWBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9kb3VibGUubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9kb3VibGUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjdiNTAuLjAwMDAwMDAKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvZG91YmxlLm1kCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLS0tCi1sYXlvdXQ6IGRvYwotdGl0bGU6ICJTdGFyYm9hcmQgTW9kdWxlIFJlZmVyZW5jZTogZG91YmxlLmgiCi0tLS0KLQotUHJvdmlkZXMgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBoZWxwZXIgZnVuY3Rpb25zLgotCi0jIyBGdW5jdGlvbnMgIyMKLQotIyMjIFNiRG91YmxlQWJzb2x1dGUgIyMjCi0KLVJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnaXZlbiBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcgotYGRgLCBwcmVzZXJ2aW5nIGBOYU5gIGFuZCBpbmZpbml0eS4KLQotYGRgOiBUaGUgbnVtYmVyIHRvIGJlIGFkanVzdGVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1kb3VibGUgU2JEb3VibGVBYnNvbHV0ZShjb25zdCBkb3VibGUgZCkKLWBgYAotCi0jIyMgU2JEb3VibGVFeHBvbmVudCAjIyMKLQotUmV0dXJucyBgYmFzZWAgdGFrZW4gdG8gdGhlIHBvd2VyIG9mIGBleHBvbmVudGAuCi0KLWBiYXNlYDogVGhlIG51bWJlciB0byBiZSBhZGp1c3RlZC4gYGV4cG9uZW50YDogVGhlIHBvd2VyIHRvIHdoaWNoIHRoZSBgYmFzZWAKLW51bWJlciBzaG91bGQgYmUgcmFpc2VkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1kb3VibGUgU2JEb3VibGVFeHBvbmVudChjb25zdCBkb3VibGUgYmFzZSwgY29uc3QgZG91YmxlIGV4cG9uZW50KQotYGBgCi0KLSMjIyBTYkRvdWJsZUZsb29yICMjIwotCi1GbG9vcnMgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIgYGRgIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuCi0KLWBkYDogVGhlIG51bWJlciB0byBiZSBmbG9vcmVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1kb3VibGUgU2JEb3VibGVGbG9vcihjb25zdCBkb3VibGUgZCkKLWBgYAotCi0jIyMgU2JEb3VibGVJc0Zpbml0ZSAjIyMKLQotRGV0ZXJtaW5lcyB3aGV0aGVyIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyIGBkYCByZXByZXNlbnRzIGEKLWZpbml0ZSBudW1iZXIuCi0KLWBkYDogVGhlIG51bWJlciB0byBiZSBldmFsdWF0ZWQuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWJvb2wgU2JEb3VibGVJc0Zpbml0ZShjb25zdCBkb3VibGUgZCkKLWBgYAotCi0jIyMgU2JEb3VibGVJc05hbiAjIyMKLQotRGV0ZXJtaW5lcyB3aGV0aGVyIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyIGBkYCByZXByZXNlbnRzICJOb3QgYQotTnVtYmVyLiIKLQotYGRgOiBUaGUgbnVtYmVyIHRvIGJlIGV2YWx1YXRlZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotYm9vbCBTYkRvdWJsZUlzTmFuKGNvbnN0IGRvdWJsZSBkKQotYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3NwZWVjaF9yZWNvZ25pemVyLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc3BlZWNoX3JlY29nbml6ZXIubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMWRjNmIuLjAwMDAwMDAKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc3BlZWNoX3JlY29nbml6ZXIubWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLS0tCi1sYXlvdXQ6IGRvYwotdGl0bGU6ICJTdGFyYm9hcmQgTW9kdWxlIFJlZmVyZW5jZTogc3BlZWNoX3JlY29nbml6ZXIuaCIKLS0tLQotCi1EZWZpbmVzIGEgc3RyZWFtaW5nIHNwZWVjaCByZWNvZ25pemVyIEFQSS4gSXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBwbGF0Zm9ybQotc3BlZWNoIHJlY29nbml0aW9uIHNlcnZpY2UuCi0KLU5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUgc3BlZWNoIHJlY29nbml6ZXIuIEF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgc2Vjb25kCi1zcGVlY2ggcmVjb2duaXplciB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGZpcnN0IG9uZSB3aWxsIHJlc3VsdCBpbiB1bmRlZmluZWQKLWJlaGF2aW9yLgotCi1gU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlYCwgYFNiU3BlZWNoUmVjb2duaXplclN0YXJ0YCwgYFNiU3BlZWNoUmVjb2duaXplclN0b3BgLAotYFNiU3BlZWNoUmVjb2duaXplckNhbmNlbGAgYW5kIGBTYlNwZWVjaFJlY29nbml6ZXJEZXN0cm95YCBzaG91bGQgYmUgY2FsbGVkIGZyb20KLWEgc2luZ2xlIHRocmVhZC4gQ2FsbGJhY2tzIGRlZmluZWQgaW4gYFNiU3BlZWNoUmVjb2duaXplckhhbmRsZXJgIHdpbGwgaGFwcGVuIG9uCi1hbm90aGVyIHRocmVhZCwgc28gY2FsbHMgYmFjayBpbnRvIHRoZSBTYlNwZWVjaFJlY29nbml6ZXIgZnJvbSB0aGUgY2FsbGJhY2sKLXRocmVhZCBhcmUgZGlzYWxsb3dlZC4KLQotIyMgTWFjcm9zICMjCi0KLSMjIyBrU2JTcGVlY2hSZWNvZ25pemVySW52YWxpZCAjIyMKLQotV2VsbC1kZWZpbmVkIHZhbHVlIGZvciBhbiBpbnZhbGlkIHNwZWVjaCByZWNvZ25pemVyIGhhbmRsZS4KLQotIyMgRW51bXMgIyMKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplckVycm9yICMjIwotCi1JbmRpY2F0ZXMgd2hhdCBoYXMgZ29uZSB3cm9uZyB3aXRoIHRoZSByZWNvZ25pdGlvbi4KLQotIyMjIyBWYWx1ZXMgIyMjIwotCi0qICAgYGtTYk5vU3BlZWNoRXJyb3JgCi0KLSAgICBObyBzcGVlY2ggd2FzIGRldGVjdGVkLiBTcGVlY2ggdGltZWQgb3V0LgotKiAgIGBrU2JBYm9ydGVkYAotCi0gICAgU3BlZWNoIGlucHV0IHdhcyBhYm9ydGVkIHNvbWVob3cuCi0qICAgYGtTYkF1ZGlvQ2FwdHVyZUVycm9yYAotCi0gICAgQXVkaW8gY2FwdHVyZSBmYWlsZWQuCi0qICAgYGtTYk5ldHdvcmtFcnJvcmAKLQotICAgIFNvbWUgbmV0d29yayBjb21tdW5pY2F0aW9uIHRoYXQgd2FzIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSByZWNvZ25pdGlvbgotICAgIGZhaWxlZC4KLSogICBga1NiTm90QWxsb3dlZGAKLQotICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgYWxsb3dpbmcgYW55IHNwZWVjaCBpbnB1dCB0byBvY2N1ciBmb3IgcmVhc29ucyBvZgotICAgIHNlY3VyaXR5LCBwcml2YWN5IG9yIHVzZXIgcHJlZmVyZW5jZS4KLSogICBga1NiU2VydmljZU5vdEFsbG93ZWRgCi0KLSAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm90IGFsbG93aW5nIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0ZWQgc3BlZWNoIHNlcnZpY2UsCi0gICAgYnV0IHdvdWxkIGFsbG93IHNvbWUgc3BlZWNoIHNlcnZpY2UsIHRvIGJlIHVzZWQgZWl0aGVyIGJlY2F1c2UgdGhlCi0gICAgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBvbmUgb3IgYmVjYXVzZSBvZiByZWFzb25zIG9mCi0gICAgc2VjdXJpdHksIHByaXZhY3kgb3IgdXNlciBwcmVmZXJlbmNlLgotKiAgIGBrU2JCYWRHcmFtbWFyYAotCi0gICAgVGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBzcGVlY2ggcmVjb2duaXRpb24gZ3JhbW1hciBvciBzZW1hbnRpYyB0YWdzLCBvcgotICAgIHRoZSBncmFtbWFyIGZvcm1hdCBvciBzZW1hbnRpYyB0YWcgZm9ybWF0IGlzIHN1cHBvcnRlZC4KLSogICBga1NiTGFuZ3VhZ2VOb3RTdXBwb3J0ZWRgCi0KLSAgICBUaGUgbGFuZ3VhZ2Ugd2FzIG5vdCBzdXBwb3J0ZWQuCi0KLSMjIFR5cGVkZWZzICMjCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXIgIyMjCi0KLUFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gaW1wbGVtZW50YXRpb24tcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc3BlZWNoCi1yZWNvZ25pemVyLgotCi0jIyMjIERlZmluaXRpb24gIyMjIwotCi1gYGAKLXR5cGVkZWYgc3RydWN0IFNiU3BlZWNoUmVjb2duaXplclByaXZhdGUqIFNiU3BlZWNoUmVjb2duaXplcgotYGBgCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJFcnJvckZ1bmN0aW9uICMjIwotCi1BIGZ1bmN0aW9uIHRvIG5vdGlmeSB0aGF0IGEgc3BlZWNoIHJlY29nbml0aW9uIGVycm9yIG9jY3VycmVkLiBgZXJyb3JgOiBUaGUKLW9jY3VycmVkIHNwZWVjaCByZWNvZ25pdGlvbiBlcnJvci4KLQotIyMjIyBEZWZpbml0aW9uICMjIyMKLQotYGBgCi10eXBlZGVmIHZvaWQoKiBTYlNwZWVjaFJlY29nbml6ZXJFcnJvckZ1bmN0aW9uKSAodm9pZCAqY29udGV4dCwgU2JTcGVlY2hSZWNvZ25pemVyRXJyb3IgZXJyb3IpCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplclJlc3VsdHNGdW5jdGlvbiAjIyMKLQotQSBmdW5jdGlvbiB0byBub3RpZnkgdGhhdCB0aGUgcmVjb2duaXRpb24gcmVzdWx0cyBhcmUgcmVhZHkuIGByZXN1bHRzYDogdGhlIGxpc3QKLW9mIHJlY29nbml0aW9uIHJlc3VsdHMuIGByZXN1bHRzX3NpemVgOiB0aGUgbnVtYmVyIG9mIGByZXN1bHRzYC4gYGlzX2ZpbmFsYDoKLWluZGljYXRlcyBpZiB0aGUgYHJlc3VsdHNgIGlzIGZpbmFsLgotCi0jIyMjIERlZmluaXRpb24gIyMjIwotCi1gYGAKLXR5cGVkZWYgdm9pZCgqIFNiU3BlZWNoUmVjb2duaXplclJlc3VsdHNGdW5jdGlvbikgKHZvaWQgKmNvbnRleHQsIFNiU3BlZWNoUmVzdWx0ICpyZXN1bHRzLCBpbnQgcmVzdWx0c19zaXplLCBib29sIGlzX2ZpbmFsKQotYGBgCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJTcGVlY2hEZXRlY3RlZEZ1bmN0aW9uICMjIwotCi1BIGZ1bmN0aW9uIHRvIG5vdGlmeSB0aGF0IHRoZSB1c2VyIGhhcyBzdGFydGVkIHRvIHNwZWFrIG9yIHN0b3BzIHNwZWFraW5nLgotYGRldGVjdGVkYDogdHJ1ZSBpZiB0aGUgdXNlciBoYXMgc3RhcnRlZCB0byBzcGVhaywgYW5kIGZhbHNlIGlmIHRoZSB1c2VyIHN0b3BzCi1zcGVha2luZy4KLQotIyMjIyBEZWZpbml0aW9uICMjIyMKLQotYGBgCi10eXBlZGVmIHZvaWQoKiBTYlNwZWVjaFJlY29nbml6ZXJTcGVlY2hEZXRlY3RlZEZ1bmN0aW9uKSAodm9pZCAqY29udGV4dCwgYm9vbCBkZXRlY3RlZCkKLWBgYAotCi0jIyBTdHJ1Y3RzICMjCi0KLSMjIyBTYlNwZWVjaENvbmZpZ3VyYXRpb24gIyMjCi0KLSMjIyMgTWVtYmVycyAjIyMjCi0KLSogICBgYm9vbCBjb250aW51b3VzYAotCi0gICAgV2hlbiB0aGUgY29udGludW91cyB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHJldHVybiBubwotICAgIG1vcmUgdGhhbiBvbmUgZmluYWwgcmVzdWx0IGluIHJlc3BvbnNlIHRvIHN0YXJ0aW5nIHJlY29nbml0aW9uLiBXaGVuIHRoZQotICAgIGNvbnRpbnVvdXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCByZXR1cm4gemVybyBvcgotICAgIG1vcmUgZmluYWwgcmVzdWx0cyByZXByZXNlbnRpbmcgbXVsdGlwbGUgY29uc2VjdXRpdmUgcmVjb2duaXRpb25zIGluCi0gICAgcmVzcG9uc2UgdG8gc3RhcnRpbmcgcmVjb2duaXRpb24uIFRoaXMgYXR0cmlidXRlIHNldHRpbmcgZG9lcyBub3QgYWZmZWN0Ci0gICAgaW50ZXJpbSByZXN1bHRzLgotKiAgIGBib29sIGludGVyaW1fcmVzdWx0c2AKLQotICAgIENvbnRyb2xzIHdoZXRoZXIgaW50ZXJpbSByZXN1bHRzIGFyZSByZXR1cm5lZC4gV2hlbiBzZXQgdG8gdHJ1ZSwgaW50ZXJpbQotICAgIHJlc3VsdHMgU0hPVUxEIGJlIHJldHVybmVkLiBXaGVuIHNldCB0byBmYWxzZSwgaW50ZXJpbSByZXN1bHRzIE1VU1QgTk9UIGJlCi0gICAgcmV0dXJuZWQuIFRoaXMgdmFsdWUgc2V0dGluZyBkb2VzIG5vdCBhZmZlY3QgZmluYWwgcmVzdWx0cy4KLSogICBgaW50IG1heF9hbHRlcm5hdGl2ZXNgCi0KLSAgICBUaGlzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFNiU3BlZWNoUmVzdWx0IGluCi0gICAgYFNiU3BlZWNoUmVjb2duaXplck9uUmVzdWx0c2AgY2FsbGJhY2suCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJIYW5kbGVyICMjIwotCi1BbGxvd3MgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgZGV2aWNlIHdoZW4gcmVjb2duaXRpb24gcmVsYXRlZCBldmVudHMKLW9jY3VyLgotCi1UaGUgdm9pZCogY29udGV4dCBpcyBwYXNzZWQgdG8gZXZlcnkgZnVuY3Rpb24uCi0KLSMjIyMgTWVtYmVycyAjIyMjCi0KLSogICBgU2JTcGVlY2hSZWNvZ25pemVyU3BlZWNoRGV0ZWN0ZWRGdW5jdGlvbiBvbl9zcGVlY2hfZGV0ZWN0ZWRgCi0KLSAgICBGdW5jdGlvbiB0byBub3RpZnkgdGhlIGJlZ2lubmluZy9lbmQgb2YgdGhlIHNwZWVjaC4KLSogICBgU2JTcGVlY2hSZWNvZ25pemVyRXJyb3JGdW5jdGlvbiBvbl9lcnJvcmAKLQotICAgIEZ1bmN0aW9uIHRvIG5vdGlmeSB0aGUgc3BlZWNoIGVycm9yLgotKiAgIGBTYlNwZWVjaFJlY29nbml6ZXJSZXN1bHRzRnVuY3Rpb24gb25fcmVzdWx0c2AKLQotICAgIEZ1bmN0aW9uIHRvIG5vdGlmeSB0aGF0IHRoZSByZWNvZ25pdGlvbiByZXN1bHRzIGFyZSBhdmFpbGFibGUuCi0qICAgYHZvaWQgKiBjb250ZXh0YAotCi0gICAgVGhpcyBpcyBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgYXMgZmlyc3QgYXJndW1lbnQuCi0KLSMjIyBTYlNwZWVjaFJlc3VsdCAjIyMKLQotVGhlIHJlY29nbml0aW9uIHJlc3BvbnNlIHRoYXQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVjb2duaXplci4KLQotIyMjIyBNZW1iZXJzICMjIyMKLQotKiAgIGBjaGFyICogdHJhbnNjcmlwdGAKLQotICAgIFRoZSByYXcgd29yZHMgdGhhdCB0aGUgdXNlciBzcG9rZS4KLSogICBgZmxvYXQgY29uZmlkZW5jZWAKLQotICAgIEEgbnVtZXJpYyBlc3RpbWF0ZSBiZXR3ZWVuIDAgYW5kIDEgb2YgaG93IGNvbmZpZGVudCB0aGUgcmVjb2duaXRpb24gc3lzdGVtCi0gICAgaXMgdGhhdCB0aGUgcmVjb2duaXRpb24gaXMgY29ycmVjdC4gQSBoaWdoZXIgbnVtYmVyIG1lYW5zIHRoZSBzeXN0ZW0gaXMgbW9yZQotICAgIGNvbmZpZGVudC4gTmFOIHJlcHJlc2VudHMgYW4gdW5hdmFpbGFibGUgY29uZmlkZW5jZSBzY29yZS4KLQotIyMgRnVuY3Rpb25zICMjCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJDYW5jZWwgIyMjCi0KLUNhbmNlbHMgc3BlZWNoIHJlY29nbml0aW9uLiBUaGUgc3BlZWNoIHJlY29nbml6ZXIgc3RvcHMgbGlzdGVuaW5nIHRvIGF1ZGlvIGFuZAotZG9lcyBub3QgcmV0dXJuIGFueSBpbmZvcm1hdGlvbi4gV2hlbiBgU2JTcGVlY2hSZWNvZ25pemVyQ2FuY2VsYCBpcyBjYWxsZWQsIHRoZQotaW1wbGVtZW50YXRpb24gTVVTVCBOT1QgY29sbGVjdCBhZGRpdGlvbmFsIGF1ZGlvLCBNVVNUIE5PVCBjb250aW51ZSB0byBsaXN0ZW4gdG8KLXRoZSB1c2VyLCBhbmQgTVVTVCBzdG9wIHJlY29nbml6aW5nLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgcHJpdmFjeSByZWFzb25zLiBJZgotYFNiU3BlZWNoUmVjb2duaXplckNhbmNlbGAgaXMgY2FsbGVkIG9uIGEgc3BlZWNoIHJlY29nbml6ZXIgd2hpY2ggaXMgYWxyZWFkeQotc3RvcHBlZCBvciBjYW5jZWxsZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIGlnbm9yZSB0aGUgY2FsbC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCBTYlNwZWVjaFJlY29nbml6ZXJDYW5jZWwoU2JTcGVlY2hSZWNvZ25pemVyIHJlY29nbml6ZXIpCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZSAjIyMKLQotQ3JlYXRlcyBhIHNwZWVjaCByZWNvZ25pemVyIHdpdGggYSBzcGVlY2ggcmVjb2duaXplciBoYW5kbGVyLgotCi1JZiB0aGUgc3lzdGVtIGhhcyBhIHNwZWVjaCByZWNvZ25pdGlvbiBzZXJ2aWNlIGF2YWlsYWJsZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi10aGUgbmV3bHkgY3JlYXRlZCBoYW5kbGUuCi0KLUlmIG5vIHNwZWVjaCByZWNvZ25pdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlLCB0aGlzIGZ1bmN0aW9uCi1yZXR1cm5zIGBrU2JTcGVlY2hSZWNvZ25pemVySW52YWxpZGAuCi0KLWBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGVgIGRvZXMgbm90IGV4cGVjdCB0aGUgcGFzc2VkIFNiU3BlZWNoUmVjb2duaXplckhhbmRsZXIKLXN0cnVjdHVyZSB0byBsaXZlIGFmdGVyIGBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGVgIGlzIGNhbGxlZCwgc28gdGhlCi1pbXBsZW1lbnRhdGlvbiBtdXN0IGNvcHkgdGhlIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotU2JTcGVlY2hSZWNvZ25pemVyIFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZShjb25zdCBTYlNwZWVjaFJlY29nbml6ZXJIYW5kbGVyICpoYW5kbGVyKQotYGBgCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJEZXN0cm95ICMjIwotCi1EZXN0cm95cyB0aGUgZ2l2ZW4gc3BlZWNoIHJlY29nbml6ZXIuIElmIHRoZSBzcGVlY2ggcmVjb2duaXplciBpcyBpbiB0aGUgc3RhcnRlZAotc3RhdGUsIGl0IGlzIGZpcnN0IHN0b3BwZWQgYW5kIHRoZW4gZGVzdHJveWVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkIFNiU3BlZWNoUmVjb2duaXplckRlc3Ryb3koU2JTcGVlY2hSZWNvZ25pemVyIHJlY29nbml6ZXIpCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplcklzU3VwcG9ydGVkICMjIwotCi1SZXR1cm5zIHdoZXRoZXIgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIFNiU3BlZWNoUmVjb2duaXplci4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotYm9vbCBTYlNwZWVjaFJlY29nbml6ZXJJc1N1cHBvcnRlZCgpCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplcklzVmFsaWQgIyMjCi0KLUluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBzcGVlY2ggcmVjb2duaXplciBpcyB2YWxpZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGJvb2wgU2JTcGVlY2hSZWNvZ25pemVySXNWYWxpZChTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplcikKLWBgYAotCi0jIyMgU2JTcGVlY2hSZWNvZ25pemVyU3RhcnQgIyMjCi0KLVN0YXJ0cyBsaXN0ZW5pbmcgdG8gYXVkaW8gYW5kIHJlY29nbml6aW5nIHNwZWVjaCB3aXRoIHRoZSBzcGVjaWZpZWQgc3BlZWNoCi1jb25maWd1cmF0aW9uLiBJZiBgU2JTcGVlY2hSZWNvZ25pemVyU3RhcnRgIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHN0YXJ0ZWQKLXNwZWVjaCByZWNvZ25pemVyLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBpZ25vcmUgdGhlIGNhbGwgYW5kIHJldHVybiBmYWxzZS4KLQotUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVlY2ggcmVjb2duaXplciBpcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotYm9vbCBTYlNwZWVjaFJlY29nbml6ZXJTdGFydChTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplciwgY29uc3QgU2JTcGVlY2hDb25maWd1cmF0aW9uICpjb25maWd1cmF0aW9uKQotYGBgCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJTdG9wICMjIwotCi1TdG9wcyBsaXN0ZW5pbmcgdG8gYXVkaW8gYW5kIHJldHVybnMgYSByZXN1bHQgdXNpbmcganVzdCB0aGUgYXVkaW8gdGhhdCBpdCBoYXMKLWFscmVhZHkgcmVjZWl2ZWQuIE9uY2UgYFNiU3BlZWNoUmVjb2duaXplclN0b3BgIGlzIGNhbGxlZCwgdGhlIGltcGxlbWVudGF0aW9uCi1NVVNUIE5PVCBjb2xsZWN0IGFkZGl0aW9uYWwgYXVkaW8gYW5kIE1VU1QgTk9UIGNvbnRpbnVlIHRvIGxpc3RlbiB0byB0aGUgdXNlci4KLVRoaXMgaXMgaW1wb3J0YW50IGZvciBwcml2YWN5IHJlYXNvbnMuIElmIGBTYlNwZWVjaFJlY29nbml6ZXJTdG9wYCBpcyBjYWxsZWQgb24KLWEgc3BlZWNoIHJlY29nbml6ZXIgd2hpY2ggaXMgYWxyZWFkeSBzdG9wcGVkIG9yIGJlaW5nIHN0b3BwZWQsIHRoZQotaW1wbGVtZW50YXRpb24gTVVTVCBpZ25vcmUgdGhlIGNhbGwuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXZvaWQgU2JTcGVlY2hSZWNvZ25pemVyU3RvcChTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplcikKLWBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zdHJpbmcubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zdHJpbmcubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlY2UxMzYuLjAwMDAwMDAKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc3RyaW5nLm1kCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS0tLQotbGF5b3V0OiBkb2MKLXRpdGxlOiAiU3RhcmJvYXJkIE1vZHVsZSBSZWZlcmVuY2U6IHN0cmluZy5oIgotLS0tCi0KLURlZmluZXMgZnVuY3Rpb25zIGZvciBpbnRlcmFjdGluZyB3aXRoIGMtc3R5bGUgc3RyaW5ncy4KLQotIyMgRnVuY3Rpb25zICMjCi0KLSMjIyBTYlN0cmluZ0FUb0kgIyMjCi0KLVBhcnNlcyBhIHN0cmluZyBpbnRvIGEgYmFzZS0xMCBpbnRlZ2VyLiBUaGlzIGlzIGEgc2hvcnRoYW5kIHJlcGxhY2VtZW50IGZvcgotYGF0b2lgLgotCi1gdmFsdWVgOiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGludCBTYlN0cmluZ0FUb0koY29uc3QgY2hhciAqdmFsdWUpCi1gYGAKLQotIyMjIFNiU3RyaW5nQVRvTCAjIyMKLQotUGFyc2VzIGEgc3RyaW5nIGludG8gYSBiYXNlLTEwLCBsb25nIGludGVnZXIuIFRoaXMgaXMgYSBzaG9ydGhhbmQgcmVwbGFjZW1lbnQKLWZvciBgYXRvbGAuCi0KLWB2YWx1ZWA6IFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkLiBOT0xJTlRORVhUTElORShydW50aW1lL2ludCkKLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGxvbmcgU2JTdHJpbmdBVG9MKGNvbnN0IGNoYXIgKnZhbHVlKQotYGBgCi0KLSMjIyBTYlN0cmluZ0NvbXBhcmUgIyMjCi0KLUNvbXBhcmVzIHRoZSBmaXJzdCBgY291bnRgIGNoYXJhY3RlcnMgb2YgdHdvIDgtYml0IGNoYXJhY3RlciBzdHJpbmdzLiBUaGUgcmV0dXJuCi12YWx1ZSBpczoKLQotKiAgIGA8IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgbG93ZXIgdGhhbiBgc3RyaW5nMmAuCi0KLSogICBgMGAgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbC4KLQotKiAgIGA+IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgaGlnaGVyIHRoYW4gYHN0cmluZzJgLgotCi1UaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHN0cm5jbXBgLgotCi1gc3RyaW5nMWA6IFRoZSBmaXJzdCA4LWJpdCBjaGFyYWN0ZXIgc3RyaW5nIHRvIGNvbXBhcmUuIGBzdHJpbmcyYDogVGhlIHNlY29uZAotOC1iaXQgY2hhcmFjdGVyIHN0cmluZyB0byBjb21wYXJlLiBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29tcGFyZS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IFNiU3RyaW5nQ29tcGFyZShjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyLCBzaXplX3QgY291bnQpCi1gYGAKLQotIyMjIFNiU3RyaW5nQ29tcGFyZUFsbCAjIyMKLQotQ29tcGFyZXMgdHdvIGVudGlyZSA4LWJpdCBjaGFyYWN0ZXIgc3RyaW5ncy4gVGhlIHJldHVybiB2YWx1ZSBpczoKLQotKiAgIGA8IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgbG93ZXIgdGhhbiBgc3RyaW5nMmAuCi0KLSogICBgMGAgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbC4KLQotKiAgIGA+IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgaGlnaGVyIHRoYW4gYHN0cmluZzJgLgotCi1UaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHN0cmNtcGAuCi0KLWBzdHJpbmcxYDogVGhlIGZpcnN0IDgtYml0IGNoYXJhY3RlciBzdHJpbmcgdG8gY29tcGFyZS4gYHN0cmluZzJgOiBUaGUgc2Vjb25kCi04LWJpdCBjaGFyYWN0ZXIgc3RyaW5nIHRvIGNvbXBhcmUuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWludCBTYlN0cmluZ0NvbXBhcmVBbGwoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMikKLWBgYAotCi0jIyMgU2JTdHJpbmdDb21wYXJlTm9DYXNlICMjIwotCi1Db21wYXJlcyB0d28gc3RyaW5ncywgaWdub3JpbmcgZGlmZmVyZW5jZXMgaW4gY2FzZS4gVGhlIHJldHVybiB2YWx1ZSBpczoKLQotKiAgIGA8IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgbG93ZXIgdGhhbiBgc3RyaW5nMmAuCi0KLSogICBgMGAgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbC4KLQotKiAgIGA+IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgaGlnaGVyIHRoYW4gYHN0cmluZzJgLgotCi1UaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHN0cmNhc2VjbXBgLgotCi1gc3RyaW5nMWA6IFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gYHN0cmluZzJgOiBUaGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1pbnQgU2JTdHJpbmdDb21wYXJlTm9DYXNlKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIpCi1gYGAKLQotIyMjIFNiU3RyaW5nQ29tcGFyZU5vQ2FzZU4gIyMjCi0KLUNvbXBhcmVzIHRoZSBmaXJzdCBgY291bnRgIGNoYXJhY3RlcnMgb2YgdHdvIHN0cmluZ3MsIGlnbm9yaW5nIGRpZmZlcmVuY2VzIGluCi1jYXNlLiBUaGUgcmV0dXJuIHZhbHVlIGlzOgotCi0qICAgYDwgMGAgaWYgYHN0cmluZzFgIGlzIEFTQ0lJLWJldGljYWxseSBsb3dlciB0aGFuIGBzdHJpbmcyYC4KLQotKiAgIGAwYCBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIGVxdWFsLgotCi0qICAgYD4gMGAgaWYgYHN0cmluZzFgIGlzIEFTQ0lJLWJldGljYWxseSBoaWdoZXIgdGhhbiBgc3RyaW5nMmAuCi0KLVRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBgc3RybmNhc2VjbXBgLgotCi1gc3RyaW5nMWA6IFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gYHN0cmluZzJgOiBUaGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLgotYGNvdW50YDogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvbXBhcmUuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWludCBTYlN0cmluZ0NvbXBhcmVOb0Nhc2VOKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIsIHNpemVfdCBjb3VudCkKLWBgYAotCi0jIyMgU2JTdHJpbmdDb21wYXJlV2lkZSAjIyMKLQotQ29tcGFyZXMgdGhlIGZpcnN0IGBjb3VudGAgY2hhcmFjdGVycyBvZiB0d28gMTYtYml0IGNoYXJhY3RlciBzdHJpbmdzLiBUaGUKLXJldHVybiB2YWx1ZSBpczoKLQotKiAgIGA8IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgbG93ZXIgdGhhbiBgc3RyaW5nMmAuCi0KLSogICBgMGAgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbC4KLQotKiAgIGA+IDBgIGlmIGBzdHJpbmcxYCBpcyBBU0NJSS1iZXRpY2FsbHkgaGlnaGVyIHRoYW4gYHN0cmluZzJgLgotCi1UaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHdjc25jbXBgLgotCi1gc3RyaW5nMWA6IFRoZSBmaXJzdCAxNi1iaXQgY2hhcmFjdGVyIHN0cmluZyB0byBjb21wYXJlLndlaXJkIGBzdHJpbmcyYDogVGhlCi1zZWNvbmQgMTYtYml0IGNoYXJhY3RlciBzdHJpbmcgdG8gY29tcGFyZS4gYGNvdW50YDogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvCi1jb21wYXJlLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1pbnQgU2JTdHJpbmdDb21wYXJlV2lkZShjb25zdCB3Y2hhcl90ICpzdHJpbmcxLCBjb25zdCB3Y2hhcl90ICpzdHJpbmcyLCBzaXplX3QgY291bnQpCi1gYGAKLQotIyMjIFNiU3RyaW5nQ29uY2F0ICMjIwotCi1BcHBlbmRzIGBzb3VyY2VgIHRvIGBvdXRfZGVzdGluYXRpb25gIGFzIGxvbmcgYXMgYG91dF9kZXN0aW5hdGlvbmAgaGFzIGVub3VnaAotc3RvcmFnZSBzcGFjZSB0byBob2xkIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nLgotCi1UaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHN0cmxjYXRgLiBBbHNvIG5vdGUgdGhhdAotdGhpcyBmdW5jdGlvbidzIHNpZ25hdHVyZSBpcyBOT1QgY29tcGF0aWJsZSB3aXRoIGBzdHJuY2F0YC4KLQotYG91dF9kZXN0aW5hdGlvbmA6IFRoZSBzdHJpbmcgdG8gd2hpY2ggdGhlIGBzb3VyY2VgIHN0cmluZyBpcyBhcHBlbmRlZC4KLWBzb3VyY2VgOiBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcuCi1gZGVzdGluYXRpb25fc2l6ZWA6IFRoZSBhbW91bnQgb2Ygc3RvcmFnZSBzcGFjZSBhdmFpbGFibGUgZm9yIHRoZSBjb25jYXRlbmF0ZWQKLXN0cmluZy4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IFNiU3RyaW5nQ29uY2F0KGNoYXIgKm91dF9kZXN0aW5hdGlvbiwgY29uc3QgY2hhciAqc291cmNlLCBpbnQgZGVzdGluYXRpb25fc2l6ZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdDb25jYXRVbnNhZmUgIyMjCi0KLUFuIGlubGluZSB3cmFwcGVyIGZvciBhbiB1bnNhZmUgU2JTdHJpbmdDb25jYXQgdGhhdCBhc3N1bWVzIHRoYXQgdGhlCi1gb3V0X2Rlc3RpbmF0aW9uYCBwcm92aWRlcyBlbm91Z2ggc3RvcmFnZSBzcGFjZSBmb3IgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcuCi1Ob3RlIHRoYXQgdGhpcyBmdW5jdGlvbidzIHNpZ25hdHVyZSBpcyBOT1QgY29tcGF0aWJsZSB3aXRoIGBzdHJjYXRgLgotCi1gb3V0X2Rlc3RpbmF0aW9uYDogVGhlIHN0cmluZyB0byB3aGljaCB0aGUgYHNvdXJjZWAgc3RyaW5nIGlzIGFwcGVuZGVkLgotYHNvdXJjZWA6IFRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGludCBTYlN0cmluZ0NvbmNhdFVuc2FmZShjaGFyICpvdXRfZGVzdGluYXRpb24sIGNvbnN0IGNoYXIgKnNvdXJjZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdDb25jYXRXaWRlICMjIwotCi1JZGVudGljYWwgdG8gU2JTdHJpbmdDYXQsIGJ1dCBmb3Igd2lkZSBjaGFyYWN0ZXJzLgotCi1gb3V0X2Rlc3RpbmF0aW9uYDogVGhlIHN0cmluZyB0byB3aGljaCB0aGUgYHNvdXJjZWAgc3RyaW5nIGlzIGFwcGVuZGVkLgotYHNvdXJjZWA6IFRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4KLWBkZXN0aW5hdGlvbl9zaXplYDogVGhlIGFtb3VudCBvZiBzdG9yYWdlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlIGNvbmNhdGVuYXRlZAotc3RyaW5nLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1pbnQgU2JTdHJpbmdDb25jYXRXaWRlKHdjaGFyX3QgKm91dF9kZXN0aW5hdGlvbiwgY29uc3Qgd2NoYXJfdCAqc291cmNlLCBpbnQgZGVzdGluYXRpb25fc2l6ZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdDb3B5ICMjIwotCi1Db3BpZXMgYXMgbXVjaCBvZiBhIGBzb3VyY2VgIHN0cmluZyBhcyBwb3NzaWJsZSBhbmQgbnVsbC10ZXJtaW5hdGVzIGl0LCBnaXZlbgotdGhhdCBgZGVzdGluYXRpb25fc2l6ZWAgY2hhcmFjdGVycyBvZiBzdG9yYWdlIGFyZSBhdmFpbGFibGUuIFRoaXMgZnVuY3Rpb24gaXMKLW1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHN0cmxjcHlgLgotCi1UaGUgcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIGBzb3VyY2VgLgotCi1gb3V0X2Rlc3RpbmF0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBzdHJpbmcgaXMgY29waWVkLiBgc291cmNlYDogVGhlCi1zdHJpbmcgdG8gYmUgY29waWVkLiBgZGVzdGluYXRpb25fc2l6ZWA6IFRoZSBhbW91bnQgb2YgdGhlIHNvdXJjZSBzdHJpbmcgdG8KLWNvcHkuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWludCBTYlN0cmluZ0NvcHkoY2hhciAqb3V0X2Rlc3RpbmF0aW9uLCBjb25zdCBjaGFyICpzb3VyY2UsIGludCBkZXN0aW5hdGlvbl9zaXplKQotYGBgCi0KLSMjIyBTYlN0cmluZ0NvcHlVbnNhZmUgIyMjCi0KLUFuIGlubGluZSB3cmFwcGVyIGZvciBhbiB1bnNhZmUgU2JTdHJpbmdDb3B5IHRoYXQgYXNzdW1lcyB0aGF0IHRoZSBkZXN0aW5hdGlvbgotcHJvdmlkZXMgZW5vdWdoIHN0b3JhZ2Ugc3BhY2UgZm9yIHRoZSBlbnRpcmUgc3RyaW5nLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEKLXBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4KLXJlcGxhY2VtZW50IGZvciBgc3RyY3B5YC4KLQotYG91dF9kZXN0aW5hdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB0aGUgc3RyaW5nIGlzIGNvcGllZC4gYHNvdXJjZWA6IFRoZQotc3RyaW5nIHRvIGJlIGNvcGllZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGNoYXIqIFNiU3RyaW5nQ29weVVuc2FmZShjaGFyICpvdXRfZGVzdGluYXRpb24sIGNvbnN0IGNoYXIgKnNvdXJjZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdDb3B5V2lkZSAjIyMKLQotSWRlbnRpY2FsIHRvIFNiU3RyaW5nQ29weSwgYnV0IGZvciB3aWRlIGNoYXJhY3RlcnMuCi0KLWBvdXRfZGVzdGluYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIHN0cmluZyBpcyBjb3BpZWQuIGBzb3VyY2VgOiBUaGUKLXN0cmluZyB0byBiZSBjb3BpZWQuIGBkZXN0aW5hdGlvbl9zaXplYDogVGhlIGFtb3VudCBvZiB0aGUgc291cmNlIHN0cmluZyB0bwotY29weS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IFNiU3RyaW5nQ29weVdpZGUod2NoYXJfdCAqb3V0X2Rlc3RpbmF0aW9uLCBjb25zdCB3Y2hhcl90ICpzb3VyY2UsIGludCBkZXN0aW5hdGlvbl9zaXplKQotYGBgCi0KLSMjIyBTYlN0cmluZ0R1cGxpY2F0ZSAjIyMKLQotQ29waWVzIGBzb3VyY2VgIGludG8gYSBidWZmZXIgdGhhdCBpcyBhbGxvY2F0ZWQgYnkgdGhpcyBmdW5jdGlvbiBhbmQgdGhhdCBjYW4gYmUKLWZyZWVkIHdpdGggU2JNZW1vcnlEZWFsbG9jYXRlLiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbgotcmVwbGFjZW1lbnQgZm9yIGBzdHJkdXBgLgotCi1gc291cmNlYDogVGhlIHN0cmluZyB0byBiZSBjb3BpZWQuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWNoYXIqIFNiU3RyaW5nRHVwbGljYXRlKGNvbnN0IGNoYXIgKnNvdXJjZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdGaW5kQ2hhcmFjdGVyICMjIwotCi1GaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIGBjaGFyYWN0ZXJgIGluIGBzdHJgLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEKLXBvaW50ZXIgdG8gdGhlIGZvdW5kIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9yIGBOVUxMYCBpZiB0aGUgY2hhcmFjdGVyIGlzCi1ub3QgZm91bmQuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlIGRvZXMgTk9UIG1hdGNoIHRoYXQgb2YgdGhlCi1gc3RyY2hyYCBmdW5jdGlvbi4KLQotYHN0cmA6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgY2hhcmFjdGVyLiBgY2hhcmFjdGVyYDogVGhlIGNoYXJhY3RlciB0bwotZmluZCBpbiB0aGUgc3RyaW5nLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1jb25zdCBjaGFyKiBTYlN0cmluZ0ZpbmRDaGFyYWN0ZXIoY29uc3QgY2hhciAqc3RyLCBjaGFyIGNoYXJhY3RlcikKLWBgYAotCi0jIyMgU2JTdHJpbmdGaW5kTGFzdENoYXJhY3RlciAjIyMKLQotRmluZHMgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNwZWNpZmllZCBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcuIFRoZSByZXR1cm4gdmFsdWUKLWlzIGEgcG9pbnRlciB0byB0aGUgZm91bmQgY2hhcmFjdGVyIGluIHRoZSBnaXZlbiBzdHJpbmcgb3IgYE5VTExgIGlmIHRoZQotY2hhcmFjdGVyIGlzIG5vdCBmb3VuZC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24ncyBzaWduYXR1cmUgZG9lcyBOT1QgbWF0Y2ggdGhhdAotb2YgdGhlIGBzdHJyY2hyYCBmdW5jdGlvbi4KLQotYHN0cmA6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgY2hhcmFjdGVyLiBgY2hhcmFjdGVyYDogVGhlIGNoYXJhY3RlciB0bwotZmluZCBpbiB0aGUgc3RyaW5nLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1jb25zdCBjaGFyKiBTYlN0cmluZ0ZpbmRMYXN0Q2hhcmFjdGVyKGNvbnN0IGNoYXIgKnN0ciwgY2hhciBjaGFyYWN0ZXIpCi1gYGAKLQotIyMjIFNiU3RyaW5nRmluZFN0cmluZyAjIyMKLQotRmluZHMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHN0cjJgIGluIGBzdHIxYC4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8KLXRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIHN0cmluZyBvciBgTlVMTGAgaWYgdGhlIHN0cmluZyBpcyBub3QgZm91bmQuIFRoaXMKLWZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHN0cnN0cmAuCi0KLWBzdHIxYDogVGhlIHN0cmluZyBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBwcmVzZW5jZSBvZiBgc3RyMmAuIGBzdHIyYDogVGhlCi1zdHJpbmcgdG8gbG9jYXRlIGluIGBzdHIxYC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotY29uc3QgY2hhciogU2JTdHJpbmdGaW5kU3RyaW5nKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCi1gYGAKLQotIyMjIFNiU3RyaW5nRm9ybWF0ICMjIwotCi1Qcm9kdWNlcyBhIHN0cmluZyBmb3JtYXR0ZWQgd2l0aCBgZm9ybWF0YCBhbmQgYGFyZ3VtZW50c2AsIHBsYWNpbmcgYXMgbXVjaCBvZgotdGhlIHJlc3VsdCB0aGF0IHdpbGwgZml0IGludG8gYG91dF9idWZmZXJgLiBUaGUgcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUKLW51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIGZvcm1hdCB3b3VsZCBwcm9kdWNlIGlmIGBidWZmZXJfc2l6ZWAgd2VyZQotaW5maW5pdGUuCi0KLVRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBgdnNucHJpbnRmYC4KLQotYG91dF9idWZmZXJgOiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGZvcm1hdHRlZCBzdHJpbmcgaXMgc3RvcmVkLiBgYnVmZmVyX3NpemVgOgotVGhlIHNpemUgb2YgYG91dF9idWZmZXJgLiBgZm9ybWF0YDogQSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBkYXRhIHNob3VsZAotYmUgZm9ybWF0dGVkLiBgYXJndW1lbnRzYDogVmFyaWFibGUgYXJndW1lbnRzIHVzZWQgaW4gdGhlIHN0cmluZy4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IFNiU3RyaW5nRm9ybWF0KGNoYXIgKm91dF9idWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3VtZW50cykgU0JfUFJJTlRGX0ZPUk1BVCgzCi1gYGAKLQotIyMjIFNiU3RyaW5nRm9ybWF0RiAjIyMKLQotQW4gaW5saW5lIHdyYXBwZXIgb2YgU2JTdHJpbmdGb3JtYXQgdGhhdCBjb252ZXJ0cyBmcm9tIGVsbGlwc2lzIHRvIHZhX2FyZ3MuIFRoaXMKLWZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHNucHJpbnRmYC4KLQotYG91dF9idWZmZXJgOiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGZvcm1hdHRlZCBzdHJpbmcgaXMgc3RvcmVkLiBgYnVmZmVyX3NpemVgOgotVGhlIHNpemUgb2YgYG91dF9idWZmZXJgLiBgZm9ybWF0YDogQSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBkYXRhIHNob3VsZAotYmUgZm9ybWF0dGVkLiBgLi4uYDogQXJndW1lbnRzIHVzZWQgaW4gdGhlIHN0cmluZy4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IHN0YXRpYyBpbnQgc3RhdGljIGludCBTYlN0cmluZ0Zvcm1hdEYoY2hhciAqb3V0X2J1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDMKLWBgYAotCi0jIyMgU2JTdHJpbmdGb3JtYXRVbnNhZmVGICMjIwotCi1BbiBpbmxpbmUgd3JhcHBlciBvZiBTYlN0cmluZ0Zvcm1hdCB0aGF0IGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudAotZm9yIHRoZSB1bnNhZmUgYnV0IGNvbW1vbmx5IHVzZWQgYHNwcmludGZgLgotCi1gb3V0X2J1ZmZlcmA6IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBpcyBzdG9yZWQuIGBmb3JtYXRgOiBBCi1zdHJpbmcgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBkYXRhIHNob3VsZCBiZSBmb3JtYXR0ZWQuIGAuLi5gOiBBcmd1bWVudHMgdXNlZCBpbgotdGhlIHN0cmluZy4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGludCBzdGF0aWMgaW50IFNiU3RyaW5nRm9ybWF0VW5zYWZlRihjaGFyICpvdXRfYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDIKLWBgYAotCi0jIyMgU2JTdHJpbmdGb3JtYXRXaWRlICMjIwotCi1UaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBTYlN0cmluZ0Zvcm1hdCwgYnV0IGlzIGZvciB3aWRlIGNoYXJhY3RlcnMuIEl0IGlzCi1tZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGB2c3dwcmludGZgLgotCi1gb3V0X2J1ZmZlcmA6IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBpcyBzdG9yZWQuIGBidWZmZXJfc2l6ZWA6Ci1UaGUgc2l6ZSBvZiBgb3V0X2J1ZmZlcmAuIGBmb3JtYXRgOiBBIHN0cmluZyB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGRhdGEgc2hvdWxkCi1iZSBmb3JtYXR0ZWQuIGBhcmd1bWVudHNgOiBWYXJpYWJsZSBhcmd1bWVudHMgdXNlZCBpbiB0aGUgc3RyaW5nLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1pbnQgU2JTdHJpbmdGb3JtYXRXaWRlKHdjaGFyX3QgKm91dF9idWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3VtZW50cykKLWBgYAotCi0jIyMgU2JTdHJpbmdGb3JtYXRXaWRlRiAjIyMKLQotQW4gaW5saW5lIHdyYXBwZXIgb2YgU2JTdHJpbmdGb3JtYXRXaWRlIHRoYXQgY29udmVydHMgZnJvbSBlbGxpcHNpcyB0bwotYHZhX2FyZ3NgLgotCi1gb3V0X2J1ZmZlcmA6IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBpcyBzdG9yZWQuIGBidWZmZXJfc2l6ZWA6Ci1UaGUgc2l6ZSBvZiBgb3V0X2J1ZmZlcmAuIGBmb3JtYXRgOiBBIHN0cmluZyB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGRhdGEgc2hvdWxkCi1iZSBmb3JtYXR0ZWQuIGAuLi5gOiBBcmd1bWVudHMgdXNlZCBpbiB0aGUgc3RyaW5nLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1zdGF0aWMgaW50IFNiU3RyaW5nRm9ybWF0V2lkZUYod2NoYXJfdCAqb3V0X2J1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsLi4uKQotYGBgCi0KLSMjIyBTYlN0cmluZ0dldExlbmd0aCAjIyMKLQotUmV0dXJucyB0aGUgbGVuZ3RoLCBpbiBjaGFyYWN0ZXJzLCBvZiBgc3RyYC4KLQotYHN0cmA6IEEgemVyby10ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZy4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc2l6ZV90IFNiU3RyaW5nR2V0TGVuZ3RoKGNvbnN0IGNoYXIgKnN0cikKLWBgYAotCi0jIyMgU2JTdHJpbmdHZXRMZW5ndGhXaWRlICMjIwotCi1SZXR1cm5zIHRoZSBsZW5ndGggb2YgYSB3aWRlIGNoYXJhY3RlciBzdHJpbmcuIChUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzCi1TYlN0cmluZ0dldExlbmd0aCwgYnV0IGZvciBhIHN0cmluZyBjb21wcmlzZWQgb2Ygd2lkZSBjaGFyYWN0ZXJzLikgVGhpcyBmdW5jdGlvbgotYXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBtdWx0aS1lbGVtZW50IGNoYXJhY3RlcnMuCi0KLWBzdHJgOiBBIHplcm8tdGVybWluYXRlZCBBU0NJSSBzdHJpbmcuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXNpemVfdCBTYlN0cmluZ0dldExlbmd0aFdpZGUoY29uc3Qgd2NoYXJfdCAqc3RyKQotYGBgCi0KLSMjIyBTYlN0cmluZ1BhcnNlRG91YmxlICMjIwotCi1FeHRyYWN0cyBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYW4gaW50ZWdlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYHN0YXJ0YCBpbnRvCi1hIGRvdWJsZS4KLQotVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBzdHJ0b2RgLCBleGNlcHQgdGhhdCBpdAotaXMgZXhwbGljaXRseSBkZWNsYXJlZCB0byByZXR1cm4gYSBkb3VibGUuCi0KLWBzdGFydGA6IFRoZSBzdHJpbmcgdGhhdCBiZWdpbnMgd2l0aCB0aGUgbnVtYmVyIHRvIGJlIGNvbnZlcnRlZC4gYG91dF9lbmRgOiBJZgotcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiBwbGFjZXMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnN1bWVkIHBvcnRpb24gb2YKLXRoZSBzdHJpbmcgaW50byBgb3V0X2VuZGAuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWRvdWJsZSBTYlN0cmluZ1BhcnNlRG91YmxlKGNvbnN0IGNoYXIgKnN0YXJ0LCBjaGFyICoqb3V0X2VuZCkKLWBgYAotCi0jIyMgU2JTdHJpbmdQYXJzZVNpZ25lZEludGVnZXIgIyMjCi0KLUV4dHJhY3RzIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhbiBpbnRlZ2VyIGZyb20gdGhlIGJlZ2lubmluZyBvZiBgc3RhcnRgIGludG8KLWEgc2lnbmVkIGludGVnZXIgaW4gdGhlIGdpdmVuIGBiYXNlYC4gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4KLXJlcGxhY2VtZW50IGZvciBgc3RydG9sYC4KLQotYHN0YXJ0YDogVGhlIHN0cmluZyB0aGF0IGJlZ2lucyB3aXRoIHRoZSBudW1iZXIgdG8gYmUgY29udmVydGVkLiBgb3V0X2VuZGA6IElmCi1wcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHBsYWNlcyBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgY29uc3VtZWQgcG9ydGlvbiBvZgotdGhlIHN0cmluZyBpbnRvIGBvdXRfZW5kYC4gYGJhc2VgOiBUaGUgYmFzZSBpbnRvIHdoaWNoIHRoZSBudW1iZXIgd2lsbCBiZQotY29udmVydGVkLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIGAyYCBhbmQgYDM2YCwgaW5jbHVzaXZlLgotTk9MSU5UTkVYVExJTkUocnVudGltZS9pbnQpCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWxvbmcgU2JTdHJpbmdQYXJzZVNpZ25lZEludGVnZXIoY29uc3QgY2hhciAqc3RhcnQsIGNoYXIgKipvdXRfZW5kLCBpbnQgYmFzZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdQYXJzZVVJbnQ2NCAjIyMKLQotRXh0cmFjdHMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGFuIGludGVnZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGBzdGFydGAgaW50bwotYW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgaW4gdGhlIGdpdmVuIGBiYXNlYC4KLQotVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBzdHJ0b3VsbGAsIGV4Y2VwdCB0aGF0Ci1pdCBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIHJldHVybiBgdWludDY0X3RgLgotCi1gc3RhcnRgOiBUaGUgc3RyaW5nIHRoYXQgYmVnaW5zIHdpdGggdGhlIG51bWJlciB0byBiZSBjb252ZXJ0ZWQuIGBvdXRfZW5kYDogSWYKLXByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcGxhY2VzIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBjb25zdW1lZCBwb3J0aW9uIG9mCi10aGUgc3RyaW5nIGludG8gYG91dF9lbmRgLiBgYmFzZWA6IFRoZSBiYXNlIGludG8gd2hpY2ggdGhlIG51bWJlciB3aWxsIGJlCi1jb252ZXJ0ZWQuIFRoZSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gYDJgIGFuZCBgMzZgLCBpbmNsdXNpdmUuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXVpbnQ2NF90IFNiU3RyaW5nUGFyc2VVSW50NjQoY29uc3QgY2hhciAqc3RhcnQsIGNoYXIgKipvdXRfZW5kLCBpbnQgYmFzZSkKLWBgYAotCi0jIyMgU2JTdHJpbmdQYXJzZVVuc2lnbmVkSW50ZWdlciAjIyMKLQotRXh0cmFjdHMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGFuIGludGVnZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGBzdGFydGAgaW50bwotYW4gdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgZ2l2ZW4gYGJhc2VgLiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbgotcmVwbGFjZW1lbnQgZm9yIGBzdHJ0b3VsYC4KLQotYHN0YXJ0YDogVGhlIHN0cmluZyB0aGF0IGJlZ2lucyB3aXRoIHRoZSBudW1iZXIgdG8gYmUgY29udmVydGVkLiBgb3V0X2VuZGA6IElmCi1wcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHBsYWNlcyBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgY29uc3VtZWQgcG9ydGlvbiBvZgotdGhlIHN0cmluZyBpbnRvIGBvdXRfZW5kYC4gYGJhc2VgOiBUaGUgYmFzZSBpbnRvIHdoaWNoIHRoZSBudW1iZXIgd2lsbCBiZQotY29udmVydGVkLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIGAyYCBhbmQgYDM2YCwgaW5jbHVzaXZlLgotTk9MSU5UTkVYVExJTkUocnVudGltZS9pbnQpCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXVuc2lnbmVkIGxvbmcgU2JTdHJpbmdQYXJzZVVuc2lnbmVkSW50ZWdlcihjb25zdCBjaGFyICpzdGFydCwgY2hhciAqKm91dF9lbmQsIGludCBiYXNlKQotYGBgCi0KLSMjIyBTYlN0cmluZ1NjYW4gIyMjCi0KLVNjYW5zIGBidWZmZXJgIGZvciBgcGF0dGVybmAsIHBsYWNpbmcgdGhlIGV4dHJhY3RlZCB2YWx1ZXMgaW4gYGFyZ3VtZW50c2AuIFRoZQotcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBtYXRjaGVkIGl0ZW1zLCB3aGljaCBtYXkgYmUKLWAwYC4KLQotVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGB2c3NjYW5mYC4KLQotYGJ1ZmZlcmA6IFRoZSBzdHJpbmcgdG8gc2NhbiBmb3IgdGhlIHBhdHRlcm4uIGBwYXR0ZXJuYDogVGhlIHN0cmluZyB0byBzZWFyY2gKLWZvciBpbiBgYnVmZmVyYC4gYGFyZ3VtZW50c2A6IFZhbHVlcyBtYXRjaGluZyBgcGF0dGVybmAgdGhhdCB3ZXJlIGV4dHJhY3RlZCBmcm9tCi1gYnVmZmVyYC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotaW50IFNiU3RyaW5nU2Nhbihjb25zdCBjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHZhX2xpc3QgYXJndW1lbnRzKQotYGBgCi0KLSMjIyBTYlN0cmluZ1NjYW5GICMjIwotCi1BbiBpbmxpbmUgd3JhcHBlciBvZiBTYlN0cmluZ1NjYW4gdGhhdCBjb252ZXJ0cyBmcm9tIGVsbGlwc2lzIHRvIGB2YV9hcmdzYC4gVGhpcwotZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBgc3NjYW5mYC4gYGJ1ZmZlcmA6IFRoZSBzdHJpbmcKLXRvIHNjYW4gZm9yIHRoZSBwYXR0ZXJuLiBgcGF0dGVybmA6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciBpbiBgYnVmZmVyYC4gYC4uLmA6Ci1WYWx1ZXMgbWF0Y2hpbmcgYHBhdHRlcm5gIHRoYXQgd2VyZSBleHRyYWN0ZWQgZnJvbSBgYnVmZmVyYC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIGludCBTYlN0cmluZ1NjYW5GKGNvbnN0IGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqcGF0dGVybiwuLi4pCi1gYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvYXVkaW9fc2luay5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL2F1ZGlvX3NpbmsubWQKaW5kZXggOGNmMjMyOS4uYjBlNjUyZiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvYXVkaW9fc2luay5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9hdWRpb19zaW5rLm1kCkBAIC03Miw2ICs3Miw1MyBAQAogCiAjIyBGdW5jdGlvbnMgIyMKIAorIyMjIFNiQXVkaW9TaW5rQ3JlYXRlICMjIworCitDcmVhdGVzIGFuIGF1ZGlvIHNpbmsgZm9yIHRoZSBzcGVjaWZpZWQgYGNoYW5uZWxzYCBhbmQgYHNhbXBsaW5nX2ZyZXF1ZW5jeV9oemAsCithY3F1aXJlcyBhbGwgcmVzb3VyY2VzIG5lZWRlZCB0byBvcGVyYXRlIHRoZSBhdWRpbyBzaW5rLCBhbmQgcmV0dXJucyBhbiBvcGFxdWUKK2hhbmRsZSB0byB0aGUgYXVkaW8gc2luay4KKworSWYgdGhlIHBhcnRpY3VsYXIgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgYXVkaW8gc2luaywgdGhlCitmdW5jdGlvbiByZXR1cm5zIGBrU2JBdWRpb1NpbmtJbnZhbGlkYCB3aXRob3V0IGNhbGxpbmcgYW55IG9mIHRoZSBjYWxsYmFja3MuIElmCit0aGVyZSBpcyBhIHBsYXRmb3JtIGxpbWl0YXRpb24gb24gaG93IG1hbnkgYXVkaW8gc2lua3MgY2FuIGNvZXhpc3QKK3NpbXVsdGFuZW91c2x5LCB0aGVuIGNhbGxzIG1hZGUgdG8gdGhpcyBmdW5jdGlvbiB0aGF0IGF0dGVtcHQgdG8gZXhjZWVkIHRoYXQKK2xpbWl0IG11c3QgcmV0dXJuIGBrU2JBdWRpb1NpbmtJbnZhbGlkYC4gTXVsdGlwbGUgY2FsbHMgdG8gU2JBdWRpb1NpbmtDcmVhdGUKK211c3Qgbm90IGNhdXNlIGEgY3Jhc2guCisKK2BjaGFubmVsc2A6IFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMsIHN1Y2ggYXMgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgaW4KK3N0ZXJlbyBhdWRpby4gYHNhbXBsaW5nX2ZyZXF1ZW5jeV9oemA6IFRoZSBzYW1wbGUgZnJlcXVlbmN5IG9mIHRoZSBhdWRpbyBkYXRhCitiZWluZyBzdHJlYW1lZC4gRm9yIGV4YW1wbGUsIDIyLDAwMCBIeiBtZWFucyAyMiwwMDAgc2FtcGxlIGVsZW1lbnRzIHJlcHJlc2VudHMKK29uZSBzZWNvbmQgb2YgYXVkaW8gZGF0YS4gYGF1ZGlvX3NhbXBsZV90eXBlYDogVGhlIHR5cGUgb2YgZWFjaCBzYW1wbGUgb2YgdGhlCithdWRpbyBkYXRhIOKAkyBgaW50MTZgLCBgZmxvYXQzMmAsIGV0Yy4gYGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZWA6IEluZGljYXRlcword2hldGhlciBmcmFtZXMgYXJlIGludGVybGVhdmVkIG9yIHBsYW5hci4gYGZyYW1lX2J1ZmZlcnNgOiBBbiBhcnJheSBvZiBwb2ludGVycwordG8gc2FtcGxlIGRhdGEuCisKKyogICBJZiB0aGUgc2luayBpcyBvcGVyYXRpbmcgaW4gaW50ZXJsZWF2ZWQgbW9kZSwgdGhlIGFycmF5IGNvbnRhaW5zIG9ubHkgb25lCisgICAgZWxlbWVudCwgd2hpY2ggaXMgYW4gYXJyYXkgY29udGFpbmluZyAoYGZyYW1lc19wZXJfY2hhbm5lbGAgKiBgY2hhbm5lbHNgKQorICAgIHNhbXBsZXMuCisKKyogICBJZiB0aGUgc2luayBpcyBvcGVyYXRpbmcgaW4gcGxhbmFyIG1vZGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgICAgaXMgdGhlIHNhbWUgYXMgYGNoYW5uZWxzYCwgYW5kIGVhY2ggZWxlbWVudCBpcyBhbiBhcnJheSBvZgorICAgIGBmcmFtZXNfcGVyX2NoYW5uZWxgIHNhbXBsZXMuIFRoZSBjYWxsZXIgaGFzIHRvIGVuc3VyZSB0aGF0IGBmcmFtZV9idWZmZXJzYAorICAgIGlzIHZhbGlkIHVudGlsIFNiQXVkaW9TaW5rRGVzdHJveSBpcyBjYWxsZWQuIGBmcmFtZXNfcGVyX2NoYW5uZWxgOiBUaGUgc2l6ZQorICAgIG9mIHRoZSBmcmFtZSBidWZmZXJzLCBpbiB1bml0cyBvZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwuIFRoZQorICAgIGZyYW1lLCBpbiB0aGlzIGNhc2UsIHJlcHJlc2VudHMgYSBncm91cCBvZiBzYW1wbGVzIGF0IHRoZSBzYW1lIG1lZGlhIHRpbWUsCisgICAgb25lIGZvciBlYWNoIGNoYW5uZWwuIGB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jYDogVGhlIGF1ZGlvIHNpbmsgY2FsbHMgdGhpcworICAgIGZ1bmN0aW9uIG9uIGFuIGludGVybmFsIHRocmVhZCB0byBxdWVyeSB0aGUgc3RhdHVzIG9mIHRoZSBzb3VyY2UuIEl0IGlzCisgICAgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIFNiQXVkaW9TaW5rQ3JlYXRlIGlzIGNhbGxlZCwgZXZlbiBiZWZvcmUgaXQKKyAgICByZXR1cm5zLiBUaGUgY2FsbGVyIGhhcyB0byBlbnN1cmUgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGFib3ZlIHJldHVybgorICAgIG1lYW5pbmdmdWwgdmFsdWVzIGluIHRoaXMgY2FzZS4gVGhlIHZhbHVlIGNhbm5vdCBiZSBOVUxMLgorICAgIGBjb25zdW1lX2ZyYW1lc19mdW5jYDogVGhlIGF1ZGlvIHNpbmsgY2FsbHMgdGhpcyBmdW5jdGlvbiBvbiBhbiBpbnRlcm5hbAorICAgIHRocmVhZCB0byByZXBvcnQgY29uc3VtZWQgZnJhbWVzLiBUaGUgdmFsdWUgY2Fubm90IGJlIE5VTEwuIGBjb250ZXh0YDogQQorICAgIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGJhY2sgdG8gYWxsIGNhbGxiYWNrcyBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gcG9pbnQgYXQKKyAgICBhIGNsYXNzIG9yIHN0cnVjdCB0aGF0IGNvbnRhaW5zIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXVkaW8gc2luay4KKworIyMjIyBEZWNsYXJhdGlvbiAjIyMjCisKK2BgYAorU2JBdWRpb1NpbmsgU2JBdWRpb1NpbmtDcmVhdGUoaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxpbmdfZnJlcXVlbmN5X2h6LCBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIGF1ZGlvX3NhbXBsZV90eXBlLCBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZSwgU2JBdWRpb1NpbmtGcmFtZUJ1ZmZlcnMgZnJhbWVfYnVmZmVycywgaW50IGZyYW1lc19wZXJfY2hhbm5lbCwgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsIFNiQXVkaW9TaW5rQ29uc3VtZUZyYW1lc0Z1bmMgY29uc3VtZV9mcmFtZXNfZnVuYywgdm9pZCAqY29udGV4dCkKK2BgYAorCiAjIyMgU2JBdWRpb1NpbmtEZXN0cm95ICMjIwogCiBEZXN0cm95cyBgYXVkaW9fc2lua2AsIGZyZWVpbmcgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLiBCZWZvcmUgcmV0dXJuaW5nLCB0aGUKQEAgLTE2NSw0ICsyMTIsMyBAQAogYGBgCiBib29sIFNiQXVkaW9TaW5rSXNWYWxpZChTYkF1ZGlvU2luayBhdWRpb19zaW5rKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL2RlY29kZV90YXJnZXQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9kZWNvZGVfdGFyZ2V0Lm1kCmluZGV4IDJlNjFjMWUuLjIzZWQ1OWQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL2RlY29kZV90YXJnZXQubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvZGVjb2RlX3RhcmdldC5tZApAQCAtMzI3LDggKzMyNywxMCBAQAogCiAjIyMgU2JEZWNvZGVUYXJnZXRHZXRJbmZvICMjIwogCi1Xcml0ZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGBkZWNvZGVfdGFyZ2V0YCBpbnRvIGBvdXRfaW5mb2AuIFJldHVybnMgZmFsc2UgaWYKLXRoZSBwcm92aWRlZCBgb3V0X2luZm9gIHN0cnVjdHVyZSBpcyBub3QgemVybyBpbml0aWFsaXplZC4KK1dyaXRlcyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYGRlY29kZV90YXJnZXRgIGludG8gYG91dF9pbmZvYC4gVGhlCitgZGVjb2RlX3RhcmdldGAgbXVzdCBub3QgYmUga1NiRGVjb2RlVGFyZ2V0SW52YWxpZC4gVGhlIGBvdXRfaW5mb2AgcG9pbnRlciBtdXN0Citub3QgYmUgTlVMTC4gUmV0dXJucyBmYWxzZSBpZiB0aGUgcHJvdmlkZWQgYG91dF9pbmZvYCBzdHJ1Y3R1cmUgaXMgbm90IHplcm8KK2luaXRpYWxpemVkLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvZHJtLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvZHJtLm1kCmluZGV4IGJlYjY1YzkuLmZiYjkyZjkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL2RybS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9kcm0ubWQKQEAgLTIzOCw2ICsyMzgsOCBAQAogCiBDbGVhciBhbnkgaW50ZXJuYWwgc3RhdGVzL3Jlc291cmNlcyByZWxhdGVkIHRvIHRoZSBzcGVjaWZpZWQgYHNlc3Npb25faWRgLgogCitgZHJtX3N5c3RlbWAgbXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLiBgc2Vzc2lvbl9pZGAgbXVzdCBub3QgYmUgTlVMTC4KKwogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYApAQCAtMjU0LDcgKzI1Niw3IEBACiByZXN1bHQsIGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBjYWxsYmFjayB0aGF0IGlzIHBhc3NlZCB0bwogU2JEcm1DcmVhdGVTeXN0ZW0oKSwgYSBkZWFkbG9jayB3aWxsIG9jY3VyLgogCi1gZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHRvIGJlIGRlc3Ryb3llZC4KK2Bkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gdG8gYmUgZGVzdHJveWVkLiBNdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0yODEsNyArMjgzLDcgQEAKIAogYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB0aGF0IGRlZmluZXMgdGhlIGtleSBzeXN0ZW0gdXNlZCBmb3IgdGhlIHNlc3Npb24KIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQgYXMgd2VsbCBhcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYXMgYQotcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQuCityZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZC4gTXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLgogCiBgdGlja2V0YDogVGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZQogY29uY3VycmVudCBjYWxscyB0byBTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8KQEAgLTI4OSwxMCArMjkxLDEwIEBACiBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQgbWF5CiByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBUaGUgdmFsdWUgYGtTYkRybVRpY2tldEludmFsaWRgIG11c3Qgbm90IGJlIHVzZWQuCiAKLWB0eXBlYDogVGhlIGNhc2Utc2Vuc2l0aXZlIHR5cGUgb2YgdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZC4KLWBpbml0aWFsaXphdGlvbl9kYXRhYDogVGhlIGRhdGEgZm9yIHdoaWNoIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQgaXMKLWNyZWF0ZWQuIGBpbml0aWFsaXphdGlvbl9kYXRhX3NpemVgOiBUaGUgc2l6ZSBvZiB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdAotcGF5bG9hZC4KK2B0eXBlYDogVGhlIGNhc2Utc2Vuc2l0aXZlIHR5cGUgb2YgdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZC4gTXVzdCBub3QKK2JlIE5VTEwuIGBpbml0aWFsaXphdGlvbl9kYXRhYDogVGhlIGRhdGEgZm9yIHdoaWNoIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0CitwYXlsb2FkIGlzIGNyZWF0ZWQuIE11c3Qgbm90IGJlIE5VTEwuIGBpbml0aWFsaXphdGlvbl9kYXRhX3NpemVgOiBUaGUgc2l6ZSBvZgordGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTMyMiw3ICszMjQsNyBAQAogSXQgc2hvdWxkIHJldHVybiBOVUxMIHdoZW4gdGhlcmUgaXMgbm8gbWV0cmljcyBzdXBwb3J0IGluIHRoZSB1bmRlcmx5aW5nIGRybQogc3lzdGVtLCBvciB3aGVuIHRoZSBkcm0gc3lzdGVtIGltcGxlbWVudGF0aW9uIGZhaWxzIHRvIHJldHJpZXZlIHRoZSBtZXRyaWNzLgogCi1UaGUgY2FsbGVyIHdpbGwgbmV2ZXIgc2V0IGBzaXplYCB0byBOVUxMLgorYGRybV9zeXN0ZW1gIG11c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4gYHNpemVgIG11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMzcsNiArMzM5LDcgQEAKIHRoZSBsaWZlIHRpbWUgb2YgYGRybV9zeXN0ZW1gLgogCiBgZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHRvIGNoZWNrIGlmIGl0cyBzZXJ2ZXIgY2VydGlmaWNhdGUgaXMgdXBkYXRhYmxlLgorTXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzcxLDE0ICszNzQsMTUgQEAKIGEgcHJldmlvdXMgY2FsbCBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlcgogYFNiRHJtSXNTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0YWJsZWAgaXMgY2FsbGVkIGZpcnN0IGFuZCByZXR1cm5lZCB0cnVlLgogCi1gZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHdob3NlIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyBiZWluZyB1cGRhdGVkLgotYHRpY2tldGA6IFRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUKLWNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1VcGRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZSgpLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0bwotYHNlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX2NhbGxiYWNrYCBhcy1pcy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQotY2FsbGVyIHRvIGVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lCi10aWNrZXQgbWF5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFRoZSB2YWx1ZSBga1NiRHJtVGlja2V0SW52YWxpZGAgbXVzdAotbm90IGJlIHVzZWQuIGBjZXJ0aWZpY2F0ZWA6IFBvaW50ZXIgdG8gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBkYXRhLgotYGNlcnRpZmljYXRlX3NpemVgOiBTaXplIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZGF0YS4KK2Bkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gd2hvc2Ugc2VydmVyIGNlcnRpZmljYXRlIGlzIGJlaW5nIHVwZGF0ZWQuIE11c3Qgbm90CitiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuIGB0aWNrZXRgOiBUaGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoCitjYWxsYmFja3MgZnJvbSBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoKSwKK3doaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBzZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRlZF9jYWxsYmFja2AgYXMtaXMuIEl0IGlzIHRoZQorcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUKK3JlcXVlc3RzIHdpdGggdGhlIHNhbWUgdGlja2V0IG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBUaGUgdmFsdWUKK2BrU2JEcm1UaWNrZXRJbnZhbGlkYCBtdXN0IG5vdCBiZSB1c2VkLiBgY2VydGlmaWNhdGVgOiBQb2ludGVyIHRvIHRoZSBzZXJ2ZXIKK2NlcnRpZmljYXRlIGRhdGEuIE11c3Qgbm90IGJlIE5VTEwuIGBjZXJ0aWZpY2F0ZV9zaXplYDogU2l6ZSBvZiB0aGUgc2VydmVyCitjZXJ0aWZpY2F0ZSBkYXRhLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzkxLDIyICszOTUsMjMgQEAKIFVwZGF0ZSBzZXNzaW9uIHdpdGggYGtleWAsIGluIGBkcm1fc3lzdGVtYCdzIGtleSBzeXN0ZW0sIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyCiByZXNwb25zZS4gQ2FsbHMgYHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja2Agd2l0aCBgY29udGV4dGAgYW5kIHdoZXRoZXIgdGhlIHVwZGF0ZQogc3VjY2VlZGVkLiBgY29udGV4dGAgbWF5IGJlIHVzZWQgdG8gcm91dGUgY2FsbGJhY2tzIGJhY2sgdG8gYW4gb2JqZWN0IGluc3RhbmNlLgorVGhlIGBrZXlgIG11c3Qgbm90IGJlIE5VTEwuCiAKLWB0aWNrZXRgIGlzIHRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUKLWNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1VcGRhdGVTZXNzaW9uKCksIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCi1gc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrYCBhcy1pcy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8KLWVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZSBjYWxscyB3aXRoIHRoZSBzYW1lIHRpY2tldCBtYXkKLXJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCitgZHJtX3N5c3RlbWAgbXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLiBgdGlja2V0YCBpcyB0aGUgb3BhcXVlIElEIHRoYXQKK2FsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIHRvCitTYkRybVVwZGF0ZVNlc3Npb24oKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja2AgYXMtaXMuCitJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcKK211bHRpcGxlIGNhbGxzIHdpdGggdGhlIHNhbWUgdGlja2V0IG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgogCiBPbmNlIHRoZSBzZXNzaW9uIGlzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLCBhbiBTYlBsYXllciBvciBTYkRlY29kZXIgYXNzb2NpYXRlZAogd2l0aCB0aGF0IERSTSBrZXkgc3lzdGVtIHdpbGwgYmUgYWJsZSB0byBkZWNyeXB0IGVuY3J5cHRlZCBzYW1wbGVzLgogCiBgZHJtX3N5c3RlbWAncyBgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrYCBtYXkgY2FsbGVkIGVpdGhlciBmcm9tIHRoZSBjdXJyZW50Ci10aHJlYWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBvciBmcm9tIGFub3RoZXIgdGhyZWFkLgordGhyZWFkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb3IgZnJvbSBhbm90aGVyIHRocmVhZC4gVGhlIGBzZXNzaW9uX2lkYAorbXVzdCBub3QgYmUgTlVMTC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYAogdm9pZCBTYkRybVVwZGF0ZVNlc3Npb24oU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwgaW50IHRpY2tldCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5X3NpemUsIGNvbnN0IHZvaWQgKnNlc3Npb25faWQsIGludCBzZXNzaW9uX2lkX3NpemUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvZXZlbnQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9ldmVudC5tZAppbmRleCA4ZDIwYzZmLi4wMWE5ZDI0IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9ldmVudC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9ldmVudC5tZApAQCAtMywxMCArMyw2IEBACiB0aXRsZTogIlN0YXJib2FyZCBNb2R1bGUgUmVmZXJlbmNlOiBldmVudC5oIgogLS0tCiAKLUZvciBTQl9BUElfVkVSU0lPTiA+PSAxMwotCi1Nb2R1bGUgT3ZlcnZpZXc6IFN0YXJib2FyZCBFdmVudCBtb2R1bGUKLQogRGVmaW5lcyB0aGUgZXZlbnQgc3lzdGVtIHRoYXQgd3JhcHMgdGhlIFN0YXJib2FyZCBtYWluIGxvb3AgYW5kIGVudHJ5IHBvaW50LgogCiAjIyBUaGUgU3RhcmJvYXJkIEFwcGxpY2F0aW9uIExpZmVjeWNsZSAjIwpAQCAtODIsNzUgKzc4LDYgQEAKIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgYWx3YXlzIGV4cGVjdGVkIHRvIHRyYW5zaXRpb24gdGhyb3VnaCBgQkxVUlJFRGAsCiBgQ09OQ0VBTEVEYCB0byBgRlJPWkVOYCBiZWZvcmUgcmVjZWl2aW5nIGBTdG9wYCBvciBiZWluZyBraWxsZWQuCiAKLUZvciBTQl9BUElfVkVSU0lPTiA8IDEzCi0KLU1vZHVsZSBPdmVydmlldzogU3RhcmJvYXJkIEV2ZW50IG1vZHVsZQotCi1EZWZpbmVzIHRoZSBldmVudCBzeXN0ZW0gdGhhdCB3cmFwcyB0aGUgU3RhcmJvYXJkIG1haW4gbG9vcCBhbmQgZW50cnkgcG9pbnQuCi0KLSMjIFRoZSBTdGFyYm9hcmQgQXBwbGljYXRpb24gTGlmZWN5Y2xlICMjCi0KLWBgYAotICAgIC0tLS0tLS0tLS0gKgotICAgfCAgICAgICAgICAgfAotICAgfCAgICAgICAgUHJlbG9hZAotICAgfCAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgVgotIFN0YXJ0ICAgWyBQUkVMT0FESU5HIF0gLS0tLS0tLS0tLS0tCi0gICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgU3RhcnQgICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICBWICAgICAgICAgICAgICAgICAgICB8Ci0gICAgLS0tLT4gWyBTVEFSVEVEIF0gPC0tLS0gICAgICAgICB8Ci0gICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICB8Ci0gICAgICAgICAgICAgUGF1c2UgICAgICAgVW5wYXVzZSAgICB8Ci0gICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICBTdXNwZW5kCi0gICAgICAgICAgICAgICBWICAgICAgICAgICB8ICAgICAgICB8Ci0gICAgLS0tLS0+IFsgUEFVU0VEIF0gLS0tLS0gICAgICAgICB8Ci0gICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci1SZXN1bWUgICAgICBTdXNwZW5kICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICBWICAgICAgICAgICAgICAgICAgICB8Ci0gICAgLS0tLSBbIFNVU1BFTkRFRCBdIDwtLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgU3RvcAotICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgVgotICAgICAgICAgIFsgU1RPUFBFRCBdCi0KLWBgYAotCi1UaGUgZmlyc3QgZXZlbnQgdGhhdCBhIFN0YXJib2FyZCBhcHBsaWNhdGlvbiByZWNlaXZlcyBpcyBlaXRoZXIgYFN0YXJ0YAotKGBrU2JFdmVudFR5cGVTdGFydGApIG9yIGBQcmVsb2FkYCAoYGtTYkV2ZW50VHlwZVByZWxvYWRgKS4gYFN0YXJ0YCBwdXRzIHRoZQotYXBwbGljYXRpb24gaW4gdGhlIGBTVEFSVEVEYCBzdGF0ZSwgd2hlcmVhcyBgUHJlbG9hZGAgcHV0cyB0aGUgYXBwbGljYXRpb24gaW4KLXRoZSBgUFJFTE9BRElOR2Agc3RhdGUuCi0KLWBQUkVMT0FESU5HYCBjYW4gb25seSBoYXBwZW4gYXMgdGhlIGZpcnN0IGFwcGxpY2F0aW9uIHN0YXRlLiBJbiB0aGlzIHN0YXRlLCB0aGUKLWFwcGxpY2F0aW9uIHNob3VsZCBzdGFydCBhbmQgcnVuIGFzIG5vcm1hbCwgYnV0IHdpbGwgbm90IHJlY2VpdmUgYW55IGlucHV0LCBhbmQKLXNob3VsZCBub3QgdHJ5IHRvIGluaXRpYWxpemUgZ3JhcGhpY3MgcmVzb3VyY2VzIHZpYSBHTC4gSW4gYFBSRUxPQURJTkdgLCB0aGUKLWFwcGxpY2F0aW9uIGNhbiByZWNlaXZlIGBTdGFydGAgb3IgYFN1c3BlbmRgIGV2ZW50cy4gYFN0YXJ0YCB3aWxsIHJlY2VpdmUgdGhlCi1zYW1lIGRhdGEgdGhhdCB3YXMgcGFzc2VkIGludG8gYFByZWxvYWRgLgotCi1JbiB0aGUgYFNUQVJURURgIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gaXMgaW4gdGhlIGZvcmVncm91bmQgYW5kIGNhbiBleHBlY3QgdG8KLWRvIGFsbCBvZiB0aGUgbm9ybWFsIHRoaW5ncyBpdCBtaWdodCB3YW50IHRvIGRvLiBPbmNlIGluIHRoZSBgU1RBUlRFRGAgc3RhdGUsIGl0Ci1tYXkgcmVjZWl2ZSBhIGBQYXVzZWAgZXZlbnQsIHB1dHRpbmcgdGhlIGFwcGxpY2F0aW9uIGludG8gdGhlIGBQQVVTRURgIHN0YXRlLgotCi1JbiB0aGUgYFBBVVNFRGAgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbCB2aXNpYmxlLCBidXQgaGFzIGxvc3QgZm9jdXMsIG9yCi1pdCBpcyBwYXJ0aWFsbHkgb2JzY3VyZWQgYnkgYSBtb2RhbCBkaWFsb2csIG9yIGl0IGlzIG9uIGl0cyB3YXkgdG8gYmVpbmcgc2h1dAotZG93bi4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBwYXVzZSBhY3Rpdml0eSBpbiB0aGlzIHN0YXRlLiBJbiB0aGlzIHN0YXRlLCBpdCBjYW4KLXJlY2VpdmUgYFVucGF1c2VgIHRvIGJlIGJyb3VnaHQgYmFjayB0byB0aGUgZm9yZWdyb3VuZCBzdGF0ZSAoYFNUQVJURURgKSwgb3IKLWBTdXNwZW5kYCB0byBiZSBwdXNoZWQgZnVydGhlciBpbiB0aGUgYmFja2dyb3VuZCB0byB0aGUgYFNVU1BFTkRFRGAgc3RhdGUuCi0KLUluIHRoZSBgU1VTUEVOREVEYCBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIGlzIGdlbmVyYWxseSBub3QgdmlzaWJsZS4gSXQgc2hvdWxkCi1pbW1lZGlhdGVseSByZWxlYXNlIGFsbCBncmFwaGljcyBhbmQgdmlkZW8gcmVzb3VyY2VzLCBhbmQgc2h1dCBkb3duIGFsbAotYmFja2dyb3VuZCBhY3Rpdml0eSAodGltZXJzLCByZW5kZXJpbmcsIGV0YykuIEFkZGl0aW9uYWxseSwgdGhlIGFwcGxpY2F0aW9uCi1zaG91bGQgZmx1c2ggc3RvcmFnZSB0byBlbnN1cmUgdGhhdCBpZiB0aGUgYXBwbGljYXRpb24gaXMga2lsbGVkLCB0aGUgc3RvcmFnZQotd2lsbCBiZSB1cC10by1kYXRlLiBUaGUgYXBwbGljYXRpb24gbWF5IGJlIGtpbGxlZCBhdCB0aGlzIHBvaW50LCBidXQgd2lsbAotaWRlYWxseSByZWNlaXZlIGEgYFN0b3BgIGV2ZW50IGZvciBhIG1vcmUgZ3JhY2VmdWwgc2h1dGRvd24uCi0KLU5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgYWx3YXlzIGV4cGVjdGVkIHRvIHRyYW5zaXRpb24gdGhyb3VnaCBgUEFVU0VEYCB0bwotYFNVU1BFTkRFRGAgYmVmb3JlIHJlY2VpdmluZyBgU3RvcGAgb3IgYmVpbmcga2lsbGVkLgotCiAjIyBFbnVtcyAjIwogCiAjIyMgU2JFdmVudFR5cGUgIyMjCkBAIC00NjUsMTAgKzM5MiwxMCBAQAogbWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQsIGJ1dCBgY2FsbGJhY2tgIGlzIGFsd2F5cyBjYWxsZWQgZnJvbSB0aGUgbWFpbgogU3RhcmJvYXJkIHRocmVhZCwgcXVldWVkIHdpdGggb3RoZXIgcGVuZGluZyBldmVudHMuCiAKLWBjYWxsYmFja2A6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIGBjb250ZXh0YDogVGhlIGNvbnRleHQgdGhhdCBpcwotcGFzc2VkIHRvIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBgZGVsYXlgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgbWljcm9zZWNvbmRzCi10byB3YWl0IGJlZm9yZSBjYWxsaW5nIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBTZXQgYGRlbGF5YCB0byBgMGAgdG8gY2FsbCB0aGUKLWNhbGxiYWNrIGFzIHNvb24gYXMgcG9zc2libGUuCitgY2FsbGJhY2tgOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBNdXN0IG5vdCBiZSBOVUxMLiBgY29udGV4dGA6IFRoZQorY29udGV4dCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgYGNhbGxiYWNrYCBmdW5jdGlvbi4gYGRlbGF5YDogVGhlIG1pbmltdW0gbnVtYmVyCitvZiBtaWNyb3NlY29uZHMgdG8gd2FpdCBiZWZvcmUgY2FsbGluZyB0aGUgYGNhbGxiYWNrYCBmdW5jdGlvbi4gU2V0IGBkZWxheWAgdG8KK2AwYCB0byBjYWxsIHRoZSBjYWxsYmFjayBhcyBzb29uIGFzIHBvc3NpYmxlLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvaW1hZ2UubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9pbWFnZS5tZAppbmRleCAzMDUwOTUzLi4xNDI3ZDM5IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9pbWFnZS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9pbWFnZS5tZApAQCAtMjQsNyArMjQsNyBAQAogICByZXR1cm47CiB9CiAKLVNiRGVjb2RlVGFyZ2V0IHJlc3VsdF90YXJnZXQgPSBTYkRlY29kZUltYWdlKHByb3ZpZGVyLCBkYXRhLCBkYXRhX3NpemUsCitTYkRlY29kZVRhcmdldCByZXN1bHRfdGFyZ2V0ID0gU2JJbWFnZURlY29kZShwcm92aWRlciwgZGF0YSwgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZV90eXBlLCBmb3JtYXQpOwogYGBgCiAKQEAgLTQ4LDEzICs0OCwxMyBAQAogICAgIGNhbGxlZCwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHByb2NlZWQgdG8gZGVjb2RpbmcgaG93ZXZlciBpdCBkZXNpcmVzLgogCiAxLiAgVGhlIHByb3ZpZGVyIGlzIG5vdCByZXF1aXJlZCBhbmQgaXMgbm90IHBhc3NlZCBpbi4gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwKLSAgICBwcm9jZWVkIGZvcndhcmQuCi0KLVRodXMsIGl0IGlzIE5PVCBzYWZlIGZvciBjbGllbnRzIG9mIHRoaXMgQVBJIHRvIGFzc3VtZSB0aGF0IHRoZSBgcHJvdmlkZXJgIGl0Ci1wYXNzZXMgaW4gd2lsbCBiZSBjYWxsZWQuIEZpbmFsbHksIGlmIHRoZSBkZWNvZGUgc3VjY2VlZHMsIGEgbmV3IFNiRGVjb2RlVGFyZ2V0Ci13aWxsIGJlIGFsbG9jYXRlZC4gSWYgYG1pbWVfdHlwZWAgaW1hZ2UgZGVjb2RpbmcgZm9yIHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdAotc3VwcG9ydGVkIG9yIHRoZSBkZWNvZGUgZmFpbHMsIGtTYkRlY29kZVRhcmdldEludmFsaWQgd2lsbCBiZSByZXR1cm5lZCwgd2l0aCBhbnkKLWludGVybWVkaWF0ZSBhbGxvY2F0aW9ucyBiZWluZyBjbGVhbmVkIHVwIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICBwcm9jZWVkIGZvcndhcmQuIFRoZSBgZGF0YWAgcG9pbnRlciBtdXN0IG5vdCBiZSBOVUxMLiBUaGUgYG1pbWVfdHlwZWAgc3RyaW5nCisgICAgbXVzdCBub3QgYmUgTlVMTC4gVGh1cywgaXQgaXMgTk9UIHNhZmUgZm9yIGNsaWVudHMgb2YgdGhpcyBBUEkgdG8gYXNzdW1lCisgICAgdGhhdCB0aGUgYHByb3ZpZGVyYCBpdCBwYXNzZXMgaW4gd2lsbCBiZSBjYWxsZWQuIEZpbmFsbHksIGlmIHRoZSBkZWNvZGUKKyAgICBzdWNjZWVkcywgYSBuZXcgU2JEZWNvZGVUYXJnZXQgd2lsbCBiZSBhbGxvY2F0ZWQuIElmIGBtaW1lX3R5cGVgIGltYWdlCisgICAgZGVjb2RpbmcgZm9yIHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgdGhlIGRlY29kZSBmYWlscywKKyAgICBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkIHdpbGwgYmUgcmV0dXJuZWQsIHdpdGggYW55IGludGVybWVkaWF0ZSBhbGxvY2F0aW9ucworICAgIGJlaW5nIGNsZWFuZWQgdXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNjUsOSArNjUsMTAgQEAKICMjIyBTYkltYWdlSXNEZWNvZGVTdXBwb3J0ZWQgIyMjCiAKIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgZGVjb2RpbmcgYW4gaW1hZ2Ugb2YKLW1pbWUgdHlwZSBgbWltZV90eXBlYCBpbnRvIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGBmb3JtYXRgLiBUaGUgcmVzdWx0IG9mIHRoaXMKLWZ1bmN0aW9uIG11c3Qgbm90IGNoYW5nZSBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHByb2dyYW0sIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi1yZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhY2hlZCBpbmRlZmluaXRlbHkuCittaW1lIHR5cGUgYG1pbWVfdHlwZWAgaW50byBTYkRlY29kZVRhcmdldEZvcm1hdCBgZm9ybWF0YC4gVGhlIGBtaW1lX3R5cGVgIG11c3QKK25vdCBiZSBOVUxMLiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBub3QgY2hhbmdlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUKK3Byb2dyYW0sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FjaGVkCitpbmRlZmluaXRlbHkuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9sb2cubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9sb2cubWQKaW5kZXggMWFkNmMyNC4uNDJkZTUxMyAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvbG9nLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL2xvZy5tZApAQCAtMzAsMTAgKzMwLDEwIEBACiBgcHJpb3JpdHlgOiBUaGUgU2JMb2dQcmlvcml0eSBhdCB3aGljaCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9nZ2VkLiBOb3RlIHRoYXQKIHBhc3NpbmcgYGtTYkxvZ1ByaW9yaXR5RmF0YWxgIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gU3VjaCBhIHBvbGljeSBtdXN0CiBiZSBlbmZvcmNlZCBhdCB0aGUgYXBwbGljYXRpb24gbGV2ZWwuIEluIGZhY3QsIGBwcmlvcml0eWAgbWF5IGJlIGNvbXBsZXRlbHkKLWlnbm9yZWQgb24gbWFueSBwbGF0Zm9ybXMuIGBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiBObyBmb3JtYXR0aW5nIGlzCi1yZXF1aXJlZCB0byBiZSBkb25lIG9uIHRoZSB2YWx1ZSwgaW5jbHVkaW5nIG5ld2xpbmUgdGVybWluYXRpb24uIFRoYXQgc2FpZCwKLXBsYXRmb3JtcyBjYW4gYWRqdXN0IHRoZSBtZXNzYWdlIHRvIGJlIG1vcmUgc3VpdGFibGUgZm9yIHRoZWlyIG91dHB1dCBtZXRob2QgYnkKLXdyYXBwaW5nIHRoZSB0ZXh0LCBzdHJpcHBpbmcgdW5wcmludGFibGUgY2hhcmFjdGVycywgZXRjLgoraWdub3JlZCBvbiBtYW55IHBsYXRmb3Jtcy4gYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE11c3Qgbm90IGJlCitOVUxMLiBObyBmb3JtYXR0aW5nIGlzIHJlcXVpcmVkIHRvIGJlIGRvbmUgb24gdGhlIHZhbHVlLCBpbmNsdWRpbmcgbmV3bGluZQordGVybWluYXRpb24uIFRoYXQgc2FpZCwgcGxhdGZvcm1zIGNhbiBhZGp1c3QgdGhlIG1lc3NhZ2UgdG8gYmUgbW9yZSBzdWl0YWJsZSBmb3IKK3RoZWlyIG91dHB1dCBtZXRob2QgYnkgd3JhcHBpbmcgdGhlIHRleHQsIHN0cmlwcGluZyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCBldGMuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC03MCw3ICs3MCw3IEBACiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCi12b2lkIHN0YXRpYyB2b2lkIHZvaWQgU2JMb2dGb3JtYXRGKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIFNCX1BSSU5URl9GT1JNQVQoMQordm9pZCBzdGF0aWMgdm9pZCBzdGF0aWMgdm9pZCBTYkxvZ0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCiBgYGAKIAogIyMjIFNiTG9nSXNUdHkgIyMjCkBAIC04OSw3ICs4OSw3IEBACiBhbiBhc3luY2hyb25vdXMgc2lnbmFsIGhhbmRsZXIgKGUuZy4gYSBgU0lHU0VHVmAgaGFuZGxlcikuIEl0IHNob3VsZCBub3QgZG8gYW55CiBhZGRpdGlvbmFsIGZvcm1hdHRpbmcuCiAKLWBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgorYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0xMzIsNiArMTMyLDUgQEAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKLXZvaWQgc3RhdGljIHZvaWQgdm9pZCBTYkxvZ1Jhd0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCit2b2lkIHN0YXRpYyB2b2lkIHN0YXRpYyB2b2lkIFNiTG9nUmF3Rm9ybWF0Rihjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDEKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9wbGF5ZXIubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9wbGF5ZXIubWQKaW5kZXggZDY5MTBlMi4uM2ZkOTU1ZCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvcGxheWVyLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL3BsYXllci5tZApAQCAtMjMxLDcgKzIzMSw3IEBACiAKICMjIyBTYlBsYXllclNhbXBsZUluZm8gIyMjCiAKLUluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlMi4KK0luZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlcygpLgogCiAjIyMjIE1lbWJlcnMgIyMjIwogCkBAIC0yOTcsNyArMjk3LDcgQEAKIAogKiAgIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHBhc3MgYHBsYXllcmAgaW50byBhbnkgb3RoZXIgYFNiUGxheWVyYCBmdW5jdGlvbiBvbmNlCiAgICAgU2JQbGF5ZXJEZXN0cm95IGhhcyBiZWVuIGNhbGxlZCBvbiB0aGF0IHBsYXllci4gYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8gYmUKLSAgICBkZXN0cm95ZWQuCisgICAgZGVzdHJveWVkLiBNdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMTUsMjYgKzMxNSwxNCBAQAogd2l0aCBhbiBvdXRwdXQgbW9kZSBvdGhlciB0aGFuIGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsCiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkIGlzIHJldHVybmVkLgogCitgcGxheWVyYCBtdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCisKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKIFNiRGVjb2RlVGFyZ2V0IFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKFNiUGxheWVyIHBsYXllcikKIGBgYAogCi0jIyMgU2JQbGF5ZXJHZXRJbmZvMiAjIyMKLQotR2V0cyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHBsYXllciBzdGF0ZSBhbmQgd3JpdGVzIGl0IHRvIGBvdXRfcGxheWVyX2luZm9gLgotVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHZlcnkgZnJlcXVlbnRseSBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgaW5leHBlbnNpdmUuCi0KLWBwbGF5ZXJgOiBUaGUgcGxheWVyIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIGJlaW5nIHJldHJpZXZlZC4KLWBvdXRfcGxheWVyX2luZm9gOiBUaGUgaW5mb3JtYXRpb24gcmV0cmlldmVkIGZvciB0aGUgcGxheWVyLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkIFNiUGxheWVyR2V0SW5mbzIoU2JQbGF5ZXIgcGxheWVyLCBTYlBsYXllckluZm8yICpvdXRfcGxheWVyX2luZm8yKQotYGBgCi0KICMjIyBTYlBsYXllckdldE1heGltdW1OdW1iZXJPZlNhbXBsZXNQZXJXcml0ZSAjIyMKIAogV3JpdGVzIGEgc2luZ2xlIHNhbXBsZSBvZiB0aGUgZ2l2ZW4gbWVkaWEgdHlwZSB0byBgcGxheWVyYCdzIGlucHV0IHN0cmVhbS4gSXRzCkBAIC0zNzEsNyArMzU5LDcgQEAKIHRoZSBjYWxsLiBOb3RlIHRoYXQgaXQgaXMgbm90IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGlzIGZ1bmN0aW9uIHRvIHZlcmlmeQogd2hldGhlciB0aGUgdmlkZW8gZGVzY3JpYmVkIGJ5IGBjcmVhdGlvbl9wYXJhbWAgY2FuIGJlIHBsYXllZCBvbiB0aGUgcGxhdGZvcm0sCiBhbmQgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB0cnkgaXRzIGJlc3QgZWZmb3J0IHRvIHJldHVybiBhIHZhbGlkIG91dHB1dCBtb2RlLgotYGNyZWF0aW9uX3BhcmFtYCB3aWxsIG5ldmVyIGJlIE5VTEwuCitgY3JlYXRpb25fcGFyYW1gIG11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC00MDMsMTIgKzM5MSwxMiBAQAogaW1wbGVtZW50b3JzIHNob3VsZCB0YWtlIGNhcmUgdG8gYXZvaWQgcmVsYXRlZCBwZXJmb3JtYW5jZSBjb25jZXJucyB3aXRoIHN1Y2gKIGZyZXF1ZW50IGNhbGxzLgogCi1gcGxheWVyYDogVGhlIHBsYXllciB0aGF0IGlzIGJlaW5nIHJlc2l6ZWQuIGB6X2luZGV4YDogVGhlIHotaW5kZXggb2YgdGhlCi1wbGF5ZXIuIFdoZW4gdGhlIGJvdW5kcyBvZiBtdWx0aXBsZSBwbGF5ZXJzIGFyZSBvdmVybGFwcGVkLCB0aGUgb25lIHdpdGggbGFyZ2VyCi16LWluZGV4IHdpbGwgYmUgcmVuZGVyZWQgb24gdG9wIG9mIHRoZSBvbmVzIHdpdGggc21hbGxlciB6LWluZGV4LiBgeGA6IFRoZQoteC1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLiBgeWA6IFRoZSB5LWNvb3JkaW5hdGUgb2YKLXRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLiBgd2lkdGhgOiBUaGUgd2lkdGggb2YgdGhlIHBsYXllciwgaW4KLXBpeGVscy4gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIHBsYXllciwgaW4gcGl4ZWxzLgorYHBsYXllcmA6IFRoZSBwbGF5ZXIgdGhhdCBpcyBiZWluZyByZXNpemVkLiBNdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCitgel9pbmRleGA6IFRoZSB6LWluZGV4IG9mIHRoZSBwbGF5ZXIuIFdoZW4gdGhlIGJvdW5kcyBvZiBtdWx0aXBsZSBwbGF5ZXJzIGFyZQorb3ZlcmxhcHBlZCwgdGhlIG9uZSB3aXRoIGxhcmdlciB6LWluZGV4IHdpbGwgYmUgcmVuZGVyZWQgb24gdG9wIG9mIHRoZSBvbmVzIHdpdGgKK3NtYWxsZXIgei1pbmRleC4gYHhgOiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLgorYHlgOiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLiBgd2lkdGhgOiBUaGUgd2lkdGgKK29mIHRoZSBwbGF5ZXIsIGluIHBpeGVscy4gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIHBsYXllciwgaW4gcGl4ZWxzLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDI5LDYgKzQxNyw4IEBACiB1bmNoYW5nZWQsIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGBwbGF5YmFja19yYXRlYCBpcyBuZWdhdGl2ZSBvciBpZiBpdCBpcyB0b28gaGlnaAogdG8gc3VwcG9ydC4KIAorYHBsYXllcmAgbXVzdCBub3QgYmUgYGtTYlBsYXllckludmFsaWRgLgorCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCkBAIC00MzksMTAgKzQyOSwxMCBAQAogCiBTZXRzIHRoZSBwbGF5ZXIncyB2b2x1bWUuCiAKLWBwbGF5ZXJgOiBUaGUgcGxheWVyIGluIHdoaWNoIHRoZSB2b2x1bWUgaXMgYmVpbmcgYWRqdXN0ZWQuIGB2b2x1bWVgOiBUaGUgbmV3Ci1wbGF5ZXIgdm9sdW1lLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYCwgaW5jbHVzaXZlLiBBIHZhbHVlIG9mCi1gMC4wYCBtZWFucyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUgbXV0ZWQsIGFuZCBhIHZhbHVlIG9mIGAxLjBgIG1lYW5zIHRoYXQgaXQKLXNob3VsZCBiZSBwbGF5ZWQgYXQgZnVsbCB2b2x1bWUuCitgcGxheWVyYDogVGhlIHBsYXllciBpbiB3aGljaCB0aGUgdm9sdW1lIGlzIGJlaW5nIGFkanVzdGVkLiBNdXN0IG5vdCBiZQorYGtTYlBsYXllckludmFsaWRgLiBgdm9sdW1lYDogVGhlIG5ldyBwbGF5ZXIgdm9sdW1lLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuCitgMC4wYCBhbmQgYDEuMGAsIGluY2x1c2l2ZS4gQSB2YWx1ZSBvZiBgMC4wYCBtZWFucyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUKK211dGVkLCBhbmQgYSB2YWx1ZSBvZiBgMS4wYCBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBwbGF5ZWQgYXQgZnVsbCB2b2x1bWUuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC00NjgsMjQgKzQ1OCwxNCBAQAogCiAjIyMgU2JQbGF5ZXJXcml0ZVNhbXBsZTIgIyMjCiAKLVdyaXRlcyBzYW1wbGVzIG9mIHRoZSBnaXZlbiBtZWRpYSB0eXBlIHRvIGBwbGF5ZXJgJ3MgaW5wdXQgc3RyZWFtLiBUaGUgbGlmZXRpbWUKLW9mIGBzYW1wbGVfaW5mb3NgLCBhbmQgdGhlIG1lbWJlcnMgb2YgaXRzIGVsZW1lbnRzIGxpa2UgYGJ1ZmZlcmAsCi1gdmlkZW9fc2FtcGxlX2luZm9gLCBhbmQgYGRybV9pbmZvYCAoYXMgd2VsbCBhcyBtZW1iZXIgYHN1YnNhbXBsZV9tYXBwaW5nYAotY29udGFpbmVkIGluc2lkZSBpdCkgYXJlIG5vdCBndWFyYW50ZWVkIHBhc3QgdGhlIGNhbGwgdG8gU2JQbGF5ZXJXcml0ZVNhbXBsZTIuCi1UaGF0IG1lYW5zIHRoYXQgYmVmb3JlIHJldHVybmluZywgdGhlIGltcGxlbWVudGF0aW9uIG11c3Qgc3luY2hyb25vdXNseSBjb3B5IGFueQotaW5mb3JtYXRpb24gaXQgd2FudHMgdG8gcmV0YWluIGZyb20gdGhvc2Ugc3RydWN0dXJlcy4KLQotU2JQbGF5ZXJXcml0ZVNhbXBsZTIgYWxsb3dzIHdyaXRpbmcgb2YgbXVsdGlwbGUgc2FtcGxlcyBpbiBvbmUgY2FsbC4KLQotYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8gd2hpY2ggdGhlIHNhbXBsZSBpcyB3cml0dGVuLiBgc2FtcGxlX3R5cGVgOiBUaGUgdHlwZSBvZgotc2FtcGxlIGJlaW5nIHdyaXR0ZW4uIFNlZSB0aGUgYFNiTWVkaWFUeXBlYCBlbnVtIGluIG1lZGlhLmguIGBzYW1wbGVfaW5mb3NgOiBBCi1wb2ludGVyIHRvIGFuIGFycmF5IG9mIFNiUGxheWVyU2FtcGxlSW5mbyB3aXRoIGBudW1iZXJfb2Zfc2FtcGxlX2luZm9zYAotZWxlbWVudHMsIGVhY2ggaG9sZHMgdGhlIGRhdGEgZm9yIGFuIHNhbXBsZSwgaS5lLiBhIHNlcXVlbmNlIG9mIHdob2xlIE5BTCBVbml0cwotZm9yIHZpZGVvLCBvciBhIGNvbXBsZXRlIGF1ZGlvIGZyYW1lLiBgc2FtcGxlX2luZm9zYCBjYW5ub3QgYmUgYXNzdW1lZCB0byBsaXZlCi1wYXN0IHRoZSBjYWxsIGludG8gU2JQbGF5ZXJXcml0ZVNhbXBsZTIoKSwgc28gaXQgbXVzdCBiZSBjb3BpZWQgaWYgaXRzIGNvbnRlbnQKLXdpbGwgYmUgdXNlZCBhZnRlciBTYlBsYXllcldyaXRlU2FtcGxlMigpIHJldHVybnMuIGBudW1iZXJfb2Zfc2FtcGxlX2luZm9zYDoKLVNwZWNpZnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIGNvbnRhaW5lZCBpbnNpZGUgYHNhbXBsZV9pbmZvc2AuIEl0IGhhcyB0byBiZSBhdAotbGVhc3Qgb25lLCBhbmQgbGVzcyB0aGFuIHRoZSByZXR1cm4gdmFsdWUgb2YKK2BzYW1wbGVfdHlwZWA6IFRoZSB0eXBlIG9mIHNhbXBsZSBiZWluZyB3cml0dGVuLiBTZWUgdGhlIGBTYk1lZGlhVHlwZWAgZW51bSBpbgorbWVkaWEuaC4gYHNhbXBsZV9pbmZvc2A6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBTYlBsYXllclNhbXBsZUluZm8gd2l0aAorYG51bWJlcl9vZl9zYW1wbGVfaW5mb3NgIGVsZW1lbnRzLCBlYWNoIGhvbGRzIHRoZSBkYXRhIGZvciBhbiBzYW1wbGUsIGkuZS4gYQorc2VxdWVuY2Ugb2Ygd2hvbGUgTkFMIFVuaXRzIGZvciB2aWRlbywgb3IgYSBjb21wbGV0ZSBhdWRpbyBmcmFtZS4gYHNhbXBsZV9pbmZvc2AKK2Nhbm5vdCBiZSBhc3N1bWVkIHRvIGxpdmUgcGFzdCB0aGUgY2FsbCBpbnRvIFNiUGxheWVyV3JpdGVTYW1wbGVzKCksIHNvIGl0IG11c3QKK2JlIGNvcGllZCBpZiBpdHMgY29udGVudCB3aWxsIGJlIHVzZWQgYWZ0ZXIgU2JQbGF5ZXJXcml0ZVNhbXBsZXMoKSByZXR1cm5zLgorYG51bWJlcl9vZl9zYW1wbGVfaW5mb3NgOiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBjb250YWluZWQgaW5zaWRlCitgc2FtcGxlX2luZm9zYC4gSXQgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGxlc3MgdGhhbiB0aGUgcmV0dXJuIHZhbHVlIG9mCiBTYlBsYXllckdldE1heGltdW1OdW1iZXJPZlNhbXBsZXNQZXJXcml0ZSgpLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKQEAgLTQ5Myw0ICs0NzMsMyBAQAogYGBgCiB2b2lkIFNiUGxheWVyV3JpdGVTYW1wbGUyKFNiUGxheWVyIHBsYXllciwgU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUsIGNvbnN0IFNiUGxheWVyU2FtcGxlSW5mbyAqc2FtcGxlX2luZm9zLCBpbnQgbnVtYmVyX29mX3NhbXBsZV9pbmZvcykKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zb2NrZXQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zb2NrZXQubWQKaW5kZXggNTQ4ZjU3ZC4uOWUwZjgxYiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvc29ja2V0Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL3NvY2tldC5tZApAQCAtNDE3LDggKzQxNyw4IEBACiB0aGUgYWRkcmVzcyBpcyB1bm5lY2Vzc2FyeSwgYnV0IGFsbG93ZWQuCiAKIGBzb2NrZXRgOiBUaGUgU2JTb2NrZXQgZnJvbSB3aGljaCBkYXRhIGlzIHJlYWQuIGBvdXRfZGF0YWA6IFRoZSBkYXRhIHJlYWQgZnJvbQotdGhlIHNvY2tldC4gYGRhdGFfc2l6ZWA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4gYG91dF9zb3VyY2VgOiBUaGUgc291cmNlCi1hZGRyZXNzIG9mIHRoZSBwYWNrZXQuCit0aGUgc29ja2V0LiBNdXN0IG5vdCBiZSBOVUxMLiBgZGF0YV9zaXplYDogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorYG91dF9zb3VyY2VgOiBUaGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTQ1NiwxMCArNDU2LDEwIEBACiBTYlNvY2tldEdldExhc3RFcnJvciByZXR1cm5zIGBrU2JTb2NrZXRQZW5kaW5nYCB0byBtYWtlIGl0IGEgYmVzdC1lZmZvcnQgd3JpdGUKIChidXQgc3RpbGwgb25seSB1cCB0byBub3QgYmxvY2tpbmcsIHVubGVzcyB5b3Ugd2FudCB0byBzcGluKS4KIAotYHNvY2tldGA6IFRoZSBTYlNvY2tldCB0byB1c2UgdG8gd3JpdGUgZGF0YS4gYGRhdGFgOiBUaGUgZGF0YSByZWFkIGZyb20gdGhlCi1zb2NrZXQuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGBkYXRhYCB0byB3cml0ZS4gYGRlc3RpbmF0aW9uYDogVGhlCi1sb2NhdGlvbiB0byB3aGljaCBkYXRhIGlzIHdyaXR0ZW4uIFRoaXMgdmFsdWUgbXVzdCBiZSBgTlVMTGAgZm9yIFRDUAotY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgZW5kcG9pbnQuCitgc29ja2V0YDogVGhlIFNiU29ja2V0IHRvIHVzZSB0byB3cml0ZSBkYXRhLiBgZGF0YWA6IFRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlCitzb2NrZXQuIE11c3Qgbm90IGJlIE5VTEwuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGBkYXRhYCB0byB3cml0ZS4KK2BkZXN0aW5hdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCBkYXRhIGlzIHdyaXR0ZW4uIFRoaXMgdmFsdWUgbXVzdCBiZSBgTlVMTGAKK2ZvciBUQ1AgY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgZW5kcG9pbnQuCiAKIFRoZSBwcmltYXJ5IHVzZSBvZiBgZGVzdGluYXRpb25gIGlzIHRvIHNlbmQgZGF0YWdyYW0gcGFja2V0cywgd2hpY2ggY2FuIGdvIG91dAogdG8gbXVsdGlwbGUgc291cmNlcyBmcm9tIGEgc2luZ2xlIFVEUCBzZXJ2ZXIgc29ja2V0LiBUQ1AgaGFzIHR3byBlbmRwb2ludHMKQEAgLTU4Myw0ICs1ODMsMyBAQAogYGBgCiBib29sIFNiU29ja2V0U2V0VGNwV2luZG93U2NhbGluZyhTYlNvY2tldCBzb2NrZXQsIGJvb2wgdmFsdWUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvc3BlZWNoX3JlY29nbml6ZXIubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zcGVlY2hfcmVjb2duaXplci5tZAppbmRleCAwYTFkYzZiLi4yYTQwZjE5IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zcGVlY2hfcmVjb2duaXplci5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zcGVlY2hfcmVjb2duaXplci5tZApAQCAtMjY2LDQgKzI2NiwzIEBACiBgYGAKIHZvaWQgU2JTcGVlY2hSZWNvZ25pemVyU3RvcChTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplcikKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zeXN0ZW0ubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy9zeXN0ZW0ubWQKaW5kZXggZGQ3MWVjZi4uYjAyZGMwMSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvc3lzdGVtLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL3N5c3RlbS5tZApAQCAtMTE0LDkgKzExNCwxMCBAQAogICAgIEZ1bGwgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLgogKiAgIGBrU2JTeXN0ZW1QYXRoU3RvcmFnZURpcmVjdG9yeWAKIAotICAgIFBhdGggdG8gYSBkaXJlY3RvcnkgZm9yIHBlcm1hbmVudCBmaWxlIHN0b3JhZ2UuIEJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzCi0gICAgaXMgcmVxdWlyZWQuIFRoaXMgaXMgd2hlcmUgYW4gYXBwIG1heSBzdG9yZSBpdHMgcGVyc2lzdGVudCBzZXR0aW5ncy4gVGhlCi0gICAgbG9jYXRpb24gc2hvdWxkIGJlIHVzZXIgYWdub3N0aWMgaWYgcG9zc2libGUuCisgICAgUGF0aCB0byB0aGUgZGlyZWN0b3J5IGRlZGljYXRlZCBmb3IgRXZlcmdyZWVuIEZ1bGwgcGVybWFuZW50IGZpbGUgc3RvcmFnZS4KKyAgICBCb3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyByZXF1aXJlZC4gVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBvbmx5CisgICAgZm9yIHN0b3JpbmcgdGhlIHVwZGF0ZXMuIFNlZQorICAgIHN0YXJib2FyZC9kb2MvZXZlcmdyZWVuL2NvYmFsdF9ldmVyZ3JlZW5fb3ZlcnZpZXcubWQKIAogIyMjIFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlICMjIwogCkBAIC0zMDEsNyArMzAyLDggQEAKICMjIyBTYlN5c3RlbUdldEV4dGVuc2lvbiAjIyMKIAogUmV0dXJucyBwb2ludGVyIHRvIGEgY29uc3RhbnQgZ2xvYmFsIHN0cnVjdCBpbXBsZW1lbnRpbmcgdGhlIGV4dGVuc2lvbiBuYW1lZAotYG5hbWVgLCBpZiBpdCBpcyBpbXBsZW1lbnRlZC4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorYG5hbWVgLCBpZiBpdCBpcyBpbXBsZW1lbnRlZC4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLiBUaGUgYG5hbWVgIHN0cmluZyBtdXN0IG5vdAorYmUgTlVMTC4KIAogRXh0ZW5zaW9ucyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgYmVoYXZpb3Igd2hpY2ggaXMgc3BlY2lmaWMgdG8gdGhlIGNvbWJpbmF0aW9uCiBvZiBhcHBsaWNhdGlvbiAmIHBsYXRmb3JtLiBBbiBleHRlbnNpb24gcmVsaWVzIG9uIGEgaGVhZGVyIGZpbGUgaW4gdGhlCkBAIC02ODQsNyArNjg2LDcgQEAKICMjIyBTYlN5c3RlbVNpZ25XaXRoQ2VydGlmaWNhdGlvblNlY3JldEtleSAjIyMKIAogQ29tcHV0ZXMgYSBITUFDLVNIQTI1NiBkaWdlc3Qgb2YgYG1lc3NhZ2VgIGludG8gYGRpZ2VzdGAgdXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MKLWNlcnRpZmljYXRpb24gc2VjcmV0LgorY2VydGlmaWNhdGlvbiBzZWNyZXQuIFRoZSBgbWVzc2FnZWAgYW5kIHRoZSBgZGlnZXN0YCBwb2ludGVycyBtdXN0IG5vdCBiZSBOVUxMLgogCiBUaGUgb3V0cHV0IHdpbGwgYmUgd3JpdHRlbiBpbnRvIGBkaWdlc3RgLiBgZGlnZXN0X3NpemVfaW5fYnl0ZXNgIG11c3QgYmUgMzIgKG9yCiBncmVhdGVyKSwgc2luY2UgMzItYnl0ZXMgd2lsbCBiZSB3cml0dGVuIGludG8gaXQuIFJldHVybnMgZmFsc2UgaW4gdGhlIGNhc2Ugb2YKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL3VpX25hdmlnYXRpb24ubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMy91aV9uYXZpZ2F0aW9uLm1kCmluZGV4IGU1ZjUzM2IuLmEwZWNmYjEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEzL3VpX25hdmlnYXRpb24ubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTMvdWlfbmF2aWdhdGlvbi5tZApAQCAtMTAxLDggKzEwMSwxMCBAQAogICAgIFRoaXMgaXMgdXNlZCB0byBtYW51YWxseSBmb3JjZSBmb2N1cyBvbiBhIG5hdmlnYXRpb24gaXRlbSBvZiB0eXBlCiAgICAga1NiVWlOYXZJdGVtVHlwZUZvY3VzLiBBbnkgcHJldmlvdXNseSBmb2N1c2VkIG5hdmlnYXRpb24gaXRlbSBzaG91bGQgcmVjZWl2ZQogICAgIHRoZSBibHVyIGV2ZW50LiBJZiB0aGUgaXRlbSBpcyBub3QgdHJhbnNpdGl2ZWx5IGEgY29udGVudCBvZiB0aGUgcm9vdCBpdGVtLAotICAgIHRoZW4gdGhpcyBkb2VzIG5vdGhpbmcuIFNwZWNpZnlpbmcga1NiVWlOYXZJdGVtSW52YWxpZCBzaG91bGQgcmVtb3ZlIGZvY3VzCi0gICAgZnJvbSB0aGUgVUkgbmF2aWdhdGlvbiBzeXN0ZW0uCisgICAgdGhlbiB0aGlzIGRvZXMgbm90aGluZy4KKworICAgIFNwZWNpZnlpbmcga1NiVWlOYXZJdGVtSW52YWxpZCBzaG91bGQgcmVtb3ZlIGZvY3VzIGZyb20gdGhlIFVJIG5hdmlnYXRpb24KKyAgICBzeXN0ZW0uCiAqICAgYHZvaWQoKnNldF9pdGVtX2VuYWJsZWQpKFNiVWlOYXZJdGVtIGl0ZW0sIGJvb2wgZW5hYmxlZClgCiAKICAgICBUaGlzIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKQEAgLTExNiw3ICsxMTgsOSBAQAogCiAgICAgVGhpcyBzcGVjaWZpZXMgZGlyZWN0aW9uYWxpdHkgZm9yIGNvbnRhaW5lciBpdGVtcy4gQ29udGFpbmVycyB3aXRoaW4KICAgICBjb250YWluZXJzIGRvIG5vdCBpbmhlcml0IGRpcmVjdGlvbmFsaXR5LiBEaXJlY3Rpb25hbGl0eSBtdXN0IGJlIHNwZWNpZmllZAotICAgIGZvciBlYWNoIGNvbnRhaW5lciBleHBsaWNpdGx5LiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYgYGl0ZW1gIGlzIGRpc2FibGVkLgorICAgIGZvciBlYWNoIGNvbnRhaW5lciBleHBsaWNpdGx5LgorCisgICAgVGhpcyBzaG91bGQgd29yayBldmVuIGlmIGBpdGVtYCBpcyBkaXNhYmxlZC4KICogICBgdm9pZCgqc2V0X2l0ZW1fZm9jdXNfZHVyYXRpb24pKFNiVWlOYXZJdGVtIGl0ZW0sIGZsb2F0IHNlY29uZHMpYAogCiAgICAgU2V0IHRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRoZSBmb2N1cyBpdGVtIHNob3VsZCByZW1haW4gZm9jdXNlZCBvbmNlIGl0CkBAIC0xNTgsMTMgKzE2MiwxNiBAQAogCiAgICAgVGhpcyBhdHRhY2hlcyB0aGUgZ2l2ZW4gbmF2aWdhdGlvbiBpdGVtICh3aGljaCBtdXN0IGJlIGEgY29udGFpbmVyKSB0byB0aGUKICAgICBzcGVjaWZpZWQgd2luZG93LiBOYXZpZ2F0aW9uIGl0ZW1zIGFyZSBvbmx5IGludGVyYWN0YWJsZSBpZiB0aGV5IGFyZQotICAgIHRyYW5zaXRpdmVseSBhdHRhY2hlZCB0byBhIHdpbmRvdy5UaGUgbmF0aXZlIFVJIGVuZ2luZSBzaG91bGQgbmV2ZXIgY2hhbmdlCi0gICAgdGhpcyBuYXZpZ2F0aW9uIGl0ZW0ncyBjb250ZW50IG9mZnNldC4gSXQgaXMgYXNzdW1lZCB0byBiZSB1c2VkIGFzIGEgcHJveHkKLSAgICBmb3IgdGhlIHN5c3RlbSB3aW5kb3cuQSBuYXZpZ2F0aW9uIGl0ZW0gbWF5IG9ubHkgaGF2ZSBhIFNiVWlOYXZJdGVtIG9yCi0gICAgU2JXaW5kb3cgYXMgaXRzIGRpcmVjdCBjb250YWluZXIuIFRoZSBuYXZpZ2F0aW9uIGl0ZW0gaGllcmFyY2h5IGlzCi0gICAgZXN0YWJsaXNoZWQgdXNpbmcgc2V0X2l0ZW1fY29udGFpbmVyX2l0ZW0oKSB3aXRoIHRoZSByb290IGNvbnRhaW5lciBhdHRhY2hlZAotICAgIHRvIGEgU2JXaW5kb3cgdXNpbmcgc2V0X2l0ZW1fY29udGFpbmVyX3dpbmRvdygpIHRvIGVuYWJsZSBpbnRlcmFjdGlvbiB3aXRoCi0gICAgYWxsIGVuYWJsZWQgaXRlbXMgaW4gdGhlIGhpZXJhcmNoeS4KKyAgICB0cmFuc2l0aXZlbHkgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisKKyAgICBUaGUgbmF0aXZlIFVJIGVuZ2luZSBzaG91bGQgbmV2ZXIgY2hhbmdlIHRoaXMgbmF2aWdhdGlvbiBpdGVtJ3MgY29udGVudAorICAgIG9mZnNldC4gSXQgaXMgYXNzdW1lZCB0byBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBzeXN0ZW0gd2luZG93LgorCisgICAgQSBuYXZpZ2F0aW9uIGl0ZW0gbWF5IG9ubHkgaGF2ZSBhIFNiVWlOYXZJdGVtIG9yIFNiV2luZG93IGFzIGl0cyBkaXJlY3QKKyAgICBjb250YWluZXIuIFRoZSBuYXZpZ2F0aW9uIGl0ZW0gaGllcmFyY2h5IGlzIGVzdGFibGlzaGVkIHVzaW5nCisgICAgc2V0X2l0ZW1fY29udGFpbmVyX2l0ZW0oKSB3aXRoIHRoZSByb290IGNvbnRhaW5lciBhdHRhY2hlZCB0byBhIFNiV2luZG93CisgICAgdXNpbmcgc2V0X2l0ZW1fY29udGFpbmVyX3dpbmRvdygpIHRvIGVuYWJsZSBpbnRlcmFjdGlvbiB3aXRoIGFsbCBlbmFibGVkCisgICAgaXRlbXMgaW4gdGhlIGhpZXJhcmNoeS4KIAogICAgIElmIGBpdGVtYCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBhIGRpZmZlcmVudCB3aW5kb3csIHRoZW4gdGhpcyB3aWxsCiAgICAgdW5yZWdpc3RlciBpdCBmcm9tIHRoYXQgd2luZG93IHRoZW4gYXR0YWNoIGl0IHRvIHRoZSBnaXZlbiBgd2luZG93YC4gSXQgaXMKQEAgLTE5NSwxMyArMjAyLDE0IEBACiAgICAgZHJhd24gYXQgcG9zaXRpb24gKDUsMTUpLgogCiAgICAgRXNzZW50aWFsbHksIGNvbnRlbnQgaXRlbXMgc2hvdWxkIGJlIGRyYXduIGF0OiBbY29udGFpbmVyIHBvc2l0aW9uXSArCi0gICAgW2NvbnRlbnQgcG9zaXRpb25dIC0gW2NvbnRhaW5lciBjb250ZW50IG9mZnNldF0gQ29udGVudCBpdGVtcyBtYXkgb3ZlcmxhcAotICAgIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyBjYW4gY2F1c2Ugb2JzY3VyZWQgaXRlbXMgdG8gYmUgdW5mb2N1c2FibGUuIFRoZQotICAgIG9ubHkgcnVsZSB0aGF0IG5lZWRzIHRvIGJlIGZvbGxvd2VkIGlzIHRoYXQgY29udGVudHMgd2hpY2ggYXJlIGZvY3VzIGl0ZW1zCi0gICAgY2FuIG9ic2N1cmUgb3RoZXIgY29udGVudHMgd2hpY2ggYXJlIGNvbnRhaW5lcnMsIGJ1dCBub3QgdmljZSB2ZXJzYS4gVGhlCi0gICAgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgY29udGVudCBmb2N1cyBpdGVtcyBkbyBub3Qgb3ZlcmxhcCBvdGhlciBjb250ZW50Ci0gICAgZm9jdXMgaXRlbXMgYW5kIGNvbnRlbnQgY29udGFpbmVyIGl0ZW1zIGRvIG5vdCBvdmVybGFwIG90aGVyIGNvbnRlbnQKLSAgICBjb250YWluZXIgaXRlbXMuCisgICAgW2NvbnRlbnQgcG9zaXRpb25dIC0gW2NvbnRhaW5lciBjb250ZW50IG9mZnNldF0KKworICAgIENvbnRlbnQgaXRlbXMgbWF5IG92ZXJsYXAgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIGNhbiBjYXVzZSBvYnNjdXJlZCBpdGVtcworICAgIHRvIGJlIHVuZm9jdXNhYmxlLiBUaGUgb25seSBydWxlIHRoYXQgbmVlZHMgdG8gYmUgZm9sbG93ZWQgaXMgdGhhdCBjb250ZW50cworICAgIHdoaWNoIGFyZSBmb2N1cyBpdGVtcyBjYW4gb2JzY3VyZSBvdGhlciBjb250ZW50cyB3aGljaCBhcmUgY29udGFpbmVycywgYnV0CisgICAgbm90IHZpY2UgdmVyc2EuIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBjb250ZW50IGZvY3VzIGl0ZW1zIGRvIG5vdAorICAgIG92ZXJsYXAgb3RoZXIgY29udGVudCBmb2N1cyBpdGVtcyBhbmQgY29udGVudCBjb250YWluZXIgaXRlbXMgZG8gbm90IG92ZXJsYXAKKyAgICBvdGhlciBjb250ZW50IGNvbnRhaW5lciBpdGVtcy4KICogICBgdm9pZCgqc2V0X2l0ZW1fY29udGVudF9vZmZzZXQpKFNiVWlOYXZJdGVtIGl0ZW0sIGZsb2F0IGNvbnRlbnRfb2Zmc2V0X3gsCiAgICAgZmxvYXQgY29udGVudF9vZmZzZXRfeSlgCiAKQEAgLTIxMSwxNyArMjE5LDE5IEBACiAgICAgRXNzZW50aWFsbHksIGEgY29udGVudCBpdGVtIHNob3VsZCBiZSBkcmF3biBhdDogW2NvbnRhaW5lciBwb3NpdGlvbl0gKwogICAgIFtjb250ZW50IHBvc2l0aW9uXSAtIFtjb250YWluZXIgY29udGVudCBvZmZzZXRdIElmIGBpdGVtYCBpcyBub3QgYQogICAgIGNvbnRhaW5lciwgdGhlbiB0aGlzIGRvZXMgbm90aGluZy4gQnkgZGVmYXVsdCwgdGhlIGNvbnRlbnQgb2Zmc2V0IGlzICgwLDApLgorCiAgICAgVGhpcyBzaG91bGQgdXBkYXRlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0X2l0ZW1fY29udGVudF9vZmZzZXQoKSBldmVuIGlmCiAgICAgdGhlIGBpdGVtYCBpcyBkaXNhYmxlZC4KICogICBgdm9pZCgqZ2V0X2l0ZW1fY29udGVudF9vZmZzZXQpKFNiVWlOYXZJdGVtIGl0ZW0sIGZsb2F0CiAgICAgKm91dF9jb250ZW50X29mZnNldF94LCBmbG9hdCAqb3V0X2NvbnRlbnRfb2Zmc2V0X3kpYAogCiAgICAgUmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGVudCBvZmZzZXQgZm9yIHRoZSBuYXZpZ2F0aW9uIGl0ZW0uIElmIGBpdGVtYCBpcwotICAgIG5vdCBhIGNvbnRhaW5lciwgdGhlbiB0aGUgY29udGVudCBvZmZzZXQgaXMgKDAsMCkuIFRoZSBuYXRpdmUgVUkgZW5naW5lCi0gICAgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGNvbnRlbnQgb2Zmc2V0IG9mIGEgY29udGFpbmVyIHVubGVzcyBvbmUgb2YgaXRzCi0gICAgY29udGVudHMgKHBvc3NpYmx5IHJlY3Vyc2l2ZWx5KSBpcyBmb2N1c2VkLiBUaGlzIGlzIHRvIGFsbG93IHNlYW1sZXNzbHkKLSAgICBkaXNhYmxpbmcgdGhlbiByZS1lbmFibGluZyBmb2N1cyBpdGVtcyB3aXRob3V0IGhhdmluZyB0aGVpciBjb250YWluZXJzCi0gICAgY2hhbmdlIG9mZnNldHMuCisgICAgbm90IGEgY29udGFpbmVyLCB0aGVuIHRoZSBjb250ZW50IG9mZnNldCBpcyAoMCwwKS4KKworICAgIFRoZSBuYXRpdmUgVUkgZW5naW5lIHNob3VsZCBub3QgY2hhbmdlIHRoZSBjb250ZW50IG9mZnNldCBvZiBhIGNvbnRhaW5lcgorICAgIHVubGVzcyBvbmUgb2YgaXRzIGNvbnRlbnRzIChwb3NzaWJseSByZWN1cnNpdmVseSkgaXMgZm9jdXNlZC4gVGhpcyBpcyB0bworICAgIGFsbG93IHNlYW1sZXNzbHkgZGlzYWJsaW5nIHRoZW4gcmUtZW5hYmxpbmcgZm9jdXMgaXRlbXMgd2l0aG91dCBoYXZpbmcgdGhlaXIKKyAgICBjb250YWluZXJzIGNoYW5nZSBvZmZzZXRzLgogKiAgIGB2b2lkKCpkb19iYXRjaF91cGRhdGUpKHZvaWQoKnVwZGF0ZV9mdW5jdGlvbikodm9pZCAqKSwgdm9pZCAqY29udGV4dClgCiAKICAgICBDYWxsIGB1cGRhdGVfZnVuY3Rpb25gIHdpdGggYGNvbnRleHRgIHRvIHBlcmZvcm0gYSBzZXJpZXMgb2YgVUkgbmF2aWdhdGlvbgpAQCAtMjUyLDcgKzI2Miw3IEBACiAvLy8gICAgIHwgTmVnYXRpdmUgcG9zaXRpb24uIHwgUG9zaXRpdmUgcG9zaXRpb24uIHwgUG9zaXRpdmUgcG9zaXRpb24uIHwKIC8vLyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwogLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLy8gICAgICAgICAgICAgICAgICBDb250ZW50IE9mZnNldCBYID0gMC4gCisvLy8gICAgICAgICAgICAgICAgICBDb250ZW50IE9mZnNldCBYID0gMC4KIGBgYAogCiBgYGAKQEAgLTI3MSw3ICsyODEsNyBAQAogCiBgYGAKIC8vLyAgIHwgYSBiIHR4IHwKLS8vLyAgIHwgYyBkIHR5IHwgCisvLy8gICB8IGMgZCB0eSB8CiBgYGAKIAogIyMjIyBNZW1iZXJzICMjIyMKQEAgLTI5Miw3ICszMDIsOCBAQAogCiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ncyBVSSBuYXZpZ2F0aW9uIGltcGxlbWVudGF0aW9uLiBJZiB0aGUgcGxhdGZvcm0gZG9lcyBub3QKIHByb3ZpZGUgb25lLCB0aGVuIHJldHVybiBmYWxzZSB3aXRob3V0IG1vZGlmeWluZyBgb3V0X2ludGVyZmFjZWAuIE90aGVyd2lzZSwKLWluaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgYG91dF9pbnRlcmZhY2VgIGFuZCByZXR1cm4gdHJ1ZS4KK2luaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgYG91dF9pbnRlcmZhY2VgIGFuZCByZXR1cm4gdHJ1ZS4gVGhlIGBvdXRfaW50ZXJmYWNlYAorcG9pbnRlciBtdXN0IG5vdCBiZSBOVUxMLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzA5LDQgKzMyMCwzIEBACiBgYGAKIHN0YXRpYyBib29sIFNiVWlOYXZJdGVtSXNWYWxpZChTYlVpTmF2SXRlbSBpdGVtKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2F1ZGlvX3NpbmsubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9hdWRpb19zaW5rLm1kCmluZGV4IDNiMzc4OWEuLmIwZTY1MmYgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2F1ZGlvX3NpbmsubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvYXVkaW9fc2luay5tZApAQCAtNzIsNiArNzIsNTMgQEAKIAogIyMgRnVuY3Rpb25zICMjCiAKKyMjIyBTYkF1ZGlvU2lua0NyZWF0ZSAjIyMKKworQ3JlYXRlcyBhbiBhdWRpbyBzaW5rIGZvciB0aGUgc3BlY2lmaWVkIGBjaGFubmVsc2AgYW5kIGBzYW1wbGluZ19mcmVxdWVuY3lfaHpgLAorYWNxdWlyZXMgYWxsIHJlc291cmNlcyBuZWVkZWQgdG8gb3BlcmF0ZSB0aGUgYXVkaW8gc2luaywgYW5kIHJldHVybnMgYW4gb3BhcXVlCitoYW5kbGUgdG8gdGhlIGF1ZGlvIHNpbmsuCisKK0lmIHRoZSBwYXJ0aWN1bGFyIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIGF1ZGlvIHNpbmssIHRoZQorZnVuY3Rpb24gcmV0dXJucyBga1NiQXVkaW9TaW5rSW52YWxpZGAgd2l0aG91dCBjYWxsaW5nIGFueSBvZiB0aGUgY2FsbGJhY2tzLiBJZgordGhlcmUgaXMgYSBwbGF0Zm9ybSBsaW1pdGF0aW9uIG9uIGhvdyBtYW55IGF1ZGlvIHNpbmtzIGNhbiBjb2V4aXN0CitzaW11bHRhbmVvdXNseSwgdGhlbiBjYWxscyBtYWRlIHRvIHRoaXMgZnVuY3Rpb24gdGhhdCBhdHRlbXB0IHRvIGV4Y2VlZCB0aGF0CitsaW1pdCBtdXN0IHJldHVybiBga1NiQXVkaW9TaW5rSW52YWxpZGAuIE11bHRpcGxlIGNhbGxzIHRvIFNiQXVkaW9TaW5rQ3JlYXRlCittdXN0IG5vdCBjYXVzZSBhIGNyYXNoLgorCitgY2hhbm5lbHNgOiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLCBzdWNoIGFzIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGluCitzdGVyZW8gYXVkaW8uIGBzYW1wbGluZ19mcmVxdWVuY3lfaHpgOiBUaGUgc2FtcGxlIGZyZXF1ZW5jeSBvZiB0aGUgYXVkaW8gZGF0YQorYmVpbmcgc3RyZWFtZWQuIEZvciBleGFtcGxlLCAyMiwwMDAgSHogbWVhbnMgMjIsMDAwIHNhbXBsZSBlbGVtZW50cyByZXByZXNlbnRzCitvbmUgc2Vjb25kIG9mIGF1ZGlvIGRhdGEuIGBhdWRpb19zYW1wbGVfdHlwZWA6IFRoZSB0eXBlIG9mIGVhY2ggc2FtcGxlIG9mIHRoZQorYXVkaW8gZGF0YSDigJMgYGludDE2YCwgYGZsb2F0MzJgLCBldGMuIGBhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVgOiBJbmRpY2F0ZXMKK3doZXRoZXIgZnJhbWVzIGFyZSBpbnRlcmxlYXZlZCBvciBwbGFuYXIuIGBmcmFtZV9idWZmZXJzYDogQW4gYXJyYXkgb2YgcG9pbnRlcnMKK3RvIHNhbXBsZSBkYXRhLgorCisqICAgSWYgdGhlIHNpbmsgaXMgb3BlcmF0aW5nIGluIGludGVybGVhdmVkIG1vZGUsIHRoZSBhcnJheSBjb250YWlucyBvbmx5IG9uZQorICAgIGVsZW1lbnQsIHdoaWNoIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgKGBmcmFtZXNfcGVyX2NoYW5uZWxgICogYGNoYW5uZWxzYCkKKyAgICBzYW1wbGVzLgorCisqICAgSWYgdGhlIHNpbmsgaXMgb3BlcmF0aW5nIGluIHBsYW5hciBtb2RlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICAgIGlzIHRoZSBzYW1lIGFzIGBjaGFubmVsc2AsIGFuZCBlYWNoIGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YKKyAgICBgZnJhbWVzX3Blcl9jaGFubmVsYCBzYW1wbGVzLiBUaGUgY2FsbGVyIGhhcyB0byBlbnN1cmUgdGhhdCBgZnJhbWVfYnVmZmVyc2AKKyAgICBpcyB2YWxpZCB1bnRpbCBTYkF1ZGlvU2lua0Rlc3Ryb3kgaXMgY2FsbGVkLiBgZnJhbWVzX3Blcl9jaGFubmVsYDogVGhlIHNpemUKKyAgICBvZiB0aGUgZnJhbWUgYnVmZmVycywgaW4gdW5pdHMgb2YgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsLiBUaGUKKyAgICBmcmFtZSwgaW4gdGhpcyBjYXNlLCByZXByZXNlbnRzIGEgZ3JvdXAgb2Ygc2FtcGxlcyBhdCB0aGUgc2FtZSBtZWRpYSB0aW1lLAorICAgIG9uZSBmb3IgZWFjaCBjaGFubmVsLiBgdXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuY2A6IFRoZSBhdWRpbyBzaW5rIGNhbGxzIHRoaXMKKyAgICBmdW5jdGlvbiBvbiBhbiBpbnRlcm5hbCB0aHJlYWQgdG8gcXVlcnkgdGhlIHN0YXR1cyBvZiB0aGUgc291cmNlLiBJdCBpcworICAgIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBTYkF1ZGlvU2lua0NyZWF0ZSBpcyBjYWxsZWQsIGV2ZW4gYmVmb3JlIGl0CisgICAgcmV0dXJucy4gVGhlIGNhbGxlciBoYXMgdG8gZW5zdXJlIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhYm92ZSByZXR1cm4KKyAgICBtZWFuaW5nZnVsIHZhbHVlcyBpbiB0aGlzIGNhc2UuIFRoZSB2YWx1ZSBjYW5ub3QgYmUgTlVMTC4KKyAgICBgY29uc3VtZV9mcmFtZXNfZnVuY2A6IFRoZSBhdWRpbyBzaW5rIGNhbGxzIHRoaXMgZnVuY3Rpb24gb24gYW4gaW50ZXJuYWwKKyAgICB0aHJlYWQgdG8gcmVwb3J0IGNvbnN1bWVkIGZyYW1lcy4gVGhlIHZhbHVlIGNhbm5vdCBiZSBOVUxMLiBgY29udGV4dGA6IEEKKyAgICB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBiYWNrIHRvIGFsbCBjYWxsYmFja3MgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvIHBvaW50IGF0CisgICAgYSBjbGFzcyBvciBzdHJ1Y3QgdGhhdCBjb250YWlucyBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGF1ZGlvIHNpbmsuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK1NiQXVkaW9TaW5rIFNiQXVkaW9TaW5rQ3JlYXRlKGludCBjaGFubmVscywgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiwgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBhdWRpb19zYW1wbGVfdHlwZSwgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGUsIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsIGludCBmcmFtZXNfcGVyX2NoYW5uZWwsIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLCBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVzX2Z1bmMsIHZvaWQgKmNvbnRleHQpCitgYGAKKwogIyMjIFNiQXVkaW9TaW5rRGVzdHJveSAjIyMKIAogRGVzdHJveXMgYGF1ZGlvX3NpbmtgLCBmcmVlaW5nIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4gQmVmb3JlIHJldHVybmluZywgdGhlCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9kZWNvZGVfdGFyZ2V0Lm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvZGVjb2RlX3RhcmdldC5tZAppbmRleCAwZTkxMmQ1Li5hMjM3YWQ5IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9kZWNvZGVfdGFyZ2V0Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2RlY29kZV90YXJnZXQubWQKQEAgLTMzMiw4ICszMzIsMTAgQEAKIAogIyMjIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyAjIyMKIAotV3JpdGVzIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBgZGVjb2RlX3RhcmdldGAgaW50byBgb3V0X2luZm9gLiBSZXR1cm5zIGZhbHNlIGlmCi10aGUgcHJvdmlkZWQgYG91dF9pbmZvYCBzdHJ1Y3R1cmUgaXMgbm90IHplcm8gaW5pdGlhbGl6ZWQuCitXcml0ZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGBkZWNvZGVfdGFyZ2V0YCBpbnRvIGBvdXRfaW5mb2AuIFRoZQorYGRlY29kZV90YXJnZXRgIG11c3Qgbm90IGJlIGtTYkRlY29kZVRhcmdldEludmFsaWQuIFRoZSBgb3V0X2luZm9gIHBvaW50ZXIgbXVzdAorbm90IGJlIE5VTEwuIFJldHVybnMgZmFsc2UgaWYgdGhlIHByb3ZpZGVkIGBvdXRfaW5mb2Agc3RydWN0dXJlIGlzIG5vdCB6ZXJvCitpbml0aWFsaXplZC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2RybS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2RybS5tZAppbmRleCBjN2Y0ODdlLi5mYmI5MmY5IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9kcm0ubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvZHJtLm1kCkBAIC0yMzgsNiArMjM4LDggQEAKIAogQ2xlYXIgYW55IGludGVybmFsIHN0YXRlcy9yZXNvdXJjZXMgcmVsYXRlZCB0byB0aGUgc3BlY2lmaWVkIGBzZXNzaW9uX2lkYC4KIAorYGRybV9zeXN0ZW1gIG11c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4gYHNlc3Npb25faWRgIG11c3Qgbm90IGJlIE5VTEwuCisKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKQEAgLTI1NCw3ICsyNTYsNyBAQAogcmVzdWx0LCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgdG8KIFNiRHJtQ3JlYXRlU3lzdGVtKCksIGEgZGVhZGxvY2sgd2lsbCBvY2N1ci4KIAotYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB0byBiZSBkZXN0cm95ZWQuCitgZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHRvIGJlIGRlc3Ryb3llZC4gTXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMjgxLDcgKzI4Myw3IEBACiAKIGBkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gdGhhdCBkZWZpbmVzIHRoZSBrZXkgc3lzdGVtIHVzZWQgZm9yIHRoZSBzZXNzaW9uCiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkIGFzIHdlbGwgYXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGFzIGEKLXJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLgorcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQuIE11c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4KIAogYHRpY2tldGA6IFRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUKIGNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCksIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCkBAIC0yODksMTAgKzI5MSwxMCBAQAogZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nIG11bHRpcGxlIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgdGlja2V0IG1heQogcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4gVGhlIHZhbHVlIGBrU2JEcm1UaWNrZXRJbnZhbGlkYCBtdXN0IG5vdCBiZSB1c2VkLgogCi1gdHlwZWA6IFRoZSBjYXNlLXNlbnNpdGl2ZSB0eXBlIG9mIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQuCi1gaW5pdGlhbGl6YXRpb25fZGF0YWA6IFRoZSBkYXRhIGZvciB3aGljaCB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkIGlzCi1jcmVhdGVkLiBgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplYDogVGhlIHNpemUgb2YgdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QKLXBheWxvYWQuCitgdHlwZWA6IFRoZSBjYXNlLXNlbnNpdGl2ZSB0eXBlIG9mIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQuIE11c3Qgbm90CitiZSBOVUxMLiBgaW5pdGlhbGl6YXRpb25fZGF0YWA6IFRoZSBkYXRhIGZvciB3aGljaCB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdAorcGF5bG9hZCBpcyBjcmVhdGVkLiBNdXN0IG5vdCBiZSBOVUxMLiBgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplYDogVGhlIHNpemUgb2YKK3RoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMjIsNyArMzI0LDcgQEAKIEl0IHNob3VsZCByZXR1cm4gTlVMTCB3aGVuIHRoZXJlIGlzIG5vIG1ldHJpY3Mgc3VwcG9ydCBpbiB0aGUgdW5kZXJseWluZyBkcm0KIHN5c3RlbSwgb3Igd2hlbiB0aGUgZHJtIHN5c3RlbSBpbXBsZW1lbnRhdGlvbiBmYWlscyB0byByZXRyaWV2ZSB0aGUgbWV0cmljcy4KIAotVGhlIGNhbGxlciB3aWxsIG5ldmVyIHNldCBgc2l6ZWAgdG8gTlVMTC4KK2Bkcm1fc3lzdGVtYCBtdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuIGBzaXplYCBtdXN0IG5vdCBiZSBOVUxMLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzM3LDYgKzMzOSw3IEBACiB0aGUgbGlmZSB0aW1lIG9mIGBkcm1fc3lzdGVtYC4KIAogYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB0byBjaGVjayBpZiBpdHMgc2VydmVyIGNlcnRpZmljYXRlIGlzIHVwZGF0YWJsZS4KK011c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTM3MSwxNCArMzc0LDE1IEBACiBhIHByZXZpb3VzIGNhbGwgaXMgY2FsbGVkLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIKIGBTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGVgIGlzIGNhbGxlZCBmaXJzdCBhbmQgcmV0dXJuZWQgdHJ1ZS4KIAotYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB3aG9zZSBzZXJ2ZXIgY2VydGlmaWNhdGUgaXMgYmVpbmcgdXBkYXRlZC4KLWB0aWNrZXRgOiBUaGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGNhbGxiYWNrcyBmcm9tIG11bHRpcGxlCi1jb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8KLWBzZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRlZF9jYWxsYmFja2AgYXMtaXMuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKLWNhbGxlciB0byBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZQotdGlja2V0IG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBUaGUgdmFsdWUgYGtTYkRybVRpY2tldEludmFsaWRgIG11c3QKLW5vdCBiZSB1c2VkLiBgY2VydGlmaWNhdGVgOiBQb2ludGVyIHRvIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZGF0YS4KLWBjZXJ0aWZpY2F0ZV9zaXplYDogU2l6ZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGRhdGEuCitgZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHdob3NlIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyBiZWluZyB1cGRhdGVkLiBNdXN0IG5vdAorYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLiBgdGlja2V0YDogVGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaAorY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUgY29uY3VycmVudCBjYWxscyB0byBTYkRybVVwZGF0ZVNlcnZlckNlcnRpZmljYXRlKCksCit3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBgc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2tgIGFzLWlzLiBJdCBpcyB0aGUKK3Jlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nIG11bHRpcGxlCityZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIHRpY2tldCBtYXkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4gVGhlIHZhbHVlCitga1NiRHJtVGlja2V0SW52YWxpZGAgbXVzdCBub3QgYmUgdXNlZC4gYGNlcnRpZmljYXRlYDogUG9pbnRlciB0byB0aGUgc2VydmVyCitjZXJ0aWZpY2F0ZSBkYXRhLiBNdXN0IG5vdCBiZSBOVUxMLiBgY2VydGlmaWNhdGVfc2l6ZWA6IFNpemUgb2YgdGhlIHNlcnZlcgorY2VydGlmaWNhdGUgZGF0YS4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTM5MSwxOCArMzk1LDIwIEBACiBVcGRhdGUgc2Vzc2lvbiB3aXRoIGBrZXlgLCBpbiBgZHJtX3N5c3RlbWAncyBrZXkgc3lzdGVtLCBmcm9tIHRoZSBsaWNlbnNlIHNlcnZlcgogcmVzcG9uc2UuIENhbGxzIGBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2tgIHdpdGggYGNvbnRleHRgIGFuZCB3aGV0aGVyIHRoZSB1cGRhdGUKIHN1Y2NlZWRlZC4gYGNvbnRleHRgIG1heSBiZSB1c2VkIHRvIHJvdXRlIGNhbGxiYWNrcyBiYWNrIHRvIGFuIG9iamVjdCBpbnN0YW5jZS4KK1RoZSBga2V5YCBtdXN0IG5vdCBiZSBOVUxMLgogCi1gdGlja2V0YCBpcyB0aGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGNhbGxiYWNrcyBmcm9tIG11bHRpcGxlCi1jb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtVXBkYXRlU2Vzc2lvbigpLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0bwotYHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja2AgYXMtaXMuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvCi1lc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgY2FsbHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQgbWF5Ci1yZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorYGRybV9zeXN0ZW1gIG11c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4gYHRpY2tldGAgaXMgdGhlIG9wYXF1ZSBJRCB0aGF0CithbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUgY29uY3VycmVudCBjYWxscyB0bworU2JEcm1VcGRhdGVTZXNzaW9uKCksIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2tgIGFzLWlzLgorSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nCittdWx0aXBsZSBjYWxscyB3aXRoIHRoZSBzYW1lIHRpY2tldCBtYXkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KIAogT25jZSB0aGUgc2Vzc2lvbiBpcyBzdWNjZXNzZnVsbHkgdXBkYXRlZCwgYW4gU2JQbGF5ZXIgb3IgU2JEZWNvZGVyIGFzc29jaWF0ZWQKIHdpdGggdGhhdCBEUk0ga2V5IHN5c3RlbSB3aWxsIGJlIGFibGUgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgc2FtcGxlcy4KIAogYGRybV9zeXN0ZW1gJ3MgYHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja2AgbWF5IGNhbGxlZCBlaXRoZXIgZnJvbSB0aGUgY3VycmVudAotdGhyZWFkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb3IgZnJvbSBhbm90aGVyIHRocmVhZC4KK3RocmVhZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9yIGZyb20gYW5vdGhlciB0aHJlYWQuIFRoZSBgc2Vzc2lvbl9pZGAKK211c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9ldmVudC5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2V2ZW50Lm1kCmluZGV4IDhkMjBjNmYuLjAxYTlkMjQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2V2ZW50Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2V2ZW50Lm1kCkBAIC0zLDEwICszLDYgQEAKIHRpdGxlOiAiU3RhcmJvYXJkIE1vZHVsZSBSZWZlcmVuY2U6IGV2ZW50LmgiCiAtLS0KIAotRm9yIFNCX0FQSV9WRVJTSU9OID49IDEzCi0KLU1vZHVsZSBPdmVydmlldzogU3RhcmJvYXJkIEV2ZW50IG1vZHVsZQotCiBEZWZpbmVzIHRoZSBldmVudCBzeXN0ZW0gdGhhdCB3cmFwcyB0aGUgU3RhcmJvYXJkIG1haW4gbG9vcCBhbmQgZW50cnkgcG9pbnQuCiAKICMjIFRoZSBTdGFyYm9hcmQgQXBwbGljYXRpb24gTGlmZWN5Y2xlICMjCkBAIC04Miw3NSArNzgsNiBAQAogTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gdHJhbnNpdGlvbiB0aHJvdWdoIGBCTFVSUkVEYCwKIGBDT05DRUFMRURgIHRvIGBGUk9aRU5gIGJlZm9yZSByZWNlaXZpbmcgYFN0b3BgIG9yIGJlaW5nIGtpbGxlZC4KIAotRm9yIFNCX0FQSV9WRVJTSU9OIDwgMTMKLQotTW9kdWxlIE92ZXJ2aWV3OiBTdGFyYm9hcmQgRXZlbnQgbW9kdWxlCi0KLURlZmluZXMgdGhlIGV2ZW50IHN5c3RlbSB0aGF0IHdyYXBzIHRoZSBTdGFyYm9hcmQgbWFpbiBsb29wIGFuZCBlbnRyeSBwb2ludC4KLQotIyMgVGhlIFN0YXJib2FyZCBBcHBsaWNhdGlvbiBMaWZlY3ljbGUgIyMKLQotYGBgCi0gICAgLS0tLS0tLS0tLSAqCi0gICB8ICAgICAgICAgICB8Ci0gICB8ICAgICAgICBQcmVsb2FkCi0gICB8ICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICBWCi0gU3RhcnQgICBbIFBSRUxPQURJTkcgXSAtLS0tLS0tLS0tLS0KLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICBTdGFydCAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgIHwKLSAgICAtLS0tPiBbIFNUQVJURUQgXSA8LS0tLSAgICAgICAgIHwKLSAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgIHwKLSAgICAgICAgICAgICBQYXVzZSAgICAgICBVbnBhdXNlICAgIHwKLSAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIFN1c3BlbmQKLSAgICAgICAgICAgICAgIFYgICAgICAgICAgIHwgICAgICAgIHwKLSAgICAtLS0tLT4gWyBQQVVTRUQgXSAtLS0tLSAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLVJlc3VtZSAgICAgIFN1c3BlbmQgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgIHwKLSAgICAtLS0tIFsgU1VTUEVOREVEIF0gPC0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICBTdG9wCi0gICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICBWCi0gICAgICAgICAgWyBTVE9QUEVEIF0KLQotYGBgCi0KLVRoZSBmaXJzdCBldmVudCB0aGF0IGEgU3RhcmJvYXJkIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGlzIGVpdGhlciBgU3RhcnRgCi0oYGtTYkV2ZW50VHlwZVN0YXJ0YCkgb3IgYFByZWxvYWRgIChga1NiRXZlbnRUeXBlUHJlbG9hZGApLiBgU3RhcnRgIHB1dHMgdGhlCi1hcHBsaWNhdGlvbiBpbiB0aGUgYFNUQVJURURgIHN0YXRlLCB3aGVyZWFzIGBQcmVsb2FkYCBwdXRzIHRoZSBhcHBsaWNhdGlvbiBpbgotdGhlIGBQUkVMT0FESU5HYCBzdGF0ZS4KLQotYFBSRUxPQURJTkdgIGNhbiBvbmx5IGhhcHBlbiBhcyB0aGUgZmlyc3QgYXBwbGljYXRpb24gc3RhdGUuIEluIHRoaXMgc3RhdGUsIHRoZQotYXBwbGljYXRpb24gc2hvdWxkIHN0YXJ0IGFuZCBydW4gYXMgbm9ybWFsLCBidXQgd2lsbCBub3QgcmVjZWl2ZSBhbnkgaW5wdXQsIGFuZAotc2hvdWxkIG5vdCB0cnkgdG8gaW5pdGlhbGl6ZSBncmFwaGljcyByZXNvdXJjZXMgdmlhIEdMLiBJbiBgUFJFTE9BRElOR2AsIHRoZQotYXBwbGljYXRpb24gY2FuIHJlY2VpdmUgYFN0YXJ0YCBvciBgU3VzcGVuZGAgZXZlbnRzLiBgU3RhcnRgIHdpbGwgcmVjZWl2ZSB0aGUKLXNhbWUgZGF0YSB0aGF0IHdhcyBwYXNzZWQgaW50byBgUHJlbG9hZGAuCi0KLUluIHRoZSBgU1RBUlRFRGAgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBpcyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgY2FuIGV4cGVjdCB0bwotZG8gYWxsIG9mIHRoZSBub3JtYWwgdGhpbmdzIGl0IG1pZ2h0IHdhbnQgdG8gZG8uIE9uY2UgaW4gdGhlIGBTVEFSVEVEYCBzdGF0ZSwgaXQKLW1heSByZWNlaXZlIGEgYFBhdXNlYCBldmVudCwgcHV0dGluZyB0aGUgYXBwbGljYXRpb24gaW50byB0aGUgYFBBVVNFRGAgc3RhdGUuCi0KLUluIHRoZSBgUEFVU0VEYCBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHZpc2libGUsIGJ1dCBoYXMgbG9zdCBmb2N1cywgb3IKLWl0IGlzIHBhcnRpYWxseSBvYnNjdXJlZCBieSBhIG1vZGFsIGRpYWxvZywgb3IgaXQgaXMgb24gaXRzIHdheSB0byBiZWluZyBzaHV0Ci1kb3duLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHBhdXNlIGFjdGl2aXR5IGluIHRoaXMgc3RhdGUuIEluIHRoaXMgc3RhdGUsIGl0IGNhbgotcmVjZWl2ZSBgVW5wYXVzZWAgdG8gYmUgYnJvdWdodCBiYWNrIHRvIHRoZSBmb3JlZ3JvdW5kIHN0YXRlIChgU1RBUlRFRGApLCBvcgotYFN1c3BlbmRgIHRvIGJlIHB1c2hlZCBmdXJ0aGVyIGluIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBgU1VTUEVOREVEYCBzdGF0ZS4KLQotSW4gdGhlIGBTVVNQRU5ERURgIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gaXMgZ2VuZXJhbGx5IG5vdCB2aXNpYmxlLiBJdCBzaG91bGQKLWltbWVkaWF0ZWx5IHJlbGVhc2UgYWxsIGdyYXBoaWNzIGFuZCB2aWRlbyByZXNvdXJjZXMsIGFuZCBzaHV0IGRvd24gYWxsCi1iYWNrZ3JvdW5kIGFjdGl2aXR5ICh0aW1lcnMsIHJlbmRlcmluZywgZXRjKS4gQWRkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24KLXNob3VsZCBmbHVzaCBzdG9yYWdlIHRvIGVuc3VyZSB0aGF0IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBraWxsZWQsIHRoZSBzdG9yYWdlCi13aWxsIGJlIHVwLXRvLWRhdGUuIFRoZSBhcHBsaWNhdGlvbiBtYXkgYmUga2lsbGVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3aWxsCi1pZGVhbGx5IHJlY2VpdmUgYSBgU3RvcGAgZXZlbnQgZm9yIGEgbW9yZSBncmFjZWZ1bCBzaHV0ZG93bi4KLQotTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gdHJhbnNpdGlvbiB0aHJvdWdoIGBQQVVTRURgIHRvCi1gU1VTUEVOREVEYCBiZWZvcmUgcmVjZWl2aW5nIGBTdG9wYCBvciBiZWluZyBraWxsZWQuCi0KICMjIEVudW1zICMjCiAKICMjIyBTYkV2ZW50VHlwZSAjIyMKQEAgLTQ2NSwxMCArMzkyLDEwIEBACiBtYXkgYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZCwgYnV0IGBjYWxsYmFja2AgaXMgYWx3YXlzIGNhbGxlZCBmcm9tIHRoZSBtYWluCiBTdGFyYm9hcmQgdGhyZWFkLCBxdWV1ZWQgd2l0aCBvdGhlciBwZW5kaW5nIGV2ZW50cy4KIAotYGNhbGxiYWNrYDogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gYGNvbnRleHRgOiBUaGUgY29udGV4dCB0aGF0IGlzCi1wYXNzZWQgdG8gdGhlIGBjYWxsYmFja2AgZnVuY3Rpb24uIGBkZWxheWA6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBtaWNyb3NlY29uZHMKLXRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlIGBjYWxsYmFja2AgZnVuY3Rpb24uIFNldCBgZGVsYXlgIHRvIGAwYCB0byBjYWxsIHRoZQotY2FsbGJhY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KK2BjYWxsYmFja2A6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIE11c3Qgbm90IGJlIE5VTEwuIGBjb250ZXh0YDogVGhlCitjb250ZXh0IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBgZGVsYXlgOiBUaGUgbWluaW11bSBudW1iZXIKK29mIG1pY3Jvc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBTZXQgYGRlbGF5YCB0bworYDBgIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGFzIHNvb24gYXMgcG9zc2libGUuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9pbWFnZS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2ltYWdlLm1kCmluZGV4IDMwNTA5NTMuLjE0MjdkMzkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2ltYWdlLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2ltYWdlLm1kCkBAIC0yNCw3ICsyNCw3IEBACiAgIHJldHVybjsKIH0KIAotU2JEZWNvZGVUYXJnZXQgcmVzdWx0X3RhcmdldCA9IFNiRGVjb2RlSW1hZ2UocHJvdmlkZXIsIGRhdGEsIGRhdGFfc2l6ZSwKK1NiRGVjb2RlVGFyZ2V0IHJlc3VsdF90YXJnZXQgPSBTYkltYWdlRGVjb2RlKHByb3ZpZGVyLCBkYXRhLCBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lX3R5cGUsIGZvcm1hdCk7CiBgYGAKIApAQCAtNDgsMTMgKzQ4LDEzIEBACiAgICAgY2FsbGVkLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgcHJvY2VlZCB0byBkZWNvZGluZyBob3dldmVyIGl0IGRlc2lyZXMuCiAKIDEuICBUaGUgcHJvdmlkZXIgaXMgbm90IHJlcXVpcmVkIGFuZCBpcyBub3QgcGFzc2VkIGluLiBUaGUgaW1wbGVtZW50YXRpb24gd2lsbAotICAgIHByb2NlZWQgZm9yd2FyZC4KLQotVGh1cywgaXQgaXMgTk9UIHNhZmUgZm9yIGNsaWVudHMgb2YgdGhpcyBBUEkgdG8gYXNzdW1lIHRoYXQgdGhlIGBwcm92aWRlcmAgaXQKLXBhc3NlcyBpbiB3aWxsIGJlIGNhbGxlZC4gRmluYWxseSwgaWYgdGhlIGRlY29kZSBzdWNjZWVkcywgYSBuZXcgU2JEZWNvZGVUYXJnZXQKLXdpbGwgYmUgYWxsb2NhdGVkLiBJZiBgbWltZV90eXBlYCBpbWFnZSBkZWNvZGluZyBmb3IgdGhlIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90Ci1zdXBwb3J0ZWQgb3IgdGhlIGRlY29kZSBmYWlscywga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCB3aWxsIGJlIHJldHVybmVkLCB3aXRoIGFueQotaW50ZXJtZWRpYXRlIGFsbG9jYXRpb25zIGJlaW5nIGNsZWFuZWQgdXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICAgIHByb2NlZWQgZm9yd2FyZC4gVGhlIGBkYXRhYCBwb2ludGVyIG11c3Qgbm90IGJlIE5VTEwuIFRoZSBgbWltZV90eXBlYCBzdHJpbmcKKyAgICBtdXN0IG5vdCBiZSBOVUxMLiBUaHVzLCBpdCBpcyBOT1Qgc2FmZSBmb3IgY2xpZW50cyBvZiB0aGlzIEFQSSB0byBhc3N1bWUKKyAgICB0aGF0IHRoZSBgcHJvdmlkZXJgIGl0IHBhc3NlcyBpbiB3aWxsIGJlIGNhbGxlZC4gRmluYWxseSwgaWYgdGhlIGRlY29kZQorICAgIHN1Y2NlZWRzLCBhIG5ldyBTYkRlY29kZVRhcmdldCB3aWxsIGJlIGFsbG9jYXRlZC4gSWYgYG1pbWVfdHlwZWAgaW1hZ2UKKyAgICBkZWNvZGluZyBmb3IgdGhlIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciB0aGUgZGVjb2RlIGZhaWxzLAorICAgIGtTYkRlY29kZVRhcmdldEludmFsaWQgd2lsbCBiZSByZXR1cm5lZCwgd2l0aCBhbnkgaW50ZXJtZWRpYXRlIGFsbG9jYXRpb25zCisgICAgYmVpbmcgY2xlYW5lZCB1cCBpbiB0aGUgaW1wbGVtZW50YXRpb24uCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC02NSw5ICs2NSwxMCBAQAogIyMjIFNiSW1hZ2VJc0RlY29kZVN1cHBvcnRlZCAjIyMKIAogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBkZWNvZGluZyBhbiBpbWFnZSBvZgotbWltZSB0eXBlIGBtaW1lX3R5cGVgIGludG8gU2JEZWNvZGVUYXJnZXRGb3JtYXQgYGZvcm1hdGAuIFRoZSByZXN1bHQgb2YgdGhpcwotZnVuY3Rpb24gbXVzdCBub3QgY2hhbmdlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcHJvZ3JhbSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUKLXJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FjaGVkIGluZGVmaW5pdGVseS4KK21pbWUgdHlwZSBgbWltZV90eXBlYCBpbnRvIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGBmb3JtYXRgLiBUaGUgYG1pbWVfdHlwZWAgbXVzdAorbm90IGJlIE5VTEwuIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjaGFuZ2Ugb3ZlciB0aGUgY291cnNlIG9mIHRoZQorcHJvZ3JhbSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWNoZWQKK2luZGVmaW5pdGVseS4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2xvZy5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L2xvZy5tZAppbmRleCA3ZWRmZTE5Li40MmRlNTEzIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9sb2cubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvbG9nLm1kCkBAIC0zMCwxMCArMzAsMTAgQEAKIGBwcmlvcml0eWA6IFRoZSBTYkxvZ1ByaW9yaXR5IGF0IHdoaWNoIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQuIE5vdGUgdGhhdAogcGFzc2luZyBga1NiTG9nUHJpb3JpdHlGYXRhbGAgZG9lcyBub3QgdGVybWluYXRlIHRoZSBwcm9ncmFtLiBTdWNoIGEgcG9saWN5IG11c3QKIGJlIGVuZm9yY2VkIGF0IHRoZSBhcHBsaWNhdGlvbiBsZXZlbC4gSW4gZmFjdCwgYHByaW9yaXR5YCBtYXkgYmUgY29tcGxldGVseQotaWdub3JlZCBvbiBtYW55IHBsYXRmb3Jtcy4gYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE5vIGZvcm1hdHRpbmcgaXMKLXJlcXVpcmVkIHRvIGJlIGRvbmUgb24gdGhlIHZhbHVlLCBpbmNsdWRpbmcgbmV3bGluZSB0ZXJtaW5hdGlvbi4gVGhhdCBzYWlkLAotcGxhdGZvcm1zIGNhbiBhZGp1c3QgdGhlIG1lc3NhZ2UgdG8gYmUgbW9yZSBzdWl0YWJsZSBmb3IgdGhlaXIgb3V0cHV0IG1ldGhvZCBieQotd3JhcHBpbmcgdGhlIHRleHQsIHN0cmlwcGluZyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCBldGMuCitpZ25vcmVkIG9uIG1hbnkgcGxhdGZvcm1zLiBgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gTXVzdCBub3QgYmUKK05VTEwuIE5vIGZvcm1hdHRpbmcgaXMgcmVxdWlyZWQgdG8gYmUgZG9uZSBvbiB0aGUgdmFsdWUsIGluY2x1ZGluZyBuZXdsaW5lCit0ZXJtaW5hdGlvbi4gVGhhdCBzYWlkLCBwbGF0Zm9ybXMgY2FuIGFkanVzdCB0aGUgbWVzc2FnZSB0byBiZSBtb3JlIHN1aXRhYmxlIGZvcgordGhlaXIgb3V0cHV0IG1ldGhvZCBieSB3cmFwcGluZyB0aGUgdGV4dCwgc3RyaXBwaW5nIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMsIGV0Yy4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTcwLDcgKzcwLDcgQEAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKLXZvaWQgc3RhdGljIHZvaWQgdm9pZCBTYkxvZ0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCit2b2lkIHN0YXRpYyB2b2lkIHN0YXRpYyB2b2lkIFNiTG9nRm9ybWF0Rihjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDEKIGBgYAogCiAjIyMgU2JMb2dJc1R0eSAjIyMKQEAgLTg5LDcgKzg5LDcgQEAKIGFuIGFzeW5jaHJvbm91cyBzaWduYWwgaGFuZGxlciAoZS5nLiBhIGBTSUdTRUdWYCBoYW5kbGVyKS4gSXQgc2hvdWxkIG5vdCBkbyBhbnkKIGFkZGl0aW9uYWwgZm9ybWF0dGluZy4KIAotYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuCitgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gTXVzdCBub3QgYmUgTlVMTC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTEzMiw1ICsxMzIsNSBAQAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYAotdm9pZCBzdGF0aWMgdm9pZCB2b2lkIFNiTG9nUmF3Rm9ybWF0Rihjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDEKK3ZvaWQgc3RhdGljIHZvaWQgc3RhdGljIHZvaWQgU2JMb2dSYXdGb3JtYXRGKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIFNCX1BSSU5URl9GT1JNQVQoMQogYGBgCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9wbGF5ZXIubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9wbGF5ZXIubWQKaW5kZXggN2FjYjlhZS4uM2ZkOTU1ZCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvcGxheWVyLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L3BsYXllci5tZApAQCAtMjMxLDcgKzIzMSw3IEBACiAKICMjIyBTYlBsYXllclNhbXBsZUluZm8gIyMjCiAKLUluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlMi4KK0luZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlcygpLgogCiAjIyMjIE1lbWJlcnMgIyMjIwogCkBAIC0yOTcsNyArMjk3LDcgQEAKIAogKiAgIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHBhc3MgYHBsYXllcmAgaW50byBhbnkgb3RoZXIgYFNiUGxheWVyYCBmdW5jdGlvbiBvbmNlCiAgICAgU2JQbGF5ZXJEZXN0cm95IGhhcyBiZWVuIGNhbGxlZCBvbiB0aGF0IHBsYXllci4gYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8gYmUKLSAgICBkZXN0cm95ZWQuCisgICAgZGVzdHJveWVkLiBNdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMTUsMjYgKzMxNSwxNCBAQAogd2l0aCBhbiBvdXRwdXQgbW9kZSBvdGhlciB0aGFuIGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsCiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkIGlzIHJldHVybmVkLgogCitgcGxheWVyYCBtdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCisKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKIFNiRGVjb2RlVGFyZ2V0IFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKFNiUGxheWVyIHBsYXllcikKIGBgYAogCi0jIyMgU2JQbGF5ZXJHZXRJbmZvMiAjIyMKLQotR2V0cyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHBsYXllciBzdGF0ZSBhbmQgd3JpdGVzIGl0IHRvIGBvdXRfcGxheWVyX2luZm9gLgotVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHZlcnkgZnJlcXVlbnRseSBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgaW5leHBlbnNpdmUuCi0KLWBwbGF5ZXJgOiBUaGUgcGxheWVyIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIGJlaW5nIHJldHJpZXZlZC4KLWBvdXRfcGxheWVyX2luZm9gOiBUaGUgaW5mb3JtYXRpb24gcmV0cmlldmVkIGZvciB0aGUgcGxheWVyLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkIFNiUGxheWVyR2V0SW5mbzIoU2JQbGF5ZXIgcGxheWVyLCBTYlBsYXllckluZm8yICpvdXRfcGxheWVyX2luZm8yKQotYGBgCi0KICMjIyBTYlBsYXllckdldE1heGltdW1OdW1iZXJPZlNhbXBsZXNQZXJXcml0ZSAjIyMKIAogV3JpdGVzIGEgc2luZ2xlIHNhbXBsZSBvZiB0aGUgZ2l2ZW4gbWVkaWEgdHlwZSB0byBgcGxheWVyYCdzIGlucHV0IHN0cmVhbS4gSXRzCkBAIC0zNzEsNyArMzU5LDcgQEAKIHRoZSBjYWxsLiBOb3RlIHRoYXQgaXQgaXMgbm90IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGlzIGZ1bmN0aW9uIHRvIHZlcmlmeQogd2hldGhlciB0aGUgdmlkZW8gZGVzY3JpYmVkIGJ5IGBjcmVhdGlvbl9wYXJhbWAgY2FuIGJlIHBsYXllZCBvbiB0aGUgcGxhdGZvcm0sCiBhbmQgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB0cnkgaXRzIGJlc3QgZWZmb3J0IHRvIHJldHVybiBhIHZhbGlkIG91dHB1dCBtb2RlLgotYGNyZWF0aW9uX3BhcmFtYCB3aWxsIG5ldmVyIGJlIE5VTEwuCitgY3JlYXRpb25fcGFyYW1gIG11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC00MDMsMTIgKzM5MSwxMiBAQAogaW1wbGVtZW50b3JzIHNob3VsZCB0YWtlIGNhcmUgdG8gYXZvaWQgcmVsYXRlZCBwZXJmb3JtYW5jZSBjb25jZXJucyB3aXRoIHN1Y2gKIGZyZXF1ZW50IGNhbGxzLgogCi1gcGxheWVyYDogVGhlIHBsYXllciB0aGF0IGlzIGJlaW5nIHJlc2l6ZWQuIGB6X2luZGV4YDogVGhlIHotaW5kZXggb2YgdGhlCi1wbGF5ZXIuIFdoZW4gdGhlIGJvdW5kcyBvZiBtdWx0aXBsZSBwbGF5ZXJzIGFyZSBvdmVybGFwcGVkLCB0aGUgb25lIHdpdGggbGFyZ2VyCi16LWluZGV4IHdpbGwgYmUgcmVuZGVyZWQgb24gdG9wIG9mIHRoZSBvbmVzIHdpdGggc21hbGxlciB6LWluZGV4LiBgeGA6IFRoZQoteC1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLiBgeWA6IFRoZSB5LWNvb3JkaW5hdGUgb2YKLXRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLiBgd2lkdGhgOiBUaGUgd2lkdGggb2YgdGhlIHBsYXllciwgaW4KLXBpeGVscy4gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIHBsYXllciwgaW4gcGl4ZWxzLgorYHBsYXllcmA6IFRoZSBwbGF5ZXIgdGhhdCBpcyBiZWluZyByZXNpemVkLiBNdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCitgel9pbmRleGA6IFRoZSB6LWluZGV4IG9mIHRoZSBwbGF5ZXIuIFdoZW4gdGhlIGJvdW5kcyBvZiBtdWx0aXBsZSBwbGF5ZXJzIGFyZQorb3ZlcmxhcHBlZCwgdGhlIG9uZSB3aXRoIGxhcmdlciB6LWluZGV4IHdpbGwgYmUgcmVuZGVyZWQgb24gdG9wIG9mIHRoZSBvbmVzIHdpdGgKK3NtYWxsZXIgei1pbmRleC4gYHhgOiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLgorYHlgOiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGxheWVyLiBgd2lkdGhgOiBUaGUgd2lkdGgKK29mIHRoZSBwbGF5ZXIsIGluIHBpeGVscy4gYGhlaWdodGA6IFRoZSBoZWlnaHQgb2YgdGhlIHBsYXllciwgaW4gcGl4ZWxzLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDI5LDYgKzQxNyw4IEBACiB1bmNoYW5nZWQsIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGBwbGF5YmFja19yYXRlYCBpcyBuZWdhdGl2ZSBvciBpZiBpdCBpcyB0b28gaGlnaAogdG8gc3VwcG9ydC4KIAorYHBsYXllcmAgbXVzdCBub3QgYmUgYGtTYlBsYXllckludmFsaWRgLgorCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCkBAIC00MzksMTAgKzQyOSwxMCBAQAogCiBTZXRzIHRoZSBwbGF5ZXIncyB2b2x1bWUuCiAKLWBwbGF5ZXJgOiBUaGUgcGxheWVyIGluIHdoaWNoIHRoZSB2b2x1bWUgaXMgYmVpbmcgYWRqdXN0ZWQuIGB2b2x1bWVgOiBUaGUgbmV3Ci1wbGF5ZXIgdm9sdW1lLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYCwgaW5jbHVzaXZlLiBBIHZhbHVlIG9mCi1gMC4wYCBtZWFucyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUgbXV0ZWQsIGFuZCBhIHZhbHVlIG9mIGAxLjBgIG1lYW5zIHRoYXQgaXQKLXNob3VsZCBiZSBwbGF5ZWQgYXQgZnVsbCB2b2x1bWUuCitgcGxheWVyYDogVGhlIHBsYXllciBpbiB3aGljaCB0aGUgdm9sdW1lIGlzIGJlaW5nIGFkanVzdGVkLiBNdXN0IG5vdCBiZQorYGtTYlBsYXllckludmFsaWRgLiBgdm9sdW1lYDogVGhlIG5ldyBwbGF5ZXIgdm9sdW1lLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuCitgMC4wYCBhbmQgYDEuMGAsIGluY2x1c2l2ZS4gQSB2YWx1ZSBvZiBgMC4wYCBtZWFucyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUKK211dGVkLCBhbmQgYSB2YWx1ZSBvZiBgMS4wYCBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBwbGF5ZWQgYXQgZnVsbCB2b2x1bWUuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC00NjgsMjQgKzQ1OCwxNCBAQAogCiAjIyMgU2JQbGF5ZXJXcml0ZVNhbXBsZTIgIyMjCiAKLVdyaXRlcyBzYW1wbGVzIG9mIHRoZSBnaXZlbiBtZWRpYSB0eXBlIHRvIGBwbGF5ZXJgJ3MgaW5wdXQgc3RyZWFtLiBUaGUgbGlmZXRpbWUKLW9mIGBzYW1wbGVfaW5mb3NgLCBhbmQgdGhlIG1lbWJlcnMgb2YgaXRzIGVsZW1lbnRzIGxpa2UgYGJ1ZmZlcmAsCi1gdmlkZW9fc2FtcGxlX2luZm9gLCBhbmQgYGRybV9pbmZvYCAoYXMgd2VsbCBhcyBtZW1iZXIgYHN1YnNhbXBsZV9tYXBwaW5nYAotY29udGFpbmVkIGluc2lkZSBpdCkgYXJlIG5vdCBndWFyYW50ZWVkIHBhc3QgdGhlIGNhbGwgdG8gU2JQbGF5ZXJXcml0ZVNhbXBsZTIuCi1UaGF0IG1lYW5zIHRoYXQgYmVmb3JlIHJldHVybmluZywgdGhlIGltcGxlbWVudGF0aW9uIG11c3Qgc3luY2hyb25vdXNseSBjb3B5IGFueQotaW5mb3JtYXRpb24gaXQgd2FudHMgdG8gcmV0YWluIGZyb20gdGhvc2Ugc3RydWN0dXJlcy4KLQotU2JQbGF5ZXJXcml0ZVNhbXBsZTIgYWxsb3dzIHdyaXRpbmcgb2YgbXVsdGlwbGUgc2FtcGxlcyBpbiBvbmUgY2FsbC4KLQotYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8gd2hpY2ggdGhlIHNhbXBsZSBpcyB3cml0dGVuLiBgc2FtcGxlX3R5cGVgOiBUaGUgdHlwZSBvZgotc2FtcGxlIGJlaW5nIHdyaXR0ZW4uIFNlZSB0aGUgYFNiTWVkaWFUeXBlYCBlbnVtIGluIG1lZGlhLmguIGBzYW1wbGVfaW5mb3NgOiBBCi1wb2ludGVyIHRvIGFuIGFycmF5IG9mIFNiUGxheWVyU2FtcGxlSW5mbyB3aXRoIGBudW1iZXJfb2Zfc2FtcGxlX2luZm9zYAotZWxlbWVudHMsIGVhY2ggaG9sZHMgdGhlIGRhdGEgZm9yIGFuIHNhbXBsZSwgaS5lLiBhIHNlcXVlbmNlIG9mIHdob2xlIE5BTCBVbml0cwotZm9yIHZpZGVvLCBvciBhIGNvbXBsZXRlIGF1ZGlvIGZyYW1lLiBgc2FtcGxlX2luZm9zYCBjYW5ub3QgYmUgYXNzdW1lZCB0byBsaXZlCi1wYXN0IHRoZSBjYWxsIGludG8gU2JQbGF5ZXJXcml0ZVNhbXBsZTIoKSwgc28gaXQgbXVzdCBiZSBjb3BpZWQgaWYgaXRzIGNvbnRlbnQKLXdpbGwgYmUgdXNlZCBhZnRlciBTYlBsYXllcldyaXRlU2FtcGxlMigpIHJldHVybnMuIGBudW1iZXJfb2Zfc2FtcGxlX2luZm9zYDoKLVNwZWNpZnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIGNvbnRhaW5lZCBpbnNpZGUgYHNhbXBsZV9pbmZvc2AuIEl0IGhhcyB0byBiZSBhdAotbGVhc3Qgb25lLCBhbmQgbGVzcyB0aGFuIHRoZSByZXR1cm4gdmFsdWUgb2YKK2BzYW1wbGVfdHlwZWA6IFRoZSB0eXBlIG9mIHNhbXBsZSBiZWluZyB3cml0dGVuLiBTZWUgdGhlIGBTYk1lZGlhVHlwZWAgZW51bSBpbgorbWVkaWEuaC4gYHNhbXBsZV9pbmZvc2A6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBTYlBsYXllclNhbXBsZUluZm8gd2l0aAorYG51bWJlcl9vZl9zYW1wbGVfaW5mb3NgIGVsZW1lbnRzLCBlYWNoIGhvbGRzIHRoZSBkYXRhIGZvciBhbiBzYW1wbGUsIGkuZS4gYQorc2VxdWVuY2Ugb2Ygd2hvbGUgTkFMIFVuaXRzIGZvciB2aWRlbywgb3IgYSBjb21wbGV0ZSBhdWRpbyBmcmFtZS4gYHNhbXBsZV9pbmZvc2AKK2Nhbm5vdCBiZSBhc3N1bWVkIHRvIGxpdmUgcGFzdCB0aGUgY2FsbCBpbnRvIFNiUGxheWVyV3JpdGVTYW1wbGVzKCksIHNvIGl0IG11c3QKK2JlIGNvcGllZCBpZiBpdHMgY29udGVudCB3aWxsIGJlIHVzZWQgYWZ0ZXIgU2JQbGF5ZXJXcml0ZVNhbXBsZXMoKSByZXR1cm5zLgorYG51bWJlcl9vZl9zYW1wbGVfaW5mb3NgOiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBjb250YWluZWQgaW5zaWRlCitgc2FtcGxlX2luZm9zYC4gSXQgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGxlc3MgdGhhbiB0aGUgcmV0dXJuIHZhbHVlIG9mCiBTYlBsYXllckdldE1heGltdW1OdW1iZXJPZlNhbXBsZXNQZXJXcml0ZSgpLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L3NvY2tldC5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L3NvY2tldC5tZAppbmRleCBkMzBiYzIyLi45ZTBmODFiIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9zb2NrZXQubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvc29ja2V0Lm1kCkBAIC00MTcsOCArNDE3LDggQEAKIHRoZSBhZGRyZXNzIGlzIHVubmVjZXNzYXJ5LCBidXQgYWxsb3dlZC4KIAogYHNvY2tldGA6IFRoZSBTYlNvY2tldCBmcm9tIHdoaWNoIGRhdGEgaXMgcmVhZC4gYG91dF9kYXRhYDogVGhlIGRhdGEgcmVhZCBmcm9tCi10aGUgc29ja2V0LiBgZGF0YV9zaXplYDogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLiBgb3V0X3NvdXJjZWA6IFRoZSBzb3VyY2UKLWFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KK3RoZSBzb2NrZXQuIE11c3Qgbm90IGJlIE5VTEwuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCitgb3V0X3NvdXJjZWA6IFRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDU2LDEwICs0NTYsMTAgQEAKIFNiU29ja2V0R2V0TGFzdEVycm9yIHJldHVybnMgYGtTYlNvY2tldFBlbmRpbmdgIHRvIG1ha2UgaXQgYSBiZXN0LWVmZm9ydCB3cml0ZQogKGJ1dCBzdGlsbCBvbmx5IHVwIHRvIG5vdCBibG9ja2luZywgdW5sZXNzIHlvdSB3YW50IHRvIHNwaW4pLgogCi1gc29ja2V0YDogVGhlIFNiU29ja2V0IHRvIHVzZSB0byB3cml0ZSBkYXRhLiBgZGF0YWA6IFRoZSBkYXRhIHJlYWQgZnJvbSB0aGUKLXNvY2tldC4gYGRhdGFfc2l6ZWA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgYGRhdGFgIHRvIHdyaXRlLiBgZGVzdGluYXRpb25gOiBUaGUKLWxvY2F0aW9uIHRvIHdoaWNoIGRhdGEgaXMgd3JpdHRlbi4gVGhpcyB2YWx1ZSBtdXN0IGJlIGBOVUxMYCBmb3IgVENQCi1jb25uZWN0aW9ucywgd2hpY2ggY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBlbmRwb2ludC4KK2Bzb2NrZXRgOiBUaGUgU2JTb2NrZXQgdG8gdXNlIHRvIHdyaXRlIGRhdGEuIGBkYXRhYDogVGhlIGRhdGEgd3JpdHRlbiB0byB0aGUKK3NvY2tldC4gTXVzdCBub3QgYmUgTlVMTC4gYGRhdGFfc2l6ZWA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgYGRhdGFgIHRvIHdyaXRlLgorYGRlc3RpbmF0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIGRhdGEgaXMgd3JpdHRlbi4gVGhpcyB2YWx1ZSBtdXN0IGJlIGBOVUxMYAorZm9yIFRDUCBjb25uZWN0aW9ucywgd2hpY2ggY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBlbmRwb2ludC4KIAogVGhlIHByaW1hcnkgdXNlIG9mIGBkZXN0aW5hdGlvbmAgaXMgdG8gc2VuZCBkYXRhZ3JhbSBwYWNrZXRzLCB3aGljaCBjYW4gZ28gb3V0CiB0byBtdWx0aXBsZSBzb3VyY2VzIGZyb20gYSBzaW5nbGUgVURQIHNlcnZlciBzb2NrZXQuIFRDUCBoYXMgdHdvIGVuZHBvaW50cwpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvc3lzdGVtLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvc3lzdGVtLm1kCmluZGV4IGI0ODAwYTYuLjVlNGUwNzYgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L3N5c3RlbS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC9zeXN0ZW0ubWQKQEAgLTk4LDkgKzk4LDEwIEBACiAgICAgRnVsbCBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIGZpbGUuCiAqICAgYGtTYlN5c3RlbVBhdGhTdG9yYWdlRGlyZWN0b3J5YAogCi0gICAgUGF0aCB0byBhIGRpcmVjdG9yeSBmb3IgcGVybWFuZW50IGZpbGUgc3RvcmFnZS4gQm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MKLSAgICBpcyByZXF1aXJlZC4gVGhpcyBpcyB3aGVyZSBhbiBhcHAgbWF5IHN0b3JlIGl0cyBwZXJzaXN0ZW50IHNldHRpbmdzLiBUaGUKLSAgICBsb2NhdGlvbiBzaG91bGQgYmUgdXNlciBhZ25vc3RpYyBpZiBwb3NzaWJsZS4KKyAgICBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgZGVkaWNhdGVkIGZvciBFdmVyZ3JlZW4gRnVsbCBwZXJtYW5lbnQgZmlsZSBzdG9yYWdlLgorICAgIEJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzIGlzIHJlcXVpcmVkLiBUaGUgZGlyZWN0b3J5IHNob3VsZCBiZSB1c2VkIG9ubHkKKyAgICBmb3Igc3RvcmluZyB0aGUgdXBkYXRlcy4gU2VlCisgICAgc3RhcmJvYXJkL2RvYy9ldmVyZ3JlZW4vY29iYWx0X2V2ZXJncmVlbl9vdmVydmlldy5tZAogCiAjIyMgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2UgIyMjCiAKQEAgLTI4NCw3ICsyODUsOCBAQAogIyMjIFNiU3lzdGVtR2V0RXh0ZW5zaW9uICMjIwogCiBSZXR1cm5zIHBvaW50ZXIgdG8gYSBjb25zdGFudCBnbG9iYWwgc3RydWN0IGltcGxlbWVudGluZyB0aGUgZXh0ZW5zaW9uIG5hbWVkCi1gbmFtZWAsIGlmIGl0IGlzIGltcGxlbWVudGVkLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCitgbmFtZWAsIGlmIGl0IGlzIGltcGxlbWVudGVkLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuIFRoZSBgbmFtZWAgc3RyaW5nIG11c3Qgbm90CitiZSBOVUxMLgogCiBFeHRlbnNpb25zIGFyZSB1c2VkIHRvIGltcGxlbWVudCBiZWhhdmlvciB3aGljaCBpcyBzcGVjaWZpYyB0byB0aGUgY29tYmluYXRpb24KIG9mIGFwcGxpY2F0aW9uICYgcGxhdGZvcm0uIEFuIGV4dGVuc2lvbiByZWxpZXMgb24gYSBoZWFkZXIgZmlsZSBpbiB0aGUKQEAgLTY2Nyw3ICs2NjksNyBAQAogIyMjIFNiU3lzdGVtU2lnbldpdGhDZXJ0aWZpY2F0aW9uU2VjcmV0S2V5ICMjIwogCiBDb21wdXRlcyBhIEhNQUMtU0hBMjU2IGRpZ2VzdCBvZiBgbWVzc2FnZWAgaW50byBgZGlnZXN0YCB1c2luZyB0aGUgYXBwbGljYXRpb24ncwotY2VydGlmaWNhdGlvbiBzZWNyZXQuCitjZXJ0aWZpY2F0aW9uIHNlY3JldC4gVGhlIGBtZXNzYWdlYCBhbmQgdGhlIGBkaWdlc3RgIHBvaW50ZXJzIG11c3Qgbm90IGJlIE5VTEwuCiAKIFRoZSBvdXRwdXQgd2lsbCBiZSB3cml0dGVuIGludG8gYGRpZ2VzdGAuIGBkaWdlc3Rfc2l6ZV9pbl9ieXRlc2AgbXVzdCBiZSAzMiAob3IKIGdyZWF0ZXIpLCBzaW5jZSAzMi1ieXRlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byBpdC4gUmV0dXJucyBmYWxzZSBpbiB0aGUgY2FzZSBvZgpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvdWlfbmF2aWdhdGlvbi5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE0L3VpX25hdmlnYXRpb24ubWQKaW5kZXggZDg2OGM2NC4uYTBlY2ZiMSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTQvdWlfbmF2aWdhdGlvbi5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNC91aV9uYXZpZ2F0aW9uLm1kCkBAIC0xMDEsOCArMTAxLDEwIEBACiAgICAgVGhpcyBpcyB1c2VkIHRvIG1hbnVhbGx5IGZvcmNlIGZvY3VzIG9uIGEgbmF2aWdhdGlvbiBpdGVtIG9mIHR5cGUKICAgICBrU2JVaU5hdkl0ZW1UeXBlRm9jdXMuIEFueSBwcmV2aW91c2x5IGZvY3VzZWQgbmF2aWdhdGlvbiBpdGVtIHNob3VsZCByZWNlaXZlCiAgICAgdGhlIGJsdXIgZXZlbnQuIElmIHRoZSBpdGVtIGlzIG5vdCB0cmFuc2l0aXZlbHkgYSBjb250ZW50IG9mIHRoZSByb290IGl0ZW0sCi0gICAgdGhlbiB0aGlzIGRvZXMgbm90aGluZy4gU3BlY2lmeWluZyBrU2JVaU5hdkl0ZW1JbnZhbGlkIHNob3VsZCByZW1vdmUgZm9jdXMKLSAgICBmcm9tIHRoZSBVSSBuYXZpZ2F0aW9uIHN5c3RlbS4KKyAgICB0aGVuIHRoaXMgZG9lcyBub3RoaW5nLgorCisgICAgU3BlY2lmeWluZyBrU2JVaU5hdkl0ZW1JbnZhbGlkIHNob3VsZCByZW1vdmUgZm9jdXMgZnJvbSB0aGUgVUkgbmF2aWdhdGlvbgorICAgIHN5c3RlbS4KICogICBgdm9pZCgqc2V0X2l0ZW1fZW5hYmxlZCkoU2JVaU5hdkl0ZW0gaXRlbSwgYm9vbCBlbmFibGVkKWAKIAogICAgIFRoaXMgaXMgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZApAQCAtMTE2LDcgKzExOCw5IEBACiAKICAgICBUaGlzIHNwZWNpZmllcyBkaXJlY3Rpb25hbGl0eSBmb3IgY29udGFpbmVyIGl0ZW1zLiBDb250YWluZXJzIHdpdGhpbgogICAgIGNvbnRhaW5lcnMgZG8gbm90IGluaGVyaXQgZGlyZWN0aW9uYWxpdHkuIERpcmVjdGlvbmFsaXR5IG11c3QgYmUgc3BlY2lmaWVkCi0gICAgZm9yIGVhY2ggY29udGFpbmVyIGV4cGxpY2l0bHkuIFRoaXMgc2hvdWxkIHdvcmsgZXZlbiBpZiBgaXRlbWAgaXMgZGlzYWJsZWQuCisgICAgZm9yIGVhY2ggY29udGFpbmVyIGV4cGxpY2l0bHkuCisKKyAgICBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYgYGl0ZW1gIGlzIGRpc2FibGVkLgogKiAgIGB2b2lkKCpzZXRfaXRlbV9mb2N1c19kdXJhdGlvbikoU2JVaU5hdkl0ZW0gaXRlbSwgZmxvYXQgc2Vjb25kcylgCiAKICAgICBTZXQgdGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhlIGZvY3VzIGl0ZW0gc2hvdWxkIHJlbWFpbiBmb2N1c2VkIG9uY2UgaXQKQEAgLTE1OCwxMyArMTYyLDE2IEBACiAKICAgICBUaGlzIGF0dGFjaGVzIHRoZSBnaXZlbiBuYXZpZ2F0aW9uIGl0ZW0gKHdoaWNoIG11c3QgYmUgYSBjb250YWluZXIpIHRvIHRoZQogICAgIHNwZWNpZmllZCB3aW5kb3cuIE5hdmlnYXRpb24gaXRlbXMgYXJlIG9ubHkgaW50ZXJhY3RhYmxlIGlmIHRoZXkgYXJlCi0gICAgdHJhbnNpdGl2ZWx5IGF0dGFjaGVkIHRvIGEgd2luZG93LlRoZSBuYXRpdmUgVUkgZW5naW5lIHNob3VsZCBuZXZlciBjaGFuZ2UKLSAgICB0aGlzIG5hdmlnYXRpb24gaXRlbSdzIGNvbnRlbnQgb2Zmc2V0LiBJdCBpcyBhc3N1bWVkIHRvIGJlIHVzZWQgYXMgYSBwcm94eQotICAgIGZvciB0aGUgc3lzdGVtIHdpbmRvdy5BIG5hdmlnYXRpb24gaXRlbSBtYXkgb25seSBoYXZlIGEgU2JVaU5hdkl0ZW0gb3IKLSAgICBTYldpbmRvdyBhcyBpdHMgZGlyZWN0IGNvbnRhaW5lci4gVGhlIG5hdmlnYXRpb24gaXRlbSBoaWVyYXJjaHkgaXMKLSAgICBlc3RhYmxpc2hlZCB1c2luZyBzZXRfaXRlbV9jb250YWluZXJfaXRlbSgpIHdpdGggdGhlIHJvb3QgY29udGFpbmVyIGF0dGFjaGVkCi0gICAgdG8gYSBTYldpbmRvdyB1c2luZyBzZXRfaXRlbV9jb250YWluZXJfd2luZG93KCkgdG8gZW5hYmxlIGludGVyYWN0aW9uIHdpdGgKLSAgICBhbGwgZW5hYmxlZCBpdGVtcyBpbiB0aGUgaGllcmFyY2h5LgorICAgIHRyYW5zaXRpdmVseSBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKworICAgIFRoZSBuYXRpdmUgVUkgZW5naW5lIHNob3VsZCBuZXZlciBjaGFuZ2UgdGhpcyBuYXZpZ2F0aW9uIGl0ZW0ncyBjb250ZW50CisgICAgb2Zmc2V0LiBJdCBpcyBhc3N1bWVkIHRvIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIHN5c3RlbSB3aW5kb3cuCisKKyAgICBBIG5hdmlnYXRpb24gaXRlbSBtYXkgb25seSBoYXZlIGEgU2JVaU5hdkl0ZW0gb3IgU2JXaW5kb3cgYXMgaXRzIGRpcmVjdAorICAgIGNvbnRhaW5lci4gVGhlIG5hdmlnYXRpb24gaXRlbSBoaWVyYXJjaHkgaXMgZXN0YWJsaXNoZWQgdXNpbmcKKyAgICBzZXRfaXRlbV9jb250YWluZXJfaXRlbSgpIHdpdGggdGhlIHJvb3QgY29udGFpbmVyIGF0dGFjaGVkIHRvIGEgU2JXaW5kb3cKKyAgICB1c2luZyBzZXRfaXRlbV9jb250YWluZXJfd2luZG93KCkgdG8gZW5hYmxlIGludGVyYWN0aW9uIHdpdGggYWxsIGVuYWJsZWQKKyAgICBpdGVtcyBpbiB0aGUgaGllcmFyY2h5LgogCiAgICAgSWYgYGl0ZW1gIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIGEgZGlmZmVyZW50IHdpbmRvdywgdGhlbiB0aGlzIHdpbGwKICAgICB1bnJlZ2lzdGVyIGl0IGZyb20gdGhhdCB3aW5kb3cgdGhlbiBhdHRhY2ggaXQgdG8gdGhlIGdpdmVuIGB3aW5kb3dgLiBJdCBpcwpAQCAtMTk1LDEzICsyMDIsMTQgQEAKICAgICBkcmF3biBhdCBwb3NpdGlvbiAoNSwxNSkuCiAKICAgICBFc3NlbnRpYWxseSwgY29udGVudCBpdGVtcyBzaG91bGQgYmUgZHJhd24gYXQ6IFtjb250YWluZXIgcG9zaXRpb25dICsKLSAgICBbY29udGVudCBwb3NpdGlvbl0gLSBbY29udGFpbmVyIGNvbnRlbnQgb2Zmc2V0XSBDb250ZW50IGl0ZW1zIG1heSBvdmVybGFwCi0gICAgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIGNhbiBjYXVzZSBvYnNjdXJlZCBpdGVtcyB0byBiZSB1bmZvY3VzYWJsZS4gVGhlCi0gICAgb25seSBydWxlIHRoYXQgbmVlZHMgdG8gYmUgZm9sbG93ZWQgaXMgdGhhdCBjb250ZW50cyB3aGljaCBhcmUgZm9jdXMgaXRlbXMKLSAgICBjYW4gb2JzY3VyZSBvdGhlciBjb250ZW50cyB3aGljaCBhcmUgY29udGFpbmVycywgYnV0IG5vdCB2aWNlIHZlcnNhLiBUaGUKLSAgICBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBjb250ZW50IGZvY3VzIGl0ZW1zIGRvIG5vdCBvdmVybGFwIG90aGVyIGNvbnRlbnQKLSAgICBmb2N1cyBpdGVtcyBhbmQgY29udGVudCBjb250YWluZXIgaXRlbXMgZG8gbm90IG92ZXJsYXAgb3RoZXIgY29udGVudAotICAgIGNvbnRhaW5lciBpdGVtcy4KKyAgICBbY29udGVudCBwb3NpdGlvbl0gLSBbY29udGFpbmVyIGNvbnRlbnQgb2Zmc2V0XQorCisgICAgQ29udGVudCBpdGVtcyBtYXkgb3ZlcmxhcCB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgY2FuIGNhdXNlIG9ic2N1cmVkIGl0ZW1zCisgICAgdG8gYmUgdW5mb2N1c2FibGUuIFRoZSBvbmx5IHJ1bGUgdGhhdCBuZWVkcyB0byBiZSBmb2xsb3dlZCBpcyB0aGF0IGNvbnRlbnRzCisgICAgd2hpY2ggYXJlIGZvY3VzIGl0ZW1zIGNhbiBvYnNjdXJlIG90aGVyIGNvbnRlbnRzIHdoaWNoIGFyZSBjb250YWluZXJzLCBidXQKKyAgICBub3QgdmljZSB2ZXJzYS4gVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IGNvbnRlbnQgZm9jdXMgaXRlbXMgZG8gbm90CisgICAgb3ZlcmxhcCBvdGhlciBjb250ZW50IGZvY3VzIGl0ZW1zIGFuZCBjb250ZW50IGNvbnRhaW5lciBpdGVtcyBkbyBub3Qgb3ZlcmxhcAorICAgIG90aGVyIGNvbnRlbnQgY29udGFpbmVyIGl0ZW1zLgogKiAgIGB2b2lkKCpzZXRfaXRlbV9jb250ZW50X29mZnNldCkoU2JVaU5hdkl0ZW0gaXRlbSwgZmxvYXQgY29udGVudF9vZmZzZXRfeCwKICAgICBmbG9hdCBjb250ZW50X29mZnNldF95KWAKIApAQCAtMjExLDE3ICsyMTksMTkgQEAKICAgICBFc3NlbnRpYWxseSwgYSBjb250ZW50IGl0ZW0gc2hvdWxkIGJlIGRyYXduIGF0OiBbY29udGFpbmVyIHBvc2l0aW9uXSArCiAgICAgW2NvbnRlbnQgcG9zaXRpb25dIC0gW2NvbnRhaW5lciBjb250ZW50IG9mZnNldF0gSWYgYGl0ZW1gIGlzIG5vdCBhCiAgICAgY29udGFpbmVyLCB0aGVuIHRoaXMgZG9lcyBub3RoaW5nLiBCeSBkZWZhdWx0LCB0aGUgY29udGVudCBvZmZzZXQgaXMgKDAsMCkuCisKICAgICBUaGlzIHNob3VsZCB1cGRhdGUgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXRfaXRlbV9jb250ZW50X29mZnNldCgpIGV2ZW4gaWYKICAgICB0aGUgYGl0ZW1gIGlzIGRpc2FibGVkLgogKiAgIGB2b2lkKCpnZXRfaXRlbV9jb250ZW50X29mZnNldCkoU2JVaU5hdkl0ZW0gaXRlbSwgZmxvYXQKICAgICAqb3V0X2NvbnRlbnRfb2Zmc2V0X3gsIGZsb2F0ICpvdXRfY29udGVudF9vZmZzZXRfeSlgCiAKICAgICBSZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZW50IG9mZnNldCBmb3IgdGhlIG5hdmlnYXRpb24gaXRlbS4gSWYgYGl0ZW1gIGlzCi0gICAgbm90IGEgY29udGFpbmVyLCB0aGVuIHRoZSBjb250ZW50IG9mZnNldCBpcyAoMCwwKS4gVGhlIG5hdGl2ZSBVSSBlbmdpbmUKLSAgICBzaG91bGQgbm90IGNoYW5nZSB0aGUgY29udGVudCBvZmZzZXQgb2YgYSBjb250YWluZXIgdW5sZXNzIG9uZSBvZiBpdHMKLSAgICBjb250ZW50cyAocG9zc2libHkgcmVjdXJzaXZlbHkpIGlzIGZvY3VzZWQuIFRoaXMgaXMgdG8gYWxsb3cgc2VhbWxlc3NseQotICAgIGRpc2FibGluZyB0aGVuIHJlLWVuYWJsaW5nIGZvY3VzIGl0ZW1zIHdpdGhvdXQgaGF2aW5nIHRoZWlyIGNvbnRhaW5lcnMKLSAgICBjaGFuZ2Ugb2Zmc2V0cy4KKyAgICBub3QgYSBjb250YWluZXIsIHRoZW4gdGhlIGNvbnRlbnQgb2Zmc2V0IGlzICgwLDApLgorCisgICAgVGhlIG5hdGl2ZSBVSSBlbmdpbmUgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGNvbnRlbnQgb2Zmc2V0IG9mIGEgY29udGFpbmVyCisgICAgdW5sZXNzIG9uZSBvZiBpdHMgY29udGVudHMgKHBvc3NpYmx5IHJlY3Vyc2l2ZWx5KSBpcyBmb2N1c2VkLiBUaGlzIGlzIHRvCisgICAgYWxsb3cgc2VhbWxlc3NseSBkaXNhYmxpbmcgdGhlbiByZS1lbmFibGluZyBmb2N1cyBpdGVtcyB3aXRob3V0IGhhdmluZyB0aGVpcgorICAgIGNvbnRhaW5lcnMgY2hhbmdlIG9mZnNldHMuCiAqICAgYHZvaWQoKmRvX2JhdGNoX3VwZGF0ZSkodm9pZCgqdXBkYXRlX2Z1bmN0aW9uKSh2b2lkICopLCB2b2lkICpjb250ZXh0KWAKIAogICAgIENhbGwgYHVwZGF0ZV9mdW5jdGlvbmAgd2l0aCBgY29udGV4dGAgdG8gcGVyZm9ybSBhIHNlcmllcyBvZiBVSSBuYXZpZ2F0aW9uCkBAIC0yOTIsNyArMzAyLDggQEAKIAogUmV0cmlldmUgdGhlIHBsYXRmb3JtJ3MgVUkgbmF2aWdhdGlvbiBpbXBsZW1lbnRhdGlvbi4gSWYgdGhlIHBsYXRmb3JtIGRvZXMgbm90CiBwcm92aWRlIG9uZSwgdGhlbiByZXR1cm4gZmFsc2Ugd2l0aG91dCBtb2RpZnlpbmcgYG91dF9pbnRlcmZhY2VgLiBPdGhlcndpc2UsCi1pbml0aWFsaXplIGFsbCBtZW1iZXJzIG9mIGBvdXRfaW50ZXJmYWNlYCBhbmQgcmV0dXJuIHRydWUuCitpbml0aWFsaXplIGFsbCBtZW1iZXJzIG9mIGBvdXRfaW50ZXJmYWNlYCBhbmQgcmV0dXJuIHRydWUuIFRoZSBgb3V0X2ludGVyZmFjZWAKK3BvaW50ZXIgbXVzdCBub3QgYmUgTlVMTC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2FjY2Vzc2liaWxpdHkubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9hY2Nlc3NpYmlsaXR5Lm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2FjY2Vzc2liaWxpdHkubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2FjY2Vzc2liaWxpdHkubWQKaW5kZXggYTZjODQ2MC4uMWE1YWRjYiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvYWNjZXNzaWJpbGl0eS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9hY2Nlc3NpYmlsaXR5Lm1kCkBAIC0yNTEsNCArMjUxLDMgQEAKIGBgYAogYm9vbCBTYkFjY2Vzc2liaWxpdHlTZXRDYXB0aW9uc0VuYWJsZWQoYm9vbCBlbmFibGVkKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2F0b21pYy5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2F0b21pYy5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9hdG9taWMubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2F0b21pYy5tZAppbmRleCA1Zjc5OTkwLi45NzQxZjNjIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9hdG9taWMubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvYXRvbWljLm1kCkBAIC0xMDgsNCArMTA4LDMgQEAKIGBgYAogc3RhdGljIFNiQXRvbWljOCBTYkF0b21pY1JlbGVhc2VfQ29tcGFyZUFuZFN3YXA4KHZvbGF0aWxlIFNiQXRvbWljOCAqcHRyLCBTYkF0b21pYzggb2xkX3ZhbHVlLCBTYkF0b21pYzggbmV3X3ZhbHVlKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2F1ZGlvX3NpbmsubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9hdWRpb19zaW5rLm1kCnNpbWlsYXJpdHkgaW5kZXggNjQlCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2F1ZGlvX3NpbmsubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2F1ZGlvX3NpbmsubWQKaW5kZXggOGNmMjMyOS4uYjBlNjUyZiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvYXVkaW9fc2luay5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9hdWRpb19zaW5rLm1kCkBAIC03Miw2ICs3Miw1MyBAQAogCiAjIyBGdW5jdGlvbnMgIyMKIAorIyMjIFNiQXVkaW9TaW5rQ3JlYXRlICMjIworCitDcmVhdGVzIGFuIGF1ZGlvIHNpbmsgZm9yIHRoZSBzcGVjaWZpZWQgYGNoYW5uZWxzYCBhbmQgYHNhbXBsaW5nX2ZyZXF1ZW5jeV9oemAsCithY3F1aXJlcyBhbGwgcmVzb3VyY2VzIG5lZWRlZCB0byBvcGVyYXRlIHRoZSBhdWRpbyBzaW5rLCBhbmQgcmV0dXJucyBhbiBvcGFxdWUKK2hhbmRsZSB0byB0aGUgYXVkaW8gc2luay4KKworSWYgdGhlIHBhcnRpY3VsYXIgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgYXVkaW8gc2luaywgdGhlCitmdW5jdGlvbiByZXR1cm5zIGBrU2JBdWRpb1NpbmtJbnZhbGlkYCB3aXRob3V0IGNhbGxpbmcgYW55IG9mIHRoZSBjYWxsYmFja3MuIElmCit0aGVyZSBpcyBhIHBsYXRmb3JtIGxpbWl0YXRpb24gb24gaG93IG1hbnkgYXVkaW8gc2lua3MgY2FuIGNvZXhpc3QKK3NpbXVsdGFuZW91c2x5LCB0aGVuIGNhbGxzIG1hZGUgdG8gdGhpcyBmdW5jdGlvbiB0aGF0IGF0dGVtcHQgdG8gZXhjZWVkIHRoYXQKK2xpbWl0IG11c3QgcmV0dXJuIGBrU2JBdWRpb1NpbmtJbnZhbGlkYC4gTXVsdGlwbGUgY2FsbHMgdG8gU2JBdWRpb1NpbmtDcmVhdGUKK211c3Qgbm90IGNhdXNlIGEgY3Jhc2guCisKK2BjaGFubmVsc2A6IFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMsIHN1Y2ggYXMgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgaW4KK3N0ZXJlbyBhdWRpby4gYHNhbXBsaW5nX2ZyZXF1ZW5jeV9oemA6IFRoZSBzYW1wbGUgZnJlcXVlbmN5IG9mIHRoZSBhdWRpbyBkYXRhCitiZWluZyBzdHJlYW1lZC4gRm9yIGV4YW1wbGUsIDIyLDAwMCBIeiBtZWFucyAyMiwwMDAgc2FtcGxlIGVsZW1lbnRzIHJlcHJlc2VudHMKK29uZSBzZWNvbmQgb2YgYXVkaW8gZGF0YS4gYGF1ZGlvX3NhbXBsZV90eXBlYDogVGhlIHR5cGUgb2YgZWFjaCBzYW1wbGUgb2YgdGhlCithdWRpbyBkYXRhIOKAkyBgaW50MTZgLCBgZmxvYXQzMmAsIGV0Yy4gYGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZWA6IEluZGljYXRlcword2hldGhlciBmcmFtZXMgYXJlIGludGVybGVhdmVkIG9yIHBsYW5hci4gYGZyYW1lX2J1ZmZlcnNgOiBBbiBhcnJheSBvZiBwb2ludGVycwordG8gc2FtcGxlIGRhdGEuCisKKyogICBJZiB0aGUgc2luayBpcyBvcGVyYXRpbmcgaW4gaW50ZXJsZWF2ZWQgbW9kZSwgdGhlIGFycmF5IGNvbnRhaW5zIG9ubHkgb25lCisgICAgZWxlbWVudCwgd2hpY2ggaXMgYW4gYXJyYXkgY29udGFpbmluZyAoYGZyYW1lc19wZXJfY2hhbm5lbGAgKiBgY2hhbm5lbHNgKQorICAgIHNhbXBsZXMuCisKKyogICBJZiB0aGUgc2luayBpcyBvcGVyYXRpbmcgaW4gcGxhbmFyIG1vZGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgICAgaXMgdGhlIHNhbWUgYXMgYGNoYW5uZWxzYCwgYW5kIGVhY2ggZWxlbWVudCBpcyBhbiBhcnJheSBvZgorICAgIGBmcmFtZXNfcGVyX2NoYW5uZWxgIHNhbXBsZXMuIFRoZSBjYWxsZXIgaGFzIHRvIGVuc3VyZSB0aGF0IGBmcmFtZV9idWZmZXJzYAorICAgIGlzIHZhbGlkIHVudGlsIFNiQXVkaW9TaW5rRGVzdHJveSBpcyBjYWxsZWQuIGBmcmFtZXNfcGVyX2NoYW5uZWxgOiBUaGUgc2l6ZQorICAgIG9mIHRoZSBmcmFtZSBidWZmZXJzLCBpbiB1bml0cyBvZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwuIFRoZQorICAgIGZyYW1lLCBpbiB0aGlzIGNhc2UsIHJlcHJlc2VudHMgYSBncm91cCBvZiBzYW1wbGVzIGF0IHRoZSBzYW1lIG1lZGlhIHRpbWUsCisgICAgb25lIGZvciBlYWNoIGNoYW5uZWwuIGB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jYDogVGhlIGF1ZGlvIHNpbmsgY2FsbHMgdGhpcworICAgIGZ1bmN0aW9uIG9uIGFuIGludGVybmFsIHRocmVhZCB0byBxdWVyeSB0aGUgc3RhdHVzIG9mIHRoZSBzb3VyY2UuIEl0IGlzCisgICAgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIFNiQXVkaW9TaW5rQ3JlYXRlIGlzIGNhbGxlZCwgZXZlbiBiZWZvcmUgaXQKKyAgICByZXR1cm5zLiBUaGUgY2FsbGVyIGhhcyB0byBlbnN1cmUgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGFib3ZlIHJldHVybgorICAgIG1lYW5pbmdmdWwgdmFsdWVzIGluIHRoaXMgY2FzZS4gVGhlIHZhbHVlIGNhbm5vdCBiZSBOVUxMLgorICAgIGBjb25zdW1lX2ZyYW1lc19mdW5jYDogVGhlIGF1ZGlvIHNpbmsgY2FsbHMgdGhpcyBmdW5jdGlvbiBvbiBhbiBpbnRlcm5hbAorICAgIHRocmVhZCB0byByZXBvcnQgY29uc3VtZWQgZnJhbWVzLiBUaGUgdmFsdWUgY2Fubm90IGJlIE5VTEwuIGBjb250ZXh0YDogQQorICAgIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGJhY2sgdG8gYWxsIGNhbGxiYWNrcyBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gcG9pbnQgYXQKKyAgICBhIGNsYXNzIG9yIHN0cnVjdCB0aGF0IGNvbnRhaW5zIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXVkaW8gc2luay4KKworIyMjIyBEZWNsYXJhdGlvbiAjIyMjCisKK2BgYAorU2JBdWRpb1NpbmsgU2JBdWRpb1NpbmtDcmVhdGUoaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxpbmdfZnJlcXVlbmN5X2h6LCBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIGF1ZGlvX3NhbXBsZV90eXBlLCBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZSwgU2JBdWRpb1NpbmtGcmFtZUJ1ZmZlcnMgZnJhbWVfYnVmZmVycywgaW50IGZyYW1lc19wZXJfY2hhbm5lbCwgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsIFNiQXVkaW9TaW5rQ29uc3VtZUZyYW1lc0Z1bmMgY29uc3VtZV9mcmFtZXNfZnVuYywgdm9pZCAqY29udGV4dCkKK2BgYAorCiAjIyMgU2JBdWRpb1NpbmtEZXN0cm95ICMjIwogCiBEZXN0cm95cyBgYXVkaW9fc2lua2AsIGZyZWVpbmcgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLiBCZWZvcmUgcmV0dXJuaW5nLCB0aGUKQEAgLTE2NSw0ICsyMTIsMyBAQAogYGBgCiBib29sIFNiQXVkaW9TaW5rSXNWYWxpZChTYkF1ZGlvU2luayBhdWRpb19zaW5rKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2J5dGVfc3dhcC5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2J5dGVfc3dhcC5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9ieXRlX3N3YXAubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2J5dGVfc3dhcC5tZAppbmRleCA1ODBiYzVkLi5jODM5MjdkIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9ieXRlX3N3YXAubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvYnl0ZV9zd2FwLm1kCkBAIC03Myw0ICs3MywzIEBACiBgYGAKIHVpbnQ2NF90IFNiQnl0ZVN3YXBVNjQodWludDY0X3QgdmFsdWUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY29uZGl0aW9uX3ZhcmlhYmxlLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY29uZGl0aW9uX3ZhcmlhYmxlLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2NvbmRpdGlvbl92YXJpYWJsZS5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY29uZGl0aW9uX3ZhcmlhYmxlLm1kCmluZGV4IDgzNmM0YjguLmU1OGUxMDYgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2NvbmRpdGlvbl92YXJpYWJsZS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9jb25kaXRpb25fdmFyaWFibGUubWQKQEAgLTEzOCw0ICsxMzgsMyBAQAogYGBgCiBTYkNvbmRpdGlvblZhcmlhYmxlUmVzdWx0IFNiQ29uZGl0aW9uVmFyaWFibGVXYWl0VGltZWQoU2JDb25kaXRpb25WYXJpYWJsZSAqY29uZGl0aW9uLCBTYk11dGV4ICptdXRleCwgU2JUaW1lIHRpbWVvdXRfZHVyYXRpb24pCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY29uZmlndXJhdGlvbi5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2NvbmZpZ3VyYXRpb24ubWQKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY29uZmlndXJhdGlvbi5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY29uZmlndXJhdGlvbi5tZAppbmRleCAwY2I1YzE5Li42MzBmMWNmIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9jb25maWd1cmF0aW9uLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2NvbmZpZ3VyYXRpb24ubWQKQEAgLTUzLDExICs1Myw2IEBACiBTQl9ERVBSRUNBVEVEX0VYVEVSTkFMKC4uLikgYW5ub3RhdGVzIHRoZSBmdW5jdGlvbiBhcyBkZXByZWNhdGVkIGZvciBleHRlcm5hbAogY2xpZW50cywgYnV0IG5vdCBkZXByZWNhdGVkIGZvciBzdGFyYm9hcmQuCiAKLSMjIyBTQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpICMjIwotCi1BIG1hY3JvIHRvIGRpc2FsbG93IHRoZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gZnVuY3Rpb25zIFRoaXMgc2hvdWxkIGJlCi11c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MKLQogIyMjIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTiAjIyMKIAogVGhlIEFQSSB2ZXJzaW9uIHRoYXQgaXMgY3VycmVudGx5IG9wZW4gZm9yIGNoYW5nZXMsIGFuZCB0aGVyZWZvcmUgaXMgbm90IHN0YWJsZQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY29uZmlndXJhdGlvbl9jb25zdGFudHMubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5tZApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY29uZmlndXJhdGlvbl9jb25zdGFudHMubWQKaW5kZXggYjM4MGY2Mi4uOTlkOTJmOCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY29uZmlndXJhdGlvbl9jb25zdGFudHMubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY29uZmlndXJhdGlvbl9jb25zdGFudHMubWQKQEAgLTUwLDEwICs1MCw2IEBACiAKIFRoZSBzdHJpbmcgZm9ybSBvZiBTQl9GSUxFX1NFUF9DSEFSLgogCi0jIyMga1NiSGFzQWMzQXVkaW8gIyMjCi0KLUFsbG93IGFjMyBhbmQgZWMzIHN1cHBvcnQKLQogIyMjIGtTYkhhc01lZGlhV2VibVZwOVN1cHBvcnQgIyMjCiAKIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIHdlYm0vdnA5IHN1cHBvcnQuIFRoaXMgc2hvdWxkIGJlIHNldCB0byBub24tCkBAIC02Nyw2ICs2MywxMCBAQAogCiBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgogCisjIyMga1NiTWF4U3lzdGVtUGF0aENhY2hlRGlyZWN0b3J5U2l6ZSAjIyMKKworVGhlIG1heGltdW0gc2l6ZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGlzIGFsbG93ZWQgdG8gdXNlIGluIGJ5dGVzLgorCiAjIyMga1NiTWF4VGhyZWFkTG9jYWxLZXlzICMjIwogCiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4gVGhpcwpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvY3B1X2ZlYXR1cmVzLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY3B1X2ZlYXR1cmVzLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2NwdV9mZWF0dXJlcy5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvY3B1X2ZlYXR1cmVzLm1kCmluZGV4IGU5Mzk4ODEuLjdhNGJjYzAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2NwdV9mZWF0dXJlcy5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9jcHVfZmVhdHVyZXMubWQKQEAgLTg3LDYgKzg3LDkgQEAKICogICBgYm9vbCBoYXNfdmZwM2AKIAogICAgIFZGUCB2ZXJzaW9uIDMKKyogICBgYm9vbCBoYXNfdmZwNGAKKworICAgIFZGUCB2ZXJzaW9uIDQKICogICBgYm9vbCBoYXNfdmZwM19kMzJgCiAKICAgICBWRlAgdmVyc2lvbiAzIHdpdGggMzIgRC1yZWdpc3RlcnMuCkBAIC0yNTYsNCArMjU5LDMgQEAKIGBgYAogYm9vbCBTYkNQVUZlYXR1cmVzR2V0KFNiQ1BVRmVhdHVyZXMgKmZlYXR1cmVzKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2RlY29kZV90YXJnZXQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9kZWNvZGVfdGFyZ2V0Lm1kCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2RlY29kZV90YXJnZXQubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2RlY29kZV90YXJnZXQubWQKaW5kZXggMmU2MWMxZS4uYTIzN2FkOSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvZGVjb2RlX3RhcmdldC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9kZWNvZGVfdGFyZ2V0Lm1kCkBAIC0xMTcsNiArMTE3LDExIEBACiAKICAgICBBIGRlY29kZXIgdGFyZ2V0IGZvcm1hdCBjb25zaXN0aW5nIG9mIDEwYml0IFksIFUsIGFuZCBWIHBsYW5lcywgaW4gdGhhdAogICAgIG9yZGVyLiBFYWNoIHBpeGVsIGlzIHN0b3JlZCBpbiAxNiBiaXRzLgorKiAgIGBrU2JEZWNvZGVUYXJnZXRGb3JtYXQzUGxhbmUxMEJpdFlVVkk0MjBDb21wYWN0YAorCisgICAgQSBkZWNvZGVyIHRhcmdldCBmb3JtYXQgY29uc2lzdGluZyBvZiAxMGJpdCBZLCBVLCBhbmQgViBwbGFuZXMsIGluIHRoYXQKKyAgICBvcmRlci4gVGhlIHBsYW5lIGRhdGEgaXMgc3RvcmVkIGluIGEgY29tcGFjdCBmb3JtYXQuIEV2ZXJ5IHRocmVlIDEwLWJpdAorICAgIHBpeGVscyBhcmUgcGFja2VkIGludG8gMzIgYml0cy4KICogICBga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lVVlWWWAKIAogICAgIEEgZGVjb2RlciB0YXJnZXQgZm9ybWF0IGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgcGxhbmUgd2l0aCBwaXhlbHMgbGFpZCBvdXQgaW4KQEAgLTMyNyw4ICszMzIsMTAgQEAKIAogIyMjIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyAjIyMKIAotV3JpdGVzIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBgZGVjb2RlX3RhcmdldGAgaW50byBgb3V0X2luZm9gLiBSZXR1cm5zIGZhbHNlIGlmCi10aGUgcHJvdmlkZWQgYG91dF9pbmZvYCBzdHJ1Y3R1cmUgaXMgbm90IHplcm8gaW5pdGlhbGl6ZWQuCitXcml0ZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGBkZWNvZGVfdGFyZ2V0YCBpbnRvIGBvdXRfaW5mb2AuIFRoZQorYGRlY29kZV90YXJnZXRgIG11c3Qgbm90IGJlIGtTYkRlY29kZVRhcmdldEludmFsaWQuIFRoZSBgb3V0X2luZm9gIHBvaW50ZXIgbXVzdAorbm90IGJlIE5VTEwuIFJldHVybnMgZmFsc2UgaWYgdGhlIHByb3ZpZGVkIGBvdXRfaW5mb2Agc3RydWN0dXJlIGlzIG5vdCB6ZXJvCitpbml0aWFsaXplZC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2RpcmVjdG9yeS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2RpcmVjdG9yeS5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9kaXJlY3RvcnkubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2RpcmVjdG9yeS5tZAppbmRleCBkNDZjOWExLi5kY2RmNDhhIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9kaXJlY3RvcnkubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZGlyZWN0b3J5Lm1kCkBAIC0xMTUsNCArMTE1LDMgQEAKIGBgYAogU2JEaXJlY3RvcnkgU2JEaXJlY3RvcnlPcGVuKGNvbnN0IGNoYXIgKnBhdGgsIFNiRmlsZUVycm9yICpvdXRfZXJyb3IpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvZHJtLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZHJtLm1kCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2RybS5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZHJtLm1kCmluZGV4IGJlYjY1YzkuLmZiYjkyZjkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2RybS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9kcm0ubWQKQEAgLTIzOCw2ICsyMzgsOCBAQAogCiBDbGVhciBhbnkgaW50ZXJuYWwgc3RhdGVzL3Jlc291cmNlcyByZWxhdGVkIHRvIHRoZSBzcGVjaWZpZWQgYHNlc3Npb25faWRgLgogCitgZHJtX3N5c3RlbWAgbXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLiBgc2Vzc2lvbl9pZGAgbXVzdCBub3QgYmUgTlVMTC4KKwogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYApAQCAtMjU0LDcgKzI1Niw3IEBACiByZXN1bHQsIGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBjYWxsYmFjayB0aGF0IGlzIHBhc3NlZCB0bwogU2JEcm1DcmVhdGVTeXN0ZW0oKSwgYSBkZWFkbG9jayB3aWxsIG9jY3VyLgogCi1gZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHRvIGJlIGRlc3Ryb3llZC4KK2Bkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gdG8gYmUgZGVzdHJveWVkLiBNdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0yODEsNyArMjgzLDcgQEAKIAogYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB0aGF0IGRlZmluZXMgdGhlIGtleSBzeXN0ZW0gdXNlZCBmb3IgdGhlIHNlc3Npb24KIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQgYXMgd2VsbCBhcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYXMgYQotcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQuCityZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZC4gTXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLgogCiBgdGlja2V0YDogVGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZQogY29uY3VycmVudCBjYWxscyB0byBTYkRybUdlbmVyYXRlU2Vzc2lvblVwZGF0ZVJlcXVlc3QoKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8KQEAgLTI4OSwxMCArMjkxLDEwIEBACiBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQgbWF5CiByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBUaGUgdmFsdWUgYGtTYkRybVRpY2tldEludmFsaWRgIG11c3Qgbm90IGJlIHVzZWQuCiAKLWB0eXBlYDogVGhlIGNhc2Utc2Vuc2l0aXZlIHR5cGUgb2YgdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZC4KLWBpbml0aWFsaXphdGlvbl9kYXRhYDogVGhlIGRhdGEgZm9yIHdoaWNoIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0IHBheWxvYWQgaXMKLWNyZWF0ZWQuIGBpbml0aWFsaXphdGlvbl9kYXRhX3NpemVgOiBUaGUgc2l6ZSBvZiB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdAotcGF5bG9hZC4KK2B0eXBlYDogVGhlIGNhc2Utc2Vuc2l0aXZlIHR5cGUgb2YgdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZC4gTXVzdCBub3QKK2JlIE5VTEwuIGBpbml0aWFsaXphdGlvbl9kYXRhYDogVGhlIGRhdGEgZm9yIHdoaWNoIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0CitwYXlsb2FkIGlzIGNyZWF0ZWQuIE11c3Qgbm90IGJlIE5VTEwuIGBpbml0aWFsaXphdGlvbl9kYXRhX3NpemVgOiBUaGUgc2l6ZSBvZgordGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTMyMiw3ICszMjQsNyBAQAogSXQgc2hvdWxkIHJldHVybiBOVUxMIHdoZW4gdGhlcmUgaXMgbm8gbWV0cmljcyBzdXBwb3J0IGluIHRoZSB1bmRlcmx5aW5nIGRybQogc3lzdGVtLCBvciB3aGVuIHRoZSBkcm0gc3lzdGVtIGltcGxlbWVudGF0aW9uIGZhaWxzIHRvIHJldHJpZXZlIHRoZSBtZXRyaWNzLgogCi1UaGUgY2FsbGVyIHdpbGwgbmV2ZXIgc2V0IGBzaXplYCB0byBOVUxMLgorYGRybV9zeXN0ZW1gIG11c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4gYHNpemVgIG11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMzcsNiArMzM5LDcgQEAKIHRoZSBsaWZlIHRpbWUgb2YgYGRybV9zeXN0ZW1gLgogCiBgZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHRvIGNoZWNrIGlmIGl0cyBzZXJ2ZXIgY2VydGlmaWNhdGUgaXMgdXBkYXRhYmxlLgorTXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzcxLDE0ICszNzQsMTUgQEAKIGEgcHJldmlvdXMgY2FsbCBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlcgogYFNiRHJtSXNTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0YWJsZWAgaXMgY2FsbGVkIGZpcnN0IGFuZCByZXR1cm5lZCB0cnVlLgogCi1gZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHdob3NlIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyBiZWluZyB1cGRhdGVkLgotYHRpY2tldGA6IFRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUKLWNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1VcGRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZSgpLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0bwotYHNlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX2NhbGxiYWNrYCBhcy1pcy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQotY2FsbGVyIHRvIGVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lCi10aWNrZXQgbWF5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFRoZSB2YWx1ZSBga1NiRHJtVGlja2V0SW52YWxpZGAgbXVzdAotbm90IGJlIHVzZWQuIGBjZXJ0aWZpY2F0ZWA6IFBvaW50ZXIgdG8gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBkYXRhLgotYGNlcnRpZmljYXRlX3NpemVgOiBTaXplIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZGF0YS4KK2Bkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gd2hvc2Ugc2VydmVyIGNlcnRpZmljYXRlIGlzIGJlaW5nIHVwZGF0ZWQuIE11c3Qgbm90CitiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuIGB0aWNrZXRgOiBUaGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoCitjYWxsYmFja3MgZnJvbSBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoKSwKK3doaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBzZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRlZF9jYWxsYmFja2AgYXMtaXMuIEl0IGlzIHRoZQorcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUKK3JlcXVlc3RzIHdpdGggdGhlIHNhbWUgdGlja2V0IG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBUaGUgdmFsdWUKK2BrU2JEcm1UaWNrZXRJbnZhbGlkYCBtdXN0IG5vdCBiZSB1c2VkLiBgY2VydGlmaWNhdGVgOiBQb2ludGVyIHRvIHRoZSBzZXJ2ZXIKK2NlcnRpZmljYXRlIGRhdGEuIE11c3Qgbm90IGJlIE5VTEwuIGBjZXJ0aWZpY2F0ZV9zaXplYDogU2l6ZSBvZiB0aGUgc2VydmVyCitjZXJ0aWZpY2F0ZSBkYXRhLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzkxLDIyICszOTUsMjMgQEAKIFVwZGF0ZSBzZXNzaW9uIHdpdGggYGtleWAsIGluIGBkcm1fc3lzdGVtYCdzIGtleSBzeXN0ZW0sIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyCiByZXNwb25zZS4gQ2FsbHMgYHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja2Agd2l0aCBgY29udGV4dGAgYW5kIHdoZXRoZXIgdGhlIHVwZGF0ZQogc3VjY2VlZGVkLiBgY29udGV4dGAgbWF5IGJlIHVzZWQgdG8gcm91dGUgY2FsbGJhY2tzIGJhY2sgdG8gYW4gb2JqZWN0IGluc3RhbmNlLgorVGhlIGBrZXlgIG11c3Qgbm90IGJlIE5VTEwuCiAKLWB0aWNrZXRgIGlzIHRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggY2FsbGJhY2tzIGZyb20gbXVsdGlwbGUKLWNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1VcGRhdGVTZXNzaW9uKCksIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCi1gc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrYCBhcy1pcy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8KLWVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZSBjYWxscyB3aXRoIHRoZSBzYW1lIHRpY2tldCBtYXkKLXJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCitgZHJtX3N5c3RlbWAgbXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLiBgdGlja2V0YCBpcyB0aGUgb3BhcXVlIElEIHRoYXQKK2FsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZSBjb25jdXJyZW50IGNhbGxzIHRvCitTYkRybVVwZGF0ZVNlc3Npb24oKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja2AgYXMtaXMuCitJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcKK211bHRpcGxlIGNhbGxzIHdpdGggdGhlIHNhbWUgdGlja2V0IG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgogCiBPbmNlIHRoZSBzZXNzaW9uIGlzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLCBhbiBTYlBsYXllciBvciBTYkRlY29kZXIgYXNzb2NpYXRlZAogd2l0aCB0aGF0IERSTSBrZXkgc3lzdGVtIHdpbGwgYmUgYWJsZSB0byBkZWNyeXB0IGVuY3J5cHRlZCBzYW1wbGVzLgogCiBgZHJtX3N5c3RlbWAncyBgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrYCBtYXkgY2FsbGVkIGVpdGhlciBmcm9tIHRoZSBjdXJyZW50Ci10aHJlYWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBvciBmcm9tIGFub3RoZXIgdGhyZWFkLgordGhyZWFkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb3IgZnJvbSBhbm90aGVyIHRocmVhZC4gVGhlIGBzZXNzaW9uX2lkYAorbXVzdCBub3QgYmUgTlVMTC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYAogdm9pZCBTYkRybVVwZGF0ZVNlc3Npb24oU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwgaW50IHRpY2tldCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5X3NpemUsIGNvbnN0IHZvaWQgKnNlc3Npb25faWQsIGludCBzZXNzaW9uX2lkX3NpemUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvZWdsLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZWdsLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2VnbC5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZWdsLm1kCmluZGV4IGIxZTEyMGIuLmM4YzIxMjAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2VnbC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9lZ2wubWQKQEAgLTE0NCw0ICsxNDQsMyBAQAogICAgIGNvbmZpZywgdm9pZCAqbmF0aXZlX3BpeG1hcCwgY29uc3QgU2JFZ2xBdHRyaWIgKmF0dHJpYl9saXN0KWAKICogICBgU2JFZ2xCb29sZWFuKCplZ2xXYWl0U3luYykoU2JFZ2xEaXNwbGF5IGRweSwgU2JFZ2xTeW5jIHN5bmMsIFNiRWdsSW50MzIKICAgICBmbGFncylgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2V2ZW50Lm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZXZlbnQubWQKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvZXZlbnQubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2V2ZW50Lm1kCmluZGV4IGNkODVkYjYuLjU4Y2IxZjQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2V2ZW50Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2V2ZW50Lm1kCkBAIC0zLDEwICszLDYgQEAKIHRpdGxlOiAiU3RhcmJvYXJkIE1vZHVsZSBSZWZlcmVuY2U6IGV2ZW50LmgiCiAtLS0KIAotRm9yIFNCX0FQSV9WRVJTSU9OID49IDEzCi0KLU1vZHVsZSBPdmVydmlldzogU3RhcmJvYXJkIEV2ZW50IG1vZHVsZQotCiBEZWZpbmVzIHRoZSBldmVudCBzeXN0ZW0gdGhhdCB3cmFwcyB0aGUgU3RhcmJvYXJkIG1haW4gbG9vcCBhbmQgZW50cnkgcG9pbnQuCiAKICMjIFRoZSBTdGFyYm9hcmQgQXBwbGljYXRpb24gTGlmZWN5Y2xlICMjCkBAIC04Miw3NSArNzgsNiBAQAogTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gdHJhbnNpdGlvbiB0aHJvdWdoIGBCTFVSUkVEYCwKIGBDT05DRUFMRURgIHRvIGBGUk9aRU5gIGJlZm9yZSByZWNlaXZpbmcgYFN0b3BgIG9yIGJlaW5nIGtpbGxlZC4KIAotRm9yIFNCX0FQSV9WRVJTSU9OIDwgMTMKLQotTW9kdWxlIE92ZXJ2aWV3OiBTdGFyYm9hcmQgRXZlbnQgbW9kdWxlCi0KLURlZmluZXMgdGhlIGV2ZW50IHN5c3RlbSB0aGF0IHdyYXBzIHRoZSBTdGFyYm9hcmQgbWFpbiBsb29wIGFuZCBlbnRyeSBwb2ludC4KLQotIyMgVGhlIFN0YXJib2FyZCBBcHBsaWNhdGlvbiBMaWZlY3ljbGUgIyMKLQotYGBgCi0gICAgLS0tLS0tLS0tLSAqCi0gICB8ICAgICAgICAgICB8Ci0gICB8ICAgICAgICBQcmVsb2FkCi0gICB8ICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICBWCi0gU3RhcnQgICBbIFBSRUxPQURJTkcgXSAtLS0tLS0tLS0tLS0KLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICBTdGFydCAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgIHwKLSAgICAtLS0tPiBbIFNUQVJURUQgXSA8LS0tLSAgICAgICAgIHwKLSAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgIHwKLSAgICAgICAgICAgICBQYXVzZSAgICAgICBVbnBhdXNlICAgIHwKLSAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIFN1c3BlbmQKLSAgICAgICAgICAgICAgIFYgICAgICAgICAgIHwgICAgICAgIHwKLSAgICAtLS0tLT4gWyBQQVVTRUQgXSAtLS0tLSAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLVJlc3VtZSAgICAgIFN1c3BlbmQgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgIHwKLSAgICAtLS0tIFsgU1VTUEVOREVEIF0gPC0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICBTdG9wCi0gICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICBWCi0gICAgICAgICAgWyBTVE9QUEVEIF0KLQotYGBgCi0KLVRoZSBmaXJzdCBldmVudCB0aGF0IGEgU3RhcmJvYXJkIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGlzIGVpdGhlciBgU3RhcnRgCi0oYGtTYkV2ZW50VHlwZVN0YXJ0YCkgb3IgYFByZWxvYWRgIChga1NiRXZlbnRUeXBlUHJlbG9hZGApLiBgU3RhcnRgIHB1dHMgdGhlCi1hcHBsaWNhdGlvbiBpbiB0aGUgYFNUQVJURURgIHN0YXRlLCB3aGVyZWFzIGBQcmVsb2FkYCBwdXRzIHRoZSBhcHBsaWNhdGlvbiBpbgotdGhlIGBQUkVMT0FESU5HYCBzdGF0ZS4KLQotYFBSRUxPQURJTkdgIGNhbiBvbmx5IGhhcHBlbiBhcyB0aGUgZmlyc3QgYXBwbGljYXRpb24gc3RhdGUuIEluIHRoaXMgc3RhdGUsIHRoZQotYXBwbGljYXRpb24gc2hvdWxkIHN0YXJ0IGFuZCBydW4gYXMgbm9ybWFsLCBidXQgd2lsbCBub3QgcmVjZWl2ZSBhbnkgaW5wdXQsIGFuZAotc2hvdWxkIG5vdCB0cnkgdG8gaW5pdGlhbGl6ZSBncmFwaGljcyByZXNvdXJjZXMgdmlhIEdMLiBJbiBgUFJFTE9BRElOR2AsIHRoZQotYXBwbGljYXRpb24gY2FuIHJlY2VpdmUgYFN0YXJ0YCBvciBgU3VzcGVuZGAgZXZlbnRzLiBgU3RhcnRgIHdpbGwgcmVjZWl2ZSB0aGUKLXNhbWUgZGF0YSB0aGF0IHdhcyBwYXNzZWQgaW50byBgUHJlbG9hZGAuCi0KLUluIHRoZSBgU1RBUlRFRGAgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBpcyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgY2FuIGV4cGVjdCB0bwotZG8gYWxsIG9mIHRoZSBub3JtYWwgdGhpbmdzIGl0IG1pZ2h0IHdhbnQgdG8gZG8uIE9uY2UgaW4gdGhlIGBTVEFSVEVEYCBzdGF0ZSwgaXQKLW1heSByZWNlaXZlIGEgYFBhdXNlYCBldmVudCwgcHV0dGluZyB0aGUgYXBwbGljYXRpb24gaW50byB0aGUgYFBBVVNFRGAgc3RhdGUuCi0KLUluIHRoZSBgUEFVU0VEYCBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHZpc2libGUsIGJ1dCBoYXMgbG9zdCBmb2N1cywgb3IKLWl0IGlzIHBhcnRpYWxseSBvYnNjdXJlZCBieSBhIG1vZGFsIGRpYWxvZywgb3IgaXQgaXMgb24gaXRzIHdheSB0byBiZWluZyBzaHV0Ci1kb3duLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHBhdXNlIGFjdGl2aXR5IGluIHRoaXMgc3RhdGUuIEluIHRoaXMgc3RhdGUsIGl0IGNhbgotcmVjZWl2ZSBgVW5wYXVzZWAgdG8gYmUgYnJvdWdodCBiYWNrIHRvIHRoZSBmb3JlZ3JvdW5kIHN0YXRlIChgU1RBUlRFRGApLCBvcgotYFN1c3BlbmRgIHRvIGJlIHB1c2hlZCBmdXJ0aGVyIGluIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBgU1VTUEVOREVEYCBzdGF0ZS4KLQotSW4gdGhlIGBTVVNQRU5ERURgIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gaXMgZ2VuZXJhbGx5IG5vdCB2aXNpYmxlLiBJdCBzaG91bGQKLWltbWVkaWF0ZWx5IHJlbGVhc2UgYWxsIGdyYXBoaWNzIGFuZCB2aWRlbyByZXNvdXJjZXMsIGFuZCBzaHV0IGRvd24gYWxsCi1iYWNrZ3JvdW5kIGFjdGl2aXR5ICh0aW1lcnMsIHJlbmRlcmluZywgZXRjKS4gQWRkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24KLXNob3VsZCBmbHVzaCBzdG9yYWdlIHRvIGVuc3VyZSB0aGF0IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBraWxsZWQsIHRoZSBzdG9yYWdlCi13aWxsIGJlIHVwLXRvLWRhdGUuIFRoZSBhcHBsaWNhdGlvbiBtYXkgYmUga2lsbGVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3aWxsCi1pZGVhbGx5IHJlY2VpdmUgYSBgU3RvcGAgZXZlbnQgZm9yIGEgbW9yZSBncmFjZWZ1bCBzaHV0ZG93bi4KLQotTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gdHJhbnNpdGlvbiB0aHJvdWdoIGBQQVVTRURgIHRvCi1gU1VTUEVOREVEYCBiZWZvcmUgcmVjZWl2aW5nIGBTdG9wYCBvciBiZWluZyBraWxsZWQuCi0KICMjIEVudW1zICMjCiAKICMjIyBTYkV2ZW50VHlwZSAjIyMKQEAgLTE2Myw2NSArOTAsNjggQEAKIAogKiAgIGBrU2JFdmVudFR5cGVQcmVsb2FkYAogCi0gICAgQXBwbGljYXRpb25zIHNob3VsZCBwZXJmb3JtIGluaXRpYWxpemF0aW9uIGFuZCBwcmVwYXJlIHRvIHJlYWN0IHRvCi0gICAgc3Vic2VxdWVudCBldmVudHMsIGJ1dCBtdXN0IG5vdCBpbml0aWFsaXplIGFueSBncmFwaGljcyByZXNvdXJjZXMgdGhyb3VnaAotICAgIEdMLiBUaGUgaW50ZW50IG9mIHRoaXMgZXZlbnQgaXMgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIGFzIG11Y2ggd29yawotICAgIGFzIHBvc3NpYmxlIGFoZWFkIG9mIHRpbWUsIHNvIHRoYXQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgZmlyc3QgYnJvdWdodCB0bwotICAgIHRoZSBmb3JlZ3JvdW5kLCBpdCdzIGFzIGZhc3QgYXMgYSByZXN1bWUuCi0KLSAgICBUaGUgYGtTYkV2ZW50VHlwZVN0YXJ0YCBldmVudCBtYXkgYmUgc2VudCBhdCBhbnkgdGltZSwgcmVnYXJkbGVzcyBvZgotICAgIGluaXRpYWxpemF0aW9uIHN0YXRlLiBJbnB1dCBldmVudHMgd2lsbCBub3QgYmUgc2VudCBpbiB0aGUgYFBSRUxPQURJTkdgCi0gICAgc3RhdGUuIFRoaXMgZXZlbnQgd2lsbCBvbmx5IGJlIHNlbnQgb25jZSBmb3IgYSBnaXZlbiBwcm9jZXNzIGxhdW5jaC4KLSAgICBTYkV2ZW50U3RhcnREYXRhIGlzIHBhc3NlZCBhcyB0aGUgZGF0YSBhcmd1bWVudC4KLQotICAgIFRoZSBzeXN0ZW0gbWF5IHNlbmQgYGtTYkV2ZW50VHlwZVN1c3BlbmRgIGluIGBQUkVMT0FESU5HYCBpZiBpdCB3YW50cyB0bwotICAgIHB1c2ggdGhlIGFwcCBpbnRvIGEgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gc3RhdGUuIEFwcGxpY2F0aW9ucyBjYW4gYWxzbwotICAgIGNhbGwgU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCgpIHdoZW4gdGhleSBhcmUgZG9uZSBwcmVsb2FkaW5nIHRvIHJlcXVlc3QgdGhpcy4KKyAgICBUaGUgc3lzdGVtIG1heSBzZW5kIGBrU2JFdmVudFR5cGVQcmVsb2FkYCBpbiBgVU5TVEFSVEVEYCBpZiBpdCB3YW50cyB0byBwdXNoCisgICAgdGhlIGFwcCBpbnRvIGEgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gc3RhdGUuIEFwcGxpY2F0aW9ucyB3aWxsIGFsc28gY2FsbAorICAgIFNiU3lzdGVtUmVxdWVzdENvbmNlYWwoKSB3aGVuIHRoZXkgcmVxdWVzdCB0aGlzLiBUaGUgb25seSBldmVudHMgdGhhdCBzaG91bGQKKyAgICBiZSBkaXNwYXRjaGVkIGFmdGVyIGEgUHJlbG9hZCBldmVudCBhcmUgUmV2ZWFsIG9yIEZyZWV6ZS4gTm8gZGF0YSBhcmd1bWVudC4KICogICBga1NiRXZlbnRUeXBlU3RhcnRgCiAKICAgICBUaGUgZmlyc3QgZXZlbnQgdGhhdCBhbiBhcHBsaWNhdGlvbiByZWNlaXZlcyBvbiBzdGFydHVwIHdoZW4gc3RhcnRpbmcKLSAgICBub3JtYWxseSAoaS5lLiBub3QgYmVpbmcgcHJlbG9hZGVkKS4gQXBwbGljYXRpb25zIHNob3VsZCBwZXJmb3JtCi0gICAgaW5pdGlhbGl6YXRpb24sIHN0YXJ0IHJ1bm5pbmcsIGFuZCBwcmVwYXJlIHRvIHJlYWN0IHRvIHN1YnNlcXVlbnQgZXZlbnRzLgotICAgIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gcnVuIGFuZCB0aGVuIGV4aXQgbXVzdCBjYWxsCi0gICAgYFNiU3lzdGVtUmVxdWVzdFN0b3AoKWAgdG8gdGVybWluYXRlLiBUaGlzIGV2ZW50IHdpbGwgb25seSBiZSBzZW50IG9uY2UgZm9yCi0gICAgYSBnaXZlbiBwcm9jZXNzIGxhdW5jaC4gYFNiRXZlbnRTdGFydERhdGFgIGlzIHBhc3NlZCBhcyB0aGUgZGF0YSBhcmd1bWVudC4KLSAgICBJbiBjYXNlIG9mIHByZWxvYWQsIHRoZSBgU2JFdmVudFN0YXJ0RGF0YWAgd2lsbCBiZSB0aGUgc2FtZSBhcyB3aGF0IHdhcwotICAgIHBhc3NlZCB0byBga1NiRXZlbnRUeXBlUHJlbG9hZGAuCi0qICAgYGtTYkV2ZW50VHlwZVBhdXNlYAorICAgIG5vcm1hbGx5LiBBcHBsaWNhdGlvbnMgc2hvdWxkIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24sIHN0YXJ0IHJ1bm5pbmcsIGFuZAorICAgIHByZXBhcmUgdG8gcmVhY3QgdG8gc3Vic2VxdWVudCBldmVudHMuIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gcnVuIGFuZAorICAgIHRoZW4gZXhpdCBtdXN0IGNhbGwgYFNiU3lzdGVtUmVxdWVzdFN0b3AoKWAgdG8gdGVybWluYXRlLiBUaGlzIGV2ZW50IHdpbGwKKyAgICBvbmx5IGJlIHNlbnQgb25jZSBmb3IgYSBnaXZlbiBwcm9jZXNzIGxhdW5jaC4gYFNiRXZlbnRTdGFydERhdGFgIGlzIHBhc3NlZAorICAgIGFzIHRoZSBkYXRhIGFyZ3VtZW50LgorKiAgIGBrU2JFdmVudFR5cGVCbHVyYAogCiAgICAgQSBkaWFsb2cgd2lsbCBiZSByYWlzZWQgb3IgdGhlIGFwcGxpY2F0aW9uIHdpbGwgb3RoZXJ3aXNlIGJlIHB1dCBpbnRvIGEKLSAgICBiYWNrZ3JvdW5kLWJ1dC12aXNpYmxlIG9yIHBhcnRpYWxseS1vYnNjdXJlZCBzdGF0ZSAoUEFVU0VEKS4gR3JhcGhpY3MgYW5kCi0gICAgdmlkZW8gcmVzb3VyY2VzIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlLCBidXQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBwYXVzZQorICAgIGJhY2tncm91bmQtYnV0LXZpc2libGUgb3IgcGFydGlhbGx5LW9ic2N1cmVkIHN0YXRlIChCTFVSUkVEKS4gR3JhcGhpY3MgYW5kCisgICAgdmlkZW8gcmVzb3VyY2VzIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlLCBidXQgdGhlIGFwcGxpY2F0aW9uIGNvdWxkIHBhdXNlCiAgICAgZm9yZWdyb3VuZCBhY3Rpdml0eSBsaWtlIGFuaW1hdGlvbnMgYW5kIHZpZGVvIHBsYXliYWNrLiBDYW4gb25seSBiZSByZWNlaXZlZAotICAgIGFmdGVyIGEgU3RhcnQgZXZlbnQuIFRoZSBvbmx5IGV2ZW50cyB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIGFmdGVyIGEgUGF1c2UKLSAgICBldmVudCBhcmUgVW5wYXVzZSBvciBTdXNwZW5kLiBObyBkYXRhIGFyZ3VtZW50LgotKiAgIGBrU2JFdmVudFR5cGVVbnBhdXNlYAorICAgIGFmdGVyIGEgU3RhcnQgZXZlbnQuIFRoZSBvbmx5IGV2ZW50cyB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIGFmdGVyIGEgQmx1cgorICAgIGV2ZW50IGFyZSBGb2N1cyBvciBDb25jZWFsLiBObyBkYXRhIGFyZ3VtZW50LgorKiAgIGBrU2JFdmVudFR5cGVGb2N1c2AKIAogICAgIFRoZSBhcHBsaWNhdGlvbiBpcyByZXR1cm5pbmcgdG8gdGhlIGZvcmVncm91bmQgKFNUQVJURUQpIGFmdGVyIGhhdmluZyBiZWVuCi0gICAgcHV0IGluIHRoZSBQQVVTRUQgKGUuZy4gcGFydGlhbGx5LW9ic2N1cmVkKSBzdGF0ZS4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZAotICAgIHVucGF1c2UgZm9yZWdyb3VuZCBhY3Rpdml0eSBsaWtlIGFuaW1hdGlvbnMgYW5kIHZpZGVvIHBsYXliYWNrLiBDYW4gb25seSBiZQotICAgIHJlY2VpdmVkIGFmdGVyIGEgUGF1c2Ugb3IgUmVzdW1lIGV2ZW50LiBObyBkYXRhIGFyZ3VtZW50LgotKiAgIGBrU2JFdmVudFR5cGVTdXNwZW5kYAorICAgIHB1dCBpbiB0aGUgQkxVUlJFRCAoZS5nLiBwYXJ0aWFsbHktb2JzY3VyZWQpIHN0YXRlLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkCisgICAgcmVzdW1lIGZvcmVncm91bmQgYWN0aXZpdHkgbGlrZSBhbmltYXRpb25zIGFuZCB2aWRlbyBwbGF5YmFjay4gQ2FuIG9ubHkgYmUKKyAgICByZWNlaXZlZCBhZnRlciBhIEJsdXIgb3IgUmV2ZWFsIGV2ZW50LiBObyBkYXRhIGFyZ3VtZW50LgorKiAgIGBrU2JFdmVudFR5cGVDb25jZWFsYAogCi0gICAgVGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBwdXQgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBTdXNwZW5kZWQgc3RhdGUgYWZ0ZXIKKyAgICBUaGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIHB1dCB0aGUgYXBwbGljYXRpb24gaW50byB0aGUgQ29uY2VhbGVkIHN0YXRlIGFmdGVyCisgICAgdGhpcyBldmVudCBpcyBoYW5kbGVkLiBUaGUgYXBwbGljYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgbWFkZSBpbnZpc2libGUsIGJ1dAorICAgIGJhY2tncm91bmQgdGFza3MgY2FuIHN0aWxsIGJlIHJ1bm5pbmcsIHN1Y2ggYXMgYXVkaW8gcGxheWJhY2ssIG9yIHVwZGF0aW5nCisgICAgb2YgcmVjb21tZW5kYXRpb25zLiBDYW4gb25seSBiZSByZWNlaXZlZCBhZnRlciBhIEJsdXIgb3IgUmV2ZWFsIGV2ZW50LiBUaGUKKyAgICBvbmx5IGV2ZW50cyB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIGFmdGVyIGEgQ29uY2VhbCBldmVudCBhcmUgRnJlZXplIG9yCisgICAgUmV2ZWFsLiBPbiBzb21lIHBsYXRmb3JtcywgdGhlIHByb2Nlc3MgbWF5IGFsc28gYmUga2lsbGVkIGFmdGVyIENvbmNlYWwKKyAgICB3aXRob3V0IGEgRnJlZXplIGV2ZW50LgorKiAgIGBrU2JFdmVudFR5cGVSZXZlYWxgCisKKyAgICBUaGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIHJlc3RvcmUgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBCTFVSUkVEIHN0YXRlIGZyb20KKyAgICB0aGUgQ09OQ0VBTEVEIHN0YXRlLiBUaGlzIGlzIHRoZSBmaXJzdCBldmVudCB0aGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlCisgICAgY29taW5nIG91dCBvZiBDT05DRUFMRUQsIGFuZCBpdCBjYW4gYmUgcmVjZWl2ZWQgYWZ0ZXIgYSBDb25jZWFsIG9yIFVuZnJlZXplCisgICAgZXZlbnQuIFRoZSBhcHBsaWNhdGlvbiB3aWxsIG5vdyBiZSBpbiB0aGUgQkxVUlJFRCBzdGF0ZS4gTm8gZGF0YSBhcmd1bWVudC4KKyogICBga1NiRXZlbnRUeXBlRnJlZXplYAorCisgICAgVGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBwdXQgdGhlIGFwcGxpY2F0aW9uIGludG8gdGhlIEZyb3plbiBzdGF0ZSBhZnRlcgogICAgIHRoaXMgZXZlbnQgaXMgaGFuZGxlZC4gVGhlIGFwcGxpY2F0aW9uIGlzIGV4cGVjdGVkIHRvIHN0b3AgcGVyaW9kaWMKICAgICBiYWNrZ3JvdW5kIHdvcmssIHJlbGVhc2UgQUxMIGdyYXBoaWNzIGFuZCB2aWRlbyByZXNvdXJjZXMsIGFuZCBmbHVzaCBhbnkKICAgICBwZW5kaW5nIFNiU3RvcmFnZSB3cml0ZXMuIFNvbWUgcGxhdGZvcm1zIHdpbGwgdGVybWluYXRlIHRoZSBhcHBsaWNhdGlvbiBpZgotICAgIHdvcmsgaXMgZG9uZSBvciByZXNvdXJjZXMgYXJlIHJldGFpbmVkIGFmdGVyIHN1c3BlbnNpb24uIENhbiBvbmx5IGJlCi0gICAgcmVjZWl2ZWQgYWZ0ZXIgYSBQYXVzZSBldmVudC4gVGhlIG9ubHkgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BhdGNoZWQKLSAgICBhZnRlciBhIFN1c3BlbmQgZXZlbnQgYXJlIFJlc3VtZSBvciBTdG9wLiBPbiBzb21lIHBsYXRmb3JtcywgdGhlIHByb2Nlc3MgbWF5Ci0gICAgYWxzbyBiZSBraWxsZWQgYWZ0ZXIgU3VzcGVuZCB3aXRob3V0IGEgU3RvcCBldmVudC4gTm8gZGF0YSBhcmd1bWVudC4KLSogICBga1NiRXZlbnRUeXBlUmVzdW1lYAorICAgIHdvcmsgaXMgZG9uZSBvciByZXNvdXJjZXMgYXJlIHJldGFpbmVkIGFmdGVyIGZyZWV6aW5nLiBDYW4gYmUgcmVjZWl2ZWQgYWZ0ZXIKKyAgICBhIENvbmNlYWwgb3IgVW5mcmVlemUgZXZlbnQuIFRoZSBvbmx5IGV2ZW50cyB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIGFmdGVyCisgICAgYSBGcmVlemUgZXZlbnQgYXJlIFVuZnJlZXplIG9yIFN0b3AuIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgcHJvY2VzcyBtYXkgYWxzbworICAgIGJlIGtpbGxlZCBhZnRlciBGcmVlemUgd2l0aG91dCBhIFN0b3AgZXZlbnQuIE5vIGRhdGEgYXJndW1lbnQuCisqICAgYGtTYkV2ZW50VHlwZVVuZnJlZXplYAogCi0gICAgVGhlIG9wZXJhdGluZyBzeXN0ZW0gaGFzIHJlc3RvcmVkIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgUEFVU0VEIHN0YXRlIGZyb20KLSAgICB0aGUgU1VTUEVOREVEIHN0YXRlLiBUaGlzIGlzIHRoZSBmaXJzdCBldmVudCB0aGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlCi0gICAgY29taW5nIG91dCBvZiBTVVNQRU5ERUQsIGFuZCBpdCB3aWxsIG9ubHkgYmUgcmVjZWl2ZWQgYWZ0ZXIgYSBTdXNwZW5kIGV2ZW50LgotICAgIFRoZSBhcHBsaWNhdGlvbiB3aWxsIG5vdyBiZSBpbiB0aGUgUEFVU0VEIHN0YXRlLiBObyBkYXRhIGFyZ3VtZW50LgorICAgIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGhhcyByZXN0b3JlZCB0aGUgYXBwbGljYXRpb24gdG8gdGhlIENPTkNFQUxFRCBzdGF0ZQorICAgIGZyb20gdGhlIEZST1pFTiBzdGF0ZS4gVGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZQorICAgIGNvbWluZyBvdXQgb2YgRlJPWkVOLCBhbmQgaXQgd2lsbCBvbmx5IGJlIHJlY2VpdmVkIGFmdGVyIGEgRnJlZXplIGV2ZW50LiBUaGUKKyAgICBhcHBsaWNhdGlvbiB3aWxsIG5vdyBiZSBpbiB0aGUgQ09OQ0VBTEVEIHN0YXRlLiBOTyBkYXRhIGFyZ3VtZW50LgogKiAgIGBrU2JFdmVudFR5cGVTdG9wYAogCiAgICAgVGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBzaHV0IHRoZSBhcHBsaWNhdGlvbiBkb3duIGVudGlyZWx5IGFmdGVyIHRoaXMKLSAgICBldmVudCBpcyBoYW5kbGVkLiBDYW4gb25seSBiZSByZWNlaXZlZCBhZnRlciBhIFN1c3BlbmQgZXZlbnQsIGluIHRoZQotICAgIFNVU1BFTkRFRCBzdGF0ZS4gTm8gZGF0YSBhcmd1bWVudC4KKyAgICBldmVudCBpcyBoYW5kbGVkLiBDYW4gb25seSBiZSByZWNlaXZlZCBhZnRlciBhIEZyZWV6ZSBldmVudCwgaW4gdGhlIEZST1pFTgorICAgIHN0YXRlLiBObyBkYXRhIGFyZ3VtZW50LgogKiAgIGBrU2JFdmVudFR5cGVJbnB1dGAKIAogICAgIEEgdXNlciBpbnB1dCBldmVudCwgaW5jbHVkaW5nIGtleWJvYXJkLCBtb3VzZSwgZ2VzdHVyZSwgb3Igc29tZXRoaW5nIGVsc2UuCkBAIC0yNDksNyArMTc5LDcgQEAKICAgICByZXNwb25zZSB0byBhbiBhcHBsaWNhdGlvbiBjYWxsIHRvIFNiRXZlbnRTY2hlZHVsZSgpLCBhbmQgaXQgd2lsbCBjYWxsIHRoZQogICAgIGNhbGxiYWNrIGRpcmVjdGx5LCBzbyBTYkV2ZW50SGFuZGxlIHNob3VsZCBuZXZlciByZWNlaXZlIHRoaXMgZXZlbnQKICAgICBkaXJlY3RseS4gVGhlIGRhdGEgdHlwZSBpcyBhbiBpbnRlcm5hbGx5LWRlZmluZWQgc3RydWN0dXJlLgotKiAgIGBrU2JFdmVudFR5cGVBY2Nlc3NpYmxpdHlTZXR0aW5nc0NoYW5nZWRgCisqICAgYGtTYkV2ZW50VHlwZUFjY2Vzc2liaWxpdHlTZXR0aW5nc0NoYW5nZWRgCiAKICAgICBUaGUgcGxhdGZvcm0ncyBhY2Nlc3NpYmlsaXR5IHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZAogICAgIHF1ZXJ5IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmdzIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBBUElzIHRvIGdldCB0aGUgbmV3CkBAIC0zMjEsOSArMjUxLDI3IEBACiAKICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZmllbGRzIHJldHVybmVkIGJ5IFNiQWNjZXNzaWJpbGl0eUdldENhcHRpb25TZXR0aW5ncyBoYXMKICAgICBjaGFuZ2VkLgotKiAgIGBrU2JFdmVudFR5cGVBY2Nlc3NpYmxpdHlUZXh0VG9TcGVlY2hTZXR0aW5nc0NoYW5nZWRgCisqICAgYGtTYkV2ZW50VHlwZUFjY2Vzc2liaWxpdHlUZXh0VG9TcGVlY2hTZXR0aW5nc0NoYW5nZWRgCiAKICAgICBUaGUgcGxhdGZvcm0ncyB0ZXh0LXRvLXNwZWVjaCBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuCisqICAgYGtTYkV2ZW50VHlwZU9zTmV0d29ya0Rpc2Nvbm5lY3RlZGAKKworICAgIFRoZSBwbGF0Zm9ybSBoYXMgZGV0ZWN0ZWQgYSBuZXR3b3JrIGRpc2Nvbm5lY3Rpb24uIFRoZXJlIGFyZSBsaWtlbHkgdG8gYmUKKyAgICBjYXNlcyB3aGVyZSB0aGUgcGxhdGZvcm0gY2Fubm90IGRldGVjdCB0aGUgZGlzY29ubmVjdGlvbiBidXQgdGhlIHBsYXRmb3JtCisgICAgc2hvdWxkIG1ha2UgYSBiZXN0IGVmZm9ydCB0byBzZW5kIGFuIGV2ZW50IG9mIHRoaXMgdHlwZSB3aGVuIHRoZSBuZXR3b3JrCisgICAgZGlzY29ubmVjdHMuIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBpbXBsZW1lbnQgd2luZG93Lm9ub2ZmbGluZSBET00gZXZlbnQuCisqICAgYGtTYkV2ZW50VHlwZU9zTmV0d29ya0Nvbm5lY3RlZGAKKworICAgIFRoZSBwbGF0Zm9ybSBoYXMgZGV0ZWN0ZWQgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgY2FzZXMKKyAgICB3aGVyZSB0aGUgcGxhdGZvcm0gY2Fubm90IGRldGVjdCB0aGUgY29ubmVjdGlvbiBidXQgdGhlIHBsYXRmb3JtIHNob3VsZCBtYWtlCisgICAgYSBiZXN0IGVmZm9ydCB0byBzZW5kIGFuIGV2ZW50IG9mIHRoaXMgdHlwZSB3aGVuIHRoZSBkZXZpY2UgaXMganVzdAorICAgIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQuIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBpbXBsZW1lbnQgd2luZG93Lm9ub25saW5lCisgICAgRE9NIGV2ZW50LgorKiAgIGBrU2JFdmVudERhdGVUaW1lQ29uZmlndXJhdGlvbkNoYW5nZWRgCisKKyAgICBUaGUgcGxhdGZvcm0gaGFzIGRldGVjdGVkIGEgZGF0ZSBhbmQvb3IgdGltZSBjb25maWd1cmF0aW9uIGNoYW5nZSAoc3VjaCBhcyBhCisgICAgY2hhbmdlIGluIHRoZSB0aW1lem9uZSBzZXR0aW5nKS4gVGhpcyBzaG91bGQgdHJpZ2dlciB0aGUgYXBwbGljYXRpb24gdG8gcmUtCisgICAgcXVlcnkgdGhlIHJlbGV2YW50IEFQSXMgdG8gdXBkYXRlIHRoZSBkYXRlIGFuZCB0aW1lLgogCiAjIyBUeXBlZGVmcyAjIwogCkBAIC0zNjYsNiArMzE0LDcgQEAKICMjIyMgTWVtYmVycyAjIyMjCiAKICogICBgU2JFdmVudFR5cGUgdHlwZWAKKyogICBgU2JUaW1lTW9ub3RvbmljIHRpbWVzdGFtcGAKICogICBgdm9pZCAqIGRhdGFgCiAKICMjIyBTYkV2ZW50U3RhcnREYXRhICMjIwpAQCAtNDI0LDcgKzM3Myw3IEBACiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCi1TQl9JTVBPUlQgdm9pZCBTYkV2ZW50SGFuZGxlKGNvbnN0IFNiRXZlbnQgKmV2ZW50KQorU0JfRVhQT1JUX1BMQVRGT1JNIHZvaWQgU2JFdmVudEhhbmRsZShjb25zdCBTYkV2ZW50ICpldmVudCkKIGBgYAogCiAjIyMgU2JFdmVudElzSWRWYWxpZCAjIyMKQEAgLTQ0MywxMyArMzkyLDI0IEBACiBtYXkgYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZCwgYnV0IGBjYWxsYmFja2AgaXMgYWx3YXlzIGNhbGxlZCBmcm9tIHRoZSBtYWluCiBTdGFyYm9hcmQgdGhyZWFkLCBxdWV1ZWQgd2l0aCBvdGhlciBwZW5kaW5nIGV2ZW50cy4KIAotYGNhbGxiYWNrYDogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gYGNvbnRleHRgOiBUaGUgY29udGV4dCB0aGF0IGlzCi1wYXNzZWQgdG8gdGhlIGBjYWxsYmFja2AgZnVuY3Rpb24uIGBkZWxheWA6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBtaWNyb3NlY29uZHMKLXRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlIGBjYWxsYmFja2AgZnVuY3Rpb24uIFNldCBgZGVsYXlgIHRvIGAwYCB0byBjYWxsIHRoZQotY2FsbGJhY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KK2BjYWxsYmFja2A6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIE11c3Qgbm90IGJlIE5VTEwuIGBjb250ZXh0YDogVGhlCitjb250ZXh0IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBgZGVsYXlgOiBUaGUgbWluaW11bSBudW1iZXIKK29mIG1pY3Jvc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBTZXQgYGRlbGF5YCB0bworYDBgIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGFzIHNvb24gYXMgcG9zc2libGUuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKIFNiRXZlbnRJZCBTYkV2ZW50U2NoZWR1bGUoU2JFdmVudENhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpjb250ZXh0LCBTYlRpbWUgZGVsYXkpCiBgYGAKKworIyMjIFNiUnVuU3RhcmJvYXJkTWFpbiAjIyMKKworU2VydmVzIGFzIHRoZSBlbnRyeSBwb2ludCBpbiB0aGUgU3RhcmJvYXJkIGxpYnJhcnkgZm9yIHJ1bm5pbmcgdGhlIFN0YXJib2FyZAorZXZlbnQgbG9vcCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBldmVudCBoYW5kbGVyLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCitpbnQgU2JSdW5TdGFyYm9hcmRNYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgU2JFdmVudEhhbmRsZUNhbGxiYWNrIGNhbGxiYWNrKQorYGBgCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9leHBvcnQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9leHBvcnQubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2V4cG9ydC5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZXhwb3J0Lm1kCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9maWxlLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZmlsZS5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9maWxlLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9maWxlLm1kCmluZGV4IGUyMmVkZWIuLjU2ZWI0MTUgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2ZpbGUubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvZmlsZS5tZApAQCAtNDAyLDQgKzQwMiwzIEBACiBgYGAKIHN0YXRpYyBpbnQgU2JGaWxlV3JpdGVBbGwoU2JGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2dsZXMubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9nbGVzLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2dsZXMubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2dsZXMubWQKaW5kZXggN2E5MTA4YS4uMTYzZDhkNyAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvZ2xlcy5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9nbGVzLm1kCkBAIC00NTksNCArNDU5LDMgQEAKICAgICBpbnRlcm5hbGZvcm1hdCwgU2JHbFNpemVpIHdpZHRoLCBTYkdsU2l6ZWkgaGVpZ2h0LCBTYkdsU2l6ZWkgZGVwdGgpYAogKiAgIGB2b2lkKCpnbEdldEludGVybmFsZm9ybWF0aXYpKFNiR2xFbnVtIHRhcmdldCwgU2JHbEVudW0gaW50ZXJuYWxmb3JtYXQsCiAgICAgU2JHbEVudW0gcG5hbWUsIFNiR2xTaXplaSBidWZTaXplLCBTYkdsSW50MzIgKnBhcmFtcylgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2ltYWdlLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvaW1hZ2UubWQKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvaW1hZ2UubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2ltYWdlLm1kCmluZGV4IDMwNTA5NTMuLjE0MjdkMzkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2ltYWdlLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2ltYWdlLm1kCkBAIC0yNCw3ICsyNCw3IEBACiAgIHJldHVybjsKIH0KIAotU2JEZWNvZGVUYXJnZXQgcmVzdWx0X3RhcmdldCA9IFNiRGVjb2RlSW1hZ2UocHJvdmlkZXIsIGRhdGEsIGRhdGFfc2l6ZSwKK1NiRGVjb2RlVGFyZ2V0IHJlc3VsdF90YXJnZXQgPSBTYkltYWdlRGVjb2RlKHByb3ZpZGVyLCBkYXRhLCBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lX3R5cGUsIGZvcm1hdCk7CiBgYGAKIApAQCAtNDgsMTMgKzQ4LDEzIEBACiAgICAgY2FsbGVkLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgcHJvY2VlZCB0byBkZWNvZGluZyBob3dldmVyIGl0IGRlc2lyZXMuCiAKIDEuICBUaGUgcHJvdmlkZXIgaXMgbm90IHJlcXVpcmVkIGFuZCBpcyBub3QgcGFzc2VkIGluLiBUaGUgaW1wbGVtZW50YXRpb24gd2lsbAotICAgIHByb2NlZWQgZm9yd2FyZC4KLQotVGh1cywgaXQgaXMgTk9UIHNhZmUgZm9yIGNsaWVudHMgb2YgdGhpcyBBUEkgdG8gYXNzdW1lIHRoYXQgdGhlIGBwcm92aWRlcmAgaXQKLXBhc3NlcyBpbiB3aWxsIGJlIGNhbGxlZC4gRmluYWxseSwgaWYgdGhlIGRlY29kZSBzdWNjZWVkcywgYSBuZXcgU2JEZWNvZGVUYXJnZXQKLXdpbGwgYmUgYWxsb2NhdGVkLiBJZiBgbWltZV90eXBlYCBpbWFnZSBkZWNvZGluZyBmb3IgdGhlIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90Ci1zdXBwb3J0ZWQgb3IgdGhlIGRlY29kZSBmYWlscywga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCB3aWxsIGJlIHJldHVybmVkLCB3aXRoIGFueQotaW50ZXJtZWRpYXRlIGFsbG9jYXRpb25zIGJlaW5nIGNsZWFuZWQgdXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICAgIHByb2NlZWQgZm9yd2FyZC4gVGhlIGBkYXRhYCBwb2ludGVyIG11c3Qgbm90IGJlIE5VTEwuIFRoZSBgbWltZV90eXBlYCBzdHJpbmcKKyAgICBtdXN0IG5vdCBiZSBOVUxMLiBUaHVzLCBpdCBpcyBOT1Qgc2FmZSBmb3IgY2xpZW50cyBvZiB0aGlzIEFQSSB0byBhc3N1bWUKKyAgICB0aGF0IHRoZSBgcHJvdmlkZXJgIGl0IHBhc3NlcyBpbiB3aWxsIGJlIGNhbGxlZC4gRmluYWxseSwgaWYgdGhlIGRlY29kZQorICAgIHN1Y2NlZWRzLCBhIG5ldyBTYkRlY29kZVRhcmdldCB3aWxsIGJlIGFsbG9jYXRlZC4gSWYgYG1pbWVfdHlwZWAgaW1hZ2UKKyAgICBkZWNvZGluZyBmb3IgdGhlIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciB0aGUgZGVjb2RlIGZhaWxzLAorICAgIGtTYkRlY29kZVRhcmdldEludmFsaWQgd2lsbCBiZSByZXR1cm5lZCwgd2l0aCBhbnkgaW50ZXJtZWRpYXRlIGFsbG9jYXRpb25zCisgICAgYmVpbmcgY2xlYW5lZCB1cCBpbiB0aGUgaW1wbGVtZW50YXRpb24uCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC02NSw5ICs2NSwxMCBAQAogIyMjIFNiSW1hZ2VJc0RlY29kZVN1cHBvcnRlZCAjIyMKIAogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBkZWNvZGluZyBhbiBpbWFnZSBvZgotbWltZSB0eXBlIGBtaW1lX3R5cGVgIGludG8gU2JEZWNvZGVUYXJnZXRGb3JtYXQgYGZvcm1hdGAuIFRoZSByZXN1bHQgb2YgdGhpcwotZnVuY3Rpb24gbXVzdCBub3QgY2hhbmdlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcHJvZ3JhbSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUKLXJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FjaGVkIGluZGVmaW5pdGVseS4KK21pbWUgdHlwZSBgbWltZV90eXBlYCBpbnRvIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGBmb3JtYXRgLiBUaGUgYG1pbWVfdHlwZWAgbXVzdAorbm90IGJlIE5VTEwuIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjaGFuZ2Ugb3ZlciB0aGUgY291cnNlIG9mIHRoZQorcHJvZ3JhbSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWNoZWQKK2luZGVmaW5pdGVseS4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2lucHV0Lm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvaW5wdXQubWQKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvaW5wdXQubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2lucHV0Lm1kCmluZGV4IDM1NTRhZjYuLmVjODY3OTMgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL2lucHV0Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2lucHV0Lm1kCkBAIC05NCwxMyArOTQsNiBAQAogCiAjIyMjIE1lbWJlcnMgIyMjIwogCi0qICAgYFNiVGltZU1vbm90b25pYyB0aW1lc3RhbXBgCi0KLSAgICBUaGUgdGltZSB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCBmb3IgdGhpcyBldmVudC4gVGhpcyBpcyBpbnRlbmRlZCB0bwotICAgIGZhY2lsaXRhdGUgY2FsY3VsYXRpb24gb2YgdGltZS1zZW5zaXRpdmUgaW5mb3JtYXRpb24gKGUuZy4gdmVsb2NpdHkgZm9yCi0gICAga1NiSW5wdXRFdmVudFR5cGVNb3ZlKS4gVGhpcyBtYXkgYmUgc2V0IHRvIDAgdG8gaGF2ZSB0aGUgcmVsZXZhbnQgc3lzdGVtcwotICAgIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0aW1lc3RhbXAuIEhvd2V2ZXIsIHRoaXMgbWF5IGhhcHBlbiBhdCBhIGxhdGVyIHRpbWUsCi0gICAgc28gdGhlIHJlbGF0aXZlIHRpbWUgYmV0d2VlbiBldmVudHMgbWF5IG5vdCBiZSBwcmVzZXJ2ZWQuCiAqICAgYFNiV2luZG93IHdpbmRvd2AKIAogICAgIFRoZSB3aW5kb3cgaW4gd2hpY2ggdGhlIGlucHV0IHdhcyBnZW5lcmF0ZWQuCkBAIC0xNzUsNCArMTY4LDMgQEAKIAogKiAgIGBmbG9hdCB4YAogKiAgIGBmbG9hdCB5YAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9rZXkubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9rZXkubWQKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIva2V5Lm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9rZXkubWQKaW5kZXggMTZiZTNjMS4uMjgzNWIyMCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIva2V5Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2tleS5tZApAQCAtMTk2LDYgKzE5Niw3IEBACiAqICAgYGtTYktleUdyZWVuYAogKiAgIGBrU2JLZXlZZWxsb3dgCiAqICAgYGtTYktleUJsdWVgCisqICAgYGtTYktleVJlY29yZGAKICogICBga1NiS2V5Q2hhbm5lbFVwYAogKiAgIGBrU2JLZXlDaGFubmVsRG93bmAKICogICBga1NiS2V5U3VidGl0bGVgCkBAIC0yOTAsNCArMjkxLDMgQEAKICogICBga1NiS2V5TW9kaWZpZXJzUG9pbnRlckJ1dHRvbk1pZGRsZWAKICogICBga1NiS2V5TW9kaWZpZXJzUG9pbnRlckJ1dHRvbkJhY2tgCiAqICAgYGtTYktleU1vZGlmaWVyc1BvaW50ZXJCdXR0b25Gb3J3YXJkYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9sb2cubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9sb2cubWQKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbG9nLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9sb2cubWQKaW5kZXggMWFkNmMyNC4uNDJkZTUxMyAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbG9nLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L2xvZy5tZApAQCAtMzAsMTAgKzMwLDEwIEBACiBgcHJpb3JpdHlgOiBUaGUgU2JMb2dQcmlvcml0eSBhdCB3aGljaCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9nZ2VkLiBOb3RlIHRoYXQKIHBhc3NpbmcgYGtTYkxvZ1ByaW9yaXR5RmF0YWxgIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gU3VjaCBhIHBvbGljeSBtdXN0CiBiZSBlbmZvcmNlZCBhdCB0aGUgYXBwbGljYXRpb24gbGV2ZWwuIEluIGZhY3QsIGBwcmlvcml0eWAgbWF5IGJlIGNvbXBsZXRlbHkKLWlnbm9yZWQgb24gbWFueSBwbGF0Zm9ybXMuIGBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiBObyBmb3JtYXR0aW5nIGlzCi1yZXF1aXJlZCB0byBiZSBkb25lIG9uIHRoZSB2YWx1ZSwgaW5jbHVkaW5nIG5ld2xpbmUgdGVybWluYXRpb24uIFRoYXQgc2FpZCwKLXBsYXRmb3JtcyBjYW4gYWRqdXN0IHRoZSBtZXNzYWdlIHRvIGJlIG1vcmUgc3VpdGFibGUgZm9yIHRoZWlyIG91dHB1dCBtZXRob2QgYnkKLXdyYXBwaW5nIHRoZSB0ZXh0LCBzdHJpcHBpbmcgdW5wcmludGFibGUgY2hhcmFjdGVycywgZXRjLgoraWdub3JlZCBvbiBtYW55IHBsYXRmb3Jtcy4gYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE11c3Qgbm90IGJlCitOVUxMLiBObyBmb3JtYXR0aW5nIGlzIHJlcXVpcmVkIHRvIGJlIGRvbmUgb24gdGhlIHZhbHVlLCBpbmNsdWRpbmcgbmV3bGluZQordGVybWluYXRpb24uIFRoYXQgc2FpZCwgcGxhdGZvcm1zIGNhbiBhZGp1c3QgdGhlIG1lc3NhZ2UgdG8gYmUgbW9yZSBzdWl0YWJsZSBmb3IKK3RoZWlyIG91dHB1dCBtZXRob2QgYnkgd3JhcHBpbmcgdGhlIHRleHQsIHN0cmlwcGluZyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCBldGMuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC03MCw3ICs3MCw3IEBACiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCi12b2lkIHN0YXRpYyB2b2lkIHZvaWQgU2JMb2dGb3JtYXRGKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIFNCX1BSSU5URl9GT1JNQVQoMQordm9pZCBzdGF0aWMgdm9pZCBzdGF0aWMgdm9pZCBTYkxvZ0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCiBgYGAKIAogIyMjIFNiTG9nSXNUdHkgIyMjCkBAIC04OSw3ICs4OSw3IEBACiBhbiBhc3luY2hyb25vdXMgc2lnbmFsIGhhbmRsZXIgKGUuZy4gYSBgU0lHU0VHVmAgaGFuZGxlcikuIEl0IHNob3VsZCBub3QgZG8gYW55CiBhZGRpdGlvbmFsIGZvcm1hdHRpbmcuCiAKLWBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgorYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0xMzIsNiArMTMyLDUgQEAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKLXZvaWQgc3RhdGljIHZvaWQgdm9pZCBTYkxvZ1Jhd0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCit2b2lkIHN0YXRpYyB2b2lkIHN0YXRpYyB2b2lkIFNiTG9nUmF3Rm9ybWF0Rihjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDEKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9tZWRpYS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L21lZGlhLm1kCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL21lZGlhLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9tZWRpYS5tZAppbmRleCBhOWJhY2VkLi4xMzIxNjZjIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9tZWRpYS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9tZWRpYS5tZApAQCAtMzAsNiArMzAsMTAgQEAKICogICBga1NiTWVkaWFBdWRpb0NvZGVjRWFjM2AKICogICBga1NiTWVkaWFBdWRpb0NvZGVjT3B1c2AKICogICBga1NiTWVkaWFBdWRpb0NvZGVjVm9yYmlzYAorKiAgIGBrU2JNZWRpYUF1ZGlvQ29kZWNNcDNgCisqICAgYGtTYk1lZGlhQXVkaW9Db2RlY0ZsYWNgCisqICAgYGtTYk1lZGlhQXVkaW9Db2RlY1BjbWAKKyogICBga1NiTWVkaWFBdWRpb0NvZGVjSWFtZmAKIAogIyMjIFNiTWVkaWFBdWRpb0NvZGluZ1R5cGUgIyMjCiAKQEAgLTU1LDExICs1OSwyMCBAQAogCiAjIyMjIFZhbHVlcyAjIyMjCiAKLSogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3Rvck5vbmVgCisqICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JVbmtub3duYAogKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yQW5hbG9nYAogKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yQmx1ZXRvb3RoYAorKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yQnVpbHRJbmAKICogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckhkbWlgCi0qICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JOZXR3b3JrYAorKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yUmVtb3RlV2lyZWRgCisKKyAgICBBIHdpcmVkIHJlbW90ZSBhdWRpbyBvdXRwdXQsIGxpa2UgYSByZW1vdGUgc3BlYWtlciB2aWEgRXRoZXJuZXQuCisqICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JSZW1vdGVXaXJlbGVzc2AKKworICAgIEEgd2lyZWxlc3MgcmVtb3RlIGF1ZGlvIG91dHB1dCwgbGlrZSBhIHJlbW90ZSBzcGVha2VyIHZpYSBXaS1GaS4KKyogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvclJlbW90ZU90aGVyYAorCisgICAgQSByZW1vdGUgYXVkaW8gb3V0cHV0IGNhbm5vdCBiZSBjbGFzc2lmaWVkIGludG8gb3RoZXIgZXhpc3RpbmcgdHlwZXMuCiAqICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JTcGRpZmAKICogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvclVzYmAKIApAQCAtMTcwLDEzICsxODMsMTAgQEAKIAogIyMjIyBNZW1iZXJzICMjIyMKIAotKiAgIGBpbnQgaW5kZXhgCi0KLSAgICBUaGUgcGxhdGZvcm0tZGVmaW5lZCBpbmRleCBvZiB0aGUgYXNzb2NpYXRlZCBhdWRpbyBvdXRwdXQuCiAqICAgYFNiTWVkaWFBdWRpb0Nvbm5lY3RvciBjb25uZWN0b3JgCiAKLSAgICBUaGUgdHlwZSBvZiBhdWRpbyBjb25uZWN0b3IuIFdpbGwgYmUgdGhlIGVtcHR5IGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yTm9uZWAKLSAgICBpZiB0aGlzIGRldmljZSBjYW5ub3QgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLgorICAgIFRoZSB0eXBlIG9mIGF1ZGlvIGNvbm5lY3Rvci4gV2lsbCBiZSBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvclVua25vd25gIGlmIHRoaXMKKyAgICBkZXZpY2UgY2Fubm90IHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4KICogICBgU2JUaW1lIGxhdGVuY3lgCiAKICAgICBUaGUgZXhwZWN0ZWQgbGF0ZW5jeSBvZiBhdWRpbyBvdmVyIHRoaXMgb3V0cHV0LCBpbiBtaWNyb3NlY29uZHMsIG9yIGAwYCBpZgpAQCAtMTkyLDEzICsyMDIsMTkgQEAKIAogIyMjIFNiTWVkaWFBdWRpb1NhbXBsZUluZm8gIyMjCiAKLUFuIGF1ZGlvIHNhbXBsZSBpbmZvLCB3aGljaCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gYXVkaW8gc2FtcGxlLiBUaGlzIGFjdHMKLWFzIGEgc2V0IG9mIGluc3RydWN0aW9ucyB0byB0aGUgYXVkaW8gZGVjb2Rlci4KK1RoZSBzZXQgb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIGRlY29kZXIgb3IgcGxheWVyIGZvciBlYWNoIGF1ZGlvIHNhbXBsZS4KIAotVGhlIGF1ZGlvIHNhbXBsZSBpbmZvIGNvbnNpc3RzIG9mIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSBgV0FWRUZPUk1BVEVYYAotc3RydWN0dXJlLCBhcyB3ZWxsIGFzIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYXVkaW8gZGVjb2RlciwgaW5jbHVkaW5nIHRoZQotQXVkaW8tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWVsZC4gVGhlIGBXQVZFRk9STUFURVhgIHN0cnVjdHVyZSBpcyBzcGVjaWZpZWQgYXQKLVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQzOTA5NzAodj12cy44NSkuYXNweF0oaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMzkwOTcwKHY9dnMuODUpLmFzcHgpeCkgLgorIyMjIyBNZW1iZXJzICMjIyMKKworKiAgIGBTYk1lZGlhQXVkaW9TdHJlYW1JbmZvIHN0cmVhbV9pbmZvYAorCisgICAgVGhlIHNldCBvZiBpbmZvcm1hdGlvbiBvZiB0aGUgdmlkZW8gc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNhbXBsZS4KKyogICBgU2JUaW1lIGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250YAorKiAgIGBTYlRpbWUgZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFja2AKKworIyMjIFNiTWVkaWFBdWRpb1N0cmVhbUluZm8gIyMjCisKK1RoZSBzZXQgb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIGRlY29kZXIgb3IgcGxheWVyIGZvciBlYWNoIGF1ZGlvIHN0cmVhbS4KIAogIyMjIyBNZW1iZXJzICMjIyMKIApAQCAtMjEwLDIxICsyMjYsMTIgQEAKICAgICBUaGUgbWltZSBvZiB0aGUgYXVkaW8gc3RyZWFtIHdoZW4gYGNvZGVjYCBpc24ndCBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lLiBJdAogICAgIG1heSBwb2ludCB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG1pbWUgaXMgbm90IGF2YWlsYWJsZSwgYW5kIGl0IGNhbiBvbmx5CiAgICAgYmUgc2V0IHRvIE5VTEwgd2hlbiBgY29kZWNgIGlzIGtTYk1lZGlhQXVkaW9Db2RlY05vbmUuCi0qICAgYHVpbnQxNl90IGZvcm1hdF90YWdgCi0KLSAgICBUaGUgd2F2ZWZvcm0tYXVkaW8gZm9ybWF0IHR5cGUgY29kZS4KICogICBgdWludDE2X3QgbnVtYmVyX29mX2NoYW5uZWxzYAogCiAgICAgVGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBpbiB0aGlzIGZvcm1hdC4gYDFgIGZvciBtb25vLCBgMmAgZm9yIHN0ZXJlby4KICogICBgdWludDMyX3Qgc2FtcGxlc19wZXJfc2Vjb25kYAogCiAgICAgVGhlIHNhbXBsaW5nIHJhdGUuCi0qICAgYHVpbnQzMl90IGF2ZXJhZ2VfYnl0ZXNfcGVyX3NlY29uZGAKLQotICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNlY29uZCBleHBlY3RlZCB3aXRoIHRoaXMgZm9ybWF0LgotKiAgIGB1aW50MTZfdCBibG9ja19hbGlnbm1lbnRgCi0KLSAgICBCeXRlIGJsb2NrIGFsaWdubWVudCwgZS5nLCA0LgogKiAgIGB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGVgCiAKICAgICBUaGUgYml0IGRlcHRoIGZvciB0aGUgc3RyZWFtIHRoaXMgcmVwcmVzZW50cywgZS5nLiBgOGAgb3IgYDE2YC4KQEAgLTM3Myw2ICszODAsMjAgQEAKIAogIyMjIyBNZW1iZXJzICMjIyMKIAorKiAgIGBTYk1lZGlhVmlkZW9TdHJlYW1JbmZvIHN0cmVhbV9pbmZvYAorCisgICAgVGhlIHNldCBvZiBpbmZvcm1hdGlvbiBvZiB0aGUgdmlkZW8gc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNhbXBsZS4KKyogICBgYm9vbCBpc19rZXlfZnJhbWVgCisKKyAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBzYW1wbGUgaXMgYSBrZXkgZnJhbWUgKEktZnJhbWUpLiBBdmMgdmlkZW8KKyAgICBrZXkgZnJhbWVzIG11c3QgYWx3YXlzIHN0YXJ0IHdpdGggU1BTIGFuZCBQUFMgTkFMIHVuaXRzLgorCisjIyMgU2JNZWRpYVZpZGVvU3RyZWFtSW5mbyAjIyMKKworVGhlIHNldCBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgZGVjb2RlciBvciBwbGF5ZXIgZm9yIGVhY2ggdmlkZW8gc3RyZWFtLgorCisjIyMjIE1lbWJlcnMgIyMjIworCiAqICAgYFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjYAogCiAgICAgVGhlIHZpZGVvIGNvZGVjIG9mIHRoaXMgc2FtcGxlLgpAQCAtMzkzLDEwICs0MTQsNiBAQAogICAgIHNlY29uZCBoaWdoZXIgdGhhbiAxNSBmcHMuIFdoZW4gdGhlIG1heGltdW1zIGFyZSB1bmtub3duLCB0aGlzIHdpbGwgYmUgc2V0CiAgICAgdG8gYW4gZW1wdHkgc3RyaW5nLiBJdCBjYW4gb25seSBiZSBzZXQgdG8gTlVMTCB3aGVuIGBjb2RlY2AgaXMKICAgICBrU2JNZWRpYVZpZGVvQ29kZWNOb25lLgotKiAgIGBib29sIGlzX2tleV9mcmFtZWAKLQotICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHNhbXBsZSBpcyBhIGtleSBmcmFtZSAoSS1mcmFtZSkuIFZpZGVvIGtleQotICAgIGZyYW1lcyBtdXN0IGFsd2F5cyBzdGFydCB3aXRoIFNQUyBhbmQgUFBTIE5BTCB1bml0cy4KICogICBgaW50IGZyYW1lX3dpZHRoYAogCiAgICAgVGhlIGZyYW1lIHdpZHRoIG9mIHRoaXMgc2FtcGxlLCBpbiBwaXhlbHMuIEFsc28gY291bGQgYmUgcGFyc2VkIGZyb20gdGhlCkBAIC01MTcsMTMgKzUzNCwxMiBAQAogIyMjIFNiTWVkaWFHZXRCdWZmZXJBbGlnbm1lbnQgIyMjCiAKIFRoZSBtZWRpYSBidWZmZXIgd2lsbCBiZSBhbGxvY2F0ZWQgdXNpbmcgdGhlIHJldHVybmVkIGFsaWdubWVudC4gU2V0IHRoaXMgdG8gYQotbGFyZ2VyIHZhbHVlIG1heSBpbmNyZWFzZSB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIG9mIG1lZGlhIGJ1ZmZlcnMuYHR5cGVgOiB0aGUKLW1lZGlhIHR5cGUgb2YgdGhlIHN0cmVhbSAoYXVkaW8gb3IgdmlkZW8pLgorbGFyZ2VyIHZhbHVlIG1heSBpbmNyZWFzZSB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIG9mIG1lZGlhIGJ1ZmZlcnMuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKLWludCBTYk1lZGlhR2V0QnVmZmVyQWxpZ25tZW50KFNiTWVkaWFUeXBlIHR5cGUpCitpbnQgU2JNZWRpYUdldEJ1ZmZlckFsaWdubWVudCgpCiBgYGAKIAogIyMjIFNiTWVkaWFHZXRCdWZmZXJBbGxvY2F0aW9uVW5pdCAjIyMKQEAgLTU2MSwxMiArNTc3LDEyIEBACiAKIEV4dHJhIGJ5dGVzIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIGEgbWVkaWEgYnVmZmVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuCiBiZSB1c2Ugb3B0aW1hbGx5IGJ5IHNwZWNpZmljIGluc3RydWN0aW9ucyBsaWtlIFNJTUQuIFNldCB0byAwIHRvIHJlbW92ZSBhbnkKLXBhZGRpbmcuYHR5cGVgOiB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgc3RyZWFtIChhdWRpbyBvciB2aWRlbykuCitwYWRkaW5nLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCi1pbnQgU2JNZWRpYUdldEJ1ZmZlclBhZGRpbmcoU2JNZWRpYVR5cGUgdHlwZSkKK2ludCBTYk1lZGlhR2V0QnVmZmVyUGFkZGluZygpCiBgYGAKIAogIyMjIFNiTWVkaWFHZXRCdWZmZXJTdG9yYWdlVHlwZSAjIyMKQEAgLTY4MywzOSArNjk5LDMgQEAKIGBgYAogYm9vbCBTYk1lZGlhSXNCdWZmZXJVc2luZ01lbW9yeVBvb2woKQogYGBgCi0KLSMjIyBTYk1lZGlhSXNTdXBwb3J0ZWQgIyMjCi0KLUluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgZGVjb2RpbmcgYHZpZGVvX2NvZGVjYCBhbmQKLWBhdWRpb19jb2RlY2AgYWxvbmcgd2l0aCBkZWNyeXB0aW5nIHVzaW5nIGBrZXlfc3lzdGVtYC4gSWYgYHZpZGVvX2NvZGVjYCBpcwotYGtTYk1lZGlhVmlkZW9Db2RlY05vbmVgIG9yIGlmIGBhdWRpb19jb2RlY2AgaXMgYGtTYk1lZGlhQXVkaW9Db2RlY05vbmVgLCB0aGlzCi1mdW5jdGlvbiBzaG91bGQgcmV0dXJuIGB0cnVlYCBhcyBsb25nIGFzIGBrZXlfc3lzdGVtYCBpcyBzdXBwb3J0ZWQgb24gdGhlCi1wbGF0Zm9ybSB0byBkZWNvZGUgYW55IHN1cHBvcnRlZCBpbnB1dCBmb3JtYXRzLgotCi1gdmlkZW9fY29kZWNgOiBUaGUgYFNiTWVkaWFWaWRlb0NvZGVjYCBiZWluZyBjaGVja2VkIGZvciBwbGF0Zm9ybSBjb21wYXRpYmlsaXR5LgotYGF1ZGlvX2NvZGVjYDogVGhlIGBTYk1lZGlhQXVkaW9Db2RlY2AgYmVpbmcgY2hlY2tlZCBmb3IgcGxhdGZvcm0gY29tcGF0aWJpbGl0eS4KLWBrZXlfc3lzdGVtYDogVGhlIGtleSBzeXN0ZW0gYmVpbmcgY2hlY2tlZCBmb3IgcGxhdGZvcm0gY29tcGF0aWJpbGl0eS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotYm9vbCBTYk1lZGlhSXNTdXBwb3J0ZWQoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLCBjb25zdCBjaGFyICprZXlfc3lzdGVtKQotYGBgCi0KLSMjIyBTYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uICMjIwotCi1Db21tdW5pY2F0ZSB0byB0aGUgcGxhdGZvcm0gaG93IGZhciBwYXN0IGBjdXJyZW50X3BsYXliYWNrX3Bvc2l0aW9uYCB0aGUgYXBwCi13aWxsIHdyaXRlIGF1ZGlvIHNhbXBsZXMuIFRoZSBhcHAgd2lsbCB3cml0ZSBhbGwgc2FtcGxlcyBiZXR3ZWVuCi1gY3VycmVudF9wbGF5YmFja19wb3NpdGlvbmAgYW5kIGBjdXJyZW50X3BsYXliYWNrX3Bvc2l0aW9uYCArIGBkdXJhdGlvbmAsIGFzCi1zb29uIGFzIHRoZXkgYXJlIGF2YWlsYWJsZS4gVGhlIGFwcCBtYXkgc29tZXRpbWVzIHdyaXRlIG1vcmUgc2FtcGxlcyB0aGFuIHRoYXQsCi1idXQgdGhlIGFwcCBvbmx5IGd1YXJhbnRlZXMgdG8gd3JpdGUgYGR1cmF0aW9uYCBwYXN0IGBjdXJyZW50X3BsYXliYWNrX3Bvc2l0aW9uYAotaW4gZ2VuZXJhbC4gVGhlIHBsYXRmb3JtIGlzIHJlc3BvbnNpYmxlIGZvciBndWFyYW50ZWVpbmcgdGhhdCB3aGVuIG9ubHkKLWBkdXJhdGlvbmAgYXVkaW8gc2FtcGxlcyBhcmUgd3JpdHRlbiBhdCBhIHRpbWUsIG5vIHBsYXliYWNrIGlzc3VlcyBvY2N1ciAoc3VjaAotYXMgdHJhbnNpZW50IG9yIGluZGVmaW5pdGUgaGFuZ2luZykuIFRoZSBwbGF0Zm9ybSBtYXkgYXNzdW1lIGBkdXJhdGlvbmAgPj0gMC41Ci1zZWNvbmRzLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkIFNiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb24oU2JUaW1lIGR1cmF0aW9uKQotYGBgCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9tZW1vcnkubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9tZW1vcnkubWQKc2ltaWxhcml0eSBpbmRleCA3MiUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbWVtb3J5Lm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9tZW1vcnkubWQKaW5kZXggN2VhMWM1Yi4uMmZiZjdkYyAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbWVtb3J5Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L21lbW9yeS5tZApAQCAtNDYsMTYgKzQ2LDYgQEAKIAogIyMgRnVuY3Rpb25zICMjCiAKLSMjIyBTYk1lbW9yeUFsaWduVG9QYWdlU2l6ZSAjIyMKLQotUm91bmRzIGBzaXplYCB1cCB0byBrU2JNZW1vcnlQYWdlU2l6ZS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotc3RhdGljIHNpemVfdCBTYk1lbW9yeUFsaWduVG9QYWdlU2l6ZShzaXplX3Qgc2l6ZSkKLWBgYAotCiAjIyMgU2JNZW1vcnlBbGxvY2F0ZSAjIyMKIAogQWxsb2NhdGVzIGFuZCByZXR1cm5zIGEgY2h1bmsgb2YgbWVtb3J5IG9mIGF0IGxlYXN0IGBzaXplYCBieXRlcy4gVGhpcyBmdW5jdGlvbgpAQCAtMTY4LDQ2ICsxNTgsNiBAQAogc3RhdGljIHZvaWQqIFNiTWVtb3J5Q2FsbG9jKHNpemVfdCBjb3VudCwgc2l6ZV90IHNpemUpCiBgYGAKIAotIyMjIFNiTWVtb3J5Q29tcGFyZSAjIyMKLQotQ29tcGFyZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBgY291bnRgIGJ5dGVzIG9mIGBidWZmZXIxYCBhbmQgYGJ1ZmZlcjJgLgotVGhpcyBmdW5jdGlvbiByZXR1cm5zOgotCi0qICAgYC0xYCBpZiBgYnVmZmVyMWAgaXMgImxlc3MtdGhhbiIgYGJ1ZmZlcjJgCi0KLSogICBgMGAgaWYgYGJ1ZmZlcjFgIGFuZCBgYnVmZmVyMmAgYXJlIGVxdWFsCi0KLSogICBgMWAgaWYgYGJ1ZmZlcjFgIGlzICJncmVhdGVyLXRoYW4iIGBidWZmZXIyYC4KLQotVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBtZW1jbXBgLgotCi1gYnVmZmVyMWA6IFRoZSBmaXJzdCBidWZmZXIgdG8gYmUgY29tcGFyZWQuIGBidWZmZXIyYDogVGhlIHNlY29uZCBidWZmZXIgdG8gYmUKLWNvbXBhcmVkLiBgY291bnRgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvbXBhcmVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1pbnQgU2JNZW1vcnlDb21wYXJlKGNvbnN0IHZvaWQgKmJ1ZmZlcjEsIGNvbnN0IHZvaWQgKmJ1ZmZlcjIsIHNpemVfdCBjb3VudCkKLWBgYAotCi0jIyMgU2JNZW1vcnlDb3B5ICMjIwotCi1Db3BpZXMgYGNvdW50YCBzZXF1ZW50aWFsIGJ5dGVzIGZyb20gYHNvdXJjZWAgdG8gYGRlc3RpbmF0aW9uYCwgd2l0aG91dCBzdXBwb3J0Ci1mb3IgdGhlIGBzb3VyY2VgIGFuZCBgZGVzdGluYXRpb25gIHJlZ2lvbnMgb3ZlcmxhcHBpbmcuIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQKLXRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYG1lbWNweWAuCi0KLVRoZSBmdW5jdGlvbidzIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBgZGVzdGluYXRpb25gIG9yIGBzb3VyY2VgIGFyZSBOVUxMLCBhbmQKLXRoZSBmdW5jdGlvbiBpcyBhIG5vLW9wIGlmIGBjb3VudGAgaXMgMC4gVGhlIHJldHVybiB2YWx1ZSBpcyBgZGVzdGluYXRpb25gLgotCi1gZGVzdGluYXRpb25gOiBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGNvcGllZCBtZW1vcnkuIGBzb3VyY2VgOiBUaGUgc291cmNlIG9mIHRoZQotY29waWVkIG1lbW9yeS4gYGNvdW50YDogVGhlIG51bWJlciBvZiBzZXF1ZW50aWFsIGJ5dGVzIHRvIGJlIGNvcGllZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCogU2JNZW1vcnlDb3B5KHZvaWQgKmRlc3RpbmF0aW9uLCBjb25zdCB2b2lkICpzb3VyY2UsIHNpemVfdCBjb3VudCkKLWBgYAotCiAjIyMgU2JNZW1vcnlEZWFsbG9jYXRlICMjIwogCiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeS4gSWYgYG1lbW9yeWAgaXMgTlVMTCwgdGhlbiB0aGUKQEAgLTI0NCwxOCArMTk0LDYgQEAKIHZvaWQgU2JNZW1vcnlEZWFsbG9jYXRlTm9SZXBvcnQodm9pZCAqbWVtb3J5KQogYGBgCiAKLSMjIyBTYk1lbW9yeUZpbmRCeXRlICMjIwotCi1GaW5kcyB0aGUgbG93ZXIgOC1iaXRzIG9mIGB2YWx1ZWAgaW4gdGhlIGZpcnN0IGBjb3VudGAgYnl0ZXMgb2YgYGJ1ZmZlcmAgYW5kCi1yZXR1cm5zIGVpdGhlciBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGZvdW5kIG9jY3VycmVuY2Ugb3IgYE5VTExgIGlmIHRoZSB2YWx1ZSBpcwotbm90IGZvdW5kLiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYG1lbWNocmAuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLWNvbnN0IHZvaWQqIFNiTWVtb3J5RmluZEJ5dGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQgdmFsdWUsIHNpemVfdCBjb3VudCkKLWBgYAotCiAjIyMgU2JNZW1vcnlGbHVzaCAjIyMKIAogRmx1c2hlcyBhbnkgZGF0YSBpbiB0aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzIHJhbmdlIHRoYXQgaXMgY2FjaGVkIGxvY2FsbHkgaW4KQEAgLTI5NSwzOSArMjMzLDYgQEAKIHZvaWQgU2JNZW1vcnlGcmVlQWxpZ25lZCh2b2lkICptZW1vcnkpCiBgYGAKIAotIyMjIFNiTWVtb3J5R2V0U3RhY2tCb3VuZHMgIyMjCi0KLUdldHMgdGhlIHN0YWNrIGJvdW5kcyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotCi1gb3V0X2hpZ2hgOiBUaGUgaGlnaGVzdCBhZGRyZXNzYWJsZSBieXRlICsgMSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBgb3V0X2xvd2A6Ci1UaGUgbG93ZXN0IGFkZHJlc3NhYmxlIGJ5dGUgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCBTYk1lbW9yeUdldFN0YWNrQm91bmRzKHZvaWQgKipvdXRfaGlnaCwgdm9pZCAqKm91dF9sb3cpCi1gYGAKLQotIyMjIFNiTWVtb3J5SXNBbGlnbmVkICMjIwotCi1DaGVja3Mgd2hldGhlciBgbWVtb3J5YCBpcyBhbGlnbmVkIHRvIGBhbGlnbm1lbnRgIGJ5dGVzLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1zdGF0aWMgYm9vbCBTYk1lbW9yeUlzQWxpZ25lZChjb25zdCB2b2lkICptZW1vcnksIHNpemVfdCBhbGlnbm1lbnQpCi1gYGAKLQotIyMjIFNiTWVtb3J5SXNaZXJvICMjIwotCi1SZXR1cm5zIHRydWUgaWYgdGhlIGZpcnN0IGBjb3VudGAgYnl0ZXMgb2YgYGJ1ZmZlcmAgYXJlIHNldCB0byB6ZXJvLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1zdGF0aWMgYm9vbCBTYk1lbW9yeUlzWmVybyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCkKLWBgYAotCiAjIyMgU2JNZW1vcnlNYXAgIyMjCiAKIEFsbG9jYXRlcyBgc2l6ZV9ieXRlc2Agd29ydGggb2YgcGh5c2ljYWwgbWVtb3J5IHBhZ2VzIGFuZCBtYXBzIHRoZW0gaW50byBhbgpAQCAtMzQ5LDI0ICsyNTQsNiBAQAogdm9pZCogU2JNZW1vcnlNYXAoaW50NjRfdCBzaXplX2J5dGVzLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCiBgYGAKIAotIyMjIFNiTWVtb3J5TW92ZSAjIyMKLQotQ29waWVzIGBjb3VudGAgc2VxdWVudGlhbCBieXRlcyBmcm9tIGBzb3VyY2VgIHRvIGBkZXN0aW5hdGlvbmAsIHdpdGggc3VwcG9ydCBmb3IKLXRoZSBgc291cmNlYCBhbmQgYGRlc3RpbmF0aW9uYCByZWdpb25zIG92ZXJsYXBwaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlCi1hIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBtZW1tb3ZlYC4KLQotVGhlIGZ1bmN0aW9uJ3MgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIGBkZXN0aW5hdGlvbmAgb3IgYHNvdXJjZWAgYXJlIE5VTEwsIGFuZAotdGhlIGZ1bmN0aW9uIGlzIGEgbm8tb3AgaWYgYGNvdW50YCBpcyAwLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGBkZXN0aW5hdGlvbmAuCi0KLWBkZXN0aW5hdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY29waWVkIG1lbW9yeS4gYHNvdXJjZWA6IFRoZSBzb3VyY2Ugb2YgdGhlCi1jb3BpZWQgbWVtb3J5LiBgY291bnRgOiBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgYnl0ZXMgdG8gYmUgY29waWVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkKiBTYk1lbW9yeU1vdmUodm9pZCAqZGVzdGluYXRpb24sIGNvbnN0IHZvaWQgKnNvdXJjZSwgc2l6ZV90IGNvdW50KQotYGBgCi0KICMjIyBTYk1lbW9yeVByb3RlY3QgIyMjCiAKIENoYW5nZSB0aGUgcHJvdGVjdGlvbiBvZiBgc2l6ZV9ieXRlc2Agb2YgbWVtb3J5IHJlZ2lvbnMsIHN0YXJ0aW5nIGZyb20KQEAgLTQzMCwyNCArMzE3LDYgQEAKIHZvaWQqIFNiTWVtb3J5UmVhbGxvY2F0ZVVuY2hlY2tlZCh2b2lkICptZW1vcnksIHNpemVfdCBzaXplKQogYGBgCiAKLSMjIyBTYk1lbW9yeVNldCAjIyMKLQotRmlsbHMgYGNvdW50YCBzZXF1ZW50aWFsIGJ5dGVzIHN0YXJ0aW5nIGF0IGBkZXN0aW5hdGlvbmAsIHdpdGggdGhlIHVuc2lnbmVkIGNoYXIKLWNvZXJjaW9uIG9mIGBieXRlX3ZhbHVlYC4gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCi1gbWVtc2V0YC4KLQotVGhlIGZ1bmN0aW9uJ3MgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIGBkZXN0aW5hdGlvbmAgaXMgTlVMTCwgYW5kIHRoZSBmdW5jdGlvbgotaXMgYSBuby1vcCBpZiBgY291bnRgIGlzIDAuIFRoZSByZXR1cm4gdmFsdWUgaXMgYGRlc3RpbmF0aW9uYC4KLQotYGRlc3RpbmF0aW9uYDogVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb3BpZWQgbWVtb3J5LiBgY291bnRgOiBUaGUgbnVtYmVyIG9mCi1zZXF1ZW50aWFsIGJ5dGVzIHRvIGJlIHNldC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCogU2JNZW1vcnlTZXQodm9pZCAqZGVzdGluYXRpb24sIGludCBieXRlX3ZhbHVlLCBzaXplX3QgY291bnQpCi1gYGAKLQogIyMjIFNiTWVtb3J5VW5tYXAgIyMjCiAKIFVubWFwIGBzaXplX2J5dGVzYCBvZiBwaHlzaWNhbCBwYWdlcyBzdGFydGluZyBmcm9tIGB2aXJ0dWFsX2FkZHJlc3NgLCByZXR1cm5pbmcKQEAgLTQ2Myw0ICszMzIsMyBAQAogYGBgCiBib29sIFNiTWVtb3J5VW5tYXAodm9pZCAqdmlydHVhbF9hZGRyZXNzLCBpbnQ2NF90IHNpemVfYnl0ZXMpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbWVtb3J5X3JlcG9ydGVyLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvbWVtb3J5X3JlcG9ydGVyLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL21lbW9yeV9yZXBvcnRlci5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvbWVtb3J5X3JlcG9ydGVyLm1kCmluZGV4IDRiNGE1MzkuLmQ2N2VmMWEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL21lbW9yeV9yZXBvcnRlci5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9tZW1vcnlfcmVwb3J0ZXIubWQKQEAgLTEwMSw0ICsxMDEsMyBAQAogYGBgCiBib29sIFNiTWVtb3J5U2V0UmVwb3J0ZXIoc3RydWN0IFNiTWVtb3J5UmVwb3J0ZXIgKnRyYWNrZXIpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbWljcm9waG9uZS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L21pY3JvcGhvbmUubWQKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbWljcm9waG9uZS5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvbWljcm9waG9uZS5tZAppbmRleCAxMzc5Zjg2Li5kNzYwZTFlIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9taWNyb3Bob25lLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L21pY3JvcGhvbmUubWQKQEAgLTI2MCw0ICsyNjAsMyBAQAogYGBgCiBpbnQgU2JNaWNyb3Bob25lUmVhZChTYk1pY3JvcGhvbmUgbWljcm9waG9uZSwgdm9pZCAqb3V0X2F1ZGlvX2RhdGEsIGludCBhdWRpb19kYXRhX3NpemUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbXV0ZXgubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9tdXRleC5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9tdXRleC5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvbXV0ZXgubWQKaW5kZXggNThmMTkwNy4uMDVkZDgxMCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvbXV0ZXgubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvbXV0ZXgubWQKQEAgLTEyNSw0ICsxMjUsMyBAQAogYGBgCiBib29sIFNiTXV0ZXhSZWxlYXNlKFNiTXV0ZXggKm11dGV4KQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL29uY2UubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9vbmNlLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL29uY2UubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L29uY2UubWQKaW5kZXggY2UzYzRkNi4uMmFkMTk1OSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvb25jZS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9vbmNlLm1kCkBAIC01NSw0ICs1NSwzIEBACiBgYGAKIGJvb2wgU2JPbmNlKFNiT25jZUNvbnRyb2wgKm9uY2VfY29udHJvbCwgU2JPbmNlSW5pdFJvdXRpbmUgaW5pdF9yb3V0aW5lKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3BsYXllci5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3BsYXllci5tZApzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9wbGF5ZXIubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3BsYXllci5tZAppbmRleCBkNjkxMGUyLi44MDM5ZjZiIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9wbGF5ZXIubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvcGxheWVyLm1kCkBAIC0yMiw2ICsyMiwxNCBAQAogCiBXZWxsLWRlZmluZWQgdmFsdWUgZm9yIGFuIGludmFsaWQgcGxheWVyLgogCisjIyMga1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsICMjIworCitUaGUgYXVkaW8gd3JpdGUgZHVyYXRpb24gd2hlbiBhbGwgdGhlIGF1ZGlvIGNvbm5lY3RvcnMgYXJlIGxvY2FsLgorCisjIyMga1NiUGxheWVyV3JpdGVEdXJhdGlvblJlbW90ZSAjIyMKKworVGhlIGF1ZGlvIHdyaXRlIGR1cmF0aW9uIHdoZW4gYXQgbGVhc3Qgb25lIG9mIHRoZSBhdWRpbyBjb25uZWN0b3JzIGFyZSByZW1vdGUuCisKICMjIEVudW1zICMjCiAKICMjIyBTYlBsYXllckRlY29kZXJTdGF0ZSAjIyMKQEAgLTE1OSwxNSArMTY3LDE1IEBACiAgICAgUHJvdmlkZXMgYW4gYXBwcm9wcmlhdGUgRFJNIHN5c3RlbSBpZiB0aGUgbWVkaWEgc3RyZWFtIGhhcyBlbmNyeXB0ZWQKICAgICBwb3J0aW9ucy4gSXQgd2lsbCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBoYXZlCiAgICAgZW5jcnlwdGVkIHBvcnRpb25zLgotKiAgIGBTYk1lZGlhQXVkaW9TYW1wbGVJbmZvIGF1ZGlvX3NhbXBsZV9pbmZvYAorKiAgIGBTYk1lZGlhQXVkaW9TdHJlYW1JbmZvIGF1ZGlvX3N0cmVhbV9pbmZvYAogCi0gICAgQ29udGFpbnMgYSBwb3B1bGF0ZWQgU2JNZWRpYUF1ZGlvU2FtcGxlSW5mbyBpZiBgYXVkaW9fc2FtcGxlX2luZm8uY29kZWNgCi0gICAgaXNuJ3QgYGtTYk1lZGlhQXVkaW9Db2RlY05vbmVgLiBXaGVuIGBhdWRpb19zYW1wbGVfaW5mby5jb2RlY2AgaXMKKyAgICBDb250YWlucyBhIHBvcHVsYXRlZCBTYk1lZGlhQXVkaW9TdHJlYW1JbmZvIGlmIGBhdWRpb19zdHJlYW1faW5mby5jb2RlY2AKKyAgICBpc24ndCBga1NiTWVkaWFBdWRpb0NvZGVjTm9uZWAuIFdoZW4gYGF1ZGlvX3N0cmVhbV9pbmZvLmNvZGVjYCBpcwogICAgIGBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lYCwgdGhlIHZpZGVvIGRvZXNuJ3QgaGF2ZSBhbiBhdWRpbyB0cmFjay4KLSogICBgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyB2aWRlb19zYW1wbGVfaW5mb2AKKyogICBgU2JNZWRpYVZpZGVvU3RyZWFtSW5mbyB2aWRlb19zdHJlYW1faW5mb2AKIAotICAgIENvbnRhaW5zIGEgcG9wdWxhdGVkIFNiTWVkaWFWaWRlb1NhbXBsZUluZm8gaWYgYHZpZGVvX3NhbXBsZV9pbmZvLmNvZGVjYAotICAgIGlzbid0IGBrU2JNZWRpYVZpZGVvQ29kZWNOb25lYC4gV2hlbiBgdmlkZW9fc2FtcGxlX2luZm8uY29kZWNgIGlzCisgICAgQ29udGFpbnMgYSBwb3B1bGF0ZWQgU2JNZWRpYVZpZGVvU3RyZWFtSW5mbyBpZiBgdmlkZW9fc3RyZWFtX2luZm8uY29kZWNgCisgICAgaXNuJ3QgYGtTYk1lZGlhVmlkZW9Db2RlY05vbmVgLiBXaGVuIGB2aWRlb19zdHJlYW1faW5mby5jb2RlY2AgaXMKICAgICBga1NiTWVkaWFWaWRlb0NvZGVjTm9uZWAsIHRoZSB2aWRlbyBpcyBhdWRpbyBvbmx5LgogKiAgIGBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVgCiAKQEAgLTE3OCw3ICsxODYsNyBAQAogICAgIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHB1bGwgdmlhIGNhbGxzIHRvCiAgICAgU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoKS4KIAotIyMjIFNiUGxheWVySW5mbzIgIyMjCisjIyMgU2JQbGF5ZXJJbmZvICMjIwogCiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBtZWRpYSBwbGF5YmFjayBzdGF0ZS4KIApAQCAtMjMxLDcgKzIzOSw3IEBACiAKICMjIyBTYlBsYXllclNhbXBsZUluZm8gIyMjCiAKLUluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlMi4KK0luZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlcygpLgogCiAjIyMjIE1lbWJlcnMgIyMjIwogCkBAIC0yOTcsNyArMzA1LDcgQEAKIAogKiAgIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHBhc3MgYHBsYXllcmAgaW50byBhbnkgb3RoZXIgYFNiUGxheWVyYCBmdW5jdGlvbiBvbmNlCiAgICAgU2JQbGF5ZXJEZXN0cm95IGhhcyBiZWVuIGNhbGxlZCBvbiB0aGF0IHBsYXllci4gYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8gYmUKLSAgICBkZXN0cm95ZWQuCisgICAgZGVzdHJveWVkLiBNdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMDUsNiArMzEzLDcwIEBACiB2b2lkIFNiUGxheWVyRGVzdHJveShTYlBsYXllciBwbGF5ZXIpCiBgYGAKIAorIyMjIFNiUGxheWVyR2V0QXVkaW9Db25maWd1cmF0aW9uICMjIworCitSZXR1cm5zIHRoZSBhdWRpbyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGBwbGF5ZXJgLgorCitSZXR1cm5zIHRydWUgd2hlbiBgb3V0X2F1ZGlvX2NvbmZpZ3VyYXRpb25gIGlzIGZpbGxlZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBvZgordGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHVzZWQgYnkgYHBsYXllcmAuIFJldHVybnMgZmFsc2UKK2ZvciBgaW5kZXhgIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBhdWRpbyBvdXRwdXQgZm9yIHRoaXMgYHBsYXllcmAuCitSZXR1cm5zIGZhbHNlIGZvciBgaW5kZXhgIGdyZWF0ZXIgdGhhbiAwIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUKK2F1ZGlvIG91dHB1dCBjb25maWd1cmF0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmVzIGFscmVhZHkgcmV0dXJuZWQuCisKK1RoZSBhcHAgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHRvIGRldGVybWluZSBhdWRpbyByZWxhdGVkIGJlaGF2aW9ycywKK2xpa2U6CisKK0F1ZGlvIFdyaXRlIER1cmF0aW9uOiBBdWRpbyB3cml0ZSBkdXJhdGlvbiBpcyBob3cgZmFyIHBhc3QgdGhlIGN1cnJlbnQgcGxheWJhY2sKK3Bvc2l0aW9uIHRoZSBhcHAgd2lsbCB3cml0ZSBhdWRpbyBzYW1wbGVzLiBUaGUgYXBwIHdpbGwgd3JpdGUgYWxsIHNhbXBsZXMKK2JldHdlZW4gYGN1cnJlbnRfcGxheWJhY2tfcG9zaXRpb25gIGFuZCBgY3VycmVudF9wbGF5YmFja19wb3NpdGlvbmAgKworYGF1ZGlvX3dyaXRlX2R1cmF0aW9uYCwgYXMgc29vbiBhcyB0aGV5IGFyZSBhdmFpbGFibGUuCisKK2BhdWRpb193cml0ZV9kdXJhdGlvbmAgd2lsbCBiZSB0byBga1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsYAora1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsIHdoZW4gYWxsIGF1ZGlvIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB0byBgcGxheWVyYCBpcworbG9jYWwsIG9yIGlmIHRoZXJlIGlzbid0IGFueSBhdWRpbyBvdXRwdXQuIEl0IHdpbGwgYmUgc2V0IHRvCitga1NiUGxheWVyV3JpdGVEdXJhdGlvblJlbW90ZWAga1NiUGxheWVyV3JpdGVEdXJhdGlvblJlbW90ZSBmb3IgcmVtb3RlIG9yCit3aXJlbGVzcyBhdWRpbyBvdXRwdXRzLCBpLmUuIG9uZSBvZiBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckJsdWV0b290aGAKK2tTYk1lZGlhQXVkaW9Db25uZWN0b3JCbHVldG9vdGggb3IgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JSZW1vdGUqYAora1NiTWVkaWFBdWRpb0Nvbm5lY3RvclJlbW90ZSogLgorCitUaGUgYXBwIG9ubHkgZ3VhcmFudGVlcyB0byB3cml0ZSBgYXVkaW9fd3JpdGVfZHVyYXRpb25gIHBhc3QKK2BjdXJyZW50X3BsYXliYWNrX3Bvc2l0aW9uYCwgYnV0IHRoZSBhcHAgaXMgZnJlZSB0byB3cml0ZSBtb3JlIHNhbXBsZXMgdGhhbgordGhhdC4gU28gdGhlIHBsYXRmb3JtIHNob3VsZG4ndCByZWx5IG9uIHRoaXMgZm9yIGZsb3cgY29udHJvbC4gVGhlIHBsYXRmb3JtCitzaG91bGQgYWNoaWV2ZSBmbG93IGNvbnRyb2wgYnkgc2VuZGluZyBga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhYAora1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhIGxlc3MgZnJlcXVlbnRseS4KKworVGhlIHBsYXRmb3JtIGlzIHJlc3BvbnNpYmxlIGZvciBndWFyYW50ZWVpbmcgdGhhdCB3aGVuIG9ubHkKK2BhdWRpb193cml0ZV9kdXJhdGlvbmAgYXVkaW8gc2FtcGxlcyBhcmUgd3JpdHRlbiBhdCBhIHRpbWUsIG5vIHBsYXliYWNrIGlzc3Vlcworb2NjdXIgKHN1Y2ggYXMgdHJhbnNpZW50IG9yIGluZGVmaW5pdGUgaGFuZ2luZykuCisKK1RoZSBhdWRpbyBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgYXZhaWxhYmxlIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCB0aGV5IGhhdmUKK3RvIGJlIGF2YWlsYWJsZSB3aGVuIHRoZSBgcGxheWVyYCBpcyBhdCBga1NiUGxheWVyU3RhdGVQcmVzZW50aW5nYAora1NiUGxheWVyU3RhdGVQcmVzZW50aW5nICwgdW5sZXNzIHRoZSBhdWRpbyBjb2RlYyBpcyBga1NiTWVkaWFBdWRpb0NvZGVjTm9uZWAgb3IKK3RoZXJlJ3Mgbm8gd3JpdHRlbiBhdWRpbyBpbnB1dHMuCisKK1RoZSBhcHAgd2lsbCBzZXQgYGF1ZGlvX3dyaXRlX2R1cmF0aW9uYCB0byBga1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsYAora1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsIHdoZW4gdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gaXNuJ3QgYXZhaWxhYmxlIChpLmUuCit0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIGluZGV4IGlzIDApLiBUaGUgcGxhdGZvcm0gaGFzIHRvIG1ha2UgdGhlIGF1ZGlvCitjb25maWd1cmF0aW9uIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgU2JQbGF5ZXIgaXMgY3JlYXRlZCwgaWYgaXQgZXhwZWN0cwordGhlIGFwcCB0byB0cmVhdCB0aGUgcGxhdGZvcm0gYXMgdXNpbmcgd2lyZWxlc3MgYXVkaW8gb3V0cHV0cy4KKworT25jZSBhdCBsZWFzdCBvbmUgYXVkaW8gY29uZmlndXJhdGlvbnMgYXJlIHJldHVybmVkLCB0aGUgcmV0dXJuIHZhbHVlcyBhbmQgdGhlaXIKK29yZGVycyBzaG91bGRuJ3QgY2hhbmdlIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mIGBwbGF5ZXJgLiBUaGUgcGxhdGZvcm0gbWF5CitpbmZvcm0gdGhlIGFwcCBvZiBhbnkgY2hhbmdlcyBieSBzZW5kaW5nIGBrU2JQbGF5ZXJFcnJvckNhcGFiaWxpdHlDaGFuZ2VkYAora1NiUGxheWVyRXJyb3JDYXBhYmlsaXR5Q2hhbmdlZCB0byByZXF1ZXN0IGEgcGxheWJhY2sgcmVzdGFydC4KKworYHBsYXllcmA6IFRoZSBwbGF5ZXIgYWJvdXQgd2hpY2ggaW5mb3JtYXRpb24gaXMgYmVpbmcgcmV0cmlldmVkLiBNdXN0IG5vdCBiZQorYGtTYlBsYXllckludmFsaWRgLiBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIGF1ZGlvIG91dHB1dCBjb25maWd1cmF0aW9uLiBNdXN0CitiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gYG91dF9hdWRpb19jb25maWd1cmF0aW9uYDogVGhlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYXVkaW8gb3V0cHV0LCByZWZlciB0byBgU2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbmAgZm9yIG1vcmUgZGV0YWlscy4gTXVzdAorbm90IGJlIE5VTEwuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK2Jvb2wgU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb24oU2JQbGF5ZXIgcGxheWVyLCBpbnQgaW5kZXgsIFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24gKm91dF9hdWRpb19jb25maWd1cmF0aW9uKQorYGBgCisKICMjIyBTYlBsYXllckdldEN1cnJlbnRGcmFtZSAjIyMKIAogR2l2ZW4gYSBwbGF5ZXIgY3JlYXRlZCB3aXRoIHRoZSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlIG91dHB1dCBtb2RlLApAQCAtMzE1LDI2ICszODcsMTQgQEAKIHdpdGggYW4gb3V0cHV0IG1vZGUgb3RoZXIgdGhhbiBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLAoga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCBpcyByZXR1cm5lZC4KIAorYHBsYXllcmAgbXVzdCBub3QgYmUgYGtTYlBsYXllckludmFsaWRgLgorCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCiBTYkRlY29kZVRhcmdldCBTYlBsYXllckdldEN1cnJlbnRGcmFtZShTYlBsYXllciBwbGF5ZXIpCiBgYGAKIAotIyMjIFNiUGxheWVyR2V0SW5mbzIgIyMjCi0KLUdldHMgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBwbGF5ZXIgc3RhdGUgYW5kIHdyaXRlcyBpdCB0byBgb3V0X3BsYXllcl9pbmZvYC4KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCB2ZXJ5IGZyZXF1ZW50bHkgYW5kIGlzIGV4cGVjdGVkIHRvIGJlIGluZXhwZW5zaXZlLgotCi1gcGxheWVyYDogVGhlIHBsYXllciBhYm91dCB3aGljaCBpbmZvcm1hdGlvbiBpcyBiZWluZyByZXRyaWV2ZWQuCi1gb3V0X3BsYXllcl9pbmZvYDogVGhlIGluZm9ybWF0aW9uIHJldHJpZXZlZCBmb3IgdGhlIHBsYXllci4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCBTYlBsYXllckdldEluZm8yKFNiUGxheWVyIHBsYXllciwgU2JQbGF5ZXJJbmZvMiAqb3V0X3BsYXllcl9pbmZvMikKLWBgYAotCiAjIyMgU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUgIyMjCiAKIFdyaXRlcyBhIHNpbmdsZSBzYW1wbGUgb2YgdGhlIGdpdmVuIG1lZGlhIHR5cGUgdG8gYHBsYXllcmAncyBpbnB1dCBzdHJlYW0uIEl0cwpAQCAtMzcxLDcgKzQzMSw3IEBACiB0aGUgY2FsbC4gTm90ZSB0aGF0IGl0IGlzIG5vdCB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBmdW5jdGlvbiB0byB2ZXJpZnkKIHdoZXRoZXIgdGhlIHZpZGVvIGRlc2NyaWJlZCBieSBgY3JlYXRpb25fcGFyYW1gIGNhbiBiZSBwbGF5ZWQgb24gdGhlIHBsYXRmb3JtLAogYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdHJ5IGl0cyBiZXN0IGVmZm9ydCB0byByZXR1cm4gYSB2YWxpZCBvdXRwdXQgbW9kZS4KLWBjcmVhdGlvbl9wYXJhbWAgd2lsbCBuZXZlciBiZSBOVUxMLgorYGNyZWF0aW9uX3BhcmFtYCBtdXN0IG5vdCBiZSBOVUxMLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDAzLDEyICs0NjMsMTIgQEAKIGltcGxlbWVudG9ycyBzaG91bGQgdGFrZSBjYXJlIHRvIGF2b2lkIHJlbGF0ZWQgcGVyZm9ybWFuY2UgY29uY2VybnMgd2l0aCBzdWNoCiBmcmVxdWVudCBjYWxscy4KIAotYHBsYXllcmA6IFRoZSBwbGF5ZXIgdGhhdCBpcyBiZWluZyByZXNpemVkLiBgel9pbmRleGA6IFRoZSB6LWluZGV4IG9mIHRoZQotcGxheWVyLiBXaGVuIHRoZSBib3VuZHMgb2YgbXVsdGlwbGUgcGxheWVycyBhcmUgb3ZlcmxhcHBlZCwgdGhlIG9uZSB3aXRoIGxhcmdlcgotei1pbmRleCB3aWxsIGJlIHJlbmRlcmVkIG9uIHRvcCBvZiB0aGUgb25lcyB3aXRoIHNtYWxsZXIgei1pbmRleC4gYHhgOiBUaGUKLXgtY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4gYHlgOiBUaGUgeS1jb29yZGluYXRlIG9mCi10aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4gYHdpZHRoYDogVGhlIHdpZHRoIG9mIHRoZSBwbGF5ZXIsIGluCi1waXhlbHMuIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBwbGF5ZXIsIGluIHBpeGVscy4KK2BwbGF5ZXJgOiBUaGUgcGxheWVyIHRoYXQgaXMgYmVpbmcgcmVzaXplZC4gTXVzdCBub3QgYmUgYGtTYlBsYXllckludmFsaWRgLgorYHpfaW5kZXhgOiBUaGUgei1pbmRleCBvZiB0aGUgcGxheWVyLiBXaGVuIHRoZSBib3VuZHMgb2YgbXVsdGlwbGUgcGxheWVycyBhcmUKK292ZXJsYXBwZWQsIHRoZSBvbmUgd2l0aCBsYXJnZXIgei1pbmRleCB3aWxsIGJlIHJlbmRlcmVkIG9uIHRvcCBvZiB0aGUgb25lcyB3aXRoCitzbWFsbGVyIHotaW5kZXguIGB4YDogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4KK2B5YDogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4gYHdpZHRoYDogVGhlIHdpZHRoCitvZiB0aGUgcGxheWVyLCBpbiBwaXhlbHMuIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBwbGF5ZXIsIGluIHBpeGVscy4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTQyOSw2ICs0ODksOCBAQAogdW5jaGFuZ2VkLCB0aGlzIGNhbiBoYXBwZW4gd2hlbiBgcGxheWJhY2tfcmF0ZWAgaXMgbmVnYXRpdmUgb3IgaWYgaXQgaXMgdG9vIGhpZ2gKIHRvIHN1cHBvcnQuCiAKK2BwbGF5ZXJgIG11c3Qgbm90IGJlIGBrU2JQbGF5ZXJJbnZhbGlkYC4KKwogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYApAQCAtNDM5LDEwICs1MDEsMTAgQEAKIAogU2V0cyB0aGUgcGxheWVyJ3Mgdm9sdW1lLgogCi1gcGxheWVyYDogVGhlIHBsYXllciBpbiB3aGljaCB0aGUgdm9sdW1lIGlzIGJlaW5nIGFkanVzdGVkLiBgdm9sdW1lYDogVGhlIG5ldwotcGxheWVyIHZvbHVtZS4gVGhlIHZhbHVlIG11c3QgYmUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAsIGluY2x1c2l2ZS4gQSB2YWx1ZSBvZgotYDAuMGAgbWVhbnMgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlIG11dGVkLCBhbmQgYSB2YWx1ZSBvZiBgMS4wYCBtZWFucyB0aGF0IGl0Ci1zaG91bGQgYmUgcGxheWVkIGF0IGZ1bGwgdm9sdW1lLgorYHBsYXllcmA6IFRoZSBwbGF5ZXIgaW4gd2hpY2ggdGhlIHZvbHVtZSBpcyBiZWluZyBhZGp1c3RlZC4gTXVzdCBub3QgYmUKK2BrU2JQbGF5ZXJJbnZhbGlkYC4gYHZvbHVtZWA6IFRoZSBuZXcgcGxheWVyIHZvbHVtZS4gVGhlIHZhbHVlIG11c3QgYmUgYmV0d2VlbgorYDAuMGAgYW5kIGAxLjBgLCBpbmNsdXNpdmUuIEEgdmFsdWUgb2YgYDAuMGAgbWVhbnMgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlCittdXRlZCwgYW5kIGEgdmFsdWUgb2YgYDEuMGAgbWVhbnMgdGhhdCBpdCBzaG91bGQgYmUgcGxheWVkIGF0IGZ1bGwgdm9sdW1lLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDY2LDMxICs1MjgsMjAgQEAKIHZvaWQgU2JQbGF5ZXJXcml0ZUVuZE9mU3RyZWFtKFNiUGxheWVyIHBsYXllciwgU2JNZWRpYVR5cGUgc3RyZWFtX3R5cGUpCiBgYGAKIAotIyMjIFNiUGxheWVyV3JpdGVTYW1wbGUyICMjIworIyMjIFNiUGxheWVyV3JpdGVTYW1wbGVzICMjIwogCi1Xcml0ZXMgc2FtcGxlcyBvZiB0aGUgZ2l2ZW4gbWVkaWEgdHlwZSB0byBgcGxheWVyYCdzIGlucHV0IHN0cmVhbS4gVGhlIGxpZmV0aW1lCi1vZiBgc2FtcGxlX2luZm9zYCwgYW5kIHRoZSBtZW1iZXJzIG9mIGl0cyBlbGVtZW50cyBsaWtlIGBidWZmZXJgLAotYHZpZGVvX3NhbXBsZV9pbmZvYCwgYW5kIGBkcm1faW5mb2AgKGFzIHdlbGwgYXMgbWVtYmVyIGBzdWJzYW1wbGVfbWFwcGluZ2AKLWNvbnRhaW5lZCBpbnNpZGUgaXQpIGFyZSBub3QgZ3VhcmFudGVlZCBwYXN0IHRoZSBjYWxsIHRvIFNiUGxheWVyV3JpdGVTYW1wbGUyLgotVGhhdCBtZWFucyB0aGF0IGJlZm9yZSByZXR1cm5pbmcsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHN5bmNocm9ub3VzbHkgY29weSBhbnkKLWluZm9ybWF0aW9uIGl0IHdhbnRzIHRvIHJldGFpbiBmcm9tIHRob3NlIHN0cnVjdHVyZXMuCi0KLVNiUGxheWVyV3JpdGVTYW1wbGUyIGFsbG93cyB3cml0aW5nIG9mIG11bHRpcGxlIHNhbXBsZXMgaW4gb25lIGNhbGwuCi0KLWBwbGF5ZXJgOiBUaGUgcGxheWVyIHRvIHdoaWNoIHRoZSBzYW1wbGUgaXMgd3JpdHRlbi4gYHNhbXBsZV90eXBlYDogVGhlIHR5cGUgb2YKLXNhbXBsZSBiZWluZyB3cml0dGVuLiBTZWUgdGhlIGBTYk1lZGlhVHlwZWAgZW51bSBpbiBtZWRpYS5oLiBgc2FtcGxlX2luZm9zYDogQQotcG9pbnRlciB0byBhbiBhcnJheSBvZiBTYlBsYXllclNhbXBsZUluZm8gd2l0aCBgbnVtYmVyX29mX3NhbXBsZV9pbmZvc2AKLWVsZW1lbnRzLCBlYWNoIGhvbGRzIHRoZSBkYXRhIGZvciBhbiBzYW1wbGUsIGkuZS4gYSBzZXF1ZW5jZSBvZiB3aG9sZSBOQUwgVW5pdHMKLWZvciB2aWRlbywgb3IgYSBjb21wbGV0ZSBhdWRpbyBmcmFtZS4gYHNhbXBsZV9pbmZvc2AgY2Fubm90IGJlIGFzc3VtZWQgdG8gbGl2ZQotcGFzdCB0aGUgY2FsbCBpbnRvIFNiUGxheWVyV3JpdGVTYW1wbGUyKCksIHNvIGl0IG11c3QgYmUgY29waWVkIGlmIGl0cyBjb250ZW50Ci13aWxsIGJlIHVzZWQgYWZ0ZXIgU2JQbGF5ZXJXcml0ZVNhbXBsZTIoKSByZXR1cm5zLiBgbnVtYmVyX29mX3NhbXBsZV9pbmZvc2A6Ci1TcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBjb250YWluZWQgaW5zaWRlIGBzYW1wbGVfaW5mb3NgLiBJdCBoYXMgdG8gYmUgYXQKLWxlYXN0IG9uZSwgYW5kIGxlc3MgdGhhbiB0aGUgcmV0dXJuIHZhbHVlIG9mCitgc2FtcGxlX3R5cGVgOiBUaGUgdHlwZSBvZiBzYW1wbGUgYmVpbmcgd3JpdHRlbi4gU2VlIHRoZSBgU2JNZWRpYVR5cGVgIGVudW0gaW4KK21lZGlhLmguIGBzYW1wbGVfaW5mb3NgOiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU2JQbGF5ZXJTYW1wbGVJbmZvIHdpdGgKK2BudW1iZXJfb2Zfc2FtcGxlX2luZm9zYCBlbGVtZW50cywgZWFjaCBob2xkcyB0aGUgZGF0YSBmb3IgYW4gc2FtcGxlLCBpLmUuIGEKK3NlcXVlbmNlIG9mIHdob2xlIE5BTCBVbml0cyBmb3IgdmlkZW8sIG9yIGEgY29tcGxldGUgYXVkaW8gZnJhbWUuIGBzYW1wbGVfaW5mb3NgCitjYW5ub3QgYmUgYXNzdW1lZCB0byBsaXZlIHBhc3QgdGhlIGNhbGwgaW50byBTYlBsYXllcldyaXRlU2FtcGxlcygpLCBzbyBpdCBtdXN0CitiZSBjb3BpZWQgaWYgaXRzIGNvbnRlbnQgd2lsbCBiZSB1c2VkIGFmdGVyIFNiUGxheWVyV3JpdGVTYW1wbGVzKCkgcmV0dXJucy4KK2BudW1iZXJfb2Zfc2FtcGxlX2luZm9zYDogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgY29udGFpbmVkIGluc2lkZQorYHNhbXBsZV9pbmZvc2AuIEl0IGhhcyB0byBiZSBhdCBsZWFzdCBvbmUsIGFuZCBsZXNzIHRoYW4gdGhlIHJldHVybiB2YWx1ZSBvZgogU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUoKS4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYAotdm9pZCBTYlBsYXllcldyaXRlU2FtcGxlMihTYlBsYXllciBwbGF5ZXIsIFNiTWVkaWFUeXBlIHNhbXBsZV90eXBlLCBjb25zdCBTYlBsYXllclNhbXBsZUluZm8gKnNhbXBsZV9pbmZvcywgaW50IG51bWJlcl9vZl9zYW1wbGVfaW5mb3MpCit2b2lkIFNiUGxheWVyV3JpdGVTYW1wbGVzKFNiUGxheWVyIHBsYXllciwgU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUsIGNvbnN0IFNiUGxheWVyU2FtcGxlSW5mbyAqc2FtcGxlX2luZm9zLCBpbnQgbnVtYmVyX29mX3NhbXBsZV9pbmZvcykKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zb2NrZXQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9zb2NrZXQubWQKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc29ja2V0Lm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9zb2NrZXQubWQKaW5kZXggNTQ4ZjU3ZC4uOWUwZjgxYiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc29ja2V0Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3NvY2tldC5tZApAQCAtNDE3LDggKzQxNyw4IEBACiB0aGUgYWRkcmVzcyBpcyB1bm5lY2Vzc2FyeSwgYnV0IGFsbG93ZWQuCiAKIGBzb2NrZXRgOiBUaGUgU2JTb2NrZXQgZnJvbSB3aGljaCBkYXRhIGlzIHJlYWQuIGBvdXRfZGF0YWA6IFRoZSBkYXRhIHJlYWQgZnJvbQotdGhlIHNvY2tldC4gYGRhdGFfc2l6ZWA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4gYG91dF9zb3VyY2VgOiBUaGUgc291cmNlCi1hZGRyZXNzIG9mIHRoZSBwYWNrZXQuCit0aGUgc29ja2V0LiBNdXN0IG5vdCBiZSBOVUxMLiBgZGF0YV9zaXplYDogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorYG91dF9zb3VyY2VgOiBUaGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTQ1NiwxMCArNDU2LDEwIEBACiBTYlNvY2tldEdldExhc3RFcnJvciByZXR1cm5zIGBrU2JTb2NrZXRQZW5kaW5nYCB0byBtYWtlIGl0IGEgYmVzdC1lZmZvcnQgd3JpdGUKIChidXQgc3RpbGwgb25seSB1cCB0byBub3QgYmxvY2tpbmcsIHVubGVzcyB5b3Ugd2FudCB0byBzcGluKS4KIAotYHNvY2tldGA6IFRoZSBTYlNvY2tldCB0byB1c2UgdG8gd3JpdGUgZGF0YS4gYGRhdGFgOiBUaGUgZGF0YSByZWFkIGZyb20gdGhlCi1zb2NrZXQuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGBkYXRhYCB0byB3cml0ZS4gYGRlc3RpbmF0aW9uYDogVGhlCi1sb2NhdGlvbiB0byB3aGljaCBkYXRhIGlzIHdyaXR0ZW4uIFRoaXMgdmFsdWUgbXVzdCBiZSBgTlVMTGAgZm9yIFRDUAotY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgZW5kcG9pbnQuCitgc29ja2V0YDogVGhlIFNiU29ja2V0IHRvIHVzZSB0byB3cml0ZSBkYXRhLiBgZGF0YWA6IFRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlCitzb2NrZXQuIE11c3Qgbm90IGJlIE5VTEwuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGBkYXRhYCB0byB3cml0ZS4KK2BkZXN0aW5hdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCBkYXRhIGlzIHdyaXR0ZW4uIFRoaXMgdmFsdWUgbXVzdCBiZSBgTlVMTGAKK2ZvciBUQ1AgY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgZW5kcG9pbnQuCiAKIFRoZSBwcmltYXJ5IHVzZSBvZiBgZGVzdGluYXRpb25gIGlzIHRvIHNlbmQgZGF0YWdyYW0gcGFja2V0cywgd2hpY2ggY2FuIGdvIG91dAogdG8gbXVsdGlwbGUgc291cmNlcyBmcm9tIGEgc2luZ2xlIFVEUCBzZXJ2ZXIgc29ja2V0LiBUQ1AgaGFzIHR3byBlbmRwb2ludHMKQEAgLTU4Myw0ICs1ODMsMyBAQAogYGBgCiBib29sIFNiU29ja2V0U2V0VGNwV2luZG93U2NhbGluZyhTYlNvY2tldCBzb2NrZXQsIGJvb2wgdmFsdWUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc29ja2V0X3dhaXRlci5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3NvY2tldF93YWl0ZXIubWQKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc29ja2V0X3dhaXRlci5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc29ja2V0X3dhaXRlci5tZAppbmRleCA3MzhmYWZiLi44NTVkY2Y4IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zb2NrZXRfd2FpdGVyLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3NvY2tldF93YWl0ZXIubWQKQEAgLTIzNSw0ICsyMzUsMyBAQAogYGBgCiB2b2lkIFNiU29ja2V0V2FpdGVyV2FrZVVwKFNiU29ja2V0V2FpdGVyIHdhaXRlcikKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zcGVlY2hfc3ludGhlc2lzLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3BlZWNoX3N5bnRoZXNpcy5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zcGVlY2hfc3ludGhlc2lzLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9zcGVlY2hfc3ludGhlc2lzLm1kCmluZGV4IGU0NmEyY2EuLjE2MjIzMTggMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3NwZWVjaF9zeW50aGVzaXMubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3BlZWNoX3N5bnRoZXNpcy5tZApAQCAtNDksNCArNDksMyBAQAogYGBgCiB2b2lkIFNiU3BlZWNoU3ludGhlc2lzU3BlYWsoY29uc3QgY2hhciAqdGV4dCkKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zdG9yYWdlLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3RvcmFnZS5tZApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi9zdG9yYWdlLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9zdG9yYWdlLm1kCmluZGV4IGM5ODIwN2IuLmRiN2U5NTAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3N0b3JhZ2UubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3RvcmFnZS5tZApAQCAtMTU2LDQgKzE1NiwzIEBACiBgYGAKIGJvb2wgU2JTdG9yYWdlV3JpdGVSZWNvcmQoU2JTdG9yYWdlUmVjb3JkIHJlY29yZCwgY29uc3QgY2hhciAqZGF0YSwgaW50NjRfdCBkYXRhX3NpemUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3RyaW5nLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3RyaW5nLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWY1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9zdHJpbmcubWQKQEAgLTAsMCArMSwxNzQgQEAKKy0tLQorbGF5b3V0OiBkb2MKK3RpdGxlOiAiU3RhcmJvYXJkIE1vZHVsZSBSZWZlcmVuY2U6IHN0cmluZy5oIgorLS0tCisKK0RlZmluZXMgZnVuY3Rpb25zIGZvciBpbnRlcmFjdGluZyB3aXRoIGMtc3R5bGUgc3RyaW5ncy4KKworIyMgRnVuY3Rpb25zICMjCisKKyMjIyBTYlN0cmluZ0NvbXBhcmVOb0Nhc2UgIyMjCisKK0NvbXBhcmVzIHR3byBzdHJpbmdzLCBpZ25vcmluZyBkaWZmZXJlbmNlcyBpbiBjYXNlLiBUaGUgcmV0dXJuIHZhbHVlIGlzOgorCisqICAgYDwgMGAgaWYgYHN0cmluZzFgIGlzIEFTQ0lJLWJldGljYWxseSBsb3dlciB0aGFuIGBzdHJpbmcyYC4KKworKiAgIGAwYCBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIGVxdWFsLgorCisqICAgYD4gMGAgaWYgYHN0cmluZzFgIGlzIEFTQ0lJLWJldGljYWxseSBoaWdoZXIgdGhhbiBgc3RyaW5nMmAuCisKK1RoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBgc3RyY2FzZWNtcGAuCisKK2BzdHJpbmcxYDogVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLiBgc3RyaW5nMmA6IFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK2ludCBTYlN0cmluZ0NvbXBhcmVOb0Nhc2UoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMikKK2BgYAorCisjIyMgU2JTdHJpbmdDb21wYXJlTm9DYXNlTiAjIyMKKworQ29tcGFyZXMgdGhlIGZpcnN0IGBjb3VudGAgY2hhcmFjdGVycyBvZiB0d28gc3RyaW5ncywgaWdub3JpbmcgZGlmZmVyZW5jZXMgaW4KK2Nhc2UuIFRoZSByZXR1cm4gdmFsdWUgaXM6CisKKyogICBgPCAwYCBpZiBgc3RyaW5nMWAgaXMgQVNDSUktYmV0aWNhbGx5IGxvd2VyIHRoYW4gYHN0cmluZzJgLgorCisqICAgYDBgIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgZXF1YWwuCisKKyogICBgPiAwYCBpZiBgc3RyaW5nMWAgaXMgQVNDSUktYmV0aWNhbGx5IGhpZ2hlciB0aGFuIGBzdHJpbmcyYC4KKworVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBzdHJuY2FzZWNtcGAuCisKK2BzdHJpbmcxYDogVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLiBgc3RyaW5nMmA6IFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuCitgY291bnRgOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29tcGFyZS4KKworIyMjIyBEZWNsYXJhdGlvbiAjIyMjCisKK2BgYAoraW50IFNiU3RyaW5nQ29tcGFyZU5vQ2FzZU4oY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMiwgc2l6ZV90IGNvdW50KQorYGBgCisKKyMjIyBTYlN0cmluZ0R1cGxpY2F0ZSAjIyMKKworQ29waWVzIGBzb3VyY2VgIGludG8gYSBidWZmZXIgdGhhdCBpcyBhbGxvY2F0ZWQgYnkgdGhpcyBmdW5jdGlvbiBhbmQgdGhhdCBjYW4gYmUKK2ZyZWVkIHdpdGggU2JNZW1vcnlEZWFsbG9jYXRlLiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbgorcmVwbGFjZW1lbnQgZm9yIGBzdHJkdXBgLgorCitgc291cmNlYDogVGhlIHN0cmluZyB0byBiZSBjb3BpZWQuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK2NoYXIqIFNiU3RyaW5nRHVwbGljYXRlKGNvbnN0IGNoYXIgKnNvdXJjZSkKK2BgYAorCisjIyMgU2JTdHJpbmdGb3JtYXQgIyMjCisKK1Byb2R1Y2VzIGEgc3RyaW5nIGZvcm1hdHRlZCB3aXRoIGBmb3JtYXRgIGFuZCBgYXJndW1lbnRzYCwgcGxhY2luZyBhcyBtdWNoIG9mCit0aGUgcmVzdWx0IHRoYXQgd2lsbCBmaXQgaW50byBgb3V0X2J1ZmZlcmAuIFRoZSByZXR1cm4gdmFsdWUgc3BlY2lmaWVzIHRoZQorbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgZm9ybWF0IHdvdWxkIHByb2R1Y2UgaWYgYGJ1ZmZlcl9zaXplYCB3ZXJlCitpbmZpbml0ZS4KKworVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGB2c25wcmludGZgLgorCitgb3V0X2J1ZmZlcmA6IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBpcyBzdG9yZWQuIGBidWZmZXJfc2l6ZWA6CitUaGUgc2l6ZSBvZiBgb3V0X2J1ZmZlcmAuIGBmb3JtYXRgOiBBIHN0cmluZyB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGRhdGEgc2hvdWxkCitiZSBmb3JtYXR0ZWQuIGBhcmd1bWVudHNgOiBWYXJpYWJsZSBhcmd1bWVudHMgdXNlZCBpbiB0aGUgc3RyaW5nLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCitpbnQgU2JTdHJpbmdGb3JtYXQoY2hhciAqb3V0X2J1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJndW1lbnRzKSBTQl9QUklOVEZfRk9STUFUKDMKK2BgYAorCisjIyMgU2JTdHJpbmdGb3JtYXRGICMjIworCitBbiBpbmxpbmUgd3JhcHBlciBvZiBTYlN0cmluZ0Zvcm1hdCB0aGF0IGNvbnZlcnRzIGZyb20gZWxsaXBzaXMgdG8gdmFfYXJncy4gVGhpcworZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBgc25wcmludGZgLgorCitgb3V0X2J1ZmZlcmA6IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBpcyBzdG9yZWQuIGBidWZmZXJfc2l6ZWA6CitUaGUgc2l6ZSBvZiBgb3V0X2J1ZmZlcmAuIGBmb3JtYXRgOiBBIHN0cmluZyB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGRhdGEgc2hvdWxkCitiZSBmb3JtYXR0ZWQuIGAuLi5gOiBBcmd1bWVudHMgdXNlZCBpbiB0aGUgc3RyaW5nLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCitpbnQgc3RhdGljIGludCBzdGF0aWMgaW50IFNiU3RyaW5nRm9ybWF0RihjaGFyICpvdXRfYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIFNCX1BSSU5URl9GT1JNQVQoMworYGBgCisKKyMjIyBTYlN0cmluZ0Zvcm1hdFVuc2FmZUYgIyMjCisKK0FuIGlubGluZSB3cmFwcGVyIG9mIFNiU3RyaW5nRm9ybWF0IHRoYXQgaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50Citmb3IgdGhlIHVuc2FmZSBidXQgY29tbW9ubHkgdXNlZCBgc3ByaW50ZmAuCisKK2BvdXRfYnVmZmVyYDogVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGlzIHN0b3JlZC4gYGZvcm1hdGA6IEEKK3N0cmluZyB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlIGZvcm1hdHRlZC4gYC4uLmA6IEFyZ3VtZW50cyB1c2VkIGluCit0aGUgc3RyaW5nLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCitzdGF0aWMgaW50IHN0YXRpYyBpbnQgU2JTdHJpbmdGb3JtYXRVbnNhZmVGKGNoYXIgKm91dF9idWZmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIFNCX1BSSU5URl9GT1JNQVQoMgorYGBgCisKKyMjIyBTYlN0cmluZ0Zvcm1hdFdpZGUgIyMjCisKK1RoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIFNiU3RyaW5nRm9ybWF0LCBidXQgaXMgZm9yIHdpZGUgY2hhcmFjdGVycy4gSXQgaXMKK21lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHZzd3ByaW50ZmAuCisKK2BvdXRfYnVmZmVyYDogVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGlzIHN0b3JlZC4gYGJ1ZmZlcl9zaXplYDoKK1RoZSBzaXplIG9mIGBvdXRfYnVmZmVyYC4gYGZvcm1hdGA6IEEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgZGF0YSBzaG91bGQKK2JlIGZvcm1hdHRlZC4gYGFyZ3VtZW50c2A6IFZhcmlhYmxlIGFyZ3VtZW50cyB1c2VkIGluIHRoZSBzdHJpbmcuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK2ludCBTYlN0cmluZ0Zvcm1hdFdpZGUod2NoYXJfdCAqb3V0X2J1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJndW1lbnRzKQorYGBgCisKKyMjIyBTYlN0cmluZ0Zvcm1hdFdpZGVGICMjIworCitBbiBpbmxpbmUgd3JhcHBlciBvZiBTYlN0cmluZ0Zvcm1hdFdpZGUgdGhhdCBjb252ZXJ0cyBmcm9tIGVsbGlwc2lzIHRvCitgdmFfYXJnc2AuCisKK2BvdXRfYnVmZmVyYDogVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGlzIHN0b3JlZC4gYGJ1ZmZlcl9zaXplYDoKK1RoZSBzaXplIG9mIGBvdXRfYnVmZmVyYC4gYGZvcm1hdGA6IEEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgZGF0YSBzaG91bGQKK2JlIGZvcm1hdHRlZC4gYC4uLmA6IEFyZ3VtZW50cyB1c2VkIGluIHRoZSBzdHJpbmcuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK3N0YXRpYyBpbnQgU2JTdHJpbmdGb3JtYXRXaWRlRih3Y2hhcl90ICpvdXRfYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwuLi4pCitgYGAKKworIyMjIFNiU3RyaW5nU2NhbiAjIyMKKworU2NhbnMgYGJ1ZmZlcmAgZm9yIGBwYXR0ZXJuYCwgcGxhY2luZyB0aGUgZXh0cmFjdGVkIHZhbHVlcyBpbiBgYXJndW1lbnRzYC4gVGhlCityZXR1cm4gdmFsdWUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IG1hdGNoZWQgaXRlbXMsIHdoaWNoIG1heSBiZQorYDBgLgorCitUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHZzc2NhbmZgLgorCitgYnVmZmVyYDogVGhlIHN0cmluZyB0byBzY2FuIGZvciB0aGUgcGF0dGVybi4gYHBhdHRlcm5gOiBUaGUgc3RyaW5nIHRvIHNlYXJjaAorZm9yIGluIGBidWZmZXJgLiBgYXJndW1lbnRzYDogVmFsdWVzIG1hdGNoaW5nIGBwYXR0ZXJuYCB0aGF0IHdlcmUgZXh0cmFjdGVkIGZyb20KK2BidWZmZXJgLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCitpbnQgU2JTdHJpbmdTY2FuKGNvbnN0IGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqcGF0dGVybiwgdmFfbGlzdCBhcmd1bWVudHMpCitgYGAKKworIyMjIFNiU3RyaW5nU2NhbkYgIyMjCisKK0FuIGlubGluZSB3cmFwcGVyIG9mIFNiU3RyaW5nU2NhbiB0aGF0IGNvbnZlcnRzIGZyb20gZWxsaXBzaXMgdG8gYHZhX2FyZ3NgLiBUaGlzCitmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBzc2NhbmZgLiBgYnVmZmVyYDogVGhlIHN0cmluZwordG8gc2NhbiBmb3IgdGhlIHBhdHRlcm4uIGBwYXR0ZXJuYDogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yIGluIGBidWZmZXJgLiBgLi4uYDoKK1ZhbHVlcyBtYXRjaGluZyBgcGF0dGVybmAgdGhhdCB3ZXJlIGV4dHJhY3RlZCBmcm9tIGBidWZmZXJgLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCitzdGF0aWMgaW50IFNiU3RyaW5nU2NhbkYoY29uc3QgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpwYXR0ZXJuLC4uLikKK2BgYApkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvc3lzdGVtLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3lzdGVtLm1kCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3N5c3RlbS5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvc3lzdGVtLm1kCmluZGV4IDFmZTJkZGIuLjMyZmQzMDMgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3N5c3RlbS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS9zeXN0ZW0ubWQKQEAgLTI1LDYyICsyNSw2IEBACiAgICAgV2hldGhlciB0aGlzIHN5c3RlbSBoYXMgdGhlIGFiaWxpdHkgdG8gcmVwb3J0IG9uIEdQVSBtZW1vcnkgdXNhZ2UuIElmIChhbmQKICAgICBvbmx5IGlmKSBhIHN5c3RlbSBoYXMgdGhpcyBjYXBhYmlsaXR5IHdpbGwgU2JTeXN0ZW1HZXRUb3RhbEdQVU1lbW9yeSgpIGFuZAogICAgIFNiU3lzdGVtR2V0VXNlZEdQVU1lbW9yeSgpIGJlIHZhbGlkIHRvIGNhbGwuCi0qICAgYGtTYlN5c3RlbUNhcGFiaWxpdHlTZXRzSW5wdXRUaW1lc3RhbXBgCi0KLSAgICBXaGV0aGVyIHRoaXMgc3lzdGVtIHNldHMgdGhlIGB0aW1lc3RhbXBgIGZpZWxkIG9mIFNiSW5wdXREYXRhIC4gSWYgdGhlCi0gICAgc3lzdGVtIGRvZXMgbm90IHNldCB0aGlzIGZpZWxkLCB0aGVuIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBzZXQ7IGhvd2V2ZXIsCi0gICAgdGhlIHJlbGF0aXZlIHRpbWUgYmV0d2VlbiBpbnB1dCBldmVudHMgbGlrZWx5IHdpbGwgbm90IGJlIHByZXNlcnZlZCwgc28KLSAgICB0aW1lLXJlbGF0ZWQgY2FsY3VsYXRpb25zIChlLmcuIHZlbG9jaXR5IGZvciBtb3ZlIGV2ZW50cykgd2lsbCBiZSBpbmNvcnJlY3QuCi0KLSMjIyBTYlN5c3RlbUNvbm5lY3Rpb25UeXBlICMjIwotCi1FbnVtZXJhdGlvbiBvZiBuZXR3b3JrIGNvbm5lY3Rpb24gdHlwZXMuCi0KLSMjIyMgVmFsdWVzICMjIyMKLQotKiAgIGBrU2JTeXN0ZW1Db25uZWN0aW9uVHlwZVdpcmVkYAotCi0gICAgVGhlIHN5c3RlbSBpcyBvbiBhIHdpcmVkIGNvbm5lY3Rpb24uCi0qICAgYGtTYlN5c3RlbUNvbm5lY3Rpb25UeXBlV2lyZWxlc3NgCi0KLSAgICBUaGUgc3lzdGVtIGlzIG9uIGEgd2lyZWxlc3MgY29ubmVjdGlvbi4KLSogICBga1NiU3lzdGVtQ29ubmVjdGlvblR5cGVVbmtub3duYAotCi0gICAgVGhlIHN5c3RlbSBjb25uZWN0aW9uIHR5cGUgaXMgdW5rbm93bi4KLQotIyMjIFNiU3lzdGVtRGV2aWNlVHlwZSAjIyMKLQotRW51bWVyYXRpb24gb2YgZGV2aWNlIHR5cGVzLgotCi0jIyMjIFZhbHVlcyAjIyMjCi0KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZUJsdWVSYXlEaXNrUGxheWVyYAotCi0gICAgQmx1ZS1yYXkgRGlzYyBQbGF5ZXIgKEJEUCkuCi0qICAgYGtTYlN5c3RlbURldmljZVR5cGVHYW1lQ29uc29sZWAKLQotICAgIEEgcmVsYXRpdmVseSBoaWdoLXBvd2VyZWQgVFYgZGV2aWNlIHVzZWQgcHJpbWFyaWx5IGZvciBwbGF5aW5nIGdhbWVzLgotKiAgIGBrU2JTeXN0ZW1EZXZpY2VUeXBlT3ZlclRoZVRvcEJveGAKLQotICAgIE92ZXIgdGhlIHRvcCAoT1RUKSBkZXZpY2VzIHN0cmVhbSBjb250ZW50IHZpYSB0aGUgSW50ZXJuZXQgb3ZlciBhbm90aGVyIHR5cGUKLSAgICBvZiBuZXR3b3JrLCBlLmcuIGNhYmxlIG9yIHNhdGVsbGl0ZS4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZVNldFRvcEJveGAKLQotICAgIFNldCB0b3AgYm94ZXMgKFNUQnMpIHN0cmVhbSBjb250ZW50IHByaW1hcmlseSBvdmVyIGNhYmxlIG9yIHNhdGVsbGl0ZS4gU29tZQotICAgIFNUQnMgY2FuIGFsc28gc3RyZWFtIE9UVCBjb250ZW50IHZpYSB0aGUgSW50ZXJuZXQuCi0qICAgYGtTYlN5c3RlbURldmljZVR5cGVUVmAKLQotICAgIEEgU21hcnQgVFYgaXMgYSBUViB0aGF0IGNhbiBkaXJlY3RseSBydW4gYXBwbGljYXRpb25zIHRoYXQgc3RyZWFtIE9UVAotICAgIGNvbnRlbnQgdmlhIHRoZSBJbnRlcm5ldC4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZURlc2t0b3BQQ2AKLQotICAgIERlc2t0b3AgUEMuCi0qICAgYGtTYlN5c3RlbURldmljZVR5cGVBbmRyb2lkVFZgCi0KLSAgICBBbiBBbmRyb2lkIFRWIERldmljZS4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZVVua25vd25gCi0KLSAgICBVbmtub3duIGRldmljZS4KIAogIyMjIFNiU3lzdGVtUGF0aElkICMjIwogCkBAIC0xMTIsMTcgKzU2LDE1IEBACiAqICAgYGtTYlN5c3RlbVBhdGhUZW1wRGlyZWN0b3J5YAogCiAgICAgUGF0aCB0byBhIGRpcmVjdG9yeSB3aGVyZSB0ZW1wb3JhcnkgZmlsZXMgY2FuIGJlIHdyaXR0ZW4uCi0qICAgYGtTYlN5c3RlbVBhdGhUZXN0T3V0cHV0RGlyZWN0b3J5YAotCi0gICAgUGF0aCB0byBhIGRpcmVjdG9yeSB3aGVyZSB0ZXN0IHJlc3VsdHMgY2FuIGJlIHdyaXR0ZW4uCiAqICAgYGtTYlN5c3RlbVBhdGhFeGVjdXRhYmxlRmlsZWAKIAogICAgIEZ1bGwgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLgogKiAgIGBrU2JTeXN0ZW1QYXRoU3RvcmFnZURpcmVjdG9yeWAKIAotICAgIFBhdGggdG8gYSBkaXJlY3RvcnkgZm9yIHBlcm1hbmVudCBmaWxlIHN0b3JhZ2UuIEJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzCi0gICAgaXMgcmVxdWlyZWQuIFRoaXMgaXMgd2hlcmUgYW4gYXBwIG1heSBzdG9yZSBpdHMgcGVyc2lzdGVudCBzZXR0aW5ncy4gVGhlCi0gICAgbG9jYXRpb24gc2hvdWxkIGJlIHVzZXIgYWdub3N0aWMgaWYgcG9zc2libGUuCisgICAgUGF0aCB0byB0aGUgZGlyZWN0b3J5IGRlZGljYXRlZCBmb3IgRXZlcmdyZWVuIEZ1bGwgcGVybWFuZW50IGZpbGUgc3RvcmFnZS4KKyAgICBCb3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyByZXF1aXJlZC4gVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBvbmx5CisgICAgZm9yIHN0b3JpbmcgdGhlIHVwZGF0ZXMuIFNlZQorICAgIHN0YXJib2FyZC9kb2MvZXZlcmdyZWVuL2NvYmFsdF9ldmVyZ3JlZW5fb3ZlcnZpZXcubWQKIAogIyMjIFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlICMjIwogCkBAIC0xNTgsMTAgKzEwMCw2IEBACiAqICAgYGtTYlN5c3RlbVByb3BlcnR5Q2VydGlmaWNhdGlvblNjb3BlYAogCiAgICAgVGhlIGNlcnRpZmljYXRpb24gc2NvcGUgdGhhdCBpZGVudGlmaWVzIGEgZ3JvdXAgb2YgZGV2aWNlcy4KLSogICBga1NiU3lzdGVtUHJvcGVydHlCYXNlNjRFbmNvZGVkQ2VydGlmaWNhdGlvblNlY3JldGAKLQotICAgIFRoZSBITUFDLVNIQTI1NiBiYXNlNjQgZW5jb2RlZCBzeW1tZXRyaWMga2V5IHVzZWQgdG8gc2lnbiBhIHN1YnNldCBvZiB0aGUKLSAgICBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0dXAgVVJMLgogKiAgIGBrU2JTeXN0ZW1Qcm9wZXJ0eUNoaXBzZXRNb2RlbE51bWJlcmAKIAogICAgIFRoZSBmdWxsIG1vZGVsIG51bWJlciBvZiB0aGUgbWFpbiBwbGF0Zm9ybSBjaGlwc2V0LCBpbmNsdWRpbmcgYW55IHZlbmRvci0KQEAgLTIwNCw2ICsxNDIsMTkgQEAKICogICBga1NiU3lzdGVtUHJvcGVydHlVc2VyQWdlbnRBdXhGaWVsZGAKIAogICAgIEEgZmllbGQgdGhhdCwgaWYgYXZhaWxhYmxlLCBpcyBhcHBlbmRlZCB0byB0aGUgdXNlciBhZ2VudAorKiAgIGBrU2JTeXN0ZW1Qcm9wZXJ0eUFkdmVydGlzaW5nSWRgCisKKyAgICBBZHZlcnRpc2luZyBJRCBvciBJRkEsIHR5cGljYWxseSBhIDEyOC1iaXQgVVVJRCBQbGVhc2Ugc2VlIFtodHRwczovL2lhYnRlY2hsYWIuY29tL09UVC1JRkFdKGh0dHBzOi8vaWFidGVjaGxhYi5jb20vT1RULUlGQSkgZm9yCisgICAgZGV0YWlscy4gQ29ycmVzcG9uZHMgdG8gJ2lmYScgZmllbGQuIE5vdGU6IGBpZmFfdHlwZWAgaWZhX3R5cGUgZmllbGQgaXMgbm90CisgICAgcHJvdmlkZWQuCisqICAgYGtTYlN5c3RlbVByb3BlcnR5TGltaXRBZFRyYWNraW5nYAorCisgICAgTGltaXQgYWR2ZXJ0aXNpbmcgdHJhY2tpbmcsIHRyZWF0ZWQgYXMgYm9vbGVhbi4gU2V0IHRvIG5vbnplcm8gdG8gaW5kaWNhdGUgYQorICAgIHRydWUgdmFsdWUuIENvcnJlc3BvbmRzIHRvICdsbXQnIGZpZWxkLgorKiAgIGBrU2JTeXN0ZW1Qcm9wZXJ0eURldmljZVR5cGVgCisKKyAgICBUeXBlIG9mIHRoZSBkZXZpY2UsIGUuZy4gc3VjaCBhcyAiVFYiLCAiU1RCIiwgIk9UVCIgUGxlYXNlIHNlZSBZb3V0dWJlCisgICAgVGVjaG5pY2FsIHJlcXVpcmVtZW50cyBmb3IgYSBmdWxsIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXMKIAogIyMgVHlwZWRlZnMgIyMKIApAQCAtMjUyLDI2ICsyMDMsNiBAQAogCiAjIyBGdW5jdGlvbnMgIyMKIAotIyMjIFNiU3lzdGVtQmluYXJ5U2VhcmNoICMjIwotCi1CaW5hcnkgc2VhcmNoZXMgYSBzb3J0ZWQgdGFibGUgYGJhc2VgIG9mIGBlbGVtZW50X2NvdW50YCBvYmplY3RzLCBlYWNoIGVsZW1lbnQKLWBlbGVtZW50X3dpZHRoYCBieXRlcyBpbiBzaXplIGZvciBhbiBlbGVtZW50IHRoYXQgYGNvbXBhcmF0b3JgIGNvbXBhcmVzIGVxdWFsIHRvCi1ga2V5YC4KLQotVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBic2VhcmNoYC4KLQotYGtleWA6IFRoZSBrZXkgdG8gc2VhcmNoIGZvciBpbiB0aGUgdGFibGUuIGBiYXNlYDogVGhlIHNvcnRlZCB0YWJsZSBvZiBlbGVtZW50cwotdG8gYmUgc2VhcmNoZWQuIGBlbGVtZW50X2NvdW50YDogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUuCi1gZWxlbWVudF93aWR0aGA6IFRoZSBzaXplLCBpbiBieXRlcywgb2YgZWFjaCBlbGVtZW50IGluIHRoZSB0YWJsZS4gYGNvbXBhcmF0b3JgOgotQSB2YWx1ZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIGVsZW1lbnQgaW4gdGhlIHRhYmxlIHNob3VsZCBjb21wYXJlIHRvIHRoZQotc3BlY2lmaWVkIGBrZXlgLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkKiBTYlN5c3RlbUJpbmFyeVNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBlbGVtZW50X2NvdW50LCBzaXplX3QgZWxlbWVudF93aWR0aCwgU2JTeXN0ZW1Db21wYXJhdG9yIGNvbXBhcmF0b3IpCi1gYGAKLQogIyMjIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIgIyMjCiAKIEJyZWFrcyB0aGUgY3VycmVudCBwcm9ncmFtIGludG8gdGhlIGRlYnVnZ2VyLCBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLiBJZiBhCkBAIC0yOTMsMjYgKzIyNCw2IEBACiB2b2lkIFNiU3lzdGVtQ2xlYXJMYXN0RXJyb3IoKQogYGBgCiAKLSMjIyBTYlN5c3RlbUdldENvbm5lY3Rpb25UeXBlICMjIwotCi1SZXR1cm5zIHRoZSBkZXZpY2UncyBjdXJyZW50IG5ldHdvcmsgY29ubmVjdGlvbiB0eXBlLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1TYlN5c3RlbUNvbm5lY3Rpb25UeXBlIFNiU3lzdGVtR2V0Q29ubmVjdGlvblR5cGUoKQotYGBgCi0KLSMjIyBTYlN5c3RlbUdldERldmljZVR5cGUgIyMjCi0KLVJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRldmljZS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotU2JTeXN0ZW1EZXZpY2VUeXBlIFNiU3lzdGVtR2V0RGV2aWNlVHlwZSgpCi1gYGAKLQogIyMjIFNiU3lzdGVtR2V0RXJyb3JTdHJpbmcgIyMjCiAKIEdlbmVyYXRlcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgYW4gZXJyb3IuIFRoZSByZXR1cm4gdmFsdWUgc3BlY2lmaWVzIHRoZQpAQCAtMzMxLDcgKzI0Miw4IEBACiAjIyMgU2JTeXN0ZW1HZXRFeHRlbnNpb24gIyMjCiAKIFJldHVybnMgcG9pbnRlciB0byBhIGNvbnN0YW50IGdsb2JhbCBzdHJ1Y3QgaW1wbGVtZW50aW5nIHRoZSBleHRlbnNpb24gbmFtZWQKLWBuYW1lYCwgaWYgaXQgaXMgaW1wbGVtZW50ZWQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KK2BuYW1lYCwgaWYgaXQgaXMgaW1wbGVtZW50ZWQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4gVGhlIGBuYW1lYCBzdHJpbmcgbXVzdCBub3QKK2JlIE5VTEwuCiAKIEV4dGVuc2lvbnMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IGJlaGF2aW9yIHdoaWNoIGlzIHNwZWNpZmljIHRvIHRoZSBjb21iaW5hdGlvbgogb2YgYXBwbGljYXRpb24gJiBwbGF0Zm9ybS4gQW4gZXh0ZW5zaW9uIHJlbGllcyBvbiBhIGhlYWRlciBmaWxlIGluIHRoZQpAQCAtNTY0LDYgKzQ3NiwxOCBAQAogYm9vbCBTYlN5c3RlbUlzRGVidWdnZXJBdHRhY2hlZCgpCiBgYGAKIAorIyMjIFNiU3lzdGVtTmV0d29ya0lzRGlzY29ubmVjdGVkICMjIworCitSZXR1cm5zIGlmIHRoZSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkIGZyb20gbmV0d29yay4gIkRpc2Nvbm5lY3RlZCIgaXMgY2hvc2VuCitvdmVyIGNvbm5lY3RlZCBiZWNhdXNlIGRpc2Nvbm5lY3Rpb24gY2FuIGJlIGRldGVybWluZWQgd2l0aCBtb3JlIGNlcnRhaW50eSB0aGFuCitjb25uZWN0aW9uIHVzdWFsbHkuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK2Jvb2wgU2JTeXN0ZW1OZXR3b3JrSXNEaXNjb25uZWN0ZWQoKQorYGBgCisKICMjIyBTYlN5c3RlbVJhaXNlUGxhdGZvcm1FcnJvciAjIyMKIAogQ29iYWx0IGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gbm90aWZ5IHRoZSBwbGF0Zm9ybSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCBpbgpAQCAtNTkyLDIwICs1MTYsOTQgQEAKIGJvb2wgU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqdXNlcl9kYXRhKQogYGBgCiAKLSMjIyBTYlN5c3RlbVJlcXVlc3RQYXVzZSAjIyMKKyMjIyBTYlN5c3RlbVJlcXVlc3RCbHVyICMjIwogCi1SZXF1ZXN0cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtb3ZlIGludG8gdGhlIFBhdXNlZCBzdGF0ZSBhdCB0aGUgbmV4dCBjb252ZW5pZW50CitSZXF1ZXN0cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtb3ZlIGludG8gdGhlIEJsdXJyZWQgc3RhdGUgYXQgdGhlIG5leHQgY29udmVuaWVudAogcG9pbnQuIFRoaXMgc2hvdWxkIHJvdWdobHkgY29ycmVzcG9uZCB0byAidW5mb2N1c2VkIGFwcGxpY2F0aW9uIiBpbiBhCiB0cmFkaXRpb25hbCB3aW5kb3cgbWFuYWdlciwgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIG1heSBiZSBwYXJ0aWFsbHkgdmlzaWJsZS4KIAotVGhpcyBmdW5jdGlvbiBldmVudHVhbGx5IGNhdXNlcyBhIGBrU2JFdmVudFR5cGVQYXVzZWAgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZCB0bwotdGhlIGFwcGxpY2F0aW9uLiBCZWZvcmUgdGhlIGBrU2JFdmVudFR5cGVQYXVzZWAgZXZlbnQgaXMgZGlzcGF0Y2hlZCwgc29tZSB3b3JrCitUaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgY2F1c2VzIGEgYGtTYkV2ZW50VHlwZUJsdXJgIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQgdG8KK3RoZSBhcHBsaWNhdGlvbi4gQmVmb3JlIHRoZSBga1NiRXZlbnRUeXBlQmx1cmAgZXZlbnQgaXMgZGlzcGF0Y2hlZCwgc29tZSB3b3JrCiBtYXkgY29udGludWUgdG8gYmUgZG9uZSwgYW5kIHVucmVsYXRlZCBzeXN0ZW0gZXZlbnRzIG1heSBiZSBkaXNwYXRjaGVkLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCi12b2lkIFNiU3lzdGVtUmVxdWVzdFBhdXNlKCkKK3ZvaWQgU2JTeXN0ZW1SZXF1ZXN0Qmx1cigpCitgYGAKKworIyMjIFNiU3lzdGVtUmVxdWVzdENvbmNlYWwgIyMjCisKK1JlcXVlc3RzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG1vdmUgaW50byB0aGUgQ29uY2VhbGVkIHN0YXRlIGF0IHRoZSBuZXh0Citjb252ZW5pZW50IHBvaW50LiBUaGlzIHNob3VsZCByb3VnaGx5IGNvcnJlc3BvbmQgdG8gIm1pbmltaXphdGlvbiIgaW4gYQordHJhZGl0aW9uYWwgd2luZG93IG1hbmFnZXIsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBpcyBubyBsb25nZXIgdmlzaWJsZS4gSG93ZXZlciwKK3RoZSBiYWNrZ3JvdW5kIHRhc2tzIGNhbiBzdGlsbCBiZSBydW5uaW5nLgorCitUaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgY2F1c2VzIGEgYGtTYkV2ZW50VHlwZUNvbmNlYWxgIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKK3RvIHRoZSBhcHBsaWNhdGlvbi4gQmVmb3JlIHRoZSBga1NiRXZlbnRUeXBlQ29uY2VhbGAgZXZlbnQgaXMgZGlzcGF0Y2hlZCwgc29tZQord29yayBtYXkgY29udGludWUgdG8gYmUgZG9uZSwgYW5kIHVucmVsYXRlZCBzeXN0ZW0gZXZlbnRzIG1heSBiZSBkaXNwYXRjaGVkLgorCitJbiB0aGUgQ29uY2VhbGVkIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBpbnZpc2libGUsIGJ1dCBwcm9iYWJseSBzdGlsbCBiZQorcnVubmluZyBiYWNrZ3JvdW5kIHRhc2tzLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhbiBleHRlcm5hbCBzeXN0ZW0gZXZlbnQgd2lsbAorYnJpbmcgdGhlIGFwcGxpY2F0aW9uIG91dCBvZiB0aGUgQ29uY2VhbGVkIHN0YXRlLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCit2b2lkIFNiU3lzdGVtUmVxdWVzdENvbmNlYWwoKQorYGBgCisKKyMjIyBTYlN5c3RlbVJlcXVlc3RGb2N1cyAjIyMKKworUmVxdWVzdHMgdGhhdCB0aGUgYXBwbGljYXRpb24gbW92ZSBpbnRvIHRoZSBTdGFydGVkIHN0YXRlIGF0IHRoZSBuZXh0IGNvbnZlbmllbnQKK3BvaW50LiBUaGlzIHNob3VsZCByb3VnaGx5IGNvcnJlc3BvbmQgdG8gYSAiZm9jdXNlZCBhcHBsaWNhdGlvbiIgaW4gYQordHJhZGl0aW9uYWwgd2luZG93IG1hbmFnZXIsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBpcyBmdWxseSB2aXNpYmxlIGFuZCB0aGUKK3ByaW1hcnkgcmVjZWl2ZXIgb2YgaW5wdXQgZXZlbnRzLgorCitUaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgY2F1c2VzIGEgYGtTYkV2ZW50VHlwZUZvY3VzYCBldmVudCB0byBiZSBkaXNwYXRjaGVkIHRvCit0aGUgYXBwbGljYXRpb24uIEJlZm9yZSBga1NiRXZlbnRUeXBlRm9jdXNgIGlzIGRpc3BhdGNoZWQsIHNvbWUgd29yayBtYXkKK2NvbnRpbnVlIHRvIGJlIGRvbmUsIGFuZCB1bnJlbGF0ZWQgc3lzdGVtIGV2ZW50cyBtYXkgYmUgZGlzcGF0Y2hlZC4KKworIyMjIyBEZWNsYXJhdGlvbiAjIyMjCisKK2BgYAordm9pZCBTYlN5c3RlbVJlcXVlc3RGb2N1cygpCitgYGAKKworIyMjIFNiU3lzdGVtUmVxdWVzdEZyZWV6ZSAjIyMKKworUmVxdWVzdHMgdGhhdCB0aGUgYXBwbGljYXRpb24gbW92ZSBpbnRvIHRoZSBGcm96ZW4gc3RhdGUgYXQgdGhlIG5leHQgY29udmVuaWVudAorcG9pbnQuCisKK1RoaXMgZnVuY3Rpb24gZXZlbnR1YWxseSBjYXVzZXMgYSBga1NiRXZlbnRUeXBlRnJlZXplYCBldmVudCB0byBiZSBkaXNwYXRjaGVkIHRvCit0aGUgYXBwbGljYXRpb24uIEJlZm9yZSB0aGUgYGtTYkV2ZW50VHlwZVN1c3BlbmRgIGV2ZW50IGlzIGRpc3BhdGNoZWQsIHNvbWUgd29yaworbWF5IGNvbnRpbnVlIHRvIGJlIGRvbmUsIGFuZCB1bnJlbGF0ZWQgc3lzdGVtIGV2ZW50cyBtYXkgYmUgZGlzcGF0Y2hlZC4KKworSW4gdGhlIEZyb3plbiBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcmVzaWRlbnQsIGJ1dCBwcm9iYWJseSBub3QgcnVubmluZy4KK1RoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGFuIGV4dGVybmFsIHN5c3RlbSBldmVudCB3aWxsIGJyaW5nIHRoZSBhcHBsaWNhdGlvbiBvdXQKK29mIHRoZSBGcm96ZW4gc3RhdGUuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK3ZvaWQgU2JTeXN0ZW1SZXF1ZXN0RnJlZXplKCkKK2BgYAorCisjIyMgU2JTeXN0ZW1SZXF1ZXN0UmV2ZWFsICMjIworCitSZXF1ZXN0cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtb3ZlIGludG8gdGhlIEJsdXJyZWQgc3RhdGUgYXQgdGhlIG5leHQgY29udmVuaWVudAorcG9pbnQuIFRoaXMgc2hvdWxkIHJvdWdobHkgY29ycmVzcG9uZCB0byBhICJmb2N1c2VkIGFwcGxpY2F0aW9uIiBpbiBhCit0cmFkaXRpb25hbCB3aW5kb3cgbWFuYWdlciwgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIGlzIGZ1bGx5IHZpc2libGUgYW5kIHRoZQorcHJpbWFyeSByZWNlaXZlciBvZiBpbnB1dCBldmVudHMuCisKK1RoaXMgZnVuY3Rpb24gZXZlbnR1YWxseSBjYXVzZXMgYSBga1NiRXZlbnRUeXBlUmV2ZWFsYCBldmVudCB0byBiZSBkaXNwYXRjaGVkIHRvCit0aGUgYXBwbGljYXRpb24uIEJlZm9yZSB0aGUgYGtTYkV2ZW50VHlwZVJldmVhbGAgZXZlbnQgaXMgZGlzcGF0Y2hlZCwgc29tZSB3b3JrCittYXkgY29udGludWUgdG8gYmUgZG9uZSwgYW5kIHVucmVsYXRlZCBzeXN0ZW0gZXZlbnRzIG1heSBiZSBkaXNwYXRjaGVkLgorCisjIyMjIERlY2xhcmF0aW9uICMjIyMKKworYGBgCit2b2lkIFNiU3lzdGVtUmVxdWVzdFJldmVhbCgpCiBgYGAKIAogIyMjIFNiU3lzdGVtUmVxdWVzdFN0b3AgIyMjCkBAIC02MjUsNDcgKzYyMywxMCBAQAogdm9pZCBTYlN5c3RlbVJlcXVlc3RTdG9wKGludCBlcnJvcl9sZXZlbCkKIGBgYAogCi0jIyMgU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCAjIyMKLQotUmVxdWVzdHMgdGhhdCB0aGUgYXBwbGljYXRpb24gbW92ZSBpbnRvIHRoZSBTdXNwZW5kZWQgc3RhdGUgYXQgdGhlIG5leHQKLWNvbnZlbmllbnQgcG9pbnQuIFRoaXMgc2hvdWxkIHJvdWdobHkgY29ycmVzcG9uZCB0byAibWluaW1pemF0aW9uIiBpbiBhCi10cmFkaXRpb25hbCB3aW5kb3cgbWFuYWdlciwgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB2aXNpYmxlLgotCi1UaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgY2F1c2VzIGEgYGtTYkV2ZW50VHlwZVN1c3BlbmRgIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKLXRvIHRoZSBhcHBsaWNhdGlvbi4gQmVmb3JlIHRoZSBga1NiRXZlbnRUeXBlU3VzcGVuZGAgZXZlbnQgaXMgZGlzcGF0Y2hlZCwgc29tZQotd29yayBtYXkgY29udGludWUgdG8gYmUgZG9uZSwgYW5kIHVucmVsYXRlZCBzeXN0ZW0gZXZlbnRzIG1heSBiZSBkaXNwYXRjaGVkLgotCi1JbiB0aGUgU3VzcGVuZGVkIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSByZXNpZGVudCwgYnV0IHByb2JhYmx5IG5vdAotcnVubmluZy4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgYW4gZXh0ZXJuYWwgc3lzdGVtIGV2ZW50IHdpbGwgYnJpbmcgdGhlCi1hcHBsaWNhdGlvbiBvdXQgb2YgdGhlIFN1c3BlbmRlZCBzdGF0ZS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCBTYlN5c3RlbVJlcXVlc3RTdXNwZW5kKCkKLWBgYAotCi0jIyMgU2JTeXN0ZW1SZXF1ZXN0VW5wYXVzZSAjIyMKLQotUmVxdWVzdHMgdGhhdCB0aGUgYXBwbGljYXRpb24gbW92ZSBpbnRvIHRoZSBTdGFydGVkIHN0YXRlIGF0IHRoZSBuZXh0IGNvbnZlbmllbnQKLXBvaW50LiBUaGlzIHNob3VsZCByb3VnaGx5IGNvcnJlc3BvbmQgdG8gYSAiZm9jdXNlZCBhcHBsaWNhdGlvbiIgaW4gYQotdHJhZGl0aW9uYWwgd2luZG93IG1hbmFnZXIsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBpcyBmdWxseSB2aXNpYmxlIGFuZCB0aGUKLXByaW1hcnkgcmVjZWl2ZXIgb2YgaW5wdXQgZXZlbnRzLgotCi1UaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgY2F1c2VzIGEgYGtTYkV2ZW50VHlwZVVucGF1c2VgIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKLXRvIHRoZSBhcHBsaWNhdGlvbi4gQmVmb3JlIGBrU2JFdmVudFR5cGVVbnBhdXNlYCBpcyBkaXNwYXRjaGVkLCBzb21lIHdvcmsgbWF5Ci1jb250aW51ZSB0byBiZSBkb25lLCBhbmQgdW5yZWxhdGVkIHN5c3RlbSBldmVudHMgbWF5IGJlIGRpc3BhdGNoZWQuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXZvaWQgU2JTeXN0ZW1SZXF1ZXN0VW5wYXVzZSgpCi1gYGAKLQogIyMjIFNiU3lzdGVtU2lnbldpdGhDZXJ0aWZpY2F0aW9uU2VjcmV0S2V5ICMjIwogCiBDb21wdXRlcyBhIEhNQUMtU0hBMjU2IGRpZ2VzdCBvZiBgbWVzc2FnZWAgaW50byBgZGlnZXN0YCB1c2luZyB0aGUgYXBwbGljYXRpb24ncwotY2VydGlmaWNhdGlvbiBzZWNyZXQuCitjZXJ0aWZpY2F0aW9uIHNlY3JldC4gVGhlIGBtZXNzYWdlYCBhbmQgdGhlIGBkaWdlc3RgIHBvaW50ZXJzIG11c3Qgbm90IGJlIE5VTEwuCiAKIFRoZSBvdXRwdXQgd2lsbCBiZSB3cml0dGVuIGludG8gYGRpZ2VzdGAuIGBkaWdlc3Rfc2l6ZV9pbl9ieXRlc2AgbXVzdCBiZSAzMiAob3IKIGdyZWF0ZXIpLCBzaW5jZSAzMi1ieXRlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byBpdC4gUmV0dXJucyBmYWxzZSBpbiB0aGUgY2FzZSBvZgpAQCAtNjc4LDIzICs2MzksNiBAQAogYm9vbCBTYlN5c3RlbVNpZ25XaXRoQ2VydGlmaWNhdGlvblNlY3JldEtleShjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZV9zaXplX2luX2J5dGVzLCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3Rfc2l6ZV9pbl9ieXRlcykKIGBgYAogCi0jIyMgU2JTeXN0ZW1Tb3J0ICMjIwotCi1Tb3J0cyBhbiBhcnJheSBvZiBlbGVtZW50cyBgYmFzZWAsIHdpdGggYGVsZW1lbnRfY291bnRgIGVsZW1lbnRzIG9mCi1gZWxlbWVudF93aWR0aGAgYnl0ZXMgZWFjaCwgdXNpbmcgYGNvbXBhcmF0b3JgIGFzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLgotCi1UaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYHFzb3J0YC4KLQotYGJhc2VgOiBUaGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gYmUgc29ydGVkLiBgZWxlbWVudF9jb3VudGA6IFRoZSBudW1iZXIgb2YKLWVsZW1lbnRzIGluIHRoZSBhcnJheS4gYGVsZW1lbnRfd2lkdGhgOiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGVhY2ggZWxlbWVudCBpbgotdGhlIGFycmF5LiBgY29tcGFyYXRvcmA6IEEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSBhcnJheSBzaG91bGQgYmUgc29ydGVkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkIFNiU3lzdGVtU29ydCh2b2lkICpiYXNlLCBzaXplX3QgZWxlbWVudF9jb3VudCwgc2l6ZV90IGVsZW1lbnRfd2lkdGgsIFNiU3lzdGVtQ29tcGFyYXRvciBjb21wYXJhdG9yKQotYGBgCi0KICMjIyBTYlN5c3RlbVN1cHBvcnRzUmVzdW1lICMjIwogCiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IG5lZWQgcmVzdW1lIGFmdGVyIHN1c3BlbmQgc3VwcG9ydC4gSW4gc3VjaApkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdGhyZWFkLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvdGhyZWFkLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3RocmVhZC5tZApyZW5hbWUgdG8gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvdGhyZWFkLm1kCmluZGV4IDg0NDA0NzcuLjExOTFlOWEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3RocmVhZC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS90aHJlYWQubWQKQEAgLTUzMSw0ICs1MzEsMyBAQAogYGBgCiB2b2lkIFNiVGhyZWFkWWllbGQoKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3RpbWUubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS90aW1lLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3RpbWUubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3RpbWUubWQKaW5kZXggMTdlYTZhZC4uMTlhN2U0ZiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdGltZS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS90aW1lLm1kCkBAIC0xNTAsNCArMTUwLDMgQEAKIGBgYAogc3RhdGljIGludDY0X3QgU2JUaW1lVG9Qb3NpeChTYlRpbWUgdGltZSkKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi90aW1lX3pvbmUubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS90aW1lX3pvbmUubWQKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdGltZV96b25lLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS90aW1lX3pvbmUubWQKaW5kZXggNTc2OGJjMy4uZjllM2ZjYiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdGltZV96b25lLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3RpbWVfem9uZS5tZApAQCAtNDUsNCArNDUsMyBAQAogYGBgCiBjb25zdCBjaGFyKiBTYlRpbWVab25lR2V0TmFtZSgpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdHlwZXMubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS90eXBlcy5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdHlwZXMubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3R5cGVzLm1kCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi91aV9uYXZpZ2F0aW9uLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvdWlfbmF2aWdhdGlvbi5tZApzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi91aV9uYXZpZ2F0aW9uLm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS91aV9uYXZpZ2F0aW9uLm1kCmluZGV4IDIzZjgwNDkuLmEwZWNmYjEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3VpX25hdmlnYXRpb24ubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTUvdWlfbmF2aWdhdGlvbi5tZApAQCAtMTAyLDYgKzEwMiw5IEBACiAgICAga1NiVWlOYXZJdGVtVHlwZUZvY3VzLiBBbnkgcHJldmlvdXNseSBmb2N1c2VkIG5hdmlnYXRpb24gaXRlbSBzaG91bGQgcmVjZWl2ZQogICAgIHRoZSBibHVyIGV2ZW50LiBJZiB0aGUgaXRlbSBpcyBub3QgdHJhbnNpdGl2ZWx5IGEgY29udGVudCBvZiB0aGUgcm9vdCBpdGVtLAogICAgIHRoZW4gdGhpcyBkb2VzIG5vdGhpbmcuCisKKyAgICBTcGVjaWZ5aW5nIGtTYlVpTmF2SXRlbUludmFsaWQgc2hvdWxkIHJlbW92ZSBmb2N1cyBmcm9tIHRoZSBVSSBuYXZpZ2F0aW9uCisgICAgc3lzdGVtLgogKiAgIGB2b2lkKCpzZXRfaXRlbV9lbmFibGVkKShTYlVpTmF2SXRlbSBpdGVtLCBib29sIGVuYWJsZWQpYAogCiAgICAgVGhpcyBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkCkBAIC0xMTYsNiArMTE5LDE1IEBACiAgICAgVGhpcyBzcGVjaWZpZXMgZGlyZWN0aW9uYWxpdHkgZm9yIGNvbnRhaW5lciBpdGVtcy4gQ29udGFpbmVycyB3aXRoaW4KICAgICBjb250YWluZXJzIGRvIG5vdCBpbmhlcml0IGRpcmVjdGlvbmFsaXR5LiBEaXJlY3Rpb25hbGl0eSBtdXN0IGJlIHNwZWNpZmllZAogICAgIGZvciBlYWNoIGNvbnRhaW5lciBleHBsaWNpdGx5LgorCisgICAgVGhpcyBzaG91bGQgd29yayBldmVuIGlmIGBpdGVtYCBpcyBkaXNhYmxlZC4KKyogICBgdm9pZCgqc2V0X2l0ZW1fZm9jdXNfZHVyYXRpb24pKFNiVWlOYXZJdGVtIGl0ZW0sIGZsb2F0IHNlY29uZHMpYAorCisgICAgU2V0IHRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRoZSBmb2N1cyBpdGVtIHNob3VsZCByZW1haW4gZm9jdXNlZCBvbmNlIGl0CisgICAgYmVjb21lcyBmb2N1c2VkLiBUaGlzIG1heSBiZSB1c2VkIHRvIG1ha2UgaW1wb3J0YW50IGZvY3VzIGl0ZW1zIGhhcmRlciB0bworICAgIG5hdmlnYXRlIG92ZXIuIEZvY3VzIG1heSBzdGlsbCBiZSBtb3ZlZCBiZWZvcmUgYHNlY29uZHNgIGhhcyBlbGFwc2VkIGJ5CisgICAgdXNpbmcgdGhlIHNldF9mb2N1cygpIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCBpdGVtIGZvY3VzIGR1cmF0aW9uIGlzIDAKKyAgICBzZWNvbmRzLgogKiAgIGB2b2lkKCpzZXRfaXRlbV9zaXplKShTYlVpTmF2SXRlbSBpdGVtLCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KWAKIAogICAgIFNldCB0aGUgaW50ZXJhY3RhYmxlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIGl0ZW0uIEJ5IGRlZmF1bHQsIGFuCkBAIC0xNTAsMTEgKzE2MiwxNiBAQAogCiAgICAgVGhpcyBhdHRhY2hlcyB0aGUgZ2l2ZW4gbmF2aWdhdGlvbiBpdGVtICh3aGljaCBtdXN0IGJlIGEgY29udGFpbmVyKSB0byB0aGUKICAgICBzcGVjaWZpZWQgd2luZG93LiBOYXZpZ2F0aW9uIGl0ZW1zIGFyZSBvbmx5IGludGVyYWN0YWJsZSBpZiB0aGV5IGFyZQotICAgIHRyYW5zaXRpdmVseSBhdHRhY2hlZCB0byBhIHdpbmRvdy5BIG5hdmlnYXRpb24gaXRlbSBtYXkgb25seSBoYXZlIGEKLSAgICBTYlVpTmF2SXRlbSBvciBTYldpbmRvdyBhcyBpdHMgZGlyZWN0IGNvbnRhaW5lci4gVGhlIG5hdmlnYXRpb24gaXRlbQotICAgIGhpZXJhcmNoeSBpcyBlc3RhYmxpc2hlZCB1c2luZyBzZXRfaXRlbV9jb250YWluZXJfaXRlbSgpIHdpdGggdGhlIHJvb3QKLSAgICBjb250YWluZXIgYXR0YWNoZWQgdG8gYSBTYldpbmRvdyB1c2luZyBzZXRfaXRlbV9jb250YWluZXJfd2luZG93KCkgdG8gZW5hYmxlCi0gICAgaW50ZXJhY3Rpb24gd2l0aCBhbGwgZW5hYmxlZCBpdGVtcyBpbiB0aGUgaGllcmFyY2h5LgorICAgIHRyYW5zaXRpdmVseSBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKworICAgIFRoZSBuYXRpdmUgVUkgZW5naW5lIHNob3VsZCBuZXZlciBjaGFuZ2UgdGhpcyBuYXZpZ2F0aW9uIGl0ZW0ncyBjb250ZW50CisgICAgb2Zmc2V0LiBJdCBpcyBhc3N1bWVkIHRvIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIHN5c3RlbSB3aW5kb3cuCisKKyAgICBBIG5hdmlnYXRpb24gaXRlbSBtYXkgb25seSBoYXZlIGEgU2JVaU5hdkl0ZW0gb3IgU2JXaW5kb3cgYXMgaXRzIGRpcmVjdAorICAgIGNvbnRhaW5lci4gVGhlIG5hdmlnYXRpb24gaXRlbSBoaWVyYXJjaHkgaXMgZXN0YWJsaXNoZWQgdXNpbmcKKyAgICBzZXRfaXRlbV9jb250YWluZXJfaXRlbSgpIHdpdGggdGhlIHJvb3QgY29udGFpbmVyIGF0dGFjaGVkIHRvIGEgU2JXaW5kb3cKKyAgICB1c2luZyBzZXRfaXRlbV9jb250YWluZXJfd2luZG93KCkgdG8gZW5hYmxlIGludGVyYWN0aW9uIHdpdGggYWxsIGVuYWJsZWQKKyAgICBpdGVtcyBpbiB0aGUgaGllcmFyY2h5LgogCiAgICAgSWYgYGl0ZW1gIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIGEgZGlmZmVyZW50IHdpbmRvdywgdGhlbiB0aGlzIHdpbGwKICAgICB1bnJlZ2lzdGVyIGl0IGZyb20gdGhhdCB3aW5kb3cgdGhlbiBhdHRhY2ggaXQgdG8gdGhlIGdpdmVuIGB3aW5kb3dgLiBJdCBpcwpAQCAtMTg2LDYgKzIwMywxMyBAQAogCiAgICAgRXNzZW50aWFsbHksIGNvbnRlbnQgaXRlbXMgc2hvdWxkIGJlIGRyYXduIGF0OiBbY29udGFpbmVyIHBvc2l0aW9uXSArCiAgICAgW2NvbnRlbnQgcG9zaXRpb25dIC0gW2NvbnRhaW5lciBjb250ZW50IG9mZnNldF0KKworICAgIENvbnRlbnQgaXRlbXMgbWF5IG92ZXJsYXAgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIGNhbiBjYXVzZSBvYnNjdXJlZCBpdGVtcworICAgIHRvIGJlIHVuZm9jdXNhYmxlLiBUaGUgb25seSBydWxlIHRoYXQgbmVlZHMgdG8gYmUgZm9sbG93ZWQgaXMgdGhhdCBjb250ZW50cworICAgIHdoaWNoIGFyZSBmb2N1cyBpdGVtcyBjYW4gb2JzY3VyZSBvdGhlciBjb250ZW50cyB3aGljaCBhcmUgY29udGFpbmVycywgYnV0CisgICAgbm90IHZpY2UgdmVyc2EuIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBjb250ZW50IGZvY3VzIGl0ZW1zIGRvIG5vdAorICAgIG92ZXJsYXAgb3RoZXIgY29udGVudCBmb2N1cyBpdGVtcyBhbmQgY29udGVudCBjb250YWluZXIgaXRlbXMgZG8gbm90IG92ZXJsYXAKKyAgICBvdGhlciBjb250ZW50IGNvbnRhaW5lciBpdGVtcy4KICogICBgdm9pZCgqc2V0X2l0ZW1fY29udGVudF9vZmZzZXQpKFNiVWlOYXZJdGVtIGl0ZW0sIGZsb2F0IGNvbnRlbnRfb2Zmc2V0X3gsCiAgICAgZmxvYXQgY29udGVudF9vZmZzZXRfeSlgCiAKQEAgLTE5NSwxMiArMjE5LDI0IEBACiAgICAgRXNzZW50aWFsbHksIGEgY29udGVudCBpdGVtIHNob3VsZCBiZSBkcmF3biBhdDogW2NvbnRhaW5lciBwb3NpdGlvbl0gKwogICAgIFtjb250ZW50IHBvc2l0aW9uXSAtIFtjb250YWluZXIgY29udGVudCBvZmZzZXRdIElmIGBpdGVtYCBpcyBub3QgYQogICAgIGNvbnRhaW5lciwgdGhlbiB0aGlzIGRvZXMgbm90aGluZy4gQnkgZGVmYXVsdCwgdGhlIGNvbnRlbnQgb2Zmc2V0IGlzICgwLDApLgorCisgICAgVGhpcyBzaG91bGQgdXBkYXRlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0X2l0ZW1fY29udGVudF9vZmZzZXQoKSBldmVuIGlmCisgICAgdGhlIGBpdGVtYCBpcyBkaXNhYmxlZC4KICogICBgdm9pZCgqZ2V0X2l0ZW1fY29udGVudF9vZmZzZXQpKFNiVWlOYXZJdGVtIGl0ZW0sIGZsb2F0CiAgICAgKm91dF9jb250ZW50X29mZnNldF94LCBmbG9hdCAqb3V0X2NvbnRlbnRfb2Zmc2V0X3kpYAogCiAgICAgUmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGVudCBvZmZzZXQgZm9yIHRoZSBuYXZpZ2F0aW9uIGl0ZW0uIElmIGBpdGVtYCBpcwogICAgIG5vdCBhIGNvbnRhaW5lciwgdGhlbiB0aGUgY29udGVudCBvZmZzZXQgaXMgKDAsMCkuCiAKKyAgICBUaGUgbmF0aXZlIFVJIGVuZ2luZSBzaG91bGQgbm90IGNoYW5nZSB0aGUgY29udGVudCBvZmZzZXQgb2YgYSBjb250YWluZXIKKyAgICB1bmxlc3Mgb25lIG9mIGl0cyBjb250ZW50cyAocG9zc2libHkgcmVjdXJzaXZlbHkpIGlzIGZvY3VzZWQuIFRoaXMgaXMgdG8KKyAgICBhbGxvdyBzZWFtbGVzc2x5IGRpc2FibGluZyB0aGVuIHJlLWVuYWJsaW5nIGZvY3VzIGl0ZW1zIHdpdGhvdXQgaGF2aW5nIHRoZWlyCisgICAgY29udGFpbmVycyBjaGFuZ2Ugb2Zmc2V0cy4KKyogICBgdm9pZCgqZG9fYmF0Y2hfdXBkYXRlKSh2b2lkKCp1cGRhdGVfZnVuY3Rpb24pKHZvaWQgKiksIHZvaWQgKmNvbnRleHQpYAorCisgICAgQ2FsbCBgdXBkYXRlX2Z1bmN0aW9uYCB3aXRoIGBjb250ZXh0YCB0byBwZXJmb3JtIGEgc2VyaWVzIG9mIFVJIG5hdmlnYXRpb24KKyAgICBjaGFuZ2VzIGF0b21pY2FsbHkgYmVmb3JlIHJldHVybmluZy4KKwogIyMjIFNiVWlOYXZJdGVtRGlyICMjIwogCiBOYXZpZ2F0aW9uIGl0ZW1zIG9mIHR5cGUga1NiVWlOYXZJdGVtVHlwZUNvbnRhaW5lciBoYXZlIGRpcmVjdGlvbmFsaXR5LiBJZgpAQCAtMjI2LDcgKzI2Miw3IEBACiAvLy8gICAgIHwgTmVnYXRpdmUgcG9zaXRpb24uIHwgUG9zaXRpdmUgcG9zaXRpb24uIHwgUG9zaXRpdmUgcG9zaXRpb24uIHwKIC8vLyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwogLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLy8gICAgICAgICAgICAgICAgICBDb250ZW50IE9mZnNldCBYID0gMC4gCisvLy8gICAgICAgICAgICAgICAgICBDb250ZW50IE9mZnNldCBYID0gMC4KIGBgYAogCiBgYGAKQEAgLTI0NSw3ICsyODEsNyBAQAogCiBgYGAKIC8vLyAgIHwgYSBiIHR4IHwKLS8vLyAgIHwgYyBkIHR5IHwgCisvLy8gICB8IGMgZCB0eSB8CiBgYGAKIAogIyMjIyBNZW1iZXJzICMjIyMKQEAgLTI2Niw3ICszMDIsOCBAQAogCiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ncyBVSSBuYXZpZ2F0aW9uIGltcGxlbWVudGF0aW9uLiBJZiB0aGUgcGxhdGZvcm0gZG9lcyBub3QKIHByb3ZpZGUgb25lLCB0aGVuIHJldHVybiBmYWxzZSB3aXRob3V0IG1vZGlmeWluZyBgb3V0X2ludGVyZmFjZWAuIE90aGVyd2lzZSwKLWluaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgYG91dF9pbnRlcmZhY2VgIGFuZCByZXR1cm4gdHJ1ZS4KK2luaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgYG91dF9pbnRlcmZhY2VgIGFuZCByZXR1cm4gdHJ1ZS4gVGhlIGBvdXRfaW50ZXJmYWNlYAorcG9pbnRlciBtdXN0IG5vdCBiZSBOVUxMLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMjgzLDQgKzMyMCwzIEBACiBgYGAKIHN0YXRpYyBib29sIFNiVWlOYXZJdGVtSXNWYWxpZChTYlVpTmF2SXRlbSBpdGVtKQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3VzZXIubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS91c2VyLm1kCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzEyL3VzZXIubWQKcmVuYW1lIHRvIGNvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3VzZXIubWQKaW5kZXggYTMwY2M5NS4uNDA2ZTY5NSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvdXNlci5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS91c2VyLm1kCkBAIC0xMzEsNCArMTMxLDMgQEAKIGBgYAogc3RhdGljIGJvb2wgU2JVc2VySXNWYWxpZChTYlVzZXIgdXNlcikKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xMi93aW5kb3cubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS93aW5kb3cubWQKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvd2luZG93Lm1kCnJlbmFtZSB0byBjb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy8xNS93aW5kb3cubWQKaW5kZXggNTNjZGE0YS4uOTE1ZTI1NCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvMTIvd2luZG93Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzLzE1L3dpbmRvdy5tZApAQCAtMzI4LDQgKzMyOCwzIEBACiBgYGAKIHZvaWQgU2JXaW5kb3dVcGRhdGVPblNjcmVlbktleWJvYXJkU3VnZ2VzdGlvbnMoU2JXaW5kb3cgd2luZG93LCBjb25zdCBjaGFyICpzdWdnZXN0aW9uc1tdLCBpbnQgbnVtX3N1Z2dlc3Rpb25zLCBpbnQgdGlja2V0KQogYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2F1ZGlvX3NpbmsubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9hdWRpb19zaW5rLm1kCmluZGV4IDhjZjIzMjkuLmIwZTY1MmYgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2F1ZGlvX3NpbmsubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvYXVkaW9fc2luay5tZApAQCAtNzIsNiArNzIsNTMgQEAKIAogIyMgRnVuY3Rpb25zICMjCiAKKyMjIyBTYkF1ZGlvU2lua0NyZWF0ZSAjIyMKKworQ3JlYXRlcyBhbiBhdWRpbyBzaW5rIGZvciB0aGUgc3BlY2lmaWVkIGBjaGFubmVsc2AgYW5kIGBzYW1wbGluZ19mcmVxdWVuY3lfaHpgLAorYWNxdWlyZXMgYWxsIHJlc291cmNlcyBuZWVkZWQgdG8gb3BlcmF0ZSB0aGUgYXVkaW8gc2luaywgYW5kIHJldHVybnMgYW4gb3BhcXVlCitoYW5kbGUgdG8gdGhlIGF1ZGlvIHNpbmsuCisKK0lmIHRoZSBwYXJ0aWN1bGFyIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIGF1ZGlvIHNpbmssIHRoZQorZnVuY3Rpb24gcmV0dXJucyBga1NiQXVkaW9TaW5rSW52YWxpZGAgd2l0aG91dCBjYWxsaW5nIGFueSBvZiB0aGUgY2FsbGJhY2tzLiBJZgordGhlcmUgaXMgYSBwbGF0Zm9ybSBsaW1pdGF0aW9uIG9uIGhvdyBtYW55IGF1ZGlvIHNpbmtzIGNhbiBjb2V4aXN0CitzaW11bHRhbmVvdXNseSwgdGhlbiBjYWxscyBtYWRlIHRvIHRoaXMgZnVuY3Rpb24gdGhhdCBhdHRlbXB0IHRvIGV4Y2VlZCB0aGF0CitsaW1pdCBtdXN0IHJldHVybiBga1NiQXVkaW9TaW5rSW52YWxpZGAuIE11bHRpcGxlIGNhbGxzIHRvIFNiQXVkaW9TaW5rQ3JlYXRlCittdXN0IG5vdCBjYXVzZSBhIGNyYXNoLgorCitgY2hhbm5lbHNgOiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLCBzdWNoIGFzIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGluCitzdGVyZW8gYXVkaW8uIGBzYW1wbGluZ19mcmVxdWVuY3lfaHpgOiBUaGUgc2FtcGxlIGZyZXF1ZW5jeSBvZiB0aGUgYXVkaW8gZGF0YQorYmVpbmcgc3RyZWFtZWQuIEZvciBleGFtcGxlLCAyMiwwMDAgSHogbWVhbnMgMjIsMDAwIHNhbXBsZSBlbGVtZW50cyByZXByZXNlbnRzCitvbmUgc2Vjb25kIG9mIGF1ZGlvIGRhdGEuIGBhdWRpb19zYW1wbGVfdHlwZWA6IFRoZSB0eXBlIG9mIGVhY2ggc2FtcGxlIG9mIHRoZQorYXVkaW8gZGF0YSDigJMgYGludDE2YCwgYGZsb2F0MzJgLCBldGMuIGBhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVgOiBJbmRpY2F0ZXMKK3doZXRoZXIgZnJhbWVzIGFyZSBpbnRlcmxlYXZlZCBvciBwbGFuYXIuIGBmcmFtZV9idWZmZXJzYDogQW4gYXJyYXkgb2YgcG9pbnRlcnMKK3RvIHNhbXBsZSBkYXRhLgorCisqICAgSWYgdGhlIHNpbmsgaXMgb3BlcmF0aW5nIGluIGludGVybGVhdmVkIG1vZGUsIHRoZSBhcnJheSBjb250YWlucyBvbmx5IG9uZQorICAgIGVsZW1lbnQsIHdoaWNoIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgKGBmcmFtZXNfcGVyX2NoYW5uZWxgICogYGNoYW5uZWxzYCkKKyAgICBzYW1wbGVzLgorCisqICAgSWYgdGhlIHNpbmsgaXMgb3BlcmF0aW5nIGluIHBsYW5hciBtb2RlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICAgIGlzIHRoZSBzYW1lIGFzIGBjaGFubmVsc2AsIGFuZCBlYWNoIGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YKKyAgICBgZnJhbWVzX3Blcl9jaGFubmVsYCBzYW1wbGVzLiBUaGUgY2FsbGVyIGhhcyB0byBlbnN1cmUgdGhhdCBgZnJhbWVfYnVmZmVyc2AKKyAgICBpcyB2YWxpZCB1bnRpbCBTYkF1ZGlvU2lua0Rlc3Ryb3kgaXMgY2FsbGVkLiBgZnJhbWVzX3Blcl9jaGFubmVsYDogVGhlIHNpemUKKyAgICBvZiB0aGUgZnJhbWUgYnVmZmVycywgaW4gdW5pdHMgb2YgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsLiBUaGUKKyAgICBmcmFtZSwgaW4gdGhpcyBjYXNlLCByZXByZXNlbnRzIGEgZ3JvdXAgb2Ygc2FtcGxlcyBhdCB0aGUgc2FtZSBtZWRpYSB0aW1lLAorICAgIG9uZSBmb3IgZWFjaCBjaGFubmVsLiBgdXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuY2A6IFRoZSBhdWRpbyBzaW5rIGNhbGxzIHRoaXMKKyAgICBmdW5jdGlvbiBvbiBhbiBpbnRlcm5hbCB0aHJlYWQgdG8gcXVlcnkgdGhlIHN0YXR1cyBvZiB0aGUgc291cmNlLiBJdCBpcworICAgIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBTYkF1ZGlvU2lua0NyZWF0ZSBpcyBjYWxsZWQsIGV2ZW4gYmVmb3JlIGl0CisgICAgcmV0dXJucy4gVGhlIGNhbGxlciBoYXMgdG8gZW5zdXJlIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhYm92ZSByZXR1cm4KKyAgICBtZWFuaW5nZnVsIHZhbHVlcyBpbiB0aGlzIGNhc2UuIFRoZSB2YWx1ZSBjYW5ub3QgYmUgTlVMTC4KKyAgICBgY29uc3VtZV9mcmFtZXNfZnVuY2A6IFRoZSBhdWRpbyBzaW5rIGNhbGxzIHRoaXMgZnVuY3Rpb24gb24gYW4gaW50ZXJuYWwKKyAgICB0aHJlYWQgdG8gcmVwb3J0IGNvbnN1bWVkIGZyYW1lcy4gVGhlIHZhbHVlIGNhbm5vdCBiZSBOVUxMLiBgY29udGV4dGA6IEEKKyAgICB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBiYWNrIHRvIGFsbCBjYWxsYmFja3MgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvIHBvaW50IGF0CisgICAgYSBjbGFzcyBvciBzdHJ1Y3QgdGhhdCBjb250YWlucyBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGF1ZGlvIHNpbmsuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK1NiQXVkaW9TaW5rIFNiQXVkaW9TaW5rQ3JlYXRlKGludCBjaGFubmVscywgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiwgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBhdWRpb19zYW1wbGVfdHlwZSwgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGUsIFNiQXVkaW9TaW5rRnJhbWVCdWZmZXJzIGZyYW1lX2J1ZmZlcnMsIGludCBmcmFtZXNfcGVyX2NoYW5uZWwsIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLCBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVzX2Z1bmMsIHZvaWQgKmNvbnRleHQpCitgYGAKKwogIyMjIFNiQXVkaW9TaW5rRGVzdHJveSAjIyMKIAogRGVzdHJveXMgYGF1ZGlvX3NpbmtgLCBmcmVlaW5nIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4gQmVmb3JlIHJldHVybmluZywgdGhlCkBAIC0xNjUsNCArMjEyLDMgQEAKIGBgYAogYm9vbCBTYkF1ZGlvU2lua0lzVmFsaWQoU2JBdWRpb1NpbmsgYXVkaW9fc2luaykKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9jb25maWd1cmF0aW9uX2NvbnN0YW50cy5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLm1kCmluZGV4IDUxMjEyZTkuLjk5ZDkyZjggMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2NvbmZpZ3VyYXRpb25fY29uc3RhbnRzLm1kCkBAIC01MCwxMCArNTAsNiBAQAogCiBUaGUgc3RyaW5nIGZvcm0gb2YgU0JfRklMRV9TRVBfQ0hBUi4KIAotIyMjIGtTYkhhc0FjM0F1ZGlvICMjIwotCi1BbGxvdyBhYzMgYW5kIGVjMyBzdXBwb3J0Ci0KICMjIyBrU2JIYXNNZWRpYVdlYm1WcDlTdXBwb3J0ICMjIwogCiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyB3ZWJtL3ZwOSBzdXBwb3J0LiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gbm9uLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvZGVjb2RlX3RhcmdldC5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2RlY29kZV90YXJnZXQubWQKaW5kZXggMGU5MTJkNS4uYTIzN2FkOSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvZGVjb2RlX3RhcmdldC5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9kZWNvZGVfdGFyZ2V0Lm1kCkBAIC0zMzIsOCArMzMyLDEwIEBACiAKICMjIyBTYkRlY29kZVRhcmdldEdldEluZm8gIyMjCiAKLVdyaXRlcyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYGRlY29kZV90YXJnZXRgIGludG8gYG91dF9pbmZvYC4gUmV0dXJucyBmYWxzZSBpZgotdGhlIHByb3ZpZGVkIGBvdXRfaW5mb2Agc3RydWN0dXJlIGlzIG5vdCB6ZXJvIGluaXRpYWxpemVkLgorV3JpdGVzIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBgZGVjb2RlX3RhcmdldGAgaW50byBgb3V0X2luZm9gLiBUaGUKK2BkZWNvZGVfdGFyZ2V0YCBtdXN0IG5vdCBiZSBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkLiBUaGUgYG91dF9pbmZvYCBwb2ludGVyIG11c3QKK25vdCBiZSBOVUxMLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBwcm92aWRlZCBgb3V0X2luZm9gIHN0cnVjdHVyZSBpcyBub3QgemVybworaW5pdGlhbGl6ZWQuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9kcm0ubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9kcm0ubWQKaW5kZXggYmViNjVjOS4uZmJiOTJmOSAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvZHJtLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2RybS5tZApAQCAtMjM4LDYgKzIzOCw4IEBACiAKIENsZWFyIGFueSBpbnRlcm5hbCBzdGF0ZXMvcmVzb3VyY2VzIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmllZCBgc2Vzc2lvbl9pZGAuCiAKK2Bkcm1fc3lzdGVtYCBtdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuIGBzZXNzaW9uX2lkYCBtdXN0IG5vdCBiZSBOVUxMLgorCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCkBAIC0yNTQsNyArMjU2LDcgQEAKIHJlc3VsdCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIHRvCiBTYkRybUNyZWF0ZVN5c3RlbSgpLCBhIGRlYWRsb2NrIHdpbGwgb2NjdXIuCiAKLWBkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gdG8gYmUgZGVzdHJveWVkLgorYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB0byBiZSBkZXN0cm95ZWQuIE11c3Qgbm90IGJlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTI4MSw3ICsyODMsNyBAQAogCiBgZHJtX3N5c3RlbWA6IFRoZSBEUk0gc3lzdGVtIHRoYXQgZGVmaW5lcyB0aGUga2V5IHN5c3RlbSB1c2VkIGZvciB0aGUgc2Vzc2lvbgogdXBkYXRlIHJlcXVlc3QgcGF5bG9hZCBhcyB3ZWxsIGFzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBhcyBhCi1yZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZC4KK3Jlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLiBNdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuCiAKIGB0aWNrZXRgOiBUaGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGNhbGxiYWNrcyBmcm9tIG11bHRpcGxlCiBjb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtR2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdCgpLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0bwpAQCAtMjg5LDEwICsyOTEsMTAgQEAKIGVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIHRpY2tldCBtYXkKIHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFRoZSB2YWx1ZSBga1NiRHJtVGlja2V0SW52YWxpZGAgbXVzdCBub3QgYmUgdXNlZC4KIAotYHR5cGVgOiBUaGUgY2FzZS1zZW5zaXRpdmUgdHlwZSBvZiB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkLgotYGluaXRpYWxpemF0aW9uX2RhdGFgOiBUaGUgZGF0YSBmb3Igd2hpY2ggdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QgcGF5bG9hZCBpcwotY3JlYXRlZC4gYGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZWA6IFRoZSBzaXplIG9mIHRoZSBzZXNzaW9uIHVwZGF0ZSByZXF1ZXN0Ci1wYXlsb2FkLgorYHR5cGVgOiBUaGUgY2FzZS1zZW5zaXRpdmUgdHlwZSBvZiB0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkLiBNdXN0IG5vdAorYmUgTlVMTC4gYGluaXRpYWxpemF0aW9uX2RhdGFgOiBUaGUgZGF0YSBmb3Igd2hpY2ggdGhlIHNlc3Npb24gdXBkYXRlIHJlcXVlc3QKK3BheWxvYWQgaXMgY3JlYXRlZC4gTXVzdCBub3QgYmUgTlVMTC4gYGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZWA6IFRoZSBzaXplIG9mCit0aGUgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdCBwYXlsb2FkLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtMzIyLDcgKzMyNCw3IEBACiBJdCBzaG91bGQgcmV0dXJuIE5VTEwgd2hlbiB0aGVyZSBpcyBubyBtZXRyaWNzIHN1cHBvcnQgaW4gdGhlIHVuZGVybHlpbmcgZHJtCiBzeXN0ZW0sIG9yIHdoZW4gdGhlIGRybSBzeXN0ZW0gaW1wbGVtZW50YXRpb24gZmFpbHMgdG8gcmV0cmlldmUgdGhlIG1ldHJpY3MuCiAKLVRoZSBjYWxsZXIgd2lsbCBuZXZlciBzZXQgYHNpemVgIHRvIE5VTEwuCitgZHJtX3N5c3RlbWAgbXVzdCBub3QgYmUgYGtTYkRybVN5c3RlbUludmFsaWRgLiBgc2l6ZWAgbXVzdCBub3QgYmUgTlVMTC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTMzNyw2ICszMzksNyBAQAogdGhlIGxpZmUgdGltZSBvZiBgZHJtX3N5c3RlbWAuCiAKIGBkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gdG8gY2hlY2sgaWYgaXRzIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyB1cGRhdGFibGUuCitNdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zNzEsMTQgKzM3NCwxNSBAQAogYSBwcmV2aW91cyBjYWxsIGlzIGNhbGxlZC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyCiBgU2JEcm1Jc1NlcnZlckNlcnRpZmljYXRlVXBkYXRhYmxlYCBpcyBjYWxsZWQgZmlyc3QgYW5kIHJldHVybmVkIHRydWUuCiAKLWBkcm1fc3lzdGVtYDogVGhlIERSTSBzeXN0ZW0gd2hvc2Ugc2VydmVyIGNlcnRpZmljYXRlIGlzIGJlaW5nIHVwZGF0ZWQuCi1gdGlja2V0YDogVGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZQotY29uY3VycmVudCBjYWxscyB0byBTYkRybVVwZGF0ZVNlcnZlckNlcnRpZmljYXRlKCksIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCi1gc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2tgIGFzLWlzLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCi1jYWxsZXIgdG8gZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nIG11bHRpcGxlIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUKLXRpY2tldCBtYXkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4gVGhlIHZhbHVlIGBrU2JEcm1UaWNrZXRJbnZhbGlkYCBtdXN0Ci1ub3QgYmUgdXNlZC4gYGNlcnRpZmljYXRlYDogUG9pbnRlciB0byB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGRhdGEuCi1gY2VydGlmaWNhdGVfc2l6ZWA6IFNpemUgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBkYXRhLgorYGRybV9zeXN0ZW1gOiBUaGUgRFJNIHN5c3RlbSB3aG9zZSBzZXJ2ZXIgY2VydGlmaWNhdGUgaXMgYmVpbmcgdXBkYXRlZC4gTXVzdCBub3QKK2JlIGBrU2JEcm1TeXN0ZW1JbnZhbGlkYC4gYHRpY2tldGA6IFRoZSBvcGFxdWUgSUQgdGhhdCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2gKK2NhbGxiYWNrcyBmcm9tIG11bHRpcGxlIGNvbmN1cnJlbnQgY2FsbHMgdG8gU2JEcm1VcGRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZSgpLAord2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYHNlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX2NhbGxiYWNrYCBhcy1pcy4gSXQgaXMgdGhlCityZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZQorcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQgbWF5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFRoZSB2YWx1ZQorYGtTYkRybVRpY2tldEludmFsaWRgIG11c3Qgbm90IGJlIHVzZWQuIGBjZXJ0aWZpY2F0ZWA6IFBvaW50ZXIgdG8gdGhlIHNlcnZlcgorY2VydGlmaWNhdGUgZGF0YS4gTXVzdCBub3QgYmUgTlVMTC4gYGNlcnRpZmljYXRlX3NpemVgOiBTaXplIG9mIHRoZSBzZXJ2ZXIKK2NlcnRpZmljYXRlIGRhdGEuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zOTEsMjIgKzM5NSwyMyBAQAogVXBkYXRlIHNlc3Npb24gd2l0aCBga2V5YCwgaW4gYGRybV9zeXN0ZW1gJ3Mga2V5IHN5c3RlbSwgZnJvbSB0aGUgbGljZW5zZSBzZXJ2ZXIKIHJlc3BvbnNlLiBDYWxscyBgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrYCB3aXRoIGBjb250ZXh0YCBhbmQgd2hldGhlciB0aGUgdXBkYXRlCiBzdWNjZWVkZWQuIGBjb250ZXh0YCBtYXkgYmUgdXNlZCB0byByb3V0ZSBjYWxsYmFja3MgYmFjayB0byBhbiBvYmplY3QgaW5zdGFuY2UuCitUaGUgYGtleWAgbXVzdCBub3QgYmUgTlVMTC4KIAotYHRpY2tldGAgaXMgdGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZQotY29uY3VycmVudCBjYWxscyB0byBTYkRybVVwZGF0ZVNlc3Npb24oKSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8KLWBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2tgIGFzLWlzLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0bwotZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nIG11bHRpcGxlIGNhbGxzIHdpdGggdGhlIHNhbWUgdGlja2V0IG1heQotcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KK2Bkcm1fc3lzdGVtYCBtdXN0IG5vdCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAuIGB0aWNrZXRgIGlzIHRoZSBvcGFxdWUgSUQgdGhhdAorYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGNhbGxiYWNrcyBmcm9tIG11bHRpcGxlIGNvbmN1cnJlbnQgY2FsbHMgdG8KK1NiRHJtVXBkYXRlU2Vzc2lvbigpLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrYCBhcy1pcy4KK0l0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZworbXVsdGlwbGUgY2FsbHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQgbWF5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCiAKIE9uY2UgdGhlIHNlc3Npb24gaXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQsIGFuIFNiUGxheWVyIG9yIFNiRGVjb2RlciBhc3NvY2lhdGVkCiB3aXRoIHRoYXQgRFJNIGtleSBzeXN0ZW0gd2lsbCBiZSBhYmxlIHRvIGRlY3J5cHQgZW5jcnlwdGVkIHNhbXBsZXMuCiAKIGBkcm1fc3lzdGVtYCdzIGBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2tgIG1heSBjYWxsZWQgZWl0aGVyIGZyb20gdGhlIGN1cnJlbnQKLXRocmVhZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9yIGZyb20gYW5vdGhlciB0aHJlYWQuCit0aHJlYWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBvciBmcm9tIGFub3RoZXIgdGhyZWFkLiBUaGUgYHNlc3Npb25faWRgCittdXN0IG5vdCBiZSBOVUxMLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCiB2b2lkIFNiRHJtVXBkYXRlU2Vzc2lvbihTYkRybVN5c3RlbSBkcm1fc3lzdGVtLCBpbnQgdGlja2V0LCBjb25zdCB2b2lkICprZXksIGludCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqc2Vzc2lvbl9pZCwgaW50IHNlc3Npb25faWRfc2l6ZSkKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9ldmVudC5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2V2ZW50Lm1kCmluZGV4IDhkMjBjNmYuLjU4Y2IxZjQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2V2ZW50Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2V2ZW50Lm1kCkBAIC0zLDEwICszLDYgQEAKIHRpdGxlOiAiU3RhcmJvYXJkIE1vZHVsZSBSZWZlcmVuY2U6IGV2ZW50LmgiCiAtLS0KIAotRm9yIFNCX0FQSV9WRVJTSU9OID49IDEzCi0KLU1vZHVsZSBPdmVydmlldzogU3RhcmJvYXJkIEV2ZW50IG1vZHVsZQotCiBEZWZpbmVzIHRoZSBldmVudCBzeXN0ZW0gdGhhdCB3cmFwcyB0aGUgU3RhcmJvYXJkIG1haW4gbG9vcCBhbmQgZW50cnkgcG9pbnQuCiAKICMjIFRoZSBTdGFyYm9hcmQgQXBwbGljYXRpb24gTGlmZWN5Y2xlICMjCkBAIC04Miw3NSArNzgsNiBAQAogTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gdHJhbnNpdGlvbiB0aHJvdWdoIGBCTFVSUkVEYCwKIGBDT05DRUFMRURgIHRvIGBGUk9aRU5gIGJlZm9yZSByZWNlaXZpbmcgYFN0b3BgIG9yIGJlaW5nIGtpbGxlZC4KIAotRm9yIFNCX0FQSV9WRVJTSU9OIDwgMTMKLQotTW9kdWxlIE92ZXJ2aWV3OiBTdGFyYm9hcmQgRXZlbnQgbW9kdWxlCi0KLURlZmluZXMgdGhlIGV2ZW50IHN5c3RlbSB0aGF0IHdyYXBzIHRoZSBTdGFyYm9hcmQgbWFpbiBsb29wIGFuZCBlbnRyeSBwb2ludC4KLQotIyMgVGhlIFN0YXJib2FyZCBBcHBsaWNhdGlvbiBMaWZlY3ljbGUgIyMKLQotYGBgCi0gICAgLS0tLS0tLS0tLSAqCi0gICB8ICAgICAgICAgICB8Ci0gICB8ICAgICAgICBQcmVsb2FkCi0gICB8ICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICBWCi0gU3RhcnQgICBbIFBSRUxPQURJTkcgXSAtLS0tLS0tLS0tLS0KLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICBTdGFydCAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgIHwKLSAgICAtLS0tPiBbIFNUQVJURUQgXSA8LS0tLSAgICAgICAgIHwKLSAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgIHwKLSAgICAgICAgICAgICBQYXVzZSAgICAgICBVbnBhdXNlICAgIHwKLSAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIFN1c3BlbmQKLSAgICAgICAgICAgICAgIFYgICAgICAgICAgIHwgICAgICAgIHwKLSAgICAtLS0tLT4gWyBQQVVTRUQgXSAtLS0tLSAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLVJlc3VtZSAgICAgIFN1c3BlbmQgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgIHwKLSAgICAtLS0tIFsgU1VTUEVOREVEIF0gPC0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICBTdG9wCi0gICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICBWCi0gICAgICAgICAgWyBTVE9QUEVEIF0KLQotYGBgCi0KLVRoZSBmaXJzdCBldmVudCB0aGF0IGEgU3RhcmJvYXJkIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGlzIGVpdGhlciBgU3RhcnRgCi0oYGtTYkV2ZW50VHlwZVN0YXJ0YCkgb3IgYFByZWxvYWRgIChga1NiRXZlbnRUeXBlUHJlbG9hZGApLiBgU3RhcnRgIHB1dHMgdGhlCi1hcHBsaWNhdGlvbiBpbiB0aGUgYFNUQVJURURgIHN0YXRlLCB3aGVyZWFzIGBQcmVsb2FkYCBwdXRzIHRoZSBhcHBsaWNhdGlvbiBpbgotdGhlIGBQUkVMT0FESU5HYCBzdGF0ZS4KLQotYFBSRUxPQURJTkdgIGNhbiBvbmx5IGhhcHBlbiBhcyB0aGUgZmlyc3QgYXBwbGljYXRpb24gc3RhdGUuIEluIHRoaXMgc3RhdGUsIHRoZQotYXBwbGljYXRpb24gc2hvdWxkIHN0YXJ0IGFuZCBydW4gYXMgbm9ybWFsLCBidXQgd2lsbCBub3QgcmVjZWl2ZSBhbnkgaW5wdXQsIGFuZAotc2hvdWxkIG5vdCB0cnkgdG8gaW5pdGlhbGl6ZSBncmFwaGljcyByZXNvdXJjZXMgdmlhIEdMLiBJbiBgUFJFTE9BRElOR2AsIHRoZQotYXBwbGljYXRpb24gY2FuIHJlY2VpdmUgYFN0YXJ0YCBvciBgU3VzcGVuZGAgZXZlbnRzLiBgU3RhcnRgIHdpbGwgcmVjZWl2ZSB0aGUKLXNhbWUgZGF0YSB0aGF0IHdhcyBwYXNzZWQgaW50byBgUHJlbG9hZGAuCi0KLUluIHRoZSBgU1RBUlRFRGAgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBpcyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgY2FuIGV4cGVjdCB0bwotZG8gYWxsIG9mIHRoZSBub3JtYWwgdGhpbmdzIGl0IG1pZ2h0IHdhbnQgdG8gZG8uIE9uY2UgaW4gdGhlIGBTVEFSVEVEYCBzdGF0ZSwgaXQKLW1heSByZWNlaXZlIGEgYFBhdXNlYCBldmVudCwgcHV0dGluZyB0aGUgYXBwbGljYXRpb24gaW50byB0aGUgYFBBVVNFRGAgc3RhdGUuCi0KLUluIHRoZSBgUEFVU0VEYCBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHZpc2libGUsIGJ1dCBoYXMgbG9zdCBmb2N1cywgb3IKLWl0IGlzIHBhcnRpYWxseSBvYnNjdXJlZCBieSBhIG1vZGFsIGRpYWxvZywgb3IgaXQgaXMgb24gaXRzIHdheSB0byBiZWluZyBzaHV0Ci1kb3duLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHBhdXNlIGFjdGl2aXR5IGluIHRoaXMgc3RhdGUuIEluIHRoaXMgc3RhdGUsIGl0IGNhbgotcmVjZWl2ZSBgVW5wYXVzZWAgdG8gYmUgYnJvdWdodCBiYWNrIHRvIHRoZSBmb3JlZ3JvdW5kIHN0YXRlIChgU1RBUlRFRGApLCBvcgotYFN1c3BlbmRgIHRvIGJlIHB1c2hlZCBmdXJ0aGVyIGluIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBgU1VTUEVOREVEYCBzdGF0ZS4KLQotSW4gdGhlIGBTVVNQRU5ERURgIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gaXMgZ2VuZXJhbGx5IG5vdCB2aXNpYmxlLiBJdCBzaG91bGQKLWltbWVkaWF0ZWx5IHJlbGVhc2UgYWxsIGdyYXBoaWNzIGFuZCB2aWRlbyByZXNvdXJjZXMsIGFuZCBzaHV0IGRvd24gYWxsCi1iYWNrZ3JvdW5kIGFjdGl2aXR5ICh0aW1lcnMsIHJlbmRlcmluZywgZXRjKS4gQWRkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24KLXNob3VsZCBmbHVzaCBzdG9yYWdlIHRvIGVuc3VyZSB0aGF0IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBraWxsZWQsIHRoZSBzdG9yYWdlCi13aWxsIGJlIHVwLXRvLWRhdGUuIFRoZSBhcHBsaWNhdGlvbiBtYXkgYmUga2lsbGVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3aWxsCi1pZGVhbGx5IHJlY2VpdmUgYSBgU3RvcGAgZXZlbnQgZm9yIGEgbW9yZSBncmFjZWZ1bCBzaHV0ZG93bi4KLQotTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gdHJhbnNpdGlvbiB0aHJvdWdoIGBQQVVTRURgIHRvCi1gU1VTUEVOREVEYCBiZWZvcmUgcmVjZWl2aW5nIGBTdG9wYCBvciBiZWluZyBraWxsZWQuCi0KICMjIEVudW1zICMjCiAKICMjIyBTYkV2ZW50VHlwZSAjIyMKQEAgLTQ0Niw3ICszNzMsNyBAQAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYAotU0JfSU1QT1JUIHZvaWQgU2JFdmVudEhhbmRsZShjb25zdCBTYkV2ZW50ICpldmVudCkKK1NCX0VYUE9SVF9QTEFURk9STSB2b2lkIFNiRXZlbnRIYW5kbGUoY29uc3QgU2JFdmVudCAqZXZlbnQpCiBgYGAKIAogIyMjIFNiRXZlbnRJc0lkVmFsaWQgIyMjCkBAIC00NjUsMTMgKzM5MiwyNCBAQAogbWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQsIGJ1dCBgY2FsbGJhY2tgIGlzIGFsd2F5cyBjYWxsZWQgZnJvbSB0aGUgbWFpbgogU3RhcmJvYXJkIHRocmVhZCwgcXVldWVkIHdpdGggb3RoZXIgcGVuZGluZyBldmVudHMuCiAKLWBjYWxsYmFja2A6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIGBjb250ZXh0YDogVGhlIGNvbnRleHQgdGhhdCBpcwotcGFzc2VkIHRvIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBgZGVsYXlgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgbWljcm9zZWNvbmRzCi10byB3YWl0IGJlZm9yZSBjYWxsaW5nIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBTZXQgYGRlbGF5YCB0byBgMGAgdG8gY2FsbCB0aGUKLWNhbGxiYWNrIGFzIHNvb24gYXMgcG9zc2libGUuCitgY2FsbGJhY2tgOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBNdXN0IG5vdCBiZSBOVUxMLiBgY29udGV4dGA6IFRoZQorY29udGV4dCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgYGNhbGxiYWNrYCBmdW5jdGlvbi4gYGRlbGF5YDogVGhlIG1pbmltdW0gbnVtYmVyCitvZiBtaWNyb3NlY29uZHMgdG8gd2FpdCBiZWZvcmUgY2FsbGluZyB0aGUgYGNhbGxiYWNrYCBmdW5jdGlvbi4gU2V0IGBkZWxheWAgdG8KK2AwYCB0byBjYWxsIHRoZSBjYWxsYmFjayBhcyBzb29uIGFzIHBvc3NpYmxlLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCiBTYkV2ZW50SWQgU2JFdmVudFNjaGVkdWxlKFNiRXZlbnRDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqY29udGV4dCwgU2JUaW1lIGRlbGF5KQogYGBgCisKKyMjIyBTYlJ1blN0YXJib2FyZE1haW4gIyMjCisKK1NlcnZlcyBhcyB0aGUgZW50cnkgcG9pbnQgaW4gdGhlIFN0YXJib2FyZCBsaWJyYXJ5IGZvciBydW5uaW5nIHRoZSBTdGFyYm9hcmQKK2V2ZW50IGxvb3Agd2l0aCB0aGUgYXBwbGljYXRpb24gZXZlbnQgaGFuZGxlci4KKworIyMjIyBEZWNsYXJhdGlvbiAjIyMjCisKK2BgYAoraW50IFNiUnVuU3RhcmJvYXJkTWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIFNiRXZlbnRIYW5kbGVDYWxsYmFjayBjYWxsYmFjaykKK2BgYApkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvaW1hZ2UubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9pbWFnZS5tZAppbmRleCAzMDUwOTUzLi4xNDI3ZDM5IDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9pbWFnZS5tZAorKysgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9pbWFnZS5tZApAQCAtMjQsNyArMjQsNyBAQAogICByZXR1cm47CiB9CiAKLVNiRGVjb2RlVGFyZ2V0IHJlc3VsdF90YXJnZXQgPSBTYkRlY29kZUltYWdlKHByb3ZpZGVyLCBkYXRhLCBkYXRhX3NpemUsCitTYkRlY29kZVRhcmdldCByZXN1bHRfdGFyZ2V0ID0gU2JJbWFnZURlY29kZShwcm92aWRlciwgZGF0YSwgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZV90eXBlLCBmb3JtYXQpOwogYGBgCiAKQEAgLTQ4LDEzICs0OCwxMyBAQAogICAgIGNhbGxlZCwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHByb2NlZWQgdG8gZGVjb2RpbmcgaG93ZXZlciBpdCBkZXNpcmVzLgogCiAxLiAgVGhlIHByb3ZpZGVyIGlzIG5vdCByZXF1aXJlZCBhbmQgaXMgbm90IHBhc3NlZCBpbi4gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwKLSAgICBwcm9jZWVkIGZvcndhcmQuCi0KLVRodXMsIGl0IGlzIE5PVCBzYWZlIGZvciBjbGllbnRzIG9mIHRoaXMgQVBJIHRvIGFzc3VtZSB0aGF0IHRoZSBgcHJvdmlkZXJgIGl0Ci1wYXNzZXMgaW4gd2lsbCBiZSBjYWxsZWQuIEZpbmFsbHksIGlmIHRoZSBkZWNvZGUgc3VjY2VlZHMsIGEgbmV3IFNiRGVjb2RlVGFyZ2V0Ci13aWxsIGJlIGFsbG9jYXRlZC4gSWYgYG1pbWVfdHlwZWAgaW1hZ2UgZGVjb2RpbmcgZm9yIHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdAotc3VwcG9ydGVkIG9yIHRoZSBkZWNvZGUgZmFpbHMsIGtTYkRlY29kZVRhcmdldEludmFsaWQgd2lsbCBiZSByZXR1cm5lZCwgd2l0aCBhbnkKLWludGVybWVkaWF0ZSBhbGxvY2F0aW9ucyBiZWluZyBjbGVhbmVkIHVwIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICBwcm9jZWVkIGZvcndhcmQuIFRoZSBgZGF0YWAgcG9pbnRlciBtdXN0IG5vdCBiZSBOVUxMLiBUaGUgYG1pbWVfdHlwZWAgc3RyaW5nCisgICAgbXVzdCBub3QgYmUgTlVMTC4gVGh1cywgaXQgaXMgTk9UIHNhZmUgZm9yIGNsaWVudHMgb2YgdGhpcyBBUEkgdG8gYXNzdW1lCisgICAgdGhhdCB0aGUgYHByb3ZpZGVyYCBpdCBwYXNzZXMgaW4gd2lsbCBiZSBjYWxsZWQuIEZpbmFsbHksIGlmIHRoZSBkZWNvZGUKKyAgICBzdWNjZWVkcywgYSBuZXcgU2JEZWNvZGVUYXJnZXQgd2lsbCBiZSBhbGxvY2F0ZWQuIElmIGBtaW1lX3R5cGVgIGltYWdlCisgICAgZGVjb2RpbmcgZm9yIHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgdGhlIGRlY29kZSBmYWlscywKKyAgICBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkIHdpbGwgYmUgcmV0dXJuZWQsIHdpdGggYW55IGludGVybWVkaWF0ZSBhbGxvY2F0aW9ucworICAgIGJlaW5nIGNsZWFuZWQgdXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNjUsOSArNjUsMTAgQEAKICMjIyBTYkltYWdlSXNEZWNvZGVTdXBwb3J0ZWQgIyMjCiAKIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgZGVjb2RpbmcgYW4gaW1hZ2Ugb2YKLW1pbWUgdHlwZSBgbWltZV90eXBlYCBpbnRvIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGBmb3JtYXRgLiBUaGUgcmVzdWx0IG9mIHRoaXMKLWZ1bmN0aW9uIG11c3Qgbm90IGNoYW5nZSBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHByb2dyYW0sIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi1yZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhY2hlZCBpbmRlZmluaXRlbHkuCittaW1lIHR5cGUgYG1pbWVfdHlwZWAgaW50byBTYkRlY29kZVRhcmdldEZvcm1hdCBgZm9ybWF0YC4gVGhlIGBtaW1lX3R5cGVgIG11c3QKK25vdCBiZSBOVUxMLiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBub3QgY2hhbmdlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUKK3Byb2dyYW0sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FjaGVkCitpbmRlZmluaXRlbHkuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9rZXkubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9rZXkubWQKaW5kZXggMTZiZTNjMS4uMjgzNWIyMCAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMva2V5Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2tleS5tZApAQCAtMTk2LDYgKzE5Niw3IEBACiAqICAgYGtTYktleUdyZWVuYAogKiAgIGBrU2JLZXlZZWxsb3dgCiAqICAgYGtTYktleUJsdWVgCisqICAgYGtTYktleVJlY29yZGAKICogICBga1NiS2V5Q2hhbm5lbFVwYAogKiAgIGBrU2JLZXlDaGFubmVsRG93bmAKICogICBga1NiS2V5U3VidGl0bGVgCkBAIC0yOTAsNCArMjkxLDMgQEAKICogICBga1NiS2V5TW9kaWZpZXJzUG9pbnRlckJ1dHRvbk1pZGRsZWAKICogICBga1NiS2V5TW9kaWZpZXJzUG9pbnRlckJ1dHRvbkJhY2tgCiAqICAgYGtTYktleU1vZGlmaWVyc1BvaW50ZXJCdXR0b25Gb3J3YXJkYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9sb2cubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9sb2cubWQKaW5kZXggMWFkNmMyNC4uNDJkZTUxMyAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvbG9nLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL2xvZy5tZApAQCAtMzAsMTAgKzMwLDEwIEBACiBgcHJpb3JpdHlgOiBUaGUgU2JMb2dQcmlvcml0eSBhdCB3aGljaCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9nZ2VkLiBOb3RlIHRoYXQKIHBhc3NpbmcgYGtTYkxvZ1ByaW9yaXR5RmF0YWxgIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gU3VjaCBhIHBvbGljeSBtdXN0CiBiZSBlbmZvcmNlZCBhdCB0aGUgYXBwbGljYXRpb24gbGV2ZWwuIEluIGZhY3QsIGBwcmlvcml0eWAgbWF5IGJlIGNvbXBsZXRlbHkKLWlnbm9yZWQgb24gbWFueSBwbGF0Zm9ybXMuIGBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiBObyBmb3JtYXR0aW5nIGlzCi1yZXF1aXJlZCB0byBiZSBkb25lIG9uIHRoZSB2YWx1ZSwgaW5jbHVkaW5nIG5ld2xpbmUgdGVybWluYXRpb24uIFRoYXQgc2FpZCwKLXBsYXRmb3JtcyBjYW4gYWRqdXN0IHRoZSBtZXNzYWdlIHRvIGJlIG1vcmUgc3VpdGFibGUgZm9yIHRoZWlyIG91dHB1dCBtZXRob2QgYnkKLXdyYXBwaW5nIHRoZSB0ZXh0LCBzdHJpcHBpbmcgdW5wcmludGFibGUgY2hhcmFjdGVycywgZXRjLgoraWdub3JlZCBvbiBtYW55IHBsYXRmb3Jtcy4gYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE11c3Qgbm90IGJlCitOVUxMLiBObyBmb3JtYXR0aW5nIGlzIHJlcXVpcmVkIHRvIGJlIGRvbmUgb24gdGhlIHZhbHVlLCBpbmNsdWRpbmcgbmV3bGluZQordGVybWluYXRpb24uIFRoYXQgc2FpZCwgcGxhdGZvcm1zIGNhbiBhZGp1c3QgdGhlIG1lc3NhZ2UgdG8gYmUgbW9yZSBzdWl0YWJsZSBmb3IKK3RoZWlyIG91dHB1dCBtZXRob2QgYnkgd3JhcHBpbmcgdGhlIHRleHQsIHN0cmlwcGluZyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCBldGMuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC03MCw3ICs3MCw3IEBACiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCi12b2lkIHN0YXRpYyB2b2lkIHZvaWQgU2JMb2dGb3JtYXRGKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIFNCX1BSSU5URl9GT1JNQVQoMQordm9pZCBzdGF0aWMgdm9pZCBzdGF0aWMgdm9pZCBTYkxvZ0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCiBgYGAKIAogIyMjIFNiTG9nSXNUdHkgIyMjCkBAIC04OSw3ICs4OSw3IEBACiBhbiBhc3luY2hyb25vdXMgc2lnbmFsIGhhbmRsZXIgKGUuZy4gYSBgU0lHU0VHVmAgaGFuZGxlcikuIEl0IHNob3VsZCBub3QgZG8gYW55CiBhZGRpdGlvbmFsIGZvcm1hdHRpbmcuCiAKLWBtZXNzYWdlYDogVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgorYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIE11c3Qgbm90IGJlIE5VTEwuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0xMzIsNiArMTMyLDUgQEAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCiBgYGAKLXZvaWQgc3RhdGljIHZvaWQgdm9pZCBTYkxvZ1Jhd0Zvcm1hdEYoY29uc3QgY2hhciAqZm9ybWF0LC4uLikgU0JfUFJJTlRGX0ZPUk1BVCgxCit2b2lkIHN0YXRpYyB2b2lkIHN0YXRpYyB2b2lkIFNiTG9nUmF3Rm9ybWF0Rihjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBTQl9QUklOVEZfRk9STUFUKDEKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9tZWRpYS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL21lZGlhLm1kCmluZGV4IGQ5Mjc0NzMuLjEzMjE2NmMgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL21lZGlhLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL21lZGlhLm1kCkBAIC01OSwxMSArNTksMjAgQEAKIAogIyMjIyBWYWx1ZXMgIyMjIwogCi0qICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JOb25lYAorKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yVW5rbm93bmAKICogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckFuYWxvZ2AKICogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckJsdWV0b290aGAKKyogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckJ1aWx0SW5gCiAqICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JIZG1pYAotKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yTmV0d29ya2AKKyogICBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvclJlbW90ZVdpcmVkYAorCisgICAgQSB3aXJlZCByZW1vdGUgYXVkaW8gb3V0cHV0LCBsaWtlIGEgcmVtb3RlIHNwZWFrZXIgdmlhIEV0aGVybmV0LgorKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yUmVtb3RlV2lyZWxlc3NgCisKKyAgICBBIHdpcmVsZXNzIHJlbW90ZSBhdWRpbyBvdXRwdXQsIGxpa2UgYSByZW1vdGUgc3BlYWtlciB2aWEgV2ktRmkuCisqICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JSZW1vdGVPdGhlcmAKKworICAgIEEgcmVtb3RlIGF1ZGlvIG91dHB1dCBjYW5ub3QgYmUgY2xhc3NpZmllZCBpbnRvIG90aGVyIGV4aXN0aW5nIHR5cGVzLgogKiAgIGBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yU3BkaWZgCiAqICAgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JVc2JgCiAKQEAgLTE3NCwxMyArMTgzLDEwIEBACiAKICMjIyMgTWVtYmVycyAjIyMjCiAKLSogICBgaW50IGluZGV4YAotCi0gICAgVGhlIHBsYXRmb3JtLWRlZmluZWQgaW5kZXggb2YgdGhlIGFzc29jaWF0ZWQgYXVkaW8gb3V0cHV0LgogKiAgIGBTYk1lZGlhQXVkaW9Db25uZWN0b3IgY29ubmVjdG9yYAogCi0gICAgVGhlIHR5cGUgb2YgYXVkaW8gY29ubmVjdG9yLiBXaWxsIGJlIHRoZSBlbXB0eSBga1NiTWVkaWFBdWRpb0Nvbm5lY3Rvck5vbmVgCi0gICAgaWYgdGhpcyBkZXZpY2UgY2Fubm90IHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4KKyAgICBUaGUgdHlwZSBvZiBhdWRpbyBjb25uZWN0b3IuIFdpbGwgYmUgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JVbmtub3duYCBpZiB0aGlzCisgICAgZGV2aWNlIGNhbm5vdCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uCiAqICAgYFNiVGltZSBsYXRlbmN5YAogCiAgICAgVGhlIGV4cGVjdGVkIGxhdGVuY3kgb2YgYXVkaW8gb3ZlciB0aGlzIG91dHB1dCwgaW4gbWljcm9zZWNvbmRzLCBvciBgMGAgaWYKQEAgLTE5NiwxMyArMjAyLDE5IEBACiAKICMjIyBTYk1lZGlhQXVkaW9TYW1wbGVJbmZvICMjIwogCi1BbiBhdWRpbyBzYW1wbGUgaW5mbywgd2hpY2ggaXMgYSBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGF1ZGlvIHNhbXBsZS4gVGhpcyBhY3RzCi1hcyBhIHNldCBvZiBpbnN0cnVjdGlvbnMgdG8gdGhlIGF1ZGlvIGRlY29kZXIuCitUaGUgc2V0IG9mIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBkZWNvZGVyIG9yIHBsYXllciBmb3IgZWFjaCBhdWRpbyBzYW1wbGUuCiAKLVRoZSBhdWRpbyBzYW1wbGUgaW5mbyBjb25zaXN0cyBvZiBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgYFdBVkVGT1JNQVRFWGAKLXN0cnVjdHVyZSwgYXMgd2VsbCBhcyBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGF1ZGlvIGRlY29kZXIsIGluY2x1ZGluZyB0aGUKLUF1ZGlvLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmllbGQuIFRoZSBgV0FWRUZPUk1BVEVYYCBzdHJ1Y3R1cmUgaXMgc3BlY2lmaWVkIGF0Ci1baHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMzkwOTcwKHY9dnMuODUpLmFzcHhdKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDM5MDk3MCh2PXZzLjg1KS5hc3B4KXgpIC4KKyMjIyMgTWVtYmVycyAjIyMjCisKKyogICBgU2JNZWRpYUF1ZGlvU3RyZWFtSW5mbyBzdHJlYW1faW5mb2AKKworICAgIFRoZSBzZXQgb2YgaW5mb3JtYXRpb24gb2YgdGhlIHZpZGVvIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzYW1wbGUuCisqICAgYFNiVGltZSBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9mcm9udGAKKyogICBgU2JUaW1lIGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2JhY2tgCisKKyMjIyBTYk1lZGlhQXVkaW9TdHJlYW1JbmZvICMjIworCitUaGUgc2V0IG9mIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBkZWNvZGVyIG9yIHBsYXllciBmb3IgZWFjaCBhdWRpbyBzdHJlYW0uCiAKICMjIyMgTWVtYmVycyAjIyMjCiAKQEAgLTIxNCwyMSArMjI2LDEyIEBACiAgICAgVGhlIG1pbWUgb2YgdGhlIGF1ZGlvIHN0cmVhbSB3aGVuIGBjb2RlY2AgaXNuJ3Qga1NiTWVkaWFBdWRpb0NvZGVjTm9uZS4gSXQKICAgICBtYXkgcG9pbnQgdG8gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBtaW1lIGlzIG5vdCBhdmFpbGFibGUsIGFuZCBpdCBjYW4gb25seQogICAgIGJlIHNldCB0byBOVUxMIHdoZW4gYGNvZGVjYCBpcyBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lLgotKiAgIGB1aW50MTZfdCBmb3JtYXRfdGFnYAotCi0gICAgVGhlIHdhdmVmb3JtLWF1ZGlvIGZvcm1hdCB0eXBlIGNvZGUuCiAqICAgYHVpbnQxNl90IG51bWJlcl9vZl9jaGFubmVsc2AKIAogICAgIFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgaW4gdGhpcyBmb3JtYXQuIGAxYCBmb3IgbW9ubywgYDJgIGZvciBzdGVyZW8uCiAqICAgYHVpbnQzMl90IHNhbXBsZXNfcGVyX3NlY29uZGAKIAogICAgIFRoZSBzYW1wbGluZyByYXRlLgotKiAgIGB1aW50MzJfdCBhdmVyYWdlX2J5dGVzX3Blcl9zZWNvbmRgCi0KLSAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzZWNvbmQgZXhwZWN0ZWQgd2l0aCB0aGlzIGZvcm1hdC4KLSogICBgdWludDE2X3QgYmxvY2tfYWxpZ25tZW50YAotCi0gICAgQnl0ZSBibG9jayBhbGlnbm1lbnQsIGUuZywgNC4KICogICBgdWludDE2X3QgYml0c19wZXJfc2FtcGxlYAogCiAgICAgVGhlIGJpdCBkZXB0aCBmb3IgdGhlIHN0cmVhbSB0aGlzIHJlcHJlc2VudHMsIGUuZy4gYDhgIG9yIGAxNmAuCkBAIC0zNzcsNiArMzgwLDIwIEBACiAKICMjIyMgTWVtYmVycyAjIyMjCiAKKyogICBgU2JNZWRpYVZpZGVvU3RyZWFtSW5mbyBzdHJlYW1faW5mb2AKKworICAgIFRoZSBzZXQgb2YgaW5mb3JtYXRpb24gb2YgdGhlIHZpZGVvIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzYW1wbGUuCisqICAgYGJvb2wgaXNfa2V5X2ZyYW1lYAorCisgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgc2FtcGxlIGlzIGEga2V5IGZyYW1lIChJLWZyYW1lKS4gQXZjIHZpZGVvCisgICAga2V5IGZyYW1lcyBtdXN0IGFsd2F5cyBzdGFydCB3aXRoIFNQUyBhbmQgUFBTIE5BTCB1bml0cy4KKworIyMjIFNiTWVkaWFWaWRlb1N0cmVhbUluZm8gIyMjCisKK1RoZSBzZXQgb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIGRlY29kZXIgb3IgcGxheWVyIGZvciBlYWNoIHZpZGVvIHN0cmVhbS4KKworIyMjIyBNZW1iZXJzICMjIyMKKwogKiAgIGBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlY2AKIAogICAgIFRoZSB2aWRlbyBjb2RlYyBvZiB0aGlzIHNhbXBsZS4KQEAgLTM5NywxMCArNDE0LDYgQEAKICAgICBzZWNvbmQgaGlnaGVyIHRoYW4gMTUgZnBzLiBXaGVuIHRoZSBtYXhpbXVtcyBhcmUgdW5rbm93biwgdGhpcyB3aWxsIGJlIHNldAogICAgIHRvIGFuIGVtcHR5IHN0cmluZy4gSXQgY2FuIG9ubHkgYmUgc2V0IHRvIE5VTEwgd2hlbiBgY29kZWNgIGlzCiAgICAga1NiTWVkaWFWaWRlb0NvZGVjTm9uZS4KLSogICBgYm9vbCBpc19rZXlfZnJhbWVgCi0KLSAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBzYW1wbGUgaXMgYSBrZXkgZnJhbWUgKEktZnJhbWUpLiBWaWRlbyBrZXkKLSAgICBmcmFtZXMgbXVzdCBhbHdheXMgc3RhcnQgd2l0aCBTUFMgYW5kIFBQUyBOQUwgdW5pdHMuCiAqICAgYGludCBmcmFtZV93aWR0aGAKIAogICAgIFRoZSBmcmFtZSB3aWR0aCBvZiB0aGlzIHNhbXBsZSwgaW4gcGl4ZWxzLiBBbHNvIGNvdWxkIGJlIHBhcnNlZCBmcm9tIHRoZQpAQCAtNjg2LDIxICs2OTksMyBAQAogYGBgCiBib29sIFNiTWVkaWFJc0J1ZmZlclVzaW5nTWVtb3J5UG9vbCgpCiBgYGAKLQotIyMjIFNiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb24gIyMjCi0KLUNvbW11bmljYXRlIHRvIHRoZSBwbGF0Zm9ybSBob3cgZmFyIHBhc3QgYGN1cnJlbnRfcGxheWJhY2tfcG9zaXRpb25gIHRoZSBhcHAKLXdpbGwgd3JpdGUgYXVkaW8gc2FtcGxlcy4gVGhlIGFwcCB3aWxsIHdyaXRlIGFsbCBzYW1wbGVzIGJldHdlZW4KLWBjdXJyZW50X3BsYXliYWNrX3Bvc2l0aW9uYCBhbmQgYGN1cnJlbnRfcGxheWJhY2tfcG9zaXRpb25gICsgYGR1cmF0aW9uYCwgYXMKLXNvb24gYXMgdGhleSBhcmUgYXZhaWxhYmxlLiBUaGUgYXBwIG1heSBzb21ldGltZXMgd3JpdGUgbW9yZSBzYW1wbGVzIHRoYW4gdGhhdCwKLWJ1dCB0aGUgYXBwIG9ubHkgZ3VhcmFudGVlcyB0byB3cml0ZSBgZHVyYXRpb25gIHBhc3QgYGN1cnJlbnRfcGxheWJhY2tfcG9zaXRpb25gCi1pbiBnZW5lcmFsLiBUaGUgcGxhdGZvcm0gaXMgcmVzcG9uc2libGUgZm9yIGd1YXJhbnRlZWluZyB0aGF0IHdoZW4gb25seQotYGR1cmF0aW9uYCBhdWRpbyBzYW1wbGVzIGFyZSB3cml0dGVuIGF0IGEgdGltZSwgbm8gcGxheWJhY2sgaXNzdWVzIG9jY3VyIChzdWNoCi1hcyB0cmFuc2llbnQgb3IgaW5kZWZpbml0ZSBoYW5naW5nKS4gVGhlIHBsYXRmb3JtIG1heSBhc3N1bWUgYGR1cmF0aW9uYCA+PSAwLjUKLXNlY29uZHMuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXZvaWQgU2JNZWRpYVNldEF1ZGlvV3JpdGVEdXJhdGlvbihTYlRpbWUgZHVyYXRpb24pCi1gYGAKZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL3BsYXllci5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL3BsYXllci5tZAppbmRleCBkNjkxMGUyLi44MDM5ZjZiIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9wbGF5ZXIubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvcGxheWVyLm1kCkBAIC0yMiw2ICsyMiwxNCBAQAogCiBXZWxsLWRlZmluZWQgdmFsdWUgZm9yIGFuIGludmFsaWQgcGxheWVyLgogCisjIyMga1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsICMjIworCitUaGUgYXVkaW8gd3JpdGUgZHVyYXRpb24gd2hlbiBhbGwgdGhlIGF1ZGlvIGNvbm5lY3RvcnMgYXJlIGxvY2FsLgorCisjIyMga1NiUGxheWVyV3JpdGVEdXJhdGlvblJlbW90ZSAjIyMKKworVGhlIGF1ZGlvIHdyaXRlIGR1cmF0aW9uIHdoZW4gYXQgbGVhc3Qgb25lIG9mIHRoZSBhdWRpbyBjb25uZWN0b3JzIGFyZSByZW1vdGUuCisKICMjIEVudW1zICMjCiAKICMjIyBTYlBsYXllckRlY29kZXJTdGF0ZSAjIyMKQEAgLTE1OSwxNSArMTY3LDE1IEBACiAgICAgUHJvdmlkZXMgYW4gYXBwcm9wcmlhdGUgRFJNIHN5c3RlbSBpZiB0aGUgbWVkaWEgc3RyZWFtIGhhcyBlbmNyeXB0ZWQKICAgICBwb3J0aW9ucy4gSXQgd2lsbCBiZSBga1NiRHJtU3lzdGVtSW52YWxpZGAgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBoYXZlCiAgICAgZW5jcnlwdGVkIHBvcnRpb25zLgotKiAgIGBTYk1lZGlhQXVkaW9TYW1wbGVJbmZvIGF1ZGlvX3NhbXBsZV9pbmZvYAorKiAgIGBTYk1lZGlhQXVkaW9TdHJlYW1JbmZvIGF1ZGlvX3N0cmVhbV9pbmZvYAogCi0gICAgQ29udGFpbnMgYSBwb3B1bGF0ZWQgU2JNZWRpYUF1ZGlvU2FtcGxlSW5mbyBpZiBgYXVkaW9fc2FtcGxlX2luZm8uY29kZWNgCi0gICAgaXNuJ3QgYGtTYk1lZGlhQXVkaW9Db2RlY05vbmVgLiBXaGVuIGBhdWRpb19zYW1wbGVfaW5mby5jb2RlY2AgaXMKKyAgICBDb250YWlucyBhIHBvcHVsYXRlZCBTYk1lZGlhQXVkaW9TdHJlYW1JbmZvIGlmIGBhdWRpb19zdHJlYW1faW5mby5jb2RlY2AKKyAgICBpc24ndCBga1NiTWVkaWFBdWRpb0NvZGVjTm9uZWAuIFdoZW4gYGF1ZGlvX3N0cmVhbV9pbmZvLmNvZGVjYCBpcwogICAgIGBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lYCwgdGhlIHZpZGVvIGRvZXNuJ3QgaGF2ZSBhbiBhdWRpbyB0cmFjay4KLSogICBgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyB2aWRlb19zYW1wbGVfaW5mb2AKKyogICBgU2JNZWRpYVZpZGVvU3RyZWFtSW5mbyB2aWRlb19zdHJlYW1faW5mb2AKIAotICAgIENvbnRhaW5zIGEgcG9wdWxhdGVkIFNiTWVkaWFWaWRlb1NhbXBsZUluZm8gaWYgYHZpZGVvX3NhbXBsZV9pbmZvLmNvZGVjYAotICAgIGlzbid0IGBrU2JNZWRpYVZpZGVvQ29kZWNOb25lYC4gV2hlbiBgdmlkZW9fc2FtcGxlX2luZm8uY29kZWNgIGlzCisgICAgQ29udGFpbnMgYSBwb3B1bGF0ZWQgU2JNZWRpYVZpZGVvU3RyZWFtSW5mbyBpZiBgdmlkZW9fc3RyZWFtX2luZm8uY29kZWNgCisgICAgaXNuJ3QgYGtTYk1lZGlhVmlkZW9Db2RlY05vbmVgLiBXaGVuIGB2aWRlb19zdHJlYW1faW5mby5jb2RlY2AgaXMKICAgICBga1NiTWVkaWFWaWRlb0NvZGVjTm9uZWAsIHRoZSB2aWRlbyBpcyBhdWRpbyBvbmx5LgogKiAgIGBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVgCiAKQEAgLTE3OCw3ICsxODYsNyBAQAogICAgIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHB1bGwgdmlhIGNhbGxzIHRvCiAgICAgU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoKS4KIAotIyMjIFNiUGxheWVySW5mbzIgIyMjCisjIyMgU2JQbGF5ZXJJbmZvICMjIwogCiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBtZWRpYSBwbGF5YmFjayBzdGF0ZS4KIApAQCAtMjMxLDcgKzIzOSw3IEBACiAKICMjIyBTYlBsYXllclNhbXBsZUluZm8gIyMjCiAKLUluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlMi4KK0luZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4gaW50byBTYlBsYXllcldyaXRlU2FtcGxlcygpLgogCiAjIyMjIE1lbWJlcnMgIyMjIwogCkBAIC0yOTcsNyArMzA1LDcgQEAKIAogKiAgIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHBhc3MgYHBsYXllcmAgaW50byBhbnkgb3RoZXIgYFNiUGxheWVyYCBmdW5jdGlvbiBvbmNlCiAgICAgU2JQbGF5ZXJEZXN0cm95IGhhcyBiZWVuIGNhbGxlZCBvbiB0aGF0IHBsYXllci4gYHBsYXllcmA6IFRoZSBwbGF5ZXIgdG8gYmUKLSAgICBkZXN0cm95ZWQuCisgICAgZGVzdHJveWVkLiBNdXN0IG5vdCBiZSBga1NiUGxheWVySW52YWxpZGAuCiAKICMjIyMgRGVjbGFyYXRpb24gIyMjIwogCkBAIC0zMDUsNiArMzEzLDcwIEBACiB2b2lkIFNiUGxheWVyRGVzdHJveShTYlBsYXllciBwbGF5ZXIpCiBgYGAKIAorIyMjIFNiUGxheWVyR2V0QXVkaW9Db25maWd1cmF0aW9uICMjIworCitSZXR1cm5zIHRoZSBhdWRpbyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGBwbGF5ZXJgLgorCitSZXR1cm5zIHRydWUgd2hlbiBgb3V0X2F1ZGlvX2NvbmZpZ3VyYXRpb25gIGlzIGZpbGxlZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBvZgordGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHVzZWQgYnkgYHBsYXllcmAuIFJldHVybnMgZmFsc2UKK2ZvciBgaW5kZXhgIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBhdWRpbyBvdXRwdXQgZm9yIHRoaXMgYHBsYXllcmAuCitSZXR1cm5zIGZhbHNlIGZvciBgaW5kZXhgIGdyZWF0ZXIgdGhhbiAwIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUKK2F1ZGlvIG91dHB1dCBjb25maWd1cmF0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmVzIGFscmVhZHkgcmV0dXJuZWQuCisKK1RoZSBhcHAgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHRvIGRldGVybWluZSBhdWRpbyByZWxhdGVkIGJlaGF2aW9ycywKK2xpa2U6CisKK0F1ZGlvIFdyaXRlIER1cmF0aW9uOiBBdWRpbyB3cml0ZSBkdXJhdGlvbiBpcyBob3cgZmFyIHBhc3QgdGhlIGN1cnJlbnQgcGxheWJhY2sKK3Bvc2l0aW9uIHRoZSBhcHAgd2lsbCB3cml0ZSBhdWRpbyBzYW1wbGVzLiBUaGUgYXBwIHdpbGwgd3JpdGUgYWxsIHNhbXBsZXMKK2JldHdlZW4gYGN1cnJlbnRfcGxheWJhY2tfcG9zaXRpb25gIGFuZCBgY3VycmVudF9wbGF5YmFja19wb3NpdGlvbmAgKworYGF1ZGlvX3dyaXRlX2R1cmF0aW9uYCwgYXMgc29vbiBhcyB0aGV5IGFyZSBhdmFpbGFibGUuCisKK2BhdWRpb193cml0ZV9kdXJhdGlvbmAgd2lsbCBiZSB0byBga1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsYAora1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsIHdoZW4gYWxsIGF1ZGlvIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB0byBgcGxheWVyYCBpcworbG9jYWwsIG9yIGlmIHRoZXJlIGlzbid0IGFueSBhdWRpbyBvdXRwdXQuIEl0IHdpbGwgYmUgc2V0IHRvCitga1NiUGxheWVyV3JpdGVEdXJhdGlvblJlbW90ZWAga1NiUGxheWVyV3JpdGVEdXJhdGlvblJlbW90ZSBmb3IgcmVtb3RlIG9yCit3aXJlbGVzcyBhdWRpbyBvdXRwdXRzLCBpLmUuIG9uZSBvZiBga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckJsdWV0b290aGAKK2tTYk1lZGlhQXVkaW9Db25uZWN0b3JCbHVldG9vdGggb3IgYGtTYk1lZGlhQXVkaW9Db25uZWN0b3JSZW1vdGUqYAora1NiTWVkaWFBdWRpb0Nvbm5lY3RvclJlbW90ZSogLgorCitUaGUgYXBwIG9ubHkgZ3VhcmFudGVlcyB0byB3cml0ZSBgYXVkaW9fd3JpdGVfZHVyYXRpb25gIHBhc3QKK2BjdXJyZW50X3BsYXliYWNrX3Bvc2l0aW9uYCwgYnV0IHRoZSBhcHAgaXMgZnJlZSB0byB3cml0ZSBtb3JlIHNhbXBsZXMgdGhhbgordGhhdC4gU28gdGhlIHBsYXRmb3JtIHNob3VsZG4ndCByZWx5IG9uIHRoaXMgZm9yIGZsb3cgY29udHJvbC4gVGhlIHBsYXRmb3JtCitzaG91bGQgYWNoaWV2ZSBmbG93IGNvbnRyb2wgYnkgc2VuZGluZyBga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhYAora1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhIGxlc3MgZnJlcXVlbnRseS4KKworVGhlIHBsYXRmb3JtIGlzIHJlc3BvbnNpYmxlIGZvciBndWFyYW50ZWVpbmcgdGhhdCB3aGVuIG9ubHkKK2BhdWRpb193cml0ZV9kdXJhdGlvbmAgYXVkaW8gc2FtcGxlcyBhcmUgd3JpdHRlbiBhdCBhIHRpbWUsIG5vIHBsYXliYWNrIGlzc3Vlcworb2NjdXIgKHN1Y2ggYXMgdHJhbnNpZW50IG9yIGluZGVmaW5pdGUgaGFuZ2luZykuCisKK1RoZSBhdWRpbyBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgYXZhaWxhYmxlIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCB0aGV5IGhhdmUKK3RvIGJlIGF2YWlsYWJsZSB3aGVuIHRoZSBgcGxheWVyYCBpcyBhdCBga1NiUGxheWVyU3RhdGVQcmVzZW50aW5nYAora1NiUGxheWVyU3RhdGVQcmVzZW50aW5nICwgdW5sZXNzIHRoZSBhdWRpbyBjb2RlYyBpcyBga1NiTWVkaWFBdWRpb0NvZGVjTm9uZWAgb3IKK3RoZXJlJ3Mgbm8gd3JpdHRlbiBhdWRpbyBpbnB1dHMuCisKK1RoZSBhcHAgd2lsbCBzZXQgYGF1ZGlvX3dyaXRlX2R1cmF0aW9uYCB0byBga1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsYAora1NiUGxheWVyV3JpdGVEdXJhdGlvbkxvY2FsIHdoZW4gdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gaXNuJ3QgYXZhaWxhYmxlIChpLmUuCit0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIGluZGV4IGlzIDApLiBUaGUgcGxhdGZvcm0gaGFzIHRvIG1ha2UgdGhlIGF1ZGlvCitjb25maWd1cmF0aW9uIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgU2JQbGF5ZXIgaXMgY3JlYXRlZCwgaWYgaXQgZXhwZWN0cwordGhlIGFwcCB0byB0cmVhdCB0aGUgcGxhdGZvcm0gYXMgdXNpbmcgd2lyZWxlc3MgYXVkaW8gb3V0cHV0cy4KKworT25jZSBhdCBsZWFzdCBvbmUgYXVkaW8gY29uZmlndXJhdGlvbnMgYXJlIHJldHVybmVkLCB0aGUgcmV0dXJuIHZhbHVlcyBhbmQgdGhlaXIKK29yZGVycyBzaG91bGRuJ3QgY2hhbmdlIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mIGBwbGF5ZXJgLiBUaGUgcGxhdGZvcm0gbWF5CitpbmZvcm0gdGhlIGFwcCBvZiBhbnkgY2hhbmdlcyBieSBzZW5kaW5nIGBrU2JQbGF5ZXJFcnJvckNhcGFiaWxpdHlDaGFuZ2VkYAora1NiUGxheWVyRXJyb3JDYXBhYmlsaXR5Q2hhbmdlZCB0byByZXF1ZXN0IGEgcGxheWJhY2sgcmVzdGFydC4KKworYHBsYXllcmA6IFRoZSBwbGF5ZXIgYWJvdXQgd2hpY2ggaW5mb3JtYXRpb24gaXMgYmVpbmcgcmV0cmlldmVkLiBNdXN0IG5vdCBiZQorYGtTYlBsYXllckludmFsaWRgLiBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIGF1ZGlvIG91dHB1dCBjb25maWd1cmF0aW9uLiBNdXN0CitiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gYG91dF9hdWRpb19jb25maWd1cmF0aW9uYDogVGhlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYXVkaW8gb3V0cHV0LCByZWZlciB0byBgU2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbmAgZm9yIG1vcmUgZGV0YWlscy4gTXVzdAorbm90IGJlIE5VTEwuCisKKyMjIyMgRGVjbGFyYXRpb24gIyMjIworCitgYGAKK2Jvb2wgU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb24oU2JQbGF5ZXIgcGxheWVyLCBpbnQgaW5kZXgsIFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24gKm91dF9hdWRpb19jb25maWd1cmF0aW9uKQorYGBgCisKICMjIyBTYlBsYXllckdldEN1cnJlbnRGcmFtZSAjIyMKIAogR2l2ZW4gYSBwbGF5ZXIgY3JlYXRlZCB3aXRoIHRoZSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlIG91dHB1dCBtb2RlLApAQCAtMzE1LDI2ICszODcsMTQgQEAKIHdpdGggYW4gb3V0cHV0IG1vZGUgb3RoZXIgdGhhbiBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLAoga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCBpcyByZXR1cm5lZC4KIAorYHBsYXllcmAgbXVzdCBub3QgYmUgYGtTYlBsYXllckludmFsaWRgLgorCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIAogYGBgCiBTYkRlY29kZVRhcmdldCBTYlBsYXllckdldEN1cnJlbnRGcmFtZShTYlBsYXllciBwbGF5ZXIpCiBgYGAKIAotIyMjIFNiUGxheWVyR2V0SW5mbzIgIyMjCi0KLUdldHMgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBwbGF5ZXIgc3RhdGUgYW5kIHdyaXRlcyBpdCB0byBgb3V0X3BsYXllcl9pbmZvYC4KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCB2ZXJ5IGZyZXF1ZW50bHkgYW5kIGlzIGV4cGVjdGVkIHRvIGJlIGluZXhwZW5zaXZlLgotCi1gcGxheWVyYDogVGhlIHBsYXllciBhYm91dCB3aGljaCBpbmZvcm1hdGlvbiBpcyBiZWluZyByZXRyaWV2ZWQuCi1gb3V0X3BsYXllcl9pbmZvYDogVGhlIGluZm9ybWF0aW9uIHJldHJpZXZlZCBmb3IgdGhlIHBsYXllci4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCBTYlBsYXllckdldEluZm8yKFNiUGxheWVyIHBsYXllciwgU2JQbGF5ZXJJbmZvMiAqb3V0X3BsYXllcl9pbmZvMikKLWBgYAotCiAjIyMgU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUgIyMjCiAKIFdyaXRlcyBhIHNpbmdsZSBzYW1wbGUgb2YgdGhlIGdpdmVuIG1lZGlhIHR5cGUgdG8gYHBsYXllcmAncyBpbnB1dCBzdHJlYW0uIEl0cwpAQCAtMzcxLDcgKzQzMSw3IEBACiB0aGUgY2FsbC4gTm90ZSB0aGF0IGl0IGlzIG5vdCB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBmdW5jdGlvbiB0byB2ZXJpZnkKIHdoZXRoZXIgdGhlIHZpZGVvIGRlc2NyaWJlZCBieSBgY3JlYXRpb25fcGFyYW1gIGNhbiBiZSBwbGF5ZWQgb24gdGhlIHBsYXRmb3JtLAogYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdHJ5IGl0cyBiZXN0IGVmZm9ydCB0byByZXR1cm4gYSB2YWxpZCBvdXRwdXQgbW9kZS4KLWBjcmVhdGlvbl9wYXJhbWAgd2lsbCBuZXZlciBiZSBOVUxMLgorYGNyZWF0aW9uX3BhcmFtYCBtdXN0IG5vdCBiZSBOVUxMLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDAzLDEyICs0NjMsMTIgQEAKIGltcGxlbWVudG9ycyBzaG91bGQgdGFrZSBjYXJlIHRvIGF2b2lkIHJlbGF0ZWQgcGVyZm9ybWFuY2UgY29uY2VybnMgd2l0aCBzdWNoCiBmcmVxdWVudCBjYWxscy4KIAotYHBsYXllcmA6IFRoZSBwbGF5ZXIgdGhhdCBpcyBiZWluZyByZXNpemVkLiBgel9pbmRleGA6IFRoZSB6LWluZGV4IG9mIHRoZQotcGxheWVyLiBXaGVuIHRoZSBib3VuZHMgb2YgbXVsdGlwbGUgcGxheWVycyBhcmUgb3ZlcmxhcHBlZCwgdGhlIG9uZSB3aXRoIGxhcmdlcgotei1pbmRleCB3aWxsIGJlIHJlbmRlcmVkIG9uIHRvcCBvZiB0aGUgb25lcyB3aXRoIHNtYWxsZXIgei1pbmRleC4gYHhgOiBUaGUKLXgtY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4gYHlgOiBUaGUgeS1jb29yZGluYXRlIG9mCi10aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4gYHdpZHRoYDogVGhlIHdpZHRoIG9mIHRoZSBwbGF5ZXIsIGluCi1waXhlbHMuIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBwbGF5ZXIsIGluIHBpeGVscy4KK2BwbGF5ZXJgOiBUaGUgcGxheWVyIHRoYXQgaXMgYmVpbmcgcmVzaXplZC4gTXVzdCBub3QgYmUgYGtTYlBsYXllckludmFsaWRgLgorYHpfaW5kZXhgOiBUaGUgei1pbmRleCBvZiB0aGUgcGxheWVyLiBXaGVuIHRoZSBib3VuZHMgb2YgbXVsdGlwbGUgcGxheWVycyBhcmUKK292ZXJsYXBwZWQsIHRoZSBvbmUgd2l0aCBsYXJnZXIgei1pbmRleCB3aWxsIGJlIHJlbmRlcmVkIG9uIHRvcCBvZiB0aGUgb25lcyB3aXRoCitzbWFsbGVyIHotaW5kZXguIGB4YDogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4KK2B5YDogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBsYXllci4gYHdpZHRoYDogVGhlIHdpZHRoCitvZiB0aGUgcGxheWVyLCBpbiBwaXhlbHMuIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBwbGF5ZXIsIGluIHBpeGVscy4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTQyOSw2ICs0ODksOCBAQAogdW5jaGFuZ2VkLCB0aGlzIGNhbiBoYXBwZW4gd2hlbiBgcGxheWJhY2tfcmF0ZWAgaXMgbmVnYXRpdmUgb3IgaWYgaXQgaXMgdG9vIGhpZ2gKIHRvIHN1cHBvcnQuCiAKK2BwbGF5ZXJgIG11c3Qgbm90IGJlIGBrU2JQbGF5ZXJJbnZhbGlkYC4KKwogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYApAQCAtNDM5LDEwICs1MDEsMTAgQEAKIAogU2V0cyB0aGUgcGxheWVyJ3Mgdm9sdW1lLgogCi1gcGxheWVyYDogVGhlIHBsYXllciBpbiB3aGljaCB0aGUgdm9sdW1lIGlzIGJlaW5nIGFkanVzdGVkLiBgdm9sdW1lYDogVGhlIG5ldwotcGxheWVyIHZvbHVtZS4gVGhlIHZhbHVlIG11c3QgYmUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAsIGluY2x1c2l2ZS4gQSB2YWx1ZSBvZgotYDAuMGAgbWVhbnMgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlIG11dGVkLCBhbmQgYSB2YWx1ZSBvZiBgMS4wYCBtZWFucyB0aGF0IGl0Ci1zaG91bGQgYmUgcGxheWVkIGF0IGZ1bGwgdm9sdW1lLgorYHBsYXllcmA6IFRoZSBwbGF5ZXIgaW4gd2hpY2ggdGhlIHZvbHVtZSBpcyBiZWluZyBhZGp1c3RlZC4gTXVzdCBub3QgYmUKK2BrU2JQbGF5ZXJJbnZhbGlkYC4gYHZvbHVtZWA6IFRoZSBuZXcgcGxheWVyIHZvbHVtZS4gVGhlIHZhbHVlIG11c3QgYmUgYmV0d2VlbgorYDAuMGAgYW5kIGAxLjBgLCBpbmNsdXNpdmUuIEEgdmFsdWUgb2YgYDAuMGAgbWVhbnMgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlCittdXRlZCwgYW5kIGEgdmFsdWUgb2YgYDEuMGAgbWVhbnMgdGhhdCBpdCBzaG91bGQgYmUgcGxheWVkIGF0IGZ1bGwgdm9sdW1lLgogCiAjIyMjIERlY2xhcmF0aW9uICMjIyMKIApAQCAtNDY2LDMxICs1MjgsMjAgQEAKIHZvaWQgU2JQbGF5ZXJXcml0ZUVuZE9mU3RyZWFtKFNiUGxheWVyIHBsYXllciwgU2JNZWRpYVR5cGUgc3RyZWFtX3R5cGUpCiBgYGAKIAotIyMjIFNiUGxheWVyV3JpdGVTYW1wbGUyICMjIworIyMjIFNiUGxheWVyV3JpdGVTYW1wbGVzICMjIwogCi1Xcml0ZXMgc2FtcGxlcyBvZiB0aGUgZ2l2ZW4gbWVkaWEgdHlwZSB0byBgcGxheWVyYCdzIGlucHV0IHN0cmVhbS4gVGhlIGxpZmV0aW1lCi1vZiBgc2FtcGxlX2luZm9zYCwgYW5kIHRoZSBtZW1iZXJzIG9mIGl0cyBlbGVtZW50cyBsaWtlIGBidWZmZXJgLAotYHZpZGVvX3NhbXBsZV9pbmZvYCwgYW5kIGBkcm1faW5mb2AgKGFzIHdlbGwgYXMgbWVtYmVyIGBzdWJzYW1wbGVfbWFwcGluZ2AKLWNvbnRhaW5lZCBpbnNpZGUgaXQpIGFyZSBub3QgZ3VhcmFudGVlZCBwYXN0IHRoZSBjYWxsIHRvIFNiUGxheWVyV3JpdGVTYW1wbGUyLgotVGhhdCBtZWFucyB0aGF0IGJlZm9yZSByZXR1cm5pbmcsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHN5bmNocm9ub3VzbHkgY29weSBhbnkKLWluZm9ybWF0aW9uIGl0IHdhbnRzIHRvIHJldGFpbiBmcm9tIHRob3NlIHN0cnVjdHVyZXMuCi0KLVNiUGxheWVyV3JpdGVTYW1wbGUyIGFsbG93cyB3cml0aW5nIG9mIG11bHRpcGxlIHNhbXBsZXMgaW4gb25lIGNhbGwuCi0KLWBwbGF5ZXJgOiBUaGUgcGxheWVyIHRvIHdoaWNoIHRoZSBzYW1wbGUgaXMgd3JpdHRlbi4gYHNhbXBsZV90eXBlYDogVGhlIHR5cGUgb2YKLXNhbXBsZSBiZWluZyB3cml0dGVuLiBTZWUgdGhlIGBTYk1lZGlhVHlwZWAgZW51bSBpbiBtZWRpYS5oLiBgc2FtcGxlX2luZm9zYDogQQotcG9pbnRlciB0byBhbiBhcnJheSBvZiBTYlBsYXllclNhbXBsZUluZm8gd2l0aCBgbnVtYmVyX29mX3NhbXBsZV9pbmZvc2AKLWVsZW1lbnRzLCBlYWNoIGhvbGRzIHRoZSBkYXRhIGZvciBhbiBzYW1wbGUsIGkuZS4gYSBzZXF1ZW5jZSBvZiB3aG9sZSBOQUwgVW5pdHMKLWZvciB2aWRlbywgb3IgYSBjb21wbGV0ZSBhdWRpbyBmcmFtZS4gYHNhbXBsZV9pbmZvc2AgY2Fubm90IGJlIGFzc3VtZWQgdG8gbGl2ZQotcGFzdCB0aGUgY2FsbCBpbnRvIFNiUGxheWVyV3JpdGVTYW1wbGUyKCksIHNvIGl0IG11c3QgYmUgY29waWVkIGlmIGl0cyBjb250ZW50Ci13aWxsIGJlIHVzZWQgYWZ0ZXIgU2JQbGF5ZXJXcml0ZVNhbXBsZTIoKSByZXR1cm5zLiBgbnVtYmVyX29mX3NhbXBsZV9pbmZvc2A6Ci1TcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBjb250YWluZWQgaW5zaWRlIGBzYW1wbGVfaW5mb3NgLiBJdCBoYXMgdG8gYmUgYXQKLWxlYXN0IG9uZSwgYW5kIGxlc3MgdGhhbiB0aGUgcmV0dXJuIHZhbHVlIG9mCitgc2FtcGxlX3R5cGVgOiBUaGUgdHlwZSBvZiBzYW1wbGUgYmVpbmcgd3JpdHRlbi4gU2VlIHRoZSBgU2JNZWRpYVR5cGVgIGVudW0gaW4KK21lZGlhLmguIGBzYW1wbGVfaW5mb3NgOiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU2JQbGF5ZXJTYW1wbGVJbmZvIHdpdGgKK2BudW1iZXJfb2Zfc2FtcGxlX2luZm9zYCBlbGVtZW50cywgZWFjaCBob2xkcyB0aGUgZGF0YSBmb3IgYW4gc2FtcGxlLCBpLmUuIGEKK3NlcXVlbmNlIG9mIHdob2xlIE5BTCBVbml0cyBmb3IgdmlkZW8sIG9yIGEgY29tcGxldGUgYXVkaW8gZnJhbWUuIGBzYW1wbGVfaW5mb3NgCitjYW5ub3QgYmUgYXNzdW1lZCB0byBsaXZlIHBhc3QgdGhlIGNhbGwgaW50byBTYlBsYXllcldyaXRlU2FtcGxlcygpLCBzbyBpdCBtdXN0CitiZSBjb3BpZWQgaWYgaXRzIGNvbnRlbnQgd2lsbCBiZSB1c2VkIGFmdGVyIFNiUGxheWVyV3JpdGVTYW1wbGVzKCkgcmV0dXJucy4KK2BudW1iZXJfb2Zfc2FtcGxlX2luZm9zYDogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgY29udGFpbmVkIGluc2lkZQorYHNhbXBsZV9pbmZvc2AuIEl0IGhhcyB0byBiZSBhdCBsZWFzdCBvbmUsIGFuZCBsZXNzIHRoYW4gdGhlIHJldHVybiB2YWx1ZSBvZgogU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUoKS4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKIGBgYAotdm9pZCBTYlBsYXllcldyaXRlU2FtcGxlMihTYlBsYXllciBwbGF5ZXIsIFNiTWVkaWFUeXBlIHNhbXBsZV90eXBlLCBjb25zdCBTYlBsYXllclNhbXBsZUluZm8gKnNhbXBsZV9pbmZvcywgaW50IG51bWJlcl9vZl9zYW1wbGVfaW5mb3MpCit2b2lkIFNiUGxheWVyV3JpdGVTYW1wbGVzKFNiUGxheWVyIHBsYXllciwgU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUsIGNvbnN0IFNiUGxheWVyU2FtcGxlSW5mbyAqc2FtcGxlX2luZm9zLCBpbnQgbnVtYmVyX29mX3NhbXBsZV9pbmZvcykKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9zb2NrZXQubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9zb2NrZXQubWQKaW5kZXggNTQ4ZjU3ZC4uOWUwZjgxYiAxMDA2NDQKLS0tIGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvc29ja2V0Lm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL3NvY2tldC5tZApAQCAtNDE3LDggKzQxNyw4IEBACiB0aGUgYWRkcmVzcyBpcyB1bm5lY2Vzc2FyeSwgYnV0IGFsbG93ZWQuCiAKIGBzb2NrZXRgOiBUaGUgU2JTb2NrZXQgZnJvbSB3aGljaCBkYXRhIGlzIHJlYWQuIGBvdXRfZGF0YWA6IFRoZSBkYXRhIHJlYWQgZnJvbQotdGhlIHNvY2tldC4gYGRhdGFfc2l6ZWA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4gYG91dF9zb3VyY2VgOiBUaGUgc291cmNlCi1hZGRyZXNzIG9mIHRoZSBwYWNrZXQuCit0aGUgc29ja2V0LiBNdXN0IG5vdCBiZSBOVUxMLiBgZGF0YV9zaXplYDogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorYG91dF9zb3VyY2VgOiBUaGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTQ1NiwxMCArNDU2LDEwIEBACiBTYlNvY2tldEdldExhc3RFcnJvciByZXR1cm5zIGBrU2JTb2NrZXRQZW5kaW5nYCB0byBtYWtlIGl0IGEgYmVzdC1lZmZvcnQgd3JpdGUKIChidXQgc3RpbGwgb25seSB1cCB0byBub3QgYmxvY2tpbmcsIHVubGVzcyB5b3Ugd2FudCB0byBzcGluKS4KIAotYHNvY2tldGA6IFRoZSBTYlNvY2tldCB0byB1c2UgdG8gd3JpdGUgZGF0YS4gYGRhdGFgOiBUaGUgZGF0YSByZWFkIGZyb20gdGhlCi1zb2NrZXQuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGBkYXRhYCB0byB3cml0ZS4gYGRlc3RpbmF0aW9uYDogVGhlCi1sb2NhdGlvbiB0byB3aGljaCBkYXRhIGlzIHdyaXR0ZW4uIFRoaXMgdmFsdWUgbXVzdCBiZSBgTlVMTGAgZm9yIFRDUAotY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgZW5kcG9pbnQuCitgc29ja2V0YDogVGhlIFNiU29ja2V0IHRvIHVzZSB0byB3cml0ZSBkYXRhLiBgZGF0YWA6IFRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlCitzb2NrZXQuIE11c3Qgbm90IGJlIE5VTEwuIGBkYXRhX3NpemVgOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGBkYXRhYCB0byB3cml0ZS4KK2BkZXN0aW5hdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCBkYXRhIGlzIHdyaXR0ZW4uIFRoaXMgdmFsdWUgbXVzdCBiZSBgTlVMTGAKK2ZvciBUQ1AgY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgZW5kcG9pbnQuCiAKIFRoZSBwcmltYXJ5IHVzZSBvZiBgZGVzdGluYXRpb25gIGlzIHRvIHNlbmQgZGF0YWdyYW0gcGFja2V0cywgd2hpY2ggY2FuIGdvIG91dAogdG8gbXVsdGlwbGUgc291cmNlcyBmcm9tIGEgc2luZ2xlIFVEUCBzZXJ2ZXIgc29ja2V0LiBUQ1AgaGFzIHR3byBlbmRwb2ludHMKQEAgLTU4Myw0ICs1ODMsMyBAQAogYGBgCiBib29sIFNiU29ja2V0U2V0VGNwV2luZG93U2NhbGluZyhTYlNvY2tldCBzb2NrZXQsIGJvb2wgdmFsdWUpCiBgYGAKLQpkaWZmIC0tZ2l0IGEvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvc3BlZWNoX3JlY29nbml6ZXIubWQgYi9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9zcGVlY2hfcmVjb2duaXplci5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGExZGM2Yi4uMDAwMDAwMAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9zcGVlY2hfcmVjb2duaXplci5tZAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0tLS0KLWxheW91dDogZG9jCi10aXRsZTogIlN0YXJib2FyZCBNb2R1bGUgUmVmZXJlbmNlOiBzcGVlY2hfcmVjb2duaXplci5oIgotLS0tCi0KLURlZmluZXMgYSBzdHJlYW1pbmcgc3BlZWNoIHJlY29nbml6ZXIgQVBJLiBJdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHBsYXRmb3JtCi1zcGVlY2ggcmVjb2duaXRpb24gc2VydmljZS4KLQotTm90ZSB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzcGVlY2ggcmVjb2duaXplci4gQXR0ZW1wdGluZyB0byBjcmVhdGUgYSBzZWNvbmQKLXNwZWVjaCByZWNvZ25pemVyIHdpdGhvdXQgZGVzdHJveWluZyB0aGUgZmlyc3Qgb25lIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZAotYmVoYXZpb3IuCi0KLWBTYlNwZWVjaFJlY29nbml6ZXJDcmVhdGVgLCBgU2JTcGVlY2hSZWNvZ25pemVyU3RhcnRgLCBgU2JTcGVlY2hSZWNvZ25pemVyU3RvcGAsCi1gU2JTcGVlY2hSZWNvZ25pemVyQ2FuY2VsYCBhbmQgYFNiU3BlZWNoUmVjb2duaXplckRlc3Ryb3lgIHNob3VsZCBiZSBjYWxsZWQgZnJvbQotYSBzaW5nbGUgdGhyZWFkLiBDYWxsYmFja3MgZGVmaW5lZCBpbiBgU2JTcGVlY2hSZWNvZ25pemVySGFuZGxlcmAgd2lsbCBoYXBwZW4gb24KLWFub3RoZXIgdGhyZWFkLCBzbyBjYWxscyBiYWNrIGludG8gdGhlIFNiU3BlZWNoUmVjb2duaXplciBmcm9tIHRoZSBjYWxsYmFjawotdGhyZWFkIGFyZSBkaXNhbGxvd2VkLgotCi0jIyBNYWNyb3MgIyMKLQotIyMjIGtTYlNwZWVjaFJlY29nbml6ZXJJbnZhbGlkICMjIwotCi1XZWxsLWRlZmluZWQgdmFsdWUgZm9yIGFuIGludmFsaWQgc3BlZWNoIHJlY29nbml6ZXIgaGFuZGxlLgotCi0jIyBFbnVtcyAjIwotCi0jIyMgU2JTcGVlY2hSZWNvZ25pemVyRXJyb3IgIyMjCi0KLUluZGljYXRlcyB3aGF0IGhhcyBnb25lIHdyb25nIHdpdGggdGhlIHJlY29nbml0aW9uLgotCi0jIyMjIFZhbHVlcyAjIyMjCi0KLSogICBga1NiTm9TcGVlY2hFcnJvcmAKLQotICAgIE5vIHNwZWVjaCB3YXMgZGV0ZWN0ZWQuIFNwZWVjaCB0aW1lZCBvdXQuCi0qICAgYGtTYkFib3J0ZWRgCi0KLSAgICBTcGVlY2ggaW5wdXQgd2FzIGFib3J0ZWQgc29tZWhvdy4KLSogICBga1NiQXVkaW9DYXB0dXJlRXJyb3JgCi0KLSAgICBBdWRpbyBjYXB0dXJlIGZhaWxlZC4KLSogICBga1NiTmV0d29ya0Vycm9yYAotCi0gICAgU29tZSBuZXR3b3JrIGNvbW11bmljYXRpb24gdGhhdCB3YXMgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHJlY29nbml0aW9uCi0gICAgZmFpbGVkLgotKiAgIGBrU2JOb3RBbGxvd2VkYAotCi0gICAgVGhlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBhbGxvd2luZyBhbnkgc3BlZWNoIGlucHV0IHRvIG9jY3VyIGZvciByZWFzb25zIG9mCi0gICAgc2VjdXJpdHksIHByaXZhY3kgb3IgdXNlciBwcmVmZXJlbmNlLgotKiAgIGBrU2JTZXJ2aWNlTm90QWxsb3dlZGAKLQotICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgYWxsb3dpbmcgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBzcGVlY2ggc2VydmljZSwKLSAgICBidXQgd291bGQgYWxsb3cgc29tZSBzcGVlY2ggc2VydmljZSwgdG8gYmUgdXNlZCBlaXRoZXIgYmVjYXVzZSB0aGUKLSAgICBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlIHNlbGVjdGVkIG9uZSBvciBiZWNhdXNlIG9mIHJlYXNvbnMgb2YKLSAgICBzZWN1cml0eSwgcHJpdmFjeSBvciB1c2VyIHByZWZlcmVuY2UuCi0qICAgYGtTYkJhZEdyYW1tYXJgCi0KLSAgICBUaGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIHNwZWVjaCByZWNvZ25pdGlvbiBncmFtbWFyIG9yIHNlbWFudGljIHRhZ3MsIG9yCi0gICAgdGhlIGdyYW1tYXIgZm9ybWF0IG9yIHNlbWFudGljIHRhZyBmb3JtYXQgaXMgc3VwcG9ydGVkLgotKiAgIGBrU2JMYW5ndWFnZU5vdFN1cHBvcnRlZGAKLQotICAgIFRoZSBsYW5ndWFnZSB3YXMgbm90IHN1cHBvcnRlZC4KLQotIyMgVHlwZWRlZnMgIyMKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplciAjIyMKLQotQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBpbXBsZW1lbnRhdGlvbi1wcml2YXRlIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzcGVlY2gKLXJlY29nbml6ZXIuCi0KLSMjIyMgRGVmaW5pdGlvbiAjIyMjCi0KLWBgYAotdHlwZWRlZiBzdHJ1Y3QgU2JTcGVlY2hSZWNvZ25pemVyUHJpdmF0ZSogU2JTcGVlY2hSZWNvZ25pemVyCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplckVycm9yRnVuY3Rpb24gIyMjCi0KLUEgZnVuY3Rpb24gdG8gbm90aWZ5IHRoYXQgYSBzcGVlY2ggcmVjb2duaXRpb24gZXJyb3Igb2NjdXJyZWQuIGBlcnJvcmA6IFRoZQotb2NjdXJyZWQgc3BlZWNoIHJlY29nbml0aW9uIGVycm9yLgotCi0jIyMjIERlZmluaXRpb24gIyMjIwotCi1gYGAKLXR5cGVkZWYgdm9pZCgqIFNiU3BlZWNoUmVjb2duaXplckVycm9yRnVuY3Rpb24pICh2b2lkICpjb250ZXh0LCBTYlNwZWVjaFJlY29nbml6ZXJFcnJvciBlcnJvcikKLWBgYAotCi0jIyMgU2JTcGVlY2hSZWNvZ25pemVyUmVzdWx0c0Z1bmN0aW9uICMjIwotCi1BIGZ1bmN0aW9uIHRvIG5vdGlmeSB0aGF0IHRoZSByZWNvZ25pdGlvbiByZXN1bHRzIGFyZSByZWFkeS4gYHJlc3VsdHNgOiB0aGUgbGlzdAotb2YgcmVjb2duaXRpb24gcmVzdWx0cy4gYHJlc3VsdHNfc2l6ZWA6IHRoZSBudW1iZXIgb2YgYHJlc3VsdHNgLiBgaXNfZmluYWxgOgotaW5kaWNhdGVzIGlmIHRoZSBgcmVzdWx0c2AgaXMgZmluYWwuCi0KLSMjIyMgRGVmaW5pdGlvbiAjIyMjCi0KLWBgYAotdHlwZWRlZiB2b2lkKCogU2JTcGVlY2hSZWNvZ25pemVyUmVzdWx0c0Z1bmN0aW9uKSAodm9pZCAqY29udGV4dCwgU2JTcGVlY2hSZXN1bHQgKnJlc3VsdHMsIGludCByZXN1bHRzX3NpemUsIGJvb2wgaXNfZmluYWwpCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplclNwZWVjaERldGVjdGVkRnVuY3Rpb24gIyMjCi0KLUEgZnVuY3Rpb24gdG8gbm90aWZ5IHRoYXQgdGhlIHVzZXIgaGFzIHN0YXJ0ZWQgdG8gc3BlYWsgb3Igc3RvcHMgc3BlYWtpbmcuCi1gZGV0ZWN0ZWRgOiB0cnVlIGlmIHRoZSB1c2VyIGhhcyBzdGFydGVkIHRvIHNwZWFrLCBhbmQgZmFsc2UgaWYgdGhlIHVzZXIgc3RvcHMKLXNwZWFraW5nLgotCi0jIyMjIERlZmluaXRpb24gIyMjIwotCi1gYGAKLXR5cGVkZWYgdm9pZCgqIFNiU3BlZWNoUmVjb2duaXplclNwZWVjaERldGVjdGVkRnVuY3Rpb24pICh2b2lkICpjb250ZXh0LCBib29sIGRldGVjdGVkKQotYGBgCi0KLSMjIFN0cnVjdHMgIyMKLQotIyMjIFNiU3BlZWNoQ29uZmlndXJhdGlvbiAjIyMKLQotIyMjIyBNZW1iZXJzICMjIyMKLQotKiAgIGBib29sIGNvbnRpbnVvdXNgCi0KLSAgICBXaGVuIHRoZSBjb250aW51b3VzIHZhbHVlIGlzIHNldCB0byBmYWxzZSwgdGhlIGltcGxlbWVudGF0aW9uIE1VU1QgcmV0dXJuIG5vCi0gICAgbW9yZSB0aGFuIG9uZSBmaW5hbCByZXN1bHQgaW4gcmVzcG9uc2UgdG8gc3RhcnRpbmcgcmVjb2duaXRpb24uIFdoZW4gdGhlCi0gICAgY29udGludW91cyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHJldHVybiB6ZXJvIG9yCi0gICAgbW9yZSBmaW5hbCByZXN1bHRzIHJlcHJlc2VudGluZyBtdWx0aXBsZSBjb25zZWN1dGl2ZSByZWNvZ25pdGlvbnMgaW4KLSAgICByZXNwb25zZSB0byBzdGFydGluZyByZWNvZ25pdGlvbi4gVGhpcyBhdHRyaWJ1dGUgc2V0dGluZyBkb2VzIG5vdCBhZmZlY3QKLSAgICBpbnRlcmltIHJlc3VsdHMuCi0qICAgYGJvb2wgaW50ZXJpbV9yZXN1bHRzYAotCi0gICAgQ29udHJvbHMgd2hldGhlciBpbnRlcmltIHJlc3VsdHMgYXJlIHJldHVybmVkLiBXaGVuIHNldCB0byB0cnVlLCBpbnRlcmltCi0gICAgcmVzdWx0cyBTSE9VTEQgYmUgcmV0dXJuZWQuIFdoZW4gc2V0IHRvIGZhbHNlLCBpbnRlcmltIHJlc3VsdHMgTVVTVCBOT1QgYmUKLSAgICByZXR1cm5lZC4gVGhpcyB2YWx1ZSBzZXR0aW5nIGRvZXMgbm90IGFmZmVjdCBmaW5hbCByZXN1bHRzLgotKiAgIGBpbnQgbWF4X2FsdGVybmF0aXZlc2AKLQotICAgIFRoaXMgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgU2JTcGVlY2hSZXN1bHQgaW4KLSAgICBgU2JTcGVlY2hSZWNvZ25pemVyT25SZXN1bHRzYCBjYWxsYmFjay4KLQotIyMjIFNiU3BlZWNoUmVjb2duaXplckhhbmRsZXIgIyMjCi0KLUFsbG93cyByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBkZXZpY2Ugd2hlbiByZWNvZ25pdGlvbiByZWxhdGVkIGV2ZW50cwotb2NjdXIuCi0KLVRoZSB2b2lkKiBjb250ZXh0IGlzIHBhc3NlZCB0byBldmVyeSBmdW5jdGlvbi4KLQotIyMjIyBNZW1iZXJzICMjIyMKLQotKiAgIGBTYlNwZWVjaFJlY29nbml6ZXJTcGVlY2hEZXRlY3RlZEZ1bmN0aW9uIG9uX3NwZWVjaF9kZXRlY3RlZGAKLQotICAgIEZ1bmN0aW9uIHRvIG5vdGlmeSB0aGUgYmVnaW5uaW5nL2VuZCBvZiB0aGUgc3BlZWNoLgotKiAgIGBTYlNwZWVjaFJlY29nbml6ZXJFcnJvckZ1bmN0aW9uIG9uX2Vycm9yYAotCi0gICAgRnVuY3Rpb24gdG8gbm90aWZ5IHRoZSBzcGVlY2ggZXJyb3IuCi0qICAgYFNiU3BlZWNoUmVjb2duaXplclJlc3VsdHNGdW5jdGlvbiBvbl9yZXN1bHRzYAotCi0gICAgRnVuY3Rpb24gdG8gbm90aWZ5IHRoYXQgdGhlIHJlY29nbml0aW9uIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KLSogICBgdm9pZCAqIGNvbnRleHRgCi0KLSAgICBUaGlzIGlzIHBhc3NlZCB0byBoYW5kbGVyIGZ1bmN0aW9ucyBhcyBmaXJzdCBhcmd1bWVudC4KLQotIyMjIFNiU3BlZWNoUmVzdWx0ICMjIwotCi1UaGUgcmVjb2duaXRpb24gcmVzcG9uc2UgdGhhdCBpcyByZWNlaXZlZCBmcm9tIHRoZSByZWNvZ25pemVyLgotCi0jIyMjIE1lbWJlcnMgIyMjIwotCi0qICAgYGNoYXIgKiB0cmFuc2NyaXB0YAotCi0gICAgVGhlIHJhdyB3b3JkcyB0aGF0IHRoZSB1c2VyIHNwb2tlLgotKiAgIGBmbG9hdCBjb25maWRlbmNlYAotCi0gICAgQSBudW1lcmljIGVzdGltYXRlIGJldHdlZW4gMCBhbmQgMSBvZiBob3cgY29uZmlkZW50IHRoZSByZWNvZ25pdGlvbiBzeXN0ZW0KLSAgICBpcyB0aGF0IHRoZSByZWNvZ25pdGlvbiBpcyBjb3JyZWN0LiBBIGhpZ2hlciBudW1iZXIgbWVhbnMgdGhlIHN5c3RlbSBpcyBtb3JlCi0gICAgY29uZmlkZW50LiBOYU4gcmVwcmVzZW50cyBhbiB1bmF2YWlsYWJsZSBjb25maWRlbmNlIHNjb3JlLgotCi0jIyBGdW5jdGlvbnMgIyMKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplckNhbmNlbCAjIyMKLQotQ2FuY2VscyBzcGVlY2ggcmVjb2duaXRpb24uIFRoZSBzcGVlY2ggcmVjb2duaXplciBzdG9wcyBsaXN0ZW5pbmcgdG8gYXVkaW8gYW5kCi1kb2VzIG5vdCByZXR1cm4gYW55IGluZm9ybWF0aW9uLiBXaGVuIGBTYlNwZWVjaFJlY29nbml6ZXJDYW5jZWxgIGlzIGNhbGxlZCwgdGhlCi1pbXBsZW1lbnRhdGlvbiBNVVNUIE5PVCBjb2xsZWN0IGFkZGl0aW9uYWwgYXVkaW8sIE1VU1QgTk9UIGNvbnRpbnVlIHRvIGxpc3RlbiB0bwotdGhlIHVzZXIsIGFuZCBNVVNUIHN0b3AgcmVjb2duaXppbmcuIFRoaXMgaXMgaW1wb3J0YW50IGZvciBwcml2YWN5IHJlYXNvbnMuIElmCi1gU2JTcGVlY2hSZWNvZ25pemVyQ2FuY2VsYCBpcyBjYWxsZWQgb24gYSBzcGVlY2ggcmVjb2duaXplciB3aGljaCBpcyBhbHJlYWR5Ci1zdG9wcGVkIG9yIGNhbmNlbGxlZCwgdGhlIGltcGxlbWVudGF0aW9uIE1VU1QgaWdub3JlIHRoZSBjYWxsLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi12b2lkIFNiU3BlZWNoUmVjb2duaXplckNhbmNlbChTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplcikKLWBgYAotCi0jIyMgU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlICMjIwotCi1DcmVhdGVzIGEgc3BlZWNoIHJlY29nbml6ZXIgd2l0aCBhIHNwZWVjaCByZWNvZ25pemVyIGhhbmRsZXIuCi0KLUlmIHRoZSBzeXN0ZW0gaGFzIGEgc3BlZWNoIHJlY29nbml0aW9uIHNlcnZpY2UgYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLXRoZSBuZXdseSBjcmVhdGVkIGhhbmRsZS4KLQotSWYgbm8gc3BlZWNoIHJlY29nbml0aW9uIHNlcnZpY2UgaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UsIHRoaXMgZnVuY3Rpb24KLXJldHVybnMgYGtTYlNwZWVjaFJlY29nbml6ZXJJbnZhbGlkYC4KLQotYFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZWAgZG9lcyBub3QgZXhwZWN0IHRoZSBwYXNzZWQgU2JTcGVlY2hSZWNvZ25pemVySGFuZGxlcgotc3RydWN0dXJlIHRvIGxpdmUgYWZ0ZXIgYFNiU3BlZWNoUmVjb2duaXplckNyZWF0ZWAgaXMgY2FsbGVkLCBzbyB0aGUKLWltcGxlbWVudGF0aW9uIG11c3QgY29weSB0aGUgY29udGVudHMgaWYgbmVjZXNzYXJ5LgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1TYlNwZWVjaFJlY29nbml6ZXIgU2JTcGVlY2hSZWNvZ25pemVyQ3JlYXRlKGNvbnN0IFNiU3BlZWNoUmVjb2duaXplckhhbmRsZXIgKmhhbmRsZXIpCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplckRlc3Ryb3kgIyMjCi0KLURlc3Ryb3lzIHRoZSBnaXZlbiBzcGVlY2ggcmVjb2duaXplci4gSWYgdGhlIHNwZWVjaCByZWNvZ25pemVyIGlzIGluIHRoZSBzdGFydGVkCi1zdGF0ZSwgaXQgaXMgZmlyc3Qgc3RvcHBlZCBhbmQgdGhlbiBkZXN0cm95ZWQuCi0KLSMjIyMgRGVjbGFyYXRpb24gIyMjIwotCi1gYGAKLXZvaWQgU2JTcGVlY2hSZWNvZ25pemVyRGVzdHJveShTYlNwZWVjaFJlY29nbml6ZXIgcmVjb2duaXplcikKLWBgYAotCi0jIyMgU2JTcGVlY2hSZWNvZ25pemVySXNTdXBwb3J0ZWQgIyMjCi0KLVJldHVybnMgd2hldGhlciB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgU2JTcGVlY2hSZWNvZ25pemVyLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1ib29sIFNiU3BlZWNoUmVjb2duaXplcklzU3VwcG9ydGVkKCkKLWBgYAotCi0jIyMgU2JTcGVlY2hSZWNvZ25pemVySXNWYWxpZCAjIyMKLQotSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIHNwZWVjaCByZWNvZ25pemVyIGlzIHZhbGlkLgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1zdGF0aWMgYm9vbCBTYlNwZWVjaFJlY29nbml6ZXJJc1ZhbGlkKFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyKQotYGBgCi0KLSMjIyBTYlNwZWVjaFJlY29nbml6ZXJTdGFydCAjIyMKLQotU3RhcnRzIGxpc3RlbmluZyB0byBhdWRpbyBhbmQgcmVjb2duaXppbmcgc3BlZWNoIHdpdGggdGhlIHNwZWNpZmllZCBzcGVlY2gKLWNvbmZpZ3VyYXRpb24uIElmIGBTYlNwZWVjaFJlY29nbml6ZXJTdGFydGAgaXMgY2FsbGVkIG9uIGFuIGFscmVhZHkgc3RhcnRlZAotc3BlZWNoIHJlY29nbml6ZXIsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIGlnbm9yZSB0aGUgY2FsbCBhbmQgcmV0dXJuIGZhbHNlLgotCi1SZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWVjaCByZWNvZ25pemVyIGlzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LgotCi0jIyMjIERlY2xhcmF0aW9uICMjIyMKLQotYGBgCi1ib29sIFNiU3BlZWNoUmVjb2duaXplclN0YXJ0KFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyLCBjb25zdCBTYlNwZWVjaENvbmZpZ3VyYXRpb24gKmNvbmZpZ3VyYXRpb24pCi1gYGAKLQotIyMjIFNiU3BlZWNoUmVjb2duaXplclN0b3AgIyMjCi0KLVN0b3BzIGxpc3RlbmluZyB0byBhdWRpbyBhbmQgcmV0dXJucyBhIHJlc3VsdCB1c2luZyBqdXN0IHRoZSBhdWRpbyB0aGF0IGl0IGhhcwotYWxyZWFkeSByZWNlaXZlZC4gT25jZSBgU2JTcGVlY2hSZWNvZ25pemVyU3RvcGAgaXMgY2FsbGVkLCB0aGUgaW1wbGVtZW50YXRpb24KLU1VU1QgTk9UIGNvbGxlY3QgYWRkaXRpb25hbCBhdWRpbyBhbmQgTVVTVCBOT1QgY29udGludWUgdG8gbGlzdGVuIHRvIHRoZSB1c2VyLgotVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHByaXZhY3kgcmVhc29ucy4gSWYgYFNiU3BlZWNoUmVjb2duaXplclN0b3BgIGlzIGNhbGxlZCBvbgotYSBzcGVlY2ggcmVjb2duaXplciB3aGljaCBpcyBhbHJlYWR5IHN0b3BwZWQgb3IgYmVpbmcgc3RvcHBlZCwgdGhlCi1pbXBsZW1lbnRhdGlvbiBNVVNUIGlnbm9yZSB0aGUgY2FsbC4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotdm9pZCBTYlNwZWVjaFJlY29nbml6ZXJTdG9wKFNiU3BlZWNoUmVjb2duaXplciByZWNvZ25pemVyKQotYGBgCi0KZGlmZiAtLWdpdCBhL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL3N5c3RlbS5tZCBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL3N5c3RlbS5tZAppbmRleCBiNDgwMGE2Li4zMmZkMzAzIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy9zeXN0ZW0ubWQKKysrIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvc3lzdGVtLm1kCkBAIC0yNiw0MyArMjYsNiBAQAogICAgIG9ubHkgaWYpIGEgc3lzdGVtIGhhcyB0aGlzIGNhcGFiaWxpdHkgd2lsbCBTYlN5c3RlbUdldFRvdGFsR1BVTWVtb3J5KCkgYW5kCiAgICAgU2JTeXN0ZW1HZXRVc2VkR1BVTWVtb3J5KCkgYmUgdmFsaWQgdG8gY2FsbC4KIAotIyMjIFNiU3lzdGVtRGV2aWNlVHlwZSAjIyMKLQotRW51bWVyYXRpb24gb2YgZGV2aWNlIHR5cGVzLgotCi0jIyMjIFZhbHVlcyAjIyMjCi0KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZUJsdWVSYXlEaXNrUGxheWVyYAotCi0gICAgQmx1ZS1yYXkgRGlzYyBQbGF5ZXIgKEJEUCkuCi0qICAgYGtTYlN5c3RlbURldmljZVR5cGVHYW1lQ29uc29sZWAKLQotICAgIEEgcmVsYXRpdmVseSBoaWdoLXBvd2VyZWQgVFYgZGV2aWNlIHVzZWQgcHJpbWFyaWx5IGZvciBwbGF5aW5nIGdhbWVzLgotKiAgIGBrU2JTeXN0ZW1EZXZpY2VUeXBlT3ZlclRoZVRvcEJveGAKLQotICAgIE92ZXIgdGhlIHRvcCAoT1RUKSBkZXZpY2VzIHN0cmVhbSBjb250ZW50IHZpYSB0aGUgSW50ZXJuZXQgb3ZlciBhbm90aGVyIHR5cGUKLSAgICBvZiBuZXR3b3JrLCBlLmcuIGNhYmxlIG9yIHNhdGVsbGl0ZS4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZVNldFRvcEJveGAKLQotICAgIFNldCB0b3AgYm94ZXMgKFNUQnMpIHN0cmVhbSBjb250ZW50IHByaW1hcmlseSBvdmVyIGNhYmxlIG9yIHNhdGVsbGl0ZS4gU29tZQotICAgIFNUQnMgY2FuIGFsc28gc3RyZWFtIE9UVCBjb250ZW50IHZpYSB0aGUgSW50ZXJuZXQuCi0qICAgYGtTYlN5c3RlbURldmljZVR5cGVUVmAKLQotICAgIEEgU21hcnQgVFYgaXMgYSBUViB0aGF0IGNhbiBkaXJlY3RseSBydW4gYXBwbGljYXRpb25zIHRoYXQgc3RyZWFtIE9UVAotICAgIGNvbnRlbnQgdmlhIHRoZSBJbnRlcm5ldC4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZURlc2t0b3BQQ2AKLQotICAgIERlc2t0b3AgUEMuCi0qICAgYGtTYlN5c3RlbURldmljZVR5cGVBbmRyb2lkVFZgCi0KLSAgICBBbiBBbmRyb2lkIFRWIERldmljZS4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZVZpZGVvUHJvamVjdG9yYAotCi0gICAgQSB3YWxsIHZpZGVvIHByb2plY3Rvci4KLSogICBga1NiU3lzdGVtRGV2aWNlVHlwZVVua25vd25gCi0KLSAgICBVbmtub3duIGRldmljZS4KLQogIyMjIFNiU3lzdGVtUGF0aElkICMjIwogCiBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIHBhdGhzIHRoYXQgdGhlIHBsYXRmb3JtIGNhbiBkZWZpbmUuCkBAIC05OCw5ICs2MSwxMCBAQAogICAgIEZ1bGwgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLgogKiAgIGBrU2JTeXN0ZW1QYXRoU3RvcmFnZURpcmVjdG9yeWAKIAotICAgIFBhdGggdG8gYSBkaXJlY3RvcnkgZm9yIHBlcm1hbmVudCBmaWxlIHN0b3JhZ2UuIEJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzCi0gICAgaXMgcmVxdWlyZWQuIFRoaXMgaXMgd2hlcmUgYW4gYXBwIG1heSBzdG9yZSBpdHMgcGVyc2lzdGVudCBzZXR0aW5ncy4gVGhlCi0gICAgbG9jYXRpb24gc2hvdWxkIGJlIHVzZXIgYWdub3N0aWMgaWYgcG9zc2libGUuCisgICAgUGF0aCB0byB0aGUgZGlyZWN0b3J5IGRlZGljYXRlZCBmb3IgRXZlcmdyZWVuIEZ1bGwgcGVybWFuZW50IGZpbGUgc3RvcmFnZS4KKyAgICBCb3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyByZXF1aXJlZC4gVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBvbmx5CisgICAgZm9yIHN0b3JpbmcgdGhlIHVwZGF0ZXMuIFNlZQorICAgIHN0YXJib2FyZC9kb2MvZXZlcmdyZWVuL2NvYmFsdF9ldmVyZ3JlZW5fb3ZlcnZpZXcubWQKIAogIyMjIFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlICMjIwogCkBAIC0xODcsNiArMTUxLDEwIEBACiAKICAgICBMaW1pdCBhZHZlcnRpc2luZyB0cmFja2luZywgdHJlYXRlZCBhcyBib29sZWFuLiBTZXQgdG8gbm9uemVybyB0byBpbmRpY2F0ZSBhCiAgICAgdHJ1ZSB2YWx1ZS4gQ29ycmVzcG9uZHMgdG8gJ2xtdCcgZmllbGQuCisqICAgYGtTYlN5c3RlbVByb3BlcnR5RGV2aWNlVHlwZWAKKworICAgIFR5cGUgb2YgdGhlIGRldmljZSwgZS5nLiBzdWNoIGFzICJUViIsICJTVEIiLCAiT1RUIiBQbGVhc2Ugc2VlIFlvdXR1YmUKKyAgICBUZWNobmljYWwgcmVxdWlyZW1lbnRzIGZvciBhIGZ1bGwgbGlzdCBvZiBhbGxvd2VkIHZhbHVlcwogCiAjIyBUeXBlZGVmcyAjIwogCkBAIC0yNTYsMTYgKzIyNCw2IEBACiB2b2lkIFNiU3lzdGVtQ2xlYXJMYXN0RXJyb3IoKQogYGBgCiAKLSMjIyBTYlN5c3RlbUdldERldmljZVR5cGUgIyMjCi0KLVJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRldmljZS4KLQotIyMjIyBEZWNsYXJhdGlvbiAjIyMjCi0KLWBgYAotU2JTeXN0ZW1EZXZpY2VUeXBlIFNiU3lzdGVtR2V0RGV2aWNlVHlwZSgpCi1gYGAKLQogIyMjIFNiU3lzdGVtR2V0RXJyb3JTdHJpbmcgIyMjCiAKIEdlbmVyYXRlcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgYW4gZXJyb3IuIFRoZSByZXR1cm4gdmFsdWUgc3BlY2lmaWVzIHRoZQpAQCAtMjg0LDcgKzI0Miw4IEBACiAjIyMgU2JTeXN0ZW1HZXRFeHRlbnNpb24gIyMjCiAKIFJldHVybnMgcG9pbnRlciB0byBhIGNvbnN0YW50IGdsb2JhbCBzdHJ1Y3QgaW1wbGVtZW50aW5nIHRoZSBleHRlbnNpb24gbmFtZWQKLWBuYW1lYCwgaWYgaXQgaXMgaW1wbGVtZW50ZWQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KK2BuYW1lYCwgaWYgaXQgaXMgaW1wbGVtZW50ZWQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4gVGhlIGBuYW1lYCBzdHJpbmcgbXVzdCBub3QKK2JlIE5VTEwuCiAKIEV4dGVuc2lvbnMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IGJlaGF2aW9yIHdoaWNoIGlzIHNwZWNpZmljIHRvIHRoZSBjb21iaW5hdGlvbgogb2YgYXBwbGljYXRpb24gJiBwbGF0Zm9ybS4gQW4gZXh0ZW5zaW9uIHJlbGllcyBvbiBhIGhlYWRlciBmaWxlIGluIHRoZQpAQCAtNjY3LDcgKzYyNiw3IEBACiAjIyMgU2JTeXN0ZW1TaWduV2l0aENlcnRpZmljYXRpb25TZWNyZXRLZXkgIyMjCiAKIENvbXB1dGVzIGEgSE1BQy1TSEEyNTYgZGlnZXN0IG9mIGBtZXNzYWdlYCBpbnRvIGBkaWdlc3RgIHVzaW5nIHRoZSBhcHBsaWNhdGlvbidzCi1jZXJ0aWZpY2F0aW9uIHNlY3JldC4KK2NlcnRpZmljYXRpb24gc2VjcmV0LiBUaGUgYG1lc3NhZ2VgIGFuZCB0aGUgYGRpZ2VzdGAgcG9pbnRlcnMgbXVzdCBub3QgYmUgTlVMTC4KIAogVGhlIG91dHB1dCB3aWxsIGJlIHdyaXR0ZW4gaW50byBgZGlnZXN0YC4gYGRpZ2VzdF9zaXplX2luX2J5dGVzYCBtdXN0IGJlIDMyIChvcgogZ3JlYXRlciksIHNpbmNlIDMyLWJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvIGl0LiBSZXR1cm5zIGZhbHNlIGluIHRoZSBjYXNlIG9mCmRpZmYgLS1naXQgYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy91aV9uYXZpZ2F0aW9uLm1kIGIvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL21vZHVsZXMvdWlfbmF2aWdhdGlvbi5tZAppbmRleCBlNWY1MzNiLi5hMGVjZmIxIDEwMDY0NAotLS0gYS9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvbW9kdWxlcy91aV9uYXZpZ2F0aW9uLm1kCisrKyBiL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9tb2R1bGVzL3VpX25hdmlnYXRpb24ubWQKQEAgLTEwMSw4ICsxMDEsMTAgQEAKICAgICBUaGlzIGlzIHVzZWQgdG8gbWFudWFsbHkgZm9yY2UgZm9jdXMgb24gYSBuYXZpZ2F0aW9uIGl0ZW0gb2YgdHlwZQogICAgIGtTYlVpTmF2SXRlbVR5cGVGb2N1cy4gQW55IHByZXZpb3VzbHkgZm9jdXNlZCBuYXZpZ2F0aW9uIGl0ZW0gc2hvdWxkIHJlY2VpdmUKICAgICB0aGUgYmx1ciBldmVudC4gSWYgdGhlIGl0ZW0gaXMgbm90IHRyYW5zaXRpdmVseSBhIGNvbnRlbnQgb2YgdGhlIHJvb3QgaXRlbSwKLSAgICB0aGVuIHRoaXMgZG9lcyBub3RoaW5nLiBTcGVjaWZ5aW5nIGtTYlVpTmF2SXRlbUludmFsaWQgc2hvdWxkIHJlbW92ZSBmb2N1cwotICAgIGZyb20gdGhlIFVJIG5hdmlnYXRpb24gc3lzdGVtLgorICAgIHRoZW4gdGhpcyBkb2VzIG5vdGhpbmcuCisKKyAgICBTcGVjaWZ5aW5nIGtTYlVpTmF2SXRlbUludmFsaWQgc2hvdWxkIHJlbW92ZSBmb2N1cyBmcm9tIHRoZSBVSSBuYXZpZ2F0aW9uCisgICAgc3lzdGVtLgogKiAgIGB2b2lkKCpzZXRfaXRlbV9lbmFibGVkKShTYlVpTmF2SXRlbSBpdGVtLCBib29sIGVuYWJsZWQpYAogCiAgICAgVGhpcyBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkCkBAIC0xMTYsNyArMTE4LDkgQEAKIAogICAgIFRoaXMgc3BlY2lmaWVzIGRpcmVjdGlvbmFsaXR5IGZvciBjb250YWluZXIgaXRlbXMuIENvbnRhaW5lcnMgd2l0aGluCiAgICAgY29udGFpbmVycyBkbyBub3QgaW5oZXJpdCBkaXJlY3Rpb25hbGl0eS4gRGlyZWN0aW9uYWxpdHkgbXVzdCBiZSBzcGVjaWZpZWQKLSAgICBmb3IgZWFjaCBjb250YWluZXIgZXhwbGljaXRseS4gVGhpcyBzaG91bGQgd29yayBldmVuIGlmIGBpdGVtYCBpcyBkaXNhYmxlZC4KKyAgICBmb3IgZWFjaCBjb250YWluZXIgZXhwbGljaXRseS4KKworICAgIFRoaXMgc2hvdWxkIHdvcmsgZXZlbiBpZiBgaXRlbWAgaXMgZGlzYWJsZWQuCiAqICAgYHZvaWQoKnNldF9pdGVtX2ZvY3VzX2R1cmF0aW9uKShTYlVpTmF2SXRlbSBpdGVtLCBmbG9hdCBzZWNvbmRzKWAKIAogICAgIFNldCB0aGUgbWluaW11bSBhbW91bnQgb2YgdGltZSB0aGUgZm9jdXMgaXRlbSBzaG91bGQgcmVtYWluIGZvY3VzZWQgb25jZSBpdApAQCAtMTU4LDEzICsxNjIsMTYgQEAKIAogICAgIFRoaXMgYXR0YWNoZXMgdGhlIGdpdmVuIG5hdmlnYXRpb24gaXRlbSAod2hpY2ggbXVzdCBiZSBhIGNvbnRhaW5lcikgdG8gdGhlCiAgICAgc3BlY2lmaWVkIHdpbmRvdy4gTmF2aWdhdGlvbiBpdGVtcyBhcmUgb25seSBpbnRlcmFjdGFibGUgaWYgdGhleSBhcmUKLSAgICB0cmFuc2l0aXZlbHkgYXR0YWNoZWQgdG8gYSB3aW5kb3cuVGhlIG5hdGl2ZSBVSSBlbmdpbmUgc2hvdWxkIG5ldmVyIGNoYW5nZQotICAgIHRoaXMgbmF2aWdhdGlvbiBpdGVtJ3MgY29udGVudCBvZmZzZXQuIEl0IGlzIGFzc3VtZWQgdG8gYmUgdXNlZCBhcyBhIHByb3h5Ci0gICAgZm9yIHRoZSBzeXN0ZW0gd2luZG93LkEgbmF2aWdhdGlvbiBpdGVtIG1heSBvbmx5IGhhdmUgYSBTYlVpTmF2SXRlbSBvcgotICAgIFNiV2luZG93IGFzIGl0cyBkaXJlY3QgY29udGFpbmVyLiBUaGUgbmF2aWdhdGlvbiBpdGVtIGhpZXJhcmNoeSBpcwotICAgIGVzdGFibGlzaGVkIHVzaW5nIHNldF9pdGVtX2NvbnRhaW5lcl9pdGVtKCkgd2l0aCB0aGUgcm9vdCBjb250YWluZXIgYXR0YWNoZWQKLSAgICB0byBhIFNiV2luZG93IHVzaW5nIHNldF9pdGVtX2NvbnRhaW5lcl93aW5kb3coKSB0byBlbmFibGUgaW50ZXJhY3Rpb24gd2l0aAotICAgIGFsbCBlbmFibGVkIGl0ZW1zIGluIHRoZSBoaWVyYXJjaHkuCisgICAgdHJhbnNpdGl2ZWx5IGF0dGFjaGVkIHRvIGEgd2luZG93LgorCisgICAgVGhlIG5hdGl2ZSBVSSBlbmdpbmUgc2hvdWxkIG5ldmVyIGNoYW5nZSB0aGlzIG5hdmlnYXRpb24gaXRlbSdzIGNvbnRlbnQKKyAgICBvZmZzZXQuIEl0IGlzIGFzc3VtZWQgdG8gYmUgdXNlZCBhcyBhIHByb3h5IGZvciB0aGUgc3lzdGVtIHdpbmRvdy4KKworICAgIEEgbmF2aWdhdGlvbiBpdGVtIG1heSBvbmx5IGhhdmUgYSBTYlVpTmF2SXRlbSBvciBTYldpbmRvdyBhcyBpdHMgZGlyZWN0CisgICAgY29udGFpbmVyLiBUaGUgbmF2aWdhdGlvbiBpdGVtIGhpZXJhcmNoeSBpcyBlc3RhYmxpc2hlZCB1c2luZworICAgIHNldF9pdGVtX2NvbnRhaW5lcl9pdGVtKCkgd2l0aCB0aGUgcm9vdCBjb250YWluZXIgYXR0YWNoZWQgdG8gYSBTYldpbmRvdworICAgIHVzaW5nIHNldF9pdGVtX2NvbnRhaW5lcl93aW5kb3coKSB0byBlbmFibGUgaW50ZXJhY3Rpb24gd2l0aCBhbGwgZW5hYmxlZAorICAgIGl0ZW1zIGluIHRoZSBoaWVyYXJjaHkuCiAKICAgICBJZiBgaXRlbWAgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggYSBkaWZmZXJlbnQgd2luZG93LCB0aGVuIHRoaXMgd2lsbAogICAgIHVucmVnaXN0ZXIgaXQgZnJvbSB0aGF0IHdpbmRvdyB0aGVuIGF0dGFjaCBpdCB0byB0aGUgZ2l2ZW4gYHdpbmRvd2AuIEl0IGlzCkBAIC0xOTUsMTMgKzIwMiwxNCBAQAogICAgIGRyYXduIGF0IHBvc2l0aW9uICg1LDE1KS4KIAogICAgIEVzc2VudGlhbGx5LCBjb250ZW50IGl0ZW1zIHNob3VsZCBiZSBkcmF3biBhdDogW2NvbnRhaW5lciBwb3NpdGlvbl0gKwotICAgIFtjb250ZW50IHBvc2l0aW9uXSAtIFtjb250YWluZXIgY29udGVudCBvZmZzZXRdIENvbnRlbnQgaXRlbXMgbWF5IG92ZXJsYXAKLSAgICB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgY2FuIGNhdXNlIG9ic2N1cmVkIGl0ZW1zIHRvIGJlIHVuZm9jdXNhYmxlLiBUaGUKLSAgICBvbmx5IHJ1bGUgdGhhdCBuZWVkcyB0byBiZSBmb2xsb3dlZCBpcyB0aGF0IGNvbnRlbnRzIHdoaWNoIGFyZSBmb2N1cyBpdGVtcwotICAgIGNhbiBvYnNjdXJlIG90aGVyIGNvbnRlbnRzIHdoaWNoIGFyZSBjb250YWluZXJzLCBidXQgbm90IHZpY2UgdmVyc2EuIFRoZQotICAgIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IGNvbnRlbnQgZm9jdXMgaXRlbXMgZG8gbm90IG92ZXJsYXAgb3RoZXIgY29udGVudAotICAgIGZvY3VzIGl0ZW1zIGFuZCBjb250ZW50IGNvbnRhaW5lciBpdGVtcyBkbyBub3Qgb3ZlcmxhcCBvdGhlciBjb250ZW50Ci0gICAgY29udGFpbmVyIGl0ZW1zLgorICAgIFtjb250ZW50IHBvc2l0aW9uXSAtIFtjb250YWluZXIgY29udGVudCBvZmZzZXRdCisKKyAgICBDb250ZW50IGl0ZW1zIG1heSBvdmVybGFwIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyBjYW4gY2F1c2Ugb2JzY3VyZWQgaXRlbXMKKyAgICB0byBiZSB1bmZvY3VzYWJsZS4gVGhlIG9ubHkgcnVsZSB0aGF0IG5lZWRzIHRvIGJlIGZvbGxvd2VkIGlzIHRoYXQgY29udGVudHMKKyAgICB3aGljaCBhcmUgZm9jdXMgaXRlbXMgY2FuIG9ic2N1cmUgb3RoZXIgY29udGVudHMgd2hpY2ggYXJlIGNvbnRhaW5lcnMsIGJ1dAorICAgIG5vdCB2aWNlIHZlcnNhLiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgY29udGVudCBmb2N1cyBpdGVtcyBkbyBub3QKKyAgICBvdmVybGFwIG90aGVyIGNvbnRlbnQgZm9jdXMgaXRlbXMgYW5kIGNvbnRlbnQgY29udGFpbmVyIGl0ZW1zIGRvIG5vdCBvdmVybGFwCisgICAgb3RoZXIgY29udGVudCBjb250YWluZXIgaXRlbXMuCiAqICAgYHZvaWQoKnNldF9pdGVtX2NvbnRlbnRfb2Zmc2V0KShTYlVpTmF2SXRlbSBpdGVtLCBmbG9hdCBjb250ZW50X29mZnNldF94LAogICAgIGZsb2F0IGNvbnRlbnRfb2Zmc2V0X3kpYAogCkBAIC0yMTEsMTcgKzIxOSwxOSBAQAogICAgIEVzc2VudGlhbGx5LCBhIGNvbnRlbnQgaXRlbSBzaG91bGQgYmUgZHJhd24gYXQ6IFtjb250YWluZXIgcG9zaXRpb25dICsKICAgICBbY29udGVudCBwb3NpdGlvbl0gLSBbY29udGFpbmVyIGNvbnRlbnQgb2Zmc2V0XSBJZiBgaXRlbWAgaXMgbm90IGEKICAgICBjb250YWluZXIsIHRoZW4gdGhpcyBkb2VzIG5vdGhpbmcuIEJ5IGRlZmF1bHQsIHRoZSBjb250ZW50IG9mZnNldCBpcyAoMCwwKS4KKwogICAgIFRoaXMgc2hvdWxkIHVwZGF0ZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldF9pdGVtX2NvbnRlbnRfb2Zmc2V0KCkgZXZlbiBpZgogICAgIHRoZSBgaXRlbWAgaXMgZGlzYWJsZWQuCiAqICAgYHZvaWQoKmdldF9pdGVtX2NvbnRlbnRfb2Zmc2V0KShTYlVpTmF2SXRlbSBpdGVtLCBmbG9hdAogICAgICpvdXRfY29udGVudF9vZmZzZXRfeCwgZmxvYXQgKm91dF9jb250ZW50X29mZnNldF95KWAKIAogICAgIFJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRlbnQgb2Zmc2V0IGZvciB0aGUgbmF2aWdhdGlvbiBpdGVtLiBJZiBgaXRlbWAgaXMKLSAgICBub3QgYSBjb250YWluZXIsIHRoZW4gdGhlIGNvbnRlbnQgb2Zmc2V0IGlzICgwLDApLiBUaGUgbmF0aXZlIFVJIGVuZ2luZQotICAgIHNob3VsZCBub3QgY2hhbmdlIHRoZSBjb250ZW50IG9mZnNldCBvZiBhIGNvbnRhaW5lciB1bmxlc3Mgb25lIG9mIGl0cwotICAgIGNvbnRlbnRzIChwb3NzaWJseSByZWN1cnNpdmVseSkgaXMgZm9jdXNlZC4gVGhpcyBpcyB0byBhbGxvdyBzZWFtbGVzc2x5Ci0gICAgZGlzYWJsaW5nIHRoZW4gcmUtZW5hYmxpbmcgZm9jdXMgaXRlbXMgd2l0aG91dCBoYXZpbmcgdGhlaXIgY29udGFpbmVycwotICAgIGNoYW5nZSBvZmZzZXRzLgorICAgIG5vdCBhIGNvbnRhaW5lciwgdGhlbiB0aGUgY29udGVudCBvZmZzZXQgaXMgKDAsMCkuCisKKyAgICBUaGUgbmF0aXZlIFVJIGVuZ2luZSBzaG91bGQgbm90IGNoYW5nZSB0aGUgY29udGVudCBvZmZzZXQgb2YgYSBjb250YWluZXIKKyAgICB1bmxlc3Mgb25lIG9mIGl0cyBjb250ZW50cyAocG9zc2libHkgcmVjdXJzaXZlbHkpIGlzIGZvY3VzZWQuIFRoaXMgaXMgdG8KKyAgICBhbGxvdyBzZWFtbGVzc2x5IGRpc2FibGluZyB0aGVuIHJlLWVuYWJsaW5nIGZvY3VzIGl0ZW1zIHdpdGhvdXQgaGF2aW5nIHRoZWlyCisgICAgY29udGFpbmVycyBjaGFuZ2Ugb2Zmc2V0cy4KICogICBgdm9pZCgqZG9fYmF0Y2hfdXBkYXRlKSh2b2lkKCp1cGRhdGVfZnVuY3Rpb24pKHZvaWQgKiksIHZvaWQgKmNvbnRleHQpYAogCiAgICAgQ2FsbCBgdXBkYXRlX2Z1bmN0aW9uYCB3aXRoIGBjb250ZXh0YCB0byBwZXJmb3JtIGEgc2VyaWVzIG9mIFVJIG5hdmlnYXRpb24KQEAgLTI1Miw3ICsyNjIsNyBAQAogLy8vICAgICB8IE5lZ2F0aXZlIHBvc2l0aW9uLiB8IFBvc2l0aXZlIHBvc2l0aW9uLiB8IFBvc2l0aXZlIHBvc2l0aW9uLiB8CiAvLy8gICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8vICAgICAgICAgICAgICAgICAgQ29udGVudCBPZmZzZXQgWCA9IDAuIAorLy8vICAgICAgICAgICAgICAgICAgQ29udGVudCBPZmZzZXQgWCA9IDAuCiBgYGAKIAogYGBgCkBAIC0yNzEsNyArMjgxLDcgQEAKIAogYGBgCiAvLy8gICB8IGEgYiB0eCB8Ci0vLy8gICB8IGMgZCB0eSB8IAorLy8vICAgfCBjIGQgdHkgfAogYGBgCiAKICMjIyMgTWVtYmVycyAjIyMjCkBAIC0yOTIsNyArMzAyLDggQEAKIAogUmV0cmlldmUgdGhlIHBsYXRmb3JtJ3MgVUkgbmF2aWdhdGlvbiBpbXBsZW1lbnRhdGlvbi4gSWYgdGhlIHBsYXRmb3JtIGRvZXMgbm90CiBwcm92aWRlIG9uZSwgdGhlbiByZXR1cm4gZmFsc2Ugd2l0aG91dCBtb2RpZnlpbmcgYG91dF9pbnRlcmZhY2VgLiBPdGhlcndpc2UsCi1pbml0aWFsaXplIGFsbCBtZW1iZXJzIG9mIGBvdXRfaW50ZXJmYWNlYCBhbmQgcmV0dXJuIHRydWUuCitpbml0aWFsaXplIGFsbCBtZW1iZXJzIG9mIGBvdXRfaW50ZXJmYWNlYCBhbmQgcmV0dXJuIHRydWUuIFRoZSBgb3V0X2ludGVyZmFjZWAKK3BvaW50ZXIgbXVzdCBub3QgYmUgTlVMTC4KIAogIyMjIyBEZWNsYXJhdGlvbiAjIyMjCiAKQEAgLTMwOSw0ICszMjAsMyBAQAogYGBgCiBzdGF0aWMgYm9vbCBTYlVpTmF2SXRlbUlzVmFsaWQoU2JVaU5hdkl0ZW0gaXRlbSkKIGBgYAotCmRpZmYgLS1naXQgYS9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuY2MgYi9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuY2MKaW5kZXggZjY0NWNhNi4uYmIwZDY3MCAxMDA2NDQKLS0tIGEvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGhyZWFkLmNjCisrKyBiL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX3RocmVhZC5jYwpAQCAtMTIsMTAgKzEyLDExIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotI2luY2x1ZGUgPG1lbW9yeT4KLQogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX3RocmVhZC5oIgogCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJiYXNlL3RyYWNlX2V2ZW50L3RyYWNlX2V2ZW50LmgiCkBAIC00MywxMiArNDQsMTQgQEAKIAogU2F2ZWdhbWVUaHJlYWQ6On5TYXZlZ2FtZVRocmVhZCgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICAvLyBXYWl0IGZvciBhbGwgdGFza3MgdG8gZmluaXNoLgotICB0aHJlYWRfLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdEJsb2NraW5nVGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJlNhdmVnYW1lVGhyZWFkOjpTaHV0ZG93bk9uSU9UaHJlYWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKIAotICB0aHJlYWRfLnJlc2V0KCk7CisgIGlmICh0aHJlYWRfKSB7CisgICAgLy8gV2FpdCBmb3IgYWxsIHByZXZpb3VzbHkgcG9zdGVkIHRhc2tzIHRvIGZpbmlzaC4KKyAgICB0aHJlYWRfLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+V2FpdEZvckZlbmNlKCk7CisgICAgLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIFdpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wIGluIHRoZSB0aHJlYWQKKyAgICAvLyBhbmQgd2FpdCBmb3IgaXQgdG8gZmluaXNoLgorICAgIHRocmVhZF8ucmVzZXQoKTsKKyAgfQogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8U2F2ZWdhbWU6OkJ5dGVWZWN0b3I+IFNhdmVnYW1lVGhyZWFkOjpHZXRMb2FkZWRSYXdCeXRlcygpIHsKQEAgLTc5LDcgKzgyLDggQEAKIAogdm9pZCBTYXZlZ2FtZVRocmVhZDo6SW5pdGlhbGl6ZU9uSU9UaHJlYWQoKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRENIRUNLX0VRKHRocmVhZF8tPm1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgRENIRUNLKHRocmVhZF8tPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5SdW5zVGFza3NJbkN1cnJlbnRTZXF1ZW5jZSgpKTsKKyAgYmFzZTo6TWVzc2FnZUxvb3BDdXJyZW50OjpHZXQoKS0+QWRkRGVzdHJ1Y3Rpb25PYnNlcnZlcih0aGlzKTsKIAogICAvLyBDcmVhdGUgYSBzYXZlZ2FtZSBvYmplY3Qgb24gdGhlIHN0b3JhZ2UgSS9PIHRocmVhZC4KICAgc2F2ZWdhbWVfID0gb3B0aW9uc18uQ3JlYXRlU2F2ZWdhbWUoKTsKQEAgLTkyLDE4ICs5NiwxOCBAQAogICBpbml0aWFsaXplZF8uU2lnbmFsKCk7CiB9CiAKLXZvaWQgU2F2ZWdhbWVUaHJlYWQ6OlNodXRkb3duT25JT1RocmVhZCgpIHsKK3ZvaWQgU2F2ZWdhbWVUaHJlYWQ6OldpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDS19FUSh0aHJlYWRfLT5tZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CiAgIC8vIEVuc3VyZSB0aGVzZSBvYmplY3RzIGFyZSBkZXN0cm95ZWQgb24gdGhlIHByb3BlciB0aHJlYWQuCi0gIHNhdmVnYW1lXy5yZXNldChOVUxMKTsKKyAgc2F2ZWdhbWVfLnJlc2V0KCk7CisgIGxvYWRlZF9yYXdfYnl0ZXNfLnJlc2V0KCk7CiB9CiAKIHZvaWQgU2F2ZWdhbWVUaHJlYWQ6OkZsdXNoT25JT1RocmVhZCgKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2F2ZWdhbWU6OkJ5dGVWZWN0b3I+IHJhd19ieXRlc19wdHIsCiAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgb25fZmx1c2hfY29tcGxldGUpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0tfRVEodGhyZWFkXy0+bWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0sodGhyZWFkXy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpOwogICBpZiAocmF3X2J5dGVzX3B0ci0+c2l6ZSgpID4gMCkgewogICAgIGJvb2wgcmV0ID0gc2F2ZWdhbWVfLT5Xcml0ZSgqcmF3X2J5dGVzX3B0cik7CiAgICAgaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGhyZWFkLmggYi9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaAppbmRleCBjOTY5YzgyLi5kYzUyNDlmIDEwMDY0NAotLS0gYS9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaAorKysgYi9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaApAQCAtMjcsNyArMjcsNyBAQAogCiAvLyBUaGUgU2F2ZWdhbWVUaHJlYWQgd3JhcHMgYSBTYXZlZ2FtZSBvYmplY3Qgd2l0aGluIGl0cyBvd24gdGhyZWFkIGluIG9yZGVyIHRvCiAvLyBlbmFibGUgYXN5bmNocm9ub3VzIHdyaXRlcyB0byB0aGUgc2F2ZWdhbWUgb2JqZWN0LgotY2xhc3MgU2F2ZWdhbWVUaHJlYWQgeworY2xhc3MgU2F2ZWdhbWVUaHJlYWQgOiBwdWJsaWMgYmFzZTo6TWVzc2FnZUxvb3A6OkRlc3RydWN0aW9uT2JzZXJ2ZXIgewogIHB1YmxpYzoKICAgZXhwbGljaXQgU2F2ZWdhbWVUaHJlYWQoY29uc3QgU2F2ZWdhbWU6Ok9wdGlvbnMmIG9wdGlvbnMpOwogICB+U2F2ZWdhbWVUaHJlYWQoKTsKQEAgLTQ0LDEzICs0NCwxMiBAQAogICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIG9uX2ZsdXNoX2NvbXBsZXRlKTsKIAogIHByaXZhdGU6CisgIC8vIEZyb20gYmFzZTo6TWVzc2FnZUxvb3A6OkRlc3RydWN0aW9uT2JzZXJ2ZXIuCisgIHZvaWQgV2lsbERlc3Ryb3lDdXJyZW50TWVzc2FnZUxvb3AoKSBvdmVycmlkZTsKKwogICAvLyBSdW4gb24gdGhlIEkvTyB0aHJlYWQgdG8gc3RhcnQgbG9hZGluZyB0aGUgc2F2ZWdhbWUuCiAgIHZvaWQgSW5pdGlhbGl6ZU9uSU9UaHJlYWQoKTsKIAotICAvLyBDYWxsZWQgYnkgdGhlIGRlc3RydWN0b3IsIHRvIGVuc3VyZSB3ZSBkZXN0cm95IGNlcnRhaW4gb2JqZWN0cyBvbiB0aGUKLSAgLy8gSS9PIHRocmVhZC4KLSAgdm9pZCBTaHV0ZG93bk9uSU9UaHJlYWQoKTsKLQogICAvLyBSdW5zIG9uIHRoZSBJL08gdGhyZWFkIHRvIHdyaXRlIHRoZSBkYXRhYmFzZSB0byB0aGUgc2F2ZWdhbWUncyBwZXJzaXN0ZW50CiAgIC8vIHN0b3JhZ2UuCiAgIHZvaWQgRmx1c2hPbklPVGhyZWFkKHN0ZDo6dW5pcXVlX3B0cjxTYXZlZ2FtZTo6Qnl0ZVZlY3Rvcj4gcmF3X2J5dGVzX3B0ciwKZGlmZiAtLWdpdCBhL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5jYyBiL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5jYwppbmRleCBiMWExODg5Li5lM2EyNzhlIDEwMDY0NAotLS0gYS9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuY2MKKysrIGIvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmNjCkBAIC0zOCw3ICszOCw2IEBACiBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZU1hbmFnZXIoY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKICAgICA6IG9wdGlvbnNfKG9wdGlvbnMpLAogICAgICAgc3RvcmFnZV90aHJlYWRfKG5ldyBiYXNlOjpUaHJlYWQoIlN0b3JhZ2VNYW5hZ2VyIikpLAotICAgICAgbWVtb3J5X3N0b3JlXyhuZXcgTWVtb3J5U3RvcmUoKSksCiAgICAgICBsb2FkZWRfZGF0YWJhc2VfdmVyc2lvbl8oMCksCiAgICAgICBpbml0aWFsaXplZF8oZmFsc2UpLAogICAgICAgZmx1c2hfcHJvY2Vzc2luZ18oZmFsc2UpLApAQCAtNDcsMzggKzQ2LDQ1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OldhaXRhYmxlRXZlbnQ6OkluaXRpYWxTdGF0ZTo6U0lHTkFMRUQpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwogCi0gIHNhdmVnYW1lX3RocmVhZF8ucmVzZXQobmV3IFNhdmVnYW1lVGhyZWFkKG9wdGlvbnNfLnNhdmVnYW1lX29wdGlvbnMpKTsKLQogICAvLyBTdGFydCB0aGUgc2F2ZWdhbWUgbG9hZCBpbW1lZGlhdGVseS4KICAgc3RvcmFnZV90aHJlYWRfLT5TdGFydCgpOwogICBzdG9yYWdlX3Rhc2tfcnVubmVyXyA9IHN0b3JhZ2VfdGhyZWFkXy0+dGFza19ydW5uZXIoKTsKICAgRENIRUNLKHN0b3JhZ2VfdGFza19ydW5uZXJfKTsKIAorICBzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpJbml0aWFsaXplVGFza0luVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6SW5pdGlhbGl6ZVRhc2tJblRocmVhZCgpIHsKKyAgRENIRUNLKHN0b3JhZ2VfdGFza19ydW5uZXJfLT5SdW5zVGFza3NJbkN1cnJlbnRTZXF1ZW5jZSgpKTsKKyAgYmFzZTo6TWVzc2FnZUxvb3BDdXJyZW50OjpHZXQoKS0+QWRkRGVzdHJ1Y3Rpb25PYnNlcnZlcih0aGlzKTsKKworICBtZW1vcnlfc3RvcmVfLnJlc2V0KG5ldyBNZW1vcnlTdG9yZSgpKTsKKyAgc2F2ZWdhbWVfdGhyZWFkXy5yZXNldChuZXcgU2F2ZWdhbWVUaHJlYWQob3B0aW9uc18uc2F2ZWdhbWVfb3B0aW9ucykpOworCiAgIGZsdXNoX29uX2xhc3RfY2hhbmdlX3RpbWVyXy5yZXNldChuZXcgYmFzZTo6T25lU2hvdFRpbWVyKCkpOwogICBmbHVzaF9vbl9jaGFuZ2VfbWF4X2RlbGF5X3RpbWVyXy5yZXNldChuZXcgYmFzZTo6T25lU2hvdFRpbWVyKCkpOwogfQogCiBTdG9yYWdlTWFuYWdlcjo6flN0b3JhZ2VNYW5hZ2VyKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyghc3RvcmFnZV90YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyghc3RvcmFnZV90YXNrX3J1bm5lcl8tPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpOwogCiAgIC8vIFdhaXQgZm9yIGFsbCBJL08gb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KICAgRmluaXNoSU8oKTsKIAotICAvLyBEZXN0cm95IHZhcmlvdXMgb2JqZWN0cyBvbiB0aGUgcHJvcGVyIHRocmVhZC4KLSAgc3RvcmFnZV90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmU3RvcmFnZU1hbmFnZXI6Ok9uRGVzdHJveSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gIC8vIEZvcmNlIGFsbCB0YXNrcyB0byBmaW5pc2guIFRoZW4gd2UgY2FuIHNhZmVseSBsZXQgdGhlIHJlc3Qgb2Ygb3VyCi0gIC8vIG1lbWJlciB2YXJpYWJsZXMgYmUgZGVzdHJveWVkLgorICAvLyBXYWl0IGZvciBhbGwgcHJldmlvdXNseSBwb3N0ZWQgdGFza3MgdG8gZmluaXNoLgorICBzdG9yYWdlX3RocmVhZF8tPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5XYWl0Rm9yRmVuY2UoKTsKKyAgLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIFdpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wIGluIHRoZSB0aHJlYWQgYW5kCisgIC8vIHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KICAgc3RvcmFnZV90aHJlYWRfLnJlc2V0KCk7CiB9CiAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6OldpdGhSZWFkT25seU1lbW9yeVN0b3JlKAogICAgIGNvbnN0IFJlYWRPbmx5TWVtb3J5U3RvcmVDYWxsYmFjayYgY2FsbGJhY2spIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBpZiAoIXN0b3JhZ2VfdGFza19ydW5uZXJfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKKyAgaWYgKCFzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UnVuc1Rhc2tzSW5DdXJyZW50U2VxdWVuY2UoKSkgewogICAgIHN0b3JhZ2VfdGFza19ydW5uZXJfLT5Qb3N0VGFzaygKICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTdG9yYWdlTWFuYWdlcjo6V2l0aFJlYWRPbmx5TWVtb3J5U3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBjYWxsYmFjaykpOwpAQCAtOTAsNyArOTYsNyBAQAogCiB2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpXaXRoTWVtb3J5U3RvcmUoY29uc3QgTWVtb3J5U3RvcmVDYWxsYmFjayYgY2FsbGJhY2spIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBpZiAoIXN0b3JhZ2VfdGFza19ydW5uZXJfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKKyAgaWYgKCFzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UnVuc1Rhc2tzSW5DdXJyZW50U2VxdWVuY2UoKSkgewogICAgIHN0b3JhZ2VfdGFza19ydW5uZXJfLT5Qb3N0VGFzaygKICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTdG9yYWdlTWFuYWdlcjo6V2l0aE1lbW9yeVN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2FsbGJhY2spKTsKQEAgLTEwNCw3ICsxMTAsNyBAQAogdm9pZCBTdG9yYWdlTWFuYWdlcjo6Rmx1c2hPbkNoYW5nZSgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwogICAvLyBNYWtlIHN1cmUgdGhpcyBydW5zIG9uIHRoZSBjb3JyZWN0IHRocmVhZC4KLSAgaWYgKCFzdG9yYWdlX3Rhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7CisgIGlmICghc3RvcmFnZV90YXNrX3J1bm5lcl8tPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpIHsKICAgICBzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwKICAgICAgICAgYmFzZTo6QmluZCgmU3RvcmFnZU1hbmFnZXI6OkZsdXNoT25DaGFuZ2UsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKQEAgLTEzMSw3ICsxMzcsNyBAQAogdm9pZCBTdG9yYWdlTWFuYWdlcjo6Rmx1c2hOb3coYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2spIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwogICAvLyBNYWtlIHN1cmUgdGhpcyBydW5zIG9uIHRoZSBjb3JyZWN0IHRocmVhZC4KLSAgaWYgKCFzdG9yYWdlX3Rhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7CisgIGlmICghc3RvcmFnZV90YXNrX3J1bm5lcl8tPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpIHsKICAgICBzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU3RvcmFnZU1hbmFnZXI6OkZsdXNoTm93LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZjYWxsYmFjaykpKTsKQEAgLTE0Miw5ICsxNDgsMjEgQEAKICAgUXVldWVGbHVzaChzdGQ6Om1vdmUoY2FsbGJhY2spKTsKIH0KIAorLy8gVHJpZ2dlcnMgYSB3cml0ZSB0byBkaXNrIHRvIGhhcHBlbiBpbW1lZGlhdGVseSBhbmQgZG9lc24ndCByZXR1cm4gdW50aWwgdGhlCisvLyBJL08gaGFzIGNvbXBsZXRlZC4KK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OkZsdXNoU3luY2hyb25vdXMoKSB7CisgIGJhc2U6OldhaXRhYmxlRXZlbnQgZmx1c2hfZmluaXNoZWQgPSB7CisgICAgICBiYXNlOjpXYWl0YWJsZUV2ZW50OjpSZXNldFBvbGljeTo6TUFOVUFMLAorICAgICAgYmFzZTo6V2FpdGFibGVFdmVudDo6SW5pdGlhbFN0YXRlOjpOT1RfU0lHTkFMRUR9OworICBGbHVzaE5vdyhiYXNlOjpCaW5kKAorICAgICAgW10oYmFzZTo6V2FpdGFibGVFdmVudCogZmx1c2hfZmluaXNoZWQpIHsgZmx1c2hfZmluaXNoZWQtPlNpZ25hbCgpOyB9LAorICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmZmx1c2hfZmluaXNoZWQpKSk7CisgIGZsdXNoX2ZpbmlzaGVkLldhaXQoKTsKK30KKwogdm9pZCBTdG9yYWdlTWFuYWdlcjo6RmluaXNoSW5pdCgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0soc3RvcmFnZV90YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UnVuc1Rhc2tzSW5DdXJyZW50U2VxdWVuY2UoKSk7CiAgIGlmIChpbml0aWFsaXplZF8pIHsKICAgICByZXR1cm47CiAgIH0KQEAgLTE3Nyw3ICsxOTUsNyBAQAogCiB2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpPbkZsdXNoT25DaGFuZ2VUaW1lckZpcmVkKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyhzdG9yYWdlX3Rhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgRENIRUNLKHN0b3JhZ2VfdGFza19ydW5uZXJfLT5SdW5zVGFza3NJbkN1cnJlbnRTZXF1ZW5jZSgpKTsKIAogICBTdG9wRmx1c2hPbkNoYW5nZVRpbWVycygpOwogICBRdWV1ZUZsdXNoKGJhc2U6OkNsb3N1cmUoKSk7CkBAIC0xODYsNyArMjA0LDcgQEAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6Ok9uRmx1c2hJT0NvbXBsZXRlZENhbGxiYWNrKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7CiAgIC8vIE1ha2Ugc3VyZSB0aGlzIHJ1bnMgb24gdGhlIFNRTCBtZXNzYWdlIGxvb3AuCi0gIGlmICghc3RvcmFnZV90YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICBpZiAoIXN0b3JhZ2VfdGFza19ydW5uZXJfLT5SdW5zVGFza3NJbkN1cnJlbnRTZXF1ZW5jZSgpKSB7CiAgICAgc3RvcmFnZV90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpPbkZsdXNoSU9Db21wbGV0ZWRDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKQEAgLTIxNiw3ICsyMzQsNyBAQAogCiB2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpRdWV1ZUZsdXNoKGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRENIRUNLKHN0b3JhZ2VfdGFza19ydW5uZXJfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBEQ0hFQ0soc3RvcmFnZV90YXNrX3J1bm5lcl8tPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpOwogCiAgIGlmICghZmx1c2hfcHJvY2Vzc2luZ18pIHsKICAgICAvLyBJZiBubyBmbHVzaCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIGZsdXNoIGltbWVkaWF0ZWx5LgpAQCAtMjM3LDcgKzI1NSw3IEBACiAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6OkZsdXNoSW50ZXJuYWwoKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRENIRUNLKHN0b3JhZ2VfdGFza19ydW5uZXJfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBEQ0hFQ0soc3RvcmFnZV90YXNrX3J1bm5lcl8tPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpOwogICBGaW5pc2hJbml0KCk7CiAKICAgZmx1c2hfcHJvY2Vzc2luZ18gPSB0cnVlOwpAQCAtMjU5LDcgKzI3Nyw3IEBACiAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6OkZpbmlzaElPKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyghc3RvcmFnZV90YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyghc3RvcmFnZV90YXNrX3J1bm5lcl8tPlJ1bnNUYXNrc0luQ3VycmVudFNlcXVlbmNlKCkpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvbiBjaGFuZ2UgdGltZXJzIGZpcmUgaWYgdGhleSdyZSBydW5uaW5nLgogICBzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UG9zdFRhc2soCkBAIC0yODYsNyArMzA0LDcgQEAKIAogdm9pZCBTdG9yYWdlTWFuYWdlcjo6RmlyZVJ1bm5pbmdPbkNoYW5nZVRpbWVycygpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0soc3RvcmFnZV90YXNrX3J1bm5lcl8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhzdG9yYWdlX3Rhc2tfcnVubmVyXy0+UnVuc1Rhc2tzSW5DdXJyZW50U2VxdWVuY2UoKSk7CiAKICAgaWYgKGZsdXNoX29uX2xhc3RfY2hhbmdlX3RpbWVyXy0+SXNSdW5uaW5nKCkgfHwKICAgICAgIGZsdXNoX29uX2NoYW5nZV9tYXhfZGVsYXlfdGltZXJfLT5Jc1J1bm5pbmcoKSkgewpAQCAtMjk0LDEwICszMTIsOCBAQAogICB9CiB9CiAKLXZvaWQgU3RvcmFnZU1hbmFnZXI6Ok9uRGVzdHJveSgpIHsKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OldpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyhzdG9yYWdlX3Rhc2tfcnVubmVyXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLQogICAvLyBTdG9wIHRoZSBzYXZlZ2FtZSB0aHJlYWQgYW5kIGhhdmUgaXQgd3JhcCB1cCBhbnkgcGVuZGluZyBJL08gb3BlcmF0aW9ucy4KICAgc2F2ZWdhbWVfdGhyZWFkXy5yZXNldCgpOwogCmRpZmYgLS1naXQgYS9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuaCBiL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oCmluZGV4IGI5ZDYzZjEuLmZmNDlhNmQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oCisrKyBiL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oCkBAIC0zOSw3ICszOSw3IEBACiAvLyBvciBXaXRoTWVtb3J5U3RvcmUoKS4gVGhlIGNhbGxiYWNrIHRvIHdpbGwgcnVuIG9uIHRoZSBzdG9yZSB0aHJlYWQuCiAvLyBPcGVyYXRpb25zIG9uIE1lbW9yeVN0b3JlIHdpbGwgYmxvY2sgdGhlIHN0b3JlIHRocmVhZCB1bnRpbCB0aGUgc2F2ZWdhbWUKIC8vIGlzIGxvYWRlZC4KLWNsYXNzIFN0b3JhZ2VNYW5hZ2VyIHsKK2NsYXNzIFN0b3JhZ2VNYW5hZ2VyIDogcHVibGljIGJhc2U6Ok1lc3NhZ2VMb29wOjpEZXN0cnVjdGlvbk9ic2VydmVyIHsKICBwdWJsaWM6CiAgIHN0cnVjdCBPcHRpb25zIHsKICAgICBTYXZlZ2FtZTo6T3B0aW9ucyBzYXZlZ2FtZV9vcHRpb25zOwpAQCAtNjUsNyArNjUsMTEgQEAKICAgLy8gfGNhbGxiYWNrfCwgaWYgcHJvdmlkZWQsIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIEkvTyBoYXMgY29tcGxldGVkLAogICAvLyBhbmQgd2lsbCBiZSBydW4gb24gdGhlIHN0b3JhZ2UgbWFuYWdlcidzIElPIHRocmVhZC4KICAgLy8gVGhpcyBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gIHZvaWQgRmx1c2hOb3coYmFzZTo6T25jZUNsb3N1cmUgY2FsbGJhY2spOworICB2b2lkIEZsdXNoTm93KGJhc2U6Ok9uY2VDbG9zdXJlIGNhbGxiYWNrID0gYmFzZTo6Q2xvc3VyZSgpKTsKKworICAvLyBUcmlnZ2VycyBhIHdyaXRlIHRvIGRpc2sgdG8gaGFwcGVuIGltbWVkaWF0ZWx5IGFuZCBkb2Vzbid0IHJldHVybiB1bnRpbCB0aGUKKyAgLy8gSS9PIGhhcyBjb21wbGV0ZWQuCisgIHZvaWQgRmx1c2hTeW5jaHJvbm91cygpOwogCiAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBvcHRpb25zXzsgfQogCkBAIC04Myw2ICs4NywxMCBAQAogICB2aXJ0dWFsIHZvaWQgUXVldWVGbHVzaChiYXNlOjpPbmNlQ2xvc3VyZSBjYWxsYmFjayk7CiAKICBwcml2YXRlOgorICAvLyBDYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSB0aGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgYW5kCisgIC8vIHBlcmZvcm0gYW55IG90aGVyIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIG9uIHRoZSBkZWRpY2F0ZWQgdGhyZWFkLgorICB2b2lkIEluaXRpYWxpemVUYXNrSW5UaHJlYWQoKTsKKwogICAvLyBHaXZlIFN0b3JhZ2VNYW5hZ2VyVGVzdCBhY2Nlc3MsIHNvIHdlIGNhbiBtb3JlIGVhc2lseSB0ZXN0IHNvbWUgaW50ZXJuYWxzLgogICBmcmllbmQgY2xhc3MgU3RvcmFnZU1hbmFnZXJUZXN0OwogCkBAIC0xMTIsOSArMTIwLDkgQEAKICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGltbWVkaWF0ZWx5IHRoZSBvbiBjaGFuZ2UgdGltZXJzIGlmIHRoZXkgYXJlIHJ1bm5pbmcuCiAgIHZvaWQgRmlyZVJ1bm5pbmdPbkNoYW5nZVRpbWVycygpOwogCi0gIC8vIENhbGxlZCBieSB0aGUgZGVzdHJ1Y3RvciwgdG8gZW5zdXJlIHdlIGRlc3Ryb3kgY2VydGFpbiBvYmplY3RzIG9uIHRoZQotICAvLyBzdG9yZSB0aHJlYWQKLSAgdm9pZCBPbkRlc3Ryb3koKTsKKyAgLy8gRW5zdXJlIHRoYXQgd2UgZGVzdHJveSBjZXJ0YWluIG9iamVjdHMgb24gdGhlIHN0b3JlIHRocmVhZC4KKyAgLy8gRnJvbSBiYXNlOjpNZXNzYWdlTG9vcDo6RGVzdHJ1Y3Rpb25PYnNlcnZlci4KKyAgdm9pZCBXaWxsRGVzdHJveUN1cnJlbnRNZXNzYWdlTG9vcCgpIG92ZXJyaWRlOwogCiAgIC8vIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIFN0b3JhZ2UgTWFuYWdlci4KICAgT3B0aW9ucyBvcHRpb25zXzsKZGlmZiAtLWdpdCBhL2NvYmFsdC91cGRhdGVyL25ldHdvcmtfZmV0Y2hlci5jYyBiL2NvYmFsdC91cGRhdGVyL25ldHdvcmtfZmV0Y2hlci5jYwppbmRleCAyZjAwMTllLi4wZjQ4ODdlIDEwMDY0NAotLS0gYS9jb2JhbHQvdXBkYXRlci9uZXR3b3JrX2ZldGNoZXIuY2MKKysrIGIvY29iYWx0L3VwZGF0ZXIvbmV0d29ya19mZXRjaGVyLmNjCkBAIC0xODksNyArMTg5LDggQEAKIAogICB1cmxfZmV0Y2hlcl8tPlNldFJlcXVlc3RDb250ZXh0KAogICAgICAgbmV0d29ya19tb2R1bGVfLT51cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlcigpLmdldCgpKTsKLSAgbmV0d29ya19tb2R1bGVfLT5BZGRDbGllbnRIaW50SGVhZGVycygqdXJsX2ZldGNoZXJfKTsKKyAgbmV0d29ya19tb2R1bGVfLT5BZGRDbGllbnRIaW50SGVhZGVycygqdXJsX2ZldGNoZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcms6OmtDYWxsVHlwZVVwZGF0ZXIpOwogCiAgIC8vIFJlcXVlc3QgbW9kZSBpcyBrQ09SU01vZGVPbWl0Q3JlZGVudGlhbHMuCiAgIGNvbnN0IHVpbnQzMiBrRGlzYWJsZUNvb2tpZXNBbmRDYWNoZUxvYWRGbGFncyA9CmRpZmYgLS1naXQgYS9jb2JhbHQvdXBkYXRlci91bnppcHBlci5jYyBiL2NvYmFsdC91cGRhdGVyL3VuemlwcGVyLmNjCmluZGV4IDE4NTViM2EuLjIyZDY0MjMgMTAwNjQ0Ci0tLSBhL2NvYmFsdC91cGRhdGVyL3VuemlwcGVyLmNjCisrKyBiL2NvYmFsdC91cGRhdGVyL3VuemlwcGVyLmNjCkBAIC0xNCw3ICsxNCw5IEBACiAKICNpbmNsdWRlICJjb2JhbHQvdXBkYXRlci91bnppcHBlci5oIgogCisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3BhdGguaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgpAQCAtNDAsNiArNDIsMjAgQEAKICAgICBMT0coSU5GTykgPDwgIlVuemlwIHRvb2sgIiA8PCB0aW1lX3VuemlwX3Rvb2sgLyBrU2JUaW1lTWlsbGlzZWNvbmQKICAgICAgICAgICAgICAgPDwgIiBtaWxsaXNlY29uZHMuIjsKICAgfQorCisjaWYgZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKKyAgdm9pZCBVbnppcChjb25zdCBzdGQ6OnN0cmluZyYgemlwX3N0ciwgY29uc3QgYmFzZTo6RmlsZVBhdGgmIG91dHB1dF9wYXRoLAorICAgICAgICAgICAgIFVuemlwQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGUgeworICAgIFNiVGltZU1vbm90b25pYyB0aW1lX2JlZm9yZV91bnppcCA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICAgIHN0ZDo6bW92ZShjYWxsYmFjaykuUnVuKHppcDo6VW56aXAoemlwX3N0ciwgb3V0cHV0X3BhdGgpKTsKKyAgICBTYlRpbWVNb25vdG9uaWMgdGltZV91bnppcF90b29rID0KKyAgICAgICAgU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgLSB0aW1lX2JlZm9yZV91bnppcDsKKyAgICBMT0coSU5GTykgPDwgIlVuemlwIGZyb20gc3RyaW5nIjsKKyAgICBMT0coSU5GTykgPDwgIm91dHB1dF9wYXRoID0gIiA8PCBvdXRwdXRfcGF0aDsKKyAgICBMT0coSU5GTykgPDwgIlVuemlwIHRvb2sgIiA8PCB0aW1lX3VuemlwX3Rvb2sgLyBrU2JUaW1lTWlsbGlzZWNvbmQKKyAgICAgICAgICAgICAgPDwgIiBtaWxsaXNlY29uZHMuIjsKKyAgfQorI2VuZGlmCiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2NvYmFsdC93ZWIvYWdlbnQuY2MgYi9jb2JhbHQvd2ViL2FnZW50LmNjCmluZGV4IDQzNDE2MDAuLjRlZmIwYTQgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93ZWIvYWdlbnQuY2MKKysrIGIvY29iYWx0L3dlYi9hZ2VudC5jYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgImNvYmFsdC93ZWIvdXJsLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYi93aW5kb3dfb3Jfd29ya2VyX2dsb2JhbF9zY29wZS5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2pvYnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX29iamVjdC5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fb2JqZWN0LmgiCkBAIC05MSw4ICs5MSw4IEBACiAgICAgRENIRUNLKGZldGNoZXJfZmFjdG9yeV8pOwogICAgIHJldHVybiBmZXRjaGVyX2ZhY3RvcnlfLT5uZXR3b3JrX21vZHVsZSgpOwogICB9Ci0gIHdvcmtlcjo6U2VydmljZVdvcmtlckpvYnMqIHNlcnZpY2Vfd29ya2VyX2pvYnMoKSBjb25zdCBmaW5hbCB7Ci0gICAgcmV0dXJuIHNlcnZpY2Vfd29ya2VyX2pvYnNfOworICB3b3JrZXI6OlNlcnZpY2VXb3JrZXJDb250ZXh0KiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0KCkgY29uc3QgZmluYWwgeworICAgIHJldHVybiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0XzsKICAgfQogCiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgZmluYWwgeyByZXR1cm4gbmFtZV87IH07CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgc3RkOjptYXA8d29ya2VyOjpTZXJ2aWNlV29ya2VyT2JqZWN0Kiwgc2NvcGVkX3JlZnB0cjx3b3JrZXI6OlNlcnZpY2VXb3JrZXI+PgogICAgICAgc2VydmljZV93b3JrZXJfb2JqZWN0X21hcF87CiAKLSAgd29ya2VyOjpTZXJ2aWNlV29ya2VySm9icyogc2VydmljZV93b3JrZXJfam9ic187CisgIHdvcmtlcjo6U2VydmljZVdvcmtlckNvbnRleHQqIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfOwogICBjb25zdCB3ZWI6OlVzZXJBZ2VudFBsYXRmb3JtSW5mbyogcGxhdGZvcm1faW5mb187CiAKICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI2NvbmNlcHQtZW52aXJvbm1lbnQtYWN0aXZlLXNlcnZpY2Utd29ya2VyCkBAIC0yNTAsNyArMjUwLDcgQEAKIEltcGw6OkltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IEFnZW50OjpPcHRpb25zJiBvcHRpb25zKQogICAgIDogbmFtZV8obmFtZSksIHdlYl9zZXR0aW5nc18ob3B0aW9ucy53ZWJfc2V0dGluZ3MpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndlYiIsICJBZ2VudDo6SW1wbDo6SW1wbCgpIik7Ci0gIHNlcnZpY2Vfd29ya2VyX2pvYnNfID0gb3B0aW9ucy5zZXJ2aWNlX3dvcmtlcl9qb2JzOworICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0XyA9IG9wdGlvbnMuc2VydmljZV93b3JrZXJfY29udGV4dDsKICAgcGxhdGZvcm1faW5mb18gPSBvcHRpb25zLnBsYXRmb3JtX2luZm87CiAgIGJsb2JfcmVnaXN0cnlfLnJlc2V0KG5ldyBCbG9iOjpSZWdpc3RyeSk7CiAKQEAgLTM1MiwxMSArMzUyLDkgQEAKICAgfQogI2VuZGlmCiAKLSAgaWYgKHNlcnZpY2Vfd29ya2VyX2pvYnNfKSB7Ci0gICAgc2VydmljZV93b3JrZXJfam9ic18tPlJlZ2lzdGVyV2ViQ29udGV4dCh0aGlzKTsKLSAgfQotICBpZiAoc2VydmljZV93b3JrZXJfam9ic18pIHsKLSAgICBzZXJ2aWNlX3dvcmtlcl9qb2JzXy0+U2V0QWN0aXZlV29ya2VyKGVudmlyb25tZW50X3NldHRpbmdzXy5nZXQoKSk7CisgIGlmIChzZXJ2aWNlX3dvcmtlcl9jb250ZXh0XykgeworICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5SZWdpc3RlcldlYkNvbnRleHQodGhpcyk7CisgICAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPlNldEFjdGl2ZVdvcmtlcihlbnZpcm9ubWVudF9zZXR0aW5nc18uZ2V0KCkpOwogICB9CiB9CiAKQEAgLTUzMywxMiArNTMxLDE0IEBACiAgIERDSEVDSyhtZXNzYWdlX2xvb3AoKSk7CiAgIERDSEVDSyh0aHJlYWRfLklzUnVubmluZygpKTsKIAotICBpZiAoY29udGV4dCgpICYmIGNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfam9icygpKSB7Ci0gICAgY29udGV4dCgpLT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCktPlVucmVnaXN0ZXJXZWJDb250ZXh0KGNvbnRleHQoKSk7CisgIGlmIChjb250ZXh0KCkgJiYgY29udGV4dCgpLT5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0KCkpIHsKKyAgICBjb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKS0+VW5yZWdpc3RlcldlYkNvbnRleHQoY29udGV4dCgpKTsKICAgfQogCiAgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0cnVjdGlvbiBvYnNlcnZlciBnb3QgYWRkZWQgYmVmb3JlIHN0b3BwaW5nIHRoZSB0aHJlYWQuCiAgIGRlc3RydWN0aW9uX29ic2VydmVyX2FkZGVkXy5XYWl0KCk7CisgIC8vIFdhaXQgZm9yIGFsbCBwcmV2aW91c2x5IHBvc3RlZCB0YXNrcyB0byBmaW5pc2guCisgIHRocmVhZF8ubWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPldhaXRGb3JGZW5jZSgpOwogICAvLyBTdG9wIHRoZSB0aHJlYWQuIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQuCiAgIHRocmVhZF8uU3RvcCgpOwogfQpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9hZ2VudC5oIGIvY29iYWx0L3dlYi9hZ2VudC5oCmluZGV4IGQ1N2Q1MjYuLjA5MWNlZTAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93ZWIvYWdlbnQuaAorKysgYi9jb2JhbHQvd2ViL2FnZW50LmgKQEAgLTM0LDcgKzM0LDcgQEAKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugd29ya2VyIHsKLWNsYXNzIFNlcnZpY2VXb3JrZXJKb2JzOworY2xhc3MgU2VydmljZVdvcmtlckNvbnRleHQ7CiB9CiBuYW1lc3BhY2Ugd2ViIHsKIApAQCAtNjksNyArNjksNyBAQAogICAgIGJhc2U6OkNhbGxiYWNrPGludChjb25zdCBzdGQ6OnN0cmluZyYsIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+Kik+CiAgICAgICAgIHJlYWRfY2FjaGVfY2FsbGJhY2s7CiAKLSAgICB3b3JrZXI6OlNlcnZpY2VXb3JrZXJKb2JzKiBzZXJ2aWNlX3dvcmtlcl9qb2JzID0gbnVsbHB0cjsKKyAgICB3b3JrZXI6OlNlcnZpY2VXb3JrZXJDb250ZXh0KiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0ID0gbnVsbHB0cjsKIAogICAgIGNvbnN0IFVzZXJBZ2VudFBsYXRmb3JtSW5mbyogcGxhdGZvcm1faW5mbyA9IG51bGxwdHI7CiAgIH07CmRpZmYgLS1naXQgYS9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlcy5pZGwgYi9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlcy5pZGwKaW5kZXggMzk5NjUxYS4uZWVmMWZhMCAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9jb2JhbHRfdWFfZGF0YV92YWx1ZXMuaWRsCisrKyBiL2NvYmFsdC93ZWIvY29iYWx0X3VhX2RhdGFfdmFsdWVzLmlkbApAQCAtMjIsOCArMjIsOCBAQAogICBET01TdHJpbmcgZXZlcmdyZWVuVHlwZTsKICAgRE9NU3RyaW5nIGV2ZXJncmVlbkZpbGVUeXBlOwogICBET01TdHJpbmcgZXZlcmdyZWVuVmVyc2lvbjsKLSAgRE9NU3RyaW5nIGZpcm13YXJlVmVyc2lvbkRldGFpbHM7Ci0gIERPTVN0cmluZyBvc0V4cGVyaWVuY2U7CisgIERPTVN0cmluZyBhbmRyb2lkQnVpbGRGaW5nZXJwcmludDsKKyAgRE9NU3RyaW5nIGFuZHJvaWRPc0V4cGVyaWVuY2U7CiAgIERPTVN0cmluZyBzdGFyYm9hcmRWZXJzaW9uOwogICBET01TdHJpbmcgb3JpZ2luYWxEZXNpZ25NYW51ZmFjdHVyZXI7CiAgIERPTVN0cmluZyBkZXZpY2VUeXBlOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9jb2JhbHRfdWFfZGF0YV92YWx1ZXNfaW50ZXJmYWNlLmNjIGIvY29iYWx0L3dlYi9jb2JhbHRfdWFfZGF0YV92YWx1ZXNfaW50ZXJmYWNlLmNjCmluZGV4IDQ3ZTIzZGQuLmFjNGE5YzAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93ZWIvY29iYWx0X3VhX2RhdGFfdmFsdWVzX2ludGVyZmFjZS5jYworKysgYi9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlc19pbnRlcmZhY2UuY2MKQEAgLTY3LDExICs2NywxMSBAQAogICBpZiAoaW5pdF9kaWN0Lmhhc19ldmVyZ3JlZW5fdmVyc2lvbigpKSB7CiAgICAgZXZlcmdyZWVuX3ZlcnNpb25fID0gaW5pdF9kaWN0LmV2ZXJncmVlbl92ZXJzaW9uKCk7CiAgIH0KLSAgaWYgKGluaXRfZGljdC5oYXNfZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzKCkpIHsKLSAgICBmaXJtd2FyZV92ZXJzaW9uX2RldGFpbHNfID0gaW5pdF9kaWN0LmZpcm13YXJlX3ZlcnNpb25fZGV0YWlscygpOworICBpZiAoaW5pdF9kaWN0Lmhhc19hbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50KCkpIHsKKyAgICBhbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50XyA9IGluaXRfZGljdC5hbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50KCk7CiAgIH0KLSAgaWYgKGluaXRfZGljdC5oYXNfb3NfZXhwZXJpZW5jZSgpKSB7Ci0gICAgb3NfZXhwZXJpZW5jZV8gPSBpbml0X2RpY3Qub3NfZXhwZXJpZW5jZSgpOworICBpZiAoaW5pdF9kaWN0Lmhhc19hbmRyb2lkX29zX2V4cGVyaWVuY2UoKSkgeworICAgIGFuZHJvaWRfb3NfZXhwZXJpZW5jZV8gPSBpbml0X2RpY3QuYW5kcm9pZF9vc19leHBlcmllbmNlKCk7CiAgIH0KICAgaWYgKGluaXRfZGljdC5oYXNfc3RhcmJvYXJkX3ZlcnNpb24oKSkgewogICAgIHN0YXJib2FyZF92ZXJzaW9uXyA9IGluaXRfZGljdC5zdGFyYm9hcmRfdmVyc2lvbigpOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9jb2JhbHRfdWFfZGF0YV92YWx1ZXNfaW50ZXJmYWNlLmggYi9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlc19pbnRlcmZhY2UuaAppbmRleCA4MWRjYzcwLi4yMjU5OWZmIDEwMDY0NAotLS0gYS9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlc19pbnRlcmZhY2UuaAorKysgYi9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlc19pbnRlcmZhY2UuaApAQCAtNDgsMTAgKzQ4LDEyIEBACiAgICAgcmV0dXJuIGV2ZXJncmVlbl9maWxlX3R5cGVfOwogICB9CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVyZ3JlZW5fdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIGV2ZXJncmVlbl92ZXJzaW9uXzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzKCkgY29uc3QgewotICAgIHJldHVybiBmaXJtd2FyZV92ZXJzaW9uX2RldGFpbHNfOworICBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9idWlsZF9maW5nZXJwcmludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYW5kcm9pZF9idWlsZF9maW5nZXJwcmludF87CiAgIH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX2V4cGVyaWVuY2UoKSBjb25zdCB7IHJldHVybiBvc19leHBlcmllbmNlXzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9vc19leHBlcmllbmNlKCkgY29uc3QgeworICAgIHJldHVybiBhbmRyb2lkX29zX2V4cGVyaWVuY2VfOworICB9CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGFyYm9hcmRfdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIHN0YXJib2FyZF92ZXJzaW9uXzsgfQogICBjb25zdCBzdGQ6OnN0cmluZyYgb3JpZ2luYWxfZGVzaWduX21hbnVmYWN0dXJlcigpIGNvbnN0IHsKICAgICByZXR1cm4gb3JpZ2luYWxfZGVzaWduX21hbnVmYWN0dXJlcl87CkBAIC04Myw4ICs4NSw4IEBACiAgIHN0ZDo6c3RyaW5nIGV2ZXJncmVlbl90eXBlXzsKICAgc3RkOjpzdHJpbmcgZXZlcmdyZWVuX2ZpbGVfdHlwZV87CiAgIHN0ZDo6c3RyaW5nIGV2ZXJncmVlbl92ZXJzaW9uXzsKLSAgc3RkOjpzdHJpbmcgZmlybXdhcmVfdmVyc2lvbl9kZXRhaWxzXzsKLSAgc3RkOjpzdHJpbmcgb3NfZXhwZXJpZW5jZV87CisgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnRfOworICBzdGQ6OnN0cmluZyBhbmRyb2lkX29zX2V4cGVyaWVuY2VfOwogICBzdGQ6OnN0cmluZyBzdGFyYm9hcmRfdmVyc2lvbl87CiAgIHN0ZDo6c3RyaW5nIG9yaWdpbmFsX2Rlc2lnbl9tYW51ZmFjdHVyZXJfOwogICBzdGQ6OnN0cmluZyBkZXZpY2VfdHlwZV87CmRpZmYgLS1naXQgYS9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlc19pbnRlcmZhY2UuaWRsIGIvY29iYWx0L3dlYi9jb2JhbHRfdWFfZGF0YV92YWx1ZXNfaW50ZXJmYWNlLmlkbAppbmRleCBmYzY3MGMyLi5iN2NlNjM0IDEwMDY0NAotLS0gYS9jb2JhbHQvd2ViL2NvYmFsdF91YV9kYXRhX3ZhbHVlc19pbnRlcmZhY2UuaWRsCisrKyBiL2NvYmFsdC93ZWIvY29iYWx0X3VhX2RhdGFfdmFsdWVzX2ludGVyZmFjZS5pZGwKQEAgLTMyLDggKzMyLDggQEAKICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBldmVyZ3JlZW5UeXBlOwogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGV2ZXJncmVlbkZpbGVUeXBlOwogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGV2ZXJncmVlblZlcnNpb247Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgZmlybXdhcmVWZXJzaW9uRGV0YWlsczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBvc0V4cGVyaWVuY2U7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgYW5kcm9pZEJ1aWxkRmluZ2VycHJpbnQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgYW5kcm9pZE9zRXhwZXJpZW5jZTsKICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzdGFyYm9hcmRWZXJzaW9uOwogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG9yaWdpbmFsRGVzaWduTWFudWZhY3R1cmVyOwogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGRldmljZVR5cGU7CmRpZmYgLS1naXQgYS9jb2JhbHQvd2ViL2NvbnRleHQuaCBiL2NvYmFsdC93ZWIvY29udGV4dC5oCmluZGV4IDNmZGY0MmMuLmI4ZmM0NTAgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93ZWIvY29udGV4dC5oCisrKyBiL2NvYmFsdC93ZWIvY29udGV4dC5oCkBAIC0zNiw3ICszNiw3IEBACiBjbGFzcyBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uOwogY2xhc3MgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdDsKIGNsYXNzIFNlcnZpY2VXb3JrZXI7Ci1jbGFzcyBTZXJ2aWNlV29ya2VySm9iczsKK2NsYXNzIFNlcnZpY2VXb3JrZXJDb250ZXh0OwogY2xhc3MgU2VydmljZVdvcmtlck9iamVjdDsKIH0gIC8vIG5hbWVzcGFjZSB3b3JrZXIKIG5hbWVzcGFjZSB3ZWIgewpAQCAtNjUsNyArNjUsNyBAQAogICB2aXJ0dWFsIEJsb2I6OlJlZ2lzdHJ5KiBibG9iX3JlZ2lzdHJ5KCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIHdlYjo6V2ViU2V0dGluZ3MqIHdlYl9zZXR0aW5ncygpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB3b3JrZXI6OlNlcnZpY2VXb3JrZXJKb2JzKiBzZXJ2aWNlX3dvcmtlcl9qb2JzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHdvcmtlcjo6U2VydmljZVdvcmtlckNvbnRleHQqIHNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKSBjb25zdCA9IDA7CiAKICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0ID0gMDsKICAgdmlydHVhbCB2b2lkIFNldHVwRW52aXJvbm1lbnRTZXR0aW5ncyhFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5ncykgPSAwOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9jdXN0b21fZXZlbnQuaCBiL2NvYmFsdC93ZWIvY3VzdG9tX2V2ZW50LmgKaW5kZXggZjUxMDdkNS4uMmMwOGI3MiAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9jdXN0b21fZXZlbnQuaAorKysgYi9jb2JhbHQvd2ViL2N1c3RvbV9ldmVudC5oCkBAIC0zMywxMSArMzMsMTEgQEAKICBwdWJsaWM6CiAgIGV4cGxpY2l0IEN1c3RvbUV2ZW50KHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlKQotICAgICAgOiBFdmVudCh0eXBlKSwgZW52aXJvbm1lbnRfc2V0dGluZ3NfKGVudmlyb25tZW50X3NldHRpbmdzKSB7fQorICAgICAgOiBFdmVudCh0eXBlKSB7fQogICBDdXN0b21FdmVudChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzLAogICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgQ3VzdG9tRXZlbnRJbml0JiBpbml0X2RpY3QpCi0gICAgICA6IEV2ZW50KHR5cGUsIGluaXRfZGljdCksIGVudmlyb25tZW50X3NldHRpbmdzXyhlbnZpcm9ubWVudF9zZXR0aW5ncykgewotICAgIHNldF9kZXRhaWwoaW5pdF9kaWN0LmRldGFpbCgpKTsKKyAgICAgIDogRXZlbnQodHlwZSwgaW5pdF9kaWN0KSB7CisgICAgc2V0X2RldGFpbChlbnZpcm9ubWVudF9zZXR0aW5ncywgaW5pdF9kaWN0LmRldGFpbCgpKTsKICAgfQogCiAgIC8vIENyZWF0ZXMgYW4gZXZlbnQgd2l0aCBpdHMgImluaXRpYWxpemVkIGZsYWciIHVuc2V0LgpAQCAtNDYsMTcgKzQ2LDE4IEBACiAKICAgLy8gV2ViIEFQSTogQ3VzdG9tRXZlbnQKICAgLy8KLSAgdm9pZCBJbml0Q3VzdG9tRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsIGJvb2wgYnViYmxlcywgYm9vbCBjYW5jZWxhYmxlLAorICB2b2lkIEluaXRDdXN0b21FdmVudChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgYm9vbCBidWJibGVzLCBib29sIGNhbmNlbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXImIGRldGFpbCkgewogICAgIEluaXRFdmVudCh0eXBlLCBidWJibGVzLCBjYW5jZWxhYmxlKTsKLSAgICBzZXRfZGV0YWlsKCZkZXRhaWwpOworICAgIHNldF9kZXRhaWwoZW52aXJvbm1lbnRfc2V0dGluZ3MsICZkZXRhaWwpOwogICB9CiAKLSAgdm9pZCBzZXRfZGV0YWlsKGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIGRldGFpbCkgeworICB2b2lkIHNldF9kZXRhaWwoc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBlbnZpcm9ubWVudF9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIGRldGFpbCkgewogICAgIGlmIChkZXRhaWwpIHsKLSAgICAgIGF1dG8qIHdyYXBwYWJsZSA9IGVudmlyb25tZW50X3NldHRpbmdzXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0X2dsb2JhbF93cmFwcGFibGUoZW52aXJvbm1lbnRfc2V0dGluZ3NfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpczsKKyAgICAgIERDSEVDSyhlbnZpcm9ubWVudF9zZXR0aW5ncyk7CisgICAgICBhdXRvKiB3cmFwcGFibGUgPSBnZXRfZ2xvYmFsX3dyYXBwYWJsZShlbnZpcm9ubWVudF9zZXR0aW5ncyk7CiAgICAgICBkZXRhaWxfLnJlc2V0KAogICAgICAgICAgIG5ldyBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyOjpSZWZlcmVuY2Uod3JhcHBhYmxlLCAqZGV0YWlsKSk7CiAgICAgfSBlbHNlIHsKQEAgLTc4LDkgKzc5LDYgQEAKICAgfkN1c3RvbUV2ZW50KCkgb3ZlcnJpZGUge30KIAogICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcjo6UmVmZXJlbmNlPiBkZXRhaWxfOwotCi0gcHJpdmF0ZToKLSAgc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBlbnZpcm9ubWVudF9zZXR0aW5nc187CiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugd2ViCmRpZmYgLS1naXQgYS9jb2JhbHQvd2ViL2N1c3RvbV9ldmVudC5pZGwgYi9jb2JhbHQvd2ViL2N1c3RvbV9ldmVudC5pZGwKaW5kZXggNjliNDcxZC4uYmE1NDE5MCAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9jdXN0b21fZXZlbnQuaWRsCisrKyBiL2NvYmFsdC93ZWIvY3VzdG9tX2V2ZW50LmlkbApAQCAtMjAsNyArMjAsNyBAQAogXSBpbnRlcmZhY2UgQ3VzdG9tRXZlbnQgOiBFdmVudCB7CiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBhbnkgZGV0YWlsOwogCi0gIHZvaWQgaW5pdEN1c3RvbUV2ZW50KERPTVN0cmluZyB0eXBlLAorICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gdm9pZCBpbml0Q3VzdG9tRXZlbnQoRE9NU3RyaW5nIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYnViYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBhbnkgZGV0YWlsKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC93ZWIvZW52aXJvbm1lbnRfc2V0dGluZ3NfaGVscGVyLmNjIGIvY29iYWx0L3dlYi9lbnZpcm9ubWVudF9zZXR0aW5nc19oZWxwZXIuY2MKaW5kZXggNmUzMTEwYS4uYjQyYjQ0NiAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9lbnZpcm9ubWVudF9zZXR0aW5nc19oZWxwZXIuY2MKKysrIGIvY29iYWx0L3dlYi9lbnZpcm9ubWVudF9zZXR0aW5nc19oZWxwZXIuY2MKQEAgLTIzLDYgKzIzLDkgQEAKIG5hbWVzcGFjZSB3ZWIgewogCiBDb250ZXh0KiBnZXRfY29udGV4dChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzKSB7CisgIGlmICghZW52aXJvbm1lbnRfc2V0dGluZ3MpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQogICBhdXRvKiBzZXR0aW5ncyA9CiAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxFbnZpcm9ubWVudFNldHRpbmdzKj4oZW52aXJvbm1lbnRfc2V0dGluZ3MpOwogICByZXR1cm4gc2V0dGluZ3MtPmNvbnRleHQoKTsKQEAgLTMwLDI2ICszMyw0NiBAQAogCiBzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50KiBnZXRfZ2xvYmFsX2Vudmlyb25tZW50KAogICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MpIHsKLSAgcmV0dXJuIGdldF9jb250ZXh0KGVudmlyb25tZW50X3NldHRpbmdzKS0+Z2xvYmFsX2Vudmlyb25tZW50KCk7CisgIGF1dG8qIGNvbnRleHQgPSBnZXRfY29udGV4dChlbnZpcm9ubWVudF9zZXR0aW5ncyk7CisgIGlmICghY29udGV4dCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBjb250ZXh0LT5nbG9iYWxfZW52aXJvbm1lbnQoKTsKIH0KIAogdjg6Oklzb2xhdGUqIGdldF9pc29sYXRlKHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MpIHsKLSAgcmV0dXJuIGdldF9nbG9iYWxfZW52aXJvbm1lbnQoZW52aXJvbm1lbnRfc2V0dGluZ3MpLT5pc29sYXRlKCk7CisgIGF1dG8qIGdsb2JhbF9lbnZpcm9ubWVudCA9IGdldF9nbG9iYWxfZW52aXJvbm1lbnQoZW52aXJvbm1lbnRfc2V0dGluZ3MpOworICBpZiAoIWdsb2JhbF9lbnZpcm9ubWVudCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBnbG9iYWxfZW52aXJvbm1lbnQtPmlzb2xhdGUoKTsKIH0KIAogc2NyaXB0OjpXcmFwcGFibGUqIGdldF9nbG9iYWxfd3JhcHBhYmxlKAogICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MpIHsKLSAgcmV0dXJuIGdldF9nbG9iYWxfZW52aXJvbm1lbnQoZW52aXJvbm1lbnRfc2V0dGluZ3MpLT5nbG9iYWxfd3JhcHBhYmxlKCk7CisgIGF1dG8qIGdsb2JhbF9lbnZpcm9ubWVudCA9IGdldF9nbG9iYWxfZW52aXJvbm1lbnQoZW52aXJvbm1lbnRfc2V0dGluZ3MpOworICBpZiAoIWdsb2JhbF9lbnZpcm9ubWVudCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBnbG9iYWxfZW52aXJvbm1lbnQtPmdsb2JhbF93cmFwcGFibGUoKTsKIH0KIAogc2NyaXB0OjpTY3JpcHRWYWx1ZUZhY3RvcnkqIGdldF9zY3JpcHRfdmFsdWVfZmFjdG9yeSgKICAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzKSB7Ci0gIHJldHVybiBnZXRfZ2xvYmFsX2Vudmlyb25tZW50KGVudmlyb25tZW50X3NldHRpbmdzKS0+c2NyaXB0X3ZhbHVlX2ZhY3RvcnkoKTsKKyAgYXV0byogZ2xvYmFsX2Vudmlyb25tZW50ID0gZ2V0X2dsb2JhbF9lbnZpcm9ubWVudChlbnZpcm9ubWVudF9zZXR0aW5ncyk7CisgIGlmICghZ2xvYmFsX2Vudmlyb25tZW50KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIGdsb2JhbF9lbnZpcm9ubWVudC0+c2NyaXB0X3ZhbHVlX2ZhY3RvcnkoKTsKIH0KIAogYmFzZTo6TWVzc2FnZUxvb3AqIGdldF9tZXNzYWdlX2xvb3AoCiAgICAgc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBlbnZpcm9ubWVudF9zZXR0aW5ncykgewotICByZXR1cm4gZ2V0X2NvbnRleHQoZW52aXJvbm1lbnRfc2V0dGluZ3MpLT5tZXNzYWdlX2xvb3AoKTsKKyAgYXV0byogY29udGV4dCA9IGdldF9jb250ZXh0KGVudmlyb25tZW50X3NldHRpbmdzKTsKKyAgaWYgKCFjb250ZXh0KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugd2ViCmRpZmYgLS1naXQgYS9jb2JhbHQvd2ViL21lc3NhZ2VfZXZlbnQuY2MgYi9jb2JhbHQvd2ViL21lc3NhZ2VfZXZlbnQuY2MKaW5kZXggYjM4YTFmZS4uMjYyZTIzMSAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9tZXNzYWdlX2V2ZW50LmNjCisrKyBiL2NvYmFsdC93ZWIvbWVzc2FnZV9ldmVudC5jYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdjhjL3Y4Y19leGNlcHRpb25fc3RhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL2Vudmlyb25tZW50X3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29iYWx0L3dlYi9lbnZpcm9ubWVudF9zZXR0aW5nc19oZWxwZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3N0cmluZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKICNpbmNsdWRlICJ2OC9pbmNsdWRlL3Y4LmgiCkBAIC00NCw3ICs0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlRXZlbnRJbml0JiBpbml0X2RpY3QpCiAgICAgOiBFdmVudCh0eXBlLCBpbml0X2RpY3QpLCByZXNwb25zZV90eXBlXyhrQW55KSB7CiAgIGlmIChpbml0X2RpY3QuaGFzX2RhdGEoKSAmJiBpbml0X2RpY3QuZGF0YSgpKSB7Ci0gICAgZGF0YV8gPSBzY3JpcHQ6OlNlcmlhbGl6ZVNjcmlwdFZhbHVlKCooaW5pdF9kaWN0LmRhdGEoKSkpOworICAgIHN0cnVjdHVyZWRfY2xvbmVfID0KKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4oKihpbml0X2RpY3QuZGF0YSgpKSk7CiAgIH0KICAgaWYgKGluaXRfZGljdC5oYXNfb3JpZ2luKCkpIHsKICAgICBvcmlnaW5fID0gaW5pdF9kaWN0Lm9yaWdpbigpOwpAQCAtODAsMjQgKzgyLDEyIEBACiB9CiAKIE1lc3NhZ2VFdmVudDo6UmVzcG9uc2UgTWVzc2FnZUV2ZW50OjpkYXRhKAotICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MpIGNvbnN0IHsKLSAgaWYgKCFkYXRhXyAmJiAhZGF0YV9pb19idWZmZXJfKSB7Ci0gICAgcmV0dXJuIFJlc3BvbnNlKHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6VmFsdWVIYW5kbGU+KCkpOwotICB9Ci0KLSAgc2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0gbnVsbHB0cjsKLSAgaWYgKHJlc3BvbnNlX3R5cGVfID09IGtCbG9iIHx8IHJlc3BvbnNlX3R5cGVfID09IGtBcnJheUJ1ZmZlciB8fAotICAgICAgcmVzcG9uc2VfdHlwZV8gPT0ga0FueSkgewotICAgIERDSEVDSyhzZXR0aW5ncyk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8RW52aXJvbm1lbnRTZXR0aW5ncyo+KHNldHRpbmdzKQotICAgICAgICAgICAgLT5jb250ZXh0KCkKLSAgICAgICAgICAgIC0+Z2xvYmFsX2Vudmlyb25tZW50KCk7Ci0gICAgRENIRUNLKGdsb2JhbF9lbnZpcm9ubWVudCk7Ci0gIH0KLQorICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MpIHsKICAgc3dpdGNoIChyZXNwb25zZV90eXBlXykgewogICAgIGNhc2Uga1RleHQ6IHsKKyAgICAgIGlmICghZGF0YV9pb19idWZmZXJfKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZShzY3JpcHQ6OkhhbmRsZTxzY3JpcHQ6OlZhbHVlSGFuZGxlPigpKTsKKyAgICAgIH0KICAgICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gcmVtb3ZlIHR3byBjb3BpZXMgb2YgZGF0YSBoZXJlLgogICAgICAgc3RkOjpzdHJpbmcgc3RyaW5nX3Jlc3BvbnNlKGRhdGFfaW9fYnVmZmVyXy0+ZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfaW9fYnVmZmVyXy0+c2l6ZSgpKTsKQEAgLTEwNSw2ICs5NSwxMCBAQAogICAgIH0KICAgICBjYXNlIGtCbG9iOgogICAgIGNhc2Uga0FycmF5QnVmZmVyOiB7CisgICAgICBhdXRvKiBnbG9iYWxfZW52aXJvbm1lbnQgPSB3ZWI6OmdldF9nbG9iYWxfZW52aXJvbm1lbnQoc2V0dGluZ3MpOworICAgICAgaWYgKCFkYXRhX2lvX2J1ZmZlcl8gfHwgIWdsb2JhbF9lbnZpcm9ubWVudCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uoc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4oKSk7CisgICAgICB9CiAgICAgICBhdXRvIGJ1ZmZlcl9jb3B5ID0gc2NyaXB0OjpBcnJheUJ1ZmZlcjo6TmV3KAogICAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudCwgZGF0YV9pb19idWZmZXJfLT5kYXRhKCksIGRhdGFfaW9fYnVmZmVyXy0+c2l6ZSgpKTsKICAgICAgIHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6QXJyYXlCdWZmZXI+IHJlc3BvbnNlX2J1ZmZlciA9CkBAIC0xMTcsMTIgKzExMSwxMiBAQAogICAgICAgcmV0dXJuIFJlc3BvbnNlKHJlc3BvbnNlX2J1ZmZlcik7CiAgICAgfQogICAgIGNhc2Uga0FueTogewotICAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBnbG9iYWxfZW52aXJvbm1lbnQtPmlzb2xhdGUoKTsKKyAgICAgIGlmICghc3RydWN0dXJlZF9jbG9uZV8pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlKHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6VmFsdWVIYW5kbGU+KCkpOworICAgICAgfQorICAgICAgYXV0byogaXNvbGF0ZSA9IHdlYjo6Z2V0X2lzb2xhdGUoc2V0dGluZ3MpOwogICAgICAgc2NyaXB0Ojp2OGM6OkVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZSk7Ci0gICAgICBEQ0hFQ0soaXNvbGF0ZSk7Ci0gICAgICBEQ0hFQ0soZGF0YV8pOwotICAgICAgcmV0dXJuIFJlc3BvbnNlKHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6VmFsdWVIYW5kbGU+KAotICAgICAgICAgIHN0ZDo6bW92ZShzY3JpcHQ6OkRlc2VyaWFsaXplU2NyaXB0VmFsdWUoaXNvbGF0ZSwgKmRhdGFfKSkpKTsKKyAgICAgIHJldHVybiBSZXNwb25zZShzdHJ1Y3R1cmVkX2Nsb25lXy0+RGVzZXJpYWxpemUoaXNvbGF0ZSkpOwogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIHJlc3BvbnNlIHR5cGUuIjsKZGlmZiAtLWdpdCBhL2NvYmFsdC93ZWIvbWVzc2FnZV9ldmVudC5oIGIvY29iYWx0L3dlYi9tZXNzYWdlX2V2ZW50LmgKaW5kZXggYmE4MWMxZi4uYjE2YWFhYyAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9tZXNzYWdlX2V2ZW50LmgKKysrIGIvY29iYWx0L3dlYi9tZXNzYWdlX2V2ZW50LmgKQEAgLTU1LDE0ICs1NSwxNyBAQAogICAgICAgOiBFdmVudCh1bmluaXRpYWxpemVkX2ZsYWcpIHt9CiAKICAgZXhwbGljaXQgTWVzc2FnZUV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlKSA6IEV2ZW50KHR5cGUpIHt9Ci0gIE1lc3NhZ2VFdmVudChiYXNlOjpUb2tlbiB0eXBlLCBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBkYXRhKQotICAgICAgOiBFdmVudCh0eXBlKSwgcmVzcG9uc2VfdHlwZV8oa0FueSksIGRhdGFfKHN0ZDo6bW92ZShkYXRhKSkge30KKyAgTWVzc2FnZUV2ZW50KGJhc2U6OlRva2VuIHR5cGUsCisgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpTdHJ1Y3R1cmVkQ2xvbmU+IHN0cnVjdHVyZWRfY2xvbmUpCisgICAgICA6IEV2ZW50KHR5cGUpLAorICAgICAgICByZXNwb25zZV90eXBlXyhrQW55KSwKKyAgICAgICAgc3RydWN0dXJlZF9jbG9uZV8oc3RkOjptb3ZlKHN0cnVjdHVyZWRfY2xvbmUpKSB7fQogICBNZXNzYWdlRXZlbnQoYmFzZTo6VG9rZW4gdHlwZSwgUmVzcG9uc2VUeXBlIHJlc3BvbnNlX3R5cGUsCiAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPG5ldDo6SU9CdWZmZXJXaXRoU2l6ZT4mIGRhdGEpCiAgICAgICA6IEV2ZW50KHR5cGUpLCByZXNwb25zZV90eXBlXyhyZXNwb25zZV90eXBlKSwgZGF0YV9pb19idWZmZXJfKGRhdGEpIHt9CiAgIE1lc3NhZ2VFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgTWVzc2FnZUV2ZW50SW5pdCYgaW5pdF9kaWN0KTsKIAotICBSZXNwb25zZSBkYXRhKHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MgPSBudWxscHRyKSBjb25zdDsKKyAgUmVzcG9uc2UgZGF0YShzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzID0gbnVsbHB0cik7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBvcmlnaW5fOyB9CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYXN0X2V2ZW50X2lkKCkgY29uc3QgeyByZXR1cm4gbGFzdF9ldmVudF9pZF87IH0KICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudFRhcmdldD4mIHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV87IH0KQEAgLTg4LDcgKzkxLDcgQEAKICBwcml2YXRlOgogICBSZXNwb25zZVR5cGUgcmVzcG9uc2VfdHlwZV8gPSBrVGV4dDsKICAgc2NvcGVkX3JlZnB0cjxuZXQ6OklPQnVmZmVyV2l0aFNpemU+IGRhdGFfaW9fYnVmZmVyXzsKLSAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6RGF0YUJ1ZmZlcj4gZGF0YV87CisgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4gc3RydWN0dXJlZF9jbG9uZV87CiAgIHN0ZDo6c3RyaW5nIG9yaWdpbl87CiAgIHN0ZDo6c3RyaW5nIGxhc3RfZXZlbnRfaWRfOwogICBzY29wZWRfcmVmcHRyPEV2ZW50VGFyZ2V0PiBzb3VyY2VfOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9tZXNzYWdlX2V2ZW50X3Rlc3QuY2MgYi9jb2JhbHQvd2ViL21lc3NhZ2VfZXZlbnRfdGVzdC5jYwppbmRleCA5Mzg5M2IyLi44ZjlmZjg5IDEwMDY0NAotLS0gYS9jb2JhbHQvd2ViL21lc3NhZ2VfZXZlbnRfdGVzdC5jYworKysgYi9jb2JhbHQvd2ViL21lc3NhZ2VfZXZlbnRfdGVzdC5jYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdjhjL2VudHJ5X3Njb3BlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92YWx1ZV9oYW5kbGUuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL2Jsb2IuaCIKKyNpbmNsdWRlICJjb2JhbHQvd2ViL2Vudmlyb25tZW50X3NldHRpbmdzX2hlbHBlci5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWIvbWVzc2FnZV9ldmVudF9pbml0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYi90ZXN0aW5nL2d0ZXN0X3dvcmthcm91bmRzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYi90ZXN0aW5nL3Rlc3Rfd2l0aF9qYXZhc2NyaXB0LmgiCkBAIC0xNDgsMTMgKzE0OSwxMSBAQAogVEVTVF9QKE1lc3NhZ2VFdmVudFRlc3RXaXRoSmF2YVNjcmlwdCwgQ29uc3RydWN0b3JXaXRoQW55KSB7CiAgIGJhc2U6Ok9wdGlvbmFsPHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXI6OlJlZmVyZW5jZT4gcmVmZXJlbmNlOwogICBFdmFsdWF0ZVNjcmlwdCgiJ0NvbnN0cnVjdG9yV2l0aEFueU1lc3NhZ2VEYXRhJyIsICZyZWZlcmVuY2UpOwotICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBkYXRhKAotICAgICAgc2NyaXB0OjpTZXJpYWxpemVTY3JpcHRWYWx1ZShyZWZlcmVuY2UtPnJlZmVyZW5jZWRfdmFsdWUoKSkpOwotICBFWFBFQ1RfTkUobnVsbHB0ciwgZGF0YS5nZXQoKSk7Ci0gIEVYUEVDVF9ORShudWxscHRyLCBkYXRhLT5wdHIpOwotICBFWFBFQ1RfR1QoZGF0YS0+c2l6ZSwgMFUpOworICBhdXRvKiBpc29sYXRlID0gd2ViOjpnZXRfaXNvbGF0ZSh3ZWJfY29udGV4dCgpLT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKTsKKyAgYXV0byBzdHJ1Y3R1cmVkX2Nsb25lID0KKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8c2NyaXB0OjpTdHJ1Y3R1cmVkQ2xvbmU+KHJlZmVyZW5jZS0+cmVmZXJlbmNlZF92YWx1ZSgpKTsKICAgc2NvcGVkX3JlZnB0cjxNZXNzYWdlRXZlbnQ+IGV2ZW50ID0KLSAgICAgIG5ldyBNZXNzYWdlRXZlbnQoYmFzZTo6VG9rZW5zOjptZXNzYWdlKCksIHN0ZDo6bW92ZShkYXRhKSk7CisgICAgICBuZXcgTWVzc2FnZUV2ZW50KGJhc2U6OlRva2Vuczo6bWVzc2FnZSgpLCBzdGQ6Om1vdmUoc3RydWN0dXJlZF9jbG9uZSkpOwogCiAgIEVYUEVDVF9FUSgibWVzc2FnZSIsIGV2ZW50LT50eXBlKCkpOwogICBFWFBFQ1RfRVEoTlVMTCwgZXZlbnQtPnRhcmdldCgpLmdldCgpKTsKQEAgLTE2Niw2ICsxNjUsNyBAQAogICBFWFBFQ1RfRkFMU0UoZXZlbnQtPklzQmVpbmdEaXNwYXRjaGVkKCkpOwogICBFWFBFQ1RfRkFMU0UoZXZlbnQtPnByb3BhZ2F0aW9uX3N0b3BwZWQoKSk7CiAgIEVYUEVDVF9GQUxTRShldmVudC0+aW1tZWRpYXRlX3Byb3BhZ2F0aW9uX3N0b3BwZWQoKSk7CisgIHNjcmlwdDo6djhjOjpFbnRyeVNjb3BlIGVudHJ5X3Njb3BlKGlzb2xhdGUpOwogICBNZXNzYWdlRXZlbnQ6OlJlc3BvbnNlIGV2ZW50X2RhdGEgPQogICAgICAgZXZlbnQtPmRhdGEod2ViX2NvbnRleHQoKS0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X2RhdGEuSXNUeXBlPHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6VmFsdWVIYW5kbGU+PigpKTsKQEAgLTE3Myw4ICsxNzMsNiBAQAogICAgICAgZXZlbnRfZGF0YS5Bc1R5cGU8c2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4+KCkuSXNFbXB0eSgpKTsKICAgYXV0byBzY3JpcHRfdmFsdWUgPQogICAgICAgZXZlbnRfZGF0YS5Bc1R5cGU8c2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4+KCkuR2V0U2NyaXB0VmFsdWUoKTsKLSAgYXV0byogaXNvbGF0ZSA9IHNjcmlwdDo6R2V0SXNvbGF0ZSgqc2NyaXB0X3ZhbHVlKTsKLSAgc2NyaXB0Ojp2OGM6OkVudHJ5U2NvcGUgZW50cnlfc2NvcGUoaXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHY4X3ZhbHVlID0gc2NyaXB0OjpHZXRWOFZhbHVlKCpzY3JpcHRfdmFsdWUpOwogICBzdGQ6OnN0cmluZyBhY3R1YWwgPQogICAgICAgKih2ODo6U3RyaW5nOjpVdGY4VmFsdWUoaXNvbGF0ZSwgdjhfdmFsdWUuQXM8djg6OlN0cmluZz4oKSkpOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9tZXNzYWdlX3BvcnQuY2MgYi9jb2JhbHQvd2ViL21lc3NhZ2VfcG9ydC5jYwppbmRleCBlMGViMTI2Li44NzE4NzRiIDEwMDY0NAotLS0gYS9jb2JhbHQvd2ViL21lc3NhZ2VfcG9ydC5jYworKysgYi9jb2JhbHQvd2ViL21lc3NhZ2VfcG9ydC5jYwpAQCAtNjYsMTIgKzY2LDEyIEBACiB9CiAKIHZvaWQgTWVzc2FnZVBvcnQ6OlBvc3RNZXNzYWdlKGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXImIG1lc3NhZ2UpIHsKLSAgUG9zdE1lc3NhZ2VTZXJpYWxpemVkKHN0ZDo6bW92ZShzY3JpcHQ6OlNlcmlhbGl6ZVNjcmlwdFZhbHVlKG1lc3NhZ2UpKSk7CisgIFBvc3RNZXNzYWdlU2VyaWFsaXplZChzdGQ6Om1ha2VfdW5pcXVlPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPihtZXNzYWdlKSk7CiB9CiAKIHZvaWQgTWVzc2FnZVBvcnQ6OlBvc3RNZXNzYWdlU2VyaWFsaXplZCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBkYXRhX2J1ZmZlcikgewotICBpZiAoIWV2ZW50X3RhcmdldF8gfHwgIWRhdGFfYnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPiBzdHJ1Y3R1cmVkX2Nsb25lKSB7CisgIGlmICghZXZlbnRfdGFyZ2V0XyB8fCAhc3RydWN0dXJlZF9jbG9uZSkgewogICAgIHJldHVybjsKICAgfQogICAvLyBUT0RPOiBGb3J3YXJkIHRoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2F0aW5nIEFQSSBjYWxsIHRvIHRoZSBQb3N0VGFzayBjYWxsLgpAQCAtODUsMTMgKzg1LDEzIEBACiAgIC8vIFRPRE86IFJlbW92ZSBkZXBlbmRlbmN5IG9mIE1lc3NhZ2VFdmVudCBvbiBuZXQgaW9idWZmZXIgKGIvMjI3NjY1ODQ3KQogICBtZXNzYWdlX2xvb3AtPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmTWVzc2FnZVBvcnQ6OkRpc3BhdGNoTWVzc2FnZSwgQXNXZWFrUHRyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShkYXRhX2J1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHN0cnVjdHVyZWRfY2xvbmUpKSk7CiB9CiAKIHZvaWQgTWVzc2FnZVBvcnQ6OkRpc3BhdGNoTWVzc2FnZSgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBkYXRhX2J1ZmZlcikgewotICBldmVudF90YXJnZXRfLT5EaXNwYXRjaEV2ZW50KAotICAgICAgbmV3IHdlYjo6TWVzc2FnZUV2ZW50KGJhc2U6OlRva2Vuczo6bWVzc2FnZSgpLCBzdGQ6Om1vdmUoZGF0YV9idWZmZXIpKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPiBzdHJ1Y3R1cmVkX2Nsb25lKSB7CisgIGV2ZW50X3RhcmdldF8tPkRpc3BhdGNoRXZlbnQobmV3IHdlYjo6TWVzc2FnZUV2ZW50KAorICAgICAgYmFzZTo6VG9rZW5zOjptZXNzYWdlKCksIHN0ZDo6bW92ZShzdHJ1Y3R1cmVkX2Nsb25lKSkpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugd2ViCmRpZmYgLS1naXQgYS9jb2JhbHQvd2ViL21lc3NhZ2VfcG9ydC5oIGIvY29iYWx0L3dlYi9tZXNzYWdlX3BvcnQuaAppbmRleCA2OGFlMDFlLi5jZWU1MTA5IDEwMDY0NAotLS0gYS9jb2JhbHQvd2ViL21lc3NhZ2VfcG9ydC5oCisrKyBiL2NvYmFsdC93ZWIvbWVzc2FnZV9wb3J0LmgKQEAgLTUzLDcgKzUzLDggQEAKICAgLy8gLT4gdm9pZCBQb3N0TWVzc2FnZShjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyJiBtZXNzYWdlLAogICAvLyAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6U2VxdWVuY2U8c2NyaXB0OjpWYWx1ZUhhbmRsZSo+IHRyYW5zZmVyKSB7fQogICB2b2lkIFBvc3RNZXNzYWdlKGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXImIG1lc3NhZ2UpOwotICB2b2lkIFBvc3RNZXNzYWdlU2VyaWFsaXplZChzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBkYXRhX2J1ZmZlcik7CisgIHZvaWQgUG9zdE1lc3NhZ2VTZXJpYWxpemVkKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPiBzdHJ1Y3R1cmVkX2Nsb25lKTsKIAogICB2b2lkIFN0YXJ0KCkge30KICAgdm9pZCBDbG9zZSgpOwpAQCAtOTUsNyArOTYsOCBAQAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVzc2FnZVBvcnQpOwogCiAgcHJpdmF0ZToKLSAgdm9pZCBEaXNwYXRjaE1lc3NhZ2Uoc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6RGF0YUJ1ZmZlcj4gZGF0YV9idWZmZXIpOworICB2b2lkIERpc3BhdGNoTWVzc2FnZSgKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4gc3RydWN0dXJlZF9jbG9uZSk7CiAKICAgLy8gVGhlIGV2ZW50IHRhcmdldCB0byBkaXNwYXRjaCBldmVudHMgdG8uCiAgIHdlYjo6RXZlbnRUYXJnZXQqIGV2ZW50X3RhcmdldF8gPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi9uYXZpZ2F0b3JfdWFfZGF0YS5jYyBiL2NvYmFsdC93ZWIvbmF2aWdhdG9yX3VhX2RhdGEuY2MKaW5kZXggNGNhOTczYy4uN2M0ZDI1OCAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi9uYXZpZ2F0b3JfdWFfZGF0YS5jYworKysgYi9jb2JhbHQvd2ViL25hdmlnYXRvcl91YV9kYXRhLmNjCkBAIC02MCw5ICs2MCwxMCBAQAogICAgICAgcGxhdGZvcm1faW5mby0+ZXZlcmdyZWVuX2ZpbGVfdHlwZSgpKTsKICAgYWxsX2hpZ2hfZW50cm9weV92YWx1ZXNfLnNldF9ldmVyZ3JlZW5fdmVyc2lvbigKICAgICAgIHBsYXRmb3JtX2luZm8tPmV2ZXJncmVlbl92ZXJzaW9uKCkpOwotICBhbGxfaGlnaF9lbnRyb3B5X3ZhbHVlc18uc2V0X2Zpcm13YXJlX3ZlcnNpb25fZGV0YWlscygKLSAgICAgIHBsYXRmb3JtX2luZm8tPmZpcm13YXJlX3ZlcnNpb25fZGV0YWlscygpKTsKLSAgYWxsX2hpZ2hfZW50cm9weV92YWx1ZXNfLnNldF9vc19leHBlcmllbmNlKHBsYXRmb3JtX2luZm8tPm9zX2V4cGVyaWVuY2UoKSk7CisgIGFsbF9oaWdoX2VudHJvcHlfdmFsdWVzXy5zZXRfYW5kcm9pZF9idWlsZF9maW5nZXJwcmludCgKKyAgICAgIHBsYXRmb3JtX2luZm8tPmFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoKSk7CisgIGFsbF9oaWdoX2VudHJvcHlfdmFsdWVzXy5zZXRfYW5kcm9pZF9vc19leHBlcmllbmNlKAorICAgICAgcGxhdGZvcm1faW5mby0+YW5kcm9pZF9vc19leHBlcmllbmNlKCkpOwogICBhbGxfaGlnaF9lbnRyb3B5X3ZhbHVlc18uc2V0X3N0YXJib2FyZF92ZXJzaW9uKAogICAgICAgcGxhdGZvcm1faW5mby0+c3RhcmJvYXJkX3ZlcnNpb24oKSk7CiAgIGFsbF9oaWdoX2VudHJvcHlfdmFsdWVzXy5zZXRfb3JpZ2luYWxfZGVzaWduX21hbnVmYWN0dXJlcigKZGlmZiAtLWdpdCBhL2NvYmFsdC93ZWIvdGVzdGluZy9tb2NrX3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5oIGIvY29iYWx0L3dlYi90ZXN0aW5nL21vY2tfdXNlcl9hZ2VudF9wbGF0Zm9ybV9pbmZvLmgKaW5kZXggMWVmNDMwMS4uZmNhNjkyZiAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi90ZXN0aW5nL21vY2tfdXNlcl9hZ2VudF9wbGF0Zm9ybV9pbmZvLmgKKysrIGIvY29iYWx0L3dlYi90ZXN0aW5nL21vY2tfdXNlcl9hZ2VudF9wbGF0Zm9ybV9pbmZvLmgKQEAgLTc1LDEwICs3NSwxMiBAQAogICBjb25zdCBzdGQ6OnN0cmluZyYgZXZlcmdyZWVuX3ZlcnNpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGVtcHR5X3N0cmluZ187CiAgIH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpcm13YXJlX3ZlcnNpb25fZGV0YWlscygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGVtcHR5X3N0cmluZ187CiAgIH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX2V4cGVyaWVuY2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBlbXB0eV9zdHJpbmdfOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbmRyb2lkX29zX2V4cGVyaWVuY2UoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGVtcHR5X3N0cmluZ187CisgIH0KICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvYmFsdF92ZXJzaW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZW1wdHlfc3RyaW5nXzsgfQogICBjb25zdCBzdGQ6OnN0cmluZyYgY29iYWx0X2J1aWxkX3ZlcnNpb25fbnVtYmVyKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBlbXB0eV9zdHJpbmdfOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dlYi90ZXN0aW5nL3N0dWJfd2ViX2NvbnRleHQuaCBiL2NvYmFsdC93ZWIvdGVzdGluZy9zdHViX3dlYl9jb250ZXh0LmgKaW5kZXggODcyNjhmMC4uNDg3MTAxYiAxMDA2NDQKLS0tIGEvY29iYWx0L3dlYi90ZXN0aW5nL3N0dWJfd2ViX2NvbnRleHQuaAorKysgYi9jb2JhbHQvd2ViL3Rlc3Rpbmcvc3R1Yl93ZWJfY29udGV4dC5oCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICByZXR1cm4gbmV0d29ya19tb2R1bGVfLmdldCgpOwogICB9CiAKLSAgd29ya2VyOjpTZXJ2aWNlV29ya2VySm9icyogc2VydmljZV93b3JrZXJfam9icygpIGNvbnN0IGZpbmFsIHsKKyAgd29ya2VyOjpTZXJ2aWNlV29ya2VyQ29udGV4dCogc2VydmljZV93b3JrZXJfY29udGV4dCgpIGNvbnN0IGZpbmFsIHsKICAgICBOT1RSRUFDSEVEKCk7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KZGlmZiAtLWdpdCBhL2NvYmFsdC93ZWIvdXNlcl9hZ2VudF9wbGF0Zm9ybV9pbmZvLmggYi9jb2JhbHQvd2ViL3VzZXJfYWdlbnRfcGxhdGZvcm1faW5mby5oCmluZGV4IDZlZTZlOWMuLmQ3YjRhZDEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93ZWIvdXNlcl9hZ2VudF9wbGF0Zm9ybV9pbmZvLmgKKysrIGIvY29iYWx0L3dlYi91c2VyX2FnZW50X3BsYXRmb3JtX2luZm8uaApAQCAtNDcsOCArNDcsOCBAQAogICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVyZ3JlZW5fdHlwZSgpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZXZlcmdyZWVuX2ZpbGVfdHlwZSgpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZXZlcmdyZWVuX3ZlcnNpb24oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpcm13YXJlX3ZlcnNpb25fZGV0YWlscygpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgb3NfZXhwZXJpZW5jZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9idWlsZF9maW5nZXJwcmludCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9vc19leHBlcmllbmNlKCkgY29uc3QgPSAwOwogCiAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvYmFsdF92ZXJzaW9uKCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2JhbHRfYnVpbGRfdmVyc2lvbl9udW1iZXIoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbF90ZXN0LmNjIGIvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2ltcGxfdGVzdC5jYwppbmRleCBhNzUwNDM2Li4xMzgwZjhkIDEwMDY0NAotLS0gYS9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaW1wbF90ZXN0LmNjCisrKyBiL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF9pbXBsX3Rlc3QuY2MKQEAgLTExMyw3ICsxMTMsNyBAQAogICBTdHJpY3RNb2NrPE1vY2tFeGNlcHRpb25TdGF0ZT4gZXhjZXB0aW9uX3N0YXRlXzsKIH07CiAKLVRFU1RfRihXZWJTb2NrZXRJbXBsVGVzdCwgTm9ybWFsU2l6ZVJlcXVlc3QpIHsKK1RFU1RfRihXZWJTb2NrZXRJbXBsVGVzdCwgRElTQUJMRURfTm9ybWFsU2l6ZVJlcXVlc3QpIHsKICAgLy8gTm9ybWFsbHkgdGhlIGhpZ2ggd2F0ZXJtYXJrIHF1b3RhIGlzIGdpdmVuIGF0IHdlYnNvY2tldCBjb25uZWN0aW9uIHN1Y2Nlc3MuCiAgIEFkZFF1b3RhKGtEZWZhdWx0U2VuZFF1b3RhSGlnaFdhdGVyTWFyayk7CiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogICB3ZWJzb2NrZXRfaW1wbF8tPlNlbmRUZXh0KGRhdGEsIGs4MDBLQiwgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKIH0KIAotVEVTVF9GKFdlYlNvY2tldEltcGxUZXN0LCBMYXJnZVJlcXVlc3QpIHsKK1RFU1RfRihXZWJTb2NrZXRJbXBsVGVzdCwgRElTQUJMRURfTGFyZ2VSZXF1ZXN0KSB7CiAgIEFkZFF1b3RhKGtEZWZhdWx0U2VuZFF1b3RhSGlnaFdhdGVyTWFyayk7CiAKICAgLy8gbW9ja19jaGFubmVsXyBpcyBjcmVhdGVkIGFuZCB1c2VkIG9uIG5ldHdvcmsgdGhyZWFkLgpAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcmVkX2Ftb3VudCwgJmVycm9yKTsKIH0KIAotVEVTVF9GKFdlYlNvY2tldEltcGxUZXN0LCBPdmVyTGltaXRSZXF1ZXN0KSB7CitURVNUX0YoV2ViU29ja2V0SW1wbFRlc3QsIERJU0FCTEVEX092ZXJMaW1pdFJlcXVlc3QpIHsKICAgQWRkUXVvdGEoa0RlZmF1bHRTZW5kUXVvdGFIaWdoV2F0ZXJNYXJrKTsKIAogICAvLyBtb2NrX2NoYW5uZWxfIGlzIGNyZWF0ZWQgYW5kIHVzZWQgb24gbmV0d29yayB0aHJlYWQuCkBAIC0xODgsNyArMTg4LDcgQEAKICAgQWRkUXVvdGEoa0RlZmF1bHRTZW5kUXVvdGFIaWdoV2F0ZXJNYXJrKTsKIH0KIAotVEVTVF9GKFdlYlNvY2tldEltcGxUZXN0LCBSZXVzZVNvY2tldEZvckxhcmdlUmVxdWVzdCkgeworVEVTVF9GKFdlYlNvY2tldEltcGxUZXN0LCBESVNBQkxFRF9SZXVzZVNvY2tldEZvckxhcmdlUmVxdWVzdCkgewogICBBZGRRdW90YShrRGVmYXVsdFNlbmRRdW90YUhpZ2hXYXRlck1hcmspOwogCiAgIC8vIG1vY2tfY2hhbm5lbF8gaXMgY3JlYXRlZCBhbmQgdXNlZCBvbiBuZXR3b3JrIHRocmVhZC4KZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvQlVJTEQuZ24gYi9jb2JhbHQvd29ya2VyL0JVSUxELmduCmluZGV4IDI0ZDgxNDcuLjIzYWVhYTEgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93b3JrZXIvQlVJTEQuZ24KKysrIGIvY29iYWx0L3dvcmtlci9CVUlMRC5nbgpAQCAtNDAsNiArNDAsOCBAQAogICAgICJzZXJ2aWNlX3dvcmtlcl9jb25zdHMuaCIsCiAgICAgInNlcnZpY2Vfd29ya2VyX2NvbnRhaW5lci5jYyIsCiAgICAgInNlcnZpY2Vfd29ya2VyX2NvbnRhaW5lci5oIiwKKyAgICAic2VydmljZV93b3JrZXJfY29udGV4dC5jYyIsCisgICAgInNlcnZpY2Vfd29ya2VyX2NvbnRleHQuaCIsCiAgICAgInNlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5jYyIsCiAgICAgInNlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5oIiwKICAgICAic2VydmljZV93b3JrZXJfam9icy5jYyIsCmRpZmYgLS1naXQgYS9jb2JhbHQvd29ya2VyL2NsaWVudHMuY2MgYi9jb2JhbHQvd29ya2VyL2NsaWVudHMuY2MKaW5kZXggYzc4ZTEyYS4uYzMyOTY2ZCAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9jbGllbnRzLmNjCisrKyBiL2NvYmFsdC93b3JrZXIvY2xpZW50cy5jYwpAQCAtMzMsOCArMzMsOCBAQAogI2luY2x1ZGUgImNvYmFsdC93ZWIvZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWIvZW52aXJvbm1lbnRfc2V0dGluZ3MuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL2NsaWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfZ2xvYmFsX3Njb3BlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9vYmplY3QuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC03MiwxMiArNzIsMTMgQEAKICAgICAgICAgICBzZXR0aW5nc18tPmNvbnRleHQoKS0+R2V0V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSgpLCBwcm9taXNlKSk7CiAKICAgLy8gMi4gUnVuIHRoZXNlIHN1YnN0ZXBzIGluIHBhcmFsbGVsOgotICBTZXJ2aWNlV29ya2VySm9icyogam9icyA9IHNldHRpbmdzXy0+Y29udGV4dCgpLT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCk7Ci0gIERDSEVDSyhqb2JzKTsKLSAgam9icy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICBTZXJ2aWNlV29ya2VyQ29udGV4dCogY29udGV4dCA9CisgICAgICBzZXR0aW5nc18tPmNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOworICBEQ0hFQ0soY29udGV4dCk7CisgIGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c0dldFN1YlN0ZXBzLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChqb2JzKSwKKyAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6Q2xpZW50c0dldFN1YlN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2V0dGluZ3NfLT5jb250ZXh0KCkpLAogICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChHZXRBc3NvY2lhdGVkU2VydmljZVdvcmtlcihzZXR0aW5nc18pKSwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIGlkKSk7CkBAIC0xMDEsMTIgKzEwMiwxMyBAQAogICAgICAgcHJvbWlzZV9yZWZlcmVuY2UobmV3IHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZSgKICAgICAgICAgICBzZXR0aW5nc18tPmNvbnRleHQoKS0+R2V0V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSgpLCBwcm9taXNlKSk7CiAgIC8vIDIuIFJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIGluIHBhcmFsbGVsOgotICBTZXJ2aWNlV29ya2VySm9icyogam9icyA9IHNldHRpbmdzXy0+Y29udGV4dCgpLT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCk7Ci0gIERDSEVDSyhqb2JzKTsKLSAgam9icy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICBTZXJ2aWNlV29ya2VyQ29udGV4dCogY29udGV4dCA9CisgICAgICBzZXR0aW5nc18tPmNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOworICBEQ0hFQ0soY29udGV4dCk7CisgIGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c01hdGNoQWxsU3ViU3RlcHMsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGpvYnMpLAorICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250ZXh0OjpDbGllbnRzTWF0Y2hBbGxTdWJTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHNldHRpbmdzXy0+Y29udGV4dCgpKSwKICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoR2V0QXNzb2NpYXRlZFNlcnZpY2VXb3JrZXIoc2V0dGluZ3NfKSksCiAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpLApAQCAtMTU2LDExICsxNTgsMTMgQEAKICAgICAgICAgIHNlcnZpY2Vfd29ya2VyLT5zdGF0ZSgpID09IGtTZXJ2aWNlV29ya2VyU3RhdGVBY3RpdmF0aW5nKTsKIAogICAvLyAzLiBSdW4gdGhlIGZvbGxvd2luZyBzdWJzdGVwcyBpbiBwYXJhbGxlbDoKLSAgU2VydmljZVdvcmtlckpvYnMqIGpvYnMgPSBzZXR0aW5nc18tPmNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfam9icygpOwotICBEQ0hFQ0soam9icyk7Ci0gIGpvYnMtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKKyAgU2VydmljZVdvcmtlckNvbnRleHQqIGNvbnRleHQgPQorICAgICAgc2V0dGluZ3NfLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKTsKKyAgRENIRUNLKGNvbnRleHQpOworICBjb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckpvYnM6OkNsYWltU3ViU3RlcHMsIGJhc2U6OlVucmV0YWluZWQoam9icyksCisgICAgICBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckNvbnRleHQ6OkNsYWltU3ViU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzZXR0aW5nc18tPmNvbnRleHQoKSksCiAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKEdldEFzc29jaWF0ZWRTZXJ2aWNlV29ya2VyKHNldHRpbmdzXykpLAogICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb21pc2VfcmVmZXJlbmNlKSkpOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9kZWRpY2F0ZWRfd29ya2VyLmNjIGIvY29iYWx0L3dvcmtlci9kZWRpY2F0ZWRfd29ya2VyLmNjCmluZGV4IDYyNGRiZWMuLjQ4OWE5ODcgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93b3JrZXIvZGVkaWNhdGVkX3dvcmtlci5jYworKysgYi9jb2JhbHQvd29ya2VyL2RlZGljYXRlZF93b3JrZXIuY2MKQEAgLTk3LDggKzk3LDggQEAKICAgb3B0aW9ucy5vdXRzaWRlX2V2ZW50X3RhcmdldCA9IHRoaXM7CiAgIG9wdGlvbnMub3V0c2lkZV9wb3J0ID0gb3V0c2lkZV9wb3J0Xy5nZXQoKTsKICAgb3B0aW9ucy5vcHRpb25zID0gd29ya2VyX29wdGlvbnNfOwotICBvcHRpb25zLndlYl9vcHRpb25zLnNlcnZpY2Vfd29ya2VyX2pvYnMgPQotICAgICAgb3B0aW9ucy5vdXRzaWRlX2NvbnRleHQtPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKKyAgb3B0aW9ucy53ZWJfb3B0aW9ucy5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0ID0KKyAgICAgIG9wdGlvbnMub3V0c2lkZV9jb250ZXh0LT5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0KCk7CiAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IHNvdXJjZSBsb2NhdGlvbiBhcyB0aGUgY29uc3RydWN0aW9uIGxvY2F0aW9uLCB0byBiZSB1c2VkCiAgIC8vIGluIHRoZSBlcnJvciBldmVudCBpZiB3b3JrZXIgbG9hZGluZyBvZiBpbml0aWFsaXphdGlvbiBmYWlscy4KICAgYXV0byBzdGFja190cmFjZSA9CmRpZmYgLS1naXQgYS9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfZXZlbnQuY2MgYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfZXZlbnQuY2MKaW5kZXggODdkNDhjYi4uNWIyODVkYyAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX2V2ZW50LmNjCisrKyBiL2NvYmFsdC93b3JrZXIvZXh0ZW5kYWJsZV9ldmVudC5jYwpAQCAtNzIsMTQgKzcyLDE1IEBACiAgICAgd2ViOjpDb250ZXh0KiBjb250ZXh0ID0KICAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8d2ViOjpFbnZpcm9ubWVudFNldHRpbmdzKj4oc2V0dGluZ3MpCiAgICAgICAgICAgICAtPmNvbnRleHQoKTsKLSAgICBTZXJ2aWNlV29ya2VySm9icyogam9icyA9IGNvbnRleHQtPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKLSAgICBEQ0hFQ0soam9icyk7CisgICAgU2VydmljZVdvcmtlckNvbnRleHQqIHdvcmtlcl9jb250ZXh0ID0gY29udGV4dC0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOworICAgIERDSEVDSyh3b3JrZXJfY29udGV4dCk7CiAgICAgLy8gNS4yLjEuIExldCByZWdpc3RyYXRpb24gYmUgdGhlIGN1cnJlbnQgZ2xvYmFsIG9iamVjdCdzIGFzc29jaWF0ZWQKICAgICAvLyAgICAgICAgc2VydmljZSB3b3JrZXIncyBjb250YWluaW5nIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbi4KLSAgICBqb2JzLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgd29ya2VyX2NvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKICAgICAgICAgRlJPTV9IRVJFLAogICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICZTZXJ2aWNlV29ya2VySm9iczo6V2FpdFVudGlsU3ViU3RlcHMsIGJhc2U6OlVucmV0YWluZWQoam9icyksCisgICAgICAgICAgICAmU2VydmljZVdvcmtlckNvbnRleHQ6OldhaXRVbnRpbFN1YlN0ZXBzLAorICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3b3JrZXJfY29udGV4dCksCiAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGNvbnRleHQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5Bc1NlcnZpY2VXb3JrZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcl9vYmplY3QoKQpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX2V2ZW50LmggYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfZXZlbnQuaAppbmRleCBmYmQ4MTM2Li41ODY0ZWIwIDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfZXZlbnQuaAorKysgYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfZXZlbnQuaApAQCAtMzUsOCArMzUsOCBAQAogI2luY2x1ZGUgImNvYmFsdC93ZWIvZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL3dpbmRvd19vcl93b3JrZXJfZ2xvYmFsX3Njb3BlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX2V2ZW50X2luaXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5oIgotI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fb2JqZWN0LmgiCiAjaW5jbHVkZSAidjgvaW5jbHVkZS92OC5oIgpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnQuY2MgYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfbWVzc2FnZV9ldmVudC5jYwppbmRleCAzMGEyNTNjLi4wMGQwNDM3IDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfbWVzc2FnZV9ldmVudC5jYworKysgYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfbWVzc2FnZV9ldmVudC5jYwpAQCAtMzIsOCArMzIsOCBAQAogICAgIGNvbnN0IEV4dGVuZGFibGVNZXNzYWdlRXZlbnRJbml0JiBpbml0X2RpY3QpCiAgICAgOiBFeHRlbmRhYmxlRXZlbnQoc2V0dGluZ3MsIHR5cGUsIGluaXRfZGljdCkgewogICBpZiAoaW5pdF9kaWN0Lmhhc19kYXRhKCkgJiYgaW5pdF9kaWN0LmRhdGEoKSkgewotICAgIERDSEVDSyhpbml0X2RpY3QuZGF0YSgpKTsKLSAgICBkYXRhXyA9IHNjcmlwdDo6U2VyaWFsaXplU2NyaXB0VmFsdWUoKihpbml0X2RpY3QuZGF0YSgpKSk7CisgICAgc3RydWN0dXJlZF9jbG9uZV8gPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPigqKGluaXRfZGljdC5kYXRhKCkpKTsKICAgfQogICBpZiAoaW5pdF9kaWN0Lmhhc19vcmlnaW4oKSkgewogICAgIG9yaWdpbl8gPSBpbml0X2RpY3Qub3JpZ2luKCk7CkBAIC01MCwxOSArNTAsMTMgQEAKIH0KIAogc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4gRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDo6ZGF0YSgKLSAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzKSBjb25zdCB7Ci0gIGlmICghc2V0dGluZ3MpIHJldHVybiBzY3JpcHQ6OkhhbmRsZTxzY3JpcHQ6OlZhbHVlSGFuZGxlPigpOwotICBzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8d2ViOjpFbnZpcm9ubWVudFNldHRpbmdzKj4oc2V0dGluZ3MpCi0gICAgICAgICAgLT5jb250ZXh0KCkKLSAgICAgICAgICAtPmdsb2JhbF9lbnZpcm9ubWVudCgpOwotICBEQ0hFQ0soZ2xvYmFsX2Vudmlyb25tZW50KTsKLSAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBnbG9iYWxfZW52aXJvbm1lbnQtPmlzb2xhdGUoKTsKKyAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzKSB7CisgIGlmICghc3RydWN0dXJlZF9jbG9uZV8pIHsKKyAgICByZXR1cm4gc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4oKTsKKyAgfQorICBhdXRvKiBpc29sYXRlID0gd2ViOjpnZXRfaXNvbGF0ZShzZXR0aW5ncyk7CiAgIHNjcmlwdDo6djhjOjpFbnRyeVNjb3BlIGVudHJ5X3Njb3BlKGlzb2xhdGUpOwotICBEQ0hFQ0soaXNvbGF0ZSk7Ci0gIGlmICghZGF0YV8pIHJldHVybiBzY3JpcHQ6OkhhbmRsZTxzY3JpcHQ6OlZhbHVlSGFuZGxlPigpOwotICByZXR1cm4gc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4oCi0gICAgICBzdGQ6Om1vdmUoc2NyaXB0OjpEZXNlcmlhbGl6ZVNjcmlwdFZhbHVlKGlzb2xhdGUsICpkYXRhXykpKTsKKyAgcmV0dXJuIHN0cnVjdHVyZWRfY2xvbmVfLT5EZXNlcmlhbGl6ZShpc29sYXRlKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHdvcmtlcgpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnQuaCBiL2NvYmFsdC93b3JrZXIvZXh0ZW5kYWJsZV9tZXNzYWdlX2V2ZW50LmgKaW5kZXggYzliMmZlYS4uNTgzOGU0YyAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnQuaAorKysgYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfbWVzc2FnZV9ldmVudC5oCkBAIC01NiwxNiArNTYsMTYgQEAKICAgRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRva2VuIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudEluaXQmIGluaXRfZGljdCk7Ci0gIEV4dGVuZGFibGVNZXNzYWdlRXZlbnQoc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUb2tlbiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuZGFibGVNZXNzYWdlRXZlbnRJbml0JiBpbml0X2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6RGF0YUJ1ZmZlcj4gZGF0YSkKKyAgRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudCgKKyAgICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MsIGJhc2U6OlRva2VuIHR5cGUsCisgICAgICBjb25zdCBFeHRlbmRhYmxlTWVzc2FnZUV2ZW50SW5pdCYgaW5pdF9kaWN0LAorICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6U3RydWN0dXJlZENsb25lPiBzdHJ1Y3R1cmVkX2Nsb25lKQogICAgICAgOiBFeHRlbmRhYmxlTWVzc2FnZUV2ZW50KHNldHRpbmdzLCB0eXBlLCBpbml0X2RpY3QpIHsKLSAgICBkYXRhXyA9IHN0ZDo6bW92ZShkYXRhKTsKKyAgICBzdHJ1Y3R1cmVkX2Nsb25lXyA9IHN0ZDo6bW92ZShzdHJ1Y3R1cmVkX2Nsb25lKTsKICAgfQogCiAgIHNjcmlwdDo6SGFuZGxlPHNjcmlwdDo6VmFsdWVIYW5kbGU+IGRhdGEoCi0gICAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzID0gbnVsbHB0cikgY29uc3Q7CisgICAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzID0gbnVsbHB0cik7CiAKICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG9yaWdpbl87IH0KICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhc3RfZXZlbnRfaWQoKSBjb25zdCB7IHJldHVybiBsYXN0X2V2ZW50X2lkXzsgfQpAQCAtOTIsNyArOTIsNyBAQAogICBzdGQ6OnN0cmluZyBsYXN0X2V2ZW50X2lkXzsKICAgU291cmNlVHlwZSBzb3VyY2VfOwogICBzY3JpcHQ6OlNlcXVlbmNlPHNjb3BlZF9yZWZwdHI8TWVzc2FnZVBvcnQ+PiBwb3J0c187Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OkRhdGFCdWZmZXI+IGRhdGFfOworICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpTdHJ1Y3R1cmVkQ2xvbmU+IHN0cnVjdHVyZWRfY2xvbmVfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHdvcmtlcgpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnRfdGVzdC5jYyBiL2NvYmFsdC93b3JrZXIvZXh0ZW5kYWJsZV9tZXNzYWdlX2V2ZW50X3Rlc3QuY2MKaW5kZXggNDA1OTFkZC4uNWQ0NjRjMCAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnRfdGVzdC5jYworKysgYi9jb2JhbHQvd29ya2VyL2V4dGVuZGFibGVfbWVzc2FnZV9ldmVudF90ZXN0LmNjCkBAIC03NCwxNCArNzQsMTEgQEAKIFRFU1RfRihFeHRlbmRhYmxlTWVzc2FnZUV2ZW50VGVzdFdpdGhKYXZhU2NyaXB0LCBDb25zdHJ1Y3RvcldpdGhBbnkpIHsKICAgYmFzZTo6T3B0aW9uYWw8c2NyaXB0OjpWYWx1ZUhhbmRsZUhvbGRlcjo6UmVmZXJlbmNlPiByZWZlcmVuY2U7CiAgIEV2YWx1YXRlU2NyaXB0KCInQ29uc3RydWN0b3JXaXRoQW55TWVzc2FnZURhdGEnIiwgJnJlZmVyZW5jZSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OkRhdGFCdWZmZXI+IGRhdGEoCi0gICAgICBzY3JpcHQ6OlNlcmlhbGl6ZVNjcmlwdFZhbHVlKHJlZmVyZW5jZS0+cmVmZXJlbmNlZF92YWx1ZSgpKSk7Ci0gIEVYUEVDVF9ORShudWxscHRyLCBkYXRhLmdldCgpKTsKLSAgRVhQRUNUX05FKG51bGxwdHIsIGRhdGEtPnB0cik7Ci0gIEVYUEVDVF9HVChkYXRhLT5zaXplLCAwVSk7CisgIGF1dG8qIGlzb2xhdGUgPSB3ZWI6OmdldF9pc29sYXRlKHdlYl9jb250ZXh0KCktPmVudmlyb25tZW50X3NldHRpbmdzKCkpOwogICBjb25zdCBFeHRlbmRhYmxlTWVzc2FnZUV2ZW50SW5pdCBpbml0OwogICBzY29wZWRfcmVmcHRyPEV4dGVuZGFibGVNZXNzYWdlRXZlbnQ+IGV2ZW50ID0gbmV3IEV4dGVuZGFibGVNZXNzYWdlRXZlbnQoCi0gICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLCBiYXNlOjpUb2tlbnM6Om1lc3NhZ2UoKSwgaW5pdCwgc3RkOjptb3ZlKGRhdGEpKTsKKyAgICAgIGVudmlyb25tZW50X3NldHRpbmdzKCksIGJhc2U6OlRva2Vuczo6bWVzc2FnZSgpLCBpbml0LAorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4ocmVmZXJlbmNlLT5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKIAogICBFWFBFQ1RfRVEoIm1lc3NhZ2UiLCBldmVudC0+dHlwZSgpKTsKICAgRVhQRUNUX0VRKE5VTEwsIGV2ZW50LT50YXJnZXQoKS5nZXQoKSk7CkBAIC05MywxMiArOTAsMTEgQEAKICAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5Jc0JlaW5nRGlzcGF0Y2hlZCgpKTsKICAgRVhQRUNUX0ZBTFNFKGV2ZW50LT5wcm9wYWdhdGlvbl9zdG9wcGVkKCkpOwogICBFWFBFQ1RfRkFMU0UoZXZlbnQtPmltbWVkaWF0ZV9wcm9wYWdhdGlvbl9zdG9wcGVkKCkpOworICBzY3JpcHQ6OnY4Yzo6RW50cnlTY29wZSBlbnRyeV9zY29wZShpc29sYXRlKTsKICAgc2NyaXB0OjpIYW5kbGU8c2NyaXB0OjpWYWx1ZUhhbmRsZT4gZXZlbnRfZGF0YSA9CiAgICAgICBldmVudC0+ZGF0YSh3ZWJfY29udGV4dCgpLT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKTsKICAgRVhQRUNUX0ZBTFNFKGV2ZW50X2RhdGEuSXNFbXB0eSgpKTsKICAgYXV0byBzY3JpcHRfdmFsdWUgPSBldmVudF9kYXRhLkdldFNjcmlwdFZhbHVlKCk7Ci0gIGF1dG8qIGlzb2xhdGUgPSBzY3JpcHQ6OkdldElzb2xhdGUoKnNjcmlwdF92YWx1ZSk7Ci0gIHNjcmlwdDo6djhjOjpFbnRyeVNjb3BlIGVudHJ5X3Njb3BlKGlzb2xhdGUpOwogICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2OF92YWx1ZSA9IHNjcmlwdDo6R2V0VjhWYWx1ZSgqc2NyaXB0X3ZhbHVlKTsKICAgc3RkOjpzdHJpbmcgYWN0dWFsID0KICAgICAgICoodjg6OlN0cmluZzo6VXRmOFZhbHVlKGlzb2xhdGUsIHY4X3ZhbHVlLkFzPHY4OjpTdHJpbmc+KCkpKTsKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXIuY2MgYi9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyLmNjCmluZGV4IGJjNjc2MTMuLjQ5Y2QwMDUgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXIuY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlci5jYwpAQCAtMjEsMTAgKzIxLDExIEBACiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW5zLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9lbnZpcm9ubWVudF9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdmFsdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3dlYi9lbnZpcm9ubWVudF9zZXR0aW5nc19oZWxwZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL2V2ZW50X3RhcmdldC5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWIvbWVzc2FnZV9wb3J0LmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2pvYnMuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX29iamVjdC5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfc3RhdGUuaCIKIApAQCAtNDcsMjQgKzQ4LDI0IEBACiAgIC8vIDQuIExldCBzZXJpYWxpemVXaXRoVHJhbnNmZXJSZXN1bHQgYmUKICAgLy8gICAgU3RydWN0dXJlZFNlcmlhbGl6ZVdpdGhUcmFuc2ZlcihtZXNzYWdlLCBvcHRpb25zWyJ0cmFuc2ZlciJdKS4KICAgLy8gICAgUmV0aHJvdyBhbnkgZXhjZXB0aW9ucy4KLSAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6RGF0YUJ1ZmZlcj4gc2VyaWFsaXplX3Jlc3VsdCgKLSAgICAgIHNjcmlwdDo6U2VyaWFsaXplU2NyaXB0VmFsdWUobWVzc2FnZSkpOwotICBpZiAoIXNlcmlhbGl6ZV9yZXN1bHQpIHsKKyAgYXV0byBzdHJ1Y3R1cmVkX2Nsb25lID0gc3RkOjptYWtlX3VuaXF1ZTxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4obWVzc2FnZSk7CisgIGlmIChzdHJ1Y3R1cmVkX2Nsb25lLT5mYWlsZWQoKSkgewogICAgIHJldHVybjsKICAgfQogICAvLyA1LiBJZiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIFNob3VsZCBTa2lwIEV2ZW50IGFsZ29yaXRobSB3aXRoCiAgIC8vICJtZXNzYWdlIiBhbmQgc2VydmljZVdvcmtlciBpcyB0cnVlLCB0aGVuIHJldHVybi4KICAgaWYgKHNlcnZpY2Vfd29ya2VyLT5TaG91bGRTa2lwRXZlbnQoYmFzZTo6VG9rZW5zOjptZXNzYWdlKCkpKSByZXR1cm47CiAgIC8vIDYuIFJ1biB0aGVzZSBzdWJzdGVwcyBpbiBwYXJhbGxlbDoKLSAgU2VydmljZVdvcmtlckpvYnMqIGpvYnMgPQotICAgICAgaW5jdW1iZW50X3NldHRpbmdzLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKLSAgRENIRUNLKGpvYnMpOwotICBqb2JzLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgIFNlcnZpY2VXb3JrZXJDb250ZXh0KiB3b3JrZXJfY29udGV4dCA9CisgICAgICBpbmN1bWJlbnRfc2V0dGluZ3MtPmNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOworICBEQ0hFQ0sod29ya2VyX2NvbnRleHQpOworICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpTZXJ2aWNlV29ya2VyUG9zdE1lc3NhZ2VTdWJTdGVwcywKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoam9icyksIGJhc2U6OlVucmV0YWluZWQoc2VydmljZV93b3JrZXIpLAorICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250ZXh0OjpTZXJ2aWNlV29ya2VyUG9zdE1lc3NhZ2VTdWJTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod29ya2VyX2NvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzZXJ2aWNlX3dvcmtlciksCiAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGluY3VtYmVudF9zZXR0aW5ncy0+Y29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzZXJpYWxpemVfcmVzdWx0KSkpOworICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHN0cnVjdHVyZWRfY2xvbmUpKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB3b3JrZXIKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfY29udGFpbmVyLmNjIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250YWluZXIuY2MKaW5kZXggYjM5MmY1Yy4uMjY4NDgxZCAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250YWluZXIuY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250YWluZXIuY2MKQEAgLTgwLDExICs4MCwxMSBAQAogICBpZiAocmVhZHlfcHJvbWlzZS0+U3RhdGUoKSA9PSBzY3JpcHQ6OlByb21pc2VTdGF0ZTo6a1BlbmRpbmcpIHsKICAgICAvLyAgICAzLjEuIExldCBjbGllbnQgYnkgdGhpcydzIHNlcnZpY2Ugd29ya2VyIGNsaWVudC4KICAgICB3ZWI6OkNvbnRleHQqIGNsaWVudCA9IGVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKTsKLSAgICB3b3JrZXI6OlNlcnZpY2VXb3JrZXJKb2JzKiBqb2JzID0gY2xpZW50LT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCk7Ci0gICAgam9icy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgIFNlcnZpY2VXb3JrZXJDb250ZXh0KiB3b3JrZXJfY29udGV4dCA9IGNsaWVudC0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOworICAgIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpNYXliZVJlc29sdmVSZWFkeVByb21pc2VTdWJTdGVwcywKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChqb2JzKSwgY2xpZW50KSk7CisgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6TWF5YmVSZXNvbHZlUmVhZHlQcm9taXNlU3ViU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod29ya2VyX2NvbnRleHQpLCBjbGllbnQpKTsKICAgfQogICAvLyA0LiBSZXR1cm4gcmVhZHlQcm9taXNlLgogICByZXR1cm4gcmVhZHlfcHJvbWlzZTsKQEAgLTE1NSwxMCArMTU1LDEwIEBACiAgIC8vICAgIGNyZWF0aW9uIFVSTCwgb3B0aW9uc1sidHlwZSJdLCBhbmQgb3B0aW9uc1sidXBkYXRlVmlhQ2FjaGUiXS4KICAgYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCktPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpTdGFydFJlZ2lzdGVyLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjbGllbnQtPnNlcnZpY2Vfd29ya2VyX2pvYnMoKSksIHNjb3BlX3VybCwKLSAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF91cmwsIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSgpLCBvcHRpb25zLnVwZGF0ZV92aWFfY2FjaGUoKSkpOworICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250ZXh0OjpTdGFydFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjbGllbnQtPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICBzY29wZV91cmwsIHNjcmlwdF91cmwsIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksCisgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIG9wdGlvbnMudHlwZSgpLCBvcHRpb25zLnVwZGF0ZV92aWFfY2FjaGUoKSkpOwogICAvLyA3LiBSZXR1cm4gcC4KICAgcmV0dXJuIHByb21pc2U7CiB9CkBAIC0yMzcsMTIgKzIzNywxMyBAQAogCiAgIC8vIDcuIExldCBwcm9taXNlIGJlIGEgbmV3IHByb21pc2UuCiAgIC8vIDguIFJ1biB0aGUgZm9sbG93aW5nIHN1YnN0ZXBzIGluIHBhcmFsbGVsOgotICB3b3JrZXI6OlNlcnZpY2VXb3JrZXJKb2JzKiBqb2JzID0gY2xpZW50LT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCk7Ci0gIERDSEVDSyhqb2JzKTsKLSAgam9icy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckpvYnM6OkdldFJlZ2lzdHJhdGlvblN1YlN0ZXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGpvYnMpLCBzdG9yYWdlX2tleSwgY2xpZW50X3VybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpKSk7CisgIFNlcnZpY2VXb3JrZXJDb250ZXh0KiB3b3JrZXJfY29udGV4dCA9IGNsaWVudC0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOworICBEQ0hFQ0sod29ya2VyX2NvbnRleHQpOworICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250ZXh0OjpHZXRSZWdpc3RyYXRpb25TdWJTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod29ya2VyX2NvbnRleHQpLCBzdG9yYWdlX2tleSwgY2xpZW50X3VybCwKKyAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgc3RkOjptb3ZlKHByb21pc2VfcmVmZXJlbmNlKSkpOwogfQogCiBzY3JpcHQ6OkhhbmRsZVByb21pc2VTZXF1ZW5jZVdyYXBwYWJsZQpAQCAtMjY4LDEzICsyNjksMTMgQEAKICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKICAgYXV0byogY2xpZW50ID0gZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y29udGV4dCgpOwogICAvLyBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jbmF2aWdhdG9yLXNlcnZpY2Utd29ya2VyLWdldFJlZ2lzdHJhdGlvbnMKLSAgd29ya2VyOjpTZXJ2aWNlV29ya2VySm9icyogam9icyA9Ci0gICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKKyAgU2VydmljZVdvcmtlckNvbnRleHQqIHdvcmtlcl9jb250ZXh0ID0KKyAgICAgIGVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfY29udGV4dCgpOwogICB1cmw6Ok9yaWdpbiBzdG9yYWdlX2tleSA9IGVudmlyb25tZW50X3NldHRpbmdzKCktPk9idGFpblN0b3JhZ2VLZXkoKTsKLSAgam9icy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckpvYnM6OkdldFJlZ2lzdHJhdGlvbnNTdWJTdGVwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChqb2JzKSwgc3RvcmFnZV9rZXksIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb21pc2VfcmVmZXJlbmNlKSkpOworICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckNvbnRleHQ6OkdldFJlZ2lzdHJhdGlvbnNTdWJTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3b3JrZXJfY29udGV4dCksIHN0b3JhZ2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpKTsKIH0KIAogdm9pZCBTZXJ2aWNlV29ya2VyQ29udGFpbmVyOjpTdGFydE1lc3NhZ2VzKCkge30KZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfY29udGFpbmVyLmggYi9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRhaW5lci5oCmluZGV4IDk0Njc5ZDYuLjNmYzUyYWIgMTAwNjQ0Ci0tLSBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfY29udGFpbmVyLmgKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250YWluZXIuaApAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgImNvYmFsdC93ZWIvZXZlbnRfdGFyZ2V0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYi9ldmVudF90YXJnZXRfbGlzdGVuZXJfaW5mby5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvcmVnaXN0cmF0aW9uX29wdGlvbnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2pvYnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbi5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfY29udGV4dC5jYyBiL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfY29udGV4dC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGM5YTRlCi0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmNjCkBAIC0wLDAgKzEsMTcxNiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmgiCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AvbWVzc2FnZV9sb29wX2N1cnJlbnQuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgorI2luY2x1ZGUgImJhc2UvdHJhY2VfZXZlbnQvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvd2ViL2RvbV9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvd2ViL2Vudmlyb25tZW50X3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRhaW5lci5oIgorI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5oIgorI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvd2luZG93X2NsaWVudC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSB3b3JrZXIgeworCituYW1lc3BhY2UgeworCitjb25zdCBiYXNlOjpUaW1lRGVsdGEga1dhaXRGb3JBc3luY2hyb25vdXNFeHRlbnNpb25zVGltZW91dCA9CisgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygzKTsKKworY29uc3QgYmFzZTo6VGltZURlbHRhIGtTaHV0ZG93bldhaXRUaW1lb3V0U2VjcyA9CisgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyg1KTsKKworYm9vbCBQYXRoQ29udGFpbnNFc2NhcGVkU2xhc2goY29uc3QgR1VSTCYgdXJsKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSB1cmwucGF0aCgpOworICByZXR1cm4gKHBhdGguZmluZCgiJTJmIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKKyAgICAgICAgICBwYXRoLmZpbmQoIiUyRiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zIHx8CisgICAgICAgICAgcGF0aC5maW5kKCIlNWMiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fAorICAgICAgICAgIHBhdGguZmluZCgiJTVDIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworfQorCit2b2lkIFJlc29sdmVHZXRDbGllbnRQcm9taXNlKAorICAgIHdlYjo6Q29udGV4dCogY2xpZW50LCB3ZWI6OkNvbnRleHQqIHdvcmtlcl9jb250ZXh0LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlJlc29sdmVHZXRDbGllbnRQcm9taXNlKCkiKTsKKyAgLy8gQWxnb3JpdGhtIGZvciBSZXNvbHZlIEdldCBDbGllbnQgUHJvbWlzZToKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNyZXNvbHZlLWdldC1jbGllbnQtcHJvbWlzZQorCisgIC8vIDEuIElmIGNsaWVudCBpcyBhbiBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3QsIHRoZW46CisgIC8vIDEuMS4gSWYgY2xpZW50IGlzIG5vdCBhIHNlY3VyZSBjb250ZXh0LCBxdWV1ZSBhIHRhc2sgdG8gcmVqZWN0IHByb21pc2Ugd2l0aAorICAvLyAgICAgIGEgIlNlY3VyaXR5RXJyb3IiIERPTUV4Y2VwdGlvbiwgb24gcHJvbWlzZeKAmXMgcmVsZXZhbnQgc2V0dGluZ3MKKyAgLy8gICAgICBvYmplY3QncyByZXNwb25zaWJsZSBldmVudCBsb29wIHVzaW5nIHRoZSBET00gbWFuaXB1bGF0aW9uIHRhc2sKKyAgLy8gICAgICBzb3VyY2UsIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgLy8gMi4gRWxzZToKKyAgLy8gMi4xLiBJZiBjbGllbnTigJlzIGNyZWF0aW9uIFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIHF1ZXVlCisgIC8vICAgICAgYSB0YXNrIHRvIHJlamVjdCBwcm9taXNlIHdpdGggYSAiU2VjdXJpdHlFcnJvciIgRE9NRXhjZXB0aW9uLCBvbgorICAvLyAgICAgIHByb21pc2XigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdCdzIHJlc3BvbnNpYmxlIGV2ZW50IGxvb3AgdXNpbmcgdGhlCisgIC8vICAgICAgRE9NIG1hbmlwdWxhdGlvbiB0YXNrIHNvdXJjZSwgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgorICAvLyBJbiBwcm9kdWN0aW9uLCBDb2JhbHQgcmVxdWlyZXMgaHR0cHMsIHRoZXJlZm9yZSBhbGwgY2xpZW50cyBhcmUgc2VjdXJlCisgIC8vIGNvbnRleHRzLgorCisgIC8vIDMuIElmIGNsaWVudCBpcyBhbiBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3QgYW5kIGlzIG5vdCBhIHdpbmRvdyBjbGllbnQsCisgIC8vICAgIHRoZW46CisgIGlmICghY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCktPklzV2luZG93KCkpIHsKKyAgICAvLyAzLjEuIExldCBjbGllbnRPYmplY3QgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIENyZWF0ZSBDbGllbnQgYWxnb3JpdGhtCisgICAgLy8gICAgICB3aXRoIGNsaWVudCBhcyB0aGUgYXJndW1lbnQuCisgICAgc2NvcGVkX3JlZnB0cjxDbGllbnQ+IGNsaWVudF9vYmplY3QgPQorICAgICAgICBDbGllbnQ6OkNyZWF0ZShjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCkpOworCisgICAgLy8gMy4yLiBRdWV1ZSBhIHRhc2sgdG8gcmVzb2x2ZSBwcm9taXNlIHdpdGggY2xpZW50T2JqZWN0LCBvbiBwcm9taXNl4oCZcworICAgIC8vICAgICAgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0J3MgcmVzcG9uc2libGUgZXZlbnQgbG9vcCB1c2luZyB0aGUgRE9NCisgICAgLy8gICAgICBtYW5pcHVsYXRpb24gdGFzayBzb3VyY2UsIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRPbmNlKAorICAgICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+CisgICAgICAgICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UsCisgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gY2xpZW50X29iamVjdCkgeworICAgICAgICAgICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvbHZlR2V0Q2xpZW50UHJvbWlzZSgpIFJlc29sdmUiKTsKKyAgICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVzb2x2ZShjbGllbnRfb2JqZWN0KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpLCBjbGllbnRfb2JqZWN0KSk7CisgICAgcmV0dXJuOworICB9CisgIC8vIDQuIEVsc2U6CisgIC8vIDQuMS4gTGV0IGJyb3dzaW5nQ29udGV4dCBiZSBudWxsLgorICAvLyA0LjIuIElmIGNsaWVudCBpcyBhbiBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3QsIHNldCBicm93c2luZ0NvbnRleHQgdG8KKyAgLy8gICAgICBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QncyBicm93c2luZyBjb250ZXh0LgorICAvLyA0LjMuIEVsc2UsIHNldCBicm93c2luZ0NvbnRleHQgdG8gY2xpZW504oCZcyB0YXJnZXQgYnJvd3NpbmcgY29udGV4dC4KKyAgLy8gTm90ZTogQ29iYWx0IGRvZXMgbm90IGltcGxlbWVudCBhIGRpc3RpbmN0aW9uIGJldHdlZW4gZW52aXJvbm1lbnRzIGFuZAorICAvLyBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3RzLgorICAvLyA0LjQuIFF1ZXVlIGEgdGFzayB0byBydW4gdGhlIGZvbGxvd2luZyBzdGVwcyBvbiBicm93c2luZ0NvbnRleHTigJlzIGV2ZW50CisgIC8vICAgICAgbG9vcCB1c2luZyB0aGUgdXNlciBpbnRlcmFjdGlvbiB0YXNrIHNvdXJjZToKKyAgLy8gTm90ZTogVGhlIHRhc2sgYmVsb3cgZG9lcyBub3QgY3VycmVudGx5IHBlcmZvcm0gYW55IGFjdHVhbAorICAvLyBmdW5jdGlvbmFsaXR5IGluIHRoZSBjbGllbnQgY29udGV4dC4gSXQgaXMgaW5jbHVkZWQgaG93ZXZlciB0byBoZWxwIGZ1dHVyZQorICAvLyBpbXBsZW1lbnRhdGlvbiBmb3IgZmV0Y2hpbmcgdmFsdWVzIGZvciBXaW5kb3dDbGllbnQgcHJvcGVydGllcywgd2l0aAorICAvLyBzaW1pbGFyIGxvZ2ljIGV4aXN0aW5nIGluIENsaWVudHNNYXRjaEFsbFN1YlN0ZXBzLgorICBjbGllbnQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmRPbmNlKAorICAgICAgICAgIFtdKHdlYjo6Q29udGV4dCogY2xpZW50LCB3ZWI6OkNvbnRleHQqIHdvcmtlcl9jb250ZXh0LAorICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSkgeworICAgICAgICAgICAgLy8gNC40LjEuIExldCBmcmFtZVR5cGUgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEdldCBGcmFtZSBUeXBlIHdpdGgKKyAgICAgICAgICAgIC8vICAgICAgICBicm93c2luZ0NvbnRleHQuCisgICAgICAgICAgICAvLyBDb2JhbHQgZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgb3IgYXV4aWxpYXJ5IGJyb3dzaW5nIGNvbnRleHRzLgorICAgICAgICAgICAgLy8gNC40LjIuIExldCB2aXNpYmlsaXR5U3RhdGUgYmUgYnJvd3NpbmdDb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQncworICAgICAgICAgICAgLy8gICAgICAgIHZpc2liaWxpdHlTdGF0ZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgICAgICAvLyA0LjQuMy4gTGV0IGZvY3VzU3RhdGUgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBoYXMgZm9jdXMKKyAgICAgICAgICAgIC8vICAgICAgICBzdGVwcyB3aXRoIGJyb3dzaW5nQ29udGV4dOKAmXMgYWN0aXZlIGRvY3VtZW50IGFzIHRoZQorICAgICAgICAgICAgLy8gICAgICAgIGFyZ3VtZW50LgorICAgICAgICAgICAgLy8gSGFuZGxlZCBpbiB0aGUgV2luZG93RGF0YSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxXaW5kb3dEYXRhPiB3aW5kb3dfZGF0YSgKKyAgICAgICAgICAgICAgICBuZXcgV2luZG93RGF0YShjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCkpKTsKKworICAgICAgICAgICAgLy8gNC40LjQuIExldCBhbmNlc3Rvck9yaWdpbnNMaXN0IGJlIHRoZSBlbXB0eSBsaXN0LgorICAgICAgICAgICAgLy8gNC40LjUuIElmIGNsaWVudCBpcyBhIHdpbmRvdyBjbGllbnQsIHNldCBhbmNlc3Rvck9yaWdpbnNMaXN0IHRvCisgICAgICAgICAgICAvLyAgICAgICAgYnJvd3NpbmdDb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQncyByZWxldmFudCBnbG9iYWwKKyAgICAgICAgICAgIC8vICAgICAgICBvYmplY3QncyBMb2NhdGlvbiBvYmplY3TigJlzIGFuY2VzdG9yIG9yaWdpbnMgbGlzdCdzCisgICAgICAgICAgICAvLyAgICAgICAgYXNzb2NpYXRlZCBsaXN0LgorICAgICAgICAgICAgLy8gQ29iYWx0IGRvZXMgbm90IGltcGxlbWVudCBMb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMuCisKKyAgICAgICAgICAgIC8vIDQuNC42LiBRdWV1ZSBhIHRhc2sgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgb24gcHJvbWlzZeKAmXMKKyAgICAgICAgICAgIC8vICAgICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyByZXNwb25zaWJsZSBldmVudCBsb29wIHVzaW5nCisgICAgICAgICAgICAvLyAgICAgICAgdGhlIERPTSBtYW5pcHVsYXRpb24gdGFzayBzb3VyY2U6CisgICAgICAgICAgICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICAgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKKyAgICAgICAgICAgICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFdpbmRvd0RhdGE+IHdpbmRvd19kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gNC40LjYuMS4gSWYgY2xpZW504oCZcyBkaXNjYXJkZWQgZmxhZyBpcyBzZXQsIHJlc29sdmUKKyAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBwcm9taXNlIHdpdGggdW5kZWZpbmVkIGFuZCBhYm9ydCB0aGVzZQorICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHN0ZXBzLgorICAgICAgICAgICAgICAgICAgICAgIC8vIDQuNC42LjIuIExldCB3aW5kb3dDbGllbnQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgQ3JlYXRlIFdpbmRvdyBDbGllbnQgd2l0aCBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgZnJhbWVUeXBlLCB2aXNpYmlsaXR5U3RhdGUsIGZvY3VzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgYW5kIGFuY2VzdG9yT3JpZ2luc0xpc3QuCisgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxDbGllbnQ+IHdpbmRvd19jbGllbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dDbGllbnQ6OkNyZWF0ZSgqd2luZG93X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgIC8vIDQuNC42LjMuIFJlc29sdmUgcHJvbWlzZSB3aXRoIHdpbmRvd0NsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZXNvbHZlKHdpbmRvd19jbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpLCBzdGQ6Om1vdmUod2luZG93X2RhdGEpKSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICBjbGllbnQsIHdvcmtlcl9jb250ZXh0LCBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpKSk7CisgIERDSEVDS19FUShudWxscHRyLCBwcm9taXNlX3JlZmVyZW5jZS5nZXQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTZXJ2aWNlV29ya2VyQ29udGV4dDo6U2VydmljZVdvcmtlckNvbnRleHQoCisgICAgd2ViOjpXZWJTZXR0aW5ncyogd2ViX3NldHRpbmdzLCBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwKKyAgICB3ZWI6OlVzZXJBZ2VudFBsYXRmb3JtSW5mbyogcGxhdGZvcm1faW5mbywgYmFzZTo6TWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcCwKKyAgICBjb25zdCBHVVJMJiB1cmwpCisgICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCkgeworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wXywgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIGpvYnNfID0KKyAgICAgIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVdvcmtlckpvYnM+KHRoaXMsIG5ldHdvcmtfbW9kdWxlLCBtZXNzYWdlX2xvb3ApOworCisgIFNlcnZpY2VXb3JrZXJQZXJzaXN0ZW50U2V0dGluZ3M6Ok9wdGlvbnMgb3B0aW9ucyh3ZWJfc2V0dGluZ3MsIG5ldHdvcmtfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1faW5mbywgdGhpcywgdXJsKTsKKyAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8ucmVzZXQobmV3IFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25NYXAob3B0aW9ucykpOworICBEQ0hFQ0soc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8pOworfQorCitTZXJ2aWNlV29ya2VyQ29udGV4dDo6flNlcnZpY2VXb3JrZXJDb250ZXh0KCkgeworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+SGFuZGxlVXNlckFnZW50U2h1dGRvd24odGhpcyk7CisgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5BYm9ydEFsbEFjdGl2ZSgpOworICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy5yZXNldCgpOworICBpZiAoIXdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmVtcHR5KCkpIHsKKyAgICAvLyBBYm9ydCBhbnkgU2VydmljZSBXb3JrZXJzIHRoYXQgcmVtYWluLgorICAgIGZvciAoYXV0byYgY29udGV4dCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7CisgICAgICBEQ0hFQ0soY29udGV4dCk7CisgICAgICBpZiAoY29udGV4dC0+R2V0V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSgpLT5Jc1NlcnZpY2VXb3JrZXIoKSkgeworICAgICAgICBTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGUqIHNlcnZpY2Vfd29ya2VyID0KKyAgICAgICAgICAgIGNvbnRleHQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKS0+QXNTZXJ2aWNlV29ya2VyKCk7CisgICAgICAgIGlmIChzZXJ2aWNlX3dvcmtlciAmJiBzZXJ2aWNlX3dvcmtlci0+c2VydmljZV93b3JrZXJfb2JqZWN0KCkpIHsKKyAgICAgICAgICBzZXJ2aWNlX3dvcmtlci0+c2VydmljZV93b3JrZXJfb2JqZWN0KCktPkFib3J0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciB3ZWIgY29udGV4dCByZWdpc3RyYXRpb25zIHRvIGJlIGNsZWFyZWQuCisgICAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc19jbGVhcmVkXy5UaW1lZFdhaXQoa1NodXRkb3duV2FpdFRpbWVvdXRTZWNzKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpTdGFydFJlZ2lzdGVyKAorICAgIGNvbnN0IGJhc2U6Ok9wdGlvbmFsPEdVUkw+JiBtYXliZV9zY29wZV91cmwsCisgICAgY29uc3QgR1VSTCYgc2NyaXB0X3VybF93aXRoX2ZyYWdtZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPiBwcm9taXNlX3JlZmVyZW5jZSwKKyAgICB3ZWI6OkNvbnRleHQqIGNsaWVudCwgY29uc3QgV29ya2VyVHlwZSYgdHlwZSwKKyAgICBjb25zdCBTZXJ2aWNlV29ya2VyVXBkYXRlVmlhQ2FjaGUmIHVwZGF0ZV92aWFfY2FjaGUpIHsKKyAgVFJBQ0VfRVZFTlQyKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VyQ29udGV4dDo6U3RhcnRSZWdpc3RlcigpIiwKKyAgICAgICAgICAgICAgICJzY29wZSIsIG1heWJlX3Njb3BlX3VybC52YWx1ZV9vcihHVVJMKCkpLnNwZWMoKSwgInNjcmlwdCIsCisgICAgICAgICAgICAgICBzY3JpcHRfdXJsX3dpdGhfZnJhZ21lbnQuc3BlYygpKTsKKyAgRENIRUNLX05FKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgRENIRUNLX0VRKGNsaWVudC0+bWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICAvLyBBbGdvcml0aG0gZm9yIFN0YXJ0IFJlZ2lzdGVyOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3N0YXJ0LXJlZ2lzdGVyLWFsZ29yaXRobQorICAvLyAxLiBJZiBzY3JpcHRVUkwgaXMgZmFpbHVyZSwgcmVqZWN0IHByb21pc2Ugd2l0aCBhIFR5cGVFcnJvciBhbmQgYWJvcnQgdGhlc2UKKyAgLy8gICAgc3RlcHMuCisgIGlmIChzY3JpcHRfdXJsX3dpdGhfZnJhZ21lbnQuaXNfZW1wdHkoKSkgeworICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIDIuIFNldCBzY3JpcHRVUkzigJlzIGZyYWdtZW50IHRvIG51bGwuCisgIHVybDo6UmVwbGFjZW1lbnRzPGNoYXI+IHJlcGxhY2VtZW50czsKKyAgcmVwbGFjZW1lbnRzLkNsZWFyUmVmKCk7CisgIEdVUkwgc2NyaXB0X3VybCA9IHNjcmlwdF91cmxfd2l0aF9mcmFnbWVudC5SZXBsYWNlQ29tcG9uZW50cyhyZXBsYWNlbWVudHMpOworICBEQ0hFQ0soIXNjcmlwdF91cmwuaGFzX3JlZigpIHx8IHNjcmlwdF91cmwucmVmKCkuZW1wdHkoKSk7CisgIERDSEVDSyghc2NyaXB0X3VybC5pc19lbXB0eSgpKTsKKworICAvLyAzLiBJZiBzY3JpcHRVUkzigJlzIHNjaGVtZSBpcyBub3Qgb25lIG9mICJodHRwIiBhbmQgImh0dHBzIiwgcmVqZWN0IHByb21pc2UKKyAgLy8gICAgd2l0aCBhIFR5cGVFcnJvciBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCisgIGlmICghc2NyaXB0X3VybC5TY2hlbWVJc0hUVFBPckhUVFBTKCkpIHsKKyAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3Qoc2NyaXB0OjprVHlwZUVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyA0LiBJZiBhbnkgb2YgdGhlIHN0cmluZ3MgaW4gc2NyaXB0VVJM4oCZcyBwYXRoIGNvbnRhaW5zIGVpdGhlciBBU0NJSQorICAvLyAgICBjYXNlLWluc2Vuc2l0aXZlICIlMmYiIG9yIEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUgIiU1YyIsIHJlamVjdCBwcm9taXNlCisgIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgorICBpZiAoUGF0aENvbnRhaW5zRXNjYXBlZFNsYXNoKHNjcmlwdF91cmwpKSB7CisgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgRENIRUNLKGNsaWVudCk7CisgIHdlYjo6V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSogd2luZG93X29yX3dvcmtlcl9nbG9iYWxfc2NvcGUgPQorICAgICAgY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCk7CisgIERDSEVDSyh3aW5kb3dfb3Jfd29ya2VyX2dsb2JhbF9zY29wZSk7CisgIHdlYjo6Q3NwRGVsZWdhdGUqIGNzcF9kZWxlZ2F0ZSA9CisgICAgICB3aW5kb3dfb3Jfd29ya2VyX2dsb2JhbF9zY29wZS0+Y3NwX2RlbGVnYXRlKCk7CisgIERDSEVDSyhjc3BfZGVsZWdhdGUpOworICBpZiAoIWNzcF9kZWxlZ2F0ZS0+Q2FuTG9hZCh3ZWI6OkNzcERlbGVnYXRlOjprV29ya2VyLCBzY3JpcHRfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWRfcmVkaXJlY3QqLyBmYWxzZSkpIHsKKyAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3QobmV3IHdlYjo6RE9NRXhjZXB0aW9uKAorICAgICAgICB3ZWI6OkRPTUV4Y2VwdGlvbjo6a1NlY3VyaXR5RXJyLAorICAgICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIGEgU2VydmljZVdvcmtlcjogVGhlIHByb3ZpZGVkIHNjcmlwdFVSTCAoJyIgKworICAgICAgICAgICAgc2NyaXB0X3VybC5zcGVjKCkgKyAiJykgdmlvbGF0ZXMgdGhlIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LiIpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyA1LiBJZiBzY29wZVVSTCBpcyBudWxsLCBzZXQgc2NvcGVVUkwgdG8gdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBzdHJpbmcKKyAgLy8gICAgIi4vIiB3aXRoIHNjcmlwdFVSTC4KKyAgR1VSTCBzY29wZV91cmwgPSBtYXliZV9zY29wZV91cmwudmFsdWVfb3Ioc2NyaXB0X3VybC5SZXNvbHZlKCIuLyIpKTsKKworICAvLyA2LiBJZiBzY29wZVVSTCBpcyBmYWlsdXJlLCByZWplY3QgcHJvbWlzZSB3aXRoIGEgVHlwZUVycm9yIGFuZCBhYm9ydCB0aGVzZQorICAvLyAgICBzdGVwcy4KKyAgaWYgKHNjb3BlX3VybC5pc19lbXB0eSgpKSB7CisgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gNy4gU2V0IHNjb3BlVVJM4oCZcyBmcmFnbWVudCB0byBudWxsLgorICBzY29wZV91cmwgPSBzY29wZV91cmwuUmVwbGFjZUNvbXBvbmVudHMocmVwbGFjZW1lbnRzKTsKKyAgRENIRUNLKCFzY29wZV91cmwuaGFzX3JlZigpIHx8IHNjb3BlX3VybC5yZWYoKS5lbXB0eSgpKTsKKyAgRENIRUNLKCFzY29wZV91cmwuaXNfZW1wdHkoKSk7CisKKyAgLy8gOC4gSWYgc2NvcGVVUkzigJlzIHNjaGVtZSBpcyBub3Qgb25lIG9mICJodHRwIiBhbmQgImh0dHBzIiwgcmVqZWN0IHByb21pc2UKKyAgLy8gICAgd2l0aCBhIFR5cGVFcnJvciBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCisgIGlmICghc2NvcGVfdXJsLlNjaGVtZUlzSFRUUE9ySFRUUFMoKSkgeworICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIDkuIElmIGFueSBvZiB0aGUgc3RyaW5ncyBpbiBzY29wZVVSTOKAmXMgcGF0aCBjb250YWlucyBlaXRoZXIgQVNDSUkKKyAgLy8gICAgY2FzZS1pbnNlbnNpdGl2ZSAiJTJmIiBvciBBU0NJSSBjYXNlLWluc2Vuc2l0aXZlICIlNWMiLCByZWplY3QgcHJvbWlzZQorICAvLyAgICB3aXRoIGEgVHlwZUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgaWYgKFBhdGhDb250YWluc0VzY2FwZWRTbGFzaChzY29wZV91cmwpKSB7CisgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gMTAuIExldCBzdG9yYWdlIGtleSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgb2J0YWluIGEgc3RvcmFnZSBrZXkgZ2l2ZW4KKyAgLy8gICAgIGNsaWVudC4KKyAgdXJsOjpPcmlnaW4gc3RvcmFnZV9rZXkgPSBjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPk9idGFpblN0b3JhZ2VLZXkoKTsKKworICAvLyAxMS4gTGV0IGpvYiBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgQ3JlYXRlIEpvYiB3aXRoIHJlZ2lzdGVyLCBzdG9yYWdlIGtleSwKKyAgLy8gICAgIHNjb3BlVVJMLCBzY3JpcHRVUkwsIHByb21pc2UsIGFuZCBjbGllbnQuCisgIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlV29ya2VySm9iczo6Sm9iPiBqb2IgPSBqb2JzXy0+Q3JlYXRlSm9iKAorICAgICAgU2VydmljZVdvcmtlckpvYnM6OmtSZWdpc3Rlciwgc3RvcmFnZV9rZXksIHNjb3BlX3VybCwgc2NyaXB0X3VybCwKKyAgICAgIFNlcnZpY2VXb3JrZXJKb2JzOjpKb2JQcm9taXNlVHlwZTo6Q3JlYXRlKHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpLAorICAgICAgY2xpZW50KTsKKworICAvLyAxMi4gU2V0IGpvYuKAmXMgd29ya2VyIHR5cGUgdG8gd29ya2VyVHlwZS4KKyAgLy8gQ29iYWx0IG9ubHkgc3VwcG9ydHMgJ2NsYXNzaWMnIHdvcmtlciB0eXBlLgorCisgIC8vIDEzLiBTZXQgam9i4oCZcyB1cGRhdGUgdmlhIGNhY2hlIG1vZGUgdG8gdXBkYXRlVmlhQ2FjaGUuCisgIGpvYi0+dXBkYXRlX3ZpYV9jYWNoZSA9IHVwZGF0ZV92aWFfY2FjaGU7CisKKyAgLy8gMTQuIFNldCBqb2LigJlzIHJlZmVycmVyIHRvIHJlZmVycmVyLgorICAvLyBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzIHNldCBpbiBDcmVhdGVKb2IoKS4KKworICAvLyAxNS4gSW52b2tlIFNjaGVkdWxlIEpvYiB3aXRoIGpvYi4KKyAgam9ic18tPlNjaGVkdWxlSm9iKHN0ZDo6bW92ZShqb2IpKTsKK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6U29mdFVwZGF0ZSgKKyAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24sIGJvb2wgZm9yY2VfYnlwYXNzX2NhY2hlKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckNvbnRleHQ6OlNvZnRVcGRhdGUoKSIpOworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0socmVnaXN0cmF0aW9uKTsKKyAgLy8gQWxnb3JpdGhtIGZvciBTb2Z0VXBkYXRlOgorICAvLyAgICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzb2Z0LXVwZGF0ZQorICAvLyAxLiBMZXQgbmV3ZXN0V29ya2VyIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBHZXQgTmV3ZXN0IFdvcmtlciBhbGdvcml0aG0KKyAgLy8gcGFzc2luZyByZWdpc3RyYXRpb24gYXMgaXRzIGFyZ3VtZW50LgorICBTZXJ2aWNlV29ya2VyT2JqZWN0KiBuZXdlc3Rfd29ya2VyID0gcmVnaXN0cmF0aW9uLT5HZXROZXdlc3RXb3JrZXIoKTsKKworICAvLyAyLiBJZiBuZXdlc3RXb3JrZXIgaXMgbnVsbCwgYWJvcnQgdGhlc2Ugc3RlcHMuCisgIGlmIChuZXdlc3Rfd29ya2VyID09IG51bGxwdHIpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyAzLiBMZXQgam9iIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBDcmVhdGUgSm9iIHdpdGggdXBkYXRlLCByZWdpc3RyYXRpb27igJlzCisgIC8vIHN0b3JhZ2Uga2V5LCByZWdpc3RyYXRpb27igJlzIHNjb3BlIHVybCwgbmV3ZXN0V29ya2Vy4oCZcyBzY3JpcHQgdXJsLCBudWxsLCBhbmQKKyAgLy8gbnVsbC4KKyAgc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2VXb3JrZXJKb2JzOjpKb2I+IGpvYiA9IGpvYnNfLT5DcmVhdGVKb2JXaXRob3V0UHJvbWlzZSgKKyAgICAgIFNlcnZpY2VXb3JrZXJKb2JzOjprVXBkYXRlLCByZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksCisgICAgICByZWdpc3RyYXRpb24tPnNjb3BlX3VybCgpLCBuZXdlc3Rfd29ya2VyLT5zY3JpcHRfdXJsKCkpOworCisgIC8vIDQuIFNldCBqb2LigJlzIHdvcmtlciB0eXBlIHRvIG5ld2VzdFdvcmtlcuKAmXMgdHlwZS4KKyAgLy8gQ29iYWx0IG9ubHkgc3VwcG9ydHMgJ2NsYXNzaWMnIHdvcmtlciB0eXBlLgorCisgIC8vIDUuIFNldCBqb2LigJlzIGZvcmNlIGJ5cGFzcyBjYWNoZSBmbGFnIGlmIGZvcmNlQnlwYXNzQ2FjaGUgaXMgdHJ1ZS4KKyAgam9iLT5mb3JjZV9ieXBhc3NfY2FjaGVfZmxhZyA9IGZvcmNlX2J5cGFzc19jYWNoZTsKKworICAvLyA2LiBJbnZva2UgU2NoZWR1bGUgSm9iIHdpdGggam9iLgorICBtZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VySm9iczo6U2NoZWR1bGVKb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoam9ic18uZ2V0KCkpLCBzdGQ6Om1vdmUoam9iKSkpOworICBEQ0hFQ0soIWpvYi5nZXQoKSk7Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OkVuc3VyZVNlcnZpY2VXb3JrZXJTdGFydGVkKAorICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgY29uc3QgR1VSTCYgY2xpZW50X3VybCwKKyAgICBiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KSB7CisgIGlmIChtZXNzYWdlX2xvb3AoKSAhPSBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKSB7CisgICAgbWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6RW5zdXJlU2VydmljZVdvcmtlclN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIHN0b3JhZ2Vfa2V5LCBjbGllbnRfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICBkb25lX2V2ZW50KSk7CisgICAgcmV0dXJuOworICB9CisgIGJhc2U6OlNjb3BlZENsb3N1cmVSdW5uZXIgc2lnbmFsX2RvbmUoYmFzZTo6QmluZE9uY2UoCisgICAgICBbXShiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KSB7IGRvbmVfZXZlbnQtPlNpZ25hbCgpOyB9LAorICAgICAgZG9uZV9ldmVudCkpOworICBiYXNlOjpUaW1lVGlja3Mgc3RhcnQgPSBiYXNlOjpUaW1lVGlja3M6Ok5vdygpOworICBhdXRvIHJlZ2lzdHJhdGlvbiA9CisgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+R2V0UmVnaXN0cmF0aW9uKHN0b3JhZ2Vfa2V5LCBjbGllbnRfdXJsKTsKKyAgaWYgKCFyZWdpc3RyYXRpb24pIHsKKyAgICByZXR1cm47CisgIH0KKyAgYXV0byBzZXJ2aWNlX3dvcmtlcl9vYmplY3QgPSByZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKTsKKyAgaWYgKCFzZXJ2aWNlX3dvcmtlcl9vYmplY3QgfHwgc2VydmljZV93b3JrZXJfb2JqZWN0LT5pc19ydW5uaW5nKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2VydmljZV93b3JrZXJfb2JqZWN0LT5PYnRhaW5XZWJBZ2VudEFuZFdhaXRVbnRpbERvbmUoKTsKK30KKworc3RkOjpzdHJpbmcqIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpSdW5TZXJ2aWNlV29ya2VyKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2J5cGFzc19jYWNoZSkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJDb250ZXh0OjpSdW5TZXJ2aWNlV29ya2VyKCkiKTsKKworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0sod29ya2VyKTsKKyAgLy8gQWxnb3JpdGhtIGZvciAiUnVuIFNlcnZpY2UgV29ya2VyIgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3J1bi1zZXJ2aWNlLXdvcmtlci1hbGdvcml0aG0KKworICAvLyAxLiBMZXQgdW5zYWZlQ3JlYXRpb25UaW1lIGJlIHRoZSB1bnNhZmUgc2hhcmVkIGN1cnJlbnQgdGltZS4KKyAgYXV0byB1bnNhZmVfY3JlYXRpb25fdGltZSA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCk7CisgIC8vIDIuIElmIHNlcnZpY2VXb3JrZXIgaXMgcnVubmluZywgdGhlbiByZXR1cm4gc2VydmljZVdvcmtlcuKAmXMgc3RhcnQgc3RhdHVzLgorICBpZiAod29ya2VyLT5pc19ydW5uaW5nKCkpIHsKKyAgICByZXR1cm4gd29ya2VyLT5zdGFydF9zdGF0dXMoKTsKKyAgfQorICAvLyAzLiBJZiBzZXJ2aWNlV29ya2Vy4oCZcyBzdGF0ZSBpcyAicmVkdW5kYW50IiwgdGhlbiByZXR1cm4gZmFpbHVyZS4KKyAgaWYgKHdvcmtlci0+c3RhdGUoKSA9PSBrU2VydmljZVdvcmtlclN0YXRlUmVkdW5kYW50KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgLy8gNC4gQXNzZXJ0OiBzZXJ2aWNlV29ya2Vy4oCZcyBzdGFydCBzdGF0dXMgaXMgbnVsbC4KKyAgRENIRUNLKHdvcmtlci0+c3RhcnRfc3RhdHVzKCkgPT0gbnVsbHB0cik7CisgIC8vIDUuIExldCBzY3JpcHQgYmUgc2VydmljZVdvcmtlcuKAmXMgc2NyaXB0IHJlc291cmNlLgorICAvLyA2LiBBc3NlcnQ6IHNjcmlwdCBpcyBub3QgbnVsbC4KKyAgRENIRUNLKHdvcmtlci0+SGFzU2NyaXB0UmVzb3VyY2UoKSk7CisgIC8vIDcuIExldCBzdGFydEZhaWxlZCBiZSBmYWxzZS4KKyAgd29ya2VyLT5zdG9yZV9zdGFydF9mYWlsZWQoZmFsc2UpOworICAvLyA4LiBMZXQgYWdlbnQgYmUgdGhlIHJlc3VsdCBvZiBvYnRhaW5pbmcgYSBzZXJ2aWNlIHdvcmtlciBhZ2VudCwgYW5kIHJ1biB0aGUKKyAgLy8gICAgZm9sbG93aW5nIHN0ZXBzIGluIHRoYXQgY29udGV4dDoKKyAgLy8gOS4gV2FpdCBmb3Igc2VydmljZVdvcmtlciB0byBiZSBydW5uaW5nLCBvciBmb3Igc3RhcnRGYWlsZWQgdG8gYmUgdHJ1ZS4KKyAgd29ya2VyLT5PYnRhaW5XZWJBZ2VudEFuZFdhaXRVbnRpbERvbmUoKTsKKyAgLy8gMTAuIElmIHN0YXJ0RmFpbGVkIGlzIHRydWUsIHRoZW4gcmV0dXJuIGZhaWx1cmUuCisgIGlmICh3b3JrZXItPmxvYWRfc3RhcnRfZmFpbGVkKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAvLyAxMS4gUmV0dXJuIHNlcnZpY2VXb3JrZXLigJlzIHN0YXJ0IHN0YXR1cy4KKyAgcmV0dXJuIHdvcmtlci0+c3RhcnRfc3RhdHVzKCk7Cit9CisKK2Jvb2wgU2VydmljZVdvcmtlckNvbnRleHQ6OldhaXRGb3JBc3luY2hyb25vdXNFeHRlbnNpb25zKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4mIHJlZ2lzdHJhdGlvbikgeworICAvLyBUT0RPKGIvMjQwMTY0Mzg4KTogSW52ZXN0aWdhdGUgYSBiZXR0ZXIgYXBwcm9hY2ggZm9yIGNvbWJpbmluZyB3YWl0aW5nCisgIC8vIGZvciB0aGUgRXh0ZW5kYWJsZUV2ZW50IHdoaWxlIGFsc28gYWxsb3dpbmcgdXNlIG9mIGFsZ29yaXRobXMgdGhhdCBydW4KKyAgLy8gb24gdGhlIHNhbWUgdGhyZWFkIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIuCisgIGJhc2U6OlRpbWVUaWNrcyB3YWl0X3N0YXJ0X3RpbWUgPSBiYXNlOjpUaW1lVGlja3M6Ok5vdygpOworICBkbyB7CisgICAgaWYgKHJlZ2lzdHJhdGlvbi0+ZG9uZV9ldmVudCgpLT5UaW1lZFdhaXQoCisgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMTAwKSkpCisgICAgICBicmVhazsKKyAgICBiYXNlOjpNZXNzYWdlTG9vcEN1cnJlbnQ6OlNjb3BlZE5lc3RhYmxlVGFza0FsbG93ZXIgYWxsb3c7CisgICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICB9IHdoaWxlICgoYmFzZTo6VGltZVRpY2tzOjpOb3coKSAtIHdhaXRfc3RhcnRfdGltZSkgPAorICAgICAgICAgICBrV2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnNUaW1lb3V0KTsKKyAgcmV0dXJuIHJlZ2lzdHJhdGlvbi0+ZG9uZV9ldmVudCgpLT5Jc1NpZ25hbGVkKCk7Cit9CisKK2Jvb2wgU2VydmljZVdvcmtlckNvbnRleHQ6OklzQW55Q2xpZW50VXNpbmdSZWdpc3RyYXRpb24oCisgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7CisgIGJvb2wgYW55X2NsaWVudF9pc191c2luZyA9IGZhbHNlOworICBmb3IgKGF1dG8mIGNvbnRleHQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgeworICAgIC8vIFdoZW4gYSBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMgY29udHJvbGxlZCBieSBhIHNlcnZpY2Ugd29ya2VyLCBpdCBpcworICAgIC8vIHNhaWQgdGhhdCB0aGUgc2VydmljZSB3b3JrZXIgY2xpZW50IGlzIHVzaW5nIHRoZSBzZXJ2aWNlIHdvcmtlcuKAmXMKKyAgICAvLyBjb250YWluaW5nIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbi4KKyAgICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2Rmbi1jb250cm9sCisgICAgaWYgKGNvbnRleHQtPmlzX2NvbnRyb2xsZWRfYnkocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpKSB7CisgICAgICBhbnlfY2xpZW50X2lzX3VzaW5nID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gYW55X2NsaWVudF9pc191c2luZzsKK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6VHJ5QWN0aXZhdGUoCisgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckNvbnRleHQ6OlRyeUFjdGl2YXRlKCkiKTsKKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgLy8gQWxnb3JpdGhtIGZvciBUcnkgQWN0aXZhdGU6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdHJ5LWFjdGl2YXRlLWFsZ29yaXRobQorCisgIC8vIDEuIElmIHJlZ2lzdHJhdGlvbuKAmXMgd2FpdGluZyB3b3JrZXIgaXMgbnVsbCwgcmV0dXJuLgorICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuOworICBpZiAoIXJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSkgcmV0dXJuOworCisgIC8vIDIuIElmIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciBpcyBub3QgbnVsbCBhbmQgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUKKyAgLy8gICAgd29ya2VyJ3Mgc3RhdGUgaXMgImFjdGl2YXRpbmciLCByZXR1cm4uCisgIGlmIChyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSAmJgorICAgICAgKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpLT5zdGF0ZSgpID09IGtTZXJ2aWNlV29ya2VyU3RhdGVBY3RpdmF0aW5nKSkKKyAgICByZXR1cm47CisKKyAgLy8gMy4gSW52b2tlIEFjdGl2YXRlIHdpdGggcmVnaXN0cmF0aW9uIGlmIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisKKyAgLy8gICAgLSByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIgaXMgbnVsbC4KKyAgYm9vbCBpbnZva2VfYWN0aXZhdGUgPSByZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSA9PSBudWxscHRyOworCisgIGlmICghaW52b2tlX2FjdGl2YXRlKSB7CisgICAgLy8gICAgLSBUaGUgcmVzdWx0IG9mIHJ1bm5pbmcgU2VydmljZSBXb3JrZXIgSGFzIE5vIFBlbmRpbmcgRXZlbnRzIHdpdGgKKyAgICAvLyAgICAgIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciBpcyB0cnVlLi4uCisgICAgaWYgKFNlcnZpY2VXb3JrZXJIYXNOb1BlbmRpbmdFdmVudHMocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpKSB7CisgICAgICAvLyAgICAgIC4uLiBhbmQgbm8gc2VydmljZSB3b3JrZXIgY2xpZW50IGlzIHVzaW5nIHJlZ2lzdHJhdGlvbi4uLgorICAgICAgYm9vbCBhbnlfY2xpZW50X3VzaW5nID0gSXNBbnlDbGllbnRVc2luZ1JlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pOworICAgICAgaW52b2tlX2FjdGl2YXRlID0gIWFueV9jbGllbnRfdXNpbmc7CisgICAgICAvLyAgICAgIC4uLiBvciByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyJ3Mgc2tpcCB3YWl0aW5nIGZsYWcgaXMKKyAgICAgIC8vICAgICAgc2V0LgorICAgICAgaWYgKCFpbnZva2VfYWN0aXZhdGUgJiYgcmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpLT5za2lwX3dhaXRpbmcoKSkKKyAgICAgICAgaW52b2tlX2FjdGl2YXRlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoaW52b2tlX2FjdGl2YXRlKSBBY3RpdmF0ZShyZWdpc3RyYXRpb24pOworfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpBY3RpdmF0ZSgKKyAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VyQ29udGV4dDo6QWN0aXZhdGUoKSIpOworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICAvLyBBbGdvcml0aG0gZm9yIEFjdGl2YXRlOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2FjdGl2YXRpb24tYWxnb3JpdGhtCisKKyAgLy8gMS4gSWYgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlciBpcyBudWxsLCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgaWYgKHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSA9PSBudWxscHRyKSByZXR1cm47CisgIC8vIDIuIElmIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciBpcyBub3QgbnVsbCwgdGhlbjoKKyAgaWYgKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSB7CisgICAgLy8gMi4xLiBUZXJtaW5hdGUgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyLgorICAgIFRlcm1pbmF0ZVNlcnZpY2VXb3JrZXIocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpOworICAgIC8vIDIuMi4gUnVuIHRoZSBVcGRhdGUgV29ya2VyIFN0YXRlIGFsZ29yaXRobSBwYXNzaW5nIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlCisgICAgLy8gICAgICB3b3JrZXIgYW5kICJyZWR1bmRhbnQiIGFzIHRoZSBhcmd1bWVudHMuCisgICAgVXBkYXRlV29ya2VyU3RhdGUocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCksCisgICAgICAgICAgICAgICAgICAgICAga1NlcnZpY2VXb3JrZXJTdGF0ZVJlZHVuZGFudCk7CisgIH0KKyAgLy8gMy4gUnVuIHRoZSBVcGRhdGUgUmVnaXN0cmF0aW9uIFN0YXRlIGFsZ29yaXRobSBwYXNzaW5nIHJlZ2lzdHJhdGlvbiwKKyAgLy8gICAgImFjdGl2ZSIgYW5kIHJlZ2lzdHJhdGlvbuKAmXMgd2FpdGluZyB3b3JrZXIgYXMgdGhlIGFyZ3VtZW50cy4KKyAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCkpOworICAvLyA0LiBSdW4gdGhlIFVwZGF0ZSBSZWdpc3RyYXRpb24gU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9uLAorICAvLyAgICAid2FpdGluZyIgYW5kIG51bGwgYXMgdGhlIGFyZ3VtZW50cy4KKyAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrV2FpdGluZywgbnVsbHB0cik7CisgIC8vIDUuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzIGFjdGl2ZQorICAvLyAgICB3b3JrZXIgYW5kICJhY3RpdmF0aW5nIiBhcyB0aGUgYXJndW1lbnRzLgorICBVcGRhdGVXb3JrZXJTdGF0ZShyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAga1NlcnZpY2VXb3JrZXJTdGF0ZUFjdGl2YXRpbmcpOworICAvLyA2LiBMZXQgbWF0Y2hlZENsaWVudHMgYmUgYSBsaXN0IG9mIHNlcnZpY2Ugd29ya2VyIGNsaWVudHMgd2hvc2UgY3JlYXRpb24KKyAgLy8gICAgVVJMIG1hdGNoZXMgcmVnaXN0cmF0aW9u4oCZcyBzdG9yYWdlIGtleSBhbmQgcmVnaXN0cmF0aW9u4oCZcyBzY29wZSB1cmwuCisgIHN0ZDo6bGlzdDx3ZWI6OkNvbnRleHQqPiBtYXRjaGVkX2NsaWVudHM7CisgIGZvciAoYXV0byYgY29udGV4dCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7CisgICAgdXJsOjpPcmlnaW4gY29udGV4dF9zdG9yYWdlX2tleSA9CisgICAgICAgIHVybDo6T3JpZ2luOjpDcmVhdGUoY29udGV4dC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y3JlYXRpb25fdXJsKCkpOworICAgIHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4gbWF0Y2hlZF9yZWdpc3RyYXRpb24gPQorICAgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKAorICAgICAgICAgICAgY29udGV4dF9zdG9yYWdlX2tleSwgcmVnaXN0cmF0aW9uLT5zY29wZV91cmwoKSk7CisgICAgaWYgKG1hdGNoZWRfcmVnaXN0cmF0aW9uID09IHJlZ2lzdHJhdGlvbikgeworICAgICAgbWF0Y2hlZF9jbGllbnRzLnB1c2hfYmFjayhjb250ZXh0KTsKKyAgICB9CisgIH0KKyAgLy8gNy4gRm9yIGVhY2ggY2xpZW50IG9mIG1hdGNoZWRDbGllbnRzLCBxdWV1ZSBhIHRhc2sgb24gY2xpZW504oCZcyAgcmVzcG9uc2libGUKKyAgLy8gICAgZXZlbnQgbG9vcCwgdXNpbmcgdGhlIERPTSBtYW5pcHVsYXRpb24gdGFzayBzb3VyY2UsIHRvIHJ1biB0aGUgZm9sbG93aW5nCisgIC8vICAgIHN1YnN0ZXBzOgorICBmb3IgKGF1dG8mIGNsaWVudCA6IG1hdGNoZWRfY2xpZW50cykgeworICAgIC8vIDcuMS4gTGV0IHJlYWR5UHJvbWlzZSBiZSBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QncworICAgIC8vICAgICAgU2VydmljZVdvcmtlckNvbnRhaW5lciBvYmplY3TigJlzIHJlYWR5CisgICAgLy8gICAgICBwcm9taXNlLgorICAgIC8vIDcuMi4gSWYgcmVhZHlQcm9taXNlIGlzIG51bGwsIHRoZW4gY29udGludWUuCisgICAgLy8gNy4zLiBJZiByZWFkeVByb21pc2UgaXMgcGVuZGluZywgcmVzb2x2ZQorICAgIC8vICAgICAgcmVhZHlQcm9taXNlIHdpdGggdGhlIHRoZSByZXN1bHQgb2YgZ2V0dGluZworICAgIC8vICAgICAgdGhlIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBvYmplY3QgdGhhdAorICAgIC8vICAgICAgcmVwcmVzZW50cyByZWdpc3RyYXRpb24gaW4gcmVhZHlQcm9taXNl4oCZcworICAgIC8vICAgICAgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgorICAgIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGFpbmVyOjpNYXliZVJlc29sdmVSZWFkeVByb21pc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5uYXZpZ2F0b3JfYmFzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2VydmljZV93b3JrZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlZ2lzdHJhdGlvbikpKTsKKyAgfQorICAvLyA4LiBGb3IgZWFjaCBjbGllbnQgb2YgbWF0Y2hlZENsaWVudHM6CisgIC8vIDguMS4gSWYgY2xpZW50IGlzIGEgd2luZG93IGNsaWVudCwgdW5hc3NvY2lhdGUgY2xpZW504oCZcyByZXNwb25zaWJsZQorICAvLyAgICAgIGRvY3VtZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGNhY2hlLCBpZiBpdCBoYXMgb25lLgorICAvLyA4LjIuIEVsc2UgaWYgY2xpZW50IGlzIGEgc2hhcmVkIHdvcmtlciBjbGllbnQsIHVuYXNzb2NpYXRlIGNsaWVudOKAmXMKKyAgLy8gICAgICBnbG9iYWwgb2JqZWN0IGZyb20gaXRzIGFwcGxpY2F0aW9uIGNhY2hlLCBpZiBpdCBoYXMgb25lLgorICAvLyBDb2JhbHQgZG9lc24ndCBpbXBsZW1lbnQgJ2FwcGxpY2F0aW9uIGNhY2hlJzoKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1odG1sNS0yMDExMDUyNS9vZmZsaW5lLmh0bWwjYXBwbGljYXRpb25jYWNoZQorICAvLyA5LiBGb3IgZWFjaCBzZXJ2aWNlIHdvcmtlciBjbGllbnQgY2xpZW50IHdobyBpcyB1c2luZyByZWdpc3RyYXRpb246CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZGZuLXVzZQorICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7CisgICAgLy8gV2hlbiBhIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBpcyBjb250cm9sbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIsIGl0IGlzCisgICAgLy8gc2FpZCB0aGF0IHRoZSBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMgdXNpbmcgdGhlIHNlcnZpY2Ugd29ya2Vy4oCZcworICAgIC8vIGNvbnRhaW5pbmcgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uLgorICAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZGZuLWNvbnRyb2wKKyAgICBpZiAoY2xpZW50LT5hY3RpdmVfc2VydmljZV93b3JrZXIoKSAmJgorICAgICAgICBjbGllbnQtPmFjdGl2ZV9zZXJ2aWNlX3dvcmtlcigpCisgICAgICAgICAgICAgICAgLT5jb250YWluaW5nX3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbigpID09IHJlZ2lzdHJhdGlvbikgeworICAgICAgLy8gOS4xLiBTZXQgY2xpZW504oCZcyBhY3RpdmUgd29ya2VyIHRvIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlci4KKyAgICAgIGNsaWVudC0+c2V0X2FjdGl2ZV9zZXJ2aWNlX3dvcmtlcihyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSk7CisgICAgICAvLyA5LjIuIEludm9rZSBOb3RpZnkgQ29udHJvbGxlciBDaGFuZ2UgYWxnb3JpdGhtIHdpdGggY2xpZW50IGFzIHRoZQorICAgICAgLy8gICAgICBhcmd1bWVudC4KKyAgICAgIE5vdGlmeUNvbnRyb2xsZXJDaGFuZ2UoY2xpZW50KTsKKyAgICB9CisgIH0KKyAgLy8gMTAuIExldCBhY3RpdmVXb3JrZXIgYmUgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyLgorICBTZXJ2aWNlV29ya2VyT2JqZWN0KiBhY3RpdmVfd29ya2VyID0gcmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCk7CisgIGJvb2wgYWN0aXZhdGVkID0gdHJ1ZTsKKyAgLy8gMTEuIElmIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgU2hvdWxkIFNraXAgRXZlbnQgYWxnb3JpdGhtIHdpdGgKKyAgLy8gICAgIGFjdGl2ZVdvcmtlciBhbmQgImFjdGl2YXRlIiBpcyBmYWxzZSwgdGhlbjoKKyAgRENIRUNLKGFjdGl2ZV93b3JrZXIpOworICBpZiAoIWFjdGl2ZV93b3JrZXItPlNob3VsZFNraXBFdmVudChiYXNlOjpUb2tlbnM6OmFjdGl2YXRlKCkpKSB7CisgICAgLy8gMTEuMS4gSWYgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBSdW4gU2VydmljZSBXb3JrZXIgYWxnb3JpdGhtIHdpdGgKKyAgICAvLyAgICAgICBhY3RpdmVXb3JrZXIgaXMgbm90IGZhaWx1cmUsIHRoZW46CisgICAgYXV0byogcnVuX3Jlc3VsdCA9IFJ1blNlcnZpY2VXb3JrZXIoYWN0aXZlX3dvcmtlcik7CisgICAgaWYgKHJ1bl9yZXN1bHQpIHsKKyAgICAgIC8vIDExLjEuMS4gUXVldWUgYSB0YXNrIHRhc2sgb24gYWN0aXZlV29ya2Vy4oCZcyBldmVudCBsb29wIHVzaW5nIHRoZSBET00KKyAgICAgIC8vICAgICAgICAgbWFuaXB1bGF0aW9uIHRhc2sgc291cmNlIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAgRENIRUNLX0VRKGFjdGl2ZV93b3JrZXItPndlYl9hZ2VudCgpLT5jb250ZXh0KCksCisgICAgICAgICAgICAgICAgYWN0aXZlX3dvcmtlci0+d29ya2VyX2dsb2JhbF9zY29wZSgpCisgICAgICAgICAgICAgICAgICAgIC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICAtPmNvbnRleHQoKSk7CisgICAgICBEQ0hFQ0socmVnaXN0cmF0aW9uLT5kb25lX2V2ZW50KCktPklzU2lnbmFsZWQoKSk7CisgICAgICByZWdpc3RyYXRpb24tPmRvbmVfZXZlbnQoKS0+UmVzZXQoKTsKKyAgICAgIGFjdGl2ZV93b3JrZXItPndlYl9hZ2VudCgpCisgICAgICAgICAgLT5jb250ZXh0KCkKKyAgICAgICAgICAtPm1lc3NhZ2VfbG9vcCgpCisgICAgICAgICAgLT50YXNrX3J1bm5lcigpCisgICAgICAgICAgLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgICAgICAgIGJhc2U6OkJpbmQoCisgICAgICAgICAgICAgICAgICBbXShTZXJ2aWNlV29ya2VyT2JqZWN0KiBhY3RpdmVfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGRvbmVfY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoW10oYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wpIHsgZG9uZV9ldmVudC0+U2lnbmFsKCk7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lX2V2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byogc2V0dGluZ3MgPSBhY3RpdmVfd29ya2VyLT53ZWJfYWdlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmVudmlyb25tZW50X3NldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RXh0ZW5kYWJsZUV2ZW50PiBldmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRlbmRhYmxlRXZlbnQoc2V0dGluZ3MsIGJhc2U6OlRva2Vuczo6YWN0aXZhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRvbmVfY2FsbGJhY2spKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIDExLjEuMS4xLiBMZXQgZSBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIGV2ZW50IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIEV4dGVuZGFibGVFdmVudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gMTEuMS4xLjIuIEluaXRpYWxpemUgZeKAmXMgdHlwZSBhdHRyaWJ1dGUgdG8gYWN0aXZhdGUuCisgICAgICAgICAgICAgICAgICAgIC8vIDExLjEuMS4zLiBEaXNwYXRjaCBlIGF0IGFjdGl2ZVdvcmtlcuKAmXMgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlX3dvcmtlci0+d29ya2VyX2dsb2JhbF9zY29wZSgpLT5EaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMTEuMS4xLjQuIFdhaXRGb3JBc3luY2hyb25vdXNFeHRlbnNpb25zOiBXYWl0LCBpbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgcGFyYWxsZWwsIHVudGlsIGUgaXMgbm90IGFjdGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC0+SXNBY3RpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBldmVudCBoYW5kbGVyIGRvZXNuJ3QgdXNlIHdhaXRVbnRpbCgpLCBpdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBubyBsb25nZXIgYmUgYWN0aXZlLCBhbmQgdGhlcmUgd2lsbCBuZXZlciBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgdG8gc2lnbmFsIHRoZSBkb25lIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgIGRvbmVfZXZlbnQtPlNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChhY3RpdmVfd29ya2VyKSwgcmVnaXN0cmF0aW9uLT5kb25lX2V2ZW50KCkpKTsKKyAgICAgIC8vIDExLjEuMi4gV2FpdCBmb3IgdGFzayB0byBoYXZlIGV4ZWN1dGVkIG9yIGJlZW4gZGlzY2FyZGVkLgorICAgICAgLy8gVGhpcyB3YWl0aW5nIGlzIGRvbmUgaW5zaWRlIFBvc3RCbG9ja2luZ1Rhc2sgYWJvdmUuCisgICAgICAvLyAxMS4xLjMuIFdhaXQgZm9yIHRoZSBzdGVwIGxhYmVsZWQgV2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnMgdG8KKyAgICAgIC8vICAgICAgICAgY29tcGxldGUuCisgICAgICAvLyBUT0RPKGIvMjQwMTY0Mzg4KTogSW52ZXN0aWdhdGUgYSBiZXR0ZXIgYXBwcm9hY2ggZm9yIGNvbWJpbmluZyB3YWl0aW5nCisgICAgICAvLyBmb3IgdGhlIEV4dGVuZGFibGVFdmVudCB3aGlsZSBhbHNvIGFsbG93aW5nIHVzZSBvZiBhbGdvcml0aG1zIHRoYXQgcnVuCisgICAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgIGlmICghV2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnMocmVnaXN0cmF0aW9uKSkgeworICAgICAgICAvLyBUaW1lb3V0CisgICAgICAgIGFjdGl2YXRlZCA9IGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhY3RpdmF0ZWQgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgLy8gMTIuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzIGFjdGl2ZQorICAvLyAgICAgd29ya2VyIGFuZCAiYWN0aXZhdGVkIiBhcyB0aGUgYXJndW1lbnRzLgorICBpZiAoYWN0aXZhdGVkICYmIHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSB7CisgICAgVXBkYXRlV29ya2VyU3RhdGUocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCksCisgICAgICAgICAgICAgICAgICAgICAga1NlcnZpY2VXb3JrZXJTdGF0ZUFjdGl2YXRlZCk7CisKKyAgICAvLyBQZXJzaXN0IHJlZ2lzdHJhdGlvbiBzaW5jZSB0aGUgd2FpdGluZ193b3JrZXIgaGFzIGJlZW4gdXBkYXRlZCB0byBudWxscHRyCisgICAgLy8gYW5kIHRoZSBhY3RpdmVfd29ya2VyIGhhcyBiZWVuIHVwZGF0ZWQgdG8gdGhlIHByZXZpb3VzIHdhaXRpbmdfd29ya2VyLgorICAgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5QZXJzaXN0UmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbi0+c3RvcmFnZV9rZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24tPnNjb3BlX3VybCgpKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpOb3RpZnlDb250cm9sbGVyQ2hhbmdlKHdlYjo6Q29udGV4dCogY2xpZW50KSB7CisgIC8vIEFsZ29yaXRobSBmb3IgTm90aWZ5IENvbnRyb2xsZXIgQ2hhbmdlOgorICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNub3RpZnktY29udHJvbGxlci1jaGFuZ2UtYWxnb3JpdGhtCisgIC8vIDEuIEFzc2VydDogY2xpZW50IGlzIG5vdCBudWxsLgorICBEQ0hFQ0soY2xpZW50KTsKKworICAvLyAyLiBJZiBjbGllbnQgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0LCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbgorICAvLyAgICBldmVudCBuYW1lZCBjb250cm9sbGVyY2hhbmdlIGF0IHRoZSBTZXJ2aWNlV29ya2VyQ29udGFpbmVyIG9iamVjdCB0aGF0CisgIC8vICAgIGNsaWVudCBpcyBhc3NvY2lhdGVkIHdpdGguCisgIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAorICAgICAgICAgICAgICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bmF2aWdhdG9yX2Jhc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkRpc3BhdGNoRXZlbnQobmV3IHdlYjo6RXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VG9rZW5zOjpjb250cm9sbGVyY2hhbmdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICBjbGllbnQpKTsKK30KKworYm9vbCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6U2VydmljZVdvcmtlckhhc05vUGVuZGluZ0V2ZW50cygKKyAgICBTZXJ2aWNlV29ya2VyT2JqZWN0KiB3b3JrZXIpIHsKKyAgLy8gQWxnb3JpdGhtIGZvciBTZXJ2aWNlIFdvcmtlciBIYXMgTm8gUGVuZGluZyBFdmVudHMKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzZXJ2aWNlLXdvcmtlci1oYXMtbm8tcGVuZGluZy1ldmVudHMKKyAgLy8gVE9ETyhiLzI0MDE3NDI0NSk6IEltcGxlbWVudCB0aGlzIHVzaW5nIHRoZSAnc2V0IG9mIGV4dGVuZGVkIGV2ZW50cycuCisgIE5PVElNUExFTUVOVEVEKCk7CisKKyAgLy8gMS4gRm9yIGVhY2ggZXZlbnQgb2Ygd29ya2Vy4oCZcyBzZXQgb2YgZXh0ZW5kZWQgZXZlbnRzOgorICAvLyAxLjEuIElmIGV2ZW50IGlzIGFjdGl2ZSwgcmV0dXJuIGZhbHNlLgorICAvLyAyLiBSZXR1cm4gdHJ1ZS4KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OkNsZWFyUmVnaXN0cmF0aW9uKAorICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbikgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJDb250ZXh0OjpDbGVhclJlZ2lzdHJhdGlvbigpIik7CisgIC8vIEFsZ29yaXRobSBmb3IgQ2xlYXIgUmVnaXN0cmF0aW9uOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2NsZWFyLXJlZ2lzdHJhdGlvbi1hbGdvcml0aG0KKyAgLy8gMS4gUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXRvbWljYWxseS4KKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICAvLyAyLiBJZiByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcgd29ya2VyIGlzIG5vdCBudWxsLCB0aGVuOgorICBTZXJ2aWNlV29ya2VyT2JqZWN0KiBpbnN0YWxsaW5nX3dvcmtlciA9IHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKTsKKyAgaWYgKGluc3RhbGxpbmdfd29ya2VyKSB7CisgICAgLy8gMi4xLiBUZXJtaW5hdGUgcmVnaXN0cmF0aW9u4oCZcyBpbnN0YWxsaW5nIHdvcmtlci4KKyAgICBUZXJtaW5hdGVTZXJ2aWNlV29ya2VyKGluc3RhbGxpbmdfd29ya2VyKTsKKyAgICAvLyAyLjIuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzCisgICAgLy8gICAgICBpbnN0YWxsaW5nIHdvcmtlciBhbmQgInJlZHVuZGFudCIgYXMgdGhlIGFyZ3VtZW50cy4KKyAgICBVcGRhdGVXb3JrZXJTdGF0ZShpbnN0YWxsaW5nX3dvcmtlciwga1NlcnZpY2VXb3JrZXJTdGF0ZVJlZHVuZGFudCk7CisgICAgLy8gMi4zLiBSdW4gdGhlIFVwZGF0ZSBSZWdpc3RyYXRpb24gU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9uLAorICAgIC8vICAgICAgImluc3RhbGxpbmciIGFuZCBudWxsIGFzIHRoZSBhcmd1bWVudHMuCisgICAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrSW5zdGFsbGluZywgbnVsbHB0cik7CisgIH0KKworICAvLyAzLiBJZiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG5vdCBudWxsLCB0aGVuOgorICBTZXJ2aWNlV29ya2VyT2JqZWN0KiB3YWl0aW5nX3dvcmtlciA9IHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKTsKKyAgaWYgKHdhaXRpbmdfd29ya2VyKSB7CisgICAgLy8gMy4xLiBUZXJtaW5hdGUgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlci4KKyAgICBUZXJtaW5hdGVTZXJ2aWNlV29ya2VyKHdhaXRpbmdfd29ya2VyKTsKKyAgICAvLyAzLjIuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzCisgICAgLy8gICAgICB3YWl0aW5nIHdvcmtlciBhbmQgInJlZHVuZGFudCIgYXMgdGhlIGFyZ3VtZW50cy4KKyAgICBVcGRhdGVXb3JrZXJTdGF0ZSh3YWl0aW5nX3dvcmtlciwga1NlcnZpY2VXb3JrZXJTdGF0ZVJlZHVuZGFudCk7CisgICAgLy8gMy4zLiBSdW4gdGhlIFVwZGF0ZSBSZWdpc3RyYXRpb24gU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9uLAorICAgIC8vICAgICAgIndhaXRpbmciIGFuZCBudWxsIGFzIHRoZSBhcmd1bWVudHMuCisgICAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrV2FpdGluZywgbnVsbHB0cik7CisgIH0KKworICAvLyA0LiBJZiByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIgaXMgbm90IG51bGwsIHRoZW46CisgIFNlcnZpY2VXb3JrZXJPYmplY3QqIGFjdGl2ZV93b3JrZXIgPSByZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKTsKKyAgaWYgKGFjdGl2ZV93b3JrZXIpIHsKKyAgICAvLyA0LjEuIFRlcm1pbmF0ZSByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIuCisgICAgVGVybWluYXRlU2VydmljZVdvcmtlcihhY3RpdmVfd29ya2VyKTsKKyAgICAvLyA0LjIuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzCisgICAgLy8gICAgICBhY3RpdmUgd29ya2VyIGFuZCAicmVkdW5kYW50IiBhcyB0aGUgYXJndW1lbnRzLgorICAgIFVwZGF0ZVdvcmtlclN0YXRlKGFjdGl2ZV93b3JrZXIsIGtTZXJ2aWNlV29ya2VyU3RhdGVSZWR1bmRhbnQpOworICAgIC8vIDQuMy4gUnVuIHRoZSBVcGRhdGUgUmVnaXN0cmF0aW9uIFN0YXRlIGFsZ29yaXRobSBwYXNzaW5nIHJlZ2lzdHJhdGlvbiwKKyAgICAvLyAgICAgICJhY3RpdmUiIGFuZCBudWxsIGFzIHRoZSBhcmd1bWVudHMuCisgICAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrQWN0aXZlLCBudWxscHRyKTsKKyAgfQorCisgIC8vIFBlcnNpc3QgcmVnaXN0cmF0aW9uIHNpbmNlIHRoZSB3YWl0aW5nX3dvcmtlciBhbmQgYWN0aXZlX3dvcmtlciBoYXZlCisgIC8vIGJlZW4gdXBkYXRlZCB0byBudWxscHRyLiBUaGlzIHdpbGwgcmVtb3ZlIGFueSBwZXJzaXN0ZWQgcmVnaXN0cmF0aW9uCisgIC8vIGlmIG9uZSBleGlzdHMuCisgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5QZXJzaXN0UmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbi0+c3RvcmFnZV9rZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLT5zY29wZV91cmwoKSk7Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OlRyeUNsZWFyUmVnaXN0cmF0aW9uKAorICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbikgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwKKyAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VyQ29udGV4dDo6VHJ5Q2xlYXJSZWdpc3RyYXRpb24oKSIpOworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICAvLyBBbGdvcml0aG0gZm9yIFRyeSBDbGVhciBSZWdpc3RyYXRpb246CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdHJ5LWNsZWFyLXJlZ2lzdHJhdGlvbi1hbGdvcml0aG0KKworICAvLyAxLiBJbnZva2UgQ2xlYXIgUmVnaXN0cmF0aW9uIHdpdGggcmVnaXN0cmF0aW9uIGlmIG5vIHNlcnZpY2Ugd29ya2VyIGNsaWVudAorICAvLyBpcyB1c2luZyByZWdpc3RyYXRpb24gYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6CisgIGlmIChJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbikpIHJldHVybjsKKworICAvLyAgICAuIHJlZ2lzdHJhdGlvbuKAmXMgaW5zdGFsbGluZyB3b3JrZXIgaXMgbnVsbCBvciB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKKyAgLy8gICAgICBTZXJ2aWNlIFdvcmtlciBIYXMgTm8gUGVuZGluZyBFdmVudHMgd2l0aCByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcKKyAgLy8gICAgICB3b3JrZXIgaXMgdHJ1ZS4KKyAgaWYgKHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKSAmJgorICAgICAgIVNlcnZpY2VXb3JrZXJIYXNOb1BlbmRpbmdFdmVudHMocmVnaXN0cmF0aW9uLT5pbnN0YWxsaW5nX3dvcmtlcigpKSkKKyAgICByZXR1cm47CisKKyAgLy8gICAgLiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG51bGwgb3IgdGhlIHJlc3VsdCBvZiBydW5uaW5nCisgIC8vICAgICAgU2VydmljZSBXb3JrZXIgSGFzIE5vIFBlbmRpbmcgRXZlbnRzIHdpdGggcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nCisgIC8vICAgICAgd29ya2VyIGlzIHRydWUuCisgIGlmIChyZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCkgJiYKKyAgICAgICFTZXJ2aWNlV29ya2VySGFzTm9QZW5kaW5nRXZlbnRzKHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSkpCisgICAgcmV0dXJuOworCisgIC8vICAgIC4gcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyIGlzIG51bGwgb3IgdGhlIHJlc3VsdCBvZiBydW5uaW5nCisgIC8vICAgICAgU2VydmljZVdvcmtlciBIYXMgTm8gUGVuZGluZyBFdmVudHMgd2l0aCByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIKKyAgLy8gICAgICBpcyB0cnVlLgorICBpZiAocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkgJiYKKyAgICAgICFTZXJ2aWNlV29ya2VySGFzTm9QZW5kaW5nRXZlbnRzKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSkKKyAgICByZXR1cm47CisKKyAgQ2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6VXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUoCisgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uLCBSZWdpc3RyYXRpb25TdGF0ZSB0YXJnZXQsCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiYgc291cmNlKSB7CisgIFRSQUNFX0VWRU5UMigiY29iYWx0Ojp3b3JrZXIiLAorICAgICAgICAgICAgICAgIlNlcnZpY2VXb3JrZXJDb250ZXh0OjpVcGRhdGVSZWdpc3RyYXRpb25TdGF0ZSgpIiwgInRhcmdldCIsCisgICAgICAgICAgICAgICB0YXJnZXQsICJzb3VyY2UiLCBzb3VyY2UpOworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0socmVnaXN0cmF0aW9uKTsKKyAgLy8gQWxnb3JpdGhtIGZvciBVcGRhdGUgUmVnaXN0cmF0aW9uIFN0YXRlOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3VwZGF0ZS1yZWdpc3RyYXRpb24tc3RhdGUtYWxnb3JpdGhtCisKKyAgLy8gMS4gTGV0IHJlZ2lzdHJhdGlvbk9iamVjdHMgYmUgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlCisgIC8vICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggcmVnaXN0cmF0aW9uLgorICAvLyBUaGlzIGlzIGltcGxlbWVudGVkIHdpdGggYSBjYWxsIHRvIExvb2t1cFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24gZm9yIGVhY2gKKyAgLy8gcmVnaXN0ZXJlZCB3ZWIgY29udGV4dC4KKworICBzd2l0Y2ggKHRhcmdldCkgeworICAgIC8vIDIuIElmIHRhcmdldCBpcyAiaW5zdGFsbGluZyIsIHRoZW46CisgICAgY2FzZSBrSW5zdGFsbGluZzogeworICAgICAgLy8gMi4xLiBTZXQgcmVnaXN0cmF0aW9u4oCZcyBpbnN0YWxsaW5nIHdvcmtlciB0byBzb3VyY2UuCisgICAgICByZWdpc3RyYXRpb24tPnNldF9pbnN0YWxsaW5nX3dvcmtlcihzb3VyY2UpOworICAgICAgLy8gMi4yLiBGb3IgZWFjaCByZWdpc3RyYXRpb25PYmplY3QgaW4gcmVnaXN0cmF0aW9uT2JqZWN0czoKKyAgICAgIGZvciAoYXV0byYgY29udGV4dCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7CisgICAgICAgIC8vIDIuMi4xLiBRdWV1ZSBhIHRhc2sgdG8uLi4KKyAgICAgICAgY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RCbG9ja2luZ1Rhc2soCisgICAgICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgICAgICBiYXNlOjpCaW5kKAorICAgICAgICAgICAgICAgIFtdKHdlYjo6Q29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgIC8vIDIuMi4xLiAuLi4gc2V0IHRoZSBpbnN0YWxsaW5nIGF0dHJpYnV0ZSBvZgorICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbk9iamVjdCB0byBudWxsIGlmIHJlZ2lzdHJhdGlvbuKAmXMKKyAgICAgICAgICAgICAgICAgIC8vICAgICAgICBpbnN0YWxsaW5nIHdvcmtlciBpcyBudWxsLCBvciB0aGUgcmVzdWx0IG9mIGdldHRpbmcKKyAgICAgICAgICAgICAgICAgIC8vICAgICAgICB0aGUgc2VydmljZSB3b3JrZXIgb2JqZWN0IHRoYXQgcmVwcmVzZW50cworICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbuKAmXMgaW5zdGFsbGluZyB3b3JrZXIgaW4KKyAgICAgICAgICAgICAgICAgIC8vICAgICAgICByZWdpc3RyYXRpb25PYmplY3TigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgIGF1dG8gcmVnaXN0cmF0aW9uX29iamVjdCA9CisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+TG9va3VwU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pOworICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbl9vYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uX29iamVjdC0+c2V0X2luc3RhbGxpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRTZXJ2aWNlV29ya2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKSkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgY29udGV4dCwgYmFzZTo6VW5yZXRhaW5lZChyZWdpc3RyYXRpb24pKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gMy4gRWxzZSBpZiB0YXJnZXQgaXMgIndhaXRpbmciLCB0aGVuOgorICAgIGNhc2Uga1dhaXRpbmc6IHsKKyAgICAgIC8vIDMuMS4gU2V0IHJlZ2lzdHJhdGlvbuKAmXMgd2FpdGluZyB3b3JrZXIgdG8gc291cmNlLgorICAgICAgcmVnaXN0cmF0aW9uLT5zZXRfd2FpdGluZ193b3JrZXIoc291cmNlKTsKKyAgICAgIC8vIDMuMi4gRm9yIGVhY2ggcmVnaXN0cmF0aW9uT2JqZWN0IGluIHJlZ2lzdHJhdGlvbk9iamVjdHM6CisgICAgICBmb3IgKGF1dG8mIGNvbnRleHQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgeworICAgICAgICAvLyAzLjIuMS4gUXVldWUgYSB0YXNrIHRvLi4uCisgICAgICAgIGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICAgICAgYmFzZTo6QmluZCgKKyAgICAgICAgICAgICAgICBbXSh3ZWI6OkNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAvLyAzLjIuMS4gLi4uIHNldCB0aGUgd2FpdGluZyBhdHRyaWJ1dGUgb2YgcmVnaXN0cmF0aW9uT2JqZWN0CisgICAgICAgICAgICAgICAgICAvLyAgICAgICAgdG8gbnVsbCBpZiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG51bGwsIG9yCisgICAgICAgICAgICAgICAgICAvLyAgICAgICAgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIHRoZSBzZXJ2aWNlIHdvcmtlciBvYmplY3QgdGhhdAorICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlcHJlc2VudHMgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlciBpbgorICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbk9iamVjdOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgYXV0byByZWdpc3RyYXRpb25fb2JqZWN0ID0KKyAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5Mb29rdXBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7CisgICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uX29iamVjdCkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25fb2JqZWN0LT5zZXRfd2FpdGluZyhjb250ZXh0LT5HZXRTZXJ2aWNlV29ya2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpKSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBjb250ZXh0LCBiYXNlOjpVbnJldGFpbmVkKHJlZ2lzdHJhdGlvbikpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyA0LiBFbHNlIGlmIHRhcmdldCBpcyAiYWN0aXZlIiwgdGhlbjoKKyAgICBjYXNlIGtBY3RpdmU6IHsKKyAgICAgIC8vIDQuMS4gU2V0IHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciB0byBzb3VyY2UuCisgICAgICByZWdpc3RyYXRpb24tPnNldF9hY3RpdmVfd29ya2VyKHNvdXJjZSk7CisgICAgICAvLyA0LjIuIEZvciBlYWNoIHJlZ2lzdHJhdGlvbk9iamVjdCBpbiByZWdpc3RyYXRpb25PYmplY3RzOgorICAgICAgZm9yIChhdXRvJiBjb250ZXh0IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKKyAgICAgICAgLy8gNC4yLjEuIFF1ZXVlIGEgdGFzayB0by4uLgorICAgICAgICBjb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdEJsb2NraW5nVGFzaygKKyAgICAgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgICAgIGJhc2U6OkJpbmQoCisgICAgICAgICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbikgeworICAgICAgICAgICAgICAgICAgLy8gNC4yLjEuIC4uLiBzZXQgdGhlIGFjdGl2ZSBhdHRyaWJ1dGUgb2YgcmVnaXN0cmF0aW9uT2JqZWN0CisgICAgICAgICAgICAgICAgICAvLyAgICAgICAgdG8gbnVsbCBpZiByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIgaXMgbnVsbCwgb3IKKyAgICAgICAgICAgICAgICAgIC8vICAgICAgICB0aGUgcmVzdWx0IG9mIGdldHRpbmcgdGhlIHNlcnZpY2Ugd29ya2VyIG9iamVjdCB0aGF0CisgICAgICAgICAgICAgICAgICAvLyAgICAgICAgcmVwcmVzZW50cyByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIgaW4KKyAgICAgICAgICAgICAgICAgIC8vICAgICAgICByZWdpc3RyYXRpb25PYmplY3TigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgIGF1dG8gcmVnaXN0cmF0aW9uX29iamVjdCA9CisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+TG9va3VwU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pOworICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbl9vYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uX29iamVjdC0+c2V0X2FjdGl2ZShjb250ZXh0LT5HZXRTZXJ2aWNlV29ya2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGNvbnRleHQsIGJhc2U6OlVucmV0YWluZWQocmVnaXN0cmF0aW9uKSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgIH0KK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6VXBkYXRlV29ya2VyU3RhdGUoU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlclN0YXRlIHN0YXRlKSB7CisgIFRSQUNFX0VWRU5UMSgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckNvbnRleHQ6OlVwZGF0ZVdvcmtlclN0YXRlKCkiLAorICAgICAgICAgICAgICAgInN0YXRlIiwgc3RhdGUpOworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0sod29ya2VyKTsKKyAgaWYgKCF3b3JrZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gQWxnb3JpdGhtIGZvciBVcGRhdGUgV29ya2VyIFN0YXRlOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3VwZGF0ZS1zdGF0ZS1hbGdvcml0aG0KKyAgLy8gMS4gQXNzZXJ0OiBzdGF0ZSBpcyBub3QgInBhcnNlZCIuCisgIERDSEVDS19ORShrU2VydmljZVdvcmtlclN0YXRlUGFyc2VkLCBzdGF0ZSk7CisgIC8vIDIuIFNldCB3b3JrZXIncyBzdGF0ZSB0byBzdGF0ZS4KKyAgd29ya2VyLT5zZXRfc3RhdGUoc3RhdGUpOworICBhdXRvIHdvcmtlcl9vcmlnaW4gPSBsb2FkZXI6Ok9yaWdpbih3b3JrZXItPnNjcmlwdF91cmwoKSk7CisgIC8vIDMuIExldCBzZXR0aW5nc09iamVjdHMgYmUgYWxsIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdHMgd2hvc2Ugb3JpZ2luIGlzCisgIC8vICAgIHdvcmtlcidzIHNjcmlwdCB1cmwncyBvcmlnaW4uCisgIC8vIDQuIEZvciBlYWNoIHNldHRpbmdzT2JqZWN0IG9mIHNldHRpbmdzT2JqZWN0cy4uLgorICBmb3IgKGF1dG8mIGNvbnRleHQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgeworICAgIGlmIChjb250ZXh0LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpLT5HZXRPcmlnaW4oKSA9PSB3b3JrZXJfb3JpZ2luKSB7CisgICAgICAvLyA0LiAuLi4gcXVldWUgYSB0YXNrIG9uCisgICAgICAvLyAgICBzZXR0aW5nc09iamVjdCdzIHJlc3BvbnNpYmxlIGV2ZW50IGxvb3AgaW4gdGhlIERPTSBtYW5pcHVsYXRpb24gdGFzaworICAgICAgLy8gICAgc291cmNlIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAgY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RCbG9ja2luZ1Rhc2soCisgICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgIFtdKHdlYjo6Q29udGV4dCogY29udGV4dCwgU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VXb3JrZXJTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgRENIRUNLX0VRKGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNC4xLiBMZXQgb2JqZWN0TWFwIGJlIHNldHRpbmdzT2JqZWN0J3Mgc2VydmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VyIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBtYXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LjIuIElmIG9iamVjdE1hcFt3b3JrZXJdIGRvZXMgbm90IGV4aXN0LCB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm9ydCB0aGVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBzdGVwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQuMy4gTGV0ICB3b3JrZXJPYmogYmUgb2JqZWN0TWFwW3dvcmtlcl0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHdvcmtlcl9vYmogPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkxvb2t1cFNlcnZpY2VXb3JrZXIod29ya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZXJfb2JqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQuNC4gU2V0IHdvcmtlck9iaidzIHN0YXRlIHRvIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfb2JqLT5zZXRfc3RhdGUoc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LjUuIEZpcmUgYW4gZXZlbnQgbmFtZWQgc3RhdGVjaGFuZ2UgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VyT2JqLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfb2JqLT5EaXNwYXRjaEV2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHdlYjo6RXZlbnQoYmFzZTo6VG9rZW5zOjpzdGF0ZWNoYW5nZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBiYXNlOjpVbnJldGFpbmVkKHdvcmtlciksIHN0YXRlKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OkhhbmRsZVNlcnZpY2VXb3JrZXJDbGllbnRVbmxvYWQoCisgICAgd2ViOjpDb250ZXh0KiBjbGllbnQpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsCisgICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckNvbnRleHQ6OkhhbmRsZVNlcnZpY2VXb3JrZXJDbGllbnRVbmxvYWQoKSIpOworICAvLyBBbGdvcml0aG0gZm9yIEhhbmRsZSBTZXJ2aWNlciBXb3JrZXIgQ2xpZW50IFVubG9hZDoKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNvbi1jbGllbnQtdW5sb2FkLWFsZ29yaXRobQorICBEQ0hFQ0soY2xpZW50KTsKKyAgLy8gMS4gUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXRvbWljYWxseS4KKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICAvLyAyLiBMZXQgcmVnaXN0cmF0aW9uIGJlIHRoZSBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb24gdXNlZCBieSBjbGllbnQuCisgIC8vIDMuIElmIHJlZ2lzdHJhdGlvbiBpcyBudWxsLCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgU2VydmljZVdvcmtlck9iamVjdCogYWN0aXZlX3NlcnZpY2Vfd29ya2VyID0gY2xpZW50LT5hY3RpdmVfc2VydmljZV93b3JrZXIoKTsKKyAgaWYgKCFhY3RpdmVfc2VydmljZV93b3JrZXIpIHJldHVybjsKKyAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uID0KKyAgICAgIGFjdGl2ZV9zZXJ2aWNlX3dvcmtlci0+Y29udGFpbmluZ19zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24oKTsKKyAgaWYgKCFyZWdpc3RyYXRpb24pIHJldHVybjsKKworICAvLyA0LiBJZiBhbnkgb3RoZXIgc2VydmljZSB3b3JrZXIgY2xpZW50IGlzIHVzaW5nIHJlZ2lzdHJhdGlvbiwgYWJvcnQgdGhlc2UKKyAgLy8gICAgc3RlcHMuCisgIC8vIEVuc3VyZSB0aGUgY2xpZW50IGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyYXRpb25zIHdoZW4gdGhpcyBydW5zLgorICBEQ0hFQ0sod2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18uZW5kKCkgPT0KKyAgICAgICAgIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmZpbmQoY2xpZW50KSk7CisgIGlmIChJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbikpIHJldHVybjsKKworICAvLyA1LiBJZiByZWdpc3RyYXRpb24gaXMgdW5yZWdpc3RlcmVkLCBpbnZva2UgVHJ5IENsZWFyIFJlZ2lzdHJhdGlvbiB3aXRoCisgIC8vICAgIHJlZ2lzdHJhdGlvbi4KKyAgaWYgKHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfICYmCisgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+SXNVbnJlZ2lzdGVyZWQocmVnaXN0cmF0aW9uKSkgeworICAgIFRyeUNsZWFyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7CisgIH0KKworICAvLyA2LiBJbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGggcmVnaXN0cmF0aW9uLgorICBUcnlBY3RpdmF0ZShyZWdpc3RyYXRpb24pOworfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpUZXJtaW5hdGVTZXJ2aWNlV29ya2VyKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlcikgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwKKyAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VyQ29udGV4dDo6VGVybWluYXRlU2VydmljZVdvcmtlcigpIik7CisgIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIC8vIEFsZ29yaXRobSBmb3IgVGVybWluYXRlIFNlcnZpY2UgV29ya2VyOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3Rlcm1pbmF0ZS1zZXJ2aWNlLXdvcmtlcgorICAvLyAxLiBSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyBpbiBwYXJhbGxlbCB3aXRoIHNlcnZpY2VXb3JrZXLigJlzIG1haW4gbG9vcDoKKyAgLy8gVGhpcyBydW5zIGluIHRoZSBTZXJ2aWNlV29ya2VyUmVnaXN0cnkgdGhyZWFkLgorICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIC8vIDEuMS4gTGV0IHNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZSBiZSBzZXJ2aWNlV29ya2Vy4oCZcyBnbG9iYWwgb2JqZWN0LgorICBXb3JrZXJHbG9iYWxTY29wZSogc2VydmljZV93b3JrZXJfZ2xvYmFsX3Njb3BlID0KKyAgICAgIHdvcmtlci0+d29ya2VyX2dsb2JhbF9zY29wZSgpOworCisgIC8vIDEuMi4gU2V0IHNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZeKAmXMgY2xvc2luZyBmbGFnIHRvIHRydWUuCisgIGlmIChzZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUgIT0gbnVsbHB0cikKKyAgICBzZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUtPnNldF9jbG9zaW5nX2ZsYWcodHJ1ZSk7CisKKyAgLy8gMS4zLiBSZW1vdmUgYWxsIHRoZSBpdGVtcyBmcm9tIHNlcnZpY2VXb3JrZXLigJlzIHNldCBvZiBleHRlbmRlZCBldmVudHMuCisgIC8vIFRPRE8oYi8yNDAxNzQyNDUpOiBJbXBsZW1lbnQgJ3NldCBvZiBleHRlbmRlZCBldmVudHMnLgorCisgIC8vIDEuNC4gSWYgdGhlcmUgYXJlIGFueSB0YXNrcywgd2hvc2UgdGFzayBzb3VyY2UgaXMgZWl0aGVyIHRoZSBoYW5kbGUgZmV0Y2gKKyAgLy8gICAgICB0YXNrIHNvdXJjZSBvciB0aGUgaGFuZGxlIGZ1bmN0aW9uYWwgZXZlbnQgdGFzayBzb3VyY2UsIHF1ZXVlZCBpbgorICAvLyAgICAgIHNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZeKAmXMgZXZlbnQgbG9vcOKAmXMgdGFzayBxdWV1ZXMsIHF1ZXVlIHRoZW0gdG8KKyAgLy8gICAgICBzZXJ2aWNlV29ya2Vy4oCZcyBjb250YWluaW5nIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbuKAmXMgY29ycmVzcG9uZGluZworICAvLyAgICAgIHRhc2sgcXVldWVzIGluIHRoZSBzYW1lIG9yZGVyIHVzaW5nIHRoZWlyIG9yaWdpbmFsIHRhc2sgc291cmNlcywgYW5kCisgIC8vICAgICAgZGlzY2FyZCBhbGwgdGhlIHRhc2tzIChpbmNsdWRpbmcgdGFza3Mgd2hvc2UgdGFzayBzb3VyY2UgaXMgbmVpdGhlcgorICAvLyAgICAgIHRoZSBoYW5kbGUgZmV0Y2ggdGFzayBzb3VyY2Ugbm9yIHRoZSBoYW5kbGUgZnVuY3Rpb25hbCBldmVudCB0YXNrCisgIC8vICAgICAgc291cmNlKSBmcm9tIHNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZeKAmXMgZXZlbnQgbG9vcOKAmXMgdGFzayBxdWV1ZXMKKyAgLy8gICAgICB3aXRob3V0IHByb2Nlc3NpbmcgdGhlbS4KKyAgLy8gVE9ETyhiLzIzNDc4NzY0MSk6IFF1ZXVlIHRhc2tzIHRvIHRoZSByZWdpc3RyYXRpb24uCisKKyAgLy8gTm90ZTogVGhpcyBzdGVwIGlzIG5vdCBpbiB0aGUgc3BlYywgYnV0IHdpdGhvdXQgdGhpcyBzdGVwIHRoZSBzZXJ2aWNlCisgIC8vIHdvcmtlciBvYmplY3QgbWFwIHdpbGwgYWx3YXlzIGtlZXAgYW4gZW50cnkgd2l0aCBhIHNlcnZpY2Ugd29ya2VyIGluc3RhbmNlCisgIC8vIGZvciB0aGUgdGVybWluYXRlZCBzZXJ2aWNlIHdvcmtlciwgd2hpY2ggYmVzaWRlcyBsZWFraW5nIG1lbW9yeSBjYW4gbGVhZCB0bworICAvLyB1bmV4cGVjdGVkIGJlaGF2aW9yIHdoZW4gbmV3IHNlcnZpY2Ugd29ya2VyIG9iamVjdHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUKKyAgLy8gc2FtZSBrZXkgZm9yIHRoZSBzZXJ2aWNlIHdvcmtlciBvYmplY3QgbWFwICh3aGljaCBpbiBDb2JhbHQncyBjYXNlCisgIC8vIGhhcHBlbnMgd2hlbiBhIG5ldyBzZXJ2aWNlIHdvcmtlciBvYmplY3QgaXMgY29uc3RydWN0ZWQgYXQgdGhlIHNhbWUKKyAgLy8gbWVtb3J5IGFkZHJlc3MpLgorICBmb3IgKGF1dG8mIGNvbnRleHQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgeworICAgIGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoCisgICAgICAgICAgICAgICAgICAgICAgIFtdKHdlYjo6Q29udGV4dCogY29udGV4dCwgU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byB3b3JrZXJfb2JqID0gY29udGV4dC0+TG9va3VwU2VydmljZVdvcmtlcih3b3JrZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZXJfb2JqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfb2JqLT5zZXRfc3RhdGUoa1NlcnZpY2VXb3JrZXJTdGF0ZVJlZHVuZGFudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfb2JqLT5EaXNwYXRjaEV2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyB3ZWI6OkV2ZW50KGJhc2U6OlRva2Vuczo6c3RhdGVjaGFuZ2UoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5SZW1vdmVTZXJ2aWNlV29ya2VyKHdvcmtlcik7CisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGJhc2U6OlVucmV0YWluZWQod29ya2VyKSkpOworICB9CisKKyAgLy8gMS41LiBBYm9ydCB0aGUgc2NyaXB0IGN1cnJlbnRseSBydW5uaW5nIGluIHNlcnZpY2VXb3JrZXIuCisgIGlmICh3b3JrZXItPmlzX3J1bm5pbmcoKSkgeworICAgIHdvcmtlci0+QWJvcnQoKTsKKyAgfQorCisgIC8vIDEuNi4gU2V0IHNlcnZpY2VXb3JrZXLigJlzIHN0YXJ0IHN0YXR1cyB0byBudWxsLgorICB3b3JrZXItPnNldF9zdGFydF9zdGF0dXMobnVsbHB0cik7Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6Ok1heWJlUmVzb2x2ZVJlYWR5UHJvbWlzZVN1YlN0ZXBzKAorICAgIHdlYjo6Q29udGV4dCogY2xpZW50KSB7CisgIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIC8vIEFsZ29yaXRobSBmb3IgU3ViIHN0ZXBzIG9mIFNlcnZpY2VXb3JrZXJDb250YWluZXIucmVhZHkoKToKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNuYXZpZ2F0b3Itc2VydmljZS13b3JrZXItcmVhZHkKKworICAvLyAgICAzLjEuIExldCBjbGllbnQgYnkgdGhpcydzIHNlcnZpY2Ugd29ya2VyIGNsaWVudC4KKyAgLy8gICAgMy4yLiBMZXQgc3RvcmFnZSBrZXkgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIG9idGFpbiBhIHN0b3JhZ2UKKyAgLy8gICAgICAgICBrZXkgZ2l2ZW4gY2xpZW50LgorICB1cmw6Ok9yaWdpbiBzdG9yYWdlX2tleSA9IGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+T2J0YWluU3RvcmFnZUtleSgpOworICAvLyAgICAzLjMuIExldCByZWdpc3RyYXRpb24gYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIE1hdGNoIFNlcnZpY2UKKyAgLy8gICAgICAgICBXb3JrZXIgUmVnaXN0cmF0aW9uIGdpdmVuIHN0b3JhZ2Uga2V5IGFuZCBjbGllbnTigJlzCisgIC8vICAgICAgICAgY3JlYXRpb24gVVJMLgorICAvLyBUT0RPKGIvMjM0NjU5ODUxKTogSW52ZXN0aWdhdGUgd2hldGhlciB0aGlzIHNob3VsZCB1c2UgdGhlIGNyZWF0aW9uIFVSTAorICAvLyBkaXJlY3RseSBpbnN0ZWFkLgorICBjb25zdCBHVVJMJiBiYXNlX3VybCA9IGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y3JlYXRpb25fdXJsKCk7CisgIEdVUkwgY2xpZW50X3VybCA9IGJhc2VfdXJsLlJlc29sdmUoIiIpOworICBzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+IHJlZ2lzdHJhdGlvbiA9CisgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHN0b3JhZ2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfdXJsKTsKKyAgLy8gICAgMy4zLiBJZiByZWdpc3RyYXRpb24gaXMgbm90IG51bGwsIGFuZCByZWdpc3RyYXRpb27igJlzIGFjdGl2ZQorICAvLyAgICAgICAgIHdvcmtlciBpcyBub3QgbnVsbCwgcXVldWUgYSB0YXNrIG9uIHJlYWR5UHJvbWlzZeKAmXMKKyAgLy8gICAgICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyByZXNwb25zaWJsZSBldmVudCBsb29wLCB1c2luZworICAvLyAgICAgICAgIHRoZSBET00gbWFuaXB1bGF0aW9uIHRhc2sgc291cmNlLCB0byByZXNvbHZlIHJlYWR5UHJvbWlzZQorICAvLyAgICAgICAgIHdpdGggdGhlIHJlc3VsdCBvZiBnZXR0aW5nIHRoZSBzZXJ2aWNlIHdvcmtlcgorICAvLyAgICAgICAgIHJlZ2lzdHJhdGlvbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHJlZ2lzdHJhdGlvbiBpbgorICAvLyAgICAgICAgIHJlYWR5UHJvbWlzZeKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgorICBpZiAocmVnaXN0cmF0aW9uICYmIHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSB7CisgICAgY2xpZW50LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250YWluZXI6Ok1heWJlUmVzb2x2ZVJlYWR5UHJvbWlzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjbGllbnQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm5hdmlnYXRvcl9iYXNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbikpOworICB9Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OkdldFJlZ2lzdHJhdGlvblN1YlN0ZXBzKAorICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgY29uc3QgR1VSTCYgY2xpZW50X3VybCwKKyAgICB3ZWI6OkNvbnRleHQqIGNsaWVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KKyAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsCisgICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckNvbnRleHQ6OkdldFJlZ2lzdHJhdGlvblN1YlN0ZXBzKCkiKTsKKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgLy8gQWxnb3JpdGhtIGZvciBTdWIgc3RlcHMgb2YgU2VydmljZVdvcmtlckNvbnRhaW5lci5nZXRSZWdpc3RyYXRpb24oKToKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNuYXZpZ2F0b3Itc2VydmljZS13b3JrZXItZ2V0UmVnaXN0cmF0aW9uCisKKyAgLy8gOC4xLiBMZXQgcmVnaXN0cmF0aW9uIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBNYXRjaCBTZXJ2aWNlIFdvcmtlcgorICAvLyAgICAgIFJlZ2lzdHJhdGlvbiBhbGdvcml0aG0gd2l0aCBjbGllbnRVUkwgYXMgaXRzIGFyZ3VtZW50LgorICBzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+IHJlZ2lzdHJhdGlvbiA9CisgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHN0b3JhZ2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfdXJsKTsKKyAgLy8gOC4yLiBJZiByZWdpc3RyYXRpb24gaXMgbnVsbCwgcmVzb2x2ZSBwcm9taXNlIHdpdGggdW5kZWZpbmVkIGFuZCBhYm9ydAorICAvLyAgICAgIHRoZXNlIHN0ZXBzLgorICAvLyA4LjMuIFJlc29sdmUgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc2VydmljZSB3b3JrZXIKKyAgLy8gICAgICByZWdpc3RyYXRpb24gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyByZWdpc3RyYXRpb24gaW4gcHJvbWlzZeKAmXMKKyAgLy8gICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuCisgIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjbGllbnQsCisgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+IHByb21pc2UsCisgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiByZWdpc3RyYXRpb24pIHsKKyAgICAgICAgICAgIFRSQUNFX0VWRU5UMCgKKyAgICAgICAgICAgICAgICAiY29iYWx0Ojp3b3JrZXIiLAorICAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VyQ29udGV4dDo6R2V0UmVnaXN0cmF0aW9uU3ViU3RlcHMoKSBSZXNvbHZlIik7CisgICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoCisgICAgICAgICAgICAgICAgY2xpZW50LT5HZXRTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbikpOworICAgICAgICAgIH0sCisgICAgICAgICAgY2xpZW50LCBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpLCByZWdpc3RyYXRpb24pKTsKK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6R2V0UmVnaXN0cmF0aW9uc1N1YlN0ZXBzKAorICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgd2ViOjpDb250ZXh0KiBjbGllbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KKyAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0Pj4KKyAgICAgIHJlZ2lzdHJhdGlvbl9vYmplY3RzID0KKyAgICAgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+R2V0UmVnaXN0cmF0aW9ucyhzdG9yYWdlX2tleSk7CisgIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjbGllbnQsCisgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KKyAgICAgICAgICAgICAgICAgcHJvbWlzZSwKKyAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+PgorICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25fb2JqZWN0cykgeworICAgICAgICAgICAgVFJBQ0VfRVZFTlQwKAorICAgICAgICAgICAgICAgICJjb2JhbHQ6OndvcmtlciIsCisgICAgICAgICAgICAgICAgIlNlcnZpY2VXb3JrZXJDb250ZXh0OjpHZXRSZWdpc3RyYXRpb25TdWJTdGVwcygpIFJlc29sdmUiKTsKKyAgICAgICAgICAgIHNjcmlwdDo6U2VxdWVuY2U8c2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4+IHJlZ2lzdHJhdGlvbnM7CisgICAgICAgICAgICBmb3IgKGF1dG8gcmVnaXN0cmF0aW9uX29iamVjdCA6IHJlZ2lzdHJhdGlvbl9vYmplY3RzKSB7CisgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMucHVzaF9iYWNrKHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+KAorICAgICAgICAgICAgICAgICAgY2xpZW50LT5HZXRTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbl9vYmplY3QpCisgICAgICAgICAgICAgICAgICAgICAgLmdldCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoc3RkOjptb3ZlKHJlZ2lzdHJhdGlvbnMpKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIGNsaWVudCwgc3RkOjptb3ZlKHByb21pc2VfcmVmZXJlbmNlKSwKKyAgICAgICAgICBzdGQ6Om1vdmUocmVnaXN0cmF0aW9uX29iamVjdHMpKSk7Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OlNraXBXYWl0aW5nU3ViU3RlcHMoCisgICAgd2ViOjpDb250ZXh0KiB3b3JrZXJfY29udGV4dCwgU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsCisgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlX3JlZmVyZW5jZSkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJDb250ZXh0OjpTa2lwV2FpdGluZ1N1YlN0ZXBzKCkiKTsKKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCB3ZWIgY29udGV4dCBpcyBzdGlsbCBhY3RpdmUuIFRoaXMgbWF5IHRyaWdnZXIgaWYKKyAgLy8gc2tpcFdhaXRpbmcoKSB3YXMgY2FsbGVkIGFuZCBzZXJ2aWNlIHdvcmtlciBpbnN0YWxsYXRpb24gZmFpbHMuCisgIGlmICghSXNXZWJDb250ZXh0UmVnaXN0ZXJlZCh3b3JrZXJfY29udGV4dCkpIHsKKyAgICBwcm9taXNlX3JlZmVyZW5jZS5yZWxlYXNlKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQWxnb3JpdGhtIGZvciBTdWIgc3RlcHMgb2YgU2VydmljZVdvcmtlckdsb2JhbFNjb3BlLnNraXBXYWl0aW5nKCk6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLXNlcnZpY2V3b3JrZXJnbG9iYWxzY29wZS1za2lwd2FpdGluZworCisgIC8vIDIuMS4gU2V0IHNlcnZpY2Ugd29ya2VyJ3Mgc2tpcCB3YWl0aW5nIGZsYWcuCisgIHNlcnZpY2Vfd29ya2VyLT5zZXRfc2tpcF93YWl0aW5nKCk7CisKKyAgLy8gMi4yLiBJbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGggc2VydmljZSB3b3JrZXIncyBjb250YWluaW5nIHNlcnZpY2Ugd29ya2VyCisgIC8vIHJlZ2lzdHJhdGlvbi4KKyAgVHJ5QWN0aXZhdGUoc2VydmljZV93b3JrZXItPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCkpOworCisgIC8vIDIuMy4gUmVzb2x2ZSBwcm9taXNlIHdpdGggdW5kZWZpbmVkLgorICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlKSB7CisgICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpKTsKK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6V2FpdFVudGlsU3ViU3RlcHMoCisgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckNvbnRleHQ6OldhaXRVbnRpbFN1YlN0ZXBzKCkiKTsKKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgLy8gU3ViIHN0ZXBzIGZvciBXYWl0VW50aWwuCisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLWV4dGVuZGFibGVldmVudC13YWl0dW50aWwKKyAgLy8gNS4yLjIuIElmIHJlZ2lzdHJhdGlvbiBpcyB1bnJlZ2lzdGVyZWQsIGludm9rZSBUcnkgQ2xlYXIgUmVnaXN0cmF0aW9uCisgIC8vICAgICAgICB3aXRoIHJlZ2lzdHJhdGlvbi4KKyAgaWYgKHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5Jc1VucmVnaXN0ZXJlZChyZWdpc3RyYXRpb24pKSB7CisgICAgVHJ5Q2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKKyAgfQorICAvLyA1LjIuMy4gSWYgcmVnaXN0cmF0aW9uIGlzIG5vdCBudWxsLCBpbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGgKKyAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbi4KKyAgaWYgKHJlZ2lzdHJhdGlvbikgeworICAgIFRyeUFjdGl2YXRlKHJlZ2lzdHJhdGlvbik7CisgIH0KK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6Q2xpZW50c0dldFN1YlN0ZXBzKAorICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCisgICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4gcHJvbWlzZV9yZWZlcmVuY2UsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckNvbnRleHQ6OkNsaWVudHNHZXRTdWJTdGVwcygpIik7CisgIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIC8vIENoZWNrIGlmIHRoZSBjbGllbnQgd2ViIGNvbnRleHQgaXMgc3RpbGwgYWN0aXZlLiBUaGlzIG1heSB0cmlnZ2VyIGlmCisgIC8vIENsaWVudHMuZ2V0KCkgd2FzIGNhbGxlZCBhbmQgc2VydmljZSB3b3JrZXIgaW5zdGFsbGF0aW9uIGZhaWxzLgorICBpZiAoIUlzV2ViQ29udGV4dFJlZ2lzdGVyZWQod29ya2VyX2NvbnRleHQpKSB7CisgICAgcHJvbWlzZV9yZWZlcmVuY2UucmVsZWFzZSgpOworICAgIHJldHVybjsKKyAgfQorICAvLyBQYXJhbGxlbCBzdWIgc3RlcHMgKDIpIGZvciBhbGdvcml0aG0gZm9yIENsaWVudHMuZ2V0KGlkKToKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGllbnRzLWdldAorICAvLyAyLjEuIEZvciBlYWNoIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBjbGllbnQgd2hlcmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nCisgIC8vICAgICAgb2J0YWluIGEgc3RvcmFnZSBrZXkgZ2l2ZW4gY2xpZW50IGVxdWFscyB0aGUgYXNzb2NpYXRlZCBzZXJ2aWNlCisgIC8vICAgICAgd29ya2VyJ3MgY29udGFpbmluZyBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb24ncyBzdG9yYWdlIGtleToKKyAgY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5ID0KKyAgICAgIGFzc29jaWF0ZWRfc2VydmljZV93b3JrZXItPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCkKKyAgICAgICAgICAtPnN0b3JhZ2Vfa2V5KCk7CisgIGZvciAoYXV0byYgY2xpZW50IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKKyAgICB1cmw6Ok9yaWdpbiBjbGllbnRfc3RvcmFnZV9rZXkgPQorICAgICAgICBjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPk9idGFpblN0b3JhZ2VLZXkoKTsKKyAgICBpZiAoY2xpZW50X3N0b3JhZ2Vfa2V5LklzU2FtZU9yaWdpbldpdGgoc3RvcmFnZV9rZXkpKSB7CisgICAgICAvLyAyLjEuMS4gSWYgY2xpZW504oCZcyBpZCBpcyBub3QgaWQsIGNvbnRpbnVlLgorICAgICAgaWYgKGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+aWQoKSAhPSBpZCkgY29udGludWU7CisKKyAgICAgIC8vIDIuMS4yLiBXYWl0IGZvciBlaXRoZXIgY2xpZW504oCZcyBleGVjdXRpb24gcmVhZHkgZmxhZyB0byBiZSBzZXQgb3IgZm9yCisgICAgICAvLyAgICAgICAgY2xpZW504oCZcyBkaXNjYXJkZWQgZmxhZyB0byBiZSBzZXQuCisgICAgICAvLyBXZWIgQ29udGV4dHMgZXhpc3Qgb25seSBpbiB0aGUgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18gc2V0IHdoZW4gdGhleQorICAgICAgLy8gYXJlIGJvdGggZXhlY3V0aW9uIHJlYWR5IGFuZCBub3QgZGlzY2FyZGVkLgorCisgICAgICAvLyAyLjEuMy4gSWYgY2xpZW504oCZcyBleGVjdXRpb24gcmVhZHkgZmxhZyBpcyBzZXQsIHRoZW4gaW52b2tlIFJlc29sdmUgR2V0CisgICAgICAvLyAgICAgICAgQ2xpZW50IFByb21pc2Ugd2l0aCBjbGllbnQgYW5kIHByb21pc2UsIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgICAgIFJlc29sdmVHZXRDbGllbnRQcm9taXNlKGNsaWVudCwgd29ya2VyX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLy8gMi4yLiBSZXNvbHZlIHByb21pc2Ugd2l0aCB1bmRlZmluZWQuCisgIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kT25jZSgKKyAgICAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KKyAgICAgICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VyQ29udGV4dDo6Q2xpZW50c0dldFN1YlN0ZXBzKCkgUmVzb2x2ZSIpOworICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVzb2x2ZShzY29wZWRfcmVmcHRyPENsaWVudD4oKSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpKSk7Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OkNsaWVudHNNYXRjaEFsbFN1YlN0ZXBzKAorICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCisgICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VTZXF1ZW5jZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSwKKyAgICBib29sIGluY2x1ZGVfdW5jb250cm9sbGVkLCBDbGllbnRUeXBlIHR5cGUpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsCisgICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckNvbnRleHQ6OkNsaWVudHNNYXRjaEFsbFN1YlN0ZXBzKCkiKTsKKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgLy8gQ2hlY2sgaWYgdGhlIHdvcmtlciB3ZWIgY29udGV4dCBpcyBzdGlsbCBhY3RpdmUuIFRoaXMgbWF5IHRyaWdnZXIgaWYKKyAgLy8gQ2xpZW50cy5tYXRjaEFsbCgpIHdhcyBjYWxsZWQgYW5kIHNlcnZpY2Ugd29ya2VyIGluc3RhbGxhdGlvbiBmYWlscy4KKyAgaWYgKCFJc1dlYkNvbnRleHRSZWdpc3RlcmVkKHdvcmtlcl9jb250ZXh0KSkgeworICAgIHByb21pc2VfcmVmZXJlbmNlLnJlbGVhc2UoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQYXJhbGxlbCBzdWIgc3RlcHMgKDIpIGZvciBhbGdvcml0aG0gZm9yIENsaWVudHMubWF0Y2hBbGwoKToKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGllbnRzLW1hdGNoYWxsCisgIC8vIDIuMS4gTGV0IHRhcmdldENsaWVudHMgYmUgYSBuZXcgbGlzdC4KKyAgc3RkOjpsaXN0PHdlYjo6Q29udGV4dCo+IHRhcmdldF9jbGllbnRzOworCisgIC8vIDIuMi4gRm9yIGVhY2ggc2VydmljZSB3b3JrZXIgY2xpZW50IGNsaWVudCB3aGVyZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKKyAgLy8gICAgICBvYnRhaW4gYSBzdG9yYWdlIGtleSBnaXZlbiBjbGllbnQgZXF1YWxzIHRoZSBhc3NvY2lhdGVkIHNlcnZpY2UKKyAgLy8gICAgICB3b3JrZXIncyBjb250YWluaW5nIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbidzIHN0b3JhZ2Uga2V5OgorICBjb25zdCB1cmw6Ok9yaWdpbiYgc3RvcmFnZV9rZXkgPQorICAgICAgYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlci0+Y29udGFpbmluZ19zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24oKQorICAgICAgICAgIC0+c3RvcmFnZV9rZXkoKTsKKyAgZm9yIChhdXRvJiBjbGllbnQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgeworICAgIHVybDo6T3JpZ2luIGNsaWVudF9zdG9yYWdlX2tleSA9CisgICAgICAgIGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+T2J0YWluU3RvcmFnZUtleSgpOworICAgIGlmIChjbGllbnRfc3RvcmFnZV9rZXkuSXNTYW1lT3JpZ2luV2l0aChzdG9yYWdlX2tleSkpIHsKKyAgICAgIC8vIDIuMi4xLiBJZiBjbGllbnTigJlzIGV4ZWN1dGlvbiByZWFkeSBmbGFnIGlzIHVuc2V0IG9yIGNsaWVudOKAmXMgZGlzY2FyZGVkCisgICAgICAvLyAgICAgICAgZmxhZyBpcyBzZXQsIGNvbnRpbnVlLgorICAgICAgLy8gV2ViIENvbnRleHRzIGV4aXN0IG9ubHkgaW4gdGhlIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfIHNldCB3aGVuIHRoZXkKKyAgICAgIC8vIGFyZSBib3RoIGV4ZWN1dGlvbiByZWFkeSBhbmQgbm90IGRpc2NhcmRlZC4KKworICAgICAgLy8gMi4yLjIuIElmIGNsaWVudCBpcyBub3QgYSBzZWN1cmUgY29udGV4dCwgY29udGludWUuCisgICAgICAvLyBJbiBwcm9kdWN0aW9uLCBDb2JhbHQgcmVxdWlyZXMgaHR0cHMsIHRoZXJlZm9yZSBhbGwgd29ya2VycyBhbmQgdGhlaXIKKyAgICAgIC8vIG93bmVycyBhcmUgc2VjdXJlIGNvbnRleHRzLgorCisgICAgICAvLyAyLjIuMy4gSWYgb3B0aW9uc1siaW5jbHVkZVVuY29udHJvbGxlZCJdIGlzIGZhbHNlLCBhbmQgaWYgY2xpZW504oCZcworICAgICAgLy8gICAgICAgIGFjdGl2ZSBzZXJ2aWNlIHdvcmtlciBpcyBub3QgdGhlIGFzc29jaWF0ZWQgc2VydmljZSB3b3JrZXIsCisgICAgICAvLyAgICAgICAgY29udGludWUuCisgICAgICBpZiAoIWluY2x1ZGVfdW5jb250cm9sbGVkICYmCisgICAgICAgICAgKGNsaWVudC0+YWN0aXZlX3NlcnZpY2Vfd29ya2VyKCkgIT0gYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlcikpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIDIuMi40LiBBZGQgY2xpZW50IHRvIHRhcmdldENsaWVudHMuCisgICAgICB0YXJnZXRfY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICB9CisgIH0KKworICAvLyAyLjMuIExldCBtYXRjaGVkV2luZG93RGF0YSBiZSBhIG5ldyBsaXN0LgorICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8V2luZG93RGF0YT4+IG1hdGNoZWRfd2luZG93X2RhdGEoCisgICAgICBuZXcgc3RkOjp2ZWN0b3I8V2luZG93RGF0YT4pOworCisgIC8vIDIuNC4gTGV0IG1hdGNoZWRDbGllbnRzIGJlIGEgbmV3IGxpc3QuCisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjx3ZWI6OkNvbnRleHQqPj4gbWF0Y2hlZF9jbGllbnRzKAorICAgICAgbmV3IHN0ZDo6dmVjdG9yPHdlYjo6Q29udGV4dCo+KTsKKworICAvLyAyLjUuIEZvciBlYWNoIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBjbGllbnQgaW4gdGFyZ2V0Q2xpZW50czoKKyAgZm9yIChhdXRvKiBjbGllbnQgOiB0YXJnZXRfY2xpZW50cykgeworICAgIGF1dG8qIGdsb2JhbF9zY29wZSA9IGNsaWVudC0+R2V0V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSgpOworCisgICAgaWYgKCh0eXBlID09IGtDbGllbnRUeXBlV2luZG93IHx8IHR5cGUgPT0ga0NsaWVudFR5cGVBbGwpICYmCisgICAgICAgIChnbG9iYWxfc2NvcGUtPklzV2luZG93KCkpKSB7CisgICAgICAvLyAyLjUuMS4gSWYgb3B0aW9uc1sidHlwZSJdIGlzICJ3aW5kb3ciIG9yICJhbGwiLCBhbmQgY2xpZW50IGlzIG5vdCBhbgorICAgICAgLy8gICAgICAgIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCBvciBpcyBhIHdpbmRvdyBjbGllbnQsIHRoZW46CisKKyAgICAgIC8vIDIuNS4xLjEuIExldCB3aW5kb3dEYXRhIGJlIFsgImNsaWVudCIgLT4gY2xpZW50LCAiYW5jZXN0b3JPcmlnaW5zTGlzdCIKKyAgICAgIC8vICAgICAgICAgIC0+IGEgbmV3IGxpc3QgXS4KKyAgICAgIFdpbmRvd0RhdGEgd2luZG93X2RhdGEoY2xpZW50LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKTsKKworICAgICAgLy8gMi41LjEuMi4gTGV0IGJyb3dzaW5nQ29udGV4dCBiZSBudWxsLgorCisgICAgICAvLyAyLjUuMS4zLiBMZXQgaXNDbGllbnRFbnVtZXJhYmxlIGJlIHRydWUuCisgICAgICAvLyBGb3IgQ29iYWx0LCBpc0NsaWVudEVudW1lcmFibGUgaXMgYWx3YXlzIHRydWUgYmVjYXVzZSB0aGUgY2xhdXNlcyB0aGF0CisgICAgICAvLyB3b3VsZCBzZXQgaXQgdG8gZmFsc2UgaW4gMi41LjEuNi4gZG8gbm90IGFwcGx5IHRvIENvYmFsdC4KKworICAgICAgLy8gMi41LjEuNC4gSWYgY2xpZW50IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgc2V0CisgICAgICAvLyAgICAgICAgICBicm93c2luZ0NvbnRleHQgdG8gY2xpZW504oCZcyBnbG9iYWwgb2JqZWN0J3MgYnJvd3NpbmcgY29udGV4dC4KKyAgICAgIC8vIDIuNS4xLjUuIEVsc2UsIHNldCBicm93c2luZ0NvbnRleHQgdG8gY2xpZW504oCZcyB0YXJnZXQgYnJvd3NpbmcgY29udGV4dC4KKyAgICAgIHdlYjo6Q29udGV4dCogYnJvd3NpbmdfY29udGV4dCA9IGNsaWVudDsKKworICAgICAgLy8gMi41LjEuNi4gUXVldWUgYSB0YXNrIHRhc2sgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3Vic3RlcHMgb24KKyAgICAgIC8vICAgICAgICAgIGJyb3dzaW5nQ29udGV4dOKAmXMgZXZlbnQgbG9vcCB1c2luZyB0aGUgdXNlciBpbnRlcmFjdGlvbiB0YXNrCisgICAgICAvLyAgICAgICAgICBzb3VyY2U6CisgICAgICAvLyBOb3RlOiBUaGUgdGFzayBiZWxvdyBkb2VzIG5vdCBjdXJyZW50bHkgcGVyZm9ybSBhbnkgYWN0dWFsCisgICAgICAvLyBmdW5jdGlvbmFsaXR5LiBJdCBpcyBpbmNsdWRlZCBob3dldmVyIHRvIGhlbHAgZnV0dXJlIGltcGxlbWVudGF0aW9uIGZvcgorICAgICAgLy8gZmV0Y2hpbmcgdmFsdWVzIGZvciBXaW5kb3dDbGllbnQgcHJvcGVydGllcywgd2l0aCBzaW1pbGFyIGxvZ2ljCisgICAgICAvLyBleGlzdGluZyBpbiBSZXNvbHZlR2V0Q2xpZW50UHJvbWlzZS4KKyAgICAgIGJyb3dzaW5nX2NvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBbXShXaW5kb3dEYXRhKiB3aW5kb3dfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi41LjEuNi4xLiBJZiBicm93c2luZ0NvbnRleHQgaGFzIGJlZW4gZGlzY2FyZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICB0aGVuIHNldCBpc0NsaWVudEVudW1lcmFibGUgdG8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi41LjEuNi4yLiBJZiBjbGllbnQgaXMgYSB3aW5kb3cgY2xpZW50IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBjbGllbnTigJlzIHJlc3BvbnNpYmxlIGRvY3VtZW50IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBicm93c2luZ0NvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCwgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBzZXQgaXNDbGllbnRFbnVtZXJhYmxlIHRvIGZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIENvYmFsdCwgdGhlIGRvY3VtZW50IG9mIGEgd2luZG93IGJyb3dzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0IGRvZXNuJ3QgY2hhbmdlOiBXaGVuIGEgbmV3IGRvY3VtZW50IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBhIG5ldyBicm93c2luZyBjb250ZXh0IGlzIGNyZWF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuNS4xLjYuMy4gU2V0IHdpbmRvd0RhdGFbImZyYW1lVHlwZSJdIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICByZXN1bHQgb2YgcnVubmluZyBHZXQgRnJhbWUgVHlwZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGJyb3dzaW5nQ29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvYmFsdCBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBvciBhdXhpbGlhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJyb3dzaW5nIGNvbnRleHRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi41LjEuNi40LiBTZXQgd2luZG93RGF0YVsidmlzaWJpbGl0eVN0YXRlIl0gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJvd3NpbmdDb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQncworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICB2aXNpYmlsaXR5U3RhdGUgYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi41LjEuNi41LiBTZXQgd2luZG93RGF0YVsiZm9jdXNTdGF0ZSJdIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICByZXN1bHQgb2YgcnVubmluZyB0aGUgaGFzIGZvY3VzIHN0ZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHdpdGggYnJvd3NpbmdDb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgYXMgdGhlIGFyZ3VtZW50LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjUuMS42LjYuIElmIGNsaWVudCBpcyBhIHdpbmRvdyBjbGllbnQsIHRoZW4gc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHdpbmRvd0RhdGFbImFuY2VzdG9yT3JpZ2luc0xpc3QiXSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBicm93c2luZ0NvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHJlbGV2YW50IGdsb2JhbCBvYmplY3QncyBMb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBvYmplY3TigJlzIGFuY2VzdG9yIG9yaWdpbnMgbGlzdCdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGFzc29jaWF0ZWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvYmFsdCBkb2VzIG5vdCBpbXBsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2F0aW9uLmFuY2VzdG9yT3JpZ2lucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dfZGF0YSkpOworCisgICAgICAvLyAyLjUuMS43LiBXYWl0IGZvciB0YXNrIHRvIGhhdmUgZXhlY3V0ZWQuCisgICAgICAvLyBUaGUgdGFzayBhYm92ZSBpcyBwb3N0ZWQgYXMgYSBibG9ja2luZyB0YXNrLgorCisgICAgICAvLyAyLjUuMS44LiBJZiBpc0NsaWVudEVudW1lcmFibGUgaXMgdHJ1ZSwgdGhlbjoKKworICAgICAgLy8gMi41LjEuOC4xLiBBZGQgd2luZG93RGF0YSB0byBtYXRjaGVkV2luZG93RGF0YS4KKyAgICAgIG1hdGNoZWRfd2luZG93X2RhdGEtPmVtcGxhY2VfYmFjayh3aW5kb3dfZGF0YSk7CisKKyAgICAgIC8vIDIuNS4yLiBFbHNlIGlmIG9wdGlvbnNbInR5cGUiXSBpcyAid29ya2VyIiBvciAiYWxsIiBhbmQgY2xpZW50IGlzIGEKKyAgICAgIC8vICAgICAgICBkZWRpY2F0ZWQgd29ya2VyIGNsaWVudCwgb3Igb3B0aW9uc1sidHlwZSJdIGlzICJzaGFyZWR3b3JrZXIiIG9yCisgICAgICAvLyAgICAgICAgImFsbCIgYW5kIGNsaWVudCBpcyBhIHNoYXJlZCB3b3JrZXIgY2xpZW50LCB0aGVuOgorICAgIH0gZWxzZSBpZiAoKCh0eXBlID09IGtDbGllbnRUeXBlV29ya2VyIHx8IHR5cGUgPT0ga0NsaWVudFR5cGVBbGwpICYmCisgICAgICAgICAgICAgICAgZ2xvYmFsX3Njb3BlLT5Jc0RlZGljYXRlZFdvcmtlcigpKSkgeworICAgICAgLy8gTm90ZTogQ29iYWx0IGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIHdvcmtlcnMuCisgICAgICAvLyAyLjUuMi4xLiBBZGQgY2xpZW50IHRvIG1hdGNoZWRDbGllbnRzLgorICAgICAgbWF0Y2hlZF9jbGllbnRzLT5lbXBsYWNlX2JhY2soY2xpZW50KTsKKyAgICB9CisgIH0KKworICAvLyAyLjYuIFF1ZXVlIGEgdGFzayB0byBydW4gdGhlIGZvbGxvd2luZyBzdGVwcyBvbiBwcm9taXNl4oCZcyByZWxldmFudAorICAvLyBzZXR0aW5ncyBvYmplY3QncyByZXNwb25zaWJsZSBldmVudCBsb29wIHVzaW5nIHRoZSBET00gbWFuaXB1bGF0aW9uCisgIC8vIHRhc2sgc291cmNlOgorICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KKyAgICAgICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UsCisgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPFdpbmRvd0RhdGE+PiBtYXRjaGVkX3dpbmRvd19kYXRhLAorICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjx3ZWI6OkNvbnRleHQqPj4gbWF0Y2hlZF9jbGllbnRzKSB7CisgICAgICAgICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckNvbnRleHQ6OkNsaWVudHNNYXRjaEFsbFN1YlN0ZXBzKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvbHZlIFByb21pc2UiKTsKKyAgICAgICAgICAgIC8vIDIuNi4xLiBMZXQgY2xpZW50T2JqZWN0cyBiZSBhIG5ldyBsaXN0LgorICAgICAgICAgICAgc2NyaXB0OjpTZXF1ZW5jZTxzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPj4gY2xpZW50X29iamVjdHM7CisKKyAgICAgICAgICAgIC8vIDIuNi4yLiBGb3IgZWFjaCB3aW5kb3dEYXRhIGluIG1hdGNoZWRXaW5kb3dEYXRhOgorICAgICAgICAgICAgZm9yIChhdXRvJiB3aW5kb3dfZGF0YSA6ICptYXRjaGVkX3dpbmRvd19kYXRhKSB7CisgICAgICAgICAgICAgIC8vIDIuNi4yLjEuIExldCBXaW5kb3dDbGllbnQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nCisgICAgICAgICAgICAgIC8vICAgICAgICAgIENyZWF0ZSBXaW5kb3cgQ2xpZW50IGFsZ29yaXRobSB3aXRoCisgICAgICAgICAgICAgIC8vICAgICAgICAgIHdpbmRvd0RhdGFbImNsaWVudCJdLAorICAgICAgICAgICAgICAvLyAgICAgICAgICB3aW5kb3dEYXRhWyJmcmFtZVR5cGUiXSwKKyAgICAgICAgICAgICAgLy8gICAgICAgICAgd2luZG93RGF0YVsidmlzaWJpbGl0eVN0YXRlIl0sCisgICAgICAgICAgICAgIC8vICAgICAgICAgIHdpbmRvd0RhdGFbImZvY3VzU3RhdGUiXSwgYW5kCisgICAgICAgICAgICAgIC8vICAgICAgICAgIHdpbmRvd0RhdGFbImFuY2VzdG9yT3JpZ2luc0xpc3QiXSBhcyB0aGUKKyAgICAgICAgICAgICAgLy8gICAgICAgICAgYXJndW1lbnRzLgorICAgICAgICAgICAgICAvLyBUT0RPKGIvMjM1ODM4Njk4KTogSW1wbGVtZW50IFdpbmRvd0NsaWVudCBtZXRob2RzLgorICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gd2luZG93X2NsaWVudCA9CisgICAgICAgICAgICAgICAgICBXaW5kb3dDbGllbnQ6OkNyZWF0ZSh3aW5kb3dfZGF0YSk7CisKKyAgICAgICAgICAgICAgLy8gMi42LjIuMi4gQXBwZW5kIFdpbmRvd0NsaWVudCB0byBjbGllbnRPYmplY3RzLgorICAgICAgICAgICAgICBjbGllbnRfb2JqZWN0cy5wdXNoX2JhY2sod2luZG93X2NsaWVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIDIuNi4zLiBGb3IgZWFjaCBjbGllbnQgaW4gbWF0Y2hlZENsaWVudHM6CisgICAgICAgICAgICBmb3IgKGF1dG8mIGNsaWVudCA6ICptYXRjaGVkX2NsaWVudHMpIHsKKyAgICAgICAgICAgICAgLy8gMi42LjMuMS4gTGV0IGNsaWVudE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKKyAgICAgICAgICAgICAgLy8gICAgICAgICAgQ3JlYXRlIENsaWVudCBhbGdvcml0aG0gd2l0aCBjbGllbnQgYXMgdGhlCisgICAgICAgICAgICAgIC8vICAgICAgICAgIGFyZ3VtZW50LgorICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gY2xpZW50X29iamVjdCA9CisgICAgICAgICAgICAgICAgICBDbGllbnQ6OkNyZWF0ZShjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCkpOworCisgICAgICAgICAgICAgIC8vIDIuNi4zLjIuIEFwcGVuZCBjbGllbnRPYmplY3QgdG8gY2xpZW50T2JqZWN0cy4KKyAgICAgICAgICAgICAgY2xpZW50X29iamVjdHMucHVzaF9iYWNrKGNsaWVudF9vYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gMi42LjQuIFNvcnQgY2xpZW50T2JqZWN0cyBzdWNoIHRoYXQ6CisgICAgICAgICAgICAvLyAgICAgICAgLiBXaW5kb3dDbGllbnQgb2JqZWN0cyB3aG9zZSBicm93c2luZyBjb250ZXh0IGhhcyBiZWVuCisgICAgICAgICAgICAvLyAgICAgICAgICBmb2N1c2VkIGFyZSBwbGFjZWQgZmlyc3QsIHNvcnRlZCBpbiB0aGUgbW9zdCByZWNlbnRseQorICAgICAgICAgICAgLy8gICAgICAgICAgZm9jdXNlZCBvcmRlci4KKyAgICAgICAgICAgIC8vICAgICAgICAuIFdpbmRvd0NsaWVudCBvYmplY3RzIHdob3NlIGJyb3dzaW5nIGNvbnRleHQgaGFzIG5ldmVyCisgICAgICAgICAgICAvLyAgICAgICAgICBiZWVuIGZvY3VzZWQgYXJlIHBsYWNlZCBuZXh0LCBzb3J0ZWQgaW4gdGhlaXIgc2VydmljZQorICAgICAgICAgICAgLy8gICAgICAgICAgd29ya2VyIGNsaWVudCdzIGNyZWF0aW9uIG9yZGVyLgorICAgICAgICAgICAgLy8gICAgICAgIC4gQ2xpZW50IG9iamVjdHMgd2hvc2UgYXNzb2NpYXRlZCBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMKKyAgICAgICAgICAgIC8vICAgICAgICAgIGEgd29ya2VyIGNsaWVudCBhcmUgcGxhY2VkIG5leHQsIHNvcnRlZCBpbiB0aGVpciBzZXJ2aWNlCisgICAgICAgICAgICAvLyAgICAgICAgICB3b3JrZXIgY2xpZW50J3MgY3JlYXRpb24gb3JkZXIuCisgICAgICAgICAgICAvLyBUT0RPKGIvMjM1ODc2NTk4KTogSW1wbGVtZW50IHNvcnRpbmcgb2YgY2xpZW50T2JqZWN0cy4KKworICAgICAgICAgICAgLy8gMi42LjUuIFJlc29sdmUgcHJvbWlzZSB3aXRoIGEgbmV3IGZyb3plbiBhcnJheSBvZiBjbGllbnRPYmplY3RzCisgICAgICAgICAgICAvLyAgICAgICAgaW4gcHJvbWlzZeKAmXMgcmVsZXZhbnQgUmVhbG0uCisgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZXNvbHZlKGNsaWVudF9vYmplY3RzKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIHN0ZDo6bW92ZShtYXRjaGVkX3dpbmRvd19kYXRhKSwKKyAgICAgICAgICBzdGQ6Om1vdmUobWF0Y2hlZF9jbGllbnRzKSkpOworfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpDbGFpbVN1YlN0ZXBzKAorICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCisgICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VWb2lkOjpSZWZlcmVuY2U+IHByb21pc2VfcmVmZXJlbmNlKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckNvbnRleHQ6OkNsYWltU3ViU3RlcHMoKSIpOworICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIC8vIENoZWNrIGlmIHRoZSBjbGllbnQgd2ViIGNvbnRleHQgaXMgc3RpbGwgYWN0aXZlLiBUaGlzIG1heSB0cmlnZ2VyIGlmCisgIC8vIENsaWVudHMuY2xhaW0oKSB3YXMgY2FsbGVkIGFuZCBzZXJ2aWNlIHdvcmtlciBpbnN0YWxsYXRpb24gZmFpbHMuCisgIGlmICghSXNXZWJDb250ZXh0UmVnaXN0ZXJlZCh3b3JrZXJfY29udGV4dCkpIHsKKyAgICBwcm9taXNlX3JlZmVyZW5jZS5yZWxlYXNlKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUGFyYWxsZWwgc3ViIHN0ZXBzICgzKSBmb3IgYWxnb3JpdGhtIGZvciBDbGllbnRzLmNsYWltKCk6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLWNsaWVudHMtY2xhaW0KKyAgc3RkOjpsaXN0PHdlYjo6Q29udGV4dCo+IHRhcmdldF9jbGllbnRzOworCisgIC8vIDMuMS4gRm9yIGVhY2ggc2VydmljZSB3b3JrZXIgY2xpZW50IGNsaWVudCB3aGVyZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKKyAgLy8gICAgICBvYnRhaW4gYSBzdG9yYWdlIGtleSBnaXZlbiBjbGllbnQgZXF1YWxzIHRoZSBzZXJ2aWNlIHdvcmtlcidzCisgIC8vICAgICAgY29udGFpbmluZyBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb24ncyBzdG9yYWdlIGtleToKKyAgY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5ID0KKyAgICAgIGFzc29jaWF0ZWRfc2VydmljZV93b3JrZXItPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCkKKyAgICAgICAgICAtPnN0b3JhZ2Vfa2V5KCk7CisgIGZvciAoYXV0byYgY2xpZW50IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKKyAgICAvLyBEb24ndCBjbGFpbSB0byBiZSBvdXIgb3duIHNlcnZpY2Ugd29ya2VyLgorICAgIGlmIChjbGllbnQgPT0gd29ya2VyX2NvbnRleHQpIGNvbnRpbnVlOworICAgIHVybDo6T3JpZ2luIGNsaWVudF9zdG9yYWdlX2tleSA9CisgICAgICAgIGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+T2J0YWluU3RvcmFnZUtleSgpOworICAgIGlmIChjbGllbnRfc3RvcmFnZV9rZXkuSXNTYW1lT3JpZ2luV2l0aChzdG9yYWdlX2tleSkpIHsKKyAgICAgIC8vIDMuMS4xLiBJZiBjbGllbnTigJlzIGV4ZWN1dGlvbiByZWFkeSBmbGFnIGlzIHVuc2V0IG9yIGNsaWVudOKAmXMgZGlzY2FyZGVkCisgICAgICAvLyAgICAgICAgZmxhZyBpcyBzZXQsIGNvbnRpbnVlLgorICAgICAgLy8gV2ViIENvbnRleHRzIGV4aXN0IG9ubHkgaW4gdGhlIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfIHNldCB3aGVuIHRoZXkKKyAgICAgIC8vIGFyZSBib3RoIGV4ZWN1dGlvbiByZWFkeSBhbmQgbm90IGRpc2NhcmRlZC4KKworICAgICAgLy8gMy4xLjIuIElmIGNsaWVudCBpcyBub3QgYSBzZWN1cmUgY29udGV4dCwgY29udGludWUuCisgICAgICAvLyBJbiBwcm9kdWN0aW9uLCBDb2JhbHQgcmVxdWlyZXMgaHR0cHMsIHRoZXJlZm9yZSBhbGwgY2xpZW50cyBhcmUgc2VjdXJlCisgICAgICAvLyBjb250ZXh0cy4KKworICAgICAgLy8gMy4xLjMuIExldCBzdG9yYWdlIGtleSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgb2J0YWluIGEgc3RvcmFnZSBrZXkKKyAgICAgIC8vICAgICAgICBnaXZlbiBjbGllbnQuCisgICAgICAvLyAzLjEuNC4gTGV0IHJlZ2lzdHJhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgTWF0Y2ggU2VydmljZSBXb3JrZXIKKyAgICAgIC8vICAgICAgICBSZWdpc3RyYXRpb24gZ2l2ZW4gc3RvcmFnZSBrZXkgYW5kIGNsaWVudOKAmXMgY3JlYXRpb24gVVJMLgorICAgICAgLy8gVE9ETyhiLzIzNDY1OTg1MSk6IEludmVzdGlnYXRlIHdoZXRoZXIgdGhpcyBzaG91bGQgdXNlIHRoZSBjcmVhdGlvbgorICAgICAgLy8gVVJMIGRpcmVjdGx5IGluc3RlYWQuCisgICAgICBjb25zdCBHVVJMJiBiYXNlX3VybCA9IGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y3JlYXRpb25fdXJsKCk7CisgICAgICBHVVJMIGNsaWVudF91cmwgPSBiYXNlX3VybC5SZXNvbHZlKCIiKTsKKyAgICAgIHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4gcmVnaXN0cmF0aW9uID0KKyAgICAgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKAorICAgICAgICAgICAgICBjbGllbnRfc3RvcmFnZV9rZXksIGNsaWVudF91cmwpOworCisgICAgICAvLyAzLjEuNS4gSWYgcmVnaXN0cmF0aW9uIGlzIG5vdCB0aGUgc2VydmljZSB3b3JrZXIncyBjb250YWluaW5nIHNlcnZpY2UKKyAgICAgIC8vICAgICAgICB3b3JrZXIgcmVnaXN0cmF0aW9uLCBjb250aW51ZS4KKyAgICAgIGlmIChyZWdpc3RyYXRpb24gIT0KKyAgICAgICAgICBhc3NvY2lhdGVkX3NlcnZpY2Vfd29ya2VyLT5jb250YWluaW5nX3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbigpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyAzLjEuNi4gSWYgY2xpZW504oCZcyBhY3RpdmUgc2VydmljZSB3b3JrZXIgaXMgbm90IHRoZSBzZXJ2aWNlIHdvcmtlciwKKyAgICAgIC8vICAgICAgICB0aGVuOgorICAgICAgaWYgKGNsaWVudC0+YWN0aXZlX3NlcnZpY2Vfd29ya2VyKCkgIT0gYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlcikgeworICAgICAgICAvLyAzLjEuNi4xLiBJbnZva2UgSGFuZGxlIFNlcnZpY2UgV29ya2VyIENsaWVudCBVbmxvYWQgd2l0aCBjbGllbnQgYXMKKyAgICAgICAgLy8gICAgICAgICAgdGhlIGFyZ3VtZW50LgorICAgICAgICBIYW5kbGVTZXJ2aWNlV29ya2VyQ2xpZW50VW5sb2FkKGNsaWVudCk7CisKKyAgICAgICAgLy8gMy4xLjYuMi4gU2V0IGNsaWVudOKAmXMgYWN0aXZlIHNlcnZpY2Ugd29ya2VyIHRvIHNlcnZpY2Ugd29ya2VyLgorICAgICAgICBjbGllbnQtPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIoYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlcik7CisKKyAgICAgICAgLy8gMy4xLjYuMy4gSW52b2tlIE5vdGlmeSBDb250cm9sbGVyIENoYW5nZSBhbGdvcml0aG0gd2l0aCBjbGllbnQgYXMgdGhlCisgICAgICAgIC8vICAgICAgICAgIGFyZ3VtZW50LgorICAgICAgICBOb3RpZnlDb250cm9sbGVyQ2hhbmdlKGNsaWVudCk7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIDMuMi4gUmVzb2x2ZSBwcm9taXNlIHdpdGggdW5kZWZpbmVkLgorICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlKSB7CisgICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpKTsKK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6U2VydmljZVdvcmtlclBvc3RNZXNzYWdlU3ViU3RlcHMoCisgICAgU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsIHdlYjo6Q29udGV4dCogaW5jdW1iZW50X2NsaWVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpTdHJ1Y3R1cmVkQ2xvbmU+IHN0cnVjdHVyZWRfY2xvbmUpIHsKKyAgLy8gUGFyYWxsZWwgc3ViIHN0ZXBzICg2KSBmb3IgYWxnb3JpdGhtIGZvciBTZXJ2aWNlV29ya2VyLnBvc3RNZXNzYWdlKCk6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jc2VydmljZS13b3JrZXItcG9zdG1lc3NhZ2Utb3B0aW9ucworICAvLyAzLiBMZXQgaW5jdW1iZW50R2xvYmFsIGJlIGluY3VtYmVudFNldHRpbmdz4oCZcyBnbG9iYWwgb2JqZWN0LgorICAvLyBOb3RlOiBUaGUgJ2luY3VtYmVudCcgaXMgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KKyAgLy8gNi4xIElmIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgUnVuIFNlcnZpY2UgV29ya2VyIGFsZ29yaXRobSB3aXRoCisgIC8vICAgICBzZXJ2aWNlV29ya2VyIGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuLgorICBhdXRvKiBydW5fcmVzdWx0ID0gUnVuU2VydmljZVdvcmtlcihzZXJ2aWNlX3dvcmtlcik7CisgIGlmICghcnVuX3Jlc3VsdCkgcmV0dXJuOworICBpZiAoIXN0cnVjdHVyZWRfY2xvbmUgfHwgc3RydWN0dXJlZF9jbG9uZS0+ZmFpbGVkKCkpIHJldHVybjsKKworICAvLyA2LjIgUXVldWUgYSB0YXNrIG9uIHRoZSBET00gbWFuaXB1bGF0aW9uIHRhc2sgc291cmNlIHRvIHJ1biB0aGUgZm9sbG93aW5nCisgIC8vICAgICBzdGVwczoKKyAgaW5jdW1iZW50X2NsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZE9uY2UoCisgICAgICAgICAgW10oU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsCisgICAgICAgICAgICAgd2ViOjpDb250ZXh0KiBpbmN1bWJlbnRfY2xpZW50LAorICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4gc3RydWN0dXJlZF9jbG9uZSkgeworICAgICAgICAgICAgd2ViOjpFdmVudFRhcmdldCogZXZlbnRfdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICBzZXJ2aWNlX3dvcmtlci0+d29ya2VyX2dsb2JhbF9zY29wZSgpOworICAgICAgICAgICAgaWYgKCFldmVudF90YXJnZXQpIHJldHVybjsKKworICAgICAgICAgICAgd2ViOjpXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKiBpbmN1bWJlbnRfZ2xvYmFsID0KKyAgICAgICAgICAgICAgICBpbmN1bWJlbnRfY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCk7CisgICAgICAgICAgICBEQ0hFQ0tfRVEoaW5jdW1iZW50X2NsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICBpbmN1bWJlbnRfZ2xvYmFsLT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKTsKKyAgICAgICAgICAgIGJhc2U6OlR5cGVJZCBpbmN1bWJlbnRfdHlwZSA9IGluY3VtYmVudF9nbG9iYWwtPkdldFdyYXBwYWJsZVR5cGUoKTsKKyAgICAgICAgICAgIFNlcnZpY2VXb3JrZXJPYmplY3QqIGluY3VtYmVudF93b3JrZXIgPQorICAgICAgICAgICAgICAgIGluY3VtYmVudF9nbG9iYWwtPklzU2VydmljZVdvcmtlcigpCisgICAgICAgICAgICAgICAgICAgID8gaW5jdW1iZW50X2dsb2JhbC0+QXNTZXJ2aWNlV29ya2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcl9vYmplY3QoKQorICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgICAgICAgICBiYXNlOjpNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wID0KKyAgICAgICAgICAgICAgICBldmVudF90YXJnZXQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKS0+bWVzc2FnZV9sb29wKCk7CisgICAgICAgICAgICBpZiAoIW1lc3NhZ2VfbG9vcCkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlX2xvb3AtPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICAgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYmFzZTo6VHlwZUlkJiBpbmN1bWJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlck9iamVjdCogaW5jdW1iZW50X3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgd2ViOjpDb250ZXh0KiBpbmN1bWJlbnRfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICB3ZWI6OkV2ZW50VGFyZ2V0KiBldmVudF90YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZWRfY2xvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUV2ZW50SW5pdCBpbml0X2RpY3Q7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY3VtYmVudF90eXBlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkdldFR5cGVJZDxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU+KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDYuMi4xLiBMZXQgc291cmNlIGJlIGRldGVybWluZWQgYnkgc3dpdGNoaW5nIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHR5cGUgb2YgaW5jdW1iZW50R2xvYmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIC4gU2VydmljZVdvcmtlckdsb2JhbFNjb3BlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBUaGUgcmVzdWx0IG9mIGdldHRpbmcgdGhlIHNlcnZpY2Ugd29ya2VyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBvYmplY3QgdGhhdCByZXByZXNlbnRzIGluY3VtYmVudEdsb2JhbOKAmXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHNlcnZpY2Ugd29ya2VyIGluIHRoZSByZWxldmFudCBzZXR0aW5ncworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgb2JqZWN0IG9mIHNlcnZpY2VXb3JrZXLigJlzIGdsb2JhbCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2RpY3Quc2V0X3NvdXJjZShFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OjpTb3VyY2VUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RhcmdldC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFNlcnZpY2VXb3JrZXIoaW5jdW1iZW50X3dvcmtlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY3VtYmVudF90eXBlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpHZXRUeXBlSWQ8ZG9tOjpXaW5kb3c+KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAuIFdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgYSBuZXcgV2luZG93Q2xpZW50IG9iamVjdCB0aGF0IHJlcHJlc2VudHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIGluY3VtYmVudEdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9kaWN0LnNldF9zb3VyY2UoRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDo6U291cmNlVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dDbGllbnQ6OkNyZWF0ZShXaW5kb3dEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmN1bWJlbnRfY2xpZW50LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIC4gT3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBhIG5ldyBDbGllbnQgb2JqZWN0IHRoYXQgcmVwcmVzZW50cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaW5jdW1iZW50R2xvYmFs4oCZcyBhc3NvY2lhdGVkIHdvcmtlcgorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9kaWN0LnNldF9zb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDo6U291cmNlVHlwZShDbGllbnQ6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jdW1iZW50X2NsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICBldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyB3b3JrZXI6OkV4dGVuZGFibGVNZXNzYWdlRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90YXJnZXQtPmVudmlyb25tZW50X3NldHRpbmdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUb2tlbnM6Om1lc3NhZ2UoKSwgaW5pdF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHN0cnVjdHVyZWRfY2xvbmUpKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGluY3VtYmVudF90eXBlLCBiYXNlOjpVbnJldGFpbmVkKGluY3VtYmVudF93b3JrZXIpLAorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGVzZSBzaG91bGQgcHJvYmFibHkgYmUgd2VhayBwb2ludGVycyBmb3Igd2hlbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBzZW5kZXIgZGlzYXBwZWFycyBiZWZvcmUgdGhlIHJlY2lwaWVudAorICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZXMgdGhlIGV2ZW50LCBidXQgc2luY2UgYmFzZTo6V2Vha1B0cgorICAgICAgICAgICAgICAgICAgICAvLyBkZXJlZmVyZW5jaW5nIGlzbid0IHRocmVhZC1zYWZlLCB0aGF0IGNhbid0IGFjdHVhbGx5IGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChpbmN1bWJlbnRfY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChldmVudF90YXJnZXQpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc3RydWN0dXJlZF9jbG9uZSkpKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2VydmljZV93b3JrZXIpLCBiYXNlOjpVbnJldGFpbmVkKGluY3VtYmVudF9jbGllbnQpLAorICAgICAgICAgIHN0ZDo6bW92ZShzdHJ1Y3R1cmVkX2Nsb25lKSkpOworfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpSZWdpc3RlcldlYkNvbnRleHQod2ViOjpDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDS19ORShudWxscHRyLCBjb250ZXh0KTsKKyAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc19jbGVhcmVkXy5SZXNldCgpOworICBpZiAoYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSAhPSBtZXNzYWdlX2xvb3AoKSkgeworICAgIERDSEVDSyhtZXNzYWdlX2xvb3AoKSk7CisgICAgbWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6UmVnaXN0ZXJXZWJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNvbnRleHQpKTsKKyAgICByZXR1cm47CisgIH0KKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgRENIRUNLX0VRKDAsIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmNvdW50KGNvbnRleHQpKTsKKyAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18uaW5zZXJ0KGNvbnRleHQpOworfQorCit2b2lkIFNlcnZpY2VXb3JrZXJDb250ZXh0OjpTZXRBY3RpdmVXb3JrZXIod2ViOjpFbnZpcm9ubWVudFNldHRpbmdzKiBjbGllbnQpIHsKKyAgaWYgKCFjbGllbnQpIHJldHVybjsKKyAgaWYgKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkgIT0gbWVzc2FnZV9sb29wKCkpIHsKKyAgICBEQ0hFQ0sobWVzc2FnZV9sb29wKCkpOworICAgIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKKyAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6U2V0QWN0aXZlV29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2xpZW50KSk7CisgICAgcmV0dXJuOworICB9CisgIERDSEVDSyhzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXyk7CisgIHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4gY2xpZW50X3JlZ2lzdHJhdGlvbiA9CisgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKAorICAgICAgICAgIGNsaWVudC0+T2J0YWluU3RvcmFnZUtleSgpLCBjbGllbnQtPmNyZWF0aW9uX3VybCgpKTsKKyAgaWYgKGNsaWVudF9yZWdpc3RyYXRpb24uZ2V0KCkgJiYgY2xpZW50X3JlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSB7CisgICAgY2xpZW50LT5jb250ZXh0KCktPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIoCisgICAgICAgIGNsaWVudF9yZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSk7CisgIH0gZWxzZSB7CisgICAgY2xpZW50LT5jb250ZXh0KCktPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIobnVsbHB0cik7CisgIH0KK30KKwordm9pZCBTZXJ2aWNlV29ya2VyQ29udGV4dDo6VW5yZWdpc3RlcldlYkNvbnRleHQod2ViOjpDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDS19ORShudWxscHRyLCBjb250ZXh0KTsKKyAgaWYgKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkgIT0gbWVzc2FnZV9sb29wKCkpIHsKKyAgICAvLyBCbG9jayB0byBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpcyB1bnJlZ2lzdGVyZWQgYmVmb3JlIGl0IGlzIGRlc3Ryb3llZC4KKyAgICBEQ0hFQ0sobWVzc2FnZV9sb29wKCkpOworICAgIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0QmxvY2tpbmdUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNlcnZpY2VXb3JrZXJDb250ZXh0OjpVbnJlZ2lzdGVyV2ViQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNvbnRleHQpKTsKKyAgICByZXR1cm47CisgIH0KKyAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgRENIRUNLX0VRKDEsIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmNvdW50KGNvbnRleHQpKTsKKyAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18uZXJhc2UoY29udGV4dCk7CisgIEhhbmRsZVNlcnZpY2VXb3JrZXJDbGllbnRVbmxvYWQoY29udGV4dCk7CisgIFByZXBhcmVGb3JDbGllbnRTaHV0ZG93bihjb250ZXh0KTsKKyAgaWYgKHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmVtcHR5KCkpIHsKKyAgICB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zX2NsZWFyZWRfLlNpZ25hbCgpOworICB9Cit9CisKK3ZvaWQgU2VydmljZVdvcmtlckNvbnRleHQ6OlByZXBhcmVGb3JDbGllbnRTaHV0ZG93bih3ZWI6OkNvbnRleHQqIGNsaWVudCkgeworICBEQ0hFQ0soY2xpZW50KTsKKyAgaWYgKCFjbGllbnQpIHJldHVybjsKKyAgRENIRUNLKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkgPT0gbWVzc2FnZV9sb29wKCkpOworICAvLyBOb3RlOiBUaGlzIGNvdWxkIGJlIHJld3JpdHRlbiB0byB1c2UgdGhlIGRlY29tcG9zaXRpb24gZGVjbGFyYXRpb24KKyAgLy8gJ2NvbnN0IGF1dG8mIFtzY29wZSwgcXVldWVdJyBhZnRlciBzd2l0Y2hpbmcgdG8gQysrMTcuCisgIGpvYnNfLT5QcmVwYXJlRm9yQ2xpZW50U2h1dGRvd24oY2xpZW50KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHdvcmtlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmggYi9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ2ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmgKQEAgLTAsMCArMSwyMjEgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfV09SS0VSX1NFUlZJQ0VfV09SS0VSX0NPTlRFWFRfSF8KKyNkZWZpbmUgQ09CQUxUX1dPUktFUl9TRVJWSUNFX1dPUktFUl9DT05URVhUX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9yZWZwdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvbWlzZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWVfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC93ZWIvY29udGV4dC5oIgorI2luY2x1ZGUgImNvYmFsdC93ZWIvd2ViX3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9jbGllbnRfcXVlcnlfb3B0aW9ucy5oIgorI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fbWFwLmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci93b3JrZXJfdHlwZS5oIgorI2luY2x1ZGUgInVybC9ndXJsLmgiCisjaW5jbHVkZSAidXJsL29yaWdpbi5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSB3b3JrZXIgeworCitjbGFzcyBTZXJ2aWNlV29ya2VySm9iczsKKworLy8gQWxnb3JpdGhtcyBmb3IgU2VydmljZSBXb3JrZXJzLgorLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNhbGdvcml0aG1zCitjbGFzcyBTZXJ2aWNlV29ya2VyQ29udGV4dCB7CisgcHVibGljOgorICBlbnVtIFJlZ2lzdHJhdGlvblN0YXRlIHsga0luc3RhbGxpbmcsIGtXYWl0aW5nLCBrQWN0aXZlIH07CisKKyAgU2VydmljZVdvcmtlckNvbnRleHQod2ViOjpXZWJTZXR0aW5ncyogd2ViX3NldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgd2ViOjpVc2VyQWdlbnRQbGF0Zm9ybUluZm8qIHBsYXRmb3JtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3AsIGNvbnN0IEdVUkwmIHVybCk7CisgIH5TZXJ2aWNlV29ya2VyQ29udGV4dCgpOworCisgIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3AoKSB7IHJldHVybiBtZXNzYWdlX2xvb3BfOyB9CisKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jc3RhcnQtcmVnaXN0ZXItYWxnb3JpdGhtCisgIHZvaWQgU3RhcnRSZWdpc3Rlcihjb25zdCBiYXNlOjpPcHRpb25hbDxHVVJMPiYgc2NvcGVfdXJsLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgc2NyaXB0X3VybCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgd2ViOjpDb250ZXh0KiBjbGllbnQsIGNvbnN0IFdvcmtlclR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlV29ya2VyVXBkYXRlVmlhQ2FjaGUmIHVwZGF0ZV92aWFfY2FjaGUpOworCisgIHZvaWQgTWF5YmVSZXNvbHZlUmVhZHlQcm9taXNlU3ViU3RlcHMod2ViOjpDb250ZXh0KiBjbGllbnQpOworCisgIC8vIFN1YiBzdGVwcyAoOCkgb2YgU2VydmljZVdvcmtlckNvbnRhaW5lci5nZXRSZWdpc3RyYXRpb24oKS4KKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNuYXZpZ2F0b3Itc2VydmljZS13b3JrZXItZ2V0UmVnaXN0cmF0aW9uCisgIHZvaWQgR2V0UmVnaXN0cmF0aW9uU3ViU3RlcHMoCisgICAgICBjb25zdCB1cmw6Ok9yaWdpbiYgc3RvcmFnZV9rZXksIGNvbnN0IEdVUkwmIGNsaWVudF91cmwsCisgICAgICB3ZWI6OkNvbnRleHQqIGNsaWVudCwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlKTsKKworICB2b2lkIEdldFJlZ2lzdHJhdGlvbnNTdWJTdGVwcygKKyAgICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgd2ViOjpDb250ZXh0KiBjbGllbnQsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VTZXF1ZW5jZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlKTsKKworICAvLyBTdWIgc3RlcHMgKDIpIG9mIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZS5za2lwV2FpdGluZygpLgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2RvbS1zZXJ2aWNld29ya2VyZ2xvYmFsc2NvcGUtc2tpcHdhaXRpbmcKKyAgdm9pZCBTa2lwV2FpdGluZ1N1YlN0ZXBzKAorICAgICAgd2ViOjpDb250ZXh0KiB3b3JrZXJfY29udGV4dCwgU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VWb2lkOjpSZWZlcmVuY2U+IHByb21pc2VfcmVmZXJlbmNlKTsKKworICAvLyBTdWIgc3RlcHMgZm9yIEV4dGVuZGFibGVFdmVudC5XYWl0VW50aWwoKS4KKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNkb20tZXh0ZW5kYWJsZWV2ZW50LXdhaXR1bnRpbAorICB2b2lkIFdhaXRVbnRpbFN1YlN0ZXBzKFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbik7CisKKyAgLy8gUGFyYWxsZWwgc3ViIHN0ZXBzICgyKSBmb3IgYWxnb3JpdGhtIGZvciBDbGllbnRzLmdldChpZCk6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jY2xpZW50cy1nZXQKKyAgdm9pZCBDbGllbnRzR2V0U3ViU3RlcHMoCisgICAgICB3ZWI6OkNvbnRleHQqIHdvcmtlcl9jb250ZXh0LAorICAgICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgorICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKKworICAvLyBQYXJhbGxlbCBzdWIgc3RlcHMgKDIpIGZvciBhbGdvcml0aG0gZm9yIENsaWVudHMubWF0Y2hBbGwoKToKKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGllbnRzLW1hdGNoYWxsCisgIHZvaWQgQ2xpZW50c01hdGNoQWxsU3ViU3RlcHMoCisgICAgICB3ZWI6OkNvbnRleHQqIHdvcmtlcl9jb250ZXh0LAorICAgICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVNlcXVlbmNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+CisgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UsCisgICAgICBib29sIGluY2x1ZGVfdW5jb250cm9sbGVkLCBDbGllbnRUeXBlIHR5cGUpOworCisgIC8vIFBhcmFsbGVsIHN1YiBzdGVwcyAoMykgZm9yIGFsZ29yaXRobSBmb3IgQ2xpZW50cy5jbGFpbSgpOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2RvbS1jbGllbnRzLWNsYWltCisgIHZvaWQgQ2xhaW1TdWJTdGVwcygKKyAgICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCisgICAgICBTZXJ2aWNlV29ya2VyT2JqZWN0KiBhc3NvY2lhdGVkX3NlcnZpY2Vfd29ya2VyLAorICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlX3JlZmVyZW5jZSk7CisKKyAgLy8gUGFyYWxsZWwgc3ViIHN0ZXBzICg2KSBmb3IgYWxnb3JpdGhtIGZvciBTZXJ2aWNlV29ya2VyLnBvc3RNZXNzYWdlKCk6CisgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jc2VydmljZS13b3JrZXItcG9zdG1lc3NhZ2Utb3B0aW9ucworICB2b2lkIFNlcnZpY2VXb3JrZXJQb3N0TWVzc2FnZVN1YlN0ZXBzKAorICAgICAgU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsIHdlYjo6Q29udGV4dCogaW5jdW1iZW50X2NsaWVudCwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4gc3RydWN0dXJlZF9jbG9uZSk7CisKKyAgLy8gUmVnaXN0cmF0aW9uIG9mIHdlYiBjb250ZXh0cyB0aGF0IG1heSBoYXZlIHNlcnZpY2Ugd29ya2Vycy4KKyAgdm9pZCBSZWdpc3RlcldlYkNvbnRleHQod2ViOjpDb250ZXh0KiBjb250ZXh0KTsKKyAgdm9pZCBVbnJlZ2lzdGVyV2ViQ29udGV4dCh3ZWI6OkNvbnRleHQqIGNvbnRleHQpOworICBib29sIElzV2ViQ29udGV4dFJlZ2lzdGVyZWQod2ViOjpDb250ZXh0KiBjb250ZXh0KSB7CisgICAgRENIRUNLKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkgPT0gbWVzc2FnZV9sb29wKCkpOworICAgIHJldHVybiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXy5lbmQoKSAhPQorICAgICAgICAgICB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXy5maW5kKGNvbnRleHQpOworICB9CisKKyAgLy8gRW5zdXJlIG5vIHJlZmVyZW5jZXMgYXJlIGtlcHQgdG8gSlMgb2JqZWN0cyBmb3IgYSBjbGllbnQgdGhhdCBpcyBhYm91dCB0bworICAvLyBiZSBzaHV0ZG93bi4KKyAgdm9pZCBQcmVwYXJlRm9yQ2xpZW50U2h1dGRvd24od2ViOjpDb250ZXh0KiBjbGllbnQpOworCisgIC8vIFNldCB0aGUgYWN0aXZlIHdvcmtlciBmb3IgYSBjbGllbnQgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBzZXJ2aWNlIHdvcmtlci4KKyAgdm9pZCBTZXRBY3RpdmVXb3JrZXIod2ViOjpFbnZpcm9ubWVudFNldHRpbmdzKiBjbGllbnQpOworCisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2FjdGl2YXRpb24tYWxnb3JpdGhtCisgIHZvaWQgQWN0aXZhdGUoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGVhci1yZWdpc3RyYXRpb24tYWxnb3JpdGhtCisgIHZvaWQgQ2xlYXJSZWdpc3RyYXRpb24oU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzb2Z0LXVwZGF0ZQorICB2b2lkIFNvZnRVcGRhdGUoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uLAorICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9ieXBhc3NfY2FjaGUpOworCisgIHZvaWQgRW5zdXJlU2VydmljZVdvcmtlclN0YXJ0ZWQoY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIGNsaWVudF91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCk7CisKKyAgU2VydmljZVdvcmtlckpvYnMqIGpvYnMoKSB7IHJldHVybiBqb2JzXy5nZXQoKTsgfQorICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uTWFwKiByZWdpc3RyYXRpb25fbWFwKCkgeworICAgIHJldHVybiBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy5nZXQoKTsKKyAgfQorICBjb25zdCBzdGQ6OnNldDx3ZWI6OkNvbnRleHQqPiYgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc187CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlV29ya2VySm9iczsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNydW4tc2VydmljZS13b3JrZXItYWxnb3JpdGhtCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYSAnQ29tcGxldGlvbiBvciBmYWlsdXJlJy4KKyAgLy8gQSBmYWlsdXJlIGlzIHNpZ25hbGVkIGJ5IHJldHVybmluZyBudWxscHRyLiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBzdHJpbmcKKyAgLy8gcG9pbnRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgQ29tcGxldGlvbiByZXR1cm5lZCBieSB0aGUgc2NyaXB0IHJ1bm5lcgorICAvLyBhYnN0cmFjdGlvbi4KKyAgc3RkOjpzdHJpbmcqIFJ1blNlcnZpY2VXb3JrZXIoU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2J5cGFzc19jYWNoZSA9IGZhbHNlKTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN0cnktYWN0aXZhdGUtYWxnb3JpdGhtCisgIHZvaWQgVHJ5QWN0aXZhdGUoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzZXJ2aWNlLXdvcmtlci1oYXMtbm8tcGVuZGluZy1ldmVudHMKKyAgYm9vbCBTZXJ2aWNlV29ya2VySGFzTm9QZW5kaW5nRXZlbnRzKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlcik7CisKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdXBkYXRlLXJlZ2lzdHJhdGlvbi1zdGF0ZS1hbGdvcml0aG0KKyAgdm9pZCBVcGRhdGVSZWdpc3RyYXRpb25TdGF0ZSgKKyAgICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbiwgUmVnaXN0cmF0aW9uU3RhdGUgdGFyZ2V0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiYgc291cmNlKTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN1cGRhdGUtc3RhdGUtYWxnb3JpdGhtCisgIHZvaWQgVXBkYXRlV29ya2VyU3RhdGUoU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyLCBTZXJ2aWNlV29ya2VyU3RhdGUgc3RhdGUpOworCisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI29uLWNsaWVudC11bmxvYWQtYWxnb3JpdGhtCisgIHZvaWQgSGFuZGxlU2VydmljZVdvcmtlckNsaWVudFVubG9hZCh3ZWI6OkNvbnRleHQqIGNsaWVudCk7CisKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdGVybWluYXRlLXNlcnZpY2Utd29ya2VyCisgIHZvaWQgVGVybWluYXRlU2VydmljZVdvcmtlcihTZXJ2aWNlV29ya2VyT2JqZWN0KiB3b3JrZXIpOworCisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI25vdGlmeS1jb250cm9sbGVyLWNoYW5nZS1hbGdvcml0aG0KKyAgdm9pZCBOb3RpZnlDb250cm9sbGVyQ2hhbmdlKHdlYjo6Q29udGV4dCogY2xpZW50KTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN0cnktY2xlYXItcmVnaXN0cmF0aW9uLWFsZ29yaXRobQorICB2b2lkIFRyeUNsZWFyUmVnaXN0cmF0aW9uKFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbik7CisKKyAgYm9vbCBJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKAorICAgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKKworICAvLyBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KKyAgYm9vbCBXYWl0Rm9yQXN5bmNocm9ub3VzRXh0ZW5zaW9ucygKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4mIHJlZ2lzdHJhdGlvbik7CisKKyAgYmFzZTo6TWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcF87CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25NYXA+IHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfOworCisgIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlV29ya2VySm9icz4gam9ic187CisKKyAgc3RkOjpzZXQ8d2ViOjpDb250ZXh0Kj4gd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc187CisKKyAgYmFzZTo6V2FpdGFibGVFdmVudCB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zX2NsZWFyZWRfID0geworICAgICAgYmFzZTo6V2FpdGFibGVFdmVudDo6UmVzZXRQb2xpY3k6Ok1BTlVBTCwKKyAgICAgIGJhc2U6OldhaXRhYmxlRXZlbnQ6OkluaXRpYWxTdGF0ZTo6Tk9UX1NJR05BTEVEfTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3b3JrZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfV09SS0VSX1NFUlZJQ0VfV09SS0VSX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfZ2xvYmFsX3Njb3BlLmNjIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUuY2MKaW5kZXggMDZiN2RhZS4uNDk1MDQ2ZiAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUuY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUuY2MKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL2NsaWVudHMuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL2ZldGNoX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9mZXRjaF9ldmVudF9pbml0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci93b3JrZXJfc2V0dGluZ3MuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0xODAsMTIgKzE4MCwxMiBAQAogICAgICAgbmV3IHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlKHRoaXMsIHByb21pc2UpKTsKIAogICAvLyAyLiBSdW4gdGhlIGZvbGxvd2luZyBzdWJzdGVwcyBpbiBwYXJhbGxlbDoKLSAgd29ya2VyOjpTZXJ2aWNlV29ya2VySm9icyogam9icyA9Ci0gICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKLSAgam9icy0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICBTZXJ2aWNlV29ya2VyQ29udGV4dCogd29ya2VyX2NvbnRleHQgPQorICAgICAgZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y29udGV4dCgpLT5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0KCk7CisgIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCiAgICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckpvYnM6OlNraXBXYWl0aW5nU3ViU3RlcHMsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGpvYnMpLAorICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250ZXh0OjpTa2lwV2FpdGluZ1N1YlN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3b3JrZXJfY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKSksCiAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHNlcnZpY2Vfd29ya2VyX29iamVjdF8uZ2V0KCkpLAogICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb21pc2VfcmVmZXJlbmNlKSkpOwpAQCAtMjI2LDEzICsyMjYsMTMgQEAKICAgYXV0byogcmVnaXN0cmF0aW9uID0KICAgICAgIHNlcnZpY2Vfd29ya2VyX29iamVjdF8tPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCk7CiAgIGlmIChyZWdpc3RyYXRpb24gJiYgKG1haW5fcmVzb3VyY2UgfHwgcmVnaXN0cmF0aW9uLT5zdGFsZSgpKSkgewotICAgIHdvcmtlcjo6U2VydmljZVdvcmtlckpvYnMqIGpvYnMgPQotICAgICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2pvYnMoKTsKLSAgICBqb2JzLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpTb2Z0VXBkYXRlLCBiYXNlOjpVbnJldGFpbmVkKGpvYnMpLAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlZ2lzdHJhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgIC8qZm9yY2VfYnlwYXNzX2NhY2hlPSovZmFsc2UpKTsKKyAgICBTZXJ2aWNlV29ya2VyQ29udGV4dCogd29ya2VyX2NvbnRleHQgPQorICAgICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKTsKKyAgICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6U29mdFVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHdvcmtlcl9jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHJlZ2lzdHJhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmb3JjZV9ieXBhc3NfY2FjaGU9Ki9mYWxzZSkpOwogICB9CiAKICAgLy8gVE9ETzogaGFuZGxlIHRoZSBmb2xsb3dpbmcgc3RlcHMgaW4KZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5jYyBiL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5jYwppbmRleCA4Mjg4Y2Y5Li41YzkzNTc1IDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2pvYnMuY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmNjCkBAIC0xNCw3MSArMTQsMjIgQEAKIAogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5oIgogCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQogI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfbG9vcF9jdXJyZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3Rhc2tfcnVubmVyLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Rhc2tfcnVubmVyX2hhbmRsZS5oIgogI2luY2x1ZGUgImJhc2UvdGltZS90aW1lLmgiCiAjaW5jbHVkZSAiYmFzZS90cmFjZV9ldmVudC90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3R5cGVfaWQuaCIKLSNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL3NjcmlwdF9sb2FkZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9taXNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKLSNpbmNsdWRlICJjb2JhbHQvd2ViL2NvbnRleHQuaCIKLSNpbmNsdWRlICJjb2JhbHQvd2ViL2RvbV9leGNlcHRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL2Vudmlyb25tZW50X3NldHRpbmdzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dlYi9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC93ZWIvd2luZG93X29yX3dvcmtlcl9nbG9iYWxfc2NvcGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL2NsaWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvY2xpZW50X3F1ZXJ5X29wdGlvbnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL2NsaWVudF90eXBlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9leHRlbmRhYmxlX21lc3NhZ2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL2ZyYW1lX3R5cGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb25zdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRhaW5lci5oIgotI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfZ2xvYmFsX3Njb3BlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9vYmplY3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3VwZGF0ZV92aWFfY2FjaGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3dpbmRvd19jbGllbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3dvcmtlcl90eXBlLmgiCiAjaW5jbHVkZSAibmV0L2Jhc2UvbWltZV91dGlsLmgiCiAjaW5jbHVkZSAibmV0L2Jhc2UvdXJsX3V0aWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL2F0b21pYy5oIgotI2luY2x1ZGUgInVybC9ndXJsLmgiCi0jaW5jbHVkZSAidXJsL29yaWdpbi5oIgotCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHdvcmtlciB7CiAKIG5hbWVzcGFjZSB7CiAKLWNvbnN0IGJhc2U6OlRpbWVEZWx0YSBrV2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnNUaW1lb3V0ID0KLSAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDMpOwotCi1jb25zdCBiYXNlOjpUaW1lRGVsdGEga1NodXRkb3duV2FpdFRpbWVvdXRTZWNzID0KLSAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDUpOwotCiBib29sIFBhdGhDb250YWluc0VzY2FwZWRTbGFzaChjb25zdCBHVVJMJiB1cmwpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9IHVybC5wYXRoKCk7CiAgIHJldHVybiAocGF0aC5maW5kKCIlMmYiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fApAQCAtMTM0LDE2NCArODUsMjIgQEAKIGJvb2wgUGVybWl0QW55Tm9uUmVkaXJlY3RlZFVSTChjb25zdCBHVVJMJiwgYm9vbCBkaWRfcmVkaXJlY3QpIHsKICAgcmV0dXJuICFkaWRfcmVkaXJlY3Q7CiB9CisKIH0gIC8vIG5hbWVzcGFjZQogCi1TZXJ2aWNlV29ya2VySm9iczo6U2VydmljZVdvcmtlckpvYnMod2ViOjpXZWJTZXR0aW5ncyogd2ViX3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUqIG5ldHdvcmtfbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYjo6VXNlckFnZW50UGxhdGZvcm1JbmZvKiBwbGF0Zm9ybV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgdXJsKQotICAgIDogbWVzc2FnZV9sb29wXyhtZXNzYWdlX2xvb3ApIHsKK1NlcnZpY2VXb3JrZXJKb2JzOjpTZXJ2aWNlV29ya2VySm9icygKKyAgICBTZXJ2aWNlV29ya2VyQ29udGV4dCogc2VydmljZV93b3JrZXJfY29udGV4dCwKKyAgICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwgYmFzZTo6TWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcCkKKyAgICA6IHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfKHNlcnZpY2Vfd29ya2VyX2NvbnRleHQpLAorICAgICAgbWVzc2FnZV9sb29wXyhtZXNzYWdlX2xvb3ApIHsKICAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcF8sIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwogICBmZXRjaGVyX2ZhY3RvcnlfLnJlc2V0KG5ldyBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KG5ldHdvcmtfbW9kdWxlKSk7Ci0gIERDSEVDSyhmZXRjaGVyX2ZhY3RvcnlfKTsKIAogICBzY3JpcHRfbG9hZGVyX2ZhY3RvcnlfLnJlc2V0KG5ldyBsb2FkZXI6OlNjcmlwdExvYWRlckZhY3RvcnkoCiAgICAgICAiU2VydmljZVdvcmtlckpvYnMiLCBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpKSk7Ci0gIERDSEVDSyhzY3JpcHRfbG9hZGVyX2ZhY3RvcnlfKTsKLQotICBTZXJ2aWNlV29ya2VyUGVyc2lzdGVudFNldHRpbmdzOjpPcHRpb25zIG9wdGlvbnMod2ViX3NldHRpbmdzLCBuZXR3b3JrX21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2luZm8sIHRoaXMsIHVybCk7Ci0gIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLnJlc2V0KG5ldyBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uTWFwKG9wdGlvbnMpKTsKLSAgRENIRUNLKHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfKTsKIH0KIAotU2VydmljZVdvcmtlckpvYnM6On5TZXJ2aWNlV29ya2VySm9icygpIHsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPkhhbmRsZVVzZXJBZ2VudFNodXRkb3duKHRoaXMpOwotICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+QWJvcnRBbGxBY3RpdmUoKTsKLSAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8ucmVzZXQoKTsKLSAgaWYgKCF3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXy5lbXB0eSgpKSB7Ci0gICAgLy8gQWJvcnQgYW55IFNlcnZpY2UgV29ya2VycyB0aGF0IHJlbWFpbi4KLSAgICBmb3IgKGF1dG8mIGNvbnRleHQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgewotICAgICAgRENIRUNLKGNvbnRleHQpOwotICAgICAgaWYgKGNvbnRleHQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKS0+SXNTZXJ2aWNlV29ya2VyKCkpIHsKLSAgICAgICAgU2VydmljZVdvcmtlckdsb2JhbFNjb3BlKiBzZXJ2aWNlX3dvcmtlciA9Ci0gICAgICAgICAgICBjb250ZXh0LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCktPkFzU2VydmljZVdvcmtlcigpOwotICAgICAgICBpZiAoc2VydmljZV93b3JrZXIgJiYgc2VydmljZV93b3JrZXItPnNlcnZpY2Vfd29ya2VyX29iamVjdCgpKSB7Ci0gICAgICAgICAgc2VydmljZV93b3JrZXItPnNlcnZpY2Vfd29ya2VyX29iamVjdCgpLT5BYm9ydCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2FpdCBmb3Igd2ViIGNvbnRleHQgcmVnaXN0cmF0aW9ucyB0byBiZSBjbGVhcmVkLgotICAgIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfY2xlYXJlZF8uVGltZWRXYWl0KGtTaHV0ZG93bldhaXRUaW1lb3V0U2Vjcyk7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6U3RhcnRSZWdpc3RlcigKLSAgICBjb25zdCBiYXNlOjpPcHRpb25hbDxHVVJMPiYgbWF5YmVfc2NvcGVfdXJsLAotICAgIGNvbnN0IEdVUkwmIHNjcmlwdF91cmxfd2l0aF9mcmFnbWVudCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4gcHJvbWlzZV9yZWZlcmVuY2UsCi0gICAgd2ViOjpDb250ZXh0KiBjbGllbnQsIGNvbnN0IFdvcmtlclR5cGUmIHR5cGUsCi0gICAgY29uc3QgU2VydmljZVdvcmtlclVwZGF0ZVZpYUNhY2hlJiB1cGRhdGVfdmlhX2NhY2hlKSB7Ci0gIFRSQUNFX0VWRU5UMigiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckpvYnM6OlN0YXJ0UmVnaXN0ZXIoKSIsICJzY29wZSIsCi0gICAgICAgICAgICAgICBtYXliZV9zY29wZV91cmwudmFsdWVfb3IoR1VSTCgpKS5zcGVjKCksICJzY3JpcHQiLAotICAgICAgICAgICAgICAgc2NyaXB0X3VybF93aXRoX2ZyYWdtZW50LnNwZWMoKSk7Ci0gIERDSEVDS19ORShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIERDSEVDS19FUShjbGllbnQtPm1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgLy8gQWxnb3JpdGhtIGZvciBTdGFydCBSZWdpc3RlcjoKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzdGFydC1yZWdpc3Rlci1hbGdvcml0aG0KLSAgLy8gMS4gSWYgc2NyaXB0VVJMIGlzIGZhaWx1cmUsIHJlamVjdCBwcm9taXNlIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlCi0gIC8vICAgIHN0ZXBzLgotICBpZiAoc2NyaXB0X3VybF93aXRoX2ZyYWdtZW50LmlzX2VtcHR5KCkpIHsKLSAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3Qoc2NyaXB0OjprVHlwZUVycm9yKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyAyLiBTZXQgc2NyaXB0VVJM4oCZcyBmcmFnbWVudCB0byBudWxsLgotICB1cmw6OlJlcGxhY2VtZW50czxjaGFyPiByZXBsYWNlbWVudHM7Ci0gIHJlcGxhY2VtZW50cy5DbGVhclJlZigpOwotICBHVVJMIHNjcmlwdF91cmwgPSBzY3JpcHRfdXJsX3dpdGhfZnJhZ21lbnQuUmVwbGFjZUNvbXBvbmVudHMocmVwbGFjZW1lbnRzKTsKLSAgRENIRUNLKCFzY3JpcHRfdXJsLmhhc19yZWYoKSB8fCBzY3JpcHRfdXJsLnJlZigpLmVtcHR5KCkpOwotICBEQ0hFQ0soIXNjcmlwdF91cmwuaXNfZW1wdHkoKSk7Ci0KLSAgLy8gMy4gSWYgc2NyaXB0VVJM4oCZcyBzY2hlbWUgaXMgbm90IG9uZSBvZiAiaHR0cCIgYW5kICJodHRwcyIsIHJlamVjdCBwcm9taXNlCi0gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgotICBpZiAoIXNjcmlwdF91cmwuU2NoZW1lSXNIVFRQT3JIVFRQUygpKSB7Ci0gICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gNC4gSWYgYW55IG9mIHRoZSBzdHJpbmdzIGluIHNjcmlwdFVSTOKAmXMgcGF0aCBjb250YWlucyBlaXRoZXIgQVNDSUkKLSAgLy8gICAgY2FzZS1pbnNlbnNpdGl2ZSAiJTJmIiBvciBBU0NJSSBjYXNlLWluc2Vuc2l0aXZlICIlNWMiLCByZWplY3QgcHJvbWlzZQotICAvLyAgICB3aXRoIGEgVHlwZUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KLSAgaWYgKFBhdGhDb250YWluc0VzY2FwZWRTbGFzaChzY3JpcHRfdXJsKSkgewotICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERDSEVDSyhjbGllbnQpOwotICB3ZWI6OldpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUqIHdpbmRvd19vcl93b3JrZXJfZ2xvYmFsX3Njb3BlID0KLSAgICAgIGNsaWVudC0+R2V0V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSgpOwotICBEQ0hFQ0sod2luZG93X29yX3dvcmtlcl9nbG9iYWxfc2NvcGUpOwotICB3ZWI6OkNzcERlbGVnYXRlKiBjc3BfZGVsZWdhdGUgPQotICAgICAgd2luZG93X29yX3dvcmtlcl9nbG9iYWxfc2NvcGUtPmNzcF9kZWxlZ2F0ZSgpOwotICBEQ0hFQ0soY3NwX2RlbGVnYXRlKTsKLSAgaWYgKCFjc3BfZGVsZWdhdGUtPkNhbkxvYWQod2ViOjpDc3BEZWxlZ2F0ZTo6a1dvcmtlciwgc2NyaXB0X3VybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlkX3JlZGlyZWN0Ki8gZmFsc2UpKSB7Ci0gICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVqZWN0KG5ldyB3ZWI6OkRPTUV4Y2VwdGlvbigKLSAgICAgICAgd2ViOjpET01FeGNlcHRpb246OmtTZWN1cml0eUVyciwKLSAgICAgICAgIkZhaWxlZCB0byByZWdpc3RlciBhIFNlcnZpY2VXb3JrZXI6IFRoZSBwcm92aWRlZCBzY3JpcHRVUkwgKCciICsKLSAgICAgICAgICAgIHNjcmlwdF91cmwuc3BlYygpICsgIicpIHZpb2xhdGVzIHRoZSBDb250ZW50IFNlY3VyaXR5IFBvbGljeS4iKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gNS4gSWYgc2NvcGVVUkwgaXMgbnVsbCwgc2V0IHNjb3BlVVJMIHRvIHRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgc3RyaW5nCi0gIC8vICAgICIuLyIgd2l0aCBzY3JpcHRVUkwuCi0gIEdVUkwgc2NvcGVfdXJsID0gbWF5YmVfc2NvcGVfdXJsLnZhbHVlX29yKHNjcmlwdF91cmwuUmVzb2x2ZSgiLi8iKSk7Ci0KLSAgLy8gNi4gSWYgc2NvcGVVUkwgaXMgZmFpbHVyZSwgcmVqZWN0IHByb21pc2Ugd2l0aCBhIFR5cGVFcnJvciBhbmQgYWJvcnQgdGhlc2UKLSAgLy8gICAgc3RlcHMuCi0gIGlmIChzY29wZV91cmwuaXNfZW1wdHkoKSkgewotICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIDcuIFNldCBzY29wZVVSTOKAmXMgZnJhZ21lbnQgdG8gbnVsbC4KLSAgc2NvcGVfdXJsID0gc2NvcGVfdXJsLlJlcGxhY2VDb21wb25lbnRzKHJlcGxhY2VtZW50cyk7Ci0gIERDSEVDSyghc2NvcGVfdXJsLmhhc19yZWYoKSB8fCBzY29wZV91cmwucmVmKCkuZW1wdHkoKSk7Ci0gIERDSEVDSyghc2NvcGVfdXJsLmlzX2VtcHR5KCkpOwotCi0gIC8vIDguIElmIHNjb3BlVVJM4oCZcyBzY2hlbWUgaXMgbm90IG9uZSBvZiAiaHR0cCIgYW5kICJodHRwcyIsIHJlamVjdCBwcm9taXNlCi0gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgotICBpZiAoIXNjb3BlX3VybC5TY2hlbWVJc0hUVFBPckhUVFBTKCkpIHsKLSAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3Qoc2NyaXB0OjprVHlwZUVycm9yKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyA5LiBJZiBhbnkgb2YgdGhlIHN0cmluZ3MgaW4gc2NvcGVVUkzigJlzIHBhdGggY29udGFpbnMgZWl0aGVyIEFTQ0lJCi0gIC8vICAgIGNhc2UtaW5zZW5zaXRpdmUgIiUyZiIgb3IgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSAiJTVjIiwgcmVqZWN0IHByb21pc2UKLSAgLy8gICAgd2l0aCBhIFR5cGVFcnJvciBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCi0gIGlmIChQYXRoQ29udGFpbnNFc2NhcGVkU2xhc2goc2NvcGVfdXJsKSkgewotICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIDEwLiBMZXQgc3RvcmFnZSBrZXkgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIG9idGFpbiBhIHN0b3JhZ2Uga2V5IGdpdmVuCi0gIC8vICAgICBjbGllbnQuCi0gIHVybDo6T3JpZ2luIHN0b3JhZ2Vfa2V5ID0gY2xpZW50LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpLT5PYnRhaW5TdG9yYWdlS2V5KCk7Ci0KLSAgLy8gMTEuIExldCBqb2IgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIENyZWF0ZSBKb2Igd2l0aCByZWdpc3Rlciwgc3RvcmFnZSBrZXksCi0gIC8vICAgICBzY29wZVVSTCwgc2NyaXB0VVJMLCBwcm9taXNlLCBhbmQgY2xpZW50LgotICBzdGQ6OnVuaXF1ZV9wdHI8Sm9iPiBqb2IgPQotICAgICAgQ3JlYXRlSm9iKGtSZWdpc3Rlciwgc3RvcmFnZV9rZXksIHNjb3BlX3VybCwgc2NyaXB0X3VybCwKLSAgICAgICAgICAgICAgICBKb2JQcm9taXNlVHlwZTo6Q3JlYXRlKHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpLCBjbGllbnQpOwotICBEQ0hFQ0soIXByb21pc2VfcmVmZXJlbmNlKTsKLQotICAvLyAxMi4gU2V0IGpvYuKAmXMgd29ya2VyIHR5cGUgdG8gd29ya2VyVHlwZS4KLSAgLy8gQ29iYWx0IG9ubHkgc3VwcG9ydHMgJ2NsYXNzaWMnIHdvcmtlciB0eXBlLgotCi0gIC8vIDEzLiBTZXQgam9i4oCZcyB1cGRhdGUgdmlhIGNhY2hlIG1vZGUgdG8gdXBkYXRlVmlhQ2FjaGUuCi0gIGpvYi0+dXBkYXRlX3ZpYV9jYWNoZSA9IHVwZGF0ZV92aWFfY2FjaGU7Ci0KLSAgLy8gMTQuIFNldCBqb2LigJlzIHJlZmVycmVyIHRvIHJlZmVycmVyLgotICAvLyBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzIHNldCBpbiBDcmVhdGVKb2IoKS4KLQotICAvLyAxNS4gSW52b2tlIFNjaGVkdWxlIEpvYiB3aXRoIGpvYi4KLSAgU2NoZWR1bGVKb2Ioc3RkOjptb3ZlKGpvYikpOwotICBEQ0hFQ0soIWpvYi5nZXQoKSk7Ci19CitTZXJ2aWNlV29ya2VySm9iczo6flNlcnZpY2VXb3JrZXJKb2JzKCkge30KIAogdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6UHJvbWlzZUVycm9yRGF0YTo6UmVqZWN0KAogICAgIHN0ZDo6dW5pcXVlX3B0cjxKb2JQcm9taXNlVHlwZT4gcHJvbWlzZSkgY29uc3QgewpAQCAtMzY2LDcgKzE3NSw3IEBACiAgICAgLy8gNS4xLiBTZXQgam9i4oCZcyBjb250YWluaW5nIGpvYiBxdWV1ZSB0byBqb2JRdWV1ZSwgYW5kIGVucXVldWUgam9iIHRvCiAgICAgLy8gam9iUXVldWUuCiAgICAgam9iLT5jb250YWluaW5nX2pvYl9xdWV1ZSA9IGpvYl9xdWV1ZTsKLSAgICBpZiAoIUlzV2ViQ29udGV4dFJlZ2lzdGVyZWQoam9iLT5jbGllbnQpKSB7CisgICAgaWYgKCFzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+SXNXZWJDb250ZXh0UmVnaXN0ZXJlZChqb2ItPmNsaWVudCkpIHsKICAgICAgIC8vIE5vdGU6IFRoZSBjbGllbnQgdGhhdCByZXF1ZXN0ZWQgdGhlIGpvYiBoYXMgYWxyZWFkeSBleGl0ZWQgYW5kIGlzbid0CiAgICAgICAvLyBhYmxlIHRvIGhhbmRsZSB0aGUgcHJvbWlzZS4KICAgICAgIGpvYi0+Y29udGFpbmluZ19qb2JfcXVldWUtPlByZXBhcmVKb2JGb3JDbGllbnRTaHV0ZG93bihqb2IsIGpvYi0+Y2xpZW50KTsKQEAgLTM5Niw3ICsyMDUsNyBAQAogICAgIC8vIDYuMy4gRWxzZSwgc2V0IGpvYuKAmXMgY29udGFpbmluZyBqb2IgcXVldWUgdG8gam9iUXVldWUsIGFuZCBlbnF1ZXVlIGpvYiB0bwogICAgIC8vIGpvYlF1ZXVlLgogICAgIGpvYi0+Y29udGFpbmluZ19qb2JfcXVldWUgPSBqb2JfcXVldWU7Ci0gICAgaWYgKCFJc1dlYkNvbnRleHRSZWdpc3RlcmVkKGpvYi0+Y2xpZW50KSkgeworICAgIGlmICghc2VydmljZV93b3JrZXJfY29udGV4dF8tPklzV2ViQ29udGV4dFJlZ2lzdGVyZWQoam9iLT5jbGllbnQpKSB7CiAgICAgICAvLyBOb3RlOiBUaGUgY2xpZW50IHRoYXQgcmVxdWVzdGVkIHRoZSBqb2IgaGFzIGFscmVhZHkgZXhpdGVkIGFuZCBpc24ndAogICAgICAgLy8gYWJsZSB0byBoYW5kbGUgdGhlIHByb21pc2UuCiAgICAgICBqb2ItPmNvbnRhaW5pbmdfam9iX3F1ZXVlLT5QcmVwYXJlSm9iRm9yQ2xpZW50U2h1dGRvd24oam9iLCBqb2ItPmNsaWVudCk7CkBAIC01NDYsOCArMzU1LDggQEAKICAgLy8gNC4gTGV0IHJlZ2lzdHJhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgR2V0IFJlZ2lzdHJhdGlvbiBnaXZlbiBqb2LigJlzCiAgIC8vIHN0b3JhZ2Uga2V5IGFuZCBqb2LigJlzIHNjb3BlIHVybC4KICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiByZWdpc3RyYXRpb24gPQotICAgICAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPkdldFJlZ2lzdHJhdGlvbihqb2ItPnN0b3JhZ2Vfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2ItPnNjb3BlX3VybCk7CisgICAgICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+cmVnaXN0cmF0aW9uX21hcCgpLT5HZXRSZWdpc3RyYXRpb24oCisgICAgICAgICAgam9iLT5zdG9yYWdlX2tleSwgam9iLT5zY29wZV91cmwpOwogCiAgIC8vIDUuIElmIHJlZ2lzdHJhdGlvbiBpcyBub3QgbnVsbCwgdGhlbjoKICAgaWYgKHJlZ2lzdHJhdGlvbikgewpAQCAtNTczLDcgKzM4Miw3IEBACiAKICAgICAvLyA2LjEgSW52b2tlIFNldCBSZWdpc3RyYXRpb24gYWxnb3JpdGhtIHdpdGggam9i4oCZcyBzdG9yYWdlIGtleSwgam9i4oCZcyBzY29wZQogICAgIC8vIHVybCwgYW5kIGpvYuKAmXMgdXBkYXRlIHZpYSBjYWNoZSBtb2RlLgotICAgIHJlZ2lzdHJhdGlvbiA9IHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5TZXRSZWdpc3RyYXRpb24oCisgICAgcmVnaXN0cmF0aW9uID0gc2VydmljZV93b3JrZXJfY29udGV4dF8tPnJlZ2lzdHJhdGlvbl9tYXAoKS0+U2V0UmVnaXN0cmF0aW9uKAogICAgICAgICBqb2ItPnN0b3JhZ2Vfa2V5LCBqb2ItPnNjb3BlX3VybCwgam9iLT51cGRhdGVfdmlhX2NhY2hlKTsKICAgfQogCkBAIC01ODEsNjkgKzM5MCw2IEBACiAgIFVwZGF0ZShqb2IpOwogfQogCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpTb2Z0VXBkYXRlKAotICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbiwgYm9vbCBmb3JjZV9ieXBhc3NfY2FjaGUpIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VySm9iczo6U29mdFVwZGF0ZSgpIik7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIERDSEVDSyhyZWdpc3RyYXRpb24pOwotICAvLyBBbGdvcml0aG0gZm9yIFNvZnRVcGRhdGU6Ci0gIC8vICAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3NvZnQtdXBkYXRlCi0gIC8vIDEuIExldCBuZXdlc3RXb3JrZXIgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEdldCBOZXdlc3QgV29ya2VyIGFsZ29yaXRobQotICAvLyBwYXNzaW5nIHJlZ2lzdHJhdGlvbiBhcyBpdHMgYXJndW1lbnQuCi0gIFNlcnZpY2VXb3JrZXJPYmplY3QqIG5ld2VzdF93b3JrZXIgPSByZWdpc3RyYXRpb24tPkdldE5ld2VzdFdvcmtlcigpOwotCi0gIC8vIDIuIElmIG5ld2VzdFdvcmtlciBpcyBudWxsLCBhYm9ydCB0aGVzZSBzdGVwcy4KLSAgaWYgKG5ld2VzdF93b3JrZXIgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIDMuIExldCBqb2IgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIENyZWF0ZSBKb2Igd2l0aCB1cGRhdGUsIHJlZ2lzdHJhdGlvbuKAmXMKLSAgLy8gc3RvcmFnZSBrZXksIHJlZ2lzdHJhdGlvbuKAmXMgc2NvcGUgdXJsLCBuZXdlc3RXb3JrZXLigJlzIHNjcmlwdCB1cmwsIG51bGwsIGFuZAotICAvLyBudWxsLgotICBzdGQ6OnVuaXF1ZV9wdHI8Sm9iPiBqb2IgPSBDcmVhdGVKb2JXaXRob3V0UHJvbWlzZSgKLSAgICAgIGtVcGRhdGUsIHJlZ2lzdHJhdGlvbi0+c3RvcmFnZV9rZXkoKSwgcmVnaXN0cmF0aW9uLT5zY29wZV91cmwoKSwKLSAgICAgIG5ld2VzdF93b3JrZXItPnNjcmlwdF91cmwoKSk7Ci0KLSAgLy8gNC4gU2V0IGpvYuKAmXMgd29ya2VyIHR5cGUgdG8gbmV3ZXN0V29ya2Vy4oCZcyB0eXBlLgotICAvLyBDb2JhbHQgb25seSBzdXBwb3J0cyAnY2xhc3NpYycgd29ya2VyIHR5cGUuCi0KLSAgLy8gNS4gU2V0IGpvYuKAmXMgZm9yY2UgYnlwYXNzIGNhY2hlIGZsYWcgaWYgZm9yY2VCeXBhc3NDYWNoZSBpcyB0cnVlLgotICBqb2ItPmZvcmNlX2J5cGFzc19jYWNoZV9mbGFnID0gZm9yY2VfYnlwYXNzX2NhY2hlOwotCi0gIC8vIDYuIEludm9rZSBTY2hlZHVsZSBKb2Igd2l0aCBqb2IuCi0gIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpTY2hlZHVsZUpvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgc3RkOjptb3ZlKGpvYikpKTsKLSAgRENIRUNLKCFqb2IuZ2V0KCkpOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpFbnN1cmVTZXJ2aWNlV29ya2VyU3RhcnRlZCgKLSAgICBjb25zdCB1cmw6Ok9yaWdpbiYgc3RvcmFnZV9rZXksIGNvbnN0IEdVUkwmIGNsaWVudF91cmwsCi0gICAgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCkgewotICBpZiAobWVzc2FnZV9sb29wKCkgIT0gYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSkgewotICAgIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmU2VydmljZVdvcmtlckpvYnM6OkVuc3VyZVNlcnZpY2VXb3JrZXJTdGFydGVkLAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBzdG9yYWdlX2tleSwgY2xpZW50X3VybCwKLSAgICAgICAgICAgICAgICAgICAgICAgZG9uZV9ldmVudCkpOwotICAgIHJldHVybjsKLSAgfQotICBiYXNlOjpTY29wZWRDbG9zdXJlUnVubmVyIHNpZ25hbF9kb25lKGJhc2U6OkJpbmRPbmNlKAotICAgICAgW10oYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCkgeyBkb25lX2V2ZW50LT5TaWduYWwoKTsgfSwKLSAgICAgIGRvbmVfZXZlbnQpKTsKLSAgYmFzZTo6VGltZVRpY2tzIHN0YXJ0ID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKLSAgYXV0byByZWdpc3RyYXRpb24gPQotICAgICAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPkdldFJlZ2lzdHJhdGlvbihzdG9yYWdlX2tleSwgY2xpZW50X3VybCk7Ci0gIGlmICghcmVnaXN0cmF0aW9uKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gc2VydmljZV93b3JrZXJfb2JqZWN0ID0gcmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCk7Ci0gIGlmICghc2VydmljZV93b3JrZXJfb2JqZWN0IHx8IHNlcnZpY2Vfd29ya2VyX29iamVjdC0+aXNfcnVubmluZygpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNlcnZpY2Vfd29ya2VyX29iamVjdC0+T2J0YWluV2ViQWdlbnRBbmRXYWl0VW50aWxEb25lKCk7Ci19Ci0KIHZvaWQgU2VydmljZVdvcmtlckpvYnM6OlVwZGF0ZShKb2IqIGpvYikgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJKb2JzOjpVcGRhdGUoKSIpOwogICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwpAQCAtNjU0LDggKzQwMCw4IEBACiAgIC8vIDEuIExldCByZWdpc3RyYXRpb24gYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEdldCBSZWdpc3RyYXRpb24gZ2l2ZW4gam9i4oCZcwogICAvLyAgICBzdG9yYWdlIGtleSBhbmQgam9i4oCZcyBzY29wZSB1cmwuCiAgIHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4gcmVnaXN0cmF0aW9uID0KLSAgICAgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5HZXRSZWdpc3RyYXRpb24oam9iLT5zdG9yYWdlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iLT5zY29wZV91cmwpOworICAgICAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPnJlZ2lzdHJhdGlvbl9tYXAoKS0+R2V0UmVnaXN0cmF0aW9uKAorICAgICAgICAgIGpvYi0+c3RvcmFnZV9rZXksIGpvYi0+c2NvcGVfdXJsKTsKIAogICAvLyAyLiBJZiByZWdpc3RyYXRpb24gaXMgbnVsbCwgdGhlbjoKICAgaWYgKCFyZWdpc3RyYXRpb24pIHsKQEAgLTg0OSwxMiArNTk1LDEyIEBACiAgIC8vICAgOC4xOS4gSWYgcmVzcG9uc2XigJlzIGNhY2hlIHN0YXRlIGlzIG5vdCAibG9jYWwiLCBzZXQgcmVnaXN0cmF0aW9u4oCZcyBsYXN0CiAgIC8vICAgICAgICAgdXBkYXRlIGNoZWNrIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZS4KICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiByZWdpc3RyYXRpb24gPQotICAgICAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPkdldFJlZ2lzdHJhdGlvbihzdGF0ZS0+am9iLT5zdG9yYWdlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmpvYi0+c2NvcGVfdXJsKTsKKyAgICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5yZWdpc3RyYXRpb25fbWFwKCktPkdldFJlZ2lzdHJhdGlvbigKKyAgICAgICAgICBzdGF0ZS0+am9iLT5zdG9yYWdlX2tleSwgc3RhdGUtPmpvYi0+c2NvcGVfdXJsKTsKICAgaWYgKHJlZ2lzdHJhdGlvbikgewogICAgIHJlZ2lzdHJhdGlvbi0+c2V0X2xhc3RfdXBkYXRlX2NoZWNrX3RpbWUoYmFzZTo6VGltZTo6Tm93KCkpOwotICAgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5QZXJzaXN0UmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbi0+c3RvcmFnZV9rZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24tPnNjb3BlX3VybCgpKTsKKyAgICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+cmVnaXN0cmF0aW9uX21hcCgpLT5QZXJzaXN0UmVnaXN0cmF0aW9uKAorICAgICAgICByZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksIHJlZ2lzdHJhdGlvbi0+c2NvcGVfdXJsKCkpOwogICB9CiAgIC8vIFRPRE8oYi8yMjg5MDQwMTcpOgogICAvLyAgIDguMjAuIFNldCBoYXNVcGRhdGVkUmVzb3VyY2VzIHRvIHRydWUgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CkBAIC04OTIsOCArNjM4LDkgQEAKICAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKICAgYm9vbCBjaGVja19wcm9taXNlID0gIXN0YXRlLT5qb2ItPm5vX3Byb21pc2Vfb2theTsKICAgaWYgKHN0YXRlLT5qb2ItPm5vX3Byb21pc2Vfb2theSAmJiAhc3RhdGUtPmpvYi0+Y2xpZW50ICYmCi0gICAgICB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXy5zaXplKCkgPiAwKSB7Ci0gICAgc3RhdGUtPmpvYi0+Y2xpZW50ID0gKih3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXy5iZWdpbigpKTsKKyAgICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT53ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zKCkuc2l6ZSgpID4gMCkgeworICAgIHN0YXRlLT5qb2ItPmNsaWVudCA9CisgICAgICAgICooc2VydmljZV93b3JrZXJfY29udGV4dF8tPndlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnMoKS5iZWdpbigpKTsKICAgfQogICBpZiAoKGNoZWNrX3Byb21pc2UgJiYgIXN0YXRlLT5qb2ItPnByb21pc2UuZ2V0KCkpIHx8ICFzdGF0ZS0+am9iLT5jbGllbnQpIHsKICAgICAvLyBUaGUgam9iIGlzIGFscmVhZHkgcmVqZWN0ZWQsIHdoaWNoIG1lYW5zIHRoZXJlIHdhcyBhbiBlcnJvciwgb3IgdGhlCkBAIC05MDgsOCArNjU1LDggQEAKICAgICAgICAgc3RhdGUtPmpvYiwKICAgICAgICAgUHJvbWlzZUVycm9yRGF0YSh3ZWI6OkRPTUV4Y2VwdGlvbjo6a1NlY3VyaXR5RXJyLCBlcnJvci52YWx1ZSgpKSk7CiAgICAgaWYgKHN0YXRlLT5uZXdlc3Rfd29ya2VyID09IG51bGxwdHIpIHsKLSAgICAgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5SZW1vdmVSZWdpc3RyYXRpb24oc3RhdGUtPmpvYi0+c3RvcmFnZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5qb2ItPnNjb3BlX3VybCk7CisgICAgICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+cmVnaXN0cmF0aW9uX21hcCgpLT5SZW1vdmVSZWdpc3RyYXRpb24oCisgICAgICAgICAgc3RhdGUtPmpvYi0+c3RvcmFnZV9rZXksIHN0YXRlLT5qb2ItPnNjb3BlX3VybCk7CiAgICAgfQogICAgIEZpbmlzaEpvYihzdGF0ZS0+am9iKTsKICAgICByZXR1cm47CkBAIC05NTAsOCArNjk3LDggQEAKICAgICAvLyA5LjIuIElmIG5ld2VzdFdvcmtlciBpcyBudWxsLCB0aGVuIHJlbW92ZSByZWdpc3RyYXRpb24KICAgICAvLyAgICAgIG1hcFsocmVnaXN0cmF0aW9u4oCZcyBzdG9yYWdlIGtleSwgc2VyaWFsaXplZCBzY29wZVVSTCldLgogICAgIGlmIChzdGF0ZS0+bmV3ZXN0X3dvcmtlciA9PSBudWxscHRyKSB7Ci0gICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+UmVtb3ZlUmVnaXN0cmF0aW9uKHN0YXRlLT5qb2ItPnN0b3JhZ2Vfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+am9iLT5zY29wZV91cmwpOworICAgICAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPnJlZ2lzdHJhdGlvbl9tYXAoKS0+UmVtb3ZlUmVnaXN0cmF0aW9uKAorICAgICAgICAgIHN0YXRlLT5qb2ItPnN0b3JhZ2Vfa2V5LCBzdGF0ZS0+am9iLT5zY29wZV91cmwpOwogICAgIH0KICAgICAvLyA5LjMuIEludm9rZSBGaW5pc2ggSm9iIHdpdGggam9iIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICBGaW5pc2hKb2Ioc3RhdGUtPmpvYik7CkBAIC05NzgsOCArNzI1LDggQEAKICAgICAgICJTZXJ2aWNlV29ya2VyIiwgc3RhdGUtPmpvYi0+Y2xpZW50LT53ZWJfc2V0dGluZ3MoKSwKICAgICAgIHN0YXRlLT5qb2ItPmNsaWVudC0+bmV0d29ya19tb2R1bGUoKSwgc3RhdGUtPnJlZ2lzdHJhdGlvbik7CiAgIG9wdGlvbnMud2ViX29wdGlvbnMucGxhdGZvcm1faW5mbyA9IHN0YXRlLT5qb2ItPmNsaWVudC0+cGxhdGZvcm1faW5mbygpOwotICBvcHRpb25zLndlYl9vcHRpb25zLnNlcnZpY2Vfd29ya2VyX2pvYnMgPQotICAgICAgc3RhdGUtPmpvYi0+Y2xpZW50LT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCk7CisgIG9wdGlvbnMud2ViX29wdGlvbnMuc2VydmljZV93b3JrZXJfY29udGV4dCA9CisgICAgICBzdGF0ZS0+am9iLT5jbGllbnQtPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKTsKICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiB3b3JrZXIobmV3IFNlcnZpY2VXb3JrZXJPYmplY3Qob3B0aW9ucykpOwogICAvLyAxMi4gU2V0IHdvcmtlcuKAmXMgc2NyaXB0IHVybCB0byBqb2LigJlzIHNjcmlwdCB1cmwsIHdvcmtlcuKAmXMgc2NyaXB0CiAgIC8vICAgICByZXNvdXJjZSB0byBzY3JpcHQsIHdvcmtlcuKAmXMgdHlwZSB0byBqb2LigJlzIHdvcmtlciB0eXBlLCBhbmQgd29ya2Vy4oCZcwpAQCAtOTk2LDcgKzc0Myw4IEBACiAgIGJvb2wgZm9yY2VfYnlwYXNzX2NhY2hlID0gc3RhdGUtPmpvYi0+Zm9yY2VfYnlwYXNzX2NhY2hlX2ZsYWc7CiAgIC8vIDE2LiBMZXQgcnVuUmVzdWx0IGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgUnVuIFNlcnZpY2UgV29ya2VyCiAgIC8vICAgICBhbGdvcml0aG0gd2l0aCB3b3JrZXIgYW5kIGZvcmNlQnlwYXNzQ2FjaGUuCi0gIGF1dG8qIHJ1bl9yZXN1bHQgPSBSdW5TZXJ2aWNlV29ya2VyKHdvcmtlci5nZXQoKSwgZm9yY2VfYnlwYXNzX2NhY2hlKTsKKyAgYXV0byogcnVuX3Jlc3VsdCA9IHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5SdW5TZXJ2aWNlV29ya2VyKAorICAgICAgd29ya2VyLmdldCgpLCBmb3JjZV9ieXBhc3NfY2FjaGUpOwogICBib29sIHJ1bl9yZXN1bHRfaXNfc3VjY2VzcyA9IHJ1bl9yZXN1bHQ7CiAKICAgLy8gUG9zdCBhIHRhc2sgZm9yIHRoZSByZW1haW5pbmcgc3RlcHMsIHRvIGxldCB0YXNrcyBwb3N0ZWQgYnkKQEAgLTEwMTcsOCArNzY1LDggQEAKICAgICAvLyAxNy4yLiBJZiBuZXdlc3RXb3JrZXIgaXMgbnVsbCwgdGhlbiByZW1vdmUgcmVnaXN0cmF0aW9uCiAgICAgLy8gICAgICAgbWFwWyhyZWdpc3RyYXRpb27igJlzIHN0b3JhZ2Uga2V5LCBzZXJpYWxpemVkIHNjb3BlVVJMKV0uCiAgICAgaWYgKHN0YXRlLT5uZXdlc3Rfd29ya2VyID09IG51bGxwdHIpIHsKLSAgICAgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5SZW1vdmVSZWdpc3RyYXRpb24oc3RhdGUtPmpvYi0+c3RvcmFnZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5qb2ItPnNjb3BlX3VybCk7CisgICAgICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+cmVnaXN0cmF0aW9uX21hcCgpLT5SZW1vdmVSZWdpc3RyYXRpb24oCisgICAgICAgICAgc3RhdGUtPmpvYi0+c3RvcmFnZV9rZXksIHN0YXRlLT5qb2ItPnNjb3BlX3VybCk7CiAgICAgfQogICAgIC8vIDE3LjMuIEludm9rZSBGaW5pc2ggSm9iIHdpdGggam9iLgogICAgIEZpbmlzaEpvYihzdGF0ZS0+am9iKTsKQEAgLTEwMjksNjEgKzc3Nyw2IEBACiAgIH0KIH0KIAotc3RkOjpzdHJpbmcqIFNlcnZpY2VXb3JrZXJKb2JzOjpSdW5TZXJ2aWNlV29ya2VyKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2J5cGFzc19jYWNoZSkgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJKb2JzOjpSdW5TZXJ2aWNlV29ya2VyKCkiKTsKLQotICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICBEQ0hFQ0sod29ya2VyKTsKLSAgLy8gQWxnb3JpdGhtIGZvciAiUnVuIFNlcnZpY2UgV29ya2VyIgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3J1bi1zZXJ2aWNlLXdvcmtlci1hbGdvcml0aG0KLQotICAvLyAxLiBMZXQgdW5zYWZlQ3JlYXRpb25UaW1lIGJlIHRoZSB1bnNhZmUgc2hhcmVkIGN1cnJlbnQgdGltZS4KLSAgYXV0byB1bnNhZmVfY3JlYXRpb25fdGltZSA9IGJhc2U6OlRpbWVUaWNrczo6Tm93KCk7Ci0gIC8vIDIuIElmIHNlcnZpY2VXb3JrZXIgaXMgcnVubmluZywgdGhlbiByZXR1cm4gc2VydmljZVdvcmtlcuKAmXMgc3RhcnQgc3RhdHVzLgotICBpZiAod29ya2VyLT5pc19ydW5uaW5nKCkpIHsKLSAgICByZXR1cm4gd29ya2VyLT5zdGFydF9zdGF0dXMoKTsKLSAgfQotICAvLyAzLiBJZiBzZXJ2aWNlV29ya2Vy4oCZcyBzdGF0ZSBpcyAicmVkdW5kYW50IiwgdGhlbiByZXR1cm4gZmFpbHVyZS4KLSAgaWYgKHdvcmtlci0+c3RhdGUoKSA9PSBrU2VydmljZVdvcmtlclN0YXRlUmVkdW5kYW50KSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgLy8gNC4gQXNzZXJ0OiBzZXJ2aWNlV29ya2Vy4oCZcyBzdGFydCBzdGF0dXMgaXMgbnVsbC4KLSAgRENIRUNLKHdvcmtlci0+c3RhcnRfc3RhdHVzKCkgPT0gbnVsbHB0cik7Ci0gIC8vIDUuIExldCBzY3JpcHQgYmUgc2VydmljZVdvcmtlcuKAmXMgc2NyaXB0IHJlc291cmNlLgotICAvLyA2LiBBc3NlcnQ6IHNjcmlwdCBpcyBub3QgbnVsbC4KLSAgRENIRUNLKHdvcmtlci0+SGFzU2NyaXB0UmVzb3VyY2UoKSk7Ci0gIC8vIDcuIExldCBzdGFydEZhaWxlZCBiZSBmYWxzZS4KLSAgd29ya2VyLT5zdG9yZV9zdGFydF9mYWlsZWQoZmFsc2UpOwotICAvLyA4LiBMZXQgYWdlbnQgYmUgdGhlIHJlc3VsdCBvZiBvYnRhaW5pbmcgYSBzZXJ2aWNlIHdvcmtlciBhZ2VudCwgYW5kIHJ1biB0aGUKLSAgLy8gICAgZm9sbG93aW5nIHN0ZXBzIGluIHRoYXQgY29udGV4dDoKLSAgLy8gOS4gV2FpdCBmb3Igc2VydmljZVdvcmtlciB0byBiZSBydW5uaW5nLCBvciBmb3Igc3RhcnRGYWlsZWQgdG8gYmUgdHJ1ZS4KLSAgd29ya2VyLT5PYnRhaW5XZWJBZ2VudEFuZFdhaXRVbnRpbERvbmUoKTsKLSAgLy8gMTAuIElmIHN0YXJ0RmFpbGVkIGlzIHRydWUsIHRoZW4gcmV0dXJuIGZhaWx1cmUuCi0gIGlmICh3b3JrZXItPmxvYWRfc3RhcnRfZmFpbGVkKCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICAvLyAxMS4gUmV0dXJuIHNlcnZpY2VXb3JrZXLigJlzIHN0YXJ0IHN0YXR1cy4KLSAgcmV0dXJuIHdvcmtlci0+c3RhcnRfc3RhdHVzKCk7Ci19Ci0KLWJvb2wgU2VydmljZVdvcmtlckpvYnM6OldhaXRGb3JBc3luY2hyb25vdXNFeHRlbnNpb25zKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4mIHJlZ2lzdHJhdGlvbikgewotICAvLyBUT0RPKGIvMjQwMTY0Mzg4KTogSW52ZXN0aWdhdGUgYSBiZXR0ZXIgYXBwcm9hY2ggZm9yIGNvbWJpbmluZyB3YWl0aW5nCi0gIC8vIGZvciB0aGUgRXh0ZW5kYWJsZUV2ZW50IHdoaWxlIGFsc28gYWxsb3dpbmcgdXNlIG9mIGFsZ29yaXRobXMgdGhhdCBydW4KLSAgLy8gb24gdGhlIHNhbWUgdGhyZWFkIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIuCi0gIGJhc2U6OlRpbWVUaWNrcyB3YWl0X3N0YXJ0X3RpbWUgPSBiYXNlOjpUaW1lVGlja3M6Ok5vdygpOwotICBkbyB7Ci0gICAgaWYgKHJlZ2lzdHJhdGlvbi0+ZG9uZV9ldmVudCgpLT5UaW1lZFdhaXQoCi0gICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMTAwKSkpCi0gICAgICBicmVhazsKLSAgICBiYXNlOjpNZXNzYWdlTG9vcEN1cnJlbnQ6OlNjb3BlZE5lc3RhYmxlVGFza0FsbG93ZXIgYWxsb3c7Ci0gICAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOwotICB9IHdoaWxlICgoYmFzZTo6VGltZVRpY2tzOjpOb3coKSAtIHdhaXRfc3RhcnRfdGltZSkgPAotICAgICAgICAgICBrV2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnNUaW1lb3V0KTsKLSAgcmV0dXJuIHJlZ2lzdHJhdGlvbi0+ZG9uZV9ldmVudCgpLT5Jc1NpZ25hbGVkKCk7Ci19Ci0KIHZvaWQgU2VydmljZVdvcmtlckpvYnM6Okluc3RhbGwoCiAgICAgSm9iKiBqb2IsIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlck9iamVjdD4mIHdvcmtlciwKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+JiByZWdpc3RyYXRpb24pIHsKQEAgLTExMDksMTIgKzgwMiwxMyBAQAogCiAgIC8vIDQuIFJ1biB0aGUgVXBkYXRlIFJlZ2lzdHJhdGlvbiBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb24sCiAgIC8vICAgICJpbnN0YWxsaW5nIiBhbmQgd29ya2VyIGFzIHRoZSBhcmd1bWVudHMuCi0gIFVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKHJlZ2lzdHJhdGlvbiwga0luc3RhbGxpbmcsIHdvcmtlcik7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5VcGRhdGVSZWdpc3RyYXRpb25TdGF0ZSgKKyAgICAgIHJlZ2lzdHJhdGlvbiwgU2VydmljZVdvcmtlckNvbnRleHQ6OmtJbnN0YWxsaW5nLCB3b3JrZXIpOwogCiAgIC8vIDUuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcKICAgLy8gICAgd29ya2VyIGFuZCAiaW5zdGFsbGluZyIgYXMgdGhlIGFyZ3VtZW50cy4KLSAgVXBkYXRlV29ya2VyU3RhdGUocmVnaXN0cmF0aW9uLT5pbnN0YWxsaW5nX3dvcmtlcigpLAotICAgICAgICAgICAgICAgICAgICBrU2VydmljZVdvcmtlclN0YXRlSW5zdGFsbGluZyk7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5VcGRhdGVXb3JrZXJTdGF0ZShyZWdpc3RyYXRpb24tPmluc3RhbGxpbmdfd29ya2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2VydmljZVdvcmtlclN0YXRlSW5zdGFsbGluZyk7CiAgIC8vIDYuIEFzc2VydDogam9i4oCZcyBqb2IgcHJvbWlzZSBpcyBub3QgbnVsbC4KICAgRENIRUNLKGpvYi0+bm9fcHJvbWlzZV9va2F5IHx8IGpvYi0+cHJvbWlzZS5nZXQoKSAhPSBudWxscHRyKTsKICAgLy8gNy4gSW52b2tlIFJlc29sdmUgSm9iIFByb21pc2Ugd2l0aCBqb2IgYW5kIHJlZ2lzdHJhdGlvbi4KQEAgLTExMjMsMTMgKzgxNywxMyBAQAogICAvLyAgICByZWdpc3RyYXRpb27igJlzIHNjb3BlIHVybCdzIG9yaWdpbi4KICAgYXV0byByZWdpc3RyYXRpb25fb3JpZ2luID0gbG9hZGVyOjpPcmlnaW4ocmVnaXN0cmF0aW9uLT5zY29wZV91cmwoKSk7CiAgIC8vIDkuIEZvciBlYWNoIHNldHRpbmdzT2JqZWN0IG9mIHNldHRpbmdzT2JqZWN0cy4uLgotICBmb3IgKGF1dG8mIGNvbnRleHQgOiB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zXykgeworICBmb3IgKGF1dG8mIGNvbnRleHQgOiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+d2ViX2NvbnRleHRfcmVnaXN0cmF0aW9ucygpKSB7CiAgICAgaWYgKGNvbnRleHQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPkdldE9yaWdpbigpID09IHJlZ2lzdHJhdGlvbl9vcmlnaW4pIHsKICAgICAgIC8vIDkuIC4uLiBxdWV1ZSBhIHRhc2sgb24gc2V0dGluZ3NPYmplY3TigJlzIHJlc3BvbnNpYmxlIGV2ZW50IGxvb3AgaW4gdGhlCiAgICAgICAvLyAgICBET00gbWFuaXB1bGF0aW9uIHRhc2sgc291cmNlIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAgY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAorICAgICAgY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RCbG9ja2luZ1Rhc2soCiAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAorICAgICAgICAgIGJhc2U6OkJpbmQoCiAgICAgICAgICAgICAgIFtdKHdlYjo6Q29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiByZWdpc3RyYXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyA5LjEuIExldCByZWdpc3RyYXRpb25PYmplY3RzIGJlIGV2ZXJ5CkBAIC0xMTY5LDcgKzg2Myw4IEBACiAgICAgYm9vbCBmb3JjZV9ieXBhc3NfY2FjaGUgPSBqb2ItPmZvcmNlX2J5cGFzc19jYWNoZV9mbGFnOwogICAgIC8vIDExLjIuIElmIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgUnVuIFNlcnZpY2UgV29ya2VyIGFsZ29yaXRobSB3aXRoCiAgICAgLy8gICAgICAgaW5zdGFsbGluZ1dvcmtlciBhbmQgZm9yY2VCeXBhc3NDYWNoZSBpcyBmYWlsdXJlLCB0aGVuOgotICAgIGF1dG8qIHJ1bl9yZXN1bHQgPSBSdW5TZXJ2aWNlV29ya2VyKGluc3RhbGxpbmdfd29ya2VyLCBmb3JjZV9ieXBhc3NfY2FjaGUpOworICAgIGF1dG8qIHJ1bl9yZXN1bHQgPSBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+UnVuU2VydmljZVdvcmtlcigKKyAgICAgICAgaW5zdGFsbGluZ193b3JrZXIsIGZvcmNlX2J5cGFzc19jYWNoZSk7CiAgICAgaWYgKCFydW5fcmVzdWx0KSB7CiAgICAgICAvLyAxMS4yLjEuIFNldCBpbnN0YWxsRmFpbGVkIHRvIHRydWUuCiAgICAgICBpbnN0YWxsX2ZhaWxlZC0+c3RvcmUodHJ1ZSk7CkBAIC0xMjMzLDcgKzkyOCw4IEBACiAgICAgICAvLyBUaGlzIHdhaXRpbmcgaXMgZG9uZSBpbnNpZGUgUG9zdEJsb2NraW5nVGFzayBhYm92ZS4KICAgICAgIC8vIDExLjMuMy4gV2FpdCBmb3IgdGhlIHN0ZXAgbGFiZWxlZCBXYWl0Rm9yQXN5bmNocm9ub3VzRXh0ZW5zaW9ucyB0bwogICAgICAgLy8gICAgICAgICBjb21wbGV0ZS4KLSAgICAgIGlmICghV2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnMocmVnaXN0cmF0aW9uKSkgeworICAgICAgaWYgKCFzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+V2FpdEZvckFzeW5jaHJvbm91c0V4dGVuc2lvbnMoCisgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbikpIHsKICAgICAgICAgLy8gVGltZW91dAogICAgICAgICBpbnN0YWxsX2ZhaWxlZC0+c3RvcmUodHJ1ZSk7CiAgICAgICB9CkBAIC0xMjQ0LDE3ICs5NDAsMTggQEAKICAgICAvLyAxMi4xLiBSdW4gdGhlIFVwZGF0ZSBXb3JrZXIgU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9u4oCZcwogICAgIC8vICAgICAgIGluc3RhbGxpbmcgd29ya2VyIGFuZCAicmVkdW5kYW50IiBhcyB0aGUgYXJndW1lbnRzLgogICAgIGlmIChyZWdpc3RyYXRpb24tPmluc3RhbGxpbmdfd29ya2VyKCkpIHsKLSAgICAgIFVwZGF0ZVdvcmtlclN0YXRlKHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtTZXJ2aWNlV29ya2VyU3RhdGVSZWR1bmRhbnQpOworICAgICAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPlVwZGF0ZVdvcmtlclN0YXRlKAorICAgICAgICAgIHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKSwga1NlcnZpY2VXb3JrZXJTdGF0ZVJlZHVuZGFudCk7CiAgICAgfQogICAgIC8vIDEyLjIuIFJ1biB0aGUgVXBkYXRlIFJlZ2lzdHJhdGlvbiBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb24sCiAgICAgLy8gICAgICAgImluc3RhbGxpbmciIGFuZCBudWxsIGFzIHRoZSBhcmd1bWVudHMuCi0gICAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrSW5zdGFsbGluZywgbnVsbHB0cik7CisgICAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPlVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKAorICAgICAgICByZWdpc3RyYXRpb24sIFNlcnZpY2VXb3JrZXJDb250ZXh0OjprSW5zdGFsbGluZywgbnVsbHB0cik7CiAgICAgLy8gMTIuMy4gSWYgbmV3ZXN0V29ya2VyIGlzIG51bGwsIHRoZW4gcmVtb3ZlIHJlZ2lzdHJhdGlvbgogICAgIC8vICAgICAgIG1hcFsocmVnaXN0cmF0aW9u4oCZcyBzdG9yYWdlIGtleSwgc2VyaWFsaXplZCByZWdpc3RyYXRpb27igJlzCiAgICAgLy8gICAgICAgc2NvcGUgdXJsKV0uCiAgICAgaWYgKG5ld2VzdF93b3JrZXIgPT0gbnVsbHB0cikgewotICAgICAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPlJlbW92ZVJlZ2lzdHJhdGlvbigKKyAgICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5yZWdpc3RyYXRpb25fbWFwKCktPlJlbW92ZVJlZ2lzdHJhdGlvbigKICAgICAgICAgICByZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksIHJlZ2lzdHJhdGlvbi0+c2NvcGVfdXJsKCkpOwogICAgIH0KICAgICAvLyAxMi40LiBJbnZva2UgRmluaXNoIEpvYiB3aXRoIGpvYiBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCkBAIC0xMjcwLDY0MyArOTY3LDM3IEBACiAgIC8vIDE2LiBJZiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG5vdCBudWxsLCB0aGVuOgogICBpZiAocmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpKSB7CiAgICAgLy8gMTYuMS4gVGVybWluYXRlIHJlZ2lzdHJhdGlvbuKAmXMgd2FpdGluZyB3b3JrZXIuCi0gICAgVGVybWluYXRlU2VydmljZVdvcmtlcihyZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCkpOworICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5UZXJtaW5hdGVTZXJ2aWNlV29ya2VyKAorICAgICAgICByZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCkpOwogICAgIC8vIDE2LjIuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzCiAgICAgLy8gICAgICAgd2FpdGluZyB3b3JrZXIgYW5kICJyZWR1bmRhbnQiIGFzIHRoZSBhcmd1bWVudHMuCi0gICAgVXBkYXRlV29ya2VyU3RhdGUocmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpLAotICAgICAgICAgICAgICAgICAgICAgIGtTZXJ2aWNlV29ya2VyU3RhdGVSZWR1bmRhbnQpOworICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5VcGRhdGVXb3JrZXJTdGF0ZShyZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTZXJ2aWNlV29ya2VyU3RhdGVSZWR1bmRhbnQpOwogICB9CiAgIC8vIDE3LiBSdW4gdGhlIFVwZGF0ZSBSZWdpc3RyYXRpb24gU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9uLAogICAvLyAgICAgIndhaXRpbmciIGFuZCByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcgd29ya2VyIGFzIHRoZSBhcmd1bWVudHMuCi0gIFVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKHJlZ2lzdHJhdGlvbiwga1dhaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKSk7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5VcGRhdGVSZWdpc3RyYXRpb25TdGF0ZSgKKyAgICAgIHJlZ2lzdHJhdGlvbiwgU2VydmljZVdvcmtlckNvbnRleHQ6OmtXYWl0aW5nLAorICAgICAgcmVnaXN0cmF0aW9uLT5pbnN0YWxsaW5nX3dvcmtlcigpKTsKICAgLy8gMTguIFJ1biB0aGUgVXBkYXRlIFJlZ2lzdHJhdGlvbiBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb24sCiAgIC8vICAgICAiaW5zdGFsbGluZyIgYW5kIG51bGwgYXMgdGhlIGFyZ3VtZW50cy4KLSAgVXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUocmVnaXN0cmF0aW9uLCBrSW5zdGFsbGluZywgbnVsbHB0cik7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5VcGRhdGVSZWdpc3RyYXRpb25TdGF0ZSgKKyAgICAgIHJlZ2lzdHJhdGlvbiwgU2VydmljZVdvcmtlckNvbnRleHQ6OmtJbnN0YWxsaW5nLCBudWxscHRyKTsKICAgLy8gMTkuIFJ1biB0aGUgVXBkYXRlIFdvcmtlciBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcKICAgLy8gICAgIHdvcmtlciBhbmQgImluc3RhbGxlZCIgYXMgdGhlIGFyZ3VtZW50cy4KLSAgVXBkYXRlV29ya2VyU3RhdGUocmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpLAotICAgICAgICAgICAgICAgICAgICBrU2VydmljZVdvcmtlclN0YXRlSW5zdGFsbGVkKTsKKyAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPlVwZGF0ZVdvcmtlclN0YXRlKHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTZXJ2aWNlV29ya2VyU3RhdGVJbnN0YWxsZWQpOwogICAvLyAyMC4gSW52b2tlIEZpbmlzaCBKb2Igd2l0aCBqb2IuCiAgIEZpbmlzaEpvYihqb2IpOwogICAvLyAyMS4gV2FpdCBmb3IgYWxsIHRoZSB0YXNrcyBxdWV1ZWQgYnkgVXBkYXRlIFdvcmtlciBTdGF0ZSBpbnZva2VkIGluIHRoaXMKICAgLy8gICAgIGFsZ29yaXRobSB0byBoYXZlIGV4ZWN1dGVkLgogICAvLyBUT0RPKGIvMjM0Nzg4NDc5KTogV2FpdCBmb3IgdGFza3MuCiAgIC8vIDIyLiBJbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGggcmVnaXN0cmF0aW9uLgotICBUcnlBY3RpdmF0ZShyZWdpc3RyYXRpb24pOworICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+VHJ5QWN0aXZhdGUocmVnaXN0cmF0aW9uKTsKIAogICAvLyBQZXJzaXN0IHJlZ2lzdHJhdGlvbiBzaW5jZSB0aGUgd2FpdGluZ193b3JrZXIgaGFzIGJlZW4gdXBkYXRlZC4KLSAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPlBlcnNpc3RSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uLT5zdG9yYWdlX2tleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24tPnNjb3BlX3VybCgpKTsKLX0KLQotYm9vbCBTZXJ2aWNlV29ya2VySm9iczo6SXNBbnlDbGllbnRVc2luZ1JlZ2lzdHJhdGlvbigKLSAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pIHsKLSAgYm9vbCBhbnlfY2xpZW50X2lzX3VzaW5nID0gZmFsc2U7Ci0gIGZvciAoYXV0byYgY29udGV4dCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7Ci0gICAgLy8gV2hlbiBhIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBpcyBjb250cm9sbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIsIGl0IGlzCi0gICAgLy8gc2FpZCB0aGF0IHRoZSBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMgdXNpbmcgdGhlIHNlcnZpY2Ugd29ya2Vy4oCZcwotICAgIC8vIGNvbnRhaW5pbmcgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uLgotICAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZGZuLWNvbnRyb2wKLSAgICBpZiAoY29udGV4dC0+aXNfY29udHJvbGxlZF9ieShyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSkpIHsKLSAgICAgIGFueV9jbGllbnRfaXNfdXNpbmcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBhbnlfY2xpZW50X2lzX3VzaW5nOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpUcnlBY3RpdmF0ZSgKLSAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VySm9iczo6VHJ5QWN0aXZhdGUoKSIpOwotICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAvLyBBbGdvcml0aG0gZm9yIFRyeSBBY3RpdmF0ZToKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN0cnktYWN0aXZhdGUtYWxnb3JpdGhtCi0KLSAgLy8gMS4gSWYgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlciBpcyBudWxsLCByZXR1cm4uCi0gIGlmICghcmVnaXN0cmF0aW9uKSByZXR1cm47Ci0gIGlmICghcmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpKSByZXR1cm47Ci0KLSAgLy8gMi4gSWYgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyIGlzIG5vdCBudWxsIGFuZCByZWdpc3RyYXRpb27igJlzIGFjdGl2ZQotICAvLyAgICB3b3JrZXIncyBzdGF0ZSBpcyAiYWN0aXZhdGluZyIsIHJldHVybi4KLSAgaWYgKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpICYmCi0gICAgICAocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCktPnN0YXRlKCkgPT0ga1NlcnZpY2VXb3JrZXJTdGF0ZUFjdGl2YXRpbmcpKQotICAgIHJldHVybjsKLQotICAvLyAzLiBJbnZva2UgQWN0aXZhdGUgd2l0aCByZWdpc3RyYXRpb24gaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKLQotICAvLyAgICAtIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciBpcyBudWxsLgotICBib29sIGludm9rZV9hY3RpdmF0ZSA9IHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpID09IG51bGxwdHI7Ci0KLSAgaWYgKCFpbnZva2VfYWN0aXZhdGUpIHsKLSAgICAvLyAgICAtIFRoZSByZXN1bHQgb2YgcnVubmluZyBTZXJ2aWNlIFdvcmtlciBIYXMgTm8gUGVuZGluZyBFdmVudHMgd2l0aAotICAgIC8vICAgICAgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyIGlzIHRydWUuLi4KLSAgICBpZiAoU2VydmljZVdvcmtlckhhc05vUGVuZGluZ0V2ZW50cyhyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSkpIHsKLSAgICAgIC8vICAgICAgLi4uIGFuZCBubyBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMgdXNpbmcgcmVnaXN0cmF0aW9uLi4uCi0gICAgICBib29sIGFueV9jbGllbnRfdXNpbmcgPSBJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7Ci0gICAgICBpbnZva2VfYWN0aXZhdGUgPSAhYW55X2NsaWVudF91c2luZzsKLSAgICAgIC8vICAgICAgLi4uIG9yIHJlZ2lzdHJhdGlvbuKAmXMgd2FpdGluZyB3b3JrZXIncyBza2lwIHdhaXRpbmcgZmxhZyBpcwotICAgICAgLy8gICAgICBzZXQuCi0gICAgICBpZiAoIWludm9rZV9hY3RpdmF0ZSAmJiByZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCktPnNraXBfd2FpdGluZygpKQotICAgICAgICBpbnZva2VfYWN0aXZhdGUgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChpbnZva2VfYWN0aXZhdGUpIEFjdGl2YXRlKHJlZ2lzdHJhdGlvbik7Ci19Ci0KLXZvaWQgU2VydmljZVdvcmtlckpvYnM6OkFjdGl2YXRlKAotICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbikgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJKb2JzOjpBY3RpdmF0ZSgpIik7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIC8vIEFsZ29yaXRobSBmb3IgQWN0aXZhdGU6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jYWN0aXZhdGlvbi1hbGdvcml0aG0KLQotICAvLyAxLiBJZiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG51bGwsIGFib3J0IHRoZXNlIHN0ZXBzLgotICBpZiAocmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpID09IG51bGxwdHIpIHJldHVybjsKLSAgLy8gMi4gSWYgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyIGlzIG5vdCBudWxsLCB0aGVuOgotICBpZiAocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpIHsKLSAgICAvLyAyLjEuIFRlcm1pbmF0ZSByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIuCi0gICAgVGVybWluYXRlU2VydmljZVdvcmtlcihyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSk7Ci0gICAgLy8gMi4yLiBSdW4gdGhlIFVwZGF0ZSBXb3JrZXIgU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUKLSAgICAvLyAgICAgIHdvcmtlciBhbmQgInJlZHVuZGFudCIgYXMgdGhlIGFyZ3VtZW50cy4KLSAgICBVcGRhdGVXb3JrZXJTdGF0ZShyZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrU2VydmljZVdvcmtlclN0YXRlUmVkdW5kYW50KTsKLSAgfQotICAvLyAzLiBSdW4gdGhlIFVwZGF0ZSBSZWdpc3RyYXRpb24gU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9uLAotICAvLyAgICAiYWN0aXZlIiBhbmQgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlciBhcyB0aGUgYXJndW1lbnRzLgotICBVcGRhdGVSZWdpc3RyYXRpb25TdGF0ZShyZWdpc3RyYXRpb24sIGtBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSk7Ci0gIC8vIDQuIFJ1biB0aGUgVXBkYXRlIFJlZ2lzdHJhdGlvbiBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb24sCi0gIC8vICAgICJ3YWl0aW5nIiBhbmQgbnVsbCBhcyB0aGUgYXJndW1lbnRzLgotICBVcGRhdGVSZWdpc3RyYXRpb25TdGF0ZShyZWdpc3RyYXRpb24sIGtXYWl0aW5nLCBudWxscHRyKTsKLSAgLy8gNS4gUnVuIHRoZSBVcGRhdGUgV29ya2VyIFN0YXRlIGFsZ29yaXRobSBwYXNzaW5nIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlCi0gIC8vICAgIHdvcmtlciBhbmQgImFjdGl2YXRpbmciIGFzIHRoZSBhcmd1bWVudHMuCi0gIFVwZGF0ZVdvcmtlclN0YXRlKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpLAotICAgICAgICAgICAgICAgICAgICBrU2VydmljZVdvcmtlclN0YXRlQWN0aXZhdGluZyk7Ci0gIC8vIDYuIExldCBtYXRjaGVkQ2xpZW50cyBiZSBhIGxpc3Qgb2Ygc2VydmljZSB3b3JrZXIgY2xpZW50cyB3aG9zZSBjcmVhdGlvbgotICAvLyAgICBVUkwgbWF0Y2hlcyByZWdpc3RyYXRpb27igJlzIHN0b3JhZ2Uga2V5IGFuZCByZWdpc3RyYXRpb27igJlzIHNjb3BlIHVybC4KLSAgc3RkOjpsaXN0PHdlYjo6Q29udGV4dCo+IG1hdGNoZWRfY2xpZW50czsKLSAgZm9yIChhdXRvJiBjb250ZXh0IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKLSAgICB1cmw6Ok9yaWdpbiBjb250ZXh0X3N0b3JhZ2Vfa2V5ID0KLSAgICAgICAgdXJsOjpPcmlnaW46OkNyZWF0ZShjb250ZXh0LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jcmVhdGlvbl91cmwoKSk7Ci0gICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiBtYXRjaGVkX3JlZ2lzdHJhdGlvbiA9Ci0gICAgICAgIHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5NYXRjaFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24oCi0gICAgICAgICAgICBjb250ZXh0X3N0b3JhZ2Vfa2V5LCByZWdpc3RyYXRpb24tPnNjb3BlX3VybCgpKTsKLSAgICBpZiAobWF0Y2hlZF9yZWdpc3RyYXRpb24gPT0gcmVnaXN0cmF0aW9uKSB7Ci0gICAgICBtYXRjaGVkX2NsaWVudHMucHVzaF9iYWNrKGNvbnRleHQpOwotICAgIH0KLSAgfQotICAvLyA3LiBGb3IgZWFjaCBjbGllbnQgb2YgbWF0Y2hlZENsaWVudHMsIHF1ZXVlIGEgdGFzayBvbiBjbGllbnTigJlzICByZXNwb25zaWJsZQotICAvLyAgICBldmVudCBsb29wLCB1c2luZyB0aGUgRE9NIG1hbmlwdWxhdGlvbiB0YXNrIHNvdXJjZSwgdG8gcnVuIHRoZSBmb2xsb3dpbmcKLSAgLy8gICAgc3Vic3RlcHM6Ci0gIGZvciAoYXV0byYgY2xpZW50IDogbWF0Y2hlZF9jbGllbnRzKSB7Ci0gICAgLy8gNy4xLiBMZXQgcmVhZHlQcm9taXNlIGJlIGNsaWVudOKAmXMgZ2xvYmFsIG9iamVjdCdzCi0gICAgLy8gICAgICBTZXJ2aWNlV29ya2VyQ29udGFpbmVyIG9iamVjdOKAmXMgcmVhZHkKLSAgICAvLyAgICAgIHByb21pc2UuCi0gICAgLy8gNy4yLiBJZiByZWFkeVByb21pc2UgaXMgbnVsbCwgdGhlbiBjb250aW51ZS4KLSAgICAvLyA3LjMuIElmIHJlYWR5UHJvbWlzZSBpcyBwZW5kaW5nLCByZXNvbHZlCi0gICAgLy8gICAgICByZWFkeVByb21pc2Ugd2l0aCB0aGUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nCi0gICAgLy8gICAgICB0aGUgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uIG9iamVjdCB0aGF0Ci0gICAgLy8gICAgICByZXByZXNlbnRzIHJlZ2lzdHJhdGlvbiBpbiByZWFkeVByb21pc2XigJlzCi0gICAgLy8gICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuCi0gICAgY2xpZW50LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250YWluZXI6Ok1heWJlUmVzb2x2ZVJlYWR5UHJvbWlzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjbGllbnQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm5hdmlnYXRvcl9iYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQocmVnaXN0cmF0aW9uKSkpOwotICB9Ci0gIC8vIDguIEZvciBlYWNoIGNsaWVudCBvZiBtYXRjaGVkQ2xpZW50czoKLSAgLy8gOC4xLiBJZiBjbGllbnQgaXMgYSB3aW5kb3cgY2xpZW50LCB1bmFzc29jaWF0ZSBjbGllbnTigJlzIHJlc3BvbnNpYmxlCi0gIC8vICAgICAgZG9jdW1lbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gY2FjaGUsIGlmIGl0IGhhcyBvbmUuCi0gIC8vIDguMi4gRWxzZSBpZiBjbGllbnQgaXMgYSBzaGFyZWQgd29ya2VyIGNsaWVudCwgdW5hc3NvY2lhdGUgY2xpZW504oCZcwotICAvLyAgICAgIGdsb2JhbCBvYmplY3QgZnJvbSBpdHMgYXBwbGljYXRpb24gY2FjaGUsIGlmIGl0IGhhcyBvbmUuCi0gIC8vIENvYmFsdCBkb2Vzbid0IGltcGxlbWVudCAnYXBwbGljYXRpb24gY2FjaGUnOgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L29mZmxpbmUuaHRtbCNhcHBsaWNhdGlvbmNhY2hlCi0gIC8vIDkuIEZvciBlYWNoIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBjbGllbnQgd2hvIGlzIHVzaW5nIHJlZ2lzdHJhdGlvbjoKLSAgLy8gTm90ZTogVGhlIHNwZWMgZGVmaW5lcyAiY29udHJvbCIgYW5kICJ1c2UiIG9mIGEgc2VydmljZSB3b3JrZXIgZnJvbSB0aGUKLSAgLy8gdmFsdWUgb2YgdGhlIGFjdGl2ZSBzZXJ2aWNlIHdvcmtlciBwcm9wZXJ0eSBvZiB0aGUgY2xpZW50IGVudmlyb25tZW50LCBidXQKLSAgLy8gdGhhdCBwcm9wZXJ0eSBpcyBzZXQgaGVyZSwgc28gaGVyZSB3ZSBzaG91bGQgbm90IHVzZSB0aGF0IGV4YWN0IGRlZmluaXRpb24KLSAgLy8gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjbGllbnQgaXMgdXNpbmcgdGhpcyByZWdpc3RyYXRpb24uIEluc3RlYWQsIHdlIHVzZSB0aGUKLSAgLy8gTWF0Y2ggU2VydmljZSBXb3JrZXIgUmVnaXN0cmF0aW9uIGFsZ29yaXRobSB0byBmaW5kIHRoZSByZWdpc3RyYXRpb24gZm9yIGEKLSAgLy8gY2xpZW50IGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIHJlZ2lzdHJhdGlvbiBiZWluZyBhY3RpdmF0ZWQuCi0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZGZuLXVzZQotICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiBjbGllbnRfcmVnaXN0cmF0aW9uID0KLSAgICAgICAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPk1hdGNoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbigKLSAgICAgICAgICAgIGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+T2J0YWluU3RvcmFnZUtleSgpLAotICAgICAgICAgICAgY2xpZW50LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jcmVhdGlvbl91cmwoKSk7Ci0gICAgLy8gV2hlbiBhIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBpcyBjb250cm9sbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIsIGl0IGlzCi0gICAgLy8gc2FpZCB0aGF0IHRoZSBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMgdXNpbmcgdGhlIHNlcnZpY2Ugd29ya2Vy4oCZcwotICAgIC8vIGNvbnRhaW5pbmcgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uLgotICAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZGZuLWNvbnRyb2wKLSAgICBpZiAoY2xpZW50X3JlZ2lzdHJhdGlvbi5nZXQoKSA9PSByZWdpc3RyYXRpb24pIHsKLSAgICAgIC8vIDkuMS4gU2V0IGNsaWVudOKAmXMgYWN0aXZlIHdvcmtlciB0byByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIuCi0gICAgICBjbGllbnQtPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpOwotICAgICAgLy8gOS4yLiBJbnZva2UgTm90aWZ5IENvbnRyb2xsZXIgQ2hhbmdlIGFsZ29yaXRobSB3aXRoIGNsaWVudCBhcyB0aGUKLSAgICAgIC8vICAgICAgYXJndW1lbnQuCi0gICAgICBOb3RpZnlDb250cm9sbGVyQ2hhbmdlKGNsaWVudCk7Ci0gICAgfQotICB9Ci0gIC8vIDEwLiBMZXQgYWN0aXZlV29ya2VyIGJlIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlci4KLSAgU2VydmljZVdvcmtlck9iamVjdCogYWN0aXZlX3dvcmtlciA9IHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpOwotICBib29sIGFjdGl2YXRlZCA9IHRydWU7Ci0gIC8vIDExLiBJZiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIFNob3VsZCBTa2lwIEV2ZW50IGFsZ29yaXRobSB3aXRoCi0gIC8vICAgICBhY3RpdmVXb3JrZXIgYW5kICJhY3RpdmF0ZSIgaXMgZmFsc2UsIHRoZW46Ci0gIERDSEVDSyhhY3RpdmVfd29ya2VyKTsKLSAgaWYgKCFhY3RpdmVfd29ya2VyLT5TaG91bGRTa2lwRXZlbnQoYmFzZTo6VG9rZW5zOjphY3RpdmF0ZSgpKSkgewotICAgIC8vIDExLjEuIElmIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgUnVuIFNlcnZpY2UgV29ya2VyIGFsZ29yaXRobSB3aXRoCi0gICAgLy8gICAgICAgYWN0aXZlV29ya2VyIGlzIG5vdCBmYWlsdXJlLCB0aGVuOgotICAgIGF1dG8qIHJ1bl9yZXN1bHQgPSBSdW5TZXJ2aWNlV29ya2VyKGFjdGl2ZV93b3JrZXIpOwotICAgIGlmIChydW5fcmVzdWx0KSB7Ci0gICAgICAvLyAxMS4xLjEuIFF1ZXVlIGEgdGFzayB0YXNrIG9uIGFjdGl2ZVdvcmtlcuKAmXMgZXZlbnQgbG9vcCB1c2luZyB0aGUgRE9NCi0gICAgICAvLyAgICAgICAgIG1hbmlwdWxhdGlvbiB0YXNrIHNvdXJjZSB0byBydW4gdGhlIGZvbGxvd2luZyBzdGVwczoKLSAgICAgIERDSEVDS19FUShhY3RpdmVfd29ya2VyLT53ZWJfYWdlbnQoKS0+Y29udGV4dCgpLAotICAgICAgICAgICAgICAgIGFjdGl2ZV93b3JrZXItPndvcmtlcl9nbG9iYWxfc2NvcGUoKQotICAgICAgICAgICAgICAgICAgICAtPmVudmlyb25tZW50X3NldHRpbmdzKCkKLSAgICAgICAgICAgICAgICAgICAgLT5jb250ZXh0KCkpOwotICAgICAgRENIRUNLKHJlZ2lzdHJhdGlvbi0+ZG9uZV9ldmVudCgpLT5Jc1NpZ25hbGVkKCkpOwotICAgICAgcmVnaXN0cmF0aW9uLT5kb25lX2V2ZW50KCktPlJlc2V0KCk7Ci0gICAgICBhY3RpdmVfd29ya2VyLT53ZWJfYWdlbnQoKQotICAgICAgICAgIC0+Y29udGV4dCgpCi0gICAgICAgICAgLT5tZXNzYWdlX2xvb3AoKQotICAgICAgICAgIC0+dGFza19ydW5uZXIoKQotICAgICAgICAgIC0+UG9zdEJsb2NraW5nVGFzaygKLSAgICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgICBiYXNlOjpCaW5kKAotICAgICAgICAgICAgICAgICAgW10oU2VydmljZVdvcmtlck9iamVjdCogYWN0aXZlX3dvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OldhaXRhYmxlRXZlbnQqIGRvbmVfZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBkb25lX2NhbGxiYWNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKFtdKGJhc2U6OldhaXRhYmxlRXZlbnQqIGRvbmVfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKSB7IGRvbmVfZXZlbnQtPlNpZ25hbCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV9ldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8qIHNldHRpbmdzID0gYWN0aXZlX3dvcmtlci0+d2ViX2FnZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5lbnZpcm9ubWVudF9zZXR0aW5ncygpOwotICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPEV4dGVuZGFibGVFdmVudD4gZXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0ZW5kYWJsZUV2ZW50KHNldHRpbmdzLCBiYXNlOjpUb2tlbnM6OmFjdGl2YXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShkb25lX2NhbGxiYWNrKSkpOwotICAgICAgICAgICAgICAgICAgICAvLyAxMS4xLjEuMS4gTGV0IGUgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBldmVudCB3aXRoCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBFeHRlbmRhYmxlRXZlbnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIDExLjEuMS4yLiBJbml0aWFsaXplIGXigJlzIHR5cGUgYXR0cmlidXRlIHRvIGFjdGl2YXRlLgotICAgICAgICAgICAgICAgICAgICAvLyAxMS4xLjEuMy4gRGlzcGF0Y2ggZSBhdCBhY3RpdmVXb3JrZXLigJlzIGdsb2JhbCBvYmplY3QuCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZV93b3JrZXItPndvcmtlcl9nbG9iYWxfc2NvcGUoKS0+RGlzcGF0Y2hFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDExLjEuMS40LiBXYWl0Rm9yQXN5bmNocm9ub3VzRXh0ZW5zaW9uczogV2FpdCwgaW4KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHBhcmFsbGVsLCB1bnRpbCBlIGlzIG5vdCBhY3RpdmUuCi0gICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQtPklzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgaGFuZGxlciBkb2Vzbid0IHVzZSB3YWl0VW50aWwoKSwgaXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgbm8gbG9uZ2VyIGJlIGFjdGl2ZSwgYW5kIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYQotICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRvIHNpZ25hbCB0aGUgZG9uZSBldmVudC4KLSAgICAgICAgICAgICAgICAgICAgICBkb25lX2V2ZW50LT5TaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYWN0aXZlX3dvcmtlciksIHJlZ2lzdHJhdGlvbi0+ZG9uZV9ldmVudCgpKSk7Ci0gICAgICAvLyAxMS4xLjIuIFdhaXQgZm9yIHRhc2sgdG8gaGF2ZSBleGVjdXRlZCBvciBiZWVuIGRpc2NhcmRlZC4KLSAgICAgIC8vIFRoaXMgd2FpdGluZyBpcyBkb25lIGluc2lkZSBQb3N0QmxvY2tpbmdUYXNrIGFib3ZlLgotICAgICAgLy8gMTEuMS4zLiBXYWl0IGZvciB0aGUgc3RlcCBsYWJlbGVkIFdhaXRGb3JBc3luY2hyb25vdXNFeHRlbnNpb25zIHRvCi0gICAgICAvLyAgICAgICAgIGNvbXBsZXRlLgotICAgICAgLy8gVE9ETyhiLzI0MDE2NDM4OCk6IEludmVzdGlnYXRlIGEgYmV0dGVyIGFwcHJvYWNoIGZvciBjb21iaW5pbmcgd2FpdGluZwotICAgICAgLy8gZm9yIHRoZSBFeHRlbmRhYmxlRXZlbnQgd2hpbGUgYWxzbyBhbGxvd2luZyB1c2Ugb2YgYWxnb3JpdGhtcyB0aGF0IHJ1bgotICAgICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIuCi0gICAgICBpZiAoIVdhaXRGb3JBc3luY2hyb25vdXNFeHRlbnNpb25zKHJlZ2lzdHJhdGlvbikpIHsKLSAgICAgICAgLy8gVGltZW91dAotICAgICAgICBhY3RpdmF0ZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYWN0aXZhdGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIC8vIDEyLiBSdW4gdGhlIFVwZGF0ZSBXb3JrZXIgU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUKLSAgLy8gICAgIHdvcmtlciBhbmQgImFjdGl2YXRlZCIgYXMgdGhlIGFyZ3VtZW50cy4KLSAgaWYgKGFjdGl2YXRlZCAmJiByZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSkgewotICAgIFVwZGF0ZVdvcmtlclN0YXRlKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpLAotICAgICAgICAgICAgICAgICAgICAgIGtTZXJ2aWNlV29ya2VyU3RhdGVBY3RpdmF0ZWQpOwotCi0gICAgLy8gUGVyc2lzdCByZWdpc3RyYXRpb24gc2luY2UgdGhlIHdhaXRpbmdfd29ya2VyIGhhcyBiZWVuIHVwZGF0ZWQgdG8gbnVsbHB0cgotICAgIC8vIGFuZCB0aGUgYWN0aXZlX3dvcmtlciBoYXMgYmVlbiB1cGRhdGVkIHRvIHRoZSBwcmV2aW91cyB3YWl0aW5nX3dvcmtlci4KLSAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+UGVyc2lzdFJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLT5zY29wZV91cmwoKSk7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6Tm90aWZ5Q29udHJvbGxlckNoYW5nZSh3ZWI6OkNvbnRleHQqIGNsaWVudCkgewotICAvLyBBbGdvcml0aG0gZm9yIE5vdGlmeSBDb250cm9sbGVyIENoYW5nZToKLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jbm90aWZ5LWNvbnRyb2xsZXItY2hhbmdlLWFsZ29yaXRobQotICAvLyAxLiBBc3NlcnQ6IGNsaWVudCBpcyBub3QgbnVsbC4KLSAgRENIRUNLKGNsaWVudCk7Ci0KLSAgLy8gMi4gSWYgY2xpZW50IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgcXVldWUgYSB0YXNrIHRvIGZpcmUgYW4KLSAgLy8gICAgZXZlbnQgbmFtZWQgY29udHJvbGxlcmNoYW5nZSBhdCB0aGUgU2VydmljZVdvcmtlckNvbnRhaW5lciBvYmplY3QgdGhhdAotICAvLyAgICBjbGllbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotICBjbGllbnQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgICAgICAgIFtdKHdlYjo6Q29udGV4dCogY2xpZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+R2V0V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtPm5hdmlnYXRvcl9iYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2VydmljZV93b3JrZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5EaXNwYXRjaEV2ZW50KG5ldyB3ZWI6OkV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRva2Vuczo6Y29udHJvbGxlcmNoYW5nZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSk7Ci19Ci0KLWJvb2wgU2VydmljZVdvcmtlckpvYnM6OlNlcnZpY2VXb3JrZXJIYXNOb1BlbmRpbmdFdmVudHMoCi0gICAgU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyKSB7Ci0gIC8vIEFsZ29yaXRobSBmb3IgU2VydmljZSBXb3JrZXIgSGFzIE5vIFBlbmRpbmcgRXZlbnRzCi0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jc2VydmljZS13b3JrZXItaGFzLW5vLXBlbmRpbmctZXZlbnRzCi0gIC8vIFRPRE8oYi8yNDAxNzQyNDUpOiBJbXBsZW1lbnQgdGhpcyB1c2luZyB0aGUgJ3NldCBvZiBleHRlbmRlZCBldmVudHMnLgotICBOT1RJTVBMRU1FTlRFRCgpOwotCi0gIC8vIDEuIEZvciBlYWNoIGV2ZW50IG9mIHdvcmtlcuKAmXMgc2V0IG9mIGV4dGVuZGVkIGV2ZW50czoKLSAgLy8gMS4xLiBJZiBldmVudCBpcyBhY3RpdmUsIHJldHVybiBmYWxzZS4KLSAgLy8gMi4gUmV0dXJuIHRydWUuCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpDbGVhclJlZ2lzdHJhdGlvbigKLSAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VySm9iczo6Q2xlYXJSZWdpc3RyYXRpb24oKSIpOwotICAvLyBBbGdvcml0aG0gZm9yIENsZWFyIFJlZ2lzdHJhdGlvbjoKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGVhci1yZWdpc3RyYXRpb24tYWxnb3JpdGhtCi0gIC8vIDEuIFJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIGF0b21pY2FsbHkuCi0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgLy8gMi4gSWYgcmVnaXN0cmF0aW9u4oCZcyBpbnN0YWxsaW5nIHdvcmtlciBpcyBub3QgbnVsbCwgdGhlbjoKLSAgU2VydmljZVdvcmtlck9iamVjdCogaW5zdGFsbGluZ193b3JrZXIgPSByZWdpc3RyYXRpb24tPmluc3RhbGxpbmdfd29ya2VyKCk7Ci0gIGlmIChpbnN0YWxsaW5nX3dvcmtlcikgewotICAgIC8vIDIuMS4gVGVybWluYXRlIHJlZ2lzdHJhdGlvbuKAmXMgaW5zdGFsbGluZyB3b3JrZXIuCi0gICAgVGVybWluYXRlU2VydmljZVdvcmtlcihpbnN0YWxsaW5nX3dvcmtlcik7Ci0gICAgLy8gMi4yLiBSdW4gdGhlIFVwZGF0ZSBXb3JrZXIgU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9u4oCZcwotICAgIC8vICAgICAgaW5zdGFsbGluZyB3b3JrZXIgYW5kICJyZWR1bmRhbnQiIGFzIHRoZSBhcmd1bWVudHMuCi0gICAgVXBkYXRlV29ya2VyU3RhdGUoaW5zdGFsbGluZ193b3JrZXIsIGtTZXJ2aWNlV29ya2VyU3RhdGVSZWR1bmRhbnQpOwotICAgIC8vIDIuMy4gUnVuIHRoZSBVcGRhdGUgUmVnaXN0cmF0aW9uIFN0YXRlIGFsZ29yaXRobSBwYXNzaW5nIHJlZ2lzdHJhdGlvbiwKLSAgICAvLyAgICAgICJpbnN0YWxsaW5nIiBhbmQgbnVsbCBhcyB0aGUgYXJndW1lbnRzLgotICAgIFVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKHJlZ2lzdHJhdGlvbiwga0luc3RhbGxpbmcsIG51bGxwdHIpOwotICB9Ci0KLSAgLy8gMy4gSWYgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlciBpcyBub3QgbnVsbCwgdGhlbjoKLSAgU2VydmljZVdvcmtlck9iamVjdCogd2FpdGluZ193b3JrZXIgPSByZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCk7Ci0gIGlmICh3YWl0aW5nX3dvcmtlcikgewotICAgIC8vIDMuMS4gVGVybWluYXRlIHJlZ2lzdHJhdGlvbuKAmXMgd2FpdGluZyB3b3JrZXIuCi0gICAgVGVybWluYXRlU2VydmljZVdvcmtlcih3YWl0aW5nX3dvcmtlcik7Ci0gICAgLy8gMy4yLiBSdW4gdGhlIFVwZGF0ZSBXb3JrZXIgU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9u4oCZcwotICAgIC8vICAgICAgd2FpdGluZyB3b3JrZXIgYW5kICJyZWR1bmRhbnQiIGFzIHRoZSBhcmd1bWVudHMuCi0gICAgVXBkYXRlV29ya2VyU3RhdGUod2FpdGluZ193b3JrZXIsIGtTZXJ2aWNlV29ya2VyU3RhdGVSZWR1bmRhbnQpOwotICAgIC8vIDMuMy4gUnVuIHRoZSBVcGRhdGUgUmVnaXN0cmF0aW9uIFN0YXRlIGFsZ29yaXRobSBwYXNzaW5nIHJlZ2lzdHJhdGlvbiwKLSAgICAvLyAgICAgICJ3YWl0aW5nIiBhbmQgbnVsbCBhcyB0aGUgYXJndW1lbnRzLgotICAgIFVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKHJlZ2lzdHJhdGlvbiwga1dhaXRpbmcsIG51bGxwdHIpOwotICB9Ci0KLSAgLy8gNC4gSWYgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyIGlzIG5vdCBudWxsLCB0aGVuOgotICBTZXJ2aWNlV29ya2VyT2JqZWN0KiBhY3RpdmVfd29ya2VyID0gcmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCk7Ci0gIGlmIChhY3RpdmVfd29ya2VyKSB7Ci0gICAgLy8gNC4xLiBUZXJtaW5hdGUgcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyLgotICAgIFRlcm1pbmF0ZVNlcnZpY2VXb3JrZXIoYWN0aXZlX3dvcmtlcik7Ci0gICAgLy8gNC4yLiBSdW4gdGhlIFVwZGF0ZSBXb3JrZXIgU3RhdGUgYWxnb3JpdGhtIHBhc3NpbmcgcmVnaXN0cmF0aW9u4oCZcwotICAgIC8vICAgICAgYWN0aXZlIHdvcmtlciBhbmQgInJlZHVuZGFudCIgYXMgdGhlIGFyZ3VtZW50cy4KLSAgICBVcGRhdGVXb3JrZXJTdGF0ZShhY3RpdmVfd29ya2VyLCBrU2VydmljZVdvcmtlclN0YXRlUmVkdW5kYW50KTsKLSAgICAvLyA0LjMuIFJ1biB0aGUgVXBkYXRlIFJlZ2lzdHJhdGlvbiBTdGF0ZSBhbGdvcml0aG0gcGFzc2luZyByZWdpc3RyYXRpb24sCi0gICAgLy8gICAgICAiYWN0aXZlIiBhbmQgbnVsbCBhcyB0aGUgYXJndW1lbnRzLgotICAgIFVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKHJlZ2lzdHJhdGlvbiwga0FjdGl2ZSwgbnVsbHB0cik7Ci0gIH0KLQotICAvLyBQZXJzaXN0IHJlZ2lzdHJhdGlvbiBzaW5jZSB0aGUgd2FpdGluZ193b3JrZXIgYW5kIGFjdGl2ZV93b3JrZXIgaGF2ZQotICAvLyBiZWVuIHVwZGF0ZWQgdG8gbnVsbHB0ci4gVGhpcyB3aWxsIHJlbW92ZSBhbnkgcGVyc2lzdGVkIHJlZ2lzdHJhdGlvbgotICAvLyBpZiBvbmUgZXhpc3RzLgotICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+UGVyc2lzdFJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi0+c2NvcGVfdXJsKCkpOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpUcnlDbGVhclJlZ2lzdHJhdGlvbigKLSAgICBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VySm9iczo6VHJ5Q2xlYXJSZWdpc3RyYXRpb24oKSIpOwotICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAvLyBBbGdvcml0aG0gZm9yIFRyeSBDbGVhciBSZWdpc3RyYXRpb246Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdHJ5LWNsZWFyLXJlZ2lzdHJhdGlvbi1hbGdvcml0aG0KLQotICAvLyAxLiBJbnZva2UgQ2xlYXIgUmVnaXN0cmF0aW9uIHdpdGggcmVnaXN0cmF0aW9uIGlmIG5vIHNlcnZpY2Ugd29ya2VyIGNsaWVudAotICAvLyBpcyB1c2luZyByZWdpc3RyYXRpb24gYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6Ci0gIGlmIChJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbikpIHJldHVybjsKLQotICAvLyAgICAuIHJlZ2lzdHJhdGlvbuKAmXMgaW5zdGFsbGluZyB3b3JrZXIgaXMgbnVsbCBvciB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKLSAgLy8gICAgICBTZXJ2aWNlIFdvcmtlciBIYXMgTm8gUGVuZGluZyBFdmVudHMgd2l0aCByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcKLSAgLy8gICAgICB3b3JrZXIgaXMgdHJ1ZS4KLSAgaWYgKHJlZ2lzdHJhdGlvbi0+aW5zdGFsbGluZ193b3JrZXIoKSAmJgotICAgICAgIVNlcnZpY2VXb3JrZXJIYXNOb1BlbmRpbmdFdmVudHMocmVnaXN0cmF0aW9uLT5pbnN0YWxsaW5nX3dvcmtlcigpKSkKLSAgICByZXR1cm47Ci0KLSAgLy8gICAgLiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG51bGwgb3IgdGhlIHJlc3VsdCBvZiBydW5uaW5nCi0gIC8vICAgICAgU2VydmljZSBXb3JrZXIgSGFzIE5vIFBlbmRpbmcgRXZlbnRzIHdpdGggcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nCi0gIC8vICAgICAgd29ya2VyIGlzIHRydWUuCi0gIGlmIChyZWdpc3RyYXRpb24tPndhaXRpbmdfd29ya2VyKCkgJiYKLSAgICAgICFTZXJ2aWNlV29ya2VySGFzTm9QZW5kaW5nRXZlbnRzKHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSkpCi0gICAgcmV0dXJuOwotCi0gIC8vICAgIC4gcmVnaXN0cmF0aW9u4oCZcyBhY3RpdmUgd29ya2VyIGlzIG51bGwgb3IgdGhlIHJlc3VsdCBvZiBydW5uaW5nCi0gIC8vICAgICAgU2VydmljZVdvcmtlciBIYXMgTm8gUGVuZGluZyBFdmVudHMgd2l0aCByZWdpc3RyYXRpb27igJlzIGFjdGl2ZSB3b3JrZXIKLSAgLy8gICAgICBpcyB0cnVlLgotICBpZiAocmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkgJiYKLSAgICAgICFTZXJ2aWNlV29ya2VySGFzTm9QZW5kaW5nRXZlbnRzKHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSkKLSAgICByZXR1cm47Ci0KLSAgQ2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6VXBkYXRlUmVnaXN0cmF0aW9uU3RhdGUoCi0gICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uLCBSZWdpc3RyYXRpb25TdGF0ZSB0YXJnZXQsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiYgc291cmNlKSB7Ci0gIFRSQUNFX0VWRU5UMigiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckpvYnM6OlVwZGF0ZVJlZ2lzdHJhdGlvblN0YXRlKCkiLAotICAgICAgICAgICAgICAgInRhcmdldCIsIHRhcmdldCwgInNvdXJjZSIsIHNvdXJjZSk7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIERDSEVDSyhyZWdpc3RyYXRpb24pOwotICAvLyBBbGdvcml0aG0gZm9yIFVwZGF0ZSBSZWdpc3RyYXRpb24gU3RhdGU6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdXBkYXRlLXJlZ2lzdHJhdGlvbi1zdGF0ZS1hbGdvcml0aG0KLQotICAvLyAxLiBMZXQgcmVnaXN0cmF0aW9uT2JqZWN0cyBiZSBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUKLSAgLy8gICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCByZWdpc3RyYXRpb24uCi0gIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGNhbGwgdG8gTG9va3VwU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbiBmb3IgZWFjaAotICAvLyByZWdpc3RlcmVkIHdlYiBjb250ZXh0LgotCi0gIHN3aXRjaCAodGFyZ2V0KSB7Ci0gICAgLy8gMi4gSWYgdGFyZ2V0IGlzICJpbnN0YWxsaW5nIiwgdGhlbjoKLSAgICBjYXNlIGtJbnN0YWxsaW5nOiB7Ci0gICAgICAvLyAyLjEuIFNldCByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcgd29ya2VyIHRvIHNvdXJjZS4KLSAgICAgIHJlZ2lzdHJhdGlvbi0+c2V0X2luc3RhbGxpbmdfd29ya2VyKHNvdXJjZSk7Ci0gICAgICAvLyAyLjIuIEZvciBlYWNoIHJlZ2lzdHJhdGlvbk9iamVjdCBpbiByZWdpc3RyYXRpb25PYmplY3RzOgotICAgICAgZm9yIChhdXRvJiBjb250ZXh0IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKLSAgICAgICAgLy8gMi4yLjEuIFF1ZXVlIGEgdGFzayB0by4uLgotICAgICAgICBjb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICBbXSh3ZWI6OkNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAvLyAyLjIuMS4gLi4uIHNldCB0aGUgaW5zdGFsbGluZyBhdHRyaWJ1dGUgb2YKLSAgICAgICAgICAgICAgICAgIC8vICAgICAgICByZWdpc3RyYXRpb25PYmplY3QgdG8gbnVsbCBpZiByZWdpc3RyYXRpb27igJlzCi0gICAgICAgICAgICAgICAgICAvLyAgICAgICAgaW5zdGFsbGluZyB3b3JrZXIgaXMgbnVsbCwgb3IgdGhlIHJlc3VsdCBvZiBnZXR0aW5nCi0gICAgICAgICAgICAgICAgICAvLyAgICAgICAgdGhlIHNlcnZpY2Ugd29ya2VyIG9iamVjdCB0aGF0IHJlcHJlc2VudHMKLSAgICAgICAgICAgICAgICAgIC8vICAgICAgICByZWdpc3RyYXRpb27igJlzIGluc3RhbGxpbmcgd29ya2VyIGluCi0gICAgICAgICAgICAgICAgICAvLyAgICAgICAgcmVnaXN0cmF0aW9uT2JqZWN04oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuCi0gICAgICAgICAgICAgICAgICBhdXRvIHJlZ2lzdHJhdGlvbl9vYmplY3QgPQotICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkxvb2t1cFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25fb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbl9vYmplY3QtPnNldF9pbnN0YWxsaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0U2VydmljZVdvcmtlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24tPmluc3RhbGxpbmdfd29ya2VyKCkpKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIGNvbnRleHQsIGJhc2U6OlVucmV0YWluZWQocmVnaXN0cmF0aW9uKSkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8vIDMuIEVsc2UgaWYgdGFyZ2V0IGlzICJ3YWl0aW5nIiwgdGhlbjoKLSAgICBjYXNlIGtXYWl0aW5nOiB7Ci0gICAgICAvLyAzLjEuIFNldCByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIHRvIHNvdXJjZS4KLSAgICAgIHJlZ2lzdHJhdGlvbi0+c2V0X3dhaXRpbmdfd29ya2VyKHNvdXJjZSk7Ci0gICAgICAvLyAzLjIuIEZvciBlYWNoIHJlZ2lzdHJhdGlvbk9iamVjdCBpbiByZWdpc3RyYXRpb25PYmplY3RzOgotICAgICAgZm9yIChhdXRvJiBjb250ZXh0IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKLSAgICAgICAgLy8gMy4yLjEuIFF1ZXVlIGEgdGFzayB0by4uLgotICAgICAgICBjb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICBbXSh3ZWI6OkNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAvLyAzLjIuMS4gLi4uIHNldCB0aGUgd2FpdGluZyBhdHRyaWJ1dGUgb2YgcmVnaXN0cmF0aW9uT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAvLyAgICAgICAgdG8gbnVsbCBpZiByZWdpc3RyYXRpb27igJlzIHdhaXRpbmcgd29ya2VyIGlzIG51bGwsIG9yCi0gICAgICAgICAgICAgICAgICAvLyAgICAgICAgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIHRoZSBzZXJ2aWNlIHdvcmtlciBvYmplY3QgdGhhdAotICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlcHJlc2VudHMgcmVnaXN0cmF0aW9u4oCZcyB3YWl0aW5nIHdvcmtlciBpbgotICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbk9iamVjdOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgotICAgICAgICAgICAgICAgICAgYXV0byByZWdpc3RyYXRpb25fb2JqZWN0ID0KLSAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5Mb29rdXBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uX29iamVjdCkgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25fb2JqZWN0LT5zZXRfd2FpdGluZyhjb250ZXh0LT5HZXRTZXJ2aWNlV29ya2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLT53YWl0aW5nX3dvcmtlcigpKSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBjb250ZXh0LCBiYXNlOjpVbnJldGFpbmVkKHJlZ2lzdHJhdGlvbikpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvLyA0LiBFbHNlIGlmIHRhcmdldCBpcyAiYWN0aXZlIiwgdGhlbjoKLSAgICBjYXNlIGtBY3RpdmU6IHsKLSAgICAgIC8vIDQuMS4gU2V0IHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciB0byBzb3VyY2UuCi0gICAgICByZWdpc3RyYXRpb24tPnNldF9hY3RpdmVfd29ya2VyKHNvdXJjZSk7Ci0gICAgICAvLyA0LjIuIEZvciBlYWNoIHJlZ2lzdHJhdGlvbk9iamVjdCBpbiByZWdpc3RyYXRpb25PYmplY3RzOgotICAgICAgZm9yIChhdXRvJiBjb250ZXh0IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKLSAgICAgICAgLy8gNC4yLjEuIFF1ZXVlIGEgdGFzayB0by4uLgotICAgICAgICBjb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICBbXSh3ZWI6OkNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAvLyA0LjIuMS4gLi4uIHNldCB0aGUgYWN0aXZlIGF0dHJpYnV0ZSBvZiByZWdpc3RyYXRpb25PYmplY3QKLSAgICAgICAgICAgICAgICAgIC8vICAgICAgICB0byBudWxsIGlmIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciBpcyBudWxsLCBvcgotICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc2VydmljZSB3b3JrZXIgb2JqZWN0IHRoYXQKLSAgICAgICAgICAgICAgICAgIC8vICAgICAgICByZXByZXNlbnRzIHJlZ2lzdHJhdGlvbuKAmXMgYWN0aXZlIHdvcmtlciBpbgotICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbk9iamVjdOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgotICAgICAgICAgICAgICAgICAgYXV0byByZWdpc3RyYXRpb25fb2JqZWN0ID0KLSAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5Mb29rdXBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uX29iamVjdCkgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25fb2JqZWN0LT5zZXRfYWN0aXZlKGNvbnRleHQtPkdldFNlcnZpY2VXb3JrZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSkpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgY29udGV4dCwgYmFzZTo6VW5yZXRhaW5lZChyZWdpc3RyYXRpb24pKSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgfQotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpVcGRhdGVXb3JrZXJTdGF0ZShTZXJ2aWNlV29ya2VyT2JqZWN0KiB3b3JrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlV29ya2VyU3RhdGUgc3RhdGUpIHsKLSAgVFJBQ0VfRVZFTlQxKCJjb2JhbHQ6OndvcmtlciIsICJTZXJ2aWNlV29ya2VySm9iczo6VXBkYXRlV29ya2VyU3RhdGUoKSIsCi0gICAgICAgICAgICAgICAic3RhdGUiLCBzdGF0ZSk7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIERDSEVDSyh3b3JrZXIpOwotICBpZiAoIXdvcmtlcikgewotICAgIHJldHVybjsKLSAgfQotICAvLyBBbGdvcml0aG0gZm9yIFVwZGF0ZSBXb3JrZXIgU3RhdGU6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdXBkYXRlLXN0YXRlLWFsZ29yaXRobQotICAvLyAxLiBBc3NlcnQ6IHN0YXRlIGlzIG5vdCAicGFyc2VkIi4KLSAgRENIRUNLX05FKGtTZXJ2aWNlV29ya2VyU3RhdGVQYXJzZWQsIHN0YXRlKTsKLSAgLy8gMi4gU2V0IHdvcmtlcidzIHN0YXRlIHRvIHN0YXRlLgotICB3b3JrZXItPnNldF9zdGF0ZShzdGF0ZSk7Ci0gIGF1dG8gd29ya2VyX29yaWdpbiA9IGxvYWRlcjo6T3JpZ2luKHdvcmtlci0+c2NyaXB0X3VybCgpKTsKLSAgLy8gMy4gTGV0IHNldHRpbmdzT2JqZWN0cyBiZSBhbGwgZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0cyB3aG9zZSBvcmlnaW4gaXMKLSAgLy8gICAgd29ya2VyJ3Mgc2NyaXB0IHVybCdzIG9yaWdpbi4KLSAgLy8gNC4gRm9yIGVhY2ggc2V0dGluZ3NPYmplY3Qgb2Ygc2V0dGluZ3NPYmplY3RzLi4uCi0gIGZvciAoYXV0byYgY29udGV4dCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7Ci0gICAgaWYgKGNvbnRleHQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPkdldE9yaWdpbigpID09IHdvcmtlcl9vcmlnaW4pIHsKLSAgICAgIC8vIDQuIC4uLiBxdWV1ZSBhIHRhc2sgb24KLSAgICAgIC8vICAgIHNldHRpbmdzT2JqZWN0J3MgcmVzcG9uc2libGUgZXZlbnQgbG9vcCBpbiB0aGUgRE9NIG1hbmlwdWxhdGlvbiB0YXNrCi0gICAgICAvLyAgICBzb3VyY2UgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gICAgICBjb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICBbXSh3ZWI6OkNvbnRleHQqIGNvbnRleHQsIFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlciwKLSAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlclN0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgRENIRUNLX0VRKGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgICAgICAgICAgICAgICAvLyA0LjEuIExldCBvYmplY3RNYXAgYmUgc2V0dGluZ3NPYmplY3QncyBzZXJ2aWNlIHdvcmtlciBvYmplY3QKLSAgICAgICAgICAgICAgICAvLyAgICAgIG1hcC4KLSAgICAgICAgICAgICAgICAvLyA0LjIuIElmIG9iamVjdE1hcFt3b3JrZXJdIGRvZXMgbm90IGV4aXN0LCB0aGVuIGFib3J0IHRoZXNlCi0gICAgICAgICAgICAgICAgLy8gICAgICBzdGVwcy4KLSAgICAgICAgICAgICAgICAvLyA0LjMuIExldCAgd29ya2VyT2JqIGJlIG9iamVjdE1hcFt3b3JrZXJdLgotICAgICAgICAgICAgICAgIGF1dG8gd29ya2VyX29iaiA9IGNvbnRleHQtPkxvb2t1cFNlcnZpY2VXb3JrZXIod29ya2VyKTsKLSAgICAgICAgICAgICAgICBpZiAod29ya2VyX29iaikgewotICAgICAgICAgICAgICAgICAgLy8gNC40LiBTZXQgd29ya2VyT2JqJ3Mgc3RhdGUgdG8gc3RhdGUuCi0gICAgICAgICAgICAgICAgICB3b3JrZXJfb2JqLT5zZXRfc3RhdGUoc3RhdGUpOwotICAgICAgICAgICAgICAgICAgLy8gNC41LiBGaXJlIGFuIGV2ZW50IG5hbWVkIHN0YXRlY2hhbmdlIGF0IHdvcmtlck9iai4KLSAgICAgICAgICAgICAgICAgIGNvbnRleHQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgICAgICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtdKHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlcj4gd29ya2VyX29iaikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9vYmotPkRpc3BhdGNoRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyB3ZWI6OkV2ZW50KGJhc2U6OlRva2Vuczo6c3RhdGVjaGFuZ2UoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfb2JqKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICBjb250ZXh0LCBiYXNlOjpVbnJldGFpbmVkKHdvcmtlciksIHN0YXRlKSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgU2VydmljZVdvcmtlckpvYnM6OkhhbmRsZVNlcnZpY2VXb3JrZXJDbGllbnRVbmxvYWQod2ViOjpDb250ZXh0KiBjbGllbnQpIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsCi0gICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckpvYnM6OkhhbmRsZVNlcnZpY2VXb3JrZXJDbGllbnRVbmxvYWQoKSIpOwotICAvLyBBbGdvcml0aG0gZm9yIEhhbmRsZSBTZXJ2aWNlciBXb3JrZXIgQ2xpZW50IFVubG9hZDoKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNvbi1jbGllbnQtdW5sb2FkLWFsZ29yaXRobQotICBEQ0hFQ0soY2xpZW50KTsKLSAgLy8gMS4gUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXRvbWljYWxseS4KLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLQotICAvLyAyLiBMZXQgcmVnaXN0cmF0aW9uIGJlIHRoZSBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb24gdXNlZCBieSBjbGllbnQuCi0gIC8vIDMuIElmIHJlZ2lzdHJhdGlvbiBpcyBudWxsLCBhYm9ydCB0aGVzZSBzdGVwcy4KLSAgU2VydmljZVdvcmtlck9iamVjdCogYWN0aXZlX3NlcnZpY2Vfd29ya2VyID0gY2xpZW50LT5hY3RpdmVfc2VydmljZV93b3JrZXIoKTsKLSAgaWYgKCFhY3RpdmVfc2VydmljZV93b3JrZXIpIHJldHVybjsKLSAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uID0KLSAgICAgIGFjdGl2ZV9zZXJ2aWNlX3dvcmtlci0+Y29udGFpbmluZ19zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24oKTsKLSAgaWYgKCFyZWdpc3RyYXRpb24pIHJldHVybjsKLQotICAvLyA0LiBJZiBhbnkgb3RoZXIgc2VydmljZSB3b3JrZXIgY2xpZW50IGlzIHVzaW5nIHJlZ2lzdHJhdGlvbiwgYWJvcnQgdGhlc2UKLSAgLy8gICAgc3RlcHMuCi0gIC8vIEVuc3VyZSB0aGUgY2xpZW50IGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyYXRpb25zIHdoZW4gdGhpcyBydW5zLgotICBEQ0hFQ0sod2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18uZW5kKCkgPT0KLSAgICAgICAgIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmZpbmQoY2xpZW50KSk7Ci0gIGlmIChJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbikpIHJldHVybjsKLQotICAvLyA1LiBJZiByZWdpc3RyYXRpb24gaXMgdW5yZWdpc3RlcmVkLCBpbnZva2UgVHJ5IENsZWFyIFJlZ2lzdHJhdGlvbiB3aXRoCi0gIC8vICAgIHJlZ2lzdHJhdGlvbi4KLSAgaWYgKHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfICYmCi0gICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+SXNVbnJlZ2lzdGVyZWQocmVnaXN0cmF0aW9uKSkgewotICAgIFRyeUNsZWFyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7Ci0gIH0KLQotICAvLyA2LiBJbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGggcmVnaXN0cmF0aW9uLgotICBUcnlBY3RpdmF0ZShyZWdpc3RyYXRpb24pOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpUZXJtaW5hdGVTZXJ2aWNlV29ya2VyKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlcikgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJKb2JzOjpUZXJtaW5hdGVTZXJ2aWNlV29ya2VyKCkiKTsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgLy8gQWxnb3JpdGhtIGZvciBUZXJtaW5hdGUgU2VydmljZSBXb3JrZXI6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdGVybWluYXRlLXNlcnZpY2Utd29ya2VyCi0gIC8vIDEuIFJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIGluIHBhcmFsbGVsIHdpdGggc2VydmljZVdvcmtlcuKAmXMgbWFpbiBsb29wOgotICAvLyBUaGlzIHJ1bnMgaW4gdGhlIFNlcnZpY2VXb3JrZXJSZWdpc3RyeSB0aHJlYWQuCi0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0KLSAgLy8gMS4xLiBMZXQgc2VydmljZVdvcmtlckdsb2JhbFNjb3BlIGJlIHNlcnZpY2VXb3JrZXLigJlzIGdsb2JhbCBvYmplY3QuCi0gIFdvcmtlckdsb2JhbFNjb3BlKiBzZXJ2aWNlX3dvcmtlcl9nbG9iYWxfc2NvcGUgPQotICAgICAgd29ya2VyLT53b3JrZXJfZ2xvYmFsX3Njb3BlKCk7Ci0KLSAgLy8gMS4yLiBTZXQgc2VydmljZVdvcmtlckdsb2JhbFNjb3Bl4oCZcyBjbG9zaW5nIGZsYWcgdG8gdHJ1ZS4KLSAgaWYgKHNlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZSAhPSBudWxscHRyKQotICAgIHNlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS0+c2V0X2Nsb3NpbmdfZmxhZyh0cnVlKTsKLQotICAvLyAxLjMuIFJlbW92ZSBhbGwgdGhlIGl0ZW1zIGZyb20gc2VydmljZVdvcmtlcuKAmXMgc2V0IG9mIGV4dGVuZGVkIGV2ZW50cy4KLSAgLy8gVE9ETyhiLzI0MDE3NDI0NSk6IEltcGxlbWVudCAnc2V0IG9mIGV4dGVuZGVkIGV2ZW50cycuCi0KLSAgLy8gMS40LiBJZiB0aGVyZSBhcmUgYW55IHRhc2tzLCB3aG9zZSB0YXNrIHNvdXJjZSBpcyBlaXRoZXIgdGhlIGhhbmRsZSBmZXRjaAotICAvLyAgICAgIHRhc2sgc291cmNlIG9yIHRoZSBoYW5kbGUgZnVuY3Rpb25hbCBldmVudCB0YXNrIHNvdXJjZSwgcXVldWVkIGluCi0gIC8vICAgICAgc2VydmljZVdvcmtlckdsb2JhbFNjb3Bl4oCZcyBldmVudCBsb29w4oCZcyB0YXNrIHF1ZXVlcywgcXVldWUgdGhlbSB0bwotICAvLyAgICAgIHNlcnZpY2VXb3JrZXLigJlzIGNvbnRhaW5pbmcgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9u4oCZcyBjb3JyZXNwb25kaW5nCi0gIC8vICAgICAgdGFzayBxdWV1ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdXNpbmcgdGhlaXIgb3JpZ2luYWwgdGFzayBzb3VyY2VzLCBhbmQKLSAgLy8gICAgICBkaXNjYXJkIGFsbCB0aGUgdGFza3MgKGluY2x1ZGluZyB0YXNrcyB3aG9zZSB0YXNrIHNvdXJjZSBpcyBuZWl0aGVyCi0gIC8vICAgICAgdGhlIGhhbmRsZSBmZXRjaCB0YXNrIHNvdXJjZSBub3IgdGhlIGhhbmRsZSBmdW5jdGlvbmFsIGV2ZW50IHRhc2sKLSAgLy8gICAgICBzb3VyY2UpIGZyb20gc2VydmljZVdvcmtlckdsb2JhbFNjb3Bl4oCZcyBldmVudCBsb29w4oCZcyB0YXNrIHF1ZXVlcwotICAvLyAgICAgIHdpdGhvdXQgcHJvY2Vzc2luZyB0aGVtLgotICAvLyBUT0RPKGIvMjM0Nzg3NjQxKTogUXVldWUgdGFza3MgdG8gdGhlIHJlZ2lzdHJhdGlvbi4KLQotICAvLyBOb3RlOiBUaGlzIHN0ZXAgaXMgbm90IGluIHRoZSBzcGVjLCBidXQgd2l0aG91dCB0aGlzIHN0ZXAgdGhlIHNlcnZpY2UKLSAgLy8gd29ya2VyIG9iamVjdCBtYXAgd2lsbCBhbHdheXMga2VlcCBhbiBlbnRyeSB3aXRoIGEgc2VydmljZSB3b3JrZXIgaW5zdGFuY2UKLSAgLy8gZm9yIHRoZSB0ZXJtaW5hdGVkIHNlcnZpY2Ugd29ya2VyLCB3aGljaCBiZXNpZGVzIGxlYWtpbmcgbWVtb3J5IGNhbiBsZWFkIHRvCi0gIC8vIHVuZXhwZWN0ZWQgYmVoYXZpb3Igd2hlbiBuZXcgc2VydmljZSB3b3JrZXIgb2JqZWN0cyBhcmUgY3JlYXRlZCB3aXRoIHRoZQotICAvLyBzYW1lIGtleSBmb3IgdGhlIHNlcnZpY2Ugd29ya2VyIG9iamVjdCBtYXAgKHdoaWNoIGluIENvYmFsdCdzIGNhc2UKLSAgLy8gaGFwcGVucyB3aGVuIGEgbmV3IHNlcnZpY2Ugd29ya2VyIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhdCB0aGUgc2FtZQotICAvLyBtZW1vcnkgYWRkcmVzcykuCi0gIGZvciAoYXV0byYgY29udGV4dCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7Ci0gICAgY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RCbG9ja2luZ1Rhc2soCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjb250ZXh0LCBTZXJ2aWNlV29ya2VyT2JqZWN0KiB3b3JrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5SZW1vdmVTZXJ2aWNlV29ya2VyKHdvcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGJhc2U6OlVucmV0YWluZWQod29ya2VyKSkpOwotICB9Ci0KLSAgLy8gMS41LiBBYm9ydCB0aGUgc2NyaXB0IGN1cnJlbnRseSBydW5uaW5nIGluIHNlcnZpY2VXb3JrZXIuCi0gIGlmICh3b3JrZXItPmlzX3J1bm5pbmcoKSkgewotICAgIHdvcmtlci0+QWJvcnQoKTsKLSAgfQotCi0gIC8vIDEuNi4gU2V0IHNlcnZpY2VXb3JrZXLigJlzIHN0YXJ0IHN0YXR1cyB0byBudWxsLgotICB3b3JrZXItPnNldF9zdGFydF9zdGF0dXMobnVsbHB0cik7CisgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5yZWdpc3RyYXRpb25fbWFwKCktPlBlcnNpc3RSZWdpc3RyYXRpb24oCisgICAgICByZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksIHJlZ2lzdHJhdGlvbi0+c2NvcGVfdXJsKCkpOwogfQogCiB2b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpVbnJlZ2lzdGVyKEpvYiogam9iKSB7CkBAIC0xOTM1LDggKzEwMjYsOCBAQAogICAvLyAyLiBMZXQgcmVnaXN0cmF0aW9uIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBHZXQgUmVnaXN0cmF0aW9uIGdpdmVuIGpvYuKAmXMKICAgLy8gICAgc3RvcmFnZSBrZXkgYW5kIGpvYuKAmXMgc2NvcGUgdXJsLgogICBzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+IHJlZ2lzdHJhdGlvbiA9Ci0gICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+R2V0UmVnaXN0cmF0aW9uKGpvYi0+c3RvcmFnZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYi0+c2NvcGVfdXJsKTsKKyAgICAgIHNlcnZpY2Vfd29ya2VyX2NvbnRleHRfLT5yZWdpc3RyYXRpb25fbWFwKCktPkdldFJlZ2lzdHJhdGlvbigKKyAgICAgICAgICBqb2ItPnN0b3JhZ2Vfa2V5LCBqb2ItPnNjb3BlX3VybCk7CiAKICAgLy8gMy4gSWYgcmVnaXN0cmF0aW9uIGlzIG51bGwsIHRoZW46CiAgIGlmICghcmVnaXN0cmF0aW9uKSB7CkBAIC0xOTUwLDE0ICsxMDQxLDE0IEBACiAKICAgLy8gNC4gUmVtb3ZlIHJlZ2lzdHJhdGlvbiBtYXBbKHJlZ2lzdHJhdGlvbuKAmXMgc3RvcmFnZSBrZXksIGpvYuKAmXMgc2NvcGUgdXJsKV0uCiAgIC8vIEtlZXAgdGhlIHJlZ2lzdHJhdGlvbiB1bnRpbCB0aGlzIGFsZ29yaXRobSBmaW5pc2hlcy4KLSAgc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF8tPlJlbW92ZVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iLT5zY29wZV91cmwpOworICBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0Xy0+cmVnaXN0cmF0aW9uX21hcCgpLT5SZW1vdmVSZWdpc3RyYXRpb24oCisgICAgICByZWdpc3RyYXRpb24tPnN0b3JhZ2Vfa2V5KCksIGpvYi0+c2NvcGVfdXJsKTsKIAogICAvLyA1LiBJbnZva2UgUmVzb2x2ZSBKb2IgUHJvbWlzZSB3aXRoIGpvYiBhbmQgdHJ1ZS4KICAgUmVzb2x2ZUpvYlByb21pc2Uoam9iLCB0cnVlKTsKIAogICAvLyA2LiBJbnZva2UgVHJ5IENsZWFyIFJlZ2lzdHJhdGlvbiB3aXRoIHJlZ2lzdHJhdGlvbi4KLSAgVHJ5Q2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKKyAgc2VydmljZV93b3JrZXJfY29udGV4dF8tPlRyeUNsZWFyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7CiAKICAgLy8gNy4gSW52b2tlIEZpbmlzaCBKb2Igd2l0aCBqb2IuCiAgIEZpbmlzaEpvYihqb2IpOwpAQCAtMTk4MCw3ICsxMDcxLDcgQEAKICAgLy8gICAgICBqb2IgcHJvbWlzZSB3aXRoIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIGVycm9yRGF0YSBhbmQgYSB1c2VyCiAgIC8vICAgICAgYWdlbnQtZGVmaW5lZCBtZXNzYWdlLCBpbiBlcXVpdmFsZW50Sm9i4oCZcyBjbGllbnQncyBSZWFsbS4KICAgaWYgKGpvYi0+Y2xpZW50ICYmIGpvYi0+cHJvbWlzZSAhPSBudWxscHRyKSB7Ci0gICAgRENIRUNLKElzV2ViQ29udGV4dFJlZ2lzdGVyZWQoam9iLT5jbGllbnQpKTsKKyAgICBEQ0hFQ0soc2VydmljZV93b3JrZXJfY29udGV4dF8tPklzV2ViQ29udGV4dFJlZ2lzdGVyZWQoam9iLT5jbGllbnQpKTsKICAgICBqb2ItPmNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKAogICAgICAgICAgICAgICAgICAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8Sm9iUHJvbWlzZVR5cGU+IHByb21pc2UsCkBAIC0yMDE1LDcgKzExMDYsNyBAQAogICAvLyAyLjEgSWYgZXF1aXZhbGVudEpvYuKAmXMgY2xpZW50IGlzIG51bGwsIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZgogICAvLyB0aGUgbG9vcC4KICAgaWYgKGpvYi0+Y2xpZW50ICYmIGpvYi0+cHJvbWlzZSAhPSBudWxscHRyKSB7Ci0gICAgRENIRUNLKElzV2ViQ29udGV4dFJlZ2lzdGVyZWQoam9iLT5jbGllbnQpKTsKKyAgICBEQ0hFQ0soc2VydmljZV93b3JrZXJfY29udGV4dF8tPklzV2ViQ29udGV4dFJlZ2lzdGVyZWQoam9iLT5jbGllbnQpKTsKICAgICBqb2ItPmNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsCiAgICAgICAgIGJhc2U6OkJpbmRPbmNlKApAQCAtMjA3OSw3ODMgKzExNzAsNiBAQAogICB9CiB9CiAKLXZvaWQgU2VydmljZVdvcmtlckpvYnM6Ok1heWJlUmVzb2x2ZVJlYWR5UHJvbWlzZVN1YlN0ZXBzKHdlYjo6Q29udGV4dCogY2xpZW50KSB7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIC8vIEFsZ29yaXRobSBmb3IgU3ViIHN0ZXBzIG9mIFNlcnZpY2VXb3JrZXJDb250YWluZXIucmVhZHkoKToKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNuYXZpZ2F0b3Itc2VydmljZS13b3JrZXItcmVhZHkKLQotICAvLyAgICAzLjEuIExldCBjbGllbnQgYnkgdGhpcydzIHNlcnZpY2Ugd29ya2VyIGNsaWVudC4KLSAgLy8gICAgMy4yLiBMZXQgc3RvcmFnZSBrZXkgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIG9idGFpbiBhIHN0b3JhZ2UKLSAgLy8gICAgICAgICBrZXkgZ2l2ZW4gY2xpZW50LgotICB1cmw6Ok9yaWdpbiBzdG9yYWdlX2tleSA9IGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+T2J0YWluU3RvcmFnZUtleSgpOwotICAvLyAgICAzLjMuIExldCByZWdpc3RyYXRpb24gYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIE1hdGNoIFNlcnZpY2UKLSAgLy8gICAgICAgICBXb3JrZXIgUmVnaXN0cmF0aW9uIGdpdmVuIHN0b3JhZ2Uga2V5IGFuZCBjbGllbnTigJlzCi0gIC8vICAgICAgICAgY3JlYXRpb24gVVJMLgotICAvLyBUT0RPKGIvMjM0NjU5ODUxKTogSW52ZXN0aWdhdGUgd2hldGhlciB0aGlzIHNob3VsZCB1c2UgdGhlIGNyZWF0aW9uIFVSTAotICAvLyBkaXJlY3RseSBpbnN0ZWFkLgotICBjb25zdCBHVVJMJiBiYXNlX3VybCA9IGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y3JlYXRpb25fdXJsKCk7Ci0gIEdVUkwgY2xpZW50X3VybCA9IGJhc2VfdXJsLlJlc29sdmUoIiIpOwotICBzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+IHJlZ2lzdHJhdGlvbiA9Ci0gICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHN0b3JhZ2Vfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfdXJsKTsKLSAgLy8gICAgMy4zLiBJZiByZWdpc3RyYXRpb24gaXMgbm90IG51bGwsIGFuZCByZWdpc3RyYXRpb27igJlzIGFjdGl2ZQotICAvLyAgICAgICAgIHdvcmtlciBpcyBub3QgbnVsbCwgcXVldWUgYSB0YXNrIG9uIHJlYWR5UHJvbWlzZeKAmXMKLSAgLy8gICAgICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyByZXNwb25zaWJsZSBldmVudCBsb29wLCB1c2luZwotICAvLyAgICAgICAgIHRoZSBET00gbWFuaXB1bGF0aW9uIHRhc2sgc291cmNlLCB0byByZXNvbHZlIHJlYWR5UHJvbWlzZQotICAvLyAgICAgICAgIHdpdGggdGhlIHJlc3VsdCBvZiBnZXR0aW5nIHRoZSBzZXJ2aWNlIHdvcmtlcgotICAvLyAgICAgICAgIHJlZ2lzdHJhdGlvbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHJlZ2lzdHJhdGlvbiBpbgotICAvLyAgICAgICAgIHJlYWR5UHJvbWlzZeKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgotICBpZiAocmVnaXN0cmF0aW9uICYmIHJlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSB7Ci0gICAgY2xpZW50LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJDb250YWluZXI6Ok1heWJlUmVzb2x2ZVJlYWR5UHJvbWlzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjbGllbnQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm5hdmlnYXRvcl9iYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbikpOwotICB9Ci19Ci0KLXZvaWQgU2VydmljZVdvcmtlckpvYnM6OkdldFJlZ2lzdHJhdGlvblN1YlN0ZXBzKAotICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgY29uc3QgR1VSTCYgY2xpZW50X3VybCwKLSAgICB3ZWI6OkNvbnRleHQqIGNsaWVudCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsCi0gICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckpvYnM6OkdldFJlZ2lzdHJhdGlvblN1YlN0ZXBzKCkiKTsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgLy8gQWxnb3JpdGhtIGZvciBTdWIgc3RlcHMgb2YgU2VydmljZVdvcmtlckNvbnRhaW5lci5nZXRSZWdpc3RyYXRpb24oKToKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNuYXZpZ2F0b3Itc2VydmljZS13b3JrZXItZ2V0UmVnaXN0cmF0aW9uCi0KLSAgLy8gOC4xLiBMZXQgcmVnaXN0cmF0aW9uIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBNYXRjaCBTZXJ2aWNlIFdvcmtlcgotICAvLyAgICAgIFJlZ2lzdHJhdGlvbiBhbGdvcml0aG0gd2l0aCBjbGllbnRVUkwgYXMgaXRzIGFyZ3VtZW50LgotICBzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+IHJlZ2lzdHJhdGlvbiA9Ci0gICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHN0b3JhZ2Vfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfdXJsKTsKLSAgLy8gOC4yLiBJZiByZWdpc3RyYXRpb24gaXMgbnVsbCwgcmVzb2x2ZSBwcm9taXNlIHdpdGggdW5kZWZpbmVkIGFuZCBhYm9ydAotICAvLyAgICAgIHRoZXNlIHN0ZXBzLgotICAvLyA4LjMuIFJlc29sdmUgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc2VydmljZSB3b3JrZXIKLSAgLy8gICAgICByZWdpc3RyYXRpb24gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyByZWdpc3RyYXRpb24gaW4gcHJvbWlzZeKAmXMKLSAgLy8gICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuCi0gIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjbGllbnQsCi0gICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+IHByb21pc2UsCi0gICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiByZWdpc3RyYXRpb24pIHsKLSAgICAgICAgICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgICAgICAgICAiY29iYWx0Ojp3b3JrZXIiLAotICAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VySm9iczo6R2V0UmVnaXN0cmF0aW9uU3ViU3RlcHMoKSBSZXNvbHZlIik7Ci0gICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoCi0gICAgICAgICAgICAgICAgY2xpZW50LT5HZXRTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbikpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgY2xpZW50LCBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpLCByZWdpc3RyYXRpb24pKTsKLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6R2V0UmVnaXN0cmF0aW9uc1N1YlN0ZXBzKAotICAgIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgd2ViOjpDb250ZXh0KiBjbGllbnQsCi0gICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0Pj4KLSAgICAgIHJlZ2lzdHJhdGlvbl9vYmplY3RzID0KLSAgICAgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+R2V0UmVnaXN0cmF0aW9ucyhzdG9yYWdlX2tleSk7Ci0gIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjbGllbnQsCi0gICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgcHJvbWlzZSwKLSAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzY29wZWRfcmVmcHRyPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3Q+PgotICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25fb2JqZWN0cykgewotICAgICAgICAgICAgVFJBQ0VfRVZFTlQwKAotICAgICAgICAgICAgICAgICJjb2JhbHQ6OndvcmtlciIsCi0gICAgICAgICAgICAgICAgIlNlcnZpY2VXb3JrZXJKb2JzOjpHZXRSZWdpc3RyYXRpb25TdWJTdGVwcygpIFJlc29sdmUiKTsKLSAgICAgICAgICAgIHNjcmlwdDo6U2VxdWVuY2U8c2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4+IHJlZ2lzdHJhdGlvbnM7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gcmVnaXN0cmF0aW9uX29iamVjdCA6IHJlZ2lzdHJhdGlvbl9vYmplY3RzKSB7Ci0gICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMucHVzaF9iYWNrKHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+KAotICAgICAgICAgICAgICAgICAgY2xpZW50LT5HZXRTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbl9vYmplY3QpCi0gICAgICAgICAgICAgICAgICAgICAgLmdldCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoc3RkOjptb3ZlKHJlZ2lzdHJhdGlvbnMpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIGNsaWVudCwgc3RkOjptb3ZlKHByb21pc2VfcmVmZXJlbmNlKSwKLSAgICAgICAgICBzdGQ6Om1vdmUocmVnaXN0cmF0aW9uX29iamVjdHMpKSk7Ci19Ci0KLXZvaWQgU2VydmljZVdvcmtlckpvYnM6OlNraXBXYWl0aW5nU3ViU3RlcHMoCi0gICAgd2ViOjpDb250ZXh0KiB3b3JrZXJfY29udGV4dCwgU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsCi0gICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlX3JlZmVyZW5jZSkgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwgIlNlcnZpY2VXb3JrZXJKb2JzOjpTa2lwV2FpdGluZ1N1YlN0ZXBzKCkiKTsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCB3ZWIgY29udGV4dCBpcyBzdGlsbCBhY3RpdmUuIFRoaXMgbWF5IHRyaWdnZXIgaWYKLSAgLy8gc2tpcFdhaXRpbmcoKSB3YXMgY2FsbGVkIGFuZCBzZXJ2aWNlIHdvcmtlciBpbnN0YWxsYXRpb24gZmFpbHMuCi0gIGlmICghSXNXZWJDb250ZXh0UmVnaXN0ZXJlZCh3b3JrZXJfY29udGV4dCkpIHsKLSAgICBwcm9taXNlX3JlZmVyZW5jZS5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQWxnb3JpdGhtIGZvciBTdWIgc3RlcHMgb2YgU2VydmljZVdvcmtlckdsb2JhbFNjb3BlLnNraXBXYWl0aW5nKCk6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLXNlcnZpY2V3b3JrZXJnbG9iYWxzY29wZS1za2lwd2FpdGluZwotCi0gIC8vIDIuMS4gU2V0IHNlcnZpY2Ugd29ya2VyJ3Mgc2tpcCB3YWl0aW5nIGZsYWcuCi0gIHNlcnZpY2Vfd29ya2VyLT5zZXRfc2tpcF93YWl0aW5nKCk7Ci0KLSAgLy8gMi4yLiBJbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGggc2VydmljZSB3b3JrZXIncyBjb250YWluaW5nIHNlcnZpY2Ugd29ya2VyCi0gIC8vIHJlZ2lzdHJhdGlvbi4KLSAgVHJ5QWN0aXZhdGUoc2VydmljZV93b3JrZXItPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCkpOwotCi0gIC8vIDIuMy4gUmVzb2x2ZSBwcm9taXNlIHdpdGggdW5kZWZpbmVkLgotICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlKSB7Ci0gICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpKTsKLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6V2FpdFVudGlsU3ViU3RlcHMoCi0gICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKSB7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckpvYnM6OldhaXRVbnRpbFN1YlN0ZXBzKCkiKTsKLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgLy8gU3ViIHN0ZXBzIGZvciBXYWl0VW50aWwuCi0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLWV4dGVuZGFibGVldmVudC13YWl0dW50aWwKLSAgLy8gNS4yLjIuIElmIHJlZ2lzdHJhdGlvbiBpcyB1bnJlZ2lzdGVyZWQsIGludm9rZSBUcnkgQ2xlYXIgUmVnaXN0cmF0aW9uCi0gIC8vICAgICAgICB3aXRoIHJlZ2lzdHJhdGlvbi4KLSAgaWYgKHNjb3BlX3RvX3JlZ2lzdHJhdGlvbl9tYXBfLT5Jc1VucmVnaXN0ZXJlZChyZWdpc3RyYXRpb24pKSB7Ci0gICAgVHJ5Q2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKLSAgfQotICAvLyA1LjIuMy4gSWYgcmVnaXN0cmF0aW9uIGlzIG5vdCBudWxsLCBpbnZva2UgVHJ5IEFjdGl2YXRlIHdpdGgKLSAgLy8gICAgICAgIHJlZ2lzdHJhdGlvbi4KLSAgaWYgKHJlZ2lzdHJhdGlvbikgewotICAgIFRyeUFjdGl2YXRlKHJlZ2lzdHJhdGlvbik7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c0dldFN1YlN0ZXBzKAotICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCi0gICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4gcHJvbWlzZV9yZWZlcmVuY2UsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckpvYnM6OkNsaWVudHNHZXRTdWJTdGVwcygpIik7Ci0gIERDSEVDS19FUShtZXNzYWdlX2xvb3AoKSwgYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7Ci0gIC8vIENoZWNrIGlmIHRoZSBjbGllbnQgd2ViIGNvbnRleHQgaXMgc3RpbGwgYWN0aXZlLiBUaGlzIG1heSB0cmlnZ2VyIGlmCi0gIC8vIENsaWVudHMuZ2V0KCkgd2FzIGNhbGxlZCBhbmQgc2VydmljZSB3b3JrZXIgaW5zdGFsbGF0aW9uIGZhaWxzLgotICBpZiAoIUlzV2ViQ29udGV4dFJlZ2lzdGVyZWQod29ya2VyX2NvbnRleHQpKSB7Ci0gICAgcHJvbWlzZV9yZWZlcmVuY2UucmVsZWFzZSgpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBQYXJhbGxlbCBzdWIgc3RlcHMgKDIpIGZvciBhbGdvcml0aG0gZm9yIENsaWVudHMuZ2V0KGlkKToKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGllbnRzLWdldAotICAvLyAyLjEuIEZvciBlYWNoIHNlcnZpY2Ugd29ya2VyIGNsaWVudCBjbGllbnQgd2hlcmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nCi0gIC8vICAgICAgb2J0YWluIGEgc3RvcmFnZSBrZXkgZ2l2ZW4gY2xpZW50IGVxdWFscyB0aGUgYXNzb2NpYXRlZCBzZXJ2aWNlCi0gIC8vICAgICAgd29ya2VyJ3MgY29udGFpbmluZyBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb24ncyBzdG9yYWdlIGtleToKLSAgY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5ID0KLSAgICAgIGFzc29jaWF0ZWRfc2VydmljZV93b3JrZXItPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCkKLSAgICAgICAgICAtPnN0b3JhZ2Vfa2V5KCk7Ci0gIGZvciAoYXV0byYgY2xpZW50IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKLSAgICB1cmw6Ok9yaWdpbiBjbGllbnRfc3RvcmFnZV9rZXkgPQotICAgICAgICBjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPk9idGFpblN0b3JhZ2VLZXkoKTsKLSAgICBpZiAoY2xpZW50X3N0b3JhZ2Vfa2V5LklzU2FtZU9yaWdpbldpdGgoc3RvcmFnZV9rZXkpKSB7Ci0gICAgICAvLyAyLjEuMS4gSWYgY2xpZW504oCZcyBpZCBpcyBub3QgaWQsIGNvbnRpbnVlLgotICAgICAgaWYgKGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+aWQoKSAhPSBpZCkgY29udGludWU7Ci0KLSAgICAgIC8vIDIuMS4yLiBXYWl0IGZvciBlaXRoZXIgY2xpZW504oCZcyBleGVjdXRpb24gcmVhZHkgZmxhZyB0byBiZSBzZXQgb3IgZm9yCi0gICAgICAvLyAgICAgICAgY2xpZW504oCZcyBkaXNjYXJkZWQgZmxhZyB0byBiZSBzZXQuCi0gICAgICAvLyBXZWIgQ29udGV4dHMgZXhpc3Qgb25seSBpbiB0aGUgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18gc2V0IHdoZW4gdGhleQotICAgICAgLy8gYXJlIGJvdGggZXhlY3V0aW9uIHJlYWR5IGFuZCBub3QgZGlzY2FyZGVkLgotCi0gICAgICAvLyAyLjEuMy4gSWYgY2xpZW504oCZcyBleGVjdXRpb24gcmVhZHkgZmxhZyBpcyBzZXQsIHRoZW4gaW52b2tlIFJlc29sdmUgR2V0Ci0gICAgICAvLyAgICAgICAgQ2xpZW50IFByb21pc2Ugd2l0aCBjbGllbnQgYW5kIHByb21pc2UsIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KLSAgICAgIFJlc29sdmVHZXRDbGllbnRQcm9taXNlKGNsaWVudCwgd29ya2VyX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgLy8gMi4yLiBSZXNvbHZlIHByb21pc2Ugd2l0aCB1bmRlZmluZWQuCi0gIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UpIHsKLSAgICAgICAgICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c0dldFN1YlN0ZXBzKCkgUmVzb2x2ZSIpOwotICAgICAgICAgICAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVzb2x2ZShzY29wZWRfcmVmcHRyPENsaWVudD4oKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpKSk7Ci19Ci0KLXZvaWQgU2VydmljZVdvcmtlckpvYnM6OlJlc29sdmVHZXRDbGllbnRQcm9taXNlKAotICAgIHdlYjo6Q29udGV4dCogY2xpZW50LCB3ZWI6OkNvbnRleHQqIHdvcmtlcl9jb250ZXh0LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgotICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSkgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwKLSAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VySm9iczo6UmVzb2x2ZUdldENsaWVudFByb21pc2UoKSIpOwotICAvLyBBbGdvcml0aG0gZm9yIFJlc29sdmUgR2V0IENsaWVudCBQcm9taXNlOgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3Jlc29sdmUtZ2V0LWNsaWVudC1wcm9taXNlCi0KLSAgLy8gMS4gSWYgY2xpZW50IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgdGhlbjoKLSAgLy8gMS4xLiBJZiBjbGllbnQgaXMgbm90IGEgc2VjdXJlIGNvbnRleHQsIHF1ZXVlIGEgdGFzayB0byByZWplY3QgcHJvbWlzZSB3aXRoCi0gIC8vICAgICAgYSAiU2VjdXJpdHlFcnJvciIgRE9NRXhjZXB0aW9uLCBvbiBwcm9taXNl4oCZcyByZWxldmFudCBzZXR0aW5ncwotICAvLyAgICAgIG9iamVjdCdzIHJlc3BvbnNpYmxlIGV2ZW50IGxvb3AgdXNpbmcgdGhlIERPTSBtYW5pcHVsYXRpb24gdGFzawotICAvLyAgICAgIHNvdXJjZSwgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgotICAvLyAyLiBFbHNlOgotICAvLyAyLjEuIElmIGNsaWVudOKAmXMgY3JlYXRpb24gVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCwgcXVldWUKLSAgLy8gICAgICBhIHRhc2sgdG8gcmVqZWN0IHByb21pc2Ugd2l0aCBhICJTZWN1cml0eUVycm9yIiBET01FeGNlcHRpb24sIG9uCi0gIC8vICAgICAgcHJvbWlzZeKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0J3MgcmVzcG9uc2libGUgZXZlbnQgbG9vcCB1c2luZyB0aGUKLSAgLy8gICAgICBET00gbWFuaXB1bGF0aW9uIHRhc2sgc291cmNlLCBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCi0gIC8vIEluIHByb2R1Y3Rpb24sIENvYmFsdCByZXF1aXJlcyBodHRwcywgdGhlcmVmb3JlIGFsbCBjbGllbnRzIGFyZSBzZWN1cmUKLSAgLy8gY29udGV4dHMuCi0KLSAgLy8gMy4gSWYgY2xpZW50IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCBhbmQgaXMgbm90IGEgd2luZG93IGNsaWVudCwKLSAgLy8gICAgdGhlbjoKLSAgaWYgKCFjbGllbnQtPkdldFdpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUoKS0+SXNXaW5kb3coKSkgewotICAgIC8vIDMuMS4gTGV0IGNsaWVudE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgQ3JlYXRlIENsaWVudCBhbGdvcml0aG0KLSAgICAvLyAgICAgIHdpdGggY2xpZW50IGFzIHRoZSBhcmd1bWVudC4KLSAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gY2xpZW50X29iamVjdCA9Ci0gICAgICAgIENsaWVudDo6Q3JlYXRlKGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSk7Ci0KLSAgICAvLyAzLjIuIFF1ZXVlIGEgdGFzayB0byByZXNvbHZlIHByb21pc2Ugd2l0aCBjbGllbnRPYmplY3QsIG9uIHByb21pc2XigJlzCi0gICAgLy8gICAgICByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyByZXNwb25zaWJsZSBldmVudCBsb29wIHVzaW5nIHRoZSBET00KLSAgICAvLyAgICAgIG1hbmlwdWxhdGlvbiB0YXNrIHNvdXJjZSwgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgotICAgIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSwKLSAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8Q2xpZW50PiBjbGllbnRfb2JqZWN0KSB7Ci0gICAgICAgICAgICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgICAgICAgICAgICJjb2JhbHQ6OndvcmtlciIsCi0gICAgICAgICAgICAgICAgICAiU2VydmljZVdvcmtlckpvYnM6OlJlc29sdmVHZXRDbGllbnRQcm9taXNlKCkgUmVzb2x2ZSIpOwotICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZXNvbHZlKGNsaWVudF9vYmplY3QpOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIGNsaWVudF9vYmplY3QpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gNC4gRWxzZToKLSAgLy8gNC4xLiBMZXQgYnJvd3NpbmdDb250ZXh0IGJlIG51bGwuCi0gIC8vIDQuMi4gSWYgY2xpZW50IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgc2V0IGJyb3dzaW5nQ29udGV4dCB0bwotICAvLyAgICAgIGNsaWVudOKAmXMgZ2xvYmFsIG9iamVjdCdzIGJyb3dzaW5nIGNvbnRleHQuCi0gIC8vIDQuMy4gRWxzZSwgc2V0IGJyb3dzaW5nQ29udGV4dCB0byBjbGllbnTigJlzIHRhcmdldCBicm93c2luZyBjb250ZXh0LgotICAvLyBOb3RlOiBDb2JhbHQgZG9lcyBub3QgaW1wbGVtZW50IGEgZGlzdGluY3Rpb24gYmV0d2VlbiBlbnZpcm9ubWVudHMgYW5kCi0gIC8vIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdHMuCi0gIC8vIDQuNC4gUXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIG9uIGJyb3dzaW5nQ29udGV4dOKAmXMgZXZlbnQKLSAgLy8gICAgICBsb29wIHVzaW5nIHRoZSB1c2VyIGludGVyYWN0aW9uIHRhc2sgc291cmNlOgotICAvLyBOb3RlOiBUaGUgdGFzayBiZWxvdyBkb2VzIG5vdCBjdXJyZW50bHkgcGVyZm9ybSBhbnkgYWN0dWFsCi0gIC8vIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIGNsaWVudCBjb250ZXh0LiBJdCBpcyBpbmNsdWRlZCBob3dldmVyIHRvIGhlbHAgZnV0dXJlCi0gIC8vIGltcGxlbWVudGF0aW9uIGZvciBmZXRjaGluZyB2YWx1ZXMgZm9yIFdpbmRvd0NsaWVudCBwcm9wZXJ0aWVzLCB3aXRoCi0gIC8vIHNpbWlsYXIgbG9naWMgZXhpc3RpbmcgaW4gQ2xpZW50c01hdGNoQWxsU3ViU3RlcHMuCi0gIGNsaWVudC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10od2ViOjpDb250ZXh0KiBjbGllbnQsIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCi0gICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAvLyA0LjQuMS4gTGV0IGZyYW1lVHlwZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgR2V0IEZyYW1lIFR5cGUgd2l0aAotICAgICAgICAgICAgLy8gICAgICAgIGJyb3dzaW5nQ29udGV4dC4KLSAgICAgICAgICAgIC8vIENvYmFsdCBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBvciBhdXhpbGlhcnkgYnJvd3NpbmcgY29udGV4dHMuCi0gICAgICAgICAgICAvLyA0LjQuMi4gTGV0IHZpc2liaWxpdHlTdGF0ZSBiZSBicm93c2luZ0NvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCdzCi0gICAgICAgICAgICAvLyAgICAgICAgdmlzaWJpbGl0eVN0YXRlIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICAgIC8vIDQuNC4zLiBMZXQgZm9jdXNTdGF0ZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGhhcyBmb2N1cwotICAgICAgICAgICAgLy8gICAgICAgIHN0ZXBzIHdpdGggYnJvd3NpbmdDb250ZXh04oCZcyBhY3RpdmUgZG9jdW1lbnQgYXMgdGhlCi0gICAgICAgICAgICAvLyAgICAgICAgYXJndW1lbnQuCi0gICAgICAgICAgICAvLyBIYW5kbGVkIGluIHRoZSBXaW5kb3dEYXRhIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFdpbmRvd0RhdGE+IHdpbmRvd19kYXRhKAotICAgICAgICAgICAgICAgIG5ldyBXaW5kb3dEYXRhKGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSkpOwotCi0gICAgICAgICAgICAvLyA0LjQuNC4gTGV0IGFuY2VzdG9yT3JpZ2luc0xpc3QgYmUgdGhlIGVtcHR5IGxpc3QuCi0gICAgICAgICAgICAvLyA0LjQuNS4gSWYgY2xpZW50IGlzIGEgd2luZG93IGNsaWVudCwgc2V0IGFuY2VzdG9yT3JpZ2luc0xpc3QgdG8KLSAgICAgICAgICAgIC8vICAgICAgICBicm93c2luZ0NvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCdzIHJlbGV2YW50IGdsb2JhbAotICAgICAgICAgICAgLy8gICAgICAgIG9iamVjdCdzIExvY2F0aW9uIG9iamVjdOKAmXMgYW5jZXN0b3Igb3JpZ2lucyBsaXN0J3MKLSAgICAgICAgICAgIC8vICAgICAgICBhc3NvY2lhdGVkIGxpc3QuCi0gICAgICAgICAgICAvLyBDb2JhbHQgZG9lcyBub3QgaW1wbGVtZW50IExvY2F0aW9uLmFuY2VzdG9yT3JpZ2lucy4KLQotICAgICAgICAgICAgLy8gNC40LjYuIFF1ZXVlIGEgdGFzayB0byBydW4gdGhlIGZvbGxvd2luZyBzdGVwcyBvbiBwcm9taXNl4oCZcwotICAgICAgICAgICAgLy8gICAgICAgIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdCdzIHJlc3BvbnNpYmxlIGV2ZW50IGxvb3AgdXNpbmcKLSAgICAgICAgICAgIC8vICAgICAgICB0aGUgRE9NIG1hbmlwdWxhdGlvbiB0YXNrIHNvdXJjZToKLSAgICAgICAgICAgIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8V2luZG93RGF0YT4gd2luZG93X2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyA0LjQuNi4xLiBJZiBjbGllbnTigJlzIGRpc2NhcmRlZCBmbGFnIGlzIHNldCwgcmVzb2x2ZQotICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgYW5kIGFib3J0IHRoZXNlCi0gICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgc3RlcHMuCi0gICAgICAgICAgICAgICAgICAgICAgLy8gNC40LjYuMi4gTGV0IHdpbmRvd0NsaWVudCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBDcmVhdGUgV2luZG93IENsaWVudCB3aXRoIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBmcmFtZVR5cGUsIHZpc2liaWxpdHlTdGF0ZSwgZm9jdXNTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBhbmQgYW5jZXN0b3JPcmlnaW5zTGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gd2luZG93X2NsaWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd0NsaWVudDo6Q3JlYXRlKCp3aW5kb3dfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gNC40LjYuMy4gUmVzb2x2ZSBwcm9taXNlIHdpdGggd2luZG93Q2xpZW50LgotICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlc29sdmUod2luZG93X2NsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIHN0ZDo6bW92ZSh3aW5kb3dfZGF0YSkpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIGNsaWVudCwgd29ya2VyX2NvbnRleHQsIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpKTsKLSAgRENIRUNLX0VRKG51bGxwdHIsIHByb21pc2VfcmVmZXJlbmNlLmdldCgpKTsKLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c01hdGNoQWxsU3ViU3RlcHMoCi0gICAgd2ViOjpDb250ZXh0KiB3b3JrZXJfY29udGV4dCwKLSAgICBTZXJ2aWNlV29ya2VyT2JqZWN0KiBhc3NvY2lhdGVkX3NlcnZpY2Vfd29ya2VyLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVNlcXVlbmNlV3JhcHBhYmxlOjpSZWZlcmVuY2U+Ci0gICAgICAgIHByb21pc2VfcmVmZXJlbmNlLAotICAgIGJvb2wgaW5jbHVkZV91bmNvbnRyb2xsZWQsIENsaWVudFR5cGUgdHlwZSkgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d29ya2VyIiwKLSAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c01hdGNoQWxsU3ViU3RlcHMoKSIpOwotICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotICAvLyBDaGVjayBpZiB0aGUgd29ya2VyIHdlYiBjb250ZXh0IGlzIHN0aWxsIGFjdGl2ZS4gVGhpcyBtYXkgdHJpZ2dlciBpZgotICAvLyBDbGllbnRzLm1hdGNoQWxsKCkgd2FzIGNhbGxlZCBhbmQgc2VydmljZSB3b3JrZXIgaW5zdGFsbGF0aW9uIGZhaWxzLgotICBpZiAoIUlzV2ViQ29udGV4dFJlZ2lzdGVyZWQod29ya2VyX2NvbnRleHQpKSB7Ci0gICAgcHJvbWlzZV9yZWZlcmVuY2UucmVsZWFzZSgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFBhcmFsbGVsIHN1YiBzdGVwcyAoMikgZm9yIGFsZ29yaXRobSBmb3IgQ2xpZW50cy5tYXRjaEFsbCgpOgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2NsaWVudHMtbWF0Y2hhbGwKLSAgLy8gMi4xLiBMZXQgdGFyZ2V0Q2xpZW50cyBiZSBhIG5ldyBsaXN0LgotICBzdGQ6Omxpc3Q8d2ViOjpDb250ZXh0Kj4gdGFyZ2V0X2NsaWVudHM7Ci0KLSAgLy8gMi4yLiBGb3IgZWFjaCBzZXJ2aWNlIHdvcmtlciBjbGllbnQgY2xpZW50IHdoZXJlIHRoZSByZXN1bHQgb2YgcnVubmluZwotICAvLyAgICAgIG9idGFpbiBhIHN0b3JhZ2Uga2V5IGdpdmVuIGNsaWVudCBlcXVhbHMgdGhlIGFzc29jaWF0ZWQgc2VydmljZQotICAvLyAgICAgIHdvcmtlcidzIGNvbnRhaW5pbmcgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uJ3Mgc3RvcmFnZSBrZXk6Ci0gIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSA9Ci0gICAgICBhc3NvY2lhdGVkX3NlcnZpY2Vfd29ya2VyLT5jb250YWluaW5nX3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbigpCi0gICAgICAgICAgLT5zdG9yYWdlX2tleSgpOwotICBmb3IgKGF1dG8mIGNsaWVudCA6IHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfKSB7Ci0gICAgdXJsOjpPcmlnaW4gY2xpZW50X3N0b3JhZ2Vfa2V5ID0KLSAgICAgICAgY2xpZW50LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpLT5PYnRhaW5TdG9yYWdlS2V5KCk7Ci0gICAgaWYgKGNsaWVudF9zdG9yYWdlX2tleS5Jc1NhbWVPcmlnaW5XaXRoKHN0b3JhZ2Vfa2V5KSkgewotICAgICAgLy8gMi4yLjEuIElmIGNsaWVudOKAmXMgZXhlY3V0aW9uIHJlYWR5IGZsYWcgaXMgdW5zZXQgb3IgY2xpZW504oCZcyBkaXNjYXJkZWQKLSAgICAgIC8vICAgICAgICBmbGFnIGlzIHNldCwgY29udGludWUuCi0gICAgICAvLyBXZWIgQ29udGV4dHMgZXhpc3Qgb25seSBpbiB0aGUgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18gc2V0IHdoZW4gdGhleQotICAgICAgLy8gYXJlIGJvdGggZXhlY3V0aW9uIHJlYWR5IGFuZCBub3QgZGlzY2FyZGVkLgotCi0gICAgICAvLyAyLjIuMi4gSWYgY2xpZW50IGlzIG5vdCBhIHNlY3VyZSBjb250ZXh0LCBjb250aW51ZS4KLSAgICAgIC8vIEluIHByb2R1Y3Rpb24sIENvYmFsdCByZXF1aXJlcyBodHRwcywgdGhlcmVmb3JlIGFsbCB3b3JrZXJzIGFuZCB0aGVpcgotICAgICAgLy8gb3duZXJzIGFyZSBzZWN1cmUgY29udGV4dHMuCi0KLSAgICAgIC8vIDIuMi4zLiBJZiBvcHRpb25zWyJpbmNsdWRlVW5jb250cm9sbGVkIl0gaXMgZmFsc2UsIGFuZCBpZiBjbGllbnTigJlzCi0gICAgICAvLyAgICAgICAgYWN0aXZlIHNlcnZpY2Ugd29ya2VyIGlzIG5vdCB0aGUgYXNzb2NpYXRlZCBzZXJ2aWNlIHdvcmtlciwKLSAgICAgIC8vICAgICAgICBjb250aW51ZS4KLSAgICAgIGlmICghaW5jbHVkZV91bmNvbnRyb2xsZWQgJiYKLSAgICAgICAgICAoY2xpZW50LT5hY3RpdmVfc2VydmljZV93b3JrZXIoKSAhPSBhc3NvY2lhdGVkX3NlcnZpY2Vfd29ya2VyKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gMi4yLjQuIEFkZCBjbGllbnQgdG8gdGFyZ2V0Q2xpZW50cy4KLSAgICAgIHRhcmdldF9jbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOwotICAgIH0KLSAgfQotCi0gIC8vIDIuMy4gTGV0IG1hdGNoZWRXaW5kb3dEYXRhIGJlIGEgbmV3IGxpc3QuCi0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxXaW5kb3dEYXRhPj4gbWF0Y2hlZF93aW5kb3dfZGF0YSgKLSAgICAgIG5ldyBzdGQ6OnZlY3RvcjxXaW5kb3dEYXRhPik7Ci0KLSAgLy8gMi40LiBMZXQgbWF0Y2hlZENsaWVudHMgYmUgYSBuZXcgbGlzdC4KLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHdlYjo6Q29udGV4dCo+PiBtYXRjaGVkX2NsaWVudHMoCi0gICAgICBuZXcgc3RkOjp2ZWN0b3I8d2ViOjpDb250ZXh0Kj4pOwotCi0gIC8vIDIuNS4gRm9yIGVhY2ggc2VydmljZSB3b3JrZXIgY2xpZW50IGNsaWVudCBpbiB0YXJnZXRDbGllbnRzOgotICBmb3IgKGF1dG8qIGNsaWVudCA6IHRhcmdldF9jbGllbnRzKSB7Ci0gICAgYXV0byogZ2xvYmFsX3Njb3BlID0gY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCk7Ci0KLSAgICBpZiAoKHR5cGUgPT0ga0NsaWVudFR5cGVXaW5kb3cgfHwgdHlwZSA9PSBrQ2xpZW50VHlwZUFsbCkgJiYKLSAgICAgICAgKGdsb2JhbF9zY29wZS0+SXNXaW5kb3coKSkpIHsKLSAgICAgIC8vIDIuNS4xLiBJZiBvcHRpb25zWyJ0eXBlIl0gaXMgIndpbmRvdyIgb3IgImFsbCIsIGFuZCBjbGllbnQgaXMgbm90IGFuCi0gICAgICAvLyAgICAgICAgZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0IG9yIGlzIGEgd2luZG93IGNsaWVudCwgdGhlbjoKLQotICAgICAgLy8gMi41LjEuMS4gTGV0IHdpbmRvd0RhdGEgYmUgWyAiY2xpZW50IiAtPiBjbGllbnQsICJhbmNlc3Rvck9yaWdpbnNMaXN0IgotICAgICAgLy8gICAgICAgICAgLT4gYSBuZXcgbGlzdCBdLgotICAgICAgV2luZG93RGF0YSB3aW5kb3dfZGF0YShjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCkpOwotCi0gICAgICAvLyAyLjUuMS4yLiBMZXQgYnJvd3NpbmdDb250ZXh0IGJlIG51bGwuCi0KLSAgICAgIC8vIDIuNS4xLjMuIExldCBpc0NsaWVudEVudW1lcmFibGUgYmUgdHJ1ZS4KLSAgICAgIC8vIEZvciBDb2JhbHQsIGlzQ2xpZW50RW51bWVyYWJsZSBpcyBhbHdheXMgdHJ1ZSBiZWNhdXNlIHRoZSBjbGF1c2VzIHRoYXQKLSAgICAgIC8vIHdvdWxkIHNldCBpdCB0byBmYWxzZSBpbiAyLjUuMS42LiBkbyBub3QgYXBwbHkgdG8gQ29iYWx0LgotCi0gICAgICAvLyAyLjUuMS40LiBJZiBjbGllbnQgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0LCBzZXQKLSAgICAgIC8vICAgICAgICAgIGJyb3dzaW5nQ29udGV4dCB0byBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QncyBicm93c2luZyBjb250ZXh0LgotICAgICAgLy8gMi41LjEuNS4gRWxzZSwgc2V0IGJyb3dzaW5nQ29udGV4dCB0byBjbGllbnTigJlzIHRhcmdldCBicm93c2luZyBjb250ZXh0LgotICAgICAgd2ViOjpDb250ZXh0KiBicm93c2luZ19jb250ZXh0ID0gY2xpZW50OwotCi0gICAgICAvLyAyLjUuMS42LiBRdWV1ZSBhIHRhc2sgdGFzayB0byBydW4gdGhlIGZvbGxvd2luZyBzdWJzdGVwcyBvbgotICAgICAgLy8gICAgICAgICAgYnJvd3NpbmdDb250ZXh04oCZcyBldmVudCBsb29wIHVzaW5nIHRoZSB1c2VyIGludGVyYWN0aW9uIHRhc2sKLSAgICAgIC8vICAgICAgICAgIHNvdXJjZToKLSAgICAgIC8vIE5vdGU6IFRoZSB0YXNrIGJlbG93IGRvZXMgbm90IGN1cnJlbnRseSBwZXJmb3JtIGFueSBhY3R1YWwKLSAgICAgIC8vIGZ1bmN0aW9uYWxpdHkuIEl0IGlzIGluY2x1ZGVkIGhvd2V2ZXIgdG8gaGVscCBmdXR1cmUgaW1wbGVtZW50YXRpb24gZm9yCi0gICAgICAvLyBmZXRjaGluZyB2YWx1ZXMgZm9yIFdpbmRvd0NsaWVudCBwcm9wZXJ0aWVzLCB3aXRoIHNpbWlsYXIgbG9naWMKLSAgICAgIC8vIGV4aXN0aW5nIGluIFJlc29sdmVHZXRDbGllbnRQcm9taXNlLgotICAgICAgYnJvd3NpbmdfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RCbG9ja2luZ1Rhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgIFtdKFdpbmRvd0RhdGEqIHdpbmRvd19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjUuMS42LjEuIElmIGJyb3dzaW5nQ29udGV4dCBoYXMgYmVlbiBkaXNjYXJkZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHRoZW4gc2V0IGlzQ2xpZW50RW51bWVyYWJsZSB0byBmYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBhbmQgYWJvcnQgdGhlc2Ugc3RlcHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjUuMS42LjIuIElmIGNsaWVudCBpcyBhIHdpbmRvdyBjbGllbnQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNsaWVudOKAmXMgcmVzcG9uc2libGUgZG9jdW1lbnQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGJyb3dzaW5nQ29udGV4dOKAmXMgYWN0aXZlIGRvY3VtZW50LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHNldCBpc0NsaWVudEVudW1lcmFibGUgdG8gZmFsc2UgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGFib3J0IHRoZXNlIHN0ZXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gQ29iYWx0LCB0aGUgZG9jdW1lbnQgb2YgYSB3aW5kb3cgYnJvd3NpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRleHQgZG9lc24ndCBjaGFuZ2U6IFdoZW4gYSBuZXcgZG9jdW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGEgbmV3IGJyb3dzaW5nIGNvbnRleHQgaXMgY3JlYXRlZCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi41LjEuNi4zLiBTZXQgd2luZG93RGF0YVsiZnJhbWVUeXBlIl0gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHJlc3VsdCBvZiBydW5uaW5nIEdldCBGcmFtZSBUeXBlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJvd3NpbmdDb250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29iYWx0IGRvZXMgbm90IHN1cHBvcnQgbmVzdGVkIG9yIGF1eGlsaWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NpbmcgY29udGV4dHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjUuMS42LjQuIFNldCB3aW5kb3dEYXRhWyJ2aXNpYmlsaXR5U3RhdGUiXSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBicm93c2luZ0NvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHZpc2liaWxpdHlTdGF0ZSBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjUuMS42LjUuIFNldCB3aW5kb3dEYXRhWyJmb2N1c1N0YXRlIl0gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBoYXMgZm9jdXMgc3RlcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgd2l0aCBicm93c2luZ0NvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBhcyB0aGUgYXJndW1lbnQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuNS4xLjYuNi4gSWYgY2xpZW50IGlzIGEgd2luZG93IGNsaWVudCwgdGhlbiBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgd2luZG93RGF0YVsiYW5jZXN0b3JPcmlnaW5zTGlzdCJdIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGJyb3dzaW5nQ29udGV4dOKAmXMgYWN0aXZlIGRvY3VtZW50J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgcmVsZXZhbnQgZ2xvYmFsIG9iamVjdCdzIExvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIG9iamVjdOKAmXMgYW5jZXN0b3Igb3JpZ2lucyBsaXN0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29iYWx0IGRvZXMgbm90IGltcGxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jYXRpb24uYW5jZXN0b3JPcmlnaW5zLgotICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd19kYXRhKSk7Ci0KLSAgICAgIC8vIDIuNS4xLjcuIFdhaXQgZm9yIHRhc2sgdG8gaGF2ZSBleGVjdXRlZC4KLSAgICAgIC8vIFRoZSB0YXNrIGFib3ZlIGlzIHBvc3RlZCBhcyBhIGJsb2NraW5nIHRhc2suCi0KLSAgICAgIC8vIDIuNS4xLjguIElmIGlzQ2xpZW50RW51bWVyYWJsZSBpcyB0cnVlLCB0aGVuOgotCi0gICAgICAvLyAyLjUuMS44LjEuIEFkZCB3aW5kb3dEYXRhIHRvIG1hdGNoZWRXaW5kb3dEYXRhLgotICAgICAgbWF0Y2hlZF93aW5kb3dfZGF0YS0+ZW1wbGFjZV9iYWNrKHdpbmRvd19kYXRhKTsKLQotICAgICAgLy8gMi41LjIuIEVsc2UgaWYgb3B0aW9uc1sidHlwZSJdIGlzICJ3b3JrZXIiIG9yICJhbGwiIGFuZCBjbGllbnQgaXMgYQotICAgICAgLy8gICAgICAgIGRlZGljYXRlZCB3b3JrZXIgY2xpZW50LCBvciBvcHRpb25zWyJ0eXBlIl0gaXMgInNoYXJlZHdvcmtlciIgb3IKLSAgICAgIC8vICAgICAgICAiYWxsIiBhbmQgY2xpZW50IGlzIGEgc2hhcmVkIHdvcmtlciBjbGllbnQsIHRoZW46Ci0gICAgfSBlbHNlIGlmICgoKHR5cGUgPT0ga0NsaWVudFR5cGVXb3JrZXIgfHwgdHlwZSA9PSBrQ2xpZW50VHlwZUFsbCkgJiYKLSAgICAgICAgICAgICAgICBnbG9iYWxfc2NvcGUtPklzRGVkaWNhdGVkV29ya2VyKCkpKSB7Ci0gICAgICAvLyBOb3RlOiBDb2JhbHQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgd29ya2Vycy4KLSAgICAgIC8vIDIuNS4yLjEuIEFkZCBjbGllbnQgdG8gbWF0Y2hlZENsaWVudHMuCi0gICAgICBtYXRjaGVkX2NsaWVudHMtPmVtcGxhY2VfYmFjayhjbGllbnQpOwotICAgIH0KLSAgfQotCi0gIC8vIDIuNi4gUXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIG9uIHByb21pc2XigJlzIHJlbGV2YW50Ci0gIC8vIHNldHRpbmdzIG9iamVjdCdzIHJlc3BvbnNpYmxlIGV2ZW50IGxvb3AgdXNpbmcgdGhlIERPTSBtYW5pcHVsYXRpb24KLSAgLy8gdGFzayBzb3VyY2U6Ci0gIHdvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VTZXF1ZW5jZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgotICAgICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSwKLSAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8V2luZG93RGF0YT4+IG1hdGNoZWRfd2luZG93X2RhdGEsCi0gICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHdlYjo6Q29udGV4dCo+PiBtYXRjaGVkX2NsaWVudHMpIHsKLSAgICAgICAgICAgIFRSQUNFX0VWRU5UMCgKLSAgICAgICAgICAgICAgICAiY29iYWx0Ojp3b3JrZXIiLAotICAgICAgICAgICAgICAgICJTZXJ2aWNlV29ya2VySm9iczo6Q2xpZW50c01hdGNoQWxsU3ViU3RlcHMoKSBSZXNvbHZlIFByb21pc2UiKTsKLSAgICAgICAgICAgIC8vIDIuNi4xLiBMZXQgY2xpZW50T2JqZWN0cyBiZSBhIG5ldyBsaXN0LgotICAgICAgICAgICAgc2NyaXB0OjpTZXF1ZW5jZTxzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPj4gY2xpZW50X29iamVjdHM7Ci0KLSAgICAgICAgICAgIC8vIDIuNi4yLiBGb3IgZWFjaCB3aW5kb3dEYXRhIGluIG1hdGNoZWRXaW5kb3dEYXRhOgotICAgICAgICAgICAgZm9yIChhdXRvJiB3aW5kb3dfZGF0YSA6ICptYXRjaGVkX3dpbmRvd19kYXRhKSB7Ci0gICAgICAgICAgICAgIC8vIDIuNi4yLjEuIExldCBXaW5kb3dDbGllbnQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nCi0gICAgICAgICAgICAgIC8vICAgICAgICAgIENyZWF0ZSBXaW5kb3cgQ2xpZW50IGFsZ29yaXRobSB3aXRoCi0gICAgICAgICAgICAgIC8vICAgICAgICAgIHdpbmRvd0RhdGFbImNsaWVudCJdLAotICAgICAgICAgICAgICAvLyAgICAgICAgICB3aW5kb3dEYXRhWyJmcmFtZVR5cGUiXSwKLSAgICAgICAgICAgICAgLy8gICAgICAgICAgd2luZG93RGF0YVsidmlzaWJpbGl0eVN0YXRlIl0sCi0gICAgICAgICAgICAgIC8vICAgICAgICAgIHdpbmRvd0RhdGFbImZvY3VzU3RhdGUiXSwgYW5kCi0gICAgICAgICAgICAgIC8vICAgICAgICAgIHdpbmRvd0RhdGFbImFuY2VzdG9yT3JpZ2luc0xpc3QiXSBhcyB0aGUKLSAgICAgICAgICAgICAgLy8gICAgICAgICAgYXJndW1lbnRzLgotICAgICAgICAgICAgICAvLyBUT0RPKGIvMjM1ODM4Njk4KTogSW1wbGVtZW50IFdpbmRvd0NsaWVudCBtZXRob2RzLgotICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gd2luZG93X2NsaWVudCA9Ci0gICAgICAgICAgICAgICAgICBXaW5kb3dDbGllbnQ6OkNyZWF0ZSh3aW5kb3dfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgLy8gMi42LjIuMi4gQXBwZW5kIFdpbmRvd0NsaWVudCB0byBjbGllbnRPYmplY3RzLgotICAgICAgICAgICAgICBjbGllbnRfb2JqZWN0cy5wdXNoX2JhY2sod2luZG93X2NsaWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDIuNi4zLiBGb3IgZWFjaCBjbGllbnQgaW4gbWF0Y2hlZENsaWVudHM6Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGNsaWVudCA6ICptYXRjaGVkX2NsaWVudHMpIHsKLSAgICAgICAgICAgICAgLy8gMi42LjMuMS4gTGV0IGNsaWVudE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKLSAgICAgICAgICAgICAgLy8gICAgICAgICAgQ3JlYXRlIENsaWVudCBhbGdvcml0aG0gd2l0aCBjbGllbnQgYXMgdGhlCi0gICAgICAgICAgICAgIC8vICAgICAgICAgIGFyZ3VtZW50LgotICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPENsaWVudD4gY2xpZW50X29iamVjdCA9Ci0gICAgICAgICAgICAgICAgICBDbGllbnQ6OkNyZWF0ZShjbGllbnQtPmVudmlyb25tZW50X3NldHRpbmdzKCkpOwotCi0gICAgICAgICAgICAgIC8vIDIuNi4zLjIuIEFwcGVuZCBjbGllbnRPYmplY3QgdG8gY2xpZW50T2JqZWN0cy4KLSAgICAgICAgICAgICAgY2xpZW50X29iamVjdHMucHVzaF9iYWNrKGNsaWVudF9vYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gMi42LjQuIFNvcnQgY2xpZW50T2JqZWN0cyBzdWNoIHRoYXQ6Ci0gICAgICAgICAgICAvLyAgICAgICAgLiBXaW5kb3dDbGllbnQgb2JqZWN0cyB3aG9zZSBicm93c2luZyBjb250ZXh0IGhhcyBiZWVuCi0gICAgICAgICAgICAvLyAgICAgICAgICBmb2N1c2VkIGFyZSBwbGFjZWQgZmlyc3QsIHNvcnRlZCBpbiB0aGUgbW9zdCByZWNlbnRseQotICAgICAgICAgICAgLy8gICAgICAgICAgZm9jdXNlZCBvcmRlci4KLSAgICAgICAgICAgIC8vICAgICAgICAuIFdpbmRvd0NsaWVudCBvYmplY3RzIHdob3NlIGJyb3dzaW5nIGNvbnRleHQgaGFzIG5ldmVyCi0gICAgICAgICAgICAvLyAgICAgICAgICBiZWVuIGZvY3VzZWQgYXJlIHBsYWNlZCBuZXh0LCBzb3J0ZWQgaW4gdGhlaXIgc2VydmljZQotICAgICAgICAgICAgLy8gICAgICAgICAgd29ya2VyIGNsaWVudCdzIGNyZWF0aW9uIG9yZGVyLgotICAgICAgICAgICAgLy8gICAgICAgIC4gQ2xpZW50IG9iamVjdHMgd2hvc2UgYXNzb2NpYXRlZCBzZXJ2aWNlIHdvcmtlciBjbGllbnQgaXMKLSAgICAgICAgICAgIC8vICAgICAgICAgIGEgd29ya2VyIGNsaWVudCBhcmUgcGxhY2VkIG5leHQsIHNvcnRlZCBpbiB0aGVpciBzZXJ2aWNlCi0gICAgICAgICAgICAvLyAgICAgICAgICB3b3JrZXIgY2xpZW50J3MgY3JlYXRpb24gb3JkZXIuCi0gICAgICAgICAgICAvLyBUT0RPKGIvMjM1ODc2NTk4KTogSW1wbGVtZW50IHNvcnRpbmcgb2YgY2xpZW50T2JqZWN0cy4KLQotICAgICAgICAgICAgLy8gMi42LjUuIFJlc29sdmUgcHJvbWlzZSB3aXRoIGEgbmV3IGZyb3plbiBhcnJheSBvZiBjbGllbnRPYmplY3RzCi0gICAgICAgICAgICAvLyAgICAgICAgaW4gcHJvbWlzZeKAmXMgcmVsZXZhbnQgUmVhbG0uCi0gICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZXNvbHZlKGNsaWVudF9vYmplY3RzKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIHN0ZDo6bW92ZShtYXRjaGVkX3dpbmRvd19kYXRhKSwKLSAgICAgICAgICBzdGQ6Om1vdmUobWF0Y2hlZF9jbGllbnRzKSkpOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpDbGFpbVN1YlN0ZXBzKAotICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCi0gICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VWb2lkOjpSZWZlcmVuY2U+IHByb21pc2VfcmVmZXJlbmNlKSB7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojp3b3JrZXIiLCAiU2VydmljZVdvcmtlckpvYnM6OkNsYWltU3ViU3RlcHMoKSIpOwotICBEQ0hFQ0tfRVEobWVzc2FnZV9sb29wKCksIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwotCi0gIC8vIENoZWNrIGlmIHRoZSBjbGllbnQgd2ViIGNvbnRleHQgaXMgc3RpbGwgYWN0aXZlLiBUaGlzIG1heSB0cmlnZ2VyIGlmCi0gIC8vIENsaWVudHMuY2xhaW0oKSB3YXMgY2FsbGVkIGFuZCBzZXJ2aWNlIHdvcmtlciBpbnN0YWxsYXRpb24gZmFpbHMuCi0gIGlmICghSXNXZWJDb250ZXh0UmVnaXN0ZXJlZCh3b3JrZXJfY29udGV4dCkpIHsKLSAgICBwcm9taXNlX3JlZmVyZW5jZS5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUGFyYWxsZWwgc3ViIHN0ZXBzICgzKSBmb3IgYWxnb3JpdGhtIGZvciBDbGllbnRzLmNsYWltKCk6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLWNsaWVudHMtY2xhaW0KLSAgc3RkOjpsaXN0PHdlYjo6Q29udGV4dCo+IHRhcmdldF9jbGllbnRzOwotCi0gIC8vIDMuMS4gRm9yIGVhY2ggc2VydmljZSB3b3JrZXIgY2xpZW50IGNsaWVudCB3aGVyZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcKLSAgLy8gICAgICBvYnRhaW4gYSBzdG9yYWdlIGtleSBnaXZlbiBjbGllbnQgZXF1YWxzIHRoZSBzZXJ2aWNlIHdvcmtlcidzCi0gIC8vICAgICAgY29udGFpbmluZyBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb24ncyBzdG9yYWdlIGtleToKLSAgY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5ID0KLSAgICAgIGFzc29jaWF0ZWRfc2VydmljZV93b3JrZXItPmNvbnRhaW5pbmdfc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uKCkKLSAgICAgICAgICAtPnN0b3JhZ2Vfa2V5KCk7Ci0gIGZvciAoYXV0byYgY2xpZW50IDogd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18pIHsKLSAgICAvLyBEb24ndCBjbGFpbSB0byBiZSBvdXIgb3duIHNlcnZpY2Ugd29ya2VyLgotICAgIGlmIChjbGllbnQgPT0gd29ya2VyX2NvbnRleHQpIGNvbnRpbnVlOwotICAgIHVybDo6T3JpZ2luIGNsaWVudF9zdG9yYWdlX2tleSA9Ci0gICAgICAgIGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+T2J0YWluU3RvcmFnZUtleSgpOwotICAgIGlmIChjbGllbnRfc3RvcmFnZV9rZXkuSXNTYW1lT3JpZ2luV2l0aChzdG9yYWdlX2tleSkpIHsKLSAgICAgIC8vIDMuMS4xLiBJZiBjbGllbnTigJlzIGV4ZWN1dGlvbiByZWFkeSBmbGFnIGlzIHVuc2V0IG9yIGNsaWVudOKAmXMgZGlzY2FyZGVkCi0gICAgICAvLyAgICAgICAgZmxhZyBpcyBzZXQsIGNvbnRpbnVlLgotICAgICAgLy8gV2ViIENvbnRleHRzIGV4aXN0IG9ubHkgaW4gdGhlIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfIHNldCB3aGVuIHRoZXkKLSAgICAgIC8vIGFyZSBib3RoIGV4ZWN1dGlvbiByZWFkeSBhbmQgbm90IGRpc2NhcmRlZC4KLQotICAgICAgLy8gMy4xLjIuIElmIGNsaWVudCBpcyBub3QgYSBzZWN1cmUgY29udGV4dCwgY29udGludWUuCi0gICAgICAvLyBJbiBwcm9kdWN0aW9uLCBDb2JhbHQgcmVxdWlyZXMgaHR0cHMsIHRoZXJlZm9yZSBhbGwgY2xpZW50cyBhcmUgc2VjdXJlCi0gICAgICAvLyBjb250ZXh0cy4KLQotICAgICAgLy8gMy4xLjMuIExldCBzdG9yYWdlIGtleSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgb2J0YWluIGEgc3RvcmFnZSBrZXkKLSAgICAgIC8vICAgICAgICBnaXZlbiBjbGllbnQuCi0gICAgICAvLyAzLjEuNC4gTGV0IHJlZ2lzdHJhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgTWF0Y2ggU2VydmljZSBXb3JrZXIKLSAgICAgIC8vICAgICAgICBSZWdpc3RyYXRpb24gZ2l2ZW4gc3RvcmFnZSBrZXkgYW5kIGNsaWVudOKAmXMgY3JlYXRpb24gVVJMLgotICAgICAgLy8gVE9ETyhiLzIzNDY1OTg1MSk6IEludmVzdGlnYXRlIHdoZXRoZXIgdGhpcyBzaG91bGQgdXNlIHRoZSBjcmVhdGlvbgotICAgICAgLy8gVVJMIGRpcmVjdGx5IGluc3RlYWQuCi0gICAgICBjb25zdCBHVVJMJiBiYXNlX3VybCA9IGNsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y3JlYXRpb25fdXJsKCk7Ci0gICAgICBHVVJMIGNsaWVudF91cmwgPSBiYXNlX3VybC5SZXNvbHZlKCIiKTsKLSAgICAgIHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4gcmVnaXN0cmF0aW9uID0KLSAgICAgICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKAotICAgICAgICAgICAgICBjbGllbnRfc3RvcmFnZV9rZXksIGNsaWVudF91cmwpOwotCi0gICAgICAvLyAzLjEuNS4gSWYgcmVnaXN0cmF0aW9uIGlzIG5vdCB0aGUgc2VydmljZSB3b3JrZXIncyBjb250YWluaW5nIHNlcnZpY2UKLSAgICAgIC8vICAgICAgICB3b3JrZXIgcmVnaXN0cmF0aW9uLCBjb250aW51ZS4KLSAgICAgIGlmIChyZWdpc3RyYXRpb24gIT0KLSAgICAgICAgICBhc3NvY2lhdGVkX3NlcnZpY2Vfd29ya2VyLT5jb250YWluaW5nX3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbigpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyAzLjEuNi4gSWYgY2xpZW504oCZcyBhY3RpdmUgc2VydmljZSB3b3JrZXIgaXMgbm90IHRoZSBzZXJ2aWNlIHdvcmtlciwKLSAgICAgIC8vICAgICAgICB0aGVuOgotICAgICAgaWYgKGNsaWVudC0+YWN0aXZlX3NlcnZpY2Vfd29ya2VyKCkgIT0gYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlcikgewotICAgICAgICAvLyAzLjEuNi4xLiBJbnZva2UgSGFuZGxlIFNlcnZpY2UgV29ya2VyIENsaWVudCBVbmxvYWQgd2l0aCBjbGllbnQgYXMKLSAgICAgICAgLy8gICAgICAgICAgdGhlIGFyZ3VtZW50LgotICAgICAgICBIYW5kbGVTZXJ2aWNlV29ya2VyQ2xpZW50VW5sb2FkKGNsaWVudCk7Ci0KLSAgICAgICAgLy8gMy4xLjYuMi4gU2V0IGNsaWVudOKAmXMgYWN0aXZlIHNlcnZpY2Ugd29ya2VyIHRvIHNlcnZpY2Ugd29ya2VyLgotICAgICAgICBjbGllbnQtPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIoYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlcik7Ci0KLSAgICAgICAgLy8gMy4xLjYuMy4gSW52b2tlIE5vdGlmeSBDb250cm9sbGVyIENoYW5nZSBhbGdvcml0aG0gd2l0aCBjbGllbnQgYXMgdGhlCi0gICAgICAgIC8vICAgICAgICAgIGFyZ3VtZW50LgotICAgICAgICBOb3RpZnlDb250cm9sbGVyQ2hhbmdlKGNsaWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIDMuMi4gUmVzb2x2ZSBwcm9taXNlIHdpdGggdW5kZWZpbmVkLgotICB3b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10oc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlKSB7Ci0gICAgICAgICAgICBwcm9taXNlLT52YWx1ZSgpLlJlc29sdmUoKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSkpKTsKLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6U2VydmljZVdvcmtlclBvc3RNZXNzYWdlU3ViU3RlcHMoCi0gICAgU2VydmljZVdvcmtlck9iamVjdCogc2VydmljZV93b3JrZXIsIHdlYjo6Q29udGV4dCogaW5jdW1iZW50X2NsaWVudCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBzZXJpYWxpemVfcmVzdWx0KSB7Ci0gIC8vIFBhcmFsbGVsIHN1YiBzdGVwcyAoNikgZm9yIGFsZ29yaXRobSBmb3IgU2VydmljZVdvcmtlci5wb3N0TWVzc2FnZSgpOgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3NlcnZpY2Utd29ya2VyLXBvc3RtZXNzYWdlLW9wdGlvbnMKLSAgLy8gMy4gTGV0IGluY3VtYmVudEdsb2JhbCBiZSBpbmN1bWJlbnRTZXR0aW5nc+KAmXMgZ2xvYmFsIG9iamVjdC4KLSAgLy8gTm90ZTogVGhlICdpbmN1bWJlbnQnIGlzIHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuCi0gIC8vIDYuMSBJZiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIFJ1biBTZXJ2aWNlIFdvcmtlciBhbGdvcml0aG0gd2l0aAotICAvLyAgICAgc2VydmljZVdvcmtlciBpcyBmYWlsdXJlLCB0aGVuIHJldHVybi4KLSAgYXV0byogcnVuX3Jlc3VsdCA9IFJ1blNlcnZpY2VXb3JrZXIoc2VydmljZV93b3JrZXIpOwotICBpZiAoIXJ1bl9yZXN1bHQpIHJldHVybjsKLSAgaWYgKCFzZXJpYWxpemVfcmVzdWx0KSByZXR1cm47Ci0KLSAgLy8gNi4yIFF1ZXVlIGEgdGFzayBvbiB0aGUgRE9NIG1hbmlwdWxhdGlvbiB0YXNrIHNvdXJjZSB0byBydW4gdGhlIGZvbGxvd2luZwotICAvLyAgICAgc3RlcHM6Ci0gIGluY3VtYmVudF9jbGllbnQtPm1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgIFtdKFNlcnZpY2VXb3JrZXJPYmplY3QqIHNlcnZpY2Vfd29ya2VyLAotICAgICAgICAgICAgIHdlYjo6Q29udGV4dCogaW5jdW1iZW50X2NsaWVudCwKLSAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBzZXJpYWxpemVfcmVzdWx0KSB7Ci0gICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZV9yZXN1bHQpIHJldHVybjsKLQotICAgICAgICAgICAgd2ViOjpFdmVudFRhcmdldCogZXZlbnRfdGFyZ2V0ID0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlX3dvcmtlci0+d29ya2VyX2dsb2JhbF9zY29wZSgpOwotICAgICAgICAgICAgaWYgKCFldmVudF90YXJnZXQpIHJldHVybjsKLQotICAgICAgICAgICAgd2ViOjpXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKiBpbmN1bWJlbnRfZ2xvYmFsID0KLSAgICAgICAgICAgICAgICBpbmN1bWJlbnRfY2xpZW50LT5HZXRXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlKCk7Ci0gICAgICAgICAgICBEQ0hFQ0tfRVEoaW5jdW1iZW50X2NsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICBpbmN1bWJlbnRfZ2xvYmFsLT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKTsKLSAgICAgICAgICAgIGJhc2U6OlR5cGVJZCBpbmN1bWJlbnRfdHlwZSA9IGluY3VtYmVudF9nbG9iYWwtPkdldFdyYXBwYWJsZVR5cGUoKTsKLSAgICAgICAgICAgIFNlcnZpY2VXb3JrZXJPYmplY3QqIGluY3VtYmVudF93b3JrZXIgPQotICAgICAgICAgICAgICAgIGluY3VtYmVudF9nbG9iYWwtPklzU2VydmljZVdvcmtlcigpCi0gICAgICAgICAgICAgICAgICAgID8gaW5jdW1iZW50X2dsb2JhbC0+QXNTZXJ2aWNlV29ya2VyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXJ2aWNlX3dvcmtlcl9vYmplY3QoKQotICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gICAgICAgICAgICBiYXNlOjpNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wID0KLSAgICAgICAgICAgICAgICBldmVudF90YXJnZXQtPmVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKS0+bWVzc2FnZV9sb29wKCk7Ci0gICAgICAgICAgICBpZiAoIW1lc3NhZ2VfbG9vcCkgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXNzYWdlX2xvb3AtPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYmFzZTo6VHlwZUlkJiBpbmN1bWJlbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZVdvcmtlck9iamVjdCogaW5jdW1iZW50X3dvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgd2ViOjpDb250ZXh0KiBpbmN1bWJlbnRfY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICB3ZWI6OkV2ZW50VGFyZ2V0KiBldmVudF90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OkRhdGFCdWZmZXI+IHNlcmlhbGl6ZV9yZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUV2ZW50SW5pdCBpbml0X2RpY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGluY3VtYmVudF90eXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkdldFR5cGVJZDxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU+KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIDYuMi4xLiBMZXQgc291cmNlIGJlIGRldGVybWluZWQgYnkgc3dpdGNoaW5nIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHR5cGUgb2YgaW5jdW1iZW50R2xvYmFsOgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIC4gU2VydmljZVdvcmtlckdsb2JhbFNjb3BlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBUaGUgcmVzdWx0IG9mIGdldHRpbmcgdGhlIHNlcnZpY2Ugd29ya2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBvYmplY3QgdGhhdCByZXByZXNlbnRzIGluY3VtYmVudEdsb2JhbOKAmXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHNlcnZpY2Ugd29ya2VyIGluIHRoZSByZWxldmFudCBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgb2JqZWN0IG9mIHNlcnZpY2VXb3JrZXLigJlzIGdsb2JhbCBvYmplY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0X2RpY3Quc2V0X3NvdXJjZShFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OjpTb3VyY2VUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RhcmdldC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFNlcnZpY2VXb3JrZXIoaW5jdW1iZW50X3dvcmtlcikpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY3VtYmVudF90eXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpHZXRUeXBlSWQ8ZG9tOjpXaW5kb3c+KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAuIFdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgYSBuZXcgV2luZG93Q2xpZW50IG9iamVjdCB0aGF0IHJlcHJlc2VudHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIGluY3VtYmVudEdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9kaWN0LnNldF9zb3VyY2UoRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDo6U291cmNlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dDbGllbnQ6OkNyZWF0ZShXaW5kb3dEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmN1bWJlbnRfY2xpZW50LT5lbnZpcm9ubWVudF9zZXR0aW5ncygpKSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIC4gT3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBhIG5ldyBDbGllbnQgb2JqZWN0IHRoYXQgcmVwcmVzZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaW5jdW1iZW50R2xvYmFs4oCZcyBhc3NvY2lhdGVkIHdvcmtlcgotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9kaWN0LnNldF9zb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDo6U291cmNlVHlwZShDbGllbnQ6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jdW1iZW50X2NsaWVudC0+ZW52aXJvbm1lbnRfc2V0dGluZ3MoKSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICBldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyB3b3JrZXI6OkV4dGVuZGFibGVNZXNzYWdlRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90YXJnZXQtPmVudmlyb25tZW50X3NldHRpbmdzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUb2tlbnM6Om1lc3NhZ2UoKSwgaW5pdF9kaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHNlcmlhbGl6ZV9yZXN1bHQpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIGluY3VtYmVudF90eXBlLCBiYXNlOjpVbnJldGFpbmVkKGluY3VtYmVudF93b3JrZXIpLAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGVzZSBzaG91bGQgcHJvYmFibHkgYmUgd2VhayBwb2ludGVycyBmb3Igd2hlbgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBzZW5kZXIgZGlzYXBwZWFycyBiZWZvcmUgdGhlIHJlY2lwaWVudAotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZXMgdGhlIGV2ZW50LCBidXQgc2luY2UgYmFzZTo6V2Vha1B0cgotICAgICAgICAgICAgICAgICAgICAvLyBkZXJlZmVyZW5jaW5nIGlzbid0IHRocmVhZC1zYWZlLCB0aGF0IGNhbid0IGFjdHVhbGx5IGJlCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChpbmN1bWJlbnRfY2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChldmVudF90YXJnZXQpLAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc2VyaWFsaXplX3Jlc3VsdCkpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2VydmljZV93b3JrZXIpLCBiYXNlOjpVbnJldGFpbmVkKGluY3VtYmVudF9jbGllbnQpLAotICAgICAgICAgIHN0ZDo6bW92ZShzZXJpYWxpemVfcmVzdWx0KSkpOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpSZWdpc3RlcldlYkNvbnRleHQod2ViOjpDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDS19ORShudWxscHRyLCBjb250ZXh0KTsKLSAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc19jbGVhcmVkXy5SZXNldCgpOwotICBpZiAoYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSAhPSBtZXNzYWdlX2xvb3AoKSkgewotICAgIERDSEVDSyhtZXNzYWdlX2xvb3AoKSk7Ci0gICAgbWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VySm9iczo6UmVnaXN0ZXJXZWJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNvbnRleHQpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgRENIRUNLX0VRKDAsIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmNvdW50KGNvbnRleHQpKTsKLSAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18uaW5zZXJ0KGNvbnRleHQpOwotfQotCi12b2lkIFNlcnZpY2VXb3JrZXJKb2JzOjpTZXRBY3RpdmVXb3JrZXIod2ViOjpFbnZpcm9ubWVudFNldHRpbmdzKiBjbGllbnQpIHsKLSAgaWYgKCFjbGllbnQpIHJldHVybjsKLSAgaWYgKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkgIT0gbWVzc2FnZV9sb29wKCkpIHsKLSAgICBEQ0hFQ0sobWVzc2FnZV9sb29wKCkpOwotICAgIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTZXJ2aWNlV29ya2VySm9iczo6U2V0QWN0aXZlV29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2xpZW50KSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIERDSEVDSyhzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXyk7Ci0gIHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4gY2xpZW50X3JlZ2lzdHJhdGlvbiA9Ci0gICAgICBzY29wZV90b19yZWdpc3RyYXRpb25fbWFwXy0+TWF0Y2hTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKAotICAgICAgICAgIGNsaWVudC0+T2J0YWluU3RvcmFnZUtleSgpLCBjbGllbnQtPmNyZWF0aW9uX3VybCgpKTsKLSAgaWYgKGNsaWVudF9yZWdpc3RyYXRpb24uZ2V0KCkgJiYgY2xpZW50X3JlZ2lzdHJhdGlvbi0+YWN0aXZlX3dvcmtlcigpKSB7Ci0gICAgY2xpZW50LT5jb250ZXh0KCktPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIoCi0gICAgICAgIGNsaWVudF9yZWdpc3RyYXRpb24tPmFjdGl2ZV93b3JrZXIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xpZW50LT5jb250ZXh0KCktPnNldF9hY3RpdmVfc2VydmljZV93b3JrZXIobnVsbHB0cik7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlV29ya2VySm9iczo6VW5yZWdpc3RlcldlYkNvbnRleHQod2ViOjpDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDS19ORShudWxscHRyLCBjb250ZXh0KTsKLSAgaWYgKGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCkgIT0gbWVzc2FnZV9sb29wKCkpIHsKLSAgICAvLyBCbG9jayB0byBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpcyB1bnJlZ2lzdGVyZWQgYmVmb3JlIGl0IGlzIGRlc3Ryb3llZC4KLSAgICBEQ0hFQ0sobWVzc2FnZV9sb29wKCkpOwotICAgIG1lc3NhZ2VfbG9vcCgpLT50YXNrX3J1bm5lcigpLT5Qb3N0QmxvY2tpbmdUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNlcnZpY2VXb3JrZXJKb2JzOjpVbnJlZ2lzdGVyV2ViQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNvbnRleHQpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRENIRUNLX0VRKG1lc3NhZ2VfbG9vcCgpLCBiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKLSAgRENIRUNLX0VRKDEsIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmNvdW50KGNvbnRleHQpKTsKLSAgd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc18uZXJhc2UoY29udGV4dCk7Ci0gIEhhbmRsZVNlcnZpY2VXb3JrZXJDbGllbnRVbmxvYWQoY29udGV4dCk7Ci0gIFByZXBhcmVGb3JDbGllbnRTaHV0ZG93bihjb250ZXh0KTsKLSAgaWYgKHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmVtcHR5KCkpIHsKLSAgICB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zX2NsZWFyZWRfLlNpZ25hbCgpOwotICB9Ci19Ci0KIHZvaWQgU2VydmljZVdvcmtlckpvYnM6OlByZXBhcmVGb3JDbGllbnRTaHV0ZG93bih3ZWI6OkNvbnRleHQqIGNsaWVudCkgewogICBEQ0hFQ0soY2xpZW50KTsKICAgaWYgKCFjbGllbnQpIHJldHVybjsKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5oIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgKaW5kZXggNTBjNGNkZi4uYWRhYmUxNSAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgKQEAgLTE4LDE2ICsxOCwxMyBAQAogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcmVmcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AvbWVzc2FnZV9sb29wLmgiCiAjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvdGFzay9zZXF1ZW5jZV9tYW5hZ2VyL21vdmVhYmxlX2F1dG9fbG9jay5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9zY3JpcHRfbG9hZGVyX2ZhY3RvcnkuaCIKQEAgLTM4LDE3ICszNSw5IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWVfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWIvY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWIvZG9tX2V4Y2VwdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC93ZWIvd2ViX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9jbGllbnRfcXVlcnlfb3B0aW9ucy5oIgotI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvZnJhbWVfdHlwZS5oIgotI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnN0cy5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfb2JqZWN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9tYXAuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9vYmplY3QuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3VwZGF0ZV92aWFfY2FjaGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3dvcmtlcl90eXBlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9hdG9taWMuaCIKICNpbmNsdWRlICJ1cmwvZ3VybC5oIgogI2luY2x1ZGUgInVybC9vcmlnaW4uaCIKQEAgLTU2LDYgKzQ1LDggQEAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHdvcmtlciB7CiAKK2NsYXNzIFNlcnZpY2VXb3JrZXJDb250ZXh0OworCiAvLyBBbGdvcml0aG1zIGZvciBTZXJ2aWNlIFdvcmtlciBKb2JzLgogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNhbGdvcml0aG1zCiBjbGFzcyBTZXJ2aWNlV29ya2VySm9icyB7CkBAIC0xODksMTAxICsxODAsMTcgQEAKICAgICBzdGQ6OmRlcXVlPHN0ZDo6dW5pcXVlX3B0cjxKb2I+PiBqb2JzXzsKICAgfTsKIAotICBTZXJ2aWNlV29ya2VySm9icyh3ZWI6OldlYlNldHRpbmdzKiB3ZWJfc2V0dGluZ3MsCisgIFNlcnZpY2VXb3JrZXJKb2JzKFNlcnZpY2VXb3JrZXJDb250ZXh0KiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgd2ViOjpVc2VyQWdlbnRQbGF0Zm9ybUluZm8qIHBsYXRmb3JtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3AsIGNvbnN0IEdVUkwmIHVybCk7CisgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3ApOwogICB+U2VydmljZVdvcmtlckpvYnMoKTsKIAogICBiYXNlOjpNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wKCkgeyByZXR1cm4gbWVzc2FnZV9sb29wXzsgfQogCi0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3N0YXJ0LXJlZ2lzdGVyLWFsZ29yaXRobQotICB2b2lkIFN0YXJ0UmVnaXN0ZXIoY29uc3QgYmFzZTo6T3B0aW9uYWw8R1VSTD4mIHNjb3BlX3VybCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHNjcmlwdF91cmwsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYjo6Q29udGV4dCogY2xpZW50LCBjb25zdCBXb3JrZXJUeXBlJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZVdvcmtlclVwZGF0ZVZpYUNhY2hlJiB1cGRhdGVfdmlhX2NhY2hlKTsKLQotICB2b2lkIE1heWJlUmVzb2x2ZVJlYWR5UHJvbWlzZVN1YlN0ZXBzKHdlYjo6Q29udGV4dCogY2xpZW50KTsKLQotICAvLyBTdWIgc3RlcHMgKDgpIG9mIFNlcnZpY2VXb3JrZXJDb250YWluZXIuZ2V0UmVnaXN0cmF0aW9uKCkuCi0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jbmF2aWdhdG9yLXNlcnZpY2Utd29ya2VyLWdldFJlZ2lzdHJhdGlvbgotICB2b2lkIEdldFJlZ2lzdHJhdGlvblN1YlN0ZXBzKAotICAgICAgY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5LCBjb25zdCBHVVJMJiBjbGllbnRfdXJsLAotICAgICAgd2ViOjpDb250ZXh0KiBjbGllbnQsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSk7Ci0KLSAgdm9pZCBHZXRSZWdpc3RyYXRpb25zU3ViU3RlcHMoCi0gICAgICBjb25zdCB1cmw6Ok9yaWdpbiYgc3RvcmFnZV9rZXksIHdlYjo6Q29udGV4dCogY2xpZW50LAotICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlU2VxdWVuY2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSk7Ci0KLSAgLy8gU3ViIHN0ZXBzICgyKSBvZiBTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGUuc2tpcFdhaXRpbmcoKS4KLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNkb20tc2VydmljZXdvcmtlcmdsb2JhbHNjb3BlLXNraXB3YWl0aW5nCi0gIHZvaWQgU2tpcFdhaXRpbmdTdWJTdGVwcygKLSAgICAgIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsIFNlcnZpY2VXb3JrZXJPYmplY3QqIHNlcnZpY2Vfd29ya2VyLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPHNjcmlwdDo6VmFsdWVQcm9taXNlVm9pZDo6UmVmZXJlbmNlPiBwcm9taXNlX3JlZmVyZW5jZSk7Ci0KLSAgLy8gU3ViIHN0ZXBzIGZvciBFeHRlbmRhYmxlRXZlbnQuV2FpdFVudGlsKCkuCi0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZG9tLWV4dGVuZGFibGVldmVudC13YWl0dW50aWwKLSAgdm9pZCBXYWl0VW50aWxTdWJTdGVwcyhTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0KiByZWdpc3RyYXRpb24pOwotCi0gIC8vIFBhcmFsbGVsIHN1YiBzdGVwcyAoMikgZm9yIGFsZ29yaXRobSBmb3IgQ2xpZW50cy5nZXQoaWQpOgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2NsaWVudHMtZ2V0Ci0gIHZvaWQgQ2xpZW50c0dldFN1YlN0ZXBzKAotICAgICAgd2ViOjpDb250ZXh0KiB3b3JrZXJfY29udGV4dCwKLSAgICAgIFNlcnZpY2VXb3JrZXJPYmplY3QqIGFzc29jaWF0ZWRfc2VydmljZV93b3JrZXIsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCk7Ci0KLSAgLy8gQWxnb3JpdGhtIGZvciBSZXNvbHZlIEdldCBDbGllbnQgUHJvbWlzZToKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNyZXNvbHZlLWdldC1jbGllbnQtcHJvbWlzZQotICB2b2lkIFJlc29sdmVHZXRDbGllbnRQcm9taXNlKAotICAgICAgd2ViOjpDb250ZXh0KiBjbGllbnQsIHdlYjo6Q29udGV4dCogd29ya2VyX2NvbnRleHQsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VXcmFwcGFibGU6OlJlZmVyZW5jZT4KLSAgICAgICAgICBwcm9taXNlX3JlZmVyZW5jZSk7Ci0KLSAgLy8gUGFyYWxsZWwgc3ViIHN0ZXBzICgyKSBmb3IgYWxnb3JpdGhtIGZvciBDbGllbnRzLm1hdGNoQWxsKCk6Ci0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jY2xpZW50cy1tYXRjaGFsbAotICB2b2lkIENsaWVudHNNYXRjaEFsbFN1YlN0ZXBzKAotICAgICAgd2ViOjpDb250ZXh0KiB3b3JrZXJfY29udGV4dCwKLSAgICAgIFNlcnZpY2VXb3JrZXJPYmplY3QqIGFzc29jaWF0ZWRfc2VydmljZV93b3JrZXIsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VTZXF1ZW5jZVdyYXBwYWJsZTo6UmVmZXJlbmNlPgotICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlLAotICAgICAgYm9vbCBpbmNsdWRlX3VuY29udHJvbGxlZCwgQ2xpZW50VHlwZSB0eXBlKTsKLQotICAvLyBQYXJhbGxlbCBzdWIgc3RlcHMgKDMpIGZvciBhbGdvcml0aG0gZm9yIENsaWVudHMuY2xhaW0oKToKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNkb20tY2xpZW50cy1jbGFpbQotICB2b2lkIENsYWltU3ViU3RlcHMoCi0gICAgICB3ZWI6OkNvbnRleHQqIHdvcmtlcl9jb250ZXh0LAotICAgICAgU2VydmljZVdvcmtlck9iamVjdCogYXNzb2NpYXRlZF9zZXJ2aWNlX3dvcmtlciwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzY3JpcHQ6OlZhbHVlUHJvbWlzZVZvaWQ6OlJlZmVyZW5jZT4gcHJvbWlzZV9yZWZlcmVuY2UpOwotCi0gIC8vIFBhcmFsbGVsIHN1YiBzdGVwcyAoNikgZm9yIGFsZ29yaXRobSBmb3IgU2VydmljZVdvcmtlci5wb3N0TWVzc2FnZSgpOgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI3NlcnZpY2Utd29ya2VyLXBvc3RtZXNzYWdlLW9wdGlvbnMKLSAgdm9pZCBTZXJ2aWNlV29ya2VyUG9zdE1lc3NhZ2VTdWJTdGVwcygKLSAgICAgIFNlcnZpY2VXb3JrZXJPYmplY3QqIHNlcnZpY2Vfd29ya2VyLCB3ZWI6OkNvbnRleHQqIGluY3VtYmVudF9jbGllbnQsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpEYXRhQnVmZmVyPiBzZXJpYWxpemVfcmVzdWx0KTsKLQotICAvLyBSZWdpc3RyYXRpb24gb2Ygd2ViIGNvbnRleHRzIHRoYXQgbWF5IGhhdmUgc2VydmljZSB3b3JrZXJzLgotICB2b2lkIFJlZ2lzdGVyV2ViQ29udGV4dCh3ZWI6OkNvbnRleHQqIGNvbnRleHQpOwotICB2b2lkIFVucmVnaXN0ZXJXZWJDb250ZXh0KHdlYjo6Q29udGV4dCogY29udGV4dCk7Ci0gIGJvb2wgSXNXZWJDb250ZXh0UmVnaXN0ZXJlZCh3ZWI6OkNvbnRleHQqIGNvbnRleHQpIHsKLSAgICBEQ0hFQ0soYmFzZTo6TWVzc2FnZUxvb3A6OmN1cnJlbnQoKSA9PSBtZXNzYWdlX2xvb3AoKSk7Ci0gICAgcmV0dXJuIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmVuZCgpICE9Ci0gICAgICAgICAgIHdlYl9jb250ZXh0X3JlZ2lzdHJhdGlvbnNfLmZpbmQoY29udGV4dCk7Ci0gIH0KLQogICAvLyBFbnN1cmUgbm8gcmVmZXJlbmNlcyBhcmUga2VwdCB0byBKUyBvYmplY3RzIGZvciBhIGNsaWVudCB0aGF0IGlzIGFib3V0IHRvCiAgIC8vIGJlIHNodXRkb3duLgogICB2b2lkIFByZXBhcmVGb3JDbGllbnRTaHV0ZG93bih3ZWI6OkNvbnRleHQqIGNsaWVudCk7CiAKLSAgLy8gU2V0IHRoZSBhY3RpdmUgd29ya2VyIGZvciBhIGNsaWVudCBpZiB0aGVyZSBpcyBhIG1hdGNoaW5nIHNlcnZpY2Ugd29ya2VyLgotICB2b2lkIFNldEFjdGl2ZVdvcmtlcih3ZWI6OkVudmlyb25tZW50U2V0dGluZ3MqIGNsaWVudCk7Ci0KICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jY3JlYXRlLWpvYgogICBzdGQ6OnVuaXF1ZV9wdHI8Sm9iPiBDcmVhdGVKb2IoCiAgICAgICBKb2JUeXBlIHR5cGUsIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgY29uc3QgR1VSTCYgc2NvcGVfdXJsLApAQCAtMzE4LDIxICsyMjUsOSBAQAogICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzY2hlZHVsZS1qb2IKICAgdm9pZCBTY2hlZHVsZUpvYihzdGQ6OnVuaXF1ZV9wdHI8Sm9iPiBqb2IpOwogCi0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI2FjdGl2YXRpb24tYWxnb3JpdGhtCi0gIHZvaWQgQWN0aXZhdGUoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKLQotICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNjbGVhci1yZWdpc3RyYXRpb24tYWxnb3JpdGhtCi0gIHZvaWQgQ2xlYXJSZWdpc3RyYXRpb24oU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKLQotICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzb2Z0LXVwZGF0ZQotICB2b2lkIFNvZnRVcGRhdGUoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uLAotICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9ieXBhc3NfY2FjaGUpOwotCi0gIHZvaWQgRW5zdXJlU2VydmljZVdvcmtlclN0YXJ0ZWQoY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIGNsaWVudF91cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCk7Ci0KICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2VydmljZVdvcmtlckNvbnRleHQ7CisKICAgLy8gU3RhdGUgdXNlZCBmb3IgdGhlICdVcGRhdGUnIGFsZ29yaXRobS4KICAgc3RydWN0IFVwZGF0ZUpvYlN0YXRlIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWQ8VXBkYXRlSm9iU3RhdGU+IHsKICAgICBVcGRhdGVKb2JTdGF0ZSgKQEAgLTM4MCw4ICsyNzUsNiBAQAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOwogICB9OwogCi0gIGVudW0gUmVnaXN0cmF0aW9uU3RhdGUgeyBrSW5zdGFsbGluZywga1dhaXRpbmcsIGtBY3RpdmUgfTsKLQogICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNkZm4tam9iLWVxdWl2YWxlbnQKICAgYm9vbCBSZXR1cm5Kb2JzQXJlRXF1aXZhbGVudChKb2IqIG9uZSwgSm9iKiB0d28pOwogCkBAIC00MjgsNjYgKzMyMSwyMSBAQAogICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNmaW5pc2gtam9iLWFsZ29yaXRobQogICB2b2lkIEZpbmlzaEpvYihKb2IqIGpvYik7CiAKLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jcnVuLXNlcnZpY2Utd29ya2VyLWFsZ29yaXRobQotICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgJ0NvbXBsZXRpb24gb3IgZmFpbHVyZScuCi0gIC8vIEEgZmFpbHVyZSBpcyBzaWduYWxlZCBieSByZXR1cm5pbmcgbnVsbHB0ci4gT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5nCi0gIC8vIHBvaW50cyB0byB0aGUgdmFsdWUgb2YgdGhlIENvbXBsZXRpb24gcmV0dXJuZWQgYnkgdGhlIHNjcmlwdCBydW5uZXIKLSAgLy8gYWJzdHJhY3Rpb24uCi0gIHN0ZDo6c3RyaW5nKiBSdW5TZXJ2aWNlV29ya2VyKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9ieXBhc3NfY2FjaGUgPSBmYWxzZSk7Ci0KICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jaW5zdGFsbGF0aW9uLWFsZ29yaXRobQogICB2b2lkIEluc3RhbGwoCiAgICAgICBKb2IqIGpvYiwgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiYgd29ya2VyLAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uT2JqZWN0PiYgcmVnaXN0cmF0aW9uKTsKIAotICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN0cnktYWN0aXZhdGUtYWxnb3JpdGhtCi0gIHZvaWQgVHJ5QWN0aXZhdGUoU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKLQotICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyNzZXJ2aWNlLXdvcmtlci1oYXMtbm8tcGVuZGluZy1ldmVudHMKLSAgYm9vbCBTZXJ2aWNlV29ya2VySGFzTm9QZW5kaW5nRXZlbnRzKFNlcnZpY2VXb3JrZXJPYmplY3QqIHdvcmtlcik7Ci0KLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdXBkYXRlLXJlZ2lzdHJhdGlvbi1zdGF0ZS1hbGdvcml0aG0KLSAgdm9pZCBVcGRhdGVSZWdpc3RyYXRpb25TdGF0ZSgKLSAgICAgIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbiwgUmVnaXN0cmF0aW9uU3RhdGUgdGFyZ2V0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiYgc291cmNlKTsKLQotICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN1cGRhdGUtc3RhdGUtYWxnb3JpdGhtCi0gIHZvaWQgVXBkYXRlV29ya2VyU3RhdGUoU2VydmljZVdvcmtlck9iamVjdCogd29ya2VyLCBTZXJ2aWNlV29ya2VyU3RhdGUgc3RhdGUpOwotCi0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI29uLWNsaWVudC11bmxvYWQtYWxnb3JpdGhtCi0gIHZvaWQgSGFuZGxlU2VydmljZVdvcmtlckNsaWVudFVubG9hZCh3ZWI6OkNvbnRleHQqIGNsaWVudCk7Ci0KLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jdGVybWluYXRlLXNlcnZpY2Utd29ya2VyCi0gIHZvaWQgVGVybWluYXRlU2VydmljZVdvcmtlcihTZXJ2aWNlV29ya2VyT2JqZWN0KiB3b3JrZXIpOwotCi0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIyL0NSRC1zZXJ2aWNlLXdvcmtlcnMtMjAyMjA3MTIvI25vdGlmeS1jb250cm9sbGVyLWNoYW5nZS1hbGdvcml0aG0KLSAgdm9pZCBOb3RpZnlDb250cm9sbGVyQ2hhbmdlKHdlYjo6Q29udGV4dCogY2xpZW50KTsKLQotICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAyMi9DUkQtc2VydmljZS13b3JrZXJzLTIwMjIwNzEyLyN0cnktY2xlYXItcmVnaXN0cmF0aW9uLWFsZ29yaXRobQotICB2b2lkIFRyeUNsZWFyUmVnaXN0cmF0aW9uKFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbik7Ci0KLSAgYm9vbCBJc0FueUNsaWVudFVzaW5nUmVnaXN0cmF0aW9uKAotICAgICAgU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdCogcmVnaXN0cmF0aW9uKTsKLQotICAvLyBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KLSAgYm9vbCBXYWl0Rm9yQXN5bmNocm9ub3VzRXh0ZW5zaW9ucygKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk9iamVjdD4mIHJlZ2lzdHJhdGlvbik7CisgIFNlcnZpY2VXb3JrZXJDb250ZXh0KiBzZXJ2aWNlX3dvcmtlcl9jb250ZXh0XzsKIAogICAvLyBGZXRjaGVyRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGEgZmV0Y2hlciBhY2NvcmRpbmcgdG8gVVJMLgogICBzdGQ6OnVuaXF1ZV9wdHI8bG9hZGVyOjpGZXRjaGVyRmFjdG9yeT4gZmV0Y2hlcl9mYWN0b3J5XzsKICAgLy8gTG9hZGVyRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gYWNxdWlyZSByZWZlcmVuY2VzIHRvIHJlc291cmNlcyBmcm9tIGEgVVJMLgogICBzdGQ6OnVuaXF1ZV9wdHI8bG9hZGVyOjpTY3JpcHRMb2FkZXJGYWN0b3J5PiBzY3JpcHRfbG9hZGVyX2ZhY3RvcnlfOworCiAgIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3BfOwogCiAgIEpvYlF1ZXVlTWFwIGpvYl9xdWV1ZV9tYXBfOwotICBzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk1hcD4gc2NvcGVfdG9fcmVnaXN0cmF0aW9uX21hcF87Ci0KLSAgc3RkOjpzZXQ8d2ViOjpDb250ZXh0Kj4gd2ViX2NvbnRleHRfcmVnaXN0cmF0aW9uc187Ci0KLSAgYmFzZTo6V2FpdGFibGVFdmVudCB3ZWJfY29udGV4dF9yZWdpc3RyYXRpb25zX2NsZWFyZWRfID0gewotICAgICAgYmFzZTo6V2FpdGFibGVFdmVudDo6UmVzZXRQb2xpY3k6Ok1BTlVBTCwKLSAgICAgIGJhc2U6OldhaXRhYmxlRXZlbnQ6OkluaXRpYWxTdGF0ZTo6Tk9UX1NJR05BTEVEfTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSB3b3JrZXIKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcGVyc2lzdGVudF9zZXR0aW5ncy5jYyBiL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcGVyc2lzdGVudF9zZXR0aW5ncy5jYwppbmRleCA0MWE2ODlkLi5mNzRkNjNmIDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3BlcnNpc3RlbnRfc2V0dGluZ3MuY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9wZXJzaXN0ZW50X3NldHRpbmdzLmNjCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViL2NhY2hlX3V0aWxzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb25zdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2pvYnMuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9vYmplY3QuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3VwZGF0ZV92aWFfY2FjaGUuaCIKQEAgLTE3MSwyMCArMTcyLDIwIEBACiAgICAgcmVnaXN0cmF0aW9uX21hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCByZWdpc3RyYXRpb24pKTsKICAgICByZWdpc3RyYXRpb24tPnNldF9pc19wZXJzaXN0ZWQodHJ1ZSk7CiAKLSAgICBvcHRpb25zXy5zZXJ2aWNlX3dvcmtlcl9qb2JzLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgb3B0aW9uc18uc2VydmljZV93b3JrZXJfY29udGV4dC0+bWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VySm9iczo6QWN0aXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQob3B0aW9uc18uc2VydmljZV93b3JrZXJfam9icyksCisgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZTZXJ2aWNlV29ya2VyQ29udGV4dDo6QWN0aXZhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQob3B0aW9uc18uc2VydmljZV93b3JrZXJfY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbikpOwogCi0gICAgYXV0byBqb2IgPSBvcHRpb25zXy5zZXJ2aWNlX3dvcmtlcl9qb2JzLT5DcmVhdGVKb2JXaXRob3V0UHJvbWlzZSgKKyAgICBhdXRvIGpvYiA9IG9wdGlvbnNfLnNlcnZpY2Vfd29ya2VyX2NvbnRleHQtPmpvYnMoKS0+Q3JlYXRlSm9iV2l0aG91dFByb21pc2UoCiAgICAgICAgIFNlcnZpY2VXb3JrZXJKb2JzOjpKb2JUeXBlOjprVXBkYXRlLCBzdG9yYWdlX2tleSwgc2NvcGUsCiAgICAgICAgIHJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKS0+c2NyaXB0X3VybCgpKTsKLSAgICBvcHRpb25zXy5zZXJ2aWNlX3dvcmtlcl9qb2JzLT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpTY2hlZHVsZUpvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChvcHRpb25zXy5zZXJ2aWNlX3dvcmtlcl9qb2JzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGpvYikpKTsKKyAgICBvcHRpb25zXy5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LT5tZXNzYWdlX2xvb3AoKS0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJlNlcnZpY2VXb3JrZXJKb2JzOjpTY2hlZHVsZUpvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LT5qb2JzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShqb2IpKSk7CiAgIH0KIH0KIApAQCAtMTk5LDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy53ZWJfc2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy5uZXR3b3JrX21vZHVsZSwgcmVnaXN0cmF0aW9uKTsKICAgb3B0aW9ucy53ZWJfb3B0aW9ucy5wbGF0Zm9ybV9pbmZvID0gb3B0aW9uc18ucGxhdGZvcm1faW5mbzsKLSAgb3B0aW9ucy53ZWJfb3B0aW9ucy5zZXJ2aWNlX3dvcmtlcl9qb2JzID0gb3B0aW9uc18uc2VydmljZV93b3JrZXJfam9iczsKKyAgb3B0aW9ucy53ZWJfb3B0aW9ucy5zZXJ2aWNlX3dvcmtlcl9jb250ZXh0ID0gb3B0aW9uc18uc2VydmljZV93b3JrZXJfY29udGV4dDsKICAgc2NvcGVkX3JlZnB0cjxTZXJ2aWNlV29ya2VyT2JqZWN0PiB3b3JrZXIobmV3IFNlcnZpY2VXb3JrZXJPYmplY3Qob3B0aW9ucykpOwogCiAgIGJhc2U6OlZhbHVlKiBzY3JpcHRfdXJsX3ZhbHVlID0gdmFsdWVfZGljdC0+RmluZEtleU9mVHlwZSgKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcGVyc2lzdGVudF9zZXR0aW5ncy5oIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9wZXJzaXN0ZW50X3NldHRpbmdzLmgKaW5kZXggMWQ0ZmQyZS4uZTU5NWFjYiAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9wZXJzaXN0ZW50X3NldHRpbmdzLmgKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9wZXJzaXN0ZW50X3NldHRpbmdzLmgKQEAgLTQ4LDE2ICs0OCwxNiBAQAogICAgIE9wdGlvbnMod2ViOjpXZWJTZXR0aW5ncyogd2ViX3NldHRpbmdzLAogICAgICAgICAgICAgbmV0d29yazo6TmV0d29ya01vZHVsZSogbmV0d29ya19tb2R1bGUsCiAgICAgICAgICAgICB3ZWI6OlVzZXJBZ2VudFBsYXRmb3JtSW5mbyogcGxhdGZvcm1faW5mbywKLSAgICAgICAgICAgIFNlcnZpY2VXb3JrZXJKb2JzKiBzZXJ2aWNlX3dvcmtlcl9qb2JzLCBjb25zdCBHVVJMJiB1cmwpCisgICAgICAgICAgICBTZXJ2aWNlV29ya2VyQ29udGV4dCogc2VydmljZV93b3JrZXJfY29udGV4dCwgY29uc3QgR1VSTCYgdXJsKQogICAgICAgICA6IHdlYl9zZXR0aW5ncyh3ZWJfc2V0dGluZ3MpLAogICAgICAgICAgIG5ldHdvcmtfbW9kdWxlKG5ldHdvcmtfbW9kdWxlKSwKICAgICAgICAgICBwbGF0Zm9ybV9pbmZvKHBsYXRmb3JtX2luZm8pLAotICAgICAgICAgIHNlcnZpY2Vfd29ya2VyX2pvYnMoc2VydmljZV93b3JrZXJfam9icyksCisgICAgICAgICAgc2VydmljZV93b3JrZXJfY29udGV4dChzZXJ2aWNlX3dvcmtlcl9jb250ZXh0KSwKICAgICAgICAgICB1cmwodXJsKSB7fQogICAgIHdlYjo6V2ViU2V0dGluZ3MqIHdlYl9zZXR0aW5nczsKICAgICBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZTsKICAgICB3ZWI6OlVzZXJBZ2VudFBsYXRmb3JtSW5mbyogcGxhdGZvcm1faW5mbzsKLSAgICBTZXJ2aWNlV29ya2VySm9icyogc2VydmljZV93b3JrZXJfam9iczsKKyAgICBTZXJ2aWNlV29ya2VyQ29udGV4dCogc2VydmljZV93b3JrZXJfY29udGV4dDsKICAgICBjb25zdCBHVVJMJiB1cmw7CiAgIH07CiAKZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uLmNjIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24uY2MKaW5kZXggYWRiYTEyOC4uNTE0NDYzYSAxMDA2NDQKLS0tIGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24uY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb24uY2MKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvd2ViL2Vudmlyb25tZW50X3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYi93aW5kb3dfb3Jfd29ya2VyX2dsb2JhbF9zY29wZS5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX2dsb2JhbF9zY29wZS5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfam9icy5oIgogI2luY2x1ZGUgImNvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uX29iamVjdC5oIgpAQCAtMTEwLDIwICsxMTEsMTggQEAKICAgLy8gNi4gTGV0IGpvYiBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgQ3JlYXRlIEpvYiB3aXRoIHVwZGF0ZSwgcmVnaXN0cmF0aW9u4oCZcwogICAvLyAgICBzdG9yYWdlIGtleSwgcmVnaXN0cmF0aW9u4oCZcyBzY29wZSB1cmwsIG5ld2VzdFdvcmtlcuKAmXMgc2NyaXB0IHVybCwKICAgLy8gICAgcHJvbWlzZSwgYW5kIHRoaXMncyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuCi0gIHdvcmtlcjo6U2VydmljZVdvcmtlckpvYnMqIGpvYnMgPQotICAgICAgZW52aXJvbm1lbnRfc2V0dGluZ3MoKS0+Y29udGV4dCgpLT5zZXJ2aWNlX3dvcmtlcl9qb2JzKCk7CisgIFNlcnZpY2VXb3JrZXJKb2JzKiBqb2JzID0KKyAgICAgIGVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKS0+c2VydmljZV93b3JrZXJfY29udGV4dCgpLT5qb2JzKCk7CiAgIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlV29ya2VySm9iczo6Sm9iPiBqb2IgPSBqb2JzLT5DcmVhdGVKb2IoCiAgICAgICBTZXJ2aWNlV29ya2VySm9iczo6Sm9iVHlwZTo6a1VwZGF0ZSwgcmVnaXN0cmF0aW9uXy0+c3RvcmFnZV9rZXkoKSwKICAgICAgIHJlZ2lzdHJhdGlvbl8tPnNjb3BlX3VybCgpLCBuZXdlc3Rfd29ya2VyLT5zY3JpcHRfdXJsKCksCiAgICAgICBzdGQ6Om1vdmUocHJvbWlzZV9yZWZlcmVuY2UpLCBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCkpOwotICBEQ0hFQ0soIXByb21pc2VfcmVmZXJlbmNlKTsKIAogICAvLyA3LiBTZXQgam9i4oCZcyB3b3JrZXIgdHlwZSB0byBuZXdlc3RXb3JrZXLigJlzIHR5cGUuCiAgIC8vIENvYmFsdCBvbmx5IHN1cHBvcnRzICdjbGFzc2ljJyB3b3JrZXIgdHlwZS4KIAogICAvLyA4LiBJbnZva2UgU2NoZWR1bGUgSm9iIHdpdGggam9iLgogICBqb2JzLT5TY2hlZHVsZUpvYihzdGQ6Om1vdmUoam9iKSk7Ci0gIERDSEVDSygham9iLmdldCgpKTsKIH0KIAogc2NyaXB0OjpIYW5kbGVQcm9taXNlQm9vbCBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uOjpVbnJlZ2lzdGVyKCkgewpAQCAtMTQ2LDcgKzE0NSw3IEBACiAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLT5Qb3N0VGFzaygKICAgICAgIEZST01fSEVSRSwKICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgIFtdKHdvcmtlcjo6U2VydmljZVdvcmtlckpvYnMqIGpvYnMsIGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwKKyAgICAgICAgICBbXShTZXJ2aWNlV29ya2VySm9icyogam9icywgY29uc3QgdXJsOjpPcmlnaW4mIHN0b3JhZ2Vfa2V5LAogICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHNjb3BlX3VybCwKICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c2NyaXB0OjpWYWx1ZVByb21pc2VCb29sOjpSZWZlcmVuY2U+CiAgICAgICAgICAgICAgICAgIHByb21pc2VfcmVmZXJlbmNlLApAQCAtMTYzLDcgKzE2Miw3IEBACiAgICAgICAgICAgICBqb2JzLT5TY2hlZHVsZUpvYihzdGQ6Om1vdmUoam9iKSk7CiAgICAgICAgICAgICBEQ0hFQ0soIWpvYi5nZXQoKSk7CiAgICAgICAgICAgfSwKLSAgICAgICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2pvYnMoKSwKKyAgICAgICAgICBlbnZpcm9ubWVudF9zZXR0aW5ncygpLT5jb250ZXh0KCktPnNlcnZpY2Vfd29ya2VyX2NvbnRleHQoKS0+am9icygpLAogICAgICAgICAgIHJlZ2lzdHJhdGlvbl8tPnN0b3JhZ2Vfa2V5KCksIHJlZ2lzdHJhdGlvbl8tPnNjb3BlX3VybCgpLAogICAgICAgICAgIHN0ZDo6bW92ZShwcm9taXNlX3JlZmVyZW5jZSksIGVudmlyb25tZW50X3NldHRpbmdzKCktPmNvbnRleHQoKSkpOwogICAvLyA1LiBSZXR1cm4gcHJvbWlzZS4KZGlmZiAtLWdpdCBhL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uX21hcC5jYyBiL2NvYmFsdC93b3JrZXIvc2VydmljZV93b3JrZXJfcmVnaXN0cmF0aW9uX21hcC5jYwppbmRleCA3NjBjNDU3Li4zNTMyMDk0IDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9tYXAuY2MKKysrIGIvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fbWFwLmNjCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fbWVzc2FnZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvbWlzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9qb2JzLmgiCisjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9jb250ZXh0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl91cGRhdGVfdmlhX2NhY2hlLmgiCiAjaW5jbHVkZSAidXJsL2d1cmwuaCIKQEAgLTI1Miw3ICsyNTIsNyBAQAogfQogCiB2b2lkIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25NYXA6OkhhbmRsZVVzZXJBZ2VudFNodXRkb3duKAotICAgIFNlcnZpY2VXb3JrZXJKb2JzKiBqb2JzKSB7CisgICAgU2VydmljZVdvcmtlckNvbnRleHQqIGNvbnRleHQpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OndvcmtlciIsCiAgICAgICAgICAgICAgICAiU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbk1hcDo6SGFuZGxlVXNlckFnZW50U2h1dGRvd24oKSIpOwogICBEQ0hFQ0tfQ0FMTEVEX09OX1ZBTElEX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwpAQCAtMjcwLDcgKzI3MCw3IEBACiAgICAgICAvLyBhY3RpdmUgd29ya2VyIGlzIG51bGwsIGludm9rZSBDbGVhciBSZWdpc3RyYXRpb24gd2l0aCByZWdpc3RyYXRpb24gYW5kCiAgICAgICAvLyBjb250aW51ZSB0byB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuCiAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbi0+d2FpdGluZ193b3JrZXIoKSAmJiAhcmVnaXN0cmF0aW9uLT5hY3RpdmVfd29ya2VyKCkpIHsKLSAgICAgICAgam9icy0+Q2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKKyAgICAgICAgY29udGV4dC0+Q2xlYXJSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyAxLjEuMi4gRWxzZSwgc2V0IGluc3RhbGxpbmdXb3JrZXIgdG8gbnVsbC4KQEAgLTI4Myw3ICsyODMsNyBAQAogICAgICAgLy8gc3Vic3RlcCBpbiBwYXJhbGxlbDoKIAogICAgICAgLy8gMS4yLjEuIEludm9rZSBBY3RpdmF0ZSB3aXRoIHJlZ2lzdHJhdGlvbi4KLSAgICAgIGpvYnMtPkFjdGl2YXRlKHJlZ2lzdHJhdGlvbik7CisgICAgICBjb250ZXh0LT5BY3RpdmF0ZShyZWdpc3RyYXRpb24pOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci9zZXJ2aWNlX3dvcmtlcl9yZWdpc3RyYXRpb25fbWFwLmggYi9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9tYXAuaAppbmRleCBmOTk4MzE5Li41OTFmNThmIDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9tYXAuaAorKysgYi9jb2JhbHQvd29ya2VyL3NlcnZpY2Vfd29ya2VyX3JlZ2lzdHJhdGlvbl9tYXAuaApAQCAtMzcsNyArMzcsOCBAQAogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSB3b3JrZXIgewotY2xhc3MgU2VydmljZVdvcmtlckpvYnM7CisKK2NsYXNzIFNlcnZpY2VXb3JrZXJDb250ZXh0OwogCiAvLyBBbGdvcml0aG1zIGZvciB0aGUgc2VydmljZSB3b3JrZXIgc2NvcGUgdG8gcmVnaXN0cmF0aW9uIG1hcC4KIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jZGZuLXNjb3BlLXRvLXJlZ2lzdHJhdGlvbi1tYXAKQEAgLTY5LDExICs3MCwxMSBAQAogICBib29sIElzVW5yZWdpc3RlcmVkKFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25PYmplY3QqIHJlZ2lzdHJhdGlvbik7CiAKICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMjIvQ1JELXNlcnZpY2Utd29ya2Vycy0yMDIyMDcxMi8jb24tdXNlci1hZ2VudC1zaHV0ZG93bi1hbGdvcml0aG0KLSAgdm9pZCBIYW5kbGVVc2VyQWdlbnRTaHV0ZG93bihTZXJ2aWNlV29ya2VySm9icyogam9icyk7CisgIHZvaWQgSGFuZGxlVXNlckFnZW50U2h1dGRvd24oU2VydmljZVdvcmtlckNvbnRleHQqIGNvbnRleHQpOwogCiAgIHZvaWQgQWJvcnRBbGxBY3RpdmUoKTsKIAotICAvLyBDYWxsZWQgZnJvbSB0aGUgZW5kIG9mIFNlcnZpY2VXb3JrZXJKb2JzIEluc3RhbGwsIEFjdGl2YXRlLCBhbmQgQ2xlYXIKKyAgLy8gQ2FsbGVkIGZyb20gdGhlIGVuZCBvZiBTZXJ2aWNlV29ya2VyQ29udGV4dCBJbnN0YWxsLCBBY3RpdmF0ZSwgYW5kIENsZWFyCiAgIC8vIFJlZ2lzdHJhdGlvbiBzaW5jZSB0aGVzZSBhcmUgdGhlIGNhc2VzIGluIHdoaWNoIGEgc2VydmljZSB3b3JrZXIKICAgLy8gcmVnaXN0cmF0aW9uJ3MgYWN0aXZlX3dvcmtlciBvciB3YWl0aW5nX3dvcmtlciBhcmUgdXBkYXRlZC4KICAgdm9pZCBQZXJzaXN0UmVnaXN0cmF0aW9uKGNvbnN0IHVybDo6T3JpZ2luJiBzdG9yYWdlX2tleSwgY29uc3QgR1VSTCYgc2NvcGUpOwpkaWZmIC0tZ2l0IGEvY29iYWx0L3dvcmtlci93b3JrZXIuY2MgYi9jb2JhbHQvd29ya2VyL3dvcmtlci5jYwppbmRleCAxM2ZhMjRiLi5kMDFkMjUyIDEwMDY0NAotLS0gYS9jb2JhbHQvd29ya2VyL3dvcmtlci5jYworKysgYi9jb2JhbHQvd29ya2VyL3dvcmtlci5jYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAKIHZvaWQgV29ya2VyOjpQb3N0TWVzc2FnZShjb25zdCBzY3JpcHQ6OlZhbHVlSGFuZGxlSG9sZGVyJiBtZXNzYWdlKSB7CiAgIERDSEVDSyhtZXNzYWdlX2xvb3AoKSk7Ci0gIGF1dG8gc2VyaWFsaXplZF9tZXNzYWdlID0gc2NyaXB0OjpTZXJpYWxpemVTY3JpcHRWYWx1ZShtZXNzYWdlKTsKKyAgYXV0byBzdHJ1Y3R1cmVkX2Nsb25lID0gc3RkOjptYWtlX3VuaXF1ZTxzY3JpcHQ6OlN0cnVjdHVyZWRDbG9uZT4obWVzc2FnZSk7CiAgIGlmIChiYXNlOjpNZXNzYWdlTG9vcDo6Y3VycmVudCgpICE9IG1lc3NhZ2VfbG9vcCgpKSB7CiAgICAgLy8gQmxvY2sgdW50aWwgdGhlIHdvcmtlciB0aHJlYWQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBjb2RlIHRvIGhhbmRsZSB0aGUKICAgICAvLyBldmVudC4KQEAgLTM1NiwxMCArMzU2LDEwIEBACiAgICAgbWVzc2FnZV9sb29wKCktPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZ3ZWI6Ok1lc3NhZ2VQb3J0OjpQb3N0TWVzc2FnZVNlcmlhbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9wb3J0KCktPkFzV2Vha1B0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzZXJpYWxpemVkX21lc3NhZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHN0cnVjdHVyZWRfY2xvbmUpKSk7CiAgIH0gZWxzZSB7CiAgICAgRENIRUNLKGV4ZWN1dGlvbl9yZWFkeV8uSXNTaWduYWxlZCgpKTsKLSAgICBtZXNzYWdlX3BvcnQoKS0+UG9zdE1lc3NhZ2VTZXJpYWxpemVkKHN0ZDo6bW92ZShzZXJpYWxpemVkX21lc3NhZ2UpKTsKKyAgICBtZXNzYWdlX3BvcnQoKS0+UG9zdE1lc3NhZ2VTZXJpYWxpemVkKHN0ZDo6bW92ZShzdHJ1Y3R1cmVkX2Nsb25lKSk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjIGIvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjCmluZGV4IDhkZTU0OWEuLjEyYWVlOTMgMTAwNjQ0Ci0tLSBhL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdC5jYworKysgYi9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuY2MKQEAgLTE0MjQsNyArMTQyNCw3IEBACiAgIC8vIERvbid0IHJldHJ5LCBsZXQgdGhlIGNhbGxlciBkZWFsIHdpdGggaXQuCiAgIHVybF9mZXRjaGVyXy0+U2V0QXV0b21hdGljYWxseVJldHJ5T241eHgoZmFsc2UpOwogICB1cmxfZmV0Y2hlcl8tPlNldEV4dHJhUmVxdWVzdEhlYWRlcnMocmVxdWVzdF9oZWFkZXJzXy5Ub1N0cmluZygpKTsKLSAgbmV0d29ya19tb2R1bGUtPkFkZENsaWVudEhpbnRIZWFkZXJzKCp1cmxfZmV0Y2hlcl8pOworICBuZXR3b3JrX21vZHVsZS0+QWRkQ2xpZW50SGludEhlYWRlcnMoKnVybF9mZXRjaGVyXywgbmV0d29yazo6a0NhbGxUeXBlWEhSKTsKIAogICAvLyBXZSB3YW50IHRvIGRvIGNvcnMgY2hlY2sgYW5kIHByZWZsaWdodCBkdXJpbmcgcmVkaXJlY3RzCiAgIHVybF9mZXRjaGVyXy0+U2V0U3RvcE9uUmVkaXJlY3QodHJ1ZSk7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2NyYXNoL2NvcmUvY29tbW9uL0JVSUxELmduIGIvY29tcG9uZW50cy9jcmFzaC9jb3JlL2NvbW1vbi9CVUlMRC5nbgppbmRleCBlNWQ0NGQzLi41ZWE2YTM4IDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2NyYXNoL2NvcmUvY29tbW9uL0JVSUxELmduCisrKyBiL2NvbXBvbmVudHMvY3Jhc2gvY29yZS9jb21tb24vQlVJTEQuZ24KQEAgLTE1LDcgKzE1LDcgQEAKICAgICAiOmNyYXNoX2tleV91dGlscyIsCiAgIF0KIAotICBpZiAoaXNfbWFjIHx8IGlzX2lvcykgeworICBpZiAoKGlzX21hYyB8fCBpc19pb3MpICYmICF1c2VfY29iYWx0X2N1c3RvbWl6YXRpb25zKSB7CiAgICAgcHVibGljX2RlcHMgKz0gWyAiOnpvbWJpZXMiIF0KICAgfQogfQpAQCAtMTA2LDcgKzEwNiw3IEBACiAgIF0KIH0KIAotaWYgKGlzX21hYyB8fCBpc19pb3MpIHsKK2lmICgoaXNfbWFjIHx8IGlzX2lvcykgJiYgIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgY29tcG9uZW50KCJ6b21iaWVzIikgewogICAgIHZpc2liaWxpdHkgPSBbICI6Y29tbW9uIiBdCiAKQEAgLTEyNiwyOSArMTI2LDMxIEBACiAgIH0KIH0KIAotc291cmNlX3NldCgidW5pdF90ZXN0cyIpIHsKLSAgdGVzdG9ubHkgPSB0cnVlCi0gIHNvdXJjZXMgPSBbCi0gICAgImNyYXNoX2tleV91bml0dGVzdC5jYyIsCi0gICAgImNyYXNoX2tleXNfdW5pdHRlc3QuY2MiLAotICBdCitpZiAoIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKKyAgc291cmNlX3NldCgidW5pdF90ZXN0cyIpIHsKKyAgICB0ZXN0b25seSA9IHRydWUKKyAgICBzb3VyY2VzID0gWworICAgICAgImNyYXNoX2tleV91bml0dGVzdC5jYyIsCisgICAgICAiY3Jhc2hfa2V5c191bml0dGVzdC5jYyIsCisgICAgXQogCi0gIGRlcHMgPSBbCi0gICAgIjpjb21tb24iLAotICAgICIvL2Jhc2UiLAotICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAotICBdCisgICAgZGVwcyA9IFsKKyAgICAgICI6Y29tbW9uIiwKKyAgICAgICIvL2Jhc2UiLAorICAgICAgIi8vdGVzdGluZy9ndGVzdCIsCisgICAgXQogCi0gIGlmIChpc19tYWMgfHwgaXNfaW9zKSB7Ci0gICAgc291cmNlcyArPSBbICJvYmpjX3pvbWJpZV91bml0dGVzdC5tbSIgXQotICB9CisgICAgaWYgKGlzX21hYyB8fCBpc19pb3MpIHsKKyAgICAgIHNvdXJjZXMgKz0gWyAib2JqY196b21iaWVfdW5pdHRlc3QubW0iIF0KKyAgICB9CiAKLSAgaWYgKCFpc19tYWMgJiYgIWlzX3dpbiAmJiAhaXNfZnVjaHNpYSkgewotICAgIGluY2x1ZGVfZGlycyA9IFsgIi8vdGhpcmRfcGFydHkvYnJlYWtwYWQvYnJlYWtwYWQvc3JjLyIgXQotICAgIHNvdXJjZXMgKz0gWyAiY3Jhc2hfa2V5X2JyZWFrcGFkX3VuaXR0ZXN0LmNjIiBdCi0gIH0KKyAgICBpZiAoIWlzX21hYyAmJiAhaXNfd2luICYmICFpc19mdWNoc2lhKSB7CisgICAgICBpbmNsdWRlX2RpcnMgPSBbICIvL3RoaXJkX3BhcnR5L2JyZWFrcGFkL2JyZWFrcGFkL3NyYy8iIF0KKyAgICAgIHNvdXJjZXMgKz0gWyAiY3Jhc2hfa2V5X2JyZWFrcGFkX3VuaXR0ZXN0LmNjIiBdCisgICAgfQogCi0gIGlmIChpc19mdWNoc2lhKSB7Ci0gICAgc291cmNlcyAtPSBbICJjcmFzaF9rZXlfdW5pdHRlc3QuY2MiIF0KKyAgICBpZiAoaXNfZnVjaHNpYSkgeworICAgICAgc291cmNlcyAtPSBbICJjcmFzaF9rZXlfdW5pdHRlc3QuY2MiIF0KKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvY3Jhc2gvY29yZS9jb21tb24vY3Jhc2hfa2V5LmggYi9jb21wb25lbnRzL2NyYXNoL2NvcmUvY29tbW9uL2NyYXNoX2tleS5oCmluZGV4IGM5NjEwOGEuLjhkZDg5ZTIgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvY3Jhc2gvY29yZS9jb21tb24vY3Jhc2hfa2V5LmgKKysrIGIvY29tcG9uZW50cy9jcmFzaC9jb3JlL2NvbW1vbi9jcmFzaF9rZXkuaApAQCAtMjAsNyArMjAsOCBAQAogLy8gQW5ub3RhdGlvbiBpbnRlcmZhY2UuIEJlY2F1c2Ugbm90IGFsbCBwbGF0Zm9ybXMgdXNlIENyYXNocGFkIHlldCwgYQogLy8gc291cmNlLWNvbXBhdGlibGUgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIG9uIHRvcCBvZiB0aGUgb2xkZXIgQnJlYWtwYWQKIC8vIHN0b3JhZ2UgbWVjaGFuaXNtLgotI2lmIEJVSUxERkxBRyhVU0VfQ1JBU0hQQURfQU5OT1RBVElPTikKKy8vIFRPRE8oYi8yODY4ODE5NzIpOiBJbnZlc3RpZ2F0ZSBlbmFibGluZyBjcmFzaHBhZCBzdXBwb3J0IGluIENvYmFsdC9UZWxlbWV0cnkuCisjaWYgQlVJTERGTEFHKFVTRV9DUkFTSFBBRF9BTk5PVEFUSU9OKSAmJiAhZGVmaW5lZChTVEFSQk9BUkQpCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvY3Jhc2hwYWQvY3Jhc2hwYWQvY2xpZW50L2Fubm90YXRpb24uaCIgIC8vIG5vZ25jaGVjawogI2VuZGlmCiAKQEAgLTU4LDcgKzU5LDcgQEAKIC8vICAgICAgZ19vcGVyYXRpb25faWQuQ2xlYXIoKQogLy8gICAgfQogLy8gXGVuZGNvZGUKLSNpZiBCVUlMREZMQUcoVVNFX0NSQVNIUEFEX0FOTk9UQVRJT04pCisjaWYgQlVJTERGTEFHKFVTRV9DUkFTSFBBRF9BTk5PVEFUSU9OKSAmJiAhZGVmaW5lZChTVEFSQk9BUkQpCiAKIHRlbXBsYXRlIDxjcmFzaHBhZDo6QW5ub3RhdGlvbjo6VmFsdWVTaXplVHlwZSBNYXhMZW5ndGg+CiB1c2luZyBDcmFzaEtleVN0cmluZyA9IGNyYXNocGFkOjpTdHJpbmdBbm5vdGF0aW9uPE1heExlbmd0aD47CkBAIC0xNzIsNyArMTczLDcgQEAKIC8vICAgIH0KIGNsYXNzIFNjb3BlZENyYXNoS2V5U3RyaW5nIHsKICBwdWJsaWM6Ci0jaWYgQlVJTERGTEFHKFVTRV9DUkFTSFBBRF9BTk5PVEFUSU9OKQorI2lmIEJVSUxERkxBRyhVU0VfQ1JBU0hQQURfQU5OT1RBVElPTikgJiYgIWRlZmluZWQoU1RBUkJPQVJEKQogICB1c2luZyBDcmFzaEtleVR5cGUgPSBjcmFzaHBhZDo6QW5ub3RhdGlvbjsKICNlbHNlCiAgIHVzaW5nIENyYXNoS2V5VHlwZSA9IGludGVybmFsOjpDcmFzaEtleVN0cmluZ0ltcGw7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2NyeF9maWxlL0JVSUxELmduIGIvY29tcG9uZW50cy9jcnhfZmlsZS9CVUlMRC5nbgppbmRleCAyYjEwM2QyLi4zYTA1NTMyIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL2NyeF9maWxlL0JVSUxELmduCisrKyBiL2NvbXBvbmVudHMvY3J4X2ZpbGUvQlVJTEQuZ24KQEAgLTEyLDYgKzEyLDkgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAoraWYgKGlzX3N0YXJib2FyZCkgeworICBpbXBvcnQoIi8vY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS9zaGExX2ZpbGVzLmduaSIpCit9CiBpbXBvcnQoIi8vdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9fbGlicmFyeS5nbmkiKQogCiAjIFRoZSBhY2NvbXBhbnlpbmcgY3J4X2NyZWF0b3IgdGFyZ2V0IGhhcyBiZWVuIGxlZnQgYmVoaW5kIGR1cmluZyB0aGUgbWlncmF0aW9uCkBAIC0zNSwzICszOCw2MCBAQAogICAgICIvL3RoaXJkX3BhcnR5L3Byb3RvYnVmOnByb3RvYnVmX2xpdGUiLAogICBdCiB9CisKK2lmIChpc19zdGFyYm9hcmQpIHsKKyAgYWN0aW9uKCJjcnhfZmlsZV9kb3dubG9hZF90ZXN0X2RhdGEiKSB7CisgICAgaW5zdGFsbF9jb250ZW50ID0gdHJ1ZQorCisgICAgc2NyaXB0ID0gIi8vdG9vbHMvZG93bmxvYWRfZnJvbV9nY3MucHkiCisKKyAgICBzaGFfc291cmNlcyA9IFtdCisgICAgZm9yZWFjaChzaGExX2ZpbGUsIHNoYTFfZmlsZXMpIHsKKyAgICAgIHNoYV9zb3VyY2VzICs9IFsgc3RyaW5nX2pvaW4oIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pIF0KKyAgICB9CisKKyAgICBzaGFfb3V0cHV0cyA9IFtdCisgICAgc3ViZGlyID0gImNvbXBvbmVudHMvY3J4X2ZpbGUiCisgICAgb3V0ZGlyID0gIiRzYl9zdGF0aWNfY29udGVudHNfb3V0cHV0X2RhdGFfZGlyL3Rlc3QvJHN1YmRpciIKKyAgICBmb3JlYWNoKHNoYV9zb3VyY2UsIHNoYV9zb3VyY2VzKSB7CisgICAgICBzaGFfb3V0cHV0cyArPSBbIHN0cmluZ19qb2luKCIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfcmVwbGFjZShzaGFfc291cmNlLCAiLnNoYTEiLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pIF0KKyAgICB9CisKKyAgICBzb3VyY2VzID0gc2hhX3NvdXJjZXMKKyAgICBvdXRwdXRzID0gc2hhX291dHB1dHMKKworICAgIHNoYTFfZGlyID0gcmViYXNlX3BhdGgoInRlc3RkYXRhIiwgcm9vdF9idWlsZF9kaXIpCisKKyAgICBhcmdzID0gWworICAgICAgIi0tYnVja2V0IiwKKyAgICAgICJjb2JhbHQtc3RhdGljLXN0b3JhZ2UiLAorICAgICAgIi0tc2hhMSIsCisgICAgICBzaGExX2RpciwKKyAgICAgICItLW91dHB1dCIsCisgICAgICByZWJhc2VfcGF0aCgiJG91dGRpci90ZXN0ZGF0YSIsIHJvb3RfYnVpbGRfZGlyKSwKKyAgICBdCisgIH0KKworICB0YXJnZXQoZ3Rlc3RfdGFyZ2V0X3R5cGUsICJjcnhfZmlsZV90ZXN0IikgeworICAgIHRlc3Rvbmx5ID0gdHJ1ZQorCisgICAgc291cmNlcyA9IFsgImNyeF92ZXJpZmllcl91bml0dGVzdC5jYyIgXQorCisgICAgZGVwcyA9IFsKKyAgICAgICI6Y3J4X2ZpbGUiLAorICAgICAgIi8vY29iYWx0L3Rlc3Q6cnVuX2FsbF91bml0dGVzdHMiLAorICAgICAgIi8vc3RhcmJvYXJkOnN0YXJib2FyZF9oZWFkZXJzX29ubHkiLAorICAgICAgIi8vdGVzdGluZy9ndGVzdCIsCisgICAgXQorCisgICAgZGF0YV9kZXBzID0gWyAiOmNyeF9maWxlX2Rvd25sb2FkX3Rlc3RfZGF0YSIgXQorICB9Cit9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL2NyeF9maWxlL2NyeF92ZXJpZmllcl91bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvY3J4X2ZpbGUvY3J4X3ZlcmlmaWVyX3VuaXR0ZXN0LmNjCmluZGV4IDgwMjhiN2MuLjRjNDFlNGUgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvY3J4X2ZpbGUvY3J4X3ZlcmlmaWVyX3VuaXR0ZXN0LmNjCisrKyBiL2NvbXBvbmVudHMvY3J4X2ZpbGUvY3J4X3ZlcmlmaWVyX3VuaXR0ZXN0LmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDExICs3LDI0IEBACiAjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3BhdGguaCIKICNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgorI2VuZGlmCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIG5hbWVzcGFjZSB7CiAKIGJhc2U6OkZpbGVQYXRoIFRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZihrU2JGaWxlTWF4UGF0aCk7CisgIFNiU3lzdGVtR2V0UGF0aChrU2JTeXN0ZW1QYXRoQ29udGVudERpcmVjdG9yeSwgYnVmLmRhdGEoKSwga1NiRmlsZU1heFBhdGgpOworICByZXR1cm4gYmFzZTo6RmlsZVBhdGgoYnVmLmRhdGEoKSkKKyAgICAgIC5BcHBlbmRBU0NJSSgidGVzdCIpCisgICAgICAuQXBwZW5kQVNDSUkoImNvbXBvbmVudHMiKQorICAgICAgLkFwcGVuZEFTQ0lJKCJjcnhfZmlsZSIpCisgICAgICAuQXBwZW5kQVNDSUkoInRlc3RkYXRhIikKKyAgICAgIC5BcHBlbmRBU0NJSShmaWxlKTsKKyNlbHNlCiAgIGJhc2U6OkZpbGVQYXRoIHBhdGg7CiAgIGJhc2U6OlBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX1NPVVJDRV9ST09ULCAmcGF0aCk7CiAgIHJldHVybiBwYXRoLkFwcGVuZEFTQ0lJKCJjb21wb25lbnRzIikKQEAgLTE5LDYgKzMyLDcgQEAKICAgICAgIC5BcHBlbmRBU0NJSSgiZGF0YSIpCiAgICAgICAuQXBwZW5kQVNDSUkoImNyeF9maWxlIikKICAgICAgIC5BcHBlbmRBU0NJSShmaWxlKTsKKyNlbmRpZgogfQogCiBjb25zdGV4cHIgY2hhciBrT2pqSGFzaFtdID0gIm9qamducGtpb29uZGVsbWdnYmVrZmhsbGhkYWltbmhvIjsKZGlmZiAtLWdpdCBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduIGIvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS9zaGExX2ZpbGVzLmduaQpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gY29iYWx0L2FjY291bnQvQlVJTEQuZ24KY29weSB0byBjb21wb25lbnRzL2NyeF9maWxlL3Rlc3RkYXRhL3NoYTFfZmlsZXMuZ25pCmluZGV4IDAyY2NlM2UuLmY2ZjU5MTcgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduCisrKyBiL2NvbXBvbmVudHMvY3J4X2ZpbGUvdGVzdGRhdGEvc2hhMV9maWxlcy5nbmkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDIxIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsMTMgKzEyLDEwIEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLXN0YXRpY19saWJyYXJ5KCJhY2NvdW50IikgewotICBoYXNfcGVkYW50aWNfd2FybmluZ3MgPSB0cnVlCi0KLSAgc291cmNlcyA9IFsKLSAgICAiYWNjb3VudF9tYW5hZ2VyLmNjIiwKLSAgICAiYWNjb3VudF9tYW5hZ2VyLmgiLAotICBdCi0KLSAgZGVwcyA9IFsgIi8vc3RhcmJvYXJkOnN0YXJib2FyZF9oZWFkZXJzX29ubHkiIF0KLX0KK3NoYTFfZmlsZXMgPSBbCisgICJ1bnNpZ25lZC5jcngzLnNoYTEiLAorICAidmFsaWQuY3J4Mi5zaGExIiwKKyAgInZhbGlkX25vX3B1Ymxpc2hlci5jcngzLnNoYTEiLAorICAidmFsaWRfcHVibGlzaGVyLmNyeDMuc2hhMSIsCisgICJ2YWxpZF90ZXN0X3B1Ymxpc2hlci5jcngzLnNoYTEiLAorXQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS91bnNpZ25lZC5jcngzLnNoYTEgYi9jb21wb25lbnRzL2NyeF9maWxlL3Rlc3RkYXRhL3Vuc2lnbmVkLmNyeDMuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEzZTNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS91bnNpZ25lZC5jcngzLnNoYTEKQEAgLTAsMCArMSBAQAorYWQ4NTIzOGU3ZTNhZmUzMjVlNmJlOTAyYWViMDE4ZTBkMTRmZTNkZQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZC5jcngyLnNoYTEgYi9jb21wb25lbnRzL2NyeF9maWxlL3Rlc3RkYXRhL3ZhbGlkLmNyeDIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmRlNTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZC5jcngyLnNoYTEKQEAgLTAsMCArMSBAQAorNmJkMmU3OTUwY2RiNTlhZDhkMmZjNTNiZGM0M2JlMWMyMDdlODE3MwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZF9ub19wdWJsaXNoZXIuY3J4My5zaGExIGIvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZF9ub19wdWJsaXNoZXIuY3J4My5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzUxODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb25lbnRzL2NyeF9maWxlL3Rlc3RkYXRhL3ZhbGlkX25vX3B1Ymxpc2hlci5jcngzLnNoYTEKQEAgLTAsMCArMSBAQAorYmFmOWRkMzEzZmE1YzQyMjhmZTA1Y2NlM2QyOTJiZDZkNzAwNjM0MgpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZF9wdWJsaXNoZXIuY3J4My5zaGExIGIvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZF9wdWJsaXNoZXIuY3J4My5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmJmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb25lbnRzL2NyeF9maWxlL3Rlc3RkYXRhL3ZhbGlkX3B1Ymxpc2hlci5jcngzLnNoYTEKQEAgLTAsMCArMSBAQAorNmZiYmYzM2I0YWQ1NmZmMjU2MDhmOTc1ZmM3ODg0MGViNDFiZTFiYQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZF90ZXN0X3B1Ymxpc2hlci5jcngzLnNoYTEgYi9jb21wb25lbnRzL2NyeF9maWxlL3Rlc3RkYXRhL3ZhbGlkX3Rlc3RfcHVibGlzaGVyLmNyeDMuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTliYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9jcnhfZmlsZS90ZXN0ZGF0YS92YWxpZF90ZXN0X3B1Ymxpc2hlci5jcngzLnNoYTEKQEAgLTAsMCArMSBAQAorOTA1OWQ3NDE5NDAxZjg3NjRkNjc4ODAwNjc0N2YzNDA3ZmRiYTZmMApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9tZXRyaWNzL0JVSUxELmduIGIvY29tcG9uZW50cy9tZXRyaWNzL0JVSUxELmduCmluZGV4IGUxN2ZkMjAuLmI3YzA0ZjMgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvbWV0cmljcy9CVUlMRC5nbgorKysgYi9jb21wb25lbnRzL21ldHJpY3MvQlVJTEQuZ24KQEAgLTIsMTAgKzIsNyBAQAogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSMgVE9ETyhiLzI4MzI3NTQ4NCk6IFJlbW92ZSB0aGlzIG9uY2UgdGVzdC5nbmkgaXMgc3R1YmJlZCBmb3IgQ29iYWx0LgotaWYgKCF1c2VfY29iYWx0X2N1c3RvbWl6YXRpb25zKSB7Ci0gIGltcG9ydCgiLy90ZXN0aW5nL3Rlc3QuZ25pIikKLX0KK2ltcG9ydCgiLy90ZXN0aW5nL3Rlc3QuZ25pIikKIAogc3RhdGljX2xpYnJhcnkoIm1ldHJpY3MiKSB7CiAgIHNvdXJjZXMgPSBbCkBAIC0xNDYsNyArMTQzLDcgQEAKICAgICBkZXBzICs9IFsgIjpzZXJpYWxpemF0aW9uIiBdCiAgIH0KIAotICBpZiAoaXNfbWFjKSB7CisgIGlmIChpc19tYWMgJiYgIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgICBsaWJzID0gWwogICAgICAgIyBUaGUgYmVsb3cgYXJlIGFsbCBuZWVkZWQgZm9yIGRyaXZlX21ldHJpY3NfcHJvdmlkZXJfbWFjLm1tLgogICAgICAgIkNvcmVGb3VuZGF0aW9uLmZyYW1ld29yayIsCkBAIC0xNTYsNyArMTUzLDcgQEAKICAgICBdCiAgIH0KIAotICBpZiAoaXNfd2luKSB7CisgIGlmIChpc193aW4gJiYgIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgICBzb3VyY2VzIC09IFsgIm1hY2hpbmVfaWRfcHJvdmlkZXJfc3R1Yi5jYyIgXQogICAgIGRlcHMgKz0gWyAiLy9jb21wb25lbnRzL2Jyb3dzZXJfd2F0Y2hlcjpzdGFiaWxpdHlfY2xpZW50IiBdCiAgICAgbGlicyA9IFsgIndldnRhcGkubGliIiBdCkBAIC0zNjksNyArMzY2LDcgQEAKICAgXQogfQogCi1pZiAoaXNfbGludXgpIHsKK2lmIChpc19saW51eCAmJiAhdXNlX2NvYmFsdF9jdXN0b21pemF0aW9ucykgewogICBzdGF0aWNfbGlicmFyeSgic2VyaWFsaXphdGlvbiIpIHsKICAgICBzb3VyY2VzID0gWwogICAgICAgInNlcmlhbGl6YXRpb24vbWV0cmljX3NhbXBsZS5jYyIsCkBAIC0zODIsNiArMzc5LDcgQEAKICAgICBdCiAgIH0KIH0KKwogIyBUT0RPKGIvMjgzMjc1NDc0KTogUmUtZW5hYmxlIGFzIG1hbnkgb2YgdGhlc2UgdGVzdHMgYXMgcG9zc2libGUuCiBpZiAoIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgc291cmNlX3NldCgidW5pdF90ZXN0cyIpIHsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL0JVSUxELmduIGIvY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvQlVJTEQuZ24KaW5kZXggN2JlMzY1NC4uYzc1NzY2YyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvQlVJTEQuZ24KQEAgLTE5LDQgKzE5LDE2IEBACiAgICAgIi8vY29tcG9uZW50cy92YXJpYXRpb25zL3NlcnZpY2UiLAogICAgICIvL3NlcnZpY2VzL25ldHdvcmsvcHVibGljL2NwcDpjcHAiLAogICBdCisKKyAgIyBUaGVzZSBkZXBlbmRlbmNpZXMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZCBvciBkbyBub3QgZXhpc3QgaW4gQ29iYWx0LgorICAjIEVsaW1pbmF0aW5nIHRoZXNlIHNpZ25pZmljYW50bHkgc2ltcGxpZmllcyBicmluZ2luZyBpbiB0aGUKKyAgIyBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIgYXMgYSBkZXBlbmRlbmRlbmN5LgorICBpZiAodXNlX2NvYmFsdF9jdXN0b21pemF0aW9ucykgeworICAgIGRlcHMgLT0gWworICAgICAgIi8vY29tcG9uZW50cy9yYXBwb3IiLAorICAgICAgIi8vY29tcG9uZW50cy91a20iLAorICAgICAgIi8vY29tcG9uZW50cy92YXJpYXRpb25zL3NlcnZpY2UiLAorICAgICAgIi8vc2VydmljZXMvbmV0d29yay9wdWJsaWMvY3BwOmNwcCIsCisgICAgXQorICB9CiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuY2MgYi9jb21wb25lbnRzL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuY2MKaW5kZXggNDk1MjYzMS4uOTQwNjAxNyAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyLmNjCisrKyBiL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5jYwpAQCAtMTMsMTAgKzEzLDEzIEBACiAjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzL21ldHJpY3Nfc3RhdGVfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvbXBvbmVudHMvbWV0cmljcy9tZXRyaWNzX3N3aXRjaGVzLmgiCiAjaW5jbHVkZSAiY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudC5oIgorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKICNpbmNsdWRlICJjb21wb25lbnRzL3JhcHBvci9yYXBwb3Jfc2VydmljZV9pbXBsLmgiCisvLyBUT0RPRChiLzI4NDQ2NzE0Mik6IFJlLWVuYWJsZSB3aGVuIFVLTSBpcyBzdXBwb3J0ZWQuCiAjaW5jbHVkZSAiY29tcG9uZW50cy91a20vdWttX3NlcnZpY2UuaCIKICNpbmNsdWRlICJjb21wb25lbnRzL3ZhcmlhdGlvbnMvc2VydmljZS92YXJpYXRpb25zX3NlcnZpY2UuaCIKICNpbmNsdWRlICJzZXJ2aWNlcy9uZXR3b3JrL3B1YmxpYy9jcHAvc2hhcmVkX3VybF9sb2FkZXJfZmFjdG9yeS5oIgorI2VuZGlmCiAKIG5hbWVzcGFjZSBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIgewogCkBAIC00MSw2ICs0NCw3IEBACiAgIHJldHVybiBHZXRNZXRyaWNzU2VydmljZUNsaWVudCgpLT5HZXRNZXRyaWNzU2VydmljZSgpOwogfQogCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogcmFwcG9yOjpSYXBwb3JTZXJ2aWNlSW1wbCogTWV0cmljc1NlcnZpY2VzTWFuYWdlcjo6R2V0UmFwcG9yU2VydmljZUltcGwoKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgaWYgKCFyYXBwb3Jfc2VydmljZV8pIHsKQEAgLTUwLDYgKzU0LDcgQEAKICAgcmV0dXJuIHJhcHBvcl9zZXJ2aWNlXy5nZXQoKTsKIH0KIAorLy8gVE9ET0QoYi8yODQ0NjcxNDIpOiBSZS1lbmFibGUgd2hlbiBVS00gaXMgc3VwcG9ydGVkLgogdWttOjpVa21TZXJ2aWNlKiBNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpHZXRVa21TZXJ2aWNlKCkgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIHJldHVybiBHZXRNZXRyaWNzU2VydmljZUNsaWVudCgpLT5HZXRVa21TZXJ2aWNlKCk7CkBAIC02MSw2ICs2Niw3IEBACiAgICAgdmFyaWF0aW9uc19zZXJ2aWNlXyA9IGNsaWVudF8tPkNyZWF0ZVZhcmlhdGlvbnNTZXJ2aWNlKCk7CiAgIHJldHVybiB2YXJpYXRpb25zX3NlcnZpY2VfLmdldCgpOwogfQorI2VuZGlmCiAKIHZvaWQgTWV0cmljc1NlcnZpY2VzTWFuYWdlcjo6T25QbHVnaW5Mb2FkaW5nRXJyb3IoCiAgICAgY29uc3QgYmFzZTo6RmlsZVBhdGgmIHBsdWdpbl9wYXRoKSB7CkBAIC04OCw2ICs5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY3VycmVudF9jb25zZW50X2dpdmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGN1cnJlbnRfbWF5X3VwbG9hZCkgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogICAvLyBJZiB0aGUgdXNlciBoYXMgb3B0ZWQgb3V0IG9mIG1ldHJpY3MsIGRlbGV0ZSBsb2NhbCBVS00gc3RhdGUuIFdlIE9ubHkgY2hlY2sKICAgLy8gY29uc2VudCBmb3IgVUtNLgogICBpZiAoY29uc2VudF9naXZlbl8gJiYgIWN1cnJlbnRfY29uc2VudF9naXZlbikgewpAQCAtOTcsNiArMTA0LDcgQEAKICAgICAgIHVrbS0+UmVzZXRDbGllbnRJZCgpOwogICAgIH0KICAgfQorI2VuZGlmCiAKICAgLy8gU3Rhc2ggdGhlIGN1cnJlbnQgcGVybWlzc2lvbnMgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZSBSYXBwb3JTZXJ2aWNlSW1wbAogICAvLyBjb3JyZWN0bHkgd2hlbiB0aGUgUmFwcG9yIHByZWZlcmVuY2UgY2hhbmdlcy4KQEAgLTExMyw3ICsxMjEsOSBAQAogICBjb25zdCBiYXNlOjpDb21tYW5kTGluZSogY21kbGluZSA9IGJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwogICBpZiAoY21kbGluZS0+SGFzU3dpdGNoKG1ldHJpY3M6OnN3aXRjaGVzOjprTWV0cmljc1JlY29yZGluZ09ubHkpKSB7CiAgICAgbWV0cmljcy0+U3RhcnRSZWNvcmRpbmdGb3JUZXN0cygpOworI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKICAgICBHZXRSYXBwb3JTZXJ2aWNlSW1wbCgpLT5VcGRhdGUodHJ1ZSwgZmFsc2UpOworI2VuZGlmCiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTEzMCwxMSArMTQwLDE2IEBACiAgICAgbWV0cmljcy0+U3RvcCgpOwogICB9CiAKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisgIC8vIFRPRE9EKGIvMjg0NDY3MTQyKTogUmUtZW5hYmxlIHdoZW4gVUtNIGlzIHN1cHBvcnRlZC4KICAgVXBkYXRlVWttU2VydmljZSgpOwogCiAgIEdldFJhcHBvclNlcnZpY2VJbXBsKCktPlVwZGF0ZShtYXlfcmVjb3JkXywgbWF5X3VwbG9hZF8pOworI2VuZGlmCiB9CiAKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisvLyBUT0RPRChiLzI4NDQ2NzE0Mik6IFJlLWVuYWJsZSB3aGVuIFVLTSBpcyBzdXBwb3J0ZWQuCiB2b2lkIE1ldHJpY3NTZXJ2aWNlc01hbmFnZXI6OlVwZGF0ZVVrbVNlcnZpY2UoKSB7CiAgIHVrbTo6VWttU2VydmljZSogdWttID0gR2V0VWttU2VydmljZSgpOwogICBpZiAoIXVrbSkKQEAgLTE1OSw2ICsxNzQsNyBAQAogICAgIHVrbS0+RGlzYWJsZVJlcG9ydGluZygpOwogICB9CiB9CisjZW5kaWYKIAogdm9pZCBNZXRyaWNzU2VydmljZXNNYW5hZ2VyOjpVcGRhdGVVcGxvYWRQZXJtaXNzaW9ucyhib29sIG1heV91cGxvYWQpIHsKICAgaWYgKGNsaWVudF8tPklzTWV0cmljc1JlcG9ydGluZ0ZvcmNlRW5hYmxlZCgpKSB7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIuaCBiL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5oCmluZGV4IDkxMmJmOWEuLjY5MGQzOWEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5oCisrKyBiL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci5oCkBAIC0xOSwxMiArMTksMTQgQEAKIGNsYXNzIE1ldHJpY3NTZXJ2aWNlOwogY2xhc3MgTWV0cmljc1NlcnZpY2VDbGllbnQ7CiBjbGFzcyBNZXRyaWNzU3RhdGVNYW5hZ2VyOwotfQorfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKIAorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKIG5hbWVzcGFjZSByYXBwb3IgewogY2xhc3MgUmFwcG9yU2VydmljZUltcGw7CiB9CiAKKy8vIFRPRE9EKGIvMjg0NDY3MTQyKTogUmUtZW5hYmxlIHdoZW4gVUtNIGlzIHN1cHBvcnRlZC4KIG5hbWVzcGFjZSB1a20gewogY2xhc3MgVWttU2VydmljZTsKIH0KQEAgLTMyLDYgKzM0LDcgQEAKIG5hbWVzcGFjZSB2YXJpYXRpb25zIHsKIGNsYXNzIFZhcmlhdGlvbnNTZXJ2aWNlOwogfQorI2VuZGlmCiAKIG5hbWVzcGFjZSBtZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIgewogCkBAIC02MSwxNCArNjQsMTcgQEAKICAgLy8gYWRkaXRpb25hbGx5IGNyZWF0aW5nIHRoZSBNZXRyaWNzU2VydmljZUNsaWVudCBpbiB0aGF0IGNhc2UpLgogICBtZXRyaWNzOjpNZXRyaWNzU2VydmljZSogR2V0TWV0cmljc1NlcnZpY2UoKTsKIAorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKICAgLy8gUmV0dXJucyB0aGUgUmFwcG9yU2VydmljZUltcGwsIGNyZWF0aW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgogICByYXBwb3I6OlJhcHBvclNlcnZpY2VJbXBsKiBHZXRSYXBwb3JTZXJ2aWNlSW1wbCgpOwogCisgIC8vIFRPRE9EKGIvMjg0NDY3MTQyKTogUmUtZW5hYmxlIHdoZW4gVUtNIGlzIHN1cHBvcnRlZC4KICAgLy8gUmV0dXJucyB0aGUgVWttU2VydmljZSwgY3JlYXRpbmcgaXQgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuCiAgIHVrbTo6VWttU2VydmljZSogR2V0VWttU2VydmljZSgpOwogCiAgIC8vIFJldHVybnMgdGhlIFZhcmlhdGlvbnNTZXJ2aWNlLCBjcmVhdGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC4KICAgdmFyaWF0aW9uczo6VmFyaWF0aW9uc1NlcnZpY2UqIEdldFZhcmlhdGlvbnNTZXJ2aWNlKCk7CisjZW5kaWYKIAogICAvLyBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBwbHVnaW4gbG9hZGluZyBlcnJvciBvY2N1cnMuCiAgIHZvaWQgT25QbHVnaW5Mb2FkaW5nRXJyb3IoY29uc3QgYmFzZTo6RmlsZVBhdGgmIHBsdWdpbl9wYXRoKTsKQEAgLTgzLDcgKzg5LDIxIEBACiAgIC8vIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbWV0cmljIHJlcG9ydGluZy4KICAgYm9vbCBJc01ldHJpY3NSZXBvcnRpbmdFbmFibGVkKCkgY29uc3Q7CiAKKy8vIEluIENvYmFsdCwgd2UgbmVlZCBwdWJsaWMgYWNjZXNzIHRvIHRoZSBtZXRyaWNzIHNlcnZpY2UgY2xpZW50cyBzbyB3ZSBjYW4KKy8vIG92ZXJ3cml0ZSB0aGUgdXBsb2FkIGJlaGF2aW9yIGFuZCBlbmFibGUvZGlzYWJsZSBtZXRyaWNzIHByb2dyYW1tYXRpY2FsbHkuCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgIC8vIFJldHVybnMgdGhlIE1ldHJpY3NTZXJ2aWNlQ2xpZW50LCBjcmVhdGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbgorICAvLyBjcmVhdGVkIHlldCAoYW5kIGFkZGl0aW9uYWxseSBjcmVhdGluZyB0aGUgTWV0cmljc1NlcnZpY2UgaW4gdGhhdCBjYXNlKS4KKyAgbWV0cmljczo6TWV0cmljc1NlcnZpY2VDbGllbnQqIEdldE1ldHJpY3NTZXJ2aWNlQ2xpZW50KCk7CisKKyAgLy8gUmV0dXJucyB0aGUgTWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudC4KKyAgTWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudCogR2V0TWV0cmljc1NlcnZpY2VzTWFuYWdlckNsaWVudCgpIHsKKyAgICByZXR1cm4gY2xpZW50Xy5nZXQoKTsKKyAgfQorI2VuZGlmCisKICBwcml2YXRlOgorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKICAgLy8gVXBkYXRlIHRoZSBtYW5hZ2VkIHNlcnZpY2VzIHdoZW4gcGVybWlzc2lvbnMgZm9yIHJlY29yZGluZy91cGxvYWRpbmcKICAgLy8gbWV0cmljcyBjaGFuZ2UuCiAgIHZvaWQgVXBkYXRlUmFwcG9yU2VydmljZUltcGwoKTsKQEAgLTkxLDE0ICsxMTEsMTggQEAKICAgLy8gUmV0dXJucyB0aGUgTWV0cmljc1NlcnZpY2VDbGllbnQsIGNyZWF0aW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuCiAgIC8vIGNyZWF0ZWQgeWV0IChhbmQgYWRkaXRpb25hbGx5IGNyZWF0aW5nIHRoZSBNZXRyaWNzU2VydmljZSBpbiB0aGF0IGNhc2UpLgogICBtZXRyaWNzOjpNZXRyaWNzU2VydmljZUNsaWVudCogR2V0TWV0cmljc1NlcnZpY2VDbGllbnQoKTsKKyNlbmRpZgogCiAgIG1ldHJpY3M6Ok1ldHJpY3NTdGF0ZU1hbmFnZXIqIEdldE1ldHJpY3NTdGF0ZU1hbmFnZXIoKTsKIAogICAvLyBVcGRhdGUgd2hpY2ggc2VydmljZXMgYXJlIHJ1bm5pbmcgdG8gbWF0Y2ggY3VycmVudCBwZXJtaXNzaW9ucy4KICAgdm9pZCBVcGRhdGVSdW5uaW5nU2VydmljZXMoKTsKIAorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKKyAgLy8gVE9ET0QoYi8yODQ0NjcxNDIpOiBSZS1lbmFibGUgd2hlbiBVS00gaXMgc3VwcG9ydGVkLgogICAvLyBVcGRhdGUgdGhlIHN0YXRlIG9mIFVrbVNlcnZpY2UgdG8gbWF0Y2ggY3VycmVudCBwZXJtaXNzaW9ucy4KICAgdm9pZCBVcGRhdGVVa21TZXJ2aWNlKCk7CisjZW5kaWYKIAogICAvLyBVcGRhdGUgdGhlIG1hbmFnZWQgc2VydmljZXMgd2hlbiBwZXJtaXNzaW9ucyBmb3IgcmVjb3JkaW5nL3VwbG9hZGluZwogICAvLyBtZXRyaWNzIGNoYW5nZS4KQEAgLTEyNCwxMSArMTQ4LDEzIEBACiAgIC8vIFRoZSBNZXRyaWNzU2VydmljZUNsaWVudC4gT3ducyB0aGUgTWV0cmljc1NlcnZpY2UuCiAgIHN0ZDo6dW5pcXVlX3B0cjxtZXRyaWNzOjpNZXRyaWNzU2VydmljZUNsaWVudD4gbWV0cmljc19zZXJ2aWNlX2NsaWVudF87CiAKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCiAgIC8vIFRoZSBSYXBwb3JTZXJ2aWNlSW1wbCwgZm9yIFJBUFBPUiBtZXRyaWMgdXBsb2Fkcy4KICAgc3RkOjp1bmlxdWVfcHRyPHJhcHBvcjo6UmFwcG9yU2VydmljZUltcGw+IHJhcHBvcl9zZXJ2aWNlXzsKIAogICAvLyBUaGUgVmFyaWF0aW9uc1NlcnZpY2UsIGZvciBzZXJ2ZXItc2lkZSBleHBlcmltZW50cyBpbmZyYXN0cnVjdHVyZS4KICAgc3RkOjp1bmlxdWVfcHRyPHZhcmlhdGlvbnM6OlZhcmlhdGlvbnNTZXJ2aWNlPiB2YXJpYXRpb25zX3NlcnZpY2VfOworI2VuZGlmCiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1ldHJpY3NTZXJ2aWNlc01hbmFnZXIpOwogfTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuaCBiL2NvbXBvbmVudHMvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlcl9jbGllbnQuaAppbmRleCAxMzhmMWUwLi5hZGIzNzMwIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL21ldHJpY3Nfc2VydmljZXNfbWFuYWdlci9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXJfY2xpZW50LmgKKysrIGIvY29tcG9uZW50cy9tZXRyaWNzX3NlcnZpY2VzX21hbmFnZXIvbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyX2NsaWVudC5oCkBAIC0xNCw2ICsxNCw3IEBACiBjbGFzcyBNZXRyaWNzU2VydmljZUNsaWVudDsKIH0KIAorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKIG5hbWVzcGFjZSBuZXR3b3JrIHsKIGNsYXNzIFNoYXJlZFVSTExvYWRlckZhY3Rvcnk7CiB9CkBAIC0yNSw2ICsyNiw3IEBACiBuYW1lc3BhY2UgdmFyaWF0aW9ucyB7CiBjbGFzcyBWYXJpYXRpb25zU2VydmljZTsKIH0KKyNlbmRpZgogCiBuYW1lc3BhY2UgbWV0cmljc19zZXJ2aWNlc19tYW5hZ2VyIHsKIApAQCAtMzUsMTggKzM3LDIyIEBACiAgIHZpcnR1YWwgfk1ldHJpY3NTZXJ2aWNlc01hbmFnZXJDbGllbnQoKSB7fQogCiAgIC8vIE1ldGhvZHMgdGhhdCBjcmVhdGUgdGhlIHZhcmlvdXMgc2VydmljZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVtYmVkZGVyLgorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8cmFwcG9yOjpSYXBwb3JTZXJ2aWNlSW1wbD4KICAgQ3JlYXRlUmFwcG9yU2VydmljZUltcGwoKSA9IDA7CiAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPHZhcmlhdGlvbnM6OlZhcmlhdGlvbnNTZXJ2aWNlPgogICBDcmVhdGVWYXJpYXRpb25zU2VydmljZSgpID0gMDsKKyNlbmRpZgogICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxtZXRyaWNzOjpNZXRyaWNzU2VydmljZUNsaWVudD4KICAgQ3JlYXRlTWV0cmljc1NlcnZpY2VDbGllbnQoKSA9IDA7CiAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGJhc2U6OkZpZWxkVHJpYWw6OkVudHJvcHlQcm92aWRlcj4KICAgQ3JlYXRlRW50cm9weVByb3ZpZGVyKCkgPSAwOwogCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogICAvLyBSZXR1cm5zIHRoZSBVUkwgbG9hZGVyIGZhY3Rvcnkgd2hpY2ggdGhlIG1ldHJpY3Mgc2VydmljZXMgc2hvdWxkIHVzZS4KICAgdmlydHVhbCBzY29wZWRfcmVmcHRyPG5ldHdvcms6OlNoYXJlZFVSTExvYWRlckZhY3Rvcnk+CiAgIEdldFVSTExvYWRlckZhY3RvcnkoKSA9IDA7CisjZW5kaWYKIAogICAvLyBSZXR1cm5zIHdoZXRoZXIgbWV0cmljcyByZXBvcnRpbmcgaXMgZW5hYmxlZC4KICAgdmlydHVhbCBib29sIElzTWV0cmljc1JlcG9ydGluZ0VuYWJsZWQoKSA9IDA7CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3VrbS9CVUlMRC5nbiBiL2NvbXBvbmVudHMvdWttL0JVSUxELmduCmluZGV4IDZiYjg0MjQuLmQxMDFkYWEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvdWttL0JVSUxELmduCisrKyBiL2NvbXBvbmVudHMvdWttL0JVSUxELmduCkBAIC0zOCw2ICszOCwxNCBAQAogICAgICIvL2NvbXBvbmVudHMvdmFyaWF0aW9ucyIsCiAgICAgIi8vdXJsIiwKICAgXQorCisgIGlmICh1c2VfY29iYWx0X2N1c3RvbWl6YXRpb25zKSB7CisgICAgcHVibGljX2RlcHMgLT0gWworICAgICAgIi8vc2VydmljZXMvbWV0cmljcy9wdWJsaWMvY3BwOm1ldHJpY3NfY3BwIiwKKyAgICAgICIvL3NlcnZpY2VzL21ldHJpY3MvcHVibGljL2NwcDp1a21fYnVpbGRlcnMiLAorICAgICAgIi8vc2VydmljZXMvbWV0cmljcy9wdWJsaWMvbW9qb20iLAorICAgIF0KKyAgfQogfQogCiAjIEhlbHBlciBsaWJyYXJ5IGZvciBvYnNlcnZpbmcgc2lnbmFscyB0aGF0IHdlIG5lZWQgdG8gY2xlYXIgYW55IGxvY2FsIGRhdGEuCkBAIC03OSw0MCArODcsNDMgQEAKICAgXQogfQogCi1zb3VyY2Vfc2V0KCJ1bml0X3Rlc3RzIikgewotICB0ZXN0b25seSA9IHRydWUKLSAgc291cmNlcyA9IFsKLSAgICAib2JzZXJ2ZXJzL3N5bmNfZGlzYWJsZV9vYnNlcnZlcl91bml0dGVzdC5jYyIsCi0gICAgInVrbV9zZXJ2aWNlX3VuaXR0ZXN0LmNjIiwKLSAgXQorIyBUT0RPKGIvMjgzMjc1NDc0KTogUmUtZW5hYmxlIGFzIG1hbnkgdGVzdHMgYXMgcG9zc2libGUuCitpZiAoIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKKyAgc291cmNlX3NldCgidW5pdF90ZXN0cyIpIHsKKyAgICB0ZXN0b25seSA9IHRydWUKKyAgICBzb3VyY2VzID0gWworICAgICAgIm9ic2VydmVycy9zeW5jX2Rpc2FibGVfb2JzZXJ2ZXJfdW5pdHRlc3QuY2MiLAorICAgICAgInVrbV9zZXJ2aWNlX3VuaXR0ZXN0LmNjIiwKKyAgICBdCiAKLSAgZGVwcyA9IFsKLSAgICAiOm9ic2VydmVycyIsCi0gICAgIjp0ZXN0X3N1cHBvcnQiLAotICAgICI6dWttIiwKLSAgICAiLy9iYXNlIiwKLSAgICAiLy9iYXNlL3Rlc3Q6dGVzdF9zdXBwb3J0IiwKLSAgICAiLy9jb21wb25lbnRzL21ldHJpY3MiLAotICAgICIvL2NvbXBvbmVudHMvbWV0cmljczp0ZXN0X3N1cHBvcnQiLAotICAgICIvL2NvbXBvbmVudHMvcHJlZnM6dGVzdF9zdXBwb3J0IiwKLSAgICAiLy9jb21wb25lbnRzL3N5bmMiLAotICAgICIvL2NvbXBvbmVudHMvc3luYzp0ZXN0X3N1cHBvcnRfZHJpdmVyIiwKLSAgICAiLy9jb21wb25lbnRzL3N5bmNfcHJlZmVyZW5jZXM6dGVzdF9zdXBwb3J0IiwKLSAgICAiLy9jb21wb25lbnRzL3ZhcmlhdGlvbnMiLAotICAgICIvL25ldDp0ZXN0X3N1cHBvcnQiLAotICAgICIvL3NlcnZpY2VzL21ldHJpY3MvcHVibGljL2NwcDp1a21fYnVpbGRlcnMiLAotICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAotICAgICIvL3RoaXJkX3BhcnR5L3psaWIvZ29vZ2xlOmNvbXByZXNzaW9uX3V0aWxzIiwKLSAgICAiLy91cmwiLAotICBdCi19CisgICAgZGVwcyA9IFsKKyAgICAgICI6b2JzZXJ2ZXJzIiwKKyAgICAgICI6dGVzdF9zdXBwb3J0IiwKKyAgICAgICI6dWttIiwKKyAgICAgICIvL2Jhc2UiLAorICAgICAgIi8vYmFzZS90ZXN0OnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9jb21wb25lbnRzL21ldHJpY3MiLAorICAgICAgIi8vY29tcG9uZW50cy9tZXRyaWNzOnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9jb21wb25lbnRzL3ByZWZzOnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9jb21wb25lbnRzL3N5bmMiLAorICAgICAgIi8vY29tcG9uZW50cy9zeW5jOnRlc3Rfc3VwcG9ydF9kcml2ZXIiLAorICAgICAgIi8vY29tcG9uZW50cy9zeW5jX3ByZWZlcmVuY2VzOnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9jb21wb25lbnRzL3ZhcmlhdGlvbnMiLAorICAgICAgIi8vbmV0OnRlc3Rfc3VwcG9ydCIsCisgICAgICAiLy9zZXJ2aWNlcy9tZXRyaWNzL3B1YmxpYy9jcHA6dWttX2J1aWxkZXJzIiwKKyAgICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAorICAgICAgIi8vdGhpcmRfcGFydHkvemxpYi9nb29nbGU6Y29tcHJlc3Npb25fdXRpbHMiLAorICAgICAgIi8vdXJsIiwKKyAgICBdCisgIH0KIAotIyBDb252ZW5pZW5jZSB0ZXN0aW5nIHRhcmdldAotdGVzdCgidWttX3VuaXR0ZXN0cyIpIHsKLSAgZGVwcyA9IFsKLSAgICAiOnVuaXRfdGVzdHMiLAotICAgICIvL2Jhc2UiLAotICAgICIvL2Jhc2UvdGVzdDp0ZXN0X3N1cHBvcnQiLAotICAgICIvL2NvbXBvbmVudHMvdGVzdDpydW5fYWxsX3VuaXR0ZXN0cyIsCi0gIF0KKyAgIyBDb252ZW5pZW5jZSB0ZXN0aW5nIHRhcmdldAorICB0ZXN0KCJ1a21fdW5pdHRlc3RzIikgeworICAgIGRlcHMgPSBbCisgICAgICAiOnVuaXRfdGVzdHMiLAorICAgICAgIi8vYmFzZSIsCisgICAgICAiLy9iYXNlL3Rlc3Q6dGVzdF9zdXBwb3J0IiwKKyAgICAgICIvL2NvbXBvbmVudHMvdGVzdDpydW5fYWxsX3VuaXR0ZXN0cyIsCisgICAgXQorICB9CiB9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvQlVJTEQuZ24gYi9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvQlVJTEQuZ24KaW5kZXggMWEyZmQ1Zi4uZDgzYjJlNiAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L0JVSUxELmduCisrKyBiL2NvbXBvbmVudHMvdXBkYXRlX2NsaWVudC9CVUlMRC5nbgpAQCAtMjEzLDYgKzIxMyw3IEBACiAgICAgIi8vY29tcG9uZW50cy9jcnhfZmlsZSIsCiAgICAgIi8vY29tcG9uZW50cy9wcmVmcyIsCiAgICAgIi8vY29tcG9uZW50cy9wcmVmczp0ZXN0X3N1cHBvcnQiLAorICAgICIvL2NvbXBvbmVudHMvdmVyc2lvbl9pbmZvIiwKICAgICAiLy9jcnlwdG8iLAogICAgICIvL25ldCIsCiAgICAgIi8vbmV0OnRlc3Rfc3VwcG9ydCIsCkBAIC0yNDAsMTEgKzI0MSwxNSBAQAogICAgICIvL2NvbXBvbmVudHMvcHJlZnM6dGVzdF9zdXBwb3J0IiwKICAgICAiLy9jcnlwdG8iLAogICAgICIvL25ldDp0ZXN0X3N1cHBvcnQiLAotICAgICIvL3N0YXJib2FyZC9sb2FkZXJfYXBwIiwKICAgICAiLy9zdGFyYm9hcmQvbG9hZGVyX2FwcDphcHBfa2V5X2ZpbGVzIiwKICAgICAiLy9zdGFyYm9hcmQvbG9hZGVyX2FwcDpkcmFpbl9maWxlIiwKICAgICAiLy9zdGFyYm9hcmQvbG9hZGVyX2FwcDppbnN0YWxsYXRpb25fbWFuYWdlciIsCiAgICAgIi8vdGVzdGluZy9nbW9jayIsCiAgICAgIi8vdGVzdGluZy9ndGVzdCIsCiAgIF0KKyAgaWYgKGJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbikgeworICAgIGRhdGFfZGVwcyA9IFsgIi8vc3RhcmJvYXJkL2xvYWRlcl9hcHAoJHN0YXJib2FyZF90b29sY2hhaW4pIiBdCisgIH0gZWxzZSB7CisgICAgZGVwcyArPSBbICIvL3N0YXJib2FyZC9sb2FkZXJfYXBwIiBdCisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdXBkYXRlX2NsaWVudC91bnppcC91bnppcF9pbXBsLmNjIGIvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L3VuemlwL3VuemlwX2ltcGwuY2MKaW5kZXggMWZhOTA1OC4uM2RjZmFiOCAxMDA2NDQKLS0tIGEvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L3VuemlwL3VuemlwX2ltcGwuY2MKKysrIGIvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L3VuemlwL3VuemlwX2ltcGwuY2MKQEAgLTIwLDYgKzIwLDEzIEBACiAgICAgICAgICAgICAgVW56aXBDb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZSB7CiAgICAgdW56aXA6OlVuemlwKGNhbGxiYWNrXy5SdW4oKSwgemlwX2ZpbGUsIGRlc3RpbmF0aW9uLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKICAgfQorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCisgIHZvaWQgVW56aXAoY29uc3Qgc3RkOjpzdHJpbmcmIHppcF9zdHIsCisgICAgICAgICAgICAgY29uc3QgYmFzZTo6RmlsZVBhdGgmIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgIFVuemlwQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGUgeworICAgIHVuemlwOjpVbnppcChjYWxsYmFja18uUnVuKCksIHppcF9zdHIsIGRlc3RpbmF0aW9uLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgfQorI2VuZGlmCiAKICBwcml2YXRlOgogICBjb25zdCBVbnppcENocm9taXVtRmFjdG9yeTo6Q2FsbGJhY2sgY2FsbGJhY2tfOwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L3VuemlwL3VuemlwX2ltcGxfY29iYWx0LmNjIGIvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L3VuemlwL3VuemlwX2ltcGxfY29iYWx0LmNjCmluZGV4IDQwODgyYjUuLjliN2I4MmIgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvdXBkYXRlX2NsaWVudC91bnppcC91bnppcF9pbXBsX2NvYmFsdC5jYworKysgYi9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvdW56aXAvdW56aXBfaW1wbF9jb2JhbHQuY2MKQEAgLTEsMTAgKzEsMTIgQEAKLS8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogI2luY2x1ZGUgImNvbXBvbmVudHMvdXBkYXRlX2NsaWVudC91bnppcC91bnppcF9pbXBsX2NvYmFsdC5oIgogCisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3BhdGguaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgpAQCAtMjMsNiArMjUsMTMgQEAKICAgICAgICAgICAgICBVbnppcENvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlIHsKICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLlJ1bih6aXA6OlVuemlwKHppcF9wYXRoLCBvdXRwdXRfcGF0aCkpOwogICB9CisjaWYgZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKKyAgdm9pZCBVbnppcChjb25zdCBzdGQ6OnN0cmluZyYgemlwX3N0ciwKKyAgICAgICAgICAgICBjb25zdCBiYXNlOjpGaWxlUGF0aCYgb3V0cHV0X3BhdGgsCisgICAgICAgICAgICAgVW56aXBDb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZSB7CisgICAgc3RkOjptb3ZlKGNhbGxiYWNrKS5SdW4oemlwOjpVbnppcCh6aXBfc3RyLCBvdXRwdXRfcGF0aCkpOworICB9CisjZW5kaWYKIH07CiAKIH0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy91cGRhdGVfY2xpZW50L3VuemlwcGVyLmggYi9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvdW56aXBwZXIuaAppbmRleCA2YWVkNThjLi41ZDFlNjAyIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvdW56aXBwZXIuaAorKysgYi9jb21wb25lbnRzL3VwZGF0ZV9jbGllbnQvdW56aXBwZXIuaApAQCAtMjUsNiArMjUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgIFVuemlwQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaykgPSAwOwogCisjaWYgZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKKyAgdmlydHVhbCB2b2lkIFVuemlwKGNvbnN0IHN0ZDo6c3RyaW5nJiB6aXBfc3RyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6RmlsZVBhdGgmIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgVW56aXBDb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrKSA9IDA7CisjZW5kaWYKKwogIHByb3RlY3RlZDoKICAgVW56aXBwZXIoKSA9IGRlZmF1bHQ7CiAKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvdmFyaWF0aW9ucy9CVUlMRC5nbiBiL2NvbXBvbmVudHMvdmFyaWF0aW9ucy9CVUlMRC5nbgppbmRleCAxYTQ2Mjk2Li5hZDY0YmFmIDEwMDY0NAotLS0gYS9jb21wb25lbnRzL3ZhcmlhdGlvbnMvQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy92YXJpYXRpb25zL0JVSUxELmduCkBAIC0yLDkgKzIsNyBAQAogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLWlmICghdXNlX2NvYmFsdF9jdXN0b21pemF0aW9ucykgewotICBpbXBvcnQoIi8vdGVzdGluZy90ZXN0LmduaSIpCi19CitpbXBvcnQoIi8vdGVzdGluZy90ZXN0LmduaSIpCiAKIGlmIChpc19hbmRyb2lkKSB7CiAgIGltcG9ydCgiLy9idWlsZC9jb25maWcvYW5kcm9pZC9ydWxlcy5nbmkiKQpAQCAtODksNyArODcsNyBAQAogICAgIF0KICAgfQogCi0gIGlmIChpc19hbmRyb2lkIHx8IGlzX2lvcykgeworICBpZiAoIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMgJiYgKGlzX2FuZHJvaWQgfHwgaXNfaW9zKSkgewogICAgIHNvdXJjZXMgKz0gWwogICAgICAgInZhcmlhdGlvbnNfcmVxdWVzdF9zY2hlZHVsZXJfbW9iaWxlLmNjIiwKICAgICAgICJ2YXJpYXRpb25zX3JlcXVlc3Rfc2NoZWR1bGVyX21vYmlsZS5oIiwKQEAgLTEwNiwxMiArMTA0LDEyIEBACiAgICAgIi8vdGhpcmRfcGFydHkvemxpYi9nb29nbGU6Y29tcHJlc3Npb25fdXRpbHMiLAogICBdCiAKLSAgaWYgKGlzX2FuZHJvaWQpIHsKKyAgaWYgKGlzX2FuZHJvaWQgJiYgIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgICBkZXBzICs9IFsgIjpqbmkiIF0KICAgfQogfQogCi1pZiAoaXNfYW5kcm9pZCkgeworaWYgKGlzX2FuZHJvaWQgJiYgIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgZ2VuZXJhdGVfam5pKCJqbmkiKSB7CiAgICAgc291cmNlcyA9IFsKICAgICAgICJhbmRyb2lkL2phdmEvc3JjL29yZy9jaHJvbWl1bS9jb21wb25lbnRzL3ZhcmlhdGlvbnMvVmFyaWF0aW9uc0Fzc29jaWF0ZWREYXRhLmphdmEiLApAQCAtMTMwLDI1ICsxMjgsMjUgQEAKICAgfQogfQogCi1zdGF0aWNfbGlicmFyeSgidGVzdF9zdXBwb3J0IikgewotICB0ZXN0b25seSA9IHRydWUKLSAgc291cmNlcyA9IFsKLSAgICAidmFyaWF0aW9uc19wYXJhbXNfbWFuYWdlci5jYyIsCi0gICAgInZhcmlhdGlvbnNfcGFyYW1zX21hbmFnZXIuaCIsCi0gIF0KLQotICBwdWJsaWNfZGVwcyA9IFsKLSAgICAiOnZhcmlhdGlvbnMiLAotICBdCi0KLSAgZGVwcyA9IFsKLSAgICAiZmllbGRfdHJpYWxfY29uZmlnOmZpZWxkX3RyaWFsX2NvbmZpZyIsCi0gICAgIi8vYmFzZS90ZXN0OnRlc3Rfc3VwcG9ydCIsCi0gIF0KLX0KLQogIyBUT0RPKGIvMjgzMjU4MzIxKTogUmUtZW5hYmxlIGFzIG1hbnkgdGVzdHMgYXMgcG9zaWJsZS4KIGlmICghdXNlX2NvYmFsdF9jdXN0b21pemF0aW9ucykgeworICBzdGF0aWNfbGlicmFyeSgidGVzdF9zdXBwb3J0IikgeworICAgIHRlc3Rvbmx5ID0gdHJ1ZQorICAgIHNvdXJjZXMgPSBbCisgICAgICAidmFyaWF0aW9uc19wYXJhbXNfbWFuYWdlci5jYyIsCisgICAgICAidmFyaWF0aW9uc19wYXJhbXNfbWFuYWdlci5oIiwKKyAgICBdCisKKyAgICBwdWJsaWNfZGVwcyA9IFsKKyAgICAgICI6dmFyaWF0aW9ucyIsCisgICAgXQorCisgICAgZGVwcyA9IFsKKyAgICAgICJmaWVsZF90cmlhbF9jb25maWc6ZmllbGRfdHJpYWxfY29uZmlnIiwKKyAgICAgICIvL2Jhc2UvdGVzdDp0ZXN0X3N1cHBvcnQiLAorICAgIF0KKyAgfQorCiAgIHNvdXJjZV9zZXQoInVuaXRfdGVzdHMiKSB7CiAgICAgdGVzdG9ubHkgPSB0cnVlCiAgICAgc291cmNlcyA9IFsKZGlmZiAtLWdpdCBhL2NyeXB0by9CVUlMRC5nbiBiL2NyeXB0by9CVUlMRC5nbgppbmRleCAxZWVlYmNkLi5lMTI5MmM0IDEwMDY0NAotLS0gYS9jcnlwdG8vQlVJTEQuZ24KKysrIGIvY3J5cHRvL0JVSUxELmduCkBAIC0zLDkgKzMsNyBAQAogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2NyeXB0by5nbmkiKQotaWYgKCFpc19zdGFyYm9hcmQpIHsKLSAgaW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQotfQoraW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQogCiBjb21wb25lbnQoImNyeXB0byIpIHsKICAgb3V0cHV0X25hbWUgPSAiY3JjcnlwdG8iICAjIEF2b2lkIGNvbGxpZGluZyB3aXRoIE9wZW5TU0wncyBsaWJjcnlwdG8uCmRpZmYgLS1naXQgYS9kb2NrZXItY29tcG9zZS13aW5kb3dzLWludGVybmFsLnltbCBiL2RvY2tlci1jb21wb3NlLXdpbmRvd3MtaW50ZXJuYWwueW1sCmluZGV4IGIyMWY4OTEuLjViZjA1OWEgMTAwNjQ0Ci0tLSBhL2RvY2tlci1jb21wb3NlLXdpbmRvd3MtaW50ZXJuYWwueW1sCisrKyBiL2RvY2tlci1jb21wb3NlLXdpbmRvd3MtaW50ZXJuYWwueW1sCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgIDw8OiAqc2hhcmVkLWJ1aWxkLWVudgogICAgICAgUExBVEZPUk06IHBzNAogICAgICAgVklTVUFMX1NUVURJT19WRVJTSU9OOiAiMjAyMiIKLSAgICBpbWFnZTogY29iYWx0LWJ1aWxkLXBzNAorICAgIGltYWdlOiBjb2JhbHQtYnVpbGQtcHM0LXZzMjAyMgogICAgIGRlcGVuZHNfb246CiAgICAgICAtIGNvYmFsdC1idWlsZC12czIwMjItd2luLWludGVybmFsCiAKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgICAgPDw6ICpzaGFyZWQtYnVpbGQtZW52CiAgICAgICBQTEFURk9STTogcHM1CiAgICAgICBWSVNVQUxfU1RVRElPX1ZFUlNJT046ICIyMDIyIgotICAgIGltYWdlOiBjb2JhbHQtYnVpbGQtcHM1CisgICAgaW1hZ2U6IGNvYmFsdC1idWlsZC1wczUtdnMyMDIyCiAgICAgZGVwZW5kc19vbjoKICAgICAgIC0gY29iYWx0LWJ1aWxkLXZzMjAyMi13aW4taW50ZXJuYWwKIApAQCAtMTcxLDEyICsxNzEsMTQgQEAKICAgICAgIGFyZ3M6CiAgICAgICAgIC0gZW5jb2RlZF9rZXlmaWxlPSR7RU5DT0RFRF9HU19TRVJWSUNFX0tFWV9GSUxFfQogICAgICAgICAtIEZST01fSU1BR0U9Y29iYWx0LWJ1aWxkLXZzMjAyMi13aW4taW50ZXJuYWwKKyAgICAgICAgLSB2c19idWlsZHRvb2xzX3ZlcnNpb249MTcKKyAgICAgICAgLSB3aW5kb3dzXzExX3Nka192ZXJzaW9uPTIyNjIxCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgICA8PDogKnNoYXJlZC1idWlsZC1lbnYKICAgICAgIFBMQVRGT1JNOiB4YjEKICAgICAgIENPQkFMVF9DT05DVVJSRU5UX0xJTktTOiAke0NPQkFMVF9DT05DVVJSRU5UX0xJTktTOi0xfQogICAgICAgVklTVUFMX1NUVURJT19WRVJTSU9OOiAiMjAyMiIKLSAgICBpbWFnZTogY29iYWx0LWJ1aWxkLXhiMQorICAgIGltYWdlOiBjb2JhbHQtYnVpbGQteGIxLXZzMjAyMgogICAgIGRlcGVuZHNfb246CiAgICAgICAtIGNvYmFsdC1idWlsZC12czIwMjItd2luLWludGVybmFsCiAKQEAgLTE5Miw2ICsxOTQsNiBAQAogICAgICAgPDw6ICpzaGFyZWQtYnVpbGQtZW52CiAgICAgICBQTEFURk9STTogbnhzd2l0Y2gKICAgICAgIFZJU1VBTF9TVFVESU9fVkVSU0lPTjogIjIwMjIiCi0gICAgaW1hZ2U6IGNvYmFsdC1idWlsZC1ueHN3aXRjaAorICAgIGltYWdlOiBjb2JhbHQtYnVpbGQtbnhzd2l0Y2gtdnMyMDIyCiAgICAgZGVwZW5kc19vbjoKICAgICAgIC0gY29iYWx0LWJ1aWxkLXZzMjAyMi13aW4taW50ZXJuYWwKZGlmZiAtLWdpdCBhL2RvY2tlci1jb21wb3NlLnltbCBiL2RvY2tlci1jb21wb3NlLnltbAppbmRleCAyNDVlZmY3Li5jNTE5OTkwIDEwMDY0NAotLS0gYS9kb2NrZXItY29tcG9zZS55bWwKKysrIGIvZG9ja2VyLWNvbXBvc2UueW1sCkBAIC01OCw2ICs1OCw4IEBACiAgIGJ1aWxkOgogICAgIGNvbnRleHQ6IC4vZG9ja2VyL2xpbnV4CiAgICAgZG9ja2VyZmlsZTogdW5pdHRlc3QvRG9ja2VyZmlsZQorICAgIGFyZ3M6CisgICAgICAtIENMQU5HX1ZFUj0ke0NMQU5HX1ZFUjotMzY1MDk3LWY3ZTUyZmJkLTh9CiAgIGltYWdlOiBjb2JhbHQtbGludXgteDY0eDExLXVuaXR0ZXN0CiAgIGVudmlyb25tZW50OgogICAgIC0gUExBVEZPUk09JHtQTEFURk9STTotbGludXgteDY0eDExfQpAQCAtNDM1LDggKzQzNywxMyBAQAogCiAgIGxpbnV4LXg2NHgxMS1zYnZlcnNpb24xMi1ldmVyZ3JlZW46CiAgICAgPDw6ICpidWlsZC1jb21tb24tZGVmaW5pdGlvbnMKLSAgICBpbWFnZTogY29iYWx0LWJ1aWxkLWxpbnV4LWV2ZXJncmVlbgotICAgIGRlcGVuZHNfb246IFsgYnVpbGQtbGludXgtZXZlcmdyZWVuIF0KKyAgICBidWlsZDoKKyAgICAgIGNvbnRleHQ6IC4vZG9ja2VyL2xpbnV4CisgICAgICBkb2NrZXJmaWxlOiBsaW51eC14NjR4MTEvRG9ja2VyZmlsZQorICAgICAgYXJnczoKKyAgICAgICAgLSBGUk9NX0lNQUdFPWNvYmFsdC1idWlsZC1ldmVyZ3JlZW4KKyAgICBpbWFnZTogY29iYWx0LWJ1aWxkLWxpbnV4LXg2NHgxMS1ldmVyZ3JlZW4KKyAgICBkZXBlbmRzX29uOiBbIGJ1aWxkLWV2ZXJncmVlbiBdCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgICA8PDogKnNoYXJlZC1idWlsZC1lbnYKICAgICAgIFBMQVRGT1JNOiBsaW51eC14NjR4MTEtc2J2ZXJzaW9uLTEyCkBAIC00NDUsMTEgKzQ1MiwxMSBAQAogCiAgICMgRXhhbXBsZSB1c2FnZSBvZiB1bml0dGVzdDoKICAgIyAxLiBCdWlsZCB0aGUgY29udGFpbmVycyBmb3Igd2hpY2ggeW91IHdhbnQgdG8gdW5pdHRlc3QKLSAgIyBkb2NrZXItY29tcG9zZSB1cCAtLWJ1aWxkIC0tbm8tc3RhcnQgbGludXgteDY0eDExIHVuaXR0ZXN0CisgICMgZG9ja2VyLWNvbXBvc2UgdXAgLS1idWlsZCAtLW5vLXN0YXJ0IGxpbnV4LXg2NHgxMS11bml0dGVzdAogICAjIDIuIEJ1aWxkIHRoZSAnYWxsJyB0YXJnZXQgZm9yIHRoZSBwbGF0Zm9ybSB5b3Ugd2FudCB0byB0ZXN0CiAgICMgUExBVEZPUk09bGludXgteDY0eDExIENPTkZJRz1kZXZlbCBUQVJHRVQ9YWxsIGRvY2tlci1jb21wb3NlIHJ1biBsaW51eC14NjR4MTEKICAgIyAzLiBSdW4gdGhlIHVuaXR0ZXN0cyBmb3IgdGhhdCB0YXJnZXQuCi0gICMgUExBVEZPUk09bGludXgteDY0eDExIENPTkZJRz1kZXZlbCBUQVJHRVQ9YWxsIGRvY2tlci1jb21wb3NlIHJ1biB1bml0dGVzdAorICAjIFBMQVRGT1JNPWxpbnV4LXg2NHgxMSBDT05GSUc9ZGV2ZWwgZG9ja2VyLWNvbXBvc2UgcnVuIGxpbnV4LXg2NHgxMS11bml0dGVzdAogICBsaW51eC14NjR4MTEtdW5pdHRlc3Q6CiAgICAgPDw6ICpzaGFyZWQtdW5pdHRlc3QtZGVmaW5pdGlvbnMKIApkaWZmIC0tZ2l0IGEvZG9ja2VyL2RvY3NpdGUvRG9ja2VyZmlsZSBiL2RvY2tlci9kb2NzaXRlL0RvY2tlcmZpbGUKaW5kZXggMGIyNDI0ZS4uZjRlMTU5MiAxMDA2NDQKLS0tIGEvZG9ja2VyL2RvY3NpdGUvRG9ja2VyZmlsZQorKysgYi9kb2NrZXIvZG9jc2l0ZS9Eb2NrZXJmaWxlCkBAIC0zMywxMiArMzMsNiBAQAogICAgICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAvdG1wLyogL3Zhci90bXAvKiBcCiAgICAgJiYgcm0gLXJmIC92YXIvbGliL3thcHQsZHBrZyxjYWNoZSxsb2d9CiAKLUNPUFkgR2VtZmlsZSAvYXBwL0dlbWZpbGUKLSMgTm90ZTogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgcnVubmluZyBhIHdvcmtpbmcgdmVyc2lvbiBvZiB0aGlzIERvY2tlcgotIyBjb250YWluZXIuIFRoZW4gaXQgd2FzIGNvbW1pdHRlZCBiYWNrIHRvIHRoZSBjb2RlYmFzZSB0byBiZSBjb3BpZWQgb3ZlciBhcwotIyBwYXJ0IG9mIHRoZSBidWlsZCBzdGVwcy4KLUNPUFkgR2VtZmlsZS5sb2NrIC9hcHAvR2VtZmlsZS5sb2NrCi1SVU4gYnVuZGxlIGluc3RhbGwgLS1nZW1maWxlPS9hcHAvR2VtZmlsZQogCiAjIFdlIGNyZWF0ZSBhbmQgdXNlIGEgbm9uLXJvb3QgdXNlciBleHBsaWNpdGx5IHNvIHRoYXQgdGhlIGdlbmVyYXRlZCBhbmQKICMgbW9kaWZpZWQgZmlsZXMgbWFpbnRhaW4gdGhlIHNhbWUgcGVybWlzc2lvbnMgYXMgdGhlIHVzZXIgdGhhdCBsYXVuY2hlZCB0aGUKQEAgLTUzLDYgKzQ3LDE0IEBACiBSVU4gbWtkaXIgL3Byb2plY3Rfb3V0X2RpciBcCiAgICAgJiYgY2hvd24gJHtVU0VSOi1kZWZhdWx0dXNlcn06ZGVmYXVsdGdyb3VwIC9wcm9qZWN0X291dF9kaXIKIAorCitDT1BZIEdlbWZpbGUgL2FwcC9HZW1maWxlCisjIE5vdGU6IFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgYSB3b3JraW5nIHZlcnNpb24gb2YgdGhpcyBEb2NrZXIKKyMgY29udGFpbmVyLiBUaGVuIGl0IHdhcyBjb21taXR0ZWQgYmFjayB0byB0aGUgY29kZWJhc2UgdG8gYmUgY29waWVkIG92ZXIgYXMKKyMgcGFydCBvZiB0aGUgYnVpbGQgc3RlcHMuCitDT1BZIEdlbWZpbGUubG9jayAvYXBwL0dlbWZpbGUubG9jaworUlVOIGJ1bmRsZSBpbnN0YWxsIC0tZ2VtZmlsZT0vYXBwL0dlbWZpbGUKKwogVVNFUiAke1VTRVI6LWRlZmF1bHR1c2VyfQogCiBDTUQgL2NvZGUvdGhpcmRfcGFydHkvaW50ZXJuYWwvcmVwby1wdWJsaXNoaW5nLXRvb2xraXQtbG9jYWwvcHJldmlldy1zaXRlLnNoIHJ1bgpkaWZmIC0tZ2l0IGEvZG9ja2VyL2RvY3NpdGUvR2VtZmlsZS5sb2NrIGIvZG9ja2VyL2RvY3NpdGUvR2VtZmlsZS5sb2NrCmluZGV4IDA3NGFlOGMuLjk2ZWMxNjcgMTAwNjQ0Ci0tLSBhL2RvY2tlci9kb2NzaXRlL0dlbWZpbGUubG9jaworKysgYi9kb2NrZXIvZG9jc2l0ZS9HZW1maWxlLmxvY2sKQEAgLTIsMTMgKzIsMTMgQEAKICAgcmVtb3RlOiBodHRwczovL3J1YnlnZW1zLm9yZy8KICAgc3BlY3M6CiAgICAgUmVkQ2xvdGggKDQuMi45KQotICAgIGFjdGl2ZXN1cHBvcnQgKDYuMS43LjIpCisgICAgYWN0aXZlc3VwcG9ydCAoNi4xLjcuMykKICAgICAgIGNvbmN1cnJlbnQtcnVieSAofj4gMS4wLCA+PSAxLjAuMikKICAgICAgIGkxOG4gKD49IDEuNiwgPCAyKQogICAgICAgbWluaXRlc3QgKD49IDUuMSkKICAgICAgIHR6aW5mbyAofj4gMi4wKQogICAgICAgemVpdHdlcmsgKH4+IDIuMykKLSAgICBhZGRyZXNzYWJsZSAoMi44LjEpCisgICAgYWRkcmVzc2FibGUgKDIuOC40KQogICAgICAgcHVibGljX3N1ZmZpeCAoPj0gMi4wLjIsIDwgNi4wKQogICAgIGJsYW5rc2xhdGUgKDIuMS4yLjQpCiAgICAgYm91cmJvbiAoNy4zLjApCkBAIC01Miw3ICs1Miw3IEBACiAgICAgaHRtbC1waXBlbGluZSAoMS45LjApCiAgICAgICBhY3RpdmVzdXBwb3J0ICg+PSAyKQogICAgICAgbm9rb2dpcmkgKH4+IDEuNCkKLSAgICBpMThuICgxLjEyLjApCisgICAgaTE4biAoMS4xNC4xKQogICAgICAgY29uY3VycmVudC1ydWJ5ICh+PiAxLjApCiAgICAgamVreWxsICgyLjQuMCkKICAgICAgIGNsYXNzaWZpZXItcmVib3JuICh+PiAyLjApCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBweWdtZW50cy5yYiAoMC42LjMpCiAgICAgICBwb3NpeC1zcGF3biAofj4gMC4zLjYpCiAgICAgICB5YWpsLXJ1YnkgKH4+IDEuMi4wKQotICAgIHJhY2MgKDEuNi4yKQorICAgIHJhY2MgKDEuNy4wKQogICAgIHJiLWZzZXZlbnQgKDAuMTEuMikKICAgICByYi1pbm90aWZ5ICgwLjEwLjEpCiAgICAgICBmZmkgKH4+IDEuMCkKQEAgLTEzMiwxMyArMTMyLDEzIEBACiAgICAgc2F3eWVyICgwLjkuMikKICAgICAgIGFkZHJlc3NhYmxlICg+PSAyLjMuNSkKICAgICAgIGZhcmFkYXkgKD49IDAuMTcuMywgPCAzKQotICAgIHRob3IgKDEuMi4xKQorICAgIHRob3IgKDEuMi4yKQogICAgIHRvbWwgKDAuMS4yKQogICAgICAgcGFyc2xldCAofj4gMS41LjApCiAgICAgdHppbmZvICgyLjAuNikKICAgICAgIGNvbmN1cnJlbnQtcnVieSAofj4gMS4wKQogICAgIHlhamwtcnVieSAoMS4yLjMpCi0gICAgemVpdHdlcmsgKDIuNi43KQorICAgIHplaXR3ZXJrICgyLjYuOCkKIAogUExBVEZPUk1TCiAgIHJ1YnkKZGlmZiAtLWdpdCBhL2RvY2tlci9saW51eC9hbmRyb2lkL0RvY2tlcmZpbGUgYi9kb2NrZXIvbGludXgvYW5kcm9pZC9Eb2NrZXJmaWxlCmluZGV4IDVhMTRhNjEuLjBhOTQ5YTkgMTAwNjQ0Ci0tLSBhL2RvY2tlci9saW51eC9hbmRyb2lkL0RvY2tlcmZpbGUKKysrIGIvZG9ja2VyL2xpbnV4L2FuZHJvaWQvRG9ja2VyZmlsZQpAQCAtNDgsMTEgKzQ4LDExIEBACiAgICAgICAtLXNka19yb290PSR7QU5EUk9JRF9TREtfUk9PVH0gXAogICAgICJidWlsZC10b29sczszMC4wLjAiIFwKICAgICAiYnVpbGQtdG9vbHM7MzEuMC4wIiBcCi0gICAgImNtYWtlOzMuMTAuMi40OTg4NDA0IiBcCisgICAgImNtYWtlOzMuMjIuMSIgXAogICAgICJjbWRsaW5lLXRvb2xzOzEuMCIgXAogICAgICJleHRyYXM7YW5kcm9pZDttMnJlcG9zaXRvcnkiIFwKICAgICAiZXh0cmFzO2dvb2dsZTttMnJlcG9zaXRvcnkiIFwKLSAgICAibmRrOzIxLjEuNjM1MjQ2MiIgXAorICAgICJuZGs7MjUuMi45NTE5NjUzIiBcCiAgICAgInBhdGNoZXI7djQiIFwKICAgICAicGxhdGZvcm1zO2FuZHJvaWQtMzAiIFwKICAgICAicGxhdGZvcm1zO2FuZHJvaWQtMzEiIFwKZGlmZiAtLWdpdCBhL2RvY2tlci9saW51eC9iYXNlL2J1aWxkL0RvY2tlcmZpbGUgYi9kb2NrZXIvbGludXgvYmFzZS9idWlsZC9Eb2NrZXJmaWxlCmluZGV4IDQ4ZWQ4ZWUuLjRkMDMwNmQgMTAwNjQ0Ci0tLSBhL2RvY2tlci9saW51eC9iYXNlL2J1aWxkL0RvY2tlcmZpbGUKKysrIGIvZG9ja2VyL2xpbnV4L2Jhc2UvYnVpbGQvRG9ja2VyZmlsZQpAQCAtMjYsNyArMjYsNiBAQAogICAgICAgICBuaW5qYS1idWlsZCBcCiAgICAgICAgIHBrZ2NvbmYgXAogICAgICAgICB1bnppcCBcCi0gICAgICAgIHlhc20gXAogICAgICYmIC9vcHQvY2xlYW4tYWZ0ZXItYXB0LnNoCiAKICMgPT09IEdldCBOb2RlanMgcGlubmVkIExUUyB2ZXJzaW9uIHZpYSBOVk0KQEAgLTExMSw1ICsxMTAsNyBAQAogICAgICYmIGVjaG8gJHtDTEFOR18xNl9WRVJ9ID4+ICR7Q0xBTkdfMTZfVENfSE9NRX0vY3JfYnVpbGRfcmV2aXNpb24gXAogICAgICYmIHJtIGNsYW5nLWxsdm1vcmctJHtDTEFOR18xNl9WRVJ9LnRnegogCitSVU4gZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvY29kZQorCiBXT1JLRElSIC9jb2RlCiBDTUQgWyIvdXNyL2Jpbi9weXRob24iLCItLXZlcnNpb24iXQpkaWZmIC0tZ2l0IGEvZG9ja2VyL2xpbnV4L3VuaXR0ZXN0L0RvY2tlcmZpbGUgYi9kb2NrZXIvbGludXgvdW5pdHRlc3QvRG9ja2VyZmlsZQppbmRleCBjOWY3OTE1Li4zYjhjOTAxIDEwMDY0NAotLS0gYS9kb2NrZXIvbGludXgvdW5pdHRlc3QvRG9ja2VyZmlsZQorKysgYi9kb2NrZXIvbGludXgvdW5pdHRlc3QvRG9ja2VyZmlsZQpAQCAtMTQsNiArMTQsOCBAQAogCiBGUk9NIGNvYmFsdC1iYXNlCiAKK0FSRyBIT01FPS9yb290CisKIFJVTiBhcHQgdXBkYXRlIC1xcXkgXAogICAgICYmIGFwdCBpbnN0YWxsIC1xcXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAogICAgICAgICBsaWJhc291bmQyIFwKQEAgLTM2LDYgKzM4LDIyIEBACiBDT1BZIC4vdW5pdHRlc3QvcmVxdWlyZW1lbnRzLnR4dCAvb3B0L3JlcXVpcmVtZW50cy50eHQKIFJVTiBweXRob24zIC1tIHBpcCBpbnN0YWxsIC0tcmVxdWlyZS1oYXNoZXMgLS1uby1kZXBzIC1yIC9vcHQvcmVxdWlyZW1lbnRzLnR4dAogCisjID09PSBJbnN0YWxsIENsYW5nIDE2IHRvb2xjaGFpbiBjb3ZlcmFnZSB0b29scy4KK0FSRyBUQ19ST09UPSR7SE9NRX0vc3RhcmJvYXJkLXRvb2xjaGFpbnMvCitBUkcgQ0xBTkdfMTZfVkVSPTE2LWluaXQtMTc2NTMtZzM5ZGE1NWU4LTIKK0FSRyBDTEFOR18xNl9UQ19IT01FPSR7VENfUk9PVH0veDg2XzY0LWxpbnV4LWdudS1jbGFuZy1jaHJvbWl1bS0ke0NMQU5HXzE2X1ZFUn0KK0FSRyBDTEFOR18xNl9CQVNFX1VSTD1odHRwczovL2NvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9taXVtLWJyb3dzZXItY2xhbmcKKworUlVOIGVjaG8gJHtDTEFOR18xNl9CQVNFX1VSTH0vTGludXhfeDY0L2xsdm0tY29kZS1jb3ZlcmFnZS1sbHZtb3JnLSR7Q0xBTkdfVkVSU0lPTn0udGd6CisKK1JVTiBjZCAvdG1wIFwKKyAgICAmJiBta2RpciAtcCAke0NMQU5HXzE2X1RDX0hPTUV9IFwKKyAgICAmJiBjdXJsIC0tc2lsZW50IC1PIC1KIFwKKyAgICAgICAgJHtDTEFOR18xNl9CQVNFX1VSTH0vTGludXhfeDY0L2xsdm0tY29kZS1jb3ZlcmFnZS1sbHZtb3JnLSR7Q0xBTkdfMTZfVkVSfS50Z3ogXAorICAgICYmIHRhciB4ZiBsbHZtLWNvZGUtY292ZXJhZ2UtbGx2bW9yZy0ke0NMQU5HXzE2X1ZFUn0udGd6IC1DICR7Q0xBTkdfMTZfVENfSE9NRX0gXAorICAgICYmIGVjaG8gJHtDTEFOR18xNl9WRVJ9ID4+ICR7Q0xBTkdfMTZfVENfSE9NRX0vY3JfYnVpbGRfcmV2aXNpb24gXAorICAgICYmIHJtIGxsdm0tY29kZS1jb3ZlcmFnZS1sbHZtb3JnLSR7Q0xBTkdfMTZfVkVSfS50Z3oKKwogV09SS0RJUiAvb3V0CiAjIFNldHMgdGhlIGxvY2FsZSBpbiB0aGUgZW52aXJvbm1lbnQuIFRoaXMgaXMgbmVlZGVkIGZvciBOUExCIHVuaXQgdGVzdHMuCiBFTlYgTEFORyBlbl9VUy5VVEYtOApkaWZmIC0tZ2l0IGEvZG9ja2VyL3dpbmRvd3MvYmFzZS9idWlsZC9Eb2NrZXJmaWxlIGIvZG9ja2VyL3dpbmRvd3MvYmFzZS9idWlsZC9Eb2NrZXJmaWxlCmluZGV4IGQ0MDFiYTcuLjE5NTI3NzMgMTAwNjQ0Ci0tLSBhL2RvY2tlci93aW5kb3dzL2Jhc2UvYnVpbGQvRG9ja2VyZmlsZQorKysgYi9kb2NrZXIvd2luZG93cy9iYXNlL2J1aWxkL0RvY2tlcmZpbGUKQEAgLTI5LDYgKzI5LDggQEAKICMgb2YgdGhlIGV4ZWN1dGlvbiwgaS5lLiB0aGUgZnVsbCBpbnZvY2F0aW9uIHN0cmluZy4KIENPUFkgLi9saXN0X3B5dGhvbl9wcm9jZXNzZXMucHkgL2xpc3RfcHl0aG9uX3Byb2Nlc3Nlcy5weQogCisjIFBpbiBDaG9jbyB0byAxLjQuMCB0byBhdm9pZCByZXF1aXJlZCByZWJvb3QgaW4gMi4wLjAKK0VOViBjaG9jb2xhdGV5VmVyc2lvbiAnMS40LjAnCiAjIEluc3RhbGwgZGVwcyB2aWEgY2hvY29sYXRleS4KIFJVTiBpZXggKChOZXctT2JqZWN0IFN5c3RlbS5OZXQuV2ViQ2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly9jaG9jb2xhdGV5Lm9yZy9pbnN0YWxsLnBzMScpKTtgCiAgICAgbWtkaXIgQzpcY2hvY28tY2FjaGU7YApkaWZmIC0tZ2l0IGEvbmV0L2NlcnQvaW50ZXJuYWwvY2VydF9pc3N1ZXJfc291cmNlX3N5bmNfdW5pdHRlc3QuaCBiL25ldC9jZXJ0L2ludGVybmFsL2NlcnRfaXNzdWVyX3NvdXJjZV9zeW5jX3VuaXR0ZXN0LmgKaW5kZXggY2YzZWI0Mi4uYTRjNGFhNyAxMDA2NDQKLS0tIGEvbmV0L2NlcnQvaW50ZXJuYWwvY2VydF9pc3N1ZXJfc291cmNlX3N5bmNfdW5pdHRlc3QuaAorKysgYi9uZXQvY2VydC9pbnRlcm5hbC9jZXJ0X2lzc3Vlcl9zb3VyY2Vfc3luY191bml0dGVzdC5oCkBAIC0xOTAsNiArMTkwLDcgQEAKIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENlcnRJc3N1ZXJTb3VyY2VTeW5jTm9ybWFsaXphdGlvblRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZU1hdGNoZXNBZnRlck5vcm1hbGl6YXRpb24pOwogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoQ2VydElzc3VlclNvdXJjZVN5bmNOb3ROb3JtYWxpemVkVGVzdCk7CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVzdERlbGVnYXRlPgogY2xhc3MgQ2VydElzc3VlclNvdXJjZVN5bmNOb3ROb3JtYWxpemVkVGVzdAogICAgIDogcHVibGljIENlcnRJc3N1ZXJTb3VyY2VTeW5jVGVzdDxUZXN0RGVsZWdhdGU+IHt9OwpkaWZmIC0tZ2l0IGEvbmV0L3RoaXJkX3BhcnR5L25pc3QtcGtpdHMvcGtpdHNfdGVzdGNhc2VzLWlubC5oIGIvbmV0L3RoaXJkX3BhcnR5L25pc3QtcGtpdHMvcGtpdHNfdGVzdGNhc2VzLWlubC5oCmluZGV4IDg0MWE5M2UuLmMxYzdkNWUgMTAwNjQ0Ci0tLSBhL25ldC90aGlyZF9wYXJ0eS9uaXN0LXBraXRzL3BraXRzX3Rlc3RjYXNlcy1pbmwuaAorKysgYi9uZXQvdGhpcmRfcGFydHkvbmlzdC1wa2l0cy9wa2l0c190ZXN0Y2FzZXMtaW5sLmgKQEAgLTM5NCw2ICszOTQsNyBAQAogICAgIFNlY3Rpb24zVmFsaWRSb2xsb3ZlcmZyb21QcmludGFibGVTdHJpbmd0b1VURjhTdHJpbmdUZXN0MTAsCiAgICAgU2VjdGlvbjNWYWxpZFVURjhTdHJpbmdDYXNlSW5zZW5zaXRpdmVNYXRjaFRlc3QxMSk7CiAKK0dURVNUX0FMTE9XX1VOSU5TVEFOVElBVEVEX1BBUkFNRVRFUklaRURfVEVTVChQa2l0c1Rlc3QwNEJhc2ljQ2VydGlmaWNhdGVSZXZvY2F0aW9uVGVzdHMpOwogdGVtcGxhdGUgPHR5cGVuYW1lIFBraXRzVGVzdERlbGVnYXRlPgogY2xhc3MgUGtpdHNUZXN0MDRCYXNpY0NlcnRpZmljYXRlUmV2b2NhdGlvblRlc3RzCiAgICAgOiBwdWJsaWMgUGtpdHNUZXN0PFBraXRzVGVzdERlbGVnYXRlPiB7fTsKQEAgLTcyOSw2ICs3MzAsNyBAQAogICAgIFNlY3Rpb240SW52YWxpZFNlcGFyYXRlQ2VydGlmaWNhdGVhbmRDUkxLZXlzVGVzdDIwLAogICAgIFNlY3Rpb240SW52YWxpZFNlcGFyYXRlQ2VydGlmaWNhdGVhbmRDUkxLZXlzVGVzdDIxKTsKIAorR1RFU1RfQUxMT1dfVU5JTlNUQU5USUFURURfUEFSQU1FVEVSSVpFRF9URVNUKFBraXRzVGVzdDA1VmVyaWZ5aW5nUGF0aHN3aXRoU2VsZklzc3VlZENlcnRpZmljYXRlcyk7CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGtpdHNUZXN0RGVsZWdhdGU+CiBjbGFzcyBQa2l0c1Rlc3QwNVZlcmlmeWluZ1BhdGhzd2l0aFNlbGZJc3N1ZWRDZXJ0aWZpY2F0ZXMKICAgICA6IHB1YmxpYyBQa2l0c1Rlc3Q8UGtpdHNUZXN0RGVsZWdhdGU+IHt9OwpAQCAtMzQyMSw2ICszNDIzLDggQEAKICAgICBTZWN0aW9uMTNJbnZhbGlkVVJJbmFtZUNvbnN0cmFpbnRzVGVzdDM3LAogICAgIFNlY3Rpb24xM0ludmFsaWRETlNuYW1lQ29uc3RyYWludHNUZXN0MzgpOwogCisKK0dURVNUX0FMTE9XX1VOSU5TVEFOVElBVEVEX1BBUkFNRVRFUklaRURfVEVTVChQa2l0c1Rlc3QxNERpc3RyaWJ1dGlvblBvaW50cyk7CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGtpdHNUZXN0RGVsZWdhdGU+CiBjbGFzcyBQa2l0c1Rlc3QxNERpc3RyaWJ1dGlvblBvaW50cyA6IHB1YmxpYyBQa2l0c1Rlc3Q8UGtpdHNUZXN0RGVsZWdhdGU+IHt9OwogVFlQRURfVEVTVF9DQVNFX1AoUGtpdHNUZXN0MTREaXN0cmlidXRpb25Qb2ludHMpOwpAQCAtMzk3Miw2ICszOTc2LDcgQEAKICAgICBTZWN0aW9uMTRJbnZhbGlkY1JMSXNzdWVyVGVzdDM0LAogICAgIFNlY3Rpb24xNEludmFsaWRjUkxJc3N1ZXJUZXN0MzUpOwogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoUGtpdHNUZXN0MTVEZWx0YUNSTHMpOwogdGVtcGxhdGUgPHR5cGVuYW1lIFBraXRzVGVzdERlbGVnYXRlPgogY2xhc3MgUGtpdHNUZXN0MTVEZWx0YUNSTHMgOiBwdWJsaWMgUGtpdHNUZXN0PFBraXRzVGVzdERlbGVnYXRlPiB7fTsKIFRZUEVEX1RFU1RfQ0FTRV9QKFBraXRzVGVzdDE1RGVsdGFDUkxzKTsKZGlmZiAtLWdpdCBhL25ldC90aGlyZF9wYXJ0eS9xdWljL2NvcmUvY3J5cHRvL2NyeXB0b19zZXJ2ZXJfdGVzdC5jYyBiL25ldC90aGlyZF9wYXJ0eS9xdWljL2NvcmUvY3J5cHRvL2NyeXB0b19zZXJ2ZXJfdGVzdC5jYwppbmRleCA1YWQ4NzVkLi42MGNiNmQ5IDEwMDY0NAotLS0gYS9uZXQvdGhpcmRfcGFydHkvcXVpYy9jb3JlL2NyeXB0by9jcnlwdG9fc2VydmVyX3Rlc3QuY2MKKysrIGIvbmV0L3RoaXJkX3BhcnR5L3F1aWMvY29yZS9jcnlwdG8vY3J5cHRvX3NlcnZlcl90ZXN0LmNjCkBAIC0xMTAxLDYgKzExMDEsNyBAQAogICBFWFBFQ1RfRVEoMCwgbWVtY21wKGRpZ2VzdCwgc2NpZF9zdHIuY19zdHIoKSwgc2NpZC5zaXplKCkpKTsKIH0KIAorR1RFU1RfQUxMT1dfVU5JTlNUQU5USUFURURfUEFSQU1FVEVSSVpFRF9URVNUKENyeXB0b1NlcnZlclRlc3ROb0NvbmZpZyk7CiBjbGFzcyBDcnlwdG9TZXJ2ZXJUZXN0Tm9Db25maWcgOiBwdWJsaWMgQ3J5cHRvU2VydmVyVGVzdCB7CiAgcHVibGljOgogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewpAQCAtMTEyMCw2ICsxMTIxLDcgQEAKICAgQ2hlY2tSZWplY3RSZWFzb25zKGtSZWplY3RSZWFzb25zLCBRVUlDX0FSUkFZU0laRShrUmVqZWN0UmVhc29ucykpOwogfQogCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoQ3J5cHRvU2VydmVyVGVzdE9sZFZlcnNpb24pOwogY2xhc3MgQ3J5cHRvU2VydmVyVGVzdE9sZFZlcnNpb24gOiBwdWJsaWMgQ3J5cHRvU2VydmVyVGVzdCB7CiAgcHVibGljOgogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewpkaWZmIC0tZ2l0IGEvbmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyX2NvcmUuY2MgYi9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfY29yZS5jYwppbmRleCBlOWUxODkxLi4zOTUxMmVkIDEwMDY0NAotLS0gYS9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfY29yZS5jYworKysgYi9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfY29yZS5jYwpAQCAtMTc0LDggKzE3NCw5IEBACiB9CiAKIHZvaWQgVVJMRmV0Y2hlckNvcmU6OlN0b3AoKSB7Ci0gIGlmIChkZWxlZ2F0ZV90YXNrX3J1bm5lcl8pICAvLyBNYXkgYmUgTlVMTCBpbiB0ZXN0cy4KKyAgaWYgKGRlbGVnYXRlX3Rhc2tfcnVubmVyXykgeyAgLy8gTWF5IGJlIE5VTEwgaW4gdGVzdHMuCiAgICAgRENIRUNLKGRlbGVnYXRlX3Rhc2tfcnVubmVyXy0+UnVuc1Rhc2tzSW5DdXJyZW50U2VxdWVuY2UoKSk7CisgIH0KIAogICBkZWxlZ2F0ZV8gPSBOVUxMOwogICBmZXRjaGVyXyA9IE5VTEw7CkBAIC03ODIsOCArNzgzLDExIEBACiAgIGlmICghZXh0cmFfcmVxdWVzdF9oZWFkZXJzXy5Jc0VtcHR5KCkpCiAgICAgcmVxdWVzdF8tPlNldEV4dHJhUmVxdWVzdEhlYWRlcnMoZXh0cmFfcmVxdWVzdF9oZWFkZXJzXyk7CiAKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKICAgcmVxdWVzdF8tPlNldExvYWRUaW1pbmdJbmZvQ2FsbGJhY2soYmFzZTo6QmluZCgmVVJMRmV0Y2hlckNvcmU6OkdldExvYWRUaW1pbmdJbmZvLAogICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOworI2VuZGlmCisKICAgcmVxdWVzdF8tPlN0YXJ0KCk7CiB9CiAKQEAgLTExMzIsNiArMTEzNiwxNCBAQAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQogdm9pZCBVUkxGZXRjaGVyQ29yZTo6R2V0TG9hZFRpbWluZ0luZm8oCiAgICAgY29uc3QgbmV0OjpMb2FkVGltaW5nSW5mbyYgdGltaW5nX2luZm8pIHsKKyAgZGVsZWdhdGVfdGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJlVSTEZldGNoZXJDb3JlOjpHZXRMb2FkVGltaW5nSW5mb0luRGVsZWdhdGVUaHJlYWQsCisgICAgICAgICAgICAgICAgIHRoaXMsIHRpbWluZ19pbmZvKSk7Cit9CisKK3ZvaWQgVVJMRmV0Y2hlckNvcmU6OkdldExvYWRUaW1pbmdJbmZvSW5EZWxlZ2F0ZVRocmVhZCgKKyAgICBjb25zdCBuZXQ6OkxvYWRUaW1pbmdJbmZvJiB0aW1pbmdfaW5mbykgewogICAvLyBDaGVjayBpZiB0aGUgVVJMRmV0Y2hlckNvcmUgaGFzIGJlZW4gc3RvcHBlZCBiZWZvcmUuCiAgIGlmIChkZWxlZ2F0ZV8pIHsKICAgICBkZWxlZ2F0ZV8tPlJlcG9ydExvYWRUaW1pbmdJbmZvKHRpbWluZ19pbmZvKTsKZGlmZiAtLWdpdCBhL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9jb3JlLmggYi9uZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfY29yZS5oCmluZGV4IDJkZjA0OWYuLjdjMWJiY2IgMTAwNjQ0Ci0tLSBhL25ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlcl9jb3JlLmgKKysrIGIvbmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyX2NvcmUuaApAQCAtMTY1LDYgKzE2NSw3IEBACiAgIHN0YXRpYyB2b2lkIFNldElnbm9yZUNlcnRpZmljYXRlUmVxdWVzdHMoYm9vbCBpZ25vcmVkKTsKICNpZiBkZWZpbmVkIChTVEFSQk9BUkQpCiAgIHZvaWQgR2V0TG9hZFRpbWluZ0luZm8oY29uc3QgbmV0OjpMb2FkVGltaW5nSW5mbyYgdGltaW5nX2luZm8pOworICB2b2lkIEdldExvYWRUaW1pbmdJbmZvSW5EZWxlZ2F0ZVRocmVhZChjb25zdCBuZXQ6OkxvYWRUaW1pbmdJbmZvJiB0aW1pbmdfaW5mbyk7CiAjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQogIHByaXZhdGU6CiAgIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxVUkxGZXRjaGVyQ29yZT47CmRpZmYgLS1naXQgYS9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfY2hhbm5lbF90ZXN0LmNjIGIvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2NoYW5uZWxfdGVzdC5jYwppbmRleCAwMjBlNTBiLi41ZTk4ZDRhIDEwMDY0NAotLS0gYS9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfY2hhbm5lbF90ZXN0LmNjCisrKyBiL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9jaGFubmVsX3Rlc3QuY2MKQEAgLTExNSw2ICsxMTUsNyBAQAogCiB1c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKIHVzaW5nIDo6dGVzdGluZzo6RGVmYXVsdFZhbHVlOwordXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKIHVzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKIHVzaW5nIDo6dGVzdGluZzo6TW9ja0Z1bmN0aW9uOwogdXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL0JVSUxELmduIGIvc3RhcmJvYXJkL0JVSUxELmduCmluZGV4IGNkOTY2NGEuLjgyMjdhOGUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvQlVJTEQuZ24KQEAgLTEyLDYgKzEyLDggQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAoraW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC9jb25maWcvc3RhcmJvYXJkX3RhcmdldF90eXBlLmduaSIpCisKIGdyb3VwKCJnbl9hbGwiKSB7CiAgIHRlc3Rvbmx5ID0gdHJ1ZQogCkBAIC0zOSwxNSArNDEsMTUgQEAKICAgfQogCiAgIGlmIChwbGF0Zm9ybV90ZXN0c19wYXRoID09ICIiKSB7Ci0gICAgZGVwcyArPSBbICI6c3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzIiBdCisgICAgZGVwcyArPSBbICI6c3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzKCRzdGFyYm9hcmRfdG9vbGNoYWluKSIgXQogICB9IGVsc2UgewogICAgIGRlcHMgKz0gWyBwbGF0Zm9ybV90ZXN0c19wYXRoIF0KICAgfQogCiAgIGlmIChzYl9maWx0ZXJfYmFzZWRfcGxheWVyKSB7CiAgICAgZGVwcyArPSBbCi0gICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3Rpbmc6cGxheWVyX2ZpbHRlcl90ZXN0cyIsCi0gICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rvb2xzOmF1ZGlvX2RtcF9wbGF5ZXIiLAorICAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nOnBsYXllcl9maWx0ZXJfdGVzdHMoJHN0YXJib2FyZF90b29sY2hhaW4pIiwKKyAgICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdG9vbHM6YXVkaW9fZG1wX3BsYXllcigkc3RhcmJvYXJkX3Rvb2xjaGFpbikiLAogICAgIF0KICAgfQogCkBAIC05NSwxOSArOTcsMjUgQEAKICAgICAgICIvL3RoaXJkX3BhcnR5L2xsdm0tcHJvamVjdC9jb21waWxlci1ydDpjb21waWxlcl9ydCIsCiAgICAgICAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGliY3h4OmN4eCIsCiAgICAgICAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGliY3h4YWJpOmN4eGFiaSIsCi0gICAgICAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGlidW53aW5kOnVud2luZF9ldmVyZ3JlZW4iLAogICAgICAgIi8vdGhpcmRfcGFydHkvbXVzbDpjIiwKICAgICBdCisgICAgaWYgKGJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbikgeworICAgICAgZGF0YV9kZXBzID0gWyAiOnN0YXJib2FyZF9wbGF0Zm9ybV9ncm91cCgkc3RhcmJvYXJkX3Rvb2xjaGFpbikiIF0KKyAgICB9IGVsc2UgeworICAgICAgcHVibGljX2RlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGlidW53aW5kOnVud2luZF9ldmVyZ3JlZW4iIF0KKyAgICB9CiAgIH0gZWxzZSB7CiAgICAgcHVibGljX2RlcHMgKz0gWwotICAgICAgIi8vJHN0YXJib2FyZF9wYXRoOnN0YXJib2FyZF9wbGF0Zm9ybSIsCisgICAgICAiOnN0YXJib2FyZF9wbGF0Zm9ybV9ncm91cCgkc3RhcmJvYXJkX3Rvb2xjaGFpbikiLAogICAgICAgIi8vc3RhcmJvYXJkL2NvbW1vbiIsCiAgICAgXQogCi0gICAgaWYgKHNiX2lzX2V2ZXJncmVlbl9jb21wYXRpYmxlKSB7Ci0gICAgICBwdWJsaWNfZGVwcyArPSBbICIvL3RoaXJkX3BhcnR5L2NyYXNocGFkL3dyYXBwZXIiIF0KLSAgICB9IGVsc2UgewotICAgICAgcHVibGljX2RlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9jcmFzaHBhZC93cmFwcGVyOndyYXBwZXJfc3R1YiIgXQorICAgIGlmICghYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluKSB7CisgICAgICBpZiAoc2JfaXNfZXZlcmdyZWVuX2NvbXBhdGlibGUpIHsKKyAgICAgICAgcHVibGljX2RlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9jcmFzaHBhZC93cmFwcGVyIiBdCisgICAgICB9IGVsc2UgeworICAgICAgICBwdWJsaWNfZGVwcyArPSBbICIvL3RoaXJkX3BhcnR5L2NyYXNocGFkL3dyYXBwZXI6d3JhcHBlcl9zdHViIiBdCisgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGZpbmFsX2V4ZWN1dGFibGVfdHlwZSA9PSAic2hhcmVkX2xpYnJhcnkiICYmCkBAIC0xNjgsMTcgKzE3Niw0MCBAQAogICB9CiB9CiAKLWlmIChwbGF0Zm9ybV90ZXN0c19wYXRoID09ICIiKSB7Ci0gICMgSWYgJ3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cycgaXMgbm90IGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLCB0aGVuIGFuCi0gICMgZW1wdHkgJ3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cycgdGFyZ2V0IGlzIGRlZmluZWQuCi0gIHRhcmdldChndGVzdF90YXJnZXRfdHlwZSwgInN0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cyIpIHsKLSAgICB0ZXN0b25seSA9IHRydWUKLQotICAgIHNvdXJjZXMgPSBbICIvL3N0YXJib2FyZC9jb21tb24vdGVzdF9tYWluLmNjIiBdCi0KK2lmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBzdGFyYm9hcmRfdG9vbGNoYWluKSB7CisgIHRhcmdldChzdGFyYm9hcmRfdGFyZ2V0X3R5cGUsICJzdGFyYm9hcmRfcGxhdGZvcm1fZ3JvdXAiKSB7CisgICAgaWYgKHN0YXJib2FyZF90YXJnZXRfdHlwZSA9PSAic2hhcmVkX2xpYnJhcnkiKSB7CisgICAgICBidWlsZF9sb2FkZXIgPSBmYWxzZQorICAgIH0KICAgICBwdWJsaWNfZGVwcyA9IFsKLSAgICAgICI6c3RhcmJvYXJkIiwKLSAgICAgICIvL3Rlc3RpbmcvZ21vY2siLAorICAgICAgIi8vc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL2N3cmFwcGVycyIsCisgICAgICAiLy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvZXp0aW1lIiwKKyAgICAgICIvL3N0YXJib2FyZC9jb21tb24iLAorICAgICAgIi8vc3RhcmJvYXJkL2VnbF9hbmRfZ2xlcyIsCiAgICAgXQorICAgIGlmIChzYl9pc19ldmVyZ3JlZW5fY29tcGF0aWJsZSkgeworICAgICAgcHVibGljX2RlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9jcmFzaHBhZC93cmFwcGVyIiBdCisgICAgfSBlbHNlIHsKKyAgICAgIHB1YmxpY19kZXBzICs9IFsgIi8vdGhpcmRfcGFydHkvY3Jhc2hwYWQvd3JhcHBlcjp3cmFwcGVyX3N0dWIiIF0KKyAgICB9CisgICAgaWYgKCFzYl9pc19ldmVyZ3JlZW4pIHsKKyAgICAgIHB1YmxpY19kZXBzICs9IFsgIi8vJHN0YXJib2FyZF9wYXRoOnN0YXJib2FyZF9wbGF0Zm9ybSIgXQorICAgIH0KKyAgfQorCisgIGlmIChwbGF0Zm9ybV90ZXN0c19wYXRoID09ICIiKSB7CisgICAgIyBJZiAnc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzJyBpcyBub3QgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0sIHRoZW4gYW4KKyAgICAjIGVtcHR5ICdzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMnIHRhcmdldCBpcyBkZWZpbmVkLgorICAgIHRhcmdldChzdGFyYm9hcmRfbGV2ZWxfZ3Rlc3RfdGFyZ2V0X3R5cGUsICJzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMiKSB7CisgICAgICB0ZXN0b25seSA9IHRydWUKKworICAgICAgc291cmNlcyA9IFsgIi8vc3RhcmJvYXJkL2NvbW1vbi90ZXN0X21haW4uY2MiIF0KKworICAgICAgcHVibGljX2RlcHMgPSBbCisgICAgICAgICI6c3RhcmJvYXJkIiwKKyAgICAgICAgIi8vdGVzdGluZy9nbW9jayIsCisgICAgICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAorICAgICAgXQorICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZCBiL3N0YXJib2FyZC9DSEFOR0VMT0cubWQKaW5kZXggNjFlYzYwYi4uZjExM2E1ZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZAorKysgYi9zdGFyYm9hcmQvQ0hBTkdFTE9HLm1kCkBAIC0xMDAsNiArMTAwLDkgQEAKICMjIyBEZXByZWNhdGVkIGtTYkhhc0FjM0F1ZGlvCiBUaGlzIGNvbnN0YW50IGlzIG5vIGxvbmdlciB1c2VkIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogCisjIyMgUmVtb3ZlZCBCSUxJTkVBUl9GSUxURVJJTkdfU1VQUE9SVCBjb25maWcKK1RoZSB1bnVzZWQgbWFjcm8gZm9yIFNCX0hBU19CSUxJTkVBUl9GSUxURVJJTkdfU1VQUE9SVCBmZWF0dXJlIGhhcyBiZWVuIHJlbW92ZWQuCisKICMjIFZlcnNpb24gMTQKICMjIyBBZGQgTVAzLCBGTEFDLCBhbmQgUENNIHZhbHVlcyB0byBTYk1lZGlhQXVkaW9Db2RlYy4KIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3VwcG9ydCB0aGVzZSBjb2RlY3MgaW4gdGhlIGZ1dHVyZS4KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L21lZGlhL01lZGlhQ29kZWNCcmlkZ2UuamF2YSBiL3N0YXJib2FyZC9hbmRyb2lkL2Fway9hcHAvc3JjL21haW4vamF2YS9kZXYvY29iYWx0L21lZGlhL01lZGlhQ29kZWNCcmlkZ2UuamF2YQppbmRleCAxNDc4YjM3Li45ZmJmMDkwIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYXBwL3NyYy9tYWluL2phdmEvZGV2L2NvYmFsdC9tZWRpYS9NZWRpYUNvZGVjQnJpZGdlLmphdmEKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2FwcC9zcmMvbWFpbi9qYXZhL2Rldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZS5qYXZhCkBAIC01OTEsNiArNTkxLDggQEAKICAgICAgIGludCB3aWR0aCwKICAgICAgIGludCBoZWlnaHQsCiAgICAgICBpbnQgZnBzLAorICAgICAgaW50IG1heFdpZHRoLAorICAgICAgaW50IG1heEhlaWdodCwKICAgICAgIFN1cmZhY2Ugc3VyZmFjZSwKICAgICAgIE1lZGlhQ3J5cHRvIGNyeXB0bywKICAgICAgIENvbG9ySW5mbyBjb2xvckluZm8sCkBAIC02NzEsMTAgKzY3MywzNSBAQAogICAgICAgTG9nLmQoVEFHLCAiRW5hYmxlZCB0dW5uZWwgbW9kZSBwbGF5YmFjayBvbiBhdWRpbyBzZXNzaW9uICIgKyB0dW5uZWxNb2RlQXVkaW9TZXNzaW9uSWQpOwogICAgIH0KIAotICAgIGludCBtYXhXaWR0aCA9IHZpZGVvQ2FwYWJpbGl0aWVzLmdldFN1cHBvcnRlZFdpZHRocygpLmdldFVwcGVyKCk7Ci0gICAgaW50IG1heEhlaWdodCA9IHZpZGVvQ2FwYWJpbGl0aWVzLmdldFN1cHBvcnRlZEhlaWdodHMoKS5nZXRVcHBlcigpOworICAgIGlmIChtYXhXaWR0aCA+IDAgJiYgbWF4SGVpZ2h0ID4gMCkgeworICAgICAgTG9nLmkoVEFHLCAiRXZhbHVhdGUgbWF4V2lkdGggYW5kIG1heEhlaWdodCAoJWQsICVkKSBwYXNzZWQgaW4iLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgbWF4V2lkdGggPSB2aWRlb0NhcGFiaWxpdGllcy5nZXRTdXBwb3J0ZWRXaWR0aHMoKS5nZXRVcHBlcigpOworICAgICAgbWF4SGVpZ2h0ID0gdmlkZW9DYXBhYmlsaXRpZXMuZ2V0U3VwcG9ydGVkSGVpZ2h0cygpLmdldFVwcGVyKCk7CisgICAgICBMb2cuaSgKKyAgICAgICAgICBUQUcsCisgICAgICAgICAgIm1heFdpZHRoIGFuZCBtYXhIZWlnaHQgbm90IHBhc3NlZCBpbiwgdXNpbmcgcmVzdWx0IG9mIGdldFN1cHBvcnRlZFdpZHRocygpL0hlaWdodHMoKSIKKyAgICAgICAgICAgICAgKyAiICglZCwgJWQpIiwKKyAgICAgICAgICBtYXhXaWR0aCwKKyAgICAgICAgICBtYXhIZWlnaHQpOworICAgIH0KKwogICAgIGlmIChmcHMgPiAwKSB7Ci0gICAgICBpZiAoIXZpZGVvQ2FwYWJpbGl0aWVzLmFyZVNpemVBbmRSYXRlU3VwcG9ydGVkKG1heFdpZHRoLCBtYXhIZWlnaHQsIGZwcykpIHsKKyAgICAgIGlmICh2aWRlb0NhcGFiaWxpdGllcy5hcmVTaXplQW5kUmF0ZVN1cHBvcnRlZChtYXhXaWR0aCwgbWF4SGVpZ2h0LCBmcHMpKSB7CisgICAgICAgIExvZy5pKAorICAgICAgICAgICAgVEFHLAorICAgICAgICAgICAgIlNldCBtYXhXaWR0aCBhbmQgbWF4SGVpZ2h0IHRvICglZCwgJWQpQCVkIHBlciBgYXJlU2l6ZUFuZFJhdGVTdXBwb3J0ZWQoKWAiLAorICAgICAgICAgICAgbWF4V2lkdGgsCisgICAgICAgICAgICBtYXhIZWlnaHQsCisgICAgICAgICAgICBmcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTG9nLncoCisgICAgICAgICAgICBUQUcsCisgICAgICAgICAgICAibWF4V2lkdGggYW5kIG1heEhlaWdodCAoJWQsICVkKUAlZCBub3Qgc3VwcG9ydGVkIHBlciBgYXJlU2l6ZUFuZFJhdGVTdXBwb3J0ZWQoKWAsIgorICAgICAgICAgICAgICAgICsgIiBjb250aW51ZSBzZWFyY2hpbmciLAorICAgICAgICAgICAgbWF4V2lkdGgsCisgICAgICAgICAgICBtYXhIZWlnaHQsCisgICAgICAgICAgICBmcHMpOwogICAgICAgICBpZiAobWF4SGVpZ2h0ID49IDQzMjAgJiYgdmlkZW9DYXBhYmlsaXRpZXMuYXJlU2l6ZUFuZFJhdGVTdXBwb3J0ZWQoNzY4MCwgNDMyMCwgZnBzKSkgewogICAgICAgICAgIG1heFdpZHRoID0gNzY4MDsKICAgICAgICAgICBtYXhIZWlnaHQgPSA0MzIwOwpAQCAtNjkxLDE4ICs3MTgsNDAgQEAKICAgICAgICAgICBtYXhXaWR0aCA9IDE5MjA7CiAgICAgICAgICAgbWF4SGVpZ2h0ID0gMTA4MDsKICAgICAgICAgfQorICAgICAgICBMb2cuaSgKKyAgICAgICAgICAgIFRBRywKKyAgICAgICAgICAgICJTZXQgbWF4V2lkdGggYW5kIG1heEhlaWdodCB0byAoJWQsICVkKUAlZCBwZXIgYGFyZVNpemVBbmRSYXRlU3VwcG9ydGVkKClgIiwKKyAgICAgICAgICAgIG1heFdpZHRoLAorICAgICAgICAgICAgbWF4SGVpZ2h0LAorICAgICAgICAgICAgZnBzKTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgaWYgKG1heEhlaWdodCA+PSAyMTYwICYmIHZpZGVvQ2FwYWJpbGl0aWVzLmlzU2l6ZVN1cHBvcnRlZCgzODQwLCAyMTYwKSkgewotICAgICAgICBtYXhXaWR0aCA9IDM4NDA7Ci0gICAgICAgIG1heEhlaWdodCA9IDIxNjA7Ci0gICAgICB9IGVsc2UgaWYgKG1heEhlaWdodCA+PSAxMDgwICYmIHZpZGVvQ2FwYWJpbGl0aWVzLmlzU2l6ZVN1cHBvcnRlZCgxOTIwLCAxMDgwKSkgewotICAgICAgICBtYXhXaWR0aCA9IDE5MjA7Ci0gICAgICAgIG1heEhlaWdodCA9IDEwODA7CisgICAgICBpZiAobWF4SGVpZ2h0ID49IDQ4MCAmJiB2aWRlb0NhcGFiaWxpdGllcy5pc1NpemVTdXBwb3J0ZWQobWF4V2lkdGgsIG1heEhlaWdodCkpIHsKKyAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2UgY2FuIGRvIHRoaXMgY2hlY2sgZm9yIGFsbCByZXNvbHV0aW9ucywgYnV0IG9ubHkgY2hlY2sgZm9yIHJlc29sdXRpb24gd2l0aAorICAgICAgICAvLyBoZWlnaHQgbW9yZSB0aGFuIDQ4MHAgdG8gbWluaW1pemUgcHJvZHVjdGlvbiBpbXBhY3QuICBUbyB1c2UgYSBsb3dlciByZXNvbHV0aW9uIGlzIG1vcmUKKyAgICAgICAgLy8gdG8gcmVkdWNlIG1lbW9yeSBmb290cHJpbnQsIGFuZCBvcHRpbWl6ZSBmb3IgbG93ZXIgcmVzb2x1dGlvbiBpc24ndCBhcyBoZWxwZnVsIGFueXdheS4KKyAgICAgICAgTG9nLmkoCisgICAgICAgICAgICBUQUcsCisgICAgICAgICAgICAiU2V0IG1heFdpZHRoIGFuZCBtYXhIZWlnaHQgdG8gKCVkLCAlZCkgcGVyIGBpc1NpemVTdXBwb3J0ZWQoKWAiLAorICAgICAgICAgICAgbWF4V2lkdGgsCisgICAgICAgICAgICBtYXhIZWlnaHQpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGZpbmQgYSBjb21wYXRpYmxlIHJlc29sdXRpb24iKTsKLSAgICAgICAgbWF4V2lkdGggPSAxOTIwOwotICAgICAgICBtYXhIZWlnaHQgPSAxMDgwOworICAgICAgICBpZiAobWF4SGVpZ2h0ID49IDIxNjAgJiYgdmlkZW9DYXBhYmlsaXRpZXMuaXNTaXplU3VwcG9ydGVkKDM4NDAsIDIxNjApKSB7CisgICAgICAgICAgbWF4V2lkdGggPSAzODQwOworICAgICAgICAgIG1heEhlaWdodCA9IDIxNjA7CisgICAgICAgIH0gZWxzZSBpZiAobWF4SGVpZ2h0ID49IDEwODAgJiYgdmlkZW9DYXBhYmlsaXRpZXMuaXNTaXplU3VwcG9ydGVkKDE5MjAsIDEwODApKSB7CisgICAgICAgICAgbWF4V2lkdGggPSAxOTIwOworICAgICAgICAgIG1heEhlaWdodCA9IDEwODA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGZpbmQgYSBjb21wYXRpYmxlIHJlc29sdXRpb24iKTsKKyAgICAgICAgICBtYXhXaWR0aCA9IDE5MjA7CisgICAgICAgICAgbWF4SGVpZ2h0ID0gMTA4MDsKKyAgICAgICAgfQorICAgICAgICBMb2cuaSgKKyAgICAgICAgICAgIFRBRywKKyAgICAgICAgICAgICJTZXQgbWF4V2lkdGggYW5kIG1heEhlaWdodCB0byAoJWQsICVkKSBwZXIgYGlzU2l6ZVN1cHBvcnRlZCgpYCIsCisgICAgICAgICAgICBtYXhXaWR0aCwKKyAgICAgICAgICAgIG1heEhlaWdodCk7CiAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYnVpbGQuZ3JhZGxlIGIvc3RhcmJvYXJkL2FuZHJvaWQvYXBrL2J1aWxkLmdyYWRsZQppbmRleCAxMjQ3MDAyLi4wODYwODAxIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9hcGsvYnVpbGQuZ3JhZGxlCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL2Fway9idWlsZC5ncmFkbGUKQEAgLTE3LDcgKzE3LDcgQEAKIGJ1aWxkc2NyaXB0IHsKICAgICByZXBvc2l0b3JpZXMgewogICAgICAgICBnb29nbGUoKQotICAgICAgICBqY2VudGVyKCkKKyAgICAgICAgbWF2ZW5DZW50cmFsKCkKICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKICAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6Ny4wLjInCkBAIC0zMCw3ICszMCw3IEBACiBhbGxwcm9qZWN0cyB7CiAgICAgcmVwb3NpdG9yaWVzIHsKICAgICAgICAgZ29vZ2xlKCkKLSAgICAgICAgamNlbnRlcigpCisgICAgICAgIG1hdmVuQ2VudHJhbCgpCiAgICAgfQogICAgIGdyYWRsZS5wcm9qZWN0c0V2YWx1YXRlZCB7CiAgICAgICAgIHRhc2tzLndpdGhUeXBlKEphdmFDb21waWxlKSB7CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9hcm0vdG9vbGNoYWluL0JVSUxELmduIGIvc3RhcmJvYXJkL2FuZHJvaWQvYXJtL3Rvb2xjaGFpbi9CVUlMRC5nbgppbmRleCA0MjdlYjBiLi5iNDlkZjUxIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9hcm0vdG9vbGNoYWluL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL2FybS90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTIyLDggKzIyLDggQEAKICAgY3h4ID0gIiRwcmVmaXgvYXJtdjdhLWxpbnV4LWFuZHJvaWRlYWJpJHthbmRyb2lkX25ka19hcGlfbGV2ZWx9LWNsYW5nKysiCiAgIGxkID0gY3h4CiAgIGFyID0gIiRwcmVmaXgvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLXJlYWRlbGYiCi0gIGFyID0gIiRwcmVmaXgvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLWFyIgotICBubSA9ICIkcHJlZml4L2FybS1saW51eC1hbmRyb2lkZWFiaS1ubSIKKyAgYXIgPSAiYXIiCisgIG5tID0gIm5tIgogCiAgIHRvb2xjaGFpbl9hcmdzID0gewogICAgIGlzX2NsYW5nID0gdHJ1ZQpAQCAtMzYsOCArMzYsOCBAQAogICBjeHggPSAiJHByZWZpeC9hcm12N2EtbGludXgtYW5kcm9pZGVhYmkke2FuZHJvaWRfbmRrX2FwaV9sZXZlbH0tY2xhbmcrKyIKICAgbGQgPSBjeHgKICAgYXIgPSAiJHByZWZpeC9hcm0tbGludXgtYW5kcm9pZGVhYmktcmVhZGVsZiIKLSAgYXIgPSAiJHByZWZpeC9hcm0tbGludXgtYW5kcm9pZGVhYmktYXIiCi0gIG5tID0gIiRwcmVmaXgvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLW5tIgorICBhciA9ICJhciIKKyAgbm0gPSAibm0iCiAKICAgdG9vbGNoYWluX2FyZ3MgPSB7CiAgICAgaXNfc3RhcmJvYXJkID0gZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL19faW5pdF9fLnB5IGIvc3RhcmJvYXJkL2FuZHJvaWQvYXJtNjQvY29iYWx0L19faW5pdF9fLnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL19faW5pdF9fLnB5CnJlbmFtZSB0byBzdGFyYm9hcmQvYW5kcm9pZC9hcm02NC9jb2JhbHQvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL2FybTY0L2NvYmFsdC9jb25maWd1cmF0aW9uLnB5IGIvc3RhcmJvYXJkL2FuZHJvaWQvYXJtNjQvY29iYWx0L2NvbmZpZ3VyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMGM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL2FybTY0L2NvYmFsdC9jb25maWd1cmF0aW9uLnB5CkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiU3RhcmJvYXJkIEFuZHJvaWQgeDg2IENvYmFsdCBjb25maWd1cmF0aW9uLiIiIgorCitmcm9tIHN0YXJib2FyZC5hbmRyb2lkLnNoYXJlZC5jb2JhbHQgaW1wb3J0IGNvbmZpZ3VyYXRpb24KK2Zyb20gc3RhcmJvYXJkLnRvb2xzLnRlc3RpbmcgaW1wb3J0IHRlc3RfZmlsdGVyCisKKworY2xhc3MgQ29iYWx0QW5kcm9pZEFybTY0Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uLkNvYmFsdEFuZHJvaWRDb25maWd1cmF0aW9uKToKKyAgIiIiU3RhcmJvYXJkIEFuZHJvaWQgQXJtNjQgQ29iYWx0IGNvbmZpZ3VyYXRpb24uIiIiCisKKyAgZGVmIEdldFRlc3RGaWx0ZXJzKHNlbGYpOgorICAgIGZpbHRlcnMgPSBzdXBlcigpLkdldFRlc3RGaWx0ZXJzKCkKKyAgICBmb3IgdGFyZ2V0LCB0ZXN0cyBpbiBzZWxmLl9fRklMVEVSRURfVEVTVFMuaXRlbXMoKToKKyAgICAgIGZpbHRlcnMuZXh0ZW5kKHRlc3RfZmlsdGVyLlRlc3RGaWx0ZXIodGFyZ2V0LCB0ZXN0KSBmb3IgdGVzdCBpbiB0ZXN0cykKKyAgICByZXR1cm4gZmlsdGVycworCisgICMgQSBtYXAgb2YgZmFpbGluZyBvciBjcmFzaGluZyB0ZXN0cyBwZXIgdGFyZ2V0CisgIF9fRklMVEVSRURfVEVTVFMgPSB7ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICAgICdyZW5kZXJlcl90ZXN0JzogWworICAgICAgICAgICdMb3R0aWVDb3ZlcmFnZVBpeGVsVGVzdC9Mb3R0aWVQaXhlbFRlc3QuUnVuL3Nrb3R0aWVfbHVtYV9tYXR0ZV9qc29uJywKKyAgICAgIF0KKyAgfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvYXJtNjQvdG9vbGNoYWluL0JVSUxELmduIGIvc3RhcmJvYXJkL2FuZHJvaWQvYXJtNjQvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDZjOThhMTQuLjkyMzY5NGIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL2FybTY0L3Rvb2xjaGFpbi9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9hcm02NC90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTIxLDkgKzIxLDkgQEAKICAgY2MgPSAiJHByZWZpeC9hYXJjaDY0LWxpbnV4LWFuZHJvaWQke2FuZHJvaWRfbmRrX2FwaV9sZXZlbH0tY2xhbmciCiAgIGN4eCA9ICIkcHJlZml4L2FhcmNoNjQtbGludXgtYW5kcm9pZCR7YW5kcm9pZF9uZGtfYXBpX2xldmVsfS1jbGFuZysrIgogICBsZCA9IGN4eAotICByZWFkZWxmID0gIiRwcmVmaXgvYWFyY2g2NC1saW51eC1hbmRyb2lkLXJlYWRlbGYiCi0gIGFyID0gIiRwcmVmaXgvYWFyY2g2NC1saW51eC1hbmRyb2lkLWFyIgotICBubSA9ICIkcHJlZml4L2FhcmNoNjQtbGludXgtYW5kcm9pZC1ubSIKKyAgcmVhZGVsZiA9ICJyZWFkZWxmIgorICBhciA9ICJhciIKKyAgbm0gPSAibm0iCiAKICAgdG9vbGNoYWluX2FyZ3MgPSB7CiAgICAgaXNfY2xhbmcgPSB0cnVlCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9hcm02NC92dWxrYW4vdG9vbGNoYWluL0JVSUxELmduIGIvc3RhcmJvYXJkL2FuZHJvaWQvYXJtNjQvdnVsa2FuL3Rvb2xjaGFpbi9CVUlMRC5nbgppbmRleCA2Yzk4YTE0Li45MjM2OTRiIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9hcm02NC92dWxrYW4vdG9vbGNoYWluL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL2FybTY0L3Z1bGthbi90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTIxLDkgKzIxLDkgQEAKICAgY2MgPSAiJHByZWZpeC9hYXJjaDY0LWxpbnV4LWFuZHJvaWQke2FuZHJvaWRfbmRrX2FwaV9sZXZlbH0tY2xhbmciCiAgIGN4eCA9ICIkcHJlZml4L2FhcmNoNjQtbGludXgtYW5kcm9pZCR7YW5kcm9pZF9uZGtfYXBpX2xldmVsfS1jbGFuZysrIgogICBsZCA9IGN4eAotICByZWFkZWxmID0gIiRwcmVmaXgvYWFyY2g2NC1saW51eC1hbmRyb2lkLXJlYWRlbGYiCi0gIGFyID0gIiRwcmVmaXgvYWFyY2g2NC1saW51eC1hbmRyb2lkLWFyIgotICBubSA9ICIkcHJlZml4L2FhcmNoNjQtbGludXgtYW5kcm9pZC1ubSIKKyAgcmVhZGVsZiA9ICJyZWFkZWxmIgorICBhciA9ICJhciIKKyAgbm0gPSAibm0iCiAKICAgdG9vbGNoYWluX2FyZ3MgPSB7CiAgICAgaXNfY2xhbmcgPSB0cnVlCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvQlVJTEQuZ24gYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvQlVJTEQuZ24KaW5kZXggMjNmMjUzNy4uZDhhNzllMyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9CVUlMRC5nbgpAQCAtNDM5LDE0ICs0MzksNiBAQAogICAgICIvL3RoaXJkX3BhcnR5L29wdXMiLAogICBdCiAKLSAgaWYgKGlzX2ludGVybmFsX2J1aWxkKSB7Ci0gICAgc291cmNlcyArPSBbCi0gICAgICAiLy9pbnRlcm5hbC9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvaW50ZXJuYWwvaW5wdXRfZXZlbnRzX2ZpbHRlci5jYyIsCi0gICAgICAiLy9pbnRlcm5hbC9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvaW50ZXJuYWwvaW5wdXRfZXZlbnRzX2ZpbHRlci5oIiwKLSAgICBdCi0gICAgZGVmaW5lcyA9IFsgIlNUQVJCT0FSRF9JTlBVVF9FVkVOVFNfRklMVEVSIiBdCi0gIH0KLQogICBpZiAoc2JfaXNfZXZlcmdyZWVuX2NvbXBhdGlibGUpIHsKICAgICBzb3VyY2VzIC09IFsKICAgICAgICJjcmFzaF9oYW5kbGVyLmNjIiwKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hcHBsaWNhdGlvbl9hbmRyb2lkLmNjIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuY2MKaW5kZXggMGY4MWUxZC4uMDMzNGQxZiAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuY2MKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuY2MKQEAgLTQzNiwxMiArNDM2LDYgQEAKICAgICBjb25zdCBHYW1lQWN0aXZpdHlLZXlFdmVudCogZXZlbnQpIHsKICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKIAotI2lmZGVmIFNUQVJCT0FSRF9JTlBVVF9FVkVOVFNfRklMVEVSCi0gIGlmICghaW5wdXRfZXZlbnRzX2ZpbHRlcl8uU2hvdWxkUHJvY2Vzc0tleUV2ZW50KGV2ZW50KSkgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSNlbmRpZgotCiAgIFNjb3BlZExvY2sgbG9jayhpbnB1dF9tdXRleF8pOwogICBpZiAoIWlucHV0X2V2ZW50c19nZW5lcmF0b3JfKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuaCBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9hcHBsaWNhdGlvbl9hbmRyb2lkLmgKaW5kZXggMzM2ZWE5Yy4uZDAyM2U3NCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2FwcGxpY2F0aW9uX2FuZHJvaWQuaAorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvYXBwbGljYXRpb25fYW5kcm9pZC5oCkBAIC0yMiw5ICsyMiw2IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiZ2FtZS1hY3Rpdml0eS9HYW1lQWN0aXZpdHkuaCIKLSNpZmRlZiBTVEFSQk9BUkRfSU5QVVRfRVZFTlRTX0ZJTFRFUgotI2luY2x1ZGUgImludGVybmFsL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9pbnRlcm5hbC9pbnB1dF9ldmVudHNfZmlsdGVyLmgiCi0jZW5kaWYKICNpbmNsdWRlICJzdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvaW5wdXRfZXZlbnRzX2dlbmVyYXRvci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9qbmlfZW52X2V4dC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKQEAgLTE2OCwxMCArMTY1LDYgQEAKICAgTXV0ZXggaW5wdXRfbXV0ZXhfOwogICBzY29wZWRfcHRyPElucHV0RXZlbnRzR2VuZXJhdG9yPiBpbnB1dF9ldmVudHNfZ2VuZXJhdG9yXzsKIAotI2lmZGVmIFNUQVJCT0FSRF9JTlBVVF9FVkVOVFNfRklMVEVSCi0gIGludGVybmFsOjpJbnB1dEV2ZW50c0ZpbHRlciBpbnB1dF9ldmVudHNfZmlsdGVyXzsKLSNlbmRpZgotCiAgIGJvb2wgbGFzdF9pc19hY2Nlc3NpYmlsaXR5X2hpZ2hfY29udHJhc3RfdGV4dF9lbmFibGVkXzsKIAogICBqb2JqZWN0IHJlc291cmNlX292ZXJsYXlfOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvYmFsdC9jb25maWd1cmF0aW9uLnB5IGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2NvYmFsdC9jb25maWd1cmF0aW9uLnB5CmluZGV4IDdiYzJmZmIuLmViMWU4MTQgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb2JhbHQvY29uZmlndXJhdGlvbi5weQorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvY29iYWx0L2NvbmZpZ3VyYXRpb24ucHkKQEAgLTc4LDYgKzc4LDkgQEAKICAgICAgICAgICAjIHRlc3QgZXhwbGljaXRseSB0cmllcyB0byBhbGxvY2F0ZSB0b28gbXVjaCB0ZXh0dXJlIG1lbW9yeSwgd2UgY2Fubm90CiAgICAgICAgICAgIyBydW4gaXQgb24gQW5kcm9pZCBwbGF0Zm9ybXMuCiAgICAgICAgICAgJ1N0cmVzc1Rlc3QuVG9vTWFueVRleHR1cmVzJywKKworICAgICAgICAgICMgVE9ETyhiLzI4ODEwNzY5MikgRmFpbGluZyB3aXRoIE5ESyAyNS4yIHVwZ3JhZGUsIHJlLWVuYWJsZQorICAgICAgICAgICdQaXhlbFRlc3QuVG9vTWFueUdseXBocycsCiAgICAgICBdLAogICAgICAgJ3ppcF91bml0dGVzdHMnOiBbCiAgICAgICAgICAgIyBUaGVzZSB0ZXN0cywgYW5kIHppcHBpbmcgaW4gZ2VuZXJhbCwgcmVseSBvbiB0aGUgYWJpbGl0eSB0byBpdGVyYXRlCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDdhMTExODcuLjM2MjBkN2IgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0xMDgsMTEgKzEwOCw2IEBACiAKIC8vIC0tLSBHcmFwaGljcyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIGJpbGluZWFyIGZpbHRlcmluZy4KLS8vIFRoaXMgY2FuIGJlIGNoZWNrZWQgdG8gZW5hYmxlL2Rpc2FibGUgcmVuZGVyZXIgdGVzdHMgdGhhdCB2ZXJpZnkgdGhhdCB0aGlzIGlzCi0vLyB3b3JraW5nIHByb3Blcmx5LgotI2RlZmluZSBTQl9IQVNfQklMSU5FQVJfRklMVEVSSU5HX1NVUFBPUlQgMQotCiAvLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIHJlbmRlcmluZyBvZiBOVjEyCiAvLyB0ZXh0dXJlcy4gVGhlc2UgdGV4dHVyZXMgdHlwaWNhbGx5IG9yaWdpbmF0ZSBmcm9tIHZpZGVvIGRlY29kZXJzLgogI2RlZmluZSBTQl9IQVNfTlYxMl9URVhUVVJFX1NVUFBPUlQgMQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Rvd25sb2FkX3Nkay5zaCBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9kb3dubG9hZF9zZGsuc2gKaW5kZXggZTA1Y2VmNC4uZDk0MDQ1NCAxMDA3NTUKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2Rvd25sb2FkX3Nkay5zaAorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvZG93bmxvYWRfc2RrLnNoCkBAIC00NSwxMSArNDUsMTEgQEAKICMgVXBkYXRlIHRoZSBpbnN0YWxsYXRpb24KICR7U0RLX01BTkFHRVJfVE9PTH0gLS1zZGtfcm9vdD0ke0FORFJPSURfU0RLX1JPT1R9IFwKICAgICAiYnVpbGQtdG9vbHM7MzEuMC4wIiBcCi0gICAgImNtYWtlOzMuMTAuMi40OTg4NDA0IiBcCisgICAgImNtYWtlOzMuMjIuMSIgXAogICAgICJjbWRsaW5lLXRvb2xzOzEuMCIgXAogICAgICJleHRyYXM7YW5kcm9pZDttMnJlcG9zaXRvcnkiIFwKICAgICAiZXh0cmFzO2dvb2dsZTttMnJlcG9zaXRvcnkiIFwKLSAgICAibmRrOzIxLjEuNjM1MjQ2MiIgXAorICAgICJuZGs7MjUuMi45NTE5NjUzIiBcCiAgICAgInBhdGNoZXI7djQiIFwKICAgICAicGxhdGZvcm1zO2FuZHJvaWQtMzEiIFwKICAgICAicGxhdGZvcm0tdG9vbHMiCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvaW5wdXRfZXZlbnRzX2dlbmVyYXRvci5jYyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9pbnB1dF9ldmVudHNfZ2VuZXJhdG9yLmNjCmluZGV4IGE4ZWYxZTUuLjBiMzQ1MjQyIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvaW5wdXRfZXZlbnRzX2dlbmVyYXRvci5jYworKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvaW5wdXRfZXZlbnRzX2dlbmVyYXRvci5jYwpAQCAtMjMyLDYgKzIzMiwxMCBAQAogICAgICAgcmV0dXJuIGtTYktleU1lZGlhUmV3aW5kOwogICAgIGNhc2UgQUtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOgogICAgICAgcmV0dXJuIGtTYktleU1lZGlhRmFzdEZvcndhcmQ7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKKyAgICBjYXNlIEFLRVlDT0RFX01FRElBX1JFQ09SRDoKKyAgICAgIHJldHVybiBrU2JLZXlSZWNvcmQ7CisjZW5kaWYKIAogICAgIC8vIFRWIFJlbW90ZSBzcGVjaWZpYwogICAgIGNhc2UgQUtFWUNPREVfQ0hBTk5FTF9VUDoKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb2RlY19icmlkZ2UuY2MgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmNjCmluZGV4IDZjYzQxZTYuLjI5OGVhMGMgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb2RlY19icmlkZ2UuY2MKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2NvZGVjX2JyaWRnZS5jYwpAQCAtMjE4LDYgKzIxOCw4IEBACiAgICAgaW50IHdpZHRoLAogICAgIGludCBoZWlnaHQsCiAgICAgaW50IGZwcywKKyAgICBvcHRpb25hbDxpbnQ+IG1heF93aWR0aCwKKyAgICBvcHRpb25hbDxpbnQ+IG1heF9oZWlnaHQsCiAgICAgSGFuZGxlciogaGFuZGxlciwKICAgICBqb2JqZWN0IGpfc3VyZmFjZSwKICAgICBqb2JqZWN0IGpfbWVkaWFfY3J5cHRvLApAQCAtMjI5LDYgKzIzMSw5IEBACiAgICAgYm9vbCBmb3JjZV9pbXByb3ZlZF9zdXBwb3J0X2NoZWNrLAogICAgIHN0ZDo6c3RyaW5nKiBlcnJvcl9tZXNzYWdlKSB7CiAgIFNCX0RDSEVDSyhlcnJvcl9tZXNzYWdlKTsKKyAgU0JfRENIRUNLKG1heF93aWR0aC5oYXNfZW5nYWdlZCgpID09IG1heF9oZWlnaHQuaGFzX2VuZ2FnZWQoKSk7CisgIFNCX0RDSEVDSyhtYXhfd2lkdGgudmFsdWVfb3IoMTkyMCkgPiAwKTsKKyAgU0JfRENIRUNLKG1heF9oZWlnaHQudmFsdWVfb3IoMTA4MCkgPiAwKTsKIAogICBjb25zdCBjaGFyKiBtaW1lID0gU3VwcG9ydGVkVmlkZW9Db2RlY1RvTWltZVR5cGUodmlkZW9fY29kZWMpOwogICBpZiAoIW1pbWUpIHsKQEAgLTMxMCwxNiArMzE1LDE2IEBACiAgICAgICBuZXcgTWVkaWFDb2RlY0JyaWRnZShoYW5kbGVyKSk7CiAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2RPckFib3J0KAogICAgICAgImRldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZSIsICJjcmVhdGVWaWRlb01lZGlhQ29kZWNCcmlkZ2UiLAotICAgICAgIihKTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7SUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOyIKKyAgICAgICIoSkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0lJSUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOyIKICAgICAgICJMYW5kcm9pZC9tZWRpYS9NZWRpYUNyeXB0bzsiCiAgICAgICAiTGRldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZSRDb2xvckluZm87IgogICAgICAgIkkiCiAgICAgICAiTGRldi9jb2JhbHQvbWVkaWEvTWVkaWFDb2RlY0JyaWRnZSRDcmVhdGVNZWRpYUNvZGVjQnJpZGdlUmVzdWx0OykiCiAgICAgICAiViIsCiAgICAgICByZWludGVycHJldF9jYXN0PGpsb25nPihuYXRpdmVfbWVkaWFfY29kZWNfYnJpZGdlLmdldCgpKSwgal9taW1lLkdldCgpLAotICAgICAgal9kZWNvZGVyX25hbWUuR2V0KCksIHdpZHRoLCBoZWlnaHQsIGZwcywgal9zdXJmYWNlLCBqX21lZGlhX2NyeXB0bywKLSAgICAgIGpfY29sb3JfaW5mby5HZXQoKSwgdHVubmVsX21vZGVfYXVkaW9fc2Vzc2lvbl9pZCwKLSAgICAgIGpfY3JlYXRlX21lZGlhX2NvZGVjX2JyaWRnZV9yZXN1bHQuR2V0KCkpOworICAgICAgal9kZWNvZGVyX25hbWUuR2V0KCksIHdpZHRoLCBoZWlnaHQsIGZwcywgbWF4X3dpZHRoLnZhbHVlX29yKC0xKSwKKyAgICAgIG1heF9oZWlnaHQudmFsdWVfb3IoLTEpLCBqX3N1cmZhY2UsIGpfbWVkaWFfY3J5cHRvLCBqX2NvbG9yX2luZm8uR2V0KCksCisgICAgICB0dW5uZWxfbW9kZV9hdWRpb19zZXNzaW9uX2lkLCBqX2NyZWF0ZV9tZWRpYV9jb2RlY19icmlkZ2VfcmVzdWx0LkdldCgpKTsKIAogICBqb2JqZWN0IGpfbWVkaWFfY29kZWNfYnJpZGdlID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kT3JBYm9ydCgKICAgICAgIGpfY3JlYXRlX21lZGlhX2NvZGVjX2JyaWRnZV9yZXN1bHQuR2V0KCksICJtZWRpYUNvZGVjQnJpZGdlIiwKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb2RlY19icmlkZ2UuaCBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb2RlY19icmlkZ2UuaAppbmRleCA3NDNjOTkxLi4xNDkwYjc1IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfY29kZWNfYnJpZGdlLmgKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2NvZGVjX2JyaWRnZS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2puaV9lbnZfZXh0LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL2puaV91dGlscy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9jb21tb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfdXRpbC5oIgogCkBAIC0xMDQsMTEgKzEwNSwxOSBAQAogICAgICAgSGFuZGxlciogaGFuZGxlciwKICAgICAgIGpvYmplY3Qgal9tZWRpYV9jcnlwdG8pOwogCisgIC8vIGBtYXhfd2lkdGhgIGFuZCBgbWF4X2hlaWdodGAgY2FuIGJlIHNldCB0byBwb3NpdGl2ZSB2YWx1ZXMgdG8gc3BlY2lmeSB0aGUKKyAgLy8gbWF4aW11bSByZXNvbHV0aW9ucyB0aGUgdmlkZW8gY2FuIGJlIGFkYXB0ZWQgdG8uCisgIC8vIFdoZW4gdGhleSBhcmUgbm90IHNldCwgTWVkaWFDb2RlY0JyaWRnZSB3aWxsIHNldCB0aGVtIHRvIHRoZSBtYXhpbXVtCisgIC8vIHJlc29sdXRpb25zIHRoZSBwbGF0Zm9ybSBjYW4gZGVjb2RlLgorICAvLyBCb3RoIG9mIHRoZW0gaGF2ZSB0byBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSAoaS5lLiB3ZSBjYW5ub3Qgc2V0IG9uZSBvZgorICAvLyB0aGVtIHdpdGhvdXQgdGhlIG90aGVyKSwgd2hpY2ggd2lsbCBiZSBjaGVja2VkIGluIHRoZSBmdW5jdGlvbi4KICAgc3RhdGljIHNjb3BlZF9wdHI8TWVkaWFDb2RlY0JyaWRnZT4gQ3JlYXRlVmlkZW9NZWRpYUNvZGVjQnJpZGdlKAogICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCiAgICAgICBpbnQgd2lkdGgsCiAgICAgICBpbnQgaGVpZ2h0LAogICAgICAgaW50IGZwcywKKyAgICAgIG9wdGlvbmFsPGludD4gbWF4X3dpZHRoLAorICAgICAgb3B0aW9uYWw8aW50PiBtYXhfaGVpZ2h0LAogICAgICAgSGFuZGxlciogaGFuZGxlciwKICAgICAgIGpvYmplY3Qgal9zdXJmYWNlLAogICAgICAgam9iamVjdCBqX21lZGlhX2NyeXB0bywKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmNjIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuY2MKaW5kZXggYTA5ZDU5ZS4uYTQ0YWNmOCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuY2MKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuY2MKQEAgLTEwNSw2ICsxMDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw8aW50PiBtYXhfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDxpbnQ+IG1heF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBqX291dHB1dF9zdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKQEAgLTEyOCwxMCArMTMwLDExIEBACiAgICAgICBkcm1fc3lzdGVtXyAmJiBkcm1fc3lzdGVtXy0+cmVxdWlyZV9zZWN1cmVkX2RlY29kZXIoKTsKICAgU0JfRENIRUNLKCFkcm1fc3lzdGVtXyB8fCBqX21lZGlhX2NyeXB0byk7CiAgIG1lZGlhX2NvZGVjX2JyaWRnZV8gPSBNZWRpYUNvZGVjQnJpZGdlOjpDcmVhdGVWaWRlb01lZGlhQ29kZWNCcmlkZ2UoCi0gICAgICB2aWRlb19jb2RlYywgd2lkdGgsIGhlaWdodCwgZnBzLCB0aGlzLCBqX291dHB1dF9zdXJmYWNlLCBqX21lZGlhX2NyeXB0bywKLSAgICAgIGNvbG9yX21ldGFkYXRhLCByZXF1aXJlX3NlY3VyZWRfZGVjb2RlciwgcmVxdWlyZV9zb2Z0d2FyZV9jb2RlYywKLSAgICAgIHR1bm5lbF9tb2RlX2F1ZGlvX3Nlc3Npb25faWQsIGZvcmNlX2JpZ19lbmRpYW5faGRyX21ldGFkYXRhLAotICAgICAgZm9yY2VfaW1wcm92ZWRfc3VwcG9ydF9jaGVjaywgZXJyb3JfbWVzc2FnZSk7CisgICAgICB2aWRlb19jb2RlYywgd2lkdGgsIGhlaWdodCwgZnBzLCBtYXhfd2lkdGgsIG1heF9oZWlnaHQsIHRoaXMsCisgICAgICBqX291dHB1dF9zdXJmYWNlLCBqX21lZGlhX2NyeXB0bywgY29sb3JfbWV0YWRhdGEsIHJlcXVpcmVfc2VjdXJlZF9kZWNvZGVyLAorICAgICAgcmVxdWlyZV9zb2Z0d2FyZV9jb2RlYywgdHVubmVsX21vZGVfYXVkaW9fc2Vzc2lvbl9pZCwKKyAgICAgIGZvcmNlX2JpZ19lbmRpYW5faGRyX21ldGFkYXRhLCBmb3JjZV9pbXByb3ZlZF9zdXBwb3J0X2NoZWNrLAorICAgICAgZXJyb3JfbWVzc2FnZSk7CiAgIGlmICghbWVkaWFfY29kZWNfYnJpZGdlXykgewogICAgIFNCX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW8gbWVkaWEgY29kZWMgYnJpZGdlIHdpdGggZXJyb3I6ICIKICAgICAgICAgICAgICAgICAgIDw8ICplcnJvcl9tZXNzYWdlOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuaCBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9kZWNvZGVyLmgKaW5kZXggZWQ4OWYwZi4uMzUwZTYxMSAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2RlY29kZXIuaAorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfZGVjb2Rlci5oCkBAIC04NCw2ICs4NCw4IEBACiAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICBvcHRpb25hbDxpbnQ+IG1heF93aWR0aCwKKyAgICAgICAgICAgICAgIG9wdGlvbmFsPGludD4gbWF4X2hlaWdodCwKICAgICAgICAgICAgICAgIGludCBmcHMsCiAgICAgICAgICAgICAgICBqb2JqZWN0IGpfb3V0cHV0X3N1cmZhY2UsCiAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLApkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2lzX3ZpZGVvX3N1cHBvcnRlZC5jYyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9tZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MKaW5kZXggOGFhMzEwMS4uODk2NWQ3YyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL21lZGlhX2lzX3ZpZGVvX3N1cHBvcnRlZC5jYworKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvbWVkaWFfaXNfdmlkZW9fc3VwcG9ydGVkLmNjCkBAIC03Miw2ICs3MiwxMyBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8vIEFsbG93IHRoZSB3ZWIgYXBwIHRvIGNvbnRyb2wgaG93IHNvZnR3YXJlIGRlY29kZXJzIHNob3VsZCBiZSB1c2VkLgorICAgIGlmICghbWltZV90eXBlLT5WYWxpZGF0ZVN0cmluZ1BhcmFtZXRlcigKKyAgICAgICAgICAgICJzb2Z0d2FyZWRlY29kZXIiLAorICAgICAgICAgICAgImFsbG93ZWR8ZGlzYWxsb3dlZHxwcmVmZXJyZWR8dW5wcmVmZXJyZWR8cmVxdWlyZWQiKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIC8vIEZvcmNlcyB0aGUgdXNlIG9mIHNwZWNpZmljIEFuZHJvaWQgQVBJcyAoaXNTaXplU3VwcG9ydGVkKCkgYW5kCiAgICAgLy8gYXJlU2l6ZUFuZFJhdGVTdXBwb3J0ZWQoKSkgdG8gZGV0ZXJtaW5lIGZvcm1hdCBzdXBwb3J0LgogICAgIGlmICghbWltZV90eXBlLT5WYWxpZGF0ZUJvb2xQYXJhbWV0ZXIoImZvcmNlaW1wcm92ZWRzdXBwb3J0Y2hlY2siKSkgewpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24gYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgppbmRleCA1ZDgwOWYzLi41MjQwZmY2IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgpAQCAtMTEyLDYgKzExMiwxNSBAQAogCiAgICAgIyBEb24idCB3YXJuIGZvciBpbXBsaWNpdCBzaWduIGNvbnZlcnNpb25zLiAoaW4gdjggYW5kIHByb3RvYnVmKQogICAgICItV25vLXNpZ24tY29udmVyc2lvbiIsCisKKyAgICAjIFRPRE86IGIvMjg3MTI5OTQ1IC0gRml4IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgIi1Xbm8taW1wbGljaXQtY29uc3QtaW50LWZsb2F0LWNvbnZlcnNpb24iLAorCisgICAgIyBUT0RPOiBiLzI4NzMyMDI3MSAtIEZpeCBjb21waWxlciB3YXJuaW5ncworICAgICItV25vLWRlcHJlY2F0ZWQtY29weSIsCisKKyAgICAjIFRPRE86IGIvMjg3MzI0ODgyIC0gRml4IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgIi1Xbm8tdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUiLAogICBdCiAgIGRlZmluZXMgKz0gWwogICAgICMgRW5hYmxlIGNvbXBpbGUtdGltZSBkZWNpc2lvbnMgYmFzZWQgb24gdGhlIEFCSQpAQCAtMTY0LDE0ICsxNzMsMTQgQEAKIH0KIAogY29uZmlnKCJleGVjdXRhYmxlX2NvbmZpZyIpIHsKLSAgaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IGRlZmF1bHRfdG9vbGNoYWluKSB7CisgIGlmIChpc19zdGFyYm9hcmRpemVkX3Rvb2xjaGFpbikgewogICAgIGNmbGFncyA9IFsgIi1mUElFIiBdCiAgICAgbGRmbGFncyA9IFsgIi1waWUiIF0KICAgfQogfQogCiBjb25maWcoImxpYnJhcnlfY29uZmlnIikgewotICBpZiAoY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4pIHsKKyAgaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSB7CiAgICAgY2ZsYWdzID0gWyAiLWZQSUMiIF0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaQppbmRleCA3YzE0ZjE2Li5lNzg4YjZjIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaQorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaQpAQCAtMjAsNiArMjAsOSBAQAogCiBmaW5hbF9leGVjdXRhYmxlX3R5cGUgPSAic2hhcmVkX2xpYnJhcnkiCiBndGVzdF90YXJnZXRfdHlwZSA9ICJzaGFyZWRfbGlicmFyeSIKK3N0YXJib2FyZF9sZXZlbF9maW5hbF9leGVjdXRhYmxlX3R5cGUgPSAic2hhcmVkX2xpYnJhcnkiCitzdGFyYm9hcmRfbGV2ZWxfZ3Rlc3RfdGFyZ2V0X3R5cGUgPSAic2hhcmVkX2xpYnJhcnkiCisKIHNiX2VuYWJsZV9iZW5jaG1hcmsgPSB0cnVlCiAKIHNpemVfY29uZmlnX3BhdGggPSAiLy9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbjpzaXplIgpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3BsYXllcl9jcmVhdGUuY2MgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NyZWF0ZS5jYwppbmRleCBmOTJiMmQwLi5lYmU2ZmFhIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NyZWF0ZS5jYworKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvcGxheWVyX2NyZWF0ZS5jYwpAQCAtMTg0LDI0ICsxODQsMTQgQEAKICAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKICAgfQogCi0gIC8vIEFuZHJvaWQgZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgaGFyZHdhcmUgZGVjb2RlcnMsIHNvIHdlIGNhbid0Ci0gIC8vIGhhdmUgbW9yZSB0aGFuIG9uZSBwcmltYXJ5IHBsYXllci4gQW5kIGFzIHNlY29uZGFyeSBwbGF5ZXIgaXMgZGlzYWJsZWQgb24KLSAgLy8gYW5kcm9pZCwgd2Ugc2ltcGx5IGNoZWNrIHRoZSBudW1iZXIgb2YgYWN0aXZlIHBsYXllcnMgaGVyZS4KLSAgY29uc3QgaW50IGtNYXhOdW1iZXJPZlBsYXllcnMgPSAxOwotICBpZiAoU2JQbGF5ZXJQcml2YXRlOjpudW1iZXJfb2ZfcGxheWVycygpID49IGtNYXhOdW1iZXJPZlBsYXllcnMpIHsKLSAgICBlcnJvcl9tZXNzYWdlID0gc3RhcmJvYXJkOjpGb3JtYXRTdHJpbmcoCi0gICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IHBsYXllci4gUGxhdGZvcm0gY2Fubm90IHN1cHBvcnQgbW9yZSB0aGFuICVkICIKLSAgICAgICAgInBsYXllcnMuIiwKLSAgICAgICAga01heE51bWJlck9mUGxheWVycyk7Ci0gICAgU0JfTE9HKEVSUk9SKSA8PCBlcnJvcl9tZXNzYWdlIDw8ICIuIjsKLSAgICBwbGF5ZXJfZXJyb3JfZnVuYyhrU2JQbGF5ZXJJbnZhbGlkLCBjb250ZXh0LCBrU2JQbGF5ZXJFcnJvckRlY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlLmNfc3RyKCkpOwotICAgIHJldHVybiBrU2JQbGF5ZXJJbnZhbGlkOwotICB9Ci0KICAgaWYgKGNyZWF0aW9uX3BhcmFtLT5vdXRwdXRfbW9kZSAhPSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlICYmCiAgICAgICAvLyBUT0RPOiBUaGlzIGlzIHRlbXBvcmFyeSBmb3Igc3VwcG9ydGluZyBiYWNrZ3JvdW5kIG1lZGlhIHBsYXliYWNrLgogICAgICAgLy8gICAgICAgTmVlZCB0byBiZSByZW1vdmVkIHdpdGggbWVkaWEgcmVmYWN0b3IuCisgICAgICAvLworICAgICAgLy8gTm93IHRoaXMgY29kZSBpcyBhbHNvIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgcHVuY2gtb3V0IHBsYXllcgorICAgICAgLy8gYXMgaXQgaGFwcGVucyB0byB3b3JrIGFzIGlzLiAgTm90ZSB0aGF0IGV2ZW4gd2l0aG91dCB0aGUgY2hlY2sgaGVyZSwKKyAgICAgIC8vIFNiUGxheWVyIHdpbGwgcHJvcGVybHkgaGFuZGxlIHRoaXMgYnkgcmVwb3J0aW5nIGVycm9yIGluIFZpZGVvRGVjb2RlciwKKyAgICAgIC8vIHdoZW4gaXQgZmFpbHMgdG8gYWNxdWlyZSB0aGUgc3VyZmFjZS4KICAgICAgIHZpZGVvX2NvZGVjICE9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmUpIHsKICAgICAvLyBDaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSB2aWRlbyB3aW5kb3cuIEFzIHdlIG9ubHkgc3VwcG9ydCBvbmUgbWFpbgogICAgIC8vIHBsYXllciwgYW5kIHN1YiBwbGF5ZXJzIGFyZSBpbiBkZWNvZGUgdG8gdGV4dHVyZSBtb2RlIG9uIEFuZHJvaWQsIGEKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zZGtfdXRpbHMucHkgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvc2RrX3V0aWxzLnB5CmluZGV4IDIyZDdiYmMuLjhlOGZlNTIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC9zZGtfdXRpbHMucHkKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3Nka191dGlscy5weQpAQCAtMTgsOCArMTgsOCBAQAogCiAjIFdoaWNoIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgTkRLIGFuZCBDTWFrZSB0byBpbnN0YWxsIGFuZCBidWlsZCB3aXRoLgogIyBOb3RlIHRoYXQgYnVpbGQuZ3JhZGxlIHBhcnNlcyB0aGVzZSBvdXQgb2YgdGhpcyBmaWxlIHRvby4KLV9OREtfVkVSU0lPTiA9ICcyMS4xLjYzNTI0NjInCi1fQ01BS0VfVkVSU0lPTiA9ICczLjEwLjIuNDk4ODQwNCcKK19OREtfVkVSU0lPTiA9ICcyNS4yLjk1MTk2NTMnCitfQ01BS0VfVkVSU0lPTiA9ICczLjIyLjEnCiAKIF9TVEFSQk9BUkRfVE9PTENIQUlOU19ESVIgPSBidWlsZC5HZXRUb29sY2hhaW5zRGlyKCkKIApkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3Rlc3RfZmlsdGVycy5weSBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC90ZXN0X2ZpbHRlcnMucHkKaW5kZXggZmNhMjg3OC4uZWZhZGU4MCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3Rlc3RfZmlsdGVycy5weQorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdGVzdF9maWx0ZXJzLnB5CkBAIC00Nyw2ICs0NywxMCBAQAogICAgICAgICAnUGxheWVyQ29tcG9uZW50c1Rlc3RzL1BsYXllckNvbXBvbmVudHNUZXN0LlBhdXNlLyplYzMqJywKICAgICBdLAogICAgICducGxiJzogWworICAgICAgICAjIEVuYWJsZSBtdWx0aXBsYXllciB0ZXN0cyBvbmNlIGl0J3Mgc3VwcG9ydGVkLgorICAgICAgICAnTXVsdGlwbGVQbGF5ZXJUZXN0cy8qJywKKyAgICAgICAgJ1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0cy9TYlBsYXllcldyaXRlU2FtcGxlVGVzdC5TZWNvbmRhcnlQbGF5ZXJUZXN0LyonLAorCiAgICAgICAgICMgVGhpcyB0ZXN0IGlzIGZhaWxpbmcgYmVjYXVzZSBsb2NhbGhvc3QgaXMgbm90IGRlZmluZWQgZm9yIElQdjYgaW4KICAgICAgICAgIyAvZXRjL2hvc3RzLgogICAgICAgICAnU2JTb2NrZXRBZGRyZXNzVHlwZXMvU2JTb2NrZXRSZXNvbHZlVGVzdC5Mb2NhbGhvc3QvZmlsdGVyX2lwdjZfdHlwZV9pcHY2JywKQEAgLTU5LDYgKzYzLDcgQEAKIAogICAgICAgICAjIFRoZXNlIHRlc3RzIGFyZSBkaXNhYmxlZCBkdWUgdG8gbm90IHJlY2VpdmluZyB0aGUga0VuZE9mU3RyZWFtCiAgICAgICAgICMgcGxheWVyIHN0YXRlIHVwZGF0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lb3V0LgorICAgICAgICAnU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0cy9TYlBsYXllckdldEF1ZGlvQ29uZmlndXJhdGlvblRlc3QuTm9JbnB1dC8qJywKICAgICAgICAgJ1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0cy9TYlBsYXllcldyaXRlU2FtcGxlVGVzdC5Ob0lucHV0LyonLAogCiAgICAgICAgICMgQW5kcm9pZCBkb2VzIG5vdCB1c2UgU2JEcm1TZXNzaW9uQ2xvc2VkRnVuYywgd2hpY2ggdGhlc2UgdGVzdHMKQEAgLTcxLDYgKzc2LDE1IEBACiAgICAgICAgICMgd2hlbiBpbnZhbGlkIGluaXRpYWxpemF0aW9uIGRhdGEgaXMgcGFzc2VkIHRvCiAgICAgICAgICMgU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCkuCiAgICAgICAgICdTYkRybVNlc3Npb25UZXN0LkludmFsaWRTZXNzaW9uVXBkYXRlUmVxdWVzdFBhcmFtcycsCisKKyAgICAgICAgIyBUT0RPOiBiLzI4ODEwNzAzOSBUaGlzIHRlc3QgY3Jhc2hlZCBhZnRlciBOREsgMjUgdXBncmFkZSwgcmUtZW5hYmxlIGl0LgorICAgICAgICAnU2JVbmRlZmluZWRCZWhhdmlvclRlc3QuQ2FsbFRoaXNQb2ludGVySXNOdWxsUmFpbnlEYXknLAorCisgICAgICAgICMgVE9ETzogYi8yODgxMDc2OTIgVGhpcyB0ZXN0IGNyYXNoZWQgb24gYXJtNjQgYWZ0ZXIgTkRLIDI1IHVwZ3JhZGUsIHJlLWVuYWJsZSBpdC4KKyAgICAgICAgJ1BpeGVsVGVzdC5Ub29NYW55R2x5cGhzJywKKworICAgICAgICAjIFRPRE86IEZpbHRlciB0aGlzIHRlc3Qgb24gYSBwZXItZGV2aWNlIGJhc2lzLgorICAgICAgICAnU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtLk1pbmltdW1TdXBwb3J0JywKICAgICBdLAogfQogIyBweWxpbnQ6IGVuYWJsZT1saW5lLXRvby1sb25nCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdG9vbGNoYWluL3Rvb2xjaGFpbi5nbmkgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdG9vbGNoYWluL3Rvb2xjaGFpbi5nbmkKaW5kZXggMzI4ZWRkNi4uOTA5MWM5NCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3Rvb2xjaGFpbi90b29sY2hhaW4uZ25pCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC90b29sY2hhaW4vdG9vbGNoYWluLmduaQpAQCAtMTcsNyArMTcsNyBAQAogZGVjbGFyZV9hcmdzKCkgewogICBhbmRyb2lkX3Nka19wYXRoID0gZ2V0ZW52KCJBTkRST0lEX0hPTUUiKQogICBhbmRyb2lkX25ka19wYXRoID0gIiIKLSAgc2JfYW5kcm9pZF9uZGtfdmVyc2lvbiA9ICIyMS4xLjYzNTI0NjIiCisgIHNiX2FuZHJvaWRfbmRrX3ZlcnNpb24gPSAiMjUuMi45NTE5NjUzIgogICBhbmRyb2lkX25ka19hcGlfbGV2ZWwgPSAyMQogfQogCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdmlkZW9fZGVjb2Rlci5jYyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmNjCmluZGV4IDFmNDY4OGUuLjgwNzg2OGQgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmNjCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmNjCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvZHJtLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfdHlwZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgpAQCAtNDQsMTIgKzQ1LDEzNyBAQAogCiBuYW1lc3BhY2UgewogCit1c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6Om1lZGlhOjpNaW1lVHlwZTsKIHVzaW5nIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvRnJhbWU7CiB1c2luZyBWaWRlb1JlbmRlckFsZ29yaXRobUJhc2UgPQogICAgIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvUmVuZGVyQWxnb3JpdGhtOwogdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwogdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yOwogCitib29sIElzU29mdHdhcmVEZWNvZGVSZXF1aXJlZChjb25zdCBzdGQ6OnN0cmluZyYgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcykgeworICBpZiAobWF4X3ZpZGVvX2NhcGFiaWxpdGllcy5lbXB0eSgpKSB7CisgICAgU0JfTE9HKElORk8pCisgICAgICAgIDw8ICJVc2UgaGFyZHdhcmUgZGVjb2RlciBhcyBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgaXMgZW1wdHkuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgaXMgaW4gdGhlIGZvcm0gb2YgbWltZSB0eXBlIGF0dHJpYnV0ZXMsIGxpa2UKKyAgLy8gIndpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAuLi4iLiAgUHJlcGVuZCB2YWxpZCBtaW1lIHR5cGUvc3VidHlwZSBhbmQgY29kZWNzCisgIC8vIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgTWltZVR5cGUuCisgIE1pbWVUeXBlIG1pbWVfdHlwZSgidmlkZW8vbXA0OyBjb2RlY3M9XCJ2cDlcIjsgIiArIG1heF92aWRlb19jYXBhYmlsaXRpZXMpOworICBpZiAoIW1pbWVfdHlwZS5pc192YWxpZCgpKSB7CisgICAgU0JfTE9HKElORk8pIDw8ICJVc2UgaGFyZHdhcmUgZGVjb2RlciBhcyBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgKCIKKyAgICAgICAgICAgICAgICAgPDwgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyA8PCAiKSBpcyBpbnZhbGlkLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgc29mdHdhcmVfZGVjb2Rlcl9leHBlY3RhdGlvbiA9CisgICAgICBtaW1lX3R5cGUuR2V0UGFyYW1TdHJpbmdWYWx1ZSgic29mdHdhcmVkZWNvZGVyIiwgIiIpOworICBpZiAoc29mdHdhcmVfZGVjb2Rlcl9leHBlY3RhdGlvbiA9PSAicmVxdWlyZWQiIHx8CisgICAgICBzb2Z0d2FyZV9kZWNvZGVyX2V4cGVjdGF0aW9uID09ICJwcmVmZXJyZWQiKSB7CisgICAgU0JfTE9HKElORk8pIDw8ICJVc2Ugc29mdHdhcmUgZGVjb2RlciBhcyBgc29mdHdhcmVkZWNvZGVyYCBpcyBzZXQgdG8gXCIiCisgICAgICAgICAgICAgICAgIDw8IHNvZnR3YXJlX2RlY29kZXJfZXhwZWN0YXRpb24gPDwgIlwiLiI7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoc29mdHdhcmVfZGVjb2Rlcl9leHBlY3RhdGlvbiA9PSAiZGlzYWxsb3dlZCIgfHwKKyAgICAgICAgICAgICBzb2Z0d2FyZV9kZWNvZGVyX2V4cGVjdGF0aW9uID09ICJ1bnByZWZlcnJlZCIpIHsKKyAgICBTQl9MT0coSU5GTykgPDwgIlVzZSBoYXJkd2FyZSBkZWNvZGVyIGFzIGBzb2Z0d2FyZWRlY29kZXJgIGlzIHNldCB0byBcIiIKKyAgICAgICAgICAgICAgICAgPDwgc29mdHdhcmVfZGVjb2Rlcl9leHBlY3RhdGlvbiA8PCAiXCIuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzX2xvd19yZXNvbHV0aW9uID0gbWltZV90eXBlLkdldFBhcmFtSW50VmFsdWUoIndpZHRoIiwgMTkyMCkgPD0gNDMyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lX3R5cGUuR2V0UGFyYW1JbnRWYWx1ZSgiaGVpZ2h0IiwgMTA4MCkgPD0gMjQwOworICBib29sIGlzX2xvd19mcHMgPSBtaW1lX3R5cGUuR2V0UGFyYW1JbnRWYWx1ZSgiZnBzIiwgMzApIDw9IDE1OworCisgIGlmIChpc19sb3dfcmVzb2x1dGlvbiAmJiBpc19sb3dfZnBzKSB7CisgICAgLy8gV29ya2Fyb3VuZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgYmFja2VuZCBpbXBsZW1lbnRhdGlvbi4KKyAgICBTQl9MT0coSU5GTykgPDwgIlVzZSBzb2Z0d2FyZSBkZWNvZGVyIGFzIGBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzYCAoIgorICAgICAgICAgICAgICAgICA8PCBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzCisgICAgICAgICAgICAgICAgIDw8ICIpIGluZGljYXRlcyBhIGxvdyByZXNvbHV0aW9uIGFuZCBsb3cgZnBzIHBsYXliYWNrLiI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBTQl9MT0coSU5GTykKKyAgICAgIDw8ICJVc2UgaGFyZHdhcmUgZGVjb2RlciBhcyBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgaXMgc2V0IHRvIFwiIgorICAgICAgPDwgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyA8PCAiXCIuIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBhcnNlTWF4UmVzb2x1dGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsPGludD4qIG1heF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsPGludD4qIG1heF9oZWlnaHQpIHsKKyAgU0JfRENIRUNLKHdpbmRvd193aWR0aCA+IDApOworICBTQl9EQ0hFQ0sod2luZG93X2hlaWdodCA+IDApOworICBTQl9EQ0hFQ0sobWF4X3dpZHRoKTsKKyAgU0JfRENIRUNLKG1heF9oZWlnaHQpOworCisgICptYXhfd2lkdGggPSBudWxsb3B0OworICAqbWF4X2hlaWdodCA9IG51bGxvcHQ7CisKKyAgaWYgKG1heF92aWRlb19jYXBhYmlsaXRpZXMuZW1wdHkoKSkgeworICAgIFNCX0xPRyhJTkZPKQorICAgICAgICA8PCAiRGlkbid0IHBhcnNlIG1heCByZXNvbHV0aW9ucyBhcyBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgaXMgZW1wdHkuIjsKKyAgICByZXR1cm47CisgIH0KKworICBTQl9MT0coSU5GTykgPDwgIlRyeSB0byBwYXJzZSBtYXggcmVzb2x1dGlvbnMgZnJvbSBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgKCIKKyAgICAgICAgICAgICAgIDw8IG1heF92aWRlb19jYXBhYmlsaXRpZXMgPDwgIikuIjsKKworICAvLyBgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc2AgaXMgaW4gdGhlIGZvcm0gb2YgbWltZSB0eXBlIGF0dHJpYnV0ZXMsIGxpa2UKKyAgLy8gIndpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAuLi4iLiAgUHJlcGVuZCB2YWxpZCBtaW1lIHR5cGUvc3VidHlwZSBhbmQgY29kZWNzCisgIC8vIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgTWltZVR5cGUuCisgIE1pbWVUeXBlIG1pbWVfdHlwZSgidmlkZW8vbXA0OyBjb2RlY3M9XCJ2cDlcIjsgIiArIG1heF92aWRlb19jYXBhYmlsaXRpZXMpOworICBpZiAoIW1pbWVfdHlwZS5pc192YWxpZCgpKSB7CisgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWF4IHJlc29sdXRpb25zIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzYCBpcyBpbnZhbGlkLiI7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHdpZHRoID0gbWltZV90eXBlLkdldFBhcmFtSW50VmFsdWUoIndpZHRoIiwgLTEpOworICBpbnQgaGVpZ2h0ID0gbWltZV90eXBlLkdldFBhcmFtSW50VmFsdWUoImhlaWdodCIsIC0xKTsKKyAgaWYgKHdpZHRoIDw9IDAgJiYgaGVpZ2h0IDw9IDApIHsKKyAgICBTQl9MT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBwYXJzZSBtYXggcmVzb2x1dGlvbnMgYXMgZWl0aGVyIHdpZHRoIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodCBpc24ndCBzZXQuIjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHdpZHRoICE9IC0xICYmIGhlaWdodCAhPSAtMSkgeworICAgICptYXhfd2lkdGggPSB3aWR0aDsKKyAgICAqbWF4X2hlaWdodCA9IGhlaWdodDsKKyAgICBTQl9MT0coSU5GTykgPDwgIlBhcnNlZCBtYXggcmVzb2x1dGlvbnMgQCAoIiA8PCAqbWF4X3dpZHRoIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgPDwgKm1heF9oZWlnaHQgPDwgIikuIjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAod2luZG93X3dpZHRoIDw9IDAgfHwgd2luZG93X2hlaWdodCA8PSAwKSB7CisgICAgLy8gV2UgRENIRUNLKCkgYWJvdmUsIGJ1dCBqdXN0IGJlIHNhZmUuCisgICAgU0JfTE9HKFdBUk5JTkcpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWF4IHJlc29sdXRpb25zIGR1ZSB0byBpbnZhbGlkIHdpbmRvdyByZXNvbHV0aW9ucyAoIgorICAgICAgICA8PCB3aW5kb3dfd2lkdGggPDwgIiwgIiA8PCB3aW5kb3dfaGVpZ2h0IDw8ICIpLiI7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHdpZHRoID4gMCkgeworICAgICptYXhfd2lkdGggPSB3aWR0aDsKKyAgICAqbWF4X2hlaWdodCA9IG1heF93aWR0aC0+dmFsdWUoKSAqIHdpbmRvd19oZWlnaHQgLyB3aW5kb3dfd2lkdGg7CisgICAgU0JfTE9HKElORk8pIDw8ICJJbmZlcnJlZCBtYXggaGVpZ2h0ICgiIDw8ICptYXhfaGVpZ2h0CisgICAgICAgICAgICAgICAgIDw8ICIpIGZyb20gbWF4X3dpZHRoICgiIDw8ICptYXhfd2lkdGgKKyAgICAgICAgICAgICAgICAgPDwgIikgYW5kIHdpbmRvdyByZXNvbHV0aW9uIEAgKCIgPDwgd2luZG93X3dpZHRoIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgPDwgd2luZG93X2hlaWdodCA8PCAiKS4iOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChoZWlnaHQgPiAwKSB7CisgICAgKm1heF9oZWlnaHQgPSBoZWlnaHQ7CisgICAgKm1heF93aWR0aCA9IG1heF9oZWlnaHQtPnZhbHVlKCkgKiB3aW5kb3dfd2lkdGggLyB3aW5kb3dfaGVpZ2h0OworICAgIFNCX0xPRyhJTkZPKSA8PCAiSW5mZXJyZWQgbWF4IHdpZHRoICgiIDw8ICptYXhfd2lkdGgKKyAgICAgICAgICAgICAgICAgPDwgIikgZnJvbSBtYXhfaGVpZ2h0ICgiIDw8ICptYXhfaGVpZ2h0CisgICAgICAgICAgICAgICAgIDw8ICIpIGFuZCB3aW5kb3cgcmVzb2x1dGlvbiBAICgiIDw8IHdpbmRvd193aWR0aCA8PCAiLCAiCisgICAgICAgICAgICAgICAgIDw8IHdpbmRvd19oZWlnaHQgPDwgIikuIjsKKyAgfQorfQorCiBjbGFzcyBWaWRlb0ZyYW1lSW1wbCA6IHB1YmxpYyBWaWRlb0ZyYW1lIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZpZGVvRnJhbWVSZWxlYXNlQ2FsbGJhY2s7CkBAIC0yMzUsMTIgKzM2MSwxMyBAQAogICAgICAgb3V0cHV0X21vZGVfKG91dHB1dF9tb2RlKSwKICAgICAgIGRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8oCiAgICAgICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKSwKKyAgICAgIG1heF92aWRlb19jYXBhYmlsaXRpZXNfKG1heF92aWRlb19jYXBhYmlsaXRpZXMpLAogICAgICAgdHVubmVsX21vZGVfYXVkaW9fc2Vzc2lvbl9pZF8odHVubmVsX21vZGVfYXVkaW9fc2Vzc2lvbl9pZCksCiAgICAgICBmb3JjZV9yZXNldF9zdXJmYWNlX3VuZGVyX3R1bm5lbF9tb2RlXygKICAgICAgICAgICBmb3JjZV9yZXNldF9zdXJmYWNlX3VuZGVyX3R1bm5lbF9tb2RlKSwKICAgICAgIGhhc19uZXdfdGV4dHVyZV9hdmFpbGFibGVfKGZhbHNlKSwKICAgICAgIHN1cmZhY2VfY29uZGl0aW9uX3ZhcmlhYmxlXyhzdXJmYWNlX2Rlc3Ryb3lfbXV0ZXhfKSwKLSAgICAgIHJlcXVpcmVfc29mdHdhcmVfY29kZWNfKCFtYXhfdmlkZW9fY2FwYWJpbGl0aWVzLmVtcHR5KCkpLAorICAgICAgcmVxdWlyZV9zb2Z0d2FyZV9jb2RlY18oSXNTb2Z0d2FyZURlY29kZVJlcXVpcmVkKG1heF92aWRlb19jYXBhYmlsaXRpZXMpKSwKICAgICAgIGZvcmNlX2JpZ19lbmRpYW5faGRyX21ldGFkYXRhXyhmb3JjZV9iaWdfZW5kaWFuX2hkcl9tZXRhZGF0YSksCiAgICAgICBmb3JjZV9pbXByb3ZlZF9zdXBwb3J0X2NoZWNrXyhmb3JjZV9pbXByb3ZlZF9zdXBwb3J0X2NoZWNrKSwKICAgICAgIG51bWJlcl9vZl9wcmVyb2xsX2ZyYW1lc18oa0luaXRpYWxQcmVyb2xsRnJhbWVDb3VudCkgewpAQCAtNTU1LDggKzY4Miw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gIGlmICghR2V0VmlkZW9XaW5kb3dTaXplKCZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgaW50IHdpbmRvd193aWR0aCwgd2luZG93X2hlaWdodDsKKyAgaWYgKCFHZXRWaWRlb1dpbmRvd1NpemUoJndpbmRvd193aWR0aCwgJndpbmRvd19oZWlnaHQpKSB7CiAgICAgKmVycm9yX21lc3NhZ2UgPQogICAgICAgICAiQ2FuJ3QgaW5pdGlhbGl6ZSB0aGUgY29kZWMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHZpZGVvIHdpbmRvdy4iOwogICAgIFNCX0xPRyhFUlJPUikgPDwgKmVycm9yX21lc3NhZ2U7CkBAIC01NzAsMTAgKzY5NywxNyBAQAogICB9IGVsc2UgewogICAgIFNCX0RDSEVDSyh2aWRlb19mcHNfID09IDApOwogICB9CisKKyAgb3B0aW9uYWw8aW50PiBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisgIC8vIFRPRE8oYi8yODE0MzEyMTQpOiBFdmFsdWF0ZSBpZiB3ZSBzaG91bGQgYWxzbyBwYXJzZSB0aGUgZnBzIGZyb20KKyAgLy8gICAgICAgICAgICAgICAgICAgIGBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzX2AgYW5kIHBhc3MgdG8gTWVkaWFEZWNvZGVyIGN0b3IuCisgIFBhcnNlTWF4UmVzb2x1dGlvbihtYXhfdmlkZW9fY2FwYWJpbGl0aWVzXywgd2luZG93X3dpZHRoLCB3aW5kb3dfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgJm1heF93aWR0aCwgJm1heF9oZWlnaHQpOworCiAgIG1lZGlhX2RlY29kZXJfLnJlc2V0KG5ldyBNZWRpYURlY29kZXIoCi0gICAgICB0aGlzLCB2aWRlb19jb2RlY18sIHdpZHRoLCBoZWlnaHQsIHZpZGVvX2Zwc18sIGpfb3V0cHV0X3N1cmZhY2UsCi0gICAgICBkcm1fc3lzdGVtXywgY29sb3JfbWV0YWRhdGFfID8gJipjb2xvcl9tZXRhZGF0YV8gOiBudWxscHRyLAotICAgICAgcmVxdWlyZV9zb2Z0d2FyZV9jb2RlY18sCisgICAgICB0aGlzLCB2aWRlb19jb2RlY18sIHdpbmRvd193aWR0aCwgd2luZG93X2hlaWdodCwgbWF4X3dpZHRoLCBtYXhfaGVpZ2h0LAorICAgICAgdmlkZW9fZnBzXywgal9vdXRwdXRfc3VyZmFjZSwgZHJtX3N5c3RlbV8sCisgICAgICBjb2xvcl9tZXRhZGF0YV8gPyAmKmNvbG9yX21ldGFkYXRhXyA6IG51bGxwdHIsIHJlcXVpcmVfc29mdHdhcmVfY29kZWNfLAogICAgICAgc3RkOjpiaW5kKCZWaWRlb0RlY29kZXI6Ok9uVHVubmVsTW9kZUZyYW1lUmVuZGVyZWQsIHRoaXMsIF8xKSwKICAgICAgIHR1bm5lbF9tb2RlX2F1ZGlvX3Nlc3Npb25faWRfLCBmb3JjZV9iaWdfZW5kaWFuX2hkcl9tZXRhZGF0YV8sCiAgICAgICBmb3JjZV9pbXByb3ZlZF9zdXBwb3J0X2NoZWNrXywgZXJyb3JfbWVzc2FnZSkpOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3ZpZGVvX2RlY29kZXIuaCBiL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb19kZWNvZGVyLmgKaW5kZXggMzRjNzAwMS4uZDhlYWZlZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3ZpZGVvX2RlY29kZXIuaAorKysgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdmlkZW9fZGVjb2Rlci5oCkBAIC0xMjcsOCArMTI3LDEwIEBACiAgIEVycm9yQ0IgZXJyb3JfY2JfOwogICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW1fOwogICBjb25zdCBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVfOwotICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgorICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBjb25zdAogICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbWF4X3ZpZGVvX2NhcGFiaWxpdGllc187CisKICAgLy8gQW5kcm9pZCBkb2Vzbid0IG9mZmljaWFsbHkgc3VwcG9ydCBtdWx0aSBjb25jdXJyZW50IGNvZGVjcy4gQnV0IHRoZSBkZXZpY2UKICAgLy8gdXN1YWxseSBoYXMgYXQgbGVhc3Qgb25lIGhhcmR3YXJlIGRlY29kZXIgYW5kIEdvb2dsZSdzIHNvZnR3YXJlIGRlY29kZXJzLgogICAvLyBHb29nbGUncyBzb2Z0d2FyZSBkZWNvZGVycyBjYW4gd29yayBjb25jdXJyZW50bHkuIFNvLCB3ZSB1c2UgSFcgZGVjb2RlciBmb3IKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb193aW5kb3cuY2MgYi9zdGFyYm9hcmQvYW5kcm9pZC9zaGFyZWQvdmlkZW9fd2luZG93LmNjCmluZGV4IDgxZDg5OGQuLjVlNDAxZWMgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9hbmRyb2lkL3NoYXJlZC92aWRlb193aW5kb3cuY2MKKysrIGIvc3RhcmJvYXJkL2FuZHJvaWQvc2hhcmVkL3ZpZGVvX3dpbmRvdy5jYwpAQCAtMTAzLDcgKzEwMyw5IEBACiAgIC8vIENyZWF0ZSBhbiBPcGVuR0wgRVMgMi4wIGNvbnRleHQuCiAgIEVHTENvbnRleHQgY29udGV4dCA9IEVHTF9OT19DT05URVhUOwogICBFR0xpbnQgY29udGV4dF9hdHRyaWJfbGlzdFtdID0gewotICAgICAgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FLAorICAgICAgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sCisgICAgICAyLAorICAgICAgRUdMX05PTkUsCiAgIH07CiAgIGNvbnRleHQgPQogICAgICAgZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBjb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYl9saXN0KTsKQEAgLTE3MSw3ICsxNzMsNiBAQAogCiBqb2JqZWN0IFZpZGVvU3VyZmFjZUhvbGRlcjo6QWNxdWlyZVZpZGVvU3VyZmFjZSgpIHsKICAgU2NvcGVkTG9jayBsb2NrKCpHZXRWaWV3U3VyZmFjZU11dGV4KCkpOwotICBTQl9EQ0hFQ0soZ192aWRlb19zdXJmYWNlX2hvbGRlciA9PSBOVUxMKTsKICAgaWYgKGdfdmlkZW9fc3VyZmFjZV9ob2xkZXIgIT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwogICB9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC94ODYvdGVzdF9maWx0ZXJzLnB5IGIvc3RhcmJvYXJkL2FuZHJvaWQveDg2L3Rlc3RfZmlsdGVycy5weQppbmRleCBkNmNhMTlhLi4yN2UzMGRjIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC94ODYvdGVzdF9maWx0ZXJzLnB5CisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL3g4Ni90ZXN0X2ZpbHRlcnMucHkKQEAgLTE5LDE3ICsxOSwyMCBAQAogIyBBIG1hcCBvZiBmYWlsaW5nIG9yIGNyYXNoaW5nIHRlc3RzIHBlciB0YXJnZXQKIF9GSUxURVJFRF9URVNUUyA9IHsKICAgICAnbnBsYic6IFsKKyAgICAgICAgJ011bHRpcGxlUGxheWVyVGVzdHMvKicsCiAgICAgICAgICdTYkFjY2Vzc2liaWxpdHlUZXN0LkNhbGxTZXRDYXB0aW9uc0VuYWJsZWQnLAogICAgICAgICAnU2JBY2Nlc3NpYmlsaXR5VGVzdC5HZXRDYXB0aW9uU2V0dGluZ3NSZXR1cm5Jc1ZhbGlkJywKICAgICAgICAgJ1NiQXVkaW9TaW5rVGVzdC4qJywKICAgICAgICAgJ1NiTWljcm9waG9uZUNsb3NlVGVzdC4qJywKICAgICAgICAgJ1NiTWljcm9waG9uZU9wZW5UZXN0LionLAogICAgICAgICAnU2JNaWNyb3Bob25lUmVhZFRlc3QuKicsCi0gICAgICAgICdTYlBsYXllcldyaXRlU2FtcGxlVGVzdHMvU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3QuKicsCisgICAgICAgICdTYlBsYXllckdldEF1ZGlvQ29uZmlndXJhdGlvblRlc3RzLyonLAorICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzLyonLAogICAgICAgICAoJ1NiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb25UZXN0cy9TYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uVGVzdCcKICAgICAgICAgICcuV3JpdGVDb250aW51ZWRMaW1pdGVkSW5wdXQvKicpLAogICAgICAgICAoJ1NiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb25UZXN0cy9TYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uVGVzdCcKICAgICAgICAgICcuV3JpdGVMaW1pdGVkSW5wdXQvKicpLAorICAgICAgICAnVmVydGljYWxWaWRlb1Rlc3RzL1ZlcnRpY2FsVmlkZW9UZXN0LldyaXRlU2FtcGxlcy8qJywKICAgICBdLAogICAgICdwbGF5ZXJfZmlsdGVyX3Rlc3RzJzogWwogICAgICAgICAnQXVkaW9EZWNvZGVyVGVzdHMvKicsCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYW5kcm9pZC94ODYvdG9vbGNoYWluL0JVSUxELmduIGIvc3RhcmJvYXJkL2FuZHJvaWQveDg2L3Rvb2xjaGFpbi9CVUlMRC5nbgppbmRleCA4YmY2ZDI5Li4zYTFjYzA2IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYW5kcm9pZC94ODYvdG9vbGNoYWluL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9hbmRyb2lkL3g4Ni90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTIxLDkgKzIxLDkgQEAKICAgY2MgPSAiJHByZWZpeC9pNjg2LWxpbnV4LWFuZHJvaWQke2FuZHJvaWRfbmRrX2FwaV9sZXZlbH0tY2xhbmciCiAgIGN4eCA9ICIkcHJlZml4L2k2ODYtbGludXgtYW5kcm9pZCR7YW5kcm9pZF9uZGtfYXBpX2xldmVsfS1jbGFuZysrIgogICBsZCA9IGN4eAotICByZWFkZWxmID0gIiRwcmVmaXgvaTY4Ni1saW51eC1hbmRyb2lkLXJlYWRlbGYiCi0gIGFyID0gIiRwcmVmaXgvaTY4Ni1saW51eC1hbmRyb2lkLWFyIgotICBubSA9ICIkcHJlZml4L2k2ODYtbGludXgtYW5kcm9pZC1ubSIKKyAgcmVhZGVsZiA9ICJyZWFkZWxmIgorICBhciA9ICJhciIKKyAgbm0gPSAibm0iCiAKICAgdG9vbGNoYWluX2FyZ3MgPSB7CiAgICAgaXNfY2xhbmcgPSB0cnVlCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL0JVSUxELmduIGIvc3RhcmJvYXJkL2J1aWxkL2NvbmZpZy9CVUlMRC5nbgppbmRleCBhY2I4NTk3Li5hYWE4N2Y5IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvQlVJTEQuZ24KQEAgLTkyLDkgKzkyLDExIEBACiBjb25maWcoInRhcmdldCIpIHsKICAgaWYgKGN1cnJlbnRfdG9vbGNoYWluICE9IGhvc3RfdG9vbGNoYWluKSB7CiAgICAgaWYgKGZpbmFsX2V4ZWN1dGFibGVfdHlwZSA9PSAic2hhcmVkX2xpYnJhcnkiKSB7Ci0gICAgICAjIFJld3JpdGUgbWFpbigpIGZ1bmN0aW9ucyBpbnRvIFN0YXJib2FyZE1haW4uIFRPRE86IFRoaXMgaXMgYQotICAgICAgIyBoYWNrLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYmUgbW9yZSBzdXJnaWNhbCwgaGVyZS4KLSAgICAgIGRlZmluZXMgPSBbICJtYWluPVN0YXJib2FyZE1haW4iIF0KKyAgICAgIGlmICghYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluKSB7CisgICAgICAgICMgUmV3cml0ZSBtYWluKCkgZnVuY3Rpb25zIGludG8gU3RhcmJvYXJkTWFpbi4gVE9ETzogVGhpcyBpcyBhCisgICAgICAgICMgaGFjaywgaXQgd291bGQgYmUgYmV0dGVyIHRvIGJlIG1vcmUgc3VyZ2ljYWwsIGhlcmUuCisgICAgICAgIGRlZmluZXMgPSBbICJtYWluPVN0YXJib2FyZE1haW4iIF0KKyAgICAgIH0KIAogICAgICAgIyBUbyBsaW5rIGludG8gYSBzaGFyZWQgbGlicmFyeSBvbiBMaW51eCBhbmQgc2ltaWxhciBwbGF0Zm9ybXMsCiAgICAgICAjIHRoZSBjb21waWxlciBtdXN0IGJlIHRvbGQgdG8gZ2VuZXJhdGUgUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZS4KQEAgLTExNCw3ICsxMTYsNyBAQAogIyBUT0RPKGIvMjEyNjQxMDY1KTogU2NvcGUgZ2xvYmFsIGRlZmluZXMgbWlncmF0ZWQgZnJvbQogIyBjb2JhbHRfY29uZmlndXJhdGlvbi5neXBpIHRvIG9ubHkgdGhlIHRhcmdldHMgdGhleSdyZSBuZWNlc3NhcnkgaW4uCiBjb25maWcoInN0YXJib2FyZCIpIHsKLSAgaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IGRlZmF1bHRfdG9vbGNoYWluKSB7CisgIGlmIChpc19zdGFyYm9hcmRpemVkX3Rvb2xjaGFpbikgewogICAgIGRlZmluZXMgPSBbCiAgICAgICAiU1RBUkJPQVJEIiwKICAgICAgICJDT0JBTFQiLCAgIyBUT0RPOiBTZWUgaWYgdGhpcyBjYW4gYmUgcmVwbGFjZWQgYnkgU1RBUkJPQVJEIG1hY3JvLgpAQCAtMTgwLDcgKzE4Miw3IEBACiB9CiAKIGNvbmZpZygic3BlZWQiKSB7Ci0gIGlmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbikgeworICBpZiAoaXNfc3RhcmJvYXJkaXplZF90b29sY2hhaW4pIHsKICAgICBpZiAoZGVmaW5lZChzcGVlZF9jb25maWdfcGF0aCkpIHsKICAgICAgIGNvbmZpZ3MgPSBbIHNwZWVkX2NvbmZpZ19wYXRoIF0KICAgICB9CkBAIC0xODgsNyArMTkwLDcgQEAKIH0KIAogY29uZmlnKCJzaXplIikgewotICBpZiAoY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4pIHsKKyAgaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSB7CiAgICAgaWYgKGRlZmluZWQoc2l6ZV9jb25maWdfcGF0aCkpIHsKICAgICAgIGNvbmZpZ3MgPSBbIHNpemVfY29uZmlnX3BhdGggXQogICAgIH0KQEAgLTE5Niw3ICsxOTgsNyBAQAogfQogCiBjb25maWcoInBlZGFudGljX3dhcm5pbmdzIikgewotICBpZiAoY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4pIHsKKyAgaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSB7CiAgICAgaWYgKGRlZmluZWQocGVkYW50aWNfd2FybmluZ3NfY29uZmlnX3BhdGgpKSB7CiAgICAgICBjb25maWdzID0gWyBwZWRhbnRpY193YXJuaW5nc19jb25maWdfcGF0aCBdCiAgICAgfQpAQCAtMjA0LDcgKzIwNiw3IEBACiB9CiAKIGNvbmZpZygibm9fcGVkYW50aWNfd2FybmluZ3MiKSB7Ci0gIGlmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbiB8fAorICBpZiAoaXNfc3RhcmJvYXJkaXplZF90b29sY2hhaW4gfHwKICAgICAgIGN1cnJlbnRfdG9vbGNoYWluID09ICIvLyRzdGFyYm9hcmRfcGF0aC90b29sY2hhaW46bmF0aXZlX3RhcmdldCIpIHsKICAgICBpZiAoZGVmaW5lZChub19wZWRhbnRpY193YXJuaW5nc19jb25maWdfcGF0aCkpIHsKICAgICAgIGNvbmZpZ3MgPSBbIG5vX3BlZGFudGljX3dhcm5pbmdzX2NvbmZpZ19wYXRoIF0KQEAgLTIyMyw4ICsyMjUsNyBAQAogIyBvdmVycmlkZSBmbGFncyBzcGVjaWZpZWQgaW4gYSBwbGF0Zm9ybSdzICJwbGF0Zm9ybV9jb25maWd1cmF0aW9uIiBjb25maWcsCiAjIHdoaWNoIGlzIHdoZXJlIHRoZXNlIHBhcnRpY3VsYXIgZmxhZ3Mgd291bGQgb3RoZXJ3aXNlIG5hdHVyYWxseSBmaXQuCiBjb25maWcoImRlZmF1bHRfY29tcGlsZXJfZmxhZ3MiKSB7Ci0gIGlmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbiAmJiBzYl9pc19ldmVyZ3JlZW4gJiYKLSAgICAgIHRhcmdldF9jcHUgPT0gImFybSIpIHsKKyAgaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluICYmIHNiX2lzX2V2ZXJncmVlbiAmJiB0YXJnZXRfY3B1ID09ICJhcm0iKSB7CiAgICAgY2ZsYWdzID0gWyAiLW1mcHU9dmZwdjMiIF0KICAgICBhc21mbGFncyA9IGNmbGFncwogICB9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL0JVSUxEQ09ORklHLmduIGIvc3RhcmJvYXJkL2J1aWxkL2NvbmZpZy9CVUlMRENPTkZJRy5nbgppbmRleCBkMWM3ZWJhLi41ZWZjMmM4IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL0JVSUxEQ09ORklHLmduCisrKyBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvQlVJTERDT05GSUcuZ24KQEAgLTMzLDYgKzMzLDggQEAKICAgaXNfZG9ja2VyX2J1aWxkID0gZ2V0ZW52KCJJU19ET0NLRVIiKSA9PSAiMSIKIAogICB1c2luZ19vbGRfY29tcGlsZXIgPSBmYWxzZQorCisgIGJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbiA9IGZhbHNlCiB9CiAKIGFzc2VydCghKGlzX3N0YXJib2FyZCAmJiBpc19uYXRpdmVfdGFyZ2V0X2J1aWxkKSwKQEAgLTg2LDkgKzg4LDYgQEAKICMgY29uZmlndXJhdGlvbi4KIGltcG9ydCgiLy9zdGFyYm9hcmQvYnVpbGQvcGxhdGZvcm1fcGF0aC5nbmkiKQogCi1pbXBvcnQoIi8vJHN0YXJib2FyZF9wYXRoL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkiKQotaW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC9jb25maWcvYnVpbGRfYXNzZXJ0aW9ucy5nbmkiKQotCiAjIFRPRE8oYi8yNzI3OTA4NzMpOiBTZXQgaG9zdF9jcHUgdG8geDg2IGZvciAzMiBiaXQgYnVpbGRzLgogaWYgKHRhcmdldF9jcHUgPT0gIng4NiIgfHwgdGFyZ2V0X2NwdSA9PSAiYXJtIikgewogICBfaG9zdF90b29sY2hhaW5fY3B1ID0gIng4NiIKQEAgLTk2LDEyICs5NSwxOSBAQAogICBfaG9zdF90b29sY2hhaW5fY3B1ID0gaG9zdF9jcHUKIH0KIGhvc3RfdG9vbGNoYWluID0gIi8vc3RhcmJvYXJkL2J1aWxkL3Rvb2xjaGFpbi8kaG9zdF9vczokX2hvc3RfdG9vbGNoYWluX2NwdSIKLWlmIChzYl9pc19ldmVyZ3JlZW4pIHsKLSAgdGFyZ2V0X3Rvb2xjaGFpbiA9ICIvL3N0YXJib2FyZC9idWlsZC90b29sY2hhaW4vbGludXg6Y2xhbmdfbGxkIgorCitpZiAoYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluKSB7CisgIGNvYmFsdF90b29sY2hhaW4gPSAiLy9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4OmNsYW5nX2xsZCIKKyAgc3RhcmJvYXJkX3Rvb2xjaGFpbiA9ICIvLyRzdGFyYm9hcmRfcGF0aC90b29sY2hhaW46c3RhcmJvYXJkIgogfSBlbHNlIHsKLSAgdGFyZ2V0X3Rvb2xjaGFpbiA9ICIvLyRzdGFyYm9hcmRfcGF0aC90b29sY2hhaW46dGFyZ2V0IgorICBjb2JhbHRfdG9vbGNoYWluID0gIi8vJHN0YXJib2FyZF9wYXRoL3Rvb2xjaGFpbjp0YXJnZXQiCisgIHN0YXJib2FyZF90b29sY2hhaW4gPSBjb2JhbHRfdG9vbGNoYWluCiB9Ci1zZXRfZGVmYXVsdF90b29sY2hhaW4odGFyZ2V0X3Rvb2xjaGFpbikKK3NldF9kZWZhdWx0X3Rvb2xjaGFpbihjb2JhbHRfdG9vbGNoYWluKQoraW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC9jb25maWcvdG9vbGNoYWluX3ZhcmlhYmxlcy5nbmkiKQorCitpbXBvcnQoIi8vJHN0YXJib2FyZF9wYXRoL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkiKQoraW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC9jb25maWcvYnVpbGRfYXNzZXJ0aW9ucy5nbmkiKQogCiBkZWNsYXJlX2FyZ3MoKSB7CiAgIHVzZV90c2FuID0gZ2V0ZW52KCJVU0VfVFNBTiIpID09IDEKQEAgLTMwOCwxMiArMzE0LDE0IEBACiB9CiAKIHRlbXBsYXRlKCJleGVjdXRhYmxlIikgeworICBub3RfbmVlZGVkKGludm9rZXIsIFsgImJ1aWxkX2xvYWRlciIgXSkKKwogICB0YXJnZXRfd2l0aF9wbGF0Zm9ybV9jb25maWdzKHRhcmdldF9uYW1lKSB7CiAgICAgdGFyZ2V0X3R5cGUgPSAiZXhlY3V0YWJsZSIKICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsICIqIiwgWyAiaW5zdGFsbF90YXJnZXQiIF0pCiAgIH0KIAotICBpZiAoY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4gJiYKKyAgaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluICYmCiAgICAgICAoIWRlZmluZWQoaW52b2tlci5pbnN0YWxsX3RhcmdldCkgfHwgaW52b2tlci5pbnN0YWxsX3RhcmdldCkpIHsKICAgICBleGVjdXRhYmxlX3RhcmdldF9uYW1lID0gdGFyZ2V0X25hbWUKIApAQCAtMzM4LDEzICszNDYsMjAgQEAKICAgICBpbnN0YWxsX3RhcmdldCh0YXJnZXRfbmFtZSArICJfaW5zdGFsbCIpIHsKICAgICAgIGZvcndhcmRfdmFyaWFibGVzX2Zyb20oaW52b2tlciwgWyAidGVzdG9ubHkiIF0pCiAgICAgICBpbnN0YWxsYWJsZV90YXJnZXRfbmFtZSA9IGV4ZWN1dGFibGVfdGFyZ2V0X25hbWUKKyAgICAgIGluc3RhbGxhYmxlX3RhcmdldF9kZXAgPSAiOiRleGVjdXRhYmxlX3RhcmdldF9uYW1lIgorICAgICAgbm90X25lZWRlZChbICJpbnN0YWxsYWJsZV90YXJnZXRfZGVwIiBdKQogICAgICAgdHlwZSA9ICJleGVjdXRhYmxlIgorCiAgICAgICBkZXBzID0gW10KICAgICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwcykpIHsKICAgICAgICAgZGVwcyArPSBpbnZva2VyLmRlcHMKICAgICAgIH0KICAgICAgIGZvcmVhY2goZGVwLCBkYXRhX2RlcHMpIHsKLSAgICAgICAgZGVwcyArPSBbICIke2RlcH1faW5zdGFsbF9jb250ZW50IiBdCisgICAgICAgIHNwbCA9IFtdCisgICAgICAgIHNwbCA9IHN0cmluZ19zcGxpdChkZXAsICIoIikKKyAgICAgICAgaWYgKFsgc3BsWzBdIF0gPT0gc3BsKSB7CisgICAgICAgICAgZGVwcyArPSBbICIke2RlcH1faW5zdGFsbF9jb250ZW50IiBdCisgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChzZXBhcmF0ZV9pbnN0YWxsX3RhcmdldHNfZm9yX2J1bmRsaW5nKSB7CiAgICAgICAgIGRlcHMgKz0gWyAiOiR7ZXhlY3V0YWJsZV90YXJnZXRfbmFtZX1fYnVuZGxlX2NvbnRlbnQiIF0KQEAgLTM1NCwxMiArMzY5LDY2IEBACiB9CiAKIHRlbXBsYXRlKCJzaGFyZWRfbGlicmFyeSIpIHsKLSAgdGFyZ2V0X3dpdGhfcGxhdGZvcm1fY29uZmlncyh0YXJnZXRfbmFtZSkgeworICBpZiAoZGVmaW5lZChpbnZva2VyLmJ1aWxkX2xvYWRlcikgJiYgaW52b2tlci5idWlsZF9sb2FkZXIgPT0gZmFsc2UpIHsKKyAgICBidWlsZF9sb2FkZXIgPSBmYWxzZQorICB9IGVsc2UgeworICAgIGJ1aWxkX2xvYWRlciA9IGJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbgorICB9CisKKyAgaWYgKGJ1aWxkX2xvYWRlcikgeworICAgIG9yaWdpbmFsX3RhcmdldF9uYW1lID0gIiR7dGFyZ2V0X25hbWV9X29yaWdpbmFsX3RhcmdldCIKKyAgfSBlbHNlIHsKKyAgICBvcmlnaW5hbF90YXJnZXRfbmFtZSA9IHRhcmdldF9uYW1lCisgIH0KKyAgYWN0dWFsX3RhcmdldF9uYW1lID0gdGFyZ2V0X25hbWUKKworICB0YXJnZXRfd2l0aF9wbGF0Zm9ybV9jb25maWdzKG9yaWdpbmFsX3RhcmdldF9uYW1lKSB7CisgICAgb3V0cHV0X25hbWUgPSBhY3R1YWxfdGFyZ2V0X25hbWUKICAgICB0YXJnZXRfdHlwZSA9ICJzaGFyZWRfbGlicmFyeSIKICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsICIqIiwgWyAiaW5zdGFsbF90YXJnZXQiIF0pCiAgIH0KIAotICBpZiAoY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4gJiYKKyAgaWYgKGJ1aWxkX2xvYWRlcikgeworICAgIGdyb3VwKHRhcmdldF9uYW1lKSB7CisgICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgInRlc3Rvbmx5IiBdKQorICAgICAgZGVwcyA9IFsKKyAgICAgICAgIjoke2FjdHVhbF90YXJnZXRfbmFtZX1fbG9hZGVyKCRzdGFyYm9hcmRfdG9vbGNoYWluKSIsCisgICAgICAgICI6JHthY3R1YWxfdGFyZ2V0X25hbWV9X2xvYWRlcl9jb3B5KCRzdGFyYm9hcmRfdG9vbGNoYWluKSIsCisgICAgICBdCisgICAgfQorICAgIGlmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBzdGFyYm9hcmRfdG9vbGNoYWluKSB7CisgICAgICBleGVjdXRhYmxlKCIke2FjdHVhbF90YXJnZXRfbmFtZX1fbG9hZGVyIikgeworICAgICAgICBvdXRwdXRfbmFtZSA9ICIke2FjdHVhbF90YXJnZXRfbmFtZX1fbG9hZGVyIgorICAgICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgInRlc3Rvbmx5IiBdKQorICAgICAgICBzb3VyY2VzID0gWyAiLy8kc3RhcmJvYXJkX3BhdGgvc3RhcmJvYXJkX2xvYWRlci5jYyIgXQorCisgICAgICAgIG91dF9kaXIgPSByZWJhc2VfcGF0aChyb290X2J1aWxkX2RpcikKKyAgICAgICAgZGVmaW5lcyA9IFsKKyAgICAgICAgICAiU0JfTE9BREVSX01PRFVMRT1cIiRhY3R1YWxfdGFyZ2V0X25hbWVcIiIsCisgICAgICAgICAgIk9VVF9ESVJFQ1RPUlk9XCIke291dF9kaXJ9XCIiLAorICAgICAgICBdCisgICAgICAgIGNvbmZpZ3MgKz0gWyAiLy9zdGFyYm9hcmQvYnVpbGQvY29uZmlnOnN0YXJib2FyZF9pbXBsZW1lbnRhdGlvbiIgXQorCisgICAgICAgIGxkZmxhZ3MgPSBbCisgICAgICAgICAgIi1XbCwtcnBhdGg9IiArIHJlYmFzZV9wYXRoKCIkcm9vdF9idWlsZF9kaXIvc3RhcmJvYXJkIiksCisgICAgICAgICAgIi1XbCwtcnBhdGg9IiArIHJlYmFzZV9wYXRoKCIkcm9vdF9idWlsZF9kaXIiKSwKKyAgICAgICAgXQorCisgICAgICAgIGRlcHMgPSBbCisgICAgICAgICAgIjokb3JpZ2luYWxfdGFyZ2V0X25hbWUoJGNvYmFsdF90b29sY2hhaW4pIiwKKyAgICAgICAgICAiLy9zdGFyYm9hcmQ6c3RhcmJvYXJkX3BsYXRmb3JtX2dyb3VwKCRzdGFyYm9hcmRfdG9vbGNoYWluKSIsCisgICAgICAgIF0KKyAgICAgIH0KKyAgICAgIGNvcHkoIiR7YWN0dWFsX3RhcmdldF9uYW1lfV9sb2FkZXJfY29weSIpIHsKKyAgICAgICAgZm9yd2FyZF92YXJpYWJsZXNfZnJvbShpbnZva2VyLCBbICJ0ZXN0b25seSIgXSkKKyAgICAgICAgc291cmNlcyA9IFsgIiRyb290X291dF9kaXIvJHthY3R1YWxfdGFyZ2V0X25hbWV9X2xvYWRlciIgXQorICAgICAgICBvdXRwdXRzID0gWyAiJHJvb3RfYnVpbGRfZGlyLyR7YWN0dWFsX3RhcmdldF9uYW1lfV9sb2FkZXIiIF0KKyAgICAgICAgZGVwcyA9IFsgIjoke2FjdHVhbF90YXJnZXRfbmFtZX1fbG9hZGVyIiBdCisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluICYmCiAgICAgICAoIWRlZmluZWQoaW52b2tlci5pbnN0YWxsX3RhcmdldCkgfHwgaW52b2tlci5pbnN0YWxsX3RhcmdldCkpIHsKICAgICBzaGFyZWRfbGlicmFyeV90YXJnZXRfbmFtZSA9IHRhcmdldF9uYW1lCiAKQEAgLTM4NSwxMyArNDU0LDIwIEBACiAgICAgaW5zdGFsbF90YXJnZXQodGFyZ2V0X25hbWUgKyAiX2luc3RhbGwiKSB7CiAgICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgInRlc3Rvbmx5IiBdKQogICAgICAgaW5zdGFsbGFibGVfdGFyZ2V0X25hbWUgPSBzaGFyZWRfbGlicmFyeV90YXJnZXRfbmFtZQorICAgICAgaW5zdGFsbGFibGVfdGFyZ2V0X2RlcCA9ICI6JG9yaWdpbmFsX3RhcmdldF9uYW1lIgorICAgICAgbm90X25lZWRlZChbICJpbnN0YWxsYWJsZV90YXJnZXRfZGVwIiBdKQogICAgICAgdHlwZSA9ICJzaGFyZWRfbGlicmFyeSIKKwogICAgICAgZGVwcyA9IFtdCiAgICAgICBpZiAoZGVmaW5lZChpbnZva2VyLmRlcHMpKSB7CiAgICAgICAgIGRlcHMgKz0gaW52b2tlci5kZXBzCiAgICAgICB9CiAgICAgICBmb3JlYWNoKGRlcCwgZGF0YV9kZXBzKSB7Ci0gICAgICAgIGRlcHMgKz0gWyAiJHtkZXB9X2luc3RhbGxfY29udGVudCIgXQorICAgICAgICBzcGwgPSBbXQorICAgICAgICBzcGwgPSBzdHJpbmdfc3BsaXQoZGVwLCAiKCIpCisgICAgICAgIGlmIChbIHNwbFswXSBdID09IHNwbCkgeworICAgICAgICAgIGRlcHMgKz0gWyAiJHtkZXB9X2luc3RhbGxfY29udGVudCIgXQorICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAoc2VwYXJhdGVfaW5zdGFsbF90YXJnZXRzX2Zvcl9idW5kbGluZykgewogICAgICAgICBkZXBzICs9IFsgIjoke3NoYXJlZF9saWJyYXJ5X3RhcmdldF9uYW1lfV9idW5kbGVfY29udGVudCIgXQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2J1aWxkL2NvbmZpZy9iYXNlX2NvbmZpZ3VyYXRpb24uZ25pIGIvc3RhcmJvYXJkL2J1aWxkL2NvbmZpZy9iYXNlX2NvbmZpZ3VyYXRpb24uZ25pCmluZGV4IDY5NjBjNzguLjAyNDExODAgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9idWlsZC9jb25maWcvYmFzZV9jb25maWd1cmF0aW9uLmduaQorKysgYi9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL2Jhc2VfY29uZmlndXJhdGlvbi5nbmkKQEAgLTIwLDYgKzIwLDEyIEBACiAjIEFsbCBidWlsZCBhcmd1bWVudHMgaW4gdGhpcyBmaWxlIG11c3QgaGF2ZSBkb2N1bWVudGF0aW9uLgogIyBQbGVhc2UgZm9sbG93IHRoZSBmb3JtYXR0aW5nIGluIHRoaXMgZmlsZSB3aGVuIGFkZGluZyBuZXcgb25lcy4KIAoraWYgKGJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbikgeworICBkZWZhdWx0X3RhcmdldF90eXBlID0gInNoYXJlZF9saWJyYXJ5IgorfSBlbHNlIHsKKyAgZGVmYXVsdF90YXJnZXRfdHlwZSA9ICJleGVjdXRhYmxlIgorfQorCiBkZWNsYXJlX2FyZ3MoKSB7CiAgICMgRW5hYmxlcyB0aGUgbmFzbSBjb21waWxlciB0byBiZSB1c2VkIHRvIGNvbXBpbGUgLmFzbSBmaWxlcy4KICAgbmFzbV9leGlzdHMgPSBmYWxzZQpAQCAtNTUsMTIgKzYxLDE1IEBACiAgICMgVGhlIHRhcmdldCB0eXBlIGZvciB0ZXN0IHRhcmdldHMuIEFsbG93cyBjaGFuZ2luZyB0aGUgdGFyZ2V0IHR5cGUKICAgIyBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIG5hdGl2ZSBjb2RlIG1heSByZXF1aXJlIGFuIGFkZGl0aW9uYWwgcGFja2FnaW5nIHN0ZXAKICAgIyAoZXguIEFuZHJvaWQpLgotICBndGVzdF90YXJnZXRfdHlwZSA9ICJleGVjdXRhYmxlIgorICBndGVzdF90YXJnZXRfdHlwZSA9IGRlZmF1bHRfdGFyZ2V0X3R5cGUKIAogICAjIFRoZSB0YXJnZXQgdHlwZSBmb3IgZXhlY3V0YWJsZSB0YXJnZXRzLiBBbGxvd3MgY2hhbmdpbmcgdGhlIHRhcmdldCB0eXBlCiAgICMgb24gcGxhdGZvcm1zIHdoZXJlIHRoZSBuYXRpdmUgY29kZSBtYXkgcmVxdWlyZSBhbiBhZGRpdGlvbmFsIHBhY2thZ2luZyBzdGVwCiAgICMgKGV4LiBBbmRyb2lkKS4KLSAgZmluYWxfZXhlY3V0YWJsZV90eXBlID0gImV4ZWN1dGFibGUiCisgIGZpbmFsX2V4ZWN1dGFibGVfdHlwZSA9IGRlZmF1bHRfdGFyZ2V0X3R5cGUKKworICBzdGFyYm9hcmRfbGV2ZWxfZ3Rlc3RfdGFyZ2V0X3R5cGUgPSAiZXhlY3V0YWJsZSIKKyAgc3RhcmJvYXJkX2xldmVsX2ZpbmFsX2V4ZWN1dGFibGVfdHlwZSA9ICJleGVjdXRhYmxlIgogCiAgICMgSGFsdCBleGVjdXRpb24gb24gZmFpbHVyZSB0byBhbGxvY2F0ZSBtZW1vcnkuCiAgIGFib3J0X29uX2FsbG9jYXRpb25fZmFpbHVyZSA9IHRydWUKQEAgLTEwMSwxMiArMTEwLDYgQEAKICAgIyBkZWZpbmVzIGhvdyB0aGUgYnVpbGQgc2hvdWxkIHByb2R1Y2UgdGhlIGluc3RhbGwvIGRpcmVjdG9yeS4KICAgaW5zdGFsbF90YXJnZXRfcGF0aCA9ICIvL3N0YXJib2FyZC9idWlsZC9pbnN0YWxsL25vX2luc3RhbGwuZ25pIgogCi0gICMgVGFyZ2V0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciBleGVjdXRhYmxlIHRhcmdldHMuCi0gIGV4ZWN1dGFibGVfY29uZmlncyA9IFtdCi0KLSAgIyBUYXJnZXQtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHNoYXJlZF9saWJyYXJ5IHRhcmdldHMuCi0gIHNoYXJlZF9saWJyYXJ5X2NvbmZpZ3MgPSBbXQotCiAgICMgVGFyZ2V0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciBzdGF0aWNfbGlicmFyeSB0YXJnZXRzLgogICBzdGF0aWNfbGlicmFyeV9jb25maWdzID0gW10KIApAQCAtMTY4LDMgKzE3MSwyNCBAQAogICAjIEVuYWJsZSBXQVNNIGFuZCBpbnN0YWxsIFdlYkFzc2VtYmx5IGdsb2JhbC4KICAgdjhfZW5hYmxlX3dlYmFzc2VtYmx5ID0gZmFsc2UKIH0KKworaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IHN0YXJib2FyZF90b29sY2hhaW4gJiYKKyAgICBidWlsZF93aXRoX3NlcGFyYXRlX2NvYmFsdF90b29sY2hhaW4pIHsKKyAgZGVjbGFyZV9hcmdzKCkgeworICAgICMgVGFyZ2V0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciBleGVjdXRhYmxlIHRhcmdldHMuCisgICAgZXhlY3V0YWJsZV9jb25maWdzID0KKyAgICAgICAgWyAiLy9idWlsZC9jb25maWcvZ2NjOnJwYXRoX2Zvcl9idWlsdF9zaGFyZWRfbGlicmFyaWVzIiBdCisKKyAgICAjIFRhcmdldC1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3Igc2hhcmVkX2xpYnJhcnkgdGFyZ2V0cy4KKyAgICBzaGFyZWRfbGlicmFyeV9jb25maWdzID0KKyAgICAgICAgWyAiLy9idWlsZC9jb25maWcvZ2NjOnJwYXRoX2Zvcl9idWlsdF9zaGFyZWRfbGlicmFyaWVzIiBdCisgIH0KK30gZWxzZSB7CisgIGRlY2xhcmVfYXJncygpIHsKKyAgICAjIFRhcmdldC1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3IgZXhlY3V0YWJsZSB0YXJnZXRzLgorICAgIGV4ZWN1dGFibGVfY29uZmlncyA9IFtdCisKKyAgICAjIFRhcmdldC1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3Igc2hhcmVkX2xpYnJhcnkgdGFyZ2V0cy4KKyAgICBzaGFyZWRfbGlicmFyeV9jb25maWdzID0gW10KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29iYWx0L2FjY291bnQvQlVJTEQuZ24gYi9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL3N0YXJib2FyZF90YXJnZXRfdHlwZS5nbmkKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIGNvYmFsdC9hY2NvdW50L0JVSUxELmduCmNvcHkgdG8gc3RhcmJvYXJkL2J1aWxkL2NvbmZpZy9zdGFyYm9hcmRfdGFyZ2V0X3R5cGUuZ25pCmluZGV4IDAyY2NlM2UuLjBjMzk4M2EgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvc3RhcmJvYXJkX3RhcmdldF90eXBlLmduaQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IDIwMjEgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwxMyArMTIsMTQgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc3RhdGljX2xpYnJhcnkoImFjY291bnQiKSB7Ci0gIGhhc19wZWRhbnRpY193YXJuaW5ncyA9IHRydWUKK2RlY2xhcmVfYXJncygpIHsKKyAgc3RhcmJvYXJkX3RhcmdldF90eXBlID0gIiIKK30KIAotICBzb3VyY2VzID0gWwotICAgICJhY2NvdW50X21hbmFnZXIuY2MiLAotICAgICJhY2NvdW50X21hbmFnZXIuaCIsCi0gIF0KLQotICBkZXBzID0gWyAiLy9zdGFyYm9hcmQ6c3RhcmJvYXJkX2hlYWRlcnNfb25seSIgXQoraWYgKHN0YXJib2FyZF90YXJnZXRfdHlwZSA9PSAiIikgeworICBpZiAoYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluKSB7CisgICAgc3RhcmJvYXJkX3RhcmdldF90eXBlID0gInNoYXJlZF9saWJyYXJ5IgorICB9IGVsc2UgeworICAgIHN0YXJib2FyZF90YXJnZXRfdHlwZSA9ICJncm91cCIKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2J1aWxkL2NvbmZpZy90b29sY2hhaW5fdmFyaWFibGVzLmduaSBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvdG9vbGNoYWluX3ZhcmlhYmxlcy5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNzk4MgotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvdG9vbGNoYWluX3ZhcmlhYmxlcy5nbmkKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2lzX2RlZmF1bHRfdG9vbGNoYWluID0gY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4KK2lzX3N0YXJib2FyZF90b29sY2hhaW4gPSBjdXJyZW50X3Rvb2xjaGFpbiA9PSBzdGFyYm9hcmRfdG9vbGNoYWluCitpc19jb2JhbHRfdG9vbGNoYWluID0gY3VycmVudF90b29sY2hhaW4gPT0gY29iYWx0X3Rvb2xjaGFpbgoraXNfaG9zdF90b29sY2hhaW4gPSBjdXJyZW50X3Rvb2xjaGFpbiA9PSBob3N0X3Rvb2xjaGFpbgorCisjIFRvb2xjaGFpbnMgdXNpbmcgU3RhcmJvYXJkIHRvb2xzLCBub3QgbmF0aXZlIHRvb2xzLgoraXNfc3RhcmJvYXJkaXplZF90b29sY2hhaW4gPSBpc19zdGFyYm9hcmRfdG9vbGNoYWluIHx8IGlzX2RlZmF1bHRfdG9vbGNoYWluCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvYnVpbGQvY29uZmlnL3dpbi9CVUlMRC5nbiBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvd2luL0JVSUxELmduCmluZGV4IDYwODJkODIuLmYyYWVjNzkgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9idWlsZC9jb25maWcvd2luL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9idWlsZC9jb25maWcvd2luL0JVSUxELmduCkBAIC0yMCwxNSArMjAsMTAgQEAKIH0KIAogY29uZmlnKCJjb21tb24iKSB7Ci0gIGlmICghY29iYWx0X2Zhc3RidWlsZCkgewotICAgICMgQ29udGFpbmVycyBjYW5ub3QgdXNlIFBEQnMsIHNvIHdlIGNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGVtLgotICAgICMgV2Ugd2FudCB0byBrZWVwIHRoZW0gZm9yIG5vbi1kb2NrZXIgYnVpbGRzIGFzIHRoZXkgbWFrZSBjb21waWxhdGlvbgotICAgICMgc2lnbmlmaWNhbnRseSBmYXN0ZXIuCi0gICAgY29uZmlncyA9IFsgIjpub19wZGJzIiBdCi0gIH0KKyAgY29uZmlncyA9IFtdCiAKICAgY2ZsYWdzX2NjID0gWyAiL1RQIiBdCi0gIGNmbGFncyA9IFtdCisgIGNmbGFncyA9IFsgIi9aNyIgXQogICBsZGZsYWdzID0gWwogICAgICIvTlhDT01QQVQiLAogICAgICIvTUFOSUZFU1Q6Tk8iLApAQCAtNDEsNiArMzYsOSBAQAogICAgICJVTklDT0RFIiwKICAgXQogCisgICMgQWxsb3dzIGNvbXBpbGF0aW9uIGFnYWluc3QgVlMgMjAyMi4KKyAgY29uZmlncyArPSBbICIvL2J1aWxkL2NvbmZpZy93aW46dmlzdWFsX3N0dWRpb192ZXJzaW9uX2NvbXBhdCIgXQorCiAgICMgbXN2c19iYXNlCiAgICMgT3V0cHV0RGlyZWN0b3J5IGFuZCBJbnRlcm1lZGlhdGVEaXJlY3RvcnksIG1heWJlIENoYXJhY3RlclNldAogICBpbmNsdWRlX2RpcnMgKz0gWwpAQCAtMjM4LDE1ICsyMzYsMyBAQAogICAgICIvd2Q0OTk2IiwKICAgXQogfQotCi1jb25maWcoIm5vX3BkYnMiKSB7Ci0gIGlmIChpc19kb2NrZXJfYnVpbGQpIHsKLSAgICBjZmxhZ3MgPSBbICIvWjciIF0KLSAgfSBlbHNlIHsKLSAgICBjZmxhZ3MgPSBbCi0gICAgICAiL1ppIiwKLSAgICAgICIvRlMiLAotICAgIF0KLSAgfQotICBsZGZsYWdzID0gWyAiL0RFQlVHOkZVTEwiIF0KLX0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9idWlsZC9pbnN0YWxsL2luc3RhbGxfdGFyZ2V0LmduaSBiL3N0YXJib2FyZC9idWlsZC9pbnN0YWxsL2luc3RhbGxfdGFyZ2V0LmduaQppbmRleCA3NjVlZDQxLi42MmY4M2UwIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvYnVpbGQvaW5zdGFsbC9pbnN0YWxsX3RhcmdldC5nbmkKKysrIGIvc3RhcmJvYXJkL2J1aWxkL2luc3RhbGwvaW5zdGFsbF90YXJnZXQuZ25pCkBAIC0xNiw2ICsxNiw3IEBACiAKIHRlbXBsYXRlKCJpbnN0YWxsX3RhcmdldCIpIHsKICAgaW5zdGFsbGFibGVfdGFyZ2V0X25hbWUgPSBpbnZva2VyLmluc3RhbGxhYmxlX3RhcmdldF9uYW1lCisgIGluc3RhbGxhYmxlX3RhcmdldF9kZXAgPSBpbnZva2VyLmluc3RhbGxhYmxlX3RhcmdldF9kZXAKIAogICBpZiAoaW52b2tlci50eXBlID09ICJleGVjdXRhYmxlIikgewogICAgIGluc3RhbGxfc3ViZGlyID0gImJpbiIKQEAgLTMwLDcgKzMxLDcgQEAKICAgY29weSgiY29weV8iICsgdGFyZ2V0X25hbWUpIHsKICAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgInRlc3Rvbmx5IiBdKQogICAgIGRlcHMgPSBpbnZva2VyLmRlcHMKLSAgICBkZXBzICs9IFsgIjokaW5zdGFsbGFibGVfdGFyZ2V0X25hbWUiIF0KKyAgICBkZXBzICs9IFsgaW5zdGFsbGFibGVfdGFyZ2V0X2RlcCBdCiAgICAgc291cmNlcyA9IFsgIiRyb290X291dF9kaXIvJHNvdXJjZV9uYW1lIiBdCiAgICAgb3V0cHV0cyA9IFsgIiRyb290X291dF9kaXIvaW5zdGFsbC8kaW5zdGFsbF9zdWJkaXIve3tzb3VyY2VfZmlsZV9wYXJ0fX0iIF0KICAgfQpAQCAtMzgsOCArMzksOCBAQAogICBncm91cCh0YXJnZXRfbmFtZSkgewogICAgIGZvcndhcmRfdmFyaWFibGVzX2Zyb20oaW52b2tlciwgWyAidGVzdG9ubHkiIF0pCiAgICAgZGVwcyA9IFsKLSAgICAgICI6JGluc3RhbGxhYmxlX3RhcmdldF9uYW1lIiwKICAgICAgICI6Y29weV8ke3RhcmdldF9uYW1lfSIsCisgICAgICBpbnN0YWxsYWJsZV90YXJnZXRfZGVwLAogICAgIF0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2J1aWxkL3Rvb2xjaGFpbi9saW51eC9CVUlMRC5nbiBiL3N0YXJib2FyZC9idWlsZC90b29sY2hhaW4vbGludXgvQlVJTEQuZ24KaW5kZXggMGQ5YWEzOS4uOTdhNWI1MyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2J1aWxkL3Rvb2xjaGFpbi9saW51eC9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4L0JVSUxELmduCkBAIC0xNCw2ICsxNCw3IEBACiAKIGltcG9ydCgiLy9idWlsZC90b29sY2hhaW4vZ2NjX3Rvb2xjaGFpbi5nbmkiKQogaW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC9wbGF0Zm9ybV9wYXRoLmduaSIpCitpbXBvcnQoIi8vc3RhcmJvYXJkL2J1aWxkL3Rvb2xjaGFpbi9saW51eC9jbGFuZ19sbGRfdG9vbGNoYWluLmduaSIpCiAKIGNsYW5nX3Rvb2xjaGFpbigieDY0IikgewogICBjbGFuZ19iYXNlX3BhdGggPSBjbGFuZ19iYXNlX3BhdGgKQEAgLTM3LDE1ICszOCw1IEBACiAgIH0KIH0KIAotZ2NjX3Rvb2xjaGFpbigiY2xhbmdfbGxkIikgewotICBwcmVmaXggPSByZWJhc2VfcGF0aCgiJGNsYW5nX2Jhc2VfcGF0aC9iaW4iLCByb290X2J1aWxkX2RpcikKLSAgY2MgPSAiJHByZWZpeC9jbGFuZyIKLSAgY3h4ID0gIiRwcmVmaXgvY2xhbmcrKyIKLSAgbGQgPSAiJHByZWZpeC9sZC5sbGQiCi0gIGFyID0gIiRwcmVmaXgvbGx2bS1hciIKLSAgbm0gPSAibm0iCi0KLSAgdG9vbGNoYWluX2FyZ3MgPSB7Ci0gICAgaXNfY2xhbmcgPSB0cnVlCi0gIH0KK2NsYW5nX2xsZF90b29sY2hhaW4oImNsYW5nX2xsZCIpIHsKIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9idWlsZC90b29sY2hhaW4vbGludXgvY2xhbmdfbGxkX3Rvb2xjaGFpbi5nbmkgYi9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4L2NsYW5nX2xsZF90b29sY2hhaW4uZ25pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGUwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4L2NsYW5nX2xsZF90b29sY2hhaW4uZ25pCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQoIi8vYnVpbGQvdG9vbGNoYWluL2djY190b29sY2hhaW4uZ25pIikKKwordGVtcGxhdGUoImNsYW5nX2xsZF90b29sY2hhaW4iKSB7CisgIG5vdF9uZWVkZWQoaW52b2tlciwgIioiKQorCisgIGdjY190b29sY2hhaW4odGFyZ2V0X25hbWUpIHsKKyAgICBwcmVmaXggPSByZWJhc2VfcGF0aCgiJGNsYW5nX2Jhc2VfcGF0aC9iaW4iLCByb290X2J1aWxkX2RpcikKKyAgICBjYyA9ICIkcHJlZml4L2NsYW5nIgorICAgIGN4eCA9ICIkcHJlZml4L2NsYW5nKysiCisgICAgbGQgPSAiJHByZWZpeC9sZC5sbGQiCisgICAgYXIgPSAiJHByZWZpeC9sbHZtLWFyIgorICAgIG5tID0gIm5tIgorCisgICAgdG9vbGNoYWluX2FyZ3MgPSB7CisgICAgICBpc19jbGFuZyA9IHRydWUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9jb21tb24vQlVJTEQuZ24gYi9zdGFyYm9hcmQvY29tbW9uL0JVSUxELmduCmluZGV4IGQwN2RmYjMuLjVjMTk3N2UgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9jb21tb24vQlVJTEQuZ24KKysrIGIvc3RhcmJvYXJkL2NvbW1vbi9CVUlMRC5nbgpAQCAtNjEsNiArNjEsOCBAQAogICAgICJvcHRpb25hbC5oIiwKICAgICAicGF0aHMuY2MiLAogICAgICJwYXRocy5oIiwKKyAgICAicGxheWVyLmNjIiwKKyAgICAicGxheWVyLmgiLAogICAgICJxdWV1ZS5oIiwKICAgICAicmVjdXJzaXZlX211dGV4LmNjIiwKICAgICAicmVjdXJzaXZlX211dGV4LmgiLApAQCAtOTQsNiArOTYsNyBAQAogICBzb3VyY2VzID0gWwogICAgICJtZWRpYV90ZXN0LmNjIiwKICAgICAibWVtb3J5X3Rlc3QuY2MiLAorICAgICJwbGF5ZXJfdGVzdC5jYyIsCiAgICAgInNvY2tldF90ZXN0LmNjIiwKICAgICAidGVzdF9tYWluLmNjIiwKICAgXQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXIuY2MgYi9zdGFyYm9hcmQvY29tbW9uL3BsYXllci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM4Y2YzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXIuY2MKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXIuaCIKKworI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworCitjb25zdCBjaGFyKiBHZXRQbGF5ZXJPdXRwdXRNb2RlTmFtZShTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUpIHsKKyAgc3dpdGNoIChvdXRwdXRfbW9kZSkgeworICAgIGNhc2Uga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZToKKyAgICAgIHJldHVybiAiZGVjb2RlLXRvLXRleHR1cmUiOworICAgIGNhc2Uga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0OgorICAgICAgcmV0dXJuICJwdW5jaC1vdXQiOworICAgIGNhc2Uga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQ6CisgICAgICByZXR1cm4gImludmFsaWQiOworICB9CisKKyAgU0JfTk9UUkVBQ0hFRCgpOworICByZXR1cm4gImludmFsaWQiOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvY29tbW9uL3BsYXllci5oIGIvc3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjU1MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX0NPTU1PTl9QTEFZRVJfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0NPTU1PTl9QTEFZRVJfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CisKK2NvbnN0IGNoYXIqIEdldFBsYXllck91dHB1dE1vZGVOYW1lKFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSk7CisKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfQ09NTU9OX1BMQVlFUl9IXwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXJfdGVzdC5jYyBiL3N0YXJib2FyZC9jb21tb24vcGxheWVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0ZWI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9jb21tb24vcGxheWVyX3Rlc3QuY2MKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9wbGF5ZXIuaCIKKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoUGxheWVyVGVzdCwgR2V0UGxheWVyT3V0cHV0TW9kZU5hbWUpIHsKKyAgQVNTRVJUX1NUUkVRKEdldFBsYXllck91dHB1dE1vZGVOYW1lKGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpLAorICAgICAgICAgICAgICAgImRlY29kZS10by10ZXh0dXJlIik7CisgIEFTU0VSVF9TVFJFUShHZXRQbGF5ZXJPdXRwdXRNb2RlTmFtZShrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQpLAorICAgICAgICAgICAgICAgInB1bmNoLW91dCIpOworICBBU1NFUlRfU1RSRVEoR2V0UGxheWVyT3V0cHV0TW9kZU5hbWUoa1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQpLCAiaW52YWxpZCIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmggYi9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCmluZGV4IDU2YjgyMDAuLjY1MWYxMzEgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9jb25maWd1cmF0aW9uLmgKKysrIGIvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaApAQCAtNTk2LDEwICs1OTYsNiBAQAogI2Vycm9yICJOZXcgdmVyc2lvbnMgb2YgU3RhcmJvYXJkIHNwZWNpZnkgcGxheWVyIG91dHB1dCBtb2RlIGF0IHJ1bnRpbWUuIgogI2VuZGlmCiAKLSNpZiAhZGVmaW5lZChTQl9IQVNfQklMSU5FQVJfRklMVEVSSU5HX1NVUFBPUlQpCi0jZXJyb3IgIllvdXIgcGxhdGZvcm0gbXVzdCBkZWZpbmUgU0JfSEFTX0JJTElORUFSX0ZJTFRFUklOR19TVVBQT1JULiIKLSNlbmRpZgotCiAjaWYgIWRlZmluZWQoU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUKQogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX0hBU19OVjEyX1RFWFRVUkVfU1VQUE9SVC4iCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9kb2MvYWJzdHJhY3QtdG9vbGNoYWluLm1kIGIvc3RhcmJvYXJkL2RvYy9hYnN0cmFjdC10b29sY2hhaW4ubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhN2U1YmQuLjAwMDAwMDAKLS0tIGEvc3RhcmJvYXJkL2RvYy9hYnN0cmFjdC10b29sY2hhaW4ubWQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIEFic3RyYWN0IFRvb2xjaGFpbgotCi0jIyBNb3RpdmF0aW9uCi0KLVRoZSBhaW0gb2YgaW1wbGVtZW50aW5nIGFuIEFic3RyYWN0IFRvb2xjaGFpbiBpcyB0byBhbGxvdyBwb3J0ZXJzIHRvIGFkZAotbmV3IHRvb2xjaGFpbnMgb3IgY3VzdG9taXplIGV4aXN0aW5nIG9uZXMgd2l0aG91dCB0aGUgbmVlZCBvZiBtb2RpZnlpbmcKLWNvbW1vbiBjb2RlLgotCi1Jbml0aWFsbHkgYWxsIHRhcmdldHMgd2VyZSBkZWZpbmVkIGluIG9uZSBjb21tb24gc2hhcmVkIGZpbGUsCi1gc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvZ2VuZXJhdG9yL25pbmphLnB5YC4KLU1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdlcmUgcmVxdWlyZWQgZm9yIHJlcGxhY2luZyBhbnkgb2YgdGhlIHRvb2xjaGFpbgotY29tcG9uZW50cywgYWRkaW5nIHBsYXRmb3JtLXNwZWNpZmljIHRvb2xpbmcsIGFkZGluZyBuZXcgdG9vbGNoYWlucywgb3IKLWFjY29tbW9kYXRpbmcgcGxhdGZvcm0tc3BlY2lmaWMgZmxhdm9yIG9mIHJlZmVyZW5jZSB0b29sLiBEb2luZyB0aGlzIGluIGEKLXNoYXJlZCBmaWxlIGRvZXMgbm90IHNjYWxlIHdpdGggdGhlIG51bWJlciBvZiBwb3J0cy4KLQotIyMgT3ZlcnZpZXcKLQotVGhlIHNvbHV0aW9uIGltcGxlbWVudGVkIHRvIHNvbHZlIHRvb2xjaGFpbiBhYnN0cmFjdGlvbiBjb25zaXN0cyBvZiBhZGRpbmcgdHdvCi1uZXcgZnVuY3Rpb25zIHRvIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBgZ3lwX2NvbmZpZ3VyYXRpb24ucHlgIGZpbGUgZm91bmQgdW5kZXI6Ci0KLWBzdGFyYm9hcmQvPFBMQVRGT1JNPi9neXBfY29uZmlndXJhdGlvbi5weWAKLQotVGhlIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgYXJlOgotCi1gR2V0SG9zdFRvb2xjaGFpbmAgYW5kIGBHZXRUYXJnZXRUb29sY2hhaW5gCi0KLSMjIEV4YW1wbGUKLQotVGhlIHNpbXBsZXN0IGNvbXBsZXRlIEdDQyBiYXNlZCB0b29sY2hhaW4sIHdoZXJlIGEgdGFyZ2V0IGFuZCBob3N0IGFyZSB0aGUgc2FtZSwKLWFuZCBhbGwgdG9vbHMgYXJlIGluIHRoZSBQQVRIOgotCi0gIGNsYXNzIEV4YW1wbGVQbGF0Zm9ybUNvbmZpZyhzdGFyYm9hcmQuUGxhdGZvcm1Db25maWcpCi0gICAgIyAuLi4KLQotICAgIGRlZiBHZXRUYXJnZXRUb29sY2hhaW4oc2VsZik6Ci0gICAgICByZXR1cm4gWwotICAgICAgICBzdGFyYm9hcmQudG9vbGNoYWlucy5nbnUuQ0NvbXBpbGVyKCksCi0gICAgICAgIHN0YXJib2FyZC50b29sY2hhaW5zLmdudS5DUGx1c1BsdXNDb21waWxlcigpLAotICAgICAgICBzdGFyYm9hcmQudG9vbGNoYWlucy5nbnUuQXNzZW1ibGVyKCksCi0gICAgICAgIHN0YXJib2FyZC50b29sY2hhaW5zLmdudS5TdGF0aWNMaW5rZXIoKSwKLSAgICAgICAgc3RhcmJvYXJkLnRvb2xjaGFpbnMuZ251LkR5bmFtaWNMaW5rZXIoKSwKLSAgICAgICAgc3RhcmJvYXJkLnRvb2xjaGFpbnMuZ251LkJpc29uKCksCi0gICAgICAgIHN0YXJib2FyZC50b29sY2hhaW5zLmdudS5TdGFtcCgpLAotICAgICAgICBzdGFyYm9hcmQudG9vbGNoYWlucy5nbnUuQ29weSgpLAotICAgICAgXQotCi0gICAgZGVmIEdldEhvc3RUb29sY2hhaW4oc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5HZXRUYXJnZXRUb29sY2hhaW4oKQotCi1Zb3UgY2FuIGZpbmQgcmVhbCBleGFtcGxlcyBvZiB0aGlzIGluIHRoZSBPcGVuIFNvdXJjZSByZXBvOgotW0xpbnV4IHg4NjExXShodHRwczovL2NvYmFsdC5nb29nbGVzb3VyY2UuY29tL2NvYmFsdC8rL3JlZnMvaGVhZHMvMjEubHRzLjErL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2d5cF9jb25maWd1cmF0aW9uLnB5KQotCi1bUmFzcGJlcnJ5IFBpIDJdKGh0dHBzOi8vY29iYWx0Lmdvb2dsZXNvdXJjZS5jb20vY29iYWx0LysvcmVmcy9oZWFkcy8yMS5sdHMuMSsvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkpCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZG9jL2V2ZXJncmVlbi9jb2JhbHRfZXZlcmdyZWVuX292ZXJ2aWV3Lm1kIGIvc3RhcmJvYXJkL2RvYy9ldmVyZ3JlZW4vY29iYWx0X2V2ZXJncmVlbl9vdmVydmlldy5tZAppbmRleCBlNjE0MzczLi44ZTI1OTFjIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvZG9jL2V2ZXJncmVlbi9jb2JhbHRfZXZlcmdyZWVuX292ZXJ2aWV3Lm1kCisrKyBiL3N0YXJib2FyZC9kb2MvZXZlcmdyZWVuL2NvYmFsdF9ldmVyZ3JlZW5fb3ZlcnZpZXcubWQKQEAgLTEzMSw3ICsxMzEsNyBAQAogCiAqICAgYGtTYlN5c3RlbVBhdGhTdG9yYWdlRGlyZWN0b3J5YAogICAgICogICBEZWRpY2F0ZWQgbG9jYXRpb24gZm9yIHN0b3JpbmcgQ29iYWx0IEV2ZXJncmVlbi1yZWxhdGVkIGJpbmFyaWVzCi0gICAgKiAgIFRoaXMgcGF0aCBtdXN0IGJlIHdyaXRhYmxlIGFuZCBoYXZlIGF0IGxlYXN0IDk2TUIgb2YgcmVzZXJ2ZWQgc3BhY2UgZm9yCisgICAgKiAgIFRoaXMgcGF0aCBtdXN0IGJlIHdyaXRhYmxlIGFuZCBoYXZlIGF0IGxlYXN0IDY0TUIgb2YgcmVzZXJ2ZWQgc3BhY2UgZm9yCiAgICAgICAgIEV2ZXJncmVlbiB1cGRhdGVzLiBQbGVhc2Ugc2VlIHRoZSDigJxQbGF0Zm9ybXMgUmVxdWlyZW1lbnRz4oCdIHNlY3Rpb24gYmVsb3cKICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KICogICBga1NiTWVtb3J5TWFwUHJvdGVjdEV4ZWNgCkBAIC0xOTUsMTIgKzE5NSwxMiBAQAogCiAqICAgVjgKIAotQWRkaXRpb25hbCByZXNlcnZlZCBzdG9yYWdlICg5Nk1CKSBpcyByZXF1aXJlZCBmb3IgRXZlcmdyZWVuIGJpbmFyaWVzLiBXZSBleHBlY3QKK0FkZGl0aW9uYWwgcmVzZXJ2ZWQgc3RvcmFnZSAoNjRNQikgaXMgcmVxdWlyZWQgZm9yIEV2ZXJncmVlbiBiaW5hcmllcy4gV2UgZXhwZWN0CiBFdmVyZ3JlZW4gaW1wbGVtZW50YXRpb25zIHRvIGhhdmUgYW4gaW5pdGlhbCBDb2JhbHQgcHJlbG9hZGVkIG9uIHRoZSBkZXZpY2UgYW5kCiBhbiBhZGRpdGlvbmFsIHJlc2VydmVkIHNwYWNlIGZvciBhZGRpdGlvbmFsIENvYmFsdCB1cGRhdGUgc3RvcmFnZS4KIAogKiAgIEluaXRpYWwgQ29iYWx0IGJpbmFyeSBkZXBsb3ltZW50IC0gNjRNQgotKiAgIEFkZGl0aW9uYWwgQ29iYWx0IHVwZGF0ZSBzdG9yYWdlIC0gOTZNQgorKiAgIEFkZGl0aW9uYWwgQ29iYWx0IHVwZGF0ZSBzdG9yYWdlIC0gNjRNQgogICAgICogICBSZXF1aXJlZCBmb3IgMiB1cGRhdGUgc2xvdHMgdW5kZXIgYGtTYlN5c3RlbVBhdGhTdG9yYWdlRGlyZWN0b3J5YAogCiBBcyBDb2JhbHQgRXZlcmdyZWVuIGlzIGludGVuZGVkIHRvIGJlIHVwZGF0ZWQgZnJvbSBHb29nbGUgQ2xvdWQgYXJjaGl0ZWN0dXJlCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzL0JVSUxELmduIGIvc3RhcmJvYXJkL2VnbF9hbmRfZ2xlcy9CVUlMRC5nbgppbmRleCAzYWZjMThjLi5jZmNmNjdlIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9lZ2xfYW5kX2dsZXMvQlVJTEQuZ24KQEAgLTIzLDcgKzIzLDkgQEAKICMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uZ25pIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KIAogZ3JvdXAoImVnbF9hbmRfZ2xlcyIpIHsKLSAgcHVibGljX2RlcHMgPSBbICI6ZWdsX2FuZF9nbGVzXyRnbF90eXBlIiBdCisgIGlmIChnbF90eXBlICE9ICJub25lIikgeworICAgIHB1YmxpY19kZXBzID0gWyAiOmVnbF9hbmRfZ2xlc18kZ2xfdHlwZSIgXQorICB9CiB9CiAKIGdyb3VwKCJlZ2xfYW5kX2dsZXNfc3lzdGVtX2dsZXMyIikgewpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2VsZl9sb2FkZXIvQlVJTEQuZ24gYi9zdGFyYm9hcmQvZWxmX2xvYWRlci9CVUlMRC5nbgppbmRleCBlMjU1YmM1Li5iY2E0MTI2IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvZWxmX2xvYWRlci9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvZWxmX2xvYWRlci9CVUlMRC5nbgpAQCAtODgsMzEgKzg4LDMzIEBACiAgIH0KIH0KIAotdGFyZ2V0KGZpbmFsX2V4ZWN1dGFibGVfdHlwZSwgImVsZl9sb2FkZXJfc2FuZGJveCIpIHsKLSAgZGF0YV9kZXBzID0gWyAiLy90aGlyZF9wYXJ0eS9pY3U6aWN1ZGF0YSIgXQotICBpZiAoY29iYWx0X2ZvbnRfcGFja2FnZSA9PSAiZW1wdHkiKSB7Ci0gICAgZGF0YV9kZXBzICs9IFsgIi8vY29iYWx0L2NvbnRlbnQvZm9udHM6Y29weV9mb250X2RhdGEiIF0KLSAgfSBlbHNlIHsKLSAgICBkYXRhX2RlcHMgKz0gWwotICAgICAgIi8vY29iYWx0L2NvbnRlbnQvZm9udHM6Y29weV9mb250cyIsCi0gICAgICAiLy9jb2JhbHQvY29udGVudC9mb250czpmb250c194bWwiLAoraWYgKGN1cnJlbnRfdG9vbGNoYWluID09IHN0YXJib2FyZF90b29sY2hhaW4pIHsKKyAgdGFyZ2V0KHN0YXJib2FyZF9sZXZlbF9maW5hbF9leGVjdXRhYmxlX3R5cGUsICJlbGZfbG9hZGVyX3NhbmRib3giKSB7CisgICAgZGF0YV9kZXBzID0gWyAiLy90aGlyZF9wYXJ0eS9pY3U6aWN1ZGF0YSIgXQorICAgIGlmIChjb2JhbHRfZm9udF9wYWNrYWdlID09ICJlbXB0eSIpIHsKKyAgICAgIGRhdGFfZGVwcyArPSBbICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udF9kYXRhIiBdCisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGFfZGVwcyArPSBbCisgICAgICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udHMiLAorICAgICAgICAiLy9jb2JhbHQvY29udGVudC9mb250czpmb250c194bWwiLAorICAgICAgXQorICAgIH0KKworICAgIHNvdXJjZXMgPSBbICJzYW5kYm94LmNjIiBdCisgICAgY29uZmlncyArPSBbICI6ZWxmX2xvYWRlcl9jb25maWciIF0KKworICAgIGRlcHMgPSBbCisgICAgICAiOmNvbnN0YW50cyIsCisgICAgICAiOmVsZl9sb2FkZXIiLAorICAgICAgIjpldmVyZ3JlZW5faW5mbyIsCisgICAgICAiOnNhYmlfc3RyaW5nIiwKKyAgICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udF9kYXRhIiwKKyAgICAgICIvL3N0YXJib2FyZCIsCiAgICAgXQotICB9CiAKLSAgc291cmNlcyA9IFsgInNhbmRib3guY2MiIF0KLSAgY29uZmlncyArPSBbICI6ZWxmX2xvYWRlcl9jb25maWciIF0KLQotICBkZXBzID0gWwotICAgICI6Y29uc3RhbnRzIiwKLSAgICAiOmVsZl9sb2FkZXIiLAotICAgICI6ZXZlcmdyZWVuX2luZm8iLAotICAgICI6c2FiaV9zdHJpbmciLAotICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udF9kYXRhIiwKLSAgICAiLy9zdGFyYm9hcmQiLAotICBdCi0KLSAgaWYgKCFzYl9pc19ldmVyZ3JlZW5fY29tcGF0aWJsZSkgewotICAgIGRlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9jcmFzaHBhZC93cmFwcGVyOndyYXBwZXJfc3R1YiIgXQorICAgIGlmICghc2JfaXNfZXZlcmdyZWVuX2NvbXBhdGlibGUpIHsKKyAgICAgIGRlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9jcmFzaHBhZC93cmFwcGVyOndyYXBwZXJfc3R1YiIgXQorICAgIH0KICAgfQogfQogCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9oYXJkZnAvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtL2hhcmRmcC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IGQ3YWEyMDYuLjFjN2YwZGIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtL2hhcmRmcC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtL2hhcmRmcC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0xMDYsMTEgKzEwNiw2IEBACiAKIC8vIC0tLSBHcmFwaGljcyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIGJpbGluZWFyIGZpbHRlcmluZy4KLS8vIFRoaXMgY2FuIGJlIGNoZWNrZWQgdG8gZW5hYmxlL2Rpc2FibGUgcmVuZGVyZXIgdGVzdHMgdGhhdCB2ZXJpZnkgdGhhdCB0aGlzIGlzCi0vLyB3b3JraW5nIHByb3Blcmx5LgotI2RlZmluZSBTQl9IQVNfQklMSU5FQVJfRklMVEVSSU5HX1NVUFBPUlQgMQotCiAvLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIHJlbmRlcmluZyBvZiBOVjEyCiAvLyB0ZXh0dXJlcy4gVGhlc2UgdGV4dHVyZXMgdHlwaWNhbGx5IG9yaWdpbmF0ZSBmcm9tIHZpZGVvIGRlY29kZXJzLgogI2RlZmluZSBTQl9IQVNfTlYxMl9URVhUVVJFX1NVUFBPUlQgMQpkaWZmIC0tZ2l0IGEvY29iYWx0L2FjY291bnQvQlVJTEQuZ24gYi9zdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9oYXJkZnAvdG9vbGNoYWluL0JVSUxELmduCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIGNvYmFsdC9hY2NvdW50L0JVSUxELmduCnJlbmFtZSB0byBzdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9oYXJkZnAvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDAyY2NlM2UuLjViYzYzMzkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtL2hhcmRmcC90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDIxIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsMTMgKzEyLDcgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc3RhdGljX2xpYnJhcnkoImFjY291bnQiKSB7Ci0gIGhhc19wZWRhbnRpY193YXJuaW5ncyA9IHRydWUKK2ltcG9ydCgiLy9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4L2NsYW5nX2xsZF90b29sY2hhaW4uZ25pIikKIAotICBzb3VyY2VzID0gWwotICAgICJhY2NvdW50X21hbmFnZXIuY2MiLAotICAgICJhY2NvdW50X21hbmFnZXIuaCIsCi0gIF0KLQotICBkZXBzID0gWyAiLy9zdGFyYm9hcmQ6c3RhcmJvYXJkX2hlYWRlcnNfb25seSIgXQorY2xhbmdfbGxkX3Rvb2xjaGFpbigidGFyZ2V0IikgewogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2V2ZXJncmVlbi9hcm0vc29mdGZwL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9zb2Z0ZnAvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCBkZWEwNTgxLi43YjIyYjFhIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9zb2Z0ZnAvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9zb2Z0ZnAvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMTA2LDExICsxMDYsNiBAQAogCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyBiaWxpbmVhciBmaWx0ZXJpbmcuCi0vLyBUaGlzIGNhbiBiZSBjaGVja2VkIHRvIGVuYWJsZS9kaXNhYmxlIHJlbmRlcmVyIHRlc3RzIHRoYXQgdmVyaWZ5IHRoYXQgdGhpcyBpcwotLy8gd29ya2luZyBwcm9wZXJseS4KLSNkZWZpbmUgU0JfSEFTX0JJTElORUFSX0ZJTFRFUklOR19TVVBQT1JUIDEKLQogLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyByZW5kZXJpbmcgb2YgTlYxMgogLy8gdGV4dHVyZXMuIFRoZXNlIHRleHR1cmVzIHR5cGljYWxseSBvcmlnaW5hdGUgZnJvbSB2aWRlbyBkZWNvZGVycy4KICNkZWZpbmUgU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUIDEKZGlmZiAtLWdpdCBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9hcm0vc29mdGZwL3Rvb2xjaGFpbi9CVUlMRC5nbgpzaW1pbGFyaXR5IGluZGV4IDY5JQpjb3B5IGZyb20gY29iYWx0L2FjY291bnQvQlVJTEQuZ24KY29weSB0byBzdGFyYm9hcmQvZXZlcmdyZWVuL2FybS9zb2Z0ZnAvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDAyY2NlM2UuLjViYzYzMzkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtL3NvZnRmcC90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDIxIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsMTMgKzEyLDcgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc3RhdGljX2xpYnJhcnkoImFjY291bnQiKSB7Ci0gIGhhc19wZWRhbnRpY193YXJuaW5ncyA9IHRydWUKK2ltcG9ydCgiLy9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4L2NsYW5nX2xsZF90b29sY2hhaW4uZ25pIikKIAotICBzb3VyY2VzID0gWwotICAgICJhY2NvdW50X21hbmFnZXIuY2MiLAotICAgICJhY2NvdW50X21hbmFnZXIuaCIsCi0gIF0KLQotICBkZXBzID0gWyAiLy9zdGFyYm9hcmQ6c3RhcmJvYXJkX2hlYWRlcnNfb25seSIgXQorY2xhbmdfbGxkX3Rvb2xjaGFpbigidGFyZ2V0IikgewogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2V2ZXJncmVlbi9hcm02NC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9hcm02NC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDZlNTcwZWQuLmEzNTg3MDggMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtNjQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zdGFyYm9hcmQvZXZlcmdyZWVuL2FybTY0L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTEwNiwxMSArMTA2LDYgQEAKIAogLy8gLS0tIEdyYXBoaWNzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcGxhdGZvcm0gc3VwcG9ydHMgYmlsaW5lYXIgZmlsdGVyaW5nLgotLy8gVGhpcyBjYW4gYmUgY2hlY2tlZCB0byBlbmFibGUvZGlzYWJsZSByZW5kZXJlciB0ZXN0cyB0aGF0IHZlcmlmeSB0aGF0IHRoaXMgaXMKLS8vIHdvcmtpbmcgcHJvcGVybHkuCi0jZGVmaW5lIFNCX0hBU19CSUxJTkVBUl9GSUxURVJJTkdfU1VQUE9SVCAxCi0KIC8vIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcGxhdGZvcm0gc3VwcG9ydHMgcmVuZGVyaW5nIG9mIE5WMTIKIC8vIHRleHR1cmVzLiBUaGVzZSB0ZXh0dXJlcyB0eXBpY2FsbHkgb3JpZ2luYXRlIGZyb20gdmlkZW8gZGVjb2RlcnMuCiAjZGVmaW5lIFNCX0hBU19OVjEyX1RFWFRVUkVfU1VQUE9SVCAxCmRpZmYgLS1naXQgYS9jb2JhbHQvYWNjb3VudC9CVUlMRC5nbiBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtNjQvdG9vbGNoYWluL0JVSUxELmduCnNpbWlsYXJpdHkgaW5kZXggNjklCmNvcHkgZnJvbSBjb2JhbHQvYWNjb3VudC9CVUlMRC5nbgpjb3B5IHRvIHN0YXJib2FyZC9ldmVyZ3JlZW4vYXJtNjQvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDAyY2NlM2UuLjViYzYzMzkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vYXJtNjQvdG9vbGNoYWluL0JVSUxELmduCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAyMSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDEzICsxMiw3IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLXN0YXRpY19saWJyYXJ5KCJhY2NvdW50IikgewotICBoYXNfcGVkYW50aWNfd2FybmluZ3MgPSB0cnVlCitpbXBvcnQoIi8vc3RhcmJvYXJkL2J1aWxkL3Rvb2xjaGFpbi9saW51eC9jbGFuZ19sbGRfdG9vbGNoYWluLmduaSIpCiAKLSAgc291cmNlcyA9IFsKLSAgICAiYWNjb3VudF9tYW5hZ2VyLmNjIiwKLSAgICAiYWNjb3VudF9tYW5hZ2VyLmgiLAotICBdCi0KLSAgZGVwcyA9IFsgIi8vc3RhcmJvYXJkOnN0YXJib2FyZF9oZWFkZXJzX29ubHkiIF0KK2NsYW5nX2xsZF90b29sY2hhaW4oInRhcmdldCIpIHsKIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggY2E4NTgyMC4uYzVmMzU1YyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTI3LDcgKzI3LDExIEBACiAKICAgZGVmIEdldFRlc3RUYXJnZXRzKHNlbGYpOgogICAgIHRlc3RzID0gc3VwZXIoKS5HZXRUZXN0VGFyZ2V0cygpCi0gICAgdGVzdHMuZXh0ZW5kKHsnY29iYWx0X3Nsb3RfbWFuYWdlbWVudF90ZXN0JywgJ3VwZGF0ZXJfdGVzdCd9KQorICAgIHRlc3RzLmV4dGVuZCh7CisgICAgICAgICdjb2JhbHRfc2xvdF9tYW5hZ2VtZW50X3Rlc3QnLAorICAgICAgICAnY3J4X2ZpbGVfdGVzdCcsCisgICAgICAgICd1cGRhdGVyX3Rlc3QnLAorICAgIH0pCiAgICAgcmV0dXJuIFt0ZXN0IGZvciB0ZXN0IGluIHRlc3RzIGlmIHRlc3Qgbm90IGluIHNlbGYuX19GT1JCSURERU5fVEVTVFNdCiAKICAgX19GT1JCSURERU5fVEVTVFMgPSBbICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL2xhdW5jaGVyLnB5IGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvbGF1bmNoZXIucHkKaW5kZXggY2FkOWZiZS4uNDExNDNiZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvbGF1bmNoZXIucHkKKysrIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvbGF1bmNoZXIucHkKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICB0YXJnZXRfcGFyYW1zPXRhcmdldF9jb21tYW5kX2xpbmVfcGFyYW1zLAogICAgICAgICBvdXRwdXRfZmlsZT1zZWxmLm91dHB1dF9maWxlLAogICAgICAgICBvdXRfZGlyZWN0b3J5PXNlbGYuc3RhZ2luZ19kaXJlY3RvcnksCi0gICAgICAgIGNvdmVyYWdlX2RpcmVjdG9yeT1zZWxmLmNvdmVyYWdlX2RpcmVjdG9yeSwKKyAgICAgICAgY292ZXJhZ2VfZmlsZV9wYXRoPXNlbGYuY292ZXJhZ2VfZmlsZV9wYXRoLAogICAgICAgICBlbnZfdmFyaWFibGVzPXNlbGYuZW52X3ZhcmlhYmxlcywKICAgICAgICAgbG9nX3RhcmdldHM9RmFsc2UpCiAKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24gYi9zdGFyYm9hcmQvZXZlcmdyZWVuL3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL0JVSUxELmduCmluZGV4IGRkYWYyNzkuLjZiMTU0YTAgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24KKysrIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgpAQCAtNzQsNiArNzQsMTcgQEAKICAgICAjIEJ5IGRlZmF1bHQsIDxFR0wvZWdscGxhdGZvcm0uaD4gcHVsbHMgaW4gc29tZSBYMTEgaGVhZGVycyB0aGF0IGhhdmUgc29tZQogICAgICMgbmFzdHkgbWFjcm9zICh8U3RhdHVzfCwgZm9yIGV4YW1wbGUpIHRoYXQgY29uZmxpY3Qgd2l0aCBDaHJvbWl1bSBiYXNlLgogICAgICJNRVNBX0VHTF9OT19YMTFfSEVBREVSUyIsCisKKyAgICAjIER1cmluZyBFdmVyZ3JlZW4gdXBkYXRlcyB0aGUgQ1JYIHBhY2thZ2UgaXMga2VwdCBpbi1tZW1vcnksIGluc3RlYWQgb2YKKyAgICAjIG9uIHRoZSBmaWxlIHN5c3RlbSwgYmVmb3JlIGdldHRpbmcgdW5wYWNrZWQuCisgICAgIyBUT0RPKGIvMTU4MDQzNTIwKTogd2UgbmVlZCB0byBtYWtlIHNpZ25pZmljYW50IGN1c3RvbWl6YXRpb25zIHRvIENocm9taXVtCisgICAgIyBjb2RlIHRvIGltcGxlbWVudCB0aGlzIGZlYXR1cmUgYW5kIHRoaXMgbWFjcm8gYWxsb3dzIHVzIHRvIHN3aXRjaCBiYWNrCisgICAgIyB0byB0aGUgbGVnYWN5IGJlaGF2aW9yIGR1cmluZyBkZXZlbG9wbWVudCB0byB2ZXJpZnkgdGhlIGN1c3RvbWl6YXRpb25zCisgICAgIyBhcmUgbWFkZSBjbGVhbmx5LiBPbmNlIHRoZSBmZWF0dXJlIGlzIGNvbXBsZXRlIHdlIG1heSB3YW50IHRvIHJlbW92ZQorICAgICMgZXhpc3RpbmcgY3VzdG9taXphdGlvbnMgdGhhdCBlbmFibGUgdGhlIGxlZ2FjeSBiZWhhdmlvciBmb3IgQ29iYWx0IGJ1aWxkcywKKyAgICAjIGNoYW5nZSBJTl9NRU1PUllfVVBEQVRFUyByZWZlcmVuY2VzIHRvIFVTRV9DT0JBTFRfQ1VTVE9NSVpBVElPTlMKKyAgICAjIHJlZmVyZW5jZXMsIGFuZCByZW1vdmUgdGhpcyBtYWNyby4KKyAgICAiSU5fTUVNT1JZX1VQREFURVMiLAogICBdCiAKICAgaWYgKGlzX2RlYnVnKSB7CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZXZlcmdyZWVuL3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uZ25pIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaQppbmRleCA1MDA3YmI1Li5mM2FhYjMzIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvZXZlcmdyZWVuL3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uZ25pCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkKQEAgLTI2LDYgKzI2LDggQEAKIAogZmluYWxfZXhlY3V0YWJsZV90eXBlID0gInNoYXJlZF9saWJyYXJ5IgogZ3Rlc3RfdGFyZ2V0X3R5cGUgPSAic2hhcmVkX2xpYnJhcnkiCitzdGFyYm9hcmRfbGV2ZWxfZmluYWxfZXhlY3V0YWJsZV90eXBlID0gInNoYXJlZF9saWJyYXJ5Igorc3RhcmJvYXJkX2xldmVsX2d0ZXN0X3RhcmdldF90eXBlID0gInNoYXJlZF9saWJyYXJ5IgogCiBzcGVlZF9jb25maWdfcGF0aCA9ICIvL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb246c3BlZWQiCiBzaXplX2NvbmZpZ19wYXRoID0gIi8vc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbjpzaXplIgpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvc3RyaXBfaW5zdGFsbF90YXJnZXQuZ25pIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi9zaGFyZWQvc3RyaXBfaW5zdGFsbF90YXJnZXQuZ25pCmluZGV4IDQ4YjhiMWUuLjdkNDY2ODggMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vc2hhcmVkL3N0cmlwX2luc3RhbGxfdGFyZ2V0LmduaQorKysgYi9zdGFyYm9hcmQvZXZlcmdyZWVuL3NoYXJlZC9zdHJpcF9pbnN0YWxsX3RhcmdldC5nbmkKQEAgLTE0LDYgKzE0LDcgQEAKIAogdGVtcGxhdGUoInN0cmlwX2luc3RhbGxfdGFyZ2V0IikgewogICBpbnN0YWxsYWJsZV90YXJnZXRfbmFtZSA9IGludm9rZXIuaW5zdGFsbGFibGVfdGFyZ2V0X25hbWUKKyAgaW5zdGFsbGFibGVfdGFyZ2V0X2RlcCA9IGludm9rZXIuaW5zdGFsbGFibGVfdGFyZ2V0X2RlcAogCiAgIGFzc2VydChkZWZpbmVkKGludm9rZXIuc3RyaXBfZXhlY3V0YWJsZSkgJiYgaW52b2tlci5zdHJpcF9leGVjdXRhYmxlICE9ICIiLAogICAgICAgICAgInN0cmlwIGV4ZWN1dGFibGUgcmVxdWlyZWQgZm9yIHN0cmlwcGluZyIpCkBAIC0zNiw3ICszNyw3IEBACiAgICAgaW5wdXRzID0gWyAiJHJvb3Rfb3V0X2Rpci8kc291cmNlX25hbWUiIF0KIAogICAgIGRlcHMgPSBpbnZva2VyLmRlcHMKLSAgICBkZXBzICs9IFsgIjokaW5zdGFsbGFibGVfdGFyZ2V0X25hbWUiIF0KKyAgICBkZXBzICs9IFsgaW5zdGFsbGFibGVfdGFyZ2V0X2RlcCBdCiAKICAgICBvdXRwdXRzID0gWyAiJHNiX2luc3RhbGxfb3V0cHV0X2Rpci8kaW5zdGFsbF9zdWJkaXIvJHNvdXJjZV9uYW1lIiBdCiAKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ldmVyZ3JlZW4vdGVzdGluZy9ydW5fYWxsX3Rlc3RzLnNoIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi90ZXN0aW5nL3J1bl9hbGxfdGVzdHMuc2gKaW5kZXggOTBhMTcxYi4uMDg5NGQyOSAxMDA3NTUKLS0tIGEvc3RhcmJvYXJkL2V2ZXJncmVlbi90ZXN0aW5nL3J1bl9hbGxfdGVzdHMuc2gKKysrIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi90ZXN0aW5nL3J1bl9hbGxfdGVzdHMuc2gKQEAgLTI0LDggKzI0LDcgQEAKIFVTRV9DT01QUkVTU0VEX1NZU1RFTV9JTUFHRT0iZmFsc2UiCiBTWVNURU1fSU1BR0VfRVhURU5TSU9OPSIuc28iCiAKLSMgVE9ETzogRW5hYmxlIG9uY2UgdGhlIFN0YXJib2FyZCAxNiBiaW5hcmllcyBhcmUgcHVibGlzaGVkIGZvciBFdmVyZ3JlZW4uCi1ESVNBQkxFX1RFU1RTPSJ0cnVlIgorRElTQUJMRV9URVNUUz0iZmFsc2UiCiAKIHdoaWxlIGdldG9wdHMgImQ6YTpjIiBvOyBkbwogICAgIGNhc2UgIiR7b30iIGluCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZXZlcmdyZWVuL3g2NC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi94NjQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCAzNDMwNjg1Li42OTczMThiIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvZXZlcmdyZWVuL3g2NC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4veDY0L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTEwNiwxMSArMTA2LDYgQEAKIAogLy8gLS0tIEdyYXBoaWNzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcGxhdGZvcm0gc3VwcG9ydHMgYmlsaW5lYXIgZmlsdGVyaW5nLgotLy8gVGhpcyBjYW4gYmUgY2hlY2tlZCB0byBlbmFibGUvZGlzYWJsZSByZW5kZXJlciB0ZXN0cyB0aGF0IHZlcmlmeSB0aGF0IHRoaXMgaXMKLS8vIHdvcmtpbmcgcHJvcGVybHkuCi0jZGVmaW5lIFNCX0hBU19CSUxJTkVBUl9GSUxURVJJTkdfU1VQUE9SVCAxCi0KIC8vIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcGxhdGZvcm0gc3VwcG9ydHMgcmVuZGVyaW5nIG9mIE5WMTIKIC8vIHRleHR1cmVzLiBUaGVzZSB0ZXh0dXJlcyB0eXBpY2FsbHkgb3JpZ2luYXRlIGZyb20gdmlkZW8gZGVjb2RlcnMuCiAjZGVmaW5lIFNCX0hBU19OVjEyX1RFWFRVUkVfU1VQUE9SVCAwCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZXZlcmdyZWVuL3g2NC90ZXN0X2ZpbHRlcnMucHkgYi9zdGFyYm9hcmQvZXZlcmdyZWVuL3g2NC90ZXN0X2ZpbHRlcnMucHkKaW5kZXggN2Q2NzEzMi4uNWIxYjMwZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2V2ZXJncmVlbi94NjQvdGVzdF9maWx0ZXJzLnB5CisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4veDY0L3Rlc3RfZmlsdGVycy5weQpAQCAtMjIsNiArMjIsMTAgQEAKICMgcHlsaW50OiBkaXNhYmxlPWxpbmUtdG9vLWxvbmcKIF9GSUxURVJFRF9URVNUUyA9IHsKICAgICAnbnBsYic6IFsKKyAgICAgICAgJ011bHRpcGxlUGxheWVyVGVzdHMvKi8qc2ludGVsXzMyOV9lYzNfZG1wKicsCisgICAgICAgICdNdWx0aXBsZVBsYXllclRlc3RzLyovKnNpbnRlbF8zODFfYWMzX2RtcConLAorICAgICAgICAnU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0cy8qYXVkaW9fc2ludGVsXzMyOV9lYzNfZG1wXyonLAorICAgICAgICAnU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0cy8qYXVkaW9fc2ludGVsXzM4MV9hYzNfZG1wXyonLAogICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0LldyaXRlU2luZ2xlQmF0Y2gvYXVkaW9fc2ludGVsXzMyOV9lYzNfZG1wXyonLAogICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0LldyaXRlU2luZ2xlQmF0Y2gvYXVkaW9fc2ludGVsXzM4MV9hYzNfZG1wXyonLAogICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0LldyaXRlTXVsdGlwbGVCYXRjaGVzL2F1ZGlvX3NpbnRlbF8zMjlfZWMzX2RtcF8qJywKZGlmZiAtLWdpdCBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduIGIvc3RhcmJvYXJkL2V2ZXJncmVlbi94NjQvdG9vbGNoYWluL0JVSUxELmduCnNpbWlsYXJpdHkgaW5kZXggNjklCmNvcHkgZnJvbSBjb2JhbHQvYWNjb3VudC9CVUlMRC5nbgpjb3B5IHRvIHN0YXJib2FyZC9ldmVyZ3JlZW4veDY0L3Rvb2xjaGFpbi9CVUlMRC5nbgppbmRleCAwMmNjZTNlLi41YmM2MzM5IDEwMDY0NAotLS0gYS9jb2JhbHQvYWNjb3VudC9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvZXZlcmdyZWVuL3g2NC90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDIxIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsMTMgKzEyLDcgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc3RhdGljX2xpYnJhcnkoImFjY291bnQiKSB7Ci0gIGhhc19wZWRhbnRpY193YXJuaW5ncyA9IHRydWUKK2ltcG9ydCgiLy9zdGFyYm9hcmQvYnVpbGQvdG9vbGNoYWluL2xpbnV4L2NsYW5nX2xsZF90b29sY2hhaW4uZ25pIikKIAotICBzb3VyY2VzID0gWwotICAgICJhY2NvdW50X21hbmFnZXIuY2MiLAotICAgICJhY2NvdW50X21hbmFnZXIuaCIsCi0gIF0KLQotICBkZXBzID0gWyAiLy9zdGFyYm9hcmQ6c3RhcmJvYXJkX2hlYWRlcnNfb25seSIgXQorY2xhbmdfbGxkX3Rvb2xjaGFpbigidGFyZ2V0IikgewogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2V2ZXJncmVlbi94ODYvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3N0YXJib2FyZC9ldmVyZ3JlZW4veDg2L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggNWVkMDRmNy4uZWUzZTRjMCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2V2ZXJncmVlbi94ODYvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zdGFyYm9hcmQvZXZlcmdyZWVuL3g4Ni9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0xMDYsMTEgKzEwNiw2IEBACiAKIC8vIC0tLSBHcmFwaGljcyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIGJpbGluZWFyIGZpbHRlcmluZy4KLS8vIFRoaXMgY2FuIGJlIGNoZWNrZWQgdG8gZW5hYmxlL2Rpc2FibGUgcmVuZGVyZXIgdGVzdHMgdGhhdCB2ZXJpZnkgdGhhdCB0aGlzIGlzCi0vLyB3b3JraW5nIHByb3Blcmx5LgotI2RlZmluZSBTQl9IQVNfQklMSU5FQVJfRklMVEVSSU5HX1NVUFBPUlQgMQotCiAvLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIHJlbmRlcmluZyBvZiBOVjEyCiAvLyB0ZXh0dXJlcy4gVGhlc2UgdGV4dHVyZXMgdHlwaWNhbGx5IG9yaWdpbmF0ZSBmcm9tIHZpZGVvIGRlY29kZXJzLgogI2RlZmluZSBTQl9IQVNfTlYxMl9URVhUVVJFX1NVUFBPUlQgMQpkaWZmIC0tZ2l0IGEvY29iYWx0L2FjY291bnQvQlVJTEQuZ24gYi9zdGFyYm9hcmQvZXZlcmdyZWVuL3g4Ni90b29sY2hhaW4vQlVJTEQuZ24Kc2ltaWxhcml0eSBpbmRleCA2OSUKY29weSBmcm9tIGNvYmFsdC9hY2NvdW50L0JVSUxELmduCmNvcHkgdG8gc3RhcmJvYXJkL2V2ZXJncmVlbi94ODYvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDAyY2NlM2UuLjViYzYzMzkgMTAwNjQ0Ci0tLSBhL2NvYmFsdC9hY2NvdW50L0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9ldmVyZ3JlZW4veDg2L3Rvb2xjaGFpbi9CVUlMRC5nbgpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IDIwMjEgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwxMyArMTIsNyBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1zdGF0aWNfbGlicmFyeSgiYWNjb3VudCIpIHsKLSAgaGFzX3BlZGFudGljX3dhcm5pbmdzID0gdHJ1ZQoraW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC90b29sY2hhaW4vbGludXgvY2xhbmdfbGxkX3Rvb2xjaGFpbi5nbmkiKQogCi0gIHNvdXJjZXMgPSBbCi0gICAgImFjY291bnRfbWFuYWdlci5jYyIsCi0gICAgImFjY291bnRfbWFuYWdlci5oIiwKLSAgXQotCi0gIGRlcHMgPSBbICIvL3N0YXJib2FyZDpzdGFyYm9hcmRfaGVhZGVyc19vbmx5IiBdCitjbGFuZ19sbGRfdG9vbGNoYWluKCJ0YXJnZXQiKSB7CiB9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvZXhhbXBsZXMvZ2xjbGVhci9CVUlMRC5nbiBiL3N0YXJib2FyZC9leGFtcGxlcy9nbGNsZWFyL0JVSUxELmduCmluZGV4IDNiOGNiZTEuLjYwYzZkNjIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9leGFtcGxlcy9nbGNsZWFyL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9leGFtcGxlcy9nbGNsZWFyL0JVSUxELmduCkBAIC0xMywxMCArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogdGFyZ2V0KGZpbmFsX2V4ZWN1dGFibGVfdHlwZSwgInN0YXJib2FyZF9nbGNsZWFyX2V4YW1wbGUiKSB7Ci0gIGRlcHMgPSBbICIvL3N0YXJib2FyZCIgXQotICBpZiAoIXNiX2lzX2V2ZXJncmVlbikgewotICAgIGRlcHMgKz0gWyAiLy9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzIiBdCi0gIH0KLQogICBzb3VyY2VzID0gWyAibWFpbi5jYyIgXQorICBkZXBzID0gWyAiLy9zdGFyYm9hcmQiIF0KIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9leHRlbnNpb24vcGxhdGZvcm1faW5mby5oIGIvc3RhcmJvYXJkL2V4dGVuc2lvbi9wbGF0Zm9ybV9pbmZvLmgKaW5kZXggYTlkOWIxMS4uZTY3MDA0NCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2V4dGVuc2lvbi9wbGF0Zm9ybV9pbmZvLmgKKysrIGIvc3RhcmJvYXJkL2V4dGVuc2lvbi9wbGF0Zm9ybV9pbmZvLmgKQEAgLTM1LDggKzM1LDggQEAKIAogICAvLyBUaGUgZmllbGRzIGJlbG93IHRoaXMgcG9pbnQgd2VyZSBhZGRlZCBpbiB2ZXJzaW9uIDEgb3IgbGF0ZXIuCiAKLSAgLy8gUmV0dXJucyBkZXRhaWxzIGFib3V0IHRoZSBkZXZpY2UgZmlybXdhcmUgdmVyc2lvbi4gVGhpcyBjYW4gYmUgc29tZXRoaW5nCi0gIC8vIGxpa2UgQW5kcm9pZCBidWlsZCBmaW5nZXJwcmludCAoZ28vYW5kcm9pZC1idWlsZC1maW5nZXJwcmludCkuCisgIC8vIFJldHVybnMgZGV0YWlscyBhYm91dCB0aGUgZGV2aWNlIGZpcm13YXJlIHZlcnNpb24uIE9uIEFuZHJvaWQsIHRoaXMgd2lsbAorICAvLyBiZSB0aGUgQW5kcm9pZCBidWlsZCBmaW5nZXJwcmludCAoZ28vYW5kcm9pZC1idWlsZC1maW5nZXJwcmludCkuCiAgIGJvb2wgKCpHZXRGaXJtd2FyZVZlcnNpb25EZXRhaWxzKShjaGFyKiBvdXRfdmFsdWUsIGludCB2YWx1ZV9sZW5ndGgpOwogCiAgIC8vIFJldHVybnMgdGhlIE9TIGV4cGVyaWVuY2UuIChlLmcuIEFtYXRpIG9yIFdhdHNvbiBvbiBhbiBBbmRyb2lkIGRldmljZSkuCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL0JVSUxELmduIGIvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgppbmRleCA3MDY5NTE3Li4wMWExYmY1IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9saW51eC9zaGFyZWQvQlVJTEQuZ24KQEAgLTQzNCwxOCArNDM0LDIxIEBACiAgIH0KIH0KIAotdGFyZ2V0KGd0ZXN0X3RhcmdldF90eXBlLCAic3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzIikgewotICB0ZXN0b25seSA9IHRydWUKK2lmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBzdGFyYm9hcmRfdG9vbGNoYWluKSB7CisgIHRhcmdldChzdGFyYm9hcmRfbGV2ZWxfZ3Rlc3RfdGFyZ2V0X3R5cGUsICJzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMiKSB7CisgICAgYnVpbGRfbG9hZGVyID0gZmFsc2UKKyAgICB0ZXN0b25seSA9IHRydWUKIAotICBzb3VyY2VzID0gbWVkaWFfdGVzdHNfc291cmNlcyArIHBsYXllcl90ZXN0c19zb3VyY2VzICsKLSAgICAgICAgICAgIFsgIi8vc3RhcmJvYXJkL2NvbW1vbi90ZXN0X21haW4uY2MiIF0KKyAgICBzb3VyY2VzID0gbWVkaWFfdGVzdHNfc291cmNlcyArIHBsYXllcl90ZXN0c19zb3VyY2VzICsKKyAgICAgICAgICAgICAgWyAiLy9zdGFyYm9hcmQvY29tbW9uL3Rlc3RfbWFpbi5jYyIgXQogCi0gIGNvbmZpZ3MgKz0gWyAiLy9zdGFyYm9hcmQvYnVpbGQvY29uZmlnOnN0YXJib2FyZF9pbXBsZW1lbnRhdGlvbiIgXQorICAgIGNvbmZpZ3MgKz0gWyAiLy9zdGFyYm9hcmQvYnVpbGQvY29uZmlnOnN0YXJib2FyZF9pbXBsZW1lbnRhdGlvbiIgXQogCi0gIGRlcHMgPSBbCi0gICAgIi8vc3RhcmJvYXJkIiwKLSAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3Rpbmc6dGVzdF91dGlsIiwKLSAgICAiLy90ZXN0aW5nL2dtb2NrIiwKLSAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKLSAgXQorICAgIGRlcHMgPSBbCisgICAgICAiLy9zdGFyYm9hcmQiLAorICAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nOnRlc3RfdXRpbCIsCisgICAgICAiLy90ZXN0aW5nL2dtb2NrIiwKKyAgICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAorICAgIF0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9sYXVuY2hlci5weSBiL3N0YXJib2FyZC9saW51eC9zaGFyZWQvbGF1bmNoZXIucHkKaW5kZXggNzE0NWEyYy4uODEyYjg3YyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9sYXVuY2hlci5weQorKysgYi9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2xhdW5jaGVyLnB5CkBAIC0zMSw2ICszMSw4IEBACiAjIFRoaXMgZmlsZSBpcyBzdGlsbCBleGVjdXRlZCB3aXRoIFB5dGhvbjIgaW4gQ0kuCiAjIHB5bGludDpkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLWYtc3RyaW5nLHN1cGVyLXdpdGgtYXJndW1lbnRzCiAKK0lTX01PRFVMQVJfQlVJTEQgPSBvcy5nZXRlbnYoIk1PRFVMQVJfQlVJTEQiLCAiMCIpID09ICIxIgorCiAKIGRlZiBHZXRQcm9jZXNzU3RhdHVzKHBpZCk6CiAgICIiIlJldHVybnMgcHJvY2VzcyBydW5uaW5nIHN0YXR1cyBnaXZlbiBpdHMgcGlkLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90IGZvdW5kLgpAQCAtNjEsNiArNjMsMTQgQEAKICAgICAgIHNlbGYuZGV2aWNlX2lwID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCiAKICAgICBzZWxmLmV4ZWN1dGFibGUgPSBzZWxmLkdldFRhcmdldFBhdGgoKQorICAgIGlmIElTX01PRFVMQVJfQlVJTEQ6CisgICAgICBzZWxmLmV4ZWN1dGFibGUgKz0gIl9sb2FkZXIiCisgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5leGVjdXRhYmxlKToKKyAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gb3MucGF0aC5hYnNwYXRoKAorICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYub3V0X2RpcmVjdG9yeSwgInN0YXJib2FyZCIsIHNlbGYudGFyZ2V0X25hbWUpKQorCisgICAgICAjIFRPRE8oYi8yODUyMzQ1NDYpOiBSZXNvbHZlIEFTQU4gbGVha3MgYW5kIHJlLWVuYWJsZSBpdC4KKyAgICAgIHNlbGYuSWdub3JlQXNhbkxlYWtzKCkKIAogICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICAgZW52LnVwZGF0ZShzZWxmLmVudl92YXJpYWJsZXMpCkBAIC02OSwxNCArNzksMTIgQEAKICAgICAjIEVuc3VyZSB0aGF0IGlmIHRoZSBiaW5hcnkgaGFzIGNvZGUgY292ZXJhZ2Ugb3IgcHJvZmlsaW5nIGluc3RydW1lbnRhdGlvbiwKICAgICAjIHRoZSBvdXRwdXQgd2lsbCBiZSB3cml0dGVuIHRvIGEgZmlsZSBpbiB0aGUgY292ZXJhZ2VfZGlyZWN0b3J5IG5hbWVkIGFzCiAgICAgIyB0aGUgdGFyZ2V0X25hbWUgd2l0aCAnLnByb2ZyYXcnIHBvc3RmaXhlZC4KLSAgICBpZiBzZWxmLmNvdmVyYWdlX2RpcmVjdG9yeToKLSAgICAgIHRhcmdldF9wcm9mcmF3ID0gb3MucGF0aC5qb2luKHNlbGYuY292ZXJhZ2VfZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X25hbWUgKyAiLnByb2ZyYXciKQotICAgICAgZW52LnVwZGF0ZSh7IkxMVk1fUFJPRklMRV9GSUxFIjogdGFyZ2V0X3Byb2ZyYXd9KQorICAgIGlmIHNlbGYuY292ZXJhZ2VfZmlsZV9wYXRoOgorICAgICAgZW52LnVwZGF0ZSh7IkxMVk1fUFJPRklMRV9GSUxFIjogc2VsZi5jb3ZlcmFnZV9maWxlX3BhdGh9KQogCiAgICAgICAjIFJlbW92ZSBhbnkgc3RhbGUgcHJvZnJhdyBmaWxlIHRoYXQgbWF5IGFscmVhZHkgZXhpc3QuCiAgICAgICB0cnk6Ci0gICAgICAgIG9zLnJlbW92ZSh0YXJnZXRfcHJvZnJhdykKKyAgICAgICAgb3MucmVtb3ZlKHNlbGYuY292ZXJhZ2VfZmlsZV9wYXRoKQogICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgcmFpc2UKQEAgLTIwNSwzICsyMTMsMTIgQEAKICAgZGVmIEdldERldmljZU91dHB1dFBhdGgoc2VsZik6CiAgICAgIiIiV3JpdGFibGUgcGF0aCB3aGVyZSB0ZXN0IHRhcmdldHMgY2FuIG91dHB1dCBmaWxlcyIiIgogICAgIHJldHVybiAiL3RtcC90ZXN0b3V0cHV0IgorCisgIGRlZiBJZ25vcmVBc2FuTGVha3Moc2VsZik6CisgICAgYXNhbl9vcHRpb25zID0gc2VsZi5lbnZfdmFyaWFibGVzLmdldCgiQVNBTl9PUFRJT05TIiwgIiIpCisgICAgYXNhbl9vcHRpb25zID0gWworICAgICAgICBvcHQgZm9yIG9wdCBpbiBhc2FuX29wdGlvbnMuc3BsaXQoIjoiKSBpZiAiZGV0ZWN0X2xlYWtzIiBub3QgaW4gb3B0CisgICAgXQorICAgIGFzYW5fb3B0aW9ucy5hcHBlbmQoImRldGVjdF9sZWFrcz0wIikKKyAgICBhc2FuX29wdGlvbnMuYXBwZW5kKCJkZXRlY3Rfb2RyX3Zpb2xhdGlvbj0wIikKKyAgICBzZWxmLmVudl92YXJpYWJsZXNbIkFTQU5fT1BUSU9OUyJdID0gIjoiLmpvaW4oYXNhbl9vcHRpb25zKQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL0JVSUxELmduIGIvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL0JVSUxELmduCmluZGV4IDY4MWYzMzAuLmQxY2M5ZTEgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24KQEAgLTMzLDkgKzMzLDYgQEAKICAgICAgICItV2Vycm9yIiwKICAgICAgICItZmNvbG9yLWRpYWdub3N0aWNzIiwKIAotICAgICAgIyBEZWZhdWx0IHZpc2liaWxpdHkgdG8gaGlkZGVuLCB0byBlbmFibGUgZGVhZCBzdHJpcHBpbmcuCi0gICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0KICAgICAgICMgV2FybiBmb3IgaW1wbGljaXQgdHlwZSBjb252ZXJzaW9ucyB0aGF0IG1heSBjaGFuZ2UgYSB2YWx1ZS4KICAgICAgICItV2NvbnZlcnNpb24iLAogCkBAIC02Niw2ICs2MywxMyBAQAogICAgICAgIyBEbyBub3Qgd2FybiBhYm91dCB1bnVzZWQgZnVuY3Rpb24gcGFyYW1zLgogICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCiAgICAgXQorICAgIGlmIChidWlsZF93aXRoX3NlcGFyYXRlX2NvYmFsdF90b29sY2hhaW4pIHsKKyAgICAgICMgSWYgd2UncmUgYnVpbGRpbmcgbW9kdWxhcmx5LCB3ZSBuZWVkIHZpc2liaWxpdHkuCisgICAgICBjZmxhZ3MgKz0gWyAiLWZ2aXNpYmlsaXR5PWRlZmF1bHQiIF0KKyAgICB9IGVsc2UgeworICAgICAgIyBEZWZhdWx0IHZpc2liaWxpdHkgdG8gaGlkZGVuLCB0byBlbmFibGUgZGVhZCBzdHJpcHBpbmcuCisgICAgICBjZmxhZ3MgKz0gWyAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIgXQorICAgIH0KIAogICAgIGlmIChpc19nb2xkKSB7CiAgICAgICBjZmxhZ3MgKz0gWwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uZ25pIGIvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uZ25pCmluZGV4IDEwNTAwOGQuLmMyZTNmNmMgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaQorKysgYi9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkKQEAgLTM0LDcgKzM0LDggQEAKIAogc2Jfd2lkZXZpbmVfcGxhdGZvcm0gPSAibGludXgiCiAKLXBsYXRmb3JtX3Rlc3RzX3BhdGggPSAiLy9zdGFyYm9hcmQvbGludXgvc2hhcmVkOnN0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cyIKK3BsYXRmb3JtX3Rlc3RzX3BhdGggPQorICAgICIvL3N0YXJib2FyZC9saW51eC9zaGFyZWQ6c3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzKCRzdGFyYm9hcmRfdG9vbGNoYWluKSIKIAogZW5hYmxlX2luX2FwcF9kaWFsID0gdHJ1ZQogCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3Rlc3RfZmlsdGVycy5weSBiL3N0YXJib2FyZC9saW51eC9zaGFyZWQvdGVzdF9maWx0ZXJzLnB5CmluZGV4IGMyYzMzZjYuLjQzYTQ1NGQgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9saW51eC9zaGFyZWQvdGVzdF9maWx0ZXJzLnB5CisrKyBiL3N0YXJib2FyZC9saW51eC9zaGFyZWQvdGVzdF9maWx0ZXJzLnB5CkBAIC0yMCw5ICsyMCwzMCBAQAogCiAKICMgcHlsaW50OiBkaXNhYmxlPWxpbmUtdG9vLWxvbmcKLV9GSUxURVJFRF9URVNUUyA9IHsKLSAgICAnbnBsYic6IFtdLAorX01PRFVMQVJfQlVJTERfRklMVEVSRURfVEVTVFMgPSB7CisgICAgJ25wbGInOiBbCisgICAgICAgICdNdWx0aXBsZVBsYXllclRlc3RzLyovKnNpbnRlbF8zMjlfZWMzX2RtcConLAorICAgICAgICAnTXVsdGlwbGVQbGF5ZXJUZXN0cy8qLypzaW50ZWxfMzgxX2FjM19kbXAqJywKKyAgICAgICAgJ1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0cy9TYlBsYXllcldyaXRlU2FtcGxlVGVzdC5Xcml0ZVNpbmdsZUJhdGNoL2F1ZGlvX3NpbnRlbF8zMjlfZWMzX2RtcF8qJywKKyAgICAgICAgJ1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0cy9TYlBsYXllcldyaXRlU2FtcGxlVGVzdC5Xcml0ZVNpbmdsZUJhdGNoL2F1ZGlvX3NpbnRlbF8zODFfYWMzX2RtcF8qJywKKyAgICAgICAgJ1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0cy9TYlBsYXllcldyaXRlU2FtcGxlVGVzdC5Xcml0ZU11bHRpcGxlQmF0Y2hlcy9hdWRpb19zaW50ZWxfMzI5X2VjM19kbXBfKicsCisgICAgICAgICdTYlBsYXllcldyaXRlU2FtcGxlVGVzdHMvU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3QuV3JpdGVNdWx0aXBsZUJhdGNoZXMvYXVkaW9fc2ludGVsXzM4MV9hYzNfZG1wXyonLAorICAgICAgICAnU2JTb2NrZXRBZGRyZXNzVHlwZXMvU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzVGVzdC5TdW5ueURheURlc3RpbmF0aW9uL3R5cGVfaXB2NicsCisgICAgICAgICdTYlNvY2tldEFkZHJlc3NUeXBlcy9TYlNvY2tldEdldEludGVyZmFjZUFkZHJlc3NUZXN0LlN1bm55RGF5U291cmNlRm9yRGVzdGluYXRpb24vdHlwZV9pcHY2JywKKyAgICAgICAgJ1NiU29ja2V0QWRkcmVzc1R5cGVzL1NiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzc1Rlc3QuU3VubnlEYXlTb3VyY2VOb3RMb29wYmFjay90eXBlX2lwdjYnLAorICAgIF0sCisgICAgJ3BsYXllcl9maWx0ZXJfdGVzdHMnOiBbdGVzdF9maWx0ZXIuRklMVEVSX0FMTF0sCiB9CisKK19GSUxURVJFRF9URVNUUyA9IHsKKyAgICAnbnBsYic6IFsKKyAgICAgICAgIyBUT0RPKGIvMjg2MjQ5NTk1KTogVGhpcyB0ZXN0IGNyYXNoZXMgd2hlbiBjb3ZlcmFnZSBpcyBlbmFibGVkLgorICAgICAgICAnU2JNZW1vcnlNYXBUZXN0LkNhbkNoYW5nZU1lbW9yeVByb3RlY3Rpb24nCisgICAgXSwKK30KK2lmIG9zLmdldGVudignTU9EVUxBUl9CVUlMRCcsICcwJykgPT0gJzEnOgorICBfRklMVEVSRURfVEVTVFMgPSBfTU9EVUxBUl9CVUlMRF9GSUxURVJFRF9URVNUUworCiAjIENvbmRpdGlvbmFsbHkgZGlzYWJsZXMgdGVzdHMgdGhhdCByZXF1aXJlIGlwdjYKIGlmIG9zLmdldGVudignSVBWNl9BVkFJTEFCTEUnLCAnMScpID09ICcwJzoKICAgX0ZJTFRFUkVEX1RFU1RTWyducGxiJ10uZXh0ZW5kKFsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9saW51eC94NjR4MTEvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3N0YXJib2FyZC9saW51eC94NjR4MTEvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCA2ZjdiMGFiLi41OGZjY2VjIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvbGludXgveDY0eDExL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0yOSwxMSArMjksNiBAQAogLy8gYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uIEZvciBhIGRlZmluaXRpdmUgbWVhc3VyZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAogLy8gc3RpbGwgY2FsbCBTYlN5c3RlbUdldE51bWJlck9mUHJvY2Vzc29ycyBhdCBydW50aW1lLgogCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtJ3MgdGhyZWFkIHNjaGVkdWxlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmFsYW5jZQotLy8gdGhyZWFkcyBiZXR3ZWVuIGNvcmVzLCBhcyBvcHBvc2VkIHRvIHN5c3RlbXMgd2hlcmUgdGhyZWFkcyB3aWxsIG9ubHkgZXZlciBydW4KLS8vIG9uIHRoZSBzcGVjaWZpY2FsbHkgcGlubmVkIGNvcmUuCi0jZGVmaW5lIFNCX0hBU19DUk9TU19DT1JFX1NDSEVEVUxFUiAxCi0KIC8vIC0tLSBHcmFwaGljcyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBsYXRmb3JtIHN1cHBvcnRzIHJlbmRlcmluZyBvZiBOVjEyCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbGludXgveDY0eDExL21haW4uY2MgYi9zdGFyYm9hcmQvbGludXgveDY0eDExL21haW4uY2MKaW5kZXggYjc2ZmI1NS4uODIwNDZhMCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tYWluLmNjCisrKyBiL3N0YXJib2FyZC9saW51eC94NjR4MTEvbWFpbi5jYwpAQCAtMTIsNiArMTIsNyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKKyNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgpAQCAtMzEsNiArMzIsOSBAQAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2NyYXNocGFkL3dyYXBwZXIvd3JhcHBlci5oIgogCiBleHRlcm4gIkMiIFNCX0VYUE9SVF9QTEFURk9STSBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgLy8gU2V0IE1fQVJFTkFfTUFYIHRvIGEgbG93IHZhbHVlIHRvIHNsb3cgbWVtb3J5IGdyb3d0aCBkdWUgdG8gZnJhZ21lbnRhdGlvbi4KKyAgbWFsbG9wdChNX0FSRU5BX01BWCwgMik7CisKICAgdHpzZXQoKTsKICAgc3RhcmJvYXJkOjpzaGFyZWQ6OnNpZ25hbDo6SW5zdGFsbENyYXNoU2lnbmFsSGFuZGxlcnMoKTsKICAgc3RhcmJvYXJkOjpzaGFyZWQ6OnNpZ25hbDo6SW5zdGFsbERlYnVnU2lnbmFsSGFuZGxlcnMoKTsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24gYi9zdGFyYm9hcmQvbGludXgveDY0eDExL3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL0JVSUxELmduCmluZGV4IGFlNzI0ZjcuLjMyYzI0ZjYgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24KKysrIGIvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgpAQCAtMTMsMTcgKzEzLDI4IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBjb25maWcoInBsYXRmb3JtX2NvbmZpZ3VyYXRpb24iKSB7Ci0gIGNvbmZpZ3MgPSBbCi0gICAgIjpsaWJyYXJpZXMiLAotICAgICIvL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbiIsCi0gICAgIi8vc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uOmNvbXBpbGVyX2ZsYWdzIiwKLSAgICAiOmxpbmtlcl9mbGFncyIsCi0gIF0KKyAgaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IGRlZmF1bHRfdG9vbGNoYWluICYmCisgICAgICBidWlsZF93aXRoX3NlcGFyYXRlX2NvYmFsdF90b29sY2hhaW4pIHsKKyAgICBjb25maWdzID0gWyAiLy9zdGFyYm9hcmQvZXZlcmdyZWVuL3g2NC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uIiBdCisgIH0gZWxzZSB7CisgICAgY29uZmlncyA9IFsKKyAgICAgICI6bGlicmFyaWVzIiwKKyAgICAgICIvL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbiIsCisgICAgICAiLy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb246Y29tcGlsZXJfZmxhZ3MiLAorICAgICAgIjpsaW5rZXJfZmxhZ3MiLAorICAgIF0KKyAgfQogfQogCiBjb25maWcoImxpYnJhcmllcyIpIHsKICAgY29uZmlncyA9IFsgIi8vc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uOmxpYnJhcmllcyIgXQotICBsaWJzID0gWyAiLy90aGlyZF9wYXJ0eS9saWJ2cHgvcGxhdGZvcm1zL2xpbnV4LXg2NC9saWJ2cHguYSIgXQorICBpZiAoYnVpbGRfd2l0aF9zZXBhcmF0ZV9jb2JhbHRfdG9vbGNoYWluKSB7CisgICAgbGlicyA9IFsgIi8vdGhpcmRfcGFydHkvbGlidnB4L3BsYXRmb3Jtcy9saW51eC14NjQvbGlidnB4LnNvLjYiIF0KKyAgICBsZGZsYWdzID0gWyAiLVdsLC1ycGF0aD0iICsgcmViYXNlX3BhdGgoIi8vIikgKworICAgICAgICAgICAgICAgICIvdGhpcmRfcGFydHkvbGlidnB4L3BsYXRmb3Jtcy9saW51eC14NjQvIiBdCisgIH0gZWxzZSB7CisgICAgbGlicyA9IFsgIi8vdGhpcmRfcGFydHkvbGlidnB4L3BsYXRmb3Jtcy9saW51eC14NjQvbGlidnB4LmEiIF0KKyAgfQogfQogCiBjb25maWcoImxpbmtlcl9mbGFncyIpIHsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkgYi9zdGFyYm9hcmQvbGludXgveDY0eDExL3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uZ25pCmluZGV4IDQ1NzM2OWYuLjkwZDJkMjIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkKKysrIGIvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaQpAQCAtMTIsOSArMTIsMTcgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW1wb3J0KCIvL3N0YXJib2FyZC9saW51eC9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmduaSIpCitpZiAoY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4gJiYKKyAgICBidWlsZF93aXRoX3NlcGFyYXRlX2NvYmFsdF90b29sY2hhaW4pIHsKKyAgaW1wb3J0KCIvL3N0YXJib2FyZC9ldmVyZ3JlZW4veDY0L3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkiKQorICBwbGF0Zm9ybV90ZXN0c19wYXRoID0KKyAgICAgICIvL3N0YXJib2FyZC9saW51eC9zaGFyZWQ6c3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzKCRzdGFyYm9hcmRfdG9vbGNoYWluKSIKKyAgY29iYWx0X2ZvbnRfcGFja2FnZSA9ICJzdGFuZGFyZCIKK30gZWxzZSB7CisgIGltcG9ydCgiLy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5nbmkiKQogCi1zYl9pc19ldmVyZ3JlZW5fY29tcGF0aWJsZSA9IHRydWUKLXNiX2V2ZXJncmVlbl9jb21wYXRpYmxlX3VzZV9saWJ1bndpbmQgPSB0cnVlCisgIHNiX2lzX2V2ZXJncmVlbl9jb21wYXRpYmxlID0gdHJ1ZQorICBzYl9ldmVyZ3JlZW5fY29tcGF0aWJsZV91c2VfbGlidW53aW5kID0gdHJ1ZQogCi1zYWJpX3BhdGggPSAiLy9zdGFyYm9hcmQvc2FiaS94NjQvc3lzdi9zYWJpLXYkc2JfYXBpX3ZlcnNpb24uanNvbiIKKyAgc2FiaV9wYXRoID0gIi8vc3RhcmJvYXJkL3NhYmkveDY0L3N5c3Yvc2FiaS12JHNiX2FwaV92ZXJzaW9uLmpzb24iCit9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9sb2FkZXIuY2MgYi9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9sb2FkZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YmZhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX2xvYWRlci5jYwpAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZXZlbnQuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHJldHVybiBTYlJ1blN0YXJib2FyZE1haW4oYXJnYywgYXJndiwgU2JFdmVudEhhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbGludXgveDY0eDExL3Rvb2xjaGFpbi9CVUlMRC5nbiBiL3N0YXJib2FyZC9saW51eC94NjR4MTEvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDMwNGZkYTYuLmJjZWU2NDEgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9saW51eC94NjR4MTEvdG9vbGNoYWluL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9saW51eC94NjR4MTEvdG9vbGNoYWluL0JVSUxELmduCkBAIC0xNSw2ICsxNSwxMCBAQAogaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9jbGFuZy9jbGFuZy5nbmkiKQogaW1wb3J0KCIvL3N0YXJib2FyZC9zaGFyZWQvdG9vbGNoYWluL292ZXJyaWRhYmxlX2djY190b29sY2hhaW4uZ25pIikKIAorb3ZlcnJpZGFibGVfY2xhbmdfdG9vbGNoYWluKCJzdGFyYm9hcmQiKSB7CisgIGNsYW5nX2Jhc2VfcGF0aCA9IGNsYW5nX2Jhc2VfcGF0aAorfQorCiBvdmVycmlkYWJsZV9jbGFuZ190b29sY2hhaW4oInRhcmdldCIpIHsKICAgY2xhbmdfYmFzZV9wYXRoID0gY2xhbmdfYmFzZV9wYXRoCiB9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbG9hZGVyX2FwcC9CVUlMRC5nbiBiL3N0YXJib2FyZC9sb2FkZXJfYXBwL0JVSUxELmduCmluZGV4IDE4NTc3ZGYuLjRkMzhjY2UgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9sb2FkZXJfYXBwL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9sb2FkZXJfYXBwL0JVSUxELmduCkBAIC04OCwzOSArODgsNDQgQEAKICAgfQogfQogCi10YXJnZXQoZmluYWxfZXhlY3V0YWJsZV90eXBlLCAibG9hZGVyX2FwcCIpIHsKLSAgaWYgKHRhcmdldF9jcHUgPT0gIng4NiIgfHwgdGFyZ2V0X2NwdSA9PSAieDY0IiB8fCB0YXJnZXRfY3B1ID09ICJhcm0iIHx8Ci0gICAgICB0YXJnZXRfY3B1ID09ICJhcm02NCIpIHsKLSAgICBkYXRhX2RlcHMgPSBbICIvL3RoaXJkX3BhcnR5L2ljdTppY3VkYXRhIiBdCi0gICAgaWYgKGNvYmFsdF9mb250X3BhY2thZ2UgPT0gImVtcHR5IikgewotICAgICAgZGF0YV9kZXBzICs9IFsgIi8vY29iYWx0L2NvbnRlbnQvZm9udHM6Y29weV9mb250X2RhdGEiIF0KLSAgICB9IGVsc2UgewotICAgICAgZGF0YV9kZXBzICs9IFsKLSAgICAgICAgIi8vY29iYWx0L2NvbnRlbnQvZm9udHM6Y29weV9mb250cyIsCi0gICAgICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmZvbnRzX3htbCIsCitpZiAoY3VycmVudF90b29sY2hhaW4gPT0gc3RhcmJvYXJkX3Rvb2xjaGFpbikgeworICB0YXJnZXQoc3RhcmJvYXJkX2xldmVsX2ZpbmFsX2V4ZWN1dGFibGVfdHlwZSwgImxvYWRlcl9hcHAiKSB7CisgICAgYnVpbGRfbG9hZGVyID0gZmFsc2UKKyAgICBpZiAodGFyZ2V0X2NwdSA9PSAieDg2IiB8fCB0YXJnZXRfY3B1ID09ICJ4NjQiIHx8IHRhcmdldF9jcHUgPT0gImFybSIgfHwKKyAgICAgICAgdGFyZ2V0X2NwdSA9PSAiYXJtNjQiKSB7CisgICAgICBkYXRhX2RlcHMgPSBbICIvL3RoaXJkX3BhcnR5L2ljdTppY3VkYXRhIiBdCisgICAgICBpZiAoY29iYWx0X2ZvbnRfcGFja2FnZSA9PSAiZW1wdHkiKSB7CisgICAgICAgIGRhdGFfZGVwcyArPSBbICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udF9kYXRhIiBdCisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhX2RlcHMgKz0gWworICAgICAgICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udHMiLAorICAgICAgICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmZvbnRzX3htbCIsCisgICAgICAgIF0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgPSBfY29tbW9uX2xvYWRlcl9hcHBfc291cmNlcworICAgICAgZGVwcyA9IFsKKyAgICAgICAgIjpjb21tb25fbG9hZGVyX2FwcF9kZXBlbmRlbmNpZXMiLAorICAgICAgICAiLy9jb2JhbHQvY29udGVudC9mb250czpjb3B5X2ZvbnRfZGF0YSIsCisgICAgICAgICIvL3N0YXJib2FyZC9lbGZfbG9hZGVyIiwKICAgICAgIF0KLSAgICB9Ci0gICAgc291cmNlcyA9IF9jb21tb25fbG9hZGVyX2FwcF9zb3VyY2VzCi0gICAgZGVwcyA9IFsKLSAgICAgICI6Y29tbW9uX2xvYWRlcl9hcHBfZGVwZW5kZW5jaWVzIiwKLSAgICAgICIvL2NvYmFsdC9jb250ZW50L2ZvbnRzOmNvcHlfZm9udF9kYXRhIiwKLSAgICAgICIvL3N0YXJib2FyZC9lbGZfbG9hZGVyIiwKLSAgICBdCi0gICAgaWYgKHNiX2lzX2V2ZXJncmVlbl9jb21wYXRpYmxlICYmIHNiX2V2ZXJncmVlbl9jb21wYXRpYmxlX3BhY2thZ2UpIHsKLSAgICAgIGRhdGFfZGVwcyArPSBbCi0gICAgICAgICI6Y29weV9jcmFzaHBhZF9oYW5kbGVyX25hbWVkX2FzX3NvIiwKLSAgICAgICAgIjpjb3B5X2xvYWRlcl9hcHBfY29udGVudCIsCi0gICAgICAgICI6Y29weV9sb2FkZXJfYXBwX2xpYiIsCi0gICAgICAgICI6Y29weV9sb2FkZXJfYXBwX21hbmlmZXN0IiwKLSAgICAgIF0KLSAgICAgIGRlcHMgKz0gWwotICAgICAgICAiOmNvcHlfY3Jhc2hwYWRfaGFuZGxlcl9uYW1lZF9hc19zbyIsCi0gICAgICAgICI6Y29weV9sb2FkZXJfYXBwX2NvbnRlbnQiLAotICAgICAgICAiOmNvcHlfbG9hZGVyX2FwcF9saWIiLAotICAgICAgICAiOmNvcHlfbG9hZGVyX2FwcF9tYW5pZmVzdCIsCi0gICAgICBdCisgICAgICBpZiAoc2JfaXNfZXZlcmdyZWVuX2NvbXBhdGlibGUgJiYgc2JfZXZlcmdyZWVuX2NvbXBhdGlibGVfcGFja2FnZSkgeworICAgICAgICBkYXRhX2RlcHMgKz0gWworICAgICAgICAgICI6Y29weV9jcmFzaHBhZF9oYW5kbGVyX25hbWVkX2FzX3NvIiwKKyAgICAgICAgICAiOmNvcHlfbG9hZGVyX2FwcF9jb250ZW50IiwKKyAgICAgICAgICAiOmNvcHlfbG9hZGVyX2FwcF9saWIiLAorICAgICAgICAgICI6Y29weV9sb2FkZXJfYXBwX21hbmlmZXN0IiwKKyAgICAgICAgXQorICAgICAgICBkZXBzICs9IFsKKyAgICAgICAgICAiOmNvcHlfY3Jhc2hwYWRfaGFuZGxlcl9uYW1lZF9hc19zbyIsCisgICAgICAgICAgIjpjb3B5X2xvYWRlcl9hcHBfY29udGVudCIsCisgICAgICAgICAgIjpjb3B5X2xvYWRlcl9hcHBfbGliIiwKKyAgICAgICAgICAiOmNvcHlfbG9hZGVyX2FwcF9tYW5pZmVzdCIsCisgICAgICAgIF0KKyAgICAgIH0KICAgICB9CiAgIH0KK30gZWxzZSB7CisgIG5vdF9uZWVkZWQoWyAiX2NvbW1vbl9sb2FkZXJfYXBwX3NvdXJjZXMiIF0pCiB9CiAKIGlmIChzYl9pc19ldmVyZ3JlZW5fY29tcGF0aWJsZSkgewpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL25wbGIvQlVJTEQuZ24gYi9zdGFyYm9hcmQvbnBsYi9CVUlMRC5nbgppbmRleCBlZDVkZmE5Li4yNmJhZWYyIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvbnBsYi9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvbnBsYi9CVUlMRC5nbgpAQCAtOTMsOSArOTMsMTMgQEAKICAgICAjIFRPRE86IFNlcGFyYXRlIGZ1bmN0aW9ucyB0ZXN0ZWQgYnkgbWVkaWEgYnVmZmVyIHRlc3QgaW50byBtdWx0aXBsZQogICAgICMgZmlsZXMuCiAgICAgImRybV9jcmVhdGVfc3lzdGVtX3Rlc3QuY2MiLAorICAgICJtYXhpbXVtX3BsYXllcl9jb25maWd1cmF0aW9uX2V4cGxvcmVyLmNjIiwKKyAgICAibWF4aW11bV9wbGF5ZXJfY29uZmlndXJhdGlvbl9leHBsb3Jlci5oIiwKKyAgICAibWF4aW11bV9wbGF5ZXJfY29uZmlndXJhdGlvbl9leHBsb3Jlcl90ZXN0LmNjIiwKICAgICAibWVkaWFfYnVmZmVyX3Rlc3QuY2MiLAogICAgICJtZWRpYV9jYW5fcGxheV9taW1lX2FuZF9rZXlfc3lzdGVtX3Rlc3QuY2MiLAogICAgICJtZWRpYV9jb25maWd1cmF0aW9uX3Rlc3QuY2MiLAorICAgICJtZWRpYV9zZXRfYXVkaW9fd3JpdGVfZHVyYXRpb25fdGVzdC5jYyIsCiAgICAgIm1lbW9yeV9hbGxvY2F0ZV9hbGlnbmVkX3Rlc3QuY2MiLAogICAgICJtZW1vcnlfYWxsb2NhdGVfdGVzdC5jYyIsCiAgICAgIm1lbW9yeV9kZWFsbG9jYXRlX2FsaWduZWRfdGVzdC5jYyIsCkBAIC0xMTAsNiArMTE0LDcgQEAKICAgICAibWljcm9waG9uZV9pc19zYW1wbGVfcmF0ZV9zdXBwb3J0ZWRfdGVzdC5jYyIsCiAgICAgIm1pY3JvcGhvbmVfb3Blbl90ZXN0LmNjIiwKICAgICAibWljcm9waG9uZV9yZWFkX3Rlc3QuY2MiLAorICAgICJtdWx0aXBsZV9wbGF5ZXJfdGVzdC5jYyIsCiAgICAgIm11cm11cmhhc2gyX3Rlc3QuY2MiLAogICAgICJtdXRleF9hY3F1aXJlX3Rlc3QuY2MiLAogICAgICJtdXRleF9hY3F1aXJlX3RyeV90ZXN0LmNjIiwKQEAgLTEyMCw2ICsxMjUsNyBAQAogICAgICJwbGF5ZXJfY3JlYXRlX3Rlc3QuY2MiLAogICAgICJwbGF5ZXJfY3JlYXRpb25fcGFyYW1faGVscGVycy5jYyIsCiAgICAgInBsYXllcl9jcmVhdGlvbl9wYXJhbV9oZWxwZXJzLmgiLAorICAgICJwbGF5ZXJfZ2V0X2F1ZGlvX2NvbmZpZ3VyYXRpb25fdGVzdC5jYyIsCiAgICAgInBsYXllcl9nZXRfcHJlZmVycmVkX291dHB1dF9tb2RlX3Rlc3QuY2MiLAogICAgICJwbGF5ZXJfdGVzdF9maXh0dXJlLmNjIiwKICAgICAicGxheWVyX3Rlc3RfZml4dHVyZS5oIiwKQEAgLTIxNyw2ICsyMjMsNyBAQAogICAgICJ1c2VyX2dldF9jdXJyZW50X3Rlc3QuY2MiLAogICAgICJ1c2VyX2dldF9wcm9wZXJ0eV90ZXN0LmNjIiwKICAgICAidXNlcl9nZXRfc2lnbmVkX2luX3Rlc3QuY2MiLAorICAgICJ2ZXJ0aWNhbF92aWRlb190ZXN0LmNjIiwKICAgICAid2luZG93X2NyZWF0ZV90ZXN0LmNjIiwKICAgICAid2luZG93X2Rlc3Ryb3lfdGVzdC5jYyIsCiAgICAgIndpbmRvd19nZXRfZGlhZ29uYWxfc2l6ZV9pbl9pbmNoZXNfdGVzdC5jYyIsCkBAIC0yMzcsNiArMjQ0LDcgQEAKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYTptZWRpYV91dGlsIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXI6dmlkZW9fZG1wIiwKICAgICAiLy90ZXN0aW5nL2dtb2NrIiwKKyAgICAiLy90ZXN0aW5nL2d0ZXN0IiwKICAgXQogCiAgIGRlcHMgKz0gY29iYWx0X3BsYXRmb3JtX2RlcGVuZGVuY2llcwpAQCAtMjQ1LDEwICsyNTMsNiBAQAogICAgIGRlcHMgKz0gWyAiLy9pbnRlcm5hbC9zdGFyYm9hcmQvcHJpdmF0ZS9ucGxiOm5wbGJfcHJpdmF0ZSIgXQogICB9CiAKLSAgaWYgKGdsX3R5cGUgIT0gIm5vbmUiKSB7Ci0gICAgZGVwcyArPSBbICIvL3N0YXJib2FyZC9lZ2xfYW5kX2dsZXMiIF0KLSAgfQotCiAgIGlmIChzYl9lbmFibGVfY3BwMTdfYXVkaXQpIHsKICAgICBkZXBzICs9IFsgIi8vc3RhcmJvYXJkL25wbGIvY29tcGlsZXJfY29tcGxpYW5jZTpjcHAxN19zdXBwb3J0ZWQiIF0KICAgfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL25wbGIvbWF4aW11bV9wbGF5ZXJfY29uZmlndXJhdGlvbl9leHBsb3Jlci5jYyBiL3N0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0ZTNmNAotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuY2MKQEAgLTAsMCArMSwyODggQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvZHJtX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgc2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6dmlkZW9fZG1wOjpWaWRlb0RtcFJlYWRlcjsKKworY2xhc3MgSGFzaEZ1bmN0aW9uIHsKKyBwdWJsaWM6CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHZlY3RvcikgY29uc3QgeworICAgIHNpemVfdCBoYXNoID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHYgOiB2ZWN0b3IpIHsKKyAgICAgIGhhc2ggKz0gdjsKKyAgICAgIGhhc2ggKj0gMTA7ICAvLyBzaW5jZSB3ZSBzdXBwb3J0IGF0IG1vc3QgNyBpbnN0YW5jZXMsIDEwIGlzIGdvb2QgZW5vdWdoLgorICAgIH0KKyAgICByZXR1cm4gaGFzaDsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRoZSBwYXJ0aWFsIG9yZGVyIHJlbGF0aW9uIGhlcmUgaXM6IEdpdmVuIHR3byB2ZWN0b3JzLCBhIGFuZCBiLCBhID49IGIgaWYgYW5kCisvLyBvbmx5IGlmIGFbaV0gPj0gYltpXSBmb3IgYWxsIGluZGljZXMgaS4KK2Jvb2wgUG9zZXRHcmVhdGVyVGhhbk9yRXF1YWxUbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGIpIHsKKyAgU0JfRENIRUNLKGEuc2l6ZSgpID09IGIuc2l6ZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoYVtpXSA8IGJbaV0pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEdpdmVuIGEgdmVjdG9yIHYsIHRlc3QgaWYgaXQgaXMgY29udGFpbmVkIHdpdGhpbiBhIG1heCBlbGVtZW50cyBzZXQgcy4KKy8vIHYgaXMgY29udGFpbmVkIGluIGEgbWF4IGVsZW1lbnRzIHNldCBzIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbWF4IGVsZW1lbnQKKy8vIG0gd2l0aGluIHMgc3VjaCB0aGF0IG0gPj0gdi4KK2Jvb2wgUG9zZXRDb250YWluZWRCeU1heEVsZW1lbnRzU2V0KAorICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6dmVjdG9yPGludD4+JiBtYXhfZWxlbWVudHNfc2V0LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHYpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBtYXhfZWxlbWVudCA6IG1heF9lbGVtZW50c19zZXQpIHsKKyAgICBpZiAoUG9zZXRHcmVhdGVyVGhhbk9yRXF1YWxUbyhtYXhfZWxlbWVudCwgdikpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYXJyYW5naW5nIHRoZSBzZWFyY2ggcHJvY2VzcyB0byBpZGVudGlmeSB0aGUKKy8vIG1heGltdW0gZWxlbWVudHMgd2l0aGluIGEgZ3JhZGVkIHBvc2V0LCB3aGljaCBpcyBiYXNlZCBvbiBhIHNldCBvZiB2ZWN0b3JzCisvLyBjb21wcmlzaW5nIGludGVnZXJzLiBTcGVjaWZpY2FsbHksIHRoZSBsZW5ndGggb2YgZWFjaCB2ZWN0b3IgaXMgZGV0ZXJtaW5lZCBieQorLy8gdGhlIG51bWJlciBvZiB8cmVzb3VyY2VfdHlwZXN8LCB3aGlsZSB0aGUgcmFuZ2Ugb2YgaW50ZWdlcnMgaW4gZWFjaCB2ZWN0b3IKKy8vIHNwYW5zIGZyb20gMCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgfG1heF9pbnN0YW5jZXNfcGVyX3Jlc291cmNlfCwgYXMgWzAsCisvLyBtYXhfaW5zdGFuY2VzXS4gVGhlIHBhcnRpYWwgb3JkZXIgPD0gYmV0d2VlbiB0d28gdmVjdG9ycyBpcyBkZWZpbmVkIHN1Y2ggdGhhdAorLy8gb25lIHZlY3RvciBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIgdmVjdG9yIGlmIGFsbCB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgaW50ZWdlcnMgaW4gdGhlIGZpcnN0IHZlY3RvciBhcmUgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorLy8gY29ycmVzcG9uZGluZyBpbnRlZ2VycyBpbiB0aGUgc2Vjb25kIHZlY3Rvci4gVG8gaWRlbnRpZnkgdGhlIG1heGltdW0KKy8vIGVsZW1lbnRzLCBhIHRlc3QgZnVuY3Rpb24sIGRlbm90ZWQgYXMgfHRlc3RfZnVuY3RvcnwsIG11c3QgYmUgcHJvdmlkZWQgdG8KKy8vIGV2YWx1YXRlIHdoZXRoZXIgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBzYXRpc2ZpZXMgdGhlIGNyaXRlcmlvbiBmb3IgYQorLy8gbWF4aW11bSBlbGVtZW50LiBUaGUgcmVhc29uIGZvciBhcHBseWluZyB0aGUgZGVwdGggZmlyc3Qgc2VhcmNoIHNjaGVkdWxlciBpbgorLy8gdGhpcyBjb250ZXh0IGlzIHRoYXQgaXQgaXMgYSBmYXN0ZXIgbWV0aG9kLgorc3RkOjpzZXQ8c3RkOjp2ZWN0b3I8aW50Pj4gU2VhcmNoUG9zZXRNYXhpbWFsRWxlbWVudHNERlMoCisgICAgaW50IHJlc291cmNlX3R5cGVzLAorICAgIGludCBtYXhfaW5zdGFuY2VzX3Blcl9yZXNvdXJjZSwKKyAgICBjb25zdCBQb3NldFNlYXJjaEZ1bmN0b3ImIHRlc3RfZnVuY3RvcikgeworICBTQl9EQ0hFQ0socmVzb3VyY2VfdHlwZXMgPiAwKTsKKyAgU0JfRENIRUNLKG1heF9pbnN0YW5jZXNfcGVyX3Jlc291cmNlID4gMCk7CisgIFNCX0RDSEVDSyh0ZXN0X2Z1bmN0b3IpOworCisgIHN0ZDo6c3RhY2s8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPGludD4sIGludD4+IHN0YWNrOworICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjp2ZWN0b3I8aW50PiwgYm9vbCwgSGFzaEZ1bmN0aW9uPiB2YWxpZDsKKyAgc3RkOjpzZXQ8c3RkOjp2ZWN0b3I8aW50Pj4gbWF4X2VsZW1lbnRzX3NldDsKKworICBzdGFjay5wdXNoKHN0ZDo6bWFrZV9wYWlyKHN0ZDo6dmVjdG9yPGludD4ocmVzb3VyY2VfdHlwZXMsIDApLCAwKSk7CisgIHZhbGlkW3N0YWNrLnRvcCgpLmZpcnN0XSA9IGZhbHNlOworICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAvLyBUaGUgY3VycmVudCBub2RlIGluIHRoZSBzZWFyY2ggZ3JhcGggY29uc2lzdHMgb2YgYSBjb25maWd1cmF0aW9uIGFuZCB0aGUKKyAgICAvLyBuZXh0IGluZGV4IHRvIGJlIGFkdmFuY2VkLgorICAgIGF1dG8mIG5vZGUgPSBzdGFjay50b3AoKTsKKyAgICBhdXRvJiBjb25maWcgPSBub2RlLmZpcnN0OworICAgIGF1dG8mIGluZGV4ID0gbm9kZS5zZWNvbmQ7CisgICAgd2hpbGUgKGluZGV4IDwgcmVzb3VyY2VfdHlwZXMpIHsKKyAgICAgIGlmIChjb25maWdbaW5kZXhdICE9IG1heF9pbnN0YW5jZXNfcGVyX3Jlc291cmNlKSB7CisgICAgICAgICsrY29uZmlnW2luZGV4XTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2luZGV4OworICAgIH0KKworICAgIGlmIChpbmRleCAhPSByZXNvdXJjZV90eXBlcykgeworICAgICAgaWYgKChQb3NldENvbnRhaW5lZEJ5TWF4RWxlbWVudHNTZXQobWF4X2VsZW1lbnRzX3NldCwgY29uZmlnKSB8fAorICAgICAgICAgICB0ZXN0X2Z1bmN0b3IoY29uZmlnKSkpIHsKKyAgICAgICAgc3RhY2sucHVzaChzdGQ6Om1ha2VfcGFpcihjb25maWcsIGluZGV4KSk7CisgICAgICAgIHZhbGlkW2NvbmZpZ10gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsaWRbY29uZmlnXSA9IGZhbHNlOworICAgICAgfQorICAgICAgLS1jb25maWdbaW5kZXhdOworICAgICAgKytpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgYm9vbCBjYW5fYWR2YW5jZSA9IGZhbHNlOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGNvbmZpZ1tpXSA+PSBtYXhfaW5zdGFuY2VzX3Blcl9yZXNvdXJjZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICsrY29uZmlnW2ldOworICAgICAgICAgIGlmICh2YWxpZFtjb25maWddKSB7CisgICAgICAgICAgICBjYW5fYWR2YW5jZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLS1jb25maWdbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghY2FuX2FkdmFuY2UpIHsKKyAgICAgICAgbWF4X2VsZW1lbnRzX3NldC5pbnNlcnQoY29uZmlnKTsKKyAgICAgIH0KKyAgICAgIHN0YWNrLnBvcCgpOworICAgIH0KKyAgfQorICByZXR1cm4gbWF4X2VsZW1lbnRzX3NldDsKK30KKworTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3Jlcjo6TWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlcigKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+JiBwbGF5ZXJfY29uZmlncywKKyAgICBpbnQgbWF4X2luc3RhbmNlc19wZXJfY29uZmlnLAorICAgIGludCBtYXhfdG90YWxfaW5zdGFuY2VzLAorICAgIHRlc3Rpbmc6OkZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlciogZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKQorICAgIDogcGxheWVyX2NvbmZpZ3NfKHBsYXllcl9jb25maWdzKSwKKyAgICAgIG1heF9pbnN0YW5jZXNfcGVyX2NvbmZpZ18obWF4X2luc3RhbmNlc19wZXJfY29uZmlnKSwKKyAgICAgIG1heF90b3RhbF9pbnN0YW5jZXNfKG1heF90b3RhbF9pbnN0YW5jZXMpLAorICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXyhmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpLAorICAgICAgcGxheWVyX2luc3RhbmNlc18ocGxheWVyX2NvbmZpZ3Muc2l6ZSgpKSB7CisgIFNCX0RDSEVDSyghcGxheWVyX2NvbmZpZ3NfLmVtcHR5KCkpOworICBTQl9EQ0hFQ0sobWF4X2luc3RhbmNlc19wZXJfY29uZmlnXyA+IDApOworICBTQl9EQ0hFQ0sobWF4X3RvdGFsX2luc3RhbmNlc18gPiAwKTsKKyAgU0JfRENIRUNLKGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICBTQl9EQ0hFQ0socGxheWVyX2luc3RhbmNlc18uc2l6ZSgpID09IHBsYXllcl9jb25maWdzXy5zaXplKCkpOworICBTQl9EQ0hFQ0socGxheWVyX2NvbmZpZ3NfLnNpemUoKSA8PSA3ICYmIG1heF9pbnN0YW5jZXNfcGVyX2NvbmZpZ18gPD0gNykKKyAgICAgIDw8ICJFeHBsb3JpbmcgY29uZmlncyB3aXRoIHRoYXQgc2l6ZSBtYXkgYmUgYSB0aW1lLWNvbnN1bWluZyBwcm9jZXNzLiI7Cit9CisKK01heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXI6On5NYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyKCkgeworICBmb3IgKGF1dG8mIGluc3RhbmNlcyA6IHBsYXllcl9pbnN0YW5jZXNfKSB7CisgICAgZm9yIChhdXRvJiBpbnN0YW5jZSA6IGluc3RhbmNlcykgeworICAgICAgRGVzdHJveVBsYXllckluc3RhbmNlKGluc3RhbmNlKTsKKyAgICB9CisgIH0KK30KKworc3RkOjp2ZWN0b3I8U2JQbGF5ZXJNdWx0aXBsZVBsYXllclRlc3RDb25maWc+CitNYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyOjpDYWxjdWxhdGVNYXhUZXN0Q29uZmlncygpIHsKKyAgUG9zZXRTZWFyY2hGdW5jdG9yIHRlc3RfZnVuY3RvciA9CisgICAgICBzdGQ6OmJpbmQoJk1heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXI6OklzQ29uZmlnQ3JlYXRhYmxlLCB0aGlzLAorICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSk7CisgIHN0ZDo6c2V0PHN0ZDo6dmVjdG9yPGludD4+IHJlc3VsdCA9IFNlYXJjaFBvc2V0TWF4aW1hbEVsZW1lbnRzREZTKAorICAgICAgcGxheWVyX2NvbmZpZ3NfLnNpemUoKSwgbWF4X2luc3RhbmNlc19wZXJfY29uZmlnXywgdGVzdF9mdW5jdG9yKTsKKyAgc3RkOjp2ZWN0b3I8U2JQbGF5ZXJNdWx0aXBsZVBsYXllclRlc3RDb25maWc+IGNvbmZpZ3NfdG9fcmV0dXJuOworICBmb3IgKGF1dG8mIGNvbmZpZ3NfdmVjdG9yIDogcmVzdWx0KSB7CisgICAgU0JfRENIRUNLKGNvbmZpZ3NfdmVjdG9yLnNpemUoKSA9PSBwbGF5ZXJfY29uZmlnc18uc2l6ZSgpKTsKKworICAgIFNiUGxheWVyTXVsdGlwbGVQbGF5ZXJUZXN0Q29uZmlnIG11bHRpX3BsYXllcl90ZXN0X2NvbmZpZzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3NfdmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICBtdWx0aV9wbGF5ZXJfdGVzdF9jb25maWcuaW5zZXJ0KG11bHRpX3BsYXllcl90ZXN0X2NvbmZpZy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnc192ZWN0b3JbaV0sIHBsYXllcl9jb25maWdzX1tpXSk7CisgICAgfQorICAgIGlmICghbXVsdGlfcGxheWVyX3Rlc3RfY29uZmlnLmVtcHR5KCkpIHsKKyAgICAgIGNvbmZpZ3NfdG9fcmV0dXJuLnB1c2hfYmFjayhtdWx0aV9wbGF5ZXJfdGVzdF9jb25maWcpOworICAgIH0KKyAgfQorICByZXR1cm4gY29uZmlnc190b19yZXR1cm47Cit9CisKK2Jvb2wgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3Jlcjo6SXNDb25maWdDcmVhdGFibGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgY29uZmlnc190b19jcmVhdGUpIHsKKyAgU0JfRENIRUNLKGNvbmZpZ3NfdG9fY3JlYXRlLnNpemUoKSA9PSBwbGF5ZXJfY29uZmlnc18uc2l6ZSgpKTsKKworICBpZiAoc3RkOjphY2N1bXVsYXRlKGNvbmZpZ3NfdG9fY3JlYXRlLmJlZ2luKCksIGNvbmZpZ3NfdG9fY3JlYXRlLmVuZCgpLCAwKSA+CisgICAgICBtYXhfdG90YWxfaW5zdGFuY2VzXykgeworICAgIC8vIFRvdGFsIGluc3RhbmNlcyBzaG91bGQgbm90IGV4Y2VlZCB8bWF4X3RvdGFsX2luc3RhbmNlc198LgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnc190b19jcmVhdGUuc2l6ZSgpOyBpKyspIHsKKyAgICBTQl9EQ0hFQ0soY29uZmlnc190b19jcmVhdGVbaV0gPj0gMCk7CisgICAgU0JfRENIRUNLKGNvbmZpZ3NfdG9fY3JlYXRlW2ldIDw9IG1heF9pbnN0YW5jZXNfcGVyX2NvbmZpZ18pOworCisgICAgc3RkOjp2ZWN0b3I8UGxheWVySW5zdGFuY2U+JiBpbnN0YW5jZXMgPSBwbGF5ZXJfaW5zdGFuY2VzX1tpXTsKKyAgICB3aGlsZSAoaW5zdGFuY2VzLnNpemUoKSA+IGNvbmZpZ3NfdG9fY3JlYXRlW2ldKSB7CisgICAgICBEZXN0cm95UGxheWVySW5zdGFuY2UoaW5zdGFuY2VzLmJhY2soKSk7CisgICAgICBpbnN0YW5jZXMucG9wX2JhY2soKTsKKyAgICB9CisgICAgd2hpbGUgKGluc3RhbmNlcy5zaXplKCkgPCBjb25maWdzX3RvX2NyZWF0ZVtpXSkgeworICAgICAgUGxheWVySW5zdGFuY2UgaW5zdGFuY2UgPSBDcmVhdGVQbGF5ZXJJbnN0YW5jZShwbGF5ZXJfY29uZmlnc19baV0pOworICAgICAgaWYgKGluc3RhbmNlLnBsYXllciA9PSBrU2JQbGF5ZXJJbnZhbGlkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGluc3RhbmNlcy5wdXNoX2JhY2soaW5zdGFuY2UpOworICAgIH0KKworICAgIFNCX0RDSEVDSyhpbnN0YW5jZXMuc2l6ZSgpID09IGNvbmZpZ3NfdG9fY3JlYXRlW2ldKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3Jlcjo6UGxheWVySW5zdGFuY2UKK01heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXI6OkNyZWF0ZVBsYXllckluc3RhbmNlKAorICAgIGNvbnN0IFNiUGxheWVyVGVzdENvbmZpZyYgY29uZmlnKSB7CisgIC8vIEN1cnJlbnRseSwgYXVkaW8gY29uZmlnIGlzIGlnbm9yZWQuCisgIGNvbnN0IGNoYXIqIHZpZGVvX2ZpbGVuYW1lID0gY29uZmlnLnZpZGVvX2ZpbGVuYW1lOworICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUgPSBjb25maWcub3V0cHV0X21vZGU7CisgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSBjb25maWcua2V5X3N5c3RlbTsKKyAgU0JfRENIRUNLKHZpZGVvX2ZpbGVuYW1lICYmIHN0cmxlbih2aWRlb19maWxlbmFtZSkgPiAwKTsKKyAgU0JfRENIRUNLKG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUgfHwKKyAgICAgICAgICAgIG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCk7CisgIFNCX0RDSEVDSyhrZXlfc3lzdGVtKTsKKworICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtID0ga1NiRHJtU3lzdGVtSW52YWxpZDsKKyAgaWYgKHN0cmxlbihrZXlfc3lzdGVtKSA+IDApIHsKKyAgICBkcm1fc3lzdGVtID0gU2JEcm1DcmVhdGVTeXN0ZW0oCisgICAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICAgIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jLCBEdW1teVNlc3Npb25LZXlTdGF0dXNlc0NoYW5nZWRGdW5jLAorICAgICAgICBEdW1teVNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMsIER1bW15U2Vzc2lvbkNsb3NlZEZ1bmMpOworCisgICAgaWYgKCFTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbSkpIHsKKyAgICAgIHJldHVybiBQbGF5ZXJJbnN0YW5jZSgpOworICAgIH0KKyAgfQorCisgIFZpZGVvRG1wUmVhZGVyIHZpZGVvX2RtcF9yZWFkZXIodmlkZW9fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EbXBSZWFkZXI6OmtFbmFibGVSZWFkT25EZW1hbmQpOworICAvLyBUT0RPOiByZWZpbmUgQ2FsbFNiUGxheWVyQ3JlYXRlKCkgdG8gdXNlIHJlYWwgdmlkZW8gc2FtcGxlIGluZm8uCisgIFNiUGxheWVyIHBsYXllciA9IENhbGxTYlBsYXllckNyZWF0ZSgKKyAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8tPndpbmRvdygpLCB2aWRlb19kbXBfcmVhZGVyLnZpZGVvX2NvZGVjKCksCisgICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lLCBkcm1fc3lzdGVtLCBudWxscHRyIC8qIGF1ZGlvX3N0cmVhbV9pbmZvICovLAorICAgICAgIiIgLyogbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyAqLywgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCisgICAgICBudWxscHRyIC8qIGNvbnRleHQgKi8sIG91dHB1dF9tb2RlLAorICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy0+ZGVjb2Rlcl90YXJnZXRfcHJvdmlkZXIoKSk7CisgIGlmICghU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpIHsKKyAgICBpZiAoU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKSB7CisgICAgICBTYkRybURlc3Ryb3lTeXN0ZW0oZHJtX3N5c3RlbSk7CisgICAgfQorICAgIHJldHVybiBQbGF5ZXJJbnN0YW5jZSgpOworICB9CisKKyAgcmV0dXJuIFBsYXllckluc3RhbmNlKHBsYXllciwgZHJtX3N5c3RlbSwgY29uZmlnKTsKK30KKwordm9pZCBNYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyOjpEZXN0cm95UGxheWVySW5zdGFuY2UoCisgICAgY29uc3QgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3Jlcjo6UGxheWVySW5zdGFuY2UmIGluc3RhbmNlKSB7CisgIFNCX0RDSEVDSyhTYlBsYXllcklzVmFsaWQoaW5zdGFuY2UucGxheWVyKSk7CisgIFNiUGxheWVyRGVzdHJveShpbnN0YW5jZS5wbGF5ZXIpOworCisgIGlmIChTYkRybVN5c3RlbUlzVmFsaWQoaW5zdGFuY2UuZHJtX3N5c3RlbSkpIHsKKyAgICBTYkRybURlc3Ryb3lTeXN0ZW0oaW5zdGFuY2UuZHJtX3N5c3RlbSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG5wbGIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuaCBiL3N0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc0YWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3RhcmJvYXJkL25wbGIvbWF4aW11bV9wbGF5ZXJfY29uZmlndXJhdGlvbl9leHBsb3Jlci5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfTlBMQl9NQVhJTVVNX1BMQVlFUl9DT05GSUdVUkFUSU9OX0VYUExPUkVSX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9OUExCX01BWElNVU1fUExBWUVSX0NPTkZJR1VSQVRJT05fRVhQTE9SRVJfSF8KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X3V0aWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfdXRpbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKKwordHlwZWRlZiBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYpPiBQb3NldFNlYXJjaEZ1bmN0b3I7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPFNiUGxheWVyVGVzdENvbmZpZz4gU2JQbGF5ZXJNdWx0aXBsZVBsYXllclRlc3RDb25maWc7CisKKy8vIEV4cG9zZSB0aGUgdHdvIGZ1bmN0aW9ucyBiZWxvdyBmb3IgdGVzdGluZy4KK2Jvb2wgUG9zZXRDb250YWluZWRCeU1heEVsZW1lbnRzU2V0KAorICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6dmVjdG9yPGludD4+JiBtYXhfZWxlbWVudHNfc2V0LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHYpOworc3RkOjpzZXQ8c3RkOjp2ZWN0b3I8aW50Pj4gU2VhcmNoUG9zZXRNYXhpbWFsRWxlbWVudHNERlMoCisgICAgaW50IHJlc291cmNlX3R5cGVzLAorICAgIGludCBtYXhfaW5zdGFuY2VzX3Blcl9yZXNvdXJjZSwKKyAgICBjb25zdCBQb3NldFNlYXJjaEZ1bmN0b3ImIHRlc3RfZnVuY3Rvcik7CisKKy8vIFRoZSBNYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyIGlzIHRvIGdldCB0aGUgbWF4aW11bSBmZWFzaWJsZQorLy8gY29uZmlndXJhdGlvbnMgZm9yIGEgZ3JvdXAgb2YgcGxheWVycyB0aGF0IHRoZSBwbGF0Zm9ybSBjYW4gY3JlYXRlIGFuZCBydW4KKy8vIGNvbmN1cnJlbnRseS4KK2NsYXNzIE1heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXIgeworIHB1YmxpYzoKKyAgLy8gTm90ZSB0aGF0IHdpdGggdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIHRoZSBhdWRpbyBjb25maWcgaXMgaWdub3JlZC4KKyAgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlcigKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNiUGxheWVyVGVzdENvbmZpZz4mIHBsYXllcl9jb25maWdzLAorICAgICAgaW50IG1heF9pbnN0YW5jZXNfcGVyX2NvbmZpZywKKyAgICAgIGludCBtYXhfdG90YWxfaW5zdGFuY2VzLAorICAgICAgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpOworICB+TWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlcigpOworCisgIHN0ZDo6dmVjdG9yPFNiUGxheWVyTXVsdGlwbGVQbGF5ZXJUZXN0Q29uZmlnPiBDYWxjdWxhdGVNYXhUZXN0Q29uZmlncygpOworCisgcHJpdmF0ZToKKyAgc3RydWN0IFBsYXllckluc3RhbmNlIHsKKyAgICBQbGF5ZXJJbnN0YW5jZSgpCisgICAgICAgIDogY29uZmlnKG51bGxwdHIsIG51bGxwdHIsIGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLCAiIikge30KKyAgICBQbGF5ZXJJbnN0YW5jZShTYlBsYXllciBwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZykKKyAgICAgICAgOiBwbGF5ZXIocGxheWVyKSwgZHJtX3N5c3RlbShkcm1fc3lzdGVtKSwgY29uZmlnKGNvbmZpZykge30KKyAgICBTYlBsYXllciBwbGF5ZXIgPSBrU2JQbGF5ZXJJbnZhbGlkOworICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBrU2JEcm1TeXN0ZW1JbnZhbGlkOworICAgIFNiUGxheWVyVGVzdENvbmZpZyBjb25maWc7CisgIH07CisKKyAgLy8gVGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW0gY2FuIHN1cHBvcnQgdGhpcyBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gb2YKKyAgLy8gcGxheWVycyBieSBjcmVhdGluZyBpdC4KKyAgYm9vbCBJc0NvbmZpZ0NyZWF0YWJsZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBjb25maWdzX3RvX2NyZWF0ZSk7CisgIFBsYXllckluc3RhbmNlIENyZWF0ZVBsYXllckluc3RhbmNlKGNvbnN0IFNiUGxheWVyVGVzdENvbmZpZyYgY29uZmlnKTsKKyAgdm9pZCBEZXN0cm95UGxheWVySW5zdGFuY2UoY29uc3QgUGxheWVySW5zdGFuY2UmIGluc3RhbmNlKTsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IHBsYXllcl9jb25maWdzXzsKKyAgY29uc3QgaW50IG1heF9pbnN0YW5jZXNfcGVyX2NvbmZpZ187CisgIGNvbnN0IGludCBtYXhfdG90YWxfaW5zdGFuY2VzXzsKKyAgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFBsYXllckluc3RhbmNlPj4gcGxheWVyX2luc3RhbmNlc187CisKKyAgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlcigKKyAgICAgIGNvbnN0IE1heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXImIG90aGVyKSA9IGRlbGV0ZTsKKyAgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlciYgb3BlcmF0b3I9KAorICAgICAgY29uc3QgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlciYgb3RoZXIpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG5wbGIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfTlBMQl9NQVhJTVVNX1BMQVlFUl9DT05GSUdVUkFUSU9OX0VYUExPUkVSX0hfCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9tYXhpbXVtX3BsYXllcl9jb25maWd1cmF0aW9uX2V4cGxvcmVyX3Rlc3QuY2MgYi9zdGFyYm9hcmQvbnBsYi9tYXhpbXVtX3BsYXllcl9jb25maWd1cmF0aW9uX2V4cGxvcmVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MDRjMwotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXJfdGVzdC5jYwpAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9kcm1faGVscGVycy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgeworCit1c2luZyBzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wUmVhZGVyOwordXNpbmcgOjp0ZXN0aW5nOjpDb21iaW5lOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXNJbjsKKworVEVTVChTZWFyY2hQb3NldE1heGltYWxFbGVtZW50c1Rlc3RzLCBTZWFyY2hQb3NldE1heGltYWxFbGVtZW50c1Rlc3QpIHsKKyAgY29uc3RleHByIGludCBrUmVzb3VyY2VfdHlwZXMgPSAzOworICBjb25zdGV4cHIgaW50IGtNYXhJbnN0YW5jZXMgPSA1OworCisgIHN0ZDo6c2V0PHN0ZDo6dmVjdG9yPGludD4+IHRlc3RfcGF0dGVybl9zZXQgPSB7CisgICAgICB7MSwgNCwgNX0sIHsyLCA1LCAzfSwgezMsIDMsIDR9LCB7MywgNCwgM30sIHs0LCAwLCAzfSwgezUsIDUsIDJ9fTsKKworICBhdXRvIHRlc3RfZnVuY3Rpb24gPSBzdGQ6OmJpbmQoUG9zZXRDb250YWluZWRCeU1heEVsZW1lbnRzU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXR0ZXJuX3NldCwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKTsKKworICBhdXRvIG1heF90ZXN0X2NvbmZpZ19zZXQgPSBTZWFyY2hQb3NldE1heGltYWxFbGVtZW50c0RGUygKKyAgICAgIGtSZXNvdXJjZV90eXBlcywga01heEluc3RhbmNlcywgdGVzdF9mdW5jdGlvbik7CisKKyAgRVhQRUNUX0VRKG1heF90ZXN0X2NvbmZpZ19zZXQsIHRlc3RfcGF0dGVybl9zZXQpOworfQorCitjbGFzcyBNYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPFNiUGxheWVyT3V0cHV0TW9kZSwgY29uc3QgY2hhcio+PiB7CisgcHJvdGVjdGVkOgorICBNYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyVGVzdCgpIHt9CisKKyAgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87Cit9OworCitURVNUX1AoTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlclRlc3QsIFN1bm55RGF5KSB7CisgIGNvbnN0IGludCBrTWF4UGxheWVySW5zdGFuY2VzUGVyQ29uZmlnID0gNTsKKyAgY29uc3QgaW50IGtNYXhUb3RhbFBsYXllckluc3RhbmNlcyA9IDU7CisKKyAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4mIHZpZGVvX3Rlc3RfZmlsZXMgPSBHZXRWaWRlb1Rlc3RGaWxlcygpOworICBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IHN1cHBvcnRlZF9wbGF5ZXJfY29uZmlnczsKKyAgZm9yIChjb25zdCBhdXRvJiB2aWRlb19maWxlbmFtZSA6IHZpZGVvX3Rlc3RfZmlsZXMpIHsKKyAgICBWaWRlb0RtcFJlYWRlciBkbXBfcmVhZGVyKHZpZGVvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EbXBSZWFkZXI6OmtFbmFibGVSZWFkT25EZW1hbmQpOworICAgIFNCX0RDSEVDSyhkbXBfcmVhZGVyLm51bWJlcl9vZl92aWRlb19idWZmZXJzKCkgPiAwKTsKKyAgICBpZiAoU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKGRtcF9yZWFkZXIudmlkZW9fbWltZV90eXBlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zeXN0ZW0pKSB7CisgICAgICBzdXBwb3J0ZWRfcGxheWVyX2NvbmZpZ3MuZW1wbGFjZV9iYWNrKG51bGxwdHIsIHZpZGVvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbW9kZSwga2V5X3N5c3RlbSk7CisgICAgfQorICB9CisKKyAgaWYgKHN1cHBvcnRlZF9wbGF5ZXJfY29uZmlncy5lbXB0eSgpKSB7CisgICAgLy8gVE9ETzogVXNlIEdURVNUX1NLSVAgd2hlbiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiBndGVzdC4KKyAgICBTQl9MT0coSU5GTykgPDwgIk5vIHN1cHBvcnRlZCB2aWRlbyBjb2RlYy4gU2tpcCB0aGUgdGVzdHMuIjsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUaGUgdGVzdCBvbmx5IGVuc3VyZXMgdGhlIGV4cGxvcmVyIGRvZXNuJ3QgY3Jhc2ggYW5kIGNhbiBnZXQgcmVzdWx0LCBidXQKKyAgLy8gd291bGQgbm90IHZlcmlmeSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHJlc3VsdC4KKyAgTWF4aW11bVBsYXllckNvbmZpZ3VyYXRpb25FeHBsb3JlciBleHBsb3JlcigKKyAgICAgIHN1cHBvcnRlZF9wbGF5ZXJfY29uZmlncywga01heFBsYXllckluc3RhbmNlc1BlckNvbmZpZywKKyAgICAgIGtNYXhUb3RhbFBsYXllckluc3RhbmNlcywgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICBleHBsb3Jlci5DYWxjdWxhdGVNYXhUZXN0Q29uZmlncygpOworfQorCitzdGQ6OnN0cmluZyBHZXRUZXN0Q29uZmlnTmFtZSgKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88Ojp0ZXN0aW5nOjp0dXBsZTxTYlBsYXllck91dHB1dE1vZGUsIGNvbnN0IGNoYXIqPj4KKyAgICAgICAgaW5mbykgeworICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPFNiUGxheWVyT3V0cHV0TW9kZSwgY29uc3QgY2hhcio+JiBjb25maWcgPSBpbmZvLnBhcmFtOworCisgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSA9IHN0ZDo6Z2V0PDA+KGNvbmZpZyk7CisgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSBzdGQ6OmdldDwxPihjb25maWcpOworCisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBGb3JtYXRTdHJpbmcoCisgICAgICAib3V0cHV0XyVzX2tleV9zeXN0ZW1fJXMiLAorICAgICAgb3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSA/ICJkZWNvZGVfdG9fdGV4dHVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAicHVuY2hfb3V0IiwKKyAgICAgIHN0cmxlbihrZXlfc3lzdGVtKSA+IDAgPyBrZXlfc3lzdGVtIDogIm51bGwiKTsKKyAgc3RkOjpyZXBsYWNlKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSwgJy4nLCAnXycpOworICBzdGQ6OnJlcGxhY2UobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCAnKCcsICdfJyk7CisgIHN0ZDo6cmVwbGFjZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksICcpJywgJ18nKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXJUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW1QbGF5ZXJDb25maWd1cmF0aW9uRXhwbG9yZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXNJbihHZXRQbGF5ZXJPdXRwdXRNb2RlcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0S2V5U3lzdGVtcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUZXN0Q29uZmlnTmFtZSk7CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG5wbGIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ucGxiL21lZGlhX2J1ZmZlcl90ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvbWVkaWFfYnVmZmVyX3Rlc3QuY2MKaW5kZXggZWQwNTI0MC4uMzZhMTFiZSAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvbWVkaWFfYnVmZmVyX3Rlc3QuY2MKKysrIGIvc3RhcmJvYXJkL25wbGIvbWVkaWFfYnVmZmVyX3Rlc3QuY2MKQEAgLTMzLDEwICszMywxNCBAQAogICAgIHsxOTIwLCAxMDgwfSwKICAgICB7MjU2MCwgMTQ0MH0sCiAgICAgezM4NDAsIDIxNjB9LAorICAgIHs3NjgwLCA0MzIwfSwKIH07CiAKIGNvbnN0ZXhwciBpbnQga0JpdHNQZXJQaXhlbFZhbHVlc1tdID0gewotICAgIGtTYk1lZGlhQml0c1BlclBpeGVsSW52YWxpZCwgOCwgMTAsIDEyLAorICAgIGtTYk1lZGlhQml0c1BlclBpeGVsSW52YWxpZCwKKyAgICA4LAorICAgIDEwLAorICAgIDEyLAogfTsKIAogY29uc3RleHByIFNiTWVkaWFWaWRlb0NvZGVjIGtWaWRlb0NvZGVjc1tdID0gewpAQCAtNDgsMTMgKzUyLDUzIEBACiB9OwogCiBjb25zdGV4cHIgU2JNZWRpYVR5cGUga01lZGlhVHlwZXNbXSA9IHsKLSAgICBrU2JNZWRpYVR5cGVBdWRpbywga1NiTWVkaWFUeXBlVmlkZW8sCisgICAga1NiTWVkaWFUeXBlQXVkaW8sCisgICAga1NiTWVkaWFUeXBlVmlkZW8sCiB9OwogCi0vLyBNaW5pbXVtIGF1ZGlvIGFuZCB2aWRlbyBidWRnZXRzIHJlcXVpcmVkIGJ5IHRoZSAyMDIwIFlvdXR1YmUgU29mdHdhcmUKKy8vIE1pbmltdW0gYXVkaW8gYW5kIHZpZGVvIGJ1ZGdldHMgcmVxdWlyZWQgYnkgdGhlIDIwMjQgWW91dHViZSBIYXJkd2FyZQogLy8gUmVxdWlyZW1lbnRzLgogY29uc3RleHByIGludCBrTWluQXVkaW9CdWRnZXQgPSA1ICogMTAyNCAqIDEwMjQ7Ci1jb25zdGV4cHIgaW50IGtNaW5WaWRlb0J1ZGdldCA9IDMwICogMTAyNCAqIDEwMjQ7Citjb25zdGV4cHIgaW50IGtNaW5WaWRlb0J1ZGdldDEwODBwID0gMzAgKiAxMDI0ICogMTAyNDsKK2NvbnN0ZXhwciBpbnQga01pblZpZGVvQnVkZ2V0NGtTZHIgPSA1MCAqIDEwMjQgKiAxMDI0OworY29uc3RleHByIGludCBrTWluVmlkZW9CdWRnZXQ0a0hkciA9IDgwICogMTAyNCAqIDEwMjQ7Citjb25zdGV4cHIgaW50IGtNaW5WaWRlb0J1ZGdldDhrID0gMjAwICogMTAyNCAqIDEwMjQ7CisKK2ludCBHZXRWaWRlb0J1ZmZlckJ1ZGdldChTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19oZHIpIHsKKyAgaWYgKGNvZGVjICE9IGtTYk1lZGlhVmlkZW9Db2RlY0F2MSAmJiBjb2RlYyAhPSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0ICYmCisgICAgICBjb2RlYyAhPSBrU2JNZWRpYVZpZGVvQ29kZWNWcDkpIHsKKyAgICByZXR1cm4ga01pblZpZGVvQnVkZ2V0MTA4MHA7CisgIH0KKworICBzdGF0aWMgY29uc3QgYm9vbCBrU3VwcG9ydHM4ayA9CisgICAgICBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgICAgICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXYwMS4wLjE2TS4wOFwiOyB3aWR0aD03NjgwOyBoZWlnaHQ9NDMyMCIsICIiKSA9PQorICAgICAga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5OworICBzdGF0aWMgY29uc3QgYm9vbCBrU3VwcG9ydHM0a0hkciA9CisgICAgICBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgICAgICAgICAgInZpZGVvL3dlYm07IGNvZGVjcz1cInZwMDkuMDIuNTEuMTAuMDEuMDkuMTYuMDkuMDBcIjsgd2lkdGg9Mzg0MDsgIgorICAgICAgICAgICJoZWlnaHQ9MjE2MCIsCisgICAgICAgICAgIiIpID09IGtTYk1lZGlhU3VwcG9ydFR5cGVQcm9iYWJseTsKKyAgc3RhdGljIGNvbnN0IGJvb2wga1N1cHBvcnRzNGtTZHIgPQorICAgICAgU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKAorICAgICAgICAgICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDlcIjsgd2lkdGg9Mzg0MDsgaGVpZ2h0PTIxNjAiLCAiIikgPT0KKyAgICAgIGtTYk1lZGlhU3VwcG9ydFR5cGVQcm9iYWJseTsKKworICBpbnQgdmlkZW9fYnVkZ2V0ID0ga01pblZpZGVvQnVkZ2V0MTA4MHA7CisgIGlmIChrU3VwcG9ydHM4ayAmJiBmcmFtZV93aWR0aCA+IDM4NDApIHsKKyAgICB2aWRlb19idWRnZXQgPSBrTWluVmlkZW9CdWRnZXQ4azsKKyAgfSBlbHNlIGlmIChmcmFtZV93aWR0aCA+IDE5MjAgJiYgZnJhbWVfd2lkdGggPD0gMzg0MCkgeworICAgIGlmIChrU3VwcG9ydHM0a0hkciAmJiBpc19oZHIpIHsKKyAgICAgIHZpZGVvX2J1ZGdldCA9IGtNaW5WaWRlb0J1ZGdldDRrSGRyOworICAgIH0gZWxzZSBpZiAoa1N1cHBvcnRzNGtTZHIgJiYgIWlzX2hkcikgeworICAgICAgdmlkZW9fYnVkZ2V0ID0ga01pblZpZGVvQnVkZ2V0NGtTZHI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHZpZGVvX2J1ZGdldDsKK30KIAogc3RkOjp2ZWN0b3I8dm9pZCo+IFRyeVRvQWxsb2NhdGVNZW1vcnkoaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb2NhdGlvbl91bml0LApAQCAtMTIxLDcgKzE2NSw3IEBACiAgICAgLy8gVGhlIHRlc3Qgd2lsbCBiZSBydW4gbW9yZSB0aGFuIG9uY2UsIGl0J3MgcmVkdW5kYW50IGJ1dCBhbGxvd3MgdXMgdG8ga2VlcAogICAgIC8vIHRoZSB0ZXN0IGxvZ2ljIGluIG9uZSBwbGFjZS4KICAgICBpbnQgYWxpZ25tZW50ID0gU2JNZWRpYUdldEJ1ZmZlckFsaWdubWVudCgpOwotI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE0CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE0CiAgICAgaW50IGFsaWdubWVudCA9IFNiTWVkaWFHZXRCdWZmZXJBbGlnbm1lbnQodHlwZSk7CiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE0CiAgICAgRVhQRUNUX0dFKGFsaWdubWVudCwgMSk7CkBAIC0xNTEsNyArMTk1LDcgQEAKICAgICAgIC8vIFRoZSB0ZXN0IHdpbGwgYmUgcnVuIG1vcmUgdGhhbiBvbmNlLCBpdCdzIHJlZHVuZGFudCBidXQgYWxsb3dzIHVzIHRvCiAgICAgICAvLyBrZWVwIHRoZSB0ZXN0IGxvZ2ljIGluIG9uZSBwbGFjZS4KICAgICAgIGludCBhbGlnbm1lbnQgPSBTYk1lZGlhR2V0QnVmZmVyQWxpZ25tZW50KCk7Ci0jZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTQKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTQKICAgICAgIGludCBhbGlnbm1lbnQgPSBTYk1lZGlhR2V0QnVmZmVyQWxpZ25tZW50KHR5cGUpOwogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAxNAogICAgICAgRVhQRUNUX0VRKGFsaWdubWVudCAmIChhbGlnbm1lbnQgLSAxKSwgMCkKQEAgLTE2MSw3ICsyMDUsNyBAQAogICAgICAgfQogICAgICAgaW50IG1lZGlhX2J1ZGdldCA9IHR5cGUgPT0gU2JNZWRpYVR5cGU6OmtTYk1lZGlhVHlwZUF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ga01pbkF1ZGlvQnVkZ2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga01pblZpZGVvQnVkZ2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5WaWRlb0J1ZGdldDEwODBwOwogICAgICAgc3RkOjp2ZWN0b3I8dm9pZCo+IG1lZGlhX2J1ZmZlcl9hbGxvY2F0ZWRfbWVtb3J5ID0KICAgICAgICAgICBUcnlUb0FsbG9jYXRlTWVtb3J5KG1lZGlhX2J1ZGdldCwgYWxsb2NhdGlvbl91bml0LCBhbGlnbm1lbnQpOwogICAgICAgYWxsb2NhdGVkX3B0cnMuaW5zZXJ0KGFsbG9jYXRlZF9wdHJzLmVuZCgpLApAQCAtMjY2LDkgKzMxMCwxMSBAQAogICBmb3IgKGF1dG8gY29kZWMgOiBrVmlkZW9Db2RlY3MpIHsKICAgICBmb3IgKGF1dG8gcmVzb2x1dGlvbiA6IGtWaWRlb1Jlc29sdXRpb25zKSB7CiAgICAgICBmb3IgKGF1dG8gYml0c19wZXJfcGl4ZWwgOiBrQml0c1BlclBpeGVsVmFsdWVzKSB7CisgICAgICAgIGludCB2aWRlb19idWRnZXQgPQorICAgICAgICAgICAgR2V0VmlkZW9CdWZmZXJCdWRnZXQoY29kZWMsIHJlc29sdXRpb25bMF0sIGJpdHNfcGVyX3BpeGVsID4gOCk7CiAgICAgICAgIEVYUEVDVF9HRShTYk1lZGlhR2V0VmlkZW9CdWZmZXJCdWRnZXQoY29kZWMsIHJlc29sdXRpb25bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvblsxXSwgYml0c19wZXJfcGl4ZWwpLAotICAgICAgICAgICAgICAgICAga01pblZpZGVvQnVkZ2V0KTsKKyAgICAgICAgICAgICAgICAgIHZpZGVvX2J1ZGdldCk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9tZWRpYV9jYW5fcGxheV9taW1lX2FuZF9rZXlfc3lzdGVtX3Rlc3QuY2MgYi9zdGFyYm9hcmQvbnBsYi9tZWRpYV9jYW5fcGxheV9taW1lX2FuZF9rZXlfc3lzdGVtX3Rlc3QuY2MKaW5kZXggMGRjN2Y0ZC4uMmE1NTk0ZSAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvbWVkaWFfY2FuX3BsYXlfbWltZV9hbmRfa2V5X3N5c3RlbV90ZXN0LmNjCisrKyBiL3N0YXJib2FyZC9ucGxiL21lZGlhX2Nhbl9wbGF5X21pbWVfYW5kX2tleV9zeXN0ZW1fdGVzdC5jYwpAQCAtNTMsNiArNTMsMjUgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCit0eXBlZGVmIGVudW0gRGV2aWNlVHlwZSB7CisgIGtEZXZpY2VUeXBlRkhELAorICBrRGV2aWNlVHlwZTRrLAorICBrRGV2aWNlVHlwZThrLAorfSBEZXZpY2VUeXBlOworCitEZXZpY2VUeXBlIEdldERldmljZVR5cGUoKSB7CisgIGlmIChTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgICAgICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXYwMS4wLjE2TS4wOFwiOyB3aWR0aD03NjgwOyBoZWlnaHQ9NDMyMCIsICIiKSA9PQorICAgICAga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KSB7CisgICAgcmV0dXJuIGtEZXZpY2VUeXBlOGs7CisgIH0gZWxzZSBpZiAoU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKAorICAgICAgICAgICAgICAgICAidmlkZW8vd2VibTsgY29kZWNzPVwidnA5XCI7IHdpZHRoPTM4NDA7IGhlaWdodD0yMTYwIiwgIiIpID09CisgICAgICAgICAgICAga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KSB7CisgICAgcmV0dXJuIGtEZXZpY2VUeXBlNGs7CisgIH0KKyAgcmV0dXJuIGtEZXZpY2VUeXBlRkhEOworfQorCiBURVNUKFNiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbSwgU3VubnlEYXkpIHsKICAgLy8gVnA5CiAgIFNiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbSgKQEAgLTIyMCw1MyArMjM5LDY2IEBACiB9CiAKIFRFU1QoU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtLCBNaW5pbXVtU3VwcG9ydCkgewotICAvLyBILjI2NCBIaWdoIFByb2ZpbGUgTGV2ZWwgNC4yCi0gIFNiTWVkaWFTdXBwb3J0VHlwZSByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCi0gICAgICAidmlkZW8vbXA0OyBjb2RlY3M9XCJhdmMxLjY0MDAyYVwiOyB3aWR0aD0xOTIwOyBoZWlnaHQ9MTA4MDsgIgotICAgICAgImZyYW1lcmF0ZT0zMDsgYml0cmF0ZT0yMDAwMDAwMCIsCi0gICAgICAiIik7Ci0gIEFTU0VSVF9FUShyZXN1bHQsIGtTYk1lZGlhU3VwcG9ydFR5cGVQcm9iYWJseSk7Ci0KLSAgLy8gSC4yNjQgTWFpbiBQcm9maWxlIExldmVsIDQuMgotICByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwYXJhbXNfZmhkewogICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXZjMS40ZDAwMmFcIjsgd2lkdGg9MTkyMDsgaGVpZ2h0PTEwODA7ICIKLSAgICAgICJmcmFtZXJhdGU9MzA7IiwKLSAgICAgICIiKTsKLSAgQVNTRVJUX0VRKHJlc3VsdCwga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KTsKLQotICByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCi0gICAgICAidmlkZW8vbXA0OyBjb2RlY3M9XCJhdmMxLjRkMDAyYVwiOyB3aWR0aD0wOyBoZWlnaHQ9MDsgIgotICAgICAgImZyYW1lcmF0ZT0wOyBiaXRyYXRlPTAiLAotICAgICAgIiIpOwotICBBU1NFUlRfRVEocmVzdWx0LCBrU2JNZWRpYVN1cHBvcnRUeXBlUHJvYmFibHkpOwotCi0gIHJlc3VsdCA9IFNiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbSgKLSAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNGQwMDJhXCI7IHdpZHRoPS0wOyBoZWlnaHQ9LTA7ICIKLSAgICAgICJmcmFtZXJhdGU9LTA7IGJpdHJhdGU9LTAiLAotICAgICAgIiIpOwotICBBU1NFUlRfRVEocmVzdWx0LCBrU2JNZWRpYVN1cHBvcnRUeXBlUHJvYmFibHkpOwotCi0gIC8vIEguMjY0IE1haW4gUHJvZmlsZSBMZXZlbCAyLjEKLSAgcmVzdWx0ID0gU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKAotICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXZjMS40ZDAwMTVcIjsgd2lkdGg9NDMyOyBoZWlnaHQ9MjQwOyAiCi0gICAgICAiZnJhbWVyYXRlPTE1OyIsCi0gICAgICAiIik7Ci0gIEFTU0VSVF9FUShyZXN1bHQsIGtTYk1lZGlhU3VwcG9ydFR5cGVQcm9iYWJseSk7Ci0KLSAgLy8gQVYxIE1haW4gUHJvZmlsZSAxMDgwcAotICByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNjQwMDJhXCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDlcIjsgd2lkdGg9MTkyMDsgaGVpZ2h0PTEwODA7IGZyYW1lcmF0ZT0zMCIsCisgICAgICAidmlkZW8vd2VibTsgY29kZWNzPVwidnAwOS4wMi40MS4xMC4wMS4wOS4xNi4wOS4wMFwiOyB3aWR0aD0xOTIwOyAiCisgICAgICAiaGVpZ2h0PTEwODA7IGZyYW1lcmF0ZT0zMCIsCiAgICAgICAidmlkZW8vbXA0OyBjb2RlY3M9XCJhdjAxLjAuMDlNLjA4XCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAiCi0gICAgICAiZnJhbWVyYXRlPTMwOyBiaXRyYXRlPTIwMDAwMDAwIiwKLSAgICAgICIiKTsKKyAgICAgICJmcmFtZXJhdGU9MzAiLAorICB9OwogCi0gIC8vIFZQOSAxMDgwcAotICByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCi0gICAgICAidmlkZW8vd2VibTsgY29kZWNzPVwidnA5XCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyBmcmFtZXJhdGU9NjA7ICIKLSAgICAgICJiaXRyYXRlPTIwMDAwMDAwIiwKLSAgICAgICIiKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBhcmFtc180a3sKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNGQwMDJhXCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNjQwMDJhXCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDlcIjsgd2lkdGg9Mzg0MDsgaGVpZ2h0PTIxNjA7IGZyYW1lcmF0ZT0zMCIsCisgICAgICAidmlkZW8vd2VibTsgY29kZWNzPVwidnAwOS4wMi41MS4xMC4wMS4wOS4xNi4wOS4wMFwiOyB3aWR0aD0zODQwOyAiCisgICAgICAiaGVpZ2h0PTIxNjA7IGZyYW1lcmF0ZT0zMCIsCisgICAgICAidmlkZW8vbXA0OyBjb2RlY3M9XCJhdjAxLjAuMTJNLjA4XCI7IHdpZHRoPTM4NDA7IGhlaWdodD0yMTYwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2MDEuMC4xM00uMTAuMC4xMTAuMDkuMTYuMDkuMFwiOyB3aWR0aD0zODQwOyAiCisgICAgICAiaGVpZ2h0PTIxNjA7IGZyYW1lcmF0ZT0zMCIsCisgIH07CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBhcmFtc184a3sKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNGQwMDJhXCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNjQwMDJhXCI7IHdpZHRoPTE5MjA7IGhlaWdodD0xMDgwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDlcIjsgd2lkdGg9Mzg0MDsgaGVpZ2h0PTIxNjA7IGZyYW1lcmF0ZT02MCIsCisgICAgICAidmlkZW8vd2VibTsgY29kZWNzPVwidnAwOS4wMi41MS4xMC4wMS4wOS4xNi4wOS4wMFwiOyB3aWR0aD0zODQwOyAiCisgICAgICAiaGVpZ2h0PTIxNjA7IGZyYW1lcmF0ZT02MCIsCisgICAgICAidmlkZW8vbXA0OyBjb2RlY3M9XCJhdjAxLjAuMTZNLjA4XCI7IHdpZHRoPTc2ODA7IGhlaWdodD00MzIwOyAiCisgICAgICAiZnJhbWVyYXRlPTMwIiwKKyAgICAgICJ2aWRlby9tcDQ7IGNvZGVjcz1cImF2MDEuMC4xN00uMTAuMC4xMTAuMDkuMTYuMDkuMFwiOyB3aWR0aD03NjgwOyAiCisgICAgICAiaGVpZ2h0PTQzMjA7IGZyYW1lcmF0ZT0zMCIsCisgIH07CisKKyAgRGV2aWNlVHlwZSBkZXZpY2VfdHlwZSA9IEdldERldmljZVR5cGUoKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1pbWVfcGFyYW1zOworICBzd2l0Y2ggKGRldmljZV90eXBlKSB7CisgICAgY2FzZSBrRGV2aWNlVHlwZThrOgorICAgICAgbWltZV9wYXJhbXMgPSBwYXJhbXNfOGs7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtEZXZpY2VUeXBlNGs6CisgICAgICBtaW1lX3BhcmFtcyA9IHBhcmFtc180azsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtaW1lX3BhcmFtcyA9IHBhcmFtc19maGQ7CisgIH0KKworICBmb3IgKGF1dG8mIHBhcmFtIDogbWltZV9wYXJhbXMpIHsKKyAgICBTYk1lZGlhU3VwcG9ydFR5cGUgc3VwcG9ydCA9IFNiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbShwYXJhbSwgIiIpOworICAgIEVYUEVDVF9UUlVFKHN1cHBvcnQgPT0ga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KTsKKyAgfQogCiAgIC8vIEFBQy1MQwotICByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgIFNiTWVkaWFTdXBwb3J0VHlwZSByZXN1bHQgPSBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCiAgICAgICAiYXVkaW8vbXA0OyBjb2RlY3M9XCJtcDRhLjQwLjJcIjsgY2hhbm5lbHM9MjsgYml0cmF0ZT0yNTYwMDA7IiwgIiIpOwogICBBU1NFUlRfRVEocmVzdWx0LCBrU2JNZWRpYVN1cHBvcnRUeXBlUHJvYmFibHkpOwogCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9tZWRpYV9zZXRfYXVkaW9fd3JpdGVfZHVyYXRpb25fdGVzdC5jYyBiL3N0YXJib2FyZC9ucGxiL21lZGlhX3NldF9hdWRpb193cml0ZV9kdXJhdGlvbl90ZXN0LmNjCmluZGV4IGFmODlmNTYuLjU3M2RkMzUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ucGxiL21lZGlhX3NldF9hdWRpb193cml0ZV9kdXJhdGlvbl90ZXN0LmNjCisrKyBiL3N0YXJib2FyZC9ucGxiL21lZGlhX3NldF9hdWRpb193cml0ZV9kdXJhdGlvbl90ZXN0LmNjCkBAIC0yNiwxMyArMjYsMTEgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgMTUKLQogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgbnBsYiB7CiBuYW1lc3BhY2UgewogCi11c2luZyA6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OnZpZGVvX2RtcDo6VmlkZW9EbXBSZWFkZXI7Cit1c2luZyBzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wUmVhZGVyOwogdXNpbmcgOjpzdGFyYm9hcmQ6OnRlc3Rpbmc6OkZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlcjsKIHVzaW5nIDo6dGVzdGluZzo6VmFsdWVzSW47CiAKQEAgLTQyLDggKzQwLDcgQEAKIGNsYXNzIFNiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb25UZXN0CiAgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7CiAgcHVibGljOgotICBTYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uVGVzdCgpCi0gICAgICA6IGRtcF9yZWFkZXJfKFJlc29sdmVUZXN0RmlsZU5hbWUoR2V0UGFyYW0oKSkuY19zdHIoKSkge30KKyAgU2JNZWRpYVNldEF1ZGlvV3JpdGVEdXJhdGlvblRlc3QoKSA6IGRtcF9yZWFkZXJfKEdldFBhcmFtKCkpIHt9CiAKICAgdm9pZCBUcnlUb1dyaXRlUGVuZGluZ1NhbXBsZSgpIHsKICAgICB7CkBAIC03OSwxMSArNzYsMTEgQEAKICAgICAgIHBlbmRpbmdfZGVjb2Rlcl9zdGF0dXNfID0gbnVsbG9wdDsKICAgICB9CiAKLSAgICBDYWxsU2JQbGF5ZXJXcml0ZVNhbXBsZXMocGxheWVyLCBrU2JNZWRpYVR5cGVBdWRpbywgZG1wX3JlYWRlcl8uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4XywgMSk7CisgICAgQ2FsbFNiUGxheWVyV3JpdGVTYW1wbGVzKHBsYXllciwga1NiTWVkaWFUeXBlQXVkaW8sICZkbXBfcmVhZGVyXywgaW5kZXhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBsYXN0X2lucHV0X3RpbWVzdGFtcF8gPQorICAgICAgICBkbXBfcmVhZGVyXy5HZXRQbGF5ZXJTYW1wbGVJbmZvKGtTYk1lZGlhVHlwZUF1ZGlvLCBpbmRleF8pLnRpbWVzdGFtcDsKICAgICArK2luZGV4XzsKLQotICAgIGxhc3RfaW5wdXRfdGltZXN0YW1wXyA9IHBsYXllcl9zYW1wbGVfaW5mby50aW1lc3RhbXA7CiAgIH0KIAogICB2b2lkIFBsYXllclN0YXR1cyhTYlBsYXllciBwbGF5ZXIsIFNiUGxheWVyU3RhdGUgc3RhdGUsIGludCB0aWNrZXQpIHsKQEAgLTEwMywyNyArMTAwLDMwIEBACiAgIH0KIAogICBTYlBsYXllciBDcmVhdGVQbGF5ZXIoKSB7Ci0gICAgU2JNZWRpYUF1ZGlvU2FtcGxlSW5mbyBhdWRpb19zYW1wbGVfaW5mbyA9IGRtcF9yZWFkZXJfLmF1ZGlvX3NhbXBsZV9pbmZvKCk7Ci0gICAgU2JNZWRpYUF1ZGlvQ29kZWMga0F1ZGlvQ29kZWMgPSBkbXBfcmVhZGVyXy5hdWRpb19jb2RlYygpOwotICAgIFNiRHJtU3lzdGVtIGtEcm1TeXN0ZW0gPSBrU2JEcm1TeXN0ZW1JbnZhbGlkOworICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjID0gZG1wX3JlYWRlcl8uYXVkaW9fY29kZWMoKTsKKworICAgIFBsYXllckNyZWF0aW9uUGFyYW0gY3JlYXRpb25fcGFyYW0gPSBDcmVhdGVQbGF5ZXJDcmVhdGlvblBhcmFtKAorICAgICAgICBhdWRpb19jb2RlYywga1NiTWVkaWFWaWRlb0NvZGVjTm9uZSwga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQpOworCisgICAgU2JQbGF5ZXJDcmVhdGlvblBhcmFtIHBhcmFtID0ge307CisgICAgY3JlYXRpb25fcGFyYW0uQ29udmVydFRvKCZwYXJhbSk7CisKKyAgICBjcmVhdGlvbl9wYXJhbS5vdXRwdXRfbW9kZSA9IFNiUGxheWVyR2V0UHJlZmVycmVkT3V0cHV0TW9kZSgmcGFyYW0pOworICAgIEVYUEVDVF9ORShjcmVhdGlvbl9wYXJhbS5vdXRwdXRfbW9kZSwga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQpOworCisgICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAorICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCBrU2JNZWRpYVZpZGVvQ29kZWNOb25lLAorICAgICAgICBhdWRpb19jb2RlYywga1NiRHJtU3lzdGVtSW52YWxpZCwgJmRtcF9yZWFkZXJfLmF1ZGlvX3N0cmVhbV9pbmZvKCksICIiLAorICAgICAgICBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLCBEZWNvZGVyU3RhdHVzRnVuYywgUGxheWVyU3RhdHVzRnVuYywKKyAgICAgICAgRHVtbXlFcnJvckZ1bmMsIHRoaXMgLyogY29udGV4dCAqLywgY3JlYXRpb25fcGFyYW0ub3V0cHV0X21vZGUsCisgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8uZGVjb2Rlcl90YXJnZXRfcHJvdmlkZXIoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CiAKICAgICBsYXN0X2lucHV0X3RpbWVzdGFtcF8gPQogICAgICAgICBkbXBfcmVhZGVyXy5HZXRQbGF5ZXJTYW1wbGVJbmZvKGtTYk1lZGlhVHlwZUF1ZGlvLCAwKS50aW1lc3RhbXA7CiAgICAgZmlyc3RfaW5wdXRfdGltZXN0YW1wXyA9IGxhc3RfaW5wdXRfdGltZXN0YW1wXzsKIAotICAgIFNiUGxheWVyQ3JlYXRpb25QYXJhbSBjcmVhdGlvbl9wYXJhbSA9IENyZWF0ZVBsYXllckNyZWF0aW9uUGFyYW0oCi0gICAgICAgIGF1ZGlvX3NhbXBsZV9pbmZvLmNvZGVjLCBrU2JNZWRpYVZpZGVvQ29kZWNOb25lLAotICAgICAgICBTYlBsYXllckdldFByZWZlcnJlZE91dHB1dE1vZGUoJmNyZWF0aW9uX3BhcmFtKSk7Ci0gICAgY3JlYXRpb25fcGFyYW0uYXVkaW9fc2FtcGxlX2luZm8gPSBhdWRpb19zYW1wbGVfaW5mbzsKLSAgICBFWFBFQ1RfTkUoY3JlYXRpb25fcGFyYW0ub3V0cHV0X21vZGUsIGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkKTsKLQotICAgIFNiUGxheWVyIHBsYXllciA9IFNiUGxheWVyQ3JlYXRlKAotICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCAmY3JlYXRpb25fcGFyYW0sCi0gICAgICAgIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsIERlY29kZXJTdGF0dXNGdW5jLCBQbGF5ZXJTdGF0dXNGdW5jLAotICAgICAgICBEdW1teUVycm9yRnVuYywgdGhpcyAvKiBjb250ZXh0ICovLAotICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwotCi0gICAgRVhQRUNUX1RSVUUoU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOwogICAgIHJldHVybiBwbGF5ZXI7CiAgIH0KIApAQCAtMTgzLDcgKzE4Myw5IEBACiAgIEFTU0VSVF9ORShkbXBfcmVhZGVyXy5hdWRpb19jb2RlYygpLCBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lKTsKICAgQVNTRVJUX0dUKGRtcF9yZWFkZXJfLm51bWJlcl9vZl9hdWRpb19idWZmZXJzKCksIDApOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCAxNQogICBTYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uKGtEdXJhdGlvbik7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgMTUKIAogICBTYlBsYXllciBwbGF5ZXIgPSBDcmVhdGVQbGF5ZXIoKTsKICAgV2FpdEZvclBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQpOwpAQCAtMjI0LDcgKzIyNiw5IEBACiAgIEFTU0VSVF9ORShkbXBfcmVhZGVyXy5hdWRpb19jb2RlYygpLCBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lKTsKICAgQVNTRVJUX0dUKGRtcF9yZWFkZXJfLm51bWJlcl9vZl9hdWRpb19idWZmZXJzKCksIDApOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCAxNQogICBTYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uKGtEdXJhdGlvbik7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgMTUKIAogICAvLyBUaGlzIGRpcmVjdGx5IGltcGFjdHMgdGhlIHJ1bnRpbWUgb2YgdGhlIHRlc3QuCiAgIHRvdGFsX2R1cmF0aW9uXyA9IDE1ICoga1NiVGltZVNlY29uZDsKQEAgLTI3NywxNiArMjgxLDE0IEBACiAgIH0KIAogICBmb3IgKGF1dG8gZmlsZW5hbWUgOiBrRmlsZW5hbWVzKSB7Ci0gICAgVmlkZW9EbXBSZWFkZXIgZG1wX3JlYWRlcihSZXNvbHZlVGVzdEZpbGVOYW1lKGZpbGVuYW1lKS5jX3N0cigpKTsKKyAgICBWaWRlb0RtcFJlYWRlciBkbXBfcmVhZGVyKGZpbGVuYW1lLCBWaWRlb0RtcFJlYWRlcjo6a0VuYWJsZVJlYWRPbkRlbWFuZCk7CiAgICAgU0JfRENIRUNLKGRtcF9yZWFkZXIubnVtYmVyX29mX2F1ZGlvX2J1ZmZlcnMoKSA+IDApOwotCi0gICAgY29uc3QgU2JNZWRpYUF1ZGlvU2FtcGxlSW5mbyogYXVkaW9fc2FtcGxlX2luZm8gPQotICAgICAgICAmZG1wX3JlYWRlci5hdWRpb19zYW1wbGVfaW5mbygpOwotICAgIGlmIChTYk1lZGlhSXNBdWRpb1N1cHBvcnRlZChkbXBfcmVhZGVyLmF1ZGlvX2NvZGVjKCksIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtcF9yZWFkZXIuYXVkaW9fYml0cmF0ZSgpKSkgeworICAgIGlmIChTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oZG1wX3JlYWRlci5hdWRpb19taW1lX3R5cGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpKSB7CiAgICAgICB0ZXN0X3BhcmFtcy5wdXNoX2JhY2soZmlsZW5hbWUpOwogICAgIH0KICAgfQorCiAgIFNCX0RDSEVDSyghdGVzdF9wYXJhbXMuZW1wdHkoKSk7CiAgIHJldHVybiB0ZXN0X3BhcmFtczsKIH0KQEAgLTI5Nyw1ICsyOTksMyBAQAogfSAgLy8gbmFtZXNwYWNlCiB9ICAvLyBuYW1lc3BhY2UgbnBsYgogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgMTUKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ucGxiL211bHRpcGxlX3BsYXllcl90ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvbXVsdGlwbGVfcGxheWVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjOGEwNAotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9ucGxiL211bHRpcGxlX3BsYXllcl90ZXN0LmNjCkBAIC0wLDAgKzEsMjM2IEBACisvLyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc3RyaW5nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvbWF4aW11bV9wbGF5ZXJfY29uZmlndXJhdGlvbl9leHBsb3Jlci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X2ZpeHR1cmUuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvdGhyZWFkX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgeworCit1c2luZyBzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wUmVhZGVyOwordXNpbmcgOjpzdGFyYm9hcmQ6OnRlc3Rpbmc6OkZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlcjsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzSW47CisKK3R5cGVkZWYgU2JQbGF5ZXJUZXN0Rml4dHVyZTo6R3JvdXBlZFNhbXBsZXMgR3JvdXBlZFNhbXBsZXM7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBTYlBsYXllclRlc3RDb25maWcmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKik+CisgICAgTXVsdGlwbGVQbGF5ZXJUZXN0RnVuY3RvcjsKKworY2xhc3MgUGxheWVyVGhyZWFkIDogcHVibGljIEFic3RyYWN0VGVzdFRocmVhZCB7CisgcHVibGljOgorICBleHBsaWNpdCBQbGF5ZXJUaHJlYWQoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKCk+JiBmdW5jdG9yKQorICAgICAgOiBmdW5jdG9yXyhmdW5jdG9yKSB7fQorCisgIHZvaWQgUnVuKCkgb3ZlcnJpZGUgeyBmdW5jdG9yXygpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZnVuY3Rvcl87Cit9OworCitjbGFzcyBNdWx0aXBsZVBsYXllclRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2JQbGF5ZXJNdWx0aXBsZVBsYXllclRlc3RDb25maWc+IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgUnVuVGVzdChjb25zdCBNdWx0aXBsZVBsYXllclRlc3RGdW5jdG9yJiBmdW5jdG9yKTsKKyAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87Cit9OworCit2b2lkIE11bHRpcGxlUGxheWVyVGVzdDo6UnVuVGVzdChjb25zdCBNdWx0aXBsZVBsYXllclRlc3RGdW5jdG9yJiBmdW5jdG9yKSB7CisgIGNvbnN0IFNiUGxheWVyTXVsdGlwbGVQbGF5ZXJUZXN0Q29uZmlnJiBtdWx0aXBsYXllcl90ZXN0X2NvbmZpZyA9IEdldFBhcmFtKCk7CisgIHN0ZDo6bGlzdDxQbGF5ZXJUaHJlYWQ+IHBsYXllcl90aHJlYWRzOworICBmb3IgKGNvbnN0IFNiUGxheWVyVGVzdENvbmZpZyYgcGxheWVyX2NvbmZpZyA6IG11bHRpcGxheWVyX3Rlc3RfY29uZmlnKSB7CisgICAgcGxheWVyX3RocmVhZHMuZW1wbGFjZV9iYWNrKAorICAgICAgICBzdGQ6OmJpbmQoZnVuY3RvciwgcGxheWVyX2NvbmZpZywgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pKTsKKyAgfQorICBmb3IgKGF1dG8mIHBsYXllcl90aHJlYWQgOiBwbGF5ZXJfdGhyZWFkcykgeworICAgIHBsYXllcl90aHJlYWQuU3RhcnQoKTsKKyAgfQorICBmb3IgKGF1dG8mIHBsYXllcl90aHJlYWQgOiBwbGF5ZXJfdGhyZWFkcykgeworICAgIHBsYXllcl90aHJlYWQuSm9pbigpOworICB9Cit9CisKK3ZvaWQgTm9JbnB1dChjb25zdCBTYlBsYXllclRlc3RDb25maWcmIHBsYXllcl9jb25maWcsCisgICAgICAgICAgICAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpIHsKKyAgU2JQbGF5ZXJUZXN0Rml4dHVyZSBwbGF5ZXJfZml4dHVyZShwbGF5ZXJfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcik7CisgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgR3JvdXBlZFNhbXBsZXMgc2FtcGxlczsKKyAgaWYgKHBsYXllcl9maXh0dXJlLkhhc0F1ZGlvKCkpIHsKKyAgICBzYW1wbGVzLkFkZEF1ZGlvRU9TKCk7CisgIH0KKyAgaWYgKHBsYXllcl9maXh0dXJlLkhhc1ZpZGVvKCkpIHsKKyAgICBzYW1wbGVzLkFkZFZpZGVvRU9TKCk7CisgIH0KKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV3JpdGUoc2FtcGxlcykpOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5XYWl0Rm9yUGxheWVyRW5kT2ZTdHJlYW0oKSk7Cit9CisKK1RFU1RfUChNdWx0aXBsZVBsYXllclRlc3QsIE5vSW5wdXQpIHsKKyAgUnVuVGVzdChOb0lucHV0KTsKK30KKwordm9pZCBXcml0ZVNhbXBsZXMoY29uc3QgU2JQbGF5ZXJUZXN0Q29uZmlnJiBwbGF5ZXJfY29uZmlnLAorICAgICAgICAgICAgICAgICAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpIHsKKyAgU2JQbGF5ZXJUZXN0Rml4dHVyZSBwbGF5ZXJfZml4dHVyZShwbGF5ZXJfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcik7CisgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgU2JUaW1lIGtEdXJhdGlvblRvUGxheSA9IGtTYlRpbWVNaWxsaXNlY29uZCAqIDIwMDsKKworICBHcm91cGVkU2FtcGxlcyBzYW1wbGVzOworICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgeworICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKAorICAgICAgICAwLCBwbGF5ZXJfZml4dHVyZS5Db252ZXJ0RHVyYXRpb25Ub0F1ZGlvQnVmZmVyQ291bnQoa0R1cmF0aW9uVG9QbGF5KSk7CisgICAgc2FtcGxlcy5BZGRBdWRpb0VPUygpOworICB9CisgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNWaWRlbygpKSB7CisgICAgc2FtcGxlcy5BZGRWaWRlb1NhbXBsZXMoCisgICAgICAgIDAsIHBsYXllcl9maXh0dXJlLkNvbnZlcnREdXJhdGlvblRvVmlkZW9CdWZmZXJDb3VudChrRHVyYXRpb25Ub1BsYXkpKTsKKyAgICBzYW1wbGVzLkFkZFZpZGVvRU9TKCk7CisgIH0KKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJFbmRPZlN0cmVhbSgpKTsKK30KKworVEVTVF9QKE11bHRpcGxlUGxheWVyVGVzdCwgV3JpdGVTYW1wbGVzKSB7CisgIFJ1blRlc3QoV3JpdGVTYW1wbGVzKTsKK30KKworc3RkOjpzdHJpbmcgR2V0TXVsdGlwbGVTYlBsYXllclRlc3RDb25maWdOYW1lKAorICAgIDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxTYlBsYXllck11bHRpcGxlUGxheWVyVGVzdENvbmZpZz4gaW5mbykgeworICBjb25zdCBTYlBsYXllck11bHRpcGxlUGxheWVyVGVzdENvbmZpZyYgbXVsdGlwbGF5ZXJfdGVzdF9jb25maWcgPSBpbmZvLnBhcmFtOworCisgIFNCX0RDSEVDSyhtdWx0aXBsYXllcl90ZXN0X2NvbmZpZy5zaXplKCkgPiAwKTsKKyAgY29uc3QgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlID0gbXVsdGlwbGF5ZXJfdGVzdF9jb25maWdbMF0ub3V0cHV0X21vZGU7CisgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSBtdWx0aXBsYXllcl90ZXN0X2NvbmZpZ1swXS5rZXlfc3lzdGVtOworCisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbXVsdGlwbGF5ZXJfdGVzdF9jb25maWcuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZyA9IG11bHRpcGxheWVyX3Rlc3RfY29uZmlnW2ldOworICAgIGNvbnN0IGNoYXIqIGF1ZGlvX2ZpbGVuYW1lID0gY29uZmlnLmF1ZGlvX2ZpbGVuYW1lOworICAgIGNvbnN0IGNoYXIqIHZpZGVvX2ZpbGVuYW1lID0gY29uZmlnLnZpZGVvX2ZpbGVuYW1lOworCisgICAgaWYgKGkgPiAwKSB7CisgICAgICBuYW1lICs9ICJfIjsKKyAgICB9CisgICAgbmFtZSArPSBGb3JtYXRTdHJpbmcoCisgICAgICAgICJhdWRpbyVkXyVzX3ZpZGVvJWRfJXMiLCBpLAorICAgICAgICBhdWRpb19maWxlbmFtZSAmJiBzdHJsZW4oYXVkaW9fZmlsZW5hbWUpID4gMCA/IGF1ZGlvX2ZpbGVuYW1lIDogIm51bGwiLAorICAgICAgICBpLAorICAgICAgICB2aWRlb19maWxlbmFtZSAmJiBzdHJsZW4odmlkZW9fZmlsZW5hbWUpID4gMCA/IHZpZGVvX2ZpbGVuYW1lIDogIm51bGwiKTsKKyAgfQorCisgIG5hbWUgKz0gRm9ybWF0U3RyaW5nKCJfb3V0cHV0XyVzX2tleV9zeXN0ZW1fJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbW9kZSA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJkZWNvZGVfdG9fdGV4dHVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInB1bmNoX291dCIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihrZXlfc3lzdGVtKSA+IDAgPyBrZXlfc3lzdGVtIDogIm51bGwiKTsKKyAgc3RkOjpyZXBsYWNlKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSwgJy4nLCAnXycpOworICBzdGQ6OnJlcGxhY2UobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCAnKCcsICdfJyk7CisgIHN0ZDo6cmVwbGFjZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksICcpJywgJ18nKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6dmVjdG9yPFNiUGxheWVyTXVsdGlwbGVQbGF5ZXJUZXN0Q29uZmlnPiBHZXRNdWx0aXBsZVBsYXllclRlc3RDb25maWdzKCkgeworICBjb25zdCBpbnQga01heFBsYXllckluc3RhbmNlc1BlckNvbmZpZyA9IDM7CisgIGNvbnN0IGludCBrTWF4VG90YWxQbGF5ZXJJbnN0YW5jZXMgPSA1OworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiYgYXVkaW9fdGVzdF9maWxlcyA9IEdldEF1ZGlvVGVzdEZpbGVzKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiYgdmlkZW9fdGVzdF9maWxlcyA9IEdldFZpZGVvVGVzdEZpbGVzKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFNiUGxheWVyT3V0cHV0TW9kZT4mIG91dHB1dF9tb2RlcyA9IEdldFBsYXllck91dHB1dE1vZGVzKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiYga2V5X3N5c3RlbXMgPSBHZXRLZXlTeXN0ZW1zKCk7CisKKyAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcjsKKyAgc3RkOjp2ZWN0b3I8U2JQbGF5ZXJNdWx0aXBsZVBsYXllclRlc3RDb25maWc+IGNvbmZpZ3NfdG9fcmV0dXJuOworCisgIGZvciAoYXV0byBrZXlfc3lzdGVtIDoga2V5X3N5c3RlbXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IHN1cHBvcnRlZF9jb25maWdzOworICAgIGZvciAoYXV0byB2aWRlb19maWxlbmFtZSA6IHZpZGVvX3Rlc3RfZmlsZXMpIHsKKyAgICAgIFZpZGVvRG1wUmVhZGVyIGRtcF9yZWFkZXIodmlkZW9fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRG1wUmVhZGVyOjprRW5hYmxlUmVhZE9uRGVtYW5kKTsKKyAgICAgIFNCX0RDSEVDSyhkbXBfcmVhZGVyLm51bWJlcl9vZl92aWRlb19idWZmZXJzKCkgPiAwKTsKKyAgICAgIGlmIChTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oZG1wX3JlYWRlci52aWRlb19taW1lX3R5cGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfc3lzdGVtKSkgeworICAgICAgICBzdXBwb3J0ZWRfY29uZmlncy5wdXNoX2JhY2soCisgICAgICAgICAgICB7bnVsbHB0ciwgdmlkZW9fZmlsZW5hbWUsIGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLCBrZXlfc3lzdGVtfSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN1cHBvcnRlZF9jb25maWdzLmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBzdXBwb3J0ZWRfYXVkaW9fZmlsZXM7CisgICAgZm9yIChhdXRvIGF1ZGlvX2ZpbGVuYW1lIDogYXVkaW9fdGVzdF9maWxlcykgeworICAgICAgVmlkZW9EbXBSZWFkZXIgZG1wX3JlYWRlcihhdWRpb19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EbXBSZWFkZXI6OmtFbmFibGVSZWFkT25EZW1hbmQpOworICAgICAgU0JfRENIRUNLKGRtcF9yZWFkZXIubnVtYmVyX29mX2F1ZGlvX2J1ZmZlcnMoKSA+IDApOworICAgICAgaWYgKFNiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbShkbXBfcmVhZGVyLmF1ZGlvX21pbWVfdHlwZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zeXN0ZW0pKSB7CisgICAgICAgIHN1cHBvcnRlZF9hdWRpb19maWxlcy5wdXNoX2JhY2soYXVkaW9fZmlsZW5hbWUpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IHVzZSBTYlBsYXllckdldFByZWZlcnJlZE91dHB1dE1vZGUoKSB0byBjaG9vc2Ugb3V0cHV0IG1vZGUuCisgICAgZm9yIChhdXRvIG91dHB1dF9tb2RlIDogb3V0cHV0X21vZGVzKSB7CisgICAgICBmb3IgKGF1dG8mIGNvbmZpZyA6IHN1cHBvcnRlZF9jb25maWdzKSB7CisgICAgICAgIGNvbmZpZy5vdXRwdXRfbW9kZSA9IG91dHB1dF9tb2RlOworICAgICAgfQorCisgICAgICBNYXhpbXVtUGxheWVyQ29uZmlndXJhdGlvbkV4cGxvcmVyIGV4cGxvcmVyKAorICAgICAgICAgIHN1cHBvcnRlZF9jb25maWdzLCBrTWF4UGxheWVySW5zdGFuY2VzUGVyQ29uZmlnLAorICAgICAgICAgIGtNYXhUb3RhbFBsYXllckluc3RhbmNlcywgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcik7CisgICAgICBzdGQ6OnZlY3RvcjxTYlBsYXllck11bHRpcGxlUGxheWVyVGVzdENvbmZpZz4gZXhwbG9yZXJfb3V0cHV0ID0KKyAgICAgICAgICBleHBsb3Jlci5DYWxjdWxhdGVNYXhUZXN0Q29uZmlncygpOworCisgICAgICAvLyBBZGQgYXVkaW8gY29kZWMgdG8gY29uZmlncyB1c2luZyByb3VuZCByb2JpbiBhbGdvcml0aG0uCisgICAgICBmb3IgKGF1dG8mIG11bHRpX3BsYXllcl90ZXN0X2NvbmZpZyA6IGV4cGxvcmVyX291dHB1dCkgeworICAgICAgICBpbnQgYXVkaW9fZmlsZV9pbmRleCA9IDA7CisgICAgICAgIGZvciAoYXV0byYgY29uZmlnIDogbXVsdGlfcGxheWVyX3Rlc3RfY29uZmlnKSB7CisgICAgICAgICAgY29uZmlnLmF1ZGlvX2ZpbGVuYW1lID0gc3VwcG9ydGVkX2F1ZGlvX2ZpbGVzW2F1ZGlvX2ZpbGVfaW5kZXhdOworICAgICAgICAgIGF1ZGlvX2ZpbGVfaW5kZXggPQorICAgICAgICAgICAgICAoYXVkaW9fZmlsZV9pbmRleCArIDEpICUgc3VwcG9ydGVkX2F1ZGlvX2ZpbGVzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25maWdzX3RvX3JldHVybi5pbnNlcnQoY29uZmlnc190b19yZXR1cm4uZW5kKCksIGV4cGxvcmVyX291dHB1dC5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvcmVyX291dHB1dC5lbmQoKSk7CisgICAgfQorICB9CisgIHJldHVybiBjb25maWdzX3RvX3JldHVybjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXVsdGlwbGVQbGF5ZXJUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlUGxheWVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldE11bHRpcGxlUGxheWVyVGVzdENvbmZpZ3MoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRNdWx0aXBsZVNiUGxheWVyVGVzdENvbmZpZ05hbWUpOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBucGxiCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9ucGxiX2V2ZXJncmVlbl9jb21wYXRfdGVzdHMvQlVJTEQuZ24gYi9zdGFyYm9hcmQvbnBsYi9ucGxiX2V2ZXJncmVlbl9jb21wYXRfdGVzdHMvQlVJTEQuZ24KaW5kZXggYTgwNDgyYi4uNjk3ODA5OCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvbnBsYl9ldmVyZ3JlZW5fY29tcGF0X3Rlc3RzL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9ucGxiL25wbGJfZXZlcmdyZWVuX2NvbXBhdF90ZXN0cy9CVUlMRC5nbgpAQCAtMjksNiArMjksNyBAQAogICBwdWJsaWNfZGVwcyA9IFsKICAgICAiLy9zdGFyYm9hcmQiLAogICAgICIvL3Rlc3RpbmcvZ21vY2siLAorICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAogICBdCiAKICAgZGF0YV9kZXBzID0gWwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV90ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV90ZXN0LmNjCmluZGV4IGM5NjRiZGMuLjkyNzEzNTQgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYworKysgYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MKQEAgLTEyLDE0ICsxMiwyMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9jb25kaXRpb25fdmFyaWFibGUuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL21lZGlhLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9tdXRleC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vb3B0aW9uYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGlvbl9wYXJhbV9oZWxwZXJzLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfdXRpbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTI5LDEyICszNSwxNiBAQAogdXNpbmcgOjpzdGFyYm9hcmQ6OnRlc3Rpbmc6OkZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlcjsKIHVzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwogCi1jbGFzcyBTYlBsYXllclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNiUGxheWVyT3V0cHV0TW9kZT4gewotIHByb3RlY3RlZDoKLSAgU2JQbGF5ZXJUZXN0KCkgOiBvdXRwdXRfbW9kZV8oR2V0UGFyYW0oKSkge30KK2NvbnN0ZXhwciBTYlBsYXllck91dHB1dE1vZGUga091dHB1dE1vZGVzW10gPSB7CisgICAga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0fTsKIAotICB2b2lkIEdldEN1cnJlbnRGcmFtZUlmU3VwcG9ydGVkKFNiUGxheWVyIHBsYXllcikgewotICAgIGlmIChvdXRwdXRfbW9kZV8gIT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSkgeworY2xhc3MgU2JQbGF5ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBTYlBsYXllclRlc3QoKSB7fQorCisgIHZvaWQgR2V0Q3VycmVudEZyYW1lSWZTdXBwb3J0ZWQoU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSkgeworICAgIGlmIChvdXRwdXRfbW9kZSAhPSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogI2lmIFNCX0hBUyhHTEVTMikKQEAgLTQ4LDEzNyArNTgsMjY2IEBACiAjZW5kaWYgIC8vIFNCX0hBUyhHTEVTMikKICAgfQogCisgIHN0YXRpYyB2b2lkIFBsYXllclN0YXR1c0Z1bmMoU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0KSB7CisgICAgQVNTRVJUX05FKGNvbnRleHQsIG51bGxwdHIpOworICAgIChzdGF0aWNfY2FzdDxTYlBsYXllclRlc3QqPihjb250ZXh0KSktPk9uUGxheWVyU3RhdHVzKHN0YXRlKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFBsYXllckVycm9yRnVuYyhTYlBsYXllciBwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJFcnJvciBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgICBBU1NFUlRfTkUoY29udGV4dCwgbnVsbHB0cik7CisgICAgKHN0YXRpY19jYXN0PFNiUGxheWVyVGVzdCo+KGNvbnRleHQpKS0+T25QbGF5ZXJFcnJvcihlcnJvcik7CisgIH0KKworICB2b2lkIE9uUGxheWVyU3RhdHVzKFNiUGxheWVyU3RhdGUgc3RhdGUpIHsKKyAgICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7CisgICAgcGxheWVyX3N0YXRlXyA9IHN0YXRlOworICAgIGNvbmRpdGlvbl92YXJpYWJsZV8uU2lnbmFsKCk7CisgIH0KKworICB2b2lkIE9uUGxheWVyRXJyb3IoU2JQbGF5ZXJFcnJvciBlcnJvcikgeworICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKyAgICBwbGF5ZXJfZXJyb3JfID0gZXJyb3I7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlXy5TaWduYWwoKTsKKyAgfQorCisgIHZvaWQgQ2xlYXJQbGF5ZXJTdGF0ZUFuZEVycm9yKCkgeworICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKyAgICBwbGF5ZXJfc3RhdGVfID0gbnVsbG9wdDsKKyAgICBwbGF5ZXJfZXJyb3JfID0gbnVsbG9wdDsKKyAgfQorCisgIHZvaWQgV2FpdEZvclBsYXllckluaXRpYWxpemVkT3JFcnJvcihib29sKiBlcnJvcl9vY2N1cnJlZCkgeworICAgIGNvbnN0IFNiVGltZSBrV2FpdFRpbWVvdXQgPSBrU2JUaW1lU2Vjb25kICogNTsKKworICAgIFNCX0RDSEVDSyhlcnJvcl9vY2N1cnJlZCk7CisgICAgKmVycm9yX29jY3VycmVkID0gZmFsc2U7CisKKyAgICBjb25zdCBTYlRpbWVNb25vdG9uaWMgd2FpdF9lbmQgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSArIGtXYWl0VGltZW91dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKKworICAgICAgaWYgKHBsYXllcl9lcnJvcl8uaGFzX2VuZ2FnZWQoKSkgeworICAgICAgICAqZXJyb3Jfb2NjdXJyZWQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChwbGF5ZXJfc3RhdGVfLmhhc19lbmdhZ2VkKCkpIHsKKyAgICAgICAgKmVycm9yX29jY3VycmVkID0gcGxheWVyX3N0YXRlXy52YWx1ZSgpID09IGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQ7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYXV0byBub3cgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKKyAgICAgIGlmIChub3cgPiB3YWl0X2VuZCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvbmRpdGlvbl92YXJpYWJsZV8uV2FpdFRpbWVkKHdhaXRfZW5kIC0gbm93KTsKKyAgICB9CisKKyAgICBTQl9MT0coSU5GTykgPDwgIldhaXRGb3JQbGF5ZXJJbml0aWFsaXplZE9yRXJyb3IoKSB0aW1lZCBvdXQuIjsKKyAgICAqZXJyb3Jfb2NjdXJyZWQgPSB0cnVlOyAgLy8gVGltZW91dCBpcyBhbiBlcnJvcgorICB9CisKICAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87CiAKLSAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKKyAgTXV0ZXggbXV0ZXhfOworICBDb25kaXRpb25WYXJpYWJsZSBjb25kaXRpb25fdmFyaWFibGVfe211dGV4X307CisgIG9wdGlvbmFsPFNiUGxheWVyU3RhdGU+IHBsYXllcl9zdGF0ZV87CisgIG9wdGlvbmFsPFNiUGxheWVyRXJyb3I+IHBsYXllcl9lcnJvcl87CiB9OwogCi1URVNUX1AoU2JQbGF5ZXJUZXN0LCBTdW5ueURheSkgeworVEVTVF9GKFNiUGxheWVyVGVzdCwgU3VubnlEYXkpIHsKKyAgYm9vbCBhdF9sZWFzdF9vbmVfY3JlYXRlZCA9IGZhbHNlOwogICBhdXRvIGF1ZGlvX3N0cmVhbV9pbmZvID0gQ3JlYXRlQXVkaW9TdHJlYW1JbmZvKGtTYk1lZGlhQXVkaW9Db2RlY0FhYyk7CiAKLSAgaWYgKCFJc091dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGVfLCBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQpKSB7Ci0gICAgcmV0dXJuOworICBmb3IgKGF1dG8gb3V0cHV0X21vZGUgOiBrT3V0cHV0TW9kZXMpIHsKKyAgICBpZiAoIUlzT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwga1NiTWVkaWFBdWRpb0NvZGVjQWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAorICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0LAorICAgICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19zdHJlYW1faW5mbywKKyAgICAgICAgIiIgLyogbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyAqLywgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgICAgRHVtbXlEZWNvZGVyU3RhdHVzRnVuYywgUGxheWVyU3RhdHVzRnVuYywgUGxheWVyRXJyb3JGdW5jLCB0aGlzLAorICAgICAgICBvdXRwdXRfbW9kZSwgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKworICAgIGlmIChTYlBsYXllcklzVmFsaWQocGxheWVyKSkgeworICAgICAgYm9vbCBlcnJvcl9vY2N1cnJlZCA9IGZhbHNlOworICAgICAgV2FpdEZvclBsYXllckluaXRpYWxpemVkT3JFcnJvcigmZXJyb3Jfb2NjdXJyZWQpOworICAgICAgR2V0Q3VycmVudEZyYW1lSWZTdXBwb3J0ZWQocGxheWVyLCBvdXRwdXRfbW9kZSk7CisgICAgICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKKworICAgICAgYXRfbGVhc3Rfb25lX2NyZWF0ZWQgPSBlcnJvcl9vY2N1cnJlZDsKKyAgICB9CisKKyAgICBDbGVhclBsYXllclN0YXRlQW5kRXJyb3IoKTsKICAgfQogCi0gIFNiUGxheWVyIHBsYXllciA9IENhbGxTYlBsYXllckNyZWF0ZSgKLSAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCi0gICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19zdHJlYW1faW5mbywKLSAgICAgICIiIC8qIG1heF92aWRlb19jYXBhYmlsaXRpZXMgKi8sIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCi0gICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBEdW1teVBsYXllclN0YXR1c0Z1bmMsIER1bW15RXJyb3JGdW5jLAotICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZV8sCi0gICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwotICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7Ci0KLSAgR2V0Q3VycmVudEZyYW1lSWZTdXBwb3J0ZWQocGxheWVyKTsKLQotICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKKyAgQVNTRVJUX1RSVUUoYXRfbGVhc3Rfb25lX2NyZWF0ZWQpOwogfQogCi1URVNUX1AoU2JQbGF5ZXJUZXN0LCBOdWxsQ2FsbGJhY2tzKSB7CitURVNUX0YoU2JQbGF5ZXJUZXN0LCBNYXhWaWRlb0NhcGFiaWxpdGllcykgeworICBjb25zdCBjaGFyKiBrTWF4VmlkZW9DYXBhYmlsaXRpZXNbXSA9IHsKKyAgICAgICJ3aWR0aD00MzI7IGhlaWdodD0yNDA7IiwKKyAgICAgICJ3aWR0aD00MzI7IGhlaWdodD0yNDA7IGZyYW1lcmF0ZT0xNSIsCisgICAgICAid2lkdGg9NDMyOyBoZWlnaHQ9MjQwOyBmcmFtZXJhdGU9MzAiLAorICAgICAgIndpZHRoPTY0MDsgaGVpZ2h0PTQ4MCIsCisgICAgICAid2lkdGg9NjQwOyBoZWlnaHQ9NDgwOyBmcmFtZXJhdGU9MzAiLAorICAgICAgIndpZHRoPTY0MDsgaGVpZ2h0PTQ4MDsgZnJhbWVyYXRlPTYwIiwKKyAgICAgICJ3aWR0aD0xMjgwOyBoZWlnaHQ9NzIwIiwKKyAgfTsKKwogICBhdXRvIGF1ZGlvX3N0cmVhbV9pbmZvID0gQ3JlYXRlQXVkaW9TdHJlYW1JbmZvKGtTYk1lZGlhQXVkaW9Db2RlY0FhYyk7CiAKLSAgaWYgKCFJc091dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGVfLCBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQpKSB7Ci0gICAgcmV0dXJuOwotICB9CisgIGZvciAoYXV0byBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzIDoga01heFZpZGVvQ2FwYWJpbGl0aWVzKSB7CisgICAgYm9vbCBhdF9sZWFzdF9vbmVfY3JlYXRlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byBvdXRwdXRfbW9kZSA6IGtPdXRwdXRNb2RlcykgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAorICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCisgICAgICAgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9fc3RyZWFtX2luZm8sCisgICAgICAgICAgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcywgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBQbGF5ZXJTdGF0dXNGdW5jLCBQbGF5ZXJFcnJvckZ1bmMsIHRoaXMsCisgICAgICAgICAgb3V0cHV0X21vZGUsCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKIAotICB7CisgICAgICBpZiAoU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpIHsKKyAgICAgICAgYm9vbCBlcnJvcl9vY2N1cnJlZCA9IGZhbHNlOworICAgICAgICBXYWl0Rm9yUGxheWVySW5pdGlhbGl6ZWRPckVycm9yKCZlcnJvcl9vY2N1cnJlZCk7CisgICAgICAgIEdldEN1cnJlbnRGcmFtZUlmU3VwcG9ydGVkKHBsYXllciwgb3V0cHV0X21vZGUpOworICAgICAgICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKKworICAgICAgICBhdF9sZWFzdF9vbmVfY3JlYXRlZCA9IGVycm9yX29jY3VycmVkOworICAgICAgfQorCisgICAgICBDbGVhclBsYXllclN0YXRlQW5kRXJyb3IoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRShhdF9sZWFzdF9vbmVfY3JlYXRlZCkgPDwgbWF4X3ZpZGVvX2NhcGFiaWxpdGllczsKKyAgfQorfQorCitURVNUX0YoU2JQbGF5ZXJUZXN0LCBOdWxsQ2FsbGJhY2tzKSB7CisgIGF1dG8gYXVkaW9fc3RyZWFtX2luZm8gPSBDcmVhdGVBdWRpb1N0cmVhbUluZm8oa1NiTWVkaWFBdWRpb0NvZGVjQWFjKTsKKworICBmb3IgKGF1dG8gb3V0cHV0X21vZGUgOiBrT3V0cHV0TW9kZXMpIHsKKyAgICBpZiAoIUlzT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwga1NiTWVkaWFBdWRpb0NvZGVjQWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAorICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCisgICAgICAgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9fc3RyZWFtX2luZm8sCisgICAgICAgICAgIiIgLyogbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyAqLywgTlVMTCAvKiBkZWFsbG9jYXRlX3NhbXBsZV9mdW5jICovLAorICAgICAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCisgICAgICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZSwKKyAgICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKworICAgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7CisgICAgfQorCisgICAgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAorICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCisgICAgICAgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9fc3RyZWFtX2luZm8sCisgICAgICAgICAgIiIgLyogbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyAqLywgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgICAgICBOVUxMIC8qIGRlY29kZXJfc3RhdHVzX2Z1bmMgKi8sIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCisgICAgICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZSwKKyAgICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKworICAgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7CisgICAgfQorCisgICAgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAorICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCisgICAgICAgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9fc3RyZWFtX2luZm8sCisgICAgICAgICAgIiIgLyogbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyAqLywgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBOVUxMIC8qc3RhdHVzX2Z1bmMgKi8sIER1bW15RXJyb3JGdW5jLAorICAgICAgICAgIE5VTEwgLyogY29udGV4dCAqLywgb3V0cHV0X21vZGUsCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CisKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKworICAgIHsKKyAgICAgIFNiUGxheWVyIHBsYXllciA9IENhbGxTYlBsYXllckNyZWF0ZSgKKyAgICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0LAorICAgICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX3N0cmVhbV9pbmZvLCAiIiwKKyAgICAgICAgICBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLCBEdW1teURlY29kZXJTdGF0dXNGdW5jLAorICAgICAgICAgIER1bW15UGxheWVyU3RhdHVzRnVuYywgTlVMTCAvKiBlcnJvcl9mdW5jICovLCBOVUxMIC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgb3V0cHV0X21vZGUsCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CisKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKyAgfQorfQorCitURVNUX0YoU2JQbGF5ZXJUZXN0LCBBdWRpb2xlc3MpIHsKKyAgZm9yIChhdXRvIG91dHB1dF9tb2RlIDoga091dHB1dE1vZGVzKSB7CisgICAgaWYgKCFJc091dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGUsIGtTYk1lZGlhQXVkaW9Db2RlY05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBTYlBsYXllciBwbGF5ZXIgPSBDYWxsU2JQbGF5ZXJDcmVhdGUoCiAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCi0gICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX3N0cmVhbV9pbmZvLAotICAgICAgICAiIiAvKiBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzICovLCBOVUxMIC8qIGRlYWxsb2NhdGVfc2FtcGxlX2Z1bmMgKi8sCi0gICAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCi0gICAgICAgIE5VTEwgLyogY29udGV4dCAqLywgb3V0cHV0X21vZGVfLAotICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwotICAgIEVYUEVDVF9GQUxTRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7Ci0KLSAgICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKLSAgfQotCi0gIHsKLSAgICBTYlBsYXllciBwbGF5ZXIgPSBDYWxsU2JQbGF5ZXJDcmVhdGUoCi0gICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCi0gICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX3N0cmVhbV9pbmZvLAotICAgICAgICAiIiAvKiBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzICovLCBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLAotICAgICAgICBOVUxMIC8qIGRlY29kZXJfc3RhdHVzX2Z1bmMgKi8sIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCi0gICAgICAgIE5VTEwgLyogY29udGV4dCAqLywgb3V0cHV0X21vZGVfLAotICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwotICAgIEVYUEVDVF9GQUxTRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7Ci0KLSAgICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKLSAgfQotCi0gIHsKLSAgICBTYlBsYXllciBwbGF5ZXIgPSBDYWxsU2JQbGF5ZXJDcmVhdGUoCi0gICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCi0gICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX3N0cmVhbV9pbmZvLAotICAgICAgICAiIiAvKiBtYXhfdmlkZW9fY2FwYWJpbGl0aWVzICovLCBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLAotICAgICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBOVUxMIC8qc3RhdHVzX2Z1bmMgKi8sIER1bW15RXJyb3JGdW5jLAotICAgICAgICBOVUxMIC8qIGNvbnRleHQgKi8sIG91dHB1dF9tb2RlXywKLSAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0UoU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOwotCi0gICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7Ci0gIH0KLQotICB7Ci0gICAgU2JQbGF5ZXIgcGxheWVyID0gQ2FsbFNiUGxheWVyQ3JlYXRlKAotICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0LAotICAgICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19zdHJlYW1faW5mbywgIiIsCisgICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY05vbmUsIGtTYkRybVN5c3RlbUludmFsaWQsCisgICAgICAgIE5VTEwgLyogYXVkaW9fc3RyZWFtX2luZm8gKi8sICIiIC8qIG1heF92aWRlb19jYXBhYmlsaXRpZXMgKi8sCiAgICAgICAgIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsCi0gICAgICAgIER1bW15UGxheWVyU3RhdHVzRnVuYywgTlVMTCAvKiBlcnJvcl9mdW5jICovLCBOVUxMIC8qIGNvbnRleHQgKi8sCi0gICAgICAgIG91dHB1dF9tb2RlXywKKyAgICAgICAgRHVtbXlQbGF5ZXJTdGF0dXNGdW5jLCBEdW1teUVycm9yRnVuYywgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZSwKICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0UoU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOworICAgIEFTU0VSVF9UUlVFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKworICAgIC8vIFRPRE86IFZhbGlkYXRlIHBsYXllciBzdGF0ZSBvciBlcnJvci4KKworICAgIEdldEN1cnJlbnRGcmFtZUlmU3VwcG9ydGVkKHBsYXllciwgb3V0cHV0X21vZGUpOwogCiAgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7CiAgIH0KIH0KIAotVEVTVF9QKFNiUGxheWVyVGVzdCwgQXVkaW9sZXNzKSB7Ci0gIGlmICghSXNPdXRwdXRNb2RlU3VwcG9ydGVkKG91dHB1dF9tb2RlXywga1NiTWVkaWFBdWRpb0NvZGVjTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTYlBsYXllciBwbGF5ZXIgPSBDYWxsU2JQbGF5ZXJDcmVhdGUoCi0gICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0LAotICAgICAga1NiTWVkaWFBdWRpb0NvZGVjTm9uZSwga1NiRHJtU3lzdGVtSW52YWxpZCwgTlVMTCAvKiBhdWRpb19zdHJlYW1faW5mbyAqLywKLSAgICAgICIiIC8qIG1heF92aWRlb19jYXBhYmlsaXRpZXMgKi8sIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCi0gICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBEdW1teVBsYXllclN0YXR1c0Z1bmMsIER1bW15RXJyb3JGdW5jLAotICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZV8sCi0gICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwotICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7Ci0KLSAgR2V0Q3VycmVudEZyYW1lSWZTdXBwb3J0ZWQocGxheWVyKTsKLQotICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKLX0KLQotVEVTVF9QKFNiUGxheWVyVGVzdCwgQXVkaW9Pbmx5KSB7CitURVNUX0YoU2JQbGF5ZXJUZXN0LCBBdWRpb09ubHkpIHsKICAgYXV0byBhdWRpb19zdHJlYW1faW5mbyA9IENyZWF0ZUF1ZGlvU3RyZWFtSW5mbyhrU2JNZWRpYUF1ZGlvQ29kZWNBYWMpOwogCi0gIGlmICghSXNPdXRwdXRNb2RlU3VwcG9ydGVkKG91dHB1dF9tb2RlXywga1NiTWVkaWFBdWRpb0NvZGVjQWFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0KSkgewotICAgIHJldHVybjsKKyAgZm9yIChhdXRvIG91dHB1dF9tb2RlIDoga091dHB1dE1vZGVzKSB7CisgICAgaWYgKCFJc091dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGUsIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0KSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNiUGxheWVyIHBsYXllciA9IENhbGxTYlBsYXllckNyZWF0ZSgKKyAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1NiTWVkaWFWaWRlb0NvZGVjTm9uZSwKKyAgICAgICAga1NiTWVkaWFBdWRpb0NvZGVjQWFjLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9fc3RyZWFtX2luZm8sCisgICAgICAgICIiIC8qIG1heF92aWRlb19jYXBhYmlsaXRpZXMgKi8sIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCisgICAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCisgICAgICAgIE5VTEwgLyogY29udGV4dCAqLywgb3V0cHV0X21vZGUsCisgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8uZGVjb2Rlcl90YXJnZXRfcHJvdmlkZXIoKSk7CisgICAgQVNTRVJUX1RSVUUoU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOworCisgICAgLy8gVE9ETzogVmFsaWRhdGUgcGxheWVyIHN0YXRlIG9yIGVycm9yLgorCisgICAgR2V0Q3VycmVudEZyYW1lSWZTdXBwb3J0ZWQocGxheWVyLCBvdXRwdXRfbW9kZSk7CisKKyAgICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKICAgfQotCi0gIFNiUGxheWVyIHBsYXllciA9IENhbGxTYlBsYXllckNyZWF0ZSgKLSAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtTYk1lZGlhVmlkZW9Db2RlY05vbmUsCi0gICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19zdHJlYW1faW5mbywKLSAgICAgICIiIC8qIG1heF92aWRlb19jYXBhYmlsaXRpZXMgKi8sIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCi0gICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBEdW1teVBsYXllclN0YXR1c0Z1bmMsIER1bW15RXJyb3JGdW5jLAotICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZV8sCi0gICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwotICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7Ci0KLSAgR2V0Q3VycmVudEZyYW1lSWZTdXBwb3J0ZWQocGxheWVyKTsKLQotICBTYlBsYXllckRlc3Ryb3kocGxheWVyKTsKIH0KIAotVEVTVF9QKFNiUGxheWVyVGVzdCwgTXVsdGlQbGF5ZXIpIHsKK1RFU1RfRihTYlBsYXllclRlc3QsIE11bHRpUGxheWVyKSB7CiAgIGF1dG8gYXVkaW9fc3RyZWFtX2luZm8gPSBDcmVhdGVBdWRpb1N0cmVhbUluZm8oa1NiTWVkaWFBdWRpb0NvZGVjQWFjKTsKICAgU2JEcm1TeXN0ZW0ga0RybVN5c3RlbSA9IGtTYkRybVN5c3RlbUludmFsaWQ7CiAKQEAgLTI1MiwyNCArMzkxLDQwIEBACiAgICAgICBicmVhazsKICAgfQogCi0gIGNvbnN0IGludCBrTWF4UGxheWVyc1BlckNvbmZpZyA9IDE2OworICBjb25zdCBpbnQga01heFBsYXllcnNQZXJDb25maWcgPSA1OwogICBzdGQ6OnZlY3RvcjxTYlBsYXllcj4gY3JlYXRlZF9wbGF5ZXJzOworICBpbnQgbnVtYmVyX29mX2NyZWF0ZV9hdHRlbXB0cyA9IDA7CiAgIGludCBudW1iZXJfb2ZfcGxheWVycyA9IDA7CisKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4UGxheWVyc1BlckNvbmZpZzsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTQl9BUlJBWV9TSVpFX0lOVChrT3V0cHV0TW9kZXMpOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgU0JfQVJSQVlfU0laRV9JTlQoa0F1ZGlvQ29kZWNzKTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgU0JfQVJSQVlfU0laRV9JTlQoa1ZpZGVvQ29kZWNzKTsgKytsKSB7CisgICAgICAgICAgKytudW1iZXJfb2ZfY3JlYXRlX2F0dGVtcHRzOworICAgICAgICAgIFNCX0xPRyhJTkZPKSA8PCAiQXR0ZW1wdCB0byBjcmVhdGUgU2JQbGF5ZXIgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbnVtYmVyX29mX2NyZWF0ZV9hdHRlbXB0cyA8PCAiIHRpbWVzLCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgY3JlYXRlZF9wbGF5ZXJzLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHBsYXllciBjcmVhdGVkLlxuIE5vdyBjcmVhdGluZyBwbGF5ZXIgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TWVkaWFBdWRpb0NvZGVjTmFtZShrQXVkaW9Db2RlY3Nba10pIDw8ICIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TWVkaWFWaWRlb0NvZGVjTmFtZShrVmlkZW9Db2RlY3NbbF0pOworCiAgICAgICAgICAgYXVkaW9fc3RyZWFtX2luZm8uY29kZWMgPSBrQXVkaW9Db2RlY3Nba107CiAgICAgICAgICAgY3JlYXRlZF9wbGF5ZXJzLnB1c2hfYmFjayhDYWxsU2JQbGF5ZXJDcmVhdGUoCiAgICAgICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8ud2luZG93KCksIGtWaWRlb0NvZGVjc1tsXSwKICAgICAgICAgICAgICAga0F1ZGlvQ29kZWNzW2tdLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9fc3RyZWFtX2luZm8sCiAgICAgICAgICAgICAgICIiIC8qIG1heF92aWRlb19jYXBhYmlsaXRpZXMgKi8sIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCi0gICAgICAgICAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFcnJvckZ1bmMsCi0gICAgICAgICAgICAgIE5VTEwgLyogY29udGV4dCAqLywga091dHB1dE1vZGVzW2pdLAorICAgICAgICAgICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBQbGF5ZXJTdGF0dXNGdW5jLCBQbGF5ZXJFcnJvckZ1bmMsIHRoaXMsCisgICAgICAgICAgICAgIGtPdXRwdXRNb2Rlc1tqXSwKICAgICAgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKSk7Ci0gICAgICAgICAgaWYgKCFTYlBsYXllcklzVmFsaWQoY3JlYXRlZF9wbGF5ZXJzLmJhY2soKSkpIHsKKworICAgICAgICAgIGlmIChTYlBsYXllcklzVmFsaWQoY3JlYXRlZF9wbGF5ZXJzLmJhY2soKSkpIHsKKyAgICAgICAgICAgIGJvb2wgZXJyb3Jfb2NjdXJyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFdhaXRGb3JQbGF5ZXJJbml0aWFsaXplZE9yRXJyb3IoJmVycm9yX29jY3VycmVkKTsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY3JlYXRlZF9wbGF5ZXJzLnBvcF9iYWNrKCk7CiAgICAgICAgICAgfQorCisgICAgICAgICAgQ2xlYXJQbGF5ZXJTdGF0ZUFuZEVycm9yKCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0yODQsMTEgKzQzOSw2IEBACiAgIH0KIH0KIAotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2JQbGF5ZXJUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCkpOwotCiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRpb25fcGFyYW1faGVscGVycy5jYyBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGlvbl9wYXJhbV9oZWxwZXJzLmNjCmluZGV4IDk1OWEwNzEuLmQyMGE2MzUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGlvbl9wYXJhbV9oZWxwZXJzLmNjCisrKyBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGlvbl9wYXJhbV9oZWxwZXJzLmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0aW9uX3BhcmFtX2hlbHBlcnMuaCIKIAogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgbnBsYiB7CkBAIC0yMiw2ICsyMyw3IEBACiAKIHVzaW5nIHNoYXJlZDo6c3RhcmJvYXJkOjptZWRpYTo6QXVkaW9TdHJlYW1JbmZvOwogdXNpbmcgc2hhcmVkOjpzdGFyYm9hcmQ6Om1lZGlhOjpWaWRlb1N0cmVhbUluZm87Cit1c2luZyBzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wUmVhZGVyOwogCiB9ICAvLyBuYW1lc3BhY2UKIApAQCAtMTM0LDUgKzEzNiwyOSBAQAogICByZXR1cm4gY3JlYXRpb25fcGFyYW07CiB9CiAKK1BsYXllckNyZWF0aW9uUGFyYW0gQ3JlYXRlUGxheWVyQ3JlYXRpb25QYXJhbSgKKyAgICBjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZykgeworICBQbGF5ZXJDcmVhdGlvblBhcmFtIGNyZWF0aW9uX3BhcmFtOworICBpZiAoY29uZmlnLmF1ZGlvX2ZpbGVuYW1lKSB7CisgICAgVmlkZW9EbXBSZWFkZXIgZG1wX3JlYWRlcihjb25maWcuYXVkaW9fZmlsZW5hbWUpOworICAgIGNyZWF0aW9uX3BhcmFtLmF1ZGlvX3N0cmVhbV9pbmZvID0gZG1wX3JlYWRlci5hdWRpb19zdHJlYW1faW5mbygpOworICB9CisgIGlmIChjb25maWcudmlkZW9fZmlsZW5hbWUpIHsKKyAgICBWaWRlb0RtcFJlYWRlciBkbXBfcmVhZGVyKGNvbmZpZy52aWRlb19maWxlbmFtZSk7CisgICAgY3JlYXRpb25fcGFyYW0udmlkZW9fc3RyZWFtX2luZm8gPSBkbXBfcmVhZGVyLnZpZGVvX3N0cmVhbV9pbmZvKCk7CisgICAgY3JlYXRpb25fcGFyYW0udmlkZW9fc3RyZWFtX2luZm8ubWF4X3ZpZGVvX2NhcGFiaWxpdGllcyA9CisgICAgICAgIGNvbmZpZy5tYXhfdmlkZW9fY2FwYWJpbGl0aWVzOworICB9CisgIGNyZWF0aW9uX3BhcmFtLm91dHB1dF9tb2RlID0gY29uZmlnLm91dHB1dF9tb2RlOworICByZXR1cm4gY3JlYXRpb25fcGFyYW07Cit9CisKK1NiUGxheWVyT3V0cHV0TW9kZSBHZXRQcmVmZXJyZWRPdXRwdXRNb2RlKAorICAgIGNvbnN0IFBsYXllckNyZWF0aW9uUGFyYW0mIGNyZWF0aW9uX3BhcmFtKSB7CisgIFNiUGxheWVyQ3JlYXRpb25QYXJhbSBwYXJhbSA9IHt9OworICBjcmVhdGlvbl9wYXJhbS5Db252ZXJ0VG8oJnBhcmFtKTsKKyAgcmV0dXJuIFNiUGxheWVyR2V0UHJlZmVycmVkT3V0cHV0TW9kZSgmcGFyYW0pOworfQorCiB9ICAvLyBuYW1lc3BhY2UgbnBsYgogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0aW9uX3BhcmFtX2hlbHBlcnMuaCBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGlvbl9wYXJhbV9oZWxwZXJzLmgKaW5kZXggMDM2YjQwNC4uM2M2MDdkYyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0aW9uX3BhcmFtX2hlbHBlcnMuaAorKysgYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRpb25fcGFyYW1faGVscGVycy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvZHJtLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfdXRpbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV91dGlsLmgiCiAKQEAgLTY5LDYgKzcwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlKTsKIAorUGxheWVyQ3JlYXRpb25QYXJhbSBDcmVhdGVQbGF5ZXJDcmVhdGlvblBhcmFtKGNvbnN0IFNiUGxheWVyVGVzdENvbmZpZyYgY29uZmlnKTsKKworU2JQbGF5ZXJPdXRwdXRNb2RlIEdldFByZWZlcnJlZE91dHB1dE1vZGUoCisgICAgY29uc3QgUGxheWVyQ3JlYXRpb25QYXJhbSYgY3JlYXRpb25fcGFyYW0pOworCiB9ICAvLyBuYW1lc3BhY2UgbnBsYgogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfZ2V0X2F1ZGlvX2NvbmZpZ3VyYXRpb25fdGVzdC5jYyBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl9nZXRfYXVkaW9fY29uZmlndXJhdGlvbl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWZkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfZ2V0X2F1ZGlvX2NvbmZpZ3VyYXRpb25fdGVzdC5jYwpAQCAtMCwwICsxLDI3OSBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfZml4dHVyZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uJiBsZWZ0LAorICAgICAgICAgICAgICAgIGNvbnN0IFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24mIHJpZ2h0KSB7CisgIHJldHVybiBtZW1jbXAoJmxlZnQsICZyaWdodCwgc2l6ZW9mKFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24pKSA9PSAwOworfQorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6c3RhcmJvYXJkOjp0ZXN0aW5nOjpGYWtlR3JhcGhpY3NDb250ZXh0UHJvdmlkZXI7Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlc0luOworCit0eXBlZGVmIFNiUGxheWVyVGVzdEZpeHR1cmU6Okdyb3VwZWRTYW1wbGVzIEdyb3VwZWRTYW1wbGVzOworCitjbGFzcyBTYlBsYXllckdldEF1ZGlvQ29uZmlndXJhdGlvblRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2JQbGF5ZXJUZXN0Q29uZmlnPiB7CisgcHVibGljOgorICB2b2lkIFJlYWRBdWRpb0NvbmZpZ3VyYXRpb25zKAorICAgICAgY29uc3QgU2JQbGF5ZXJUZXN0Rml4dHVyZSYgcGxheWVyX2ZpeHR1cmUsCisgICAgICBzdGQ6OnZlY3RvcjxTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uPiogY29uZmlndXJhdGlvbnMpIGNvbnN0IHsKKyAgICBTQl9DSEVDSyhjb25maWd1cmF0aW9ucy0+ZW1wdHkoKSk7CisKKyAgICAvLyBXZSB0cnkgdG8gcmVhZCBhdWRpbyBjb25maWd1cmF0aW9uIHdpdGggYSB0b28gbGFyZ2UgaW5kZXggaGVyZSwgdG8gbWFrZQorICAgIC8vIHN1cmUgU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb24oKSBub3QgYWx3YXlzIHJldHVybiB0cnVlIGFuZCBhdm9pZAorICAgIC8vIGluZmluaXRlIGZvciBsb29wIGJlbG93LgorICAgIGNvbnN0IGludCBrSW52YWxpZEluZGV4ID0gOTk5OTsKKyAgICBTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisgICAgQVNTRVJUX0ZBTFNFKFNiUGxheWVyR2V0QXVkaW9Db25maWd1cmF0aW9uKHBsYXllcl9maXh0dXJlLkdldFBsYXllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW52YWxpZEluZGV4LCAmY29uZmlndXJhdGlvbikpOworCisgICAgZm9yIChpbnQgaW5kZXggPSAwOzsgaW5kZXgrKykgeworICAgICAgaWYgKFNiUGxheWVyR2V0QXVkaW9Db25maWd1cmF0aW9uKHBsYXllcl9maXh0dXJlLkdldFBsYXllcigpLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0Q29uZmlndXJhdGlvbklzVmFsaWQoY29uZmlndXJhdGlvbikpOworICAgICAgICBjb25maWd1cmF0aW9ucy0+cHVzaF9iYWNrKGNvbmZpZ3VyYXRpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgQXNzZXJ0Q29uZmlndXJhdGlvbklzVmFsaWQoCisgICAgICBjb25zdCBTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSBjb25zdCB7CisgICAgYm9vbCBjb25uZWN0b3JfaXNfdmFsaWQgPSBmYWxzZTsKKyAgICBib29sIGNvZGluZ190eXBlX2lzX3ZhbGlkID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGNvbmZpZ3VyYXRpb24uY29ubmVjdG9yKSB7CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db25uZWN0b3JVbmtub3duOgorICAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yQW5hbG9nOgorICAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yQmx1ZXRvb3RoOgorICAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yQnVpbHRJbjoKKyAgICAgIGNhc2Uga1NiTWVkaWFBdWRpb0Nvbm5lY3RvckhkbWk6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db25uZWN0b3JSZW1vdGVXaXJlZDoKKyAgICAgIGNhc2Uga1NiTWVkaWFBdWRpb0Nvbm5lY3RvclJlbW90ZVdpcmVsZXNzOgorICAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29ubmVjdG9yUmVtb3RlT3RoZXI6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db25uZWN0b3JTcGRpZjoKKyAgICAgIGNhc2Uga1NiTWVkaWFBdWRpb0Nvbm5lY3RvclVzYjoKKyAgICAgICAgY29ubmVjdG9yX2lzX3ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoY29uZmlndXJhdGlvbi5jb2RpbmdfdHlwZSkgeworICAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29kaW5nVHlwZU5vbmU6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RpbmdUeXBlQWFjOgorICAgICAgY2FzZSBrU2JNZWRpYUF1ZGlvQ29kaW5nVHlwZUFjMzoKKyAgICAgIGNhc2Uga1NiTWVkaWFBdWRpb0NvZGluZ1R5cGVBdHJhYzoKKyAgICAgIGNhc2Uga1NiTWVkaWFBdWRpb0NvZGluZ1R5cGVCaXRzdHJlYW06CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RpbmdUeXBlRG9sYnlEaWdpdGFsUGx1czoKKyAgICAgIGNhc2Uga1NiTWVkaWFBdWRpb0NvZGluZ1R5cGVEdHM6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RpbmdUeXBlTXBlZzE6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RpbmdUeXBlTXBlZzI6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RpbmdUeXBlTXBlZzM6CisgICAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RpbmdUeXBlUGNtOgorICAgICAgICBjb2RpbmdfdHlwZV9pc192YWxpZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShjb25uZWN0b3JfaXNfdmFsaWQpOworICAgIEFTU0VSVF9UUlVFKGNvZGluZ190eXBlX2lzX3ZhbGlkKTsKKyAgICBBU1NFUlRfR0UoY29uZmlndXJhdGlvbi5udW1iZXJfb2ZfY2hhbm5lbHMsIDApOworICB9CisKKyAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87Cit9OworCitURVNUX1AoU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0LCBTdW5ueURheSkgeworICBjb25zdCBpbnQga1NhbXBsZXNUb1dyaXRlID0gODsKKworICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJdCdzIG9rIHRvIG5vdCByZXR1cm4gYW55IGNvbmZpZ3VyYXRpb24gYXQgdGhpcyBwb2ludC4KKyAgc3RkOjp2ZWN0b3I8U2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbj4gaW5pdGlhbF9jb25maWdzOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgIFJlYWRBdWRpb0NvbmZpZ3VyYXRpb25zKHBsYXllcl9maXh0dXJlLCAmaW5pdGlhbF9jb25maWdzKSk7CisKKyAgR3JvdXBlZFNhbXBsZXMgc2FtcGxlczsKKyAgaWYgKHBsYXllcl9maXh0dXJlLkhhc0F1ZGlvKCkpIHsKKyAgICBzYW1wbGVzLkFkZEF1ZGlvU2FtcGxlcygwLCBrU2FtcGxlc1RvV3JpdGUpOworICAgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKKyAgfQorICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzVmlkZW8oKSkgeworICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzKDAsIGtTYW1wbGVzVG9Xcml0ZSk7CisgICAgc2FtcGxlcy5BZGRWaWRlb0VPUygpOworICB9CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldyaXRlKHNhbXBsZXMpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV2FpdEZvclBsYXllclByZXNlbnRpbmcoKSk7CisKKyAgLy8gVGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb25zIG11c3QgYmUgYXZhaWxhYmxlIGFmdGVyIGBrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmdgCisgIC8vIGhhcyBiZWVuIHJlY2VpdmVkLgorICBzdGQ6OnZlY3RvcjxTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uPiBjb25maWdzX2FmdGVyX3ByZXNlbnRpbmc7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgUmVhZEF1ZGlvQ29uZmlndXJhdGlvbnMocGxheWVyX2ZpeHR1cmUsICZjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcpKTsKKworICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgeworICAgIEFTU0VSVF9GQUxTRShjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcuZW1wdHkoKSk7CisgIH0KKworICAvLyBPbmNlIGF0IGxlYXN0IG9uZSBhdWRpbyBjb25maWd1cmF0aW9ucyBhcmUgcmV0dXJuZWQsIHRoZSByZXR1cm4gdmFsdWVzCisgIC8vIHNob3VsZG4ndCBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIHRpbWUgb2YgfHBsYXllcnwuCisgIGlmICghaW5pdGlhbF9jb25maWdzLmVtcHR5KCkpIHsKKyAgICBBU1NFUlRfRVEoaW5pdGlhbF9jb25maWdzLCBjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcpOworICB9CisKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV2FpdEZvclBsYXllckVuZE9mU3RyZWFtKCkpOworCisgIHN0ZDo6dmVjdG9yPFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24+IGNvbmZpZ3NfYWZ0ZXJfZW5kOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgIFJlYWRBdWRpb0NvbmZpZ3VyYXRpb25zKHBsYXllcl9maXh0dXJlLCAmY29uZmlnc19hZnRlcl9lbmQpKTsKKyAgQVNTRVJUX0VRKGNvbmZpZ3NfYWZ0ZXJfcHJlc2VudGluZywgY29uZmlnc19hZnRlcl9lbmQpOworfQorCitURVNUX1AoU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0LCBOb0lucHV0KSB7CisgIFNiUGxheWVyVGVzdEZpeHR1cmUgcGxheWVyX2ZpeHR1cmUoR2V0UGFyYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXyk7CisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24+IGluaXRpYWxfY29uZmlnczsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBSZWFkQXVkaW9Db25maWd1cmF0aW9ucyhwbGF5ZXJfZml4dHVyZSwgJmluaXRpYWxfY29uZmlncykpOworCisgIEdyb3VwZWRTYW1wbGVzIHNhbXBsZXM7CisgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNBdWRpbygpKSB7CisgICAgc2FtcGxlcy5BZGRBdWRpb0VPUygpOworICB9CisgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNWaWRlbygpKSB7CisgICAgc2FtcGxlcy5BZGRWaWRlb0VPUygpOworICB9CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldyaXRlKHNhbXBsZXMpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV2FpdEZvclBsYXllclByZXNlbnRpbmcoKSk7CisKKyAgc3RkOjp2ZWN0b3I8U2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbj4gY29uZmlnc19hZnRlcl9wcmVzZW50aW5nOworICAvLyBOb3RlIHRoYXQgYXMgd2UgZGlkbid0IHdyaXRlIGFueSBhdWRpbyBpbnB1dCwgfGNvbmZpZ3NfYWZ0ZXJfcHJlc2VudGluZ3wKKyAgLy8gY291bGQgYmUgZW1wdHkuCisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgUmVhZEF1ZGlvQ29uZmlndXJhdGlvbnMocGxheWVyX2ZpeHR1cmUsICZjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcpKTsKKworICBpZiAoIWluaXRpYWxfY29uZmlncy5lbXB0eSgpKSB7CisgICAgQVNTRVJUX0VRKGluaXRpYWxfY29uZmlncywgY29uZmlnc19hZnRlcl9wcmVzZW50aW5nKTsKKyAgfQorCisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJFbmRPZlN0cmVhbSgpKTsKKworICBzdGQ6OnZlY3RvcjxTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uPiBjb25maWdzX2FmdGVyX2VuZDsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBSZWFkQXVkaW9Db25maWd1cmF0aW9ucyhwbGF5ZXJfZml4dHVyZSwgJmNvbmZpZ3NfYWZ0ZXJfZW5kKSk7CisgIEFTU0VSVF9FUShjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcsIGNvbmZpZ3NfYWZ0ZXJfZW5kKTsKK30KKworVEVTVF9QKFNiUGxheWVyR2V0QXVkaW9Db25maWd1cmF0aW9uVGVzdCwgTXVsdGlwbGVTZWVrcykgeworICBjb25zdCBpbnQga1NhbXBsZXNUb1dyaXRlID0gODsKKworICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnZlY3RvcjxTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uPiBpbml0aWFsX2NvbmZpZ3M7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgUmVhZEF1ZGlvQ29uZmlndXJhdGlvbnMocGxheWVyX2ZpeHR1cmUsICZpbml0aWFsX2NvbmZpZ3MpKTsKKworICBHcm91cGVkU2FtcGxlcyBzYW1wbGVzOworICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgeworICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKDAsIGtTYW1wbGVzVG9Xcml0ZSk7CisgICAgc2FtcGxlcy5BZGRBdWRpb0VPUygpOworICB9CisgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNWaWRlbygpKSB7CisgICAgc2FtcGxlcy5BZGRWaWRlb1NhbXBsZXMoMCwga1NhbXBsZXNUb1dyaXRlKTsKKyAgICBzYW1wbGVzLkFkZFZpZGVvRU9TKCk7CisgIH0KKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV3JpdGUoc2FtcGxlcykpOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5XYWl0Rm9yUGxheWVyUHJlc2VudGluZygpKTsKKworICBzdGQ6OnZlY3RvcjxTYk1lZGlhQXVkaW9Db25maWd1cmF0aW9uPiBjb25maWdzX2FmdGVyX3ByZXNlbnRpbmc7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgUmVhZEF1ZGlvQ29uZmlndXJhdGlvbnMocGxheWVyX2ZpeHR1cmUsICZjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcpKTsKKworICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgeworICAgIEFTU0VSVF9GQUxTRShjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcuZW1wdHkoKSk7CisgIH0KKworICBpZiAoIWluaXRpYWxfY29uZmlncy5lbXB0eSgpKSB7CisgICAgQVNTRVJUX0VRKGluaXRpYWxfY29uZmlncywgY29uZmlnc19hZnRlcl9wcmVzZW50aW5nKTsKKyAgfQorCisgIGNvbnN0IFNiVGltZSBzZWVrX3RvX3RpbWUgPSBrU2JUaW1lU2Vjb25kOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5TZWVrKHNlZWtfdG9fdGltZSkpOworCisgIHN0ZDo6dmVjdG9yPFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24+IGNvbmZpZ3NfYWZ0ZXJfc2VlazsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICBSZWFkQXVkaW9Db25maWd1cmF0aW9ucyhwbGF5ZXJfZml4dHVyZSwgJmNvbmZpZ3NfYWZ0ZXJfc2VlaykpOworICBBU1NFUlRfRVEoY29uZmlnc19hZnRlcl9wcmVzZW50aW5nLCBjb25maWdzX2FmdGVyX3NlZWspOworCisgIHNhbXBsZXMgPSBHcm91cGVkU2FtcGxlcygpOworICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgeworICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKAorICAgICAgICAwLCBwbGF5ZXJfZml4dHVyZS5Db252ZXJ0RHVyYXRpb25Ub0F1ZGlvQnVmZmVyQ291bnQoc2Vla190b190aW1lKSArCisgICAgICAgICAgICAgICBrU2FtcGxlc1RvV3JpdGUpOworICAgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKKyAgfQorICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzVmlkZW8oKSkgeworICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzKAorICAgICAgICAwLCBwbGF5ZXJfZml4dHVyZS5Db252ZXJ0RHVyYXRpb25Ub1ZpZGVvQnVmZmVyQ291bnQoc2Vla190b190aW1lKSArCisgICAgICAgICAgICAgICBrU2FtcGxlc1RvV3JpdGUpOworICAgIHNhbXBsZXMuQWRkVmlkZW9FT1MoKTsKKyAgfQorICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJQcmVzZW50aW5nKCkpOworCisgIGNvbmZpZ3NfYWZ0ZXJfcHJlc2VudGluZy5jbGVhcigpOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgIFJlYWRBdWRpb0NvbmZpZ3VyYXRpb25zKHBsYXllcl9maXh0dXJlLCAmY29uZmlnc19hZnRlcl9wcmVzZW50aW5nKSk7CisgIEFTU0VSVF9FUShjb25maWdzX2FmdGVyX3ByZXNlbnRpbmcsIGNvbmZpZ3NfYWZ0ZXJfc2Vlayk7CisKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV2FpdEZvclBsYXllckVuZE9mU3RyZWFtKCkpOworCisgIHN0ZDo6dmVjdG9yPFNiTWVkaWFBdWRpb0NvbmZpZ3VyYXRpb24+IGNvbmZpZ3NfYWZ0ZXJfZW5kOworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgIFJlYWRBdWRpb0NvbmZpZ3VyYXRpb25zKHBsYXllcl9maXh0dXJlLCAmY29uZmlnc19hZnRlcl9lbmQpKTsKKyAgQVNTRVJUX0VRKGNvbmZpZ3NfYWZ0ZXJfcHJlc2VudGluZywgY29uZmlnc19hZnRlcl9lbmQpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTYlBsYXllckdldEF1ZGlvQ29uZmlndXJhdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0U3VwcG9ydGVkU2JQbGF5ZXJUZXN0Q29uZmlncygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFNiUGxheWVyVGVzdENvbmZpZ05hbWUpOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBucGxiCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTUKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ucGxiL3BsYXllcl9nZXRfcHJlZmVycmVkX291dHB1dF9tb2RlX3Rlc3QuY2MgYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfZ2V0X3ByZWZlcnJlZF9vdXRwdXRfbW9kZV90ZXN0LmNjCmluZGV4IGEzNzI0YmMuLjViOWM3NDUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ucGxiL3BsYXllcl9nZXRfcHJlZmVycmVkX291dHB1dF9tb2RlX3Rlc3QuY2MKKysrIGIvc3RhcmJvYXJkL25wbGIvcGxheWVyX2dldF9wcmVmZXJyZWRfb3V0cHV0X21vZGVfdGVzdC5jYwpAQCAtMjIsMTMgKzIyLDYgQEAKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CiAKLVNiUGxheWVyT3V0cHV0TW9kZSBHZXRQcmVmZXJyZWRPdXRwdXRNb2RlKAotICAgIGNvbnN0IFBsYXllckNyZWF0aW9uUGFyYW0mIGNyZWF0aW9uX3BhcmFtKSB7Ci0gIFNiUGxheWVyQ3JlYXRpb25QYXJhbSBwYXJhbSA9IHt9OwotICBjcmVhdGlvbl9wYXJhbS5Db252ZXJ0VG8oJnBhcmFtKTsKLSAgcmV0dXJuIFNiUGxheWVyR2V0UHJlZmVycmVkT3V0cHV0TW9kZSgmcGFyYW0pOwotfQotCiBURVNUKFNiUGxheWVyR2V0UHJlZmVycmVkT3V0cHV0TW9kZVRlc3QsIFN1bm55RGF5KSB7CiAgIGF1dG8gY3JlYXRpb25fcGFyYW0gPQogICAgICAgQ3JlYXRlUGxheWVyQ3JlYXRpb25QYXJhbShrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF9maXh0dXJlLmNjIGIvc3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfZml4dHVyZS5jYwppbmRleCA5ZDgyNzNlLi43NzAzZGNkIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF9maXh0dXJlLmNjCisrKyBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X2ZpeHR1cmUuY2MKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF9maXh0dXJlLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zdHJpbmcuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9kcm1faGVscGVycy5oIgpAQCAtMjYsNiArMjcsMTYyIEBACiB1c2luZyBzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wUmVhZGVyOwogdXNpbmcgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyOwogCit1c2luZyBHcm91cGVkU2FtcGxlcyA9IFNiUGxheWVyVGVzdEZpeHR1cmU6Okdyb3VwZWRTYW1wbGVzOwordXNpbmcgQXVkaW9TYW1wbGVzRGVzY3JpcHRvciA9IEdyb3VwZWRTYW1wbGVzOjpBdWRpb1NhbXBsZXNEZXNjcmlwdG9yOwordXNpbmcgVmlkZW9TYW1wbGVzRGVzY3JpcHRvciA9IEdyb3VwZWRTYW1wbGVzOjpWaWRlb1NhbXBsZXNEZXNjcmlwdG9yOworCisvLyBUT0RPOiBSZWZpbmUgdGhlIGltcGxlbWVudGF0aW9uLgorY2xhc3MgU2JQbGF5ZXJUZXN0Rml4dHVyZTo6R3JvdXBlZFNhbXBsZXNJdGVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBHcm91cGVkU2FtcGxlc0l0ZXJhdG9yKGNvbnN0IEdyb3VwZWRTYW1wbGVzJiBncm91cGVkX3NhbXBsZXMpCisgICAgICA6IGdyb3VwZWRfc2FtcGxlc18oZ3JvdXBlZF9zYW1wbGVzKSB7fQorCisgIGJvb2wgSGFzTW9yZUF1ZGlvKCkgY29uc3QgeworICAgIHJldHVybiBhdWRpb19zYW1wbGVzX2luZGV4XyA8IGdyb3VwZWRfc2FtcGxlc18uYXVkaW9fc2FtcGxlc18uc2l6ZSgpOworICB9CisKKyAgYm9vbCBIYXNNb3JlVmlkZW8oKSBjb25zdCB7CisgICAgcmV0dXJuIHZpZGVvX3NhbXBsZXNfaW5kZXhfIDwgZ3JvdXBlZF9zYW1wbGVzXy52aWRlb19zYW1wbGVzXy5zaXplKCk7CisgIH0KKworICBBdWRpb1NhbXBsZXNEZXNjcmlwdG9yIEdldEN1cnJlbnRBdWRpb1NhbXBsZXNUb1dyaXRlKCkgY29uc3QgeworICAgIFNCX0RDSEVDSyhIYXNNb3JlQXVkaW8oKSk7CisgICAgQXVkaW9TYW1wbGVzRGVzY3JpcHRvciBkZXNjcmlwdG9yID0KKyAgICAgICAgZ3JvdXBlZF9zYW1wbGVzXy5hdWRpb19zYW1wbGVzX1thdWRpb19zYW1wbGVzX2luZGV4X107CisgICAgZGVzY3JpcHRvci5zdGFydF9pbmRleCArPSBjdXJyZW50X3dyaXR0ZW5fYXVkaW9fc2FtcGxlc187CisgICAgZGVzY3JpcHRvci5zYW1wbGVzX2NvdW50IC09IGN1cnJlbnRfd3JpdHRlbl9hdWRpb19zYW1wbGVzXzsKKyAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgfQorCisgIFZpZGVvU2FtcGxlc0Rlc2NyaXB0b3IgR2V0Q3VycmVudFZpZGVvU2FtcGxlc1RvV3JpdGUoKSBjb25zdCB7CisgICAgU0JfRENIRUNLKEhhc01vcmVWaWRlbygpKTsKKyAgICBWaWRlb1NhbXBsZXNEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQorICAgICAgICBncm91cGVkX3NhbXBsZXNfLnZpZGVvX3NhbXBsZXNfW3ZpZGVvX3NhbXBsZXNfaW5kZXhfXTsKKyAgICBkZXNjcmlwdG9yLnN0YXJ0X2luZGV4ICs9IGN1cnJlbnRfd3JpdHRlbl92aWRlb19zYW1wbGVzXzsKKyAgICBkZXNjcmlwdG9yLnNhbXBsZXNfY291bnQgLT0gY3VycmVudF93cml0dGVuX3ZpZGVvX3NhbXBsZXNfOworICAgIHJldHVybiBkZXNjcmlwdG9yOworICB9CisKKyAgdm9pZCBBZHZhbmNlQXVkaW8oaW50IHNhbXBsZXNfY291bnQpIHsKKyAgICBTQl9EQ0hFQ0soSGFzTW9yZUF1ZGlvKCkpOworICAgIGlmIChncm91cGVkX3NhbXBsZXNfLmF1ZGlvX3NhbXBsZXNfW2F1ZGlvX3NhbXBsZXNfaW5kZXhfXQorICAgICAgICAgICAgLmlzX2VuZF9vZl9zdHJlYW0pIHsKKyAgICAgIC8vIEZvciBFT1MsIHxzYW1wbGVzX2NvdW50fCBtdXN0IGJlIDEuCisgICAgICBTQl9EQ0hFQ0soc2FtcGxlc19jb3VudCA9PSAxKTsKKyAgICAgIFNCX0RDSEVDSyhjdXJyZW50X3dyaXR0ZW5fYXVkaW9fc2FtcGxlc18gPT0gMCk7CisgICAgICBhdWRpb19zYW1wbGVzX2luZGV4XysrOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNCX0RDSEVDSygKKyAgICAgICAgY3VycmVudF93cml0dGVuX2F1ZGlvX3NhbXBsZXNfICsgc2FtcGxlc19jb3VudCA8PQorICAgICAgICBncm91cGVkX3NhbXBsZXNfLmF1ZGlvX3NhbXBsZXNfW2F1ZGlvX3NhbXBsZXNfaW5kZXhfXS5zYW1wbGVzX2NvdW50KTsKKworICAgIGN1cnJlbnRfd3JpdHRlbl9hdWRpb19zYW1wbGVzXyArPSBzYW1wbGVzX2NvdW50OworICAgIGlmIChjdXJyZW50X3dyaXR0ZW5fYXVkaW9fc2FtcGxlc18gPT0KKyAgICAgICAgZ3JvdXBlZF9zYW1wbGVzXy5hdWRpb19zYW1wbGVzX1thdWRpb19zYW1wbGVzX2luZGV4X10uc2FtcGxlc19jb3VudCkgeworICAgICAgYXVkaW9fc2FtcGxlc19pbmRleF8rKzsKKyAgICAgIGN1cnJlbnRfd3JpdHRlbl9hdWRpb19zYW1wbGVzXyA9IDA7CisgICAgfQorICB9CisKKyAgdm9pZCBBZHZhbmNlVmlkZW8oaW50IHNhbXBsZXNfY291bnQpIHsKKyAgICBTQl9EQ0hFQ0soSGFzTW9yZVZpZGVvKCkpOworICAgIGlmIChncm91cGVkX3NhbXBsZXNfLnZpZGVvX3NhbXBsZXNfW3ZpZGVvX3NhbXBsZXNfaW5kZXhfXQorICAgICAgICAgICAgLmlzX2VuZF9vZl9zdHJlYW0pIHsKKyAgICAgIC8vIEZvciBFT1MsIHxzYW1wbGVzX2NvdW50fCBtdXN0IGJlIDEuCisgICAgICBTQl9EQ0hFQ0soc2FtcGxlc19jb3VudCA9PSAxKTsKKyAgICAgIFNCX0RDSEVDSyhjdXJyZW50X3dyaXR0ZW5fdmlkZW9fc2FtcGxlc18gPT0gMCk7CisgICAgICB2aWRlb19zYW1wbGVzX2luZGV4XysrOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNCX0RDSEVDSygKKyAgICAgICAgY3VycmVudF93cml0dGVuX3ZpZGVvX3NhbXBsZXNfICsgc2FtcGxlc19jb3VudCA8PQorICAgICAgICBncm91cGVkX3NhbXBsZXNfLnZpZGVvX3NhbXBsZXNfW3ZpZGVvX3NhbXBsZXNfaW5kZXhfXS5zYW1wbGVzX2NvdW50KTsKKworICAgIGN1cnJlbnRfd3JpdHRlbl92aWRlb19zYW1wbGVzXyArPSBzYW1wbGVzX2NvdW50OworICAgIGlmIChjdXJyZW50X3dyaXR0ZW5fdmlkZW9fc2FtcGxlc18gPT0KKyAgICAgICAgZ3JvdXBlZF9zYW1wbGVzXy52aWRlb19zYW1wbGVzX1t2aWRlb19zYW1wbGVzX2luZGV4X10uc2FtcGxlc19jb3VudCkgeworICAgICAgdmlkZW9fc2FtcGxlc19pbmRleF8rKzsKKyAgICAgIGN1cnJlbnRfd3JpdHRlbl92aWRlb19zYW1wbGVzXyA9IDA7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBjb25zdCBHcm91cGVkU2FtcGxlcyYgZ3JvdXBlZF9zYW1wbGVzXzsKKyAgaW50IGF1ZGlvX3NhbXBsZXNfaW5kZXhfID0gMDsKKyAgaW50IGN1cnJlbnRfd3JpdHRlbl9hdWRpb19zYW1wbGVzXyA9IDA7CisgIGludCB2aWRlb19zYW1wbGVzX2luZGV4XyA9IDA7CisgIGludCBjdXJyZW50X3dyaXR0ZW5fdmlkZW9fc2FtcGxlc18gPSAwOworfTsKKworR3JvdXBlZFNhbXBsZXMmIEdyb3VwZWRTYW1wbGVzOjpBZGRBdWRpb1NhbXBsZXMoaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcl9vZl9zYW1wbGVzKSB7CisgIEFkZEF1ZGlvU2FtcGxlcyhzdGFydF9pbmRleCwgbnVtYmVyX29mX3NhbXBsZXMsIDAsIDAsIDApOworICByZXR1cm4gKnRoaXM7Cit9CisKK0dyb3VwZWRTYW1wbGVzJiBHcm91cGVkU2FtcGxlczo6QWRkQXVkaW9TYW1wbGVzKAorICAgIGludCBzdGFydF9pbmRleCwKKyAgICBpbnQgbnVtYmVyX29mX3NhbXBsZXMsCisgICAgU2JUaW1lIHRpbWVzdGFtcF9vZmZzZXQsCisgICAgU2JUaW1lIGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250LAorICAgIFNiVGltZSBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrKSB7CisgIFNCX0RDSEVDSyhzdGFydF9pbmRleCA+PSAwKTsKKyAgU0JfRENIRUNLKG51bWJlcl9vZl9zYW1wbGVzID49IDApOworICBTQl9EQ0hFQ0soYXVkaW9fc2FtcGxlc18uZW1wdHkoKSB8fCAhYXVkaW9fc2FtcGxlc18uYmFjaygpLmlzX2VuZF9vZl9zdHJlYW0pOworICAvLyBDdXJyZW50bHksIHRoZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHdyaXRpbmcgb25lIHNhbXBsZSBhdCBhIHRpbWUKKyAgLy8gaWYgfGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250fCBvciB8ZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFja3wgaXMgbm90CisgIC8vIDAuCisgIFNCX0RDSEVDSyhkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9mcm9udCA9PSAwIHx8IG51bWJlcl9vZl9zYW1wbGVzID09IDEpOworICBTQl9EQ0hFQ0soZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFjayA9PSAwIHx8IG51bWJlcl9vZl9zYW1wbGVzID09IDEpOworCisgIEF1ZGlvU2FtcGxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgZGVzY3JpcHRvci5zdGFydF9pbmRleCA9IHN0YXJ0X2luZGV4OworICBkZXNjcmlwdG9yLnNhbXBsZXNfY291bnQgPSBudW1iZXJfb2Zfc2FtcGxlczsKKyAgZGVzY3JpcHRvci50aW1lc3RhbXBfb2Zmc2V0ID0gdGltZXN0YW1wX29mZnNldDsKKyAgZGVzY3JpcHRvci5kaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9mcm9udCA9IGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250OworICBkZXNjcmlwdG9yLmRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2JhY2sgPSBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrOworICBhdWRpb19zYW1wbGVzXy5wdXNoX2JhY2soZGVzY3JpcHRvcik7CisKKyAgcmV0dXJuICp0aGlzOworfQorCitHcm91cGVkU2FtcGxlcyYgR3JvdXBlZFNhbXBsZXM6OkFkZEF1ZGlvRU9TKCkgeworICBTQl9EQ0hFQ0soYXVkaW9fc2FtcGxlc18uZW1wdHkoKSB8fCAhYXVkaW9fc2FtcGxlc18uYmFjaygpLmlzX2VuZF9vZl9zdHJlYW0pOworCisgIEF1ZGlvU2FtcGxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgZGVzY3JpcHRvci5pc19lbmRfb2Zfc3RyZWFtID0gdHJ1ZTsKKyAgYXVkaW9fc2FtcGxlc18ucHVzaF9iYWNrKGRlc2NyaXB0b3IpOworCisgIHJldHVybiAqdGhpczsKK30KKworR3JvdXBlZFNhbXBsZXMmIEdyb3VwZWRTYW1wbGVzOjpBZGRWaWRlb1NhbXBsZXMoaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcl9vZl9zYW1wbGVzKSB7CisgIFNCX0RDSEVDSyhzdGFydF9pbmRleCA+PSAwKTsKKyAgU0JfRENIRUNLKG51bWJlcl9vZl9zYW1wbGVzID49IDApOworICBTQl9EQ0hFQ0sodmlkZW9fc2FtcGxlc18uZW1wdHkoKSB8fCAhdmlkZW9fc2FtcGxlc18uYmFjaygpLmlzX2VuZF9vZl9zdHJlYW0pOworCisgIFZpZGVvU2FtcGxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgZGVzY3JpcHRvci5zdGFydF9pbmRleCA9IHN0YXJ0X2luZGV4OworICBkZXNjcmlwdG9yLnNhbXBsZXNfY291bnQgPSBudW1iZXJfb2Zfc2FtcGxlczsKKyAgdmlkZW9fc2FtcGxlc18ucHVzaF9iYWNrKGRlc2NyaXB0b3IpOworCisgIHJldHVybiAqdGhpczsKK30KKworR3JvdXBlZFNhbXBsZXMmIEdyb3VwZWRTYW1wbGVzOjpBZGRWaWRlb0VPUygpIHsKKyAgU0JfRENIRUNLKHZpZGVvX3NhbXBsZXNfLmVtcHR5KCkgfHwgIXZpZGVvX3NhbXBsZXNfLmJhY2soKS5pc19lbmRfb2Zfc3RyZWFtKTsKKworICBWaWRlb1NhbXBsZXNEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgIGRlc2NyaXB0b3IuaXNfZW5kX29mX3N0cmVhbSA9IHRydWU7CisgIHZpZGVvX3NhbXBsZXNfLnB1c2hfYmFjayhkZXNjcmlwdG9yKTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKIFNiUGxheWVyVGVzdEZpeHR1cmU6OkNhbGxiYWNrRXZlbnQ6OkNhbGxiYWNrRXZlbnQoKSA6IGV2ZW50X3R5cGUoa0VtcHR5RXZlbnQpIHt9CiAKIFNiUGxheWVyVGVzdEZpeHR1cmU6OkNhbGxiYWNrRXZlbnQ6OkNhbGxiYWNrRXZlbnQoU2JQbGF5ZXIgcGxheWVyLApAQCAtNDYsMTMgKzIwMywxOCBAQAogICAgICAgcGxheWVyX3N0YXRlKHN0YXRlKSwKICAgICAgIHRpY2tldCh0aWNrZXQpIHt9CiAKLVNiUGxheWVyVGVzdEZpeHR1cmU6OlNiUGxheWVyVGVzdEZpeHR1cmUoY29uc3QgU2JQbGF5ZXJUZXN0Q29uZmlnJiBjb25maWcpCi0gICAgOiBvdXRwdXRfbW9kZV8oc3RkOjpnZXQ8Mj4oY29uZmlnKSksIGtleV9zeXN0ZW1fKHN0ZDo6Z2V0PDM+KGNvbmZpZykpIHsKK1NiUGxheWVyVGVzdEZpeHR1cmU6OlNiUGxheWVyVGVzdEZpeHR1cmUoCisgICAgY29uc3QgU2JQbGF5ZXJUZXN0Q29uZmlnJiBjb25maWcsCisgICAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIpCisgICAgOiBvdXRwdXRfbW9kZV8oY29uZmlnLm91dHB1dF9tb2RlKSwKKyAgICAgIGtleV9zeXN0ZW1fKGNvbmZpZy5rZXlfc3lzdGVtKSwKKyAgICAgIG1heF92aWRlb19jYXBhYmlsaXRpZXNfKGNvbmZpZy5tYXhfdmlkZW9fY2FwYWJpbGl0aWVzKSwKKyAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8oZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKSB7CiAgIFNCX0RDSEVDSyhvdXRwdXRfbW9kZV8gPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSB8fAogICAgICAgICAgICAgb3V0cHV0X21vZGVfID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCk7CiAKLSAgY29uc3QgY2hhciogYXVkaW9fZG1wX2ZpbGVuYW1lID0gc3RkOjpnZXQ8MD4oY29uZmlnKTsKLSAgY29uc3QgY2hhciogdmlkZW9fZG1wX2ZpbGVuYW1lID0gc3RkOjpnZXQ8MT4oY29uZmlnKTsKKyAgY29uc3QgY2hhciogYXVkaW9fZG1wX2ZpbGVuYW1lID0gY29uZmlnLmF1ZGlvX2ZpbGVuYW1lOworICBjb25zdCBjaGFyKiB2aWRlb19kbXBfZmlsZW5hbWUgPSBjb25maWcudmlkZW9fZmlsZW5hbWU7CiAKICAgaWYgKGF1ZGlvX2RtcF9maWxlbmFtZSAmJiBzdHJsZW4oYXVkaW9fZG1wX2ZpbGVuYW1lKSA+IDApIHsKICAgICBhdWRpb19kbXBfcmVhZGVyXy5yZXNldChuZXcgVmlkZW9EbXBSZWFkZXIoCkBAIC0xMDIsNzUgKzI2NCw3NyBAQAogCiAgIEFTU0VSVF9GQUxTRShlcnJvcl9vY2N1cnJlZF8pOwogCi0gIGludCBhdWRpb19zdGFydF9pbmRleCA9IGdyb3VwZWRfc2FtcGxlcy5hdWRpb19zdGFydF9pbmRleCgpOwotICBpbnQgYXVkaW9fc2FtcGxlc190b193cml0ZSA9IGdyb3VwZWRfc2FtcGxlcy5hdWRpb19zYW1wbGVzX3RvX3dyaXRlKCk7Ci0gIGludCB2aWRlb19zdGFydF9pbmRleCA9IGdyb3VwZWRfc2FtcGxlcy52aWRlb19zdGFydF9pbmRleCgpOwotICBpbnQgdmlkZW9fc2FtcGxlc190b193cml0ZSA9IGdyb3VwZWRfc2FtcGxlcy52aWRlb19zYW1wbGVzX3RvX3dyaXRlKCk7Ci0gIGJvb2wgd3JpdGVfYXVkaW9fZW9zID0gZ3JvdXBlZF9zYW1wbGVzLndyaXRlX2F1ZGlvX2VvcygpOwotICBib29sIHdyaXRlX3ZpZGVvX2VvcyA9IGdyb3VwZWRfc2FtcGxlcy53cml0ZV92aWRlb19lb3MoKTsKLQotICBTQl9EQ0hFQ0soYXVkaW9fc3RhcnRfaW5kZXggPj0gMCk7Ci0gIFNCX0RDSEVDSyhhdWRpb19zYW1wbGVzX3RvX3dyaXRlID49IDApOwotICBTQl9EQ0hFQ0sodmlkZW9fc3RhcnRfaW5kZXggPj0gMCk7Ci0gIFNCX0RDSEVDSyh2aWRlb19zYW1wbGVzX3RvX3dyaXRlID49IDApOwotICBpZiAoYXVkaW9fc2FtcGxlc190b193cml0ZSA+IDAgfHwgd3JpdGVfYXVkaW9fZW9zKSB7Ci0gICAgU0JfRENIRUNLKGF1ZGlvX2RtcF9yZWFkZXJfKTsKLSAgfQotICBpZiAodmlkZW9fc2FtcGxlc190b193cml0ZSA+IDAgfHwgd3JpdGVfdmlkZW9fZW9zKSB7Ci0gICAgU0JfRENIRUNLKHZpZGVvX2RtcF9yZWFkZXJfKTsKLSAgfQotCiAgIGludCBtYXhfYXVkaW9fc2FtcGxlc19wZXJfd3JpdGUgPQogICAgICAgU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUocGxheWVyXywga1NiTWVkaWFUeXBlQXVkaW8pOwogICBpbnQgbWF4X3ZpZGVvX3NhbXBsZXNfcGVyX3dyaXRlID0KICAgICAgIFNiUGxheWVyR2V0TWF4aW11bU51bWJlck9mU2FtcGxlc1BlcldyaXRlKHBsYXllcl8sIGtTYk1lZGlhVHlwZVZpZGVvKTsKIAotICAvLyBDYXAgdGhlIHNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIGVuZCBvZiB0aGUgZG1wIGZpbGVzLgotICBpZiAoYXVkaW9fc2FtcGxlc190b193cml0ZSA+IDApIHsKLSAgICBhdWRpb19zYW1wbGVzX3RvX3dyaXRlID0gc3RkOjptaW48aW50PigKLSAgICAgICAgYXVkaW9fc2FtcGxlc190b193cml0ZSwKLSAgICAgICAgYXVkaW9fZG1wX3JlYWRlcl8tPm51bWJlcl9vZl9hdWRpb19idWZmZXJzKCkgLSBhdWRpb19zdGFydF9pbmRleCk7Ci0gIH0KLSAgaWYgKHZpZGVvX3NhbXBsZXNfdG9fd3JpdGUgPiAwKSB7Ci0gICAgdmlkZW9fc2FtcGxlc190b193cml0ZSA9IHN0ZDo6bWluPGludD4oCi0gICAgICAgIHZpZGVvX3NhbXBsZXNfdG9fd3JpdGUsCi0gICAgICAgIHZpZGVvX2RtcF9yZWFkZXJfLT5udW1iZXJfb2ZfdmlkZW9fYnVmZmVycygpIC0gdmlkZW9fc3RhcnRfaW5kZXgpOwotICB9CisgIEdyb3VwZWRTYW1wbGVzSXRlcmF0b3IgaXRlcmF0b3IoZ3JvdXBlZF9zYW1wbGVzKTsKKyAgU0JfRENIRUNLKCFpdGVyYXRvci5IYXNNb3JlQXVkaW8oKSB8fCBhdWRpb19kbXBfcmVhZGVyXyk7CisgIFNCX0RDSEVDSyghaXRlcmF0b3IuSGFzTW9yZVZpZGVvKCkgfHwgdmlkZW9fZG1wX3JlYWRlcl8pOwogCi0gIGJvb2wgaGFzX21vcmVfYXVkaW8gPSBhdWRpb19zYW1wbGVzX3RvX3dyaXRlID4gMCB8fCB3cml0ZV9hdWRpb19lb3M7Ci0gIGJvb2wgaGFzX21vcmVfdmlkZW8gPSB2aWRlb19zYW1wbGVzX3RvX3dyaXRlID4gMCB8fCB3cml0ZV92aWRlb19lb3M7Ci0gIHdoaWxlIChoYXNfbW9yZV9hdWRpbyB8fCBoYXNfbW9yZV92aWRlbykgewotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JEZWNvZGVyU3RhdGVOZWVkc0RhdGEoKSk7Ci0gICAgaWYgKGNhbl9hY2NlcHRfbW9yZV9hdWRpb19kYXRhXyAmJiBoYXNfbW9yZV9hdWRpbykgewotICAgICAgaWYgKGF1ZGlvX3NhbXBsZXNfdG9fd3JpdGUgPiAwKSB7Ci0gICAgICAgIGF1dG8gc2FtcGxlc190b193cml0ZSA9Ci0gICAgICAgICAgICBzdGQ6Om1pbihtYXhfYXVkaW9fc2FtcGxlc19wZXJfd3JpdGUsIGF1ZGlvX3NhbXBsZXNfdG9fd3JpdGUpOwotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShXcml0ZVNhbXBsZXMoCi0gICAgICAgICAgICBrU2JNZWRpYVR5cGVBdWRpbywgYXVkaW9fc3RhcnRfaW5kZXgsIHNhbXBsZXNfdG9fd3JpdGUpKTsKLSAgICAgICAgYXVkaW9fc3RhcnRfaW5kZXggKz0gc2FtcGxlc190b193cml0ZTsKLSAgICAgICAgYXVkaW9fc2FtcGxlc190b193cml0ZSAtPSBzYW1wbGVzX3RvX3dyaXRlOwotICAgICAgfSBlbHNlIGlmICghYXVkaW9fZW5kX29mX3N0cmVhbV93cml0dGVuXyAmJiB3cml0ZV9hdWRpb19lb3MpIHsKKyAgY29uc3QgU2JUaW1lIGtEZWZhdWx0V3JpdGVUaW1lb3V0ID0ga1NiVGltZVNlY29uZCAqIDU7CisKKyAgU2JUaW1lTW9ub3RvbmljIHN0YXJ0ID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7CisgIHdoaWxlIChTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIHN0YXJ0IDwga0RlZmF1bHRXcml0ZVRpbWVvdXQpIHsKKyAgICBpZiAoQ2FuV3JpdGVNb3JlQXVkaW9EYXRhKCkgJiYgaXRlcmF0b3IuSGFzTW9yZUF1ZGlvKCkpIHsKKyAgICAgIGF1dG8gZGVzY3JpcHRvciA9IGl0ZXJhdG9yLkdldEN1cnJlbnRBdWRpb1NhbXBsZXNUb1dyaXRlKCk7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc19lbmRfb2Zfc3RyZWFtKSB7CisgICAgICAgIFNCX0RDSEVDSyghYXVkaW9fZW5kX29mX3N0cmVhbV93cml0dGVuXyk7CiAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdyaXRlRW5kT2ZTdHJlYW0oa1NiTWVkaWFUeXBlQXVkaW8pKTsKKyAgICAgICAgaXRlcmF0b3IuQWR2YW5jZUF1ZGlvKDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU0JfRENIRUNLKGRlc2NyaXB0b3Iuc2FtcGxlc19jb3VudCA+IDApOworICAgICAgICBTQl9EQ0hFQ0soZGVzY3JpcHRvci5zdGFydF9pbmRleCArIGRlc2NyaXB0b3Iuc2FtcGxlc19jb3VudCA8CisgICAgICAgICAgICAgICAgICBhdWRpb19kbXBfcmVhZGVyXy0+bnVtYmVyX29mX2F1ZGlvX2J1ZmZlcnMoKSkKKyAgICAgICAgICAgIDw8ICJBdWRpbyBkbXAgZmlsZSBpcyBub3QgbG9uZyBlbm91Z2ggdG8gZmluaXNoIHRoZSB0ZXN0LiI7CisKKyAgICAgICAgYXV0byBzYW1wbGVzX3RvX3dyaXRlID0KKyAgICAgICAgICAgIHN0ZDo6bWluKG1heF9hdWRpb19zYW1wbGVzX3Blcl93cml0ZSwgZGVzY3JpcHRvci5zYW1wbGVzX2NvdW50KTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBXcml0ZUF1ZGlvU2FtcGxlcyhkZXNjcmlwdG9yLnN0YXJ0X2luZGV4LCBzYW1wbGVzX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci50aW1lc3RhbXBfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5kaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9mcm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFjaykpOworICAgICAgICBpdGVyYXRvci5BZHZhbmNlQXVkaW8oc2FtcGxlc190b193cml0ZSk7CiAgICAgICB9Ci0gICAgICBoYXNfbW9yZV9hdWRpbyA9IGF1ZGlvX3NhbXBsZXNfdG9fd3JpdGUgPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICghYXVkaW9fZW5kX29mX3N0cmVhbV93cml0dGVuXyAmJiB3cml0ZV9hdWRpb19lb3MpOworICAgIH0KKyAgICBpZiAoQ2FuV3JpdGVNb3JlVmlkZW9EYXRhKCkgJiYgaXRlcmF0b3IuSGFzTW9yZVZpZGVvKCkpIHsKKyAgICAgIGF1dG8gZGVzY3JpcHRvciA9IGl0ZXJhdG9yLkdldEN1cnJlbnRWaWRlb1NhbXBsZXNUb1dyaXRlKCk7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc19lbmRfb2Zfc3RyZWFtKSB7CisgICAgICAgIFNCX0RDSEVDSyghdmlkZW9fZW5kX29mX3N0cmVhbV93cml0dGVuXyk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdyaXRlRW5kT2ZTdHJlYW0oa1NiTWVkaWFUeXBlVmlkZW8pKTsKKyAgICAgICAgaXRlcmF0b3IuQWR2YW5jZVZpZGVvKDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU0JfRENIRUNLKGRlc2NyaXB0b3Iuc2FtcGxlc19jb3VudCA+IDApOworICAgICAgICBTQl9EQ0hFQ0soZGVzY3JpcHRvci5zdGFydF9pbmRleCArIGRlc2NyaXB0b3Iuc2FtcGxlc19jb3VudCA8CisgICAgICAgICAgICAgICAgICB2aWRlb19kbXBfcmVhZGVyXy0+bnVtYmVyX29mX3ZpZGVvX2J1ZmZlcnMoKSkKKyAgICAgICAgICAgIDw8ICJWaWRlbyBkbXAgZmlsZSBpcyBub3QgbG9uZyBlbm91Z2ggdG8gZmluaXNoIHRoZSB0ZXN0LiI7CisKKyAgICAgICAgYXV0byBzYW1wbGVzX3RvX3dyaXRlID0KKyAgICAgICAgICAgIHN0ZDo6bWluKG1heF92aWRlb19zYW1wbGVzX3Blcl93cml0ZSwgZGVzY3JpcHRvci5zYW1wbGVzX2NvdW50KTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBXcml0ZVZpZGVvU2FtcGxlcyhkZXNjcmlwdG9yLnN0YXJ0X2luZGV4LCBzYW1wbGVzX3RvX3dyaXRlKSk7CisgICAgICAgIGl0ZXJhdG9yLkFkdmFuY2VWaWRlbyhzYW1wbGVzX3RvX3dyaXRlKTsKKyAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoY2FuX2FjY2VwdF9tb3JlX3ZpZGVvX2RhdGFfICYmIGhhc19tb3JlX3ZpZGVvKSB7Ci0gICAgICBpZiAodmlkZW9fc2FtcGxlc190b193cml0ZSA+IDApIHsKLSAgICAgICAgYXV0byBzYW1wbGVzX3RvX3dyaXRlID0KLSAgICAgICAgICAgIHN0ZDo6bWluKG1heF92aWRlb19zYW1wbGVzX3Blcl93cml0ZSwgdmlkZW9fc2FtcGxlc190b193cml0ZSk7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdyaXRlU2FtcGxlcygKLSAgICAgICAgICAgIGtTYk1lZGlhVHlwZVZpZGVvLCB2aWRlb19zdGFydF9pbmRleCwgc2FtcGxlc190b193cml0ZSkpOwotICAgICAgICB2aWRlb19zdGFydF9pbmRleCArPSBzYW1wbGVzX3RvX3dyaXRlOwotICAgICAgICB2aWRlb19zYW1wbGVzX3RvX3dyaXRlIC09IHNhbXBsZXNfdG9fd3JpdGU7Ci0gICAgICB9IGVsc2UgaWYgKCF2aWRlb19lbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fICYmIHdyaXRlX3ZpZGVvX2VvcykgewotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShXcml0ZUVuZE9mU3RyZWFtKGtTYk1lZGlhVHlwZVZpZGVvKSk7Ci0gICAgICB9Ci0gICAgICBoYXNfbW9yZV92aWRlbyA9IHZpZGVvX3NhbXBsZXNfdG9fd3JpdGUgPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICghdmlkZW9fZW5kX29mX3N0cmVhbV93cml0dGVuXyAmJiB3cml0ZV92aWRlb19lb3MpOworICAgIGlmIChpdGVyYXRvci5IYXNNb3JlQXVkaW8oKSB8fCBpdGVyYXRvci5IYXNNb3JlVmlkZW8oKSkgeworICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoV2FpdEZvckRlY29kZXJTdGF0ZU5lZWRzRGF0YSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuOwogICAgIH0KICAgfQorCisgIEZBSUwoKSA8PCAiRmFpbGVkIHRvIHdyaXRlIGFsbCBzYW1wbGVzLiI7Cit9CisKK3ZvaWQgU2JQbGF5ZXJUZXN0Rml4dHVyZTo6V2FpdEZvclBsYXllclByZXNlbnRpbmcoKSB7CisgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisKKyAgQVNTRVJUX0ZBTFNFKGVycm9yX29jY3VycmVkXyk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JQbGF5ZXJTdGF0ZShrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmcpKTsKIH0KIAogdm9pZCBTYlBsYXllclRlc3RGaXh0dXJlOjpXYWl0Rm9yUGxheWVyRW5kT2ZTdHJlYW0oKSB7CkBAIC0xODMsNiArMzQ3LDQ2IEBACiAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JQbGF5ZXJTdGF0ZShrU2JQbGF5ZXJTdGF0ZUVuZE9mU3RyZWFtKSk7CiB9CiAKK1NiVGltZSBTYlBsYXllclRlc3RGaXh0dXJlOjpHZXRDdXJyZW50TWVkaWFUaW1lKCkgY29uc3QgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1CisgIFNiUGxheWVySW5mbyBpbmZvID0ge307CisgIFNiUGxheWVyR2V0SW5mbyhwbGF5ZXJfLCAmaW5mbyk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CisgIFNiUGxheWVySW5mbzIgaW5mbyA9IHt9OworICBTYlBsYXllckdldEluZm8yKHBsYXllcl8sICZpbmZvKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTUKKyAgcmV0dXJuIGluZm8uY3VycmVudF9tZWRpYV90aW1lc3RhbXA7Cit9CisKK3ZvaWQgU2JQbGF5ZXJUZXN0Rml4dHVyZTo6U2V0QXVkaW9Xcml0ZUR1cmF0aW9uKFNiVGltZSBkdXJhdGlvbikgeworICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIFNCX0RDSEVDSyhkdXJhdGlvbiA+IDApOworICBhdWRpb193cml0ZV9kdXJhdGlvbl8gPSBkdXJhdGlvbjsKK30KKworU2JUaW1lIFNiUGxheWVyVGVzdEZpeHR1cmU6OkdldEF1ZGlvU2FtcGxlVGltZXN0YW1wKGludCBpbmRleCkgY29uc3QgeworICBTQl9EQ0hFQ0soSGFzQXVkaW8oKSk7CisgIFNCX0RDSEVDSyhpbmRleCA8IGF1ZGlvX2RtcF9yZWFkZXJfLT5udW1iZXJfb2ZfYXVkaW9fYnVmZmVycygpKTsKKyAgcmV0dXJuIGF1ZGlvX2RtcF9yZWFkZXJfLT5HZXRQbGF5ZXJTYW1wbGVJbmZvKGtTYk1lZGlhVHlwZUF1ZGlvLCBpbmRleCkKKyAgICAgIC50aW1lc3RhbXA7Cit9CisKK2ludCBTYlBsYXllclRlc3RGaXh0dXJlOjpDb252ZXJ0RHVyYXRpb25Ub0F1ZGlvQnVmZmVyQ291bnQoCisgICAgU2JUaW1lIGR1cmF0aW9uKSBjb25zdCB7CisgIFNCX0RDSEVDSyhIYXNBdWRpbygpKTsKKyAgU0JfRENIRUNLKGF1ZGlvX2RtcF9yZWFkZXJfLT5udW1iZXJfb2ZfYXVkaW9fYnVmZmVycygpKTsKKyAgcmV0dXJuIGR1cmF0aW9uICogYXVkaW9fZG1wX3JlYWRlcl8tPm51bWJlcl9vZl9hdWRpb19idWZmZXJzKCkgLworICAgICAgICAgYXVkaW9fZG1wX3JlYWRlcl8tPmF1ZGlvX2R1cmF0aW9uKCk7Cit9CisKK2ludCBTYlBsYXllclRlc3RGaXh0dXJlOjpDb252ZXJ0RHVyYXRpb25Ub1ZpZGVvQnVmZmVyQ291bnQoCisgICAgU2JUaW1lIGR1cmF0aW9uKSBjb25zdCB7CisgIFNCX0RDSEVDSyhIYXNWaWRlbygpKTsKKyAgU0JfRENIRUNLKHZpZGVvX2RtcF9yZWFkZXJfLT5udW1iZXJfb2ZfdmlkZW9fYnVmZmVycygpKTsKKyAgcmV0dXJuIGR1cmF0aW9uICogdmlkZW9fZG1wX3JlYWRlcl8tPm51bWJlcl9vZl92aWRlb19idWZmZXJzKCkgLworICAgICAgICAgdmlkZW9fZG1wX3JlYWRlcl8tPnZpZGVvX2R1cmF0aW9uKCk7Cit9CisKIC8vIHN0YXRpYwogdm9pZCBTYlBsYXllclRlc3RGaXh0dXJlOjpEZWNvZGVyU3RhdHVzQ2FsbGJhY2soU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKQEAgLTI1NiwxMSArNDYwLDE0IEBACiAgIGlmICh2aWRlb19kbXBfcmVhZGVyXykgewogICAgIHZpZGVvX2NvZGVjID0gdmlkZW9fZG1wX3JlYWRlcl8tPnZpZGVvX2NvZGVjKCk7CiAgIH0KKworICAvLyBUT0RPOiByZWZpbmUgQ2FsbFNiUGxheWVyQ3JlYXRlKCkgdG8gdXNlIHJlYWwgdmlkZW8gc2FtcGxlIGluZm8uCiAgIHBsYXllcl8gPSBDYWxsU2JQbGF5ZXJDcmVhdGUoCi0gICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCB2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsCi0gICAgICBkcm1fc3lzdGVtXywgYXVkaW9fc3RyZWFtX2luZm8sICIiLCBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLAotICAgICAgRGVjb2RlclN0YXR1c0NhbGxiYWNrLCBQbGF5ZXJTdGF0dXNDYWxsYmFjaywgRXJyb3JDYWxsYmFjaywgdGhpcywKLSAgICAgIG91dHB1dF9tb2RlXywgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKyAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8tPndpbmRvdygpLCB2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsCisgICAgICBkcm1fc3lzdGVtXywgYXVkaW9fc3RyZWFtX2luZm8sIG1heF92aWRlb19jYXBhYmlsaXRpZXNfLmNfc3RyKCksCisgICAgICBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLCBEZWNvZGVyU3RhdHVzQ2FsbGJhY2ssIFBsYXllclN0YXR1c0NhbGxiYWNrLAorICAgICAgRXJyb3JDYWxsYmFjaywgdGhpcywgb3V0cHV0X21vZGVfLAorICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy0+ZGVjb2Rlcl90YXJnZXRfcHJvdmlkZXIoKSk7CiAgIEFTU0VSVF9UUlVFKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CiAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFdhaXRGb3JQbGF5ZXJTdGF0ZShrU2JQbGF5ZXJTdGF0ZUluaXRpYWxpemVkKSk7CiAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNlZWsoMCkpOwpAQCAtMjkzLDM0ICs1MDAsNzEgQEAKICAgZHJtX3N5c3RlbV8gPSBrU2JEcm1TeXN0ZW1JbnZhbGlkOwogfQogCi12b2lkIFNiUGxheWVyVGVzdEZpeHR1cmU6OldyaXRlU2FtcGxlcyhTYk1lZGlhVHlwZSBtZWRpYV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfdG9fd3JpdGUpIHsKK2Jvb2wgU2JQbGF5ZXJUZXN0Rml4dHVyZTo6Q2FuV3JpdGVNb3JlQXVkaW9EYXRhKCkgeworICBpZiAoIWNhbl9hY2NlcHRfbW9yZV9hdWRpb19kYXRhXykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghYXVkaW9fd3JpdGVfZHVyYXRpb25fKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gbGFzdF93cml0dGVuX2F1ZGlvX3RpbWVzdGFtcF8gLSBHZXRDdXJyZW50TWVkaWFUaW1lKCkgPAorICAgICAgICAgYXVkaW9fd3JpdGVfZHVyYXRpb25fOworfQorCitib29sIFNiUGxheWVyVGVzdEZpeHR1cmU6OkNhbldyaXRlTW9yZVZpZGVvRGF0YSgpIHsKKyAgcmV0dXJuIGNhbl9hY2NlcHRfbW9yZV92aWRlb19kYXRhXzsKK30KKwordm9pZCBTYlBsYXllclRlc3RGaXh0dXJlOjpXcml0ZUF1ZGlvU2FtcGxlcygKKyAgICBpbnQgc3RhcnRfaW5kZXgsCisgICAgaW50IHNhbXBsZXNfdG9fd3JpdGUsCisgICAgU2JUaW1lIHRpbWVzdGFtcF9vZmZzZXQsCisgICAgU2JUaW1lIGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250LAorICAgIFNiVGltZSBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrKSB7CisgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisgIFNCX0RDSEVDSyhhdWRpb19kbXBfcmVhZGVyXyk7CisgIFNCX0RDSEVDSyhzdGFydF9pbmRleCA+PSAwKTsKKyAgU0JfRENIRUNLKHNhbXBsZXNfdG9fd3JpdGUgPiAwKTsKKyAgU0JfRENIRUNLKHNhbXBsZXNfdG9fd3JpdGUgPD0gU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfLCBrU2JNZWRpYVR5cGVBdWRpbykpOworICBTQl9EQ0hFQ0soc3RhcnRfaW5kZXggKyBzYW1wbGVzX3RvX3dyaXRlICsgMSA8CisgICAgICAgICAgICBhdWRpb19kbXBfcmVhZGVyXy0+bnVtYmVyX29mX2F1ZGlvX2J1ZmZlcnMoKSk7CisgIFNCX0RDSEVDSyhkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9mcm9udCA9PSAwIHx8IHNhbXBsZXNfdG9fd3JpdGUgPT0gMSk7CisgIFNCX0RDSEVDSyhkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrID09IDAgfHwgc2FtcGxlc190b193cml0ZSA9PSAxKTsKKworICBDYWxsU2JQbGF5ZXJXcml0ZVNhbXBsZXMoCisgICAgICBwbGF5ZXJfLCBrU2JNZWRpYVR5cGVBdWRpbywgYXVkaW9fZG1wX3JlYWRlcl8uZ2V0KCksIHN0YXJ0X2luZGV4LAorICAgICAgc2FtcGxlc190b193cml0ZSwgdGltZXN0YW1wX29mZnNldCwKKyAgICAgIHN0ZDo6dmVjdG9yPFNiVGltZT4oc2FtcGxlc190b193cml0ZSwgZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fZnJvbnQpLAorICAgICAgc3RkOjp2ZWN0b3I8U2JUaW1lPihzYW1wbGVzX3RvX3dyaXRlLCBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrKSk7CisKKyAgbGFzdF93cml0dGVuX2F1ZGlvX3RpbWVzdGFtcF8gPQorICAgICAgYXVkaW9fZG1wX3JlYWRlcl8KKyAgICAgICAgICAtPkdldFBsYXllclNhbXBsZUluZm8oa1NiTWVkaWFUeXBlQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4ICsgc2FtcGxlc190b193cml0ZSkKKyAgICAgICAgICAudGltZXN0YW1wOworCisgIGNhbl9hY2NlcHRfbW9yZV9hdWRpb19kYXRhXyA9IGZhbHNlOworfQorCit2b2lkIFNiUGxheWVyVGVzdEZpeHR1cmU6OldyaXRlVmlkZW9TYW1wbGVzKGludCBzdGFydF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfdG9fd3JpdGUpIHsKICAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogICBTQl9EQ0hFQ0soc3RhcnRfaW5kZXggPj0gMCk7CiAgIFNCX0RDSEVDSyhzYW1wbGVzX3RvX3dyaXRlID4gMCk7CiAgIFNCX0RDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOwotICBTQl9EQ0hFQ0soc2FtcGxlc190b193cml0ZSA8PQotICAgICAgICAgICAgU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUocGxheWVyXywgbWVkaWFfdHlwZSkpOworICBTQl9EQ0hFQ0soc2FtcGxlc190b193cml0ZSA8PSBTYlBsYXllckdldE1heGltdW1OdW1iZXJPZlNhbXBsZXNQZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcl8sIGtTYk1lZGlhVHlwZVZpZGVvKSk7CisgIFNCX0RDSEVDSyh2aWRlb19kbXBfcmVhZGVyXyk7CisgIFNCX0RDSEVDSyhzdGFydF9pbmRleCArIHNhbXBsZXNfdG9fd3JpdGUgPAorICAgICAgICAgICAgdmlkZW9fZG1wX3JlYWRlcl8tPm51bWJlcl9vZl92aWRlb19idWZmZXJzKCkpOwogCi0gIGlmIChtZWRpYV90eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7Ci0gICAgU0JfRENIRUNLKGF1ZGlvX2RtcF9yZWFkZXJfKTsKLSAgICBTQl9EQ0hFQ0soc3RhcnRfaW5kZXggKyBzYW1wbGVzX3RvX3dyaXRlIDw9Ci0gICAgICAgICAgICAgIGF1ZGlvX2RtcF9yZWFkZXJfLT5udW1iZXJfb2ZfYXVkaW9fYnVmZmVycygpKTsKLSAgICBDYWxsU2JQbGF5ZXJXcml0ZVNhbXBsZXMocGxheWVyXywga1NiTWVkaWFUeXBlQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RtcF9yZWFkZXJfLmdldCgpLCBzdGFydF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc190b193cml0ZSk7Ci0gICAgY2FuX2FjY2VwdF9tb3JlX2F1ZGlvX2RhdGFfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgU0JfRENIRUNLKG1lZGlhX3R5cGUgPT0ga1NiTWVkaWFUeXBlVmlkZW8pOwotICAgIFNCX0RDSEVDSyh2aWRlb19kbXBfcmVhZGVyXyk7Ci0gICAgU0JfRENIRUNLKHN0YXJ0X2luZGV4ICsgc2FtcGxlc190b193cml0ZSA8PQotICAgICAgICAgICAgICB2aWRlb19kbXBfcmVhZGVyXy0+bnVtYmVyX29mX3ZpZGVvX2J1ZmZlcnMoKSk7Ci0gICAgQ2FsbFNiUGxheWVyV3JpdGVTYW1wbGVzKHBsYXllcl8sIGtTYk1lZGlhVHlwZVZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19kbXBfcmVhZGVyXy5nZXQoKSwgc3RhcnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfdG9fd3JpdGUpOwotICAgIGNhbl9hY2NlcHRfbW9yZV92aWRlb19kYXRhXyA9IGZhbHNlOwotICB9CisgIENhbGxTYlBsYXllcldyaXRlU2FtcGxlcyhwbGF5ZXJfLCBrU2JNZWRpYVR5cGVWaWRlbywgdmlkZW9fZG1wX3JlYWRlcl8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9pbmRleCwgc2FtcGxlc190b193cml0ZSk7CisgIGNhbl9hY2NlcHRfbW9yZV92aWRlb19kYXRhXyA9IGZhbHNlOwogfQogCiB2b2lkIFNiUGxheWVyVGVzdEZpeHR1cmU6OldyaXRlRW5kT2ZTdHJlYW0oU2JNZWRpYVR5cGUgbWVkaWFfdHlwZSkgewpAQCAtMzg4LDcgKzYzMiw2IEBACiAKIHZvaWQgU2JQbGF5ZXJUZXN0Rml4dHVyZTo6V2FpdEZvckRlY29kZXJTdGF0ZU5lZWRzRGF0YShjb25zdCBTYlRpbWUgdGltZW91dCkgewogICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFNCX0RDSEVDSyghY2FuX2FjY2VwdF9tb3JlX2F1ZGlvX2RhdGFfIHx8ICFjYW5fYWNjZXB0X21vcmVfdmlkZW9fZGF0YV8pOwogCiAgIGJvb2wgb2xkX2Nhbl9hY2NlcHRfbW9yZV9hdWRpb19kYXRhID0gY2FuX2FjY2VwdF9tb3JlX2F1ZGlvX2RhdGFfOwogICBib29sIG9sZF9jYW5fYWNjZXB0X21vcmVfdmlkZW9fZGF0YSA9IGNhbl9hY2NlcHRfbW9yZV92aWRlb19kYXRhXzsKQEAgLTQwMyw4ICs2NDYsNiBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgfSB3aGlsZSAoU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgLSBzdGFydCA8IHRpbWVvdXQpOwotCi0gIEZBSUwoKSA8PCAiV2FpdEZvckRlY29kZXJTdGF0ZU5lZWRzRGF0YSgpIGRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBzdGF0ZS4iOwogfQogCiB2b2lkIFNiUGxheWVyVGVzdEZpeHR1cmU6OldhaXRGb3JQbGF5ZXJTdGF0ZShjb25zdCBTYlBsYXllclN0YXRlIGRlc2lyZWRfc3RhdGUsCkBAIC00MzIsNyArNjczLDcgQEAKICAgICByZXR1cm47CiAgIH0KICNpZiBTQl9IQVMoR0xFUzIpCi0gIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8uUnVuT25HbGVzQ29udGV4dFRocmVhZChbJl0oKSB7CisgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8tPlJ1bk9uR2xlc0NvbnRleHRUaHJlYWQoWyZdKCkgewogICAgIEFTU0VSVF9UUlVFKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CiAgICAgaWYgKG91dHB1dF9tb2RlXyAhPSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKSB7CiAgICAgICBBU1NFUlRfRVEoU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUocGxheWVyXyksIGtTYkRlY29kZVRhcmdldEludmFsaWQpOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfZml4dHVyZS5oIGIvc3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfZml4dHVyZS5oCmluZGV4IDlhNjZmNjAuLjcyYjA2OWIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X2ZpeHR1cmUuaAorKysgYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF9maXh0dXJlLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vcXVldWUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKQEAgLTM1LDQ2ICszNiw0NCBAQAogY2xhc3MgU2JQbGF5ZXJUZXN0Rml4dHVyZSB7CiAgcHVibGljOgogICAvLyBBIHNpbXBsZSBlbmNhcHN1bGF0aW9uIG9mIGdyb3VwZWQgc2FtcGxlcy4KKyAgY2xhc3MgR3JvdXBlZFNhbXBsZXNJdGVyYXRvcjsKICAgY2xhc3MgR3JvdXBlZFNhbXBsZXMgewogICAgcHVibGljOgotICAgIGludCBhdWRpb19zdGFydF9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvX3N0YXJ0X2luZGV4XzsgfQotICAgIGludCBhdWRpb19zYW1wbGVzX3RvX3dyaXRlKCkgY29uc3QgeyByZXR1cm4gYXVkaW9fc2FtcGxlc190b193cml0ZV87IH0KLSAgICBib29sIHdyaXRlX2F1ZGlvX2VvcygpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2F1ZGlvX2Vvc187IH0KKyAgICBzdHJ1Y3QgQXVkaW9TYW1wbGVzRGVzY3JpcHRvciB7CisgICAgICBpbnQgc3RhcnRfaW5kZXggPSAwOworICAgICAgaW50IHNhbXBsZXNfY291bnQgPSAwOworICAgICAgU2JUaW1lIHRpbWVzdGFtcF9vZmZzZXQgPSAwOworICAgICAgU2JUaW1lIGRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250ID0gMDsKKyAgICAgIFNiVGltZSBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrID0gMDsKKyAgICAgIGJvb2wgaXNfZW5kX29mX3N0cmVhbSA9IGZhbHNlOworICAgIH07CiAKLSAgICBpbnQgdmlkZW9fc3RhcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiB2aWRlb19zdGFydF9pbmRleF87IH0KLSAgICBpbnQgdmlkZW9fc2FtcGxlc190b193cml0ZSgpIGNvbnN0IHsgcmV0dXJuIHZpZGVvX3NhbXBsZXNfdG9fd3JpdGVfOyB9Ci0gICAgYm9vbCB3cml0ZV92aWRlb19lb3MoKSBjb25zdCB7IHJldHVybiB3cml0ZV92aWRlb19lb3NfOyB9CisgICAgc3RydWN0IFZpZGVvU2FtcGxlc0Rlc2NyaXB0b3IgeworICAgICAgaW50IHN0YXJ0X2luZGV4ID0gMDsKKyAgICAgIGludCBzYW1wbGVzX2NvdW50ID0gMDsKKyAgICAgIGJvb2wgaXNfZW5kX29mX3N0cmVhbSA9IGZhbHNlOworICAgIH07CiAKLSAgICB2b2lkIEFkZEF1ZGlvU2FtcGxlcyhpbnQgYXVkaW9fc3RhcnRfaW5kZXgsIGludCBhdWRpb19zYW1wbGVzX3RvX3dyaXRlKSB7Ci0gICAgICBhdWRpb19zdGFydF9pbmRleF8gPSBhdWRpb19zdGFydF9pbmRleDsKLSAgICAgIGF1ZGlvX3NhbXBsZXNfdG9fd3JpdGVfID0gYXVkaW9fc2FtcGxlc190b193cml0ZTsKLSAgICB9Ci0gICAgdm9pZCBBZGRBdWRpb1NhbXBsZXNXaXRoRU9TKGludCBhdWRpb19zdGFydF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvX3NhbXBsZXNfdG9fd3JpdGUpIHsKLSAgICAgIEFkZEF1ZGlvU2FtcGxlcyhhdWRpb19zdGFydF9pbmRleCwgYXVkaW9fc2FtcGxlc190b193cml0ZSk7Ci0gICAgICB3cml0ZV9hdWRpb19lb3NfID0gdHJ1ZTsKLSAgICB9Ci0gICAgdm9pZCBBZGRWaWRlb1NhbXBsZXMoaW50IHZpZGVvX3N0YXJ0X2luZGV4LCBpbnQgdmlkZW9fc2FtcGxlc190b193cml0ZSkgewotICAgICAgdmlkZW9fc3RhcnRfaW5kZXhfID0gdmlkZW9fc3RhcnRfaW5kZXg7Ci0gICAgICB2aWRlb19zYW1wbGVzX3RvX3dyaXRlXyA9IHZpZGVvX3NhbXBsZXNfdG9fd3JpdGU7Ci0gICAgfQorICAgIEdyb3VwZWRTYW1wbGVzJiBBZGRBdWRpb1NhbXBsZXMoaW50IHN0YXJ0X2luZGV4LCBpbnQgbnVtYmVyX29mX3NhbXBsZXMpOworICAgIEdyb3VwZWRTYW1wbGVzJiBBZGRBdWRpb1NhbXBsZXMoaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcl9vZl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JUaW1lIHRpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlRpbWUgZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fZnJvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlRpbWUgZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFjayk7CisgICAgR3JvdXBlZFNhbXBsZXMmIEFkZEF1ZGlvRU9TKCk7CisgICAgR3JvdXBlZFNhbXBsZXMmIEFkZFZpZGVvU2FtcGxlcyhpbnQgc3RhcnRfaW5kZXgsIGludCBudW1iZXJfb2Zfc2FtcGxlcyk7CisgICAgR3JvdXBlZFNhbXBsZXMmIEFkZFZpZGVvRU9TKCk7CiAKLSAgICB2b2lkIEFkZFZpZGVvU2FtcGxlc1dpdGhFT1MoaW50IHZpZGVvX3N0YXJ0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9fc2FtcGxlc190b193cml0ZSkgewotICAgICAgQWRkVmlkZW9TYW1wbGVzKHZpZGVvX3N0YXJ0X2luZGV4LCB2aWRlb19zYW1wbGVzX3RvX3dyaXRlKTsKLSAgICAgIHdyaXRlX3ZpZGVvX2Vvc18gPSB0cnVlOwotICAgIH0KKyAgICBmcmllbmQgY2xhc3MgR3JvdXBlZFNhbXBsZXNJdGVyYXRvcjsKIAogICAgcHJpdmF0ZToKLSAgICBpbnQgYXVkaW9fc3RhcnRfaW5kZXhfID0gMDsKLSAgICBpbnQgYXVkaW9fc2FtcGxlc190b193cml0ZV8gPSAwOwotICAgIGJvb2wgd3JpdGVfYXVkaW9fZW9zXyA9IGZhbHNlOwotICAgIGludCB2aWRlb19zdGFydF9pbmRleF8gPSAwOwotICAgIGludCB2aWRlb19zYW1wbGVzX3RvX3dyaXRlXyA9IDA7Ci0gICAgYm9vbCB3cml0ZV92aWRlb19lb3NfID0gZmFsc2U7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9TYW1wbGVzRGVzY3JpcHRvcj4gYXVkaW9fc2FtcGxlc187CisgICAgc3RkOjp2ZWN0b3I8VmlkZW9TYW1wbGVzRGVzY3JpcHRvcj4gdmlkZW9fc2FtcGxlc187CiAgIH07CiAKLSAgZXhwbGljaXQgU2JQbGF5ZXJUZXN0Rml4dHVyZShjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZyk7CisgIFNiUGxheWVyVGVzdEZpeHR1cmUoCisgICAgICBjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZywKKyAgICAgIHRlc3Rpbmc6OkZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlciogZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKTsKICAgflNiUGxheWVyVGVzdEZpeHR1cmUoKTsKIAogICB2b2lkIFNlZWsoY29uc3QgU2JUaW1lIHRpbWUpOwpAQCAtODMsMTYgKzgyLDIzIEBACiAgIC8vIHJlcXVlc3RlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgd3JpdGUgRU9TIGFmdGVyIGFsbCBzYW1wbGVzIG9mIHRoZSBzYW1lIHR5cGUKICAgLy8gYXJlIHdyaXR0ZW4uCiAgIHZvaWQgV3JpdGUoY29uc3QgR3JvdXBlZFNhbXBsZXMmIGdyb3VwZWRfc2FtcGxlcyk7CisgIC8vIFdhaXQgdW50aWwga1NiUGxheWVyU3RhdGVQcmVzZW50aW5nIHJlY2VpdmVkLgorICB2b2lkIFdhaXRGb3JQbGF5ZXJQcmVzZW50aW5nKCk7CiAgIC8vIFdhaXQgdW50aWwga1NiUGxheWVyU3RhdGVFbmRPZlN0cmVhbSByZWNlaXZlZC4KICAgdm9pZCBXYWl0Rm9yUGxheWVyRW5kT2ZTdHJlYW0oKTsKKyAgU2JUaW1lIEdldEN1cnJlbnRNZWRpYVRpbWUoKSBjb25zdDsKIAotICBTYlBsYXllciBHZXRQbGF5ZXIoKSB7IHJldHVybiBwbGF5ZXJfOyB9CisgIHZvaWQgU2V0QXVkaW9Xcml0ZUR1cmF0aW9uKFNiVGltZSBkdXJhdGlvbik7CisKKyAgU2JQbGF5ZXIgR2V0UGxheWVyKCkgY29uc3QgeyByZXR1cm4gcGxheWVyXzsgfQogICBib29sIEhhc0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gYXVkaW9fZG1wX3JlYWRlcl87IH0KICAgYm9vbCBIYXNWaWRlbygpIGNvbnN0IHsgcmV0dXJuIHZpZGVvX2RtcF9yZWFkZXJfOyB9CiAKKyAgU2JUaW1lIEdldEF1ZGlvU2FtcGxlVGltZXN0YW1wKGludCBpbmRleCkgY29uc3Q7CisgIGludCBDb252ZXJ0RHVyYXRpb25Ub0F1ZGlvQnVmZmVyQ291bnQoU2JUaW1lIGR1cmF0aW9uKSBjb25zdDsKKyAgaW50IENvbnZlcnREdXJhdGlvblRvVmlkZW9CdWZmZXJDb3VudChTYlRpbWUgZHVyYXRpb24pIGNvbnN0OworCiAgcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0ZXhwciBTYlRpbWUga0RlZmF1bHRXYWl0Rm9yRGVjb2RlclN0YXRlTmVlZHNEYXRhVGltZW91dCA9Ci0gICAgICA1ICoga1NiVGltZVNlY29uZDsKICAgc3RhdGljIGNvbnN0ZXhwciBTYlRpbWUga0RlZmF1bHRXYWl0Rm9yUGxheWVyU3RhdGVUaW1lb3V0ID0gNSAqIGtTYlRpbWVTZWNvbmQ7CiAgIHN0YXRpYyBjb25zdGV4cHIgU2JUaW1lIGtEZWZhdWx0V2FpdEZvckNhbGxiYWNrRXZlbnRUaW1lb3V0ID0KICAgICAgIDE1ICoga1NiVGltZU1pbGxpc2Vjb25kOwpAQCAtMTQ5LDkgKzE1NSwxNSBAQAogICB2b2lkIEluaXRpYWxpemUoKTsKICAgdm9pZCBUZWFyRG93bigpOwogCi0gIHZvaWQgV3JpdGVTYW1wbGVzKFNiTWVkaWFUeXBlIG1lZGlhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfdG9fd3JpdGUpOworICBib29sIENhbldyaXRlTW9yZUF1ZGlvRGF0YSgpOworICBib29sIENhbldyaXRlTW9yZVZpZGVvRGF0YSgpOworCisgIHZvaWQgV3JpdGVBdWRpb1NhbXBsZXMoaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNiVGltZSB0aW1lc3RhbXBfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNiVGltZSBkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9mcm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTYlRpbWUgZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFjayk7CisgIHZvaWQgV3JpdGVWaWRlb1NhbXBsZXMoaW50IHN0YXJ0X2luZGV4LCBpbnQgc2FtcGxlc190b193cml0ZSk7CiAgIHZvaWQgV3JpdGVFbmRPZlN0cmVhbShTYk1lZGlhVHlwZSBtZWRpYV90eXBlKTsKIAogICAvLyBDaGVja3MgaWYgdGhlcmUgYXJlIHBlbmRpbmcgY2FsbGJhY2sgZXZlbnRzIGFuZCwgaWYgc28sIGxvZ3MgdGhlIHJlY2VpdmVkCkBAIC0xNjQsNyArMTc2LDcgQEAKIAogICAvLyBXYWl0cyBmb3IgfGtTYlBsYXllckRlY29kZXJTdGF0ZU5lZWRzRGF0YXwgdG8gYmUgc2VudC4KICAgdm9pZCBXYWl0Rm9yRGVjb2RlclN0YXRlTmVlZHNEYXRhKAotICAgICAgY29uc3QgU2JUaW1lIHRpbWVvdXQgPSBrRGVmYXVsdFdhaXRGb3JEZWNvZGVyU3RhdGVOZWVkc0RhdGFUaW1lb3V0KTsKKyAgICAgIGNvbnN0IFNiVGltZSB0aW1lb3V0ID0ga0RlZmF1bHRXYWl0Rm9yQ2FsbGJhY2tFdmVudFRpbWVvdXQpOwogCiAgIC8vIFdhaXRzIGZvciBkZXNpcmVkIHBsYXllciBzdGF0ZSB1cGRhdGUgdG8gYmUgc2VudC4KICAgdm9pZCBXYWl0Rm9yUGxheWVyU3RhdGUoCkBAIC0xODYsOSArMTk4LDEwIEBACiAgIHNoYXJlZDo6c3RhcmJvYXJkOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKICAgY29uc3QgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKICAgc3RkOjpzdHJpbmcga2V5X3N5c3RlbV87CisgIHN0ZDo6c3RyaW5nIG1heF92aWRlb19jYXBhYmlsaXRpZXNfOwogICBzY29wZWRfcHRyPFZpZGVvRG1wUmVhZGVyPiBhdWRpb19kbXBfcmVhZGVyXzsKICAgc2NvcGVkX3B0cjxWaWRlb0RtcFJlYWRlcj4gdmlkZW9fZG1wX3JlYWRlcl87Ci0gIHRlc3Rpbmc6OkZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlciBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfOworICB0ZXN0aW5nOjpGYWtlR3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87CiAKICAgU2JQbGF5ZXIgcGxheWVyXyA9IGtTYlBsYXllckludmFsaWQ7CiAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW1fID0ga1NiRHJtU3lzdGVtSW52YWxpZDsKQEAgLTIwMCw2ICsyMTMsMTEgQEAKICAgYm9vbCBjYW5fYWNjZXB0X21vcmVfYXVkaW9fZGF0YV8gPSBmYWxzZTsKICAgYm9vbCBjYW5fYWNjZXB0X21vcmVfdmlkZW9fZGF0YV8gPSBmYWxzZTsKIAorICAvLyBUaGUgZHVyYXRpb24gb2YgaG93IGZhciBwYXN0IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdlIHdpbGwgd3JpdGUKKyAgLy8gYXVkaW8gc2FtcGxlcy4KKyAgU2JUaW1lIGF1ZGlvX3dyaXRlX2R1cmF0aW9uXyA9IDA7CisgIFNiVGltZSBsYXN0X3dyaXR0ZW5fYXVkaW9fdGltZXN0YW1wXyA9IDA7CisKICAgLy8gU2V0IG9mIHJlY2VpdmVkIHBsYXllciBzdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVuZGVybHlpbmcgcGxheWVyLiBUaGlzIGlzCiAgIC8vIHVzZWQgdG8gY2hlY2sgdGhhdCB0aGUgc3RhdGUgdXBkYXRlcyBvY2N1ciBpbiBhIHZhbGlkIG9yZGVyIGR1cmluZyBub3JtYWwKICAgLy8gcGxheWJhY2suCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmNjIGIvc3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfdXRpbC5jYwppbmRleCAyODQxODAwLi4zNDYzOWUxIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmNjCisrKyBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X3V0aWwuY2MKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3N0cmluZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9leHRlbnNpb24vZW5oYW5jZWRfYXVkaW8uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9kcm1faGVscGVycy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL21heGltdW1fcGxheWVyX2NvbmZpZ3VyYXRpb25fZXhwbG9yZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRpb25fcGFyYW1faGVscGVycy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfcmVhZGVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmgiCkBAIC00MCw2ICs0MSwyNCBAQAogdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol80OwogdXNpbmcgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyOwogCitjb25zdCBjaGFyKiBrQXVkaW9UZXN0RmlsZXNbXSA9IHsiYmVuZWF0aF90aGVfY2Fub3B5X2FhY19zdGVyZW8uZG1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lYXRoX3RoZV9jYW5vcHlfb3B1c19zdGVyZW8uZG1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW50ZWxfMzI5X2VjMy5kbXAiLCAic2ludGVsXzM4MV9hYzMuZG1wIn07CisKKy8vIEZvciB1bmNvbW1vbiBhdWRpbyBmb3JtYXRzLCB3ZSBhZGQgYXVkaW8gb25seSB0ZXN0cywgd2l0aG91dCB0ZXN0cyBjb21iaW5lZAorLy8gd2l0aCBhIHZpZGVvIHN0cmVhbSwgdG8gc2hvcnRlbiB0aGUgb3ZlcmFsbCB0ZXN0IHRpbWUuCitjb25zdCBjaGFyKiBrQXVkaW9Pbmx5VGVzdEZpbGVzW10gPSB7CisgICAgImJlbmVhdGhfdGhlX2Nhbm9weV9hYWNfNV8xLmRtcCIsICJiZW5lYXRoX3RoZV9jYW5vcHlfYWFjX21vbm8uZG1wIiwKKyAgICAiYmVuZWF0aF90aGVfY2Fub3B5X29wdXNfNV8xLmRtcCIsICJiZW5lYXRoX3RoZV9jYW5vcHlfb3B1c19tb25vLmRtcCIsCisgICAgImhlYWFjLmRtcCJ9OworCitjb25zdCBjaGFyKiBrVmlkZW9UZXN0RmlsZXNbXSA9IHsiYmVuZWF0aF90aGVfY2Fub3B5XzEzN19hdmMuZG1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lYXRoX3RoZV9jYW5vcHlfMjQ4X3ZwOS5kbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbnRlbF8zOTlfYXYxLmRtcCJ9OworCitjb25zdCBTYlBsYXllck91dHB1dE1vZGUga091dHB1dE1vZGVzW10gPSB7a1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXR9OworCiB2b2lkIEVycm9yRnVuYyhTYlBsYXllciBwbGF5ZXIsCiAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAogICAgICAgICAgICAgICAgU2JQbGF5ZXJFcnJvciBlcnJvciwKQEAgLTUwLDMwICs2OSwzNSBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAorc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IEdldEF1ZGlvVGVzdEZpbGVzKCkgeworICByZXR1cm4gc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KHN0ZDo6YmVnaW4oa0F1ZGlvVGVzdEZpbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChrQXVkaW9UZXN0RmlsZXMpKTsKK30KKworc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IEdldFZpZGVvVGVzdEZpbGVzKCkgeworICByZXR1cm4gc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KHN0ZDo6YmVnaW4oa1ZpZGVvVGVzdEZpbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChrVmlkZW9UZXN0RmlsZXMpKTsKK30KKworc3RkOjp2ZWN0b3I8U2JQbGF5ZXJPdXRwdXRNb2RlPiBHZXRQbGF5ZXJPdXRwdXRNb2RlcygpIHsKKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPFNiUGxheWVyT3V0cHV0TW9kZT4oc3RkOjpiZWdpbihrT3V0cHV0TW9kZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChrT3V0cHV0TW9kZXMpKTsKK30KKworc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IEdldEtleVN5c3RlbXMoKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBrZXlfc3lzdGVtczsKKyAga2V5X3N5c3RlbXMucHVzaF9iYWNrKCIiKTsKKyAga2V5X3N5c3RlbXMuaW5zZXJ0KGtleV9zeXN0ZW1zLmVuZCgpLCBrS2V5U3lzdGVtcywKKyAgICAgICAgICAgICAgICAgICAgIGtLZXlTeXN0ZW1zICsgU0JfQVJSQVlfU0laRV9JTlQoa0tleVN5c3RlbXMpKTsKKyAgcmV0dXJuIGtleV9zeXN0ZW1zOworfQorCiBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IEdldFN1cHBvcnRlZFNiUGxheWVyVGVzdENvbmZpZ3MoCiAgICAgY29uc3QgY2hhcioga2V5X3N5c3RlbSkgewogICBTQl9EQ0hFQ0soa2V5X3N5c3RlbSk7CiAKICAgY29uc3QgY2hhcioga0VtcHR5TmFtZSA9IE5VTEw7CiAKLSAgY29uc3QgY2hhcioga0F1ZGlvVGVzdEZpbGVzW10gPSB7ImJlbmVhdGhfdGhlX2Nhbm9weV9hYWNfc3RlcmVvLmRtcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lYXRoX3RoZV9jYW5vcHlfb3B1c19zdGVyZW8uZG1wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbnRlbF8zMjlfZWMzLmRtcCIsICJzaW50ZWxfMzgxX2FjMy5kbXAifTsKLQotICAvLyBGb3IgdW5jb21tb24gYXVkaW8gZm9ybWF0cywgd2UgYWRkIGF1ZGlvIG9ubHkgdGVzdHMsIHdpdGhvdXQgdGVzdHMgY29tYmluZWQKLSAgLy8gd2l0aCBhIHZpZGVvIHN0cmVhbSwgdG8gc2hvcnRlbiB0aGUgb3ZlcmFsbCB0ZXN0IHRpbWUuCi0gIGNvbnN0IGNoYXIqIGtBdWRpb09ubHlUZXN0RmlsZXNbXSA9IHsKLSAgICAgICJiZW5lYXRoX3RoZV9jYW5vcHlfYWFjXzVfMS5kbXAiLCAiYmVuZWF0aF90aGVfY2Fub3B5X2FhY19tb25vLmRtcCIsCi0gICAgICAiYmVuZWF0aF90aGVfY2Fub3B5X29wdXNfNV8xLmRtcCIsICJiZW5lYXRoX3RoZV9jYW5vcHlfb3B1c19tb25vLmRtcCIsCi0gICAgICAiaGVhYWMuZG1wIn07Ci0KLSAgY29uc3QgY2hhcioga1ZpZGVvVGVzdEZpbGVzW10gPSB7ImJlbmVhdGhfdGhlX2Nhbm9weV8xMzdfYXZjLmRtcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lYXRoX3RoZV9jYW5vcHlfMjQ4X3ZwOS5kbXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2ludGVsXzM5OV9hdjEuZG1wIn07Ci0KLSAgY29uc3QgU2JQbGF5ZXJPdXRwdXRNb2RlIGtPdXRwdXRNb2Rlc1tdID0ge2tTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXR9OwotCiAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBzdXBwb3J0ZWRfYXVkaW9fZmlsZXM7CiAgIHN1cHBvcnRlZF9hdWRpb19maWxlcy5wdXNoX2JhY2soa0VtcHR5TmFtZSk7CiAgIGZvciAoYXV0byBhdWRpb19maWxlbmFtZSA6IGtBdWRpb1Rlc3RGaWxlcykgewpAQCAtMTIxLDggKzE0NSw4IEBACiAgICAgICBmb3IgKGF1dG8gb3V0cHV0X21vZGUgOiBrT3V0cHV0TW9kZXMpIHsKICAgICAgICAgaWYgKElzT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwgYXVkaW9fY29kZWMsIHZpZGVvX2NvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zeXN0ZW0pKSB7Ci0gICAgICAgICAgdGVzdF9jb25maWdzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoYXVkaW9fZmlsZW5hbWUsIHZpZGVvX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9tb2RlLCBrZXlfc3lzdGVtKSk7CisgICAgICAgICAgdGVzdF9jb25maWdzLmVtcGxhY2VfYmFjayhhdWRpb19maWxlbmFtZSwgdmlkZW9fZmlsZW5hbWUsIG91dHB1dF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3N5c3RlbSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xMzcsOCArMTYxLDggQEAKICAgICAgIGZvciAoYXV0byBvdXRwdXRfbW9kZSA6IGtPdXRwdXRNb2RlcykgewogICAgICAgICBpZiAoSXNPdXRwdXRNb2RlU3VwcG9ydGVkKG91dHB1dF9tb2RlLCBkbXBfcmVhZGVyLmF1ZGlvX2NvZGVjKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiTWVkaWFWaWRlb0NvZGVjTm9uZSwga2V5X3N5c3RlbSkpIHsKLSAgICAgICAgICB0ZXN0X2NvbmZpZ3MucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShhdWRpb19maWxlbmFtZSwga0VtcHR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbW9kZSwga2V5X3N5c3RlbSkpOworICAgICAgICAgIHRlc3RfY29uZmlncy5lbXBsYWNlX2JhY2soYXVkaW9fZmlsZW5hbWUsIGtFbXB0eU5hbWUsIG91dHB1dF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3N5c3RlbSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xNDcsNiArMTcxLDI2IEBACiAgIHJldHVybiB0ZXN0X2NvbmZpZ3M7CiB9CiAKK3N0ZDo6c3RyaW5nIEdldFNiUGxheWVyVGVzdENvbmZpZ05hbWUoCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPFNiUGxheWVyVGVzdENvbmZpZz4gaW5mbykgeworICBjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZyA9IGluZm8ucGFyYW07CisgIGNvbnN0IGNoYXIqIGF1ZGlvX2ZpbGVuYW1lID0gY29uZmlnLmF1ZGlvX2ZpbGVuYW1lOworICBjb25zdCBjaGFyKiB2aWRlb19maWxlbmFtZSA9IGNvbmZpZy52aWRlb19maWxlbmFtZTsKKyAgY29uc3QgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlID0gY29uZmlnLm91dHB1dF9tb2RlOworICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtID0gY29uZmlnLmtleV9zeXN0ZW07CisgIHN0ZDo6c3RyaW5nIG5hbWUoRm9ybWF0U3RyaW5nKAorICAgICAgImF1ZGlvXyVzX3ZpZGVvXyVzX291dHB1dF8lc19rZXlfc3lzdGVtXyVzIiwKKyAgICAgIGF1ZGlvX2ZpbGVuYW1lICYmIHN0cmxlbihhdWRpb19maWxlbmFtZSkgPiAwID8gYXVkaW9fZmlsZW5hbWUgOiAibnVsbCIsCisgICAgICB2aWRlb19maWxlbmFtZSAmJiBzdHJsZW4odmlkZW9fZmlsZW5hbWUpID4gMCA/IHZpZGVvX2ZpbGVuYW1lIDogIm51bGwiLAorICAgICAgb3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSA/ICJkZWNvZGVfdG9fdGV4dHVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAicHVuY2hfb3V0IiwKKyAgICAgIHN0cmxlbihrZXlfc3lzdGVtKSA+IDAgPyBrZXlfc3lzdGVtIDogIm51bGwiKSk7CisgIHN0ZDo6cmVwbGFjZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksICcuJywgJ18nKTsKKyAgc3RkOjpyZXBsYWNlKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSwgJygnLCAnXycpOworICBzdGQ6OnJlcGxhY2UobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCAnKScsICdfJyk7CisgIHJldHVybiBuYW1lOworfQorCiB2b2lkIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMoU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlcikge30KQEAgLTE4Nyw2ICsyMzEsNyBAQAogICAgIFNCX0NIRUNLKGF1ZGlvX2NvZGVjID09IGtTYk1lZGlhQXVkaW9Db2RlY05vbmUpOwogICB9CiAKKyAgLy8gVE9ETzogcGFzcyByZWFsIGF1ZGlvL3ZpZGVvIGluZm8gdG8gU2JQbGF5ZXJHZXRQcmVmZXJyZWRPdXRwdXRNb2RlLgogICBQbGF5ZXJDcmVhdGlvblBhcmFtIGNyZWF0aW9uX3BhcmFtID0KICAgICAgIENyZWF0ZVBsYXllckNyZWF0aW9uUGFyYW0oYXVkaW9fY29kZWMsIHZpZGVvX2NvZGVjLCBvdXRwdXRfbW9kZSk7CiAgIGlmIChhdWRpb19zdHJlYW1faW5mbykgewpAQCAtMjA4LDEwICsyNTMsMjUgQEAKICAgICBTYk1lZGlhVHlwZSBzYW1wbGVfdHlwZSwKICAgICBzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wUmVhZGVyKiBkbXBfcmVhZGVyLAogICAgIGludCBzdGFydF9pbmRleCwKLSAgICBpbnQgbnVtYmVyX29mX3NhbXBsZXNfdG9fd3JpdGUpIHsKKyAgICBpbnQgbnVtYmVyX29mX3NhbXBsZXNfdG9fd3JpdGUsCisgICAgU2JUaW1lIHRpbWVzdGFtcF9vZmZzZXQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U2JUaW1lPiYgZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2Zyb250LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNiVGltZT4mIGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9iYWNrKSB7CiAgIFNCX0RDSEVDSyhzdGFydF9pbmRleCA+PSAwKTsKICAgU0JfRENIRUNLKG51bWJlcl9vZl9zYW1wbGVzX3RvX3dyaXRlID4gMCk7CiAKKyAgaWYgKHNhbXBsZV90eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7CisgICAgU0JfRENIRUNLKGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9mcm9udC5lbXB0eSgpIHx8CisgICAgICAgICAgICAgIGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9mcm9udC5zaXplKCkgPT0KKyAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9zYW1wbGVzX3RvX3dyaXRlKTsKKyAgICBTQl9EQ0hFQ0soZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2Zyb250LnNpemUoKSA9PQorICAgICAgICAgICAgICBkaXNjYXJkZWRfZHVyYXRpb25zX2Zyb21fYmFjay5zaXplKCkpOworICB9IGVsc2UgeworICAgIFNCX0RDSEVDSyhzYW1wbGVfdHlwZSA9PSBrU2JNZWRpYVR5cGVWaWRlbyk7CisgICAgU0JfRENIRUNLKGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9mcm9udC5lbXB0eSgpKTsKKyAgICBTQl9EQ0hFQ0soZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2JhY2suZW1wdHkoKSk7CisgIH0KKwogICBzdGF0aWMgYXV0byBjb25zdCogZW5oYW5jZWRfYXVkaW9fZXh0ZW5zaW9uID0KICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENvYmFsdEV4dGVuc2lvbkVuaGFuY2VkQXVkaW9BcGkqPigKICAgICAgICAgICBTYlN5c3RlbUdldEV4dGVuc2lvbihrQ29iYWx0RXh0ZW5zaW9uRW5oYW5jZWRBdWRpb05hbWUpKTsKQEAgLTIzOCw3ICsyOTgsNyBAQAogICAgICAgc2FtcGxlX2luZm9zLmJhY2soKS50eXBlID0gc291cmNlLnR5cGU7CiAgICAgICBzYW1wbGVfaW5mb3MuYmFjaygpLmJ1ZmZlciA9IHNvdXJjZS5idWZmZXI7CiAgICAgICBzYW1wbGVfaW5mb3MuYmFjaygpLmJ1ZmZlcl9zaXplID0gc291cmNlLmJ1ZmZlcl9zaXplOwotICAgICAgc2FtcGxlX2luZm9zLmJhY2soKS50aW1lc3RhbXAgPSBzb3VyY2UudGltZXN0YW1wOworICAgICAgc2FtcGxlX2luZm9zLmJhY2soKS50aW1lc3RhbXAgPSBzb3VyY2UudGltZXN0YW1wICsgdGltZXN0YW1wX29mZnNldDsKICAgICAgIHNhbXBsZV9pbmZvcy5iYWNrKCkuc2lkZV9kYXRhID0gc291cmNlLnNpZGVfZGF0YTsKICAgICAgIHNhbXBsZV9pbmZvcy5iYWNrKCkuc2lkZV9kYXRhX2NvdW50ID0gc291cmNlLnNpZGVfZGF0YV9jb3VudDsKICAgICAgIHNhbXBsZV9pbmZvcy5iYWNrKCkuZHJtX2luZm8gPSBzb3VyY2UuZHJtX2luZm87CkBAIC0yNDcsOCArMzA3LDE1IEBACiAgICAgICAgIGF1ZGlvX3NhbXBsZV9pbmZvcy5lbXBsYWNlX2JhY2soc291cmNlLmF1ZGlvX3NhbXBsZV9pbmZvKTsKICAgICAgICAgYXVkaW9fc2FtcGxlX2luZm9zLmJhY2soKS5Db252ZXJ0VG8oCiAgICAgICAgICAgICAmc2FtcGxlX2luZm9zLmJhY2soKS5hdWRpb19zYW1wbGVfaW5mbyk7CisgICAgICAgIGlmICghZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2Zyb250LmVtcHR5KCkpIHsKKyAgICAgICAgICBzYW1wbGVfaW5mb3MuYmFjaygpLmF1ZGlvX3NhbXBsZV9pbmZvLmRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2Zyb250ID0KKyAgICAgICAgICAgICAgZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2Zyb250W2ldOworICAgICAgICB9CisgICAgICAgIGlmICghZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2JhY2suZW1wdHkoKSkgeworICAgICAgICAgIHNhbXBsZV9pbmZvcy5iYWNrKCkuYXVkaW9fc2FtcGxlX2luZm8uZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fYmFjayA9CisgICAgICAgICAgICAgIGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9iYWNrW2ldOworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBTQl9EQ0hFQ0soc2FtcGxlX3R5cGUgPT0ga1NiTWVkaWFUeXBlVmlkZW8pOwogICAgICAgICB2aWRlb19zYW1wbGVfaW5mb3MuZW1wbGFjZV9iYWNrKHNvdXJjZS52aWRlb19zYW1wbGVfaW5mbyk7CiAgICAgICAgIHZpZGVvX3NhbXBsZV9pbmZvcy5iYWNrKCkuQ29udmVydFRvKAogICAgICAgICAgICAgJnNhbXBsZV9pbmZvcy5iYWNrKCkudmlkZW9fc2FtcGxlX2luZm8pOwpAQCAtMjY1LDYgKzMzMiwxNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcl9vZl9zYW1wbGVzX3RvX3dyaXRlOyArK2kpIHsKICAgICBzYW1wbGVfaW5mb3MucHVzaF9iYWNrKAogICAgICAgICBkbXBfcmVhZGVyLT5HZXRQbGF5ZXJTYW1wbGVJbmZvKHNhbXBsZV90eXBlLCBzdGFydF9pbmRleCsrKSk7CisgICAgc2FtcGxlX2luZm9zLmJhY2soKS50aW1lc3RhbXAgKz0gdGltZXN0YW1wX29mZnNldDsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAxNQorICAgIGlmICghZGlzY2FyZGVkX2R1cmF0aW9uc19mcm9tX2Zyb250LmVtcHR5KCkpIHsKKyAgICAgIHNhbXBsZV9pbmZvcy5iYWNrKCkuYXVkaW9fc2FtcGxlX2luZm8uZGlzY2FyZGVkX2R1cmF0aW9uX2Zyb21fZnJvbnQgPQorICAgICAgICAgIGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9mcm9udFtpXTsKKyAgICB9CisgICAgaWYgKCFkaXNjYXJkZWRfZHVyYXRpb25zX2Zyb21fYmFjay5lbXB0eSgpKSB7CisgICAgICBzYW1wbGVfaW5mb3MuYmFjaygpLmF1ZGlvX3NhbXBsZV9pbmZvLmRpc2NhcmRlZF9kdXJhdGlvbl9mcm9tX2JhY2sgPQorICAgICAgICAgIGRpc2NhcmRlZF9kdXJhdGlvbnNfZnJvbV9iYWNrW2ldOworICAgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMTUKICAgfQogI2lmIFNCX0FQSV9WRVJTSU9OID49IDE1CiAgIFNiUGxheWVyV3JpdGVTYW1wbGVzKHBsYXllciwgc2FtcGxlX3R5cGUsIHNhbXBsZV9pbmZvcy5kYXRhKCksCkBAIC0yODEsNiArMzU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0pIHsKICAgU0JfRENIRUNLKGtleV9zeXN0ZW0pOwogCisgIC8vIFRPRE86IHBhc3MgcmVhbCBhdWRpby92aWRlbyBpbmZvIHRvIFNiUGxheWVyR2V0UHJlZmVycmVkT3V0cHV0TW9kZS4KICAgUGxheWVyQ3JlYXRpb25QYXJhbSBjcmVhdGlvbl9wYXJhbSA9CiAgICAgICBDcmVhdGVQbGF5ZXJDcmVhdGlvblBhcmFtKGF1ZGlvX2NvZGVjLCB2aWRlb19jb2RlYywgb3V0cHV0X21vZGUpOwogCkBAIC0zMDUsNSArMzg0LDEzIEBACiAgIHJldHVybiBzdXBwb3J0ZWQ7CiB9CiAKK2Jvb2wgSXNQYXJ0aWFsQXVkaW9TdXBwb3J0ZWQoKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMTUKKyAgcmV0dXJuIHRydWU7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1CisgIHJldHVybiBTYlN5c3RlbUdldEV4dGVuc2lvbihrQ29iYWx0RXh0ZW5zaW9uRW5oYW5jZWRBdWRpb05hbWUpICE9IG51bGxwdHI7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDE1Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmggYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF91dGlsLmgKaW5kZXggYThiZjRmYy4uMTAwYmY2YyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfdXRpbC5oCisrKyBiL3N0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X3V0aWwuaApAQCAtMjMsMjEgKzIzLDQ5IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21lZGlhX3V0aWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBucGxiIHsKIAotLy8gVE9ETyhiLzI4MzAwMjIzNik6IGNyZWF0ZSBhIHN0cnVjdCBmb3IgU2JQbGF5ZXJUZXN0Q29uZmlnIGluc3RlYWQgb2YgdXNpbmcKLS8vIHN0ZDo6dHVwbGUuCi10eXBlZGVmIHN0ZDo6dHVwbGU8Y29uc3QgY2hhciogLyogYXVkaW9fZmlsZW5hbWUgKi8sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogdmlkZW9fZmlsZW5hbWUgKi8sCi0gICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIC8qIG91dHB1dF9tb2RlICovLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGtleV9zeXN0ZW0gKi8+Ci0gICAgU2JQbGF5ZXJUZXN0Q29uZmlnOworc3RydWN0IFNiUGxheWVyVGVzdENvbmZpZyB7CisgIFNiUGxheWVyVGVzdENvbmZpZyhjb25zdCBjaGFyKiBhdWRpb19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZpZGVvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5X3N5c3RlbSkKKyAgICAgIDogYXVkaW9fZmlsZW5hbWUoYXVkaW9fZmlsZW5hbWUpLAorICAgICAgICB2aWRlb19maWxlbmFtZSh2aWRlb19maWxlbmFtZSksCisgICAgICAgIG91dHB1dF9tb2RlKG91dHB1dF9tb2RlKSwKKyAgICAgICAga2V5X3N5c3RlbShrZXlfc3lzdGVtKSwKKyAgICAgICAgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcygiIikge30KKyAgU2JQbGF5ZXJUZXN0Q29uZmlnKGNvbnN0IGNoYXIqIGF1ZGlvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmlkZW9fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF4X3ZpZGVvX2NhcGFiaWxpdGllcykKKyAgICAgIDogYXVkaW9fZmlsZW5hbWUoYXVkaW9fZmlsZW5hbWUpLAorICAgICAgICB2aWRlb19maWxlbmFtZSh2aWRlb19maWxlbmFtZSksCisgICAgICAgIG91dHB1dF9tb2RlKG91dHB1dF9tb2RlKSwKKyAgICAgICAga2V5X3N5c3RlbShrZXlfc3lzdGVtKSwKKyAgICAgICAgbWF4X3ZpZGVvX2NhcGFiaWxpdGllcyhtYXhfdmlkZW9fY2FwYWJpbGl0aWVzKSB7fQorICBjb25zdCBjaGFyKiBhdWRpb19maWxlbmFtZTsKKyAgY29uc3QgY2hhciogdmlkZW9fZmlsZW5hbWU7CisgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZTsKKyAgY29uc3QgY2hhcioga2V5X3N5c3RlbTsKKyAgY29uc3QgY2hhciogbWF4X3ZpZGVvX2NhcGFiaWxpdGllczsKK307CisKK3N0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBHZXRBdWRpb1Rlc3RGaWxlcygpOworc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IEdldFZpZGVvVGVzdEZpbGVzKCk7CitzdGQ6OnZlY3RvcjxTYlBsYXllck91dHB1dE1vZGU+IEdldFBsYXllck91dHB1dE1vZGVzKCk7CitzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gR2V0S2V5U3lzdGVtcygpOwogCiBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IEdldFN1cHBvcnRlZFNiUGxheWVyVGVzdENvbmZpZ3MoCiAgICAgY29uc3QgY2hhcioga2V5X3N5c3RlbSA9ICIiKTsKIAorc3RkOjpzdHJpbmcgR2V0U2JQbGF5ZXJUZXN0Q29uZmlnTmFtZSgKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88U2JQbGF5ZXJUZXN0Q29uZmlnPiBpbmZvKTsKKwogdm9pZCBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jKFNiUGxheWVyIHBsYXllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNhbXBsZV9idWZmZXIpOwpAQCAtNzgsMTMgKzEwNiwxOCBAQAogICAgIFNiTWVkaWFUeXBlIHNhbXBsZV90eXBlLAogICAgIHNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OnZpZGVvX2RtcDo6VmlkZW9EbXBSZWFkZXIqIGRtcF9yZWFkZXIsCiAgICAgaW50IHN0YXJ0X2luZGV4LAotICAgIGludCBudW1iZXJfb2Zfc2FtcGxlc190b193cml0ZSk7CisgICAgaW50IG51bWJlcl9vZl9zYW1wbGVzX3RvX3dyaXRlLAorICAgIFNiVGltZSB0aW1lc3RhbXBfb2Zmc2V0ID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTYlRpbWU+JiBkaXNjYXJkZWRfZHVyYXRpb25zX2Zyb21fZnJvbnQgPSB7fSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTYlRpbWU+JiBkaXNjYXJkZWRfZHVyYXRpb25zX2Zyb21fYmFjayA9IHt9KTsKIAogYm9vbCBJc091dHB1dE1vZGVTdXBwb3J0ZWQoU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSAiIik7CiAKK2Jvb2wgSXNQYXJ0aWFsQXVkaW9TdXBwb3J0ZWQoKTsKKwogfSAgLy8gbmFtZXNwYWNlIG5wbGIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIApkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL25wbGIvcGxheWVyX3dyaXRlX3NhbXBsZV90ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvcGxheWVyX3dyaXRlX3NhbXBsZV90ZXN0LmNjCmluZGV4IGNmMzNjYjQuLjQxNGE0ZWEgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9ucGxiL3BsYXllcl93cml0ZV9zYW1wbGVfdGVzdC5jYworKysgYi9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfd3JpdGVfc2FtcGxlX3Rlc3QuY2MKQEAgLTEyLDExICsxMiwxMyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3N0cmluZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL2RybV9oZWxwZXJzLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0aW9uX3BhcmFtX2hlbHBlcnMuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9wbGF5ZXJfdGVzdF9maXh0dXJlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfdXRpbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL3RocmVhZF9oZWxwZXJzLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTI2LDEyICsyOCwxNyBAQAogdXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXNJbjsKIAogdHlwZWRlZiBTYlBsYXllclRlc3RGaXh0dXJlOjpHcm91cGVkU2FtcGxlcyBHcm91cGVkU2FtcGxlczsKK3R5cGVkZWYgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIEZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlcjsKIAogY2xhc3MgU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3QKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2JQbGF5ZXJUZXN0Q29uZmlnPiB7fTsKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2JQbGF5ZXJUZXN0Q29uZmlnPiB7CisgcHJvdGVjdGVkOgorICBGYWtlR3JhcGhpY3NDb250ZXh0UHJvdmlkZXIgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKK307CiAKIFRFU1RfUChTYlBsYXllcldyaXRlU2FtcGxlVGVzdCwgU2Vla0FuZERlc3Ryb3kpIHsKLSAgU2JQbGF5ZXJUZXN0Rml4dHVyZSBwbGF5ZXJfZml4dHVyZShHZXRQYXJhbSgpKTsKKyAgU2JQbGF5ZXJUZXN0Rml4dHVyZSBwbGF5ZXJfZml4dHVyZShHZXRQYXJhbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfKTsKICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC0zOSwyNCArNDYsMjYgQEAKIH0KIAogVEVTVF9QKFNiUGxheWVyV3JpdGVTYW1wbGVUZXN0LCBOb0lucHV0KSB7Ci0gIFNiUGxheWVyVGVzdEZpeHR1cmUgcGxheWVyX2ZpeHR1cmUoR2V0UGFyYW0oKSk7CisgIFNiUGxheWVyVGVzdEZpeHR1cmUgcGxheWVyX2ZpeHR1cmUoR2V0UGFyYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXyk7CiAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewogICAgIHJldHVybjsKICAgfQogCiAgIEdyb3VwZWRTYW1wbGVzIHNhbXBsZXM7CiAgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNBdWRpbygpKSB7Ci0gICAgc2FtcGxlcy5BZGRBdWRpb1NhbXBsZXNXaXRoRU9TKDAsIDApOworICAgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKICAgfQogICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzVmlkZW8oKSkgewotICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzV2l0aEVPUygwLCAwKTsKKyAgICBzYW1wbGVzLkFkZFZpZGVvRU9TKCk7CiAgIH0KICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV3JpdGUoc2FtcGxlcykpOwogICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5XYWl0Rm9yUGxheWVyRW5kT2ZTdHJlYW0oKSk7CiB9CiAKIFRFU1RfUChTYlBsYXllcldyaXRlU2FtcGxlVGVzdCwgV3JpdGVTaW5nbGVCYXRjaCkgewotICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCkpOworICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOwogICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKICAgICByZXR1cm47CiAgIH0KQEAgLTY1LDEyICs3NCwxNCBAQAogICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgewogICAgIGludCBzYW1wbGVzX3RvX3dyaXRlID0gU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUoCiAgICAgICAgIHBsYXllcl9maXh0dXJlLkdldFBsYXllcigpLCBrU2JNZWRpYVR5cGVBdWRpbyk7Ci0gICAgc2FtcGxlcy5BZGRBdWRpb1NhbXBsZXNXaXRoRU9TKDAsIHNhbXBsZXNfdG9fd3JpdGUpOworICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKDAsIHNhbXBsZXNfdG9fd3JpdGUpOworICAgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKICAgfQogICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzVmlkZW8oKSkgewogICAgIGludCBzYW1wbGVzX3RvX3dyaXRlID0gU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUoCiAgICAgICAgIHBsYXllcl9maXh0dXJlLkdldFBsYXllcigpLCBrU2JNZWRpYVR5cGVWaWRlbyk7Ci0gICAgc2FtcGxlcy5BZGRWaWRlb1NhbXBsZXNXaXRoRU9TKDAsIHNhbXBsZXNfdG9fd3JpdGUpOworICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzKDAsIHNhbXBsZXNfdG9fd3JpdGUpOworICAgIHNhbXBsZXMuQWRkVmlkZW9FT1MoKTsKICAgfQogCiAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldyaXRlKHNhbXBsZXMpKTsKQEAgLTc4LDcgKzg5LDggQEAKIH0KIAogVEVTVF9QKFNiUGxheWVyV3JpdGVTYW1wbGVUZXN0LCBXcml0ZU11bHRpcGxlQmF0Y2hlcykgewotICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCkpOworICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOwogICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKICAgICByZXR1cm47CiAgIH0KQEAgLTg2LDEwICs5OCw5IEBACiAgIGludCBzYW1wbGVzX3RvX3dyaXRlID0gMDsKICAgLy8gVHJ5IHRvIHdyaXRlIG11bHRpcGxlIGJhdGNoZXMgZm9yIGJvdGggYXVkaW8gYW5kIHZpZGVvLgogICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSkgewotICAgIHNhbXBsZXNfdG9fd3JpdGUgPSBzdGQ6Om1heCgKLSAgICAgICAgc2FtcGxlc190b193cml0ZSwgU2JQbGF5ZXJHZXRNYXhpbXVtTnVtYmVyT2ZTYW1wbGVzUGVyV3JpdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfZml4dHVyZS5HZXRQbGF5ZXIoKSwga1NiTWVkaWFUeXBlQXVkaW8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIHNhbXBsZXNfdG9fd3JpdGUgPSBTYlBsYXllckdldE1heGltdW1OdW1iZXJPZlNhbXBsZXNQZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcl9maXh0dXJlLkdldFBsYXllcigpLCBrU2JNZWRpYVR5cGVBdWRpbykgKworICAgICAgICAgICAgICAgICAgICAgICAxOwogICB9CiAgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNWaWRlbygpKSB7CiAgICAgc2FtcGxlc190b193cml0ZSA9IHN0ZDo6bWF4KApAQCAtMTAzLDI3ICsxMTQsMjc5IEBACiAKICAgR3JvdXBlZFNhbXBsZXMgc2FtcGxlczsKICAgaWYgKHBsYXllcl9maXh0dXJlLkhhc0F1ZGlvKCkpIHsKLSAgICBzYW1wbGVzLkFkZEF1ZGlvU2FtcGxlc1dpdGhFT1MoMCwgc2FtcGxlc190b193cml0ZSk7CisgICAgc2FtcGxlcy5BZGRBdWRpb1NhbXBsZXMoMCwgc2FtcGxlc190b193cml0ZSk7CisgICAgc2FtcGxlcy5BZGRBdWRpb0VPUygpOwogICB9CiAgIGlmIChwbGF5ZXJfZml4dHVyZS5IYXNWaWRlbygpKSB7Ci0gICAgc2FtcGxlcy5BZGRWaWRlb1NhbXBsZXNXaXRoRU9TKDAsIHNhbXBsZXNfdG9fd3JpdGUpOworICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzKDAsIHNhbXBsZXNfdG9fd3JpdGUpOworICAgIHNhbXBsZXMuQWRkVmlkZW9FT1MoKTsKICAgfQogCiAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldyaXRlKHNhbXBsZXMpKTsKICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV2FpdEZvclBsYXllckVuZE9mU3RyZWFtKCkpOwogfQogCitURVNUX1AoU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3QsIExpbWl0ZWRBdWRpb0lucHV0KSB7CisgIFNiUGxheWVyVGVzdEZpeHR1cmUgcGxheWVyX2ZpeHR1cmUoR2V0UGFyYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXyk7CisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRPRE86IHdlIHNpbXBseSBzZXQgYXVkaW8gd3JpdGUgZHVyYXRpb24gdG8gMC41IHNlY29uZC4gSWRlYWxseSwgd2Ugc2hvdWxkCisgIC8vIHNldCB0aGUgYXVkaW8gd3JpdGUgZHVyYXRpb24gdG8gMTAgc2Vjb25kcyBpZiBhdWRpbyBjb25uZWN0b3JzIGFyZSByZW1vdGUuCisgIHBsYXllcl9maXh0dXJlLlNldEF1ZGlvV3JpdGVEdXJhdGlvbihrU2JUaW1lU2Vjb25kIC8gMik7CisKKyAgR3JvdXBlZFNhbXBsZXMgc2FtcGxlczsKKyAgaWYgKHBsYXllcl9maXh0dXJlLkhhc0F1ZGlvKCkpIHsKKyAgICBzYW1wbGVzLkFkZEF1ZGlvU2FtcGxlcygKKyAgICAgICAgMCwgcGxheWVyX2ZpeHR1cmUuQ29udmVydER1cmF0aW9uVG9BdWRpb0J1ZmZlckNvdW50KGtTYlRpbWVTZWNvbmQpKTsKKyAgICBzYW1wbGVzLkFkZEF1ZGlvRU9TKCk7CisgIH0KKyAgaWYgKHBsYXllcl9maXh0dXJlLkhhc1ZpZGVvKCkpIHsKKyAgICBzYW1wbGVzLkFkZFZpZGVvU2FtcGxlcygKKyAgICAgICAgMCwgcGxheWVyX2ZpeHR1cmUuQ29udmVydER1cmF0aW9uVG9WaWRlb0J1ZmZlckNvdW50KGtTYlRpbWVTZWNvbmQpKTsKKyAgICBzYW1wbGVzLkFkZFZpZGVvRU9TKCk7CisgIH0KKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJFbmRPZlN0cmVhbSgpKTsKK30KKworVEVTVF9QKFNiUGxheWVyV3JpdGVTYW1wbGVUZXN0LCBQYXJ0aWFsQXVkaW8pIHsKKyAgaWYgKCFJc1BhcnRpYWxBdWRpb1N1cHBvcnRlZCgpKSB7CisgICAgLy8gVE9ETzogVXNlIEdURVNUX1NLSVAgd2hlbiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiBndGVzdC4KKyAgICBTQl9MT0coSU5GTykKKyAgICAgICAgPDwgIlRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCBhdWRpby4gU2tpcCB0aGUgdGVzdHMuIjsKKyAgICByZXR1cm47CisgIH0KKworICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwbGF5ZXJfZml4dHVyZS5IYXNBdWRpbygpKSB7CisgICAgLy8gVE9ETzogVXNlIEdURVNUX1NLSVAgd2hlbiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiBndGVzdC4KKyAgICBTQl9MT0coSU5GTykgPDwgIlNraXAgUGFydGlhbEF1ZGlvIHRlc3QgZm9yIGF1ZGlvbGVzcyBjb250ZW50LiI7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgU2JUaW1lIGtEdXJhdGlvblRvUGxheSA9IGtTYlRpbWVTZWNvbmQ7CisgIGNvbnN0IGZsb2F0IGtTZWdtZW50U2l6ZSA9IDAuMWY7CisKKyAgR3JvdXBlZFNhbXBsZXMgc2FtcGxlczsKKyAgaWYgKHBsYXllcl9maXh0dXJlLkhhc1ZpZGVvKCkpIHsKKyAgICBzYW1wbGVzLkFkZFZpZGVvU2FtcGxlcygKKyAgICAgICAgMCwgcGxheWVyX2ZpeHR1cmUuQ29udmVydER1cmF0aW9uVG9WaWRlb0J1ZmZlckNvdW50KGtEdXJhdGlvblRvUGxheSkpOworICAgIHNhbXBsZXMuQWRkVmlkZW9FT1MoKTsKKyAgfQorCisgIGludCB0b3RhbF9idWZmZXJzX3RvX3dyaXRlID0KKyAgICAgIHBsYXllcl9maXh0dXJlLkNvbnZlcnREdXJhdGlvblRvQXVkaW9CdWZmZXJDb3VudChrRHVyYXRpb25Ub1BsYXkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX2J1ZmZlcnNfdG9fd3JpdGU7IGkrKykgeworICAgIFNiVGltZSBjdXJyZW50X3RpbWVzdGFtcCA9IHBsYXllcl9maXh0dXJlLkdldEF1ZGlvU2FtcGxlVGltZXN0YW1wKGkpOworICAgIFNiVGltZSBuZXh0X3RpbWVzdGFtcCA9IHBsYXllcl9maXh0dXJlLkdldEF1ZGlvU2FtcGxlVGltZXN0YW1wKGkgKyAxKTsKKyAgICBTYlRpbWUgYnVmZmVyX2R1cmF0aW9uID0gbmV4dF90aW1lc3RhbXAgLSBjdXJyZW50X3RpbWVzdGFtcDsKKyAgICBTYlRpbWUgc2VnbWVudF9kdXJhdGlvbiA9IGJ1ZmZlcl9kdXJhdGlvbiAqIGtTZWdtZW50U2l6ZTsKKyAgICBTYlRpbWUgd3JpdHRlbl9kdXJhdGlvbiA9IDA7CisgICAgd2hpbGUgKHdyaXR0ZW5fZHVyYXRpb24gPCBidWZmZXJfZHVyYXRpb24pIHsKKyAgICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKAorICAgICAgICAgIGksIDEsIHdyaXR0ZW5fZHVyYXRpb24sIHdyaXR0ZW5fZHVyYXRpb24sCisgICAgICAgICAgc3RkOjptYXg8aW50NjRfdD4oCisgICAgICAgICAgICAgIDAsIGJ1ZmZlcl9kdXJhdGlvbiAtIHdyaXR0ZW5fZHVyYXRpb24gLSBzZWdtZW50X2R1cmF0aW9uKSk7CisgICAgICB3cml0dGVuX2R1cmF0aW9uICs9IHNlZ21lbnRfZHVyYXRpb247CisgICAgfQorICB9CisgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJQcmVzZW50aW5nKCkpOworCisgIFNiVGltZSBzdGFydF9zeXN0ZW1fdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBTYlRpbWUgc3RhcnRfbWVkaWFfdGltZSA9IHBsYXllcl9maXh0dXJlLkdldEN1cnJlbnRNZWRpYVRpbWUoKTsKKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5XYWl0Rm9yUGxheWVyRW5kT2ZTdHJlYW0oKSk7CisKKyAgU2JUaW1lIGVuZF9zeXN0ZW1fdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBTYlRpbWUgZW5kX21lZGlhX3RpbWUgPSBwbGF5ZXJfZml4dHVyZS5HZXRDdXJyZW50TWVkaWFUaW1lKCk7CisKKyAgY29uc3QgU2JUaW1lIGtEdXJhdGlvbkRpZmZlcmVuY2VBbGxvd2FuY2UgPSA1MDAgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CisgIEVYUEVDVF9ORUFSKGVuZF9tZWRpYV90aW1lLCBrRHVyYXRpb25Ub1BsYXksIGtEdXJhdGlvbkRpZmZlcmVuY2VBbGxvd2FuY2UpOworICBFWFBFQ1RfTkVBUihlbmRfc3lzdGVtX3RpbWUgLSBzdGFydF9zeXN0ZW1fdGltZSArIHN0YXJ0X21lZGlhX3RpbWUsCisgICAgICAgICAgICAgIGtEdXJhdGlvblRvUGxheSwga0R1cmF0aW9uRGlmZmVyZW5jZUFsbG93YW5jZSk7CisKKyAgU0JfRExPRyhJTkZPKSA8PCAiVGhlIGV4cGVjdGVkIG1lZGlhIHRpbWUgc2hvdWxkIGJlICIgPDwga0R1cmF0aW9uVG9QbGF5CisgICAgICAgICAgICAgICAgPDwgIiwgdGhlIGFjdHVhbCBtZWRpYSB0aW1lIGlzICIgPDwgZW5kX21lZGlhX3RpbWUKKyAgICAgICAgICAgICAgICA8PCAiLCB3aXRoIGRpZmZlcmVuY2UgIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6YWJzKGVuZF9tZWRpYV90aW1lIC0ga0R1cmF0aW9uVG9QbGF5KSA8PCAiLiI7CisgIFNCX0RMT0coSU5GTykgPDwgIlRoZSBleHBlY3RlZCB0b3RhbCBwbGF5aW5nIHRpbWUgc2hvdWxkIGJlICIKKyAgICAgICAgICAgICAgICA8PCBrRHVyYXRpb25Ub1BsYXkgPDwgIiwgdGhlIGFjdHVhbCBwbGF5aW5nIHRpbWUgaXMgIgorICAgICAgICAgICAgICAgIDw8IGVuZF9zeXN0ZW1fdGltZSAtIHN0YXJ0X3N5c3RlbV90aW1lICsgc3RhcnRfbWVkaWFfdGltZQorICAgICAgICAgICAgICAgIDw8ICIsIHdpdGggZGlmZmVyZW5jZSAiCisgICAgICAgICAgICAgICAgPDwgc3RkOjphYnMoZW5kX3N5c3RlbV90aW1lIC0gc3RhcnRfc3lzdGVtX3RpbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X21lZGlhX3RpbWUgLSBrRHVyYXRpb25Ub1BsYXkpCisgICAgICAgICAgICAgICAgPDwgIi4iOworfQorCitURVNUX1AoU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3QsIFBhcnRpYWxBdWRpb0Rpc2NhcmRBbGwpIHsKKyAgaWYgKCFJc1BhcnRpYWxBdWRpb1N1cHBvcnRlZCgpKSB7CisgICAgLy8gVE9ETzogVXNlIEdURVNUX1NLSVAgd2hlbiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiBndGVzdC4KKyAgICBTQl9MT0coSU5GTykKKyAgICAgICAgPDwgIlRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCBhdWRpby4gU2tpcCB0aGUgdGVzdHMuIjsKKyAgICByZXR1cm47CisgIH0KKworICBTYlBsYXllclRlc3RGaXh0dXJlIHBsYXllcl9maXh0dXJlKEdldFBhcmFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwbGF5ZXJfZml4dHVyZS5IYXNBdWRpbygpKSB7CisgICAgLy8gVE9ETzogVXNlIEdURVNUX1NLSVAgd2hlbiB3ZSBoYXZlIGEgbmV3ZXIgdmVyc2lvbiBvZiBndGVzdC4KKyAgICBTQl9MT0coSU5GTykgPDwgIlNraXAgUGFydGlhbEF1ZGlvIHRlc3QgZm9yIGF1ZGlvbGVzcyBjb250ZW50LiI7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgU2JUaW1lIGtEdXJhdGlvblRvUGxheSA9IGtTYlRpbWVTZWNvbmQ7CisgIGNvbnN0IFNiVGltZSBrRHVyYXRpb25QZXJXcml0ZSA9IDEwMCAqIGtTYlRpbWVNaWxsaXNlY29uZDsKKyAgY29uc3QgU2JUaW1lIGtOdW1iZXJPZkJ1ZmZlcnNUb0Rpc2NhcmQgPSAyMDsKKworICBHcm91cGVkU2FtcGxlcyBzYW1wbGVzOworICBpZiAocGxheWVyX2ZpeHR1cmUuSGFzVmlkZW8oKSkgeworICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzKAorICAgICAgICAwLCBwbGF5ZXJfZml4dHVyZS5Db252ZXJ0RHVyYXRpb25Ub1ZpZGVvQnVmZmVyQ291bnQoa0R1cmF0aW9uVG9QbGF5KSk7CisgICAgc2FtcGxlcy5BZGRWaWRlb0VPUygpOworICB9CisKKyAgaW50IHdyaXR0ZW5fYnVmZmVyX2luZGV4ID0gMDsKKyAgU2JUaW1lIGN1cnJlbnRfdGltZV9vZmZzZXQgPSAwOworICBpbnQgbnVtX29mX2J1ZmZlcnNfcGVyX3dyaXRlID0KKyAgICAgIHBsYXllcl9maXh0dXJlLkNvbnZlcnREdXJhdGlvblRvQXVkaW9CdWZmZXJDb3VudChrRHVyYXRpb25QZXJXcml0ZSk7CisgIHdoaWxlIChjdXJyZW50X3RpbWVfb2Zmc2V0IDwga0R1cmF0aW9uVG9QbGF5KSB7CisgICAgLy8gRGlzY2FyZCBmcm9tIGZyb250LgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bWJlck9mQnVmZmVyc1RvRGlzY2FyZDsgaSsrKSB7CisgICAgICBzYW1wbGVzLkFkZEF1ZGlvU2FtcGxlcyh3cml0dGVuX2J1ZmZlcl9pbmRleCwgMSwgY3VycmVudF90aW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlRpbWVTZWNvbmQsIDApOworICAgIH0KKworICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKHdyaXR0ZW5fYnVmZmVyX2luZGV4LCBudW1fb2ZfYnVmZmVyc19wZXJfd3JpdGUpOworICAgIHdyaXR0ZW5fYnVmZmVyX2luZGV4ICs9IG51bV9vZl9idWZmZXJzX3Blcl93cml0ZTsKKyAgICBjdXJyZW50X3RpbWVfb2Zmc2V0ICs9IGtEdXJhdGlvblBlcldyaXRlOworCisgICAgLy8gRGlzY2FyZCBmcm9tIGJhY2suCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtYmVyT2ZCdWZmZXJzVG9EaXNjYXJkOyBpKyspIHsKKyAgICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKHdyaXR0ZW5fYnVmZmVyX2luZGV4LCAxLCBjdXJyZW50X3RpbWVfb2Zmc2V0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiVGltZVNlY29uZCk7CisgICAgfQorICB9CisgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJQcmVzZW50aW5nKCkpOworCisgIFNiVGltZSBzdGFydF9zeXN0ZW1fdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBTYlRpbWUgc3RhcnRfbWVkaWFfdGltZSA9IHBsYXllcl9maXh0dXJlLkdldEN1cnJlbnRNZWRpYVRpbWUoKTsKKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5XYWl0Rm9yUGxheWVyRW5kT2ZTdHJlYW0oKSk7CisKKyAgU2JUaW1lIGVuZF9zeXN0ZW1fdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBTYlRpbWUgZW5kX21lZGlhX3RpbWUgPSBwbGF5ZXJfZml4dHVyZS5HZXRDdXJyZW50TWVkaWFUaW1lKCk7CisKKyAgY29uc3QgU2JUaW1lIGtEdXJhdGlvbkRpZmZlcmVuY2VBbGxvd2FuY2UgPSA1MDAgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CisgIFNiVGltZSB0b3RhbF93cml0dGVuX2R1cmF0aW9uID0KKyAgICAgIHBsYXllcl9maXh0dXJlLkdldEF1ZGlvU2FtcGxlVGltZXN0YW1wKHdyaXR0ZW5fYnVmZmVyX2luZGV4KTsKKyAgRVhQRUNUX05FQVIoZW5kX21lZGlhX3RpbWUsIHRvdGFsX3dyaXR0ZW5fZHVyYXRpb24sCisgICAgICAgICAgICAgIGtEdXJhdGlvbkRpZmZlcmVuY2VBbGxvd2FuY2UpOworICBFWFBFQ1RfTkVBUihlbmRfc3lzdGVtX3RpbWUgLSBzdGFydF9zeXN0ZW1fdGltZSArIHN0YXJ0X21lZGlhX3RpbWUsCisgICAgICAgICAgICAgIHRvdGFsX3dyaXR0ZW5fZHVyYXRpb24sIGtEdXJhdGlvbkRpZmZlcmVuY2VBbGxvd2FuY2UpOworCisgIFNCX0RMT0coSU5GTykgPDwgIlRoZSBleHBlY3RlZCBtZWRpYSB0aW1lIHNob3VsZCBiZSAiCisgICAgICAgICAgICAgICAgPDwgdG90YWxfd3JpdHRlbl9kdXJhdGlvbiA8PCAiLCB0aGUgYWN0dWFsIG1lZGlhIHRpbWUgaXMgIgorICAgICAgICAgICAgICAgIDw8IGVuZF9tZWRpYV90aW1lIDw8ICIsIHdpdGggZGlmZmVyZW5jZSAiCisgICAgICAgICAgICAgICAgPDwgc3RkOjphYnMoZW5kX21lZGlhX3RpbWUgLSB0b3RhbF93cml0dGVuX2R1cmF0aW9uKSA8PCAiLiI7CisgIFNCX0RMT0coSU5GTykgPDwgIlRoZSBleHBlY3RlZCB0b3RhbCBwbGF5aW5nIHRpbWUgc2hvdWxkIGJlICIKKyAgICAgICAgICAgICAgICA8PCB0b3RhbF93cml0dGVuX2R1cmF0aW9uIDw8ICIsIHRoZSBhY3R1YWwgcGxheWluZyB0aW1lIGlzICIKKyAgICAgICAgICAgICAgICA8PCBlbmRfc3lzdGVtX3RpbWUgLSBzdGFydF9zeXN0ZW1fdGltZSArIHN0YXJ0X21lZGlhX3RpbWUKKyAgICAgICAgICAgICAgICA8PCAiLCB3aXRoIGRpZmZlcmVuY2UgIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6YWJzKGVuZF9zeXN0ZW1fdGltZSAtIHN0YXJ0X3N5c3RlbV90aW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tZWRpYV90aW1lIC0gdG90YWxfd3JpdHRlbl9kdXJhdGlvbikKKyAgICAgICAgICAgICAgICA8PCAiLiI7Cit9CisKK2NsYXNzIFNlY29uZGFyeVBsYXllclRlc3RUaHJlYWQgOiBwdWJsaWMgQWJzdHJhY3RUZXN0VGhyZWFkIHsKKyBwdWJsaWM6CisgIFNlY29uZGFyeVBsYXllclRlc3RUaHJlYWQoCisgICAgICBjb25zdCBTYlBsYXllclRlc3RDb25maWcmIGNvbmZpZywKKyAgICAgIEZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlciogZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKQorICAgICAgOiBjb25maWdfKGNvbmZpZyksCisgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8oZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyKSB7fQorCisgIHZvaWQgUnVuKCkgb3ZlcnJpZGUgeworICAgIFNiUGxheWVyVGVzdEZpeHR1cmUgcGxheWVyX2ZpeHR1cmUoY29uZmlnXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8pOworICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgU2JUaW1lIGtEdXJhdGlvblRvUGxheSA9IGtTYlRpbWVNaWxsaXNlY29uZCAqIDIwMDsKKworICAgIEdyb3VwZWRTYW1wbGVzIHNhbXBsZXM7CisgICAgaWYgKHBsYXllcl9maXh0dXJlLkhhc0F1ZGlvKCkpIHsKKyAgICAgIHNhbXBsZXMuQWRkQXVkaW9TYW1wbGVzKAorICAgICAgICAgIDAsIHBsYXllcl9maXh0dXJlLkNvbnZlcnREdXJhdGlvblRvQXVkaW9CdWZmZXJDb3VudChrRHVyYXRpb25Ub1BsYXkpKTsKKyAgICAgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKKyAgICB9CisgICAgaWYgKHBsYXllcl9maXh0dXJlLkhhc1ZpZGVvKCkpIHsKKyAgICAgIHNhbXBsZXMuQWRkVmlkZW9TYW1wbGVzKAorICAgICAgICAgIDAsIHBsYXllcl9maXh0dXJlLkNvbnZlcnREdXJhdGlvblRvVmlkZW9CdWZmZXJDb3VudChrRHVyYXRpb25Ub1BsYXkpKTsKKyAgICAgIHNhbXBsZXMuQWRkVmlkZW9FT1MoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocGxheWVyX2ZpeHR1cmUuV2FpdEZvclBsYXllckVuZE9mU3RyZWFtKCkpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBTYlBsYXllclRlc3RDb25maWcgY29uZmlnXzsKKyAgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfOworfTsKKworVEVTVF9QKFNiUGxheWVyV3JpdGVTYW1wbGVUZXN0LCBTZWNvbmRhcnlQbGF5ZXJUZXN0KSB7CisgIC8vIFRoZSBzZWNvbmRhcnkgcGxheWVyIHNob3VsZCBhdCBsZWFzdCBzdXBwb3J0IGgyNjQgYXQgNDgwcCwgMzBmcHMgYW5kIHdpdGgKKyAgLy8gYSBkcm0gc3lzdGVtLgorICBjb25zdCBjaGFyKiBrTWF4VmlkZW9DYXBhYmlsaXRpZXMgPSAid2lkdGg9NjQwOyBoZWlnaHQ9NDgwOyBmcmFtZXJhdGU9MzA7IjsKKyAgY29uc3QgY2hhcioga1NlY29uZGFyeVRlc3RGaWxlID0gImJlbmVhdGhfdGhlX2Nhbm9weV8xMzVfYXZjLmRtcCI7CisgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSBHZXRQYXJhbSgpLmtleV9zeXN0ZW07CisKKyAgU2JQbGF5ZXJUZXN0Q29uZmlnIHNlY29uZGFyeV9wbGF5ZXJfY29uZmlnKG51bGxwdHIsIGtTZWNvbmRhcnlUZXN0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3N5c3RlbSwga01heFZpZGVvQ2FwYWJpbGl0aWVzKTsKKyAgUGxheWVyQ3JlYXRpb25QYXJhbSBjcmVhdGlvbl9wYXJhbSA9CisgICAgICBDcmVhdGVQbGF5ZXJDcmVhdGlvblBhcmFtKHNlY29uZGFyeV9wbGF5ZXJfY29uZmlnKTsKKyAgc2Vjb25kYXJ5X3BsYXllcl9jb25maWcub3V0cHV0X21vZGUgPSBHZXRQcmVmZXJyZWRPdXRwdXRNb2RlKGNyZWF0aW9uX3BhcmFtKTsKKworICBBU1NFUlRfTkUoc2Vjb25kYXJ5X3BsYXllcl9jb25maWcub3V0cHV0X21vZGUsIGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkKTsKKworICBTZWNvbmRhcnlQbGF5ZXJUZXN0VGhyZWFkIHByaW1hcnlfcGxheWVyX3RocmVhZCgKKyAgICAgIEdldFBhcmFtKCksICZmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfKTsKKyAgU2Vjb25kYXJ5UGxheWVyVGVzdFRocmVhZCBzZWNvbmRhcnlfcGxheWVyX3RocmVhZCgKKyAgICAgIHNlY29uZGFyeV9wbGF5ZXJfY29uZmlnLCAmZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXyk7CisKKyAgcHJpbWFyeV9wbGF5ZXJfdGhyZWFkLlN0YXJ0KCk7CisgIHNlY29uZGFyeV9wbGF5ZXJfdGhyZWFkLlN0YXJ0KCk7CisKKyAgcHJpbWFyeV9wbGF5ZXJfdGhyZWFkLkpvaW4oKTsKKyAgc2Vjb25kYXJ5X3BsYXllcl90aHJlYWQuSm9pbigpOworfQorCiBzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IEdldFN1cHBvcnRlZFRlc3RDb25maWdzKCkgewogICBzdGF0aWMgc3RkOjp2ZWN0b3I8U2JQbGF5ZXJUZXN0Q29uZmlnPiBzdXBwb3J0ZWRfY29uZmlnczsKICAgaWYgKHN1cHBvcnRlZF9jb25maWdzLnNpemUoKSA+IDApIHsKICAgICByZXR1cm4gc3VwcG9ydGVkX2NvbmZpZ3M7CiAgIH0KIAotICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4ga2V5X3N5c3RlbXM7Ci0gIGtleV9zeXN0ZW1zLnB1c2hfYmFjaygiIik7Ci0gIGtleV9zeXN0ZW1zLmluc2VydChrZXlfc3lzdGVtcy5lbmQoKSwga0tleVN5c3RlbXMsCi0gICAgICAgICAgICAgICAgICAgICBrS2V5U3lzdGVtcyArIFNCX0FSUkFZX1NJWkVfSU5UKGtLZXlTeXN0ZW1zKSk7Ci0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+JiBrZXlfc3lzdGVtcyA9IEdldEtleVN5c3RlbXMoKTsKICAgZm9yIChhdXRvIGtleV9zeXN0ZW0gOiBrZXlfc3lzdGVtcykgewogICAgIHN0ZDo6dmVjdG9yPFNiUGxheWVyVGVzdENvbmZpZz4gY29uZmlncyA9CiAgICAgICAgIEdldFN1cHBvcnRlZFNiUGxheWVyVGVzdENvbmZpZ3Moa2V5X3N5c3RlbSk7CkBAIC0xMzMsMzAgKzM5NiwxMCBAQAogICByZXR1cm4gc3VwcG9ydGVkX2NvbmZpZ3M7CiB9CiAKLXN0ZDo6c3RyaW5nIEdldFRlc3RDb25maWdOYW1lKAotICAgIDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxTYlBsYXllclRlc3RDb25maWc+IGluZm8pIHsKLSAgY29uc3QgU2JQbGF5ZXJUZXN0Q29uZmlnJiBjb25maWcgPSBpbmZvLnBhcmFtOwotICBjb25zdCBjaGFyKiBhdWRpb19maWxlbmFtZSA9IHN0ZDo6Z2V0PDA+KGNvbmZpZyk7Ci0gIGNvbnN0IGNoYXIqIHZpZGVvX2ZpbGVuYW1lID0gc3RkOjpnZXQ8MT4oY29uZmlnKTsKLSAgY29uc3QgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlID0gc3RkOjpnZXQ8Mj4oY29uZmlnKTsKLSAgY29uc3QgY2hhcioga2V5X3N5c3RlbSA9IHN0ZDo6Z2V0PDM+KGNvbmZpZyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUoRm9ybWF0U3RyaW5nKAotICAgICAgImF1ZGlvXyVzX3ZpZGVvXyVzX291dHB1dF8lc19rZXlfc3lzdGVtXyVzIiwKLSAgICAgIGF1ZGlvX2ZpbGVuYW1lICYmIHN0cmxlbihhdWRpb19maWxlbmFtZSkgPiAwID8gYXVkaW9fZmlsZW5hbWUgOiAibnVsbCIsCi0gICAgICB2aWRlb19maWxlbmFtZSAmJiBzdHJsZW4odmlkZW9fZmlsZW5hbWUpID4gMCA/IHZpZGVvX2ZpbGVuYW1lIDogIm51bGwiLAotICAgICAgb3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSA/ICJkZWNvZGVfdG9fdGV4dHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAicHVuY2hfb3V0IiwKLSAgICAgIHN0cmxlbihrZXlfc3lzdGVtKSA+IDAgPyBrZXlfc3lzdGVtIDogIm51bGwiKSk7Ci0gIHN0ZDo6cmVwbGFjZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksICcuJywgJ18nKTsKLSAgc3RkOjpyZXBsYWNlKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSwgJygnLCAnXycpOwotICBzdGQ6OnJlcGxhY2UobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCAnKScsICdfJyk7Ci0gIHJldHVybiBuYW1lOwotfQotCiBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTYlBsYXllcldyaXRlU2FtcGxlVGVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllcldyaXRlU2FtcGxlVGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFN1cHBvcnRlZFRlc3RDb25maWdzKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGVzdENvbmZpZ05hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2JQbGF5ZXJUZXN0Q29uZmlnTmFtZSk7CiAKIH0gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG5wbGIKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ucGxiL3NvY2tldF93YWl0ZXJfd2FpdF90ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl93YWl0X3Rlc3QuY2MKaW5kZXggNTM3NDNlMi4uNWU5NGM1NCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl93YWl0X3Rlc3QuY2MKKysrIGIvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl93YWl0X3Rlc3QuY2MKQEAgLTI3LDYgKzI3LDcgQEAKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CiAKK0dURVNUX0FMTE9XX1VOSU5TVEFOVElBVEVEX1BBUkFNRVRFUklaRURfVEVTVChTYlNvY2tldFdhaXRlcldhaXRUZXN0KTsKIGNsYXNzIFNiU29ja2V0V2FpdGVyV2FpdFRlc3QKICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2JTb2NrZXRBZGRyZXNzVHlwZT4gewogIHB1YmxpYzoKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9ucGxiL3NvY2tldF93YWl0ZXJfd2FpdF90aW1lZF90ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl93YWl0X3RpbWVkX3Rlc3QuY2MKaW5kZXggNzU0MWJlZi4uNjkyNDU0ZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl93YWl0X3RpbWVkX3Rlc3QuY2MKKysrIGIvc3RhcmJvYXJkL25wbGIvc29ja2V0X3dhaXRlcl93YWl0X3RpbWVkX3Rlc3QuY2MKQEAgLTI1LDYgKzI1LDcgQEAKIG5hbWVzcGFjZSBucGxiIHsKIG5hbWVzcGFjZSB7CiAKK0dURVNUX0FMTE9XX1VOSU5TVEFOVElBVEVEX1BBUkFNRVRFUklaRURfVEVTVChTYlNvY2tldFdhaXRlcldhaXRUaW1lZFRlc3QpOwogY2xhc3MgU2JTb2NrZXRXYWl0ZXJXYWl0VGltZWRUZXN0CiAgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNiU29ja2V0QWRkcmVzc1R5cGU+IHsKICBwdWJsaWM6CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvbnBsYi92ZXJ0aWNhbF92aWRlb190ZXN0LmNjIGIvc3RhcmJvYXJkL25wbGIvdmVydGljYWxfdmlkZW9fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDI3YWViCi0tLSAvZGV2L251bGwKKysrIGIvc3RhcmJvYXJkL25wbGIvdmVydGljYWxfdmlkZW9fdGVzdC5jYwpAQCAtMCwwICsxLDE2NyBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvcGxheWVyX3Rlc3RfZml4dHVyZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9ucGxiL3BsYXllcl90ZXN0X3V0aWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIHNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OnZpZGVvX2RtcDo6VmlkZW9EbXBSZWFkZXI7Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlc0luOworCit0eXBlZGVmIFNiUGxheWVyVGVzdEZpeHR1cmU6Okdyb3VwZWRTYW1wbGVzIEdyb3VwZWRTYW1wbGVzOworCitHVEVTVF9BTExPV19VTklOU1RBTlRJQVRFRF9QQVJBTUVURVJJWkVEX1RFU1QoVmVydGljYWxWaWRlb1Rlc3QpOworY2xhc3MgVmVydGljYWxWaWRlb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNiUGxheWVyVGVzdENvbmZpZz4geworIHByb3RlY3RlZDoKKyAgdGVzdGluZzo6RmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl87Cit9OworCit2b2lkIENoZWNrVmVydGljYWxSZXNvbHV0aW9uU3VwcG9ydChjb25zdCBjaGFyKiBtaW1lKSB7CisgIFNCX0xPR19JRihXQVJOSU5HLCBTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0obWltZSwgIiIpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KQorICAgICAgPDwgIlZlcnRpY2FsIHZpZGVvICgiIDw8IG1pbWUKKyAgICAgIDw8ICIpIHNob3VsZCBiZSBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4iOworfQorCitzdGQ6OnZlY3RvcjxTYlBsYXllclRlc3RDb25maWc+IEdldFZlcnRpY2FsVmlkZW9UZXN0Q29uZmlncygpIHsKKyAgY29uc3QgY2hhcioga1ZpZGVvRmlsZW5hbWVzW10gPSB7InZlcnRpY2FsXzEwODBwXzMwX2Zwc18xMzdfYXZjLmRtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbF80a18zMF9mcHNfMzEzX3ZwOS5kbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGljYWxfOGtfMzBfZnBzXzU3MV9hdjEuZG1wIn07CisgIGNvbnN0IGNoYXIqIGtBdWRpb0ZpbGVuYW1lID0gInNpbGVuY2VfYWFjX3N0ZXJlby5kbXAiOworCisgIGNvbnN0IFNiUGxheWVyT3V0cHV0TW9kZSBrT3V0cHV0TW9kZXNbXSA9IHtrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0fTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gdmlkZW9fZmlsZXM7CisgIGZvciAoYXV0byB2aWRlb19maWxlbmFtZSA6IGtWaWRlb0ZpbGVuYW1lcykgeworICAgIFZpZGVvRG1wUmVhZGVyIHZpZGVvX2RtcF9yZWFkZXIodmlkZW9fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RtcFJlYWRlcjo6a0VuYWJsZVJlYWRPbkRlbWFuZCk7CisgICAgU0JfRENIRUNLKHZpZGVvX2RtcF9yZWFkZXIubnVtYmVyX29mX3ZpZGVvX2J1ZmZlcnMoKSA+IDApOworICAgIGlmIChTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0oCisgICAgICAgICAgICB2aWRlb19kbXBfcmVhZGVyLnZpZGVvX21pbWVfdHlwZSgpLmNfc3RyKCksICIiKSkgeworICAgICAgdmlkZW9fZmlsZXMucHVzaF9iYWNrKHZpZGVvX2ZpbGVuYW1lKTsKKyAgICB9CisgIH0KKworICBWaWRlb0RtcFJlYWRlciBhdWRpb19kbXBfcmVhZGVyKGtBdWRpb0ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRG1wUmVhZGVyOjprRW5hYmxlUmVhZE9uRGVtYW5kKTsKKyAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMgPSBhdWRpb19kbXBfcmVhZGVyLmF1ZGlvX2NvZGVjKCk7CisKKyAgc3RkOjp2ZWN0b3I8U2JQbGF5ZXJUZXN0Q29uZmlnPiB0ZXN0X2NvbmZpZ3M7CisgIGZvciAoYXV0byB2aWRlb19maWxlbmFtZSA6IHZpZGVvX2ZpbGVzKSB7CisgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMgPSBrU2JNZWRpYVZpZGVvQ29kZWNOb25lOworICAgIFZpZGVvRG1wUmVhZGVyIHZpZGVvX2RtcF9yZWFkZXIodmlkZW9fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RtcFJlYWRlcjo6a0VuYWJsZVJlYWRPbkRlbWFuZCk7CisgICAgdmlkZW9fY29kZWMgPSB2aWRlb19kbXBfcmVhZGVyLnZpZGVvX2NvZGVjKCk7CisKKyAgICBmb3IgKGF1dG8gb3V0cHV0X21vZGUgOiBrT3V0cHV0TW9kZXMpIHsKKyAgICAgIGlmIChJc091dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGUsIGF1ZGlvX2NvZGVjLCB2aWRlb19jb2RlYywgIiIpKSB7CisgICAgICAgIHRlc3RfY29uZmlncy5lbXBsYWNlX2JhY2soa0F1ZGlvRmlsZW5hbWUsIHZpZGVvX2ZpbGVuYW1lLCBvdXRwdXRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRlc3RfY29uZmlnczsKK30KKworVEVTVChWZXJ0aWNhbFZpZGVvVGVzdCwgQ2FwYWJpbGl0eVF1ZXJ5KSB7CisgIFNiTWVkaWFTdXBwb3J0VHlwZSBzdXBwb3J0ID0gU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKAorICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXZjMS40ZDAwMmFcIjsgd2lkdGg9MTkyMDsgaGVpZ2h0PTEwODAiLCAiIik7CisgIGlmIChzdXBwb3J0ID09IGtTYk1lZGlhU3VwcG9ydFR5cGVQcm9iYWJseSkgeworICAgIENoZWNrVmVydGljYWxSZXNvbHV0aW9uU3VwcG9ydCgKKyAgICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXZjMS40ZDAwMmFcIjsgd2lkdGg9NjA4OyBoZWlnaHQ9MTA4MCIpOworICB9CisKKyAgc3VwcG9ydCA9IFNiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbSgKKyAgICAgICJ2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDlcIjsgd2lkdGg9MjU2MDsgaGVpZ2h0PTE0NDAiLCAiIik7CisgIGlmIChzdXBwb3J0ID09IGtTYk1lZGlhU3VwcG9ydFR5cGVQcm9iYWJseSkgeworICAgIENoZWNrVmVydGljYWxSZXNvbHV0aW9uU3VwcG9ydCgKKyAgICAgICAgInZpZGVvL3dlYm07IGNvZGVjcz1cInZwOVwiOyB3aWR0aD04MTA7IGhlaWdodD0xNDQwIik7CisgIH0KKworICBzdXBwb3J0ID0gU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKAorICAgICAgInZpZGVvL3dlYm07IGNvZGVjcz1cInZwOVwiOyB3aWR0aD0zODQwOyBoZWlnaHQ9MjE2MCIsICIiKTsKKyAgaWYgKHN1cHBvcnQgPT0ga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KSB7CisgICAgQ2hlY2tWZXJ0aWNhbFJlc29sdXRpb25TdXBwb3J0KAorICAgICAgICAidmlkZW8vd2VibTsgY29kZWNzPVwidnA5XCI7IHdpZHRoPTEyMTU7IGhlaWdodD0yMTYwIik7CisgIH0KKworICBzdXBwb3J0ID0gU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKAorICAgICAgInZpZGVvL21wNDsgY29kZWNzPVwiYXYwMS4wLjE2TS4wOFwiOyB3aWR0aD03NjgwOyBoZWlnaHQ9NDMyMCIsICIiKTsKKyAgaWYgKHN1cHBvcnQgPT0ga1NiTWVkaWFTdXBwb3J0VHlwZVByb2JhYmx5KSB7CisgICAgQ2hlY2tWZXJ0aWNhbFJlc29sdXRpb25TdXBwb3J0KAorICAgICAgICAidmlkZW8vbXA0OyBjb2RlY3M9XCJhdjAxLjAuMTZNLjA4XCI7IHdpZHRoPTI0MzA7IGhlaWdodD00MzIwIik7CisgIH0KK30KKworVEVTVF9QKFZlcnRpY2FsVmlkZW9UZXN0LCBXcml0ZVNhbXBsZXMpIHsKKyAgU2JQbGF5ZXJUZXN0Rml4dHVyZSBwbGF5ZXJfZml4dHVyZShHZXRQYXJhbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfKTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgU0JfRENIRUNLKHBsYXllcl9maXh0dXJlLkhhc1ZpZGVvKCkpOworICBTQl9EQ0hFQ0socGxheWVyX2ZpeHR1cmUuSGFzQXVkaW8oKSk7CisKKyAgaW50IGF1ZGlvX3NhbXBsZXNfdG9fd3JpdGUgPSBwbGF5ZXJfZml4dHVyZS5Db252ZXJ0RHVyYXRpb25Ub0F1ZGlvQnVmZmVyQ291bnQoCisgICAgICAyMDAgKiBrU2JUaW1lTWlsbGlzZWNvbmQpOworICBpbnQgdmlkZW9fc2FtcGxlc190b193cml0ZSA9IHBsYXllcl9maXh0dXJlLkNvbnZlcnREdXJhdGlvblRvVmlkZW9CdWZmZXJDb3VudCgKKyAgICAgIDIwMCAqIGtTYlRpbWVNaWxsaXNlY29uZCk7CisKKyAgR3JvdXBlZFNhbXBsZXMgc2FtcGxlczsKKyAgc2FtcGxlcy5BZGRWaWRlb1NhbXBsZXMoMCwgYXVkaW9fc2FtcGxlc190b193cml0ZSk7CisgIHNhbXBsZXMuQWRkVmlkZW9FT1MoKTsKKyAgc2FtcGxlcy5BZGRBdWRpb1NhbXBsZXMoMCwgdmlkZW9fc2FtcGxlc190b193cml0ZSk7CisgIHNhbXBsZXMuQWRkQXVkaW9FT1MoKTsKKworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwbGF5ZXJfZml4dHVyZS5Xcml0ZShzYW1wbGVzKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHBsYXllcl9maXh0dXJlLldhaXRGb3JQbGF5ZXJFbmRPZlN0cmVhbSgpKTsKK30KKworc3RkOjp2ZWN0b3I8U2JQbGF5ZXJUZXN0Q29uZmlnPiBHZXRTdXBwb3J0ZWRUZXN0Q29uZmlncygpIHsKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPFNiUGxheWVyVGVzdENvbmZpZz4gc3VwcG9ydGVkX2NvbmZpZ3M7CisgIGlmIChzdXBwb3J0ZWRfY29uZmlncy5zaXplKCkgPiAwKSB7CisgICAgcmV0dXJuIHN1cHBvcnRlZF9jb25maWdzOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U2JQbGF5ZXJUZXN0Q29uZmlnPiBjb25maWdzID0gR2V0VmVydGljYWxWaWRlb1Rlc3RDb25maWdzKCk7CisgIHN1cHBvcnRlZF9jb25maWdzLmluc2VydChzdXBwb3J0ZWRfY29uZmlncy5lbmQoKSwgY29uZmlncy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlncy5lbmQoKSk7CisgIHJldHVybiBzdXBwb3J0ZWRfY29uZmlnczsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFZlcnRpY2FsVmlkZW9UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNhbFZpZGVvVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihHZXRTdXBwb3J0ZWRUZXN0Q29uZmlncygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTYlBsYXllclRlc3RDb25maWdOYW1lKTsKKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbnBsYgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3BsYXllci5oIGIvc3RhcmJvYXJkL3BsYXllci5oCmluZGV4IDMyYjczMDkuLmFiZjE3YTYgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9wbGF5ZXIuaAorKysgYi9zdGFyYm9hcmQvcGxheWVyLmgKQEAgLTY2OCw3ICs2NjgsOSBAQAogLy8gICAgICAgaXNzdWVzIG9jY3VyIChzdWNoIGFzIHRyYW5zaWVudCBvciBpbmRlZmluaXRlIGhhbmdpbmcpLgogLy8KIC8vIFRoZSBhdWRpbyBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgYXZhaWxhYmxlIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCB0aGV5Ci0vLyBoYXZlIHRvIGJlIGF2YWlsYWJsZSB3aGVuIHRoZSB8cGxheWVyfCBpcyBhdCBga1NiUGxheWVyU3RhdGVQcmVzZW50aW5nYC4KKy8vIGhhdmUgdG8gYmUgYXZhaWxhYmxlIHdoZW4gdGhlIHxwbGF5ZXJ8IGlzIGF0IGBrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmdgLAorLy8gdW5sZXNzIHRoZSBhdWRpbyBjb2RlYyBpcyB8a1NiTWVkaWFBdWRpb0NvZGVjTm9uZXwgb3IgdGhlcmUncyBubyB3cml0dGVuCisvLyBhdWRpbyBpbnB1dHMuCiAvLwogLy8gVGhlIGFwcCB3aWxsIHNldCB8YXVkaW9fd3JpdGVfZHVyYXRpb258IHRvIGBrU2JQbGF5ZXJXcml0ZUR1cmF0aW9uTG9jYWxgCiAvLyB3aGVuIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGlzbid0IGF2YWlsYWJsZSAoaS5lLiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZQpAQCAtNjc2LDEwICs2NzgsMTAgQEAKIC8vIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgU2JQbGF5ZXIgaXMgY3JlYXRlZCwgaWYgaXQgZXhwZWN0cyB0aGUgYXBwIHRvCiAvLyB0cmVhdCB0aGUgcGxhdGZvcm0gYXMgdXNpbmcgd2lyZWxlc3MgYXVkaW8gb3V0cHV0cy4KIC8vCi0vLyBPbmNlIGF0IGxlYXN0IG9uZSBhdWRpbyBjb25maWd1cmF0aW9ucyBhcmUgcmV0dXJuZWQsIHRoZSByZXR1cm4gdmFsdWVzCi0vLyBzaG91bGRuJ3QgY2hhbmdlIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mIHxwbGF5ZXJ8LiAgVGhlIHBsYXRmb3JtIG1heSBpbmZvcm0KLS8vIHRoZSBhcHAgb2YgYW55IGNoYW5nZXMgYnkgc2VuZGluZyBga1NiUGxheWVyRXJyb3JDYXBhYmlsaXR5Q2hhbmdlZGAgdG8KLS8vIHJlcXVlc3QgYSBwbGF5YmFjayByZXN0YXJ0LgorLy8gT25jZSBhdCBsZWFzdCBvbmUgYXVkaW8gY29uZmlndXJhdGlvbnMgYXJlIHJldHVybmVkLCB0aGUgcmV0dXJuIHZhbHVlcyBhbmQKKy8vIHRoZWlyIG9yZGVycyBzaG91bGRuJ3QgY2hhbmdlIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mIHxwbGF5ZXJ8LiAgVGhlIHBsYXRmb3JtCisvLyBtYXkgaW5mb3JtIHRoZSBhcHAgb2YgYW55IGNoYW5nZXMgYnkgc2VuZGluZworLy8gYGtTYlBsYXllckVycm9yQ2FwYWJpbGl0eUNoYW5nZWRgIHRvIHJlcXVlc3QgYSBwbGF5YmFjayByZXN0YXJ0LgogLy8KIC8vIHxwbGF5ZXJ8OiBUaGUgcGxheWVyIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIGJlaW5nIHJldHJpZXZlZC4gTXVzdCBub3QgYmUKIC8vICAgfGtTYlBsYXllckludmFsaWR8LgpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3Jhc3BpLzIvdG9vbGNoYWluL0JVSUxELmduIGIvc3RhcmJvYXJkL3Jhc3BpLzIvdG9vbGNoYWluL0JVSUxELmduCmluZGV4IDA5OTNlODYuLmRjY2U3NjAgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9yYXNwaS8yL3Rvb2xjaGFpbi9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvcmFzcGkvMi90b29sY2hhaW4vQlVJTEQuZ24KQEAgLTIzLDcgKzIzLDcgQEAKICAgIyBXZSB1c2Ugd2hhdGV2ZXIgJ2FyJyByZXNvbHZlcyB0by4KICAgYXIgPSBnY2NfdG9vbGNoYWluX2FyCiAKLSAgdGFpbF9saWJfZGVwZW5kZW5jaWVzID0gIi1sOmxpYnB0aHJlYWQuc28uMCIKKyAgdGFpbF9saWJfZGVwZW5kZW5jaWVzID0gIi1sOmxpYnB0aHJlYWQuc28uMCAtbDpsaWJkbC5zby4yIgogCiAgIHRvb2xjaGFpbl9hcmdzID0gewogICAgIGlzX2NsYW5nID0gZmFsc2UKQEAgLTM4LDcgKzM4LDcgQEAKICAgIyBXZSB1c2Ugd2hhdGV2ZXIgJ2FyJyByZXNvbHZlcyB0by4KICAgYXIgPSBnY2NfdG9vbGNoYWluX2FyCiAKLSAgdGFpbF9saWJfZGVwZW5kZW5jaWVzID0gIi1sOmxpYnB0aHJlYWQuc28uMCIKKyAgdGFpbF9saWJfZGVwZW5kZW5jaWVzID0gIi1sOmxpYnB0aHJlYWQuc28uMCAtbDpsaWJkbC5zby4yIgogCiAgIHRvb2xjaGFpbl9hcmdzID0gewogICAgIGlzX3N0YXJib2FyZCA9IGZhbHNlCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL0JVSUxELmduIGIvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9CVUlMRC5nbgppbmRleCAyOWMwNTZkLi4zYTRiMzMxIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL0JVSUxELmduCisrKyBiL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvQlVJTEQuZ24KQEAgLTM1NCw3ICszNTQsNyBAQAogICAgICI6c3RhcmJvYXJkX2Jhc2Vfc3ltYm9saXplIiwKICAgICAiLy9zdGFyYm9hcmQ6c3RhcmJvYXJkX2hlYWRlcnNfb25seSIsCiAgICAgIi8vc3RhcmJvYXJkL2NvbW1vbiIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWc6ZmZtcGVnX2xpbmtlZCIsCisgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWc6ZmZtcGVnX2R5bmFtaWNfbG9hZCIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWE6bWVkaWFfdXRpbCIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlcjpmaWx0ZXJfYmFzZWRfcGxheWVyX3NvdXJjZXMiLAogICBdCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggM2M5ZWQ2NC4uYWY4ZmQ3NyAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMTAyLDExICsxMDIsNiBAQAogCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyBiaWxpbmVhciBmaWx0ZXJpbmcuCi0vLyBUaGlzIGNhbiBiZSBjaGVja2VkIHRvIGVuYWJsZS9kaXNhYmxlIHJlbmRlcmVyIHRlc3RzIHRoYXQgdmVyaWZ5IHRoYXQgdGhpcyBpcwotLy8gd29ya2luZyBwcm9wZXJseS4KLSNkZWZpbmUgU0JfSEFTX0JJTElORUFSX0ZJTFRFUklOR19TVVBQT1JUIDEKLQogLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyByZW5kZXJpbmcgb2YgTlYxMgogLy8gdGV4dHVyZXMuIFRoZXNlIHRleHR1cmVzIHR5cGljYWxseSBvcmlnaW5hdGUgZnJvbSB2aWRlbyBkZWNvZGVycy4KICNkZWZpbmUgU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUIDEKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbiBiL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvcGxhdGZvcm1fY29uZmlndXJhdGlvbi9CVUlMRC5nbgppbmRleCBmZmY2ZmU4Li5iMWM5MzBlIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24vQlVJTEQuZ24KKysrIGIvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9wbGF0Zm9ybV9jb25maWd1cmF0aW9uL0JVSUxELmduCkBAIC0xMjMsOSArMTIzLDcgQEAKIGNvbmZpZygicGxhdGZvcm1fY29uZmlndXJhdGlvbiIpIHsKICAgbGlicyA9IFsKICAgICAiYXNvdW5kIiwKLSAgICAiYXZjb2RlYyIsCi0gICAgImF2Zm9ybWF0IiwKLSAgICAiYXZ1dGlsIiwKKyAgICAiZGwiLAogICAgICJwdGhyZWFkIiwKICAgICAicnQiLAogICAgICJvcGVubWF4aWwiLApkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC90ZXN0X2ZpbHRlcnMucHkgYi9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3Rlc3RfZmlsdGVycy5weQppbmRleCA5ZThlMTQ2Li5kMDMxYTVkIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3Rlc3RfZmlsdGVycy5weQorKysgYi9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3Rlc3RfZmlsdGVycy5weQpAQCAtMjMsMTQgKzIzLDIxIEBACiAgICAgICAgICMgUGVybWFuZW50bHkgZmlsdGVyIG91dCBkcm0gc3lzdGVtIHJlbGF0ZWQgdGVzdHMgYXMgcmFzcGkgZG9lc24ndAogICAgICAgICAjIHN1cHBvcnQgYW55IGRybSBzeXN0ZW1zIGFuZCB0aGVyZSBpcyBubyBwbGFuIHRvIGltcGxlbWVudCBzdWNoCiAgICAgICAgICMgc3VwcG9ydC4KKyAgICAgICAgJ011bHRpcGxlUGxheWVyVGVzdHMqJywKICAgICAgICAgJ1NiRHJtVGVzdC5BbnlTdXBwb3J0ZWRLZXlTeXN0ZW1zJywKICAgICAgICAgJ1NiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbS5BbnlTdXBwb3J0ZWRLZXlTeXN0ZW1zJywKICAgICAgICAgJ1NiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbS5LZXlTeXN0ZW1XaXRoQXR0cmlidXRlcycsCiAgICAgICAgICdTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0uTWluaW11bVN1cHBvcnQnLAogICAgICAgICAnU2JNZWRpYVNldEF1ZGlvV3JpdGVEdXJhdGlvblRlc3RzLyonLAorICAgICAgICAnU2JQbGF5ZXJHZXRBdWRpb0NvbmZpZ3VyYXRpb25UZXN0cy8qJywKICAgICAgICAgJ1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0cyonLAogICAgICAgICAnU2JVbmRlZmluZWRCZWhhdmlvclRlc3QuQ2FsbFRoaXNQb2ludGVySXNOdWxsUmFpbnlEYXknLAogICAgICAgICAnU2JTeXN0ZW1HZXRQcm9wZXJ0eVRlc3QuRkxBS1lfUmV0dXJuc1JlcXVpcmVkJywKKyAgICAgICAgIyBGYWlsdXJlIHRyYWNrZWQgYnkgYi8yODc2NjY2MDYuCisgICAgICAgICdWZXJ0aWNhbFZpZGVvVGVzdHMvVmVydGljYWxWaWRlb1Rlc3QuV3JpdGVTYW1wbGVzKicsCisKKyAgICAgICAgIyBFbmFibGUgb25jZSB2ZXJpZmllZCBvbiB0aGUgcGxhdGZvcm0uCisgICAgICAgICdTYk1lZGlhQ2FuUGxheU1pbWVBbmRLZXlTeXN0ZW0uTWluaW11bVN1cHBvcnQnLAogICAgIF0sCiAgICAgJ3BsYXllcl9maWx0ZXJfdGVzdHMnOiBbCiAgICAgICAgICMgVGhlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIHJhc3BiZXJyeSBwaSAoMCBhbmQgMikgYXJlIGluY29tcGxldGUKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuY2MgYi9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlcl9pbXBsLmNjCmluZGV4IDhhN2M4OTguLjg3Nzg2OWUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuY2MKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXJfaW1wbC5jYwpAQCAtMjA3LDYgKzIwNyw3IEBACiAgICAgSW5pdGlhbGl6ZUNvZGVjKCk7CiAgIH0KIAorICBTY29wZWRMb2NrIGxvY2soZGVjb2RlX3RhcmdldF9hbmRfZnJhbWVzX211dGV4Xyk7CiAgIGRlY2x0eXBlKGZyYW1lc18pIGZyYW1lczsKICAgZnJhbWVzXyA9IHN0ZDo6cXVldWU8c2NvcGVkX3JlZnB0cjxDcHVWaWRlb0ZyYW1lPj4oKTsKIH0KQEAgLTMxMCw2ICszMTEsNyBAQAogCiAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKICAgaWYgKG91dHB1dF9tb2RlXyA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlKSB7CisgICAgU2NvcGVkTG9jayBsb2NrKGRlY29kZV90YXJnZXRfYW5kX2ZyYW1lc19tdXRleF8pOwogICAgIGZyYW1lc18ucHVzaChmcmFtZSk7CiAgIH0KIApAQCAtMzk2LDcgKzM5OCw3IEBACiAgIGZmbXBlZ18tPkZyZWVGcmFtZSgmYXZfZnJhbWVfKTsKIAogICBpZiAob3V0cHV0X21vZGVfID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpIHsKLSAgICBTY29wZWRMb2NrIGxvY2soZGVjb2RlX3RhcmdldF9tdXRleF8pOworICAgIFNjb3BlZExvY2sgbG9jayhkZWNvZGVfdGFyZ2V0X2FuZF9mcmFtZXNfbXV0ZXhfKTsKICAgICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXRfKSkgewogICAgICAgRGVjb2RlVGFyZ2V0UmVsZWFzZShkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfdGFyZ2V0Xyk7CkBAIC00MTEsNyArNDEzLDcgQEAKIAogICAvLyBXZSBtdXN0IHRha2UgYSBsb2NrIGhlcmUgc2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYQogICAvLyBzZXBhcmF0ZSB0aHJlYWQuCi0gIFNjb3BlZExvY2sgbG9jayhkZWNvZGVfdGFyZ2V0X211dGV4Xyk7CisgIFNjb3BlZExvY2sgbG9jayhkZWNvZGVfdGFyZ2V0X2FuZF9mcmFtZXNfbXV0ZXhfKTsKICAgd2hpbGUgKGZyYW1lc18uc2l6ZSgpID4gMSAmJiBmcmFtZXNfLmZyb250KCktPkhhc09uZVJlZigpKSB7CiAgICAgZnJhbWVzXy5wb3AoKTsKICAgfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXJfaW1wbC5oIGIvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXJfaW1wbC5oCmluZGV4IGFhOWZhYWIuLjVmNjgwZTIgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyX2ltcGwuaAorKysgYi9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlcl9pbXBsLmgKQEAgLTE0Myw5ICsxNDMsOCBAQAogICAvLyBHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgbmVlZHMgdG8gYmUgY2FsbGVkIGZyb20gYW4gYXJiaXRyYXJ5IHRocmVhZAogICAvLyB0byBvYnRhaW4gdGhlIGN1cnJlbnQgZGVjb2RlIHRhcmdldCAod2hpY2ggdWx0aW1hdGVseSBlbmRzIHVwIGJlaW5nIGEKICAgLy8gY29weSBvZiB8ZGVjb2RlX3RhcmdldF98KSwgd2UgbmVlZCB0byBzYWZlLWd1YXJkIGFjY2VzcyB0byB8ZGVjb2RlX3RhcmdldF98Ci0gIC8vIGFuZCB3ZSBkbyBzbyB0aHJvdWdoIHRoaXMgbXV0ZXguCi0gIE11dGV4IGRlY29kZV90YXJnZXRfbXV0ZXhfOwotICAvLyBNdXRleCBmcmFtZV9tdXRleF87CisgIC8vIGFuZCB8ZnJhbWVzX3wsIHdlIGRvIHNvIHRocm91Z2ggdGhpcyBtdXRleC4KKyAgTXV0ZXggZGVjb2RlX3RhcmdldF9hbmRfZnJhbWVzX211dGV4XzsKIAogICAvLyBpbnQgZnJhbWVfbGFzdF9yZW5kZXJlZF9wdHNfOwogICAvLyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lXzsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX2ludGVybmFsLmNjIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9faW50ZXJuYWwuY2MKaW5kZXggNzk5NTJkNy4uMjgzNGJjMiAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9faW50ZXJuYWwuY2MKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9faW50ZXJuYWwuY2MKQEAgLTE0OSw4ICsxNDksNiBAQAogICBkaXNjYXJkZWRfZnJhbWVzX2Zyb21fZnJvbnQgPSBzdGQ6Om1pbihkaXNjYXJkZWRfZnJhbWVzX2Zyb21fZnJvbnQsIGZyYW1lcygpKTsKICAgb2Zmc2V0X2luX2J5dGVzXyArPSBieXRlc19wZXJfZnJhbWUgKiBkaXNjYXJkZWRfZnJhbWVzX2Zyb21fZnJvbnQ7CiAgIHNpemVfaW5fYnl0ZXNfIC09IGJ5dGVzX3Blcl9mcmFtZSAqIGRpc2NhcmRlZF9mcmFtZXNfZnJvbV9mcm9udDsKLSAgdGltZXN0YW1wXyArPQotICAgICAgbWVkaWE6OkF1ZGlvRnJhbWVzVG9EdXJhdGlvbihkaXNjYXJkZWRfZnJhbWVzX2Zyb21fZnJvbnQsIHNhbXBsZV9yYXRlKTsKIAogICBhdXRvIGRpc2NhcmRlZF9mcmFtZXNfZnJvbV9iYWNrID0KICAgICAgIEF1ZGlvRHVyYXRpb25Ub0ZyYW1lcyhkaXNjYXJkZWRfZHVyYXRpb25fZnJvbV9iYWNrLCBzYW1wbGVfcmF0ZSk7CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZGVjb2RlZF9hdWRpb190ZXN0X2ludGVybmFsLmNjIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9fdGVzdF9pbnRlcm5hbC5jYwppbmRleCBhNGVhZTE2Li5hMWUyY2QyIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZGVjb2RlZF9hdWRpb190ZXN0X2ludGVybmFsLmNjCisrKyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX3Rlc3RfaW50ZXJuYWwuY2MKQEAgLTI4NiwxOSArMjg2LDE2IEBACiAgICAgICAgICAga1NhbXBsZVJhdGUsIHF1YXJ0ZXJfZHVyYXRpb24sIHF1YXJ0ZXJfZHVyYXRpb24pOwogICAgICAgQVNTRVJUX05FQVIoYWRqdXN0ZWRfZGVjb2RlZF9hdWRpby0+ZnJhbWVzKCksCiAgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kZWNvZGVkX2F1ZGlvLT5mcmFtZXMoKSAvIDIsIDIpOwotICAgICAgQVNTRVJUX05FQVIoYWRqdXN0ZWRfZGVjb2RlZF9hdWRpby0+dGltZXN0YW1wKCksCi0gICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kZWNvZGVkX2F1ZGlvLT50aW1lc3RhbXAoKSArIHF1YXJ0ZXJfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICBkdXJhdGlvbl9vZl9vbmVfZnJhbWUgKiAyKTsKKyAgICAgIEFTU0VSVF9FUShhZGp1c3RlZF9kZWNvZGVkX2F1ZGlvLT50aW1lc3RhbXAoKSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbF9kZWNvZGVkX2F1ZGlvLT50aW1lc3RhbXAoKSk7CiAKICAgICAgIGFkanVzdGVkX2RlY29kZWRfYXVkaW8gPSBvcmlnaW5hbF9kZWNvZGVkX2F1ZGlvLT5DbG9uZSgpOwogICAgICAgLy8gQWRqdXN0IG1vcmUgZnJhbWVzIHRoYW4gaXQgaGFzIGZyb20gZnJvbnQKICAgICAgIGFkanVzdGVkX2RlY29kZWRfYXVkaW8tPkFkanVzdEZvckRpc2NhcmRlZER1cmF0aW9ucygKICAgICAgICAgICBrU2FtcGxlUmF0ZSwgZHVyYXRpb25fb2ZfZGVjb2RlZF9hdWRpbyAqIDIsIDApOwogICAgICAgQVNTRVJUX0VRKGFkanVzdGVkX2RlY29kZWRfYXVkaW8tPmZyYW1lcygpLCAwKTsKLSAgICAgIEFTU0VSVF9ORUFSKAotICAgICAgICAgIGFkanVzdGVkX2RlY29kZWRfYXVkaW8tPnRpbWVzdGFtcCgpLAotICAgICAgICAgIG9yaWdpbmFsX2RlY29kZWRfYXVkaW8tPnRpbWVzdGFtcCgpICsgZHVyYXRpb25fb2ZfZGVjb2RlZF9hdWRpbywKLSAgICAgICAgICBkdXJhdGlvbl9vZl9vbmVfZnJhbWUgKiAyKTsKKyAgICAgIEFTU0VSVF9FUShhZGp1c3RlZF9kZWNvZGVkX2F1ZGlvLT50aW1lc3RhbXAoKSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbF9kZWNvZGVkX2F1ZGlvLT50aW1lc3RhbXAoKSk7CiAKICAgICAgIGFkanVzdGVkX2RlY29kZWRfYXVkaW8gPSBvcmlnaW5hbF9kZWNvZGVkX2F1ZGlvLT5DbG9uZSgpOwogICAgICAgLy8gQWRqdXN0IG1vcmUgZnJhbWVzIHRoYW4gaXQgaGFzIGZyb20gYmFjawpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hZGFwdGl2ZV9hdWRpb19kZWNvZGVyX2ludGVybmFsLmNjIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hZGFwdGl2ZV9hdWRpb19kZWNvZGVyX2ludGVybmFsLmNjCmluZGV4IDdmODdiNWQuLjdlNzQ4MDMgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYWRhcHRpdmVfYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5jYworKysgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2FkYXB0aXZlX2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuY2MKQEAgLTE5Nyw2ICsxOTcsMTIgQEAKICAgaW50IGRlY29kZWRfc2FtcGxlX3JhdGU7CiAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlZEF1ZGlvPiBkZWNvZGVkX2F1ZGlvID0KICAgICAgIGF1ZGlvX2RlY29kZXJfLT5SZWFkKCZkZWNvZGVkX3NhbXBsZV9yYXRlKTsKKworICBpZiAoIWRlY29kZWRfYXVkaW8tPmlzX2VuZF9vZl9zdHJlYW0oKSAmJiAhZGVjb2RlZF9hdWRpby0+ZnJhbWVzKCkpIHsKKyAgICAvLyBFbXB0eSBvdXRwdXQgZG9lc24ndCBuZWVkIGZ1cnRoZXIgcHJvY2Vzcy4KKyAgICByZXR1cm47CisgIH0KKwogICBpZiAoIWZpcnN0X291dHB1dF9yZWNlaXZlZF8pIHsKICAgICBmaXJzdF9vdXRwdXRfcmVjZWl2ZWRfID0gdHJ1ZTsKICAgICBvdXRwdXRfc2FtcGxlX3R5cGVfID0gZGVjb2RlZF9hdWRpby0+c2FtcGxlX3R5cGUoKTsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuY2MgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmNjCmluZGV4IDg2ZjIxZWIuLjRhZDk0ZjEgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuY2MKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5jYwpAQCAtMjM1LDYgKzIzNSw5IEBACiB9CiAKIGJvb2wgSW50ZXJsZWF2ZWRTaW5jUmVzYW1wbGVyOjpDYW5RdWV1ZUJ1ZmZlcigpIGNvbnN0IHsKKyAgLy8gVE9ETyhiLzI4OTEwMjg3Nyk6IGFmdGVyIHN1cHBvcnQgcGFydGlhbCBhdWRpbywgZWFjaCBpbnB1dCBidWZmZXIgY291bGQKKyAgLy8gaGF2ZSBhIHNtYWxsIGFtb3VudCBvZiBmcmFtZXMuIFdlIHNob3VsZCBhdm9pZCB1c2luZyBjb3VudCBvZiBwZW5kaW5nCisgIC8vIGJ1ZmZlciBoZXJlLgogICBpZiAocGVuZGluZ19idWZmZXJzXy5lbXB0eSgpKSB7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaCBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvaW50ZXJsZWF2ZWRfc2luY19yZXNhbXBsZXIuaAppbmRleCAyOTk3NGIwLi4yYmY3NWRiIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ludGVybGVhdmVkX3NpbmNfcmVzYW1wbGVyLmgKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9pbnRlcmxlYXZlZF9zaW5jX3Jlc2FtcGxlci5oCkBAIC0xMDksNyArMTA5LDcgQEAKICAgc3RhdGljIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IGtCbG9ja1NpemUgKyBrS2VybmVsU2l6ZTsKIAogICAvLyBUaGUgbWF4aW11bSBudW1iZXJzIG9mIGJ1ZmZlciBjYW4gYmUgcXVldWVkLgotICBzdGF0aWMgY29uc3QgaW50IGtNYXhpbXVtUGVuZGluZ0J1ZmZlcnMgPSA4OworICBzdGF0aWMgY29uc3QgaW50IGtNYXhpbXVtUGVuZGluZ0J1ZmZlcnMgPSAxNjsKIAogICBzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CiAgIHN0YXRpYyBjb25zdCBpbnQga0lucHV0QnVmZmVyU2l6ZSA9IGtNYXhDaGFubmVscyAqIGtCdWZmZXJTaXplOwpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL0JVSUxELmduIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL0JVSUxELmduCmluZGV4IDE3NmMxZWQuLjgwZjI3NjUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9CVUlMRC5nbgorKysgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvQlVJTEQuZ24KQEAgLTEyLDQxICsxMiw0NCBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi10YXJnZXQoZ3Rlc3RfdGFyZ2V0X3R5cGUsICJwbGF5ZXJfZmlsdGVyX3Rlc3RzIikgewotICB0ZXN0b25seSA9IHRydWUKK2lmIChjdXJyZW50X3Rvb2xjaGFpbiA9PSBzdGFyYm9hcmRfdG9vbGNoYWluKSB7CisgIHRhcmdldChzdGFyYm9hcmRfbGV2ZWxfZ3Rlc3RfdGFyZ2V0X3R5cGUsICJwbGF5ZXJfZmlsdGVyX3Rlc3RzIikgeworICAgIGJ1aWxkX2xvYWRlciA9IGZhbHNlCisgICAgdGVzdG9ubHkgPSB0cnVlCiAKLSAgc291cmNlcyA9IFsKLSAgICAiLy9zdGFyYm9hcmQvY29tbW9uL3Rlc3RfbWFpbi5jYyIsCi0gICAgIi8vc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmNjIiwKLSAgICAiLy9zdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCIsCi0gICAgImFkYXB0aXZlX2F1ZGlvX2RlY29kZXJfdGVzdC5jYyIsCi0gICAgImF1ZGlvX2NoYW5uZWxfbGF5b3V0X21peGVyX3Rlc3QuY2MiLAotICAgICJhdWRpb19kZWNvZGVyX3Rlc3QuY2MiLAotICAgICJhdWRpb19mcmFtZV9kaXNjYXJkZXJfdGVzdC5jYyIsCi0gICAgImF1ZGlvX3JlbmRlcmVyX2ludGVybmFsX3Rlc3QuY2MiLAotICAgICJmaWxlX2NhY2hlX3JlYWRlcl90ZXN0LmNjIiwKLSAgICAibWVkaWFfdGltZV9wcm92aWRlcl9pbXBsX3Rlc3QuY2MiLAotICAgICJwbGF5ZXJfY29tcG9uZW50c190ZXN0LmNjIiwKLSAgICAidmlkZW9fZGVjb2Rlcl90ZXN0LmNjIiwKLSAgICAidmlkZW9fZGVjb2Rlcl90ZXN0X2ZpeHR1cmUuY2MiLAotICAgICJ2aWRlb19kZWNvZGVyX3Rlc3RfZml4dHVyZS5oIiwKLSAgICAidmlkZW9fZnJhbWVfY2FkZW5jZV9wYXR0ZXJuX2dlbmVyYXRvcl90ZXN0LmNjIiwKLSAgICAidmlkZW9fZnJhbWVfcmF0ZV9lc3RpbWF0b3JfdGVzdC5jYyIsCi0gIF0KKyAgICBzb3VyY2VzID0gWworICAgICAgIi8vc3RhcmJvYXJkL2NvbW1vbi90ZXN0X21haW4uY2MiLAorICAgICAgIi8vc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmNjIiwKKyAgICAgICIvL3N0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5oIiwKKyAgICAgICJhZGFwdGl2ZV9hdWRpb19kZWNvZGVyX3Rlc3QuY2MiLAorICAgICAgImF1ZGlvX2NoYW5uZWxfbGF5b3V0X21peGVyX3Rlc3QuY2MiLAorICAgICAgImF1ZGlvX2RlY29kZXJfdGVzdC5jYyIsCisgICAgICAiYXVkaW9fZnJhbWVfZGlzY2FyZGVyX3Rlc3QuY2MiLAorICAgICAgImF1ZGlvX3JlbmRlcmVyX2ludGVybmFsX3Rlc3QuY2MiLAorICAgICAgImZpbGVfY2FjaGVfcmVhZGVyX3Rlc3QuY2MiLAorICAgICAgIm1lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF90ZXN0LmNjIiwKKyAgICAgICJwbGF5ZXJfY29tcG9uZW50c190ZXN0LmNjIiwKKyAgICAgICJ2aWRlb19kZWNvZGVyX3Rlc3QuY2MiLAorICAgICAgInZpZGVvX2RlY29kZXJfdGVzdF9maXh0dXJlLmNjIiwKKyAgICAgICJ2aWRlb19kZWNvZGVyX3Rlc3RfZml4dHVyZS5oIiwKKyAgICAgICJ2aWRlb19mcmFtZV9jYWRlbmNlX3BhdHRlcm5fZ2VuZXJhdG9yX3Rlc3QuY2MiLAorICAgICAgInZpZGVvX2ZyYW1lX3JhdGVfZXN0aW1hdG9yX3Rlc3QuY2MiLAorICAgIF0KIAotICBwdWJsaWNfZGVwcyA9IFsKLSAgICAiOnRlc3RfdXRpbCIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWE6bWVkaWFfdXRpbCIsCi0gICAgIi8vdGVzdGluZy9nbW9jayIsCi0gIF0KKyAgICBwdWJsaWNfZGVwcyA9IFsKKyAgICAgICI6dGVzdF91dGlsIiwKKyAgICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhOm1lZGlhX3V0aWwiLAorICAgICAgIi8vdGVzdGluZy9nbW9jayIsCisgICAgXQogCi0gIGRlcHMgPSBjb2JhbHRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzCisgICAgZGVwcyA9IGNvYmFsdF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMKIAotICBkYXRhX2RlcHMgPQotICAgICAgWyAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXI6cGxheWVyX2Rvd25sb2FkX3Rlc3RfZGF0YSIgXQorICAgIGRhdGFfZGVwcyA9CisgICAgICAgIFsgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyOnBsYXllcl9kb3dubG9hZF90ZXN0X2RhdGEiIF0KKyAgfQogfQogCi1pZiAoaG9zdF9vcyAhPSAid2luIikgeworaWYgKGhvc3Rfb3MgIT0gIndpbiIgJiYgY3VycmVudF90b29sY2hhaW4gPT0gc3RhcmJvYXJkX3Rvb2xjaGFpbikgewogICB0YXJnZXQoZmluYWxfZXhlY3V0YWJsZV90eXBlLCAicGxheWVyX2ZpbHRlcl9iZW5jaG1hcmtzIikgewogICAgIHRlc3Rvbmx5ID0gdHJ1ZQogCkBAIC04MSw3ICs4NCw0IEBACiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyOnZpZGVvX2RtcCIsCiAgICAgIi8vdGVzdGluZy9ndGVzdCIsCiAgIF0KLSAgaWYgKGdsX3R5cGUgIT0gIm5vbmUiKSB7Ci0gICAgcHVibGljX2RlcHMgKz0gWyAiLy9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzIiBdCi0gIH0KIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9wbGF5ZXJfY29tcG9uZW50c190ZXN0LmNjIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9jb21wb25lbnRzX3Rlc3QuY2MKaW5kZXggZDU3YzI2OS4uMGUzYjNhZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9jb21wb25lbnRzX3Rlc3QuY2MKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9jb21wb25lbnRzX3Rlc3QuY2MKQEAgLTM4Miw4ICszODIsOCBAQAogICAvLyB3b3JraW5nLgogICB2b2lkIFJlbmRlckFuZFByb2Nlc3NQZW5kaW5nSm9icygpIHsKICAgICAvLyBDYWxsIEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBwZXJpb2RpY2FsbHkgZm9yIGRlY29kZSB0byB0ZXh0dXJlIG1vZGUuCi0gICAgaWYgKG91dHB1dF9tb2RlXyA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlICYmCi0gICAgICAgIEdldFZpZGVvUmVuZGVyZXIoKSkgeworICAgIC8vIE9yIGNhbGwgZmFrZSByZW5kZXJpbmcgdG8gZm9yY2UgcmVuZGVyZXIgZ28gb24gaW4gcHVuY2gtb3V0IG1vZGUuCisgICAgaWYgKEdldFZpZGVvUmVuZGVyZXIoKSkgewogI2lmIFNCX0hBUyhHTEVTMikKICAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8uUnVuT25HbGVzQ29udGV4dFRocmVhZCgKICAgICAgICAgICBzdGQ6OmJpbmQoJlBsYXllckNvbXBvbmVudHNUZXN0OjpSZW5kZXJPbkdsZXNDb250ZXh0VGhyZWFkLCB0aGlzKSk7CkBAIC00NDEsNyArNDQxLDExIEBACiAgIH0KIAogICB2b2lkIFJlbmRlck9uR2xlc0NvbnRleHRUaHJlYWQoKSB7Ci0gICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKEdldFZpZGVvUmVuZGVyZXIoKS0+R2V0Q3VycmVudERlY29kZVRhcmdldCgpKTsKKyAgICBpZiAob3V0cHV0X21vZGVfID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpIHsKKyAgICAgIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZShHZXRWaWRlb1JlbmRlcmVyKCktPkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8uUmVuZGVyKCk7CisgICAgfQogICB9CiAKICAgYm9vbCBUcnlUb1dyaXRlT25lSW5wdXRCdWZmZXIoU2JUaW1lIG1heF90aW1lc3RhbXApIHsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy90ZXN0X3V0aWwuY2MgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvdGVzdF91dGlsLmNjCmluZGV4IDI1YWQyODEuLjM5YWUxN2QgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy90ZXN0X3V0aWwuY2MKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3Rlc3RfdXRpbC5jYwpAQCAtMTgxLDE0ICsxODEsMzIgQEAKICAgICAgIGNvbnN0IGF1dG8mIHZpZGVvX3N0cmVhbV9pbmZvID0gZG1wX3JlYWRlci52aWRlb19zdHJlYW1faW5mbygpOwogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmlkZW9fbWltZSA9IGRtcF9yZWFkZXIudmlkZW9fbWltZV90eXBlKCk7CiAgICAgICBjb25zdCBNaW1lVHlwZSB2aWRlb19taW1lX3R5cGUodmlkZW9fbWltZS5jX3N0cigpKTsKLSAgICAgIGlmIChTYk1lZGlhSXNWaWRlb1N1cHBvcnRlZCgKLSAgICAgICAgICAgICAgZG1wX3JlYWRlci52aWRlb19jb2RlYygpLAotICAgICAgICAgICAgICB2aWRlb19taW1lLnNpemUoKSA+IDAgPyAmdmlkZW9fbWltZV90eXBlIDogbnVsbHB0ciwgLTEsIC0xLCA4LAotICAgICAgICAgICAgICBrU2JNZWRpYVByaW1hcnlJZFVuc3BlY2lmaWVkLCBrU2JNZWRpYVRyYW5zZmVySWRVbnNwZWNpZmllZCwKLSAgICAgICAgICAgICAga1NiTWVkaWFNYXRyaXhJZFVuc3BlY2lmaWVkLCB2aWRlb19zdHJlYW1faW5mby5mcmFtZV93aWR0aCwKLSAgICAgICAgICAgICAgdmlkZW9fc3RyZWFtX2luZm8uZnJhbWVfaGVpZ2h0LCBkbXBfcmVhZGVyLnZpZGVvX2JpdHJhdGUoKSwKLSAgICAgICAgICAgICAgZG1wX3JlYWRlci52aWRlb19mcHMoKSwgZmFsc2UpKSB7Ci0gICAgICAgIHRlc3RfcGFyYW1zLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoZmlsZW5hbWUsIG91dHB1dF9tb2RlKSk7CisgICAgICAvLyBTYk1lZGlhSXNWaWRlb1N1cHBvcnRlZCBtYXkgcmV0dXJuIGZhbHNlIGZvciBncHUgYmFzZWQgZGVjb2RlciB0aGF0IGluCisgICAgICAvLyBmYWN0IHN1cHBvcnRzIGF2MSBvci9hbmQgdnA5IGJlY2F1c2UgdGhlIHN5c3RlbSBjYW4gbWFrZSBhc3luYworICAgICAgLy8gaW5pdGlhbGl6YXRpb24gYXQgc3RhcnR1cC4KKyAgICAgIC8vIFRvIG1pbmltaXplIHByb2JhYmlsaXR5IG9mIGZhbHNlIG5lZ2F0aXZlIHdlIGNoZWNrIHJlc3VsdCBmZXcgdGltZXMKKyAgICAgIHN0YXRpYyBib29sIGRlY29kZXJfaGFzX2JlZW5fY2hlY2tlZF9vbmNlID0gZmFsc2U7CisgICAgICBpbnQgY291bnRlciA9IDU7CisgICAgICBjb25zdCBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYyA9IGRtcF9yZWFkZXIudmlkZW9fY29kZWMoKTsKKyAgICAgIGJvb2wgbmVlZF90b19jaGVja193aXRoX3dhaXQgPSB2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNBdjEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNWcDk7CisgICAgICBkbyB7CisgICAgICAgIGlmIChTYk1lZGlhSXNWaWRlb1N1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICB2aWRlb19jb2RlYywgdmlkZW9fbWltZS5zaXplKCkgPiAwID8gJnZpZGVvX21pbWVfdHlwZSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgLTEsIC0xLCA4LCBrU2JNZWRpYVByaW1hcnlJZFVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgIGtTYk1lZGlhVHJhbnNmZXJJZFVuc3BlY2lmaWVkLCBrU2JNZWRpYU1hdHJpeElkVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgdmlkZW9fc3RyZWFtX2luZm8uZnJhbWVfd2lkdGgsIHZpZGVvX3N0cmVhbV9pbmZvLmZyYW1lX2hlaWdodCwKKyAgICAgICAgICAgICAgICBkbXBfcmVhZGVyLnZpZGVvX2JpdHJhdGUoKSwgZG1wX3JlYWRlci52aWRlb19mcHMoKSwgZmFsc2UpKSB7CisgICAgICAgICAgdGVzdF9wYXJhbXMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShmaWxlbmFtZSwgb3V0cHV0X21vZGUpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChuZWVkX3RvX2NoZWNrX3dpdGhfd2FpdCAmJiAhZGVjb2Rlcl9oYXNfYmVlbl9jaGVja2VkX29uY2UpIHsKKyAgICAgICAgICBTYlRocmVhZFNsZWVwKGtTYlRpbWVTZWNvbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IHdoaWxlICgtLWNvdW50ZXIpOworICAgICAgaWYgKG5lZWRfdG9fY2hlY2tfd2l0aF93YWl0KSB7CisgICAgICAgIGRlY29kZXJfaGFzX2JlZW5fY2hlY2tlZF9vbmNlID0gdHJ1ZTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdG9vbHMvQlVJTEQuZ24gYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rvb2xzL0JVSUxELmduCmluZGV4IDYzNTdkYWIuLmIyZDBhNzggMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdG9vbHMvQlVJTEQuZ24KKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90b29scy9CVUlMRC5nbgpAQCAtMTIsMTggKzEyLDIxIEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLXRhcmdldChmaW5hbF9leGVjdXRhYmxlX3R5cGUsICJhdWRpb19kbXBfcGxheWVyIikgewotICBzb3VyY2VzID0gWyAiYXVkaW9fZG1wX3BsYXllci5jYyIgXQotICBjb25maWdzICs9IFsgIi8vc3RhcmJvYXJkL2J1aWxkL2NvbmZpZzpzdGFyYm9hcmRfaW1wbGVtZW50YXRpb24iIF0KLSAgcHVibGljX2RlcHMgPSBbCi0gICAgIi8vc3RhcmJvYXJkIiwKLSAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYTptZWRpYV91dGlsIiwKLSAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXI6cGxheWVyX2Rvd25sb2FkX3Rlc3RfZGF0YSIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyOnZpZGVvX2RtcCIsCi0gIF0KLSAgZGF0YV9kZXBzID0gWwotICAgICIvL2NvYmFsdC9uZXR3b3JrOmNvcHlfc3NsX2NlcnRpZmljYXRlcyIsCi0gICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyOnBsYXllcl9kb3dubG9hZF90ZXN0X2RhdGEiLAotICAgICIvL3RoaXJkX3BhcnR5L2ljdTppY3VkYXRhIiwKLSAgXQoraWYgKGN1cnJlbnRfdG9vbGNoYWluID09IHN0YXJib2FyZF90b29sY2hhaW4pIHsKKyAgdGFyZ2V0KHN0YXJib2FyZF9sZXZlbF9maW5hbF9leGVjdXRhYmxlX3R5cGUsICJhdWRpb19kbXBfcGxheWVyIikgeworICAgIGJ1aWxkX2xvYWRlciA9IGZhbHNlCisgICAgc291cmNlcyA9IFsgImF1ZGlvX2RtcF9wbGF5ZXIuY2MiIF0KKyAgICBjb25maWdzICs9IFsgIi8vc3RhcmJvYXJkL2J1aWxkL2NvbmZpZzpzdGFyYm9hcmRfaW1wbGVtZW50YXRpb24iIF0KKyAgICBwdWJsaWNfZGVwcyA9IFsKKyAgICAgICIvL3N0YXJib2FyZCIsCisgICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYTptZWRpYV91dGlsIiwKKyAgICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllcjpwbGF5ZXJfZG93bmxvYWRfdGVzdF9kYXRhIiwKKyAgICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllcjp2aWRlb19kbXAiLAorICAgIF0KKyAgICBkYXRhX2RlcHMgPSBbCisgICAgICAiLy9jb2JhbHQvbmV0d29yazpjb3B5X3NzbF9jZXJ0aWZpY2F0ZXMiLAorICAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyOnBsYXllcl9kb3dubG9hZF90ZXN0X2RhdGEiLAorICAgICAgIi8vdGhpcmRfcGFydHkvaWN1OmljdWRhdGEiLAorICAgIF0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oCmluZGV4IGRhOWNkOGMuLmE0M2UwMzAgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaAorKysgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgKQEAgLTQ3LDggKzQ3LDYgQEAKICAgICAgIHZvaWQqIGNvbnRleHQsCiAgICAgICBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI8UGxheWVyV29ya2VyOjpIYW5kbGVyPiBwbGF5ZXJfd29ya2VyX2hhbmRsZXIpOwogCi0gIHN0YXRpYyBpbnQgbnVtYmVyX29mX3BsYXllcnMoKSB7IHJldHVybiBudW1iZXJfb2ZfcGxheWVyc187IH0KLQogICB2b2lkIFNlZWsoU2JUaW1lIHNlZWtfdG9fdGltZSwgaW50IHRpY2tldCk7CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQbGF5ZXJTYW1wbGVJbmZvPgogICB2b2lkIFdyaXRlU2FtcGxlcyhjb25zdCBQbGF5ZXJTYW1wbGVJbmZvKiBzYW1wbGVfaW5mb3MsCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvc2hhMV9maWxlcy5nbmkgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvc2hhMV9maWxlcy5nbmkKaW5kZXggZjkyMmQ0Yy4uMmIzYmI0NiAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3Rlc3RkYXRhL3NoYTFfZmlsZXMuZ25pCisrKyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YS9zaGExX2ZpbGVzLmduaQpAQCAtMjUsNyArMjUsMTEgQEAKICAgImJlbmVhdGhfdGhlX2Nhbm9weV9vcHVzX3N0ZXJlby5kbXAuc2hhMSIsCiAgICJibGFja190ZXN0X2F2Y18xMDgwcF8zMHRvNjBfZnBzLmRtcC5zaGExIiwKICAgImhlYWFjLmRtcC5zaGExIiwKKyAgInNpbGVuY2VfYWFjX3N0ZXJlby5kbXAuc2hhMSIsCiAgICJzaW50ZWxfMzI5X2VjMy5kbXAuc2hhMSIsCiAgICJzaW50ZWxfMzgxX2FjMy5kbXAuc2hhMSIsCiAgICJzaW50ZWxfMzk5X2F2MS5kbXAuc2hhMSIsCisgICJ2ZXJ0aWNhbF80a18zMF9mcHNfMzEzX3ZwOS5kbXAuc2hhMSIsCisgICJ2ZXJ0aWNhbF84a18zMF9mcHNfNTcxX2F2MS5kbXAuc2hhMSIsCisgICJ2ZXJ0aWNhbF8xMDgwcF8zMF9mcHNfMTM3X2F2Yy5kbXAuc2hhMSIsCiBdCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvc2lsZW5jZV9hYWNfc3RlcmVvLmRtcC5zaGExIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3Rlc3RkYXRhL3NpbGVuY2VfYWFjX3N0ZXJlby5kbXAuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDMxMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3Rlc3RkYXRhL3NpbGVuY2VfYWFjX3N0ZXJlby5kbXAuc2hhMQpAQCAtMCwwICsxIEBACithNGUxY2M5OThkZDI3MDE4YWFhM2QyNDdjNjMxNmIyNDhiZTJiYmNiCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvdmVydGljYWxfMTA4MHBfMzBfZnBzXzEzN19hdmMuZG1wLnNoYTEgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvdmVydGljYWxfMTA4MHBfMzBfZnBzXzEzN19hdmMuZG1wLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNDYxYgotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YS92ZXJ0aWNhbF8xMDgwcF8zMF9mcHNfMTM3X2F2Yy5kbXAuc2hhMQpAQCAtMCwwICsxIEBACis5YTZhMDc0N2E5Yjk2NjljY2FkZTBhZDM2Yzg1ODJmN2E3NGE1OWYyCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvdmVydGljYWxfNGtfMzBfZnBzXzMxM192cDkuZG1wLnNoYTEgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvdmVydGljYWxfNGtfMzBfZnBzXzMxM192cDkuZG1wLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlMjcyNgotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YS92ZXJ0aWNhbF80a18zMF9mcHNfMzEzX3ZwOS5kbXAuc2hhMQpAQCAtMCwwICsxIEBACiswOTU2OGQwOGEzNjExMjcxYzJiZGU5NGZlZjYxMGJmYzg4ODYyOTYxCmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvdmVydGljYWxfOGtfMzBfZnBzXzU3MV9hdjEuZG1wLnNoYTEgYi9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEvdmVydGljYWxfOGtfMzBfZnBzXzU3MV9hdjEuZG1wLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyZjcxNQotLS0gL2Rldi9udWxsCisrKyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YS92ZXJ0aWNhbF84a18zMF9mcHNfNTcxX2F2MS5kbXAuc2hhMQpAQCAtMCwwICsxIEBACis0NjFjMzMzZmRkYTYxOWM1YWM1ZGYxZDJlZDRmZGM1ZDc1ZTYwNGQ0CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9xdWV1ZV9hcHBsaWNhdGlvbi5jYyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjCmluZGV4IDA4NTUwYTguLmI2Mjg5NzcgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjCisrKyBiL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjCkBAIC0xNCw3ICsxNCw3IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9xdWV1ZV9hcHBsaWNhdGlvbi5oIgogCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vYXRvbWljLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9jb25kaXRpb25fdmFyaWFibGUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9ldmVudC5oIgpAQCAtMjQsMTQgKzI0LDYgQEAKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiAKLW5hbWVzcGFjZSB7Ci12b2lkIFNldFRydWVXaGVuQ2FsbGVkKHZvaWQqIGZsYWcpIHsKLSAgdm9sYXRpbGUgYm9vbCogYm9vbF9mbGFnID0KLSAgICAgIGNvbnN0X2Nhc3Q8dm9sYXRpbGUgYm9vbCo+KHN0YXRpY19jYXN0PGJvb2wqPihmbGFnKSk7Ci0gICpib29sX2ZsYWcgPSB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KIHZvaWQgUXVldWVBcHBsaWNhdGlvbjo6V2FrZSgpIHsKICAgaWYgKElzQ3VycmVudFRocmVhZCgpKSB7CiAgICAgcmV0dXJuOwpAQCAtMTAwLDExICs5MiwxNSBAQAogCiB2b2lkIFF1ZXVlQXBwbGljYXRpb246OkluamVjdEFuZFByb2Nlc3MoU2JFdmVudFR5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrU3lzdGVtRXZlbnRzKSB7Ci0gIHZvbGF0aWxlIGJvb2wgZXZlbnRfcHJvY2Vzc2VkID0gZmFsc2U7Ci0gIEV2ZW50KiBmbGFnZ2VkX2V2ZW50ID0KLSAgICAgIG5ldyBFdmVudCh0eXBlLCBjb25zdF9jYXN0PGJvb2wqPigmZXZlbnRfcHJvY2Vzc2VkKSwgJlNldFRydWVXaGVuQ2FsbGVkKTsKKyAgYXRvbWljX2Jvb2wgZXZlbnRfcHJvY2Vzc2VkOworICBFdmVudCogZmxhZ2dlZF9ldmVudCA9IG5ldyBFdmVudCgKKyAgICAgIHR5cGUsIGNvbnN0X2Nhc3Q8YXRvbWljX2Jvb2wqPigmZXZlbnRfcHJvY2Vzc2VkKSwgW10odm9pZCogZmxhZykgeworICAgICAgICBhdXRvKiBib29sX2ZsYWcgPQorICAgICAgICAgICAgY29uc3RfY2FzdDxhdG9taWNfYm9vbCo+KHN0YXRpY19jYXN0PGF0b21pY19ib29sKj4oZmxhZykpOworICAgICAgICBib29sX2ZsYWctPnN0b3JlKHRydWUpOworICAgICAgfSk7CiAgIEluamVjdChmbGFnZ2VkX2V2ZW50KTsKLSAgd2hpbGUgKCFldmVudF9wcm9jZXNzZWQpIHsKKyAgd2hpbGUgKCFldmVudF9wcm9jZXNzZWQubG9hZCgpKSB7CiAgICAgaWYgKGNoZWNrU3lzdGVtRXZlbnRzKSB7CiAgICAgICBEaXNwYXRjaEFuZERlbGV0ZShHZXROZXh0RXZlbnQoKSk7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmNjIGIvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuY2MKaW5kZXggN2MyMTkwYS4uMGU2NjVkYiAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuY2MKKysrIGIvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuY2MKQEAgLTcyLDcgKzcyLDkgQEAKICAgV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSBhdHRyaWJ1dGVfZGF0YSA9IHswfTsKICAgaWYgKCFHZXRGaWxlQXR0cmlidXRlc0V4Vyhub3JtX2Rpcl9wYXRoLmNfc3RyKCksIEdldEZpbGVFeEluZm9TdGFuZGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlX2RhdGEpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIC8vIElmIHRoaXMgaXMgc3lzdGVtIGZvbGRlciBHZXRGaWxlQXR0cmlidXRlc0V4VyByZXR1cm5zIEZBTFNFCisgICAgLy8gYnV0IHRoZSBmb2xkZXIgZXhpc3RzCisgICAgcmV0dXJuIEdldExhc3RFcnJvcigpID09IEVSUk9SX0FDQ0VTU19ERU5JRUQ7CiAgIH0KICAgcmV0dXJuIChhdHRyaWJ1dGVfZGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKTsKIH0KZGlmZiAtLWdpdCBhL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IGI5NjU3YzQuLmJjYjYzOTQgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMTQyLDExICsxNDIsNiBAQAogCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyBiaWxpbmVhciBmaWx0ZXJpbmcuCi0vLyBUaGlzIGNhbiBiZSBjaGVja2VkIHRvIGVuYWJsZS9kaXNhYmxlIHJlbmRlcmVyIHRlc3RzIHRoYXQgdmVyaWZ5IHRoYXQgdGhpcyBpcwotLy8gd29ya2luZyBwcm9wZXJseS4KLSNkZWZpbmUgU0JfSEFTX0JJTElORUFSX0ZJTFRFUklOR19TVVBQT1JUIDEKLQogLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyByZW5kZXJpbmcgb2YgTlYxMgogLy8gdGV4dHVyZXMuIFRoZXNlIHRleHR1cmVzIHR5cGljYWxseSBvcmlnaW5hdGUgZnJvbSB2aWRlbyBkZWNvZGVycy4KICNkZWZpbmUgU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUIDAKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5jYyBiL3N0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5jYwppbmRleCBiNTcxNmQ4Li43NjcwZjc5IDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuY2MKKysrIGIvc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmNjCkBAIC02NSw2ICs2NSwxMiBAQAogCiAjZGVmaW5lIEVHTF9DQUxMX1NJTVBMRSh4KSAoRUdMX0NBTExfUFJFRklYIHgpCiAKKyNkZWZpbmUgR0xfQ0FMTCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU2JHZXRHbGVzSW50ZXJmYWNlKCktPng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTQl9EQ0hFQ0soKFNiR2V0R2xlc0ludGVyZmFjZSgpLT5nbEdldEVycm9yKCkpID09IFNCX0dMX05PX0VSUk9SKTsgXAorICB9IHdoaWxlIChmYWxzZSkKKwogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgdGVzdGluZyB7CiAKQEAgLTI5MSw2ICsyOTcsMTEgQEAKICAgICAgIGVnbE1ha2VDdXJyZW50KGRpc3BsYXlfLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKSk7CiB9CiAKK3ZvaWQgRmFrZUdyYXBoaWNzQ29udGV4dFByb3ZpZGVyOjpSZW5kZXIoKSB7CisgIEdMX0NBTEwoZ2xDbGVhcihTQl9HTF9DT0xPUl9CVUZGRVJfQklUKSk7CisgIEVHTF9DQUxMKGVnbFN3YXBCdWZmZXJzKGRpc3BsYXlfLCBzdXJmYWNlXykpOworfQorCiB2b2lkIEZha2VHcmFwaGljc0NvbnRleHRQcm92aWRlcjo6RGVzdHJveUNvbnRleHQoKSB7CiAgIE1ha2VOb0NvbnRleHRDdXJyZW50KCk7CiAgIEVHTF9DQUxMX1NJTVBMRShlZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5XywgY29udGV4dF8pKTsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5oIGIvc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmgKaW5kZXggOGI0YzM5My4uNGJjOWUwZCAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmgKKysrIGIvc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmgKQEAgLTUxLDYgKzUxLDggQEAKICAgdm9pZCBSZWxlYXNlRGVjb2RlVGFyZ2V0KFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpOwogI2VuZGlmICAvLyBTQl9IQVMoR0xFUzIpCiAKKyAgdm9pZCBSZW5kZXIoKTsKKwogIHByaXZhdGU6CiAjaWYgU0JfSEFTKEdMRVMyKQogICBzdGF0aWMgdm9pZCogVGhyZWFkRW50cnlQb2ludCh2b2lkKiBjb250ZXh0KTsKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC90b29scy9hYnN0cmFjdF9sYXVuY2hlci5weSBiL3N0YXJib2FyZC90b29scy9hYnN0cmFjdF9sYXVuY2hlci5weQppbmRleCBmZjBhZDYxLi5mZjM2MWNmIDEwMDY0NAotLS0gYS9zdGFyYm9hcmQvdG9vbHMvYWJzdHJhY3RfbGF1bmNoZXIucHkKKysrIGIvc3RhcmJvYXJkL3Rvb2xzL2Fic3RyYWN0X2xhdW5jaGVyLnB5CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICBpZiBub3Qgb3V0X2RpcmVjdG9yeToKICAgICAgIG91dF9kaXJlY3RvcnkgPSBwYXRocy5CdWlsZE91dHB1dERpcmVjdG9yeShwbGF0Zm9ybV9uYW1lLCBjb25maWcpCiAgICAgc2VsZi5vdXRfZGlyZWN0b3J5ID0gb3V0X2RpcmVjdG9yeQotICAgIHNlbGYuY292ZXJhZ2VfZGlyZWN0b3J5ID0ga3dhcmdzLmdldCgiY292ZXJhZ2VfZGlyZWN0b3J5Iiwgb3V0X2RpcmVjdG9yeSkKKyAgICBzZWxmLmNvdmVyYWdlX2ZpbGVfcGF0aCA9IGt3YXJncy5nZXQoImNvdmVyYWdlX2ZpbGVfcGF0aCIsIE5vbmUpCiAKICAgICBvdXRwdXRfZmlsZSA9IGt3YXJncy5nZXQoIm91dHB1dF9maWxlIiwgTm9uZSkKICAgICBpZiBub3Qgb3V0cHV0X2ZpbGU6CmRpZmYgLS1naXQgYS9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy90ZXN0X2NvdmVyYWdlLnB5IGIvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9jb3ZlcmFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA1YmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9jb3ZlcmFnZS5weQpAQCAtMCwwICsxLDE4NiBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiR2VuZXJhdGUgY292ZXJhZ2UgcmVwb3J0cyBmcm9tIGxsdm0gY292ZXJhZ2UgZGF0YS4iIiIKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgZ2xvYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzdWJwcm9jZXNzCisKK2Zyb20gc3RhcmJvYXJkLmJ1aWxkIGltcG9ydCBjbGFuZworZnJvbSBzdGFyYm9hcmQudG9vbHMgaW1wb3J0IGJ1aWxkCitmcm9tIHN0YXJib2FyZC50b29scy51dGlsIGltcG9ydCBTZXR1cERlZmF1bHRMb2dnaW5nQ29uZmlnCisKK1NSQ19ESVIgPSBvcy5wYXRoLmpvaW4oCisgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgb3MucGFyZGlyLCBvcy5wYXJkaXIsIG9zLnBhcmRpcikKKworCitkZWYgX2dldF9yYXdfcmVwb3J0cyh0ZXN0X2JpbmFyaWVzLCBjb3ZlcmFnZV9kaXIpOgorICAiIiJHZXQgYSBsaXN0IG9mIHJhdyBjb3ZlcmFnZSByZXBvcnRzIGZyb20gdGhlIGNvdmVyYWdlIGRpcmVjdG9yeS4iIiIKKyAgcmF3X3JlcG9ydHMgPSBbXQorICBtaXNzaW5nX3JlcG9ydHMgPSBbXQorICBmb3IgdGFyZ2V0IGluIHRlc3RfYmluYXJpZXM6CisgICAgIyBGaW5kIGNvdmVyYWdlIHJlcG9ydHMgZnJvbSB0aGUgc3VwcGxpZWQgdGVzdCBiaW5hcmllcy4KKyAgICBwcm9mcmF3X2ZpbGUgPSBvcy5wYXRoLmpvaW4oY292ZXJhZ2VfZGlyLCB0YXJnZXQgKyAnLnByb2ZyYXcnKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShwcm9mcmF3X2ZpbGUpOgorICAgICAgbWlzc2luZ19yZXBvcnRzLmFwcGVuZChwcm9mcmF3X2ZpbGUpCisgICAgZWxzZToKKyAgICAgIHJhd19yZXBvcnRzLmFwcGVuZChwcm9mcmF3X2ZpbGUpCisgIGVsc2U6CisgICAgIyBJZiBubyB0ZXN0IGJpbmFyaWVzIHdlcmUgc3VwcGxpZWQgd2UgdXNlIGFsbCBjb3ZlcmFnZSBkYXRhIHdlIGZpbmQuCisgICAgcmF3X3JlcG9ydHMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGNvdmVyYWdlX2RpciwgJyoucHJvZnJhdycpKQorCisgIGlmIG1pc3NpbmdfcmVwb3J0czoKKyAgICBsb2dnaW5nLmVycm9yKCdVbmFibGUgdG8gZmluZCB0aGUgZm9sbG93aW5nIGNvdmVyYWdlIGZpbGVzOiAlcy4nLAorICAgICAgICAgICAgICAgICAgJywgJy5qb2luKG1pc3NpbmdfcmVwb3J0cykpCisgIHJldHVybiByYXdfcmVwb3J0cworCisKK2RlZiBfZ2V0X3Rlc3RfYmluYXJ5X3BhdGhzKGJpbmFyaWVzX2RpciwgdGVzdF9iaW5hcmllcywgY292ZXJhZ2VfZGlyKToKKyAgaWYgbm90IHRlc3RfYmluYXJpZXM6CisgICAgIyBVc2UgdGhlIGNvdmVyYWdlIGZpbGVzIHRvIGRlZHVjZSB0aGUgcGF0aHMgaWYgbm8gYmluYXJpZXMgd2VyZSBzcGVjaWZpZWQuCisgICAgcmF3X3JlcG9ydHMgPSBfZ2V0X3Jhd19yZXBvcnRzKHRlc3RfYmluYXJpZXMsIGNvdmVyYWdlX2RpcikKKyAgICB0ZXN0X2JpbmFyaWVzID0gW3BhdGhsaWIuUGF0aChyZXBvcnQpLnN0ZW0gZm9yIHJlcG9ydCBpbiByYXdfcmVwb3J0c10KKyAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oYmluYXJpZXNfZGlyLCBiaW5hcnkpIGZvciBiaW5hcnkgaW4gdGVzdF9iaW5hcmllc10KKworCitkZWYgX2dldF9leGNsdWRlX29wdHMoKToKKyAgIiIiR2V0IGxpc3Qgb2YgZXhjbHVkZSBvcHRpb25zLiIiIgorICAjIEdldCBhIGxpc3Qgb2YgYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBzcmMgcm9vdCBhbmQgZXhjbHVkZSBhbGwgYnV0IG91ciBjb2RlLgorICBhbGxfZGlycyA9IG5leHQob3Mud2FsayhTUkNfRElSKSlbMV0KKyAgaW5jbHVkZV9kaXJzID0gWydjb2JhbHQnLCAnc3RhcmJvYXJkJ10KKyAgZXhjbHVkZV9kaXJzID0gW2QgZm9yIGQgaW4gYWxsX2RpcnMgaWYgZCBub3QgaW4gaW5jbHVkZV9kaXJzXQorICByZXR1cm4gWworICAgICAgcictLWlnbm9yZS1maWxlbmFtZS1yZWdleD0uKl90ZXN0XC5oJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3Rlc3RcLmNjJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3Rlc3RzXC5oJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3Rlc3RzXC5jYyQnLAorICAgICAgcictLWlnbm9yZS1maWxlbmFtZS1yZWdleD0uKl90ZXN0X2ZpeHR1cmVcLmgkJywKKyAgICAgIHInLS1pZ25vcmUtZmlsZW5hbWUtcmVnZXg9LipfdGVzdF9maXh0dXJlXC5jYyQnLAorICAgICAgcictLWlnbm9yZS1maWxlbmFtZS1yZWdleD0uKl90ZXN0X2ludGVybmFsXC5oJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3Rlc3RfaW50ZXJuYWxcLmNjJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3Rlc3RfdXRpbFwuaCQnLAorICAgICAgcictLWlnbm9yZS1maWxlbmFtZS1yZWdleD0uKl90ZXN0X3V0aWxcLmNjJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3VuaXR0ZXN0XC5oJCcsCisgICAgICByJy0taWdub3JlLWZpbGVuYW1lLXJlZ2V4PS4qX3VuaXR0ZXN0XC5jYyQnLAorICBdICsgW2YnLS1pZ25vcmUtZmlsZW5hbWUtcmVnZXg9e2R9Ly4qJyBmb3IgZCBpbiBleGNsdWRlX2RpcnNdCisKKworZGVmIF9nZW5lcmF0ZV9yZXBvcnRzKHRhcmdldF9wYXRocywgbWVyZ2VkX2RhdGFfcGF0aCwgcmVwb3J0X2RpciwgcmVwb3J0X3R5cGUpOgorICAiIiJHZW5lcmF0ZSByZXBvcnRzIGJhc2VkIG9uIHRoZSBjb21iaW5lZCBjb3ZlcmFnZSBkYXRhLiIiIgorICB0b29sY2hhaW5fZGlyID0gYnVpbGQuR2V0Q2xhbmdCaW5QYXRoKGNsYW5nLkdldENsYW5nU3BlY2lmaWNhdGlvbigpKQorICBsbHZtX2NvdiA9IG9zLnBhdGguam9pbih0b29sY2hhaW5fZGlyLCAnbGx2bS1jb3YnKQorCisgIGV4Y2x1ZGVfb3B0cyA9IF9nZXRfZXhjbHVkZV9vcHRzKCkKKyAgdGVzdF9iaW5hcnlfb3B0cyA9IFt0YXJnZXRfcGF0aHNbMF1dICsgXAorICAgIFsnLW9iamVjdD0nICsgdGFyZ2V0IGZvciB0YXJnZXQgaW4gdGFyZ2V0X3BhdGhzWzE6XV0KKworICBpZiByZXBvcnRfdHlwZSBpbiBbJ2h0bWwnLCAnYm90aCddOgorICAgIGxvZ2dpbmcuaW5mbygnQ3JlYXRpbmcgaHRtbCBjb3ZlcmFnZSByZXBvcnQnKQorICAgIHNob3dfY21kX2xpc3QgPSBbCisgICAgICAgIGxsdm1fY292LCAnc2hvdycsICpleGNsdWRlX29wdHMsICctaW5zdHItcHJvZmlsZT0nICsgbWVyZ2VkX2RhdGFfcGF0aCwKKyAgICAgICAgJy1mb3JtYXQ9aHRtbCcsICctb3V0cHV0LWRpcj0nICsgb3MucGF0aC5qb2luKHJlcG9ydF9kaXIsICdodG1sJyksCisgICAgICAgICp0ZXN0X2JpbmFyeV9vcHRzCisgICAgXQorICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChzaG93X2NtZF9saXN0LCB0ZXh0PVRydWUpCisKKyAgaWYgcmVwb3J0X3R5cGUgaW4gWydnY292JywgJ2JvdGgnXToKKyAgICBsb2dnaW5nLmluZm8oJ0NyZWF0aW5nIGdjb3YgY292ZXJhZ2UgcmVwb3J0JykKKyAgICByZXBvcnRfY21kX2xpc3QgPSBbCisgICAgICAgIGxsdm1fY292LCAnc2hvdycsICpleGNsdWRlX29wdHMsICctaW5zdHItcHJvZmlsZT0nICsgbWVyZ2VkX2RhdGFfcGF0aCwKKyAgICAgICAgJy1mb3JtYXQ9dGV4dCcsICp0ZXN0X2JpbmFyeV9vcHRzCisgICAgXQorICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ocmVwb3J0X2RpciwgJ3JlcG9ydC50eHQnKSwgJ3diJykgYXMgb3V0OgorICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKHJlcG9ydF9jbWRfbGlzdCwgc3Rkb3V0PW91dCwgdGV4dD1UcnVlKQorCisKK2RlZiBfbWVyZ2VfY292ZXJhZ2VfZGF0YSh0YXJnZXRzLCBjb3ZlcmFnZV9kaXIpOgorICAiIiJDcmVhdGUgYSBjb21iaW5lZCBjb3ZlcmFnZSBmaWxlIGZyb20gdGhlIHJhdyByZXBvcnRzLiIiIgorICB0b29sY2hhaW5fZGlyID0gYnVpbGQuR2V0Q2xhbmdCaW5QYXRoKGNsYW5nLkdldENsYW5nU3BlY2lmaWNhdGlvbigpKQorICBsbHZtX3Byb2ZkYXRhID0gb3MucGF0aC5qb2luKHRvb2xjaGFpbl9kaXIsICdsbHZtLXByb2ZkYXRhJykKKworICByYXdfcmVwb3J0cyA9IF9nZXRfcmF3X3JlcG9ydHModGFyZ2V0cywgY292ZXJhZ2VfZGlyKQorICBpZiBub3QgcmF3X3JlcG9ydHM6CisgICAgcmFpc2UgUnVudGltZUVycm9yKCdObyBjb3ZlcmFnZSBkYXRhIGZvdW5kIGluIFwnY292ZXJhZ2VfZGlyXCcnKQorCisgIGxvZ2dpbmcuaW5mbygnTWVyZ2luZyBjb3ZlcmFnZSBmaWxlcycpCisgIG1lcmdlZF9kYXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oY292ZXJhZ2VfZGlyLCAncmVwb3J0LnByb2ZkYXRhJykKKyAgbWVyZ2VfY21kX2xpc3QgPSBbCisgICAgICBsbHZtX3Byb2ZkYXRhLCAnbWVyZ2UnLCAnLXNwYXJzZT10cnVlJywgJy1vJywgbWVyZ2VkX2RhdGFfcGF0aAorICBdICsgcmF3X3JlcG9ydHMKKyAgc3VicHJvY2Vzcy5jaGVja19jYWxsKG1lcmdlX2NtZF9saXN0LCB0ZXh0PVRydWUpCisKKyAgcmV0dXJuIG1lcmdlZF9kYXRhX3BhdGgKKworCitkZWYgY3JlYXRlX3JlcG9ydChiaW5hcnlfZGlyLCB0ZXN0X2JpbmFyaWVzLCBjb3ZlcmFnZV9kaXIsIHJlcG9ydF90eXBlPSdib3RoJyk6CisgICIiIkdlbmVyYXRlIHNvdXJjZSBjb2RlIGNvdmVyYWdlIHJlcG9ydHMuIiIiCisgIG1lcmdlZF9kYXRhX3BhdGggPSBfbWVyZ2VfY292ZXJhZ2VfZGF0YSh0ZXN0X2JpbmFyaWVzLCBjb3ZlcmFnZV9kaXIpCisKKyAgcmVwb3J0X2RpciA9IGNvdmVyYWdlX2RpcgorICB0YXJnZXRfcGF0aHMgPSBfZ2V0X3Rlc3RfYmluYXJ5X3BhdGhzKGJpbmFyeV9kaXIsIHRlc3RfYmluYXJpZXMsIGNvdmVyYWdlX2RpcikKKyAgX2dlbmVyYXRlX3JlcG9ydHModGFyZ2V0X3BhdGhzLCBtZXJnZWRfZGF0YV9wYXRoLCByZXBvcnRfZGlyLCByZXBvcnRfdHlwZSkKKworCitkZWYgbWFpbigpOgorICBTZXR1cERlZmF1bHRMb2dnaW5nQ29uZmlnKCkKKworICBhcmdfcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICBhcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWJpbmFyaWVzX2RpcicsCisgICAgICByZXF1aXJlZD1UcnVlLAorICAgICAgaGVscD0nRGlyZWN0b3J5IHdoZXJlIHRoZSB0ZXN0IGJpbmFyaWVzIGFyZSBsb2NhdGVkLicpCisgIGFyZ19wYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tY292ZXJhZ2VfZGlyJywKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICBoZWxwPSdEaXJlY3Rvcnkgd2hlcmUgY292ZXJhZ2UgZmlsZXMgYXJlIGxvY2F0ZWQgYW5kIHdoZXJlIHRoZSByZXBvcnRzICcKKyAgICAgICd3aWxsIGJlIGdlbmVyYXRlZC4nKQorICBhcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXRlc3RfYmluYXJpZXMnLAorICAgICAgbmFyZ3M9JysnLAorICAgICAgZGVmYXVsdD1bXSwKKyAgICAgIGhlbHA9J0xpc3Qgb2YgdGVzdCBiaW5hcmllcyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgY292ZXJhZ2UgcmVwb3J0LiAnCisgICAgICAnSWYgbm90IHBhc3NlZCBhbGwgY292ZXJhZ2UgZmlsZXMgaW4gLS1jb3ZlcmFnZV9kaXIgd2lsbCBiZSB1c2VkLicpCisKKyAgcmVwb3J0X3R5cGVfZ3JvdXAgPSBhcmdfcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICByZXBvcnRfdHlwZV9ncm91cC5hZGRfYXJndW1lbnQoCisgICAgICAnLS1odG1sX29ubHknLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0lmIHBhc3NlZCBvbmx5IHRoZSBodG1sIHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQuIENhbiBub3QgYmUgdXNlZCAnCisgICAgICAnd2l0aCAtLWdjb3Zfb25seS4nKQorICByZXBvcnRfdHlwZV9ncm91cC5hZGRfYXJndW1lbnQoCisgICAgICAnLS1nY292X29ubHknLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0lmIHBhc3NlZCBvbmx5IHRoZSBnY292IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQuIENhbiBub3QgYmUgdXNlZCAnCisgICAgICAnd2l0aCAtLWh0bWxfb25seS4nKQorCisgIGFyZ3MgPSBhcmdfcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgIHJlcG9ydF90eXBlID0gJ2JvdGgnCisgIGlmIGFyZ3MuaHRtbF9vbmx5OgorICAgIHJlcG9ydF90eXBlID0gJ2h0bWwnCisgIGVsaWYgYXJncy5nY292X29ubHk6CisgICAgcmVwb3J0X3R5cGUgPSAnZ2NvdicKKworICBjcmVhdGVfcmVwb3J0KGFyZ3MuYmluYXJpZXNfZGlyLCBhcmdzLnRlc3RfYmluYXJpZXMsIGFyZ3MuY292ZXJhZ2VfZGlyLAorICAgICAgICAgICAgICAgIHJlcG9ydF90eXBlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkgYi9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy90ZXN0X3J1bm5lci5weQppbmRleCAwYWJjOWY0Li45N2FkZGYxIDEwMDc1NQotLS0gYS9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy90ZXN0X3J1bm5lci5weQorKysgYi9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy90ZXN0X3J1bm5lci5weQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IHRyYWNlYmFjawogCiBmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgY1N0cmluZ0lPIGFzIFN0cmluZ0lPCi1mcm9tIHN0YXJib2FyZC5idWlsZCBpbXBvcnQgY2xhbmcKIGZyb20gc3RhcmJvYXJkLnRvb2xzIGltcG9ydCBhYnN0cmFjdF9sYXVuY2hlcgogZnJvbSBzdGFyYm9hcmQudG9vbHMgaW1wb3J0IGJ1aWxkCiBmcm9tIHN0YXJib2FyZC50b29scyBpbXBvcnQgY29tbWFuZF9saW5lCkBAIC0zNSwxMyArMzQsMTQgQEAKIGZyb20gc3RhcmJvYXJkLnRvb2xzLnRlc3RpbmcgaW1wb3J0IGJ1aWxkX3Rlc3RzCiBmcm9tIHN0YXJib2FyZC50b29scy50ZXN0aW5nIGltcG9ydCB0ZXN0X2ZpbHRlcgogZnJvbSBzdGFyYm9hcmQudG9vbHMudGVzdGluZy50ZXN0X3NoYXJkaW5nIGltcG9ydCBTaGFyZGluZ1Rlc3RDb25maWcKK2Zyb20gc3RhcmJvYXJkLnRvb2xzLnRlc3RpbmcudGVzdF9jb3ZlcmFnZSBpbXBvcnQgY3JlYXRlX3JlcG9ydAogZnJvbSBzdGFyYm9hcmQudG9vbHMudXRpbCBpbXBvcnQgU2V0dXBEZWZhdWx0TG9nZ2luZ0NvbmZpZwogCiAjIHB5bGludDogZGlzYWJsZT1jb25zaWRlci11c2luZy1mLXN0cmluZwogCiBfRkxBS1lfUkVUUllfTElNSVQgPSA0CiBfVE9UQUxfVEVTVFNfUkVHRVggPSByZS5jb21waWxlKHIiXlxbPT09PT09PT09PVxdICguKikgdGVzdHM/IGZyb20gLioiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIidGVzdCBjYXNlcz8gcmFuLiBcKC4qIG1zIHRvdGFsXCkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByInRlc3Qgc3VpdGVzPyByYW4uIFwoLiogbXMgdG90YWxcKSIpCiBfVEVTVFNfUEFTU0VEX1JFR0VYID0gcmUuY29tcGlsZShyIl5cWyAgUEFTU0VEICBcXSAoLiopIHRlc3RzPyIpCiBfVEVTVFNfRkFJTEVEX1JFR0VYID0gcmUuY29tcGlsZShyIl5cWyAgRkFJTEVEICBcXSAoLiopIHRlc3RzPywgbGlzdGVkIGJlbG93OiIpCiBfU0lOR0xFX1RFU1RfRkFJTEVEX1JFR0VYID0gcmUuY29tcGlsZShyIl5cWyAgRkFJTEVEICBcXSAoLiopIikKQEAgLTIyMyw3ICsyMjMsOCBAQAogICAgICAgICAgICAgICAgeG1sX291dHB1dF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIGxvZ194bWxfcmVzdWx0cz1GYWxzZSwKICAgICAgICAgICAgICAgIHNoYXJkX2luZGV4PU5vbmUsCi0gICAgICAgICAgICAgICBsYXVuY2hlcl9hcmdzPU5vbmUpOgorICAgICAgICAgICAgICAgbGF1bmNoZXJfYXJncz1Ob25lLAorICAgICAgICAgICAgICAgY292ZXJhZ2VfZGlyZWN0b3J5PU5vbmUpOgogICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgc2VsZi5sb2FkZXJfcGxhdGZvcm0gPSBsb2FkZXJfcGxhdGZvcm0KQEAgLTIzNyw3ICsyMzgsNyBAQAogICAgIGlmIG5vdCBzZWxmLm91dF9kaXJlY3Rvcnk6CiAgICAgICBzZWxmLm91dF9kaXJlY3RvcnkgPSBwYXRocy5CdWlsZE91dHB1dERpcmVjdG9yeShzZWxmLnBsYXRmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWcpCi0gICAgc2VsZi5jb3ZlcmFnZV9kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRfZGlyZWN0b3J5LCAiY292ZXJhZ2UiKQorICAgIHNlbGYuY292ZXJhZ2VfZGlyZWN0b3J5ID0gY292ZXJhZ2VfZGlyZWN0b3J5CiAgICAgaWYgKG5vdCBzZWxmLmxvYWRlcl9vdXRfZGlyZWN0b3J5IGFuZCBzZWxmLmxvYWRlcl9wbGF0Zm9ybSBhbmQKICAgICAgICAgc2VsZi5sb2FkZXJfY29uZmlnKToKICAgICAgIHNlbGYubG9hZGVyX291dF9kaXJlY3RvcnkgPSBwYXRocy5CdWlsZE91dHB1dERpcmVjdG9yeSgKQEAgLTQzOSw2ICs0NDAsOSBAQAogICAgICMgRm9yIG9uLWRldmljZSB0ZXN0aW5nLCB0aGlzIGlzIHcuci50IG9uIGRldmljZSBzdG9yYWdlLgogICAgIHRlc3RfcmVzdWx0X3htbF9wYXRoID0gTm9uZQogCisgICAgIyBQYXRoIHRvIGNvdmVyYWdlIGZpbGUgdG8gZ2VuZXJhdGUuCisgICAgY292ZXJhZ2VfZmlsZV9wYXRoID0gTm9uZQorCiAgICAgZGVmIE1ha2VMYXVuY2hlcigpOgogICAgICAgbG9nZ2luZy5pbmZvKCJNYWtlTGF1bmNoZXIoKTogJXMiLCB0ZXN0X3Jlc3VsdF94bWxfcGF0aCkKICAgICAgIHJldHVybiBhYnN0cmFjdF9sYXVuY2hlci5MYXVuY2hlckZhY3RvcnkoCkBAIC00NDksNyArNDUzLDcgQEAKICAgICAgICAgICB0YXJnZXRfcGFyYW1zPXRlc3RfcGFyYW1zLAogICAgICAgICAgIG91dHB1dF9maWxlPXdyaXRlX3BpcGUsCiAgICAgICAgICAgb3V0X2RpcmVjdG9yeT1zZWxmLm91dF9kaXJlY3RvcnksCi0gICAgICAgICAgY292ZXJhZ2VfZGlyZWN0b3J5PXNlbGYuY292ZXJhZ2VfZGlyZWN0b3J5LAorICAgICAgICAgIGNvdmVyYWdlX2ZpbGVfcGF0aD1jb3ZlcmFnZV9maWxlX3BhdGgsCiAgICAgICAgICAgZW52X3ZhcmlhYmxlcz1lbnYsCiAgICAgICAgICAgdGVzdF9yZXN1bHRfeG1sX3BhdGg9dGVzdF9yZXN1bHRfeG1sX3BhdGgsCiAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtPXNlbGYubG9hZGVyX3BsYXRmb3JtLApAQCAtNDg2LDYgKzQ5MCwxMiBAQAogICAgICAgdGVzdF9wYXJhbXMuYXBwZW5kKGYiLS1ndGVzdF9vdXRwdXQ9eG1sOnt0ZXN0X3Jlc3VsdF94bWxfcGF0aH0iKQogICAgIGxvZ2dpbmcuaW5mbygiWE1MIHRlc3QgcmVzdWx0IHBhdGg6ICVzIiwgdGVzdF9yZXN1bHRfeG1sX3BhdGgpCiAKKyAgICBpZiBzZWxmLmNvdmVyYWdlX2RpcmVjdG9yeToKKyAgICAgIGNvdmVyYWdlX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmNvdmVyYWdlX2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbmFtZSArICIucHJvZnJhdyIpCisgICAgICBsb2dnaW5nLmluZm8oIkNvdmVyYWdlIGRhdGEgd2lsbCBiZSBzYXZlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgICAgb3MucGF0aC5yZWxwYXRoKGNvdmVyYWdlX2ZpbGVfcGF0aCkpCisKICAgICAjIFR1cm4gb2ZmIGNvbG9yIGNvZGVzIGZyb20gb3V0cHV0IHRvIG1ha2UgaXQgZWFzeSB0byBwYXJzZQogICAgIHRlc3RfcGFyYW1zLmFwcGVuZCgiLS1ndGVzdF9jb2xvcj1ubyIpCiAKQEAgLTgzMCw1MSArODQwLDYgQEAKICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VsZi5fUnVuVGVzdCh0ZXN0X3RhcmdldCkpCiAgICAgcmV0dXJuIHNlbGYuX1Byb2Nlc3NBbGxUZXN0UmVzdWx0cyhyZXN1bHRzKQogCi0gIGRlZiBHZW5lcmF0ZUNvdmVyYWdlUmVwb3J0KHNlbGYpOgotICAgICIiIkdlbmVyYXRlIHRoZSBzb3VyY2UgY29kZSBjb3ZlcmFnZSByZXBvcnQuIiIiCi0gICAgYXZhaWxhYmxlX3Byb2ZyYXdfZmlsZXMgPSBbXQotICAgIGF2YWlsYWJsZV90YXJnZXRzID0gW10KLSAgICBmb3IgdGFyZ2V0IGluIHNvcnRlZChzZWxmLnRlc3RfdGFyZ2V0cy5rZXlzKCkpOgotICAgICAgcHJvZnJhd19maWxlID0gb3MucGF0aC5qb2luKHNlbGYuY292ZXJhZ2VfZGlyZWN0b3J5LCB0YXJnZXQgKyAiLnByb2ZyYXciKQotICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocHJvZnJhd19maWxlKToKLSAgICAgICAgYXZhaWxhYmxlX3Byb2ZyYXdfZmlsZXMuYXBwZW5kKHByb2ZyYXdfZmlsZSkKLSAgICAgICAgYXZhaWxhYmxlX3RhcmdldHMuYXBwZW5kKHRhcmdldCkKLQotICAgICMgSWYgdGhlcmUgYXJlIG5vIHByb2ZyYXcgZmlsZXMsIHRoZW4gdGhlcmUgaXMgbm8gd29yayB0byBkby4KLSAgICBpZiBub3QgYXZhaWxhYmxlX3Byb2ZyYXdfZmlsZXM6Ci0gICAgICByZXR1cm4KLQotICAgIHRvb2xjaGFpbl9kaXIgPSBidWlsZC5HZXRDbGFuZ0JpblBhdGgoY2xhbmcuR2V0Q2xhbmdTcGVjaWZpY2F0aW9uKCkpCi0KLSAgICByZXBvcnRfbmFtZSA9ICJyZXBvcnQiCi0gICAgcHJvZmRhdGFfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmNvdmVyYWdlX2RpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9uYW1lICsgIi5wcm9mZGF0YSIpCi0gICAgbWVyZ2VfY21kX2xpc3QgPSBbCi0gICAgICAgIG9zLnBhdGguam9pbih0b29sY2hhaW5fZGlyLCAibGx2bS1wcm9mZGF0YSIpLCAibWVyZ2UiLCAiLXNwYXJzZT10cnVlIiwKLSAgICAgICAgIi1vIiwgcHJvZmRhdGFfbmFtZQotICAgIF0KLSAgICBtZXJnZV9jbWRfbGlzdCArPSBhdmFpbGFibGVfcHJvZnJhd19maWxlcwotCi0gICAgc2VsZi5fRXhlYyhtZXJnZV9jbWRfbGlzdCkKLSAgICBzaG93X2NtZF9saXN0ID0gWwotICAgICAgICBvcy5wYXRoLmpvaW4odG9vbGNoYWluX2RpciwgImxsdm0tY292IiksICJzaG93IiwKLSAgICAgICAgIi1pbnN0ci1wcm9maWxlPSIgKyBwcm9mZGF0YV9uYW1lLCAiLWZvcm1hdD1odG1sIiwKLSAgICAgICAgIi1vdXRwdXQtZGlyPSIgKyBvcy5wYXRoLmpvaW4oc2VsZi5jb3ZlcmFnZV9kaXJlY3RvcnksICJodG1sIiksCi0gICAgICAgIGF2YWlsYWJsZV90YXJnZXRzWzBdCi0gICAgXQotICAgIHNob3dfY21kX2xpc3QgKz0gWyItb2JqZWN0PSIgKyB0YXJnZXQgZm9yIHRhcmdldCBpbiBhdmFpbGFibGVfdGFyZ2V0c1sxOl1dCi0gICAgc2VsZi5fRXhlYyhzaG93X2NtZF9saXN0KQotCi0gICAgcmVwb3J0X2NtZF9saXN0ID0gWwotICAgICAgICBvcy5wYXRoLmpvaW4odG9vbGNoYWluX2RpciwgImxsdm0tY292IiksICJyZXBvcnQiLAotICAgICAgICAiLWluc3RyLXByb2ZpbGU9IiArIHByb2ZkYXRhX25hbWUsIGF2YWlsYWJsZV90YXJnZXRzWzBdCi0gICAgXQotICAgIHJlcG9ydF9jbWRfbGlzdCArPSBbIi1vYmplY3Q9IiArIHRhcmdldCBmb3IgdGFyZ2V0IGluIGF2YWlsYWJsZV90YXJnZXRzWzE6XV0KLSAgICBzZWxmLl9FeGVjKAotICAgICAgICByZXBvcnRfY21kX2xpc3QsCi0gICAgICAgIG91dHB1dF9maWxlPW9zLnBhdGguam9pbihzZWxmLmNvdmVyYWdlX2RpcmVjdG9yeSwgcmVwb3J0X25hbWUgKyAiLnR4dCIpKQotICAgIHJldHVybgotCiAKIGRlZiBtYWluKCk6CiAgIFNldHVwRGVmYXVsdExvZ2dpbmdDb25maWcoKQpAQCAtOTQxLDYgKzkwNiwxNyBAQAogICAgICAgdHlwZT1pbnQsCiAgICAgICBoZWxwPSJUaGUgaW5kZXggb2YgdGhlIHRlc3Qgc2hhcmQgdG8gcnVuLiBUaGlzIHNlbGVjdHMgYSBzdWJzZXQgb2YgdGVzdHMgIgogICAgICAgInRvIHJ1biBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBwZXIgcGxhdGZvcm0sIGlmIGl0IGV4aXN0cy4iKQorICBhcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICItLWNvdmVyYWdlX2RpciIsCisgICAgICBoZWxwPSJJZiBkZWZpbmVkLCBjb3ZlcmFnZSBkYXRhIHdpbGwgYmUgY29sbGVjdGVkIGluIHRoZSBkaXJlY3RvcnkgIgorICAgICAgInNwZWNpZmllZC4gVGhpcyByZXF1aXJlcyB0aGUgZmlsZXMgdG8gaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggY2xhbmcgIgorICAgICAgImNvdmVyYWdlLiIpCisgIGFyZ19wYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tY292ZXJhZ2VfcmVwb3J0IiwKKyAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICBoZWxwPSJJZiBzZXQsIGEgY292ZXJhZ2UgcmVwb3J0IHdpbGwgYmUgZ2VuZXJhdGVkIGlmIHRoZXJlIGlzIGF2YWlsYWJsZSAiCisgICAgICAiY292ZXJhZ2UgaW5mb3JtYXRpb24gaW4gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgLS1jb3ZlcmFnZV9kaXIuIgorICAgICAgIklmIC0tY292ZXJhZ2VfZGlyIGlzIG5vdCBwYXNzZWQgdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4iKQogICBhcmdzID0gYXJnX3BhcnNlci5wYXJzZV9hcmdzKCkKIAogICBpZiAoYXJncy5sb2FkZXJfcGxhdGZvcm0gYW5kIG5vdCBhcmdzLmxvYWRlcl9jb25maWcgb3IKQEAgLTk2MSwxMyArOTM3LDE5IEBACiAgIGlmIGFyZ3MuZHJ5X3J1bjoKICAgICBsYXVuY2hlcl9hcmdzLmFwcGVuZChhYnN0cmFjdF9sYXVuY2hlci5BUkdfRFJZUlVOKQogCisgIGNvdmVyYWdlX2RpcmVjdG9yeSA9IE5vbmUKKyAgaWYgYXJncy5jb3ZlcmFnZV9kaXI6CisgICAgIyBDbGFuZyBuZWVkcyBhbiBhYnNvbHV0ZSBwYXRoIHRvIGdlbmVyYXRlIGNvdmVyYWdlIHJlcG9ydHMuCisgICAgY292ZXJhZ2VfZGlyZWN0b3J5ID0gb3MucGF0aC5hYnNwYXRoKGFyZ3MuY292ZXJhZ2VfZGlyKQorCiAgIGxvZ2dpbmcuaW5mbygiSW5pdGlhbGl6aW5nIHRlc3QgcnVubmVyIikKICAgcnVubmVyID0gVGVzdFJ1bm5lcihhcmdzLnBsYXRmb3JtLCBhcmdzLmNvbmZpZywgYXJncy5sb2FkZXJfcGxhdGZvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgYXJncy5sb2FkZXJfY29uZmlnLCBhcmdzLmRldmljZV9pZCwgYXJncy50YXJnZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcGFyYW1zLCBhcmdzLm91dF9kaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgYXJncy5sb2FkZXJfb3V0X2RpcmVjdG9yeSwgYXJncy5wbGF0Zm9ybV90ZXN0c19vbmx5LAogICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXBwbGljYXRpb25fbmFtZSwgYXJncy5kcnlfcnVuLCBhcmdzLnhtbF9vdXRwdXRfZGlyLAotICAgICAgICAgICAgICAgICAgICAgIGFyZ3MubG9nX3htbF9yZXN1bHRzLCBhcmdzLnNoYXJkX2luZGV4LCBsYXVuY2hlcl9hcmdzKQorICAgICAgICAgICAgICAgICAgICAgIGFyZ3MubG9nX3htbF9yZXN1bHRzLCBhcmdzLnNoYXJkX2luZGV4LCBsYXVuY2hlcl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlX2RpcmVjdG9yeSkKICAgbG9nZ2luZy5pbmZvKCJUZXN0IHJ1bm5lciBpbml0aWFsaXplZCIpCiAKICAgZGVmIEFib3J0KHNpZ251bSwgZnJhbWUpOgpAQCAtOTk4LDcgKzk4MCwxNSBAQAogICBpZiBhcmdzLnJ1bjoKICAgICBydW5fc3VjY2VzcyA9IHJ1bm5lci5SdW5BbGxUZXN0cygpCiAKLSAgcnVubmVyLkdlbmVyYXRlQ292ZXJhZ2VSZXBvcnQoKQorICBpZiBhcmdzLmNvdmVyYWdlX3JlcG9ydCBhbmQgY292ZXJhZ2VfZGlyZWN0b3J5OgorICAgIGlmIHJ1bl9zdWNjZXNzOgorICAgICAgdHJ5OgorICAgICAgICBjcmVhdGVfcmVwb3J0KHJ1bm5lci5vdXRfZGlyZWN0b3J5LCBydW5uZXIudGVzdF90YXJnZXRzLmtleXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZV9kaXJlY3RvcnkpCisgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHB5bGludDogZGlzYWJsZT1icm9hZC1leGNlcHQKKyAgICAgICAgbG9nZ2luZy5lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIGNvdmVyYWdlIHJlcG9ydDogJXMiLCBlKQorICAgIGVsc2U6CisgICAgICBsb2dnaW5nLndhcm5pbmcoIlRlc3QgcnVuIGZhaWxlZCwgc2tpcHBpbmcgY29kZSBjb3ZlcmFnZSByZXBvcnQuIikKIAogICAjIElmIGVpdGhlciBzdGVwIGhhcyBmYWlsZWQsIGNvdW50IHRoZSB3aG9sZSB0ZXN0IHJ1biBhcyBmYWlsZWQuCiAgIGlmIG5vdCBidWlsZF9zdWNjZXNzIG9yIG5vdCBydW5fc3VjY2VzczoKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC93aW4vc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zdGFyYm9hcmQvd2luL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDEwMzM1MTAuLmViM2VlZGUgMTAwNjQ0Ci0tLSBhL3N0YXJib2FyZC93aW4vc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3RhcmJvYXJkL3dpbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMTEyLDExICsxMTIsNiBAQAogCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyBiaWxpbmVhciBmaWx0ZXJpbmcuCi0vLyBUaGlzIGNhbiBiZSBjaGVja2VkIHRvIGVuYWJsZS9kaXNhYmxlIHJlbmRlcmVyIHRlc3RzIHRoYXQgdmVyaWZ5IHRoYXQgdGhpcyBpcwotLy8gd29ya2luZyBwcm9wZXJseS4KLSNkZWZpbmUgU0JfSEFTX0JJTElORUFSX0ZJTFRFUklOR19TVVBQT1JUIDEKLQogLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyByZW5kZXJpbmcgb2YgTlYxMgogLy8gdGV4dHVyZXMuIFRoZXNlIHRleHR1cmVzIHR5cGljYWxseSBvcmlnaW5hdGUgZnJvbSB2aWRlbyBkZWNvZGVycy4KICNkZWZpbmUgU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUIDAKZGlmZiAtLWdpdCBhL3N0YXJib2FyZC93aW4vd2luMzIvdGVzdF9maWx0ZXJzLnB5IGIvc3RhcmJvYXJkL3dpbi93aW4zMi90ZXN0X2ZpbHRlcnMucHkKaW5kZXggMmNlMDZjOC4uY2Y4NjIxZiAxMDA2NDQKLS0tIGEvc3RhcmJvYXJkL3dpbi93aW4zMi90ZXN0X2ZpbHRlcnMucHkKKysrIGIvc3RhcmJvYXJkL3dpbi93aW4zMi90ZXN0X2ZpbHRlcnMucHkKQEAgLTMwLDEyICszMCwxNSBAQAogICAgICAgICAjIGF0dHJpYnV0ZS4KICAgICAgICAgJ1NiU3lzdGVtR2V0U3RhY2tUZXN0LlN1bm55RGF5U3RhY2tEaXJlY3Rpb24nLAogCisgICAgICAgICMgVGhlc2UgdGVzdHMgYXJlIGZhaWxpbmcuIEVuYWJsZSB0aGVtIG9uY2UgdGhleSdyZSBzdXBwb3J0ZWQuCisgICAgICAgICdNdWx0aXBsZVBsYXllclRlc3RzLypiZW5lYXRoX3RoZV9jYW5vcHlfMTM3X2F2Y19kbXAqJywKKyAgICAgICAgJ1NiTWVkaWFTZXRBdWRpb1dyaXRlRHVyYXRpb25UZXN0cy9TYk1lZGlhU2V0QXVkaW9Xcml0ZUR1cmF0aW9uVGVzdC5Xcml0ZUNvbnRpbnVlZExpbWl0ZWRJbnB1dConLAorICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0LlNlY29uZGFyeVBsYXllclRlc3QvKicsCisKICAgICAgICAgIyBGYWlsdXJlcyB0cmFja2VkIGJ5IGIvMjU2MTYwNDE2LgogICAgICAgICAnU2JTeXN0ZW1HZXRQYXRoVGVzdC5SZXR1cm5zUmVxdWlyZWRQYXRocycsCi0gICAgICAgICdTYlBsYXllcldyaXRlU2FtcGxlVGVzdHMvU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3QuU2Vla0FuZERlc3Ryb3kvKl92aWRlb19iZW5lYXRoX3RoZV9jYW5vcHlfMTM3X2F2Y19kbXBfb3V0cHV0X2RlY29kZV90b190ZXh0dXJlXyonLAotICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0Lk5vSW5wdXQvKl92aWRlb19iZW5lYXRoX3RoZV9jYW5vcHlfMTM3X2F2Y19kbXBfb3V0cHV0X2RlY29kZV90b190ZXh0dXJlXyonLAotICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0LldyaXRlU2luZ2xlQmF0Y2gvKl92aWRlb19iZW5lYXRoX3RoZV9jYW5vcHlfMTM3X2F2Y19kbXBfb3V0cHV0X2RlY29kZV90b190ZXh0dXJlXyonLAotICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzL1NiUGxheWVyV3JpdGVTYW1wbGVUZXN0LldyaXRlTXVsdGlwbGVCYXRjaGVzLypfdmlkZW9fYmVuZWF0aF90aGVfY2Fub3B5XzEzN19hdmNfZG1wX291dHB1dF9kZWNvZGVfdG9fdGV4dHVyZV8qJywKKyAgICAgICAgJ1NiUGxheWVyR2V0QXVkaW9Db25maWd1cmF0aW9uVGVzdHMvKl92aWRlb19iZW5lYXRoX3RoZV9jYW5vcHlfMTM3X2F2Y19kbXBfb3V0cHV0X2RlY29kZV90b190ZXh0dXJlXyonLAorICAgICAgICAnU2JQbGF5ZXJXcml0ZVNhbXBsZVRlc3RzLypfdmlkZW9fYmVuZWF0aF90aGVfY2Fub3B5XzEzN19hdmNfZG1wX291dHB1dF9kZWNvZGVfdG9fdGV4dHVyZV8qJywKICAgICAgICAgJ1NiU29ja2V0QWRkcmVzc1R5cGVzL1NiU29ja2V0QmluZFRlc3QuUmFpbnlEYXlCYWRJbnRlcmZhY2UvdHlwZV9pcHY2X2ZpbHRlcl9pcHY2JywKICAgICAgICAgJ1NiU29ja2V0QWRkcmVzc1R5cGVzL1NiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzc1Rlc3QuU3VubnlEYXlEZXN0aW5hdGlvbi90eXBlX2lwdjYnLAogICAgICAgICAnU2JTb2NrZXRBZGRyZXNzVHlwZXMvU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzVGVzdC5TdW5ueURheVNvdXJjZUZvckRlc3RpbmF0aW9uL3R5cGVfaXB2NicsCkBAIC00NSw2ICs0OCwxMSBAQAogICAgICAgICAnU2JTb2NrZXRBZGRyZXNzVHlwZXMvU2JTb2NrZXRTZXRPcHRpb25zVGVzdC5SYWlueURheUludmFsaWRTb2NrZXQvdHlwZV9pcHY2JywKICAgICAgICAgIyBGbGFraW5lc3MgaXMgdHJhY2tlZCBpbiBiLzI3ODI3Njc3OS4KICAgICAgICAgJ1NlbWFwaG9yZS5UaHJlYWRUYWtlc1dhaXRfVGltZUV4cGlyZXMnLAorICAgICAgICAjIEZhaWx1cmUgdHJhY2tlZCBieSBiLzI4NzY2NjYwNi4KKyAgICAgICAgJ1ZlcnRpY2FsVmlkZW9UZXN0cy9WZXJ0aWNhbFZpZGVvVGVzdC5Xcml0ZVNhbXBsZXMqJywKKworICAgICAgICAjIEVuYWJsZSBvbmNlIHZlcmlmaWVkIG9uIHRoZSBwbGF0Zm9ybS4KKyAgICAgICAgJ1NiTWVkaWFDYW5QbGF5TWltZUFuZEtleVN5c3RlbS5NaW5pbXVtU3VwcG9ydCcsCiAgICAgXSwKICAgICAncGxheWVyX2ZpbHRlcl90ZXN0cyc6IFsKICAgICAgICAgIyBUaGVzZSB0ZXN0cyBmYWlsIG9uIG91ciBWTXMgZm9yIHdpbi13aW4zMiBidWlsZHMgZHVlIHRvIG1pc3NpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svQlVJTEQuZ24gYi90ZXN0aW5nL2dtb2NrL0JVSUxELmduCmluZGV4IDFkMjcwMTYuLmIxYzI4Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZ21vY2svQlVJTEQuZ24KKysrIGIvdGVzdGluZy9nbW9jay9CVUlMRC5nbgpAQCAtMSw1MyArMSwyNSBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMKICMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgVGhlIGZpbGUvZGlyZWN0b3J5IGxheW91dCBvZiBHb29nbGUgVGVzdCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgc3RhYmxlLiBVbnRpbAorIyBpdCBzdGFiaWxpemVzLCBDaHJvbWl1bSBjb2RlIE1VU1QgdXNlIHRoaXMgdGFyZ2V0IGluc3RlYWQgb2YgcmVhY2hpbmcgZGlyZWN0bHkKKyMgaW50byAvL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QuCiAKLWNvbmZpZygiZ21vY2tfZGlyZWN0X2NvbmZpZyIpIHsKLSAgaW5jbHVkZV9kaXJzID0gWyAiaW5jbHVkZSIgXQotfQotCi1zdGF0aWNfbGlicmFyeSgiZ21vY2siKSB7Citzb3VyY2Vfc2V0KCJnbW9jayIpIHsKICAgdGVzdG9ubHkgPSB0cnVlCiAgIHNvdXJjZXMgPSBbCiAgICAgImluY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oIiwKLSAgICAiaW5jbHVkZS9nbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmgiLAotICAgICJpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiLAotICAgICJpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgiLAotICAgICJpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIiwKLSAgICAiaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaCIsCiAgICAgImluY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIsCi0gICAgImluY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIiwKICAgICAiaW5jbHVkZS9nbW9jay9nbW9jay5oIiwKLSAgICAiaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaCIsCi0gICAgImluY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIsCi0gICAgImluY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIiwKLSAgICAic3JjL2dtb2NrLWNhcmRpbmFsaXRpZXMuY2MiLAotICAgICJzcmMvZ21vY2staW50ZXJuYWwtdXRpbHMuY2MiLAotICAgICJzcmMvZ21vY2stbWF0Y2hlcnMuY2MiLAotICAgICJzcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYyIsCi0gICAgInNyYy9nbW9jay5jYyIsCi0gICAgIi4uL2dtb2NrX211dGFudC5oIiwKICAgXQorICBwdWJsaWNfZGVwcyA9IFsgIi8vdGhpcmRfcGFydHkvZ29vZ2xldGVzdDpnbW9jayIgXQorfQogCi0gIGluY2x1ZGVfZGlycyA9IFsgIi4iIF0KLQotICBwdWJsaWNfY29uZmlncyA9IFsgIjpnbW9ja19kaXJlY3RfY29uZmlnIiBdCi0KLSAgcHVibGljX2RlcHMgPSBbCi0gICAgIi8vdGVzdGluZy9ndGVzdCIsCi0gIF0KKyMgVGhlIGZpbGUvZGlyZWN0b3J5IGxheW91dCBvZiBHb29nbGUgVGVzdCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgc3RhYmxlLiBVbnRpbAorIyBpdCBzdGFiaWxpemVzLCBDaHJvbWl1bSBjb2RlIE1VU1QgdXNlIHRoaXMgdGFyZ2V0IGluc3RlYWQgb2YgcmVhY2hpbmcgZGlyZWN0bHkKKyMgaW50byAvL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QuCitzb3VyY2Vfc2V0KCJnbW9ja19tYWluIikgeworICB0ZXN0b25seSA9IHRydWUKKyAgZGVwcyA9IFsgIi8vdGhpcmRfcGFydHkvZ29vZ2xldGVzdDpnbW9ja19tYWluIiBdCiB9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL0NIQU5HRVMgYi90ZXN0aW5nL2dtb2NrL0NIQU5HRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjJmNzYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9DSEFOR0VTCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLUNoYW5nZXMgZm9yIDEuNy4wOgotCi0qIEFsbCBuZXcgaW1wcm92ZW1lbnRzIGluIEdvb2dsZSBUZXN0IDEuNy4wLgotKiBOZXcgZmVhdHVyZTogbWF0Y2hlcnMgRG91YmxlTmVhcigpLCBGbG9hdE5lYXIoKSwKLSAgTmFuU2Vuc2l0aXZlRG91YmxlTmVhcigpLCBOYW5TZW5zaXRpdmVGbG9hdE5lYXIoKSwKLSAgVW5vcmRlcmVkRWxlbWVudHNBcmUoKSwgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLCBXaGVuU29ydGVkKCksCi0gIFdoZW5Tb3J0ZWRCeSgpLCBJc0VtcHR5KCksIGFuZCBTaXplSXMoKS4KLSogSW1wcm92ZW1lbnQ6IEdvb2dsZSBNb2NrIGNhbiBub3cgYmUgYnVpbHQgYXMgYSBETEwuCi0qIEltcHJvdmVtZW50OiB3aGVuIGNvbXBpbGVkIGJ5IGEgQysrMTEgY29tcGlsZXIsIG1hdGNoZXJzIEFsbE9mKCkKLSAgYW5kIEFueU9mKCkgY2FuIGFjY2VwdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG1hdGNoZXJzLgotKiBJbXByb3ZlbWVudDogd2hlbiBjb21waWxlZCBieSBhIEMrKzExIGNvbXBpbGVyLCBtYXRjaGVycwotICBFbGVtZW50c0FyZUFycmF5KCkgY2FuIGFjY2VwdCBhbiBpbml0aWFsaXplciBsaXN0LgotKiBJbXByb3ZlbWVudDogd2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBhIG1vY2sgbWV0aG9kIHdpdGggbm8KLSAgZGVmYXVsdCBhY3Rpb24gbm93IHRocm93cyBpbnN0ZWFkIGNyYXNoaW5nIHRoZSB0ZXN0LgotKiBJbXByb3ZlbWVudDogYWRkZWQgY2xhc3MgdGVzdGluZzo6U3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciB0byBhaWQKLSAgZGVmaW5pdGlvbiBvZiBjb21wb3NpdGUgbWF0Y2hlcnMuCi0qIEltcHJvdmVtZW50OiBmdW5jdGlvbiByZXR1cm4gdHlwZXMgdXNlZCBpbiBNT0NLX01FVEhPRCooKSBtYWNyb3MgY2FuCi0gIG5vdyBjb250YWluIHVucHJvdGVjdGVkIGNvbW1hcy4KLSogSW1wcm92ZW1lbnQgKHBvdGVudGlhbGx5IGJyZWFraW5nKTogRVhQRUNUX1RIQVQoKSBhbmQgQVNTRVJUX1RIQVQoKQotICBhcmUgbm93IG1vcmUgc3RyaWN0IGluIGVuc3VyaW5nIHRoYXQgdGhlIHZhbHVlIHR5cGUgYW5kIHRoZSBtYXRjaGVyCi0gIHR5cGUgYXJlIGNvbXBhdGlibGUsIGNhdGNoaW5nIHBvdGVudGlhbCBidWdzIGluIHRlc3RzLgotKiBJbXByb3ZlbWVudDogUG9pbnRlZSgpIG5vdyB3b3JrcyBvbiBhbiBvcHRpb25hbDxUPi4KLSogSW1wcm92ZW1lbnQ6IHRoZSBFbGVtZW50c0FyZUFycmF5KCkgbWF0Y2hlciBjYW4gbm93IHRha2UgYSB2ZWN0b3Igb3IKLSAgaXRlcmF0b3IgcmFuZ2UgYXMgaW5wdXQsIGFuZCBtYWtlcyBhIGNvcHkgb2YgaXRzIGlucHV0IGVsZW1lbnRzCi0gIGJlZm9yZSB0aGUgY29udmVyc2lvbiB0byBhIE1hdGNoZXIuCi0qIEltcHJvdmVtZW50OiB0aGUgR29vZ2xlIE1vY2sgR2VuZXJhdG9yIGNhbiBub3cgZ2VuZXJhdGUgbW9ja3MgZm9yCi0gIHNvbWUgY2xhc3MgdGVtcGxhdGVzLgotKiBCdWcgZml4OiBtb2NrIG9iamVjdCBkZXN0cnVjdGlvbiB0cmlnZ2VycmVkIGJ5IGFub3RoZXIgbW9jayBvYmplY3QncwotICBkZXN0cnVjdGlvbiBubyBsb25nZXIgaGFuZ3MuCi0qIEltcHJvdmVtZW50OiBHb29nbGUgTW9jayBEb2N0b3Igd29ya3MgYmV0dGVyIHdpdGggbmV3ZXIgQ2xhbmcgYW5kCi0gIEdDQyBub3cuCi0qIENvbXBhdGliaWxpdHkgZml4ZXMuCi0qIEJ1Zy93YXJuaW5nIGZpeGVzLgotCi1DaGFuZ2VzIGZvciAxLjYuMDoKLQotKiBDb21waWxhdGlvbiBpcyBtdWNoIGZhc3RlciBhbmQgdXNlcyBtdWNoIGxlc3MgbWVtb3J5LCBlc3BlY2lhbGx5Ci0gIHdoZW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG9mIGEgbW9jayBjbGFzcyBhcmUgbW92ZWQgb3V0IG9mCi0gIHRoZSBjbGFzcyBib2R5LgotKiBOZXcgbWF0Y2hlcnM6IFBvaW50d2lzZSgpLCBFYWNoKCkuCi0qIE5ldyBhY3Rpb25zOiBSZXR1cm5Qb2ludGVlKCkgYW5kIFJldHVyblJlZk9mQ29weSgpLgotKiBDTWFrZSBzdXBwb3J0LgotKiBQcm9qZWN0IGZpbGVzIGZvciBWaXN1YWwgU3R1ZGlvIDIwMTAuCi0qIEFsbE9mKCkgYW5kIEFueU9mKCkgY2FuIGhhbmRsZSB1cC10byAxMCBhcmd1bWVudHMgbm93LgotKiBHb29nbGUgTW9jayBkb2N0b3IgdW5kZXJzdGFuZHMgQ2xhbmcgZXJyb3IgbWVzc2FnZXMgbm93LgotKiBTZXRBcmdQb2ludGVlPD4gbm93IGFjY2VwdHMgc3RyaW5nIGxpdGVyYWxzLgotKiBnbW9ja19nZW4ucHkgaGFuZGxlcyBzdG9yYWdlIHNwZWNpZmllciBtYWNyb3MgYW5kIHRlbXBsYXRlIHJldHVybgotICB0eXBlcyBub3cuCi0qIENvbXBhdGliaWxpdHkgZml4ZXMuCi0qIEJ1ZyBmaXhlcyBhbmQgaW1wbGVtZW50YXRpb24gY2xlYW4tdXBzLgotKiBQb3RlbnRpYWxseSBpbmNvbXBhdGlibGUgY2hhbmdlczogZGlzYWJsZXMgdGhlIGhhcm1mdWwgJ21ha2UgaW5zdGFsbCcKLSAgY29tbWFuZCBpbiBhdXRvdG9vbHMuCi0KLVBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZXM6Ci0KLSogVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBmb3IgTUFUQ0hFUiooKSBjaGFuZ2VzIGZyb20gUHl0aG9uLXN0eWxlCi0gIGludGVycG9sYXRpb24gdG8gYW4gb3JkaW5hcnkgQysrIHN0cmluZyBleHByZXNzaW9uLgotKiBTZXRBcmd1bWVudFBvaW50ZWUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBTZXRBcmdQb2ludGVlLgotKiBTb21lIG5vbi1lc3NlbnRpYWwgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIFN0dWRpbyAyMDA1IGFyZSByZW1vdmVkLgotCi1DaGFuZ2VzIGZvciAxLjUuMDoKLQotICogTmV3IGZlYXR1cmU6IEdvb2dsZSBNb2NrIGNhbiBiZSBzYWZlbHkgdXNlZCBpbiBtdWx0aS10aHJlYWRlZCB0ZXN0cwotICAgb24gcGxhdGZvcm1zIGhhdmluZyBwdGhyZWFkcy4KLSAqIE5ldyBmZWF0dXJlOiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB2YWx1ZSBvZiBhcmJpdHJhcnkgdHlwZS4KLSAqIE5ldyBmZWF0dXJlOiBmdW5jdGlvbiBFeHBsYWluTWF0Y2hSZXN1bHQoKSBmb3IgZWFzeSBkZWZpbml0aW9uIG9mCi0gICBjb21wb3NpdGUgbWF0Y2hlcnMuCi0gKiBUaGUgbmV3IG1hdGNoZXIgQVBJIGxldHMgdXNlci1kZWZpbmVkIG1hdGNoZXJzIGdlbmVyYXRlIGN1c3RvbQotICAgZXhwbGFuYXRpb25zIG1vcmUgZGlyZWN0bHkgYW5kIGVmZmljaWVudGx5LgotICogQmV0dGVyIGZhaWx1cmUgbWVzc2FnZXMgYWxsIGFyb3VuZC4KLSAqIE5vdE51bGwoKSBhbmQgSXNOdWxsKCkgbm93IHdvcmsgd2l0aCBzbWFydCBwb2ludGVycy4KLSAqIEZpZWxkKCkgYW5kIFByb3BlcnR5KCkgbm93IHdvcmsgd2hlbiB0aGUgbWF0Y2hlciBhcmd1bWVudCBpcyBhIHBvaW50ZXIKLSAgIHBhc3NlZCBieSByZWZlcmVuY2UuCi0gKiBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcnMgb24gYWxsIHBsYXRmb3Jtcy4KLSAqIEFkZGVkIEdDQyA0LjAgc3VwcG9ydCBmb3IgR29vZ2xlIE1vY2sgRG9jdG9yLgotICogQWRkZWQgZ21vY2tfYWxsX3Rlc3QuY2MgZm9yIGNvbXBpbGluZyBtb3N0IEdvb2dsZSBNb2NrIHRlc3RzCi0gICBpbiBhIHNpbmdsZSBmaWxlLgotICogU2lnbmlmaWNhbnRseSBjbGVhbmVkIHVwIGNvbXBpbGVyIHdhcm5pbmdzLgotICogQnVnIGZpeGVzLCBiZXR0ZXIgdGVzdCBjb3ZlcmFnZSwgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KLQotIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZXM6Ci0KLSAqIEN1c3RvbSBtYXRjaGVycyBkZWZpbmVkIHVzaW5nIE1hdGNoZXJJbnRlcmZhY2Ugb3IgTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpCi0gICBuZWVkIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgdXBncmFkaW5nIHRvIEdvb2dsZSBNb2NrIDEuNS4wOyBtYXRjaGVycyBkZWZpbmVkCi0gICB1c2luZyBNQVRDSEVSIG9yIE1BVENIRVJfUCogYXJlbid0IGFmZmVjdGVkLgotICogRHJvcHBlZCBzdXBwb3J0IGZvciAnbWFrZSBpbnN0YWxsJy4KLQotQ2hhbmdlcyBmb3IgMS40LjAgKHdlIHNraXBwZWQgMS4yLiogYW5kIDEuMy4qIHRvIG1hdGNoIHRoZSB2ZXJzaW9uIG9mCi1Hb29nbGUgVGVzdCk6Ci0KLSAqIFdvcmtzIGluIG1vcmUgZW52aXJvbm1lbnRzOiBTeW1iaWFuIGFuZCBtaW5HVywgVmlzdWFsIEMrKyA3LjEuCi0gKiBMaWdodGVyIHdlaWdodDogY29tZXMgd2l0aCBvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIFRSMSB0dXBsZSAobm8KLSAgIG1vcmUgZGVwZW5kZW5jeSBvbiBCb29zdCEpLgotICogTmV3IGZlYXR1cmU6IC0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzIGZvciBkZXRlY3RpbmcgbGVha2VkIG1vY2tzLgotICogTmV3IGZlYXR1cmU6IEFDVElPTl9URU1QTEFURSBmb3IgZGVmaW5pbmcgdGVtcGxhdGl6ZWQgYWN0aW9ucy4KLSAqIE5ldyBmZWF0dXJlOiB0aGUgLkFmdGVyKCkgY2xhdXNlIGZvciBzcGVjaWZ5aW5nIGV4cGVjdGF0aW9uIG9yZGVyLgotICogTmV3IGZlYXR1cmU6IHRoZSAuV2l0aCgpIGNsYXVzZSBmb3IgZm9yIHNwZWNpZnlpbmcgaW50ZXItYXJndW1lbnQKLSAgIGNvbnN0cmFpbnRzLgotICogTmV3IGZlYXR1cmU6IGFjdGlvbnMgUmV0dXJuQXJnPGs+KCksIFJldHVybk5ldzxUPiguLi4pLCBhbmQKLSAgIERlbGV0ZUFyZzxrPigpLgotICogTmV3IGZlYXR1cmU6IG1hdGNoZXJzIEtleSgpLCBQYWlyKCksIEFyZ3M8Li4uPigpLCBBbGxBcmdzKCksIElzTnVsbCgpLAotICAgYW5kIENvbnRhaW5zKCkuCi0gKiBOZXcgZmVhdHVyZTogdXRpbGl0eSBjbGFzcyBNb2NrRnVuY3Rpb248Rj4sIHVzZWZ1bCBmb3IgY2hlY2twb2ludHMsIGV0Yy4KLSAqIE5ldyBmZWF0dXJlOiBmdW5jdGlvbnMgVmFsdWUoeCwgbSkgYW5kIFNhZmVNYXRjaGVyQ2FzdDxUPihtKS4KLSAqIE5ldyBmZWF0dXJlOiBjb3B5aW5nIGEgbW9jayBvYmplY3QgaXMgcmVqZWN0ZWQgYXQgY29tcGlsZSB0aW1lLgotICogTmV3IGZlYXR1cmU6IGEgc2NyaXB0IGZvciBmdXNpbmcgYWxsIEdvb2dsZSBNb2NrIGFuZCBHb29nbGUgVGVzdAotICAgc291cmNlIGZpbGVzIGZvciBlYXN5IGRlcGxveW1lbnQuCi0gKiBJbXByb3ZlZCB0aGUgR29vZ2xlIE1vY2sgZG9jdG9yIHRvIGRpYWdub3NlIG1vcmUgZGlzZWFzZXMuCi0gKiBJbXByb3ZlZCB0aGUgR29vZ2xlIE1vY2sgZ2VuZXJhdG9yIHNjcmlwdC4KLSAqIENvbXBhdGliaWxpdHkgZml4ZXMgZm9yIE1hYyBPUyBYIGFuZCBnY2MuCi0gKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KLQotQ2hhbmdlcyBmb3IgMS4xLjA6Ci0KLSAqIE5ldyBmZWF0dXJlOiBhYmlsaXR5IHRvIHVzZSBHb29nbGUgTW9jayB3aXRoIGFueSB0ZXN0aW5nIGZyYW1ld29yay4KLSAqIE5ldyBmZWF0dXJlOiBtYWNyb3MgZm9yIGVhc2lseSBkZWZpbmluZyBuZXcgbWF0Y2hlcnMKLSAqIE5ldyBmZWF0dXJlOiBtYWNyb3MgZm9yIGVhc2lseSBkZWZpbmluZyBuZXcgYWN0aW9ucy4KLSAqIE5ldyBmZWF0dXJlOiBtb3JlIGNvbnRhaW5lciBtYXRjaGVycy4KLSAqIE5ldyBmZWF0dXJlOiBhY3Rpb25zIGZvciBhY2Nlc3NpbmcgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCB0aHJvd2luZwotICAgZXhjZXB0aW9ucy4KLSAqIEltcHJvdmVkIHRoZSBHb29nbGUgTW9jayBkb2N0b3Igc2NyaXB0IGZvciBkaWFnbm9zaW5nIGNvbXBpbGVyIGVycm9ycy4KLSAqIEJ1ZyBmaXhlcyBhbmQgaW1wbGVtZW50YXRpb24gY2xlYW4tdXBzLgotCi1DaGFuZ2VzIGZvciAxLjAuMDoKLQotICogSW5pdGlhbCBPcGVuIFNvdXJjZSByZWxlYXNlIG9mIEdvb2dsZSBNb2NrCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL0NNYWtlTGlzdHMudHh0IGIvdGVzdGluZy9nbW9jay9DTWFrZUxpc3RzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjNjYzNy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDTWFrZSBidWlsZCBzY3JpcHQgZm9yIEdvb2dsZSBNb2NrLgotIwotIyBUbyBydW4gdGhlIHRlc3RzIGZvciBHb29nbGUgTW9jayBpdHNlbGYgb24gTGludXgsIHVzZSAnbWFrZSB0ZXN0JyBvcgotIyBjdGVzdC4gIFlvdSBjYW4gc2VsZWN0IHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyAnY3Rlc3QgLVIgcmVnZXgnLgotIyBGb3IgbW9yZSBvcHRpb25zLCBydW4gJ2N0ZXN0IC0taGVscCcuCi0KLSMgQlVJTERfU0hBUkVEX0xJQlMgaXMgYSBzdGFuZGFyZCBDTWFrZSB2YXJpYWJsZSwgYnV0IHdlIGRlY2xhcmUgaXQgaGVyZSB0bwotIyBtYWtlIGl0IHByb21pbmVudCBpbiB0aGUgR1VJLgotb3B0aW9uKEJVSUxEX1NIQVJFRF9MSUJTICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIChETExzKS4iIE9GRikKLQotb3B0aW9uKGdtb2NrX2J1aWxkX3Rlc3RzICJCdWlsZCBhbGwgb2YgR29vZ2xlIE1vY2sncyBvd24gdGVzdHMuIiBPRkYpCi0KLSMgQSBkaXJlY3RvcnkgdG8gZmluZCBHb29nbGUgVGVzdCBzb3VyY2VzLgotaWYgKEVYSVNUUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2d0ZXN0L0NNYWtlTGlzdHMudHh0IikKLSAgc2V0KGd0ZXN0X2RpciBndGVzdCkKLWVsc2UoKQotICBzZXQoZ3Rlc3RfZGlyIC4uL2d0ZXN0KQotZW5kaWYoKQotCi0jIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLgotaW5jbHVkZSgiJHtndGVzdF9kaXJ9L2NtYWtlL2hlcm1ldGljX2J1aWxkLmNtYWtlIiBPUFRJT05BTCkKLQotaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQotICAjIEdvb2dsZSBUZXN0IGFsc28gY2FsbHMgaGVybWV0aWMgc2V0dXAgZnVuY3Rpb25zIGZyb20gYWRkX3N1YmRpcmVjdG9yeSwKLSAgIyBhbHRob3VnaCBpdHMgY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgdGhpbmdzIGF0IHRoZSBjdXJyZW50IHNjb3BlLgotICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQotZW5kaWYoKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUHJvamVjdC13aWRlIHNldHRpbmdzCi0KLSMgTmFtZSBvZiB0aGUgcHJvamVjdC4KLSMKLSMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5Ci0jIGFzICR7Z21vY2tfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMKLSMgJHtnbW9ja19CSU5BUllfRElSfS4KLSMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuCi1wcm9qZWN0KGdtb2NrIENYWCBDKQotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4yKQotCi1pZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpCi0gIHNldF91cF9oZXJtZXRpY19idWlsZCgpCi1lbmRpZigpCi0KLSMgSW5zdHJ1Y3RzIENNYWtlIHRvIHByb2Nlc3MgR29vZ2xlIFRlc3QncyBDTWFrZUxpc3RzLnR4dCBhbmQgYWRkIGl0cwotIyB0YXJnZXRzIHRvIHRoZSBjdXJyZW50IHNjb3BlLiAgV2UgYXJlIHBsYWNpbmcgR29vZ2xlIFRlc3QncyBiaW5hcnkKLSMgZGlyZWN0b3J5IGluIGEgc3ViZGlyZWN0b3J5IG9mIG91ciBvd24gYXMgVkMgY29tcGlsYXRpb24gbWF5IGJyZWFrCi0jIGlmIHRoZXkgYXJlIHRoZSBzYW1lICh0aGUgZGVmYXVsdCkuCi1hZGRfc3ViZGlyZWN0b3J5KCIke2d0ZXN0X2Rpcn0iICIke2dtb2NrX0JJTkFSWV9ESVJ9L2d0ZXN0IikKLQotIyBBbHRob3VnaCBHb29nbGUgVGVzdCdzIENNYWtlTGlzdHMudHh0IGNhbGxzIHRoaXMgZnVuY3Rpb24sIHRoZQotIyBjaGFuZ2VzIHRoZXJlIGRvbid0IGFmZmVjdCB0aGUgY3VycmVudCBzY29wZS4gIFRoZXJlZm9yZSB3ZSBoYXZlIHRvCi0jIGNhbGwgaXQgYWdhaW4gaGVyZS4KLWNvbmZpZ19jb21waWxlcl9hbmRfbGlua2VyKCkgICMgZnJvbSAke2d0ZXN0X2Rpcn0vY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKLQotIyBBZGRzIEdvb2dsZSBNb2NrJ3MgYW5kIEdvb2dsZSBUZXN0J3MgaGVhZGVyIGRpcmVjdG9yaWVzIHRvIHRoZSBzZWFyY2ggcGF0aC4KLWluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Z21vY2tfU09VUkNFX0RJUn0vaW5jbHVkZSIKLSAgICAgICAgICAgICAgICAgICAgIiR7Z21vY2tfU09VUkNFX0RJUn0iCi0gICAgICAgICAgICAgICAgICAgICIke2d0ZXN0X1NPVVJDRV9ESVJ9L2luY2x1ZGUiCi0gICAgICAgICAgICAgICAgICAgICMgVGhpcyBkaXJlY3RvcnkgaXMgbmVlZGVkIHRvIGJ1aWxkIGRpcmVjdGx5IGZyb20gR29vZ2xlCi0gICAgICAgICAgICAgICAgICAgICMgVGVzdCBzb3VyY2VzLgotICAgICAgICAgICAgICAgICAgICAiJHtndGVzdF9TT1VSQ0VfRElSfSIpCi0KLSMgU3VtbWFyeSBvZiB0dXBsZSBzdXBwb3J0IGZvciBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbzoKLSMgQ29tcGlsZXIgICAgdmVyc2lvbihNUykgIHZlcnNpb24oY21ha2UpICBTdXBwb3J0Ci0jIC0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgPD0gVlMgMjAxMCAgPD0gMTAgICAgICAgIDw9IDE2MDAgICAgICAgICBVc2UgR29vZ2xlIFRlc3RzJ3Mgb3duIHR1cGxlLgotIyBWUyAyMDEyICAgICAxMSAgICAgICAgICAgMTcwMCAgICAgICAgICAgIHN0ZDo6dHIxOjp0dXBsZSArIF9WQVJJQURJQ19NQVg9MTAKLSMgVlMgMjAxMyAgICAgMTIgICAgICAgICAgIDE4MDAgICAgICAgICAgICBzdGQ6OnRyMTo6dHVwbGUKLWlmIChNU1ZDIEFORCBNU1ZDX1ZFUlNJT04gRVFVQUwgMTcwMCkKLSAgYWRkX2RlZmluaXRpb25zKC9EIF9WQVJJQURJQ19NQVg9MTApCi1lbmRpZigpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBEZWZpbmVzIHRoZSBnbW9jayAmIGdtb2NrX21haW4gbGlicmFyaWVzLiAgVXNlciB0ZXN0cyBzaG91bGQgbGluawotIyB3aXRoIG9uZSBvZiB0aGVtLgotCi0jIEdvb2dsZSBNb2NrIGxpYnJhcmllcy4gIFdlIGJ1aWxkIHRoZW0gdXNpbmcgbW9yZSBzdHJpY3Qgd2FybmluZ3MgdGhhbiB3aGF0Ci0jIGFyZSB1c2VkIGZvciBvdGhlciB0YXJnZXRzLCB0byBlbnN1cmUgdGhhdCBHb29nbGUgTW9jayBjYW4gYmUgY29tcGlsZWQgYnkKLSMgYSB1c2VyIGFnZ3Jlc3NpdmUgYWJvdXQgd2FybmluZ3MuCi1jeHhfbGlicmFyeShnbW9jawotICAgICAgICAgICAgIiR7Y3h4X3N0cmljdH0iCi0gICAgICAgICAgICAiJHtndGVzdF9kaXJ9L3NyYy9ndGVzdC1hbGwuY2MiCi0gICAgICAgICAgICBzcmMvZ21vY2stYWxsLmNjKQotCi1jeHhfbGlicmFyeShnbW9ja19tYWluCi0gICAgICAgICAgICAiJHtjeHhfc3RyaWN0fSIKLSAgICAgICAgICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIKLSAgICAgICAgICAgIHNyYy9nbW9jay1hbGwuY2MKLSAgICAgICAgICAgIHNyYy9nbW9ja19tYWluLmNjKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgR29vZ2xlIE1vY2sncyBvd24gdGVzdHMuCi0jCi0jIFlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRlc3RpbmcKLSMgR29vZ2xlIE1vY2sgaXRzZWxmLgotIwotIyBUaGUgdGVzdHMgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQotIyBnbW9ja19idWlsZF90ZXN0cyBvcHRpb24gdG8gT04uICBZb3UgY2FuIGRvIGl0IGJ5IHJ1bm5pbmcgY2NtYWtlCi0jIG9yIHNwZWNpZnlpbmcgdGhlIC1EZ21vY2tfYnVpbGRfdGVzdHM9T04gZmxhZyB3aGVuIHJ1bm5pbmcgY21ha2UuCi0KLWlmIChnbW9ja19idWlsZF90ZXN0cykKLSAgIyBUaGlzIG11c3QgYmUgc2V0IGluIHRoZSByb290IGRpcmVjdG9yeSBmb3IgdGhlIHRlc3RzIHRvIGJlIHJ1biBieQotICAjICdtYWtlIHRlc3QnIG9yIGN0ZXN0LgotICBlbmFibGVfdGVzdGluZygpCi0KLSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCi0KLSAgY3h4X3Rlc3QoZ21vY2stYWN0aW9uc190ZXN0IGdtb2NrX21haW4pCi0gIGN4eF90ZXN0KGdtb2NrLWNhcmRpbmFsaXRpZXNfdGVzdCBnbW9ja19tYWluKQotICBjeHhfdGVzdChnbW9ja19leF90ZXN0IGdtb2NrX21haW4pCi0gIGN4eF90ZXN0KGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zX3Rlc3QgZ21vY2tfbWFpbikKLSAgY3h4X3Rlc3QoZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnNfdGVzdCBnbW9ja19tYWluKQotICBjeHhfdGVzdChnbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHNfdGVzdCBnbW9ja19tYWluKQotICBjeHhfdGVzdChnbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnNfdGVzdCBnbW9ja19tYWluKQotICBjeHhfdGVzdChnbW9jay1pbnRlcm5hbC11dGlsc190ZXN0IGdtb2NrX21haW4pCi0gIGN4eF90ZXN0KGdtb2NrLW1hdGNoZXJzX3Rlc3QgZ21vY2tfbWFpbikKLSAgY3h4X3Rlc3QoZ21vY2stbW9yZS1hY3Rpb25zX3Rlc3QgZ21vY2tfbWFpbikKLSAgY3h4X3Rlc3QoZ21vY2stbmljZS1zdHJpY3RfdGVzdCBnbW9ja19tYWluKQotICBjeHhfdGVzdChnbW9jay1wb3J0X3Rlc3QgZ21vY2tfbWFpbikKLSAgY3h4X3Rlc3QoZ21vY2stc3BlYy1idWlsZGVyc190ZXN0IGdtb2NrX21haW4pCi0gIGN4eF90ZXN0KGdtb2NrX2xpbmtfdGVzdCBnbW9ja19tYWluIHRlc3QvZ21vY2tfbGluazJfdGVzdC5jYykKLSAgY3h4X3Rlc3QoZ21vY2tfdGVzdCBnbW9ja19tYWluKQotCi0gIGlmIChDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKLSAgICBjeHhfdGVzdChnbW9ja19zdHJlc3NfdGVzdCBnbW9jaykKLSAgZW5kaWYoKQotCi0gICMgZ21vY2tfYWxsX3Rlc3QgaXMgY29tbWVudGVkIHRvIHNhdmUgdGltZSBidWlsZGluZyBhbmQgcnVubmluZyB0ZXN0cy4KLSAgIyBVbmNvbW1lbnQgaWYgbmVjZXNzYXJ5LgotICAjIGN4eF90ZXN0KGdtb2NrX2FsbF90ZXN0IGdtb2NrX21haW4pCi0KLSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggbm9uLXN0YW5kYXJkIGNvbXBpbGVyIGZsYWdzLgotCi0gIGN4eF9saWJyYXJ5KGdtb2NrX21haW5fbm9fZXhjZXB0aW9uICIke2N4eF9ub19leGNlcHRpb259IgotICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIgc3JjL2dtb2NrLWFsbC5jYyBzcmMvZ21vY2tfbWFpbi5jYykKLQotICBjeHhfbGlicmFyeShnbW9ja19tYWluX25vX3J0dGkgIiR7Y3h4X25vX3J0dGl9IgotICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIgc3JjL2dtb2NrLWFsbC5jYyBzcmMvZ21vY2tfbWFpbi5jYykKLQotICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIExFU1MgMTYwMCkgICMgMTYwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMTAuCi0gICAgIyBWaXN1YWwgU3R1ZGlvIDIwMTAsIDIwMTIsIGFuZCAyMDEzIGRlZmluZSBzeW1ib2xzIGluIHN0ZDo6dHIxIHRoYXQKLSAgICAjIGNvbmZsaWN0IHdpdGggb3VyIG93biBkZWZpbml0aW9ucy4gVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgZG9lcyBub3QKLSAgICAjIHdvcmsgb24gdGhvc2UgY29tcGlsZXJzLgotICAgIGN4eF9saWJyYXJ5KGdtb2NrX21haW5fdXNlX293bl90dXBsZSAiJHtjeHhfdXNlX293bl90dXBsZX0iCi0gICAgICAiJHtndGVzdF9kaXJ9L3NyYy9ndGVzdC1hbGwuY2MiIHNyYy9nbW9jay1hbGwuY2Mgc3JjL2dtb2NrX21haW4uY2MpCi0KLSAgICBjeHhfdGVzdF93aXRoX2ZsYWdzKGdtb2NrX3VzZV9vd25fdHVwbGVfdGVzdCAiJHtjeHhfdXNlX293bl90dXBsZX0iCi0gICAgICBnbW9ja19tYWluX3VzZV9vd25fdHVwbGUgdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MpCi0gIGVuZGlmKCkKLQotICBjeHhfdGVzdF93aXRoX2ZsYWdzKGdtb2NrLW1vcmUtYWN0aW9uc19ub19leGNlcHRpb25fdGVzdCAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKLSAgICBnbW9ja19tYWluX25vX2V4Y2VwdGlvbiB0ZXN0L2dtb2NrLW1vcmUtYWN0aW9uc190ZXN0LmNjKQotCi0gIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ21vY2tfbm9fcnR0aV90ZXN0ICIke2N4eF9ub19ydHRpfSIKLSAgICBnbW9ja19tYWluX25vX3J0dGkgdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MpCi0KLSAgY3h4X3NoYXJlZF9saWJyYXJ5KHNoYXJlZF9nbW9ja19tYWluICIke2N4eF9kZWZhdWx0fSIKLSAgICAiJHtndGVzdF9kaXJ9L3NyYy9ndGVzdC1hbGwuY2MiIHNyYy9nbW9jay1hbGwuY2Mgc3JjL2dtb2NrX21haW4uY2MpCi0KLSAgIyBUZXN0cyB0aGF0IGEgYmluYXJ5IGNhbiBiZSBidWlsdCB3aXRoIEdvb2dsZSBNb2NrIGFzIGEgc2hhcmVkIGxpYnJhcnkuICBPbgotICAjIHNvbWUgc3lzdGVtIGNvbmZpZ3VyYXRpb25zLCBpdCBtYXkgbm90IHBvc3NpYmxlIHRvIHJ1biB0aGUgYmluYXJ5IHdpdGhvdXQKLSAgIyBrbm93aW5nIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb25zLiBXZSBkbyBub3QgdHJ5IHRvIHJ1bgotICAjIHRoaXMgYmluYXJ5LiBUbyBnZXQgYSBtb3JlIHJvYnVzdCBzaGFyZWQgbGlicmFyeSBjb3ZlcmFnZSwgY29uZmlndXJlIHdpdGgKLSAgIyAtREJVSUxEX1NIQVJFRF9MSUJTPU9OLgotICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKHNoYXJlZF9nbW9ja190ZXN0XyAiJHtjeHhfZGVmYXVsdH0iCi0gICAgc2hhcmVkX2dtb2NrX21haW4gdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MpCi0gIHNldF90YXJnZXRfcHJvcGVydGllcyhzaGFyZWRfZ21vY2tfdGVzdF8KLSAgICBQUk9QRVJUSUVTCi0gICAgQ09NUElMRV9ERUZJTklUSU9OUyAiR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZPTEiKQotCi0gICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAjIFB5dGhvbiB0ZXN0cy4KLQotICBjeHhfZXhlY3V0YWJsZShnbW9ja19sZWFrX3Rlc3RfIHRlc3QgZ21vY2tfbWFpbikKLSAgcHlfdGVzdChnbW9ja19sZWFrX3Rlc3QpCi0KLSAgY3h4X2V4ZWN1dGFibGUoZ21vY2tfb3V0cHV0X3Rlc3RfIHRlc3QgZ21vY2spCi0gIHB5X3Rlc3QoZ21vY2tfb3V0cHV0X3Rlc3QpCi1lbmRpZigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL0NPTlRSSUJVVE9SUyBiL3Rlc3RpbmcvZ21vY2svQ09OVFJJQlVUT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTlhZTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svQ09OVFJJQlVUT1JTCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHBlb3BsZSB3aG8ndmUgbWFkZSBub24tdHJpdmlhbAotIyBjb250cmlidXRpb24gdG8gdGhlIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmsgcHJvamVjdC4gIFBlb3BsZQotIyB3aG8gY29tbWl0IGNvZGUgdG8gdGhlIHByb2plY3QgYXJlIGVuY291cmFnZWQgdG8gYWRkIHRoZWlyIG5hbWVzCi0jIGhlcmUuICBQbGVhc2Uga2VlcCB0aGUgbGlzdCBzb3J0ZWQgYnkgZmlyc3QgbmFtZXMuCi0KLUJlbm9pdCBTaWdvdXJlIDx0c3VuYUBnb29nbGUuY29tPgotQm9nZGFuIFBpbG9jYSA8Ym9vQGdvb2dsZS5jb20+Ci1DaGFuZGxlciBDYXJydXRoIDxjaGFuZGxlcmNAZ29vZ2xlLmNvbT4KLURhdmUgTWFjTGFjaGxhbiA8ZG1hY2xhY2hAZ21haWwuY29tPgotRGF2aWQgQW5kZXJzb24gPGRhbmRlcnNvbkBnb29nbGUuY29tPgotRGVhbiBTdHVydGV2YW50Ci1HZW5lIFZvbG92aWNoIDxndkBjaXRlLmNvbT4KLUhhbCBCdXJjaCA8Z21vY2tAaGJ1cmNoLmNvbT4KLUplZmZyZXkgWWFzc2tpbiA8anlhc3NraW5AZ29vZ2xlLmNvbT4KLUppbSBLZWxsZXIgPGppbWtlbGxlckBnb29nbGUuY29tPgotSm9lIFdhbG5lcyA8am9lQHRydWVtZXNoLmNvbT4KLUpvbiBXcmF5IDxqd3JheUBnb29nbGUuY29tPgotS2VpciBNaWVybGUgPG1pZXJsZUBnbWFpbC5jb20+Ci1LZWl0aCBSYXkgPGtlaXRoLnJheUBnbWFpbC5jb20+Ci1Lb3N0eWEgU2VyZWJyeWFueSA8a2NjQGdvb2dsZS5jb20+Ci1MZXYgTWFraGxpcwotTWFudWVsIEtsaW1layA8a2xpbWVrQGdvb2dsZS5jb20+Ci1NYXJpbyBUYW5ldiA8cmFkaXhAZ29vZ2xlLmNvbT4KLU1hcmsgUGFza2luCi1NYXJrdXMgSGV1bGUgPG1hcmt1cy5oZXVsZUBnbWFpbC5jb20+Ci1NYXR0aGV3IFNpbW1vbnMgPHNpbW1vbm10QGFjbS5vcmc+Ci1NaWtlIEJsYW5kIDxtYmxhbmRAZ29vZ2xlLmNvbT4KLU5lYWwgTm9yd2l0eiA8bm5vcndpdHpAZ21haWwuY29tPgotTmVybWluIE96a2lyYW5hcnRsaSA8bmVybWluQGdvb2dsZS5jb20+Ci1Pd2VuIENhcmxzZW4gPG9jYXJsc2VuQGdvb2dsZS5jb20+Ci1QYW5lZW5kcmEgQmEgPHBhbmVlbmRyYUBnb29nbGUuY29tPgotUGF1bCBNZW5hZ2UgPG1lbmFnZUBnb29nbGUuY29tPgotUGlvdHIgS2FtaW5za2kgPHBpb3Rya0Bnb29nbGUuY29tPgotUnVzcyBSdWZlciA8cnVzc0BwZW50YWQuY29tPgotU3ZlcnJlIFN1bmRzZGFsIDxzdW5kc2RhbEBnbWFpbC5jb20+Ci1UYWtlc2hpIFlvc2hpbm8gPHR5b3NoaW5vQGdvb2dsZS5jb20+Ci1WYWRpbSBCZXJtYW4gPHZhZGltYkBnb29nbGUuY29tPgotVmxhZCBMb3NldiA8dmxhZGxAZ29vZ2xlLmNvbT4KLVdvbGZnYW5nIEtsaWVyIDx3a2xpZXJAZ29vZ2xlLmNvbT4KLVpoYW55b25nIFdhbiA8d2FuQGdvb2dsZS5jb20+CmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL0xJQ0VOU0UgYi90ZXN0aW5nL2dtb2NrL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDFhMTEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLWNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLWluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLWRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLWNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi10aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi1BIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi1PRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9NRVRBREFUQSBiL3Rlc3RpbmcvZ21vY2svTUVUQURBVEEKaW5kZXggMmM3MDQ1My4uOTBhMWQ0NyAxMDA2NDQKLS0tIGEvdGVzdGluZy9nbW9jay9NRVRBREFUQQorKysgYi90ZXN0aW5nL2dtb2NrL01FVEFEQVRBCkBAIC0xLDE2ICsxLDE2IEBACi1uYW1lOiAiZ21vY2siCituYW1lOiAidGVzdGluZy9nbW9jayIKIGRlc2NyaXB0aW9uOgotICAiU3VidHJlZSBhdCB0ZXN0aW5nL2dtb2NrLiIKKyAgIkNvcHkgb2YgdGVzdGluZy9nbW9jayBmcm9tIENocm9taXVtIGJyYW5jaC1oZWFkcy81NzM1IgogCiB0aGlyZF9wYXJ0eSB7CiAgIHVybCB7CiAgICAgdHlwZTogR0lUCi0gICAgdmFsdWU6ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vZXh0ZXJuYWwvZ29vZ2xlbW9jayIKKyAgICB2YWx1ZTogImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiCiAgIH0KLSAgdmVyc2lvbjogIjM4NTEzYThiYjE1NGYwYjZkMGE0MDg4ODE0ZmU5MjU1MjY5NmQ0NjUiCisgIHZlcnNpb246ICI1Y2Q2YTM0ZDA1OTQ2M2QyYmY3YzIwOTBkMTkwNGU1MjdjMzQyOGIyIgogICBsYXN0X3VwZ3JhZGVfZGF0ZSB7Ci0gICAgeWVhcjogMjAxMgotICAgIG1vbnRoOiAxMQotICAgIGRheTogMTUKKyAgICB5ZWFyOiAyMDIzCisgICAgbW9udGg6IDYKKyAgICBkYXk6IDE2CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svTWFrZWZpbGUuYW0gYi90ZXN0aW5nL2dtb2NrL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ0NTg4Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotIyBBdXRvbWFrZSBmaWxlCi0KLSMgTm9uc3RhbmRhcmQgcGFja2FnZSBmaWxlcyBmb3IgZGlzdHJpYnV0aW9uLgotRVhUUkFfRElTVCA9IExJQ0VOU0UKLQotIyBXZSBtYXkgbmVlZCB0byBidWlsZCBvdXIgaW50ZXJuYWxseSBwYWNrYWdlZCBndGVzdC4gSWYgc28sIGl0IHdpbGwgYmUKLSMgaW5jbHVkZWQgaW4gdGhlICdzdWJkaXJzJyB2YXJpYWJsZS4KLVNVQkRJUlMgPSAkKHN1YmRpcnMpCi0KLSMgVGhpcyBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNvIGNsZWFuIGl0IGZvciBkaXN0cmlidXRpb24uCi1ESVNUQ0xFQU5GSUxFUyA9IHNjcmlwdHMvZ21vY2stY29uZmlnCi0KLSMgV2UgZGVmaW5lIHRoZSBnbG9iYWwgQU1fQ1BQRkxBR1MgYXMgZXZlcnl0aGluZyB3ZSBjb21waWxlIGluY2x1ZGVzIGZyb20gdGhlc2UKLSMgZGlyZWN0b3JpZXMuCi1BTV9DUFBGTEFHUyA9ICQoR1RFU1RfQ1BQRkxBR1MpIC1JJChzcmNkaXIpL2luY2x1ZGUKLQotIyBNb2RpZmllcyBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGZvciBwdGhyZWFkcyBjb21wYXRpYmlsaXR5LgotaWYgSEFWRV9QVEhSRUFEUwotICBBTV9DWFhGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AgLURHVEVTVF9IQVNfUFRIUkVBRD0xCi0gIEFNX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAotZW5kaWYKLQotIyBCdWlsZCBydWxlcyBmb3IgbGlicmFyaWVzLgotbGliX0xUTElCUkFSSUVTID0gbGliL2xpYmdtb2NrLmxhIGxpYi9saWJnbW9ja19tYWluLmxhCi0KLWxpYl9saWJnbW9ja19sYV9TT1VSQ0VTID0gc3JjL2dtb2NrLWFsbC5jYwotCi1wa2dpbmNsdWRlX0hFQURFUlMgPSBcCi0gIGluY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oIFwKLSAgaW5jbHVkZS9nbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmggXAotICBpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmggXAotICBpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmggXAotICBpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIFwKLSAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaCBcCi0gIGluY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaCBcCi0gIGluY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1hY3Rpb25zLmggXAotICBpbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtbWF0Y2hlcnMuaCBcCi0gIGluY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIFwKLSAgaW5jbHVkZS9nbW9jay9nbW9jay5oCi0KLXBrZ2luY2x1ZGVfaW50ZXJuYWxkaXIgPSAkKHBrZ2luY2x1ZGVkaXIpL2ludGVybmFsCi1wa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMgPSBcCi0gIGluY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmggXAotICBpbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmggXAotICBpbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaAotCi1saWJfbGliZ21vY2tfbWFpbl9sYV9TT1VSQ0VTID0gc3JjL2dtb2NrX21haW4uY2MKLWxpYl9saWJnbW9ja19tYWluX2xhX0xJQkFERCA9IGxpYi9saWJnbW9jay5sYQotCi0jIEJ1aWxkIHJ1bGVzIGZvciB0ZXN0cy4gQXV0b21ha2UncyBuYW1pbmcgZm9yIHNvbWUgb2YgdGhlc2UgdmFyaWFibGVzIGlzbid0Ci0jIHRlcnJpYmx5IG9idmlvdXMsIHNvIHRoaXMgaXMgYSBicmllZiByZWZlcmVuY2U6Ci0jCi0jIFRFU1RTIC0tIFByb2dyYW1zIHJ1biBhdXRvbWF0aWNhbGx5IGJ5ICJtYWtlIGNoZWNrIgotIyBjaGVja19QUk9HUkFNUyAtLSBQcm9ncmFtcyBidWlsdCBieSAibWFrZSBjaGVjayIgYnV0IG5vdCBuZWNlc3NhcmlseSBydW4KLQotVEVTVFM9Ci1jaGVja19QUk9HUkFNUz0KLUFNX0xERkxBR1MgPSAkKEdURVNUX0xERkxBR1MpCi0KLSMgVGhpcyBleGVyY2lzZXMgYWxsIG1ham9yIGNvbXBvbmVudHMgb2YgR29vZ2xlIE1vY2suICBJdCBhbHNvCi0jIHZlcmlmaWVzIHRoYXQgbGliZ21vY2sgd29ya3MuCi1URVNUUyArPSB0ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdAotY2hlY2tfUFJPR1JBTVMgKz0gdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QKLXRlc3RfZ21vY2tfc3BlY19idWlsZGVyc190ZXN0X1NPVVJDRVMgPSB0ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYwotdGVzdF9nbW9ja19zcGVjX2J1aWxkZXJzX3Rlc3RfTERBREQgPSAkKEdURVNUX0xJQlMpIGxpYi9saWJnbW9jay5sYQotCi0jIFRoaXMgdGVzdHMgdXNpbmcgR29vZ2xlIE1vY2sgaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMuICBJdCBhbHNvCi0jIHZlcmlmaWVzIHRoYXQgbGliZ21vY2tfbWFpbiBhbmQgbGliZ21vY2sgd29yay4KLVRFU1RTICs9IHRlc3QvZ21vY2tfbGlua190ZXN0Ci1jaGVja19QUk9HUkFNUyArPSB0ZXN0L2dtb2NrX2xpbmtfdGVzdAotdGVzdF9nbW9ja19saW5rX3Rlc3RfU09VUkNFUyA9IFwKLSAgdGVzdC9nbW9ja19saW5rMl90ZXN0LmNjIFwKLSAgdGVzdC9nbW9ja19saW5rX3Rlc3QuY2MgXAotICB0ZXN0L2dtb2NrX2xpbmtfdGVzdC5oCi10ZXN0X2dtb2NrX2xpbmtfdGVzdF9MREFERCA9ICQoR1RFU1RfTElCUykgbGliL2xpYmdtb2NrX21haW4ubGEgIGxpYi9saWJnbW9jay5sYQotCi1pZiBIQVZFX1BZVEhPTgotICAjIFRlc3RzIHRoYXQgZnVzZWQgZ21vY2sgZmlsZXMgY29tcGlsZSBhbmQgd29yay4KLSAgVEVTVFMgKz0gdGVzdC9nbW9ja19mdXNlZF90ZXN0Ci0gIGNoZWNrX1BST0dSQU1TICs9IHRlc3QvZ21vY2tfZnVzZWRfdGVzdAotICB0ZXN0X2dtb2NrX2Z1c2VkX3Rlc3RfU09VUkNFUyA9IFwKLSAgICBmdXNlZC1zcmMvZ21vY2stZ3Rlc3QtYWxsLmNjIFwKLSAgICBmdXNlZC1zcmMvZ21vY2svZ21vY2suaCBcCi0gICAgZnVzZWQtc3JjL2dtb2NrX21haW4uY2MgXAotICAgIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdC5oIFwKLSAgICB0ZXN0L2dtb2NrX3Rlc3QuY2MKLSAgdGVzdF9nbW9ja19mdXNlZF90ZXN0X0NQUEZMQUdTID0gLUkiJChzcmNkaXIpL2Z1c2VkLXNyYyIKLWVuZGlmCi0KLSMgR29vZ2xlIE1vY2sgc291cmNlIGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZSBkaXJlY3RseS4KLUdNT0NLX1NPVVJDRV9JTkdMVURFUyA9IFwKLSAgc3JjL2dtb2NrLWNhcmRpbmFsaXRpZXMuY2MgXAotICBzcmMvZ21vY2staW50ZXJuYWwtdXRpbHMuY2MgXAotICBzcmMvZ21vY2stbWF0Y2hlcnMuY2MgXAotICBzcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYyBcCi0gIHNyYy9nbW9jay5jYwotCi1FWFRSQV9ESVNUICs9ICQoR01PQ0tfU09VUkNFX0lOR0xVREVTKQotCi0jIEMrKyB0ZXN0cyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgdXNpbmcgYXV0b3Rvb2xzLgotRVhUUkFfRElTVCArPSBcCi0gIHRlc3QvZ21vY2stYWN0aW9uc190ZXN0LmNjIFwKLSAgdGVzdC9nbW9ja19hbGxfdGVzdC5jYyBcCi0gIHRlc3QvZ21vY2stY2FyZGluYWxpdGllc190ZXN0LmNjIFwKLSAgdGVzdC9nbW9ja19leF90ZXN0LmNjIFwKLSAgdGVzdC9nbW9jay1nZW5lcmF0ZWQtYWN0aW9uc190ZXN0LmNjIFwKLSAgdGVzdC9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vyc190ZXN0LmNjIFwKLSAgdGVzdC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHNfdGVzdC5jYyBcCi0gIHRlc3QvZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzX3Rlc3QuY2MgXAotICB0ZXN0L2dtb2NrLWludGVybmFsLXV0aWxzX3Rlc3QuY2MgXAotICB0ZXN0L2dtb2NrLW1hdGNoZXJzX3Rlc3QuY2MgXAotICB0ZXN0L2dtb2NrLW1vcmUtYWN0aW9uc190ZXN0LmNjIFwKLSAgdGVzdC9nbW9jay1uaWNlLXN0cmljdF90ZXN0LmNjIFwKLSAgdGVzdC9nbW9jay1wb3J0X3Rlc3QuY2MgXAotICB0ZXN0L2dtb2NrX3N0cmVzc190ZXN0LmNjCi0KLSMgUHl0aG9uIHRlc3RzLCB3aGljaCB3ZSBkb24ndCBydW4gdXNpbmcgYXV0b3Rvb2xzLgotRVhUUkFfRElTVCArPSBcCi0gIHRlc3QvZ21vY2tfbGVha190ZXN0LnB5IFwKLSAgdGVzdC9nbW9ja19sZWFrX3Rlc3RfLmNjIFwKLSAgdGVzdC9nbW9ja19vdXRwdXRfdGVzdC5weSBcCi0gIHRlc3QvZ21vY2tfb3V0cHV0X3Rlc3RfLmNjIFwKLSAgdGVzdC9nbW9ja19vdXRwdXRfdGVzdF9nb2xkZW4udHh0IFwKLSAgdGVzdC9nbW9ja190ZXN0X3V0aWxzLnB5Ci0KLSMgTm9uc3RhbmRhcmQgcGFja2FnZSBmaWxlcyBmb3IgZGlzdHJpYnV0aW9uLgotRVhUUkFfRElTVCArPSBcCi0gIENIQU5HRVMgXAotICBDT05UUklCVVRPUlMgXAotICBtYWtlL01ha2VmaWxlCi0KLSMgUHVtcCBzY3JpcHRzIGZvciBnZW5lcmF0aW5nIEdvb2dsZSBNb2NrIGhlYWRlcnMuCi0jIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBhdXRvbWF0ZSB0aGUgZ2VuZXJhdGlvbiBvZiAqLmggZnJvbSAqLmgucHVtcC4KLUVYVFJBX0RJU1QgKz0gXAotICBpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcCBcCi0gIGluY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC5wdW1wIFwKLSAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wIFwKLSAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wIFwKLSAgaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wCi0KLSMgU2NyaXB0IGZvciBmdXNpbmcgR29vZ2xlIE1vY2sgYW5kIEdvb2dsZSBUZXN0IHNvdXJjZSBmaWxlcy4KLUVYVFJBX0RJU1QgKz0gc2NyaXB0cy9mdXNlX2dtb2NrX2ZpbGVzLnB5Ci0KLSMgVGhlIEdvb2dsZSBNb2NrIEdlbmVyYXRvciB0b29sIGZyb20gdGhlIGNwcGNsZWFuIHByb2plY3QuCi1FWFRSQV9ESVNUICs9IFwKLSAgc2NyaXB0cy9nZW5lcmF0b3IvTElDRU5TRSBcCi0gIHNjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRSBcCi0gIHNjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRS5jcHBjbGVhbiBcCi0gIHNjcmlwdHMvZ2VuZXJhdG9yL2NwcC9fX2luaXRfXy5weSBcCi0gIHNjcmlwdHMvZ2VuZXJhdG9yL2NwcC9hc3QucHkgXAotICBzY3JpcHRzL2dlbmVyYXRvci9jcHAvZ21vY2tfY2xhc3MucHkgXAotICBzY3JpcHRzL2dlbmVyYXRvci9jcHAva2V5d29yZHMucHkgXAotICBzY3JpcHRzL2dlbmVyYXRvci9jcHAvdG9rZW5pemUucHkgXAotICBzY3JpcHRzL2dlbmVyYXRvci9jcHAvdXRpbHMucHkgXAotICBzY3JpcHRzL2dlbmVyYXRvci9nbW9ja19nZW4ucHkKLQotIyBTY3JpcHQgZm9yIGRpYWdub3NpbmcgY29tcGlsZXIgZXJyb3JzIGluIHByb2dyYW1zIHRoYXQgdXNlIEdvb2dsZQotIyBNb2NrLgotRVhUUkFfRElTVCArPSBzY3JpcHRzL2dtb2NrX2RvY3Rvci5weQotCi0jIENNYWtlIHNjcmlwdHMuCi1FWFRSQV9ESVNUICs9IFwKLSAgQ01ha2VMaXN0cy50eHQKLQotIyBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDA1IHByb2plY3RzLgotRVhUUkFfRElTVCArPSBcCi0gIG1zdmMvMjAwNS9nbW9jay5zbG4gXAotICBtc3ZjLzIwMDUvZ21vY2sudmNwcm9qIFwKLSAgbXN2Yy8yMDA1L2dtb2NrX2NvbmZpZy52c3Byb3BzIFwKLSAgbXN2Yy8yMDA1L2dtb2NrX21haW4udmNwcm9qIFwKLSAgbXN2Yy8yMDA1L2dtb2NrX3Rlc3QudmNwcm9qCi0KLSMgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0cy4KLUVYVFJBX0RJU1QgKz0gXAotICBtc3ZjLzIwMTAvZ21vY2suc2xuIFwKLSAgbXN2Yy8yMDEwL2dtb2NrLnZjeHByb2ogXAotICBtc3ZjLzIwMTAvZ21vY2tfY29uZmlnLnByb3BzIFwKLSAgbXN2Yy8yMDEwL2dtb2NrX21haW4udmN4cHJvaiBcCi0gIG1zdmMvMjAxMC9nbW9ja190ZXN0LnZjeHByb2oKLQotaWYgSEFWRV9QWVRIT04KLSMgZ21vY2tfdGVzdC5jYyBkb2VzIG5vdCByZWFsbHkgZGVwZW5kIG9uIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUKLSMgZnVzZWQtZ21vY2staW50ZXJuYWwgcnVsZS4gIEhvd2V2ZXIsIGdtb2NrX3Rlc3QubyBkb2VzLCBhbmQgaXQgaXMKLSMgaW1wb3J0YW50IHRvIGluY2x1ZGUgdGVzdC9nbW9ja190ZXN0LmNjIGFzIHBhcnQgb2YgdGhpcyBydWxlIGluIG9yZGVyIHRvCi0jIHByZXZlbnQgY29tcGlsaW5nIGdtb2NrX3Rlc3QubyB1bnRpbCBhbGwgZGVwZW5kZW50IGZpbGVzIGhhdmUgYmVlbgotIyBnZW5lcmF0ZWQuCi0kKHRlc3RfZ21vY2tfZnVzZWRfdGVzdF9TT1VSQ0VTKTogZnVzZWQtZ21vY2staW50ZXJuYWwKLQotIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBGaW5kIGEgd2F5IHRvIGFkZCBHb29nbGUgVGVzdHMncyBzb3VyY2VzIGhlcmUuCi1mdXNlZC1nbW9jay1pbnRlcm5hbDogJChwa2dpbmNsdWRlX0hFQURFUlMpICQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgJChsaWJfbGliZ21vY2tfbGFfU09VUkNFUykgJChHTU9DS19TT1VSQ0VfSU5HTFVERVMpIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKGxpYl9saWJnbW9ja19tYWluX2xhX1NPVVJDRVMpIFwKLSAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzL2Z1c2VfZ21vY2tfZmlsZXMucHkKLQlta2RpciAtcCAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKLQljaG1vZCAtUiB1K3cgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCi0Jcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCIKLQlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9nbW9jay9nbW9jay5oIgotCXJtIC1mICIkKHNyY2RpcikvZnVzZWQtc3JjL2dtb2NrLWd0ZXN0LWFsbC5jYyIKLQkiJChzcmNkaXIpL3NjcmlwdHMvZnVzZV9nbW9ja19maWxlcy5weSIgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCi0JY3AgLWYgIiQoc3JjZGlyKS9zcmMvZ21vY2tfbWFpbi5jYyIgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCi0KLW1haW50YWluZXItY2xlYW4tbG9jYWw6Ci0Jcm0gLXJmICIkKHNyY2RpcikvZnVzZWQtc3JjIgotZW5kaWYKLQotIyBEZWF0aCB0ZXN0cyBtYXkgcHJvZHVjZSBjb3JlIGR1bXBzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIEluIGNhc2UKLSMgdGhpcyBoYXBwZW5zLCBjbGVhbiB0aGVtIHRvIGtlZXAgZGlzdGNsZWFuY2hlY2sgaGFwcHkuCi1DTEVBTkZJTEVTID0gY29yZQotCi0jIERpc2FibGVzICdtYWtlIGluc3RhbGwnIGFzIGluc3RhbGxpbmcgYSBjb21waWxlZCB2ZXJzaW9uIG9mIEdvb2dsZQotIyBNb2NrIGNhbiBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBkdWUgdG8gdmlvbGF0aW9uIG9mIHRoZQotIyBPbmUtRGVmaW5pdGlvbiBSdWxlLgotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6Ci0JZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBNb2NrIGludG8geW91ciBidWlsZCBzeXN0ZW0uIgotCWZhbHNlCi0KLWluc3RhbGwtZGF0YS1sb2NhbDoKLQllY2hvICInbWFrZSBpbnN0YWxsJyBpcyBkYW5nZXJvdXMgYW5kIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIHNlZSBSRUFETUUgZm9yIGhvdyB0byBpbnRlZ3JhdGUgR29vZ2xlIE1vY2sgaW50byB5b3VyIGJ1aWxkIHN5c3RlbS4iCi0JZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svT1dORVJTIGIvdGVzdGluZy9nbW9jay9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3YmVjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvZ21vY2svT1dORVJTCkBAIC0wLDAgKzEsMyBAQAordGhha2lzQGNocm9taXVtLm9yZworYXN1bGx5QGNocm9taXVtLm9yZworYXl1aUBjaHJvbWl1bS5vcmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svUkVBRE1FIGIvdGVzdGluZy9nbW9jay9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjkxMjMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yawotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1odHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay8KLQotT3ZlcnZpZXcKLS0tLS0tLS0tCi0KLUdvb2dsZSdzIGZyYW1ld29yayBmb3Igd3JpdGluZyBhbmQgdXNpbmcgQysrIG1vY2sgY2xhc3NlcyBvbiBhIHZhcmlldHkKLW9mIHBsYXRmb3JtcyAoTGludXgsIE1hYyBPUyBYLCBXaW5kb3dzLCBXaW5kb3dzIENFLCBTeW1iaWFuLCBldGMpLgotSW5zcGlyZWQgYnkgak1vY2ssIEVhc3lNb2NrLCBhbmQgSGFtY3Jlc3QsIGFuZCBkZXNpZ25lZCB3aXRoIEMrKydzCi1zcGVjaWZpY3MgaW4gbWluZCwgaXQgY2FuIGhlbHAgeW91IGRlcml2ZSBiZXR0ZXIgZGVzaWducyBvZiB5b3VyCi1zeXN0ZW0gYW5kIHdyaXRlIGJldHRlciB0ZXN0cy4KLQotR29vZ2xlIE1vY2s6Ci0KLS0gcHJvdmlkZXMgYSBkZWNsYXJhdGl2ZSBzeW50YXggZm9yIGRlZmluaW5nIG1vY2tzLAotLSBjYW4gZWFzaWx5IGRlZmluZSBwYXJ0aWFsIChoeWJyaWQpIG1vY2tzLCB3aGljaCBhcmUgYSBjcm9zcyBvZiByZWFsCi0gIGFuZCBtb2NrIG9iamVjdHMsCi0tIGhhbmRsZXMgZnVuY3Rpb25zIG9mIGFyYml0cmFyeSB0eXBlcyBhbmQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMsCi0tIGNvbWVzIHdpdGggYSByaWNoIHNldCBvZiBtYXRjaGVycyBmb3IgdmFsaWRhdGluZyBmdW5jdGlvbiBhcmd1bWVudHMsCi0tIHVzZXMgYW4gaW50dWl0aXZlIHN5bnRheCBmb3IgY29udHJvbGxpbmcgdGhlIGJlaGF2aW9yIG9mIGEgbW9jaywKLS0gZG9lcyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uIG9mIGV4cGVjdGF0aW9ucyAobm8gcmVjb3JkLWFuZC1yZXBsYXkKLSAgbmVlZGVkKSwKLS0gYWxsb3dzIGFyYml0cmFyeSAocGFydGlhbCkgb3JkZXJpbmcgY29uc3RyYWludHMgb24KLSAgZnVuY3Rpb24gY2FsbHMgdG8gYmUgZXhwcmVzc2VkLAotLSBsZXRzIGEgdXNlciBleHRlbmQgaXQgYnkgZGVmaW5pbmcgbmV3IG1hdGNoZXJzIGFuZCBhY3Rpb25zLgotLSBkb2VzIG5vdCB1c2UgZXhjZXB0aW9ucywgYW5kCi0tIGlzIGVhc3kgdG8gbGVhcm4gYW5kIHVzZS4KLQotUGxlYXNlIHNlZSB0aGUgcHJvamVjdCBwYWdlIGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgdGhlCi1tYWlsaW5nIGxpc3QgZm9yIHF1ZXN0aW9ucywgZGlzY3Vzc2lvbnMsIGFuZCBkZXZlbG9wbWVudC4gIFRoZXJlIGlzCi1hbHNvIGFuIElSQyBjaGFubmVsIG9uIE9GVEMgKGlyYy5vZnRjLm5ldCkgI2d0ZXN0IGF2YWlsYWJsZS4gIFBsZWFzZQotam9pbiB1cyEKLQotUGxlYXNlIG5vdGUgdGhhdCBjb2RlIHVuZGVyIHNjcmlwdHMvZ2VuZXJhdG9yLyBpcyBmcm9tIHRoZSBjcHBjbGVhbgotcHJvamVjdCAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLykgYW5kIHVuZGVyIHRoZSBBcGFjaGUKLUxpY2Vuc2UsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIEdvb2dsZSBNb2NrJ3MgbGljZW5zZS4KLQotUmVxdWlyZW1lbnRzIGZvciBFbmQgVXNlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdvb2dsZSBNb2NrIGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgR29vZ2xlIFRlc3QgQysrIHRlc3RpbmcKLWZyYW1ld29yayAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvKSwgYW5kIGluY2x1ZGVzIHRoZQotbGF0dGVyIGFzIHBhcnQgb2YgdGhlIFNWTiByZXBvc2l0b3J5IGFuZCBkaXN0cmlidXRpb24gcGFja2FnZS4gIFlvdQotbXVzdCB1c2UgdGhlIGJ1bmRsZWQgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCB3aGVuIHVzaW5nIEdvb2dsZSBNb2NrLCBvcgoteW91IG1heSBnZXQgY29tcGlsZXIvbGlua2VyIGVycm9ycy4KLQotWW91IGNhbiBhbHNvIGVhc2lseSBjb25maWd1cmUgR29vZ2xlIE1vY2sgdG8gd29yayB3aXRoIGFub3RoZXIgdGVzdGluZwotZnJhbWV3b3JrIG9mIHlvdXIgY2hvaWNlOyBhbHRob3VnaCBpdCB3aWxsIHN0aWxsIG5lZWQgR29vZ2xlIFRlc3QgYXMKLWFuIGludGVybmFsIGRlcGVuZGVuY3kuICBQbGVhc2UgcmVhZAotaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Gb3JEdW1taWVzI1VzaW5nX0dvb2dsZV9Nb2NrX3dpdGhfQW55X1Rlc3RpbmdfRnJhbWV3b3JrCi1mb3IgaG93IHRvIGRvIGl0LgotCi1Hb29nbGUgTW9jayBkZXBlbmRzIG9uIGFkdmFuY2VkIEMrKyBmZWF0dXJlcyBhbmQgdGh1cyByZXF1aXJlcyBhIG1vcmUKLW1vZGVybiBjb21waWxlci4gIFRoZSBmb2xsb3dpbmcgYXJlIG5lZWRlZCB0byB1c2UgR29vZ2xlIE1vY2s6Ci0KLSMjIyBMaW51eCBSZXF1aXJlbWVudHMgIyMjCi0KLVRoZXNlIGFyZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgdG8gYnVpbGQgYW5kIHVzZSBHb29nbGUgTW9jayBmcm9tIGEgc291cmNlCi1wYWNrYWdlIChhcyBkZXNjcmliZWQgYmVsb3cpOgotCi0gICogR05VLWNvbXBhdGlibGUgTWFrZSBvciAiZ21ha2UiCi0gICogUE9TSVgtc3RhbmRhcmQgc2hlbGwKLSAgKiBQT1NJWCgtMikgUmVndWxhciBFeHByZXNzaW9ucyAocmVnZXguaCkKLSAgKiBDKys5OC1zdGFuZGFyZC1jb21wbGlhbnQgY29tcGlsZXIgKGUuZy4gR0NDIDMuNCBvciBuZXdlcikKLQotIyMjIFdpbmRvd3MgUmVxdWlyZW1lbnRzICMjIwotCi0gICogTWljcm9zb2Z0IFZpc3VhbCBDKysgOC4wIFNQMSBvciBuZXdlcgotCi0jIyMgTWFjIE9TIFggUmVxdWlyZW1lbnRzICMjIwotCi0gICogTWFjIE9TIFggMTAuNCBUaWdlciBvciBuZXdlcgotICAqIERldmVsb3BlciBUb29scyBJbnN0YWxsZWQKLQotUmVxdWlyZW1lbnRzIGZvciBDb250cmlidXRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdlIHdlbGNvbWUgcGF0Y2hlcy4gIElmIHlvdSBwbGFuIHRvIGNvbnRyaWJ1dGUgYSBwYXRjaCwgeW91IG5lZWQgdG8KLWJ1aWxkIEdvb2dsZSBNb2NrIGFuZCBpdHMgb3duIHRlc3RzIGZyb20gYW4gU1ZOIGNoZWNrb3V0IChkZXNjcmliZWQKLWJlbG93KSwgd2hpY2ggaGFzIGZ1cnRoZXIgcmVxdWlyZW1lbnRzOgotCi0gICogQXV0b21ha2UgdmVyc2lvbiAxLjkgb3IgbmV3ZXIKLSAgKiBBdXRvY29uZiB2ZXJzaW9uIDIuNTkgb3IgbmV3ZXIKLSAgKiBMaWJ0b29sIC8gTGlidG9vbGl6ZQotICAqIFB5dGhvbiB2ZXJzaW9uIDIuMyBvciBuZXdlciAoZm9yIHJ1bm5pbmcgc29tZSBvZiB0aGUgdGVzdHMgYW5kCi0gICAgcmUtZ2VuZXJhdGluZyBjZXJ0YWluIHNvdXJjZSBmaWxlcyBmcm9tIHRlbXBsYXRlcykKLQotR2V0dGluZyB0aGUgU291cmNlCi0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlcmUgYXJlIHR3byBwcmltYXJ5IHdheXMgb2YgZ2V0dGluZyBHb29nbGUgTW9jaydzIHNvdXJjZSBjb2RlOiB5b3UKLWNhbiBkb3dubG9hZCBhIHN0YWJsZSBzb3VyY2UgcmVsZWFzZSBpbiB5b3VyIHByZWZlcnJlZCBhcmNoaXZlIGZvcm1hdCwKLW9yIGRpcmVjdGx5IGNoZWNrIG91dCB0aGUgc291cmNlIGZyb20gb3VyIFN1YnZlcnNpb24gKFNWTikgcmVwb3NpdG9yeS4KLVRoZSBTVk4gY2hlY2tvdXQgcmVxdWlyZXMgYSBmZXcgZXh0cmEgc3RlcHMgYW5kIHNvbWUgZXh0cmEgc29mdHdhcmUKLXBhY2thZ2VzIG9uIHlvdXIgc3lzdGVtLCBidXQgbGV0cyB5b3UgdHJhY2sgZGV2ZWxvcG1lbnQgYW5kIG1ha2UKLXBhdGNoZXMgbXVjaCBtb3JlIGVhc2lseSwgc28gd2UgaGlnaGx5IGVuY291cmFnZSBpdC4KLQotIyMjIFNvdXJjZSBQYWNrYWdlICMjIwotCi1Hb29nbGUgTW9jayBpcyByZWxlYXNlZCBpbiB2ZXJzaW9uZWQgc291cmNlIHBhY2thZ2VzIHdoaWNoIGNhbiBiZQotZG93bmxvYWRlZCBmcm9tIHRoZSBkb3dubG9hZCBwYWdlIFsxXS4gIFNldmVyYWwgZGlmZmVyZW50IGFyY2hpdmUKLWZvcm1hdHMgYXJlIHByb3ZpZGVkLCBidXQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgdG9vbHMgbmVlZGVkIHRvCi1leHRyYWN0IHRoZWlyIGNvbnRlbnRzLCBhbmQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBmaWxlLiAgRG93bmxvYWQKLXdoaWNoZXZlciB5b3UgYXJlIG1vc3QgY29tZm9ydGFibGUgd2l0aC4KLQotICBbMV0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svZG93bmxvYWRzL2xpc3QKLQotT25jZSBkb3dubG9hZGVkIGV4cGFuZCB0aGUgYXJjaGl2ZSB1c2luZyB3aGljaGV2ZXIgdG9vbHMgeW91IHByZWZlcgotZm9yIHRoYXQgdHlwZS4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0IGluIGEgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZQotbmFtZSAiZ21vY2stWC5ZLloiIHdoaWNoIGNvbnRhaW5zIGFsbCBvZiB0aGUgc291cmNlIGNvZGUuICBIZXJlIGFyZQotc29tZSBleGFtcGxlcyBvbiBMaW51eDoKLQotICB0YXIgLXh2emYgZ21vY2stWC5ZLloudGFyLmd6Ci0gIHRhciAteHZqZiBnbW9jay1YLlkuWi50YXIuYnoyCi0gIHVuemlwIGdtb2NrLVguWS5aLnppcAotCi0jIyMgU1ZOIENoZWNrb3V0ICMjIwotCi1UbyBjaGVjayBvdXQgdGhlIG1haW4gYnJhbmNoIChhbHNvIGtub3duIGFzIHRoZSAidHJ1bmsiKSBvZiBHb29nbGUKLU1vY2ssIHJ1biB0aGUgZm9sbG93aW5nIFN1YnZlcnNpb24gY29tbWFuZDoKLQotICBzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZW1vY2suZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBnbW9jay1zdm4KLQotSWYgeW91IGFyZSB1c2luZyBhICpuaXggc3lzdGVtIGFuZCBwbGFuIHRvIHVzZSB0aGUgR05VIEF1dG90b29scyBidWlsZAotc3lzdGVtIHRvIGJ1aWxkIEdvb2dsZSBNb2NrIChkZXNjcmliZWQgYmVsb3cpLCB5b3UnbGwgbmVlZCB0bwotY29uZmlndXJlIGl0IG5vdy4gIE90aGVyd2lzZSB5b3UgYXJlIGRvbmUgd2l0aCBnZXR0aW5nIHRoZSBzb3VyY2UKLWZpbGVzLgotCi1UbyBwcmVwYXJlIHRoZSBBdXRvdG9vbHMgYnVpbGQgc3lzdGVtLCBlbnRlciB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBvZgotdGhlIGNoZWNrb3V0IGNvbW1hbmQgeW91IHVzZWQgKCdnbW9jay1zdm4nKSBhbmQgcHJvY2VlZCB3aXRoIHRoZQotZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLSAgYXV0b3JlY29uZiAtZnZpCi0KLU9uY2UgeW91IGhhdmUgY29tcGxldGVkIHRoaXMgc3RlcCwgeW91IGFyZSByZWFkeSB0byBidWlsZCB0aGUgbGlicmFyeS4KLU5vdGUgdGhhdCB5b3Ugc2hvdWxkIG9ubHkgbmVlZCB0byBjb21wbGV0ZSB0aGlzIHN0ZXAgb25jZS4gIFRoZQotc3Vic2VxdWVudCAnbWFrZScgaW52b2NhdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLWdlbmVyYXRlIHRoZSBiaXRzCi1vZiB0aGUgYnVpbGQgc3lzdGVtIHRoYXQgbmVlZCB0byBiZSBjaGFuZ2VkLgotCi1JZiB5b3VyIHN5c3RlbSB1c2VzIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBhdXRvdG9vbHMsIHRoZSBhYm92ZSBjb21tYW5kCi13aWxsIGZhaWwuICBZb3UgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGEgdmVyc2lvbiB0byB1c2UuICBGb3IKLWluc3RhbmNlLCBpZiB5b3UgaGF2ZSBib3RoIEdOVSBBdXRvbWFrZSAxLjQgYW5kIDEuOSBpbnN0YWxsZWQgYW5kCi0nYXV0b21ha2UnIHdvdWxkIGludm9rZSB0aGUgMS40LCB1c2UgaW5zdGVhZDoKLQotICBBVVRPTUFLRT1hdXRvbWFrZS0xLjkgQUNMT0NBTD1hY2xvY2FsLTEuOSBhdXRvcmVjb25mIC1mdmkKLQotTWFrZSBzdXJlIHlvdSdyZSB1c2luZyB0aGUgc2FtZSB2ZXJzaW9uIG9mIGF1dG9tYWtlIGFuZCBhY2xvY2FsLgotCi1TZXR0aW5nIHVwIHRoZSBCdWlsZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gYnVpbGQgR29vZ2xlIE1vY2sgYW5kIHlvdXIgdGVzdHMgdGhhdCB1c2UgaXQsIHlvdSBuZWVkIHRvIHRlbGwgeW91cgotYnVpbGQgc3lzdGVtIHdoZXJlIHRvIGZpbmQgaXRzIGhlYWRlcnMgYW5kIHNvdXJjZSBmaWxlcy4gIFRoZSBleGFjdAotd2F5IHRvIGRvIGl0IGRlcGVuZHMgb24gd2hpY2ggYnVpbGQgc3lzdGVtIHlvdSB1c2UsIGFuZCBpcyB1c3VhbGx5Ci1zdHJhaWdodGZvcndhcmQuCi0KLSMjIyBHZW5lcmljIEJ1aWxkIEluc3RydWN0aW9ucyAjIyMKLQotVGhpcyBzZWN0aW9uIHNob3dzIGhvdyB5b3UgY2FuIGludGVncmF0ZSBHb29nbGUgTW9jayBpbnRvIHlvdXIKLWV4aXN0aW5nIGJ1aWxkIHN5c3RlbS4KLQotU3VwcG9zZSB5b3UgcHV0IEdvb2dsZSBNb2NrIGluIGRpcmVjdG9yeSAke0dNT0NLX0RJUn0gYW5kIEdvb2dsZSBUZXN0Ci1pbiAke0dURVNUX0RJUn0gKHRoZSBsYXR0ZXIgaXMgJHtHTU9DS19ESVJ9L2d0ZXN0IGJ5IGRlZmF1bHQpLiAgVG8KLWJ1aWxkIEdvb2dsZSBNb2NrLCBjcmVhdGUgYSBsaWJyYXJ5IGJ1aWxkIHRhcmdldCAob3IgYSBwcm9qZWN0IGFzCi1jYWxsZWQgYnkgVmlzdWFsIFN0dWRpbyBhbmQgWGNvZGUpIHRvIGNvbXBpbGUKLQotICAke0dURVNUX0RJUn0vc3JjL2d0ZXN0LWFsbC5jYyBhbmQgJHtHTU9DS19ESVJ9L3NyYy9nbW9jay1hbGwuY2MKLQotd2l0aAotCi0gICR7R1RFU1RfRElSfS9pbmNsdWRlIGFuZCAke0dNT0NLX0RJUn0vaW5jbHVkZQotCi1pbiB0aGUgc3lzdGVtIGhlYWRlciBzZWFyY2ggcGF0aCwgYW5kCi0KLSAgJHtHVEVTVF9ESVJ9IGFuZCAke0dNT0NLX0RJUn0KLQotaW4gdGhlIG5vcm1hbCBoZWFkZXIgc2VhcmNoIHBhdGguICBBc3N1bWluZyBhIExpbnV4LWxpa2Ugc3lzdGVtIGFuZCBnY2MsCi1zb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHdpbGwgZG86Ci0KLSAgZysrIC1pc3lzdGVtICR7R1RFU1RfRElSfS9pbmNsdWRlIC1JJHtHVEVTVF9ESVJ9IFwKLSAgICAgIC1pc3lzdGVtICR7R01PQ0tfRElSfS9pbmNsdWRlIC1JJHtHTU9DS19ESVJ9IFwKLSAgICAgIC1wdGhyZWFkIC1jICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCi0gIGcrKyAtaXN5c3RlbSAke0dURVNUX0RJUn0vaW5jbHVkZSAtSSR7R1RFU1RfRElSfSBcCi0gICAgICAtaXN5c3RlbSAke0dNT0NLX0RJUn0vaW5jbHVkZSAtSSR7R01PQ0tfRElSfSBcCi0gICAgICAtcHRocmVhZCAtYyAke0dNT0NLX0RJUn0vc3JjL2dtb2NrLWFsbC5jYwotICBhciAtcnYgbGliZ21vY2suYSBndGVzdC1hbGwubyBnbW9jay1hbGwubwotCi0oV2UgbmVlZCAtcHRocmVhZCBhcyBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2sgdXNlIHRocmVhZHMuKQotCi1OZXh0LCB5b3Ugc2hvdWxkIGNvbXBpbGUgeW91ciB0ZXN0IHNvdXJjZSBmaWxlIHdpdGgKLSR7R1RFU1RfRElSfS9pbmNsdWRlIGFuZCAke0dNT0NLX0RJUn0vaW5jbHVkZSBpbiB0aGUgaGVhZGVyIHNlYXJjaAotcGF0aCwgYW5kIGxpbmsgaXQgd2l0aCBnbW9jayBhbmQgYW55IG90aGVyIG5lY2Vzc2FyeSBsaWJyYXJpZXM6Ci0KLSAgZysrIC1pc3lzdGVtICR7R1RFU1RfRElSfS9pbmNsdWRlIC1pc3lzdGVtICR7R01PQ0tfRElSfS9pbmNsdWRlIFwKLSAgICAgIC1wdGhyZWFkIHBhdGgvdG8veW91cl90ZXN0LmNjIGxpYmdtb2NrLmEgLW8geW91cl90ZXN0Ci0KLUFzIGFuIGV4YW1wbGUsIHRoZSBtYWtlLyBkaXJlY3RvcnkgY29udGFpbnMgYSBNYWtlZmlsZSB0aGF0IHlvdSBjYW4KLXVzZSB0byBidWlsZCBHb29nbGUgTW9jayBvbiBzeXN0ZW1zIHdoZXJlIEdOVSBtYWtlIGlzIGF2YWlsYWJsZQotKGUuZy4gTGludXgsIE1hYyBPUyBYLCBhbmQgQ3lnd2luKS4gIEl0IGRvZXNuJ3QgdHJ5IHRvIGJ1aWxkIEdvb2dsZQotTW9jaydzIG93biB0ZXN0cy4gIEluc3RlYWQsIGl0IGp1c3QgYnVpbGRzIHRoZSBHb29nbGUgTW9jayBsaWJyYXJ5IGFuZAotYSBzYW1wbGUgdGVzdC4gIFlvdSBjYW4gdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgb3duIGJ1aWxkCi1zY3JpcHQuCi0KLUlmIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBjb3JyZWN0IGZvciB5b3VyIGVudmlyb25tZW50LCB0aGUKLWZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgc3VjY2VlZDoKLQotICBjZCAke0dNT0NLX0RJUn0vbWFrZQotICBtYWtlCi0gIC4vZ21vY2tfdGVzdAotCi1JZiB5b3Ugc2VlIGVycm9ycywgdHJ5IHRvIHR3ZWFrIHRoZSBjb250ZW50cyBvZiBtYWtlL01ha2VmaWxlIHRvIG1ha2UKLXRoZW0gZ28gYXdheS4gIFRoZXJlIGFyZSBpbnN0cnVjdGlvbnMgaW4gbWFrZS9NYWtlZmlsZSBvbiBob3cgdG8gZG8KLWl0LgotCi0jIyMgV2luZG93cyAjIyMKLQotVGhlIG1zdmMvMjAwNSBkaXJlY3RvcnkgY29udGFpbnMgVkMrKyAyMDA1IHByb2plY3RzIGFuZCB0aGUgbXN2Yy8yMDEwCi1kaXJlY3RvcnkgY29udGFpbnMgVkMrKyAyMDEwIHByb2plY3RzIGZvciBidWlsZGluZyBHb29nbGUgTW9jayBhbmQKLXNlbGVjdGVkIHRlc3RzLgotCi1DaGFuZ2UgdG8gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBhbmQgcnVuICJtc2J1aWxkIGdtb2NrLnNsbiIgdG8KLWJ1aWxkIHRoZSBsaWJyYXJ5IGFuZCB0ZXN0cyAob3Igb3BlbiB0aGUgZ21vY2suc2xuIGluIHRoZSBNU1ZDIElERSkuCi1JZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gcHJvamVjdCB0byB1c2Ugd2l0aCBHb29nbGUgTW9jaywgeW91J2xsCi1oYXZlIHRvIGNvbmZpZ3VyZSBpdCB0byB1c2UgdGhlIGdtb2NrX2NvbmZpZyBwcm9wZXR5IHNoZWV0LiAgRm9yIHRoYXQ6Ci0KLSAqIE9wZW4gdGhlIFByb3BlcnR5IE1hbmFnZXIgd2luZG93IChWaWV3IHwgT3RoZXIgV2luZG93cyB8IFByb3BlcnR5IE1hbmFnZXIpCi0gKiBSaWdodC1jbGljayBvbiB5b3VyIHByb2plY3QgYW5kIHNlbGVjdCAiQWRkIEV4aXN0aW5nIFByb3BlcnR5IFNoZWV0Li4uIgotICogTmF2aWdhdGUgdG8gZ21vY2tfY29uZmlnLnZzcHJvcHMgb3IgZ21vY2tfY29uZmlnLnByb3BzIGFuZCBzZWxlY3QgaXQuCi0gKiBJbiBQcm9qZWN0IFByb3BlcnRpZXMgfCBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgfCBHZW5lcmFsIHwgQWRkaXRpb25hbAotICAgSW5jbHVkZSBEaXJlY3RvcmllcywgdHlwZSA8cGF0aCB0byBHb29nbGUgTW9jaz4vaW5jbHVkZS4KLQotVHdlYWtpbmcgR29vZ2xlIE1vY2sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdvb2dsZSBNb2NrIGNhbiBiZSB1c2VkIGluIGRpdmVyc2UgZW52aXJvbm1lbnRzLiAgVGhlIGRlZmF1bHQKLWNvbmZpZ3VyYXRpb24gbWF5IG5vdCB3b3JrIChvciBtYXkgbm90IHdvcmsgd2VsbCkgb3V0IG9mIHRoZSBib3ggaW4KLXNvbWUgZW52aXJvbm1lbnRzLiAgSG93ZXZlciwgeW91IGNhbiBlYXNpbHkgdHdlYWsgR29vZ2xlIE1vY2sgYnkKLWRlZmluaW5nIGNvbnRyb2wgbWFjcm9zIG9uIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmUuICBHZW5lcmFsbHksCi10aGVzZSBtYWNyb3MgYXJlIG5hbWVkIGxpa2UgR1RFU1RfWFlaIGFuZCB5b3UgZGVmaW5lIHRoZW0gdG8gZWl0aGVyIDEKLW9yIDAgdG8gZW5hYmxlIG9yIGRpc2FibGUgYSBjZXJ0YWluIGZlYXR1cmUuCi0KLVdlIGxpc3QgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIG1hY3JvcyBiZWxvdy4gIEZvciBhIGNvbXBsZXRlIGxpc3QsCi1zZWUgZmlsZSAke0dURVNUX0RJUn0vaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmguCi0KLSMjIyBDaG9vc2luZyBhIFRSMSBUdXBsZSBMaWJyYXJ5ICMjIwotCi1Hb29nbGUgTW9jayB1c2VzIHRoZSBDKysgVGVjaG5pY2FsIFJlcG9ydCAxIChUUjEpIHR1cGxlIGxpYnJhcnkKLWhlYXZpbHkuICBVbmZvcnR1bmF0ZWx5IFRSMSB0dXBsZSBpcyBub3QgeWV0IHdpZGVseSBhdmFpbGFibGUgd2l0aCBhbGwKLWNvbXBpbGVycy4gIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBHb29nbGUgVGVzdCAxLjQuMCsgaW1wbGVtZW50cyBhCi1zdWJzZXQgb2YgVFIxIHR1cGxlIHRoYXQncyBlbm91Z2ggZm9yIEdvb2dsZSBNb2NrJ3MgbmVlZC4gIEdvb2dsZSBNb2NrCi13aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoYXQgaW1wbGVtZW50YXRpb24gd2hlbiB0aGUgY29tcGlsZXIgZG9lc24ndAotcHJvdmlkZSBUUjEgdHVwbGUuCi0KLVVzdWFsbHkgeW91IGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB3aGljaCB0dXBsZSBsaWJyYXJ5IEdvb2dsZSBUZXN0Ci1hbmQgR29vZ2xlIE1vY2sgdXNlLiAgSG93ZXZlciwgaWYgeW91ciBwcm9qZWN0IGFscmVhZHkgdXNlcyBUUjEgdHVwbGUsCi15b3UgbmVlZCB0byB0ZWxsIEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jayB0byB1c2UgdGhlIHNhbWUgVFIxIHR1cGxlCi1saWJyYXJ5IHRoZSByZXN0IG9mIHlvdXIgcHJvamVjdCB1c2VzLCBvciB0aGUgdHdvIHR1cGxlCi1pbXBsZW1lbnRhdGlvbnMgd2lsbCBjbGFzaC4gIFRvIGRvIHRoYXQsIGFkZAotCi0gIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MAotCi10byB0aGUgY29tcGlsZXIgZmxhZ3Mgd2hpbGUgY29tcGlsaW5nIEdvb2dsZSBUZXN0LCBHb29nbGUgTW9jaywgYW5kCi15b3VyIHRlc3RzLiAgSWYgeW91IHdhbnQgdG8gZm9yY2UgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrIHRvIHVzZQotdGhlaXIgb3duIHR1cGxlIGxpYnJhcnksIGp1c3QgYWRkCi0KLSAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xCi0KLXRvIHRoZSBjb21waWxlciBmbGFncyBpbnN0ZWFkLgotCi1JZiB5b3Ugd2FudCB0byB1c2UgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB3aXRoIEdvb2dsZSBNb2NrLCBwbGVhc2UKLXJlZmVyIHRvIHRoZSBCb29zdCB3ZWJzaXRlIChodHRwOi8vd3d3LmJvb3N0Lm9yZy8pIGZvciBob3cgdG8gb2J0YWluCi1pdCBhbmQgc2V0IGl0IHVwLgotCi0jIyMgQXMgYSBTaGFyZWQgTGlicmFyeSAoRExMKSAjIyMKLQotR29vZ2xlIE1vY2sgaXMgY29tcGFjdCwgc28gbW9zdCB1c2VycyBjYW4gYnVpbGQgYW5kIGxpbmsgaXQgYXMgYSBzdGF0aWMKLWxpYnJhcnkgZm9yIHRoZSBzaW1wbGljaXR5LiAgR29vZ2xlIE1vY2sgY2FuIGJlIHVzZWQgYXMgYSBETEwsIGJ1dCB0aGUKLXNhbWUgRExMIG11c3QgY29udGFpbiBHb29nbGUgVGVzdCBhcyB3ZWxsLiAgU2VlIEdvb2dsZSBUZXN0J3MgUkVBRE1FCi1maWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHNldCB1cCBuZWNlc3NhcnkgY29tcGlsZXIgc2V0dGluZ3MuCi0KLSMjIyBUd2Vha2luZyBHb29nbGUgTW9jayAjIyMKLQotTW9zdCBvZiBHb29nbGUgVGVzdCdzIGNvbnRyb2wgbWFjcm9zIGFwcGx5IHRvIEdvb2dsZSBNb2NrIGFzIHdlbGwuCi1QbGVhc2Ugc2VlIGZpbGUgJHtHVEVTVF9ESVJ9L1JFQURNRSBmb3IgaG93IHRvIHR3ZWFrIHRoZW0uCi0KLVVwZ3JhZGluZyBmcm9tIGFuIEVhcmxpZXIgVmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdlIHN0cml2ZSB0byBrZWVwIEdvb2dsZSBNb2NrIHJlbGVhc2VzIGJhY2t3YXJkIGNvbXBhdGlibGUuCi1Tb21ldGltZXMsIHRob3VnaCwgd2UgaGF2ZSB0byBtYWtlIHNvbWUgYnJlYWtpbmcgY2hhbmdlcyBmb3IgdGhlCi11c2VycycgbG9uZy10ZXJtIGJlbmVmaXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB3aGF0IHlvdSdsbCBuZWVkIHRvCi1kbyBpZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBHb29nbGUgTW9jay4KLQotIyMjIFVwZ3JhZGluZyBmcm9tIDEuMS4wIG9yIEVhcmxpZXIgIyMjCi0KLVlvdSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0J3Mgb3duIFRSMQotdHVwbGUgbGlicmFyeS4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHNlY3Rpb24gIkNob29zaW5nIGEgVFIxIFR1cGxlCi1MaWJyYXJ5Ii4KLQotIyMjIFVwZ3JhZGluZyBmcm9tIDEuNC4wIG9yIEVhcmxpZXIgIyMjCi0KLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgcHRocmVhZCBsaWJyYXJ5IGlzIGF2YWlsYWJsZSwgR29vZ2xlIFRlc3QgYW5kCi1Hb29nbGUgTW9jayB1c2UgaXQgaW4gb3JkZXIgdG8gYmUgdGhyZWFkLXNhZmUuICBGb3IgdGhpcyB0byB3b3JrLCB5b3UKLW1heSBuZWVkIHRvIHR3ZWFrIHlvdXIgY29tcGlsZXIgYW5kL29yIGxpbmtlciBmbGFncy4gIFBsZWFzZSBzZWUgdGhlCi0iTXVsdGktdGhyZWFkZWQgVGVzdHMiIHNlY3Rpb24gaW4gZmlsZSAke0dURVNUX0RJUn0vUkVBRE1FIGZvciB3aGF0Ci15b3UgbWF5IG5lZWQgdG8gZG8uCi0KLUlmIHlvdSBoYXZlIGN1c3RvbSBtYXRjaGVycyBkZWZpbmVkIHVzaW5nIE1hdGNoZXJJbnRlcmZhY2Ugb3IKLU1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKSwgeW91J2xsIG5lZWQgdG8gdXBkYXRlIHRoZWlyIGRlZmluaXRpb25zIHRvCi11c2UgdGhlIG5ldyBtYXRjaGVyIEFQSSBbMl0uICBNYXRjaGVycyBkZWZpbmVkIHVzaW5nIE1BVENIRVIoKSBvcgotTUFUQ0hFUl9QKigpIGFyZW4ndCBhZmZlY3RlZC4KLQotICBbMl0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNXcml0aW5nX05ld19Nb25vbW9ycGhpY19NYXRjaGVycywKLSAgICAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjV3JpdGluZ19OZXdfUG9seW1vcnBoaWNfTWF0Y2hlcnMKLQotRGV2ZWxvcGluZyBHb29nbGUgTW9jawotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHNlY3Rpb24gZGlzY3Vzc2VzIGhvdyB0byBtYWtlIHlvdXIgb3duIGNoYW5nZXMgdG8gR29vZ2xlIE1vY2suCi0KLSMjIyBUZXN0aW5nIEdvb2dsZSBNb2NrIEl0c2VsZiAjIyMKLQotVG8gbWFrZSBzdXJlIHlvdXIgY2hhbmdlcyB3b3JrIGFzIGludGVuZGVkIGFuZCBkb24ndCBicmVhayBleGlzdGluZwotZnVuY3Rpb25hbGl0eSwgeW91J2xsIHdhbnQgdG8gY29tcGlsZSBhbmQgcnVuIEdvb2dsZSBUZXN0J3Mgb3duIHRlc3RzLgotRm9yIHRoYXQgeW91J2xsIG5lZWQgQXV0b3Rvb2xzLiAgRmlyc3QsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBmb2xsb3dlZAotdGhlIGluc3RydWN0aW9ucyBpbiBzZWN0aW9uICJTVk4gQ2hlY2tvdXQiIHRvIGNvbmZpZ3VyZSBHb29nbGUgTW9jay4KLVRoZW4sIGNyZWF0ZSBhIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgYW5kIGVudGVyIGl0LiAgTmV4dCwKLQotICAke0dNT0NLX0RJUn0vY29uZmlndXJlICAjIFN0YW5kYXJkIEdOVSBjb25maWd1cmUgc2NyaXB0LCAtLWhlbHAgZm9yIG1vcmUgaW5mbwotCi1PbmNlIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIEdvb2dsZSBNb2NrLCB0aGUgYnVpbGQgc3RlcHMgYXJlCi1zdGFuZGFyZCBmb3IgR05VLXN0eWxlIE9TUyBwYWNrYWdlcy4KLQotICBtYWtlICAgICAgICAjIFN0YW5kYXJkIG1ha2VmaWxlIGZvbGxvd2luZyBHTlUgY29udmVudGlvbnMKLSAgbWFrZSBjaGVjayAgIyBCdWlsZHMgYW5kIHJ1bnMgYWxsIHRlc3RzIC0gYWxsIHNob3VsZCBwYXNzLgotCi1Ob3RlIHRoYXQgd2hlbiBidWlsZGluZyB5b3VyIHByb2plY3QgYWdhaW5zdCBHb29nbGUgTW9jaywgeW91IGFyZSBidWlsZGluZwotYWdhaW5zdCBHb29nbGUgVGVzdCBhcyB3ZWxsLiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjb25maWd1cmUgR29vZ2xlIFRlc3QKLXNlcGFyYXRlbHkuCi0KLSMjIyBSZWdlbmVyYXRpbmcgU291cmNlIEZpbGVzICMjIwotCi1Tb21lIG9mIEdvb2dsZSBNb2NrJ3Mgc291cmNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZXMgKG5vdAotaW4gdGhlIEMrKyBzZW5zZSkgdXNpbmcgYSBzY3JpcHQuICBBIHRlbXBsYXRlIGZpbGUgaXMgbmFtZWQgRk9PLnB1bXAsCi13aGVyZSBGT08gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaXQgd2lsbCBnZW5lcmF0ZS4gIEZvciBleGFtcGxlLCB0aGUKLWZpbGUgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAgaXMgdXNlZCB0byBnZW5lcmF0ZQotZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCi0KLU5vcm1hbGx5IHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlZ2VuZXJhdGluZyB0aGUgc291cmNlIGZpbGVzLAotdW5sZXNzIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGVtLiAgSW4gdGhhdCBjYXNlLCB5b3Ugc2hvdWxkIG1vZGlmeSB0aGUKLWNvcnJlc3BvbmRpbmcgLnB1bXAgZmlsZXMgaW5zdGVhZCBhbmQgcnVuIHRoZSAncHVtcCcgc2NyaXB0IChmb3IgUHVtcAotaXMgVXNlZnVsIGZvciBNZXRhIFByb2dyYW1taW5nKSB0byByZWdlbmVyYXRlIHRoZW0uICBZb3UgY2FuIGZpbmQKLXB1bXAucHkgaW4gdGhlICR7R1RFU1RfRElSfS9zY3JpcHRzLyBkaXJlY3RvcnkuICBSZWFkIHRoZSBQdW1wIG1hbnVhbAotWzNdIGZvciBob3cgdG8gdXNlIGl0LgotCi0gIFszXSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1B1bXBNYW51YWwuCi0KLSMjIyBDb250cmlidXRpbmcgYSBQYXRjaCAjIyMKLQotV2Ugd2VsY29tZSBwYXRjaGVzLiAgUGxlYXNlIHJlYWQgdGhlIEdvb2dsZSBNb2NrIGRldmVsb3BlcidzIGd1aWRlIFs0XQotZm9yIGhvdyB5b3UgY2FuIGNvbnRyaWJ1dGUuICBJbiBwYXJ0aWN1bGFyLCBtYWtlIHN1cmUgeW91IGhhdmUgc2lnbmVkCi10aGUgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQsIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gYWNjZXB0IHRoZQotcGF0Y2guCi0KLSAgWzRdIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvRGV2R3VpZGUKLQotSGFwcHkgdGVzdGluZyEKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svYnVpbGQtYXV4Ly5rZWVwIGIvdGVzdGluZy9nbW9jay9idWlsZC1hdXgvLmtlZXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9idWlsZC1hdXgvLmtlZXAKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9jb25maWd1cmUuYWMgYi90ZXN0aW5nL2dtb2NrL2NvbmZpZ3VyZS5hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2OGQ1ZC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2NvbmZpZ3VyZS5hYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi1tNF9pbmNsdWRlKGd0ZXN0L200L2FjeF9wdGhyZWFkLm00KQotCi1BQ19JTklUKFtHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrXSwKLSAgICAgICAgWzEuNy4wXSwKLSAgICAgICAgW2dvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbV0sCi0gICAgICAgIFtnbW9ja10pCi0KLSMgUHJvdmlkZSB2YXJpb3VzIG9wdGlvbnMgdG8gaW5pdGlhbGl6ZSB0aGUgQXV0b2NvbmYgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzZXMuCi1BQ19QUkVSRVEoWzIuNTldKQotQUNfQ09ORklHX1NSQ0RJUihbLi9MSUNFTlNFXSkKLUFDX0NPTkZJR19BVVhfRElSKFtidWlsZC1hdXhdKQotQUNfQ09ORklHX0hFQURFUlMoW2J1aWxkLWF1eC9jb25maWcuaF0pCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKLUFDX0NPTkZJR19GSUxFUyhbc2NyaXB0cy9nbW9jay1jb25maWddLCBbY2htb2QgK3ggc2NyaXB0cy9nbW9jay1jb25maWddKQotCi0jIEluaXRpYWxpemUgQXV0b21ha2Ugd2l0aCB2YXJpb3VzIG9wdGlvbnMuIFdlIHJlcXVpcmUgYXQgbGVhc3QgdjEuOSwgcHJldmVudAotIyBwZWRhbnRpYyBjb21wbGFpbnRzIGFib3V0IHBhY2thZ2UgZmlsZXMsIGFuZCBlbmFibGUgdmFyaW91cyBkaXN0cmlidXRpb24KLSMgdGFyZ2V0cy4KLUFNX0lOSVRfQVVUT01BS0UoWzEuOSBkaXN0LWJ6aXAyIGRpc3QtemlwIGZvcmVpZ24gc3ViZGlyLW9iamVjdHNdKQotCi0jIENoZWNrIGZvciBwcm9ncmFtcyB1c2VkIGluIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgotQUNfUFJPR19DQwotQUNfUFJPR19DWFgKLUFDX0xBTkcoW0MrK10pCi1BQ19QUk9HX0xJQlRPT0wKLQotIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogQ3VycmVudGx5IHdlIGFyZW4ndCBydW5uaW5nIHRoZSBQeXRob24gdGVzdHMKLSMgYWdhaW5zdCB0aGUgaW50ZXJwcmV0ZXIgZGV0ZWN0ZWQgYnkgQU1fUEFUSF9QWVRIT04sIGFuZCBzbyB3ZSBjb25kaXRpb24KLSMgSEFWRV9QWVRIT04gYnkgcmVxdWlyaW5nICJweXRob24iIHRvIGJlIGluIHRoZSBQQVRILCBhbmQgdGhhdCBpbnRlcnByZXRlcidzCi0jIHZlcnNpb24gdG8gYmUgPj0gMi4zLiBUaGlzIHdpbGwgYWxsb3cgdGhlIHNjcmlwdHMgdG8gdXNlIGEgIi91c3IvYmluL2VudiIKLSMgaGFzaGJhbmcuCi1QWVRIT049ICAjIFdlICpkbyBub3QqIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBweXRob24gaW50ZXJwcmV0ZXIKLUFDX1BBVEhfUFJPRyhbUFlUSE9OXSxbcHl0aG9uXSxbOl0pCi1BU19JRihbdGVzdCAiJFBZVEhPTiIgIT0gIjoiXSwKLSAgICAgIFtBTV9QWVRIT05fQ0hFQ0tfVkVSU0lPTihbJFBZVEhPTl0sWzIuM10sWzpdLFtQWVRIT049IjoiXSldKQotQU1fQ09ORElUSU9OQUwoW0hBVkVfUFlUSE9OXSxbdGVzdCAiJFBZVEhPTiIgIT0gIjoiXSkKLQotIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayBmb3IgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gaGVhZGVycy4KLQotIyBDb25maWd1cmUgcHRocmVhZHMuCi1BQ19BUkdfV0lUSChbcHRocmVhZHNdLAotICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcHRocmVhZHNdLAotICAgICAgICAgICAgICAgW3VzZSBwdGhyZWFkcyAoZGVmYXVsdCBpcyB5ZXMpXSldLAotICAgICAgICAgICAgW3dpdGhfcHRocmVhZHM9JHdpdGh2YWxdLAotICAgICAgICAgICAgW3dpdGhfcHRocmVhZHM9Y2hlY2tdKQotCi1oYXZlX3B0aHJlYWRzPW5vCi1BU19JRihbdGVzdCAieCR3aXRoX3B0aHJlYWRzIiAhPSAieG5vIl0sCi0gICAgICBbQUNYX1BUSFJFQUQoCi0gICAgICAgIFtdLAotICAgICAgICBbQVNfSUYoW3Rlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhjaGVjayJdLAotICAgICAgICAgICAgICAgW0FDX01TR19GQUlMVVJFKAotICAgICAgICAgICAgICAgICBbLS13aXRoLXB0aHJlYWRzIHdhcyBzcGVjaWZpZWQsIGJ1dCB1bmFibGUgdG8gYmUgdXNlZF0pXSldKQotICAgICAgIGhhdmVfcHRocmVhZHM9IiRhY3hfcHRocmVhZF9vayJdKQotQU1fQ09ORElUSU9OQUwoW0hBVkVfUFRIUkVBRFNdLFt0ZXN0ICJ4JGhhdmVfcHRocmVhZHMiID09ICJ4eWVzIl0pCi1BQ19TVUJTVChQVEhSRUFEX0NGTEFHUykKLUFDX1NVQlNUKFBUSFJFQURfTElCUykKLQotIyBHb29nbGVNb2NrIGN1cnJlbnRseSBoYXMgaGFyZCBkZXBlbmRlbmNpZXMgdXBvbiBHb29nbGVUZXN0IGFib3ZlIGFuZCBiZXlvbmQKLSMgcnVubmluZyBpdHMgb3duIHRlc3Qgc3VpdGUsIHNvIHdlIGJvdGggcHJvdmlkZSBvdXIgb3duIHZlcnNpb24gaW4KLSMgYSBzdWJkaXJlY3RvcnkgYW5kIHByb3ZpZGUgc29tZSBsb2dpYyB0byB1c2UgYSBjdXN0b20gdmVyc2lvbiBvciBhIHN5c3RlbQotIyBpbnN0YWxsZWQgdmVyc2lvbi4KLUFDX0FSR19XSVRIKFtndGVzdF0sCi0gICAgICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ndGVzdF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NwZWNpZmllcyBob3cgdG8gZmluZCB0aGUgZ3Rlc3QgcGFja2FnZS4gSWYgbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUgZGVmYXVsdCBiZWhhdmlvciwgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBpbnN0YWxsZWQgZ3Rlc3Qgd2lsbCBiZSB1c2VkIGlmIHByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFuIGludGVybmFsIHZlcnNpb24gYnVpbHQgb3RoZXJ3aXNlLiBJZiBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCBpcyBwcm92aWRlZCwgdGhlIGd0ZXN0IGJ1aWx0IG9yIGluc3RhbGxlZCBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcHJlZml4IHdpbGwgYmUgdXNlZC5dKV0sCi0gICAgICAgICAgICBbXSwKLSAgICAgICAgICAgIFt3aXRoX2d0ZXN0PXllc10pCi1BQ19BUkdfRU5BQkxFKFtleHRlcm5hbC1ndGVzdF0sCi0gICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWV4dGVybmFsLWd0ZXN0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlcyBhbnkgZGV0ZWN0aW9uIG9yIHVzZSBvZiBhIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkIG9yIHVzZXIgcHJvdmlkZWQgZ3Rlc3QuIEFueSBvcHRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXdpdGgtZ3Rlc3QnIGlzIGlnbm9yZWQuIChEZWZhdWx0IGlzIGVuYWJsZWQuKV0pCi0gICAgICAgICAgICAgIF0sIFtdLCBbZW5hYmxlX2V4dGVybmFsX2d0ZXN0PXllc10pCi1BU19JRihbdGVzdCAieCR3aXRoX2d0ZXN0IiA9PSAieG5vIl0sCi0gICAgICBbQUNfTVNHX0VSUk9SKFtkbmwKLVN1cHBvcnQgZm9yIEdvb2dsZVRlc3Qgd2FzIGV4cGxpY2l0bHkgZGlzYWJsZWQuIEN1cnJlbnRseSBHb29nbGVNb2NrIGhhcyBhIGhhcmQKLWRlcGVuZGVuY3kgdXBvbiBHb29nbGVUZXN0IHRvIGJ1aWxkLCBwbGVhc2UgcHJvdmlkZSBhIHZlcnNpb24sIG9yIGFsbG93Ci1Hb29nbGVNb2NrIHRvIHVzZSBhbnkgaW5zdGFsbGVkIHZlcnNpb24gYW5kIGZhbGwgYmFjayB1cG9uIGl0cyBpbnRlcm5hbAotdmVyc2lvbi5dKV0pCi0KLSMgU2V0dXAgdmFyaW91cyBHVEVTVCB2YXJpYWJsZXMuIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBXaGVuIHRoZXNlIGFyZQotIyB1c2VkIGJlbG93LCB0aGV5IHNob3VsZCBiZSB1c2VkIHN1Y2ggdGhhdCBhbnkgcHJlLWV4aXN0aW5nIHZhbHVlcyBhbHdheXMKLSMgdHJ1bXAgdmFsdWVzIHdlIHNldCB0aGVtIHRvLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgb3ZlcnJpZGUKLSMgZGV0YWlscyBvZiB0aGUgZGV0ZWN0aW9uIHByb2Nlc3MuCi1BQ19BUkdfVkFSKFtHVEVTVF9DT05GSUddLAotICAgICAgICAgICBbVGhlIGV4YWN0IHBhdGggb2YgR29vZ2xlIFRlc3QncyAnZ3Rlc3QtY29uZmlnJyBzY3JpcHQuXSkKLUFDX0FSR19WQVIoW0dURVNUX0NQUEZMQUdTXSwKLSAgICAgICAgICAgW0MtbGlrZSBwcmVwcm9jZXNzb3IgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCi1BQ19BUkdfVkFSKFtHVEVTVF9DWFhGTEFHU10sCi0gICAgICAgICAgIFtDKysgY29tcGlsZSBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKLUFDX0FSR19WQVIoW0dURVNUX0xERkxBR1NdLAotICAgICAgICAgICBbTGlua2VyIHBhdGggYW5kIG9wdGlvbiBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKLUFDX0FSR19WQVIoW0dURVNUX0xJQlNdLAotICAgICAgICAgICBbTGlicmFyeSBsaW5raW5nIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQotQUNfQVJHX1ZBUihbR1RFU1RfVkVSU0lPTl0sCi0gICAgICAgICAgIFtUaGUgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCBhdmFpbGFibGUuXSkKLUhBVkVfQlVJTFRfR1RFU1Q9Im5vIgotCi1HVEVTVF9NSU5fVkVSU0lPTj0iMS43LjAiCi0KLUFTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZXh0ZXJuYWxfZ3Rlc3R9IiA9ICJ4eWVzIl0sCi0gICAgICBbIyBCZWdpbiBmaWxsaW5nIGluIHZhcmlhYmxlcyBhcyB3ZSBhcmUgYWJsZS4KLSAgICAgIEFTX0lGKFt0ZXN0ICJ4JHt3aXRoX2d0ZXN0fSIgIT0gInh5ZXMiXSwKLSAgICAgICAgICAgIFtBU19JRihbdGVzdCAteCAiJHt3aXRoX2d0ZXN0fS9zY3JpcHRzL2d0ZXN0LWNvbmZpZyJdLAotICAgICAgICAgICAgICAgICAgIFtHVEVTVF9DT05GSUc9IiR7d2l0aF9ndGVzdH0vc2NyaXB0cy9ndGVzdC1jb25maWciXSwKLSAgICAgICAgICAgICAgICAgICBbR1RFU1RfQ09ORklHPSIke3dpdGhfZ3Rlc3R9L2Jpbi9ndGVzdC1jb25maWciXSkKLSAgICAgICAgICAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwgW10sCi0gICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtkbmwKLVVuYWJsZSB0byBsb2NhdGUgZWl0aGVyIGEgYnVpbHQgb3IgaW5zdGFsbGVkIEdvb2dsZSBUZXN0IGF0ICcke3dpdGhfZ3Rlc3R9Jy5dKQotICAgICAgICAgICAgICAgICAgXSldKQotCi0gICAgICBBU19JRihbdGVzdCAteCAiJHtHVEVTVF9DT05GSUd9Il0sIFtdLAotICAgICAgICAgICAgW0FDX1BBVEhfUFJPRyhbR1RFU1RfQ09ORklHXSwgW2d0ZXN0LWNvbmZpZ10pXSkKLSAgICAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwKLSAgICAgICAgICAgIFtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHb29nbGUgVGVzdCB2ZXJzaW9uID49ICR7R1RFU1RfTUlOX1ZFUlNJT059XSkKLSAgICAgICAgICAgIEFTX0lGKFske0dURVNUX0NPTkZJR30gLS1taW4tdmVyc2lvbj0ke0dURVNUX01JTl9WRVJTSU9OfV0sCi0gICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICAgICAgICAgICAgICAgIEhBVkVfQlVJTFRfR1RFU1Q9InllcyJdLAotICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKV0pXSkKLQotQVNfSUYoW3Rlc3QgIngke0hBVkVfQlVJTFRfR1RFU1R9IiA9ICJ4eWVzIl0sCi0gICAgICBbR1RFU1RfQ1BQRkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWNwcGZsYWdzYAotICAgICAgR1RFU1RfQ1hYRkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWN4eGZsYWdzYAotICAgICAgR1RFU1RfTERGTEFHUz1gJHtHVEVTVF9DT05GSUd9IC0tbGRmbGFnc2AKLSAgICAgIEdURVNUX0xJQlM9YCR7R1RFU1RfQ09ORklHfSAtLWxpYnNgCi0gICAgICBHVEVTVF9WRVJTSU9OPWAke0dURVNUX0NPTkZJR30gLS12ZXJzaW9uYF0sCi0gICAgICBbQUNfQ09ORklHX1NVQkRJUlMoW2d0ZXN0XSkKLSAgICAgICMgR1RFU1RfQ09ORklHIG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgYm90aCBpbiBhIE1ha2VmaWxlIGVudmlyb25tb250IGFuZAotICAgICAgIyBpbiBhIHNoZWxsIHNjcmlwdCBlbnZpcm9ubWVudCwgc28gcmVzb2x2ZSBhbiBhYnNvbHV0ZSBwYXRoIGZvciBpdCBoZXJlLgotICAgICAgR1RFU1RfQ09ORklHPSJgcHdkIC1QYC9ndGVzdC9zY3JpcHRzL2d0ZXN0LWNvbmZpZyIKLSAgICAgIEdURVNUX0NQUEZMQUdTPSctSSQodG9wX3NyY2RpcikvZ3Rlc3QvaW5jbHVkZScKLSAgICAgIEdURVNUX0NYWEZMQUdTPSctZycKLSAgICAgIEdURVNUX0xERkxBR1M9JycKLSAgICAgIEdURVNUX0xJQlM9JyQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEnCi0gICAgICBHVEVTVF9WRVJTSU9OPSIke0dURVNUX01JTl9WRVJTSU9OfSJdKQotCi0jIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pIENoZWNrIHRoZSB0eXBlcywgc3RydWN0dXJlcywgYW5kIG90aGVyIGNvbXBpbGVyCi0jIGFuZCBhcmNoaXRlY3R1cmUgY2hhcmFjdGVyaXN0aWNzLgotCi0jIE91dHB1dCB0aGUgZ2VuZXJhdGVkIGZpbGVzLiBObyBmdXJ0aGVyIGF1dG9jb25mIG1hY3JvcyBtYXkgYmUgdXNlZC4KLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1hY3Rpb25zLmgKaW5kZXggYzA5YzRkNi4uNDZkMTE4NCAxMDA2NDQKLS0tIGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaAorKysgYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oCkBAIC0xLDEyMDUgKzEsMTUgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCBhY3Rpb25zLgorI2lmbmRlZiBURVNUSU5HX0dNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXworI2RlZmluZSBURVNUSU5HX0dNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXwogCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KKy8vIFRoZSBmaWxlL2RpcmVjdG9yeSBsYXlvdXQgb2YgR29vZ2xlIFRlc3QgaXMgbm90IHlldCBjb25zaWRlcmVkIHN0YWJsZS4gVW50aWwKKy8vIGl0IHN0YWJpbGl6ZXMsIENocm9taXVtIGNvZGUgd2lsbCB1c2UgZm9yd2FyZGluZyBoZWFkZXJzIGluIHRlc3RpbmcvZ3Rlc3QKKy8vIGFuZCB0ZXN0aW5nL2dtb2NrLCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGluY2x1ZGluZyBmaWxlcyBpbgorLy8gdGhpcmRfcGFydHkvZ29vZ2xldGVzdC4KIAotI2lmbmRlZiBfV0lOMzJfV0NFCi0jIGluY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oIgogCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotCi0jaWYgR1RFU1RfTEFOR19DWFgxMSAgLy8gRGVmaW5lZCBieSBndGVzdC1wb3J0LmggdmlhIGdtb2NrLXBvcnQuaC4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRvIGltcGxlbWVudCBhbiBhY3Rpb24gRm9vLCBkZWZpbmU6Ci0vLyAgIDEuIGEgY2xhc3MgRm9vQWN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgQWN0aW9uSW50ZXJmYWNlIGludGVyZmFjZSwgYW5kCi0vLyAgIDIuIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gQWN0aW9uIG9iamVjdCBmcm9tIGEKLS8vICAgICAgY29uc3QgRm9vQWN0aW9uKi4KLS8vCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIGZvbGxvd3MgdGhhdCBvZiBNYXRjaGVyLCBwcm92aWRpbmcKLS8vIGNvbnNpc3RlbmN5IGZvciBleHRlbnNpb24gZGV2ZWxvcGVycy4gIEl0IGFsc28gZWFzZXMgb3duZXJzaGlwCi0vLyBtYW5hZ2VtZW50IGFzIEFjdGlvbiBvYmplY3RzIGNhbiBub3cgYmUgY29waWVkIGxpa2UgcGxhaW4gdmFsdWVzLgotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgotY2xhc3MgQWN0aW9uQWRhcHRvcjsKLQotLy8gQnVpbHRJbkRlZmF1bHRWYWx1ZUdldHRlcjxULCB0cnVlPjo6R2V0KCkgcmV0dXJucyBhCi0vLyBkZWZhdWx0LWNvbnN0cnVjdGVkIFQgdmFsdWUuICBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsCi0vLyBmYWxzZT46OkdldCgpIGNyYXNoZXMgd2l0aCBhbiBlcnJvci4KLS8vCi0vLyBUaGlzIHByaW1hcnkgdGVtcGxhdGUgaXMgdXNlZCB3aGVuIGtEZWZhdWx0Q29uc3RydWN0aWJsZSBpcyB0cnVlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wga0RlZmF1bHRDb25zdHJ1Y3RpYmxlPgotc3RydWN0IEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXIgewotICBzdGF0aWMgVCBHZXQoKSB7IHJldHVybiBUKCk7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsIGZhbHNlPiB7Ci0gIHN0YXRpYyBUIEdldCgpIHsKLSAgICBBc3NlcnQoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgIkRlZmF1bHQgYWN0aW9uIHVuZGVmaW5lZCBmb3IgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlLiIpOwotICAgIHJldHVybiBpbnRlcm5hbDo6SW52YWxpZDxUPigpOwotICAgIC8vIFRoZSBhYm92ZSBzdGF0ZW1lbnQgd2lsbCBuZXZlciBiZSByZWFjaGVkLCBidXQgaXMgcmVxdWlyZWQgaW4KLSAgICAvLyBvcmRlciBmb3IgdGhpcyBmdW5jdGlvbiB0byBjb21waWxlLgotICB9Ci19OwotCi0vLyBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSByZXR1cm5zIHRoZSAiYnVpbHQtaW4iIGRlZmF1bHQgdmFsdWUKLS8vIGZvciB0eXBlIFQsIHdoaWNoIGlzIE5VTEwgd2hlbiBUIGlzIGEgcmF3IHBvaW50ZXIgdHlwZSwgMCB3aGVuIFQgaXMKLS8vIGEgbnVtZXJpYyB0eXBlLCBmYWxzZSB3aGVuIFQgaXMgYm9vbCwgb3IgIiIgd2hlbiBUIGlzIHN0cmluZyBvcgotLy8gc3RkOjpzdHJpbmcuICBJbiBhZGRpdGlvbiwgaW4gQysrMTEgYW5kIGFib3ZlLCBpdCB0dXJucyBhCi0vLyBkZWZhdWx0LWNvbnN0cnVjdGVkIFQgdmFsdWUgaWYgVCBpcyBkZWZhdWx0IGNvbnN0cnVjdGlibGUuICBGb3IgYW55Ci0vLyBvdGhlciB0eXBlIFQsIHRoZSBidWlsdC1pbiBkZWZhdWx0IFQgdmFsdWUgaXMgdW5kZWZpbmVkLCBhbmQgdGhlCi0vLyBmdW5jdGlvbiB3aWxsIGFib3J0IHRoZSBwcm9jZXNzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlIHsKLSBwdWJsaWM6Ci0jaWYgR1RFU1RfTEFOR19DWFgxMQotICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdHlwZSBUIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsKLSAgICByZXR1cm4gOjpzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU7Ci0gIH0KLQotICBzdGF0aWMgVCBHZXQoKSB7Ci0gICAgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8Ci0gICAgICAgIFQsIDo6c3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlPjo6R2V0KCk7Ci0gIH0KLQotI2Vsc2UgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLSAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIHR5cGUgVCBoYXMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RhdGljIFQgR2V0KCkgewotICAgIHJldHVybiBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsIGZhbHNlPjo6R2V0KCk7Ci0gIH0KLQotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi19OwotCi0vLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gc2F5cyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBidWlsdC1pbgotLy8gZGVmYXVsdCB2YWx1ZSBmb3IgVCBhbmQgY29uc3QgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBUPiB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7IHJldHVybiBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpFeGlzdHMoKTsgfQotICBzdGF0aWMgVCBHZXQoKSB7IHJldHVybiBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKTsgfQotfTsKLQotLy8gVGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBwb2ludGVyCi0vLyB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTxUKj4gewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfQotICBzdGF0aWMgVCogR2V0KCkgeyByZXR1cm4gTlVMTDsgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbnMgZGVmaW5lIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IKLS8vIHNwZWNpZmljIHR5cGVzIHdlIGNhcmUgYWJvdXQuCi0jZGVmaW5lIEdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHR5cGUsIHZhbHVlKSBcCi0gIHRlbXBsYXRlIDw+IFwKLSAgY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTx0eXBlPiB7IFwKLSAgIHB1YmxpYzogXAotICAgIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIHRydWU7IH0gXAotICAgIHN0YXRpYyB0eXBlIEdldCgpIHsgcmV0dXJuIHZhbHVlOyB9IFwKLSAgfQotCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh2b2lkLCApOyAgLy8gTk9MSU5UCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKDo6c3RyaW5nLCAiIik7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyg6OnN0ZDo6c3RyaW5nLCAiIik7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhib29sLCBmYWxzZSk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBjaGFyLCAnXDAnKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBjaGFyLCAnXDAnKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKGNoYXIsICdcMCcpOwotCi0vLyBUaGVyZSdzIG5vIG5lZWQgZm9yIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHNpZ25lZCB3Y2hhcl90LCBhcyB0aGF0Ci0vLyB0eXBlIGlzIHRoZSBzYW1lIGFzIHdjaGFyX3QgZm9yIGdjYywgYW5kIGludmFsaWQgZm9yIE1TVkMuCi0vLwotLy8gVGhlcmUncyBhbHNvIG5vIG5lZWQgZm9yIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHVuc2lnbmVkIHdjaGFyX3QsIGFzCi0vLyB0aGF0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdW5zaWduZWQgaW50IGZvciBnY2MsIGFuZCBpbnZhbGlkIGZvcgotLy8gTVNWQy4KLSNpZiBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHdjaGFyX3QsIDBVKTsgIC8vIE5PTElOVAotI2VuZGlmCi0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIHNob3J0LCAwVSk7ICAvLyBOT0xJTlQKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBzaG9ydCwgMCk7ICAgICAvLyBOT0xJTlQKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIGludCwgMFUpOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIGludCwgMCk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBsb25nLCAwVUwpOyAgLy8gTk9MSU5UCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhzaWduZWQgbG9uZywgMEwpOyAgICAgLy8gTk9MSU5UCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhVSW50NjQsIDApOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oSW50NjQsIDApOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oZmxvYXQsIDApOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oZG91YmxlLCAwKTsKLQotI3VuZGVmIEdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBXaGVuIGFuIHVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCBpcyBlbmNvdW50ZXJlZCwgR29vZ2xlIE1vY2sgd2lsbAotLy8gbGV0IGl0IHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBvbmUgZm9yIGl0cwotLy8gcmV0dXJuIHR5cGUsIG9yIGlmIHRoZSByZXR1cm4gdHlwZSBoYXMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlOwotLy8gb3RoZXJ3aXNlIEdvb2dsZSBNb2NrIHdvbid0IGtub3cgd2hhdCB2YWx1ZSB0byByZXR1cm4gYW5kIHdpbGwgaGF2ZQotLy8gdG8gYWJvcnQgdGhlIHByb2Nlc3MuCi0vLwotLy8gVGhlIERlZmF1bHRWYWx1ZTxUPiBjbGFzcyBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgdGhlCi0vLyBkZWZhdWx0IHZhbHVlIGZvciBhIHR5cGUgVCB0aGF0IGlzIGJvdGggY29weWFibGUgYW5kIHB1YmxpY2x5Ci0vLyBkZXN0cnVjdGlibGUgKGkuZS4gYW55dGhpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZ1bmN0aW9uIHJldHVybgotLy8gdHlwZSkuICBUaGUgdXNhZ2UgaXM6Ci0vLwotLy8gICAvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQgdG8gYmUgZm9vLgotLy8gICBEZWZhdWx0VmFsdWU8VD46OlNldChmb28pOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBEZWZhdWx0VmFsdWUgewotIHB1YmxpYzoKLSAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUOyByZXF1aXJlcyBUIHRvIGJlCi0gIC8vIGNvcHktY29uc3RydWN0YWJsZSBhbmQgaGF2ZSBhIHB1YmxpYyBkZXN0cnVjdG9yLgotICBzdGF0aWMgdm9pZCBTZXQoVCB4KSB7Ci0gICAgZGVsZXRlIHByb2R1Y2VyXzsKLSAgICBwcm9kdWNlcl8gPSBuZXcgRml4ZWRWYWx1ZVByb2R1Y2VyKHgpOwotICB9Ci0KLSAgLy8gUHJvdmlkZXMgYSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZXZlbiBpZiBUIGlzIG9ubHkgbW92ZS1jb25zdHJ1Y3RpYmxlLCBidXQgaXQgaXMgbm90Ci0gIC8vIGxpbWl0ZWQgdG8gdGhhdCBjYXNlLgotICB0eXBlZGVmIFQgKCpGYWN0b3J5RnVuY3Rpb24pKCk7Ci0gIHN0YXRpYyB2b2lkIFNldEZhY3RvcnkoRmFjdG9yeUZ1bmN0aW9uIGZhY3RvcnkpIHsKLSAgICBkZWxldGUgcHJvZHVjZXJfOwotICAgIHByb2R1Y2VyXyA9IG5ldyBGYWN0b3J5VmFsdWVQcm9kdWNlcihmYWN0b3J5KTsKLSAgfQotCi0gIC8vIFVuc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBULgotICBzdGF0aWMgdm9pZCBDbGVhcigpIHsKLSAgICBkZWxldGUgcHJvZHVjZXJfOwotICAgIHByb2R1Y2VyXyA9IE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVC4KLSAgc3RhdGljIGJvb2wgSXNTZXQoKSB7IHJldHVybiBwcm9kdWNlcl8gIT0gTlVMTDsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBUIGhhcyBhIGRlZmF1bHQgcmV0dXJuIHZhbHVlIHNldCBieSB0aGUgdXNlciBvciB0aGVyZQotICAvLyBleGlzdHMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7Ci0gICAgcmV0dXJuIElzU2V0KCkgfHwgaW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkV4aXN0cygpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUIGlmIHRoZSB1c2VyIGhhcyBzZXQgb25lOwotICAvLyBvdGhlcndpc2UgcmV0dXJucyB0aGUgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZS4gUmVxdWlyZXMgdGhhdCBFeGlzdHMoKQotICAvLyBpcyB0cnVlLCB3aGljaCBlbnN1cmVzIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyB3ZWxsLWRlZmluZWQuCi0gIHN0YXRpYyBUIEdldCgpIHsKLSAgICByZXR1cm4gcHJvZHVjZXJfID09IE5VTEwgPwotICAgICAgICBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6R2V0KCkgOiBwcm9kdWNlcl8tPlByb2R1Y2UoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgVmFsdWVQcm9kdWNlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+VmFsdWVQcm9kdWNlcigpIHt9Ci0gICAgdmlydHVhbCBUIFByb2R1Y2UoKSA9IDA7Ci0gIH07Ci0KLSAgY2xhc3MgRml4ZWRWYWx1ZVByb2R1Y2VyIDogcHVibGljIFZhbHVlUHJvZHVjZXIgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEZpeGVkVmFsdWVQcm9kdWNlcihUIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgICB2aXJ0dWFsIFQgUHJvZHVjZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IFQgdmFsdWVfOwotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRml4ZWRWYWx1ZVByb2R1Y2VyKTsKLSAgfTsKLQotICBjbGFzcyBGYWN0b3J5VmFsdWVQcm9kdWNlciA6IHB1YmxpYyBWYWx1ZVByb2R1Y2VyIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBGYWN0b3J5VmFsdWVQcm9kdWNlcihGYWN0b3J5RnVuY3Rpb24gZmFjdG9yeSkKLSAgICAgICAgOiBmYWN0b3J5XyhmYWN0b3J5KSB7fQotICAgIHZpcnR1YWwgVCBQcm9kdWNlKCkgeyByZXR1cm4gZmFjdG9yeV8oKTsgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IEZhY3RvcnlGdW5jdGlvbiBmYWN0b3J5XzsKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEZhY3RvcnlWYWx1ZVByb2R1Y2VyKTsKLSAgfTsKLQotICBzdGF0aWMgVmFsdWVQcm9kdWNlciogcHJvZHVjZXJfOwotfTsKLQotLy8gVGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFsbG93cyBhIHVzZXIgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvcgotLy8gcmVmZXJlbmNlIHR5cGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBEZWZhdWx0VmFsdWU8VCY+IHsKLSBwdWJsaWM6Ci0gIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCi0gIHN0YXRpYyB2b2lkIFNldChUJiB4KSB7ICAvLyBOT0xJTlQKLSAgICBhZGRyZXNzXyA9ICZ4OwotICB9Ci0KLSAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmLgotICBzdGF0aWMgdm9pZCBDbGVhcigpIHsKLSAgICBhZGRyZXNzXyA9IE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCi0gIHN0YXRpYyBib29sIElzU2V0KCkgeyByZXR1cm4gYWRkcmVzc18gIT0gTlVMTDsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBUIGhhcyBhIGRlZmF1bHQgcmV0dXJuIHZhbHVlIHNldCBieSB0aGUgdXNlciBvciB0aGVyZQotICAvLyBleGlzdHMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7Ci0gICAgcmV0dXJuIElzU2V0KCkgfHwgaW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU8VCY+OjpFeGlzdHMoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYgaWYgdGhlIHVzZXIgaGFzIHNldCBvbmU7Ci0gIC8vIG90aGVyd2lzZSByZXR1cm5zIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIG9uZTsKLSAgLy8gb3RoZXJ3aXNlIGFib3J0cyB0aGUgcHJvY2Vzcy4KLSAgc3RhdGljIFQmIEdldCgpIHsKLSAgICByZXR1cm4gYWRkcmVzc18gPT0gTlVMTCA/Ci0gICAgICAgIGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQmPjo6R2V0KCkgOiAqYWRkcmVzc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBUKiBhZGRyZXNzXzsKLX07Ci0KLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gYWxsb3dzIERlZmF1bHRWYWx1ZTx2b2lkPjo6R2V0KCkgdG8KLS8vIGNvbXBpbGUuCi10ZW1wbGF0ZSA8PgotY2xhc3MgRGVmYXVsdFZhbHVlPHZvaWQ+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIHRydWU7IH0KLSAgc3RhdGljIHZvaWQgR2V0KCkge30KLX07Ci0KLS8vIFBvaW50cyB0byB0aGUgdXNlci1zZXQgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBEZWZhdWx0VmFsdWU8VD46OlZhbHVlUHJvZHVjZXIqIERlZmF1bHRWYWx1ZTxUPjo6cHJvZHVjZXJfID0gTlVMTDsKLQotLy8gUG9pbnRzIHRvIHRoZSB1c2VyLXNldCBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UKiBEZWZhdWx0VmFsdWU8VCY+OjphZGRyZXNzXyA9IE5VTEw7Ci0KLS8vIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBkZWZpbmUgYW4gYWN0aW9uIGZvciBmdW5jdGlvbiB0eXBlIEYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEFjdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBBY3Rpb25JbnRlcmZhY2UoKSB7fQotICB2aXJ0dWFsIH5BY3Rpb25JbnRlcmZhY2UoKSB7fQotCi0gIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBUaGlzIG1ldGhvZCBpcyBub3QgY29uc3QsIGFzIGluIGdlbmVyYWwgYW4KLSAgLy8gYWN0aW9uIGNhbiBoYXZlIHNpZGUgZWZmZWN0cyBhbmQgYmUgc3RhdGVmdWwuICBGb3IgZXhhbXBsZSwgYQotICAvLyBnZXQtdGhlLW5leHQtZWxlbWVudC1mcm9tLXRoZS1jb2xsZWN0aW9uIGFjdGlvbiB3aWxsIG5lZWQgdG8KLSAgLy8gcmVtZW1iZXIgdGhlIGN1cnJlbnQgZWxlbWVudC4KLSAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSA9IDA7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFjdGlvbkludGVyZmFjZSk7Ci19OwotCi0vLyBBbiBBY3Rpb248Rj4gaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkKLS8vIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gYSBtb2NrIGZ1bmN0aW9uCi0vLyBvZiB0eXBlIEYgaXMgY2FsbGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIEFjdGlvbjxUPiBpcyBqdXN0IGEKLS8vIGxpbmtlZF9wdHIgdG8gY29uc3QgQWN0aW9uSW50ZXJmYWNlPFQ+LCBzbyBjb3B5aW5nIGlzIGZhaXJseSBjaGVhcC4KLS8vIERvbid0IGluaGVyaXQgZnJvbSBBY3Rpb24hCi0vLwotLy8gWW91IGNhbiB2aWV3IGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlPEY+IGFzIGEKLS8vIGNvbmNyZXRlIGFjdGlvbiAoaW5jbHVkaW5nIGl0cyBjdXJyZW50IHN0YXRlKSwgYW5kIGFuIEFjdGlvbjxGPgotLy8gb2JqZWN0IGFzIGEgaGFuZGxlIHRvIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBBY3Rpb24gewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgLy8gQ29uc3RydWN0cyBhIG51bGwgQWN0aW9uLiAgTmVlZGVkIGZvciBzdG9yaW5nIEFjdGlvbiBvYmplY3RzIGluCi0gIC8vIFNUTCBjb250YWluZXJzLgotICBBY3Rpb24oKSA6IGltcGxfKE5VTEwpIHt9Ci0KLSAgLy8gQ29uc3RydWN0cyBhbiBBY3Rpb24gZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uICBBIE5VTEwgaW1wbCBpcwotICAvLyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgImRvLWRlZmF1bHQiIGFjdGlvbi4KLSAgZXhwbGljaXQgQWN0aW9uKEFjdGlvbkludGVyZmFjZTxGPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotCi0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIEFjdGlvbihjb25zdCBBY3Rpb24mIGFjdGlvbikgOiBpbXBsXyhhY3Rpb24uaW1wbF8pIHt9Ci0KLSAgLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdXMgdG8gdHVybiBhbiBBY3Rpb248RnVuYz4gb2JqZWN0IGludG8gYW4KLSAgLy8gQWN0aW9uPEY+LCBhcyBsb25nIGFzIEYncyBhcmd1bWVudHMgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkCi0gIC8vIHRvIEZ1bmMncyBhbmQgRnVuYydzIHJldHVybiB0eXBlIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotICAvLyBGJ3MuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPgotICBleHBsaWNpdCBBY3Rpb24oY29uc3QgQWN0aW9uPEZ1bmM+JiBhY3Rpb24pOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyB0aGUgRG9EZWZhdWx0KCkgYWN0aW9uLgotICBib29sIElzRG9EZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gaW1wbF8uZ2V0KCkgPT0gTlVMTDsgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgY29uc3QgZXZlbiB0aG91Z2gKLSAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIEFjdGlvbkludGVyZmFjZSBpcyBub3QuICBUaGUgcmVhc29uCi0gIC8vIGlzIHRoYXQgYSBjb25zdCBBY3Rpb248Rj4gbWVhbnMgdGhhdCBpdCBjYW5ub3QgYmUgcmUtYm91bmQgdG8KLSAgLy8gYW5vdGhlciBjb25jcmV0ZSBhY3Rpb24sIG5vdCB0aGF0IHRoZSBjb25jcmV0ZSBhY3Rpb24gaXQgYmluZHMgdG8KLSAgLy8gY2Fubm90IGNoYW5nZSBzdGF0ZS4gIChUaGluayBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29uc3QKLSAgLy8gcG9pbnRlciBhbmQgYSBwb2ludGVyIHRvIGNvbnN0LikKLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotICAgIGludGVybmFsOjpBc3NlcnQoCi0gICAgICAgICFJc0RvRGVmYXVsdCgpLCBfX0ZJTEVfXywgX19MSU5FX18sCi0gICAgICAgICJZb3UgYXJlIHVzaW5nIERvRGVmYXVsdCgpIGluc2lkZSBhIGNvbXBvc2l0ZSBhY3Rpb24gbGlrZSAiCi0gICAgICAgICJEb0FsbCgpIG9yIFdpdGhBcmdzKCkuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRlY2huaWNhbCAiCi0gICAgICAgICJyZWFzb25zLiAgUGxlYXNlIGluc3RlYWQgc3BlbGwgb3V0IHRoZSBkZWZhdWx0IGFjdGlvbiwgb3IgIgotICAgICAgICAiYXNzaWduIHRoZSBkZWZhdWx0IGFjdGlvbiB0byBhbiBBY3Rpb24gdmFyaWFibGUgYW5kIHVzZSAiCi0gICAgICAgICJ0aGUgdmFyaWFibGUgaW4gdmFyaW91cyBwbGFjZXMuIik7Ci0gICAgcmV0dXJuIGltcGxfLT5QZXJmb3JtKGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkFjdGlvbkFkYXB0b3I7Ci0KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8QWN0aW9uSW50ZXJmYWNlPEY+ID4gaW1wbF87Ci19OwotCi0vLyBUaGUgUG9seW1vcnBoaWNBY3Rpb24gY2xhc3MgdGVtcGxhdGUgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgYQotLy8gcG9seW1vcnBoaWMgYWN0aW9uIChpLmUuIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIG1vY2sKLS8vIGZ1bmN0aW9ucyBvZiB0aGFuIG9uZSB0eXBlLCBlLmcuIFJldHVybigpKS4KLS8vCi0vLyBUbyBkZWZpbmUgYSBwb2x5bW9ycGhpYyBhY3Rpb24sIGEgdXNlciBmaXJzdCBwcm92aWRlcyBhIENPUFlBQkxFCi0vLyBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IGhhcyBhIFBlcmZvcm0oKSBtZXRob2QgdGVtcGxhdGU6Ci0vLwotLy8gICBjbGFzcyBGb29BY3Rpb24gewotLy8gICAgcHVibGljOgotLy8gICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0vLyAgICAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotLy8gICAgICAgLy8gUHJvY2Vzc2VzIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybnMgYSByZXN1bHQsIHVzaW5nCi0vLyAgICAgICAvLyB0cjE6OmdldDxOPihhcmdzKSB0byBnZXQgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IGluIHRoZSB0dXBsZS4KLS8vICAgICB9Ci0vLyAgICAgLi4uCi0vLyAgIH07Ci0vLwotLy8gVGhlbiB0aGUgdXNlciBjcmVhdGVzIHRoZSBwb2x5bW9ycGhpYyBhY3Rpb24gdXNpbmcKLS8vIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihvYmplY3QpIHdoZXJlIG9iamVjdCBoYXMgdHlwZSBGb29BY3Rpb24uICBTZWUKLS8vIHRoZSBkZWZpbml0aW9uIG9mIFJldHVybih2b2lkKSBhbmQgU2V0QXJndW1lbnRQb2ludGVlPE4+KHZhbHVlKSBmb3IKLS8vIGNvbXBsZXRlIGV4YW1wbGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Ci1jbGFzcyBQb2x5bW9ycGhpY0FjdGlvbiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQb2x5bW9ycGhpY0FjdGlvbihjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBNb25vbW9ycGhpY0ltcGw8Rj4oaW1wbF8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGNsYXNzIE1vbm9tb3JwaGljSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBNb25vbW9ycGhpY0ltcGwoY29uc3QgSW1wbCYgaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgICByZXR1cm4gaW1wbF8udGVtcGxhdGUgUGVyZm9ybTxSZXN1bHQ+KGFyZ3MpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJbXBsIGltcGxfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNb25vbW9ycGhpY0ltcGwpOwotICB9OwotCi0gIEltcGwgaW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2x5bW9ycGhpY0FjdGlvbik7Ci19OwotCi0vLyBDcmVhdGVzIGFuIEFjdGlvbiBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbiBhbmQgcmV0dXJucyBpdC4gIFRoZQotLy8gY3JlYXRlZCBBY3Rpb24gb2JqZWN0IG93bnMgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1BY3Rpb248Rj4gTWFrZUFjdGlvbihBY3Rpb25JbnRlcmZhY2U8Rj4qIGltcGwpIHsKLSAgcmV0dXJuIEFjdGlvbjxGPihpbXBsKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIGFjdGlvbiBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMKLS8vIGVhc2llciB0byB1c2UgdGhhbiB0aGUgUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gY29uc3RydWN0b3IgYXMgaXQKLS8vIGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gZXhwbGljaXRseSB3cml0ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQsIGUuZy4KLS8vCi0vLyAgIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihmb28pOwotLy8gdnMKLS8vICAgUG9seW1vcnBoaWNBY3Rpb248VHlwZU9mRm9vPihmb28pOwotdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Ci1pbmxpbmUgUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpIHsKLSAgcmV0dXJuIFBvbHltb3JwaGljQWN0aW9uPEltcGw+KGltcGwpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBbGxvd3MgYW4gQWN0aW9uPEYyPiBvYmplY3QgdG8gcG9zZSBhcyBhbiBBY3Rpb248RjE+LCBhcyBsb25nIGFzIEYyCi0vLyBhbmQgRjEgYXJlIGNvbXBhdGlibGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgotY2xhc3MgQWN0aW9uQWRhcHRvciA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8RjE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEYxPjo6UmVzdWx0IFJlc3VsdDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248RjE+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgZXhwbGljaXQgQWN0aW9uQWRhcHRvcihjb25zdCBBY3Rpb248RjI+JiBmcm9tKSA6IGltcGxfKGZyb20uaW1wbF8pIHt9Ci0KLSAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGxfLT5QZXJmb3JtKGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxBY3Rpb25JbnRlcmZhY2U8RjI+ID4gaW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBY3Rpb25BZGFwdG9yKTsKLX07Ci0KLS8vIEhlbHBlciBzdHJ1Y3QgdG8gc3BlY2lhbGl6ZSBSZXR1cm5BY3Rpb24gdG8gZXhlY3V0ZSBhIG1vdmUgaW5zdGVhZCBvZiBhIGNvcHkKLS8vIG9uIHJldHVybi4gVXNlZnVsIGZvciBtb3ZlLW9ubHkgdHlwZXMsIGJ1dCBjb3VsZCBiZSB1c2VkIG9uIGFueSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQnlNb3ZlV3JhcHBlciB7Ci0gIGV4cGxpY2l0IEJ5TW92ZVdyYXBwZXIoVCB2YWx1ZSkgOiBwYXlsb2FkKGludGVybmFsOjptb3ZlKHZhbHVlKSkge30KLSAgVCBwYXlsb2FkOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgUmV0dXJuKHgpIGFjdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgaW4KLS8vIGFueSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHR5cGUgb2YgeCwgcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQKLS8vIHR5cGVzLgotLy8KLS8vIE5vdGU6IFRoZSB2YWx1ZSBwYXNzZWQgaW50byBSZXR1cm4gbXVzdCBiZSBjb252ZXJ0ZWQgaW50bwotLy8gRnVuY3Rpb248Rj46OlJlc3VsdCB3aGVuIHRoaXMgYWN0aW9uIGlzIGNhc3QgdG8gQWN0aW9uPEY+IHJhdGhlciB0aGFuCi0vLyB3aGVuIHRoYXQgYWN0aW9uIGlzIHBlcmZvcm1lZC4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gc2NlbmFyaW9zIGxpa2UKLS8vCi0vLyBNT0NLX01FVEhPRDEoTWV0aG9kLCBUKFUpKTsKLS8vIC4uLgotLy8gewotLy8gICBGb28gZm9vOwotLy8gICBYIHgoJmZvbyk7Ci0vLyAgIEVYUEVDVF9DQUxMKG1vY2ssIE1ldGhvZChfKSkuV2lsbE9uY2UoUmV0dXJuKHgpKTsKLS8vIH0KLS8vCi0vLyBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgdmFyaWFibGUgeCBob2xkcyByZWZlcmVuY2UgdG8gZm9vIHdoaWNoIGxlYXZlcwotLy8gc2NvcGUgYW5kIGdldHMgZGVzdHJveWVkLiAgSWYgY29weWluZyBYIGp1c3QgY29waWVzIGEgcmVmZXJlbmNlIHRvIGZvbywKLS8vIHRoYXQgY29weSB3aWxsIGJlIGxlZnQgd2l0aCBhIGhhbmdpbmcgcmVmZXJlbmNlLiAgSWYgY29udmVyc2lvbiB0byBUCi0vLyBtYWtlcyBhIGNvcHkgb2YgZm9vLCB0aGUgYWJvdmUgY29kZSBpcyBzYWZlLiBUbyBzdXBwb3J0IHRoYXQgc2NlbmFyaW8sIHdlCi0vLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0eXBlIGNvbnZlcnNpb24gaGFwcGVucyBpbnNpZGUgdGhlIEVYUEVDVF9DQUxMCi0vLyBzdGF0ZW1lbnQsIGFuZCBjb252ZXJzaW9uIG9mIHRoZSByZXN1bHQgb2YgUmV0dXJuIHRvIEFjdGlvbjxUKFUpPiBpcyBhCi0vLyBnb29kIHBsYWNlIGZvciB0aGF0LgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotY2xhc3MgUmV0dXJuQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBSZXR1cm5BY3Rpb24gb2JqZWN0IGZyb20gdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkLgotICAvLyAndmFsdWUnIGlzIHBhc3NlZCBieSB2YWx1ZSBpbnN0ZWFkIG9mIGJ5IGNvbnN0IHJlZmVyZW5jZSBpbiBvcmRlcgotICAvLyB0byBhbGxvdyBSZXR1cm4oInN0cmluZyBsaXRlcmFsIikgdG8gY29tcGlsZS4KLSAgZXhwbGljaXQgUmV0dXJuQWN0aW9uKFIgdmFsdWUpIDogdmFsdWVfKG5ldyBSKGludGVybmFsOjptb3ZlKHZhbHVlKSkpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIFJldHVybih4KSB0byBiZQotICAvLyB1c2VkIGluIEFOWSBmdW5jdGlvbiB0aGF0IHJldHVybnMgeCdzIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7Ci0gICAgLy8gQXNzZXJ0IHN0YXRlbWVudCBiZWxvbmdzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIHRvIHZlcmlmeQotICAgIC8vIGNvbmRpdGlvbnMgb24gRi4gSXQgcHJvZHVjZXMgdGhlIGNsZWFyZXN0IGVycm9yIG1lc3NhZ2VzCi0gICAgLy8gaW4gbW9zdCBjb21waWxlcnMuCi0gICAgLy8gSW1wbCByZWFsbHkgYmVsb25ncyBpbiB0aGlzIHNjb3BlIGFzIGEgbG9jYWwgY2xhc3MgYnV0IGNhbid0Ci0gICAgLy8gYmVjYXVzZSBNU1ZDIHByb2R1Y2VzIGR1cGxpY2F0ZSBzeW1ib2xzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cwotICAgIC8vIGluIHRoaXMgY2FzZS4gVW50aWwgTVMgZml4ZXMgdGhhdCBidWcgd2UgcHV0IEltcGwgaW50byB0aGUgY2xhc3Mgc2NvcGUKLSAgICAvLyBhbmQgcHV0IHRoZSB0eXBlZGVmIGJvdGggaGVyZSAoZm9yIHVzZSBpbiBhc3NlcnQgc3RhdGVtZW50KSBhbmQKLSAgICAvLyBpbiB0aGUgSW1wbCBjbGFzcy4gQnV0IGJvdGggZGVmaW5pdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygKLSAgICAgICAgIWlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgdXNlX1JldHVyblJlZl9pbnN0ZWFkX29mX1JldHVybl90b19yZXR1cm5fYV9yZWZlcmVuY2UpOwotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8UiwgRj4odmFsdWVfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIFJldHVybih4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSXywgdHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gICAgLy8gVGhlIGltcGxpY2l0IGNhc3QgaXMgbmVjZXNzYXJ5IHdoZW4gUmVzdWx0IGhhcyBtb3JlIHRoYW4gb25lCi0gICAgLy8gc2luZ2xlLWFyZ3VtZW50IGNvbnN0cnVjdG9yIChlLmcuIFJlc3VsdCBpcyBzdGQ6OnZlY3RvcjxpbnQ+KSBhbmQgUgotICAgIC8vIGhhcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciB0ZW1wbGF0ZS4gIEluIHRoYXQgY2FzZSwgdmFsdWVfKHZhbHVlKQotICAgIC8vIHdvbid0IGNvbXBpbGUgYXMgdGhlIGNvbXBpbGVyIGRvZXNuJ3Qga25vd24gd2hpY2ggY29uc3RydWN0b3Igb2YKLSAgICAvLyBSZXN1bHQgdG8gY2FsbC4gIEltcGxpY2l0Q2FzdF8gZm9yY2VzIHRoZSBjb21waWxlciB0byBjb252ZXJ0IFIgdG8KLSAgICAvLyBSZXN1bHQgd2l0aG91dCBjb25zaWRlcmluZyBleHBsaWNpdCBjb25zdHJ1Y3RvcnMsIHRodXMgcmVzb2x2aW5nIHRoZQotICAgIC8vIGFtYmlndWl0eS4gdmFsdWVfIGlzIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgaXRzIGNvcHkgY29uc3RydWN0b3IuCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBsaW5rZWRfcHRyPFI+JiB2YWx1ZSkKLSAgICAgICAgOiB2YWx1ZV9iZWZvcmVfY2FzdF8oKnZhbHVlKSwKLSAgICAgICAgICB2YWx1ZV8oSW1wbGljaXRDYXN0XzxSZXN1bHQ+KHZhbHVlX2JlZm9yZV9jYXN0XykpIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7IHJldHVybiB2YWx1ZV87IH0KLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oIWlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0X2Nhbm5vdF9iZV9hX3JlZmVyZW5jZV90eXBlKTsKLSAgICAvLyBXZSBzYXZlIHRoZSB2YWx1ZSBiZWZvcmUgY2FzdGluZyBqdXN0IGluIGNhc2UgaXQgaXMgYmVpbmcgY2FzdCB0byBhCi0gICAgLy8gd3JhcHBlciB0eXBlLgotICAgIFIgdmFsdWVfYmVmb3JlX2Nhc3RfOwotICAgIFJlc3VsdCB2YWx1ZV87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEltcGwpOwotICB9OwotCi0gIC8vIFBhcnRpYWxseSBzcGVjaWFsaXplIGZvciBCeU1vdmVXcmFwcGVyLiBUaGlzIHZlcnNpb24gb2YgUmV0dXJuQWN0aW9uIHdpbGwKLSAgLy8gbW92ZSBpdHMgY29udGVudHMgaW5zdGVhZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJfLCB0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsPEJ5TW92ZVdyYXBwZXI8Ul8+LCBGPiA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBsaW5rZWRfcHRyPFI+JiB3cmFwcGVyKQotICAgICAgICA6IHBlcmZvcm1lZF8oZmFsc2UpLCB3cmFwcGVyXyh3cmFwcGVyKSB7fQotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgewotICAgICAgR1RFU1RfQ0hFQ0tfKCFwZXJmb3JtZWRfKQotICAgICAgICAgIDw8ICJBIEJ5TW92ZSgpIGFjdGlvbiBzaG91bGQgb25seSBiZSBwZXJmb3JtZWQgb25jZS4iOwotICAgICAgcGVyZm9ybWVkXyA9IHRydWU7Ci0gICAgICByZXR1cm4gaW50ZXJuYWw6Om1vdmUod3JhcHBlcl8tPnBheWxvYWQpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBib29sIHBlcmZvcm1lZF87Ci0gICAgY29uc3QgbGlua2VkX3B0cjxSPiB3cmFwcGVyXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgY29uc3QgbGlua2VkX3B0cjxSPiB2YWx1ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5BY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuTnVsbCgpIGFjdGlvbi4KLWNsYXNzIFJldHVybk51bGxBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQWxsb3dzIFJldHVybk51bGwoKSB0byBiZSB1c2VkIGluIGFueSBwb2ludGVyLXJldHVybmluZyBmdW5jdGlvbi4gSW4gQysrMTEKLSAgLy8gdGhpcyBpcyBlbmZvcmNlZCBieSByZXR1cm5pbmcgbnVsbHB0ciwgYW5kIGluIG5vbi1DKysxMSBieSBhc3NlcnRpbmcgYQotICAvLyBwb2ludGVyIHR5cGUgb24gY29tcGlsZSB0aW1lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsKLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0jZWxzZQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcG9pbnRlcjxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuTnVsbF9jYW5fYmVfdXNlZF90b19yZXR1cm5fYV9wb2ludGVyX29ubHkpOwotICAgIHJldHVybiBOVUxMOwotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIFJldHVybigpIGFjdGlvbi4KLWNsYXNzIFJldHVyblZvaWRBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQWxsb3dzIFJldHVybigpIHRvIGJlIHVzZWQgaW4gYW55IHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBzdGF0aWMgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7Ci0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOwotICB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBSZXR1cm5SZWYoeCkgYWN0aW9uLCB3aGljaCBjYW4gYmUgdXNlZAotLy8gaW4gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB4LAotLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQgdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJldHVyblJlZkFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgUmV0dXJuUmVmQWN0aW9uIG9iamVjdCBmcm9tIHRoZSByZWZlcmVuY2UgdG8gYmUgcmV0dXJuZWQuCi0gIGV4cGxpY2l0IFJldHVyblJlZkFjdGlvbihUJiByZWYpIDogcmVmXyhyZWYpIHt9ICAvLyBOT0xJTlQKLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgUmV0dXJuUmVmKHgpIHRvIGJlCi0gIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB4J3MgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UuICBUaGlzCi0gICAgLy8gY2F0Y2hlcyB0aGUgdXNlciBlcnJvciBvZiB1c2luZyBSZXR1cm5SZWYoeCkgd2hlbiBSZXR1cm4oeCkKLSAgICAvLyBzaG91bGQgYmUgdXNlZCwgYW5kIGdlbmVyYXRlcyBzb21lIGhlbHBmdWwgZXJyb3IgbWVzc2FnZS4KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX1JldHVybl9pbnN0ZWFkX29mX1JldHVyblJlZl90b19yZXR1cm5fYV92YWx1ZSk7Ci0gICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxGPihyZWZfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIFJldHVyblJlZih4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKFQmIHJlZikgOiByZWZfKHJlZikge30gIC8vIE5PTElOVAotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgewotICAgICAgcmV0dXJuIHJlZl87Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIFQmIHJlZl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIFQmIHJlZl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5SZWZBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgUmV0dXJuUmVmT2ZDb3B5KHgpIGFjdGlvbiwgd2hpY2ggY2FuIGJlCi0vLyB1c2VkIGluIGFueSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2YgeCwKLS8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGFyZ3VtZW50IHR5cGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZXR1cm5SZWZPZkNvcHlBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIFJldHVyblJlZk9mQ29weUFjdGlvbiBvYmplY3QgZnJvbSB0aGUgcmVmZXJlbmNlIHRvCi0gIC8vIGJlIHJldHVybmVkLgotICBleHBsaWNpdCBSZXR1cm5SZWZPZkNvcHlBY3Rpb24oY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fSAgLy8gTk9MSU5UCi0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIFJldHVyblJlZk9mQ29weSh4KSB0byBiZQotICAvLyB1c2VkIGluIEFOWSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8geCdzIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcmVmZXJlbmNlLiAgVGhpcwotICAgIC8vIGNhdGNoZXMgdGhlIHVzZXIgZXJyb3Igb2YgdXNpbmcgUmV0dXJuUmVmT2ZDb3B5KHgpIHdoZW4gUmV0dXJuKHgpCi0gICAgLy8gc2hvdWxkIGJlIHVzZWQsIGFuZCBnZW5lcmF0ZXMgc29tZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICBpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAotICAgICAgICB1c2VfUmV0dXJuX2luc3RlYWRfb2ZfUmV0dXJuUmVmT2ZDb3B5X3RvX3JldHVybl9hX3ZhbHVlKTsKLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KHZhbHVlXykpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBJbXBsZW1lbnRzIHRoZSBSZXR1cm5SZWZPZkNvcHkoeCkgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdHlwZSBGLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9ICAvLyBOT0xJTlQKLQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsKLSAgICAgIHJldHVybiB2YWx1ZV87Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIFQgdmFsdWVfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICBjb25zdCBUIHZhbHVlXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJldHVyblJlZk9mQ29weUFjdGlvbik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBEb0RlZmF1bHQoKSBhY3Rpb24uCi1jbGFzcyBEb0RlZmF1bHRBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIERvRGVmYXVsdCgpIHRvIGJlCi0gIC8vIHVzZWQgaW4gYW55IGZ1bmN0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gQWN0aW9uPEY+KE5VTEwpOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBc3NpZ24gYWN0aW9uIHRvIHNldCBhIGdpdmVuIHBvaW50ZXIgcmVmZXJlbnQgdG8gYQotLy8gcGFydGljdWxhciB2YWx1ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1jbGFzcyBBc3NpZ25BY3Rpb24gewotIHB1YmxpYzoKLSAgQXNzaWduQWN0aW9uKFQxKiBwdHIsIFQyIHZhbHVlKSA6IHB0cl8ocHRyKSwgdmFsdWVfKHZhbHVlKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIHZvaWQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSBjb25zdCB7Ci0gICAgKnB0cl8gPSB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFQxKiBjb25zdCBwdHJfOwotICBjb25zdCBUMiB2YWx1ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBc3NpZ25BY3Rpb24pOwotfTsKLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBJbXBsZW1lbnRzIHRoZSBTZXRFcnJub0FuZFJldHVybiBhY3Rpb24gdG8gc2ltdWxhdGUgcmV0dXJuIGZyb20KLS8vIHZhcmlvdXMgc3lzdGVtIGNhbGxzIGFuZCBsaWJjIGZ1bmN0aW9ucy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24gewotIHB1YmxpYzoKLSAgU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24oaW50IGVycm5vX3ZhbHVlLCBUIHJlc3VsdCkKLSAgICAgIDogZXJybm9fKGVycm5vX3ZhbHVlKSwKLSAgICAgICAgcmVzdWx0XyhyZXN1bHQpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIC8qIGFyZ3MgKi8pIGNvbnN0IHsKLSAgICBlcnJubyA9IGVycm5vXzsKLSAgICByZXR1cm4gcmVzdWx0XzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgaW50IGVycm5vXzsKLSAgY29uc3QgVCByZXN1bHRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24pOwotfTsKLQotI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotLy8gSW1wbGVtZW50cyB0aGUgU2V0QXJndW1lbnRQb2ludGVlPE4+KHgpIGFjdGlvbiBmb3IgYW55IGZ1bmN0aW9uCi0vLyB3aG9zZSBOLXRoIGFyZ3VtZW50ICgwLWJhc2VkKSBpcyBhIHBvaW50ZXIgdG8geCdzIHR5cGUuICBUaGUKLS8vIHRlbXBsYXRlIHBhcmFtZXRlciBrSXNQcm90byBpcyB0cnVlIGlmZiB0eXBlIEEgaXMgUHJvdG9jb2xNZXNzYWdlLAotLy8gcHJvdG8yOjpNZXNzYWdlLCBvciBhIHN1Yi1jbGFzcyBvZiB0aG9zZS4KLXRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgQSwgYm9vbCBrSXNQcm90bz4KLWNsYXNzIFNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGFuIGFjdGlvbiB0aGF0IHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlCi0gIC8vIE4tdGggZnVuY3Rpb24gYXJndW1lbnQgdG8gJ3ZhbHVlJy4KLSAgZXhwbGljaXQgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKGNvbnN0IEEmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotICAgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFJlc3VsdD4oKTsKLSAgICAqOjp0ZXN0aW5nOjpnZXQ8Tj4oYXJncykgPSB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEEgdmFsdWVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgUHJvdG8+Ci1jbGFzcyBTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248TiwgUHJvdG8sIHRydWU+IHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUKLSAgLy8gTi10aCBmdW5jdGlvbiBhcmd1bWVudCB0byAncHJvdG8nLiAgQm90aCBQcm90b2NvbE1lc3NhZ2UgYW5kCi0gIC8vIHByb3RvMjo6TWVzc2FnZSBoYXZlIHRoZSBDb3B5RnJvbSgpIG1ldGhvZCwgc28gdGhlIHNhbWUKLSAgLy8gaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIGJvdGguCi0gIGV4cGxpY2l0IFNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbihjb25zdCBQcm90byYgcHJvdG8pIDogcHJvdG9fKG5ldyBQcm90bykgewotICAgIHByb3RvXy0+Q29weUZyb20ocHJvdG8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsKLSAgICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCBSZXN1bHQ+KCk7Ci0gICAgOjp0ZXN0aW5nOjpnZXQ8Tj4oYXJncyktPkNvcHlGcm9tKCpwcm90b18pOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxQcm90bz4gcHJvdG9fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZVdpdGhvdXRBcmdzKGYpIGFjdGlvbi4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAotLy8gRnVuY3Rpb25JbXBsIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIGYsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYQotLy8gZnVuY3Rpb24gcG9pbnRlciBvciBhIGZ1bmN0b3IuICBJbnZva2VXaXRob3V0QXJncyhmKSBjYW4gYmUgdXNlZCBhcyBhbgotLy8gQWN0aW9uPEY+IGFzIGxvbmcgYXMgZidzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEYgKGkuZS4gZiBjYW4gYmUKLS8vIGFzc2lnbmVkIHRvIGEgdHIxOjpmdW5jdGlvbjxGPikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JbXBsPgotY2xhc3MgSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yIG1ha2VzIGEgY29weSBvZiBmdW5jdGlvbl9pbXBsIChlaXRoZXIgYSBmdW5jdGlvbgotICAvLyBwb2ludGVyIG9yIGEgZnVuY3RvcikuCi0gIGV4cGxpY2l0IEludm9rZVdpdGhvdXRBcmdzQWN0aW9uKEZ1bmN0aW9uSW1wbCBmdW5jdGlvbl9pbXBsKQotICAgICAgOiBmdW5jdGlvbl9pbXBsXyhmdW5jdGlvbl9pbXBsKSB7fQotCi0gIC8vIEFsbG93cyBJbnZva2VXaXRob3V0QXJncyhmKSB0byBiZSB1c2VkIGFzIGFueSBhY3Rpb24gd2hvc2UgdHlwZSBpcwotICAvLyBjb21wYXRpYmxlIHdpdGggZi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsgcmV0dXJuIGZ1bmN0aW9uX2ltcGxfKCk7IH0KLQotIHByaXZhdGU6Ci0gIEZ1bmN0aW9uSW1wbCBmdW5jdGlvbl9pbXBsXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEludm9rZVdpdGhvdXRBcmdzQWN0aW9uKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZVdpdGhvdXRBcmdzKG9iamVjdF9wdHIsICZDbGFzczo6TWV0aG9kKSBhY3Rpb24uCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLWNsYXNzIEludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIEludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikKLSAgICAgIDogb2JqX3B0cl8ob2JqX3B0ciksIG1ldGhvZF9wdHJfKG1ldGhvZF9wdHIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIGNvbnN0IHsKLSAgICByZXR1cm4gKG9ial9wdHJfLT4qbWV0aG9kX3B0cl8pKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIENsYXNzKiBjb25zdCBvYmpfcHRyXzsKLSAgY29uc3QgTWV0aG9kUHRyIG1ldGhvZF9wdHJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgSWdub3JlUmVzdWx0KGFjdGlvbikgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEE+Ci1jbGFzcyBJZ25vcmVSZXN1bHRBY3Rpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSWdub3JlUmVzdWx0QWN0aW9uKGNvbnN0IEEmIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgewotICAgIC8vIEFzc2VydCBzdGF0ZW1lbnQgYmVsb25ncyBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSB0byB2ZXJpZnkKLSAgICAvLyBjb25kaXRpb25zIG9uIEYuIEl0IHByb2R1Y2VzIHRoZSBjbGVhcmVzdCBlcnJvciBtZXNzYWdlcwotICAgIC8vIGluIG1vc3QgY29tcGlsZXJzLgotICAgIC8vIEltcGwgcmVhbGx5IGJlbG9uZ3MgaW4gdGhpcyBzY29wZSBhcyBhIGxvY2FsIGNsYXNzIGJ1dCBjYW4ndAotICAgIC8vIGJlY2F1c2UgTVNWQyBwcm9kdWNlcyBkdXBsaWNhdGUgc3ltYm9scyBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMKLSAgICAvLyBpbiB0aGlzIGNhc2UuIFVudGlsIE1TIGZpeGVzIHRoYXQgYnVnIHdlIHB1dCBJbXBsIGludG8gdGhlIGNsYXNzIHNjb3BlCi0gICAgLy8gYW5kIHB1dCB0aGUgdHlwZWRlZiBib3RoIGhlcmUgKGZvciB1c2UgaW4gYXNzZXJ0IHN0YXRlbWVudCkgYW5kCi0gICAgLy8gaW4gdGhlIEltcGwgY2xhc3MuIEJ1dCBib3RoIGRlZmluaXRpb25zIG11c3QgYmUgdGhlIHNhbWUuCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0KLSAgICAvLyBBc3NlcnRzIGF0IGNvbXBpbGUgdGltZSB0aGF0IEYgcmV0dXJucyB2b2lkLgotICAgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFJlc3VsdD4oKTsKLQotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4oYWN0aW9uXykpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IEEmIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICAgIHZpcnR1YWwgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24gYW5kIGlnbm9yZXMgaXRzIHJlc3VsdC4KLSAgICAgIGFjdGlvbl8uUGVyZm9ybShhcmdzKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gVHlwZSBPcmlnaW5hbEZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIEYgZXhjZXB0IHRoYXQgaXRzIHJldHVybgotICAgIC8vIHR5cGUgaXMgSWdub3JlZFZhbHVlLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlCi0gICAgICAgIE9yaWdpbmFsRnVuY3Rpb247Ci0KLSAgICBjb25zdCBBY3Rpb248T3JpZ2luYWxGdW5jdGlvbj4gYWN0aW9uXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgY29uc3QgQSBhY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSWdub3JlUmVzdWx0QWN0aW9uKTsKLX07Ci0KLS8vIEEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byB0eXBlIFQsCi0vLyB3aGljaCBjYW4gYmUgZWl0aGVyIGNvbnN0IG9yIG5vdC4gIEl0IGNhbiBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZAotLy8gZnJvbSwgYW5kIGltcGxpY2l0bHkgY29udmVydGVkIHRvLCBhIFQmLiAgVW5saWtlIGEgcmVmZXJlbmNlLAotLy8gUmVmZXJlbmNlV3JhcHBlcjxUPiBjYW4gYmUgY29waWVkIGFuZCBjYW4gc3Vydml2ZSB0ZW1wbGF0ZSB0eXBlCi0vLyBpbmZlcmVuY2UuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBieS1yZWZlcmVuY2UgYXJndW1lbnRzIGluIHRoZQotLy8gSW52b2tlQXJndW1lbnQ8Tj4oLi4uKSBhY3Rpb24uICBUaGUgaWRlYSB3YXMgZnJvbSAicmVmZXJlbmNlCi0vLyB3cmFwcGVycyIgaW4gdHIxLCB3aGljaCB3ZSBkb24ndCBoYXZlIGluIG91ciBzb3VyY2UgdHJlZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJlZmVyZW5jZVdyYXBwZXIgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIFJlZmVyZW5jZVdyYXBwZXI8VD4gb2JqZWN0IGZyb20gYSBUJi4KLSAgZXhwbGljaXQgUmVmZXJlbmNlV3JhcHBlcihUJiBsX3ZhbHVlKSA6IHBvaW50ZXJfKCZsX3ZhbHVlKSB7fSAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIGEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgdG8gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KLSAgLy8gYSBUJi4KLSAgb3BlcmF0b3IgVCYoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcl87IH0KLSBwcml2YXRlOgotICBUKiBwb2ludGVyXzsKLX07Ci0KLS8vIEFsbG93cyB0aGUgZXhwcmVzc2lvbiBCeVJlZih4KSB0byBiZSBwcmludGVkIGFzIGEgcmVmZXJlbmNlIHRvIHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUHJpbnRUbyhjb25zdCBSZWZlcmVuY2VXcmFwcGVyPFQ+JiByZWYsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBUJiB2YWx1ZSA9IHJlZjsKLSAgVW5pdmVyc2FsUHJpbnRlcjxUJj46OlByaW50KHZhbHVlLCBvcyk7Ci19Ci0KLS8vIERvZXMgdHdvIGFjdGlvbnMgc2VxdWVudGlhbGx5LiAgVXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBEb0FsbChhMSwKLS8vIGEyLCAuLi4pIGFjdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yPgotY2xhc3MgRG9Cb3RoQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIERvQm90aEFjdGlvbihBY3Rpb24xIGFjdGlvbjEsIEFjdGlvbjIgYWN0aW9uMikKLSAgICAgIDogYWN0aW9uMV8oYWN0aW9uMSksIGFjdGlvbjJfKGFjdGlvbjIpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIERvQWxsKGExLCAuLi4sIGFfbikKLSAgLy8gdG8gYmUgdXNlZCBpbiBBTlkgZnVuY3Rpb24gb2YgY29tcGF0aWJsZSB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgewotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4oYWN0aW9uMV8sIGFjdGlvbjJfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIERvQWxsKC4uLikgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdHlwZSBGLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46Ok1ha2VSZXN1bHRWb2lkIFZvaWRSZXN1bHQ7Ci0KLSAgICBJbXBsKGNvbnN0IEFjdGlvbjxWb2lkUmVzdWx0PiYgYWN0aW9uMSwgY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24yKQotICAgICAgICA6IGFjdGlvbjFfKGFjdGlvbjEpLCBhY3Rpb24yXyhhY3Rpb24yKSB7fQotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgICBhY3Rpb24xXy5QZXJmb3JtKGFyZ3MpOwotICAgICAgcmV0dXJuIGFjdGlvbjJfLlBlcmZvcm0oYXJncyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IEFjdGlvbjxWb2lkUmVzdWx0PiBhY3Rpb24xXzsKLSAgICBjb25zdCBBY3Rpb248Rj4gYWN0aW9uMl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIEFjdGlvbjEgYWN0aW9uMV87Ci0gIEFjdGlvbjIgYWN0aW9uMl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhEb0JvdGhBY3Rpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEFuIFVudXNlZCBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuCi0vLyBUaGlzIGlzIGhhbmR5IHdoZW4gZGVmaW5pbmcgYWN0aW9ucyB0aGF0IGlnbm9yZSBzb21lIG9yIGFsbCBvZiB0aGUKLS8vIG1vY2sgZnVuY3Rpb24gYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGdpdmVuCi0vLwotLy8gICBNT0NLX01FVEhPRDMoRm9vLCBkb3VibGUoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7Ci0vLyAgIE1PQ0tfTUVUSE9EMyhCYXIsIGRvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkpOwotLy8KLS8vIGluc3RlYWQgb2YKLS8vCi0vLyAgIGRvdWJsZSBEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKGNvbnN0IHN0cmluZyYgbGFiZWwsIGRvdWJsZSB4LCBkb3VibGUgeSkgewotLy8gICAgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Ci0vLyAgIH0KLS8vICAgZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoSW5kZXgoaW50IGluZGV4LCBkb3VibGUgeCwgZG91YmxlIHkpIHsKLS8vICAgICByZXR1cm4gc3FydCh4KnggKyB5KnkpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQotLy8gICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKSk7Ci0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKLS8vICAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleCkpOwotLy8KLS8vIHlvdSBjb3VsZCB3cml0ZQotLy8KLS8vICAgLy8gV2UgY2FuIGRlY2xhcmUgYW55IHVuaW50ZXJlc3RpbmcgYXJndW1lbnQgYXMgVW51c2VkLgotLy8gICBkb3VibGUgRGlzdGFuY2VUb09yaWdpbihVbnVzZWQsIGRvdWJsZSB4LCBkb3VibGUgeSkgewotLy8gICAgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEZvbygiYWJjIiwgXywgXykpLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luKSk7Ci0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW4pKTsKLXR5cGVkZWYgaW50ZXJuYWw6Oklnbm9yZWRWYWx1ZSBVbnVzZWQ7Ci0KLS8vIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHVzIHRvIHR1cm4gYW4gQWN0aW9uPEZyb20+IG9iamVjdCBpbnRvIGFuCi0vLyBBY3Rpb248VG8+LCBhcyBsb25nIGFzIFRvJ3MgYXJndW1lbnRzIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZAotLy8gdG8gRnJvbSdzIGFuZCBGcm9tJ3MgcmV0dXJuIHR5cGUgY2FubiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gVG8ncy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotQWN0aW9uPFRvPjo6QWN0aW9uKGNvbnN0IEFjdGlvbjxGcm9tPiYgZnJvbSkKLSAgICA6IGltcGxfKG5ldyBpbnRlcm5hbDo6QWN0aW9uQWRhcHRvcjxUbywgRnJvbT4oZnJvbSkpIHt9Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyAndmFsdWUnLiAgJ3ZhbHVlJyBpcyBwYXNzZWQgYnkgdmFsdWUKLS8vIGluc3RlYWQgb2YgY29uc3QgcmVmZXJlbmNlIC0gb3RoZXJ3aXNlIFJldHVybigic3RyaW5nIGxpdGVyYWwiKQotLy8gd2lsbCB0cmlnZ2VyIGEgY29tcGlsZXIgZXJyb3IgYWJvdXQgdXNpbmcgYXJyYXkgYXMgaW5pdGlhbGl6ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWludGVybmFsOjpSZXR1cm5BY3Rpb248Uj4gUmV0dXJuKFIgdmFsdWUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpSZXR1cm5BY3Rpb248Uj4oaW50ZXJuYWw6Om1vdmUodmFsdWUpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIE5VTEwuCi1pbmxpbmUgUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6OlJldHVybk51bGxBY3Rpb24+IFJldHVybk51bGwoKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlJldHVybk51bGxBY3Rpb24oKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyBmcm9tIGEgdm9pZCBmdW5jdGlvbi4KLWlubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6UmV0dXJuVm9pZEFjdGlvbj4gUmV0dXJuKCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpSZXR1cm5Wb2lkQWN0aW9uKCkpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1pbmxpbmUgaW50ZXJuYWw6OlJldHVyblJlZkFjdGlvbjxSPiBSZXR1cm5SZWYoUiYgeCkgeyAgLy8gTk9MSU5UCi0gIHJldHVybiBpbnRlcm5hbDo6UmV0dXJuUmVmQWN0aW9uPFI+KHgpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgdGhlCi0vLyBhcmd1bWVudC4gIFRoZSBjb3B5IGlzIGNyZWF0ZWQgd2hlbiB0aGUgYWN0aW9uIGlzIGNvbnN0cnVjdGVkIGFuZAotLy8gbGl2ZXMgYXMgbG9uZyBhcyB0aGUgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1pbmxpbmUgaW50ZXJuYWw6OlJldHVyblJlZk9mQ29weUFjdGlvbjxSPiBSZXR1cm5SZWZPZkNvcHkoY29uc3QgUiYgeCkgewotICByZXR1cm4gaW50ZXJuYWw6OlJldHVyblJlZk9mQ29weUFjdGlvbjxSPih4KTsKLX0KLQotLy8gTW9kaWZpZXMgdGhlIHBhcmVudCBhY3Rpb24gKGEgUmV0dXJuKCkgYWN0aW9uKSB0byBwZXJmb3JtIGEgbW92ZSBvZiB0aGUKLS8vIGFyZ3VtZW50IGluc3RlYWQgb2YgYSBjb3B5LgotLy8gUmV0dXJuKEJ5TW92ZSgpKSBhY3Rpb25zIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UgYW5kIHdpbGwgYXNzZXJ0IHRoaXMKLS8vIGludmFyaWFudC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotaW50ZXJuYWw6OkJ5TW92ZVdyYXBwZXI8Uj4gQnlNb3ZlKFIgeCkgewotICByZXR1cm4gaW50ZXJuYWw6OkJ5TW92ZVdyYXBwZXI8Uj4oaW50ZXJuYWw6Om1vdmUoeCkpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRvZXMgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgZ2l2ZSBtb2NrIGZ1bmN0aW9uLgotaW5saW5lIGludGVybmFsOjpEb0RlZmF1bHRBY3Rpb24gRG9EZWZhdWx0KCkgewotICByZXR1cm4gaW50ZXJuYWw6OkRvRGVmYXVsdEFjdGlvbigpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgYnkgdGhlIE4tdGgKLS8vICgwLWJhc2VkKSBmdW5jdGlvbiBhcmd1bWVudCB0byAndmFsdWUnLgotdGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBUPgotUG9seW1vcnBoaWNBY3Rpb248Ci0gIGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgTiwgVCwgaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWU+ID4KLVNldEFyZ1BvaW50ZWUoY29uc3QgVCYgeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4oeCkpOwotfQotCi0jaWYgISgoR1RFU1RfR0NDX1ZFUl8gJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDAwMCkgfHwgR1RFU1RfT1NfU1lNQklBTikKLS8vIFRoaXMgb3ZlcmxvYWQgYWxsb3dzIFNldEFyZ1BvaW50ZWUoKSB0byBhY2NlcHQgYSBzdHJpbmcgbGl0ZXJhbC4KLS8vIEdDQyBwcmlvciB0byB0aGUgdmVyc2lvbiA0LjAgYW5kIFN5bWJpYW4gQysrIGNvbXBpbGVyIGNhbm5vdCBkaXN0aW5ndWlzaAotLy8gdGhpcyBvdmVybG9hZCBmcm9tIHRoZSB0ZW1wbGF0ZWQgdmVyc2lvbiBhbmQgZW1pdCBhIGNvbXBpbGUgZXJyb3IuCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1Qb2x5bW9ycGhpY0FjdGlvbjwKLSAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjxOLCBjb25zdCBjaGFyKiwgZmFsc2U+ID4KLVNldEFyZ1BvaW50ZWUoY29uc3QgY2hhciogcCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgICBOLCBjb25zdCBjaGFyKiwgZmFsc2U+KHApKTsKLX0KLQotdGVtcGxhdGUgPHNpemVfdCBOPgotUG9seW1vcnBoaWNBY3Rpb248Ci0gIGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248TiwgY29uc3Qgd2NoYXJfdCosIGZhbHNlPiA+Ci1TZXRBcmdQb2ludGVlKGNvbnN0IHdjaGFyX3QqIHApIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPAotICAgICAgTiwgY29uc3Qgd2NoYXJfdCosIGZhbHNlPihwKSk7Ci19Ci0jZW5kaWYKLQotLy8gVGhlIGZvbGxvd2luZyB2ZXJzaW9uIGlzIERFUFJFQ0FURUQuCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQ+Ci1Qb2x5bW9ycGhpY0FjdGlvbjwKLSAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKLSAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4gPgotU2V0QXJndW1lbnRQb2ludGVlKGNvbnN0IFQmIHgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPAotICAgICAgTiwgVCwgaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWU+KHgpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBzZXRzIGEgcG9pbnRlciByZWZlcmVudCB0byBhIGdpdmVuIHZhbHVlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpBc3NpZ25BY3Rpb248VDEsIFQyPiA+IEFzc2lnbihUMSogcHRyLCBUMiB2YWwpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6QXNzaWduQWN0aW9uPFQxLCBUMj4ocHRyLCB2YWwpKTsKLX0KLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgZXJybm8gYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGVycm9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1Qb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6U2V0RXJybm9BbmRSZXR1cm5BY3Rpb248VD4gPgotU2V0RXJybm9BbmRSZXR1cm4oaW50IGVycnZhbCwgVCByZXN1bHQpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpTZXRFcnJub0FuZFJldHVybkFjdGlvbjxUPihlcnJ2YWwsIHJlc3VsdCkpOwotfQotCi0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlV2l0aG91dEFyZ3MoKS4KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzICdmdW5jdGlvbl9pbXBsJyB3aXRoIG5vIGFyZ3VtZW50LgotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSW1wbD4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VXaXRob3V0QXJnc0FjdGlvbjxGdW5jdGlvbkltcGw+ID4KLUludm9rZVdpdGhvdXRBcmdzKEZ1bmN0aW9uSW1wbCBmdW5jdGlvbl9pbXBsKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oCi0gICAgICBpbnRlcm5hbDo6SW52b2tlV2l0aG91dEFyZ3NBY3Rpb248RnVuY3Rpb25JbXBsPihmdW5jdGlvbl9pbXBsKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgaW52b2tlcyB0aGUgZ2l2ZW4gbWV0aG9kIG9uIHRoZSBnaXZlbiBvYmplY3QKLS8vIHdpdGggbm8gYXJndW1lbnQuCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbjxDbGFzcywgTWV0aG9kUHRyPiA+Ci1JbnZva2VXaXRob3V0QXJncyhDbGFzcyogb2JqX3B0ciwgTWV0aG9kUHRyIG1ldGhvZF9wdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbjxDbGFzcywgTWV0aG9kUHRyPigKLSAgICAgICAgICBvYmpfcHRyLCBtZXRob2RfcHRyKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGVyZm9ybXMgYW5fYWN0aW9uIGFuZCB0aHJvd3MgYXdheSBpdHMKLS8vIHJlc3VsdC4gIEluIG90aGVyIHdvcmRzLCBpdCBjaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBhbl9hY3Rpb24gdG8KLS8vIHZvaWQuICBhbl9hY3Rpb24gTVVTVCBOT1QgcmV0dXJuIHZvaWQsIG9yIHRoZSBjb2RlIHdvbid0IGNvbXBpbGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KLWlubGluZSBpbnRlcm5hbDo6SWdub3JlUmVzdWx0QWN0aW9uPEE+IElnbm9yZVJlc3VsdChjb25zdCBBJiBhbl9hY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpJZ25vcmVSZXN1bHRBY3Rpb248QT4oYW5fYWN0aW9uKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHJlZmVyZW5jZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gTC12YWx1ZS4gIElmIG5lY2Vzc2FyeSwKLS8vIHlvdSBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuICBGb3IgZXhhbXBsZSwKLS8vIHN1cHBvc2UgJ2Rlcml2ZWQnIGlzIGFuIG9iamVjdCBvZiB0eXBlIERlcml2ZWQsIEJ5UmVmKGRlcml2ZWQpCi0vLyB3b3VsZCB3cmFwIGEgRGVyaXZlZCYuICBJZiB5b3Ugd2FudCB0byB3cmFwIGEgY29uc3QgQmFzZSYgaW5zdGVhZCwKLS8vIHdoZXJlIEJhc2UgaXMgYSBiYXNlIGNsYXNzIG9mIERlcml2ZWQsIGp1c3Qgd3JpdGU6Ci0vLwotLy8gICBCeVJlZjxjb25zdCBCYXNlPihkZXJpdmVkKQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ZXJuYWw6OlJlZmVyZW5jZVdyYXBwZXI8VD4gQnlSZWYoVCYgbF92YWx1ZSkgeyAgLy8gTk9MSU5UCi0gIHJldHVybiBpbnRlcm5hbDo6UmVmZXJlbmNlV3JhcHBlcjxUPihsX3ZhbHVlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KKyNlbmRpZiAgLy8gVEVTVElOR19HTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZWYzMC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgY2FyZGluYWxpdGllcy4gIE1vcmUKLS8vIGNhcmRpbmFsaXRpZXMgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgaW1wbGVtZW50aW5nIHRoZQotLy8gQ2FyZGluYWxpdHlJbnRlcmZhY2UgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeS4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0NBUkRJTkFMSVRJRVNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKLSNlbHNlCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBUbyBpbXBsZW1lbnQgYSBjYXJkaW5hbGl0eSBGb28sIGRlZmluZToKLS8vICAgMS4gYSBjbGFzcyBGb29DYXJkaW5hbGl0eSB0aGF0IGltcGxlbWVudHMgdGhlCi0vLyAgICAgIENhcmRpbmFsaXR5SW50ZXJmYWNlIGludGVyZmFjZSwgYW5kCi0vLyAgIDIuIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBDYXJkaW5hbGl0eSBvYmplY3QgZnJvbSBhCi0vLyAgICAgIGNvbnN0IEZvb0NhcmRpbmFsaXR5Ki4KLS8vCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIGZvbGxvd3MgdGhhdCBvZiBNYXRjaGVyLCBwcm92aWRpbmcKLS8vIGNvbnNpc3RlbmN5IGZvciBleHRlbnNpb24gZGV2ZWxvcGVycy4gIEl0IGFsc28gZWFzZXMgb3duZXJzaGlwCi0vLyBtYW5hZ2VtZW50IGFzIENhcmRpbmFsaXR5IG9iamVjdHMgY2FuIG5vdyBiZSBjb3BpZWQgbGlrZSBwbGFpbiB2YWx1ZXMuCi0KLS8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGNhcmRpbmFsaXR5LgotY2xhc3MgQ2FyZGluYWxpdHlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q2FyZGluYWxpdHlJbnRlcmZhY2UoKSB7fQotCi0gIC8vIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvbiB0aGUgbG93ZXIvdXBwZXIgYm91bmQgb2YgdGhlIG51bWJlciBvZgotICAvLyBjYWxscyBhbGxvd2VkLgotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVMb3dlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gSU5UX01BWDsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdGlzZnkgdGhpcyBjYXJkaW5hbGl0eS4KLSAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0ID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXR1cmF0ZSB0aGlzIGNhcmRpbmFsaXR5LgotICB2aXJ0dWFsIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOwotCi0gIC8vIERlc2NyaWJlcyBzZWxmIHRvIGFuIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotfTsKLQotLy8gQSBDYXJkaW5hbGl0eSBpcyBhIGNvcHlhYmxlIGFuZCBJTU1VVEFCTEUgKGV4Y2VwdCBieSBhc3NpZ25tZW50KQotLy8gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IHRpbWVzIGEgbW9jayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0bwotLy8gYmUgY2FsbGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIENhcmRpbmFsaXR5IGlzIGp1c3QgYSBsaW5rZWRfcHRyCi0vLyB0byBjb25zdCBDYXJkaW5hbGl0eUludGVyZmFjZSwgc28gY29weWluZyBpcyBmYWlybHkgY2hlYXAuCi0vLyBEb24ndCBpbmhlcml0IGZyb20gQ2FyZGluYWxpdHkhCi1jbGFzcyBHVEVTVF9BUElfIENhcmRpbmFsaXR5IHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBudWxsIGNhcmRpbmFsaXR5LiAgTmVlZGVkIGZvciBzdG9yaW5nIENhcmRpbmFsaXR5Ci0gIC8vIG9iamVjdHMgaW4gU1RMIGNvbnRhaW5lcnMuCi0gIENhcmRpbmFsaXR5KCkge30KLQotICAvLyBDb25zdHJ1Y3RzIGEgQ2FyZGluYWxpdHkgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uCi0gIGV4cGxpY2l0IENhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlKiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0KLSAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mCi0gIC8vIGNhbGxzIGFsbG93ZWQuCi0gIGludCBDb25zZXJ2YXRpdmVMb3dlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKTsgfQotICBpbnQgQ29uc2VydmF0aXZlVXBwZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCi0gIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+SXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCi0gIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+SXNTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIG92ZXItc2F0dXJhdGUgdGhpcwotICAvLyBjYXJkaW5hbGl0eSwgaS5lLiBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgY2FsbHMuCi0gIGJvb2wgSXNPdmVyU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKLSAgICByZXR1cm4gaW1wbF8tPklzU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudCkgJiYKLSAgICAgICAgIWltcGxfLT5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7IGltcGxfLT5EZXNjcmliZVRvKG9zKTsgfQotCi0gIC8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gYWN0dWFsIGNhbGwgY291bnQgdG8gYW4gb3N0cmVhbS4KLSAgc3RhdGljIHZvaWQgRGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhpbnQgYWN0dWFsX2NhbGxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotIHByaXZhdGU6Ci0gIGludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlPiBpbXBsXzsKLX07Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBsZWFzdCBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdExlYXN0KGludCBuKTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGF0IG1vc3QgbiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQXRNb3N0KGludCBuKTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGFueSBudW1iZXIgb2YgY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEFueU51bWJlcigpOwotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYmV0d2VlbiBtaW4gYW5kIG1heCBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQmV0d2VlbihpbnQgbWluLCBpbnQgbWF4KTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGV4YWN0bHkgbiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgRXhhY3RseShpbnQgbik7Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4KLWlubGluZSBDYXJkaW5hbGl0eSBNYWtlQ2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2UqIGMpIHsKLSAgcmV0dXJuIENhcmRpbmFsaXR5KGMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQ0FSRElOQUxJVElFU19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmggYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhODg5Yy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNzcgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgYSBzY3JpcHQuICBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgYWN0aW9ucy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEludm9rZUhlbHBlcjxGPiBrbm93cyBob3cgdG8gdW5wYWNrIGFuIE4tdHVwbGUgYW5kIGludm9rZSBhbiBOLWFyeQotLy8gZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhlIHVucGFja2VkIHZhbHVlcywgd2hlcmUgRiBpcyBhIGZ1bmN0aW9uCi0vLyB0eXBlIHRoYXQgdGFrZXMgTiBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotY2xhc3MgSW52b2tlSGVscGVyOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPD4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTw+JikgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8PiYpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTE+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTE+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMT4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTI+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMz4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzPiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsCi0gICAgICBBND4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNT4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCi0gICAgICBBNj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwKLSAgICAgIEE2LCBBNz4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE3PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw2PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCi0gICAgICBBNiwgQTcsIEE4PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw3PihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE4PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTk+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAotICAgICAgQTYsIEE3LCBBOCwgQTk+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTk+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCi0gICAgdHlwZW5hbWUgQTEwPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwKLSAgICBBMTA+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAotICAgICAgQTYsIEE3LCBBOCwgQTksIEExMD4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE5LCBBMTA+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsKLSAgfQotfTsKLQotLy8gQW4gSU5URVJOQUwgbWFjcm8gZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgb2YgYSB0dXBsZSBmaWVsZC4gIEl0J3MKLS8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUhCi0jZGVmaW5lIEdNT0NLX0ZJRUxEXyhUdXBsZSwgTikgXAotICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxOLCBUdXBsZT46OnR5cGUKLQotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQotLy8gdHlwZSBvZiBhbiBuLWFyeSBmdW5jdGlvbiB3aG9zZSBpLXRoICgxLWJhc2VkKSBhcmd1bWVudCB0eXBlIGlzIHRoZQotLy8ga3tpfS10aCAoMC1iYXNlZCkgZmllbGQgb2YgQXJndW1lbnRUdXBsZSwgd2hpY2ggbXVzdCBiZSBhIHR1cGxlCi0vLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCA6OnRlc3Rpbmc6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZSwgbG9uZz4sIDAsIDM+Ojp0eXBlCi0vLyBpcyBpbnQoYm9vbCwgbG9uZykuCi0vLwotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+OjpTZWxlY3QoYXJncykKLS8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLgotLy8gRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCB0dXBsZTxib29sLCBjaGFyLCBkb3VibGU+LCAyLCAwPjo6U2VsZWN0KAotLy8gICAgICAgOjp0ZXN0aW5nOjptYWtlX3R1cGxlKHRydWUsICdhJywgMi41KSkKLS8vIHJldHVybnMgdHVwbGUgKDIuNSwgdHJ1ZSkuCi0vLwotLy8gVGhlIG51bWJlcnMgaW4gbGlzdCBrMSwgazIsIC4uLiwga19uIG11c3QgYmUgPj0gMCwgd2hlcmUgbiBjYW4gYmUKLS8vIGluIHRoZSByYW5nZSBbMCwgMTBdLiAgRHVwbGljYXRlcyBhcmUgYWxsb3dlZCBhbmQgdGhleSBkb24ndCBoYXZlCi0vLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKLSAgICBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwgaW50IGs5LCBpbnQgazEwPgotY2xhc3MgU2VsZWN0QXJncyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazkpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxMCkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKLSAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSwgZ2V0PGsxMD4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncygpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazE+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazI+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMikpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazM+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMykpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLAotICAgICAgICBnZXQ8azQ+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKLSAgICBpbnQgazQsIGludCBrNT4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNj4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNz4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazcpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncyksCi0gICAgICAgIGdldDxrOD4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LCBpbnQgazk+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOSkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKLSAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSk7Ci0gIH0KLX07Ci0KLSN1bmRlZiBHTU9DS19GSUVMRF8KLQotLy8gSW1wbGVtZW50cyB0aGUgV2l0aEFyZ3MgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKLSAgICBpbnQgazkgPSAtMSwgaW50IGsxMCA9IC0xPgotY2xhc3MgV2l0aEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2l0aEFyZ3NBY3Rpb24oY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gTWFrZUFjdGlvbihuZXcgSW1wbDxGPihhY3Rpb25fKSk7IH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIDogYWN0aW9uXyhhY3Rpb24pIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIHJldHVybiBhY3Rpb25fLlBlcmZvcm0oU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgazMsIGs0LAotICAgICAgICAgIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6U2VsZWN0KGFyZ3MpKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6dHlwZSBJbm5lckZ1bmN0aW9uVHlwZTsKLQotICAgIEFjdGlvbjxJbm5lckZ1bmN0aW9uVHlwZT4gYWN0aW9uXzsKLSAgfTsKLQotICBjb25zdCBJbm5lckFjdGlvbiBhY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2l0aEFyZ3NBY3Rpb24pOwotfTsKLQotLy8gQSBtYWNybyBmcm9tIHRoZSBBQ1RJT04qIGZhbWlseSAoZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUpCi0vLyBkZWZpbmVzIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbi4gIFR5cGljYWxseSwKLS8vIHRoZXNlIGFjdGlvbnMgb25seSBjYXJlIGFib3V0IGEgc3Vic2V0IG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHN1Y2ggYW4gYWN0aW9uIG9ubHkgdXNlcyB0aGUgc2Vjb25kCi0vLyBhcmd1bWVudCwgaXQgY2FuIGJlIHVzZWQgaW4gYW55IG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyA+PSAyCi0vLyBhcmd1bWVudHMgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBjb21wYXRpYmxlLgotLy8KLS8vIFRoZXJlZm9yZSwgdGhlIGFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHByZXBhcmVkIHRvIHRha2UgbW9yZQotLy8gYXJndW1lbnRzIHRoYW4gaXQgbmVlZHMuICBUaGUgRXhjZXNzaXZlQXJnIHR5cGUgaXMgdXNlZCB0bwotLy8gcmVwcmVzZW50IHRob3NlIGV4Y2Vzc2l2ZSBhcmd1bWVudHMuICBJbiBvcmRlciB0byBrZWVwIHRoZSBjb21waWxlcgotLy8gZXJyb3IgbWVzc2FnZXMgdHJhY3RhYmxlLCB3ZSBkZWZpbmUgaXQgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlCi0vLyBpbnN0ZWFkIG9mIHRlc3Rpbmc6OmludGVybmFsLiAgSG93ZXZlciwgdGhpcyBpcyBhbiBJTlRFUk5BTCBUWVBFCi0vLyBhbmQgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIGEgdXNlciBNVVNUIE5PVCBVU0UgVEhJUwotLy8gVFlQRSBESVJFQ1RMWS4KLXN0cnVjdCBFeGNlc3NpdmVBcmcge307Ci0KLS8vIEEgaGVscGVyIGNsYXNzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBQ1RJT04qIG1hY3Jvcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIGNsYXNzIEltcGw+Ci1jbGFzcyBBY3Rpb25IZWxwZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8PiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDw+KGFyZ3MsIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMD4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTA+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwPihhcmdzLCBnZXQ8MD4oYXJncyksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMT4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExPiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTE+KGFyZ3MsIGdldDwwPihhcmdzKSwKLSAgICAgICAgZ2V0PDE+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTI+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTI+KGFyZ3MsIGdldDwwPihhcmdzKSwKLSAgICAgICAgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwKLSAgICAgIEEzPiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMz4oYXJncywgZ2V0PDA+KGFyZ3MpLAotICAgICAgICBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLAotICAgICAgQTQ+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBND4oYXJncywKLSAgICAgICAgZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTU+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1PiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMywgQTQsIEE1PihhcmdzLAotICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKLSAgICAgICAgZ2V0PDU+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLCBBMywgQTQsCi0gICAgICBBNSwgQTY+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PihhcmdzLAotICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKLSAgICAgICAgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1LCBBNiwgQTc+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LAotICAgICAgICBBNz4oYXJncywgZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLAotICAgICAgICBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1LCBBNiwgQTcsIEE4PiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsCi0gICAgICAgIEE4PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLCBBMywgQTQsCi0gICAgICBBNSwgQTYsIEE3LCBBOCwgQTk+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICAgIEE5PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLAotICAgICAgICBnZXQ8OT4oYXJncykpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgotCi0vLyBXaXRoQXJnczxOMSwgTjIsIC4uLiwgTms+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMKLS8vIHRoZSBzZWxlY3RlZCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZAotLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aAotLy8gZGlmZmVyZW50IGFyZ3VtZW50IGxpc3RzLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0IGFyZ3VtZW50cyBmb3IKLS8vIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLXRlbXBsYXRlIDxpbnQgazEsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazE+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxPihhY3Rpb24pOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyPgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazI+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQ+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0PihhY3Rpb24pOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1PgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazU+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsCi0gICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNz4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwKLSAgICAgIGs3PihhY3Rpb24pOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCi0gICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazg+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LAotICAgICAgazg+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICBpbnQgazksIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOT4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgICAgazk+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICBpbnQgazksIGludCBrMTAsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgIGs5LCBrMTA+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgIGs5LCBrMTA+KGFjdGlvbik7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZG9lcyBhY3Rpb25zIGExLCBhMiwgLi4uLCBzZXF1ZW50aWFsbHkgaW4KLS8vIGVhY2ggaW52b2NhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yPgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4oYTEsIGEyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjM+Ci1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsCi0gICAgQWN0aW9uMz4gPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMykgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgQWN0aW9uND4gPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0KSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIEFjdGlvbjU+ID4gPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1KSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNj4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIEFjdGlvbjY+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYpIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNz4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKLSAgICBBY3Rpb243PiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNykgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKLSAgICB0eXBlbmFtZSBBY3Rpb244PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNywgQWN0aW9uOD4gPiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCkgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLAotICAgIHR5cGVuYW1lIEFjdGlvbjQsIHR5cGVuYW1lIEFjdGlvbjUsIHR5cGVuYW1lIEFjdGlvbjYsIHR5cGVuYW1lIEFjdGlvbjcsCi0gICAgdHlwZW5hbWUgQWN0aW9uOCwgdHlwZW5hbWUgQWN0aW9uOT4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOCwKLSAgICBBY3Rpb245PiA+ID4gPiA+ID4gPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1LCBBY3Rpb242IGE2LAotICAgIEFjdGlvbjcgYTcsIEFjdGlvbjggYTgsIEFjdGlvbjkgYTkpIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKLSAgICB0eXBlbmFtZSBBY3Rpb244LCB0eXBlbmFtZSBBY3Rpb245LCB0eXBlbmFtZSBBY3Rpb24xMD4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjksIEFjdGlvbjEwPiA+ID4gPiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCwgQWN0aW9uOSBhOSwgQWN0aW9uMTAgYTEwKSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gVGhlIEFDVElPTiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bwotLy8gZGVmaW5lIGN1c3RvbSBhY3Rpb25zIGVhc2lseS4gIFRoZSBzeW50YXg6Ci0vLwotLy8gICBBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gd2lsbCBkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKLS8vIHN0YXRlbWVudHMuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSB1c2VkIGFzCi0vLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4KLS8vIHJlZmVyIHRvIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBieQotLy8gJ2FyZ0snLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ0tfdHlwZScuICBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIEFDVElPTihJbmNyZW1lbnRBcmcxKSB7Ci0vLyAgICAgYXJnMV90eXBlIHRlbXAgPSBhcmcxOwotLy8gICAgIHJldHVybiArKygqdGVtcCk7Ci0vLyAgIH0KLS8vCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlCi0vLwotLy8gICAuLi5XaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOwotLy8KLS8vIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgZW50aXJlIGFyZ3VtZW50IHR1cGxlIGFuZCBpdHMgdHlwZSBieQotLy8gJ2FyZ3MnIGFuZCAnYXJnc190eXBlJywgYW5kIHJlZmVyIHRvIHRoZSBtb2NrIGZ1bmN0aW9uIHR5cGUgYW5kIGl0cwotLy8gcmV0dXJuIHR5cGUgYnkgJ2Z1bmN0aW9uX3R5cGUnIGFuZCAncmV0dXJuX3R5cGUnLgotLy8KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgotLy8gYXJndW1lbnRzLiAgSG93ZXZlciByZXN0IGFzc3VyZWQgdGhhdCB5b3VyIGNvZGUgaXMgc3RpbGwgdHlwZS1zYWZlOgotLy8geW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmICphcmcxIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgKysKLS8vIG9wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiArKygqYXJnMSkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQotLy8gbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBmb3IgZXhhbXBsZS4KLS8vCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBhY3Rpb24uICAgRm9yIHRoYXQgeW91IGNhbiB1c2UKLS8vIGFub3RoZXIgbWFjcm86Ci0vLwotLy8gICBBQ1RJT05fUChuYW1lLCBwYXJhbV9uYW1lKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIEFDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KLS8vCi0vLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKLS8vCi0vLyAgIC4uLldpbGxPbmNlKEFkZCg1KSk7Ci0vLwotLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgotLy8gZWl0aGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkCi0vLyAnZm9vJywgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mCi0vLyBBQ1RJT05fUChBZGQsIG4pIGFib3ZlLCB5b3UgY2FuIHdyaXRlICduX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlCi0vLyBvZiAnbicuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIEFDVElPTl9QMiwgQUNUSU9OX1AzLCAuLi4sIHVwIHRvIEFDVElPTl9QMTAgdG8gc3VwcG9ydAotLy8gbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuCi0vLwotLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3Ci0vLwotLy8gICBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyAuLi4gfQotLy8KLS8vIGFzIHNob3J0aGFuZCBmb3IKLS8vCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+Ci0vLyAgIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4gRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQotLy8KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMKLS8vIGV4cGxpY2l0bHkgd2hlbiBpbnZva2luZyBGb28oKSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsIGZhbHNlKTsKLS8vIGFsdGhvdWdoIHVzdWFsbHkgeW91IGNhbiByZWx5IG9uIHRoZSBjb21waWxlciB0byBpbmZlciB0aGUgdHlwZXMKLS8vIGZvciB5b3UgYXV0b21hdGljYWxseS4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbgotLy8gRm9vKHAxLCAuLi4sIHBrKSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLAotLy8gcGtfdHlwZT4uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgYWN0aW9ucy4KLS8vCi0vLyBZb3UgY2FuIGFsc28gb3ZlcmxvYWQgYWN0aW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6Ci0vLwotLy8gICBBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9Ci0vLyAgIEFDVElPTl9QMihQbHVzLCBhLCBiKSB7IC4uLiB9Ci0vLwotLy8gV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBBQ1RJT04qIG1hY3JvcyB3aGVuIGRlZmluaW5nCi0vLyBhIG5ldyBhY3Rpb24sIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlCi0vLyBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvCi0vLyB1c2UgdGhlIGFjdGlvbiBhIGxvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssCi0vLyB0aGV5IGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KLS8vIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvCi0vLyBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkKLS8vIGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQKLS8vIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBDQVZFQVQ6Ci0vLwotLy8gQUNUSU9OKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCi0vLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIEFDVElPTiooKSBpbnNpZGUKLS8vIGEgZnVuY3Rpb24uCi0vLwotLy8gTU9SRSBJTkZPUk1BVElPTjoKLS8vCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ0FDVElPTicKLS8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCi0KLS8vIEFuIGludGVybmFsIG1hY3JvIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIEFDVElPTiooKS4KLSNkZWZpbmUgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEX1wKLSAgICBjb25zdCBhcmdzX3R5cGUmIGFyZ3MgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmcwX3R5cGUgYXJnMCBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzFfdHlwZSBhcmcxIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnMl90eXBlIGFyZzIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmczX3R5cGUgYXJnMyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzRfdHlwZSBhcmc0IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnNV90eXBlIGFyZzUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmc2X3R5cGUgYXJnNiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzdfdHlwZSBhcmc3IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnOF90eXBlIGFyZzggR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmc5X3R5cGUgYXJnOSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotCi0vLyBTb21ldGltZXMgeW91IHdhbnQgdG8gZ2l2ZSBhbiBhY3Rpb24gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycwotLy8gdGhhdCBjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgdmFsdWUgcGFyYW1ldGVycy4gIEFDVElPTigpIGFuZAotLy8gQUNUSU9OX1AqKCkgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgQUNUSU9OX1RFTVBMQVRFKCkgcmVtZWRpZXMgdGhhdAotLy8gYW5kIGNhbiBiZSB2aWV3ZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIEFDVElPTigpIGFuZCBBQ1RJT05fUCooKS4KLS8vCi0vLyBUaGUgc3ludGF4OgotLy8KLS8vICAgQUNUSU9OX1RFTVBMQVRFKEFjdGlvbk5hbWUsCi0vLyAgICAgICAgICAgICAgICAgICBIQVNfbV9URU1QTEFURV9QQVJBTVMoa2luZDEsIG5hbWUxLCAuLi4sIGtpbmRfbSwgbmFtZV9tKSwKLS8vICAgICAgICAgICAgICAgICAgIEFORF9uX1ZBTFVFX1BBUkFNUyhwMSwgLi4uLCBwX24pKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBkZWZpbmVzIGFuIGFjdGlvbiB0ZW1wbGF0ZSB0aGF0IHRha2VzIG0gZXhwbGljaXQgdGVtcGxhdGUKLS8vIHBhcmFtZXRlcnMgYW5kIG4gdmFsdWUgcGFyYW1ldGVycy4gIG5hbWVfaSBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aAotLy8gdGVtcGxhdGUgcGFyYW1ldGVyLCBhbmQga2luZF9pIHNwZWNpZmllcyB3aGV0aGVyIGl0J3MgYSB0eXBlbmFtZSwKLS8vIGFuIGludGVncmFsIGNvbnN0YW50LCBvciBhIHRlbXBsYXRlLiAgcF9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoCi0vLyB2YWx1ZSBwYXJhbWV0ZXIuCi0vLwotLy8gRXhhbXBsZToKLS8vCi0vLyAgIC8vIER1cGxpY2F0ZUFyZzxrLCBUPihvdXRwdXQpIGNvbnZlcnRzIHRoZSBrLXRoIGFyZ3VtZW50IG9mIHRoZSBtb2NrCi0vLyAgIC8vIGZ1bmN0aW9uIHRvIHR5cGUgVCBhbmQgY29waWVzIGl0IHRvICpvdXRwdXQuCi0vLyAgIEFDVElPTl9URU1QTEFURShEdXBsaWNhdGVBcmcsCi0vLyAgICAgICAgICAgICAgICAgICBIQVNfMl9URU1QTEFURV9QQVJBTVMoaW50LCBrLCB0eXBlbmFtZSwgVCksCi0vLyAgICAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMob3V0cHV0KSkgewotLy8gICAgICpvdXRwdXQgPSBUKDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLS8vICAgfQotLy8gICAuLi4KLS8vICAgICBpbnQgbjsKLS8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXykpCi0vLyAgICAgICAgIC5XaWxsT25jZShEdXBsaWNhdGVBcmc8MSwgdW5zaWduZWQgY2hhcj4oJm4pKTsKLS8vCi0vLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRlbXBsYXRlLCB3cml0ZToKLS8vCi0vLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tPih2MSwgLi4uLCB2X24pCi0vLwotLy8gd2hlcmUgdGhlIHRzIGFyZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0aGUgdnMgYXJlIHRoZSB2YWx1ZQotLy8gYXJndW1lbnRzLiAgVGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzIGFyZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuCi0vLyBJZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzLCB5b3UgY2FuCi0vLyBwcm92aWRlIGFkZGl0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzOgotLy8KLS8vICAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20sIHUxLCAuLi4sIHVfaz4odjEsIC4uLiwgdl9uKQotLy8KLS8vIHdoZXJlIHVfaSBpcyB0aGUgZGVzaXJlZCB0eXBlIG9mIHZfaS4KLS8vCi0vLyBBQ1RJT05fVEVNUExBVEUgYW5kIEFDVElPTi9BQ1RJT05fUCogY2FuIGJlIG92ZXJsb2FkZWQgb24gdGhlCi0vLyBudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycywgYnV0IG5vdCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlCi0vLyBwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGUgcmVzdHJpY3Rpb24sIHRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcKLS8vIGlzIHVuY2xlYXI6Ci0vLwotLy8gICBPdmVybG9hZGVkQWN0aW9uPGludCwgYm9vbD4oeCk7Ci0vLwotLy8gQXJlIHdlIHVzaW5nIGEgc2luZ2xlLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgJ2Jvb2wnIHJlZmVycwotLy8gdG8gdGhlIHR5cGUgb2YgeCwgb3IgYXJlIHdlIHVzaW5nIGEgdHdvLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24KLS8vIHdoZXJlIHRoZSBjb21waWxlciBpcyBhc2tlZCB0byBpbmZlciB0aGUgdHlwZSBvZiB4PwotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgotLy8KLS8vIEdNT0NLX0lOVEVSTkFMXypfSEFTX21fVEVNUExBVEVfUEFSQU1TIGFuZAotLy8gR01PQ0tfSU5URVJOQUxfKl9BTkRfbl9WQUxVRV9QQVJBTVMgYXJlIGludGVybmFsIG1hY3JvcyBmb3IKLS8vIGltcGxlbWVudGluZyBBQ1RJT05fVEVNUExBVEUuICBUaGUgbWFpbiB0cmljayB3ZSB1c2UgaXMgdG8gY3JlYXRlCi0vLyBuZXcgbWFjcm8gaW52b2NhdGlvbnMgd2hlbiBleHBhbmRpbmcgYSBtYWNyby4gIEZvciBleGFtcGxlLCB3ZSBoYXZlCi0vLwotLy8gICAjZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcykKLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zIC4uLgotLy8KLS8vIHdoaWNoIGNhdXNlcyBBQ1RJT05fVEVNUExBVEUoLi4uLCBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLCAuLi4pCi0vLyB0byBleHBhbmQgdG8KLS8vCi0vLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpIC4uLgotLy8KLS8vIFNpbmNlIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzFfVEVNUExBVEVfUEFSQU1TIGlzIGEgbWFjcm8sIHRoZQotLy8gcHJlcHJvY2Vzc29yIHdpbGwgY29udGludWUgdG8gZXhwYW5kIGl0IHRvCi0vLwotLy8gICAgICAgLi4uIHR5cGVuYW1lIFQgLi4uCi0vLwotLy8gVGhpcyB0ZWNobmlxdWUgY29uZm9ybXMgdG8gdGhlIEMrKyBzdGFuZGFyZCBhbmQgaXMgcG9ydGFibGUuICBJdAotLy8gYWxsb3dzIHVzIHRvIGltcGxlbWVudCBhY3Rpb24gdGVtcGxhdGVzIHVzaW5nIE8oTikgY29kZSwgd2hlcmUgTiBpcwotLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRlbXBsYXRlL3ZhbHVlIHBhcmFtZXRlcnMgc3VwcG9ydGVkLiAgV2l0aG91dAotLy8gdXNpbmcgaXQsIHdlJ2QgaGF2ZSB0byBkZXZvdGUgTyhOXjIpIGFtb3VudCBvZiBjb2RlIHRvIGltcGxlbWVudCBhbGwKLS8vIGNvbWJpbmF0aW9ucyBvZiBtIGFuZCBuLgotCi0vLyBEZWNsYXJlcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwKSBraW5kMCBuYW1lMAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18yX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcCi0gICAgbmFtZTEpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18zX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMikga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU180X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzKSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBcCi0gICAga2luZDMgbmFtZTMKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfNV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIFwKLSAgICBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzZfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1KSBraW5kMCBuYW1lMCwgXAotICAgIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU183X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKLSAgICBuYW1lNikga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBcCi0gICAga2luZDUgbmFtZTUsIGtpbmQ2IG5hbWU2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKLSAgICBraW5kNywgbmFtZTcpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIGtpbmQzIG5hbWUzLCBcCi0gICAga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1LCBraW5kNiBuYW1lNiwga2luZDcgbmFtZTcKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfOV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXAotICAgIGtpbmQ3LCBuYW1lNywga2luZDgsIG5hbWU4KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBcCi0gICAga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwga2luZDYgbmFtZTYsIGtpbmQ3IG5hbWU3LCBcCi0gICAga2luZDggbmFtZTgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMTBfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKLSAgICBuYW1lMSwga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXAotICAgIG5hbWU2LCBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCwga2luZDksIG5hbWU5KSBraW5kMCBuYW1lMCwgXAotICAgIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwgXAotICAgIGtpbmQ2IG5hbWU2LCBraW5kNyBuYW1lNywga2luZDggbmFtZTgsIGtpbmQ5IG5hbWU5Ci0KLS8vIExpc3RzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18xX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTApIG5hbWUwCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzJfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKLSAgICBuYW1lMSkgbmFtZTAsIG5hbWUxCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzNfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyKSBuYW1lMCwgbmFtZTEsIG5hbWUyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzRfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzVfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIFwKLSAgICBuYW1lNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU182X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSkgbmFtZTAsIG5hbWUxLCBcCi0gICAgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfN19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBcCi0gICAgbmFtZTYpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKLSAgICBraW5kNywgbmFtZTcpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2LCBuYW1lNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU185X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIG5hbWU2LCBcCi0gICAga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIFwKLSAgICBuYW1lNiwgbmFtZTcsIG5hbWU4Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzEwX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcCi0gICAgbmFtZTEsIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKLSAgICBuYW1lNiwga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgsIGtpbmQ5LCBuYW1lOSkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgXAotICAgIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2LCBuYW1lNywgbmFtZTgsIG5hbWU5Ci0KLS8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgLCB0eXBlbmFtZSBwMCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpICwgXAotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgLCBcCi0gICAgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNikgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHA2IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcsIHA4KSAsIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYsIHA3LCBwOCwgcDkpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMiMjX3R5cGUsIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDUjI190eXBlLCB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHA4IyNfdHlwZSwgdHlwZW5hbWUgcDkjI190eXBlCi0KLS8vIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8wX1ZBTFVFX1BBUkFNUygpXAotICAgICgpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMikKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSlcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNilcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNikKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCi0gICAgICAgIHA3KGdtb2NrX3A3KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3LCBwOClcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAotICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAotICAgICAgICBwOChnbW9ja19wOCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSlcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCi0gICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcCi0gICAgICAgIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpCi0KLS8vIERlY2xhcmVzIHRoZSBmaWVsZHMgZm9yIHN0b3JpbmcgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMDsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBwMCMjX3R5cGUgcDA7IFwKLSAgICBwMSMjX3R5cGUgcDE7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIHAwIyNfdHlwZSBwMDsgXAotICAgIHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwOyBcCi0gICAgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIFwKLSAgICBwNCkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBwNCMjX3R5cGUgcDQ7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgXAotICAgIHA1KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAotICAgIHA1IyNfdHlwZSBwNTsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAotICAgIHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAotICAgIHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IFwKLSAgICBwNCMjX3R5cGUgcDQ7IHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7IHA4IyNfdHlwZSBwODsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBcCi0gICAgcDQjI190eXBlIHA0OyBwNSMjX3R5cGUgcDU7IHA2IyNfdHlwZSBwNjsgcDcjI190eXBlIHA3OyBwOCMjX3R5cGUgcDg7IFwKLSAgICBwOSMjX3R5cGUgcDk7Ci0KLS8vIExpc3RzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8wX1ZBTFVFX1BBUkFNUygpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSBwMAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwLCBwMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCwgcDEsIHAyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBwMCwgcDEsIHAyLCBwMwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpIHAwLCBwMSwgXAotICAgIHAyLCBwMywgcDQKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgcDAsIFwKLSAgICBwMSwgcDIsIHAzLCBwNCwgcDUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgpIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkKLQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlciB0eXBlcy4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8wX1ZBTFVFX1BBUkFNUygpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMV9WQUxVRV9QQVJBTVMocDApICwgcDAjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSAsIHAwIyNfdHlwZSwgXAotICAgIHAxIyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpICwgcDAjI190eXBlLCBcCi0gICAgcDEjI190eXBlLCBwMiMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgLCBcCi0gICAgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwKLSAgICBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpICwgXAotICAgIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBwNSMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgXAotICAgIHA2IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNywgcDgpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNywgcDgsIHA5KSAsIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGUKLQotLy8gRGVjbGFyZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwIyNfdHlwZSBwMCwgXAotICAgIHAxIyNfdHlwZSBwMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCMjX3R5cGUgcDAsIFwKLSAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwLCBcCi0gICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgXAotICAgIHA0KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIFwKLSAgICBwNSkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIFwKLSAgICBwNSMjX3R5cGUgcDUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgXAotICAgIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcpIHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBcCi0gICAgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3LCBwOCkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwKLSAgICBwOSMjX3R5cGUgcDkKLQotLy8gVGhlIHN1ZmZpeCBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8wX1ZBTFVFX1BBUkFNUygpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgUAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBQMgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgUDMKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBQNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSBQNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgUDYKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSBQNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNykgUDgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4KSBQOQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgUDEwCi0KLS8vIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4KLSNkZWZpbmUgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8obmFtZSMjQWN0aW9uLCBHTU9DS19JTlRFUk5BTF9DT1VOVF8jI3ZhbHVlX3BhcmFtcykKLQotI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpXAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIGNsYXNzIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSB7XAotICAgcHVibGljOlwKLSAgICBleHBsaWNpdCBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPEY+KEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpKTtcCi0gICAgfVwKLSAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgaW5saW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCi0gICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdmFsdWVfcGFyYW1zKSB7XAotICAgIHJldHVybiBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+KFwKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz46Omdtb2NrX0ltcGw8Rj46OlwKLSAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OKG5hbWUpXAotICBjbGFzcyBuYW1lIyNBY3Rpb24ge1wKLSAgIHB1YmxpYzpcCi0gICAgbmFtZSMjQWN0aW9uKCkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKCkge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPigpKTtcCi0gICAgfVwKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uKTtcCi0gIH07XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uIG5hbWUoKSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb24oKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb246Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QKG5hbWUsIHAwKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAge1wKLSAgIHB1YmxpYzpcCi0gICAgZXhwbGljaXQgbmFtZSMjQWN0aW9uUChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZXhwbGljaXQgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwKSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QPHAwIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDApIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPihwMCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1AyKG5hbWUsIHAwLCBwMSlcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAyIHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICBwMShnbW9ja19wMSkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICAgIHAxKGdtb2NrX3AxKSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxKSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QMik7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblAyPHAwIyNfdHlwZSwgcDEjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxKSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QMyhuYW1lLCBwMCwgcDEsIHAyKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QMyB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QMyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDMpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMikge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBwMik7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgXAotICAgICAgICAgIHAyIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QNChuYW1lLCBwMCwgcDEsIHAyLCBwMylcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QNCB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QNChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgICAgcDMoZ21vY2tfcDMpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzKSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDQpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAotICAgICAgcDMjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIFwKLSAgICAgIHAzIyNfdHlwZSBwMykge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlPihwMCwgcDEsIFwKLSAgICAgICAgcDIsIHAzKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAotICAgICAgICAgIHAzIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QNShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QNSB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QNShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgXAotICAgICAgICBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICAgIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNSk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgIHA0IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QNihuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QNiB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QNihwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDYpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXAotICAgICAgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSkge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A3KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA3IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA3KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBcCi0gICAgICAgIHA2KGdtb2NrX3A2KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgICAgcDYpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNyk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIFwKLSAgICAgIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgXAotICAgICAgcDYjI190eXBlIHA2KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgICAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A4KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNylcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA4IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA4KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIFwKLSAgICAgICAgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCi0gICAgICAgIHA3KGdtb2NrX3A3KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIFwKLSAgICAgICAgICBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIFwKLSAgICAgICAgICBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgICAgcDYsIHA3KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgcDYjI190eXBlIHA2O1wKLSAgICBwNyMjX3R5cGUgcDc7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QOCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKLSAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgIHA2LCBwNyk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXAotICAgICAgICAgIHA3IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QOShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QOSB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QOShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgcDgoZ21vY2tfcDgpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBcCi0gICAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICAgcDgjI190eXBlIHA4O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgICBwNiwgcDcsIHA4KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgcDYjI190eXBlIHA2O1wKLSAgICBwNyMjX3R5cGUgcDc7XAotICAgIHA4IyNfdHlwZSBwODtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA5KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgcDgjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcCi0gICAgICBwOCMjX3R5cGUgcDgpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZT4ocDAsIHAxLCBwMiwgXAotICAgICAgICBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgICAgIHA4IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QMTAobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDkjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDEwIHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpLCBwOChnbW9ja19wOCksIHA5KGdtb2NrX3A5KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCi0gICAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgICBwOCMjX3R5cGUgcDg7XAotICAgICAgcDkjI190eXBlIHA5O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgICBwNiwgcDcsIHA4LCBwOSkpO1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgcDcjI190eXBlIHA3O1wKLSAgICBwOCMjX3R5cGUgcDg7XAotICAgIHA5IyNfdHlwZSBwOTtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblAxMCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAotICAgICAgcDkjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwKLSAgICAgIHA5IyNfdHlwZSBwOSkge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgcDkjI190eXBlPihwMCwgXAotICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICAgICAgcDkjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotCi0vLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKLS8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KLS8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybwotLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCi0vLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkKLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQotI2VuZGlmCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VBcmd1bWVudDxOPigpLgotLy8KLS8vIFRoZSBJbnZva2VBcmd1bWVudDxOPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gaW52b2tlcyB0aGUgTi10aAotLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgay1hcnkgY2FsbGFibGUsIG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbiwgd2l0aCBhcmd1bWVudHMgYTEsIGEyLCAuLi4sIGFfay4KLS8vCi0vLyBOb3RlczoKLS8vCi0vLyAgIDEuIFRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBieSB2YWx1ZSBieSBkZWZhdWx0LiAgSWYgeW91IG5lZWQgdG8KLS8vICAgcGFzcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIEJ5UmVmKCkuICBGb3IKLS8vICAgZXhhbXBsZSwKLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MT4oNSwgc3RyaW5nKCJIZWxsbyIpLCBCeVJlZihmb28pKQotLy8KLS8vICAgcGFzc2VzIDUgYW5kIHN0cmluZygiSGVsbG8iKSBieSB2YWx1ZSwgYW5kIHBhc3NlcyBmb28gYnkKLS8vICAgcmVmZXJlbmNlLgotLy8KLS8vICAgMi4gSWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBidXQgQnlSZWYoKSBpcwotLy8gICBub3QgdXNlZCwgaXQgd2lsbCByZWNlaXZlIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZSwKLS8vICAgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgMC10aAotLy8gICBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24KLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RyaW5nKCJIZWxsbyIpKQotLy8KLS8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGEKLS8vICAgcmVmZXJlbmNlIG9mIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0ZW1wb3Jhcnkgb2JqZWN0LAotLy8gICB0byB0aGUgY2FsbGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KLS8vICAgSW52b2tlQXJndW1lbnQgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQKLS8vICAgbGF0ZXIuCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50IHsKLQotLy8gQXBwZWFycyBpbiBJbnZva2VBcmd1bWVudEFkbCdzIGFyZ3VtZW50IGxpc3QgdG8gaGVscCBhdm9pZAotLy8gYWNjaWRlbnRhbCBjYWxscyB0byB1c2VyIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgotc3RydWN0IEFkbFRhZyB7fTsKLQotLy8gSW52b2tlQXJndW1lbnRBZGwgLSBhIGhlbHBlciBmb3IgSW52b2tlQXJndW1lbnQuCi0vLyBUaGUgYmFzaWMgb3ZlcmxvYWRzIGFyZSBwcm92aWRlZCBoZXJlIGZvciBnZW5lcmljIGZ1bmN0b3JzLgotLy8gT3ZlcmxvYWRzIGZvciBvdGhlciBjdXN0b20tY2FsbGFibGVzIGFyZSBwcm92aWRlZCBpbiB0aGUKLS8vIGludGVybmFsL2N1c3RvbS9jYWxsYmFjay1hY3Rpb25zLmggaGVhZGVyLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRj4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYpIHsKLSAgcmV0dXJuIGYoKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMT4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYsIEExIGExKSB7Ci0gIHJldHVybiBmKGExKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIpIHsKLSAgcmV0dXJuIGYoYTEsIGEyKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMykgewotICByZXR1cm4gZihhMSwgYTIsIGEzKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIHsKLSAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNikgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwKLSAgICBBNyBhNykgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAotICAgIEE3IGE3LCBBOCBhOCkgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAotICAgIHR5cGVuYW1lIEE5PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwKLSAgICBBNyBhNywgQTggYTgsIEE5IGE5KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAotICAgIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAotICAgIEE3IGE3LCBBOCBhOCwgQTkgYTksIEExMCBhMTApIHsKLSAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbnZva2VfYXJndW1lbnQKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMyk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNyk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpOwotfQotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgUmV0dXJuTmV3PFQ+KCkuCi0vLwotLy8gVGhlIFJldHVybk5ldzxUPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcKLS8vIGluc3RhbmNlIG9mIHR5cGUgVCwgY29uc3RydWN0ZWQgb24gdGhlIGhlYXAgd2l0aCBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLS8vIGExLCBhMiwgLi4uLCBhbmQgYV9rLiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgewotICByZXR1cm4gbmV3IFQoKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSk7Ci19Ci0KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gSW5jbHVkZSBhbnkgY3VzdG9tIGFjdGlvbnMgYWRkZWQgYnkgdGhlIGxvY2FsIGluc3RhbGxhdGlvbi4KLS8vIFdlIG11c3QgaW5jbHVkZSB0aGlzIGhlYWRlciBhdCB0aGUgZW5kIHRvIG1ha2Ugc3VyZSBpdCBjYW4gdXNlIHRoZQotLy8gZGVjbGFyYXRpb25zIGZyb20gdGhpcyBmaWxlLgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAgYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ5ZjlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSw3OTQgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLgotJCQKLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgotJCR9fSBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIGVkaXRvcnMuCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIHZhcmlhZGljIGFjdGlvbnMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1hY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJbnZva2VIZWxwZXI8Rj4ga25vd3MgaG93IHRvIHVucGFjayBhbiBOLXR1cGxlIGFuZCBpbnZva2UgYW4gTi1hcnkKLS8vIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aXRoIHRoZSB1bnBhY2tlZCB2YWx1ZXMsIHdoZXJlIEYgaXMgYSBmdW5jdGlvbgotLy8gdHlwZSB0aGF0IHRha2VzIE4gYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLWNsYXNzIEludm9rZUhlbHBlcjsKLQotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgdHlwZXMgPSBbWyRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV1dXQotJHZhciBhcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgYXJncyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyBhcmdzXV1dXQotJHZhciBnZXRzID0gW1skZm9yIGosIFtbZ2V0PCQoaiAtIDEpPihhcmdzKV1dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVzPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8JGFzPiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPCRhcz4mJGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCRnZXRzKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8JGFzPiYkYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKSgkZ2V0cyk7Ci0gIH0KLX07Ci0KLQotXV0KLS8vIEFuIElOVEVSTkFMIG1hY3JvIGZvciBleHRyYWN0aW5nIHRoZSB0eXBlIG9mIGEgdHVwbGUgZmllbGQuICBJdCdzCi0vLyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFIQotI2RlZmluZSBHTU9DS19GSUVMRF8oVHVwbGUsIE4pIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8TiwgVHVwbGU+Ojp0eXBlCi0KLSRyYW5nZSBpIDEuLm4KLQotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQotLy8gdHlwZSBvZiBhbiBuLWFyeSBmdW5jdGlvbiB3aG9zZSBpLXRoICgxLWJhc2VkKSBhcmd1bWVudCB0eXBlIGlzIHRoZQotLy8ga3tpfS10aCAoMC1iYXNlZCkgZmllbGQgb2YgQXJndW1lbnRUdXBsZSwgd2hpY2ggbXVzdCBiZSBhIHR1cGxlCi0vLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCA6OnRlc3Rpbmc6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZSwgbG9uZz4sIDAsIDM+Ojp0eXBlCi0vLyBpcyBpbnQoYm9vbCwgbG9uZykuCi0vLwotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+OjpTZWxlY3QoYXJncykKLS8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLgotLy8gRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCB0dXBsZTxib29sLCBjaGFyLCBkb3VibGU+LCAyLCAwPjo6U2VsZWN0KAotLy8gICAgICAgOjp0ZXN0aW5nOjptYWtlX3R1cGxlKHRydWUsICdhJywgMi41KSkKLS8vIHJldHVybnMgdHVwbGUgKDIuNSwgdHJ1ZSkuCi0vLwotLy8gVGhlIG51bWJlcnMgaW4gbGlzdCBrMSwgazIsIC4uLiwga19uIG11c3QgYmUgPj0gMCwgd2hlcmUgbiBjYW4gYmUKLS8vIGluIHRoZSByYW5nZSBbMCwgJG5dLiAgRHVwbGljYXRlcyBhcmUgYWxsb3dlZCBhbmQgdGhleSBkb24ndCBoYXZlCi0vLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgJGZvciBpLCBbW2ludCBrJGldXT4KLWNsYXNzIFNlbGVjdEFyZ3MgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZSgkZm9yIGksIFtbR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGskaSldXSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncygkZm9yIGksIFtbZ2V0PGskaT4oYXJncyldXSk7Ci0gIH0KLX07Ci0KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5uCi0kcmFuZ2UgajEgMS4uaS0xCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlJGZvciBqMVtbLCBpbnQgayRqMV1dPgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgICRmb3IgaiwgW1skaWYgaiA8PSBpLTEgW1trJGpdXSAkZWxzZSBbWy0xXV1dXT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZSgkZm9yIGoxLCBbW0dNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrJGoxKV1dKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIFtbXV0KLSRpZiBpID09IDEgW1svKiBhcmdzICovXV0gJGVsc2UgW1thcmdzXV0pIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKCRmb3IgajEsIFtbZ2V0PGskajE+KGFyZ3MpXV0pOwotICB9Ci19OwotCi0KLV1dCi0jdW5kZWYgR01PQ0tfRklFTERfCi0KLSR2YXIga3MgPSBbWyRmb3IgaSwgW1trJGldXV1dCi0KLS8vIEltcGxlbWVudHMgdGhlIFdpdGhBcmdzIGFjdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lckFjdGlvbiwgJGZvciBpLCBbW2ludCBrJGkgPSAtMV1dPgotY2xhc3MgV2l0aEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2l0aEFyZ3NBY3Rpb24oY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gTWFrZUFjdGlvbihuZXcgSW1wbDxGPihhY3Rpb25fKSk7IH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIDogYWN0aW9uXyhhY3Rpb24pIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIHJldHVybiBhY3Rpb25fLlBlcmZvcm0oU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsICRrcz46OlNlbGVjdChhcmdzKSk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICRrcz46OnR5cGUgSW5uZXJGdW5jdGlvblR5cGU7Ci0KLSAgICBBY3Rpb248SW5uZXJGdW5jdGlvblR5cGU+IGFjdGlvbl87Ci0gIH07Ci0KLSAgY29uc3QgSW5uZXJBY3Rpb24gYWN0aW9uXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFdpdGhBcmdzQWN0aW9uKTsKLX07Ci0KLS8vIEEgbWFjcm8gZnJvbSB0aGUgQUNUSU9OKiBmYW1pbHkgKGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlKQotLy8gZGVmaW5lcyBhbiBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIG1vY2sgZnVuY3Rpb24uICBUeXBpY2FsbHksCi0vLyB0aGVzZSBhY3Rpb25zIG9ubHkgY2FyZSBhYm91dCBhIHN1YnNldCBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpZiBzdWNoIGFuIGFjdGlvbiBvbmx5IHVzZXMgdGhlIHNlY29uZAotLy8gYXJndW1lbnQsIGl0IGNhbiBiZSB1c2VkIGluIGFueSBtb2NrIGZ1bmN0aW9uIHRoYXQgdGFrZXMgPj0gMgotLy8gYXJndW1lbnRzIHdoZXJlIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgY29tcGF0aWJsZS4KLS8vCi0vLyBUaGVyZWZvcmUsIHRoZSBhY3Rpb24gaW1wbGVtZW50YXRpb24gbXVzdCBiZSBwcmVwYXJlZCB0byB0YWtlIG1vcmUKLS8vIGFyZ3VtZW50cyB0aGFuIGl0IG5lZWRzLiAgVGhlIEV4Y2Vzc2l2ZUFyZyB0eXBlIGlzIHVzZWQgdG8KLS8vIHJlcHJlc2VudCB0aG9zZSBleGNlc3NpdmUgYXJndW1lbnRzLiAgSW4gb3JkZXIgdG8ga2VlcCB0aGUgY29tcGlsZXIKLS8vIGVycm9yIG1lc3NhZ2VzIHRyYWN0YWJsZSwgd2UgZGVmaW5lIGl0IGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZQotLy8gaW5zdGVhZCBvZiB0ZXN0aW5nOjppbnRlcm5hbC4gIEhvd2V2ZXIsIHRoaXMgaXMgYW4gSU5URVJOQUwgVFlQRQotLy8gYW5kIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBhIHVzZXIgTVVTVCBOT1QgVVNFIFRISVMKLS8vIFRZUEUgRElSRUNUTFkuCi1zdHJ1Y3QgRXhjZXNzaXZlQXJnIHt9OwotCi0vLyBBIGhlbHBlciBjbGFzcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0aGUgQUNUSU9OKiBtYWNyb3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCBjbGFzcyBJbXBsPgotY2xhc3MgQWN0aW9uSGVscGVyIHsKLSBwdWJsaWM6Ci0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkKLQotW1sKLSR2YXIgdGVtcGxhdGUgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sKLSRyYW5nZSBqIDAuLmktMQotICB0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIEEkal1dPgotXV1dXQotJHJhbmdlIGogMC4uaS0xCi0kdmFyIEFzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBhcyA9IFtbJGZvciBqLCBbW2dldDwkaj4oYXJncyldXV1dCi0kcmFuZ2UgayAxLi5uLWkKLSR2YXIgZWFzID0gW1skZm9yIGssIFtbRXhjZXNzaXZlQXJnKCldXV1dCi0kdmFyIGFyZ19saXN0ID0gW1skaWYgKGk9PTApIHwgKGk9PW4pIFtbJGFzJGVhc11dICRlbHNlIFtbJGFzLCAkZWFzXV1dXQotJHRlbXBsYXRlCi0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPCRBcz4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8JEFzPihhcmdzLCAkYXJnX2xpc3QpOwotICB9Ci0KLV1dCi19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgotCi0vLyBXaXRoQXJnczxOMSwgTjIsIC4uLiwgTms+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMKLS8vIHRoZSBzZWxlY3RlZCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZAotLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aAotLy8gZGlmZmVyZW50IGFyZ3VtZW50IGxpc3RzLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0IGFyZ3VtZW50cyBmb3IKLS8vIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLQotJHJhbmdlIGkgMS4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi10ZW1wbGF0ZSA8JGZvciBqIFtbaW50IGskaiwgXV10eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24kZm9yIGogW1ssIGskal1dPgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uJGZvciBqIFtbLCBrJGpdXT4oYWN0aW9uKTsKLX0KLQotCi1dXQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkb2VzIGFjdGlvbnMgYTEsIGEyLCAuLi4sIHNlcXVlbnRpYWxseSBpbgotLy8gZWFjaCBpbnZvY2F0aW9uLgotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAyLi5pCi0kdmFyIHR5cGVzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgQWN0aW9uJGpdXV1dCi0kdmFyIEFhcyA9IFtbJGZvciBqIFtbLCBBY3Rpb24kaiBhJGpdXV1dCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCAkdHlwZXM+Ci0kcmFuZ2UgayAxLi5pLTEKLQotaW5saW5lICRmb3IgayBbW2ludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uJGssIF1dQWN0aW9uJGkkZm9yIGsgIFtbPl1dCi0KLURvQWxsKEFjdGlvbjEgYTEkQWFzKSB7Ci0kaWYgaT09MiBbWwotCi0gIHJldHVybiBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIEFjdGlvbjI+KGExLCBhMik7Ci1dXSAkZWxzZSBbWwotJHJhbmdlIGoyIDIuLmkKLQotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKCRmb3IgajIsIFtbYSRqMl1dKSk7Ci1dXQotCi19Ci0KLV1dCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIFRoZSBBQ1RJT04qIGZhbWlseSBvZiBtYWNyb3MgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUgdG8KLS8vIGRlZmluZSBjdXN0b20gYWN0aW9ucyBlYXNpbHkuICBUaGUgc3ludGF4OgotLy8KLS8vICAgQUNUSU9OKG5hbWUpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIHdpbGwgZGVmaW5lIGFuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlCi0vLyBzdGF0ZW1lbnRzLiAgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBzdGF0ZW1lbnRzIHdpbGwgYmUgdXNlZCBhcwotLy8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLiAgSW5zaWRlIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuCi0vLyByZWZlciB0byB0aGUgSy10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYnkKLS8vICdhcmdLJywgYW5kIHJlZmVyIHRvIGl0cyB0eXBlIGJ5ICdhcmdLX3R5cGUnLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBBQ1RJT04oSW5jcmVtZW50QXJnMSkgewotLy8gICAgIGFyZzFfdHlwZSB0ZW1wID0gYXJnMTsKLS8vICAgICByZXR1cm4gKysoKnRlbXApOwotLy8gICB9Ci0vLwotLy8gYWxsb3dzIHlvdSB0byB3cml0ZQotLy8KLS8vICAgLi4uV2lsbE9uY2UoSW5jcmVtZW50QXJnMSgpKTsKLS8vCi0vLyBZb3UgY2FuIGFsc28gcmVmZXIgdG8gdGhlIGVudGlyZSBhcmd1bWVudCB0dXBsZSBhbmQgaXRzIHR5cGUgYnkKLS8vICdhcmdzJyBhbmQgJ2FyZ3NfdHlwZScsIGFuZCByZWZlciB0byB0aGUgbW9jayBmdW5jdGlvbiB0eXBlIGFuZCBpdHMKLS8vIHJldHVybiB0eXBlIGJ5ICdmdW5jdGlvbl90eXBlJyBhbmQgJ3JldHVybl90eXBlJy4KLS8vCi0vLyBOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KLS8vIGFyZ3VtZW50cy4gIEhvd2V2ZXIgcmVzdCBhc3N1cmVkIHRoYXQgeW91ciBjb2RlIGlzIHN0aWxsIHR5cGUtc2FmZToKLS8vIHlvdSdsbCBnZXQgYSBjb21waWxlciBlcnJvciBpZiAqYXJnMSBkb2Vzbid0IHN1cHBvcnQgdGhlICsrCi0vLyBvcGVyYXRvciwgb3IgaWYgdGhlIHR5cGUgb2YgKysoKmFyZzEpIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKLS8vIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSwgZm9yIGV4YW1wbGUuCi0vLwotLy8gU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBhcmFtZXRlcml6ZSB0aGUgYWN0aW9uLiAgIEZvciB0aGF0IHlvdSBjYW4gdXNlCi0vLyBhbm90aGVyIG1hY3JvOgotLy8KLS8vICAgQUNUSU9OX1AobmFtZSwgcGFyYW1fbmFtZSkgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBBQ1RJT05fUChBZGQsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9Ci0vLwotLy8gd2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6Ci0vLwotLy8gICAuLi5XaWxsT25jZShBZGQoNSkpOwotLy8KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKLS8vIGVpdGhlci4gIElmIHlvdSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZAotLy8gJ2ZvbycsIHlvdSBjYW4gd3JpdGUgJ2Zvb190eXBlJy4gIEZvciBleGFtcGxlLCBpbiB0aGUgYm9keSBvZgotLy8gQUNUSU9OX1AoQWRkLCBuKSBhYm92ZSwgeW91IGNhbiB3cml0ZSAnbl90eXBlJyB0byByZWZlciB0byB0aGUgdHlwZQotLy8gb2YgJ24nLgotLy8KLS8vIFdlIGFsc28gcHJvdmlkZSBBQ1RJT05fUDIsIEFDVElPTl9QMywgLi4uLCB1cCB0byBBQ1RJT05fUCRuIHRvIHN1cHBvcnQKLS8vIG11bHRpLXBhcmFtZXRlciBhY3Rpb25zLgotLy8KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldwotLy8KLS8vICAgQUNUSU9OX1BrKEZvbywgcDEsIC4uLiwgcGspIHsgLi4uIH0KLS8vCi0vLyBhcyBzaG9ydGhhbmQgZm9yCi0vLwotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgotLy8gICBGb29BY3Rpb25QazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+IEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KLS8vCi0vLyBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIHByb3ZpZGUgdGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzCi0vLyBleHBsaWNpdGx5IHdoZW4gaW52b2tpbmcgRm9vKCksIGFzIGluIEZvbzxsb25nLCBib29sPig1LCBmYWxzZSk7Ci0vLyBhbHRob3VnaCB1c3VhbGx5IHlvdSBjYW4gcmVseSBvbiB0aGUgY29tcGlsZXIgdG8gaW5mZXIgdGhlIHR5cGVzCi0vLyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24KLS8vIEZvbyhwMSwgLi4uLCBwaykgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwKLS8vIHBrX3R5cGU+LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gY29tcG9zaW5nIGFjdGlvbnMuCi0vLwotLy8gWW91IGNhbiBhbHNvIG92ZXJsb2FkIGFjdGlvbnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzOgotLy8KLS8vICAgQUNUSU9OX1AoUGx1cywgYSkgeyAuLi4gfQotLy8gICBBQ1RJT05fUDIoUGx1cywgYSwgYikgeyAuLi4gfQotLy8KLS8vIFdoaWxlIGl0J3MgdGVtcHRpbmcgdG8gYWx3YXlzIHVzZSB0aGUgQUNUSU9OKiBtYWNyb3Mgd2hlbiBkZWZpbmluZwotLy8gYSBuZXcgYWN0aW9uLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nIEFjdGlvbkludGVyZmFjZQotLy8gb3IgdXNpbmcgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkgaW5zdGVhZCwgZXNwZWNpYWxseSBpZiB5b3UgbmVlZCB0bwotLy8gdXNlIHRoZSBhY3Rpb24gYSBsb3QuICBXaGlsZSB0aGVzZSBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrLAotLy8gdGhleSBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uCi0vLyBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24gcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcyB0bwotLy8gYmV0dGVyIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIHRoYXQgcGF5IG9mZiBpbiB0aGUgbG9uZyBydW4uICBUaGV5Ci0vLyBhbHNvIGFsbG93IG92ZXJsb2FkaW5nIGFjdGlvbnMgYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkCi0vLyB0byBqdXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycykuCi0vLwotLy8gQ0FWRUFUOgotLy8KLS8vIEFDVElPTiooKSBjYW4gb25seSBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlLiAgVGhlIHJlYXNvbiBpcwotLy8gdGhhdCBDKysgZG9lc24ndCB5ZXQgYWxsb3cgZnVuY3Rpb24tbG9jYWwgdHlwZXMgdG8gYmUgdXNlZCB0bwotLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzLiAgVGhlIHVwLWNvbWluZyBDKysweCBzdGFuZGFyZCB3aWxsIGZpeCB0aGlzLgotLy8gT25jZSB0aGF0J3MgZG9uZSwgd2UnbGwgY29uc2lkZXIgc3VwcG9ydGluZyB1c2luZyBBQ1RJT04qKCkgaW5zaWRlCi0vLyBhIGZ1bmN0aW9uLgotLy8KLS8vIE1PUkUgSU5GT1JNQVRJT046Ci0vLwotLy8gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyB0aGVzZSBtYWNyb3MsIHBsZWFzZSBzZWFyY2ggZm9yICdBQ1RJT04nCi0vLyBvbiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rLgotCi0kcmFuZ2UgaSAwLi5uCi0kcmFuZ2UgayAwLi5uLTEKLQotLy8gQW4gaW50ZXJuYWwgbWFjcm8gbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgQUNUSU9OKigpLgotI2RlZmluZSBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfXAotICAgIGNvbnN0IGFyZ3NfdHlwZSYgYXJncyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotJGZvciBrIFtbLCBcCi0gICAgYXJnJGtbW11dX3R5cGUgYXJnJGsgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF9dXQotCi0KLS8vIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBnaXZlIGFuIGFjdGlvbiBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCi0vLyB0aGF0IGNhbm5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyB2YWx1ZSBwYXJhbWV0ZXJzLiAgQUNUSU9OKCkgYW5kCi0vLyBBQ1RJT05fUCooKSBkb24ndCBzdXBwb3J0IHRoYXQuICBBQ1RJT05fVEVNUExBVEUoKSByZW1lZGllcyB0aGF0Ci0vLyBhbmQgY2FuIGJlIHZpZXdlZCBhcyBhbiBleHRlbnNpb24gdG8gQUNUSU9OKCkgYW5kIEFDVElPTl9QKigpLgotLy8KLS8vIFRoZSBzeW50YXg6Ci0vLwotLy8gICBBQ1RJT05fVEVNUExBVEUoQWN0aW9uTmFtZSwKLS8vICAgICAgICAgICAgICAgICAgIEhBU19tX1RFTVBMQVRFX1BBUkFNUyhraW5kMSwgbmFtZTEsIC4uLiwga2luZF9tLCBuYW1lX20pLAotLy8gICAgICAgICAgICAgICAgICAgQU5EX25fVkFMVUVfUEFSQU1TKHAxLCAuLi4sIHBfbikpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIGRlZmluZXMgYW4gYWN0aW9uIHRlbXBsYXRlIHRoYXQgdGFrZXMgbSBleHBsaWNpdCB0ZW1wbGF0ZQotLy8gcGFyYW1ldGVycyBhbmQgbiB2YWx1ZSBwYXJhbWV0ZXJzLiAgbmFtZV9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoCi0vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCBraW5kX2kgc3BlY2lmaWVzIHdoZXRoZXIgaXQncyBhIHR5cGVuYW1lLAotLy8gYW4gaW50ZWdyYWwgY29uc3RhbnQsIG9yIGEgdGVtcGxhdGUuICBwX2kgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGgKLS8vIHZhbHVlIHBhcmFtZXRlci4KLS8vCi0vLyBFeGFtcGxlOgotLy8KLS8vICAgLy8gRHVwbGljYXRlQXJnPGssIFQ+KG91dHB1dCkgY29udmVydHMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sKLS8vICAgLy8gZnVuY3Rpb24gdG8gdHlwZSBUIGFuZCBjb3BpZXMgaXQgdG8gKm91dHB1dC4KLS8vICAgQUNUSU9OX1RFTVBMQVRFKER1cGxpY2F0ZUFyZywKLS8vICAgICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGssIHR5cGVuYW1lLCBUKSwKLS8vICAgICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhvdXRwdXQpKSB7Ci0vLyAgICAgKm91dHB1dCA9IFQoOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICAgIGludCBuOwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfKSkKLS8vICAgICAgICAgLldpbGxPbmNlKER1cGxpY2F0ZUFyZzwxLCB1bnNpZ25lZCBjaGFyPigmbikpOwotLy8KLS8vIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGVtcGxhdGUsIHdyaXRlOgotLy8KLS8vICAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20+KHYxLCAuLi4sIHZfbikKLS8vCi0vLyB3aGVyZSB0aGUgdHMgYXJlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHRoZSB2cyBhcmUgdGhlIHZhbHVlCi0vLyBhcmd1bWVudHMuICBUaGUgdmFsdWUgYXJndW1lbnQgdHlwZXMgYXJlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4KLS8vIElmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdmFsdWUgYXJndW1lbnQgdHlwZXMsIHlvdSBjYW4KLS8vIHByb3ZpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHM6Ci0vLwotLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbSwgdTEsIC4uLiwgdV9rPih2MSwgLi4uLCB2X24pCi0vLwotLy8gd2hlcmUgdV9pIGlzIHRoZSBkZXNpcmVkIHR5cGUgb2Ygdl9pLgotLy8KLS8vIEFDVElPTl9URU1QTEFURSBhbmQgQUNUSU9OL0FDVElPTl9QKiBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUKLS8vIG51bWJlciBvZiB2YWx1ZSBwYXJhbWV0ZXJzLCBidXQgbm90IG9uIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUKLS8vIHBhcmFtZXRlcnMuICBXaXRob3V0IHRoZSByZXN0cmljdGlvbiwgdGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZwotLy8gaXMgdW5jbGVhcjoKLS8vCi0vLyAgIE92ZXJsb2FkZWRBY3Rpb248aW50LCBib29sPih4KTsKLS8vCi0vLyBBcmUgd2UgdXNpbmcgYSBzaW5nbGUtdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbiB3aGVyZSAnYm9vbCcgcmVmZXJzCi0vLyB0byB0aGUgdHlwZSBvZiB4LCBvciBhcmUgd2UgdXNpbmcgYSB0d28tdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbgotLy8gd2hlcmUgdGhlIGNvbXBpbGVyIGlzIGFza2VkIHRvIGluZmVyIHRoZSB0eXBlIG9mIHg/Ci0vLwotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0vLwotLy8gR01PQ0tfSU5URVJOQUxfKl9IQVNfbV9URU1QTEFURV9QQVJBTVMgYW5kCi0vLyBHTU9DS19JTlRFUk5BTF8qX0FORF9uX1ZBTFVFX1BBUkFNUyBhcmUgaW50ZXJuYWwgbWFjcm9zIGZvcgotLy8gaW1wbGVtZW50aW5nIEFDVElPTl9URU1QTEFURS4gIFRoZSBtYWluIHRyaWNrIHdlIHVzZSBpcyB0byBjcmVhdGUKLS8vIG5ldyBtYWNybyBpbnZvY2F0aW9ucyB3aGVuIGV4cGFuZGluZyBhIG1hY3JvLiAgRm9yIGV4YW1wbGUsIHdlIGhhdmUKLS8vCi0vLyAgICNkZWZpbmUgQUNUSU9OX1RFTVBMQVRFKG5hbWUsIHRlbXBsYXRlX3BhcmFtcywgdmFsdWVfcGFyYW1zKQotLy8gICAgICAgLi4uIEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXMgLi4uCi0vLwotLy8gd2hpY2ggY2F1c2VzIEFDVElPTl9URU1QTEFURSguLi4sIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksIC4uLikKLS8vIHRvIGV4cGFuZCB0bwotLy8KLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCkgLi4uCi0vLwotLy8gU2luY2UgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMgaXMgYSBtYWNybywgdGhlCi0vLyBwcmVwcm9jZXNzb3Igd2lsbCBjb250aW51ZSB0byBleHBhbmQgaXQgdG8KLS8vCi0vLyAgICAgICAuLi4gdHlwZW5hbWUgVCAuLi4KLS8vCi0vLyBUaGlzIHRlY2huaXF1ZSBjb25mb3JtcyB0byB0aGUgQysrIHN0YW5kYXJkIGFuZCBpcyBwb3J0YWJsZS4gIEl0Ci0vLyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IGFjdGlvbiB0ZW1wbGF0ZXMgdXNpbmcgTyhOKSBjb2RlLCB3aGVyZSBOIGlzCi0vLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGVtcGxhdGUvdmFsdWUgcGFyYW1ldGVycyBzdXBwb3J0ZWQuICBXaXRob3V0Ci0vLyB1c2luZyBpdCwgd2UnZCBoYXZlIHRvIGRldm90ZSBPKE5eMikgYW1vdW50IG9mIGNvZGUgdG8gaW1wbGVtZW50IGFsbAotLy8gY29tYmluYXRpb25zIG9mIG0gYW5kIG4uCi0KLS8vIERlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotCi0kcmFuZ2UgaiAxLi5uCi0kZm9yIGogW1sKLSRyYW5nZSBtIDAuLmotMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18kaltbXV0KLV9URU1QTEFURV9QQVJBTVMoJGZvciBtLCBbW2tpbmQkbSwgbmFtZSRtXV0pICRmb3IgbSwgW1traW5kJG0gbmFtZSRtXV0KLQotCi1dXQotCi0vLyBMaXN0cyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4KLQotJGZvciBqIFtbCi0kcmFuZ2UgbSAwLi5qLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfJGpbW11dCi1fVEVNUExBVEVfUEFSQU1TKCRmb3IgbSwgW1traW5kJG0sIG5hbWUkbV1dKSAkZm9yIG0sIFtbbmFtZSRtXV0KLQotCi1dXQotCi0vLyBEZWNsYXJlcyB0aGUgdHlwZXMgb2YgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8kaVtbXV0KLV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1ssIHR5cGVuYW1lIHAkaiMjX3R5cGVdXQotCi0KLV1dCi0KLS8vIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSlcCi0gICAgKCRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dKSRpZiBpPjAgW1sgOiBdXSRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dCi0KLQotXV0KLQotLy8gRGVjbGFyZXMgdGhlIGZpZWxkcyBmb3Igc3RvcmluZyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfJGlbW11dCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqIFtbcCRqIyNfdHlwZSBwJGo7IF1dCi0KLQotXV0KLQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXyRpW1tdXQotX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pICRmb3IgaiwgW1twJGpdXQotCi0KLV1dCi0KLS8vIExpc3RzIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgdHlwZXMuCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfJGlbW11dCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqIFtbLCBwJGojI190eXBlXV0KLQotCi1dXQotCi0vLyBEZWNsYXJlcyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pIFtbXV0KLSRmb3IgaiwgW1twJGojI190eXBlIHAkal1dCi0KLQotXV0KLQotLy8gVGhlIHN1ZmZpeCBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCi0kZm9yIGkgW1sKLQotCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSBbW11dCi0kaWYgaT09MSBbW1BdXSAkZWxpZiBpPj0yIFtbUCRpXV0KLV1dCi0KLQotLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIGltcGxlbWVudGluZyB0aGUgYWN0aW9uIHRlbXBsYXRlLgotI2RlZmluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhuYW1lIyNBY3Rpb24sIEdNT0NLX0lOVEVSTkFMX0NPVU5UXyMjdmFsdWVfcGFyYW1zKQotCi0kcmFuZ2UgayAwLi5uLTEKLQotI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpXAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIGNsYXNzIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSB7XAotICAgcHVibGljOlwKLSAgICBleHBsaWNpdCBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPCRmb3IgaywgW1t0eXBlbmFtZSBhcmcka1tbXV1fdHlwZV1dPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJnc1tbXV0KLSRmb3IgayBbWywgYXJnJGtbW11dX3R5cGUgYXJnJGtdXSkgY29uc3Q7XAotICAgICAgR01PQ0tfSU5URVJOQUxfREVGTl8jI3ZhbHVlX3BhcmFtc1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxGPihHTU9DS19JTlRFUk5BTF9MSVNUXyMjdmFsdWVfcGFyYW1zKSk7XAotICAgIH1cCi0gICAgR01PQ0tfSU5URVJOQUxfREVGTl8jI3ZhbHVlX3BhcmFtc1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIGlubGluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz4gbmFtZShcCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF8jI3ZhbHVlX3BhcmFtcykge1wKLSAgICByZXR1cm4gR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKLSAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPihcCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdmFsdWVfcGFyYW1zKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+OjpnbW9ja19JbXBsPEY+OjpcCi0gICAgICAgICAgICAgIGdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0kZm9yIGkKLQotW1sKLSR2YXIgdGVtcGxhdGUgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sKLSRyYW5nZSBqIDAuLmktMQotCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgcCRqIyNfdHlwZV1dPlwKLV1dXV0KLSR2YXIgY2xhc3NfbmFtZSA9IFtbbmFtZSMjQWN0aW9uW1skaWYgaT09MCBbW11dICRlbGlmIGk9PTEgW1tQXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlIFtbUCRpXV1dXV1dCi0kcmFuZ2UgaiAwLi5pLTEKLSR2YXIgY3Rvcl9wYXJhbV9saXN0ID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBnbW9ja19wJGpdXV1dCi0kdmFyIHBhcmFtX3R5cGVzX2FuZF9uYW1lcyA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgcCRqXV1dXQotJHZhciBpbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQotJHZhciBwYXJhbV9maWVsZF9kZWNscyA9IFtbJGZvciBqCi1bWwotCi0gICAgICBwJGojI190eXBlIHAkajtcCi1dXV1dCi0kdmFyIHBhcmFtX2ZpZWxkX2RlY2xzMiA9IFtbJGZvciBqCi1bWwotCi0gICAgcCRqIyNfdHlwZSBwJGo7XAotXV1dXQotJHZhciBwYXJhbXMgPSBbWyRmb3IgaiwgW1twJGpdXV1dCi0kdmFyIHBhcmFtX3R5cGVzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbPCRmb3IgaiwgW1twJGojI190eXBlXV0+XV1dXQotJHZhciB0eXBlbmFtZV9hcmdfdHlwZXMgPSBbWyRmb3IgaywgW1t0eXBlbmFtZSBhcmcka1tbXV1fdHlwZV1dXV0KLSR2YXIgYXJnX3R5cGVzX2FuZF9uYW1lcyA9IFtbJGZvciBrLCBbW2FyZyRrW1tdXV90eXBlIGFyZyRrXV1dXQotJHZhciBtYWNyb19uYW1lID0gW1skaWYgaT09MCBbW0FDVElPTl1dICRlbGlmIGk9PTEgW1tBQ1RJT05fUF1dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tBQ1RJT05fUCRpXV1dXQotCi0jZGVmaW5lICRtYWNyb19uYW1lKG5hbWUkZm9yIGogW1ssIHAkal1dKVwkdGVtcGxhdGUKLSAgY2xhc3MgJGNsYXNzX25hbWUge1wKLSAgIHB1YmxpYzpcCi0gICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV0kY2xhc3NfbmFtZSgkY3Rvcl9wYXJhbV9saXN0KSRpbml0cyB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIFtbJGlmIGk9PTEgW1tleHBsaWNpdCBdXV1dZ21vY2tfSW1wbCgkY3Rvcl9wYXJhbV9saXN0KSRpbml0cyB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8JHR5cGVuYW1lX2FyZ190eXBlcz5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIFtbXV0KLSRhcmdfdHlwZXNfYW5kX25hbWVzKSBjb25zdDtcJHBhcmFtX2ZpZWxkX2RlY2xzCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPigkcGFyYW1zKSk7XAotICAgIH1cJHBhcmFtX2ZpZWxkX2RlY2xzMgotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXygkY2xhc3NfbmFtZSk7XAotICB9O1wkdGVtcGxhdGUKLSAgaW5saW5lICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzIG5hbWUoJHBhcmFtX3R5cGVzX2FuZF9uYW1lcykge1wKLSAgICByZXR1cm4gJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMoJHBhcmFtcyk7XAotICB9XCR0ZW1wbGF0ZQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDwkdHlwZW5hbWVfYXJnX3R5cGVzPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzOjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLV1dCi0kJCB9ICAvLyBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIEVtYWNzLiAgSXQgd29uJ3QKLSQkICAgIC8vIHNob3cgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgotCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotCi0vLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKLS8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KLS8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybwotLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCi0vLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkKLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQotI2VuZGlmCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VBcmd1bWVudDxOPigpLgotLy8KLS8vIFRoZSBJbnZva2VBcmd1bWVudDxOPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gaW52b2tlcyB0aGUgTi10aAotLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgay1hcnkgY2FsbGFibGUsIG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbiwgd2l0aCBhcmd1bWVudHMgYTEsIGEyLCAuLi4sIGFfay4KLS8vCi0vLyBOb3RlczoKLS8vCi0vLyAgIDEuIFRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBieSB2YWx1ZSBieSBkZWZhdWx0LiAgSWYgeW91IG5lZWQgdG8KLS8vICAgcGFzcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIEJ5UmVmKCkuICBGb3IKLS8vICAgZXhhbXBsZSwKLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MT4oNSwgc3RyaW5nKCJIZWxsbyIpLCBCeVJlZihmb28pKQotLy8KLS8vICAgcGFzc2VzIDUgYW5kIHN0cmluZygiSGVsbG8iKSBieSB2YWx1ZSwgYW5kIHBhc3NlcyBmb28gYnkKLS8vICAgcmVmZXJlbmNlLgotLy8KLS8vICAgMi4gSWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBidXQgQnlSZWYoKSBpcwotLy8gICBub3QgdXNlZCwgaXQgd2lsbCByZWNlaXZlIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZSwKLS8vICAgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgMC10aAotLy8gICBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24KLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RyaW5nKCJIZWxsbyIpKQotLy8KLS8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGEKLS8vICAgcmVmZXJlbmNlIG9mIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0ZW1wb3Jhcnkgb2JqZWN0LAotLy8gICB0byB0aGUgY2FsbGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KLS8vICAgSW52b2tlQXJndW1lbnQgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQKLS8vICAgbGF0ZXIuCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50IHsKLQotLy8gQXBwZWFycyBpbiBJbnZva2VBcmd1bWVudEFkbCdzIGFyZ3VtZW50IGxpc3QgdG8gaGVscCBhdm9pZAotLy8gYWNjaWRlbnRhbCBjYWxscyB0byB1c2VyIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgotc3RydWN0IEFkbFRhZyB7fTsKLQotLy8gSW52b2tlQXJndW1lbnRBZGwgLSBhIGhlbHBlciBmb3IgSW52b2tlQXJndW1lbnQuCi0vLyBUaGUgYmFzaWMgb3ZlcmxvYWRzIGFyZSBwcm92aWRlZCBoZXJlIGZvciBnZW5lcmljIGZ1bmN0b3JzLgotLy8gT3ZlcmxvYWRzIGZvciBvdGhlciBjdXN0b20tY2FsbGFibGVzIGFyZSBwcm92aWRlZCBpbiB0aGUKLS8vIGludGVybmFsL2N1c3RvbS9jYWxsYmFjay1hY3Rpb25zLmggaGVhZGVyLgotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkKLVtbCi0kcmFuZ2UgaiAxLi5pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGW1skZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dXV0+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmW1skZm9yIGogW1ssIEEkaiBhJGpdXV1dKSB7Ci0gIHJldHVybiBmKFtbJGZvciBqLCBbW2Ekal1dXV0pOwotfQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIGludm9rZV9hcmd1bWVudAotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSRmb3IgaiBbWywgcCRqXV0pOwotfQotCi1dXQotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgUmV0dXJuTmV3PFQ+KCkuCi0vLwotLy8gVGhlIFJldHVybk5ldzxUPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcKLS8vIGluc3RhbmNlIG9mIHR5cGUgVCwgY29uc3RydWN0ZWQgb24gdGhlIGhlYXAgd2l0aCBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLS8vIGExLCBhMiwgLi4uLCBhbmQgYV9rLiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0kdmFyIHBzID0gW1skZm9yIGosIFtbcCRqXV1dXQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJHBzKSkgewotICByZXR1cm4gbmV3IFQoJHBzKTsKLX0KLQotXV0KLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBJbmNsdWRlIGFueSBjdXN0b20gY2FsbGJhY2sgYWN0aW9ucyBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmggYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhNWNhOS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOTUgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb24gbW9ja2VycyBvZiB2YXJpb3VzIGFyaXRpZXMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0jIGluY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLS8vIE5vdGU6IGNsYXNzIEZ1bmN0aW9uTW9ja2VyIHJlYWxseSBiZWxvbmdzIHRvIHRoZSA6OnRlc3RpbmcKLS8vIG5hbWVzcGFjZS4gIEhvd2V2ZXIgaWYgd2UgZGVmaW5lIGl0IGluIDo6dGVzdGluZywgTVNWQyB3aWxsCi0vLyBjb21wbGFpbiB3aGVuIGNsYXNzZXMgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBkZWNsYXJlIGl0IGFzIGEKLS8vIGZyaWVuZCBjbGFzcyB0ZW1wbGF0ZS4gIFRvIHdvcmthcm91bmQgdGhpcyBjb21waWxlciBidWcsIHdlIGRlZmluZQotLy8gRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBhbmQgaW1wb3J0IGl0IGludG8gOjp0ZXN0aW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKCk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKCk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoKSB7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZSgpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExKT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoQTEpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSkgewotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSkpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMikpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMikgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzKT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMyk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00KSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNT4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCi0gICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNikpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LAotICAgICAgY29uc3QgTWF0Y2hlcjxBNj4mIG02LCBjb25zdCBNYXRjaGVyPEE3PiYgbTcpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNiwgbTcpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNykgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4PgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNiwgbTcsIG04KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsIEE4IGE4KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCi0gICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYsIGNvbnN0IE1hdGNoZXI8QTc+JiBtNywgY29uc3QgTWF0Y2hlcjxBOD4mIG04LAotICAgICAgY29uc3QgTWF0Y2hlcjxBOT4mIG05KSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKLSAgICAgICAgbTYsIG03LCBtOCwgbTkpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywgQTggYTgsIEE5IGE5KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCi0gICAgdHlwZW5hbWUgQTEwPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgsCi0gICAgICBjb25zdCBNYXRjaGVyPEE5PiYgbTksIGNvbnN0IE1hdGNoZXI8QTEwPiYgbTEwKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKLSAgICAgICAgbTYsIG03LCBtOCwgbTksIG0xMCkpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LCBBOCBhOCwgQTkgYTksCi0gICAgICBBMTAgYTEwKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LAotICAgICAgICBhMTApKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFRoZSBzdHlsZSBndWlkZSBwcm9oaWJpdHMgInVzaW5nIiBzdGF0ZW1lbnRzIGluIGEgbmFtZXNwYWNlIHNjb3BlCi0vLyBpbnNpZGUgYSBoZWFkZXIgZmlsZS4gIEhvd2V2ZXIsIHRoZSBGdW5jdGlvbk1vY2tlciBjbGFzcyB0ZW1wbGF0ZQotLy8gaXMgbWVhbnQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4gIFRoZSBmb2xsb3dpbmcKLS8vIGxpbmUgaXMganVzdCBhIHRyaWNrIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwgd2hpY2gKLS8vIGNhbm5vdCBoYW5kbGUgaXQgaWYgd2UgZGVmaW5lIEZ1bmN0aW9uTW9ja2VyIGluIDo6dGVzdGluZy4KLXVzaW5nIGludGVybmFsOjpGdW5jdGlvbk1vY2tlcjsKLQotLy8gR01PQ0tfUkVTVUxUXyh0biwgRikgZXhwYW5kcyB0byB0aGUgcmVzdWx0IHR5cGUgb2YgZnVuY3Rpb24gdHlwZSBGLgotLy8gV2UgZGVmaW5lIHRoaXMgYXMgYSB2YXJpYWRpYyBtYWNybyBpbiBjYXNlIEYgY29udGFpbnMgdW5wcm90ZWN0ZWQKLS8vIGNvbW1hcyAodGhlIHNhbWUgcmVhc29uIHRoYXQgd2UgdXNlIHZhcmlhZGljIG1hY3JvcyBpbiBvdGhlciBwbGFjZXMKLS8vIGluIHRoaXMgZmlsZSkuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfUkVTVUxUXyh0biwgLi4uKSBcCi0gICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpSZXN1bHQKLQotLy8gVGhlIHR5cGUgb2YgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19BUkdfKHRuLCBOLCAuLi4pIFwKLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50IyNOCi0KLS8vIFRoZSBtYXRjaGVyIHR5cGUgZm9yIGFyZ3VtZW50IE4gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUFUQ0hFUl8odG4sIE4sIC4uLikgXAotICAgIGNvbnN0IDo6dGVzdGluZzo6TWF0Y2hlcjxHTU9DS19BUkdfKHRuLCBOLCBfX1ZBX0FSR1NfXyk+JgotCi0vLyBUaGUgdmFyaWFibGUgZm9yIG1vY2tpbmcgdGhlIGdpdmVuIG1ldGhvZC4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NT0NLRVJfKGFyaXR5LCBjb25zdG5lc3MsIE1ldGhvZCkgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ21vY2sjI2NvbnN0bmVzcyMjYXJpdHkjI18jI01ldGhvZCMjXywgX19MSU5FX18pCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0QwXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgKSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDApLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMF9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMCwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZSgpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKCk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDFfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gMSksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8xX2FyZ3VtZW50KTsgXAotICAgIEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSkgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDJfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMikgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSAyKSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzJfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyKTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EM18odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gMyksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8zX2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMyk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMyk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDRfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNCksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV80X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCkgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9ENV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1KSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDUpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfNV9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9ENl8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNiksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV82X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNik7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNik7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDdfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNyksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV83X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNykgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EOF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4KSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDgpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfOF9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EOV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTkpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gOSksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV85X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBcCi0gICAgICAgIGdtb2NrX2E5KTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTkpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIFwKLSAgICAgICAgZ21vY2tfYTkpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0QxMF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTksIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEwLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEwKSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDEwKSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzEwX2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIGdtb2NrX2E5LCBcCi0gICAgICAgIGdtb2NrX2ExMCk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOSwgX19WQV9BUkdTX18pIGdtb2NrX2E5LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMTAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZBX0FSR1NfXykgZ21vY2tfYTEwKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIGdtb2NrX2E5LCBcCi0gICAgICAgIGdtb2NrX2ExMCk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLSNkZWZpbmUgTU9DS19NRVRIT0QwKG0sIC4uLikgR01PQ0tfTUVUSE9EMF8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMShtLCAuLi4pIEdNT0NLX01FVEhPRDFfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDIobSwgLi4uKSBHTU9DS19NRVRIT0QyXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QzKG0sIC4uLikgR01PQ0tfTUVUSE9EM18oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENChtLCAuLi4pIEdNT0NLX01FVEhPRDRfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDUobSwgLi4uKSBHTU9DS19NRVRIT0Q1XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q2KG0sIC4uLikgR01PQ0tfTUVUSE9ENl8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENyhtLCAuLi4pIEdNT0NLX01FVEhPRDdfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDgobSwgLi4uKSBHTU9DS19NRVRIT0Q4XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q5KG0sIC4uLikgR01PQ0tfTUVUSE9EOV8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMTAobSwgLi4uKSBHTU9DS19NRVRIT0QxMF8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QwKG0sIC4uLikgR01PQ0tfTUVUSE9EMF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxKG0sIC4uLikgR01PQ0tfTUVUSE9EMV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyKG0sIC4uLikgR01PQ0tfTUVUSE9EMl8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QzKG0sIC4uLikgR01PQ0tfTUVUSE9EM18oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0KG0sIC4uLikgR01PQ0tfTUVUSE9ENF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1KG0sIC4uLikgR01PQ0tfTUVUSE9ENV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q2KG0sIC4uLikgR01PQ0tfTUVUSE9ENl8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3KG0sIC4uLikgR01PQ0tfTUVUSE9EN18oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4KG0sIC4uLikgR01PQ0tfTUVUSE9EOF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q5KG0sIC4uLikgR01PQ0tfTUVUSE9EOV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMChtLCAuLi4pIEdNT0NLX01FVEhPRDEwXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMF9UKG0sIC4uLikgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxX1QobSwgLi4uKSBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDJfVChtLCAuLi4pIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EM19UKG0sIC4uLikgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q0X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDVfVChtLCAuLi4pIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENl9UKG0sIC4uLikgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q3X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDhfVChtLCAuLi4pIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOV9UKG0sIC4uLikgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxMF9UKG0sIC4uLikgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QwX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMl9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QzX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENV9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q2X1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOF9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q5X1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX01FVEhPRDBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDFfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMl9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QyXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDNfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q0X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDRfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q1XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDZfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q3X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDdfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q4XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDlfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxMF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDJfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMl8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDNfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDVfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDZfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EN18oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDhfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDlfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDEwXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19NRVRIT0QwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDFfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QzX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDRfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q2X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDdfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q5X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDBfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDNfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDZfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDlfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotLy8gQSBNb2NrRnVuY3Rpb248Rj4gY2xhc3MgaGFzIG9uZSBtb2NrIG1ldGhvZCB3aG9zZSB0eXBlIGlzIEYuICBJdCBpcwotLy8gdXNlZnVsIHdoZW4geW91IGp1c3Qgd2FudCB5b3VyIHRlc3QgY29kZSB0byBlbWl0IHNvbWUgbWVzc2FnZXMgYW5kCi0vLyBoYXZlIEdvb2dsZSBNb2NrIHZlcmlmeSB0aGUgcmlnaHQgbWVzc2FnZXMgYXJlIHNlbnQgKGFuZCBwZXJoYXBzIGF0Ci0vLyB0aGUgcmlnaHQgdGltZXMpLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgZXhlcmNpc2luZyBjb2RlOgotLy8KLS8vICAgRm9vKDEpOwotLy8gICBGb28oMik7Ci0vLyAgIEZvbygzKTsKLS8vCi0vLyBhbmQgd2FudCB0byB2ZXJpZnkgdGhhdCBGb28oMSkgYW5kIEZvbygzKSBib3RoIGludm9rZQotLy8gbW9jay5CYXIoImEiKSwgYnV0IEZvbygyKSBkb2Vzbid0IGludm9rZSBhbnl0aGluZywgeW91IGNhbiB3cml0ZToKLS8vCi0vLyBURVNUKEZvb1Rlc3QsIEludm9rZXNCYXJDb3JyZWN0bHkpIHsKLS8vICAgTXlNb2NrIG1vY2s7Ci0vLyAgIE1vY2tGdW5jdGlvbjx2b2lkKHN0cmluZyBjaGVja19wb2ludF9uYW1lKT4gY2hlY2s7Ci0vLyAgIHsKLS8vICAgICBJblNlcXVlbmNlIHM7Ci0vLwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKLS8vICAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMSIpKTsKLS8vICAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMiIpKTsKLS8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7Ci0vLyAgIH0KLS8vICAgRm9vKDEpOwotLy8gICBjaGVjay5DYWxsKCIxIik7Ci0vLyAgIEZvbygyKTsKLS8vICAgY2hlY2suQ2FsbCgiMiIpOwotLy8gICBGb28oMyk7Ci0vLyB9Ci0vLwotLy8gVGhlIGV4cGVjdGF0aW9uIHNwZWMgc2F5cyB0aGF0IHRoZSBmaXJzdCBCYXIoImEiKSBtdXN0IGhhcHBlbgotLy8gYmVmb3JlIGNoZWNrIHBvaW50ICIxIiwgdGhlIHNlY29uZCBCYXIoImEiKSBtdXN0IGhhcHBlbiBhZnRlciBjaGVjawotLy8gcG9pbnQgIjIiLCBhbmQgbm90aGluZyBzaG91bGQgaGFwcGVuIGJldHdlZW4gdGhlIHR3byBjaGVjawotLy8gcG9pbnRzLiBUaGUgZXhwbGljaXQgY2hlY2sgcG9pbnRzIG1ha2UgaXQgZWFzeSB0byB0ZWxsIHdoaWNoCi0vLyBCYXIoImEiKSBpcyBjYWxsZWQgYnkgd2hpY2ggY2FsbCB0byBGb28oKS4KLS8vCi0vLyBNb2NrRnVuY3Rpb248Rj4gY2FuIGFsc28gYmUgdXNlZCB0byBleGVyY2lzZSBjb2RlIHRoYXQgYWNjZXB0cwotLy8gc3RkOjpmdW5jdGlvbjxGPiBjYWxsYmFja3MuIFRvIGRvIHNvLCB1c2UgQXNTdGRGdW5jdGlvbigpIG1ldGhvZAotLy8gdG8gY3JlYXRlIHN0ZDo6ZnVuY3Rpb24gcHJveHkgZm9yd2FyZGluZyB0byBvcmlnaW5hbCBvYmplY3QncyBDYWxsLgotLy8gRXhhbXBsZToKLS8vCi0vLyBURVNUKEZvb1Rlc3QsIFJ1bnNDYWxsYmFja1dpdGhCYXJBcmd1bWVudCkgewotLy8gICBNb2NrRnVuY3Rpb248aW50KHN0cmluZyk+IGNhbGxiYWNrOwotLy8gICBFWFBFQ1RfQ0FMTChjYWxsYmFjaywgQ2FsbCgiYmFyIikpLldpbGxPbmNlKFJldHVybigxKSk7Ci0vLyAgIEZvbyhjYWxsYmFjay5Bc1N0ZEZ1bmN0aW9uKCkpOwotLy8gfQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBNb2NrRnVuY3Rpb247Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDBfVChDYWxsLCBSKCkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKCk+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXSgpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTA+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0QxX1QoQ2FsbCwgUihBMCkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwKSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExPgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDJfVChDYWxsLCBSKEEwLCBBMSkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSk+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EM19UKENhbGwsIFIoQTAsIEExLCBBMikpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMikgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMyk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0Q0X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMykpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzKSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQ+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9ENV9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0KSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCkgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDZfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUpKTsKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0gIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7Ci0gICAgfTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0Q3X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNikpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EOF9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNykgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDlfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpKTsKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0gIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywKLSAgICAgICAgQTggYTgpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7Ci0gICAgfTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwKLSAgICB0eXBlbmFtZSBBOT4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDEwX1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywKLSAgICAgICAgQTggYTgsIEE5IGE5KSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAgYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE1MDJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLgotJCQKLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9uIG1vY2tlcnMgb2YgdmFyaW91cyBhcml0aWVzLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotIyBpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0vLyBOb3RlOiBjbGFzcyBGdW5jdGlvbk1vY2tlciByZWFsbHkgYmVsb25ncyB0byB0aGUgOjp0ZXN0aW5nCi0vLyBuYW1lc3BhY2UuICBIb3dldmVyIGlmIHdlIGRlZmluZSBpdCBpbiA6OnRlc3RpbmcsIE1TVkMgd2lsbAotLy8gY29tcGxhaW4gd2hlbiBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhCi0vLyBmcmllbmQgY2xhc3MgdGVtcGxhdGUuICBUbyB3b3JrYXJvdW5kIHRoaXMgY29tcGlsZXIgYnVnLCB3ZSBkZWZpbmUKLS8vIEZ1bmN0aW9uTW9ja2VyIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgYW5kIGltcG9ydCBpdCBpbnRvIDo6dGVzdGluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI7Ci0KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dXV0KLSR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dCi0kdmFyIGFzID0gW1skZm9yIGosIFtbYSRqXV1dXQotJHZhciBBYXMgPSBbWyRmb3IgaiwgW1tBJGogYSRqXV1dXQotJHZhciBtcyA9IFtbJGZvciBqLCBbW20kal1dXV0KLSR2YXIgbWF0Y2hlcnMgPSBbWyRmb3IgaiwgW1tjb25zdCBNYXRjaGVyPEEkaj4mIG0kal1dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVuYW1lX0FzPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UigkQXMpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UigkQXMpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRigkQXMpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKCRtYXRjaGVycykgewotCi0kaWYgaSA+PSAxIFtbCi0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKCRtcykpOwotCi1dXQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKCRBYXMpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKCRhcykpOwotICB9Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIHN0eWxlIGd1aWRlIHByb2hpYml0cyAidXNpbmciIHN0YXRlbWVudHMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUKLS8vIGluc2lkZSBhIGhlYWRlciBmaWxlLiAgSG93ZXZlciwgdGhlIEZ1bmN0aW9uTW9ja2VyIGNsYXNzIHRlbXBsYXRlCi0vLyBpcyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZwotLy8gbGluZSBpcyBqdXN0IGEgdHJpY2sgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLCB3aGljaAotLy8gY2Fubm90IGhhbmRsZSBpdCBpZiB3ZSBkZWZpbmUgRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nLgotdXNpbmcgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOwotCi0vLyBHTU9DS19SRVNVTFRfKHRuLCBGKSBleHBhbmRzIHRvIHRoZSByZXN1bHQgdHlwZSBvZiBmdW5jdGlvbiB0eXBlIEYuCi0vLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhZGljIG1hY3JvIGluIGNhc2UgRiBjb250YWlucyB1bnByb3RlY3RlZAotLy8gY29tbWFzICh0aGUgc2FtZSByZWFzb24gdGhhdCB3ZSB1c2UgdmFyaWFkaWMgbWFjcm9zIGluIG90aGVyIHBsYWNlcwotLy8gaW4gdGhpcyBmaWxlKS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19SRVNVTFRfKHRuLCAuLi4pIFwKLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OlJlc3VsdAotCi0vLyBUaGUgdHlwZSBvZiBhcmd1bWVudCBOIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX0FSR18odG4sIE4sIC4uLikgXAotICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnQjI04KLQotLy8gVGhlIG1hdGNoZXIgdHlwZSBmb3IgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NQVRDSEVSXyh0biwgTiwgLi4uKSBcCi0gICAgY29uc3QgOjp0ZXN0aW5nOjpNYXRjaGVyPEdNT0NLX0FSR18odG4sIE4sIF9fVkFfQVJHU19fKT4mCi0KLS8vIFRoZSB2YXJpYWJsZSBmb3IgbW9ja2luZyB0aGUgZ2l2ZW4gbWV0aG9kLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01PQ0tFUl8oYXJpdHksIGNvbnN0bmVzcywgTWV0aG9kKSBcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhnbW9jayMjY29uc3RuZXNzIyNhcml0eSMjXyMjTWV0aG9kIyNfLCBfX0xJTkVfXykKLQotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgYXJnX2FzID0gW1skZm9yIGosIFwKLSAgICAgIFtbR01PQ0tfQVJHXyh0biwgJGosIF9fVkFfQVJHU19fKSBnbW9ja19hJGpdXV1dCi0kdmFyIGFzID0gW1skZm9yIGosIFtbZ21vY2tfYSRqXV1dXQotJHZhciBtYXRjaGVyX2FzID0gW1skZm9yIGosIFwKLSAgICAgICAgICAgICAgICAgICAgIFtbR01PQ0tfTUFUQ0hFUl8odG4sICRqLCBfX1ZBX0FSR1NfXykgZ21vY2tfYSRqXV1dXQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRCRpW1tdXV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgICRhcmdfYXMpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgPT0gJGkpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfJGlbW11dX2FyZ3VtZW50W1skaWYgaSAhPSAxIFtbc11dXV0pOyBcCi0gICAgR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKCRhcyk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZCgkbWF0Y2hlcl9hcykgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKCRhcyk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpCi0KLQotXV0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX01FVEhPRCRpKG0sIC4uLikgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaShtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVChtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRCRpW1tdXV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0vLyBBIE1vY2tGdW5jdGlvbjxGPiBjbGFzcyBoYXMgb25lIG1vY2sgbWV0aG9kIHdob3NlIHR5cGUgaXMgRi4gIEl0IGlzCi0vLyB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHlvdXIgdGVzdCBjb2RlIHRvIGVtaXQgc29tZSBtZXNzYWdlcyBhbmQKLS8vIGhhdmUgR29vZ2xlIE1vY2sgdmVyaWZ5IHRoZSByaWdodCBtZXNzYWdlcyBhcmUgc2VudCAoYW5kIHBlcmhhcHMgYXQKLS8vIHRoZSByaWdodCB0aW1lcykuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBleGVyY2lzaW5nIGNvZGU6Ci0vLwotLy8gICBGb28oMSk7Ci0vLyAgIEZvbygyKTsKLS8vICAgRm9vKDMpOwotLy8KLS8vIGFuZCB3YW50IHRvIHZlcmlmeSB0aGF0IEZvbygxKSBhbmQgRm9vKDMpIGJvdGggaW52b2tlCi0vLyBtb2NrLkJhcigiYSIpLCBidXQgRm9vKDIpIGRvZXNuJ3QgaW52b2tlIGFueXRoaW5nLCB5b3UgY2FuIHdyaXRlOgotLy8KLS8vIFRFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgewotLy8gICBNeU1vY2sgbW9jazsKLS8vICAgTW9ja0Z1bmN0aW9uPHZvaWQoc3RyaW5nIGNoZWNrX3BvaW50X25hbWUpPiBjaGVjazsKLS8vICAgewotLy8gICAgIEluU2VxdWVuY2UgczsKLS8vCi0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIxIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIyIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKLS8vICAgfQotLy8gICBGb28oMSk7Ci0vLyAgIGNoZWNrLkNhbGwoIjEiKTsKLS8vICAgRm9vKDIpOwotLy8gICBjaGVjay5DYWxsKCIyIik7Ci0vLyAgIEZvbygzKTsKLS8vIH0KLS8vCi0vLyBUaGUgZXhwZWN0YXRpb24gc3BlYyBzYXlzIHRoYXQgdGhlIGZpcnN0IEJhcigiYSIpIG11c3QgaGFwcGVuCi0vLyBiZWZvcmUgY2hlY2sgcG9pbnQgIjEiLCB0aGUgc2Vjb25kIEJhcigiYSIpIG11c3QgaGFwcGVuIGFmdGVyIGNoZWNrCi0vLyBwb2ludCAiMiIsIGFuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4gYmV0d2VlbiB0aGUgdHdvIGNoZWNrCi0vLyBwb2ludHMuIFRoZSBleHBsaWNpdCBjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2gKLS8vIEJhcigiYSIpIGlzIGNhbGxlZCBieSB3aGljaCBjYWxsIHRvIEZvbygpLgotLy8KLS8vIE1vY2tGdW5jdGlvbjxGPiBjYW4gYWxzbyBiZSB1c2VkIHRvIGV4ZXJjaXNlIGNvZGUgdGhhdCBhY2NlcHRzCi0vLyBzdGQ6OmZ1bmN0aW9uPEY+IGNhbGxiYWNrcy4gVG8gZG8gc28sIHVzZSBBc1N0ZEZ1bmN0aW9uKCkgbWV0aG9kCi0vLyB0byBjcmVhdGUgc3RkOjpmdW5jdGlvbiBwcm94eSBmb3J3YXJkaW5nIHRvIG9yaWdpbmFsIG9iamVjdCdzIENhbGwuCi0vLyBFeGFtcGxlOgotLy8KLS8vIFRFU1QoRm9vVGVzdCwgUnVuc0NhbGxiYWNrV2l0aEJhckFyZ3VtZW50KSB7Ci0vLyAgIE1vY2tGdW5jdGlvbjxpbnQoc3RyaW5nKT4gY2FsbGJhY2s7Ci0vLyAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrLCBDYWxsKCJiYXIiKSkuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLS8vICAgRm9vKGNhbGxiYWNrLkFzU3RkRnVuY3Rpb24oKSk7Ci0vLyB9Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIE1vY2tGdW5jdGlvbjsKLQotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotJHZhciBBcmdUeXBlcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgQXJnTmFtZXMgPSBbWyRmb3IgaiwgW1thJGpdXV1dCi0kdmFyIEFyZ0RlY2xzID0gW1skZm9yIGosIFtbQSRqIGEkal1dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXT4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKCRBcmdUeXBlcyk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0QkaVtbXV1fVChDYWxsLCBSKCRBcmdUeXBlcykpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKCRBcmdUeXBlcyk+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXSgkQXJnRGVjbHMpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoJEFyZ05hbWVzKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwNTZmZC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTc5ICswLDAgQEAKLS8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6Ci0vLyAgICAgcHVtcC5weSBnbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCB2YXJpYWRpYyBtYXRjaGVycy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSB0eXBlIG9mIHRoZSBpLXRoICgwLWJhc2VkKSBmaWVsZCBvZiBUdXBsZS4KLSNkZWZpbmUgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGkpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8aSwgVHVwbGU+Ojp0eXBlCi0KLS8vIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgLi4uLCBrbj4gaXMgZm9yIHNlbGVjdGluZyBmaWVsZHMgZnJvbSBhCi0vLyB0dXBsZSBvZiB0eXBlIFR1cGxlLiAgSXQgaGFzIHR3byBtZW1iZXJzOgotLy8KLS8vICAgdHlwZTogYSB0dXBsZSB0eXBlIHdob3NlIGktdGggZmllbGQgaXMgdGhlIGtpLXRoIGZpZWxkIG9mIFR1cGxlLgotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyh0KTogcmV0dXJucyBmaWVsZHMgazAsIC4uLiwgYW5kIGtuIG9mIHQgYXMgYSB0dXBsZS4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaW4gY2xhc3MgVHVwbGVGaWVsZHM8dHVwbGU8Ym9vbCwgY2hhciwgaW50PiwgMiwgMD4sIHdlIGhhdmU6Ci0vLwotLy8gICB0eXBlIGlzIHR1cGxlPGludCwgYm9vbD4sIGFuZAotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyhtYWtlX3R1cGxlKHRydWUsICdhJywgNDIpKSBpcyAoNDIsIHRydWUpLgotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCA9IC0xLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKLSAgICBpbnQgazkgPSAtMT4KLWNsYXNzIFR1cGxlRmllbGRzOwotCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlIDEwIHNlbGVjdG9ycy4KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LAotICAgIGludCBrNywgaW50IGs4LCBpbnQgazk+Ci1jbGFzcyBUdXBsZUZpZWxkcyB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazkpPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCksIGdldDxrMj4odCksIGdldDxrMz4odCksIGdldDxrND4odCksCi0gICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCksIGdldDxrNz4odCksIGdldDxrOD4odCksIGdldDxrOT4odCkpOwotICB9Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgZm9yIDAgfiA5IHNlbGVjdG9ycy4KLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8PiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgLyogdCAqLykgewotICAgIHJldHVybiB0eXBlKCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMT4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazI+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazM+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQ+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNT4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNSk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAotICAgICAgICBnZXQ8azU+KHQpLCBnZXQ8azY+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsCi0gICAgaW50IGs3PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSwgZ2V0PGs3Pih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LAotICAgIGludCBrNywgaW50IGs4PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOCk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSwgZ2V0PGs3Pih0KSwgZ2V0PGs4Pih0KSk7Ci0gIH0KLX07Ci0KLSN1bmRlZiBHTU9DS19GSUVMRF9UWVBFXwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBcmdzKCkgbWF0Y2hlci4KLXRlbXBsYXRlIDxjbGFzcyBBcmdzVHVwbGUsIGludCBrMCA9IC0xLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKLSAgICBpbnQgazkgPSAtMT4KLWNsYXNzIEFyZ3NNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPEFyZ3NUdXBsZT4gewotIHB1YmxpYzoKLSAgLy8gQXJnc1R1cGxlIG1heSBoYXZlIHRvcC1sZXZlbCBjb25zdCBvciByZWZlcmVuY2UgbW9kaWZpZXJzLgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhBcmdzVHVwbGUpIFJhd0FyZ3NUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6VHVwbGVGaWVsZHM8UmF3QXJnc1R1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LAotICAgICAgazYsIGs3LCBrOCwgazk+Ojp0eXBlIFNlbGVjdGVkQXJnczsKLSAgdHlwZWRlZiBNYXRjaGVyPGNvbnN0IFNlbGVjdGVkQXJncyY+IE1vbm9tb3JwaGljSW5uZXJNYXRjaGVyOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IEFyZ3NNYXRjaGVySW1wbChjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpCi0gICAgICA6IGlubmVyX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBTZWxlY3RlZEFyZ3MmPihpbm5lcl9tYXRjaGVyKSkge30KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKEFyZ3NUdXBsZSBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgY29uc3QgU2VsZWN0ZWRBcmdzJiBzZWxlY3RlZF9hcmdzID0gR2V0U2VsZWN0ZWRBcmdzKGFyZ3MpOwotICAgIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKQotICAgICAgcmV0dXJuIGlubmVyX21hdGNoZXJfLk1hdGNoZXMoc2VsZWN0ZWRfYXJncyk7Ci0KLSAgICBQcmludEluZGljZXMobGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAqbGlzdGVuZXIgPDwgImFyZSAiIDw8IFByaW50VG9TdHJpbmcoc2VsZWN0ZWRfYXJncyk7Ci0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc2VsZWN0ZWRfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9saXN0ZW5lcik7Ci0gICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKLSAgICBQcmludEluZGljZXMob3MpOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImFyZSBhIHR1cGxlICI7Ci0gICAgUHJpbnRJbmRpY2VzKG9zKTsKLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIEdldFNlbGVjdGVkQXJncyhBcmdzVHVwbGUgYXJncykgewotICAgIHJldHVybiBUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsCi0gICAgICAgIGs5Pjo6R2V0U2VsZWN0ZWRGaWVsZHMoYXJncyk7Ci0gIH0KLQotICAvLyBQcmludHMgdGhlIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGZpZWxkcy4KLSAgc3RhdGljIHZvaWQgUHJpbnRJbmRpY2VzKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgICpvcyA8PCAid2hvc2UgZmllbGRzICgiOwotICAgIGNvbnN0IGludCBpbmRpY2VzWzEwXSA9IHsgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazkgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgIGlmIChpbmRpY2VzW2ldIDwgMCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmIChpID49IDEpCi0gICAgICAgICpvcyA8PCAiLCAiOwotCi0gICAgICAqb3MgPDwgIiMiIDw8IGluZGljZXNbaV07Ci0gICAgfQotICAgICpvcyA8PCAiKSAiOwotICB9Ci0KLSAgY29uc3QgTW9ub21vcnBoaWNJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlckltcGwpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIElubmVyTWF0Y2hlciwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwKLSAgICBpbnQgazMgPSAtMSwgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsCi0gICAgaW50IGs4ID0gLTEsIGludCBrOSA9IC0xPgotY2xhc3MgQXJnc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQXJnc01hdGNoZXIoY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXyhpbm5lcl9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdzVHVwbGU+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8QXJnc1R1cGxlPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEFyZ3NNYXRjaGVySW1wbDxBcmdzVHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsCi0gICAgICAgIGs2LCBrNywgazgsIGs5Pihpbm5lcl9tYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlcik7Ci19OwotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFsbE9mLgotLy8gQWxsT2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFsbE9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQWxsT2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbGxPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFsbE9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQyIHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0xPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MTxNMj46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTM+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQzIHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0xPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMiwgTTM+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNND4KLXN0cnVjdCBBbGxPZlJlc3VsdDQgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMywgTTQ+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQ1IHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQyPE0xLCBNMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTMsIE00LCBNNT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNj4KLXN0cnVjdCBBbGxPZlJlc3VsdDYgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTQsIE01LCBNNj46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQ3IHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE00LCBNNSwgTTYsIE03Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQ4IHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NDxNNSwgTTYsIE03LCBNOD46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOT4KLXN0cnVjdCBBbGxPZlJlc3VsdDkgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ1PE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPgotc3RydWN0IEFsbE9mUmVzdWx0MTAgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NTxNNiwgTTcsIE04LCBNOSwgTTEwPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFueU9mLgotLy8gQW55T2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFueU9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQW55T2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbnlPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFueU9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQyIHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDE8TTE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQxPE0yPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KLXN0cnVjdCBBbnlPZlJlc3VsdDMgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MTxNMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTIsIE0zPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ0IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMywgTTQ+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ1IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MzxNMywgTTQsIE01Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02Pgotc3RydWN0IEFueU9mUmVzdWx0NiB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE00LCBNNSwgTTY+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03Pgotc3RydWN0IEFueU9mUmVzdWx0NyB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE00LCBNNSwgTTYsIE03Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ4IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE01LCBNNiwgTTcsIE04Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05Pgotc3RydWN0IEFueU9mUmVzdWx0OSB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTksIHR5cGVuYW1lIE0xMD4KLXN0cnVjdCBBbnlPZlJlc3VsdDEwIHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNNiwgTTcsIE04LCBNOSwgTTEwPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQXJnczxOMSwgTjIsIC4uLiwgTms+KGFfbWF0Y2hlcikgbWF0Y2hlcyBhIHR1cGxlIGlmIHRoZSBzZWxlY3RlZAotLy8gZmllbGRzIG9mIGl0IG1hdGNoZXMgYV9tYXRjaGVyLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0Ci0vLyBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlcj4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMj4obWF0Y2hlcik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMz4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNT4obWF0Y2hlcik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNj4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywKLSAgICB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwKLSAgICAgIGs3PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazg+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsCi0gICAgICBrOD4obWF0Y2hlcik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICBpbnQgazksIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgIGs5PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIGludCBrOSwgaW50IGsxMCwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazksCi0gICAgazEwPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgIGs5LCBrMTA+KG1hdGNoZXIpOwotfQotCi0vLyBFbGVtZW50c0FyZShlXzEsIGVfMiwgLi4uIGVfbikgbWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdpdGgKLS8vIG4gZWxlbWVudHMsIHdoZXJlIHRoZSBpLXRoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBtdXN0Ci0vLyBtYXRjaCB0aGUgaS10aCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIEVhY2ggYXJndW1lbnQgb2YKLS8vIEVsZW1lbnRzQXJlKCkgY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gIFdlIHN1cHBvcnQgdXAgdG8KLS8vIDEwIGFyZ3VtZW50cy4KLS8vCi0vLyBUaGUgdXNlIG9mIERlY2F5QXJyYXkgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFsbG93cyBFbGVtZW50c0FyZSgpCi0vLyB0byBhY2NlcHQgc3RyaW5nIGxpdGVyYWxzLCB3aG9zZSB0eXBlIGlzIGNvbnN0IGNoYXJbTl0sIGJ1dCB3ZQotLy8gd2FudCB0byB0cmVhdCB0aGVtIGFzIGNvbnN0IGNoYXIqLgotLy8KLS8vIE5PVEU6IFNpbmNlIEVsZW1lbnRzQXJlKCkgY2FyZXMgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cywgaXQKLS8vIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBjb250YWluZXJzIHdob3NlIGVsZW1lbnRzJ3Mgb3JkZXIgaXMKLS8vIHVuZGVmaW5lZCAoZS5nLiBoYXNoX21hcCkuCi0KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8PiA+Ci1FbGVtZW50c0FyZSgpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LCBlNiwgZTcsCi0gICAgICBlOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCwgY29uc3QgVDkmIGU5KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywKLSAgICAgIGU4LCBlOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTksCi0gICAgY29uc3QgVDEwJiBlMTApIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDEwPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywKLSAgICAgIGU4LCBlOSwgZTEwKSk7Ci19Ci0KLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4sIGVfbikgaXMgYW4gRWxlbWVudHNBcmUgZXh0ZW5zaW9uCi0vLyB0aGF0IG1hdGNoZXMgbiBlbGVtZW50cyBpbiBhbnkgb3JkZXIuICBXZSBzdXBwb3J0IHVwIHRvIG49MTAgYXJndW1lbnRzLgotCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPD4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTw+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGU+ID4KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+ID4KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKLSAgICAgIGU2LCBlNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LAotICAgICAgZTYsIGU3LCBlOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCwgY29uc3QgVDkmIGU5KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNiwgZTcsIGU4LCBlOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTksCi0gICAgY29uc3QgVDEwJiBlMTApIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDEwPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNiwgZTcsIGU4LCBlOSwgZTEwKSk7Ci19Ci0KLS8vIEFsbE9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFsbCBvZiB0aGUgZ2l2ZW4KLS8vIHN1Yi1tYXRjaGVycy4gIEFsbE9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSgKLSAgICAgIG0xLAotICAgICAgbTIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlKAotICAgICAgbTEsCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0yLCBtMykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yKSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTMsIG00KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yKSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTMsIG00LCBtNSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNCwgbTUsIG02KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDc8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTc+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNykgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNCwgbTUsIG02LCBtNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0ODxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTg+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMywgbTQpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNSwgbTYsIG03LCBtOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCwgTTkgbTkpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LAotICAgICAgTTk+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zLCBtNCksCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG01LCBtNiwgbTcsIG04LCBtOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05LCB0eXBlbmFtZSBNMTA+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0MTA8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOSwKLSAgICBNMTA+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgsIE05IG05LCBNMTAgbTEwKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LAotICAgICAgTTEwPjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMywgbTQsIG01KSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTYsIG03LCBtOCwgbTksIG0xMCkpOwotfQotCi0vLyBBbnlPZihtMSwgbTIsIC4uLiwgbWspIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIGdpdmVuCi0vLyBzdWItbWF0Y2hlcnMuICBBbnlPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQyPE0xLCBNMj46OnR5cGUoCi0gICAgICBtMSwKLSAgICAgIG0yKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTM+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMykgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZSgKLSAgICAgIG0xLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMiwgbTMpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0zLCBtNCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ1PE0xLCBNMiwgTTMsIE00LCBNNT46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0zLCBtNCwgbTUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNj4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ2PE0xLCBNMiwgTTMsIE00LCBNNSwgTTY+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ2PE0xLCBNMiwgTTMsIE00LCBNNSwgTTY+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zKSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTQsIG01LCBtNikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNz4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ3PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03Pjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDc8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTc+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zKSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTQsIG01LCBtNiwgbTcpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ4PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOD46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00KSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTUsIG02LCBtNywgbTgpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOT4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ5PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgsIE05IG05KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ5PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwKLSAgICAgIE05Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yLCBtMywgbTQpLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNSwgbTYsIG03LCBtOCwgbTkpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDEwPE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTksCi0gICAgTTEwPjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSwgTTEwIG0xMCkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MTA8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOSwKLSAgICAgIE0xMD46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00LCBtNSksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG02LCBtNywgbTgsIG05LCBtMTApKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotCi0vLyBUaGUgTUFUQ0hFUiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bwotLy8gZGVmaW5lIGN1c3RvbSBtYXRjaGVycyBlYXNpbHkuCi0vLwotLy8gQmFzaWMgVXNhZ2UKLS8vID09PT09PT09PT09Ci0vLwotLy8gVGhlIHN5bnRheAotLy8KLS8vICAgTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIGRlZmluZXMgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUgc3RhdGVtZW50cywKLS8vIHdoaWNoIG11c3QgcmV0dXJuIGEgYm9vbCB0byBpbmRpY2F0ZSBpZiB0aGUgbWF0Y2ggc3VjY2VlZHMuICBJbnNpZGUKLS8vIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGJ5ICdhcmcnLAotLy8gYW5kIHJlZmVyIHRvIGl0cyB0eXBlIGJ5ICdhcmdfdHlwZScuCi0vLwotLy8gVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBkb2N1bWVudHMgd2hhdCB0aGUgbWF0Y2hlciBkb2VzLCBhbmQgaXMgdXNlZAotLy8gdG8gZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBtYXRjaCBmYWlscy4gIFNpbmNlIGEKLS8vIE1BVENIRVIoKSBpcyB1c3VhbGx5IGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBzaGFyZWQgYnkgbXVsdGlwbGUKLS8vIEMrKyBzb3VyY2UgZmlsZXMsIHdlIHJlcXVpcmUgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGEgQy1zdHJpbmcKLS8vIGxpdGVyYWwgdG8gYXZvaWQgcG9zc2libGUgc2lkZSBlZmZlY3RzLiAgSXQgY2FuIGJlIGVtcHR5LCBpbiB3aGljaAotLy8gY2FzZSB3ZSdsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgYXMgdGhlCi0vLyBkZXNjcmlwdGlvbi4KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIE1BVENIRVIoSXNFdmVuLCAiIikgeyByZXR1cm4gKGFyZyAlIDIpID09IDA7IH0KLS8vCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlCi0vLwotLy8gICAvLyBFeHBlY3RzIG1vY2tfZm9vLkJhcihuKSB0byBiZSBjYWxsZWQgd2hlcmUgbiBpcyBldmVuLgotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgQmFyKElzRXZlbigpKSk7Ci0vLwotLy8gb3IsCi0vLwotLy8gICAvLyBWZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiBzb21lX2V4cHJlc3Npb24gaXMgZXZlbi4KLS8vICAgRVhQRUNUX1RIQVQoc29tZV9leHByZXNzaW9uLCBJc0V2ZW4oKSk7Ci0vLwotLy8gSWYgdGhlIGFib3ZlIGFzc2VydGlvbiBmYWlscywgaXQgd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZToKLS8vCi0vLyAgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KLS8vICAgRXhwZWN0ZWQ6IGlzIGV2ZW4KLS8vICAgICBBY3R1YWw6IDcKLS8vCi0vLyB3aGVyZSB0aGUgZGVzY3JpcHRpb24gImlzIGV2ZW4iIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZQotLy8gbWF0Y2hlciBuYW1lIElzRXZlbi4KLS8vCi0vLyBBcmd1bWVudCBUeXBlCi0vLyA9PT09PT09PT09PT09Ci0vLwotLy8gTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIChhcmdfdHlwZSkgaXMKLS8vIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggeW91IHVzZSB0aGUgbWF0Y2hlciBhbmQgaXMKLS8vIHN1cHBsaWVkIHRvIHlvdSBieSB0aGUgY29tcGlsZXIsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0Ci0vLyBkZWNsYXJpbmcgaXQgKG5vciBjYW4geW91KS4gIFRoaXMgYWxsb3dzIHRoZSBtYXRjaGVyIHRvIGJlCi0vLyBwb2x5bW9ycGhpYy4gIEZvciBleGFtcGxlLCBJc0V2ZW4oKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbnkgdHlwZQotLy8gd2hlcmUgdGhlIHZhbHVlIG9mICIoYXJnICUgMikgPT0gMCIgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCi0vLyBhIGJvb2wuICBJbiB0aGUgIkJhcihJc0V2ZW4oKSkiIGV4YW1wbGUgYWJvdmUsIGlmIG1ldGhvZCBCYXIoKQotLy8gdGFrZXMgYW4gaW50LCAnYXJnX3R5cGUnIHdpbGwgYmUgaW50OyBpZiBpdCB0YWtlcyBhbiB1bnNpZ25lZCBsb25nLAotLy8gJ2FyZ190eXBlJyB3aWxsIGJlIHVuc2lnbmVkIGxvbmc7IGFuZCBzbyBvbi4KLS8vCi0vLyBQYXJhbWV0ZXJpemluZyBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBtYXRjaGVyLiAgRm9yIHRoYXQgeW91Ci0vLyBjYW4gdXNlIGFub3RoZXIgbWFjcm86Ci0vLwotLy8gICBNQVRDSEVSX1AobmFtZSwgcGFyYW1fbmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSwgIiIpIHsgcmV0dXJuIGFicyhhcmcpID09IHZhbHVlOyB9Ci0vLwotLy8gd2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6Ci0vLwotLy8gICBFWFBFQ1RfVEhBVChCbGFoKCJhIiksIEhhc0Fic29sdXRlVmFsdWUobikpOwotLy8KLS8vIHdoaWNoIG1heSBsZWFkIHRvIHRoaXMgbWVzc2FnZSAoYXNzdW1pbmcgbiBpcyAxMCk6Ci0vLwotLy8gICBWYWx1ZSBvZjogQmxhaCgiYSIpCi0vLyAgIEV4cGVjdGVkOiBoYXMgYWJzb2x1dGUgdmFsdWUgMTAKLS8vICAgICBBY3R1YWw6IC05Ci0vLwotLy8gTm90ZSB0aGF0IGJvdGggdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgYXJlCi0vLyBwcmludGVkLCBtYWtpbmcgdGhlIG1lc3NhZ2UgaHVtYW4tZnJpZW5kbHkuCi0vLwotLy8gSW4gdGhlIG1hdGNoZXIgZGVmaW5pdGlvbiBib2R5LCB5b3UgY2FuIHdyaXRlICdmb29fdHlwZScgdG8KLS8vIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCAnZm9vJy4gIEZvciBleGFtcGxlLCBpbiB0aGUKLS8vIGJvZHkgb2YgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlKSBhYm92ZSwgeW91IGNhbiB3cml0ZQotLy8gJ3ZhbHVlX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG9mICd2YWx1ZScuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIE1BVENIRVJfUDIsIE1BVENIRVJfUDMsIC4uLiwgdXAgdG8gTUFUQ0hFUl9QMTAgdG8KLS8vIHN1cHBvcnQgbXVsdGktcGFyYW1ldGVyIG1hdGNoZXJzLgotLy8KLS8vIERlc2NyaWJpbmcgUGFyYW1ldGVyaXplZCBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gVGhlIGxhc3QgYXJndW1lbnQgdG8gTUFUQ0hFUiooKSBpcyBhIHN0cmluZy10eXBlZCBleHByZXNzaW9uLiAgVGhlCi0vLyBleHByZXNzaW9uIGNhbiByZWZlcmVuY2UgYWxsIG9mIHRoZSBtYXRjaGVyJ3MgcGFyYW1ldGVycyBhbmQgYQotLy8gc3BlY2lhbCBib29sLXR5cGVkIHZhcmlhYmxlIG5hbWVkICduZWdhdGlvbicuICBXaGVuICduZWdhdGlvbicgaXMKLS8vIGZhbHNlLCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIG1hdGNoZXIncyBkZXNjcmlwdGlvbjsKLS8vIG90aGVyd2lzZSBpdCBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWdhdGlvbiBvZgotLy8gdGhlIG1hdGNoZXIuICBGb3IgZXhhbXBsZSwKLS8vCi0vLyAgIHVzaW5nIHRlc3Rpbmc6OlByaW50VG9TdHJpbmc7Ci0vLwotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksCi0vLyAgICAgICBzdHJpbmcobmVnYXRpb24gPyAiaXMgbm90IiA6ICJpcyIpICsgIiBpbiByYW5nZSBbIiArCi0vLyAgICAgICBQcmludFRvU3RyaW5nKGxvdykgKyAiLCAiICsgUHJpbnRUb1N0cmluZyhoaSkgKyAiXSIpIHsKLS8vICAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOwotLy8gICBFWFBFQ1RfVEhBVCgzLCBOb3QoSW5DbG9zZWRSYW5nZSgyLCA0KSkpOwotLy8KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6Ci0vLwotLy8gICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdCi0vLyAgIC4uLgotLy8gICBFeHBlY3RlZDogaXMgbm90IGluIHJhbmdlIFsyLCA0XQotLy8KLS8vIElmIHlvdSBzcGVjaWZ5ICIiIGFzIHRoZSBkZXNjcmlwdGlvbiwgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aWxsCi0vLyBjb250YWluIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGZvbGxvd2VkIGJ5IHRoZQotLy8gcGFyYW1ldGVyIHZhbHVlcyBwcmludGVkIGFzIGEgdHVwbGUuICBGb3IgZXhhbXBsZSwKLS8vCi0vLyAgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwgIiIpIHsgLi4uIH0KLS8vICAgLi4uCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOwotLy8gICBFWFBFQ1RfVEhBVCgzLCBOb3QoSW5DbG9zZWRSYW5nZSgyLCA0KSkpOwotLy8KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6Ci0vLwotLy8gICBFeHBlY3RlZDogaW4gY2xvc2VkIHJhbmdlICg0LCA2KQotLy8gICAuLi4KLS8vICAgRXhwZWN0ZWQ6IG5vdCAoaW4gY2xvc2VkIHJhbmdlICgyLCA0KSkKLS8vCi0vLyBUeXBlcyBvZiBNYXRjaGVyIFBhcmFtZXRlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldwotLy8KLS8vICAgTUFUQ0hFUl9QayhGb28sIHAxLCAuLi4sIHBrLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgLi4uIH0KLS8vCi0vLyBhcyBzaG9ydGhhbmQgZm9yCi0vLwotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgotLy8gICBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPgotLy8gICBGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9Ci0vLwotLy8gV2hlbiB5b3Ugd3JpdGUgRm9vKHYxLCAuLi4sIHZrKSwgdGhlIGNvbXBpbGVyIGluZmVycyB0aGUgdHlwZXMgb2YKLS8vIHRoZSBwYXJhbWV0ZXJzIHYxLCAuLi4sIGFuZCB2ayBmb3IgeW91LiAgSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aAotLy8gdGhlIHJlc3VsdCBvZiB0aGUgdHlwZSBpbmZlcmVuY2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgdHlwZXMgYnkKLS8vIGV4cGxpY2l0bHkgaW5zdGFudGlhdGluZyB0aGUgdGVtcGxhdGUsIGFzIGluIEZvbzxsb25nLCBib29sPig1LAotLy8gZmFsc2UpLiAgQXMgc2FpZCBlYXJsaWVyLCB5b3UgZG9uJ3QgZ2V0IHRvIChvciBuZWVkIHRvKSBzcGVjaWZ5Ci0vLyAnYXJnX3R5cGUnIGFzIHRoYXQncyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBtYXRjaGVyCi0vLyBpcyB1c2VkLiAgWW91IGNhbiBhc3NpZ24gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uIEZvbyhwMSwgLi4uLCBwaykKLS8vIHRvIGEgdmFyaWFibGUgb2YgdHlwZSBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPi4gIFRoaXMKLS8vIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgbWF0Y2hlcnMuCi0vLwotLy8gV2hpbGUgeW91IGNhbiBpbnN0YW50aWF0ZSBhIG1hdGNoZXIgdGVtcGxhdGUgd2l0aCByZWZlcmVuY2UgdHlwZXMsCi0vLyBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGJ5IHBvaW50ZXIgdXN1YWxseSBtYWtlcyB5b3VyIGNvZGUgbW9yZQotLy8gcmVhZGFibGUuICBJZiwgaG93ZXZlciwgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBhIHBhcmFtZXRlciBieQotLy8gcmVmZXJlbmNlLCBiZSBhd2FyZSB0aGF0IGluIHRoZSBmYWlsdXJlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZQotLy8gbWF0Y2hlciB5b3Ugd2lsbCBzZWUgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdCBidXQgbm90IGl0cwotLy8gYWRkcmVzcy4KLS8vCi0vLyBFeHBsYWluaW5nIE1hdGNoIFJlc3VsdHMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFNvbWV0aW1lcyB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbG9uZSBpc24ndCBlbm91Z2ggdG8gZXhwbGFpbiB3aHkKLS8vIHRoZSBtYXRjaCBoYXMgZmFpbGVkIG9yIHN1Y2NlZWRlZC4gIEZvciBleGFtcGxlLCB3aGVuIGV4cGVjdGluZyBhCi0vLyBsb25nIHN0cmluZywgaXQgY2FuIGJlIHZlcnkgaGVscGZ1bCB0byBhbHNvIHByaW50IHRoZSBkaWZmIGJldHdlZW4KLS8vIHRoZSBleHBlY3RlZCBzdHJpbmcgYW5kIHRoZSBhY3R1YWwgb25lLiAgVG8gYWNoaWV2ZSB0aGF0LCB5b3UgY2FuCi0vLyBvcHRpb25hbGx5IHN0cmVhbSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGEgc3BlY2lhbCB2YXJpYWJsZQotLy8gbmFtZWQgcmVzdWx0X2xpc3RlbmVyLCB3aG9zZSB0eXBlIGlzIGEgcG9pbnRlciB0byBjbGFzcwotLy8gTWF0Y2hSZXN1bHRMaXN0ZW5lcjoKLS8vCi0vLyAgIE1BVENIRVJfUChFcXVhbHNMb25nU3RyaW5nLCBzdHIsICIiKSB7Ci0vLyAgICAgaWYgKGFyZyA9PSBzdHIpIHJldHVybiB0cnVlOwotLy8KLS8vICAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ0aGUgZGlmZmVyZW5jZTogIgotLy8vICAgICAgICAgICAgICAgICAgICAgPDwgRGlmZlN0cmluZ3Moc3RyLCBhcmcpOwotLy8gICAgIHJldHVybiBmYWxzZTsKLS8vICAgfQotLy8KLS8vIE92ZXJsb2FkaW5nIE1hdGNoZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFlvdSBjYW4gb3ZlcmxvYWQgbWF0Y2hlcnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzOgotLy8KLS8vICAgTUFUQ0hFUl9QKEJsYWgsIGEsIGRlc2NyaXB0aW9uX3N0cmluZzEpIHsgLi4uIH0KLS8vICAgTUFUQ0hFUl9QMihCbGFoLCBhLCBiLCBkZXNjcmlwdGlvbl9zdHJpbmcyKSB7IC4uLiB9Ci0vLwotLy8gQ2F2ZWF0cwotLy8gPT09PT09PQotLy8KLS8vIFdoZW4gZGVmaW5pbmcgYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZwotLy8gTWF0Y2hlckludGVyZmFjZSBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkuICBUaGVzZQotLy8gYXBwcm9hY2hlcyByZXF1aXJlIG1vcmUgd29yayB0aGFuIHRoZSBNQVRDSEVSKiBtYWNyb3MsIGJ1dCBhbHNvCi0vLyBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZAotLy8gdGhlIG1hdGNoZXIgcGFyYW1ldGVycywgd2hpY2ggbWF5IGxlYWRzIHRvIGJldHRlciBjb21waWxlciBlcnJvcgotLy8gbWVzc2FnZXMgd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIHdyb25nLiAgVGhleSBhbHNvIGFsbG93Ci0vLyBvdmVybG9hZGluZyBtYXRjaGVycyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQgdG8ganVzdAotLy8gYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBNQVRDSEVSKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCi0vLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIE1BVENIRVIqKCkgaW5zaWRlCi0vLyBhIGZ1bmN0aW9uLgotLy8KLS8vIE1vcmUgSW5mb3JtYXRpb24KLS8vID09PT09PT09PT09PT09PT0KLS8vCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ01BVENIRVInCi0vLyBvbiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rLgotCi0jZGVmaW5lIE1BVENIRVIobmFtZSwgZGVzY3JpcHRpb24pXAotICBjbGFzcyBuYW1lIyNNYXRjaGVyIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKClcCi0gICAgICAgICAgIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8PigpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KCkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXIoKSB7XAotICAgIH1cCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXIpO1wKLSAgfTtcCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyIG5hbWUoKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyKCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXI6Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1AobmFtZSwgcDAsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMClcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZT4ocDApKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwKSk7XAotICAgIH1cCi0gICAgZXhwbGljaXQgbmFtZSMjTWF0Y2hlclAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclApO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA8cDAjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCkge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA8cDAjI190eXBlPihwMCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QMihuYW1lLCBwMCwgcDEsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclAyIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGU+KHAwLCBwMSkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxKSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICBwMShnbW9ja19wMSkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAyKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAyPHAwIyNfdHlwZSwgcDEjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDI8cDAjI190eXBlLCBwMSMjX3R5cGU+KHAwLCBwMSk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQMjxwMCMjX3R5cGUsIFwKLSAgICAgIHAxIyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1AzKG5hbWUsIHAwLCBwMSwgcDIsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDMge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMilcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+KHAwLCBwMSwgXAotICAgICAgICAgICAgICAgICAgICBwMikpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMikpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQMyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQMyk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMikge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+KHAwLCBwMSwgcDIpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgXAotICAgICAgcDIjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDQobmFtZSwgcDAsIHAxLCBwMiwgcDMsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQNCB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzKVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMykge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwMyMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzKSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMykpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQNChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA0KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICBwMyMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXAotICAgICAgcDMjI190eXBlIHAzKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlPihwMCwgXAotICAgICAgICBwMSwgcDIsIHAzKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICBwMyMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QNShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclA1IHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNClcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclA1KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBcCi0gICAgICAgIHA0IyNfdHlwZSBnbW9ja19wNCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNSk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICAgIHA0IyNfdHlwZSBwNCkge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A2KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDYge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXAotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDYocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA2KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcCi0gICAgICBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgIHA1IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A3KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBkZXNjcmlwdGlvbilcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDcge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXAotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgICAgICAgICAgICAgICAgICBwNikpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDcocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIFwKLSAgICAgICAgcDYoZ21vY2tfcDYpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDcpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgXAotICAgICAgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBcCi0gICAgICBwNiMjX3R5cGUgcDYpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A4KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDgge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNylcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNykge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+KHAwLCBwMSwgcDIsIFwKLSAgICAgICAgICAgICAgICAgICAgcDMsIHA0LCBwNSwgcDYsIHA3KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDgocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNiwgXAotICAgICAgICBwNyMjX3R5cGUgZ21vY2tfcDcpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgIHA3IyNfdHlwZSBwNztcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQOCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwKLSAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBcCi0gICAgICBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNykge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgcDYsIHA3KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXAotICAgICAgcDcjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDkobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQOSB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBwOCMjX3R5cGUgZ21vY2tfcDgpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXAotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcCi0gICAgICAgICAgICAgICBwOChnbW9ja19wOCkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICAgcDgjI190eXBlIHA4O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHA4IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQOShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgcDgoZ21vY2tfcDgpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgIHA3IyNfdHlwZSBwNztcCi0gICAgcDgjI190eXBlIHA4O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA5KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwKLSAgICAgIHA4IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICAgIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNywgXAotICAgICAgcDgjI190eXBlIHA4KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlPihwMCwgcDEsIHAyLCBcCi0gICAgICAgIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgcDgjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDEwKG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBkZXNjcmlwdGlvbilcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDEwIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIHA4IyNfdHlwZSBnbW9ja19wOCwgXAotICAgICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSlcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgICAgICAgIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgICBwMyMjX3R5cGUgcDM7XAotICAgICAgcDQjI190eXBlIHA0O1wKLSAgICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgICBwNiMjX3R5cGUgcDY7XAotICAgICAgcDcjI190eXBlIHA3O1wKLSAgICAgIHA4IyNfdHlwZSBwODtcCi0gICAgICBwOSMjX3R5cGUgcDk7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwOSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQMTAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBcCi0gICAgICAgIHA4IyNfdHlwZSBnbW9ja19wOCwgcDkjI190eXBlIGdtb2NrX3A5KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCi0gICAgICAgIHA3KGdtb2NrX3A3KSwgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgcDcjI190eXBlIHA3O1wKLSAgICBwOCMjX3R5cGUgcDg7XAotICAgIHA5IyNfdHlwZSBwOTtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQMTApO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICBwOSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIHA4IyNfdHlwZSBwOCwgXAotICAgICAgcDkjI190eXBlIHA5KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgcDkjI190eXBlPihwMCwgXAotICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAotICAgICAgcDkjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgucHVtcCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTMwYzJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bwotJCQgZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC4KLSQkCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KLSQkIH19IFRoaXMgbGluZSBmaXhlcyBhdXRvLWluZGVudGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBFbWFjcy4KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCB2YXJpYWRpYyBtYXRjaGVycy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSRyYW5nZSBpIDAuLm4tMQotCi0vLyBUaGUgdHlwZSBvZiB0aGUgaS10aCAoMC1iYXNlZCkgZmllbGQgb2YgVHVwbGUuCi0jZGVmaW5lIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBpKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjp0dXBsZV9lbGVtZW50PGksIFR1cGxlPjo6dHlwZQotCi0vLyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIC4uLiwga24+IGlzIGZvciBzZWxlY3RpbmcgZmllbGRzIGZyb20gYQotLy8gdHVwbGUgb2YgdHlwZSBUdXBsZS4gIEl0IGhhcyB0d28gbWVtYmVyczoKLS8vCi0vLyAgIHR5cGU6IGEgdHVwbGUgdHlwZSB3aG9zZSBpLXRoIGZpZWxkIGlzIHRoZSBraS10aCBmaWVsZCBvZiBUdXBsZS4KLS8vICAgR2V0U2VsZWN0ZWRGaWVsZHModCk6IHJldHVybnMgZmllbGRzIGswLCAuLi4sIGFuZCBrbiBvZiB0IGFzIGEgdHVwbGUuCi0vLwotLy8gRm9yIGV4YW1wbGUsIGluIGNsYXNzIFR1cGxlRmllbGRzPHR1cGxlPGJvb2wsIGNoYXIsIGludD4sIDIsIDA+LCB3ZSBoYXZlOgotLy8KLS8vICAgdHlwZSBpcyB0dXBsZTxpbnQsIGJvb2w+LCBhbmQKLS8vICAgR2V0U2VsZWN0ZWRGaWVsZHMobWFrZV90dXBsZSh0cnVlLCAnYScsIDQyKSkgaXMgKDQyLCB0cnVlKS4KLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlJGZvciBpIFtbLCBpbnQgayRpID0gLTFdXT4KLWNsYXNzIFR1cGxlRmllbGRzOwotCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlICRuIHNlbGVjdG9ycy4KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSRmb3IgaSBbWywgaW50IGskaV1dPgotY2xhc3MgVHVwbGVGaWVsZHMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaSwgW1tHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgayRpKV1dPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKCRmb3IgaSwgW1tnZXQ8ayRpPih0KV1dKTsKLSAgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIGZvciAwIH4gJChuLTEpIHNlbGVjdG9ycy4KLQotJGZvciBpIFtbCi0kJCB9fX0KLSRyYW5nZSBqIDAuLmktMQotJHJhbmdlIGsgMC4ubi0xCi0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSRmb3IgaiBbWywgaW50IGskal1dPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsICRmb3IgaywgW1skaWYgayA8IGkgW1trJGtdXSAkZWxzZSBbWy0xXV1dXT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgayRqKV1dPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgJGlmIGk9PTAgW1svKiB0ICovXV0gJGVsc2UgW1t0XV0pIHsKLSAgICByZXR1cm4gdHlwZSgkZm9yIGosIFtbZ2V0PGskaj4odCldXSk7Ci0gIH0KLX07Ci0KLV1dCi0KLSN1bmRlZiBHTU9DS19GSUVMRF9UWVBFXwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBcmdzKCkgbWF0Y2hlci4KLQotJHZhciBrcyA9IFtbJGZvciBpLCBbW2skaV1dXV0KLXRlbXBsYXRlIDxjbGFzcyBBcmdzVHVwbGUkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPgotY2xhc3MgQXJnc01hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8QXJnc1R1cGxlPiB7Ci0gcHVibGljOgotICAvLyBBcmdzVHVwbGUgbWF5IGhhdmUgdG9wLWxldmVsIGNvbnN0IG9yIHJlZmVyZW5jZSBtb2RpZmllcnMuCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEFyZ3NUdXBsZSkgUmF3QXJnc1R1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsICRrcz46OnR5cGUgU2VsZWN0ZWRBcmdzOwotICB0eXBlZGVmIE1hdGNoZXI8Y29uc3QgU2VsZWN0ZWRBcmdzJj4gTW9ub21vcnBoaWNJbm5lck1hdGNoZXI7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLSAgZXhwbGljaXQgQXJnc01hdGNoZXJJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikKLSAgICAgIDogaW5uZXJfbWF0Y2hlcl8oU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlbGVjdGVkQXJncyY+KGlubmVyX21hdGNoZXIpKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQXJnc1R1cGxlIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBjb25zdCBTZWxlY3RlZEFyZ3MmIHNlbGVjdGVkX2FyZ3MgPSBHZXRTZWxlY3RlZEFyZ3MoYXJncyk7Ci0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpCi0gICAgICByZXR1cm4gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hlcyhzZWxlY3RlZF9hcmdzKTsKLQotICAgIFByaW50SW5kaWNlcyhsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICpsaXN0ZW5lciA8PCAiYXJlICIgPDwgUHJpbnRUb1N0cmluZyhzZWxlY3RlZF9hcmdzKTsKLQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgY29uc3QgYm9vbCBtYXRjaCA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzZWxlY3RlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKLSAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOwotICAgIFByaW50SW5kaWNlcyhvcyk7Ci0gICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKLSAgICBQcmludEluZGljZXMob3MpOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgR2V0U2VsZWN0ZWRBcmdzKEFyZ3NUdXBsZSBhcmdzKSB7Ci0gICAgcmV0dXJuIFR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgJGtzPjo6R2V0U2VsZWN0ZWRGaWVsZHMoYXJncyk7Ci0gIH0KLQotICAvLyBQcmludHMgdGhlIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGZpZWxkcy4KLSAgc3RhdGljIHZvaWQgUHJpbnRJbmRpY2VzKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgICpvcyA8PCAid2hvc2UgZmllbGRzICgiOwotICAgIGNvbnN0IGludCBpbmRpY2VzWyRuXSA9IHsgJGtzIH07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAkbjsgaSsrKSB7Ci0gICAgICBpZiAoaW5kaWNlc1tpXSA8IDApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoaSA+PSAxKQotICAgICAgICAqb3MgPDwgIiwgIjsKLQotICAgICAgKm9zIDw8ICIjIiA8PCBpbmRpY2VzW2ldOwotICAgIH0KLSAgICAqb3MgPDwgIikgIjsKLSAgfQotCi0gIGNvbnN0IE1vbm9tb3JwaGljSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXJnc01hdGNoZXJJbXBsKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBJbm5lck1hdGNoZXIkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPgotY2xhc3MgQXJnc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQXJnc01hdGNoZXIoY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXyhpbm5lcl9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdzVHVwbGU+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8QXJnc1R1cGxlPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEFyZ3NNYXRjaGVySW1wbDxBcmdzVHVwbGUsICRrcz4oaW5uZXJfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXJnc01hdGNoZXIpOwotfTsKLQotLy8gQSBzZXQgb2YgbWV0YWZ1bmN0aW9ucyBmb3IgY29tcHV0aW5nIHRoZSByZXN1bHQgdHlwZSBvZiBBbGxPZi4KLS8vIEFsbE9mKG0xLCAuLi4sIG1OKSByZXR1cm5zCi0vLyBBbGxPZlJlc3VsdE48ZGVjbHR5cGUobTEpLCAuLi4sIGRlY2x0eXBlKG1OKT46OnR5cGUuCi0KLS8vIEFsdGhvdWdoIEFsbE9mIGlzbid0IGRlZmluZWQgZm9yIG9uZSBhcmd1bWVudCwgQWxsT2ZSZXN1bHQxIGlzIGRlZmluZWQKLS8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMT4KLXN0cnVjdCBBbGxPZlJlc3VsdDEgewotICB0eXBlZGVmIE0xIHR5cGU7Ci19OwotCi0kcmFuZ2UgaSAxLi5uCi0KLSRyYW5nZSBpIDIuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMi4uaQotJHZhciBtID0gaS8yCi0kcmFuZ2UgayAxLi5tCi0kcmFuZ2UgdCBtKzEuLmkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xJGZvciBqIFtbLCB0eXBlbmFtZSBNJGpdXT4KLXN0cnVjdCBBbGxPZlJlc3VsdCRpIHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQkbTwkZm9yIGssIFtbTSRrXV0+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQkKGktbSk8JGZvciB0LCBbW00kdF1dPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi1dXQotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFueU9mLgotLy8gQW55T2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFueU9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQW55T2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbnlPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFueU9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLSRyYW5nZSBpIDEuLm4KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAyLi5pCi0kdmFyIG0gPSBpLzIKLSRyYW5nZSBrIDEuLm0KLSRyYW5nZSB0IG0rMS4uaQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEkZm9yIGogW1ssIHR5cGVuYW1lIE0kal1dPgotc3RydWN0IEFueU9mUmVzdWx0JGkgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0JG08JGZvciBrLCBbW00ka11dPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0JChpLW0pPCRmb3IgdCwgW1tNJHRdXT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEFyZ3M8TjEsIE4yLCAuLi4sIE5rPihhX21hdGNoZXIpIG1hdGNoZXMgYSB0dXBsZSBpZiB0aGUgc2VsZWN0ZWQKLS8vIGZpZWxkcyBvZiBpdCBtYXRjaGVzIGFfbWF0Y2hlci4gIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGVmYXVsdAotLy8gYXJndW1lbnRzIGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMsIHNvIHdlIGhhdmUgdG8gb3ZlcmxvYWQgaXQuCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotdGVtcGxhdGUgPCRmb3IgaiBbW2ludCBrJGosIF1ddHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIkZm9yIGogW1ssIGskal1dPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIkZm9yIGogW1ssIGskal1dPihtYXRjaGVyKTsKLX0KLQotCi1dXQotLy8gRWxlbWVudHNBcmUoZV8xLCBlXzIsIC4uLiBlX24pIG1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aXRoCi0vLyBuIGVsZW1lbnRzLCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IGluIHRoZSBjb250YWluZXIgbXVzdAotLy8gbWF0Y2ggdGhlIGktdGggYXJndW1lbnQgaW4gdGhlIGxpc3QuICBFYWNoIGFyZ3VtZW50IG9mCi0vLyBFbGVtZW50c0FyZSgpIGNhbiBiZSBlaXRoZXIgYSB2YWx1ZSBvciBhIG1hdGNoZXIuICBXZSBzdXBwb3J0IHVwIHRvCi0vLyAkbiBhcmd1bWVudHMuCi0vLwotLy8gVGhlIHVzZSBvZiBEZWNheUFycmF5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgRWxlbWVudHNBcmUoKQotLy8gdG8gYWNjZXB0IHN0cmluZyBsaXRlcmFscywgd2hvc2UgdHlwZSBpcyBjb25zdCBjaGFyW05dLCBidXQgd2UKLS8vIHdhbnQgdG8gdHJlYXQgdGhlbSBhcyBjb25zdCBjaGFyKi4KLS8vCi0vLyBOT1RFOiBTaW5jZSBFbGVtZW50c0FyZSgpIGNhcmVzIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMsIGl0Ci0vLyBtdXN0IG5vdCBiZSB1c2VkIHdpdGggY29udGFpbmVycyB3aG9zZSBlbGVtZW50cydzIG9yZGVyIGlzCi0vLyB1bmRlZmluZWQgKGUuZy4gaGFzaF9tYXApLgotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkgW1sKLQotJHJhbmdlIGogMS4uaQotCi0kaWYgaT4wIFtbCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci1dXQotCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotJGZvciBqLCBbWwotCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQkaltbXV0+Ojp0eXBlXV0+ID4KLUVsZW1lbnRzQXJlKCRmb3IgaiwgW1tjb25zdCBUJGomIGUkal1dKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSRmb3IgaiwgW1sKLQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygkZm9yIGosIFtbZSRqXV0pKTsKLX0KLQotXV0KLQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmUoZV8xLCBlXzIsIC4uLiwgZV9uKSBpcyBhbiBFbGVtZW50c0FyZSBleHRlbnNpb24KLS8vIHRoYXQgbWF0Y2hlcyBuIGVsZW1lbnRzIGluIGFueSBvcmRlci4gIFdlIHN1cHBvcnQgdXAgdG8gbj0kbiBhcmd1bWVudHMuCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotCi0kcmFuZ2UgaiAxLi5pCi0KLSRpZiBpPjAgW1sKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLV1dCi0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0kZm9yIGosIFtbCi0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoJGZvciBqLCBbW2NvbnN0IFQkaiYgZSRqXV0pIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotJGZvciBqLCBbWwotCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKCRmb3IgaiwgW1tlJGpdXSkpOwotfQotCi1dXQotCi0vLyBBbGxPZihtMSwgbTIsIC4uLiwgbWspIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbGwgb2YgdGhlIGdpdmVuCi0vLyBzdWItbWF0Y2hlcnMuICBBbGxPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLgotCi0kcmFuZ2UgaSAyLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgbSA9IGkvMgotJHJhbmdlIGsgMS4ubQotJHJhbmdlIHQgbSsxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgTSRqXV0+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZQotQWxsT2YoJGZvciBqLCBbW00kaiBtJGpdXSkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZSgKLSAgICAgICRpZiBtID09IDEgW1ttMV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbGxPZigkZm9yIGssIFtbbSRrXV0pXV0sCi0gICAgICAkaWYgbSsxID09IGkgW1ttJGldXSAkZWxzZSBbWzo6dGVzdGluZzo6QWxsT2YoJGZvciB0LCBbW20kdF1dKV1dKTsKLX0KLQotXV0KLQotLy8gQW55T2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBnaXZlbgotLy8gc3ViLW1hdGNoZXJzLiAgQW55T2YgaXMgY2FsbGVkIGZ1bGx5IHF1YWxpZmllZCB0byBwcmV2ZW50IEFETCBmcm9tIGZpcmluZy4KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIG0gPSBpLzIKLSRyYW5nZSBrIDEuLm0KLSRyYW5nZSB0IG0rMS4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIE0kal1dPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdCRpPCRmb3IgaiwgW1tNJGpdXT46OnR5cGUKLUFueU9mKCRmb3IgaiwgW1tNJGogbSRqXV0pIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdCRpPCRmb3IgaiwgW1tNJGpdXT46OnR5cGUoCi0gICAgICAkaWYgbSA9PSAxIFtbbTFdXSAkZWxzZSBbWzo6dGVzdGluZzo6QW55T2YoJGZvciBrLCBbW20ka11dKV1dLAotICAgICAgJGlmIG0rMSA9PSBpIFtbbSRpXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFueU9mKCRmb3IgdCwgW1ttJHRdXSldXSk7Ci19Ci0KLV1dCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0kJCB9IC8vIFRoaXMgUHVtcCBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gSXQgd2lsbCBub3QKLSQkICAgLy8gc2hvdyB1cCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLQotLy8gVGhlIE1BVENIRVIqIGZhbWlseSBvZiBtYWNyb3MgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUgdG8KLS8vIGRlZmluZSBjdXN0b20gbWF0Y2hlcnMgZWFzaWx5LgotLy8KLS8vIEJhc2ljIFVzYWdlCi0vLyA9PT09PT09PT09PQotLy8KLS8vIFRoZSBzeW50YXgKLS8vCi0vLyAgIE1BVENIRVIobmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBkZWZpbmVzIGEgbWF0Y2hlciB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlIHN0YXRlbWVudHMsCi0vLyB3aGljaCBtdXN0IHJldHVybiBhIGJvb2wgdG8gaW5kaWNhdGUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLiAgSW5zaWRlCi0vLyB0aGUgc3RhdGVtZW50cywgeW91IGNhbiByZWZlciB0byB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBieSAnYXJnJywKLS8vIGFuZCByZWZlciB0byBpdHMgdHlwZSBieSAnYXJnX3R5cGUnLgotLy8KLS8vIFRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZG9jdW1lbnRzIHdoYXQgdGhlIG1hdGNoZXIgZG9lcywgYW5kIGlzIHVzZWQKLS8vIHRvIGdlbmVyYXRlIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiB0aGUgbWF0Y2ggZmFpbHMuICBTaW5jZSBhCi0vLyBNQVRDSEVSKCkgaXMgdXN1YWxseSBkZWZpbmVkIGluIGEgaGVhZGVyIGZpbGUgc2hhcmVkIGJ5IG11bHRpcGxlCi0vLyBDKysgc291cmNlIGZpbGVzLCB3ZSByZXF1aXJlIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBhIEMtc3RyaW5nCi0vLyBsaXRlcmFsIHRvIGF2b2lkIHBvc3NpYmxlIHNpZGUgZWZmZWN0cy4gIEl0IGNhbiBiZSBlbXB0eSwgaW4gd2hpY2gKLS8vIGNhc2Ugd2UnbGwgdXNlIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGFzIHRoZQotLy8gZGVzY3JpcHRpb24uCi0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBNQVRDSEVSKElzRXZlbiwgIiIpIHsgcmV0dXJuIChhcmcgJSAyKSA9PSAwOyB9Ci0vLwotLy8gYWxsb3dzIHlvdSB0byB3cml0ZQotLy8KLS8vICAgLy8gRXhwZWN0cyBtb2NrX2Zvby5CYXIobikgdG8gYmUgY2FsbGVkIHdoZXJlIG4gaXMgZXZlbi4KLS8vICAgRVhQRUNUX0NBTEwobW9ja19mb28sIEJhcihJc0V2ZW4oKSkpOwotLy8KLS8vIG9yLAotLy8KLS8vICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2Ygc29tZV9leHByZXNzaW9uIGlzIGV2ZW4uCi0vLyAgIEVYUEVDVF9USEFUKHNvbWVfZXhwcmVzc2lvbiwgSXNFdmVuKCkpOwotLy8KLS8vIElmIHRoZSBhYm92ZSBhc3NlcnRpb24gZmFpbHMsIGl0IHdpbGwgcHJpbnQgc29tZXRoaW5nIGxpa2U6Ci0vLwotLy8gICBWYWx1ZSBvZjogc29tZV9leHByZXNzaW9uCi0vLyAgIEV4cGVjdGVkOiBpcyBldmVuCi0vLyAgICAgQWN0dWFsOiA3Ci0vLwotLy8gd2hlcmUgdGhlIGRlc2NyaXB0aW9uICJpcyBldmVuIiBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZnJvbSB0aGUKLS8vIG1hdGNoZXIgbmFtZSBJc0V2ZW4uCi0vLwotLy8gQXJndW1lbnQgVHlwZQotLy8gPT09PT09PT09PT09PQotLy8KLS8vIE5vdGUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCAoYXJnX3R5cGUpIGlzCi0vLyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHlvdSB1c2UgdGhlIG1hdGNoZXIgYW5kIGlzCi0vLyBzdXBwbGllZCB0byB5b3UgYnkgdGhlIGNvbXBpbGVyLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dAotLy8gZGVjbGFyaW5nIGl0IChub3IgY2FuIHlvdSkuICBUaGlzIGFsbG93cyB0aGUgbWF0Y2hlciB0byBiZQotLy8gcG9seW1vcnBoaWMuICBGb3IgZXhhbXBsZSwgSXNFdmVuKCkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYW55IHR5cGUKLS8vIHdoZXJlIHRoZSB2YWx1ZSBvZiAiKGFyZyAlIDIpID09IDAiIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gYSBib29sLiAgSW4gdGhlICJCYXIoSXNFdmVuKCkpIiBleGFtcGxlIGFib3ZlLCBpZiBtZXRob2QgQmFyKCkKLS8vIHRha2VzIGFuIGludCwgJ2FyZ190eXBlJyB3aWxsIGJlIGludDsgaWYgaXQgdGFrZXMgYW4gdW5zaWduZWQgbG9uZywKLS8vICdhcmdfdHlwZScgd2lsbCBiZSB1bnNpZ25lZCBsb25nOyBhbmQgc28gb24uCi0vLwotLy8gUGFyYW1ldGVyaXppbmcgTWF0Y2hlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBhcmFtZXRlcml6ZSB0aGUgbWF0Y2hlci4gIEZvciB0aGF0IHlvdQotLy8gY2FuIHVzZSBhbm90aGVyIG1hY3JvOgotLy8KLS8vICAgTUFUQ0hFUl9QKG5hbWUsIHBhcmFtX25hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUsICIiKSB7IHJldHVybiBhYnMoYXJnKSA9PSB2YWx1ZTsgfQotLy8KLS8vIHdpbGwgYWxsb3cgeW91IHRvIHdyaXRlOgotLy8KLS8vICAgRVhQRUNUX1RIQVQoQmxhaCgiYSIpLCBIYXNBYnNvbHV0ZVZhbHVlKG4pKTsKLS8vCi0vLyB3aGljaCBtYXkgbGVhZCB0byB0aGlzIG1lc3NhZ2UgKGFzc3VtaW5nIG4gaXMgMTApOgotLy8KLS8vICAgVmFsdWUgb2Y6IEJsYWgoImEiKQotLy8gICBFeHBlY3RlZDogaGFzIGFic29sdXRlIHZhbHVlIDEwCi0vLyAgICAgQWN0dWFsOiAtOQotLy8KLS8vIE5vdGUgdGhhdCBib3RoIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIGFyZQotLy8gcHJpbnRlZCwgbWFraW5nIHRoZSBtZXNzYWdlIGh1bWFuLWZyaWVuZGx5LgotLy8KLS8vIEluIHRoZSBtYXRjaGVyIGRlZmluaXRpb24gYm9keSwgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnIHRvCi0vLyByZWZlcmVuY2UgdGhlIHR5cGUgb2YgYSBwYXJhbWV0ZXIgbmFtZWQgJ2ZvbycuICBGb3IgZXhhbXBsZSwgaW4gdGhlCi0vLyBib2R5IG9mIE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSkgYWJvdmUsIHlvdSBjYW4gd3JpdGUKLS8vICd2YWx1ZV90eXBlJyB0byByZWZlciB0byB0aGUgdHlwZSBvZiAndmFsdWUnLgotLy8KLS8vIFdlIGFsc28gcHJvdmlkZSBNQVRDSEVSX1AyLCBNQVRDSEVSX1AzLCAuLi4sIHVwIHRvIE1BVENIRVJfUCRuIHRvCi0vLyBzdXBwb3J0IG11bHRpLXBhcmFtZXRlciBtYXRjaGVycy4KLS8vCi0vLyBEZXNjcmliaW5nIFBhcmFtZXRlcml6ZWQgTWF0Y2hlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFRoZSBsYXN0IGFyZ3VtZW50IHRvIE1BVENIRVIqKCkgaXMgYSBzdHJpbmctdHlwZWQgZXhwcmVzc2lvbi4gIFRoZQotLy8gZXhwcmVzc2lvbiBjYW4gcmVmZXJlbmNlIGFsbCBvZiB0aGUgbWF0Y2hlcidzIHBhcmFtZXRlcnMgYW5kIGEKLS8vIHNwZWNpYWwgYm9vbC10eXBlZCB2YXJpYWJsZSBuYW1lZCAnbmVnYXRpb24nLiAgV2hlbiAnbmVnYXRpb24nIGlzCi0vLyBmYWxzZSwgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGV2YWx1YXRlIHRvIHRoZSBtYXRjaGVyJ3MgZGVzY3JpcHRpb247Ci0vLyBvdGhlcndpc2UgaXQgc2hvdWxkIGV2YWx1YXRlIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbmVnYXRpb24gb2YKLS8vIHRoZSBtYXRjaGVyLiAgRm9yIGV4YW1wbGUsCi0vLwotLy8gICB1c2luZyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nOwotLy8KLS8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLAotLy8gICAgICAgc3RyaW5nKG5lZ2F0aW9uID8gImlzIG5vdCIgOiAiaXMiKSArICIgaW4gcmFuZ2UgWyIgKwotLy8gICAgICAgUHJpbnRUb1N0cmluZyhsb3cpICsgIiwgIiArIFByaW50VG9TdHJpbmcoaGkpICsgIl0iKSB7Ci0vLyAgICAgcmV0dXJuIGxvdyA8PSBhcmcgJiYgYXJnIDw9IGhpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsKLS8vICAgRVhQRUNUX1RIQVQoMywgTm90KEluQ2xvc2VkUmFuZ2UoMiwgNCkpKTsKLS8vCi0vLyB3b3VsZCBnZW5lcmF0ZSB0d28gZmFpbHVyZXMgdGhhdCBjb250YWluIHRoZSB0ZXh0OgotLy8KLS8vICAgRXhwZWN0ZWQ6IGlzIGluIHJhbmdlIFs0LCA2XQotLy8gICAuLi4KLS8vICAgRXhwZWN0ZWQ6IGlzIG5vdCBpbiByYW5nZSBbMiwgNF0KLS8vCi0vLyBJZiB5b3Ugc3BlY2lmeSAiIiBhcyB0aGUgZGVzY3JpcHRpb24sIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2lsbAotLy8gY29udGFpbiB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBmb2xsb3dlZCBieSB0aGUKLS8vIHBhcmFtZXRlciB2YWx1ZXMgcHJpbnRlZCBhcyBhIHR1cGxlLiAgRm9yIGV4YW1wbGUsCi0vLwotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksICIiKSB7IC4uLiB9Ci0vLyAgIC4uLgotLy8gICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsKLS8vICAgRVhQRUNUX1RIQVQoMywgTm90KEluQ2xvc2VkUmFuZ2UoMiwgNCkpKTsKLS8vCi0vLyB3b3VsZCBnZW5lcmF0ZSB0d28gZmFpbHVyZXMgdGhhdCBjb250YWluIHRoZSB0ZXh0OgotLy8KLS8vICAgRXhwZWN0ZWQ6IGluIGNsb3NlZCByYW5nZSAoNCwgNikKLS8vICAgLi4uCi0vLyAgIEV4cGVjdGVkOiBub3QgKGluIGNsb3NlZCByYW5nZSAoMiwgNCkpCi0vLwotLy8gVHlwZXMgb2YgTWF0Y2hlciBQYXJhbWV0ZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBGb3IgdGhlIHB1cnBvc2Ugb2YgdHlwaW5nLCB5b3UgY2FuIHZpZXcKLS8vCi0vLyAgIE1BVENIRVJfUGsoRm9vLCBwMSwgLi4uLCBwaywgZGVzY3JpcHRpb25fc3RyaW5nKSB7IC4uLiB9Ci0vLwotLy8gYXMgc2hvcnRoYW5kIGZvcgotLy8KLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIHAxX3R5cGUsIC4uLiwgdHlwZW5hbWUgcGtfdHlwZT4KLS8vICAgRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4KLS8vICAgRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQotLy8KLS8vIFdoZW4geW91IHdyaXRlIEZvbyh2MSwgLi4uLCB2ayksIHRoZSBjb21waWxlciBpbmZlcnMgdGhlIHR5cGVzIG9mCi0vLyB0aGUgcGFyYW1ldGVycyB2MSwgLi4uLCBhbmQgdmsgZm9yIHlvdS4gIElmIHlvdSBhcmUgbm90IGhhcHB5IHdpdGgKLS8vIHRoZSByZXN1bHQgb2YgdGhlIHR5cGUgaW5mZXJlbmNlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIHR5cGVzIGJ5Ci0vLyBleHBsaWNpdGx5IGluc3RhbnRpYXRpbmcgdGhlIHRlbXBsYXRlLCBhcyBpbiBGb288bG9uZywgYm9vbD4oNSwKLS8vIGZhbHNlKS4gIEFzIHNhaWQgZWFybGllciwgeW91IGRvbid0IGdldCB0byAob3IgbmVlZCB0bykgc3BlY2lmeQotLy8gJ2FyZ190eXBlJyBhcyB0aGF0J3MgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbWF0Y2hlcgotLy8gaXMgdXNlZC4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbiBGb28ocDEsIC4uLiwgcGspCi0vLyB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4uICBUaGlzCi0vLyBjYW4gYmUgdXNlZnVsIHdoZW4gY29tcG9zaW5nIG1hdGNoZXJzLgotLy8KLS8vIFdoaWxlIHlvdSBjYW4gaW5zdGFudGlhdGUgYSBtYXRjaGVyIHRlbXBsYXRlIHdpdGggcmVmZXJlbmNlIHR5cGVzLAotLy8gcGFzc2luZyB0aGUgcGFyYW1ldGVycyBieSBwb2ludGVyIHVzdWFsbHkgbWFrZXMgeW91ciBjb2RlIG1vcmUKLS8vIHJlYWRhYmxlLiAgSWYsIGhvd2V2ZXIsIHlvdSBzdGlsbCB3YW50IHRvIHBhc3MgYSBwYXJhbWV0ZXIgYnkKLS8vIHJlZmVyZW5jZSwgYmUgYXdhcmUgdGhhdCBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUKLS8vIG1hdGNoZXIgeW91IHdpbGwgc2VlIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlZCBvYmplY3QgYnV0IG5vdCBpdHMKLS8vIGFkZHJlc3MuCi0vLwotLy8gRXhwbGFpbmluZyBNYXRjaCBSZXN1bHRzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBTb21ldGltZXMgdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gYWxvbmUgaXNuJ3QgZW5vdWdoIHRvIGV4cGxhaW4gd2h5Ci0vLyB0aGUgbWF0Y2ggaGFzIGZhaWxlZCBvciBzdWNjZWVkZWQuICBGb3IgZXhhbXBsZSwgd2hlbiBleHBlY3RpbmcgYQotLy8gbG9uZyBzdHJpbmcsIGl0IGNhbiBiZSB2ZXJ5IGhlbHBmdWwgdG8gYWxzbyBwcmludCB0aGUgZGlmZiBiZXR3ZWVuCi0vLyB0aGUgZXhwZWN0ZWQgc3RyaW5nIGFuZCB0aGUgYWN0dWFsIG9uZS4gIFRvIGFjaGlldmUgdGhhdCwgeW91IGNhbgotLy8gb3B0aW9uYWxseSBzdHJlYW0gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBhIHNwZWNpYWwgdmFyaWFibGUKLS8vIG5hbWVkIHJlc3VsdF9saXN0ZW5lciwgd2hvc2UgdHlwZSBpcyBhIHBvaW50ZXIgdG8gY2xhc3MKLS8vIE1hdGNoUmVzdWx0TGlzdGVuZXI6Ci0vLwotLy8gICBNQVRDSEVSX1AoRXF1YWxzTG9uZ1N0cmluZywgc3RyLCAiIikgewotLy8gICAgIGlmIChhcmcgPT0gc3RyKSByZXR1cm4gdHJ1ZTsKLS8vCi0vLyAgICAgKnJlc3VsdF9saXN0ZW5lciA8PCAidGhlIGRpZmZlcmVuY2U6ICIKLS8vLyAgICAgICAgICAgICAgICAgICAgIDw8IERpZmZTdHJpbmdzKHN0ciwgYXJnKTsKLS8vICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgIH0KLS8vCi0vLyBPdmVybG9hZGluZyBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBZb3UgY2FuIG92ZXJsb2FkIG1hdGNoZXJzIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoKLS8vCi0vLyAgIE1BVENIRVJfUChCbGFoLCBhLCBkZXNjcmlwdGlvbl9zdHJpbmcxKSB7IC4uLiB9Ci0vLyAgIE1BVENIRVJfUDIoQmxhaCwgYSwgYiwgZGVzY3JpcHRpb25fc3RyaW5nMikgeyAuLi4gfQotLy8KLS8vIENhdmVhdHMKLS8vID09PT09PT0KLS8vCi0vLyBXaGVuIGRlZmluaW5nIGEgbmV3IG1hdGNoZXIsIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcKLS8vIE1hdGNoZXJJbnRlcmZhY2Ugb3IgdXNpbmcgTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpLiAgVGhlc2UKLS8vIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmsgdGhhbiB0aGUgTUFUQ0hFUiogbWFjcm9zLCBidXQgYWxzbwotLy8gZ2l2ZSB5b3UgbW9yZSBjb250cm9sIG9uIHRoZSB0eXBlcyBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBhbmQKLS8vIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMsIHdoaWNoIG1heSBsZWFkcyB0byBiZXR0ZXIgY29tcGlsZXIgZXJyb3IKLS8vIG1lc3NhZ2VzIHdoZW4gdGhlIG1hdGNoZXIgaXMgdXNlZCB3cm9uZy4gIFRoZXkgYWxzbyBhbGxvdwotLy8gb3ZlcmxvYWRpbmcgbWF0Y2hlcnMgYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkIHRvIGp1c3QKLS8vIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycykuCi0vLwotLy8gTUFUQ0hFUiooKSBjYW4gb25seSBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlLiAgVGhlIHJlYXNvbiBpcwotLy8gdGhhdCBDKysgZG9lc24ndCB5ZXQgYWxsb3cgZnVuY3Rpb24tbG9jYWwgdHlwZXMgdG8gYmUgdXNlZCB0bwotLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzLiAgVGhlIHVwLWNvbWluZyBDKysweCBzdGFuZGFyZCB3aWxsIGZpeCB0aGlzLgotLy8gT25jZSB0aGF0J3MgZG9uZSwgd2UnbGwgY29uc2lkZXIgc3VwcG9ydGluZyB1c2luZyBNQVRDSEVSKigpIGluc2lkZQotLy8gYSBmdW5jdGlvbi4KLS8vCi0vLyBNb3JlIEluZm9ybWF0aW9uCi0vLyA9PT09PT09PT09PT09PT09Ci0vLwotLy8gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyB0aGVzZSBtYWNyb3MsIHBsZWFzZSBzZWFyY2ggZm9yICdNQVRDSEVSJwotLy8gb24gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vay4KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpCi0KLVtbCi0kdmFyIG1hY3JvX25hbWUgPSBbWyRpZiBpPT0wIFtbTUFUQ0hFUl1dICRlbGlmIGk9PTEgW1tNQVRDSEVSX1BdXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSBbW01BVENIRVJfUCRpXV1dXQotJHZhciBjbGFzc19uYW1lID0gW1tuYW1lIyNNYXRjaGVyW1skaWYgaT09MCBbW11dICRlbGlmIGk9PTEgW1tQXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSBbW1AkaV1dXV1dXQotJHJhbmdlIGogMC4uaS0xCi0kdmFyIHRlbXBsYXRlID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbCi0KLSAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBwJGojI190eXBlXV0+XAotXV1dXQotJHZhciBjdG9yX3BhcmFtX2xpc3QgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dXV0KLSR2YXIgaW1wbF9jdG9yX3BhcmFtX2xpc3QgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dXV0KLSR2YXIgaW1wbF9pbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQotJHZhciBpbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQotJHZhciBwYXJhbXMgPSBbWyRmb3IgaiwgW1twJGpdXV1dCi0kdmFyIHBhcmFtX3R5cGVzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbPCRmb3IgaiwgW1twJGojI190eXBlXV0+XV1dXQotJHZhciBwYXJhbV90eXBlc19hbmRfbmFtZXMgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIHAkal1dXV0KLSR2YXIgcGFyYW1fZmllbGRfZGVjbHMgPSBbWyRmb3IgagotW1sKLQotICAgICAgcCRqIyNfdHlwZSBwJGo7XAotXV1dXQotJHZhciBwYXJhbV9maWVsZF9kZWNsczIgPSBbWyRmb3IgagotW1sKLQotICAgIHAkaiMjX3R5cGUgcCRqO1wKLV1dXV0KLQotI2RlZmluZSAkbWFjcm9fbmFtZShuYW1lJGZvciBqIFtbLCBwJGpdXSwgZGVzY3JpcHRpb24pXCR0ZW1wbGF0ZQotICBjbGFzcyAkY2xhc3NfbmFtZSB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV1nbW9ja19JbXBsKCRpbXBsX2N0b3JfcGFyYW1fbGlzdClcCi0gICAgICAgICAgJGltcGxfaW5pdHMge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwkcGFyYW1fZmllbGRfZGVjbHMKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbcCRqIyNfdHlwZV1dPigkZm9yIGosIFtbcCRqXV0pKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KCRwYXJhbXMpKTtcCi0gICAgfVwKLSAgICBbWyRpZiBpPT0xIFtbZXhwbGljaXQgXV1dXSRjbGFzc19uYW1lKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHtcCi0gICAgfVwkcGFyYW1fZmllbGRfZGVjbHMyCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKCRjbGFzc19uYW1lKTtcCi0gIH07XCR0ZW1wbGF0ZQotICBpbmxpbmUgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMgbmFtZSgkcGFyYW1fdHlwZXNfYW5kX25hbWVzKSB7XAotICAgIHJldHVybiAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcygkcGFyYW1zKTtcCi0gIH1cJHRlbXBsYXRlCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXM6Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLV1dCi0KLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk1ZjRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBJbXBsZW1lbnRzIGNsYXNzIHRlbXBsYXRlcyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jay4KLS8vCi0vLyBHaXZlbiBhIG1vY2sgY2xhc3MgTW9ja0ZvbyB0aGF0IGlzIGNyZWF0ZWQgdXNpbmcgR29vZ2xlIE1vY2ssCi0vLyBOaWNlTW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCBhbGxvd3MKLS8vIHVuaW50ZXJlc3RpbmcgY2FsbHMgKGkuZS4gY2FsbHMgdG8gbW9jayBtZXRob2RzIHRoYXQgaGF2ZSBubwotLy8gRVhQRUNUX0NBTEwgc3BlY3MpLCBOYWdneU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vCi0vLyB0aGF0IHByaW50cyBhIHdhcm5pbmcgd2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgb2NjdXJzLCBhbmQKLS8vIFN0cmljdE1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vIHRoYXQgdHJlYXRzIGFsbAotLy8gdW5pbnRlcmVzdGluZyBjYWxscyBhcyBlcnJvcnMuCi0vLwotLy8gQ3VycmVudGx5IGEgbW9jayBpcyBuYWdneSBieSBkZWZhdWx0LCBzbyBNb2NrRm9vIGFuZAotLy8gTmFnZ3lNb2NrPE1vY2tGb28+IGJlaGF2ZSBsaWtlIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugd2lsbCBzb29uCi0vLyBzd2l0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbW9ja3MgdG8gYmUgbmljZSwgYXMgdGhhdCBpbiBnZW5lcmFsCi0vLyBsZWFkcyB0byBtb3JlIG1haW50YWluYWJsZSB0ZXN0cy4gIFdoZW4gdGhhdCBoYXBwZW5zLCBNb2NrRm9vIHdpbGwKLS8vIHN0b3AgYmVoYXZpbmcgbGlrZSBOYWdneU1vY2s8TW9ja0Zvbz4gYW5kIHN0YXJ0IGJlaGF2aW5nIGxpa2UKLS8vIE5pY2VNb2NrPE1vY2tGb28+LgotLy8KLS8vIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrICJpbmhlcml0IiB0aGUgY29uc3RydWN0b3JzIG9mCi0vLyB0aGVpciByZXNwZWN0aXZlIGJhc2UgY2xhc3MsIHdpdGggdXAtdG8gMTAgYXJndW1lbnRzLiAgVGhlcmVmb3JlCi0vLyB5b3UgY2FuIHdyaXRlIE5pY2VNb2NrPE1vY2tGb28+KDUsICJhIikgdG8gY29uc3RydWN0IGEgbmljZSBtb2NrCi0vLyB3aGVyZSBNb2NrRm9vIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyAoaW50LCBjb25zdCBjaGFyKiksCi0vLyBmb3IgZXhhbXBsZS4KLS8vCi0vLyBBIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCBOaWNlTW9jazxNb2NrRm9vPiwgTmFnZ3lNb2NrPE1vY2tGb28+LAotLy8gYW5kIFN0cmljdE1vY2s8TW9ja0Zvbz4gb25seSB3b3JrcyBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcKLS8vIHRoZSBNT0NLX01FVEhPRCogZmFtaWx5IG9mIG1hY3JvcyBESVJFQ1RMWSBpbiB0aGUgTW9ja0ZvbyBjbGFzcy4KLS8vIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3Mgb2YgTW9ja0ZvbywgdGhlICJuaWNlIgotLy8gb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuCi0vLyBJbiBwYXJ0aWN1bGFyLCBuZXN0aW5nIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGlzIE5PVAotLy8gc3VwcG9ydGVkLgotLy8KLS8vIEFub3RoZXIga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGJhc2UgbW9jawotLy8gY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBhcmUKLS8vIGJhbm5lZCBieSB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSBhbnl3YXkuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4KLWNsYXNzIE5pY2VNb2NrIDogcHVibGljIE1vY2tDbGFzcyB7Ci0gcHVibGljOgotICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMKLSAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuCi0gIE5pY2VNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIC8vIEMrKyBkb2Vzbid0ICh5ZXQpIGFsbG93IGluaGVyaXRhbmNlIG9mIGNvbnN0cnVjdG9ycywgc28gd2UgaGF2ZQotICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KLSAgZXhwbGljaXQgTmljZU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMikgOiBNb2NrQ2xhc3MoYTEsIGEyKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTY+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAotICAgICAgYTYsIGE3KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCkgOiBNb2NrQ2xhc3MoYTEsCi0gICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHZpcnR1YWwgfk5pY2VNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5pY2VNb2NrKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2NrQ2xhc3M+Ci1jbGFzcyBOYWdneU1vY2sgOiBwdWJsaWMgTW9ja0NsYXNzIHsKLSBwdWJsaWM6Ci0gIC8vIFdlIGRvbid0IGZhY3RvciBvdXQgdGhlIGNvbnN0cnVjdG9yIGJvZHkgdG8gYSBjb21tb24gbWV0aG9kLCBhcwotICAvLyB3ZSBoYXZlIHRvIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCBtZW1iZXJzIG9mIE1vY2tDbGFzcy4KLSAgTmFnZ3lNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCi0gIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgotICBleHBsaWNpdCBOYWdneU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMikgOiBNb2NrQ2xhc3MoYTEsIGEyKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNj4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAotICAgICAgYTYsIGE3KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCkgOiBNb2NrQ2xhc3MoYTEsCi0gICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdmlydHVhbCB+TmFnZ3lNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5hZ2d5TW9jayk7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jayA6IHB1YmxpYyBNb2NrQ2xhc3MgewotIHB1YmxpYzoKLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzCi0gIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLgotICBTdHJpY3RNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCi0gIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgotICBleHBsaWNpdCBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSkgOiBNb2NrQ2xhc3MoYTEpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLAotICAgICAgY29uc3QgQTQmIGE0KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2PgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwKLSAgICAgIGE2LCBhNykgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwKLSAgICAgIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsIGNvbnN0IEE5JiBhOSwKLSAgICAgIGNvbnN0IEExMCYgYTEwKSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHZpcnR1YWwgflN0cmljdE1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyaWN0TW9jayk7Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBjYXRjaCBzb21lIChyZWxhdGl2ZWx5IG1vcmUgY29tbW9uKQotLy8gdXNlciBlcnJvcnMgb2YgbmVzdGluZyBuaWNlIGFuZCBzdHJpY3QgbW9ja3MuICBUaGV5IGRvIE5PVCBjYXRjaAotLy8gYWxsIHBvc3NpYmxlIGVycm9ycy4KLQotLy8gVGhlc2Ugc3BlY2lhbGl6YXRpb25zIGFyZSBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQsIGFzIE5pY2VNb2NrLAotLy8gTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jayBjYW5ub3QgYmUgbmVzdGVkLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5pY2VNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOYWdneU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBTdHJpY3RNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX05JQ0VfU1RSSUNUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWUxY2U3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bwotJCQgZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmguCi0kJAotJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuCi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBJbXBsZW1lbnRzIGNsYXNzIHRlbXBsYXRlcyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jay4KLS8vCi0vLyBHaXZlbiBhIG1vY2sgY2xhc3MgTW9ja0ZvbyB0aGF0IGlzIGNyZWF0ZWQgdXNpbmcgR29vZ2xlIE1vY2ssCi0vLyBOaWNlTW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCBhbGxvd3MKLS8vIHVuaW50ZXJlc3RpbmcgY2FsbHMgKGkuZS4gY2FsbHMgdG8gbW9jayBtZXRob2RzIHRoYXQgaGF2ZSBubwotLy8gRVhQRUNUX0NBTEwgc3BlY3MpLCBOYWdneU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vCi0vLyB0aGF0IHByaW50cyBhIHdhcm5pbmcgd2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgb2NjdXJzLCBhbmQKLS8vIFN0cmljdE1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vIHRoYXQgdHJlYXRzIGFsbAotLy8gdW5pbnRlcmVzdGluZyBjYWxscyBhcyBlcnJvcnMuCi0vLwotLy8gQ3VycmVudGx5IGEgbW9jayBpcyBuYWdneSBieSBkZWZhdWx0LCBzbyBNb2NrRm9vIGFuZAotLy8gTmFnZ3lNb2NrPE1vY2tGb28+IGJlaGF2ZSBsaWtlIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugd2lsbCBzb29uCi0vLyBzd2l0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbW9ja3MgdG8gYmUgbmljZSwgYXMgdGhhdCBpbiBnZW5lcmFsCi0vLyBsZWFkcyB0byBtb3JlIG1haW50YWluYWJsZSB0ZXN0cy4gIFdoZW4gdGhhdCBoYXBwZW5zLCBNb2NrRm9vIHdpbGwKLS8vIHN0b3AgYmVoYXZpbmcgbGlrZSBOYWdneU1vY2s8TW9ja0Zvbz4gYW5kIHN0YXJ0IGJlaGF2aW5nIGxpa2UKLS8vIE5pY2VNb2NrPE1vY2tGb28+LgotLy8KLS8vIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrICJpbmhlcml0IiB0aGUgY29uc3RydWN0b3JzIG9mCi0vLyB0aGVpciByZXNwZWN0aXZlIGJhc2UgY2xhc3MsIHdpdGggdXAtdG8gJG4gYXJndW1lbnRzLiAgVGhlcmVmb3JlCi0vLyB5b3UgY2FuIHdyaXRlIE5pY2VNb2NrPE1vY2tGb28+KDUsICJhIikgdG8gY29uc3RydWN0IGEgbmljZSBtb2NrCi0vLyB3aGVyZSBNb2NrRm9vIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyAoaW50LCBjb25zdCBjaGFyKiksCi0vLyBmb3IgZXhhbXBsZS4KLS8vCi0vLyBBIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCBOaWNlTW9jazxNb2NrRm9vPiwgTmFnZ3lNb2NrPE1vY2tGb28+LAotLy8gYW5kIFN0cmljdE1vY2s8TW9ja0Zvbz4gb25seSB3b3JrcyBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcKLS8vIHRoZSBNT0NLX01FVEhPRCogZmFtaWx5IG9mIG1hY3JvcyBESVJFQ1RMWSBpbiB0aGUgTW9ja0ZvbyBjbGFzcy4KLS8vIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3Mgb2YgTW9ja0ZvbywgdGhlICJuaWNlIgotLy8gb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuCi0vLyBJbiBwYXJ0aWN1bGFyLCBuZXN0aW5nIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGlzIE5PVAotLy8gc3VwcG9ydGVkLgotLy8KLS8vIEFub3RoZXIga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGJhc2UgbW9jawotLy8gY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBhcmUKLS8vIGJhbm5lZCBieSB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSBhbnl3YXkuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotJHJhbmdlIGtpbmQgMC4uMgotJGZvciBraW5kIFtbCi0KLSR2YXIgY2xheno9W1skaWYga2luZD09MCBbW05pY2VNb2NrXV0KLSAgICAgICAgICAgICAkZWxpZiBraW5kPT0xIFtbTmFnZ3lNb2NrXV0KLSAgICAgICAgICAgICAkZWxzZSBbW1N0cmljdE1vY2tdXV1dCi0KLSR2YXIgbWV0aG9kPVtbJGlmIGtpbmQ9PTAgW1tBbGxvd1VuaW50ZXJlc3RpbmdDYWxsc11dCi0gICAgICAgICAgICAgJGVsaWYga2luZD09MSBbW1dhcm5VbmludGVyZXN0aW5nQ2FsbHNdXQotICAgICAgICAgICAgICRlbHNlIFtbRmFpbFVuaW50ZXJlc3RpbmdDYWxsc11dXV0KLQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4KLWNsYXNzICRjbGF6eiA6IHB1YmxpYyBNb2NrQ2xhc3MgewotIHB1YmxpYzoKLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzCi0gIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLgotICAkY2xhenooKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICAvLyBDKysgZG9lc24ndCAoeWV0KSBhbGxvdyBpbmhlcml0YW5jZSBvZiBjb25zdHJ1Y3RvcnMsIHNvIHdlIGhhdmUKLSAgLy8gdG8gZGVmaW5lIGl0IGZvciBlYWNoIGFyaXR5LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+Ci0gIGV4cGxpY2l0ICRjbGF6eihjb25zdCBBMSYgYTEpIDogTW9ja0NsYXNzKGExKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgQSRqXV0+Ci0gICRjbGF6eigkZm9yIGosIFtbY29uc3QgQSRqJiBhJGpdXSkgOiBNb2NrQ2xhc3MoJGZvciBqLCBbW2Ekal1dKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotCi1dXQotICB2aXJ0dWFsIH4kY2xhenooKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oJGNsYXp6KTsKLX07Ci0KLV1dCi0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb25zIGNhdGNoIHNvbWUgKHJlbGF0aXZlbHkgbW9yZSBjb21tb24pCi0vLyB1c2VyIGVycm9ycyBvZiBuZXN0aW5nIG5pY2UgYW5kIHN0cmljdCBtb2Nrcy4gIFRoZXkgZG8gTk9UIGNhdGNoCi0vLyBhbGwgcG9zc2libGUgZXJyb3JzLgotCi0vLyBUaGVzZSBzcGVjaWFsaXphdGlvbnMgYXJlIGRlY2xhcmVkIGJ1dCBub3QgZGVmaW5lZCwgYXMgTmljZU1vY2ssCi0vLyBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGNhbm5vdCBiZSBuZXN0ZWQuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgKaW5kZXggMzNiMzdhNy4uNmRiNjVmMiAxMDA2NDQKLS0tIGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgKKysrIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgKQEAgLTEsNDM5OSArMSwxNSBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIGFyZ3VtZW50IG1hdGNoZXJzLiAgTW9yZQotLy8gbWF0Y2hlcnMgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgaW1wbGVtZW50aW5nIHRoZQotLy8gTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5LgorI2lmbmRlZiBURVNUSU5HX0dNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTUFUQ0hFUlNfSF8KKyNkZWZpbmUgVEVTVElOR19HTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfCiAKLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfCisvLyBUaGUgZmlsZS9kaXJlY3RvcnkgbGF5b3V0IG9mIEdvb2dsZSBUZXN0IGlzIG5vdCB5ZXQgY29uc2lkZXJlZCBzdGFibGUuIFVudGlsCisvLyBpdCBzdGFiaWxpemVzLCBDaHJvbWl1bSBjb2RlIHdpbGwgdXNlIGZvcndhcmRpbmcgaGVhZGVycyBpbiB0ZXN0aW5nL2d0ZXN0CisvLyBhbmQgdGVzdGluZy9nbW9jaywgaW5zdGVhZCBvZiBkaXJlY3RseSBpbmNsdWRpbmcgZmlsZXMgaW4KKy8vIHRoaXJkX3BhcnR5L2dvb2dsZXRlc3QuCiAKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCiAKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotIyBpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PiAgLy8gTk9MSU5UIC0tIG11c3QgYmUgYWZ0ZXIgZ3Rlc3QuaAotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVG8gaW1wbGVtZW50IGEgbWF0Y2hlciBGb28gZm9yIHR5cGUgVCwgZGVmaW5lOgotLy8gICAxLiBhIGNsYXNzIEZvb01hdGNoZXJJbXBsIHRoYXQgaW1wbGVtZW50cyB0aGUKLS8vICAgICAgTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UsIGFuZAotLy8gICAyLiBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgTWF0Y2hlcjxUPiBvYmplY3QgZnJvbSBhCi0vLyAgICAgIEZvb01hdGNoZXJJbXBsKi4KLS8vCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFsbG93IGEgdXNlcgotLy8gdG8gd3JpdGUgInYiIGluc3RlYWQgb2YgIkVxKHYpIiB3aGVyZSBhIE1hdGNoZXIgaXMgZXhwZWN0ZWQsIHdoaWNoCi0vLyBpcyBpbXBvc3NpYmxlIGlmIHdlIHBhc3MgbWF0Y2hlcnMgYnkgcG9pbnRlcnMuICBJdCBhbHNvIGVhc2VzCi0vLyBvd25lcnNoaXAgbWFuYWdlbWVudCBhcyBNYXRjaGVyIG9iamVjdHMgY2FuIG5vdyBiZSBjb3BpZWQgbGlrZQotLy8gcGxhaW4gdmFsdWVzLgotCi0vLyBNYXRjaFJlc3VsdExpc3RlbmVyIGlzIGFuIGFic3RyYWN0IGNsYXNzLiAgSXRzIDw8IG9wZXJhdG9yIGNhbiBiZQotLy8gdXNlZCBieSBhIG1hdGNoZXIgdG8gZXhwbGFpbiB3aHkgYSB2YWx1ZSBtYXRjaGVzIG9yIGRvZXNuJ3QgbWF0Y2guCi0vLwotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGFkZCBtZXRob2QKLS8vICAgYm9vbCBJbnRlcmVzdGVkSW5XaHkoYm9vbCByZXN1bHQpIGNvbnN0OwotLy8gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgbGlzdGVuZXIgaXMgaW50ZXJlc3RlZCBpbiB3aHkgdGhlIG1hdGNoCi0vLyByZXN1bHQgaXMgJ3Jlc3VsdCcuCi1jbGFzcyBNYXRjaFJlc3VsdExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBsaXN0ZW5lciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdW5kZXJseWluZyBvc3RyZWFtLiAgVGhlCi0gIC8vIGxpc3RlbmVyIGRvZXMgbm90IG93biB0aGUgb3N0cmVhbSwgYW5kIGRvZXMgbm90IGRlcmVmZXJlbmNlIGl0Ci0gIC8vIGluIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLgotICBleHBsaWNpdCBNYXRjaFJlc3VsdExpc3RlbmVyKDo6c3RkOjpvc3RyZWFtKiBvcykgOiBzdHJlYW1fKG9zKSB7fQotICB2aXJ0dWFsIH5NYXRjaFJlc3VsdExpc3RlbmVyKCkgPSAwOyAgLy8gTWFrZXMgdGhpcyBjbGFzcyBhYnN0cmFjdC4KLQotICAvLyBTdHJlYW1zIHggdG8gdGhlIHVuZGVybHlpbmcgb3N0cmVhbTsgZG9lcyBub3RoaW5nIGlmIHRoZSBvc3RyZWFtCi0gIC8vIGlzIE5VTEwuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBNYXRjaFJlc3VsdExpc3RlbmVyJiBvcGVyYXRvcjw8KGNvbnN0IFQmIHgpIHsKLSAgICBpZiAoc3RyZWFtXyAhPSBOVUxMKQotICAgICAgKnN0cmVhbV8gPDwgeDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW0uCi0gIDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0oKSB7IHJldHVybiBzdHJlYW1fOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbGlzdGVuZXIgaXMgaW50ZXJlc3RlZCBpbiBhbiBleHBsYW5hdGlvbiBvZgotICAvLyB0aGUgbWF0Y2ggcmVzdWx0LiAgQSBtYXRjaGVyJ3MgTWF0Y2hBbmRFeHBsYWluKCkgbWV0aG9kIGNhbiB1c2UKLSAgLy8gdGhpcyBpbmZvcm1hdGlvbiB0byBhdm9pZCBnZW5lcmF0aW5nIHRoZSBleHBsYW5hdGlvbiB3aGVuIG5vIG9uZQotICAvLyBpbnRlbmRzIHRvIGhlYXIgaXQuCi0gIGJvb2wgSXNJbnRlcmVzdGVkKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXyAhPSBOVUxMOyB9Ci0KLSBwcml2YXRlOgotICA6OnN0ZDo6b3N0cmVhbSogY29uc3Qgc3RyZWFtXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1hdGNoUmVzdWx0TGlzdGVuZXIpOwotfTsKLQotaW5saW5lIE1hdGNoUmVzdWx0TGlzdGVuZXI6On5NYXRjaFJlc3VsdExpc3RlbmVyKCkgewotfQotCi0vLyBBbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoaXMga25vd3MgaG93IHRvIGRlc2NyaWJlIGl0c2VsZiBhcyBhCi0vLyBtYXRjaGVyLgotY2xhc3MgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5NYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKCkge30KLQotICAvLyBEZXNjcmliZXMgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uICBUaGUgZnVuY3Rpb24gc2hvdWxkIHByaW50Ci0gIC8vIGEgdmVyYiBwaHJhc2UgdGhhdCBkZXNjcmliZXMgdGhlIHByb3BlcnR5IGEgdmFsdWUgbWF0Y2hpbmcgdGhpcwotICAvLyBtYXRjaGVyIHNob3VsZCBoYXZlLiAgVGhlIHN1YmplY3Qgb2YgdGhlIHZlcmIgcGhyYXNlIGlzIHRoZSB2YWx1ZQotICAvLyBiZWluZyBtYXRjaGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBEZXNjcmliZVRvKCkgbWV0aG9kIG9mIHRoZSBHdCg3KQotICAvLyBtYXRjaGVyIHByaW50cyAiaXMgZ3JlYXRlciB0aGFuIDciLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKLQotICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLiAgRm9yCi0gIC8vIGV4YW1wbGUsIGlmIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1hdGNoZXIgaXMgImlzIGdyZWF0ZXIgdGhhbgotICAvLyA3IiwgdGhlIG5lZ2F0ZWQgZGVzY3JpcHRpb24gY291bGQgYmUgImlzIG5vdCBncmVhdGVyIHRoYW4gNyIuCi0gIC8vIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIG92ZXJyaWRlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcKLSAgLy8gTWF0Y2hlckludGVyZmFjZSwgYnV0IGl0IGlzIGhpZ2hseSBhZHZpc2VkIHNvIHRoYXQgeW91ciBtYXRjaGVyCi0gIC8vIGNhbiBwcm9kdWNlIGdvb2QgZXJyb3IgbWVzc2FnZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJub3QgKCI7Ci0gICAgRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotfTsKLQotLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTWF0Y2hlckludGVyZmFjZSA6IHB1YmxpYyBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAotICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJyBpZiBuZWNlc3NhcnkgKHNlZSB0aGUgbmV4dCBwYXJhZ3JhcGgpLCBpbgotICAvLyB0aGUgZm9ybSBvZiBhIG5vbi1yZXN0cmljdGl2ZSByZWxhdGl2ZSBjbGF1c2UgKCJ3aGljaCAuLi4iLAotICAvLyAid2hvc2UgLi4uIiwgZXRjKSB0aGF0IGRlc2NyaWJlcyB4LiAgRm9yIGV4YW1wbGUsIHRoZQotICAvLyBNYXRjaEFuZEV4cGxhaW4oKSBtZXRob2Qgb2YgdGhlIFBvaW50ZWUoLi4uKSBtYXRjaGVyIHNob3VsZAotICAvLyBnZW5lcmF0ZSBhbiBleHBsYW5hdGlvbiBsaWtlICJ3aGljaCBwb2ludHMgdG8gLi4uIi4KLSAgLy8KLSAgLy8gSW1wbGVtZW50YXRpb25zIG9mIE1hdGNoQW5kRXhwbGFpbigpIHNob3VsZCBhZGQgYW4gZXhwbGFuYXRpb24gb2YKLSAgLy8gdGhlIG1hdGNoIHJlc3VsdCAqaWYgYW5kIG9ubHkgaWYqIHRoZXkgY2FuIHByb3ZpZGUgYWRkaXRpb25hbAotICAvLyBpbmZvcm1hdGlvbiB0aGF0J3Mgbm90IGFscmVhZHkgcHJlc2VudCAob3Igbm90IG9idmlvdXMpIGluIHRoZQotICAvLyBwcmludC1vdXQgb2YgeCBhbmQgdGhlIG1hdGNoZXIncyBkZXNjcmlwdGlvbi4gIFdoZXRoZXIgdGhlIG1hdGNoCi0gIC8vIHN1Y2NlZWRzIGlzIG5vdCBhIGZhY3RvciBpbiBkZWNpZGluZyB3aGV0aGVyIGFuIGV4cGxhbmF0aW9uIGlzCi0gIC8vIG5lZWRlZCwgYXMgc29tZXRpbWVzIHRoZSBjYWxsZXIgbmVlZHMgdG8gcHJpbnQgYSBmYWlsdXJlIG1lc3NhZ2UKLSAgLy8gd2hlbiB0aGUgbWF0Y2ggc3VjY2VlZHMgKGUuZy4gd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIGluc2lkZQotICAvLyBOb3QoKSkuCi0gIC8vCi0gIC8vIEZvciBleGFtcGxlLCBhICJoYXMgYXQgbGVhc3QgMTAgZWxlbWVudHMiIG1hdGNoZXIgc2hvdWxkIGV4cGxhaW4KLSAgLy8gd2hhdCB0aGUgYWN0dWFsIGVsZW1lbnQgY291bnQgaXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1hdGNoIHJlc3VsdCwKLSAgLy8gYXMgaXQgaXMgdXNlZnVsIGluZm9ybWF0aW9uIHRvIHRoZSByZWFkZXI7IG9uIHRoZSBvdGhlciBoYW5kLCBhbgotICAvLyAiaXMgZW1wdHkiIG1hdGNoZXIgcHJvYmFibHkgb25seSBuZWVkcyB0byBleHBsYWluIHdoYXQgdGhlIGFjdHVhbAotICAvLyBzaXplIGlzIHdoZW4gdGhlIG1hdGNoIGZhaWxzLCBhcyBpdCdzIHJlZHVuZGFudCB0byBzYXkgdGhhdCB0aGUKLSAgLy8gc2l6ZSBpcyAwIHdoZW4gdGhlIHZhbHVlIGlzIGFscmVhZHkga25vd24gdG8gYmUgZW1wdHkuCi0gIC8vCi0gIC8vIFlvdSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2hlbiBkZWZpbmluZyBhIG5ldyBtYXRjaGVyLgotICAvLwotICAvLyBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIChHb29nbGUgTW9jaykgdG8gZ3VhcmFudGVlCi0gIC8vIHRoYXQgJ2xpc3RlbmVyJyBpcyBub3QgTlVMTC4gIFRoaXMgaGVscHMgdG8gc2ltcGxpZnkgYSBtYXRjaGVyJ3MKLSAgLy8gaW1wbGVtZW50YXRpb24gd2hlbiBpdCBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHBlcmZvcm1hbmNlLCBhcyBpdAotICAvLyBjYW4gdGFsayB0byAnbGlzdGVuZXInIHdpdGhvdXQgY2hlY2tpbmcgaXRzIHZhbGlkaXR5IGZpcnN0LgotICAvLyBIb3dldmVyLCBpbiBvcmRlciB0byBpbXBsZW1lbnQgZHVtbXkgbGlzdGVuZXJzIGVmZmljaWVudGx5LAotICAvLyBsaXN0ZW5lci0+c3RyZWFtKCkgbWF5IGJlIE5VTEwuCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgPSAwOwotCi0gIC8vIEluaGVyaXRzIHRoZXNlIG1ldGhvZHMgZnJvbSBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlOgotICAvLyAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotICAvLyAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsKLX07Ci0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgc3RvcmVzIHRoZSBleHBsYW5hdGlvbiBpbiBhIHN0cmluZy4KLWNsYXNzIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgOiBwdWJsaWMgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKCkgOiBNYXRjaFJlc3VsdExpc3RlbmVyKCZzc18pIHt9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXhwbGFuYXRpb24gYWNjdW11bGF0ZWQgc28gZmFyLgotICBpbnRlcm5hbDo6c3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIHNzXy5zdHIoKTsgfQotCi0gIC8vIENsZWFycyB0aGUgZXhwbGFuYXRpb24gYWNjdW11bGF0ZWQgc28gZmFyLgotICB2b2lkIENsZWFyKCkgeyBzc18uc3RyKCIiKTsgfQotCi0gcHJpdmF0ZToKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKTsKLX07Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXN0cnVjdCBBbnlFcSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA9PSBiOyB9Ci19Owotc3RydWN0IEFueU5lIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhICE9IGI7IH0KLX07Ci1zdHJ1Y3QgQW55THQgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgPCBiOyB9Ci19Owotc3RydWN0IEFueUd0IHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhID4gYjsgfQotfTsKLXN0cnVjdCBBbnlMZSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA8PSBiOyB9Ci19Owotc3RydWN0IEFueUdlIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhID49IGI7IH0KLX07Ci0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgaWdub3JlcyB0aGUgZXhwbGFuYXRpb24uCi1jbGFzcyBEdW1teU1hdGNoUmVzdWx0TGlzdGVuZXIgOiBwdWJsaWMgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBEdW1teU1hdGNoUmVzdWx0TGlzdGVuZXIoKSA6IE1hdGNoUmVzdWx0TGlzdGVuZXIoTlVMTCkge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKTsKLX07Ci0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgdGhlIGV4cGxhbmF0aW9uIHRvIGEgZ2l2ZW4KLS8vIG9zdHJlYW0uICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIE1hdGNoUmVzdWx0TGlzdGVuZXIgaXMKLS8vIHRoYXQgdGhlIGZvcm1lciBpcyBjb25jcmV0ZS4KLWNsYXNzIFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIgOiBwdWJsaWMgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyKDo6c3RkOjpvc3RyZWFtKiBvcykKLSAgICAgIDogTWF0Y2hSZXN1bHRMaXN0ZW5lcihvcykge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lcik7Ci19OwotCi0vLyBBbiBpbnRlcm5hbCBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIE1hdGNoZXI8VD4sIHdoaWNoIHdpbGwgZGVyaXZlCi0vLyBmcm9tIGl0LiAgV2UgcHV0IGZ1bmN0aW9uYWxpdGllcyBjb21tb24gdG8gYWxsIE1hdGNoZXI8VD4KLS8vIHNwZWNpYWxpemF0aW9ucyBoZXJlIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAotICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJy4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+TWF0Y2hBbmRFeHBsYWluKHgsIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBtYXRjaGVyIG1hdGNoZXMgeC4KLSAgYm9vbCBNYXRjaGVzKFQgeCkgY29uc3QgewotICAgIER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lciBkdW1teTsKLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluKHgsICZkdW1teSk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgaW1wbF8tPkRlc2NyaWJlVG8ob3MpOyB9Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgdG8gYW4gb3N0cmVhbS4KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgaW1wbF8tPkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICAvLyBFeHBsYWlucyB3aHkgeCBtYXRjaGVzLCBvciBkb2Vzbid0IG1hdGNoLCB0aGUgbWF0Y2hlci4KLSAgdm9pZCBFeHBsYWluTWF0Y2hSZXN1bHRUbyhUIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIob3MpOwotICAgIE1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVzY3JpYmVyIGZvciB0aGlzIG1hdGNoZXIgb2JqZWN0OyByZXRhaW5zIG93bmVyc2hpcAotICAvLyBvZiB0aGUgZGVzY3JpYmVyLCB3aGljaCBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgYWxpdmUgd2hlbgotICAvLyB0aGlzIG1hdGNoZXIgb2JqZWN0IGlzIGFsaXZlLgotICBjb25zdCBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKiBHZXREZXNjcmliZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGxfLmdldCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIE1hdGNoZXJCYXNlKCkge30KLQotICAvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4KLSAgZXhwbGljaXQgTWF0Y2hlckJhc2UoY29uc3QgTWF0Y2hlckludGVyZmFjZTxUPiogaW1wbCkKLSAgICAgIDogaW1wbF8oaW1wbCkge30KLQotICB2aXJ0dWFsIH5NYXRjaGVyQmFzZSgpIHt9Ci0KLSBwcml2YXRlOgotICAvLyBzaGFyZWRfcHRyICh1dGlsL2d0bC9zaGFyZWRfcHRyLmgpIGFuZCBsaW5rZWRfcHRyIGhhdmUgc2ltaWxhcgotICAvLyBpbnRlcmZhY2VzLiAgVGhlIGZvcm1lciBkeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBjaHVuayBvZiBtZW1vcnkKLSAgLy8gdG8gaG9sZCB0aGUgcmVmZXJlbmNlIGNvdW50LCB3aGlsZSB0aGUgbGF0dGVyIHRyYWNrcyBhbGwKLSAgLy8gcmVmZXJlbmNlcyB1c2luZyBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0IHdpdGhvdXQgYWxsb2NhdGluZwotICAvLyBtZW1vcnkuICBJdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGxpbmtlZF9wdHIgcGVyZm9ybXMgYmV0dGVyIGluCi0gIC8vIHR5cGljYWwgc2NlbmFyaW9zLiAgSG93ZXZlciwgc2hhcmVkX3B0ciBjYW4gb3V0LXBlcmZvcm0KLSAgLy8gbGlua2VkX3B0ciB3aGVuIHRoZXJlIGFyZSBtYW55IG1vcmUgdXNlcyBvZiB0aGUgY29weSBjb25zdHJ1Y3RvcgotICAvLyB0aGFuIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAvLwotICAvLyBJZiBwZXJmb3JtYW5jZSBiZWNvbWVzIGEgcHJvYmxlbSwgd2Ugc2hvdWxkIHNlZSBpZiB1c2luZwotICAvLyBzaGFyZWRfcHRyIGhlbHBzLgotICA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4gPiBpbXBsXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBBIE1hdGNoZXI8VD4gaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkKLS8vIG9iamVjdCB0aGF0IGNhbiBjaGVjayB3aGV0aGVyIGEgdmFsdWUgb2YgdHlwZSBUIG1hdGNoZXMuICBUaGUKLS8vIGltcGxlbWVudGF0aW9uIG9mIE1hdGNoZXI8VD4gaXMganVzdCBhIGxpbmtlZF9wdHIgdG8gY29uc3QKLS8vIE1hdGNoZXJJbnRlcmZhY2U8VD4sIHNvIGNvcHlpbmcgaXMgZmFpcmx5IGNoZWFwLiAgRG9uJ3QgaW5oZXJpdAotLy8gZnJvbSBNYXRjaGVyIQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBNYXRjaGVyIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxUPiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBtYXRjaGVyLiAgTmVlZGVkIGZvciBzdG9yaW5nIE1hdGNoZXIgb2JqZWN0cyBpbiBTVEwKLSAgLy8gY29udGFpbmVycy4gIEEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBtYXRjaGVyIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuICBZb3UKLSAgLy8gY2Fubm90IHVzZSBpdCB1bnRpbCBhIHZhbGlkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGl0LgotICBleHBsaWNpdCBNYXRjaGVyKCkge30gIC8vIE5PTElOVAotCi0gIC8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLgotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxUPihpbXBsKSB7fQotCi0gIC8vIEltcGxpY2l0IGNvbnN0cnVjdG9yIGhlcmUgYWxsb3dzIHBlb3BsZSB0byB3cml0ZQotICAvLyBFWFBFQ1RfQ0FMTChmb28sIEJhcig1KSkgaW5zdGVhZCBvZiBFWFBFQ1RfQ0FMTChmb28sIEJhcihFcSg1KSkpIHNvbWV0aW1lcwotICBNYXRjaGVyKFQgdmFsdWUpOyAgLy8gTk9MSU5UCi19OwotCi0vLyBUaGUgZm9sbG93aW5nIHR3byBzcGVjaWFsaXphdGlvbnMgYWxsb3cgdGhlIHVzZXIgdG8gd3JpdGUgc3RyCi0vLyBpbnN0ZWFkIG9mIEVxKHN0cikgYW5kICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHdoZW4gYSBzdHJpbmcKLS8vIG1hdGNoZXIgaXMgZXhwZWN0ZWQuCi10ZW1wbGF0ZSA8PgotY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPgotICAgIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPiogaW1wbCkKLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPihpbXBsKSB7fQotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSBzdHIgaW5zdGVhZCBvZiBFcShzdHIpIHNvbWV0aW1lcywgd2hlcmUKLSAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4KLSAgTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKTsgIC8vIE5PTElOVAotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuCi0gIE1hdGNoZXIoY29uc3QgY2hhciogcyk7ICAvLyBOT0xJTlQKLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHVEVTVF9BUElfIE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8aW50ZXJuYWw6OnN0cmluZz4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPGludGVybmFsOjpzdHJpbmc+KiBpbXBsKQotICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8aW50ZXJuYWw6OnN0cmluZz4oaW1wbCkge30KLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlCi0gIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLgotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UCi19OwotCi0jaWYgR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIHNwZWNpYWxpemF0aW9ucyBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSBzdHIKLS8vIGluc3RlYWQgb2YgRXEoc3RyKSBhbmQgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgd2hlbiBhIFN0cmluZ1BpZWNlCi0vLyBtYXRjaGVyIGlzIGV4cGVjdGVkLgotdGVtcGxhdGUgPD4KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+Ci0gICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IFN0cmluZ1BpZWNlJj4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPGNvbnN0IFN0cmluZ1BpZWNlJj4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxjb25zdCBTdHJpbmdQaWVjZSY+KGltcGwpIHt9Ci0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQotICAvLyBzdHIgaXMgYSBzdHJpbmcgb2JqZWN0LgotICBNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpOyAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHNvbWV0aW1lcy4KLSAgTWF0Y2hlcihjb25zdCBjaGFyKiBzKTsgIC8vIE5PTElOVAotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byBwYXNzIFN0cmluZ1BpZWNlcyBkaXJlY3RseS4KLSAgTWF0Y2hlcihTdHJpbmdQaWVjZSBzKTsgIC8vIE5PTElOVAotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxTdHJpbmdQaWVjZT4KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8U3RyaW5nUGllY2U+IHsKLSBwdWJsaWM6Ci0gIE1hdGNoZXIoKSB7fQotCi0gIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxTdHJpbmdQaWVjZT4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxTdHJpbmdQaWVjZT4oaW1wbCkge30KLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlCi0gIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLgotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHBhc3MgU3RyaW5nUGllY2VzIGRpcmVjdGx5LgotICBNYXRjaGVyKFN0cmluZ1BpZWNlIHMpOyAgLy8gTk9MSU5UCi19OwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXwotCi0vLyBUaGUgUG9seW1vcnBoaWNNYXRjaGVyIGNsYXNzIHRlbXBsYXRlIG1ha2VzIGl0IGVhc3kgdG8gaW1wbGVtZW50IGEKLS8vIHBvbHltb3JwaGljIG1hdGNoZXIgKGkuZS4gYSBtYXRjaGVyIHRoYXQgY2FuIG1hdGNoIHZhbHVlcyBvZiBtb3JlCi0vLyB0aGFuIG9uZSB0eXBlLCBlLmcuIEVxKG4pIGFuZCBOb3ROdWxsKCkpLgotLy8KLS8vIFRvIGRlZmluZSBhIHBvbHltb3JwaGljIG1hdGNoZXIsIGEgdXNlciBzaG91bGQgcHJvdmlkZSBhbiBJbXBsCi0vLyBjbGFzcyB0aGF0IGhhcyBhIERlc2NyaWJlVG8oKSBtZXRob2QgYW5kIGEgRGVzY3JpYmVOZWdhdGlvblRvKCkKLS8vIG1ldGhvZCwgYW5kIGRlZmluZSBhIG1lbWJlciBmdW5jdGlvbiAob3IgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlKQotLy8KLS8vICAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVmFsdWUmIHZhbHVlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Q7Ci0vLwotLy8gU2VlIHRoZSBkZWZpbml0aW9uIG9mIE5vdE51bGwoKSBmb3IgYSBjb21wbGV0ZSBleGFtcGxlLgotdGVtcGxhdGUgPGNsYXNzIEltcGw+Ci1jbGFzcyBQb2x5bW9ycGhpY01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUG9seW1vcnBoaWNNYXRjaGVyKGNvbnN0IEltcGwmIGFuX2ltcGwpIDogaW1wbF8oYW5faW1wbCkge30KLQotICAvLyBSZXR1cm5zIGEgbXV0YWJsZSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgbWF0Y2hlcgotICAvLyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gIEltcGwmIG11dGFibGVfaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9Ci0KLSAgLy8gUmV0dXJucyBhbiBpbW11dGFibGUgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIG1hdGNoZXIKLSAgLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICBjb25zdCBJbXBsJiBpbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF87IH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTW9ub21vcnBoaWNJbXBsPFQ+KGltcGxfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjbGFzcyBNb25vbW9ycGhpY0ltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTW9ub21vcnBoaWNJbXBsKGNvbnN0IEltcGwmIGltcGwpIDogaW1wbF8oaW1wbCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgaW1wbF8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIGltcGxfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaW1wbF8uTWF0Y2hBbmRFeHBsYWluKHgsIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgSW1wbCBpbXBsXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTW9ub21vcnBoaWNJbXBsKTsKLSAgfTsKLQotICBJbXBsIGltcGxfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUG9seW1vcnBoaWNNYXRjaGVyKTsKLX07Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBlYXNpZXIgdG8gdXNlCi0vLyB0aGFuIHRoZSBNYXRjaGVyPFQ+IGNvbnN0cnVjdG9yIGFzIGl0IGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8KLS8vIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCBlLmcuCi0vLwotLy8gICBNYWtlTWF0Y2hlcihmb28pOwotLy8gdnMKLS8vICAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPihmb28pOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgTWF0Y2hlcjxUPiBNYWtlTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+KiBpbXBsKSB7Ci0gIHJldHVybiBNYXRjaGVyPFQ+KGltcGwpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMKLS8vIGVhc2llciB0byB1c2UgdGhhbiB0aGUgUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+IGNvbnN0cnVjdG9yIGFzIGl0Ci0vLyBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCBlLmcuCi0vLwotLy8gICBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGZvbyk7Ci0vLyB2cwotLy8gICBQb2x5bW9ycGhpY01hdGNoZXI8VHlwZU9mRm9vPihmb28pOwotdGVtcGxhdGUgPGNsYXNzIEltcGw+Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+IE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoY29uc3QgSW1wbCYgaW1wbCkgewotICByZXR1cm4gUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+KGltcGwpOwotfQotCi0vLyBBbnl0aGluZyBpbnNpZGUgdGhlICdpbnRlcm5hbCcgbmFtZXNwYWNlIElTIElOVEVSTkFMIElNUExFTUVOVEFUSU9OCi0vLyBhbmQgTVVTVCBOT1QgQkUgVVNFRCBJTiBVU0VSIENPREUhISEKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSBNYXRjaGVyQ2FzdEltcGwgY2xhc3MgdGVtcGxhdGUgaXMgYSBoZWxwZXIgZm9yIGltcGxlbWVudGluZwotLy8gTWF0Y2hlckNhc3QoKS4gIFdlIG5lZWQgdGhpcyBoZWxwZXIgaW4gb3JkZXIgdG8gcGFydGlhbGx5Ci0vLyBzcGVjaWFsaXplIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBNYXRjaGVyQ2FzdCgpIChDKysgYWxsb3dzCi0vLyBjbGFzcy9zdHJ1Y3QgdGVtcGxhdGVzIHRvIGJlIHBhcnRpYWxseSBzcGVjaWFsaXplZCwgYnV0IG5vdAotLy8gZnVuY3Rpb24gdGVtcGxhdGVzLikuCi0KLS8vIFRoaXMgZ2VuZXJhbCB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBNYXRjaGVyQ2FzdCgpJ3MgYXJndW1lbnQgaXMgYQotLy8gcG9seW1vcnBoaWMgbWF0Y2hlciAoaS5lLiBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEKLS8vIE1hdGNoZXIgYnV0IGlzIG5vdCBvbmUgeWV0OyBmb3IgZXhhbXBsZSwgRXEodmFsdWUpKSBvciBhIHZhbHVlIChmb3IKLS8vIGV4YW1wbGUsICJoZWxsbyIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+Ci1jbGFzcyBNYXRjaGVyQ2FzdEltcGwgewotIHB1YmxpYzoKLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNJiBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKSB7Ci0gICAgLy8gTSBjYW4gYmUgYSBwb2x5bW9yaGljIG1hdGNoZXIsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byB1c2UKLSAgICAvLyBpdHMgY29udmVyc2lvbiBvcGVyYXRvciB0byBjcmVhdGUgTWF0Y2hlcjxUPi4gIE9yIGl0IGNhbiBiZSBhIHZhbHVlCi0gICAgLy8gdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBNYXRjaGVyPFQ+J3MgY29uc3RydWN0b3IuCi0gICAgLy8KLSAgICAvLyBXZSBjYW4ndCBjYWxsIE1hdGNoZXI8VD4ocG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSkgd2hlbiBNIGlzIGEKLSAgICAvLyBwb2x5bW9ycGhpYyBtYXRjaGVyIGJlY2F1c2UgaXQnbGwgYmUgYW1iaWd1b3VzIGlmIFQgaGFzIGFuIGltcGxpY2l0Ci0gICAgLy8gY29uc3RydWN0b3IgZnJvbSBNICh0aGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIFQgaGFzIGFuIGltcGxpY2l0Ci0gICAgLy8gY29uc3RydWN0b3IgZnJvbSBhbnkgdHlwZSkuCi0gICAgLy8KLSAgICAvLyBJdCB3b24ndCB3b3JrIHRvIHVuY29uZGl0aW9uYWxseSBpbXBsaWN0X2Nhc3QKLSAgICAvLyBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlIHRvIE1hdGNoZXI8VD4gYmVjYXVzZSBpdCB3b24ndCB0cmlnZ2VyCi0gICAgLy8gYSB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBmcm9tIE0gdG8gVCBpZiBvbmUgZXhpc3RzIChhc3N1bWluZyBNIGlzCi0gICAgLy8gYSB2YWx1ZSkuCi0gICAgcmV0dXJuIENhc3RJbXBsKAotICAgICAgICBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlLAotICAgICAgICBCb29sZWFuQ29uc3RhbnQ8Ci0gICAgICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPE0sIE1hdGNoZXI8VD4gPjo6dmFsdWU+KCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0SW1wbChjb25zdCBNJiB2YWx1ZSwgQm9vbGVhbkNvbnN0YW50PGZhbHNlPikgewotICAgIC8vIE0gY2FuJ3QgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gTWF0Y2hlcjxUPiwgc28gTSBpc24ndCBhIHBvbHltb3JwaGljCi0gICAgLy8gbWF0Y2hlci4gIEl0IG11c3QgYmUgYSB2YWx1ZSB0aGVuLiAgVXNlIGRpcmVjdCBpbml0aWFsaXphdGlvbiB0byBjcmVhdGUKLSAgICAvLyBhIG1hdGNoZXIuCi0gICAgcmV0dXJuIE1hdGNoZXI8VD4oSW1wbGljaXRDYXN0XzxUPih2YWx1ZSkpOwotICB9Ci0KLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdEltcGwoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbkNvbnN0YW50PHRydWU+KSB7Ci0gICAgLy8gTSBpcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIE1hdGNoZXI8VD4sIHdoaWNoIG1lYW5zIHRoYXQgZWl0aGVyCi0gICAgLy8gTSBpcyBhIHBvbHltb3JocGljIG1hdGNoZXIgb3IgTWF0Y2hlcjxUPiBoYXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IKLSAgICAvLyBmcm9tIE0uICBJbiBib3RoIGNhc2VzIHVzaW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHdpbGwgcHJvZHVjZSBhCi0gICAgLy8gbWF0Y2hlci4KLSAgICAvLwotICAgIC8vIEV2ZW4gaWYgVCBoYXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBNLCBpdCB3b24ndCBiZSBjYWxsZWQgYmVjYXVzZQotICAgIC8vIGNyZWF0aW5nIE1hdGNoZXI8VD4gd291bGQgcmVxdWlyZSBhIGNoYWluIG9mIHR3byB1c2VyLWRlZmluZWQgY29udmVyc2lvbnMKLSAgICAvLyAoZmlyc3QgdG8gY3JlYXRlIFQgZnJvbSBNIGFuZCB0aGVuIHRvIGNyZWF0ZSBNYXRjaGVyPFQ+IGZyb20gVCkuCi0gICAgcmV0dXJuIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWU7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgbW9yZSBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBNYXRjaGVyQ2FzdCgpJ3MgYXJndW1lbnQKLS8vIGlzIGFscmVhZHkgYSBNYXRjaGVyLiAgVGhpcyBvbmx5IGNvbXBpbGVzIHdoZW4gdHlwZSBUIGNhbiBiZQotLy8gc3RhdGljYWxseSBjb252ZXJ0ZWQgdG8gdHlwZSBVLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1jbGFzcyBNYXRjaGVyQ2FzdEltcGw8VCwgTWF0Y2hlcjxVPiA+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTWF0Y2hlcjxVPiYgc291cmNlX21hdGNoZXIpIHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgSW1wbChzb3VyY2VfbWF0Y2hlcikpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgTWF0Y2hlcjxVPiYgc291cmNlX21hdGNoZXIpCi0gICAgICAgIDogc291cmNlX21hdGNoZXJfKHNvdXJjZV9tYXRjaGVyKSB7fQotCi0gICAgLy8gV2UgZGVsZWdhdGUgdGhlIG1hdGNoaW5nIGxvZ2ljIHRvIHRoZSBzb3VyY2UgbWF0Y2hlci4KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzb3VyY2VfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKHN0YXRpY19jYXN0PFU+KHgpLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICBzb3VyY2VfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIHNvdXJjZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPFU+IHNvdXJjZV9tYXRjaGVyXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci19OwotCi0vLyBUaGlzIGV2ZW4gbW9yZSBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGVmZmljaWVudGx5IGNhc3RpbmcKLS8vIGEgbWF0Y2hlciB0byBpdHMgb3duIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXJDYXN0SW1wbDxULCBNYXRjaGVyPFQ+ID4gewotIHB1YmxpYzoKLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyKSB7IHJldHVybiBtYXRjaGVyOyB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gSW4gb3JkZXIgdG8gYmUgc2FmZSBhbmQgY2xlYXIsIGNhc3RpbmcgYmV0d2VlbiBkaWZmZXJlbnQgbWF0Y2hlcgotLy8gdHlwZXMgaXMgZG9uZSBleHBsaWNpdGx5IHZpYSBNYXRjaGVyQ2FzdDxUPihtKSwgd2hpY2ggdGFrZXMgYQotLy8gbWF0Y2hlciBtIGFuZCByZXR1cm5zIGEgTWF0Y2hlcjxUPi4gIEl0IGNvbXBpbGVzIG9ubHkgd2hlbiBUIGNhbiBiZQotLy8gc3RhdGljYWxseSBjb252ZXJ0ZWQgdG8gdGhlIGFyZ3VtZW50IHR5cGUgb2YgbS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgotaW5saW5lIE1hdGNoZXI8VD4gTWF0Y2hlckNhc3QoY29uc3QgTSYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6Ok1hdGNoZXJDYXN0SW1wbDxULCBNPjo6Q2FzdChtYXRjaGVyKTsKLX0KLQotLy8gSW1wbGVtZW50cyBTYWZlTWF0Y2hlckNhc3QoKS4KLS8vCi0vLyBXZSB1c2UgYW4gaW50ZXJtZWRpYXRlIGNsYXNzIHRvIGRvIHRoZSBhY3R1YWwgc2FmZSBjYXN0aW5nIGFzIE5va2lhJ3MKLS8vIFN5bWJpYW4gY29tcGlsZXIgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCi0vLyB0ZW1wbGF0ZSA8VCwgTT4gLi4uIChNKSBhbmQKLS8vIHRlbXBsYXRlIDxULCBVPiAuLi4gKGNvbnN0IE1hdGNoZXI8VT4mKQotLy8gZm9yIGZ1bmN0aW9uIHRlbXBsYXRlcyBidXQgY2FuIGZvciBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTYWZlTWF0Y2hlckNhc3RJbXBsIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgb3ZlcmxvYWQgaGFuZGxlcyBwb2x5bW9ycGhpYyBtYXRjaGVycyBhbmQgdmFsdWVzIG9ubHkgc2luY2UKLSAgLy8gbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIGhhbmRsZWQgYnkgdGhlIG5leHQgb25lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLSAgc3RhdGljIGlubGluZSBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSkgewotICAgIHJldHVybiBpbnRlcm5hbDo6TWF0Y2hlckNhc3RJbXBsPFQsIE0+OjpDYXN0KHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUpOwotICB9Ci0KLSAgLy8gVGhpcyBvdmVybG9hZCBoYW5kbGVzIG1vbm9tb3JwaGljIG1hdGNoZXJzLgotICAvLwotICAvLyBJbiBnZW5lcmFsLCBpZiB0eXBlIFQgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVSwgd2UgY2FuCi0gIC8vIHNhZmVseSBjb252ZXJ0IGEgTWF0Y2hlcjxVPiB0byBhIE1hdGNoZXI8VD4gKGkuZS4gTWF0Y2hlciBpcwotICAvLyBjb250cmF2YXJpYW50KToganVzdCBrZWVwIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgTWF0Y2hlcjxVPiwgY29udmVydCB0aGUKLSAgLy8gYXJndW1lbnQgZnJvbSB0eXBlIFQgdG8gVSwgYW5kIHRoZW4gcGFzcyBpdCB0byB0aGUgdW5kZXJseWluZyBNYXRjaGVyPFU+LgotICAvLyBUaGUgb25seSBleGNlcHRpb24gaXMgd2hlbiBVIGlzIGEgcmVmZXJlbmNlIGFuZCBUIGlzIG5vdCwgYXMgdGhlCi0gIC8vIHVuZGVybHlpbmcgTWF0Y2hlcjxVPiBtYXkgYmUgaW50ZXJlc3RlZCBpbiB0aGUgYXJndW1lbnQncyBhZGRyZXNzLCB3aGljaAotICAvLyBpcyBub3QgcHJlc2VydmVkIGluIHRoZSBjb252ZXJzaW9uIGZyb20gVCB0byBVLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KLSAgc3RhdGljIGlubGluZSBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTWF0Y2hlcjxVPiYgbWF0Y2hlcikgewotICAgIC8vIEVuZm9yY2UgdGhhdCBUIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBVLgotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxULCBVPjo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUX211c3RfYmVfaW1wbGljaXRseV9jb252ZXJ0aWJsZV90b19VKTsKLSAgICAvLyBFbmZvcmNlIHRoYXQgd2UgYXJlIG5vdCBjb252ZXJ0aW5nIGEgbm9uLXJlZmVyZW5jZSB0eXBlIFQgdG8gYSByZWZlcmVuY2UKLSAgICAvLyB0eXBlIFUuCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICBpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZSB8fCAhaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxVPjo6dmFsdWUsCi0gICAgICAgIGNhbm5vdF9jb252ZXJ0X25vbl9yZWZlcmVudGNlX2FyZ190b19yZWZlcmVuY2UpOwotICAgIC8vIEluIGNhc2UgYm90aCBUIGFuZCBVIGFyZSBhcml0aG1ldGljIHR5cGVzLCBlbmZvcmNlIHRoYXQgdGhlCi0gICAgLy8gY29udmVyc2lvbiBpcyBub3QgbG9zc3kuCi0gICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgUmF3VDsKLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhVKSBSYXdVOwotICAgIGNvbnN0IGJvb2wga1RJc090aGVyID0gR01PQ0tfS0lORF9PRl8oUmF3VCkgPT0gaW50ZXJuYWw6OmtPdGhlcjsKLSAgICBjb25zdCBib29sIGtVSXNPdGhlciA9IEdNT0NLX0tJTkRfT0ZfKFJhd1UpID09IGludGVybmFsOjprT3RoZXI7Ci0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICBrVElzT3RoZXIgfHwga1VJc090aGVyIHx8Ci0gICAgICAgIChpbnRlcm5hbDo6TG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8UmF3VCwgUmF3VT46OnZhbHVlKSwKLSAgICAgICAgY29udmVyc2lvbl9vZl9hcml0aG1ldGljX3R5cGVzX211c3RfYmVfbG9zc2xlc3MpOwotICAgIHJldHVybiBNYXRjaGVyQ2FzdDxUPihtYXRjaGVyKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+Ci1pbmxpbmUgTWF0Y2hlcjxUPiBTYWZlTWF0Y2hlckNhc3QoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcikgewotICByZXR1cm4gU2FmZU1hdGNoZXJDYXN0SW1wbDxUPjo6Q2FzdChwb2x5bW9ycGhpY19tYXRjaGVyKTsKLX0KLQotLy8gQTxUPigpIHJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1NYXRjaGVyPFQ+IEEoKTsKLQotLy8gQW55dGhpbmcgaW5zaWRlIHRoZSAnaW50ZXJuYWwnIG5hbWVzcGFjZSBJUyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTgotLy8gYW5kIE1VU1QgTk9UIEJFIFVTRUQgSU4gVVNFUiBDT0RFISEhCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJZiB0aGUgZXhwbGFuYXRpb24gaXMgbm90IGVtcHR5LCBwcmludHMgaXQgdG8gdGhlIG9zdHJlYW0uCi1pbmxpbmUgdm9pZCBQcmludElmTm90RW1wdHkoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgZXhwbGFuYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIGlmIChleHBsYW5hdGlvbiAhPSAiIiAmJiBvcyAhPSBOVUxMKSB7Ci0gICAgKm9zIDw8ICIsICIgPDwgZXhwbGFuYXRpb247Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIG5hbWUgaXMgZWFzeSB0byByZWFkIGJ5IGEgaHVtYW4uCi0vLyBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgcHJpbnRpbmcgdGhlIHR5cGUgb2YgYSB2YWx1ZSBtaWdodAotLy8gYmUgaGVscGZ1bC4KLWlubGluZSBib29sIElzUmVhZGFibGVUeXBlTmFtZShjb25zdCBzdHJpbmcmIHR5cGVfbmFtZSkgewotICAvLyBXZSBjb25zaWRlciBhIHR5cGUgbmFtZSByZWFkYWJsZSBpZiBpdCdzIHNob3J0IG9yIGRvZXNuJ3QgY29udGFpbgotICAvLyBhIHRlbXBsYXRlIG9yIGZ1bmN0aW9uIHR5cGUuCi0gIHJldHVybiAodHlwZV9uYW1lLmxlbmd0aCgpIDw9IDIwIHx8Ci0gICAgICAgICAgdHlwZV9uYW1lLmZpbmRfZmlyc3Rfb2YoIjwoIikgPT0gc3RyaW5nOjpucG9zKTsKLX0KLQotLy8gTWF0Y2hlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gbWF0Y2hlciwgcHJpbnRzIHRoZSB2YWx1ZSBhbmQgZXhwbGFpbnMKLS8vIHRoZSBtYXRjaCByZXN1bHQgdG8gdGhlIGxpc3RlbmVyLiBSZXR1cm5zIHRoZSBtYXRjaCByZXN1bHQuCi0vLyAnbGlzdGVuZXInIG11c3Qgbm90IGJlIE5VTEwuCi0vLyBWYWx1ZSBjYW5ub3QgYmUgcGFzc2VkIGJ5IGNvbnN0IHJlZmVyZW5jZSwgYmVjYXVzZSBzb21lIG1hdGNoZXJzIHRha2UgYQotLy8gbm9uLWNvbnN0IGFyZ3VtZW50LgotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBUPgotYm9vbCBNYXRjaFByaW50QW5kRXhwbGFpbihWYWx1ZSYgdmFsdWUsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgLy8gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkLCB3ZSBkbyBub3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlCi0gICAgLy8gaW5uZXIgZXhwbGFuYXRpb24uCi0gICAgcmV0dXJuIG1hdGNoZXIuTWF0Y2hlcyh2YWx1ZSk7Ci0gIH0KLQotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICBjb25zdCBib29sIG1hdGNoID0gbWF0Y2hlci5NYXRjaEFuZEV4cGxhaW4odmFsdWUsICZpbm5lcl9saXN0ZW5lcik7Ci0KLSAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0jaWYgR1RFU1RfSEFTX1JUVEkKLSAgY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUgPSBHZXRUeXBlTmFtZTxWYWx1ZT4oKTsKLSAgaWYgKElzUmVhZGFibGVUeXBlTmFtZSh0eXBlX25hbWUpKQotICAgICpsaXN0ZW5lci0+c3RyZWFtKCkgPDwgIiAob2YgdHlwZSAiIDw8IHR5cGVfbmFtZSA8PCAiKSI7Ci0jZW5kaWYKLSAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotCi0gIHJldHVybiBtYXRjaDsKLX0KLQotLy8gQW4gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBkb2luZyBjb21waWxlLXRpbWUgbG9vcCBvbiBhIHR1cGxlJ3MKLS8vIGZpZWxkcy4KLXRlbXBsYXRlIDxzaXplX3QgTj4KLWNsYXNzIFR1cGxlUHJlZml4IHsKLSBwdWJsaWM6Ci0gIC8vIFR1cGxlUHJlZml4PE4+OjpNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKSByZXR1cm5zIHRydWUKLSAgLy8gaWZmIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBtYXRjaGVyX3R1cGxlIG1hdGNoZXMgdGhlIGZpcnN0IE4KLSAgLy8gZmllbGRzIG9mIHZhbHVlX3R1cGxlLCByZXNwZWN0aXZlbHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+Ci0gIHN0YXRpYyBib29sIE1hdGNoZXMoY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVyX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlX3R1cGxlKSB7Ci0gICAgcmV0dXJuIFR1cGxlUHJlZml4PE4gLSAxPjo6TWF0Y2hlcyhtYXRjaGVyX3R1cGxlLCB2YWx1ZV90dXBsZSkKLSAgICAgICAgJiYgZ2V0PE4gLSAxPihtYXRjaGVyX3R1cGxlKS5NYXRjaGVzKGdldDxOIC0gMT4odmFsdWVfdHVwbGUpKTsKLSAgfQotCi0gIC8vIFR1cGxlUHJlZml4PE4+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKG1hdGNoZXJzLCB2YWx1ZXMsIG9zKQotICAvLyBkZXNjcmliZXMgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgdGhlIGZpcnN0IE4gZmllbGRzIG9mIG1hdGNoZXJzCi0gIC8vIGFnYWluc3QgdGhlIGZpcnN0IE4gZmllbGRzIG9mIHZhbHVlcy4gIElmIHRoZXJlIGlzIG5vIGZhaWx1cmUsCi0gIC8vIG5vdGhpbmcgd2lsbCBiZSBzdHJlYW1lZCB0byBvcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLSAgc3RhdGljIHZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZXNUbyhjb25zdCBNYXRjaGVyVHVwbGUmIG1hdGNoZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICAvLyBGaXJzdCwgZGVzY3JpYmVzIGZhaWx1cmVzIGluIHRoZSBmaXJzdCBOIC0gMSBmaWVsZHMuCi0gICAgVHVwbGVQcmVmaXg8TiAtIDE+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKG1hdGNoZXJzLCB2YWx1ZXMsIG9zKTsKLQotICAgIC8vIFRoZW4gZGVzY3JpYmVzIHRoZSBmYWlsdXJlIChpZiBhbnkpIGluIHRoZSAoTiAtIDEpLXRoICgwLWJhc2VkKQotICAgIC8vIGZpZWxkLgotICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8TiAtIDEsIE1hdGNoZXJUdXBsZT46OnR5cGUgbWF0Y2hlciA9Ci0gICAgICAgIGdldDxOIC0gMT4obWF0Y2hlcnMpOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxOIC0gMSwgVmFsdWVUdXBsZT46OnR5cGUgVmFsdWU7Ci0gICAgVmFsdWUgdmFsdWUgPSBnZXQ8TiAtIDE+KHZhbHVlcyk7Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICBpZiAoIW1hdGNoZXIuTWF0Y2hBbmRFeHBsYWluKHZhbHVlLCAmbGlzdGVuZXIpKSB7Ci0gICAgICAvLyBUT0RPKHdhbik6IGluY2x1ZGUgaW4gdGhlIG1lc3NhZ2UgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAgLy8gYXMgdXNlZCBpbiBNT0NLX01FVEhPRCooKSB3aGVuIHBvc3NpYmxlLgotICAgICAgKm9zIDw8ICIgIEV4cGVjdGVkIGFyZyAjIiA8PCBOIC0gMSA8PCAiOiAiOwotICAgICAgZ2V0PE4gLSAxPihtYXRjaGVycykuRGVzY3JpYmVUbyhvcyk7Ci0gICAgICAqb3MgPDwgIlxuICAgICAgICAgICBBY3R1YWw6ICI7Ci0gICAgICAvLyBXZSByZW1vdmUgdGhlIHJlZmVyZW5jZSBpbiB0eXBlIFZhbHVlIHRvIHByZXZlbnQgdGhlCi0gICAgICAvLyB1bml2ZXJzYWwgcHJpbnRlciBmcm9tIHByaW50aW5nIHRoZSBhZGRyZXNzIG9mIHZhbHVlLCB3aGljaAotICAgICAgLy8gaXNuJ3QgaW50ZXJlc3RpbmcgdG8gdGhlIHVzZXIgbW9zdCBvZiB0aGUgdGltZS4gIFRoZQotICAgICAgLy8gbWF0Y2hlcidzIE1hdGNoQW5kRXhwbGFpbigpIG1ldGhvZCBoYW5kbGVzIHRoZSBjYXNlIHdoZW4KLSAgICAgIC8vIHRoZSBhZGRyZXNzIGlzIGludGVyZXN0aW5nLgotICAgICAgaW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KHZhbHVlLCBvcyk7Ci0gICAgICBQcmludElmTm90RW1wdHkobGlzdGVuZXIuc3RyKCksIG9zKTsKLSAgICAgICpvcyA8PCAiXG4iOwotICAgIH0KLSAgfQotfTsKLQotLy8gVGhlIGJhc2UgY2FzZS4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBUdXBsZVByZWZpeDwwPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotICBzdGF0aWMgYm9vbCBNYXRjaGVzKGNvbnN0IE1hdGNoZXJUdXBsZSYgLyogbWF0Y2hlcl90dXBsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiAvKiB2YWx1ZV90dXBsZSAqLykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLSAgc3RhdGljIHZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZXNUbyhjb25zdCBNYXRjaGVyVHVwbGUmIC8qIG1hdGNoZXJzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIC8qIHZhbHVlcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIHt9Ci19OwotCi0vLyBUdXBsZU1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpIHJldHVybnMgdHJ1ZSBpZmYgYWxsCi0vLyBtYXRjaGVycyBpbiBtYXRjaGVyX3R1cGxlIG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbgotLy8gdmFsdWVfdHVwbGUuICBJdCBpcyBhIGNvbXBpbGVyIGVycm9yIGlmIG1hdGNoZXJfdHVwbGUgYW5kCi0vLyB2YWx1ZV90dXBsZSBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2YgZmllbGRzIG9yIGluY29tcGF0aWJsZSBmaWVsZAotLy8gdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotYm9vbCBUdXBsZU1hdGNoZXMoY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVyX3R1cGxlLAotICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVfdHVwbGUpIHsKLSAgLy8gTWFrZXMgc3VyZSB0aGF0IG1hdGNoZXJfdHVwbGUgYW5kIHZhbHVlX3R1cGxlIGhhdmUgdGhlIHNhbWUKLSAgLy8gbnVtYmVyIG9mIGZpZWxkcy4KLSAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX3NpemU8VmFsdWVUdXBsZT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcl9hbmRfdmFsdWVfaGF2ZV9kaWZmZXJlbnRfbnVtYmVyc19vZl9maWVsZHMpOwotICByZXR1cm4gVHVwbGVQcmVmaXg8dHVwbGVfc2l6ZTxWYWx1ZVR1cGxlPjo6dmFsdWU+OjoKLSAgICAgIE1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpOwotfQotCi0vLyBEZXNjcmliZXMgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgbWF0Y2hlcnMgYWdhaW5zdCB2YWx1ZXMuICBJZiB0aGVyZQotLy8gaXMgbm8gZmFpbHVyZSwgbm90aGluZyB3aWxsIGJlIHN0cmVhbWVkIHRvIG9zLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLXZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8oY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgVHVwbGVQcmVmaXg8dHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZT46OkV4cGxhaW5NYXRjaEZhaWx1cmVzVG8oCi0gICAgICBtYXRjaGVycywgdmFsdWVzLCBvcyk7Ci19Ci0KLS8vIFRyYW5zZm9ybVR1cGxlVmFsdWVzIGFuZCBpdHMgaGVscGVyLgotLy8KLS8vIFRyYW5zZm9ybVR1cGxlVmFsdWVzSGVscGVyIGhpZGVzIHRoZSBpbnRlcm5hbCBtYWNoaW5lcnkgdGhhdAotLy8gVHJhbnNmb3JtVHVwbGVWYWx1ZXMgdXNlcyB0byBpbXBsZW1lbnQgYSB0dXBsZSB0cmF2ZXJzYWwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIE91dEl0ZXI+Ci1jbGFzcyBUcmFuc2Zvcm1UdXBsZVZhbHVlc0hlbHBlciB7Ci0gcHJpdmF0ZToKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlX3NpemU8VHVwbGU+IFR1cGxlU2l6ZTsKLQotIHB1YmxpYzoKLSAgLy8gRm9yIGVhY2ggbWVtYmVyIG9mIHR1cGxlICd0JywgdGFrZW4gaW4gb3JkZXIsIGV2YWx1YXRlcyAnKm91dCsrID0gZih0KScuCi0gIC8vIFJldHVybnMgdGhlIGZpbmFsIHZhbHVlIG9mICdvdXQnIGluIGNhc2UgdGhlIGNhbGxlciBuZWVkcyBpdC4KLSAgc3RhdGljIE91dEl0ZXIgUnVuKEZ1bmMgZiwgY29uc3QgVHVwbGUmIHQsIE91dEl0ZXIgb3V0KSB7Ci0gICAgcmV0dXJuIEl0ZXJhdGVPdmVyVHVwbGU8VHVwbGUsIFR1cGxlU2l6ZTo6dmFsdWU+KCkoZiwgdCwgb3V0KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cCwgc2l6ZV90IGtSZW1haW5pbmdTaXplPgotICBzdHJ1Y3QgSXRlcmF0ZU92ZXJUdXBsZSB7Ci0gICAgT3V0SXRlciBvcGVyYXRvcigpIChGdW5jIGYsIGNvbnN0IFR1cCYgdCwgT3V0SXRlciBvdXQpIGNvbnN0IHsKLSAgICAgICpvdXQrKyA9IGYoOjp0ZXN0aW5nOjpnZXQ8VHVwbGVTaXplOjp2YWx1ZSAtIGtSZW1haW5pbmdTaXplPih0KSk7Ci0gICAgICByZXR1cm4gSXRlcmF0ZU92ZXJUdXBsZTxUdXAsIGtSZW1haW5pbmdTaXplIC0gMT4oKShmLCB0LCBvdXQpOwotICAgIH0KLSAgfTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cD4KLSAgc3RydWN0IEl0ZXJhdGVPdmVyVHVwbGU8VHVwLCAwPiB7Ci0gICAgT3V0SXRlciBvcGVyYXRvcigpIChGdW5jIC8qIGYgKi8sIGNvbnN0IFR1cCYgLyogdCAqLywgT3V0SXRlciBvdXQpIGNvbnN0IHsKLSAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotICB9OwotfTsKLQotLy8gU3VjY2Vzc2l2ZWx5IGludm9rZXMgJ2YoZWxlbWVudCknIG9uIGVhY2ggZWxlbWVudCBvZiB0aGUgdHVwbGUgJ3QnLAotLy8gYXBwZW5kaW5nIGVhY2ggcmVzdWx0IHRvIHRoZSAnb3V0JyBpdGVyYXRvci4gUmV0dXJucyB0aGUgZmluYWwgdmFsdWUKLS8vIG9mICdvdXQnLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlLCB0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBPdXRJdGVyPgotT3V0SXRlciBUcmFuc2Zvcm1UdXBsZVZhbHVlcyhGdW5jIGYsIGNvbnN0IFR1cGxlJiB0LCBPdXRJdGVyIG91dCkgewotICByZXR1cm4gVHJhbnNmb3JtVHVwbGVWYWx1ZXNIZWxwZXI8VHVwbGUsIEZ1bmMsIE91dEl0ZXI+OjpSdW4oZiwgdCwgb3V0KTsKLX0KLQotLy8gSW1wbGVtZW50cyBBPFQ+KCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEFueU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigKLSAgICAgIFQgLyogeCAqLywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXMgYW55dGhpbmciOyB9Ci0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgLy8gVGhpcyBpcyBtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcycgc2FmZSwgYXMgaXQncyBub3QgdmVyeSB1c2VmdWwKLSAgICAvLyB0byB3cml0ZSBOb3QoQTxib29sPigpKS4gIEhvd2V2ZXIgd2UgY2Fubm90IGNvbXBsZXRlbHkgcnVsZSBvdXQKLSAgICAvLyBzdWNoIGEgcG9zc2liaWxpdHksIGFuZCBpdCBkb2Vzbid0IGh1cnQgdG8gYmUgcHJlcGFyZWQuCi0gICAgKm9zIDw8ICJuZXZlciBtYXRjaGVzIjsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyBfLCBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSBvZiBhbnkKLS8vIHR5cGUuICBUaGlzIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgc28gd2UgbmVlZCBhIHRlbXBsYXRlIHR5cGUKLS8vIGNvbnZlcnNpb24gb3BlcmF0b3IgdG8gbWFrZSBpdCBhcHBlYXJpbmcgYXMgYSBNYXRjaGVyPFQ+IGZvciBhbnkKLS8vIHR5cGUgVC4KLWNsYXNzIEFueXRoaW5nTWF0Y2hlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsgcmV0dXJuIEE8VD4oKTsgfQotfTsKLQotLy8gSW1wbGVtZW50cyBhIG1hdGNoZXIgdGhhdCBjb21wYXJlcyBhIGdpdmVuIHZhbHVlIHdpdGggYQotLy8gcHJlLXN1cHBsaWVkIHZhbHVlIHVzaW5nIG9uZSBvZiB0aGUgPT0sIDw9LCA8LCBldGMsIG9wZXJhdG9ycy4gIFRoZQotLy8gdHdvIHZhbHVlcyBiZWluZyBjb21wYXJlZCBkb24ndCBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgdHlwZS4KLS8vCi0vLyBUaGUgbWF0Y2hlciBkZWZpbmVkIGhlcmUgaXMgcG9seW1vcnBoaWMgKGZvciBleGFtcGxlLCBFcSg1KSBjYW4gYmUKLS8vIHVzZWQgdG8gbWF0Y2ggYW4gaW50LCBhIHNob3J0LCBhIGRvdWJsZSwgZXRjKS4gIFRoZXJlZm9yZSB3ZSB1c2UKLS8vIGEgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KLS8vCi0vLyBUaGUgZm9sbG93aW5nIHRlbXBsYXRlIGRlZmluaXRpb24gYXNzdW1lcyB0aGF0IHRoZSBSaHMgcGFyYW1ldGVyIGlzCi0vLyBhICJiYXJlIiB0eXBlIChpLmUuIG5laXRoZXIgJ2NvbnN0IFQnIG5vciAnVCYnKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBELCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIE9wPgotY2xhc3MgQ29tcGFyaXNvbkJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ29tcGFyaXNvbkJhc2UoY29uc3QgUmhzJiByaHMpIDogcmhzXyhyaHMpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHM+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8TGhzPihyaHNfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHM+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxMaHM+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFJocyYgcmhzKSA6IHJoc18ocmhzKSB7fQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgIExocyBsaHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgICByZXR1cm4gT3AoKShsaHMsIHJoc18pOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCBEOjpEZXNjKCkgPDwgIiAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8IEQ6Ok5lZ2F0ZWREZXNjKCkgPDwgICIgIjsKLSAgICAgIFVuaXZlcnNhbFByaW50KHJoc18sIG9zKTsKLSAgICB9Ci0gICBwcml2YXRlOgotICAgIFJocyByaHNfOwotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0gIFJocyByaHNfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbXBhcmlzb25CYXNlKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBFcU1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8RXFNYXRjaGVyPFJocz4sIFJocywgQW55RXE+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVxTWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8RXFNYXRjaGVyPFJocz4sIFJocywgQW55RXE+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzIGVxdWFsIHRvIjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgZXF1YWwgdG8iOyB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWNsYXNzIE5lTWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxOZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlOZT4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTmVNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQotICAgICAgOiBDb21wYXJpc29uQmFzZTxOZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlOZT4ocmhzKSB7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXNuJ3QgZXF1YWwgdG8iOyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpcyBlcXVhbCB0byI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgTHRNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPEx0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUx0PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBMdE1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPEx0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUx0PihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA8IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPCI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgR3RNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPEd0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUd0PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHdE1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPEd0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUd0PihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA+IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPiI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgTGVNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPExlTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUxlPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBMZU1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPExlTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUxlPihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA8PSI7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzbid0IDw9IjsgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBHZU1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8R2VNYXRjaGVyPFJocz4sIFJocywgQW55R2U+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdlTWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8R2VNYXRjaGVyPFJocz4sIFJocywgQW55R2U+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzID49IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPj0iOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBJc051bGwoKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGFueSByYXcgb3Igc21hcnQKLS8vIHBvaW50ZXIgdGhhdCBpcyBOVUxMLgotY2xhc3MgSXNOdWxsTWF0Y2hlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgUG9pbnRlciYgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0gICAgcmV0dXJuIHAgPT0gbnVsbHB0cjsKLSNlbHNlICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gICAgcmV0dXJuIEdldFJhd1BvaW50ZXIocCkgPT0gTlVMTDsKLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIE5VTEwiOyB9Ci0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaXNuJ3QgTlVMTCI7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIE5vdE51bGwoKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGFueSByYXcgb3Igc21hcnQKLS8vIHBvaW50ZXIgdGhhdCBpcyBub3QgTlVMTC4KLWNsYXNzIE5vdE51bGxNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBQb2ludGVyJiBwLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gcCAhPSBudWxscHRyOwotI2Vsc2UgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gR2V0UmF3UG9pbnRlcihwKSAhPSBOVUxMOwotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gIH0KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXNuJ3QgTlVMTCI7IH0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBOVUxMIjsKLSAgfQotfTsKLQotLy8gUmVmKHZhcmlhYmxlKSBtYXRjaGVzIGFueSBhcmd1bWVudCB0aGF0IGlzIGEgcmVmZXJlbmNlIHRvCi0vLyAndmFyaWFibGUnLiAgVGhpcyBtYXRjaGVyIGlzIHBvbHltb3JwaGljIGFzIGl0IGNhbiBtYXRjaCBhbnkKLS8vIHN1cGVyIHR5cGUgb2YgdGhlIHR5cGUgb2YgJ3ZhcmlhYmxlJy4KLS8vCi0vLyBUaGUgUmVmTWF0Y2hlciB0ZW1wbGF0ZSBjbGFzcyBpbXBsZW1lbnRzIFJlZih2YXJpYWJsZSkuICBJdCBjYW4KLS8vIG9ubHkgYmUgaW5zdGFudGlhdGVkIHdpdGggYSByZWZlcmVuY2UgdHlwZS4gIFRoaXMgcHJldmVudHMgYSB1c2VyCi0vLyBmcm9tIG1pc3Rha2VubHkgdXNpbmcgUmVmKHgpIHRvIG1hdGNoIGEgbm9uLXJlZmVyZW5jZSBmdW5jdGlvbgotLy8gYXJndW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3aWxsIHJpZ2h0ZW91c2x5IGNhdXNlIGEKLS8vIGNvbXBpbGVyIGVycm9yOgotLy8KLS8vICAgaW50IG47Ci0vLyAgIE1hdGNoZXI8aW50PiBtMSA9IFJlZihuKTsgICAvLyBUaGlzIHdvbid0IGNvbXBpbGUuCi0vLyAgIE1hdGNoZXI8aW50Jj4gbTIgPSBSZWYobik7ICAvLyBUaGlzIHdpbGwgY29tcGlsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUmVmTWF0Y2hlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZWZNYXRjaGVyPFQmPiB7Ci0gIC8vIEdvb2dsZSBNb2NrIGlzIGEgZ2VuZXJpYyBmcmFtZXdvcmsgYW5kIHRodXMgbmVlZHMgdG8gc3VwcG9ydAotICAvLyBtb2NraW5nIGFueSBmdW5jdGlvbiB0eXBlcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgdGFrZSBub24tY29uc3QKLSAgLy8gcmVmZXJlbmNlIGFyZ3VtZW50cy4gIFRoZXJlZm9yZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgKGFuZAotICAvLyBTdXBlciBiZWxvdykgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgYSBjb25zdCB0eXBlIG9yIGEKLSAgLy8gbm9uLWNvbnN0IHR5cGUuCi0gcHVibGljOgotICAvLyBSZWZNYXRjaGVyKCkgdGFrZXMgYSBUJiBpbnN0ZWFkIG9mIGNvbnN0IFQmLCBhcyB3ZSB3YW50IHRoZQotICAvLyBjb21waWxlciB0byBjYXRjaCB1c2luZyBSZWYoY29uc3RfdmFsdWUpIGFzIGEgbWF0Y2hlciBmb3IgYQotICAvLyBub24tY29uc3QgcmVmZXJlbmNlLgotICBleHBsaWNpdCBSZWZNYXRjaGVyKFQmIHgpIDogb2JqZWN0Xyh4KSB7fSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN1cGVyPgotICBvcGVyYXRvciBNYXRjaGVyPFN1cGVyJj4oKSBjb25zdCB7Ci0gICAgLy8gQnkgcGFzc2luZyBvYmplY3RfICh0eXBlIFQmKSB0byBJbXBsKCksIHdoaWNoIGV4cGVjdHMgYSBTdXBlciYsCi0gICAgLy8gd2UgbWFrZSBzdXJlIHRoYXQgU3VwZXIgaXMgYSBzdXBlciB0eXBlIG9mIFQuICBJbiBwYXJ0aWN1bGFyLAotICAgIC8vIHRoaXMgY2F0Y2hlcyB1c2luZyBSZWYoY29uc3RfdmFsdWUpIGFzIGEgbWF0Y2hlciBmb3IgYQotICAgIC8vIG5vbi1jb25zdCByZWZlcmVuY2UsIGFzIHlvdSBjYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgY29uc3QKLSAgICAvLyByZWZlcmVuY2UgdG8gYSBub24tY29uc3QgcmVmZXJlbmNlLgotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxTdXBlcj4ob2JqZWN0XykpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3VwZXI+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxTdXBlciY+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbXBsKFN1cGVyJiB4KSA6IG9iamVjdF8oeCkge30gIC8vIE5PTElOVAotCi0gICAgLy8gTWF0Y2hBbmRFeHBsYWluKCkgdGFrZXMgYSBTdXBlciYgKGFzIG9wcG9zZWQgdG8gY29uc3QgU3VwZXImKQotICAgIC8vIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBpbnRlcmZhY2UgTWF0Y2hlckludGVyZmFjZTxTdXBlciY+LgotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgIFN1cGVyJiB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyBsb2NhdGVkIEAiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmeCk7Ci0gICAgICByZXR1cm4gJnggPT0gJm9iamVjdF87Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgInJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlICI7Ci0gICAgICBVbml2ZXJzYWxQcmludGVyPFN1cGVyJj46OlByaW50KG9iamVjdF8sIG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkb2VzIG5vdCByZWZlcmVuY2UgdGhlIHZhcmlhYmxlICI7Ci0gICAgICBVbml2ZXJzYWxQcmludGVyPFN1cGVyJj46OlByaW50KG9iamVjdF8sIG9zKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgU3VwZXImIG9iamVjdF87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIFQmIG9iamVjdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZWZNYXRjaGVyKTsKLX07Ci0KLS8vIFBvbHltb3JwaGljIGhlbHBlciBmdW5jdGlvbnMgZm9yIG5hcnJvdyBhbmQgd2lkZSBzdHJpbmcgbWF0Y2hlcnMuCi1pbmxpbmUgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKSB7Ci0gIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMobGhzLCByaHMpOwotfQotCi1pbmxpbmUgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKSB7Ci0gIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGxocywgcmhzKTsKLX0KLQotLy8gU3RyaW5nIGNvbXBhcmlzb24gZm9yIG5hcnJvdyBvciB3aWRlIHN0cmluZ3MgdGhhdCBjYW4gaGF2ZSBlbWJlZGRlZCBOVUwKLS8vIGNoYXJhY3RlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWJvb2wgQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKGNvbnN0IFN0cmluZ1R5cGUmIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nVHlwZSYgczIpIHsKLSAgLy8gQXJlIHRoZSBoZWFkcyBlcXVhbD8KLSAgaWYgKCFDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLmNfc3RyKCksIHMyLmNfc3RyKCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2tpcCB0aGUgZXF1YWwgaGVhZHMuCi0gIGNvbnN0IHR5cGVuYW1lIFN0cmluZ1R5cGU6OnZhbHVlX3R5cGUgbnVsID0gMDsKLSAgY29uc3Qgc2l6ZV90IGkxID0gczEuZmluZChudWwpLCBpMiA9IHMyLmZpbmQobnVsKTsKLQotICAvLyBBcmUgd2UgYXQgdGhlIGVuZCBvZiBlaXRoZXIgczEgb3IgczI/Ci0gIGlmIChpMSA9PSBTdHJpbmdUeXBlOjpucG9zIHx8IGkyID09IFN0cmluZ1R5cGU6Om5wb3MpIHsKLSAgICByZXR1cm4gaTEgPT0gaTI7Ci0gIH0KLQotICAvLyBBcmUgdGhlIHRhaWxzIGVxdWFsPwotICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKHMxLnN1YnN0cihpMSArIDEpLCBzMi5zdWJzdHIoaTIgKyAxKSk7Ci19Ci0KLS8vIFN0cmluZyBtYXRjaGVycy4KLQotLy8gSW1wbGVtZW50cyBlcXVhbGl0eS1iYXNlZCBzdHJpbmcgbWF0Y2hlcnMgbGlrZSBTdHJFcSwgU3RyQ2FzZU5lLCBhbmQgZXRjLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1jbGFzcyBTdHJFcXVhbGl0eU1hdGNoZXIgewotIHB1YmxpYzoKLSAgU3RyRXF1YWxpdHlNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHN0ciwgYm9vbCBleHBlY3RfZXEsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGNhc2Vfc2Vuc2l0aXZlKQotICAgICAgOiBzdHJpbmdfKHN0ciksIGV4cGVjdF9lcV8oZXhwZWN0X2VxKSwgY2FzZV9zZW5zaXRpdmVfKGNhc2Vfc2Vuc2l0aXZlKSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKHMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuICFleHBlY3RfZXFfOwotICAgIH0KLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLgotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwKLSAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlZVN0cmluZ1R5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKHMpOwotICAgIGNvbnN0IGJvb2wgZXEgPSBjYXNlX3NlbnNpdGl2ZV8gPyBzMiA9PSBzdHJpbmdfIDoKLSAgICAgICAgQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKHMyLCBzdHJpbmdfKTsKLSAgICByZXR1cm4gZXhwZWN0X2VxXyA9PSBlcTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBEZXNjcmliZVRvSGVscGVyKGV4cGVjdF9lcV8sIG9zKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIERlc2NyaWJlVG9IZWxwZXIoIWV4cGVjdF9lcV8sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBEZXNjcmliZVRvSGVscGVyKGJvb2wgZXhwZWN0X2VxLCA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgKGV4cGVjdF9lcSA/ICJpcyAiIDogImlzbid0ICIpOwotICAgICpvcyA8PCAiZXF1YWwgdG8gIjsKLSAgICBpZiAoIWNhc2Vfc2Vuc2l0aXZlXykgewotICAgICAgKm9zIDw8ICIoaWdub3JpbmcgY2FzZSkgIjsKLSAgICB9Ci0gICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nXywgb3MpOwotICB9Ci0KLSAgY29uc3QgU3RyaW5nVHlwZSBzdHJpbmdfOwotICBjb25zdCBib29sIGV4cGVjdF9lcV87Ci0gIGNvbnN0IGJvb2wgY2FzZV9zZW5zaXRpdmVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU3RyRXF1YWxpdHlNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIEhhc1N1YnN0cihzdWJzdHJpbmcpIG1hdGNoZXIsIHdoaWNoCi0vLyBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcyBUIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQotLy8gc3RyaW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1jbGFzcyBIYXNTdWJzdHJNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEhhc1N1YnN0ck1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3Vic3RyaW5nKQotICAgICAgOiBzdWJzdHJpbmdfKHN1YnN0cmluZykge30KLQotICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToKLSAgLy8gICBjb25zdCBjaGFyKgotICAvLyAgIGNoYXIqCi0gIC8vICAgY29uc3Qgd2NoYXJfdCoKLSAgLy8gICB3Y2hhcl90KgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBzICE9IE5VTEwgJiYgTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLgotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwKLSAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlZVN0cmluZ1R5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKHMpOwotICAgIHJldHVybiBzMi5maW5kKHN1YnN0cmluZ18pICE9IFN0cmluZ1R5cGU6Om5wb3M7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgbWF0Y2hlcy4KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIHN1YnN0cmluZyAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1YnN0cmluZ18sIG9zKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIG5vIHN1YnN0cmluZyAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1YnN0cmluZ18sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RyaW5nVHlwZSBzdWJzdHJpbmdfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSGFzU3Vic3RyTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBTdGFydHNXaXRoKHN1YnN0cmluZykgbWF0Y2hlciwgd2hpY2gKLS8vIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhCi0vLyBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWNsYXNzIFN0YXJ0c1dpdGhNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFN0YXJ0c1dpdGhNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHByZWZpeCkgOiBwcmVmaXhfKHByZWZpeCkgewotICB9Ci0KLSAgLy8gQWNjZXB0cyBwb2ludGVyIHR5cGVzLCBwYXJ0aWN1bGFybHk6Ci0gIC8vICAgY29uc3QgY2hhcioKLSAgLy8gICBjaGFyKgotICAvLyAgIGNvbnN0IHdjaGFyX3QqCi0gIC8vICAgd2NoYXJfdCoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihDaGFyVHlwZSogcywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7Ci0gIH0KLQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBub3QganVzdCBhIHBsYWluIGZ1bmN0aW9uIHdpdGggY29uc3QgU3RyaW5nVHlwZSYsCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZWVTdHJpbmdUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBNYXRjaGVlU3RyaW5nVHlwZSYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICBjb25zdCBTdHJpbmdUeXBlJiBzMihzKTsKLSAgICByZXR1cm4gczIubGVuZ3RoKCkgPj0gcHJlZml4Xy5sZW5ndGgoKSAmJgotICAgICAgICBzMi5zdWJzdHIoMCwgcHJlZml4Xy5sZW5ndGgoKSkgPT0gcHJlZml4XzsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgInN0YXJ0cyB3aXRoICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQocHJlZml4Xywgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IHN0YXJ0IHdpdGggIjsKLSAgICBVbml2ZXJzYWxQcmludChwcmVmaXhfLCBvcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IFN0cmluZ1R5cGUgcHJlZml4XzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFN0YXJ0c1dpdGhNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIEVuZHNXaXRoKHN1YnN0cmluZykgbWF0Y2hlciwgd2hpY2gKLS8vIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhCi0vLyBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWNsYXNzIEVuZHNXaXRoTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbmRzV2l0aE1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3VmZml4KSA6IHN1ZmZpeF8oc3VmZml4KSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBNYXRjaEFuZEV4cGxhaW4oU3RyaW5nVHlwZShzKSwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIFN0cmluZ1R5cGUuCi0gIC8vCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IFN0cmluZ1R5cGUmLAotICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7Ci0gICAgcmV0dXJuIHMyLmxlbmd0aCgpID49IHN1ZmZpeF8ubGVuZ3RoKCkgJiYKLSAgICAgICAgczIuc3Vic3RyKHMyLmxlbmd0aCgpIC0gc3VmZml4Xy5sZW5ndGgoKSkgPT0gc3VmZml4XzsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImVuZHMgd2l0aCAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1ZmZpeF8sIG9zKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZG9lc24ndCBlbmQgd2l0aCAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1ZmZpeF8sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RyaW5nVHlwZSBzdWZmaXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRW5kc1dpdGhNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgbWF0Y2hlcnMgTWF0Y2hlc1JlZ2V4KHJlZ2V4KSBhbmQKLS8vIENvbnRhaW5zUmVnZXgocmVnZXgpLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcwotLy8gVCBjYW4gYmUgY29udmVydGVkIHRvIGEgc3RyaW5nLgotY2xhc3MgTWF0Y2hlc1JlZ2V4TWF0Y2hlciB7Ci0gcHVibGljOgotICBNYXRjaGVzUmVnZXhNYXRjaGVyKGNvbnN0IFJFKiByZWdleCwgYm9vbCBmdWxsX21hdGNoKQotICAgICAgOiByZWdleF8ocmVnZXgpLCBmdWxsX21hdGNoXyhmdWxsX21hdGNoKSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBNYXRjaEFuZEV4cGxhaW4oaW50ZXJuYWw6OnN0cmluZyhzKSwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIGludGVybmFsOjpzdHJpbmcuCi0gIC8vCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IGludGVybmFsOjpzdHJpbmcmLAotICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCi0gIHRlbXBsYXRlIDxjbGFzcyBNYXRjaGVlU3RyaW5nVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgczIocyk7Ci0gICAgcmV0dXJuIGZ1bGxfbWF0Y2hfID8gUkU6OkZ1bGxNYXRjaChzMiwgKnJlZ2V4XykgOgotICAgICAgICBSRTo6UGFydGlhbE1hdGNoKHMyLCAqcmVnZXhfKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgKGZ1bGxfbWF0Y2hfID8gIm1hdGNoZXMiIDogImNvbnRhaW5zIikKLSAgICAgICAgPDwgIiByZWd1bGFyIGV4cHJlc3Npb24gIjsKLSAgICBVbml2ZXJzYWxQcmludGVyPGludGVybmFsOjpzdHJpbmc+OjpQcmludChyZWdleF8tPnBhdHRlcm4oKSwgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0ICIgPDwgKGZ1bGxfbWF0Y2hfID8gIm1hdGNoIiA6ICJjb250YWluIikKLSAgICAgICAgPDwgIiByZWd1bGFyIGV4cHJlc3Npb24gIjsKLSAgICBVbml2ZXJzYWxQcmludGVyPGludGVybmFsOjpzdHJpbmc+OjpQcmludChyZWdleF8tPnBhdHRlcm4oKSwgb3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBSRT4gcmVnZXhfOwotICBjb25zdCBib29sIGZ1bGxfbWF0Y2hfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTWF0Y2hlc1JlZ2V4TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNvbXBhcmVzIHRoZSB0d28gZmllbGRzIG9mIGEgMi10dXBsZQotLy8gdXNpbmcgb25lIG9mIHRoZSA9PSwgPD0sIDwsIGV0Yywgb3BlcmF0b3JzLiAgVGhlIHR3byBmaWVsZHMgYmVpbmcKLS8vIGNvbXBhcmVkIGRvbid0IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlLgotLy8KLS8vIFRoZSBtYXRjaGVyIGRlZmluZWQgaGVyZSBpcyBwb2x5bW9ycGhpYyAoZm9yIGV4YW1wbGUsIEVxKCkgY2FuIGJlCi0vLyB1c2VkIHRvIG1hdGNoIGEgdHVwbGU8aW50LCBzaG9ydD4sIGEgdHVwbGU8Y29uc3QgbG9uZyYsIGRvdWJsZT4sCi0vLyBldGMpLiAgVGhlcmVmb3JlIHdlIHVzZSBhIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBpbiB0aGUKLS8vIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEQsIHR5cGVuYW1lIE9wPgotY2xhc3MgUGFpck1hdGNoQmFzZSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBvcGVyYXRvciBNYXRjaGVyPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiA+KTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBvcGVyYXRvciBNYXRjaGVyPGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiY+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4mPik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyA6OnN0ZDo6b3N0cmVhbSYgR2V0RGVzYyg6OnN0ZDo6b3N0cmVhbSYgb3MpIHsgIC8vIE5PTElOVAotICAgIHJldHVybiBvcyA8PCBEOjpEZXNjKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUdXBsZT4gewotICAgcHVibGljOgotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgIFR1cGxlIGFyZ3MsCi0gICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgICByZXR1cm4gT3AoKSg6OnRlc3Rpbmc6OmdldDwwPihhcmdzKSwgOjp0ZXN0aW5nOjpnZXQ8MT4oYXJncykpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiYXJlICIgPDwgR2V0RGVzYzsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiYXJlbid0ICIgPDwgR2V0RGVzYzsKLSAgICB9Ci0gIH07Ci19OwotCi1jbGFzcyBFcTJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8RXEyTWF0Y2hlciwgQW55RXE+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImFuIGVxdWFsIHBhaXIiOyB9Ci19OwotY2xhc3MgTmUyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPE5lMk1hdGNoZXIsIEFueU5lPiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhbiB1bmVxdWFsIHBhaXIiOyB9Ci19OwotY2xhc3MgTHQyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPEx0Mk1hdGNoZXIsIEFueUx0PiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IDwgdGhlIHNlY29uZCI7IH0KLX07Ci1jbGFzcyBHdDJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8R3QyTWF0Y2hlciwgQW55R3Q+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPiB0aGUgc2Vjb25kIjsgfQotfTsKLWNsYXNzIExlMk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxMZTJNYXRjaGVyLCBBbnlMZT4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8PSB0aGUgc2Vjb25kIjsgfQotfTsKLWNsYXNzIEdlMk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxHZTJNYXRjaGVyLCBBbnlHZT4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kIjsgfQotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgTm90KC4uLikgbWF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIGFyZ3VtZW50IHR5cGUgVC4KLS8vIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgTm90TWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMgdGhhdAotLy8gd2lsbCBwcmV2ZW50IGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZiBOb3RNYXRjaGVyIGZyb20gc2hhcmluZwotLy8gdGhlIHNhbWUgTm90TWF0Y2hlckltcGw8VD4gY2xhc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE5vdE1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTm90TWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcikKLSAgICAgIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gIW1hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbih4LCBsaXN0ZW5lcik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5vdE1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIE5vdChtKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGEgdmFsdWUgdGhhdCBkb2Vzbid0Ci0vLyBtYXRjaCBtYXRjaGVyIG0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotY2xhc3MgTm90TWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOb3RNYXRjaGVyKElubmVyTWF0Y2hlciBtYXRjaGVyKSA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIE5vdChtKSB0byBiZSB1c2VkCi0gIC8vIHRvIG1hdGNoIGFueSB0eXBlIG0gY2FuIG1hdGNoLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTm90TWF0Y2hlckltcGw8VD4oU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXJfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICBJbm5lck1hdGNoZXIgbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhOb3RNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEFsbE9mKG0xLCBtMikgbWF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIGFyZ3VtZW50IHR5cGUKLS8vIFQuIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgQm90aE9mTWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMKLS8vIHRoYXQgd2lsbCBwcmV2ZW50IGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZiBCb3RoT2ZNYXRjaGVyIGZyb20KLS8vIHNoYXJpbmcgdGhlIHNhbWUgQm90aE9mTWF0Y2hlckltcGw8VD4gY2xhc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEJvdGhPZk1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgQm90aE9mTWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjEsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIyKQotICAgICAgOiBtYXRjaGVyMV8obWF0Y2hlcjEpLCBtYXRjaGVyMl8obWF0Y2hlcjIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICIoIjsKLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIGFuZCAoIjsKLSAgICBtYXRjaGVyMl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICIoIjsKLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICAqb3MgPDwgIikgb3IgKCI7Ci0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIElmIGVpdGhlciBtYXRjaGVyMV8gb3IgbWF0Y2hlcjJfIGRvZXNuJ3QgbWF0Y2ggeCwgd2Ugb25seSBuZWVkCi0gICAgLy8gdG8gZXhwbGFpbiB3aHkgb25lIG9mIHRoZW0gZmFpbHMuCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0gICAgaWYgKCFtYXRjaGVyMV8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjEpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIxLnN0cigpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIyOwotICAgIGlmICghbWF0Y2hlcjJfLk1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIyKSkgewotICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMi5zdHIoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBleHBsYWluIHdoeSAqYm90aCogb2YgdGhlbSBtYXRjaC4KLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIHMxID0gbGlzdGVuZXIxLnN0cigpOwotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczIgPSBsaXN0ZW5lcjIuc3RyKCk7Ci0KLSAgICBpZiAoczEgPT0gIiIpIHsKLSAgICAgICpsaXN0ZW5lciA8PCBzMjsKLSAgICB9IGVsc2UgewotICAgICAgKmxpc3RlbmVyIDw8IHMxOwotICAgICAgaWYgKHMyICE9ICIiKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAiLCBhbmQgIiA8PCBzMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjFfOwotICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEJvdGhPZk1hdGNoZXJJbXBsKTsKLX07Ci0KLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0vLyBNYXRjaGVyTGlzdCBwcm92aWRlcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1hdGNoZXJzIGluCi0vLyBhIGxpc3Qgc3RydWN0dXJlIChMaXN0VHlwZSkgYW5kIGNyZWF0aW5nIGEgY29tYmluaW5nIG1hdGNoZXIgZnJvbSBzdWNoIGEKLS8vIGxpc3QuCi0vLyBUaGUgdGVtcGxhdGUgaXMgZGVmaW5lZCByZWN1cnNpdmVseSB1c2luZyB0aGUgZm9sbG93aW5nIHRlbXBsYXRlIHBhcmFtdGVyczoKLS8vICAgKiBrU2l6ZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBNYXRjaGVyTGlzdC4KLS8vICAgKiBIZWFkIGlzIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBtYXRjaGVyIG9mIHRoZSBsaXN0LgotLy8gICAqIFRhaWwgZGVub3RlcyB0aGUgdHlwZXMgb2YgdGhlIHJlbWFpbmluZyBtYXRjaGVycyBvZiB0aGUgbGlzdC4KLXRlbXBsYXRlIDxpbnQga1NpemUsIHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lLi4uIFRhaWw+Ci1zdHJ1Y3QgTWF0Y2hlckxpc3QgewotICB0eXBlZGVmIE1hdGNoZXJMaXN0PGtTaXplIC0gMSwgVGFpbC4uLj4gTWF0Y2hlckxpc3RUYWlsOwotICB0eXBlZGVmIDo6c3RkOjpwYWlyPEhlYWQsIHR5cGVuYW1lIE1hdGNoZXJMaXN0VGFpbDo6TGlzdFR5cGU+IExpc3RUeXBlOwotCi0gIC8vIEJ1aWxkTGlzdCBzdG9yZXMgdmFyaWFkaWMgdHlwZSB2YWx1ZXMgaW4gYSBuZXN0ZWQgcGFpciBzdHJ1Y3R1cmUuCi0gIC8vIEV4YW1wbGU6Ci0gIC8vIE1hdGNoZXJMaXN0PDMsIGludCwgc3RyaW5nLCBmbG9hdD46OkJ1aWxkTGlzdCg1LCAiZm9vIiwgMi4wKSB3aWxsIHJldHVybgotICAvLyB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQgb2YgdHlwZSBwYWlyPGludCwgcGFpcjxzdHJpbmcsIGZsb2F0Pj4uCi0gIHN0YXRpYyBMaXN0VHlwZSBCdWlsZExpc3QoY29uc3QgSGVhZCYgbWF0Y2hlciwgY29uc3QgVGFpbCYuLi4gdGFpbCkgewotICAgIHJldHVybiBMaXN0VHlwZShtYXRjaGVyLCBNYXRjaGVyTGlzdFRhaWw6OkJ1aWxkTGlzdCh0YWlsLi4uKSk7Ci0gIH0KLQotICAvLyBDcmVhdGVNYXRjaGVyPFQ+IGNyZWF0ZXMgYSBNYXRjaGVyPFQ+IGZyb20gYSBnaXZlbiBsaXN0IG9mIG1hdGNoZXJzIChidWlsdAotICAvLyBieSBCdWlsZExpc3QoKSkuIENvbWJpbmluZ01hdGNoZXI8VD4gaXMgdXNlZCB0byBjb21iaW5lIHRoZSBtYXRjaGVycyBvZiB0aGUKLSAgLy8gbGlzdC4gQ29tYmluaW5nTWF0Y2hlcjxUPiBtdXN0IGltcGxlbWVudCBNYXRjaGVySW50ZXJmYWNlPFQ+IGFuZCBoYXZlIGEKLSAgLy8gY29uc3RydWN0b3IgdGFraW5nIHR3byBNYXRjaGVyPFQ+cyBhcyBpbnB1dC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHRlbXBsYXRlIDx0eXBlbmFtZSAvKiBUICovPiBjbGFzcyBDb21iaW5pbmdNYXRjaGVyPgotICBzdGF0aWMgTWF0Y2hlcjxUPiBDcmVhdGVNYXRjaGVyKGNvbnN0IExpc3RUeXBlJiBtYXRjaGVycykgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBDb21iaW5pbmdNYXRjaGVyPFQ+KAotICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcnMuZmlyc3QpLAotICAgICAgICBNYXRjaGVyTGlzdFRhaWw6OnRlbXBsYXRlIENyZWF0ZU1hdGNoZXI8VCwgQ29tYmluaW5nTWF0Y2hlcj4oCi0gICAgICAgICAgICBtYXRjaGVycy5zZWNvbmQpKSk7Ci0gIH0KLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgYmFzZSBjYXNlIGZvciB0aGUgcmVjdXJzaXZlIGRlZmluaXRpb24gb2YKLS8vIE1hdGNoZXJMaXN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIxLCB0eXBlbmFtZSBNYXRjaGVyMj4KLXN0cnVjdCBNYXRjaGVyTGlzdDwyLCBNYXRjaGVyMSwgTWF0Y2hlcjI+IHsKLSAgdHlwZWRlZiA6OnN0ZDo6cGFpcjxNYXRjaGVyMSwgTWF0Y2hlcjI+IExpc3RUeXBlOwotCi0gIHN0YXRpYyBMaXN0VHlwZSBCdWlsZExpc3QoY29uc3QgTWF0Y2hlcjEmIG1hdGNoZXIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoZXIyJiBtYXRjaGVyMikgewotICAgIHJldHVybiA6OnN0ZDo6cGFpcjxNYXRjaGVyMSwgTWF0Y2hlcjI+KG1hdGNoZXIxLCBtYXRjaGVyMik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIC8qIFQgKi8+IGNsYXNzIENvbWJpbmluZ01hdGNoZXI+Ci0gIHN0YXRpYyBNYXRjaGVyPFQ+IENyZWF0ZU1hdGNoZXIoY29uc3QgTGlzdFR5cGUmIG1hdGNoZXJzKSB7Ci0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IENvbWJpbmluZ01hdGNoZXI8VD4oCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVycy5maXJzdCksCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVycy5zZWNvbmQpKSk7Ci0gIH0KLX07Ci0KLS8vIFZhcmlhZGljTWF0Y2hlciBpcyB1c2VkIGZvciB0aGUgdmFyaWFkaWMgaW1wbGVtZW50YXRpb24gb2YKLS8vIEFsbE9mKG1fMSwgbV8yLCAuLi4pIGFuZCBBbnlPZihtXzEsIG1fMiwgLi4uKS4KLS8vIENvbWJpbmluZ01hdGNoZXI8VD4gaXMgdXNlZCB0byByZWN1cnNpdmVseSBjb21iaW5lIHRoZSBwcm92aWRlZCBtYXRjaGVycwotLy8gKG9mIHR5cGUgQXJncy4uLikuCi10ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIENvbWJpbmluZ01hdGNoZXIsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1jbGFzcyBWYXJpYWRpY01hdGNoZXIgewotIHB1YmxpYzoKLSAgVmFyaWFkaWNNYXRjaGVyKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSAgLy8gTk9MSU5UCi0gICAgICA6IG1hdGNoZXJzXyhNYXRjaGVyTGlzdFR5cGU6OkJ1aWxkTGlzdChtYXRjaGVycy4uLikpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIGFuCi0gIC8vIFZhcmlhZGljTWF0Y2hlcjxNYXRjaGVyMSwgTWF0Y2hlcjIuLi4+IG9iamVjdCB0byBtYXRjaCBhbnkgdHlwZSB0aGF0Ci0gIC8vIGFsbCBvZiB0aGUgcHJvdmlkZWQgbWF0Y2hlcnMgKE1hdGNoZXIxLCBNYXRjaGVyMiwgLi4uKSBjYW4gbWF0Y2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyTGlzdFR5cGU6OnRlbXBsYXRlIENyZWF0ZU1hdGNoZXI8VCwgQ29tYmluaW5nTWF0Y2hlcj4oCi0gICAgICAgIG1hdGNoZXJzXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgTWF0Y2hlckxpc3Q8c2l6ZW9mLi4uKEFyZ3MpLCBBcmdzLi4uPiBNYXRjaGVyTGlzdFR5cGU7Ci0KLSAgY29uc3QgdHlwZW5hbWUgTWF0Y2hlckxpc3RUeXBlOjpMaXN0VHlwZSBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhWYXJpYWRpY01hdGNoZXIpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci11c2luZyBBbGxPZk1hdGNoZXIgPSBWYXJpYWRpY01hdGNoZXI8Qm90aE9mTWF0Y2hlckltcGwsIEFyZ3MuLi4+OwotCi0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBbGxPZihtXzEsIC4uLiwgbV9uKSBtYXRjaGVyLCB3aGljaAotLy8gbWF0Y2hlcyBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBhbGwgb2YgdGhlIG1hdGNoZXJzIG1fMSwgLi4uLCBhbmQgbV9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIxLCB0eXBlbmFtZSBNYXRjaGVyMj4KLWNsYXNzIEJvdGhPZk1hdGNoZXIgewotIHB1YmxpYzoKLSAgQm90aE9mTWF0Y2hlcihNYXRjaGVyMSBtYXRjaGVyMSwgTWF0Y2hlcjIgbWF0Y2hlcjIpCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgYQotICAvLyBCb3RoT2ZNYXRjaGVyPE1hdGNoZXIxLCBNYXRjaGVyMj4gb2JqZWN0IHRvIG1hdGNoIGFueSB0eXBlIHRoYXQKLSAgLy8gYm90aCBNYXRjaGVyMSBhbmQgTWF0Y2hlcjIgY2FuIG1hdGNoLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgQm90aE9mTWF0Y2hlckltcGw8VD4oU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIxXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMl8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1hdGNoZXIxIG1hdGNoZXIxXzsKLSAgTWF0Y2hlcjIgbWF0Y2hlcjJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQm90aE9mTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBbnlPZihtMSwgbTIpIG1hdGNoZXIgZm9yIGEgcGFydGljdWxhciBhcmd1bWVudCB0eXBlCi0vLyBULiAgV2UgZG8gbm90IG5lc3QgaXQgaW5zaWRlIHRoZSBBbnlPZk1hdGNoZXIgY2xhc3MgdGVtcGxhdGUsIGFzCi0vLyB0aGF0IHdpbGwgcHJldmVudCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YgQW55T2ZNYXRjaGVyIGZyb20KLS8vIHNoYXJpbmcgdGhlIHNhbWUgRWl0aGVyT2ZNYXRjaGVySW1wbDxUPiBjbGFzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgRWl0aGVyT2ZNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSBwdWJsaWM6Ci0gIEVpdGhlck9mTWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjEsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIyKQotICAgICAgOiBtYXRjaGVyMV8obWF0Y2hlcjEpLCBtYXRjaGVyMl8obWF0Y2hlcjIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICIoIjsKLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIG9yICgiOwotICAgIG1hdGNoZXIyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIikiOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgIigiOwotICAgIG1hdGNoZXIxXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgICpvcyA8PCAiKSBhbmQgKCI7Ci0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIElmIGVpdGhlciBtYXRjaGVyMV8gb3IgbWF0Y2hlcjJfIG1hdGNoZXMgeCwgd2UganVzdCBuZWVkIHRvCi0gICAgLy8gZXhwbGFpbiB3aHkgKm9uZSogb2YgdGhlbSBtYXRjaGVzLgotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIxOwotICAgIGlmIChtYXRjaGVyMV8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjEpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIxLnN0cigpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjI7Ci0gICAgaWYgKG1hdGNoZXIyXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMikpIHsKLSAgICAgICpsaXN0ZW5lciA8PCBsaXN0ZW5lcjIuc3RyKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBleHBsYWluIHdoeSAqYm90aCogb2YgdGhlbSBmYWlsLgotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczEgPSBsaXN0ZW5lcjEuc3RyKCk7Ci0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyBzMiA9IGxpc3RlbmVyMi5zdHIoKTsKLQotICAgIGlmIChzMSA9PSAiIikgewotICAgICAgKmxpc3RlbmVyIDw8IHMyOwotICAgIH0gZWxzZSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgczE7Ci0gICAgICBpZiAoczIgIT0gIiIpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICIsIGFuZCAiIDw8IHMyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjFfOwotICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVpdGhlck9mTWF0Y2hlckltcGwpOwotfTsKLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLS8vIEFueU9mTWF0Y2hlciBpcyB1c2VkIGZvciB0aGUgdmFyaWFkaWMgaW1wbGVtZW50YXRpb24gb2YgQW55T2YobV8xLCBtXzIsIC4uLikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLXVzaW5nIEFueU9mTWF0Y2hlciA9IFZhcmlhZGljTWF0Y2hlcjxFaXRoZXJPZk1hdGNoZXJJbXBsLCBBcmdzLi4uPjsKLQotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0KLS8vIFVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgQW55T2YobV8xLCAuLi4sIG1fbikgbWF0Y2hlciwgd2hpY2gKLS8vIG1hdGNoZXMgYSB2YWx1ZSB0aGF0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXRjaGVycyBtXzEsIC4uLiwKLS8vIGFuZCBtX24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlcjEsIHR5cGVuYW1lIE1hdGNoZXIyPgotY2xhc3MgRWl0aGVyT2ZNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIEVpdGhlck9mTWF0Y2hlcihNYXRjaGVyMSBtYXRjaGVyMSwgTWF0Y2hlcjIgbWF0Y2hlcjIpCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgYQotICAvLyBFaXRoZXJPZk1hdGNoZXI8TWF0Y2hlcjEsIE1hdGNoZXIyPiBvYmplY3QgdG8gbWF0Y2ggYW55IHR5cGUgdGhhdAotICAvLyBib3RoIE1hdGNoZXIxIGFuZCBNYXRjaGVyMiBjYW4gbWF0Y2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBFaXRoZXJPZk1hdGNoZXJJbXBsPFQ+KAotICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcjFfKSwgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIyXykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTWF0Y2hlcjEgbWF0Y2hlcjFfOwotICBNYXRjaGVyMiBtYXRjaGVyMl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFaXRoZXJPZk1hdGNoZXIpOwotfTsKLQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFRydWx5KHByZWQpLCB3aGljaCB0dXJucyBhIHByZWRpY2F0ZSBpbnRvIGEKLS8vIG1hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZGljYXRlPgotY2xhc3MgVHJ1bHlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFRydWx5TWF0Y2hlcihQcmVkaWNhdGUgcHJlZCkgOiBwcmVkaWNhdGVfKHByZWQpIHt9Ci0KLSAgLy8gVGhpcyBtZXRob2QgdGVtcGxhdGUgYWxsb3dzIFRydWx5KHByZWQpIHRvIGJlIHVzZWQgYXMgYSBtYXRjaGVyCi0gIC8vIGZvciB0eXBlIFQgd2hlcmUgVCBpcyB0aGUgYXJndW1lbnQgdHlwZSBvZiBwcmVkaWNhdGUgJ3ByZWQnLiAgVGhlCi0gIC8vIGFyZ3VtZW50IGlzIHBhc3NlZCBieSByZWZlcmVuY2UgYXMgdGhlIHByZWRpY2F0ZSBtYXkgYmUKLSAgLy8gaW50ZXJlc3RlZCBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYXJndW1lbnQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihUJiB4LCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgLy8gV2l0aG91dCB0aGUgaWYtc3RhdGVtZW50LCBNU1ZDIHNvbWV0aW1lcyB3YXJucyBhYm91dCBjb252ZXJ0aW5nCi0gICAgLy8gYSB2YWx1ZSB0byBib29sICh3YXJuaW5nIDQ4MDApLgotICAgIC8vCi0gICAgLy8gV2UgY2Fubm90IHdyaXRlICdyZXR1cm4gISFwcmVkaWNhdGVfKHgpOycgYXMgdGhhdCBkb2Vzbid0IHdvcmsKLSAgICAvLyB3aGVuIHByZWRpY2F0ZV8oeCkgcmV0dXJucyBhIGNsYXNzIGNvbnZlcnRpYmxlIHRvIGJvb2wgYnV0Ci0gICAgLy8gaGF2aW5nIG5vIG9wZXJhdG9yISgpLgotICAgIGlmIChwcmVkaWNhdGVfKHgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAic2F0aXNmaWVzIHRoZSBnaXZlbiBwcmVkaWNhdGUiOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IHNhdGlzZnkgdGhlIGdpdmVuIHByZWRpY2F0ZSI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFByZWRpY2F0ZSBwcmVkaWNhdGVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVHJ1bHlNYXRjaGVyKTsKLX07Ci0KLS8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBNYXRjaGVzKG1hdGNoZXIpLCB3aGljaCB0dXJucyBhIG1hdGNoZXIgaW50bwotLy8gYSBwcmVkaWNhdGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWNsYXNzIE1hdGNoZXJBc1ByZWRpY2F0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNYXRjaGVyQXNQcmVkaWNhdGUoTSBtYXRjaGVyKSA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSBvcGVyYXRvcigpIGFsbG93cyBNYXRjaGVzKG0pIHRvIGJlIHVzZWQgYXMgYQotICAvLyBwcmVkaWNhdGUgb24gdHlwZSBUIHdoZXJlIG0gaXMgYSBtYXRjaGVyIG9uIHR5cGUgVC4KLSAgLy8KLSAgLy8gVGhlIGFyZ3VtZW50IHggaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBpbnN0ZWFkIG9mIGJ5IHZhbHVlLCBhcwotICAvLyBzb21lIG1hdGNoZXIgbWF5IGJlIGludGVyZXN0ZWQgaW4gaXRzIGFkZHJlc3MgKGUuZy4gYXMgaW4KLSAgLy8gTWF0Y2hlcyhSZWYobikpKHgpKS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiB4KSBjb25zdCB7Ci0gICAgLy8gV2UgbGV0IG1hdGNoZXJfIGNvbW1pdCB0byBhIHBhcnRpY3VsYXIgdHlwZSBoZXJlIGluc3RlYWQgb2YKLSAgICAvLyB3aGVuIHRoZSBNYXRjaGVyQXNQcmVkaWNhdGUgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZC4gIFRoaXMKLSAgICAvLyBhbGxvd3MgdXMgdG8gd3JpdGUgTWF0Y2hlcyhtKSB3aGVyZSBtIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlcgotICAgIC8vIChlLmcuIEVxKDUpKS4KLSAgICAvLwotICAgIC8vIElmIHdlIHdyaXRlIE1hdGNoZXI8VD4obWF0Y2hlcl8pLk1hdGNoZXMoeCkgaGVyZSwgaXQgd29uJ3QKLSAgICAvLyBjb21waWxlIHdoZW4gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxjb25zdCBUJj47IGlmIHdlIHdyaXRlCi0gICAgLy8gTWF0Y2hlcjxjb25zdCBUJj4obWF0Y2hlcl8pLk1hdGNoZXMoeCkgaGVyZSwgaXQgd29uJ3QgY29tcGlsZQotICAgIC8vIHdoZW4gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxUPjsgaWYgd2UganVzdCB3cml0ZQotICAgIC8vIG1hdGNoZXJfLk1hdGNoZXMoeCksIGl0IHdvbid0IGNvbXBpbGUgd2hlbiBtYXRjaGVyXyBpcwotICAgIC8vIHBvbHltb3JwaGljLCBlLmcuIEVxKDUpLgotICAgIC8vCi0gICAgLy8gTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KCkgaXMgbmVjZXNzYXJ5IGZvciBtYWtpbmcgdGhlIGNvZGUgd29yawotICAgIC8vIGluIGFsbCBvZiB0aGUgYWJvdmUgc2l0dWF0aW9ucy4KLSAgICByZXR1cm4gTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKS5NYXRjaGVzKHgpOwotICB9Ci0KLSBwcml2YXRlOgotICBNIG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTWF0Y2hlckFzUHJlZGljYXRlKTsKLX07Ci0KLS8vIEZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKS4gIFRoZSB0ZW1wbGF0ZQotLy8gYXJndW1lbnQgTSBtdXN0IGJlIGEgdHlwZSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBtYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1jbGFzcyBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihNIG0pIDogbWF0Y2hlcl8oaW50ZXJuYWw6Om1vdmUobSkpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSAoKSBvcGVyYXRvciBhbGxvd3MgYSBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcgotICAvLyBvYmplY3QgdG8gYWN0IGFzIGEgcHJlZGljYXRlLWZvcm1hdHRlciBzdWl0YWJsZSBmb3IgdXNpbmcgd2l0aAotICAvLyBHb29nbGUgVGVzdCdzIEVYUEVDVF9QUkVEX0ZPUk1BVDEoKSBtYWNyby4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHZhbHVlX3RleHQsIGNvbnN0IFQmIHgpIGNvbnN0IHsKLSAgICAvLyBXZSBjb252ZXJ0IG1hdGNoZXJfIHRvIGEgTWF0Y2hlcjxjb25zdCBUJj4gKm5vdyogaW5zdGVhZCBvZgotICAgIC8vIHdoZW4gdGhlIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyIG9iamVjdCB3YXMgY29uc3RydWN0ZWQsCi0gICAgLy8gYXMgbWF0Y2hlcl8gbWF5IGJlIHBvbHltb3JwaGljIChlLmcuIE5vdE51bGwoKSkgYW5kIHdlIHdvbid0Ci0gICAgLy8ga25vdyB3aGljaCB0eXBlIHRvIGluc3RhbnRpYXRlIGl0IHRvIHVudGlsIHdlIGFjdHVhbGx5IHNlZSB0aGUKLSAgICAvLyB0eXBlIG9mIHggaGVyZS4KLSAgICAvLwotICAgIC8vIFdlIHdyaXRlIFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBUJj4obWF0Y2hlcl8pIGluc3RlYWQgb2YKLSAgICAvLyBNYXRjaGVyPGNvbnN0IFQmPihtYXRjaGVyXyksIGFzIHRoZSBsYXR0ZXIgd29uJ3QgY29tcGlsZSB3aGVuCi0gICAgLy8gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxUPiAoZS5nLiBBbjxpbnQ+KCkpLgotICAgIC8vIFdlIGRvbid0IHdyaXRlIE1hdGNoZXJDYXN0PGNvbnN0IFQmPiBlaXRoZXIsIGFzIHRoYXQgYWxsb3dzCi0gICAgLy8gcG90ZW50aWFsbHkgdW5zYWZlIGRvd25jYXN0aW5nIG9mIHRoZSBtYXRjaGVyIGFyZ3VtZW50LgotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgVCY+IG1hdGNoZXIgPSBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKTsKLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICAgIGlmIChNYXRjaFByaW50QW5kRXhwbGFpbih4LCBtYXRjaGVyLCAmbGlzdGVuZXIpKQotICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgIlZhbHVlIG9mOiAiIDw8IHZhbHVlX3RleHQgPDwgIlxuIgotICAgICAgIDw8ICJFeHBlY3RlZDogIjsKLSAgICBtYXRjaGVyLkRlc2NyaWJlVG8oJnNzKTsKLSAgICBzcyA8PCAiXG4gIEFjdHVhbDogIiA8PCBsaXN0ZW5lci5zdHIoKTsKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHNzLnN0cigpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNIG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIpOwotfTsKLQotLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSBtYXRjaGVyIHRvIGEgcHJlZGljYXRlLWZvcm1hdHRlcgotLy8gd2l0aG91dCB0aGUgdXNlciBuZWVkaW5nIHRvIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHR5cGUuICBUaGlzIGlzCi0vLyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKS4KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbDogJ21hdGNoZXInIGlzIHJlY2VpdmVkIGJ5LXZhbHVlIHRvIGZvcmNlIGRlY2F5aW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1pbmxpbmUgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXI8TT4KLU1ha2VQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyPE0+KGludGVybmFsOjptb3ZlKG1hdGNoZXIpKTsKLX0KLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgZmxvYXRpbmcgcG9pbnQgZXF1YWxpdHkgbWF0Y2hlciwgd2hpY2ggbWF0Y2hlcwotLy8gdHdvIGZsb2F0IHZhbHVlcyB1c2luZyBVTFAtYmFzZWQgYXBwcm94aW1hdGlvbiBvciwgb3B0aW9uYWxseSwgYQotLy8gdXNlci1zcGVjaWZpZWQgZXBzaWxvbi4gIFRoZSB0ZW1wbGF0ZSBpcyBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgd2l0aAotLy8gRmxvYXRUeXBlIGJlaW5nIGVpdGhlciBmbG9hdCBvciBkb3VibGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRmxvYXRUeXBlPgotY2xhc3MgRmxvYXRpbmdFcU1hdGNoZXIgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IgZm9yIEZsb2F0aW5nRXFNYXRjaGVyLgotICAvLyBUaGUgbWF0Y2hlcidzIGlucHV0IHdpbGwgYmUgY29tcGFyZWQgd2l0aCBleHBlY3RlZC4gIFRoZSBtYXRjaGVyIHRyZWF0cyB0d28KLSAgLy8gTkFOcyBhcyBlcXVhbCBpZiBuYW5fZXFfbmFuIGlzIHRydWUuICBPdGhlcndpc2UsIHVuZGVyIElFRUUgc3RhbmRhcmRzLAotICAvLyBlcXVhbGl0eSBjb21wYXJpc29ucyBiZXR3ZWVuIE5BTnMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLiAgV2Ugc3BlY2lmeSBhCi0gIC8vIG5lZ2F0aXZlIG1heF9hYnNfZXJyb3JfIHRlcm0gdG8gaW5kaWNhdGUgdGhhdCBVTFAtYmFzZWQgYXBwcm94aW1hdGlvbiB3aWxsCi0gIC8vIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uCi0gIEZsb2F0aW5nRXFNYXRjaGVyKEZsb2F0VHlwZSBleHBlY3RlZCwgYm9vbCBuYW5fZXFfbmFuKSA6Ci0gICAgZXhwZWN0ZWRfKGV4cGVjdGVkKSwgbmFuX2VxX25hbl8obmFuX2VxX25hbiksIG1heF9hYnNfZXJyb3JfKC0xKSB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RvciB0aGF0IHN1cHBvcnRzIGEgdXNlci1zcGVjaWZpZWQgbWF4X2Fic19lcnJvciB0aGF0IHdpbGwgYmUgdXNlZAotICAvLyBmb3IgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIFVMUC1iYXNlZCBhcHByb3hpbWF0aW9uLiAgVGhlIG1heCBhYnNvbHV0ZQotICAvLyBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlLgotICBGbG9hdGluZ0VxTWF0Y2hlcihGbG9hdFR5cGUgZXhwZWN0ZWQsIGJvb2wgbmFuX2VxX25hbiwKLSAgICAgICAgICAgICAgICAgICAgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3IpCi0gICAgICA6IGV4cGVjdGVkXyhleHBlY3RlZCksCi0gICAgICAgIG5hbl9lcV9uYW5fKG5hbl9lcV9uYW4pLAotICAgICAgICBtYXhfYWJzX2Vycm9yXyhtYXhfYWJzX2Vycm9yKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfKG1heF9hYnNfZXJyb3IgPj0gMCkKLSAgICAgICAgPDwgIiwgd2hlcmUgbWF4X2Fic19lcnJvciBpcyIgPDwgbWF4X2Fic19lcnJvcjsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgZmxvYXRpbmcgcG9pbnQgZXF1YWxpdHkgbWF0Y2hlciBhcyBhIE1hdGNoZXI8VD4uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIEltcGwoRmxvYXRUeXBlIGV4cGVjdGVkLCBib29sIG5hbl9lcV9uYW4sIEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yKQotICAgICAgICA6IGV4cGVjdGVkXyhleHBlY3RlZCksCi0gICAgICAgICAgbmFuX2VxX25hbl8obmFuX2VxX25hbiksCi0gICAgICAgICAgbWF4X2Fic19lcnJvcl8obWF4X2Fic19lcnJvcikge30KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICBjb25zdCBGbG9hdGluZ1BvaW50PEZsb2F0VHlwZT4gYWN0dWFsKHZhbHVlKSwgZXhwZWN0ZWQoZXhwZWN0ZWRfKTsKLQotICAgICAgLy8gQ29tcGFyZXMgTmFOcyBmaXJzdCwgaWYgbmFuX2VxX25hbl8gaXMgdHJ1ZS4KLSAgICAgIGlmIChhY3R1YWwuaXNfbmFuKCkgfHwgZXhwZWN0ZWQuaXNfbmFuKCkpIHsKLSAgICAgICAgaWYgKGFjdHVhbC5pc19uYW4oKSAmJiBleHBlY3RlZC5pc19uYW4oKSkgewotICAgICAgICAgIHJldHVybiBuYW5fZXFfbmFuXzsKLSAgICAgICAgfQotICAgICAgICAvLyBPbmUgaXMgbmFuOyB0aGUgb3RoZXIgaXMgbm90IG5hbi4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKEhhc01heEFic0Vycm9yKCkpIHsKLSAgICAgICAgLy8gV2UgcGVyZm9ybSBhbiBlcXVhbGl0eSBjaGVjayBzbyB0aGF0IGluZiB3aWxsIG1hdGNoIGluZiwgcmVnYXJkbGVzcwotICAgICAgICAvLyBvZiBlcnJvciBib3VuZHMuICBJZiB0aGUgcmVzdWx0IG9mIHZhbHVlIC0gZXhwZWN0ZWRfIHdvdWxkIHJlc3VsdCBpbgotICAgICAgICAvLyBvdmVyZmxvdyBvciBpZiBlaXRoZXIgdmFsdWUgaXMgaW5mLCB0aGUgZGVmYXVsdCByZXN1bHQgaXMgaW5maW5pdHksCi0gICAgICAgIC8vIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGlmIG1heF9hYnNfZXJyb3JfIGlzIGFsc28gaW5maW5pdHkuCi0gICAgICAgIGlmICh2YWx1ZSA9PSBleHBlY3RlZF8pIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IEZsb2F0VHlwZSBkaWZmID0gdmFsdWUgLSBleHBlY3RlZF87Ci0gICAgICAgIGlmIChmYWJzKGRpZmYpIDw9IG1heF9hYnNfZXJyb3JfKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyAiIDw8IGRpZmYgPDwgIiBmcm9tICIgPDwgZXhwZWN0ZWRfOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhY3R1YWwuQWxtb3N0RXF1YWxzKGV4cGVjdGVkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIC8vIG9zLT5wcmVjaXNpb24oKSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHNldCBwcmVjaXNpb24sIHdoaWNoIHdlCi0gICAgICAvLyBzdG9yZSB0byByZXN0b3JlIHRoZSBvc3RyZWFtIHRvIGl0cyBvcmlnaW5hbCBjb25maWd1cmF0aW9uCi0gICAgICAvLyBhZnRlciBvdXRwdXR0aW5nLgotICAgICAgY29uc3QgOjpzdGQ6OnN0cmVhbXNpemUgb2xkX3ByZWNpc2lvbiA9IG9zLT5wcmVjaXNpb24oCi0gICAgICAgICAgOjpzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0VHlwZT46OmRpZ2l0czEwICsgMik7Ci0gICAgICBpZiAoRmxvYXRpbmdQb2ludDxGbG9hdFR5cGU+KGV4cGVjdGVkXykuaXNfbmFuKCkpIHsKLSAgICAgICAgaWYgKG5hbl9lcV9uYW5fKSB7Ci0gICAgICAgICAgKm9zIDw8ICJpcyBOYU4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICpvcyA8PCAibmV2ZXIgbWF0Y2hlcyI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpvcyA8PCAiaXMgYXBwcm94aW1hdGVseSAiIDw8IGV4cGVjdGVkXzsKLSAgICAgICAgaWYgKEhhc01heEFic0Vycm9yKCkpIHsKLSAgICAgICAgICAqb3MgPDwgIiAoYWJzb2x1dGUgZXJyb3IgPD0gIiA8PCBtYXhfYWJzX2Vycm9yXyA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9zLT5wcmVjaXNpb24ob2xkX3ByZWNpc2lvbik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIC8vIEFzIGJlZm9yZSwgZ2V0IG9yaWdpbmFsIHByZWNpc2lvbi4KLSAgICAgIGNvbnN0IDo6c3RkOjpzdHJlYW1zaXplIG9sZF9wcmVjaXNpb24gPSBvcy0+cHJlY2lzaW9uKAotICAgICAgICAgIDo6c3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHMxMCArIDIpOwotICAgICAgaWYgKEZsb2F0aW5nUG9pbnQ8RmxvYXRUeXBlPihleHBlY3RlZF8pLmlzX25hbigpKSB7Ci0gICAgICAgIGlmIChuYW5fZXFfbmFuXykgewotICAgICAgICAgICpvcyA8PCAiaXNuJ3QgTmFOIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqb3MgPDwgImlzIGFueXRoaW5nIjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKm9zIDw8ICJpc24ndCBhcHByb3hpbWF0ZWx5ICIgPDwgZXhwZWN0ZWRfOwotICAgICAgICBpZiAoSGFzTWF4QWJzRXJyb3IoKSkgewotICAgICAgICAgICpvcyA8PCAiIChhYnNvbHV0ZSBlcnJvciA+ICIgPDwgbWF4X2Fic19lcnJvcl8gPDwgIikiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHByZWNpc2lvbi4KLSAgICAgIG9zLT5wcmVjaXNpb24ob2xkX3ByZWNpc2lvbik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGJvb2wgSGFzTWF4QWJzRXJyb3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbWF4X2Fic19lcnJvcl8gPj0gMDsKLSAgICB9Ci0KLSAgICBjb25zdCBGbG9hdFR5cGUgZXhwZWN0ZWRfOwotICAgIGNvbnN0IGJvb2wgbmFuX2VxX25hbl87Ci0gICAgLy8gbWF4X2Fic19lcnJvciB3aWxsIGJlIHVzZWQgZm9yIHZhbHVlIGNvbXBhcmlzb24gd2hlbiA+PSAwLgotICAgIGNvbnN0IEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyAzIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvcnMgYWxsb3cgRmxvYXRFcShleHBlY3RlZCkgYW5kCi0gIC8vIE5hblNlbnNpdGl2ZUZsb2F0RXEoZXhwZWN0ZWQpIHRvIGJlIHVzZWQgYXMgYSBNYXRjaGVyPGZsb2F0PiwgYQotICAvLyBNYXRjaGVyPGNvbnN0IGZsb2F0Jj4sIG9yIGEgTWF0Y2hlcjxmbG9hdCY+LCBidXQgbm90aGluZyBlbHNlLgotICAvLyAoV2hpbGUgR29vZ2xlJ3MgQysrIGNvZGluZyBzdHlsZSBkb2Vzbid0IGFsbG93IGFyZ3VtZW50cyBwYXNzZWQKLSAgLy8gYnkgbm9uLWNvbnN0IHJlZmVyZW5jZSwgd2UgbWF5IHNlZSB0aGVtIGluIGNvZGUgbm90IGNvbmZvcm1pbmcgdG8KLSAgLy8gdGhlIHN0eWxlLiAgVGhlcmVmb3JlIEdvb2dsZSBNb2NrIG5lZWRzIHRvIHN1cHBvcnQgdGhlbS4pCi0gIG9wZXJhdG9yIE1hdGNoZXI8RmxvYXRUeXBlPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoCi0gICAgICAgIG5ldyBJbXBsPEZsb2F0VHlwZT4oZXhwZWN0ZWRfLCBuYW5fZXFfbmFuXywgbWF4X2Fic19lcnJvcl8pKTsKLSAgfQotCi0gIG9wZXJhdG9yIE1hdGNoZXI8Y29uc3QgRmxvYXRUeXBlJj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKAotICAgICAgICBuZXcgSW1wbDxjb25zdCBGbG9hdFR5cGUmPihleHBlY3RlZF8sIG5hbl9lcV9uYW5fLCBtYXhfYWJzX2Vycm9yXykpOwotICB9Ci0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxGbG9hdFR5cGUmPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoCi0gICAgICAgIG5ldyBJbXBsPEZsb2F0VHlwZSY+KGV4cGVjdGVkXywgbmFuX2VxX25hbl8sIG1heF9hYnNfZXJyb3JfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEZsb2F0VHlwZSBleHBlY3RlZF87Ci0gIGNvbnN0IGJvb2wgbmFuX2VxX25hbl87Ci0gIC8vIG1heF9hYnNfZXJyb3Igd2lsbCBiZSB1c2VkIGZvciB2YWx1ZSBjb21wYXJpc29uIHdoZW4gPj0gMC4KLSAgY29uc3QgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3JfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRmxvYXRpbmdFcU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgUG9pbnRlZShtKSBtYXRjaGVyIGZvciBtYXRjaGluZyBhIHBvaW50ZXIgd2hvc2UKLS8vIHBvaW50ZWUgbWF0Y2hlcyBtYXRjaGVyIG0uICBUaGUgcG9pbnRlciBjYW4gYmUgZWl0aGVyIHJhdyBvciBzbWFydC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1jbGFzcyBQb2ludGVlTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQb2ludGVlTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICAvLyBUaGlzIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciB0ZW1wbGF0ZSBhbGxvd3MgUG9pbnRlZShtKSB0byBiZQotICAvLyB1c2VkIGFzIGEgbWF0Y2hlciBmb3IgYW55IHBvaW50ZXIgdHlwZSB3aG9zZSBwb2ludGVlIHR5cGUgaXMKLSAgLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBpbm5lciBtYXRjaGVyLCB3aGVyZSB0eXBlIFBvaW50ZXIgY2FuIGJlCi0gIC8vIGVpdGhlciBhIHJhdyBwb2ludGVyIG9yIGEgc21hcnQgcG9pbnRlci4KLSAgLy8KLSAgLy8gVGhlIHJlYXNvbiB3ZSBkbyB0aGlzIGluc3RlYWQgb2YgcmVseWluZyBvbgotICAvLyBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkgaXMgdGhhdCB0aGUgbGF0dGVyIGlzIG5vdCBmbGV4aWJsZQotICAvLyBlbm91Z2ggZm9yIGltcGxlbWVudGluZyB0aGUgRGVzY3JpYmVUbygpIG1ldGhvZCBvZiBQb2ludGVlKCkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPgotICBvcGVyYXRvciBNYXRjaGVyPFBvaW50ZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxQb2ludGVyPihtYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgbW9ub21vcnBoaWMgaW1wbGVtZW50YXRpb24gdGhhdCB3b3JrcyBmb3IgYSBwYXJ0aWN1bGFyIHBvaW50ZXIgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQb2ludGVyPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBQb2ludGVlT2Y8R1RFU1RfUkVNT1ZFX0NPTlNUXyggIC8vIE5PTElOVAotICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhQb2ludGVyKSk+Ojp0eXBlIFBvaW50ZWU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikKLSAgICAgICAgOiBtYXRjaGVyXyhNYXRjaGVyQ2FzdDxjb25zdCBQb2ludGVlJj4obWF0Y2hlcikpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAicG9pbnRzIHRvIGEgdmFsdWUgdGhhdCAiOwotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiZG9lcyBub3QgcG9pbnQgdG8gYSB2YWx1ZSB0aGF0ICI7Ci0gICAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFBvaW50ZXIgcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICBpZiAoR2V0UmF3UG9pbnRlcihwb2ludGVyKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggcG9pbnRzIHRvICI7Ci0gICAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4oKnBvaW50ZXIsIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgUG9pbnRlZSY+IG1hdGNoZXJfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICBjb25zdCBJbm5lck1hdGNoZXIgbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2ludGVlTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBXaGVuRHluYW1pY0Nhc3RUbzxUPihtKSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHBvaW50ZXIgb3IKLS8vIHJlZmVyZW5jZSB0aGF0IG1hdGNoZXMgaW5uZXJfbWF0Y2hlciB3aGVuIGR5bmFtaWNfY2FzdDxUPiBpcyBhcHBsaWVkLgotLy8gVGhlIHJlc3VsdCBvZiBkeW5hbWljX2Nhc3Q8VG8+IGlzIGZvcndhcmRlZCB0byB0aGUgaW5uZXIgbWF0Y2hlci4KLS8vIElmIFRvIGlzIGEgcG9pbnRlciBhbmQgdGhlIGNhc3QgZmFpbHMsIHRoZSBpbm5lciBtYXRjaGVyIHdpbGwgcmVjZWl2ZSBOVUxMLgotLy8gSWYgVG8gaXMgYSByZWZlcmVuY2UgYW5kIHRoZSBjYXN0IGZhaWxzLCB0aGlzIG1hdGNoZXIgcmV0dXJucyBmYWxzZQotLy8gaW1tZWRpYXRlbHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+Ci1jbGFzcyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2UoY29uc3QgTWF0Y2hlcjxUbz4mIG1hdGNoZXIpCi0gICAgICA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIEdldENhc3RUeXBlRGVzY3JpcHRpb24ob3MpOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgR2V0Q2FzdFR5cGVEZXNjcmlwdGlvbihvcyk7Ci0gICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBjb25zdCBNYXRjaGVyPFRvPiBtYXRjaGVyXzsKLQotICBzdGF0aWMgc3RyaW5nIEdldFRvTmFtZSgpIHsKLSNpZiBHVEVTVF9IQVNfUlRUSQotICAgIHJldHVybiBHZXRUeXBlTmFtZTxUbz4oKTsKLSNlbHNlICAvLyBHVEVTVF9IQVNfUlRUSQotICAgIHJldHVybiAidGhlIHRhcmdldCB0eXBlIjsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgR2V0Q2FzdFR5cGVEZXNjcmlwdGlvbig6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICAqb3MgPDwgIndoZW4gZHluYW1pY19jYXN0IHRvICIgPDwgR2V0VG9OYW1lKCkgPDwgIiwgIjsKLSAgfQotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZSk7Ci19OwotCi0vLyBQcmltYXJ5IHRlbXBsYXRlLgotLy8gVG8gaXMgYSBwb2ludGVyLiBDYXN0IGFuZCBmb3J3YXJkIHRoZSByZXN1bHQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+Ci1jbGFzcyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXIgOiBwdWJsaWMgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZTxUbz4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyKGNvbnN0IE1hdGNoZXI8VG8+JiBtYXRjaGVyKQotICAgICAgOiBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlPFRvPihtYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihGcm9tIGZyb20sIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gVE9ETyhzYmVuemEpOiBBZGQgbW9yZSBkZXRhaWwgb24gZmFpbHVyZXMuIGllIGRpZCB0aGUgZHluX2Nhc3QgZmFpbD8KLSAgICBUbyB0byA9IGR5bmFtaWNfY2FzdDxUbz4oZnJvbSk7Ci0gICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKHRvLCB0aGlzLT5tYXRjaGVyXywgbGlzdGVuZXIpOwotICB9Ci19OwotCi0vLyBTcGVjaWFsaXplIGZvciByZWZlcmVuY2VzLgotLy8gSW4gdGhpcyBjYXNlIHdlIHJldHVybiBmYWxzZSBpZiB0aGUgZHluYW1pY19jYXN0IGZhaWxzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgotY2xhc3MgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyPFRvJj4gOiBwdWJsaWMgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZTxUbyY+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcihjb25zdCBNYXRjaGVyPFRvJj4mIG1hdGNoZXIpCi0gICAgICA6IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2U8VG8mPihtYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihGcm9tJiBmcm9tLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIFdlIGRvbid0IHdhbnQgYW4gc3RkOjpiYWRfY2FzdCBoZXJlLCBzbyBkbyB0aGUgY2FzdCB3aXRoIHBvaW50ZXJzLgotICAgIFRvKiB0byA9IGR5bmFtaWNfY2FzdDxUbyo+KCZmcm9tKTsKLSAgICBpZiAodG8gPT0gTlVMTCkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBjYW5ub3QgYmUgZHluYW1pY19jYXN0IHRvICIgPDwgdGhpcy0+R2V0VG9OYW1lKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbigqdG8sIHRoaXMtPm1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEZpZWxkKCkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSBmaWVsZCAoaS5lLiBtZW1iZXIKLS8vIHZhcmlhYmxlKSBvZiBhbiBvYmplY3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEZpZWxkVHlwZT4KLWNsYXNzIEZpZWxkTWF0Y2hlciB7Ci0gcHVibGljOgotICBGaWVsZE1hdGNoZXIoRmllbGRUeXBlIENsYXNzOjoqZmllbGQsCi0gICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpZWxkVHlwZSY+JiBtYXRjaGVyKQotICAgICAgOiBmaWVsZF8oZmllbGQpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCAiOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgIjsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmIHZhbHVlLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKAotICAgICAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjoKLSAgICAgICAgICAgIGlzX3BvaW50ZXI8R1RFU1RfUkVNT1ZFX0NPTlNUXyhUKT46OnR5cGUoKSwKLSAgICAgICAgdmFsdWUsIGxpc3RlbmVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIE1hdGNoQW5kRXhwbGFpbkltcGwoKSBpcyBuZWVkZWQgdG8gaGVscAotICAvLyBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIGNob29zZSB3aGljaCBvdmVybG9hZCB0byB1c2UuICBJdHMgdHlwZSBpcwotICAvLyB0cnVlX3R5cGUgaWZmIHRoZSBGaWVsZCgpIG1hdGNoZXIgaXMgdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZV90eXBlIC8qIGlzX25vdF9wb2ludGVyICovLCBjb25zdCBDbGFzcyYgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAqbGlzdGVuZXIgPDwgIndob3NlIGdpdmVuIGZpZWxkIGlzICI7Ci0gICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKG9iai4qZmllbGRfLCBtYXRjaGVyXywgbGlzdGVuZXIpOwotICB9Ci0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKHRydWVfdHlwZSAvKiBpc19wb2ludGVyICovLCBjb25zdCBDbGFzcyogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICpsaXN0ZW5lciA8PCAid2hpY2ggcG9pbnRzIHRvIGFuIG9iamVjdCAiOwotICAgIC8vIFNpbmNlICpwIGhhcyBhIGZpZWxkLCBpdCBtdXN0IGJlIGEgY2xhc3Mvc3RydWN0L3VuaW9uIHR5cGUgYW5kCi0gICAgLy8gdGh1cyBjYW5ub3QgYmUgYSBwb2ludGVyLiAgVGhlcmVmb3JlIHdlIHBhc3MgZmFsc2VfdHlwZSgpIGFzCi0gICAgLy8gdGhlIGZpcnN0IGFyZ3VtZW50LgotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUoKSwgKnAsIGxpc3RlbmVyKTsKLSAgfQotCi0gIGNvbnN0IEZpZWxkVHlwZSBDbGFzczo6KmZpZWxkXzsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBGaWVsZFR5cGUmPiBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEZpZWxkTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBQcm9wZXJ0eSgpIG1hdGNoZXIgZm9yIG1hdGNoaW5nIGEgcHJvcGVydHkKLS8vIChpLmUuIHJldHVybiB2YWx1ZSBvZiBhIGdldHRlciBtZXRob2QpIG9mIGFuIG9iamVjdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgUHJvcGVydHlUeXBlPgotY2xhc3MgUHJvcGVydHlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBwcm9wZXJ0eSBtYXkgaGF2ZSBhIHJlZmVyZW5jZSB0eXBlLCBzbyAnY29uc3QgUHJvcGVydHlUeXBlJicKLSAgLy8gbWF5IGNhdXNlIGRvdWJsZSByZWZlcmVuY2VzIGFuZCBmYWlsIHRvIGNvbXBpbGUuICBUaGF0J3Mgd2h5IHdlCi0gIC8vIG5lZWQgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNULCB3aGljaCB3b3JrcyByZWdhcmRsZXNzIG9mCi0gIC8vIFByb3BlcnR5VHlwZSBiZWluZyBhIHJlZmVyZW5jZSBvciBub3QuCi0gIHR5cGVkZWYgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhQcm9wZXJ0eVR5cGUpIFJlZlRvQ29uc3RQcm9wZXJ0eTsKLQotICBQcm9wZXJ0eU1hdGNoZXIoUHJvcGVydHlUeXBlIChDbGFzczo6KnByb3BlcnR5KSgpIGNvbnN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hlcjxSZWZUb0NvbnN0UHJvcGVydHk+JiBtYXRjaGVyKQotICAgICAgOiBwcm9wZXJ0eV8ocHJvcGVydHkpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eSAiOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgIjsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbkltcGwoCi0gICAgICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OgotICAgICAgICAgICAgaXNfcG9pbnRlcjxHVEVTVF9SRU1PVkVfQ09OU1RfKFQpPjo6dHlwZSgpLAotICAgICAgICB2YWx1ZSwgbGlzdGVuZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgTWF0Y2hBbmRFeHBsYWluSW1wbCgpIGlzIG5lZWRlZCB0byBoZWxwCi0gIC8vIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgY2hvb3NlIHdoaWNoIG92ZXJsb2FkIHRvIHVzZS4gIEl0cyB0eXBlIGlzCi0gIC8vIHRydWVfdHlwZSBpZmYgdGhlIFByb3BlcnR5KCkgbWF0Y2hlciBpcyB1c2VkIHRvIG1hdGNoIGEgcG9pbnRlci4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUgLyogaXNfbm90X3BvaW50ZXIgKi8sIGNvbnN0IENsYXNzJiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgIjsKLSAgICAvLyBDYW5ub3QgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIChmb3IgZXhhbXBsZSwgaW50KSB0byBNYXRjaFByaW50QW5kRXhwbGFpbiwKLSAgICAvLyB3aGljaCB0YWtlcyBhIG5vbi1jb25zdCByZWZlcmVuY2UgYXMgYXJndW1lbnQuCi0jaWYgZGVmaW5lZChfUFJFRkFTVF8gKSAmJiBfTVNDX1ZFUiA9PSAxODAwCi0gICAgLy8gV29ya2Fyb3VuZCBidWcgaW4gVkMrKyAyMDEzJ3MgL2FuYWx5emUgcGFyc2VyLgotICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9kZXRhaWxzLzExMDYzNjMvaW50ZXJuYWwtY29tcGlsZXItZXJyb3Itd2l0aC1hbmFseXplLWR1ZS10by1mYWlsdXJlLXRvLWluZmVyLW1vdmUKLSAgICBwb3NpeDo6QWJvcnQoKTsgIC8vIFRvIG1ha2Ugc3VyZSBpdCBpcyBuZXZlciBydW4uCi0gICAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICBSZWZUb0NvbnN0UHJvcGVydHkgcmVzdWx0ID0gKG9iai4qcHJvcGVydHlfKSgpOwotICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihyZXN1bHQsIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0jZW5kaWYKLSAgfQotCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbCh0cnVlX3R5cGUgLyogaXNfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIGlmIChwID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAqbGlzdGVuZXIgPDwgIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3QgIjsKLSAgICAvLyBTaW5jZSAqcCBoYXMgYSBwcm9wZXJ0eSBtZXRob2QsIGl0IG11c3QgYmUgYSBjbGFzcy9zdHJ1Y3QvdW5pb24KLSAgICAvLyB0eXBlIGFuZCB0aHVzIGNhbm5vdCBiZSBhIHBvaW50ZXIuICBUaGVyZWZvcmUgd2UgcGFzcwotICAgIC8vIGZhbHNlX3R5cGUoKSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSgpLCAqcCwgbGlzdGVuZXIpOwotICB9Ci0KLSAgUHJvcGVydHlUeXBlIChDbGFzczo6KnByb3BlcnR5XykoKSBjb25zdDsKLSAgY29uc3QgTWF0Y2hlcjxSZWZUb0NvbnN0UHJvcGVydHk+IG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUHJvcGVydHlNYXRjaGVyKTsKLX07Ci0KLS8vIFR5cGUgdHJhaXRzIHNwZWNpZnlpbmcgdmFyaW91cyBmZWF0dXJlcyBvZiBkaWZmZXJlbnQgZnVuY3RvcnMgZm9yIFJlc3VsdE9mLgotLy8gVGhlIGRlZmF1bHQgdGVtcGxhdGUgc3BlY2lmaWVzIGZlYXR1cmVzIGZvciBmdW5jdG9yIG9iamVjdHMuCi0vLyBGdW5jdG9yIGNsYXNzZXMgaGF2ZSB0byB0eXBlZGVmIGFyZ3VtZW50X3R5cGUgYW5kIHJlc3VsdF90eXBlCi0vLyB0byBiZSBjb21wYXRpYmxlIHdpdGggUmVzdWx0T2YuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4KLXN0cnVjdCBDYWxsYWJsZVRyYWl0cyB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6cmVzdWx0X3R5cGUgUmVzdWx0VHlwZTsKLSAgdHlwZWRlZiBGdW5jdG9yIFN0b3JhZ2VUeXBlOwotCi0gIHN0YXRpYyB2b2lkIENoZWNrSXNWYWxpZChGdW5jdG9yIC8qIGZ1bmN0b3IgKi8pIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgUmVzdWx0VHlwZSBJbnZva2UoRnVuY3RvciBmLCBUIGFyZykgeyByZXR1cm4gZihhcmcpOyB9Ci19OwotCi0vLyBTcGVjaWFsaXphdGlvbiBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgUmVzVHlwZT4KLXN0cnVjdCBDYWxsYWJsZVRyYWl0czxSZXNUeXBlKCopKEFyZ1R5cGUpPiB7Ci0gIHR5cGVkZWYgUmVzVHlwZSBSZXN1bHRUeXBlOwotICB0eXBlZGVmIFJlc1R5cGUoKlN0b3JhZ2VUeXBlKShBcmdUeXBlKTsKLQotICBzdGF0aWMgdm9pZCBDaGVja0lzVmFsaWQoUmVzVHlwZSgqZikoQXJnVHlwZSkpIHsKLSAgICBHVEVTVF9DSEVDS18oZiAhPSBOVUxMKQotICAgICAgICA8PCAiTlVMTCBmdW5jdGlvbiBwb2ludGVyIGlzIHBhc3NlZCBpbnRvIFJlc3VsdE9mKCkuIjsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIFJlc1R5cGUgSW52b2tlKFJlc1R5cGUoKmYpKEFyZ1R5cGUpLCBUIGFyZykgewotICAgIHJldHVybiAoKmYpKGFyZyk7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIFJlc3VsdE9mKCkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSByZXR1cm4gdmFsdWUgb2YgYQotLy8gdW5hcnkgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlPgotY2xhc3MgUmVzdWx0T2ZNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpSZXN1bHRUeXBlIFJlc3VsdFR5cGU7Ci0KLSAgUmVzdWx0T2ZNYXRjaGVyKENhbGxhYmxlIGNhbGxhYmxlLCBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+JiBtYXRjaGVyKQotICAgICAgOiBjYWxsYWJsZV8oY2FsbGFibGUpLCBtYXRjaGVyXyhtYXRjaGVyKSB7Ci0gICAgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpDaGVja0lzVmFsaWQoY2FsbGFibGVfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBJbXBsPFQ+KGNhbGxhYmxlXywgbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSBDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OlN0b3JhZ2VUeXBlIENhbGxhYmxlU3RvcmFnZVR5cGU7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgSW1wbChDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlLCBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+JiBtYXRjaGVyKQotICAgICAgICA6IGNhbGxhYmxlXyhjYWxsYWJsZSksIG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byBhIHZhbHVlIHRoYXQgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICI7Ci0gICAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCBvYmosIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gIjsKLSAgICAgIC8vIENhbm5vdCBwYXNzIHRoZSByZXR1cm4gdmFsdWUgKGZvciBleGFtcGxlLCBpbnQpIHRvCi0gICAgICAvLyBNYXRjaFByaW50QW5kRXhwbGFpbiwgd2hpY2ggdGFrZXMgYSBub24tY29uc3QgcmVmZXJlbmNlIGFzIGFyZ3VtZW50LgotICAgICAgUmVzdWx0VHlwZSByZXN1bHQgPQotICAgICAgICAgIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6dGVtcGxhdGUgSW52b2tlPFQ+KGNhbGxhYmxlXywgb2JqKTsKLSAgICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihyZXN1bHQsIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIC8vIEZ1bmN0b3JzIG9mdGVuIGRlZmluZSBvcGVyYXRvcigpIGFzIG5vbi1jb25zdCBtZXRob2QgZXZlbiB0aG91Z2gKLSAgICAvLyB0aGV5IGFyZSBhY3R1YWx5IHN0YXRlbGVzcy4gQnV0IHdlIG5lZWQgdG8gdXNlIHRoZW0gZXZlbiB3aGVuCi0gICAgLy8gJ3RoaXMnIGlzIGEgY29uc3QgcG9pbnRlci4gSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG5vdCB0bwotICAgIC8vIHVzZSBzdGF0ZWZ1bCBjYWxsYWJsZXMgd2l0aCBSZXN1bHRPZigpLCB3aGljaCBkb2VzJ3QgZ3VhcmFudGVlCi0gICAgLy8gaG93IG1hbnkgdGltZXMgdGhlIGNhbGxhYmxlIHdpbGwgYmUgaW52b2tlZC4KLSAgICBtdXRhYmxlIENhbGxhYmxlU3RvcmFnZVR5cGUgY2FsbGFibGVfOwotICAgIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4gbWF0Y2hlcl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OyAgLy8gY2xhc3MgSW1wbAotCi0gIGNvbnN0IENhbGxhYmxlU3RvcmFnZVR5cGUgY2FsbGFibGVfOwotICBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+IG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUmVzdWx0T2ZNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYSBtYXRjaGVyIHRoYXQgY2hlY2tzIHRoZSBzaXplIG9mIGFuIFNUTC1zdHlsZSBjb250YWluZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2l6ZU1hdGNoZXI+Ci1jbGFzcyBTaXplSXNNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNpemVJc01hdGNoZXIoY29uc3QgU2l6ZU1hdGNoZXImIHNpemVfbWF0Y2hlcikKLSAgICAgICA6IHNpemVfbWF0Y2hlcl8oc2l6ZV9tYXRjaGVyKSB7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPENvbnRhaW5lcj4oc2l6ZV9tYXRjaGVyXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKT4gQ29udGFpbmVyVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIENvbnRhaW5lclZpZXc6OnR5cGU6OnNpemVfdHlwZSBTaXplVHlwZTsKLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFNpemVNYXRjaGVyJiBzaXplX21hdGNoZXIpCi0gICAgICAgIDogc2l6ZV9tYXRjaGVyXyhNYXRjaGVyQ2FzdDxTaXplVHlwZT4oc2l6ZV9tYXRjaGVyKSkge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJzaXplICI7Ci0gICAgICBzaXplX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJzaXplICI7Ci0gICAgICBzaXplX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIFNpemVUeXBlIHNpemUgPSBjb250YWluZXIuc2l6ZSgpOwotICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBzaXplX2xpc3RlbmVyOwotICAgICAgY29uc3QgYm9vbCByZXN1bHQgPSBzaXplX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzaXplLCAmc2l6ZV9saXN0ZW5lcik7Ci0gICAgICAqbGlzdGVuZXIKLSAgICAgICAgICA8PCAid2hvc2Ugc2l6ZSAiIDw8IHNpemUgPDwgKHJlc3VsdCA/ICIgbWF0Y2hlcyIgOiAiIGRvZXNuJ3QgbWF0Y2giKTsKLSAgICAgIFByaW50SWZOb3RFbXB0eShzaXplX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWF0Y2hlcjxTaXplVHlwZT4gc2l6ZV9tYXRjaGVyXzsKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgU2l6ZU1hdGNoZXIgc2l6ZV9tYXRjaGVyXzsKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTaXplSXNNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYSBtYXRjaGVyIHRoYXQgY2hlY2tzIHRoZSBiZWdpbigpLi5lbmQoKSBkaXN0YW5jZSBvZiBhbiBTVEwtc3R5bGUKLS8vIGNvbnRhaW5lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXN0YW5jZU1hdGNoZXI+Ci1jbGFzcyBCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXIoY29uc3QgRGlzdGFuY2VNYXRjaGVyJiBkaXN0YW5jZV9tYXRjaGVyKQotICAgICAgOiBkaXN0YW5jZV9tYXRjaGVyXyhkaXN0YW5jZV9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8Q29udGFpbmVyPihkaXN0YW5jZV9tYXRjaGVyXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpPiBDb250YWluZXJWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Ci0gICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclZpZXc6OnR5cGU6OmNvbnN0X2l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCi0gICAgICAgIERpc3RhbmNlVHlwZTsKLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IERpc3RhbmNlTWF0Y2hlciYgZGlzdGFuY2VfbWF0Y2hlcikKLSAgICAgICAgOiBkaXN0YW5jZV9tYXRjaGVyXyhNYXRjaGVyQ2FzdDxEaXN0YW5jZVR5cGU+KGRpc3RhbmNlX21hdGNoZXIpKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgIjsKLSAgICAgIGRpc3RhbmNlX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpICI7Ci0gICAgICBkaXN0YW5jZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0jaWYgR1RFU1RfSEFTX1NURF9CRUdJTl9BTkRfRU5EXwotICAgICAgdXNpbmcgc3RkOjpiZWdpbjsKLSAgICAgIHVzaW5nIHN0ZDo6ZW5kOwotICAgICAgRGlzdGFuY2VUeXBlIGRpc3RhbmNlID0gc3RkOjpkaXN0YW5jZShiZWdpbihjb250YWluZXIpLCBlbmQoY29udGFpbmVyKSk7Ci0jZWxzZQotICAgICAgRGlzdGFuY2VUeXBlIGRpc3RhbmNlID0gc3RkOjpkaXN0YW5jZShjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKLSNlbmRpZgotICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBkaXN0YW5jZV9saXN0ZW5lcjsKLSAgICAgIGNvbnN0IGJvb2wgcmVzdWx0ID0KLSAgICAgICAgICBkaXN0YW5jZV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oZGlzdGFuY2UsICZkaXN0YW5jZV9saXN0ZW5lcik7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgIiA8PCBkaXN0YW5jZQotICAgICAgICAgICAgICAgIDw8IChyZXN1bHQgPyAiIG1hdGNoZXMiIDogIiBkb2Vzbid0IG1hdGNoIik7Ci0gICAgICBQcmludElmTm90RW1wdHkoZGlzdGFuY2VfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPERpc3RhbmNlVHlwZT4gZGlzdGFuY2VfbWF0Y2hlcl87Ci0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IERpc3RhbmNlTWF0Y2hlciBkaXN0YW5jZV9tYXRjaGVyXzsKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYW4gZXF1YWxpdHkgbWF0Y2hlciBmb3IgYW55IFNUTC1zdHlsZSBjb250YWluZXIgd2hvc2UgZWxlbWVudHMKLS8vIHN1cHBvcnQgPT0uIFRoaXMgbWF0Y2hlciBpcyBsaWtlIEVxKCksIGJ1dCBpdHMgZmFpbHVyZSBleHBsYW5hdGlvbnMgcHJvdmlkZQotLy8gbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWZ1bCB3aGVuIHRoZSBjb250YWluZXIgaXMgdXNlZCBhcyBhIHNldC4KLS8vIFRoZSBmYWlsdXJlIG1lc3NhZ2UgcmVwb3J0cyBlbGVtZW50cyB0aGF0IGFyZSBpbiBvbmUgb2YgdGhlIG9wZXJhbmRzIGJ1dCBub3QKLS8vIHRoZSBvdGhlci4gVGhlIGZhaWx1cmUgbWVzc2FnZXMgZG8gbm90IHJlcG9ydCBkdXBsaWNhdGUgb3Igb3V0LW9mLW9yZGVyCi0vLyBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVycyAod2hpY2ggZG9uJ3QgcHJvcGVybHkgbWF0dGVyIHRvIHNldHMsIGJ1dCBjYW4KLS8vIG9jY3VyIGlmIHRoZSBjb250YWluZXJzIGFyZSB2ZWN0b3JzIG9yIGxpc3RzLCBmb3IgZXhhbXBsZSkuCi0vLwotLy8gVXNlcyB0aGUgY29udGFpbmVyJ3MgY29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUsIG9wZXJhdG9yID09LAotLy8gYmVnaW4oKSwgYW5kIGVuZCgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWNsYXNzIENvbnRhaW5lckVxTWF0Y2hlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PENvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotCi0gIC8vIFdlIG1ha2UgYSBjb3B5IG9mIGV4cGVjdGVkIGluIGNhc2UgdGhlIGVsZW1lbnRzIGluIGl0IGFyZSBtb2RpZmllZAotICAvLyBhZnRlciB0aGlzIG1hdGNoZXIgaXMgY3JlYXRlZC4KLSAgZXhwbGljaXQgQ29udGFpbmVyRXFNYXRjaGVyKGNvbnN0IENvbnRhaW5lciYgZXhwZWN0ZWQpCi0gICAgICA6IGV4cGVjdGVkXyhWaWV3OjpDb3B5KGV4cGVjdGVkKSkgewotICAgIC8vIE1ha2VzIHN1cmUgdGhlIHVzZXIgZG9lc24ndCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHRlbXBsYXRlCi0gICAgLy8gd2l0aCBhIGNvbnN0IG9yIHJlZmVyZW5jZSB0eXBlLgotICAgICh2b2lkKXRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxDb250YWluZXIsCi0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpPigpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZXF1YWxzICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoZXhwZWN0ZWRfLCBvcyk7Ci0gIH0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2VzIG5vdCBlcXVhbCAiOwotICAgIFVuaXZlcnNhbFByaW50KGV4cGVjdGVkXywgb3MpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTGhzQ29udGFpbmVyJiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gR1RFU1RfUkVNT1ZFX0NPTlNUXygpIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhbiBNU1ZDIDguMCBidWcKLSAgICAvLyB0aGF0IGNhdXNlcyBMaHNDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcy4KLSAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PEdURVNUX1JFTU9WRV9DT05TVF8oTGhzQ29udGFpbmVyKT4KLSAgICAgICAgTGhzVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OnR5cGUgTGhzU3RsQ29udGFpbmVyOwotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBsaHNfc3RsX2NvbnRhaW5lciA9IExoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKGxocyk7Ci0gICAgaWYgKGxoc19zdGxfY29udGFpbmVyID09IGV4cGVjdGVkXykKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgOjpzdGQ6Om9zdHJlYW0qIGNvbnN0IG9zID0gbGlzdGVuZXItPnN0cmVhbSgpOwotICAgIGlmIChvcyAhPSBOVUxMKSB7Ci0gICAgICAvLyBTb21ldGhpbmcgaXMgZGlmZmVyZW50LiBDaGVjayBmb3IgZXh0cmEgdmFsdWVzIGZpcnN0LgotICAgICAgYm9vbCBwcmludGVkX2hlYWRlciA9IGZhbHNlOwotICAgICAgZm9yICh0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ICE9IGxoc19zdGxfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmIChpbnRlcm5hbDo6QXJyYXlBd2FyZUZpbmQoZXhwZWN0ZWRfLmJlZ2luKCksIGV4cGVjdGVkXy5lbmQoKSwgKml0KSA9PQotICAgICAgICAgICAgZXhwZWN0ZWRfLmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKHByaW50ZWRfaGVhZGVyKSB7Ci0gICAgICAgICAgICAqb3MgPDwgIiwgIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKm9zIDw8ICJ3aGljaCBoYXMgdGhlc2UgdW5leHBlY3RlZCBlbGVtZW50czogIjsKLSAgICAgICAgICAgIHByaW50ZWRfaGVhZGVyID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgVW5pdmVyc2FsUHJpbnQoKml0LCBvcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gTm93IGNoZWNrIGZvciBtaXNzaW5nIHZhbHVlcy4KLSAgICAgIGJvb2wgcHJpbnRlZF9oZWFkZXIyID0gZmFsc2U7Ci0gICAgICBmb3IgKHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBleHBlY3RlZF8uYmVnaW4oKTsKLSAgICAgICAgICAgaXQgIT0gZXhwZWN0ZWRfLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmIChpbnRlcm5hbDo6QXJyYXlBd2FyZUZpbmQoCi0gICAgICAgICAgICAgICAgbGhzX3N0bF9jb250YWluZXIuYmVnaW4oKSwgbGhzX3N0bF9jb250YWluZXIuZW5kKCksICppdCkgPT0KLSAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKHByaW50ZWRfaGVhZGVyMikgewotICAgICAgICAgICAgKm9zIDw8ICIsICI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpvcyA8PCAocHJpbnRlZF9oZWFkZXIgPyAiLFxuYW5kIiA6ICJ3aGljaCIpCi0gICAgICAgICAgICAgICAgPDwgIiBkb2Vzbid0IGhhdmUgdGhlc2UgZXhwZWN0ZWQgZWxlbWVudHM6ICI7Ci0gICAgICAgICAgICBwcmludGVkX2hlYWRlcjIgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RsQ29udGFpbmVyIGV4cGVjdGVkXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5lckVxTWF0Y2hlcik7Ci19OwotCi0vLyBBIGNvbXBhcmF0b3IgZnVuY3RvciB0aGF0IHVzZXMgdGhlIDwgb3BlcmF0b3IgdG8gY29tcGFyZSB0d28gdmFsdWVzLgotc3RydWN0IExlc3NDb21wYXJhdG9yIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocykgY29uc3QgeyByZXR1cm4gbGhzIDwgcmhzOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIFdoZW5Tb3J0ZWRCeShjb21wYXJhdG9yLCBjb250YWluZXJfbWF0Y2hlcikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcGFyYXRvciwgdHlwZW5hbWUgQ29udGFpbmVyTWF0Y2hlcj4KLWNsYXNzIFdoZW5Tb3J0ZWRCeU1hdGNoZXIgewotIHB1YmxpYzoKLSAgV2hlblNvcnRlZEJ5TWF0Y2hlcihjb25zdCBDb21wYXJhdG9yJiBjb21wYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lck1hdGNoZXImIG1hdGNoZXIpCi0gICAgICA6IGNvbXBhcmF0b3JfKGNvbXBhcmF0b3IpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzQ29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8TGhzQ29udGFpbmVyPihjb21wYXJhdG9yXywgbWF0Y2hlcl8pKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxMaHNDb250YWluZXI+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PAotICAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKExoc0NvbnRhaW5lcik+IExoc1ZpZXc7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojp0eXBlIExoc1N0bENvbnRhaW5lcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OmNvbnN0X3JlZmVyZW5jZSBMaHNTdGxDb250YWluZXJSZWZlcmVuY2U7Ci0gICAgLy8gVHJhbnNmb3JtcyBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBWYWx1ZT4gaW50byBzdGQ6OnBhaXI8S2V5LCBWYWx1ZT4KLSAgICAvLyBzbyB0aGF0IHdlIGNhbiBtYXRjaCBhc3NvY2lhdGl2ZSBjb250YWluZXJzLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3RGcm9tS2V5PAotICAgICAgICB0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGU+Ojp0eXBlIExoc1ZhbHVlOwotCi0gICAgSW1wbChjb25zdCBDb21wYXJhdG9yJiBjb21wYXJhdG9yLCBjb25zdCBDb250YWluZXJNYXRjaGVyJiBtYXRjaGVyKQotICAgICAgICA6IGNvbXBhcmF0b3JfKGNvbXBhcmF0b3IpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgIih3aGVuIHNvcnRlZCkgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgIih3aGVuIHNvcnRlZCkgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihMaHNDb250YWluZXIgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIExoc1N0bENvbnRhaW5lclJlZmVyZW5jZSBsaHNfc3RsX2NvbnRhaW5lciA9IExoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKGxocyk7Ci0gICAgICA6OnN0ZDo6dmVjdG9yPExoc1ZhbHVlPiBzb3J0ZWRfY29udGFpbmVyKGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmVuZCgpKTsKLSAgICAgIDo6c3RkOjpzb3J0KAotICAgICAgICAgICBzb3J0ZWRfY29udGFpbmVyLmJlZ2luKCksIHNvcnRlZF9jb250YWluZXIuZW5kKCksIGNvbXBhcmF0b3JfKTsKLQotICAgICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkLCB3ZSBkbyBub3QgbmVlZCB0bwotICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGlubmVyIGV4cGxhbmF0aW9uLgotICAgICAgICByZXR1cm4gbWF0Y2hlcl8uTWF0Y2hlcyhzb3J0ZWRfY29udGFpbmVyKTsKLSAgICAgIH0KLQotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQoc29ydGVkX2NvbnRhaW5lciwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICpsaXN0ZW5lciA8PCAiIHdoZW4gc29ydGVkIjsKLQotICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKLSAgICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBtYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc29ydGVkX2NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKLSAgICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgQ29tcGFyYXRvciBjb21wYXJhdG9yXzsKLSAgICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6c3RkOjp2ZWN0b3I8TGhzVmFsdWU+Jj4gbWF0Y2hlcl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgQ29tcGFyYXRvciBjb21wYXJhdG9yXzsKLSAgY29uc3QgQ29udGFpbmVyTWF0Y2hlciBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFdoZW5Tb3J0ZWRCeU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBQb2ludHdpc2UodHVwbGVfbWF0Y2hlciwgcmhzX2NvbnRhaW5lcikuICB0dXBsZV9tYXRjaGVyCi0vLyBtdXN0IGJlIGFibGUgdG8gYmUgc2FmZWx5IGNhc3QgdG8gTWF0Y2hlcjx0dXBsZTxjb25zdCBUMSYsIGNvbnN0Ci0vLyBUMiY+ID4sIHdoZXJlIFQxIGFuZCBUMiBhcmUgdGhlIHR5cGVzIG9mIGVsZW1lbnRzIGluIHRoZSBMSFMKLS8vIGNvbnRhaW5lciBhbmQgdGhlIFJIUyBjb250YWluZXIgcmVzcGVjdGl2ZWx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlTWF0Y2hlciwgdHlwZW5hbWUgUmhzQ29udGFpbmVyPgotY2xhc3MgUG9pbnR3aXNlTWF0Y2hlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJoc0NvbnRhaW5lcj4gUmhzVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNWaWV3Ojp0eXBlIFJoc1N0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgUmhzVmFsdWU7Ci0KLSAgLy8gTGlrZSBDb250YWluZXJFcSwgd2UgbWFrZSBhIGNvcHkgb2YgcmhzIGluIGNhc2UgdGhlIGVsZW1lbnRzIGluCi0gIC8vIGl0IGFyZSBtb2RpZmllZCBhZnRlciB0aGlzIG1hdGNoZXIgaXMgY3JlYXRlZC4KLSAgUG9pbnR3aXNlTWF0Y2hlcihjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IFJoc0NvbnRhaW5lciYgcmhzKQotICAgICAgOiB0dXBsZV9tYXRjaGVyXyh0dXBsZV9tYXRjaGVyKSwgcmhzXyhSaHNWaWV3OjpDb3B5KHJocykpIHsKLSAgICAvLyBNYWtlcyBzdXJlIHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyB0ZW1wbGF0ZQotICAgIC8vIHdpdGggYSBjb25zdCBvciByZWZlcmVuY2UgdHlwZS4KLSAgICAodm9pZCl0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8UmhzQ29udGFpbmVyLAotICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oUmhzQ29udGFpbmVyKT4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzQ29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8TGhzQ29udGFpbmVyPih0dXBsZV9tYXRjaGVyXywgcmhzXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPExoc0NvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oTGhzQ29udGFpbmVyKT4gTGhzVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OnR5cGUgTGhzU3RsQ29udGFpbmVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzVmlldzo6Y29uc3RfcmVmZXJlbmNlIExoc1N0bENvbnRhaW5lclJlZmVyZW5jZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBMaHNWYWx1ZTsKLSAgICAvLyBXZSBwYXNzIHRoZSBMSFMgdmFsdWUgYW5kIHRoZSBSSFMgdmFsdWUgdG8gdGhlIGlubmVyIG1hdGNoZXIgYnkKLSAgICAvLyByZWZlcmVuY2UsIGFzIHRoZXkgbWF5IGJlIGV4cGVuc2l2ZSB0byBjb3B5LiAgV2UgbXVzdCB1c2UgdHVwbGUKLSAgICAvLyBpbnN0ZWFkIG9mIHBhaXIgaGVyZSwgYXMgYSBwYWlyIGNhbm5vdCBob2xkIHJlZmVyZW5jZXMgKEMrKyA5OCwKLSAgICAvLyAyMC4yLjIgW2xpYi5wYWlyc10pLgotICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxjb25zdCBMaHNWYWx1ZSYsIGNvbnN0IFJoc1ZhbHVlJj4gSW5uZXJNYXRjaGVyQXJnOwotCi0gICAgSW1wbChjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IFJoc1N0bENvbnRhaW5lciYgcmhzKQotICAgICAgICAvLyBtb25vX3R1cGxlX21hdGNoZXJfIGhvbGRzIGEgbW9ub21vcnBoaWMgdmVyc2lvbiBvZiB0aGUgdHVwbGUgbWF0Y2hlci4KLSAgICAgICAgOiBtb25vX3R1cGxlX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxJbm5lck1hdGNoZXJBcmc+KHR1cGxlX21hdGNoZXIpKSwKLSAgICAgICAgICByaHNfKHJocykge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJjb250YWlucyAiIDw8IHJoc18uc2l6ZSgpCi0gICAgICAgICAgPDwgIiB2YWx1ZXMsIHdoZXJlIGVhY2ggdmFsdWUgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlIGluICI7Ci0gICAgICBVbml2ZXJzYWxQcmludGVyPFJoc1N0bENvbnRhaW5lcj46OlByaW50KHJoc18sIG9zKTsKLSAgICAgICpvcyA8PCAiICI7Ci0gICAgICBtb25vX3R1cGxlX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkb2Vzbid0IGNvbnRhaW4gZXhhY3RseSAiIDw8IHJoc18uc2l6ZSgpCi0gICAgICAgICAgPDwgIiB2YWx1ZXMsIG9yIGNvbnRhaW5zIGEgdmFsdWUgeCBhdCBzb21lIGluZGV4IGkiCi0gICAgICAgICAgPDwgIiB3aGVyZSB4IGFuZCB0aGUgaS10aCB2YWx1ZSBvZiAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOwotICAgICAgKm9zIDw8ICIgIjsKLSAgICAgIG1vbm9fdHVwbGVfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKExoc0NvbnRhaW5lciBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlIGxoc19zdGxfY29udGFpbmVyID0gTGhzVmlldzo6Q29uc3RSZWZlcmVuY2UobGhzKTsKLSAgICAgIGNvbnN0IHNpemVfdCBhY3R1YWxfc2l6ZSA9IGxoc19zdGxfY29udGFpbmVyLnNpemUoKTsKLSAgICAgIGlmIChhY3R1YWxfc2l6ZSAhPSByaHNfLnNpemUoKSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGNvbnRhaW5zICIgPDwgYWN0dWFsX3NpemUgPDwgIiB2YWx1ZXMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgbGVmdCA9IGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICB0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIHJpZ2h0ID0gcmhzXy5iZWdpbigpOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gYWN0dWFsX3NpemU7ICsraSwgKytsZWZ0LCArK3JpZ2h0KSB7Ci0gICAgICAgIGNvbnN0IElubmVyTWF0Y2hlckFyZyB2YWx1ZV9wYWlyKCpsZWZ0LCAqcmlnaHQpOwotCi0gICAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgICAgICAgIGlmICghbW9ub190dXBsZV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgICAgICAgICAgICB2YWx1ZV9wYWlyLCAmaW5uZXJfbGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICAqbGlzdGVuZXIgPDwgIndoZXJlIHRoZSB2YWx1ZSBwYWlyICgiOwotICAgICAgICAgICAgVW5pdmVyc2FsUHJpbnQoKmxlZnQsIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICAgICAgICAqbGlzdGVuZXIgPDwgIiwgIjsKLSAgICAgICAgICAgIFVuaXZlcnNhbFByaW50KCpyaWdodCwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICAgICAgICpsaXN0ZW5lciA8PCAiKSBhdCBpbmRleCAjIiA8PCBpIDw8ICIgZG9uJ3QgbWF0Y2giOwotICAgICAgICAgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoIW1vbm9fdHVwbGVfbWF0Y2hlcl8uTWF0Y2hlcyh2YWx1ZV9wYWlyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWF0Y2hlcjxJbm5lck1hdGNoZXJBcmc+IG1vbm9fdHVwbGVfbWF0Y2hlcl87Ci0gICAgY29uc3QgUmhzU3RsQ29udGFpbmVyIHJoc187Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgVHVwbGVNYXRjaGVyIHR1cGxlX21hdGNoZXJfOwotICBjb25zdCBSaHNTdGxDb250YWluZXIgcmhzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvaW50d2lzZU1hdGNoZXIpOwotfTsKLQotLy8gSG9sZHMgdGhlIGxvZ2ljIGNvbW1vbiB0byBDb250YWluc01hdGNoZXJJbXBsIGFuZCBFYWNoTWF0Y2hlckltcGwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotY2xhc3MgUXVhbnRpZmllck1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgdHlwZWRlZiBTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBFbGVtZW50OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IFF1YW50aWZpZXJNYXRjaGVySW1wbChJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcikKLSAgICAgIDogaW5uZXJfbWF0Y2hlcl8oCi0gICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oaW5uZXJfbWF0Y2hlcikpIHt9Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXI6Ci0gIC8vICogQWxsIGVsZW1lbnRzIGluIHRoZSBjb250YWluZXIgbWF0Y2gsIGlmIGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2guCi0gIC8vICogQW55IGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBtYXRjaGVzLCBpZiAhYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaC4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKGJvb2wgYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBzdGxfY29udGFpbmVyID0gVmlldzo6Q29uc3RSZWZlcmVuY2UoY29udGFpbmVyKTsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgZm9yICh0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RsX2NvbnRhaW5lci5iZWdpbigpOwotICAgICAgICAgaXQgIT0gc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCwgKytpKSB7Ci0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgICAgY29uc3QgYm9vbCBtYXRjaGVzID0gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKCppdCwgJmlubmVyX2xpc3RlbmVyKTsKLQotICAgICAgaWYgKG1hdGNoZXMgIT0gYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaCkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGVsZW1lbnQgIyIgPDwgaQotICAgICAgICAgICAgICAgICAgPDwgKG1hdGNoZXMgPyAiIG1hdGNoZXMiIDogIiBkb2Vzbid0IG1hdGNoIik7Ci0gICAgICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICAgcmV0dXJuICFhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaDsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBjb25zdCBNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFF1YW50aWZpZXJNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIENvbnRhaW5zKGVsZW1lbnRfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCB0eXBlIENvbnRhaW5lci4KLS8vIFN5bW1ldHJpYyB0byBFYWNoTWF0Y2hlckltcGwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotY2xhc3MgQ29udGFpbnNNYXRjaGVySW1wbCA6IHB1YmxpYyBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotICBleHBsaWNpdCBDb250YWluc01hdGNoZXJJbXBsKElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPihpbm5lcl9tYXRjaGVyKSB7fQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRoYXQgIjsKLSAgICB0aGlzLT5pbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IGNvbnRhaW4gYW55IGVsZW1lbnQgdGhhdCAiOwotICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRoaXMtPk1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2UsIGNvbnRhaW5lciwgbGlzdGVuZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5zTWF0Y2hlckltcGwpOwotfTsKLQotLy8gSW1wbGVtZW50cyBFYWNoKGVsZW1lbnRfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCB0eXBlIENvbnRhaW5lci4KLS8vIFN5bW1ldHJpYyB0byBDb250YWluc01hdGNoZXJJbXBsLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWNsYXNzIEVhY2hNYXRjaGVySW1wbCA6IHB1YmxpYyBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotICBleHBsaWNpdCBFYWNoTWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpCi0gICAgICA6IFF1YW50aWZpZXJNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXIpIHt9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAib25seSBjb250YWlucyBlbGVtZW50cyB0aGF0ICI7Ci0gICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiY29udGFpbnMgc29tZSBlbGVtZW50IHRoYXQgIjsKLSAgICB0aGlzLT5pbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRoaXMtPk1hdGNoQW5kRXhwbGFpbkltcGwodHJ1ZSwgY29udGFpbmVyLCBsaXN0ZW5lcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWFjaE1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgQ29udGFpbnMoZWxlbWVudF9tYXRjaGVyKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotY2xhc3MgQ29udGFpbnNNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbnRhaW5zTWF0Y2hlcihNIG0pIDogaW5uZXJfbWF0Y2hlcl8obSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBDb250YWluc01hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTSBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5zTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIEVhY2goZWxlbWVudF9tYXRjaGVyKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotY2xhc3MgRWFjaE1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRWFjaE1hdGNoZXIoTSBtKSA6IGlubmVyX21hdGNoZXJfKG0pIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWFjaE1hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTSBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVhY2hNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgS2V5KGlubmVyX21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgcGFpciB0eXBlLgotLy8gS2V5KGlubmVyX21hdGNoZXIpIG1hdGNoZXMgYW4gc3RkOjpwYWlyIHdob3NlICdmaXJzdCcgZmllbGQgbWF0Y2hlcwotLy8gaW5uZXJfbWF0Y2hlci4gIEZvciBleGFtcGxlLCBDb250YWlucyhLZXkoR2UoNSkpKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbgotLy8gc3RkOjptYXAgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB3aG9zZSBrZXkgaXMgPj0gNS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4KLWNsYXNzIEtleU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8UGFpclR5cGU+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFBhaXJUeXBlKSBSYXdQYWlyVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSYXdQYWlyVHlwZTo6Zmlyc3RfdHlwZSBLZXlUeXBlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IEtleU1hdGNoZXJJbXBsKElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXygKLSAgICAgICAgICB0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgS2V5VHlwZSY+KGlubmVyX21hdGNoZXIpKSB7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmICdrZXlfdmFsdWUuZmlyc3QnICh0aGUga2V5KSBtYXRjaGVzIHRoZSBpbm5lciBtYXRjaGVyLgotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFBhaXJUeXBlIGtleV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgY29uc3QgYm9vbCBtYXRjaCA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihrZXlfdmFsdWUuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOwotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgZXhwbGFuYXRpb24gPSBpbm5lcl9saXN0ZW5lci5zdHIoKTsKLSAgICBpZiAoZXhwbGFuYXRpb24gIT0gIiIpIHsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiIDw8IGV4cGxhbmF0aW9uOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJoYXMgYSBrZXkgdGhhdCAiOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZG9lc24ndCBoYXZlIGEga2V5IHRoYXQgIjsKLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBLZXlUeXBlJj4gaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhLZXlNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIEtleShtYXRjaGVyX2Zvcl9rZXkpLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1jbGFzcyBLZXlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEtleU1hdGNoZXIoTSBtKSA6IG1hdGNoZXJfZm9yX2tleV8obSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8UGFpclR5cGU+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgS2V5TWF0Y2hlckltcGw8UGFpclR5cGU+KG1hdGNoZXJfZm9yX2tleV8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTSBtYXRjaGVyX2Zvcl9rZXlfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oS2V5TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIFBhaXIoZmlyc3RfbWF0Y2hlciwgc2Vjb25kX21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgcGFpcgotLy8gdHlwZSB3aXRoIGl0cyB0d28gbWF0Y2hlcnMuIFNlZSBQYWlyKCkgZnVuY3Rpb24gYmVsb3cuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+Ci1jbGFzcyBQYWlyTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQYWlyVHlwZT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oUGFpclR5cGUpIFJhd1BhaXJUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIFJhd1BhaXJUeXBlOjpmaXJzdF90eXBlIEZpcnN0VHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSYXdQYWlyVHlwZTo6c2Vjb25kX3R5cGUgU2Vjb25kVHlwZTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmRNYXRjaGVyPgotICBQYWlyTWF0Y2hlckltcGwoRmlyc3RNYXRjaGVyIGZpcnN0X21hdGNoZXIsIFNlY29uZE1hdGNoZXIgc2Vjb25kX21hdGNoZXIpCi0gICAgICA6IGZpcnN0X21hdGNoZXJfKAotICAgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IEZpcnN0VHlwZSY+KGZpcnN0X21hdGNoZXIpKSwKLSAgICAgICAgc2Vjb25kX21hdGNoZXJfKAotICAgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlY29uZFR5cGUmPihzZWNvbmRfbWF0Y2hlcikpIHsKLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImhhcyBhIGZpcnN0IGZpZWxkIHRoYXQgIjsKLSAgICBmaXJzdF9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIiwgYW5kIGhhcyBhIHNlY29uZCBmaWVsZCB0aGF0ICI7Ci0gICAgc2Vjb25kX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIGEgZmlyc3QgZmllbGQgdGhhdCAiOwotICAgIGZpcnN0X21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIsIG9yIGhhcyBhIHNlY29uZCBmaWVsZCB0aGF0ICI7Ci0gICAgc2Vjb25kX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmICdhX3BhaXIuZmlyc3QnIG1hdGNoZXMgZmlyc3RfbWF0Y2hlciBhbmQgJ2FfcGFpci5zZWNvbmQnCi0gIC8vIG1hdGNoZXMgc2Vjb25kX21hdGNoZXIuCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oUGFpclR5cGUgYV9wYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBpcyBub3QgaW50ZXJlc3RlZCwgd2UgZG9uJ3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlCi0gICAgICAvLyBleHBsYW5hdGlvbi4KLSAgICAgIHJldHVybiBmaXJzdF9tYXRjaGVyXy5NYXRjaGVzKGFfcGFpci5maXJzdCkgJiYKLSAgICAgICAgICAgICBzZWNvbmRfbWF0Y2hlcl8uTWF0Y2hlcyhhX3BhaXIuc2Vjb25kKTsKLSAgICB9Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBmaXJzdF9pbm5lcl9saXN0ZW5lcjsKLSAgICBpZiAoIWZpcnN0X21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhX3BhaXIuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2lubmVyX2xpc3RlbmVyKSkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBmaXJzdCBmaWVsZCBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgICBQcmludElmTm90RW1wdHkoZmlyc3RfaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgc2Vjb25kX2lubmVyX2xpc3RlbmVyOwotICAgIGlmICghc2Vjb25kX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhX3BhaXIuc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kX2lubmVyX2xpc3RlbmVyKSkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBzZWNvbmQgZmllbGQgZG9lcyBub3QgbWF0Y2giOwotICAgICAgUHJpbnRJZk5vdEVtcHR5KHNlY29uZF9pbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRXhwbGFpblN1Y2Nlc3MoZmlyc3RfaW5uZXJfbGlzdGVuZXIuc3RyKCksIHNlY29uZF9pbm5lcl9saXN0ZW5lci5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgRXhwbGFpblN1Y2Nlc3MoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgZmlyc3RfZXhwbGFuYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc2Vjb25kX2V4cGxhbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBib3RoIGZpZWxkcyBtYXRjaCI7Ci0gICAgaWYgKGZpcnN0X2V4cGxhbmF0aW9uICE9ICIiKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIiwgd2hlcmUgdGhlIGZpcnN0IGZpZWxkIGlzIGEgdmFsdWUgIiA8PCBmaXJzdF9leHBsYW5hdGlvbjsKLSAgICB9Ci0gICAgaWYgKHNlY29uZF9leHBsYW5hdGlvbiAhPSAiIikgewotICAgICAgKmxpc3RlbmVyIDw8ICIsICI7Ci0gICAgICBpZiAoZmlyc3RfZXhwbGFuYXRpb24gIT0gIiIpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJhbmQgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAid2hlcmUgIjsKLSAgICAgIH0KLSAgICAgICpsaXN0ZW5lciA8PCAidGhlIHNlY29uZCBmaWVsZCBpcyBhIHZhbHVlICIgPDwgc2Vjb25kX2V4cGxhbmF0aW9uOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgRmlyc3RUeXBlJj4gZmlyc3RfbWF0Y2hlcl87Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgU2Vjb25kVHlwZSY+IHNlY29uZF9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBhaXJNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIFBhaXIoZmlyc3RfbWF0Y2hlciwgc2Vjb25kX21hdGNoZXIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0TWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kTWF0Y2hlcj4KLWNsYXNzIFBhaXJNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIFBhaXJNYXRjaGVyKEZpcnN0TWF0Y2hlciBmaXJzdF9tYXRjaGVyLCBTZWNvbmRNYXRjaGVyIHNlY29uZF9tYXRjaGVyKQotICAgICAgOiBmaXJzdF9tYXRjaGVyXyhmaXJzdF9tYXRjaGVyKSwgc2Vjb25kX21hdGNoZXJfKHNlY29uZF9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxQYWlyVHlwZT4gKCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcigKLSAgICAgICAgbmV3IFBhaXJNYXRjaGVySW1wbDxQYWlyVHlwZT4oCi0gICAgICAgICAgICBmaXJzdF9tYXRjaGVyXywgc2Vjb25kX21hdGNoZXJfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEZpcnN0TWF0Y2hlciBmaXJzdF9tYXRjaGVyXzsKLSAgY29uc3QgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQYWlyTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlKCkgYW5kIEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1jbGFzcyBFbGVtZW50c0FyZU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IFZpZXc7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dHlwZSBTdGxDb250YWluZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6Y29uc3RfcmVmZXJlbmNlIFN0bENvbnRhaW5lclJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsKLQotICAvLyBDb25zdHJ1Y3RzIHRoZSBtYXRjaGVyIGZyb20gYSBzZXF1ZW5jZSBvZiBlbGVtZW50IHZhbHVlcyBvcgotICAvLyBlbGVtZW50IG1hdGNoZXJzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdGVyPgotICBFbGVtZW50c0FyZU1hdGNoZXJJbXBsKElucHV0SXRlciBmaXJzdCwgSW5wdXRJdGVyIGxhc3QpIHsKLSAgICB3aGlsZSAoZmlyc3QgIT0gbGFzdCkgewotICAgICAgbWF0Y2hlcnNfLnB1c2hfYmFjayhNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oKmZpcnN0KyspKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgaWYgKGNvdW50KCkgPT0gMCkgewotICAgICAgKm9zIDw8ICJpcyBlbXB0eSI7Ci0gICAgfSBlbHNlIGlmIChjb3VudCgpID09IDEpIHsKLSAgICAgICpvcyA8PCAiaGFzIDEgZWxlbWVudCB0aGF0ICI7Ci0gICAgICBtYXRjaGVyc19bMF0uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpvcyA8PCAiaGFzICIgPDwgRWxlbWVudHMoY291bnQoKSkgPDwgIiB3aGVyZVxuIjsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50KCk7ICsraSkgewotICAgICAgICAqb3MgPDwgImVsZW1lbnQgIyIgPDwgaSA8PCAiICI7Ci0gICAgICAgIG1hdGNoZXJzX1tpXS5EZXNjcmliZVRvKG9zKTsKLSAgICAgICAgaWYgKGkgKyAxIDwgY291bnQoKSkgewotICAgICAgICAgICpvcyA8PCAiLFxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBpZiAoY291bnQoKSA9PSAwKSB7Ci0gICAgICAqb3MgPDwgImlzbid0IGVtcHR5IjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSAiIDw8IEVsZW1lbnRzKGNvdW50KCkpIDw8ICIsIG9yXG4iOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50KCk7ICsraSkgewotICAgICAgKm9zIDw8ICJlbGVtZW50ICMiIDw8IGkgPDwgIiAiOwotICAgICAgbWF0Y2hlcnNfW2ldLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgICBpZiAoaSArIDEgPCBjb3VudCgpKSB7Ci0gICAgICAgICpvcyA8PCAiLCBvclxuIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAvLyBUbyB3b3JrIHdpdGggc3RyZWFtLWxpa2UgImNvbnRhaW5lcnMiLCB3ZSBtdXN0IG9ubHkgd2FsawotICAgIC8vIHRocm91Z2ggdGhlIGVsZW1lbnRzIGluIG9uZSBwYXNzLgotCi0gICAgY29uc3QgYm9vbCBsaXN0ZW5lcl9pbnRlcmVzdGVkID0gbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpOwotCi0gICAgLy8gZXhwbGFuYXRpb25zW2ldIGlzIHRoZSBleHBsYW5hdGlvbiBvZiB0aGUgZWxlbWVudCBhdCBpbmRleCBpLgotICAgIDo6c3RkOjp2ZWN0b3I8aW50ZXJuYWw6OnN0cmluZz4gZXhwbGFuYXRpb25zKGNvdW50KCkpOwotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBzdGxfY29udGFpbmVyID0gVmlldzo6Q29uc3RSZWZlcmVuY2UoY29udGFpbmVyKTsKLSAgICB0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RsX2NvbnRhaW5lci5iZWdpbigpOwotICAgIHNpemVfdCBleGFtX3BvcyA9IDA7Ci0gICAgYm9vbCBtaXNtYXRjaF9mb3VuZCA9IGZhbHNlOyAgLy8gSGF2ZSB3ZSBmb3VuZCBhIG1pc21hdGNoZWQgZWxlbWVudCB5ZXQ/Ci0KLSAgICAvLyBHbyB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgbWF0Y2hlcnMgaW4gcGFpcnMsIHVudGlsIHdlIHJlYWNoCi0gICAgLy8gdGhlIGVuZCBvZiBlaXRoZXIgdGhlIGVsZW1lbnRzIG9yIHRoZSBtYXRjaGVycywgb3IgdW50aWwgd2UgZmluZCBhCi0gICAgLy8gbWlzbWF0Y2guCi0gICAgZm9yICg7IGl0ICE9IHN0bF9jb250YWluZXIuZW5kKCkgJiYgZXhhbV9wb3MgIT0gY291bnQoKTsgKytpdCwgKytleGFtX3BvcykgewotICAgICAgYm9vbCBtYXRjaDsgIC8vIERvZXMgdGhlIGN1cnJlbnQgZWxlbWVudCBtYXRjaCB0aGUgY3VycmVudCBtYXRjaGVyPwotICAgICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsKLSAgICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBzOwotICAgICAgICBtYXRjaCA9IG1hdGNoZXJzX1tleGFtX3Bvc10uTWF0Y2hBbmRFeHBsYWluKCppdCwgJnMpOwotICAgICAgICBleHBsYW5hdGlvbnNbZXhhbV9wb3NdID0gcy5zdHIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoID0gbWF0Y2hlcnNfW2V4YW1fcG9zXS5NYXRjaGVzKCppdCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghbWF0Y2gpIHsKLSAgICAgICAgbWlzbWF0Y2hfZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgbWlzbWF0Y2hfZm91bmQgaXMgdHJ1ZSwgJ2V4YW1fcG9zJyBpcyB0aGUgaW5kZXggb2YgdGhlIG1pc21hdGNoLgotCi0gICAgLy8gRmluZCBob3cgbWFueSBlbGVtZW50cyB0aGUgYWN0dWFsIGNvbnRhaW5lciBoYXMuICBXZSBhdm9pZAotICAgIC8vIGNhbGxpbmcgc2l6ZSgpIHMudC4gdGhpcyBjb2RlIHdvcmtzIGZvciBzdHJlYW0tbGlrZSAiY29udGFpbmVycyIKLSAgICAvLyB0aGF0IGRvbid0IGRlZmluZSBzaXplKCkuCi0gICAgc2l6ZV90IGFjdHVhbF9jb3VudCA9IGV4YW1fcG9zOwotICAgIGZvciAoOyBpdCAhPSBzdGxfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7Ci0gICAgICArK2FjdHVhbF9jb3VudDsKLSAgICB9Ci0KLSAgICBpZiAoYWN0dWFsX2NvdW50ICE9IGNvdW50KCkpIHsKLSAgICAgIC8vIFRoZSBlbGVtZW50IGNvdW50IGRvZXNuJ3QgbWF0Y2guICBJZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LAotICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIGV4cGxhaW4gYW55dGhpbmcgYXMgR29vZ2xlIE1vY2sgYWxyZWFkeQotICAgICAgLy8gcHJpbnRzIHRoZSBlbXB0eSBjb250YWluZXIuICBPdGhlcndpc2Ugd2UganVzdCBuZWVkIHRvIHNob3cKLSAgICAgIC8vIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIGFjdHVhbGx5IGFyZS4KLSAgICAgIGlmIChsaXN0ZW5lcl9pbnRlcmVzdGVkICYmIChhY3R1YWxfY291bnQgIT0gMCkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBoYXMgIiA8PCBFbGVtZW50cyhhY3R1YWxfY291bnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtaXNtYXRjaF9mb3VuZCkgewotICAgICAgLy8gVGhlIGVsZW1lbnQgY291bnQgbWF0Y2hlcywgYnV0IHRoZSBleGFtX3Bvcy10aCBlbGVtZW50IGRvZXNuJ3QgbWF0Y2guCi0gICAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGVsZW1lbnQgIyIgPDwgZXhhbV9wb3MgPDwgIiBkb2Vzbid0IG1hdGNoIjsKLSAgICAgICAgUHJpbnRJZk5vdEVtcHR5KGV4cGxhbmF0aW9uc1tleGFtX3Bvc10sIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRXZlcnkgZWxlbWVudCBtYXRjaGVzIGl0cyBleHBlY3RhdGlvbi4gIFdlIG5lZWQgdG8gZXhwbGFpbiB3aHkKLSAgICAvLyAodGhlIG9idmlvdXMgb25lcyBjYW4gYmUgc2tpcHBlZCkuCi0gICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsKLSAgICAgIGJvb2wgcmVhc29uX3ByaW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50KCk7ICsraSkgewotICAgICAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzID0gZXhwbGFuYXRpb25zW2ldOwotICAgICAgICBpZiAoIXMuZW1wdHkoKSkgewotICAgICAgICAgIGlmIChyZWFzb25fcHJpbnRlZCkgewotICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICIsXG5hbmQgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBlbGVtZW50ICMiIDw8IGkgPDwgIiBtYXRjaGVzLCAiIDw8IHM7Ci0gICAgICAgICAgcmVhc29uX3ByaW50ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTWVzc2FnZSBFbGVtZW50cyhzaXplX3QgY291bnQpIHsKLSAgICByZXR1cm4gTWVzc2FnZSgpIDw8IGNvdW50IDw8IChjb3VudCA9PSAxID8gIiBlbGVtZW50IiA6ICIgZWxlbWVudHMiKTsKLSAgfQotCi0gIHNpemVfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1hdGNoZXJzXy5zaXplKCk7IH0KLQotICA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gbWF0Y2hlcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWxlbWVudHNBcmVNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBDb25uZWN0aXZpdHkgbWF0cml4IG9mIChlbGVtZW50cyBYIG1hdGNoZXJzKSwgaW4gZWxlbWVudC1tYWpvciBvcmRlci4KLS8vIEluaXRpYWxseSwgdGhlcmUgYXJlIG5vIGVkZ2VzLgotLy8gVXNlIE5leHRHcmFwaCgpIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcG9zc2libGUgZWRnZSBjb25maWd1cmF0aW9ucy4KLS8vIFVzZSBSYW5kb21pemUoKSB0byBnZW5lcmF0ZSBhIHJhbmRvbSBlZGdlIGNvbmZpZ3VyYXRpb24uCi1jbGFzcyBHVEVTVF9BUElfIE1hdGNoTWF0cml4IHsKLSBwdWJsaWM6Ci0gIE1hdGNoTWF0cml4KHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBudW1fbWF0Y2hlcnMpCi0gICAgICA6IG51bV9lbGVtZW50c18obnVtX2VsZW1lbnRzKSwKLSAgICAgICAgbnVtX21hdGNoZXJzXyhudW1fbWF0Y2hlcnMpLAotICAgICAgICBtYXRjaGVkXyhudW1fZWxlbWVudHNfKiBudW1fbWF0Y2hlcnNfLCAwKSB7Ci0gIH0KLQotICBzaXplX3QgTGhzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bV9lbGVtZW50c187IH0KLSAgc2l6ZV90IFJoc1NpemUoKSBjb25zdCB7IHJldHVybiBudW1fbWF0Y2hlcnNfOyB9Ci0gIGJvb2wgSGFzRWRnZShzaXplX3QgaWxocywgc2l6ZV90IGlyaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV0gPT0gMTsKLSAgfQotICB2b2lkIFNldEVkZ2Uoc2l6ZV90IGlsaHMsIHNpemVfdCBpcmhzLCBib29sIGIpIHsKLSAgICBtYXRjaGVkX1tTcGFjZUluZGV4KGlsaHMsIGlyaHMpXSA9IGIgPyAxIDogMDsKLSAgfQotCi0gIC8vIFRyZWF0aW5nIHRoZSBjb25uZWN0aXZpdHkgbWF0cml4IGFzIGEgKExoc1NpemUoKSpSaHNTaXplKCkpLWJpdCBudW1iZXIsCi0gIC8vIGFkZHMgMSB0byB0aGF0IG51bWJlcjsgcmV0dXJucyBmYWxzZSBpZiBpbmNyZW1lbnRpbmcgdGhlIGdyYXBoIGxlZnQgaXQKLSAgLy8gZW1wdHkuCi0gIGJvb2wgTmV4dEdyYXBoKCk7Ci0KLSAgdm9pZCBSYW5kb21pemUoKTsKLQotICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHNpemVfdCBTcGFjZUluZGV4KHNpemVfdCBpbGhzLCBzaXplX3QgaXJocykgY29uc3QgewotICAgIHJldHVybiBpbGhzICogbnVtX21hdGNoZXJzXyArIGlyaHM7Ci0gIH0KLQotICBzaXplX3QgbnVtX2VsZW1lbnRzXzsKLSAgc2l6ZV90IG51bV9tYXRjaGVyc187Ci0KLSAgLy8gRWFjaCBlbGVtZW50IGlzIGEgY2hhciBpbnRlcnByZXRlZCBhcyBib29sLiBUaGV5IGFyZSBzdG9yZWQgYXMgYQotICAvLyBmbGF0dGVuZWQgYXJyYXkgaW4gbGhzLW1ham9yIG9yZGVyLCB1c2UgJ1NwYWNlSW5kZXgoKScgdG8gdHJhbnNsYXRlCi0gIC8vIGEgKGlsaHMsIGlyaHMpIG1hdHJpeCBjb29yZGluYXRlIGludG8gYW4gb2Zmc2V0LgotICA6OnN0ZDo6dmVjdG9yPGNoYXI+IG1hdGNoZWRfOwotfTsKLQotdHlwZWRlZiA6OnN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gRWxlbWVudE1hdGNoZXJQYWlyOwotdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPEVsZW1lbnRNYXRjaGVyUGFpcj4gRWxlbWVudE1hdGNoZXJQYWlyczsKLQotLy8gUmV0dXJucyBhIG1heGltdW0gYmlwYXJ0aXRlIG1hdGNoaW5nIGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoICdnJy4KLS8vIFRoZSBtYXRjaGluZyBpcyByZXByZXNlbnRlZCBhcyBhIHZlY3RvciBvZiB7ZWxlbWVudCwgbWF0Y2hlcn0gcGFpcnMuCi1HVEVTVF9BUElfIEVsZW1lbnRNYXRjaGVyUGFpcnMKLUZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhjb25zdCBNYXRjaE1hdHJpeCYgZyk7Ci0KLUdURVNUX0FQSV8gYm9vbCBGaW5kUGFpcmluZyhjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgVW5vcmRlcmVkRWxlbWVudHNBcmUuICBCeQotLy8gcHV0dGluZyBsb2dpYyB0aGF0J3Mgbm90IHNwZWNpZmljIHRvIHRoZSBlbGVtZW50IHR5cGUgaGVyZSwgd2UKLS8vIHJlZHVjZSBiaW5hcnkgYmxvYXQgYW5kIGluY3JlYXNlIGNvbXBpbGF0aW9uIHNwZWVkLgotY2xhc3MgR1RFU1RfQVBJXyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZSB7Ci0gcHJvdGVjdGVkOgotICAvLyBBIHZlY3RvciBvZiBtYXRjaGVyIGRlc2NyaWJlcnMsIG9uZSBmb3IgZWFjaCBlbGVtZW50IG1hdGNoZXIuCi0gIC8vIERvZXMgbm90IG93biB0aGUgZGVzY3JpYmVycyAoYW5kIHRodXMgY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZQotICAvLyBlbGVtZW50IG1hdGNoZXJzIGFyZSBhbGl2ZSkuCi0gIHR5cGVkZWYgOjpzdGQ6OnZlY3Rvcjxjb25zdCBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKj4gTWF0Y2hlckRlc2NyaWJlclZlYzsKLQotICAvLyBEZXNjcmliZXMgdGhpcyBVbm9yZGVyZWRFbGVtZW50c0FyZSBtYXRjaGVyLgotICB2b2lkIERlc2NyaWJlVG9JbXBsKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBuZWdhdGlvbiBvZiB0aGlzIFVub3JkZXJlZEVsZW1lbnRzQXJlIG1hdGNoZXIuCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvSW1wbCg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0OwotCi0gIGJvb2wgVmVyaWZ5QWxsRWxlbWVudHNBbmRNYXRjaGVyc0FyZU1hdGNoZWQoCi0gICAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHN0cmluZz4mIGVsZW1lbnRfcHJpbnRvdXRzLAotICAgICAgY29uc3QgTWF0Y2hNYXRyaXgmIG1hdHJpeCwKLSAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdDsKLQotICBNYXRjaGVyRGVzY3JpYmVyVmVjJiBtYXRjaGVyX2Rlc2NyaWJlcnMoKSB7Ci0gICAgcmV0dXJuIG1hdGNoZXJfZGVzY3JpYmVyc187Ci0gIH0KLQotICBzdGF0aWMgTWVzc2FnZSBFbGVtZW50cyhzaXplX3QgbikgewotICAgIHJldHVybiBNZXNzYWdlKCkgPDwgbiA8PCAiIGVsZW1lbnQiIDw8IChuID09IDEgPyAiIiA6ICJzIik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1hdGNoZXJEZXNjcmliZXJWZWMgbWF0Y2hlcl9kZXNjcmliZXJzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdW5vcmRlcmVkIEVsZW1lbnRzQXJlIGFuZCB1bm9yZGVyZWQgRWxlbWVudHNBcmVBcnJheS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1jbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsCi0gICAgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxDb250YWluZXI+LAotICAgICAgcHVibGljIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgU3RsQ29udGFpbmVyQ29uc3RJdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsKLQotICAvLyBDb25zdHJ1Y3RzIHRoZSBtYXRjaGVyIGZyb20gYSBzZXF1ZW5jZSBvZiBlbGVtZW50IHZhbHVlcyBvcgotICAvLyBlbGVtZW50IG1hdGNoZXJzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdGVyPgotICBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsKElucHV0SXRlciBmaXJzdCwgSW5wdXRJdGVyIGxhc3QpIHsKLSAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgewotICAgICAgbWF0Y2hlcnNfLnB1c2hfYmFjayhNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oKmZpcnN0KSk7Ci0gICAgICBtYXRjaGVyX2Rlc2NyaWJlcnMoKS5wdXNoX2JhY2sobWF0Y2hlcnNfLmJhY2soKS5HZXREZXNjcmliZXIoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVUb0ltcGwob3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVOZWdhdGlvblRvSW1wbChvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBTdGxDb250YWluZXJSZWZlcmVuY2Ugc3RsX2NvbnRhaW5lciA9IFZpZXc6OkNvbnN0UmVmZXJlbmNlKGNvbnRhaW5lcik7Ci0gICAgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+IGVsZW1lbnRfcHJpbnRvdXRzOwotICAgIE1hdGNoTWF0cml4IG1hdHJpeCA9IEFuYWx5emVFbGVtZW50cyhzdGxfY29udGFpbmVyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0bF9jb250YWluZXIuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50X3ByaW50b3V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOwotCi0gICAgY29uc3Qgc2l6ZV90IGFjdHVhbF9jb3VudCA9IG1hdHJpeC5MaHNTaXplKCk7Ci0gICAgaWYgKGFjdHVhbF9jb3VudCA9PSAwICYmIG1hdGNoZXJzXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGFjdHVhbF9jb3VudCAhPSBtYXRjaGVyc18uc2l6ZSgpKSB7Ci0gICAgICAvLyBUaGUgZWxlbWVudCBjb3VudCBkb2Vzbid0IG1hdGNoLiAgSWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSwKLSAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byBleHBsYWluIGFueXRoaW5nIGFzIEdvb2dsZSBNb2NrIGFscmVhZHkKLSAgICAgIC8vIHByaW50cyB0aGUgZW1wdHkgY29udGFpbmVyLiBPdGhlcndpc2Ugd2UganVzdCBuZWVkIHRvIHNob3cKLSAgICAgIC8vIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIGFjdHVhbGx5IGFyZS4KLSAgICAgIGlmIChhY3R1YWxfY291bnQgIT0gMCAmJiBsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBoYXMgIiA8PCBFbGVtZW50cyhhY3R1YWxfY291bnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBWZXJpZnlBbGxFbGVtZW50c0FuZE1hdGNoZXJzQXJlTWF0Y2hlZChlbGVtZW50X3ByaW50b3V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBsaXN0ZW5lcikgJiYKLSAgICAgICAgICAgRmluZFBhaXJpbmcobWF0cml4LCBsaXN0ZW5lcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiA+IE1hdGNoZXJWZWM7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRJdGVyPgotICBNYXRjaE1hdHJpeCBBbmFseXplRWxlbWVudHMoRWxlbWVudEl0ZXIgZWxlbV9maXJzdCwgRWxlbWVudEl0ZXIgZWxlbV9sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+KiBlbGVtZW50X3ByaW50b3V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgZWxlbWVudF9wcmludG91dHMtPmNsZWFyKCk7Ci0gICAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBkaWRfbWF0Y2g7Ci0gICAgc2l6ZV90IG51bV9lbGVtZW50cyA9IDA7Ci0gICAgZm9yICg7IGVsZW1fZmlyc3QgIT0gZWxlbV9sYXN0OyArK251bV9lbGVtZW50cywgKytlbGVtX2ZpcnN0KSB7Ci0gICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAgIGVsZW1lbnRfcHJpbnRvdXRzLT5wdXNoX2JhY2soUHJpbnRUb1N0cmluZygqZWxlbV9maXJzdCkpOwotICAgICAgfQotICAgICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgIT0gbWF0Y2hlcnNfLnNpemUoKTsgKytpcmhzKSB7Ci0gICAgICAgIGRpZF9tYXRjaC5wdXNoX2JhY2soTWF0Y2hlcyhtYXRjaGVyc19baXJoc10pKCplbGVtX2ZpcnN0KSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTWF0Y2hNYXRyaXggbWF0cml4KG51bV9lbGVtZW50cywgbWF0Y2hlcnNfLnNpemUoKSk7Ci0gICAgOjpzdGQ6OnZlY3RvcjxjaGFyPjo6Y29uc3RfaXRlcmF0b3IgZGlkX21hdGNoX2l0ZXIgPSBkaWRfbWF0Y2guYmVnaW4oKTsKLSAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyAhPSBudW1fZWxlbWVudHM7ICsraWxocykgewotICAgICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgIT0gbWF0Y2hlcnNfLnNpemUoKTsgKytpcmhzKSB7Ci0gICAgICAgIG1hdHJpeC5TZXRFZGdlKGlsaHMsIGlyaHMsICpkaWRfbWF0Y2hfaXRlcisrICE9IDApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF0cml4OwotICB9Ci0KLSAgTWF0Y2hlclZlYyBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEZ1bmN0b3IgZm9yIHVzZSBpbiBUcmFuc2Zvcm1UdXBsZS4KLS8vIFBlcmZvcm1zIE1hdGNoZXJDYXN0PFRhcmdldD4gb24gYW4gaW5wdXQgYXJndW1lbnQgb2YgYW55IHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGFyZ2V0Pgotc3RydWN0IENhc3RBbmRBcHBlbmRUcmFuc2Zvcm0gewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnPgotICBNYXRjaGVyPFRhcmdldD4gb3BlcmF0b3IoKShjb25zdCBBcmcmIGEpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlckNhc3Q8VGFyZ2V0PihhKTsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyBVbm9yZGVyZWRFbGVtZW50c0FyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGU+Ci1jbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyKGNvbnN0IE1hdGNoZXJUdXBsZSYgYXJncykKLSAgICAgIDogbWF0Y2hlcnNfKGFyZ3MpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPjo6dHlwZSBWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dmFsdWVfdHlwZSBFbGVtZW50OwotICAgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiA+IE1hdGNoZXJWZWM7Ci0gICAgTWF0Y2hlclZlYyBtYXRjaGVyczsKLSAgICBtYXRjaGVycy5yZXNlcnZlKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZSk7Ci0gICAgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoQ2FzdEFuZEFwcGVuZFRyYW5zZm9ybTxjb25zdCBFbGVtZW50Jj4oKSwgbWF0Y2hlcnNfLAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpiYWNrX2luc2VydGVyKG1hdGNoZXJzKSk7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsPENvbnRhaW5lcj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVycy5iZWdpbigpLCBtYXRjaGVycy5lbmQoKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZT4KLWNsYXNzIEVsZW1lbnRzQXJlTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbGVtZW50c0FyZU1hdGNoZXIoY29uc3QgTWF0Y2hlclR1cGxlJiBhcmdzKSA6IG1hdGNoZXJzXyhhcmdzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj46OnR5cGUgVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnZhbHVlX3R5cGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBNYXRjaGVyVmVjOwotICAgIE1hdGNoZXJWZWMgbWF0Y2hlcnM7Ci0gICAgbWF0Y2hlcnMucmVzZXJ2ZSg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWUpOwotICAgIFRyYW5zZm9ybVR1cGxlVmFsdWVzKENhc3RBbmRBcHBlbmRUcmFuc2Zvcm08Y29uc3QgRWxlbWVudCY+KCksIG1hdGNoZXJzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YmFja19pbnNlcnRlcihtYXRjaGVycykpOwotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcnMuYmVnaW4oKSwgbWF0Y2hlcnMuZW5kKCkpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFbGVtZW50c0FyZU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KLSAgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXIoSXRlciBmaXJzdCwgSXRlciBsYXN0KQotICAgICAgOiBtYXRjaGVyc18oZmlyc3QsIGxhc3QpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcigKLSAgICAgICAgbmV3IFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPihtYXRjaGVyc18uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyc18uZW5kKCkpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgOjpzdGQ6OnZlY3RvcjxUPiBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgRWxlbWVudHNBcmVBcnJheU1hdGNoZXIgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Ci0gIEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCkgOiBtYXRjaGVyc18oZmlyc3QsIGxhc3QpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KAotICAgICAgICBtYXRjaGVyc18uYmVnaW4oKSwgbWF0Y2hlcnNfLmVuZCgpKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IDo6c3RkOjp2ZWN0b3I8VD4gbWF0Y2hlcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWxlbWVudHNBcmVBcnJheU1hdGNoZXIpOwotfTsKLQotLy8gR2l2ZW4gYSAyLXR1cGxlIG1hdGNoZXIgdG0gb2YgdHlwZSBUdXBsZTJNYXRjaGVyIGFuZCBhIHZhbHVlIHNlY29uZAotLy8gb2YgdHlwZSBTZWNvbmQsIEJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBTZWNvbmQ+KHRtLAotLy8gc2Vjb25kKSBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgdmFsdWUgeCBpZmYgdG0KLS8vIG1hdGNoZXMgdHVwbGUgKHgsIHNlY29uZCkuICBVc2VmdWwgZm9yIGltcGxlbWVudGluZwotLy8gVW5vcmRlcmVkUG9pbnR3aXNlKCkgaW4gdGVybXMgb2YgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLgotLy8KLS8vIEJvdW5kU2Vjb25kTWF0Y2hlciBpcyBjb3B5YWJsZSBhbmQgYXNzaWduYWJsZSwgYXMgd2UgbmVlZCB0byBwdXQKLS8vIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGluIGEgdmVjdG9yIHdoZW4gaW1wbGVtZW50aW5nCi0vLyBVbm9yZGVyZWRQb2ludHdpc2UoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmQ+Ci1jbGFzcyBCb3VuZFNlY29uZE1hdGNoZXIgewotIHB1YmxpYzoKLSAgQm91bmRTZWNvbmRNYXRjaGVyKGNvbnN0IFR1cGxlMk1hdGNoZXImIHRtLCBjb25zdCBTZWNvbmQmIHNlY29uZCkKLSAgICAgIDogdHVwbGUyX21hdGNoZXJfKHRtKSwgc2Vjb25kX3ZhbHVlXyhzZWNvbmQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPFQ+KHR1cGxlMl9tYXRjaGVyXywgc2Vjb25kX3ZhbHVlXykpOwotICB9Ci0KLSAgLy8gV2UgaGF2ZSB0byBkZWZpbmUgdGhpcyBmb3IgVW5vcmRlcmVkUG9pbnR3aXNlKCkgdG8gY29tcGlsZSBpbgotICAvLyBDKys5OCBtb2RlLCBhcyBpdCBwdXRzIEJvdW5kU2Vjb25kTWF0Y2hlciBpbnN0YW5jZXMgaW4gYSB2ZWN0b3IsCi0gIC8vIHdoaWNoIHJlcXVpcmVzIHRoZSBlbGVtZW50cyB0byBiZSBhc3NpZ25hYmxlIGluIEMrKzk4LiAgVGhlCi0gIC8vIGNvbXBpbGVyIGNhbm5vdCBnZW5lcmF0ZSB0aGUgb3BlcmF0b3I9IGZvciB1cywgYXMgVHVwbGUyTWF0Y2hlcgotICAvLyBhbmQgU2Vjb25kIG1heSBub3QgYmUgYXNzaWduYWJsZS4KLSAgLy8KLSAgLy8gSG93ZXZlciwgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLCBzbyB0aGUgaW1wbGVtZW50YXRpb24ganVzdAotICAvLyBuZWVkIHRvIGFzc2VydC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQm91bmRTZWNvbmRNYXRjaGVyJiAvKnJocyovKSB7Ci0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkJvdW5kU2Vjb25kTWF0Y2hlciBzaG91bGQgbmV2ZXIgYmUgYXNzaWduZWQuIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQsIFNlY29uZD4gQXJnVHVwbGU7Ci0KLSAgICBJbXBsKGNvbnN0IFR1cGxlMk1hdGNoZXImIHRtLCBjb25zdCBTZWNvbmQmIHNlY29uZCkKLSAgICAgICAgOiBtb25vX3R1cGxlMl9tYXRjaGVyXyhTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgQXJnVHVwbGUmPih0bSkpLAotICAgICAgICAgIHNlY29uZF92YWx1ZV8oc2Vjb25kKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImFuZCAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQoc2Vjb25kX3ZhbHVlXywgb3MpOwotICAgICAgKm9zIDw8ICIgIjsKLSAgICAgIG1vbm9fdHVwbGUyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgcmV0dXJuIG1vbm9fdHVwbGUyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihBcmdUdXBsZSh4LCBzZWNvbmRfdmFsdWVfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPGNvbnN0IEFyZ1R1cGxlJj4gbW9ub190dXBsZTJfbWF0Y2hlcl87Ci0gICAgY29uc3QgU2Vjb25kIHNlY29uZF92YWx1ZV87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIGNvbnN0IFR1cGxlMk1hdGNoZXIgdHVwbGUyX21hdGNoZXJfOwotICBjb25zdCBTZWNvbmQgc2Vjb25kX3ZhbHVlXzsKLX07Ci0KLS8vIEdpdmVuIGEgMi10dXBsZSBtYXRjaGVyIHRtIGFuZCBhIHZhbHVlIHNlY29uZCwKLS8vIE1hdGNoZXJCaW5kU2Vjb25kKHRtLCBzZWNvbmQpIHJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhCi0vLyB2YWx1ZSB4IGlmZiB0bSBtYXRjaGVzIHR1cGxlICh4LCBzZWNvbmQpLiAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLS8vIFVub3JkZXJlZFBvaW50d2lzZSgpIGluIHRlcm1zIG9mIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmQ+Ci1Cb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgU2Vjb25kPiBNYXRjaGVyQmluZFNlY29uZCgKLSAgICBjb25zdCBUdXBsZTJNYXRjaGVyJiB0bSwgY29uc3QgU2Vjb25kJiBzZWNvbmQpIHsKLSAgcmV0dXJuIEJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBTZWNvbmQ+KHRtLCBzZWNvbmQpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBtYXRjaGVyIGRlZmluZWQgdXNpbmcgdGhlIE1BVENIRVIqKCkKLS8vIG1hY3JvIHdoZXJlIHRoZSB1c2VyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIHN0cmluZyBpcyAiIiwgaWYKLS8vICduZWdhdGlvbicgaXMgZmFsc2U7IG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLS8vIG5lZ2F0aW9uIG9mIHRoZSBtYXRjaGVyLiAgJ3BhcmFtX3ZhbHVlcycgY29udGFpbnMgYSBsaXN0IG9mIHN0cmluZ3MKLS8vIHRoYXQgYXJlIHRoZSBwcmludC1vdXQgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzLgotR1RFU1RfQVBJXyBzdHJpbmcgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF0Y2hlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3MmIHBhcmFtX3ZhbHVlcyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBFbGVtZW50c0FyZUFycmF5KGZpcnN0LCBsYXN0KQotLy8gRWxlbWVudHNBcmVBcnJheShwb2ludGVyLCBjb3VudCkKLS8vIEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpCi0vLyBFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lcikKLS8vIEVsZW1lbnRzQXJlQXJyYXkoeyBlMSwgZTIsIC4uLiwgZW4gfSkKLS8vCi0vLyBUaGUgRWxlbWVudHNBcmVBcnJheSgpIGZ1bmN0aW9ucyBhcmUgbGlrZSBFbGVtZW50c0FyZSguLi4pLCBleGNlcHQKLS8vIHRoYXQgdGhleSBhcmUgZ2l2ZW4gYSBob21vZ2VuZW91cyBzZXF1ZW5jZSByYXRoZXIgdGhhbiB0YWtpbmcgZWFjaAotLy8gZWxlbWVudCBhcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LiBUaGUgc2VxdWVuY2UgY2FuIGJlIHNwZWNpZmllZCBhcyBhbgotLy8gYXJyYXksIGEgcG9pbnRlciBhbmQgY291bnQsIGEgdmVjdG9yLCBhbiBpbml0aWFsaXplciBsaXN0LCBvciBhbgotLy8gU1RMIGl0ZXJhdG9yIHJhbmdlLiBJbiBlYWNoIG9mIHRoZXNlIGNhc2VzLCB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZQotLy8gY2FuIGJlIGVpdGhlciBhIHNlcXVlbmNlIG9mIHZhbHVlcyBvciBhIHNlcXVlbmNlIG9mIG1hdGNoZXJzLgotLy8KLS8vIEFsbCBmb3JtcyBvZiBFbGVtZW50c0FyZUFycmF5KCkgbWFrZSBhIGNvcHkgb2YgdGhlIGlucHV0IG1hdGNoZXIgc2VxdWVuY2UuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlPgotRWxlbWVudHNBcmVBcnJheShJdGVyIGZpcnN0LCBJdGVyIGxhc3QpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlIFQ7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4oZmlyc3QsIGxhc3QpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4gRWxlbWVudHNBcmVBcnJheSgKLSAgICBjb25zdCBUKiBwb2ludGVyLCBzaXplX3QgY291bnQpIHsKLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgcG9pbnRlciArIGNvdW50KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPiBFbGVtZW50c0FyZUFycmF5KAotICAgIGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkoYXJyYXksIE4pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+Ci1FbGVtZW50c0FyZUFycmF5KGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7Ci0gIHJldHVybiBFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+Ci1FbGVtZW50c0FyZUFycmF5KDo6c3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHhzKSB7Ci0gIHJldHVybiBFbGVtZW50c0FyZUFycmF5KHhzLmJlZ2luKCksIHhzLmVuZCgpKTsKLX0KLSNlbmRpZgotCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGZpcnN0LCBsYXN0KQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShwb2ludGVyLCBjb3VudCkKLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lcikKLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeyBlMSwgZTIsIC4uLiwgZW4gfSkKLS8vCi0vLyBUaGUgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpIGZ1bmN0aW9ucyBhcmUgbGlrZQotLy8gRWxlbWVudHNBcmVBcnJheSguLi4pLCBidXQgYWxsb3cgbWF0Y2hpbmcgdGhlIGVsZW1lbnRzIGluIGFueSBvcmRlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlPgotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShJdGVyIGZpcnN0LCBJdGVyIGxhc3QpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlIFQ7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4oZmlyc3QsIGxhc3QpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgVCogcG9pbnRlciwgc2l6ZV90IGNvdW50KSB7Ci0gIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBjb3VudCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgVCAoJmFycmF5KVtOXSkgewotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShhcnJheSwgTik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPAotICAgIHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoOjpzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4geHMpIHsKLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeHMuYmVnaW4oKSwgeHMuZW5kKCkpOwotfQotI2VuZGlmCi0KLS8vIF8gaXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyBvZiBhbnkgdHlwZS4KLS8vCi0vLyBUaGlzIGRlZmluaXRpb24gaXMgZmluZSBhczoKLS8vCi0vLyAgIDEuIFRoZSBDKysgc3RhbmRhcmQgcGVybWl0cyB1c2luZyB0aGUgbmFtZSBfIGluIGEgbmFtZXNwYWNlIHRoYXQKLS8vICAgICAgaXMgbm90IHRoZSBnbG9iYWwgbmFtZXNwYWNlIG9yIDo6c3RkLgotLy8gICAyLiBUaGUgQW55dGhpbmdNYXRjaGVyIGNsYXNzIGhhcyBubyBkYXRhIG1lbWJlciBvciBjb25zdHJ1Y3RvciwKLS8vICAgICAgc28gaXQncyBPSyB0byBjcmVhdGUgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0aGlzIHR5cGUuCi0vLyAgIDMuIGMtc3R5bGUgaGFzIGFwcHJvdmVkIG9mIHVzaW5nIF8gaW4gdGhpcyBjYXNlLgotY29uc3QgaW50ZXJuYWw6OkFueXRoaW5nTWF0Y2hlciBfID0ge307Ci0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHRoZSBnaXZlbiB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBNYXRjaGVyPFQ+IEEoKSB7IHJldHVybiBNYWtlTWF0Y2hlcihuZXcgaW50ZXJuYWw6OkFueU1hdGNoZXJJbXBsPFQ+KCkpOyB9Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIE1hdGNoZXI8VD4gQW4oKSB7IHJldHVybiBBPFQ+KCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIGVxdWFsIHRvIHguCi0vLyBOb3RlOiBpZiB0aGUgcGFyYW1ldGVyIG9mIEVxKCkgd2VyZSBkZWNsYXJlZCBhcyBjb25zdCBUJiwgRXEoImZvbyIpCi0vLyB3b3VsZG4ndCBjb21waWxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ZXJuYWw6OkVxTWF0Y2hlcjxUPiBFcShUIHgpIHsgcmV0dXJuIGludGVybmFsOjpFcU1hdGNoZXI8VD4oeCk7IH0KLQotLy8gQ29uc3RydWN0cyBhIE1hdGNoZXI8VD4gZnJvbSBhICd2YWx1ZScgb2YgdHlwZSBULiAgVGhlIGNvbnN0cnVjdGVkCi0vLyBtYXRjaGVyIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQncyBlcXVhbCB0byAndmFsdWUnLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1NYXRjaGVyPFQ+OjpNYXRjaGVyKFQgdmFsdWUpIHsgKnRoaXMgPSBFcSh2YWx1ZSk7IH0KLQotLy8gQ3JlYXRlcyBhIG1vbm9tb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIHdpdGggdHlwZSBMaHMKLS8vIGFuZCBlcXVhbCB0byByaHMuICBBIHVzZXIgbWF5IG5lZWQgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiBFcSguLi4pCi0vLyBpbiBvcmRlciB0byByZXNvbHZlIGFuIG92ZXJsb2FkaW5nIGFtYmlndWl0eS4KLS8vCi0vLyBUeXBlZEVxPFQ+KHgpIGlzIGp1c3QgYSBjb252ZW5pZW50IHNob3J0LWhhbmQgZm9yIE1hdGNoZXI8VD4oRXEoeCkpCi0vLyBvciBNYXRjaGVyPFQ+KHgpLCBidXQgbW9yZSByZWFkYWJsZSB0aGFuIHRoZSBsYXR0ZXIuCi0vLwotLy8gV2UgY291bGQgZGVmaW5lIHNpbWlsYXIgbW9ub21vcnBoaWMgbWF0Y2hlcnMgZm9yIG90aGVyIGNvbXBhcmlzb24KLS8vIG9wZXJhdGlvbnMgKGUuZy4gVHlwZWRMdCwgVHlwZWRHZSwgYW5kIGV0YyksIGJ1dCBkZWNpZGVkIG5vdCB0byBkbwotLy8gaXQgeWV0IGFzIHRob3NlIGFyZSB1c2VkIG11Y2ggbGVzcyB0aGFuIEVxKCkgaW4gcHJhY3RpY2UuICBBIHVzZXIKLS8vIGNhbiBhbHdheXMgd3JpdGUgTWF0Y2hlcjxUPihMdCg1KSkgdG8gYmUgZXhwbGljaXQgYWJvdXQgdGhlIHR5cGUsCi0vLyBmb3IgZXhhbXBsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KLWlubGluZSBNYXRjaGVyPExocz4gVHlwZWRFcShjb25zdCBSaHMmIHJocykgeyByZXR1cm4gRXEocmhzKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPj0geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6OkdlTWF0Y2hlcjxSaHM+IEdlKFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6R2VNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA+IHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotaW5saW5lIGludGVybmFsOjpHdE1hdGNoZXI8UmhzPiBHdChSaHMgeCkgewotICByZXR1cm4gaW50ZXJuYWw6Okd0TWF0Y2hlcjxSaHM+KHgpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPD0geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6OkxlTWF0Y2hlcjxSaHM+IExlKFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6TGVNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA8IHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotaW5saW5lIGludGVybmFsOjpMdE1hdGNoZXI8UmhzPiBMdChSaHMgeCkgewotICByZXR1cm4gaW50ZXJuYWw6Okx0TWF0Y2hlcjxSaHM+KHgpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgIT0geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6Ok5lTWF0Y2hlcjxSaHM+IE5lKFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6TmVNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgTlVMTCBwb2ludGVyLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SXNOdWxsTWF0Y2hlciA+IElzTnVsbCgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OklzTnVsbE1hdGNoZXIoKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgbm9uLU5VTEwgcG9pbnRlci4KLS8vIFRoaXMgaXMgY29udmVuaWVudCBhcyBOb3QoTlVMTCkgZG9lc24ndCBjb21waWxlICh0aGUgY29tcGlsZXIKLS8vIHRoaW5rcyB0aGF0IHRoYXQgZXhwcmVzc2lvbiBpcyBjb21wYXJpbmcgYSBwb2ludGVyIHdpdGggYW4gaW50ZWdlcikuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpOb3ROdWxsTWF0Y2hlciA+IE5vdE51bGwoKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpOb3ROdWxsTWF0Y2hlcigpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBhcmd1bWVudCB0aGF0Ci0vLyByZWZlcmVuY2VzIHZhcmlhYmxlIHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6UmVmTWF0Y2hlcjxUJj4gUmVmKFQmIHgpIHsgIC8vIE5PTElOVAotICByZXR1cm4gaW50ZXJuYWw6OlJlZk1hdGNoZXI8VCY+KHgpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5Ci0vLyBlcXVhbCB0byByaHMsIHdoZXJlIHR3byBOQU5zIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gRG91YmxlRXEoZG91YmxlIHJocykgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4ocmhzLCBmYWxzZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZG91YmxlIGFyZ3VtZW50IGFwcHJveGltYXRlbHkKLS8vIGVxdWFsIHRvIHJocywgaW5jbHVkaW5nIE5hTiB2YWx1ZXMgd2hlbiByaHMgaXMgTmFOLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+IE5hblNlbnNpdGl2ZURvdWJsZUVxKGRvdWJsZSByaHMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+KHJocywgdHJ1ZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZG91YmxlIGFyZ3VtZW50IGFwcHJveGltYXRlbHkgZXF1YWwgdG8KLS8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIHdoZXJlIHR3byBOQU5zIGFyZQotLy8gY29uc2lkZXJlZCB1bmVxdWFsLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPiBEb3VibGVOZWFyKAotICAgIGRvdWJsZSByaHMsIGRvdWJsZSBtYXhfYWJzX2Vycm9yKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIGZhbHNlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bwotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgaW5jbHVkaW5nIE5hTiB2YWx1ZXMgd2hlbgotLy8gcmhzIGlzIE5hTi4gIFRoZSBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQgbXVzdCBiZSBub24tbmVnYXRpdmUuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gTmFuU2Vuc2l0aXZlRG91YmxlTmVhcigKLSAgICBkb3VibGUgcmhzLCBkb3VibGUgbWF4X2Fic19lcnJvcikgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4ocmhzLCB0cnVlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5Ci0vLyBlcXVhbCB0byByaHMsIHdoZXJlIHR3byBOQU5zIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBGbG9hdEVxKGZsb2F0IHJocykgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PihyaHMsIGZhbHNlKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5Ci0vLyBlcXVhbCB0byByaHMsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4gcmhzIGlzIE5hTi4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+IE5hblNlbnNpdGl2ZUZsb2F0RXEoZmxvYXQgcmhzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+KHJocywgdHJ1ZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZmxvYXQgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bwotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgd2hlcmUgdHdvIE5BTnMgYXJlCi0vLyBjb25zaWRlcmVkIHVuZXF1YWwuICBUaGUgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4gRmxvYXROZWFyKAotICAgIGZsb2F0IHJocywgZmxvYXQgbWF4X2Fic19lcnJvcikgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PihyaHMsIGZhbHNlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvCi0vLyByaHMsIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kLCBpbmNsdWRpbmcgTmFOIHZhbHVlcyB3aGVuCi0vLyByaHMgaXMgTmFOLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+IE5hblNlbnNpdGl2ZUZsb2F0TmVhcigKLSAgICBmbG9hdCByaHMsIGZsb2F0IG1heF9hYnNfZXJyb3IpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCB0cnVlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgcG9pbnRlciAocmF3IG9yIHNtYXJ0KSB0aGF0IHBvaW50cwotLy8gdG8gYSB2YWx1ZSB0aGF0IG1hdGNoZXMgaW5uZXJfbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlBvaW50ZWVNYXRjaGVyPElubmVyTWF0Y2hlcj4gUG9pbnRlZSgKLSAgICBjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpQb2ludGVlTWF0Y2hlcjxJbm5lck1hdGNoZXI+KGlubmVyX21hdGNoZXIpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSB0aGF0IG1hdGNoZXMKLS8vIGlubmVyX21hdGNoZXIgd2hlbiBkeW5hbWljX2Nhc3Q8VG8+IGlzIGFwcGxpZWQuCi0vLyBUaGUgcmVzdWx0IG9mIGR5bmFtaWNfY2FzdDxUbz4gaXMgZm9yd2FyZGVkIHRvIHRoZSBpbm5lciBtYXRjaGVyLgotLy8gSWYgVG8gaXMgYSBwb2ludGVyIGFuZCB0aGUgY2FzdCBmYWlscywgdGhlIGlubmVyIG1hdGNoZXIgd2lsbCByZWNlaXZlIE5VTEwuCi0vLyBJZiBUbyBpcyBhIHJlZmVyZW5jZSBhbmQgdGhlIGNhc3QgZmFpbHMsIHRoaXMgbWF0Y2hlciByZXR1cm5zIGZhbHNlCi0vLyBpbW1lZGlhdGVseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OldoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcjxUbz4gPgotV2hlbkR5bmFtaWNDYXN0VG8oY29uc3QgTWF0Y2hlcjxUbz4mIGlubmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoCi0gICAgICBpbnRlcm5hbDo6V2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyPFRvPihpbm5lcl9tYXRjaGVyKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgbWF0Y2hlcwotLy8gJ21hdGNoZXInLiAgRm9yIGV4YW1wbGUsCi0vLyAgIEZpZWxkKCZGb286Om51bWJlciwgR2UoNSkpCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiB4Lm51bWJlciA+PSA1LgotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBGaWVsZFR5cGUsIHR5cGVuYW1lIEZpZWxkTWF0Y2hlcj4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8Ci0gIGludGVybmFsOjpGaWVsZE1hdGNoZXI8Q2xhc3MsIEZpZWxkVHlwZT4gPiBGaWVsZCgKLSAgICBGaWVsZFR5cGUgQ2xhc3M6OipmaWVsZCwgY29uc3QgRmllbGRNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKAotICAgICAgaW50ZXJuYWw6OkZpZWxkTWF0Y2hlcjxDbGFzcywgRmllbGRUeXBlPigKLSAgICAgICAgICBmaWVsZCwgTWF0Y2hlckNhc3Q8Y29uc3QgRmllbGRUeXBlJj4obWF0Y2hlcikpKTsKLSAgLy8gVGhlIGNhbGwgdG8gTWF0Y2hlckNhc3QoKSBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyBpbm5lcgotICAvLyBtYXRjaGVycyBvZiBjb21wYXRpYmxlIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGl0IGFsbG93cwotICAvLyAgIEZpZWxkKCZGb286OmJhciwgbSkKLSAgLy8gdG8gY29tcGlsZSB3aGVyZSBiYXIgaXMgYW4gaW50MzIgYW5kIG0gaXMgYSBtYXRjaGVyIGZvciBpbnQ2NC4KLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eQotLy8gbWF0Y2hlcyAnbWF0Y2hlcicuICBGb3IgZXhhbXBsZSwKLS8vICAgUHJvcGVydHkoJkZvbzo6c3RyLCBTdGFydHNXaXRoKCJoaSIpKQotLy8gbWF0Y2hlcyBhIEZvbyBvYmplY3QgeCBpZmYgeC5zdHIoKSBzdGFydHMgd2l0aCAiaGkiLgotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBQcm9wZXJ0eVR5cGUsIHR5cGVuYW1lIFByb3BlcnR5TWF0Y2hlcj4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8Ci0gIGludGVybmFsOjpQcm9wZXJ0eU1hdGNoZXI8Q2xhc3MsIFByb3BlcnR5VHlwZT4gPiBQcm9wZXJ0eSgKLSAgICBQcm9wZXJ0eVR5cGUgKENsYXNzOjoqcHJvcGVydHkpKCkgY29uc3QsIGNvbnN0IFByb3BlcnR5TWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigKLSAgICAgIGludGVybmFsOjpQcm9wZXJ0eU1hdGNoZXI8Q2xhc3MsIFByb3BlcnR5VHlwZT4oCi0gICAgICAgICAgcHJvcGVydHksCi0gICAgICAgICAgTWF0Y2hlckNhc3Q8R1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhQcm9wZXJ0eVR5cGUpPihtYXRjaGVyKSkpOwotICAvLyBUaGUgY2FsbCB0byBNYXRjaGVyQ2FzdCgpIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIGlubmVyCi0gIC8vIG1hdGNoZXJzIG9mIGNvbXBhdGlibGUgdHlwZXMuICBGb3IgZXhhbXBsZSwgaXQgYWxsb3dzCi0gIC8vICAgUHJvcGVydHkoJkZvbzo6YmFyLCBtKQotICAvLyB0byBjb21waWxlIHdoZXJlIGJhcigpIHJldHVybnMgYW4gaW50MzIgYW5kIG0gaXMgYSBtYXRjaGVyIGZvciBpbnQ2NC4KLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIG9iamVjdCBpZmYgdGhlIHJlc3VsdCBvZiBhcHBseWluZwotLy8gYSBjYWxsYWJsZSB0byB4IG1hdGNoZXMgJ21hdGNoZXInLgotLy8gRm9yIGV4YW1wbGUsCi0vLyAgIFJlc3VsdE9mKGYsIFN0YXJ0c1dpdGgoImhpIikpCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiBmKHgpIHN0YXJ0cyB3aXRoICJoaSIuCi0vLyBjYWxsYWJsZSBwYXJhbWV0ZXIgY2FuIGJlIGEgZnVuY3Rpb24sIGZ1bmN0aW9uIHBvaW50ZXIsIG9yIGEgZnVuY3Rvci4KLS8vIENhbGxhYmxlIGhhcyB0byBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vICAgKiBJdCBpcyByZXF1aXJlZCB0byBrZWVwIG5vIHN0YXRlIGFmZmVjdGluZyB0aGUgcmVzdWx0cyBvZgotLy8gICAgIHRoZSBjYWxscyBvbiBpdCBhbmQgbWFrZSBubyBhc3N1bXB0aW9ucyBhYm91dCBob3cgbWFueSBjYWxscwotLy8gICAgIHdpbGwgYmUgbWFkZS4gQW55IHN0YXRlIGl0IGtlZXBzIG11c3QgYmUgcHJvdGVjdGVkIGZyb20gdGhlCi0vLyAgICAgY29uY3VycmVudCBhY2Nlc3MuCi0vLyAgICogSWYgaXQgaXMgYSBmdW5jdGlvbiBvYmplY3QsIGl0IGhhcyB0byBkZWZpbmUgdHlwZSByZXN1bHRfdHlwZS4KLS8vICAgICBXZSByZWNvbW1lbmQgZGVyaXZpbmcgeW91ciBmdW5jdG9yIGNsYXNzZXMgZnJvbSBzdGQ6OnVuYXJ5X2Z1bmN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlLCB0eXBlbmFtZSBSZXN1bHRPZk1hdGNoZXI+Ci1pbnRlcm5hbDo6UmVzdWx0T2ZNYXRjaGVyPENhbGxhYmxlPiBSZXN1bHRPZigKLSAgICBDYWxsYWJsZSBjYWxsYWJsZSwgY29uc3QgUmVzdWx0T2ZNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UmVzdWx0T2ZNYXRjaGVyPENhbGxhYmxlPigKLSAgICAgICAgICBjYWxsYWJsZSwKLSAgICAgICAgICBNYXRjaGVyQ2FzdDx0eXBlbmFtZSBpbnRlcm5hbDo6Q2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpSZXN1bHRUeXBlPigKLSAgICAgICAgICAgICAgbWF0Y2hlcikpOwotICAvLyBUaGUgY2FsbCB0byBNYXRjaGVyQ2FzdCgpIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIGlubmVyCi0gIC8vIG1hdGNoZXJzIG9mIGNvbXBhdGlibGUgdHlwZXMuICBGb3IgZXhhbXBsZSwgaXQgYWxsb3dzCi0gIC8vICAgUmVzdWx0T2YoRnVuY3Rpb24sIG0pCi0gIC8vIHRvIGNvbXBpbGUgd2hlcmUgRnVuY3Rpb24oKSByZXR1cm5zIGFuIGludDMyIGFuZCBtIGlzIGEgbWF0Y2hlciBmb3IgaW50NjQuCi19Ci0KLS8vIFN0cmluZyBtYXRjaGVycy4KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgotICAgIFN0ckVxKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAotICAgICAgc3RyLCB0cnVlLCB0cnVlKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ci4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgU3RyTmUoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBzdHIsIGZhbHNlLCB0cnVlKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBTdHJDYXNlRXEoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBzdHIsIHRydWUsIGZhbHNlKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgU3RyQ2FzZU5lKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAotICAgICAgc3RyLCBmYWxzZSwgZmFsc2UpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcsIHN0ZDo6c3RyaW5nLCBvciBDIHN0cmluZwotLy8gdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgSGFzU3Vic3RyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN1YnN0cmluZykgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHN1YnN0cmluZykpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ3ByZWZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0YXJ0c1dpdGhNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBTdGFydHNXaXRoKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHByZWZpeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RhcnRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBwcmVmaXgpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGVuZHMgd2l0aCAnc3VmZml4JyAoY2FzZS1zZW5zaXRpdmUpLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBFbmRzV2l0aChjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdWZmaXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OkVuZHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHN1ZmZpeCkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgZnVsbHkgbWF0Y2hlcyByZWd1bGFyIGV4cHJlc3Npb24gJ3JlZ2V4Jy4KLS8vIFRoZSBtYXRjaGVyIHRha2VzIG93bmVyc2hpcCBvZiAncmVnZXgnLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gTWF0Y2hlc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpSRSogcmVnZXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXIocmVnZXgsIHRydWUpKTsKLX0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXI+IE1hdGNoZXNSZWdleCgKLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiByZWdleCkgewotICByZXR1cm4gTWF0Y2hlc1JlZ2V4KG5ldyBpbnRlcm5hbDo6UkUocmVnZXgpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIHJlZ3VsYXIgZXhwcmVzc2lvbiAncmVnZXgnLgotLy8gVGhlIG1hdGNoZXIgdGFrZXMgb3duZXJzaGlwIG9mICdyZWdleCcuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBDb250YWluc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpSRSogcmVnZXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXIocmVnZXgsIGZhbHNlKSk7Ci19Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBDb250YWluc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHJlZ2V4KSB7Ci0gIHJldHVybiBDb250YWluc1JlZ2V4KG5ldyBpbnRlcm5hbDo6UkUocmVnZXgpKTsKLX0KLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyB8fCBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLS8vIFdpZGUgc3RyaW5nIG1hdGNoZXJzLgotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ci4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgotICAgIFN0ckVxKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCi0gICAgICBzdHIsIHRydWUsIHRydWUpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RyTmUoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN0ciwgZmFsc2UsIHRydWUpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIsIGlnbm9yaW5nIGNhc2UuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KLSAgICBTdHJDYXNlRXEoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN0ciwgdHJ1ZSwgZmFsc2UpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RyQ2FzZU5lKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCi0gICAgICBzdHIsIGZhbHNlLCBmYWxzZSkpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHdzdHJpbmcsIHN0ZDo6d3N0cmluZywgb3IgQyB3aWRlIHN0cmluZwotLy8gdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgotICAgIEhhc1N1YnN0cihjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3Vic3RyaW5nKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpIYXNTdWJzdHJNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN1YnN0cmluZykpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ3ByZWZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0YXJ0c1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RhcnRzV2l0aChjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgcHJlZml4KSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCi0gICAgICBwcmVmaXgpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGVuZHMgd2l0aCAnc3VmZml4JyAoY2FzZS1zZW5zaXRpdmUpLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgRW5kc1dpdGgoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN1ZmZpeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN1ZmZpeCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyB8fCBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkID09IHRoZSBzZWNvbmQgZmllbGQuCi1pbmxpbmUgaW50ZXJuYWw6OkVxMk1hdGNoZXIgRXEoKSB7IHJldHVybiBpbnRlcm5hbDo6RXEyTWF0Y2hlcigpOyB9Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCi0vLyBmaXJzdCBmaWVsZCA+PSB0aGUgc2Vjb25kIGZpZWxkLgotaW5saW5lIGludGVybmFsOjpHZTJNYXRjaGVyIEdlKCkgeyByZXR1cm4gaW50ZXJuYWw6OkdlMk1hdGNoZXIoKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgPiB0aGUgc2Vjb25kIGZpZWxkLgotaW5saW5lIGludGVybmFsOjpHdDJNYXRjaGVyIEd0KCkgeyByZXR1cm4gaW50ZXJuYWw6Okd0Mk1hdGNoZXIoKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgPD0gdGhlIHNlY29uZCBmaWVsZC4KLWlubGluZSBpbnRlcm5hbDo6TGUyTWF0Y2hlciBMZSgpIHsgcmV0dXJuIGludGVybmFsOjpMZTJNYXRjaGVyKCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkIDwgdGhlIHNlY29uZCBmaWVsZC4KLWlubGluZSBpbnRlcm5hbDo6THQyTWF0Y2hlciBMdCgpIHsgcmV0dXJuIGludGVybmFsOjpMdDJNYXRjaGVyKCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkICE9IHRoZSBzZWNvbmQgZmllbGQuCi1pbmxpbmUgaW50ZXJuYWw6Ok5lMk1hdGNoZXIgTmUoKSB7IHJldHVybiBpbnRlcm5hbDo6TmUyTWF0Y2hlcigpOyB9Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdHlwZSBUIHRoYXQgbSBkb2Vzbid0Ci0vLyBtYXRjaC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6Ok5vdE1hdGNoZXI8SW5uZXJNYXRjaGVyPiBOb3QoSW5uZXJNYXRjaGVyIG0pIHsKLSAgcmV0dXJuIGludGVybmFsOjpOb3RNYXRjaGVyPElubmVyTWF0Y2hlcj4obSk7Ci19Ci0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyB0aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4KLS8vIHByZWRpY2F0ZS4gIFRoZSBwcmVkaWNhdGUgY2FuIGJlIGFueSB1bmFyeSBmdW5jdGlvbiBvciBmdW5jdG9yCi0vLyB3aG9zZSByZXR1cm4gdHlwZSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYm9vbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkaWNhdGU+Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpUcnVseU1hdGNoZXI8UHJlZGljYXRlPiA+Ci1UcnVseShQcmVkaWNhdGUgcHJlZCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6VHJ1bHlNYXRjaGVyPFByZWRpY2F0ZT4ocHJlZCkpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgdGhlIGNvbnRhaW5lciBzaXplLiBUaGUgY29udGFpbmVyIG11c3QKLS8vIHN1cHBvcnQgYm90aCBzaXplKCkgYW5kIHNpemVfdHlwZSB3aGljaCBhbGwgU1RMLWxpa2UgY29udGFpbmVycyBwcm92aWRlLgotLy8gTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgJ3NpemUnIGNhbiBiZSBhIHZhbHVlIG9mIHR5cGUgc2l6ZV90eXBlIGFzIHdlbGwgYXMKLS8vIG1hdGNoZXIuIEZvciBpbnN0YW5jZToKLS8vICAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoMikpOyAgICAgLy8gQ2hlY2tzIGNvbnRhaW5lciBoYXMgMiBlbGVtZW50cy4KLS8vICAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoTGUoMikpOyAgLy8gQ2hlY2tzIGNvbnRhaW5lciBoYXMgYXQgbW9zdCAyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFNpemVNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpTaXplSXNNYXRjaGVyPFNpemVNYXRjaGVyPgotU2l6ZUlzKGNvbnN0IFNpemVNYXRjaGVyJiBzaXplX21hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpTaXplSXNNYXRjaGVyPFNpemVNYXRjaGVyPihzaXplX21hdGNoZXIpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNvbnRhaW5lcidzIGJlZ2luKCkKLS8vIGl0ZXJhdG9yIGFuZCBpdHMgZW5kKCkgaXRlcmF0b3IsIGkuZS4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4gVGhpcyBtYXRjaGVyCi0vLyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIFNpemVJcyB3aXRoIGNvbnRhaW5lcnMgc3VjaCBhcyBzdGQ6OmZvcndhcmRfbGlzdCB3aGljaAotLy8gZG8gbm90IGltcGxlbWVudCBzaXplKCkuIFRoZSBjb250YWluZXIgbXVzdCBwcm92aWRlIGNvbnN0X2l0ZXJhdG9yICh3aXRoCi0vLyB2YWxpZCBpdGVyYXRvcl90cmFpdHMpLCBiZWdpbigpIGFuZCBlbmQoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXN0YW5jZU1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXI8RGlzdGFuY2VNYXRjaGVyPgotQmVnaW5FbmREaXN0YW5jZUlzKGNvbnN0IERpc3RhbmNlTWF0Y2hlciYgZGlzdGFuY2VfbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXI8RGlzdGFuY2VNYXRjaGVyPihkaXN0YW5jZV9tYXRjaGVyKTsKLX0KLQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIGVxdWFsIGNvbnRhaW5lci4KLS8vIFRoaXMgbWF0Y2hlciBiZWhhdmVzIGxpa2UgRXEoKSwgYnV0IGluIHRoZSBldmVudCBvZiBtaXNtYXRjaCBsaXN0cyB0aGUKLS8vIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBvbmUgY29udGFpbmVyIGJ1dCBub3QgdGhlIG90aGVyLiAoRHVwbGljYXRlCi0vLyB2YWx1ZXMgYW5kIG9yZGVyIGRpZmZlcmVuY2VzIGFyZSBub3QgZXhwbGFpbmVkLikKLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpDb250YWluZXJFcU1hdGNoZXI8ICAvLyBOT0xJTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9SRU1PVkVfQ09OU1RfKENvbnRhaW5lcik+ID4KLSAgICBDb250YWluZXJFcShjb25zdCBDb250YWluZXImIHJocykgewotICAvLyBUaGlzIGZvbGxvd2luZyBsaW5lIGlzIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwKLSAgLy8gd2hpY2ggY2F1c2VzIENvbnRhaW5lciB0byBiZSBhIGNvbnN0IHR5cGUgc29tZXRpbWVzLgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKAotICAgICAgaW50ZXJuYWw6OkNvbnRhaW5lckVxTWF0Y2hlcjxSYXdDb250YWluZXI+KHJocykpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb250YWluZXIgdGhhdCwgd2hlbiBzb3J0ZWQgdXNpbmcKLS8vIHRoZSBnaXZlbiBjb21wYXJhdG9yLCBtYXRjaGVzIGNvbnRhaW5lcl9tYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmF0b3IsIHR5cGVuYW1lIENvbnRhaW5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8Q29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4KLVdoZW5Tb3J0ZWRCeShjb25zdCBDb21wYXJhdG9yJiBjb21wYXJhdG9yLAotICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lck1hdGNoZXImIGNvbnRhaW5lcl9tYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2hlblNvcnRlZEJ5TWF0Y2hlcjxDb21wYXJhdG9yLCBDb250YWluZXJNYXRjaGVyPigKLSAgICAgIGNvbXBhcmF0b3IsIGNvbnRhaW5lcl9tYXRjaGVyKTsKLX0KLQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29udGFpbmVyIHRoYXQsIHdoZW4gc29ydGVkIHVzaW5nCi0vLyB0aGUgPCBvcGVyYXRvciwgbWF0Y2hlcyBjb250YWluZXJfbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPGludGVybmFsOjpMZXNzQ29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4KLVdoZW5Tb3J0ZWQoY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgY29udGFpbmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuCi0gICAgICBpbnRlcm5hbDo6V2hlblNvcnRlZEJ5TWF0Y2hlcjxpbnRlcm5hbDo6TGVzc0NvbXBhcmF0b3IsIENvbnRhaW5lck1hdGNoZXI+KAotICAgICAgICAgIGludGVybmFsOjpMZXNzQ29tcGFyYXRvcigpLCBjb250YWluZXJfbWF0Y2hlcik7Ci19Ci0KLS8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZQotLy8gc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW4gcmhzLCB3aGVyZSBpdHMgaS10aCBlbGVtZW50IGFuZCByaHMncwotLy8gaS10aCBlbGVtZW50IChhcyBhIHBhaXIpIHNhdGlzZnkgdGhlIGdpdmVuIHBhaXIgbWF0Y2hlciwgZm9yIGFsbCBpLgotLy8gVHVwbGVNYXRjaGVyIG11c3QgYmUgYWJsZSB0byBiZSBzYWZlbHkgY2FzdCB0byBNYXRjaGVyPHR1cGxlPGNvbnN0Ci0vLyBUMSYsIGNvbnN0IFQyJj4gPiwgd2hlcmUgVDEgYW5kIFQyIGFyZSB0aGUgdHlwZXMgb2YgZWxlbWVudHMgaW4gdGhlCi0vLyBMSFMgY29udGFpbmVyIGFuZCB0aGUgUkhTIGNvbnRhaW5lciByZXNwZWN0aXZlbHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVNYXRjaGVyLCB0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlBvaW50d2lzZU1hdGNoZXI8VHVwbGVNYXRjaGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKT4KLVBvaW50d2lzZShjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IENvbnRhaW5lciYgcmhzKSB7Ci0gIC8vIFRoaXMgZm9sbG93aW5nIGxpbmUgaXMgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLAotICAvLyB3aGljaCBjYXVzZXMgQ29udGFpbmVyIHRvIGJlIGEgY29uc3QgdHlwZSBzb21ldGltZXMgKGUuZy4gd2hlbgotICAvLyByaHMgaXMgYSBjb25zdCBpbnRbXSkuLgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7Ci0gIHJldHVybiBpbnRlcm5hbDo6UG9pbnR3aXNlTWF0Y2hlcjxUdXBsZU1hdGNoZXIsIFJhd0NvbnRhaW5lcj4oCi0gICAgICB0dXBsZV9tYXRjaGVyLCByaHMpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi0vLyBTdXBwb3J0cyB0aGUgUG9pbnR3aXNlKG0sIHthLCBiLCBjfSkgc3ludGF4LgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlTWF0Y2hlciwgdHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6UG9pbnR3aXNlTWF0Y2hlcjxUdXBsZU1hdGNoZXIsIHN0ZDo6dmVjdG9yPFQ+ID4gUG9pbnR3aXNlKAotICAgIGNvbnN0IFR1cGxlTWF0Y2hlciYgdHVwbGVfbWF0Y2hlciwgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHJocykgewotICByZXR1cm4gUG9pbnR3aXNlKHR1cGxlX21hdGNoZXIsIHN0ZDo6dmVjdG9yPFQ+KHJocykpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KLQotLy8gVW5vcmRlcmVkUG9pbnR3aXNlKHBhaXJfbWF0Y2hlciwgcmhzKSBtYXRjaGVzIGFuIFNUTC1zdHlsZQotLy8gY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mCi0vLyBlbGVtZW50cyBhcyBpbiByaHMsIHdoZXJlIGluIHNvbWUgcGVybXV0YXRpb24gb2YgdGhlIGNvbnRhaW5lciwgaXRzCi0vLyBpLXRoIGVsZW1lbnQgYW5kIHJocydzIGktdGggZWxlbWVudCAoYXMgYSBwYWlyKSBzYXRpc2Z5IHRoZSBnaXZlbgotLy8gcGFpciBtYXRjaGVyLCBmb3IgYWxsIGkuICBUdXBsZTJNYXRjaGVyIG11c3QgYmUgYWJsZSB0byBiZSBzYWZlbHkKLS8vIGNhc3QgdG8gTWF0Y2hlcjx0dXBsZTxjb25zdCBUMSYsIGNvbnN0IFQyJj4gPiwgd2hlcmUgVDEgYW5kIFQyIGFyZQotLy8gdGhlIHR5cGVzIG9mIGVsZW1lbnRzIGluIHRoZSBMSFMgY29udGFpbmVyIGFuZCB0aGUgUkhTIGNvbnRhaW5lcgotLy8gcmVzcGVjdGl2ZWx5LgotLy8KLS8vIFRoaXMgaXMgbGlrZSBQb2ludHdpc2UocGFpcl9tYXRjaGVyLCByaHMpLCBleGNlcHQgdGhhdCB0aGUgZWxlbWVudAotLy8gb3JkZXIgZG9lc24ndCBtYXR0ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgUmhzQ29udGFpbmVyPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Qm91bmRTZWNvbmRNYXRjaGVyPAotICAgICAgICBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxHVEVTVF9SRU1PVkVfQ09OU1RfKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzQ29udGFpbmVyKT46OnR5cGU6OnZhbHVlX3R5cGU+ID4KLVVub3JkZXJlZFBvaW50d2lzZShjb25zdCBUdXBsZTJNYXRjaGVyJiB0dXBsZTJfbWF0Y2hlciwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBSaHNDb250YWluZXImIHJoc19jb250YWluZXIpIHsKLSAgLy8gVGhpcyBmb2xsb3dpbmcgbGluZSBpcyBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsCi0gIC8vIHdoaWNoIGNhdXNlcyBSaHNDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcyAoZS5nLiB3aGVuCi0gIC8vIHJoc19jb250YWluZXIgaXMgYSBjb25zdCBpbnRbXSkuCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhSaHNDb250YWluZXIpIFJhd1Joc0NvbnRhaW5lcjsKLQotICAvLyBSaHNWaWV3IGFsbG93cyB0aGUgc2FtZSBjb2RlIHRvIGhhbmRsZSBSaHNDb250YWluZXIgYmVpbmcgYQotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIGFuZCBpdCBiZWluZyBhIG5hdGl2ZSBDLXN0eWxlIGFycmF5LgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd1Joc0NvbnRhaW5lcj4gUmhzVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNWaWV3Ojp0eXBlIFJoc1N0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgU2Vjb25kOwotICBjb25zdCBSaHNTdGxDb250YWluZXImIHJoc19zdGxfY29udGFpbmVyID0KLSAgICAgIFJoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKHJoc19jb250YWluZXIpOwotCi0gIC8vIENyZWF0ZSBhIG1hdGNoZXIgZm9yIGVhY2ggZWxlbWVudCBpbiByaHNfY29udGFpbmVyLgotICA6OnN0ZDo6dmVjdG9yPGludGVybmFsOjpCb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgU2Vjb25kPiA+IG1hdGNoZXJzOwotICBmb3IgKHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpOwotICAgICAgIGl0ICE9IHJoc19zdGxfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7Ci0gICAgbWF0Y2hlcnMucHVzaF9iYWNrKAotICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlckJpbmRTZWNvbmQodHVwbGUyX21hdGNoZXIsICppdCkpOwotICB9Ci0KLSAgLy8gRGVsZWdhdGUgdGhlIHdvcmsgdG8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLgotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShtYXRjaGVycyk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLS8vIFN1cHBvcnRzIHRoZSBVbm9yZGVyZWRQb2ludHdpc2UobSwge2EsIGIsIGN9KSBzeW50YXguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8Ci0gICAgdHlwZW5hbWUgaW50ZXJuYWw6OkJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBUPiA+Ci1Vbm9yZGVyZWRQb2ludHdpc2UoY29uc3QgVHVwbGUyTWF0Y2hlciYgdHVwbGUyX21hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHJocykgewotICByZXR1cm4gVW5vcmRlcmVkUG9pbnR3aXNlKHR1cGxlMl9tYXRjaGVyLCBzdGQ6OnZlY3RvcjxUPihyaHMpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLS8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIGF0Ci0vLyBsZWFzdCBvbmUgZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gdmFsdWUgb3IgbWF0Y2hlci4KLS8vCi0vLyBFeGFtcGxlczoKLS8vICAgOjpzdGQ6OnNldDxpbnQ+IHBhZ2VfaWRzOwotLy8gICBwYWdlX2lkcy5pbnNlcnQoMyk7Ci0vLyAgIHBhZ2VfaWRzLmluc2VydCgxKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIENvbnRhaW5zKDEpKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIENvbnRhaW5zKEd0KDIpKSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBOb3QoQ29udGFpbnMoNCkpKTsKLS8vCi0vLyAgIDo6c3RkOjptYXA8aW50LCBzaXplX3Q+IHBhZ2VfbGVuZ3RoczsKLS8vICAgcGFnZV9sZW5ndGhzWzFdID0gMTAwOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2xlbmd0aHMsCi0vLyAgICAgICAgICAgICAgIENvbnRhaW5zKDo6c3RkOjpwYWlyPGNvbnN0IGludCwgc2l6ZV90PigxLCAxMDApKSk7Ci0vLwotLy8gICBjb25zdCBjaGFyKiB1c2VyX2lkc1tdID0geyAiam9lIiwgIm1pa2UiLCAidG9tIiB9OwotLy8gICBFWFBFQ1RfVEhBVCh1c2VyX2lkcywgQ29udGFpbnMoRXEoOjpzdGQ6OnN0cmluZygidG9tIikpKSk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWlubGluZSBpbnRlcm5hbDo6Q29udGFpbnNNYXRjaGVyPE0+IENvbnRhaW5zKE0gbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkNvbnRhaW5zTWF0Y2hlcjxNPihtYXRjaGVyKTsKLX0KLQotLy8gTWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgb25seQotLy8gZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHZhbHVlIG9yIG1hdGNoZXIuCi0vLwotLy8gRWFjaChtKSBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBOb3QoQ29udGFpbnMoTm90KG0pKSkuIE9ubHkKLS8vIHRoZSBtZXNzYWdlcyBhcmUgZGlmZmVyZW50LgotLy8KLS8vIEV4YW1wbGVzOgotLy8gICA6OnN0ZDo6c2V0PGludD4gcGFnZV9pZHM7Ci0vLyAgIC8vIEVhY2gobSkgbWF0Y2hlcyBhbiBlbXB0eSBjb250YWluZXIsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBtIGlzLgotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgRWFjaChFcSgxKSkpOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgRWFjaChFcSg3NykpKTsKLS8vCi0vLyAgIHBhZ2VfaWRzLmluc2VydCgzKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIEVhY2goR3QoMCkpKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChFYWNoKEd0KDQpKSkpOwotLy8gICBwYWdlX2lkcy5pbnNlcnQoMSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBOb3QoRWFjaChMdCgyKSkpKTsKLS8vCi0vLyAgIDo6c3RkOjptYXA8aW50LCBzaXplX3Q+IHBhZ2VfbGVuZ3RoczsKLS8vICAgcGFnZV9sZW5ndGhzWzFdID0gMTAwOwotLy8gICBwYWdlX2xlbmd0aHNbMl0gPSAyMDA7Ci0vLyAgIHBhZ2VfbGVuZ3Roc1szXSA9IDMwMDsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9sZW5ndGhzLCBOb3QoRWFjaChQYWlyKDEsIDEwMCkpKSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfbGVuZ3RocywgRWFjaChLZXkoTGUoMykpKSk7Ci0vLwotLy8gICBjb25zdCBjaGFyKiB1c2VyX2lkc1tdID0geyAiam9lIiwgIm1pa2UiLCAidG9tIiB9OwotLy8gICBFWFBFQ1RfVEhBVCh1c2VyX2lkcywgTm90KEVhY2goRXEoOjpzdGQ6OnN0cmluZygidG9tIikpKSkpOwotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1pbmxpbmUgaW50ZXJuYWw6OkVhY2hNYXRjaGVyPE0+IEVhY2goTSBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWFjaE1hdGNoZXI8TT4obWF0Y2hlcik7Ci19Ci0KLS8vIEtleShpbm5lcl9tYXRjaGVyKSBtYXRjaGVzIGFuIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkIG1hdGNoZXMKLS8vIGlubmVyX21hdGNoZXIuICBGb3IgZXhhbXBsZSwgQ29udGFpbnMoS2V5KEdlKDUpKSkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYW4KLS8vIHN0ZDo6bWFwIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgd2hvc2Uga2V5IGlzID49IDUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWlubGluZSBpbnRlcm5hbDo6S2V5TWF0Y2hlcjxNPiBLZXkoTSBpbm5lcl9tYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6S2V5TWF0Y2hlcjxNPihpbm5lcl9tYXRjaGVyKTsKLX0KLQotLy8gUGFpcihmaXJzdF9tYXRjaGVyLCBzZWNvbmRfbWF0Y2hlcikgbWF0Y2hlcyBhIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkCi0vLyBtYXRjaGVzIGZpcnN0X21hdGNoZXIgYW5kIHdob3NlICdzZWNvbmQnIGZpZWxkIG1hdGNoZXMgc2Vjb25kX21hdGNoZXIuICBGb3IKLS8vIGV4YW1wbGUsIEVYUEVDVF9USEFUKG1hcF90eXBlLCBFbGVtZW50c0FyZShQYWlyKEdlKDUpLCAiZm9vIikpKSBjYW4gYmUgdXNlZAotLy8gdG8gbWF0Y2ggYSBzdGQ6Om1hcDxpbnQsIHN0cmluZz4gdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50IHdob3NlIGtleQotLy8gaXMgPj0gNSBhbmQgd2hvc2UgdmFsdWUgZXF1YWxzICJmb28iLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0TWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6UGFpck1hdGNoZXI8Rmlyc3RNYXRjaGVyLCBTZWNvbmRNYXRjaGVyPgotUGFpcihGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlciwgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OlBhaXJNYXRjaGVyPEZpcnN0TWF0Y2hlciwgU2Vjb25kTWF0Y2hlcj4oCi0gICAgICBmaXJzdF9tYXRjaGVyLCBzZWNvbmRfbWF0Y2hlcik7Ci19Ci0KLS8vIFJldHVybnMgYSBwcmVkaWNhdGUgdGhhdCBpcyBzYXRpc2ZpZWQgYnkgYW55dGhpbmcgdGhhdCBtYXRjaGVzIHRoZQotLy8gZ2l2ZW4gbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotaW5saW5lIGludGVybmFsOjpNYXRjaGVyQXNQcmVkaWNhdGU8TT4gTWF0Y2hlcyhNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQXNQcmVkaWNhdGU8TT4obWF0Y2hlcik7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIG1hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4KLWlubGluZSBib29sIFZhbHVlKGNvbnN0IFQmIHZhbHVlLCBNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIHRlc3Rpbmc6Ok1hdGNoZXMobWF0Y2hlcikodmFsdWUpOwotfQotCi0vLyBNYXRjaGVzIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSBnaXZlbiBtYXRjaGVyIGFuZCBleHBsYWlucyB0aGUgbWF0Y2gKLS8vIHJlc3VsdCB0byBsaXN0ZW5lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgotaW5saW5lIGJvb2wgRXhwbGFpbk1hdGNoUmVzdWx0KAotICAgIE0gbWF0Y2hlciwgY29uc3QgVCYgdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIHJldHVybiBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXIpLk1hdGNoQW5kRXhwbGFpbih2YWx1ZSwgbGlzdGVuZXIpOwotfQotCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotLy8gRGVmaW5lIHZhcmlhZGljIG1hdGNoZXIgdmVyc2lvbnMuIFRoZXkgYXJlIG92ZXJsb2FkZWQgaW4KLS8vIGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIGZvciB0aGUgY2FzZXMgc3VwcG9ydGVkIGJ5IHByZSBDKysxMSBjb21waWxlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLWlubGluZSBpbnRlcm5hbDo6QWxsT2ZNYXRjaGVyPEFyZ3MuLi4+IEFsbE9mKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QWxsT2ZNYXRjaGVyPEFyZ3MuLi4+KG1hdGNoZXJzLi4uKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci1pbmxpbmUgaW50ZXJuYWw6OkFueU9mTWF0Y2hlcjxBcmdzLi4uPiBBbnlPZihjb25zdCBBcmdzJi4uLiBtYXRjaGVycykgewotICByZXR1cm4gaW50ZXJuYWw6OkFueU9mTWF0Y2hlcjxBcmdzLi4uPihtYXRjaGVycy4uLik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi0vLyBBbGxBcmdzKG0pIGlzIGEgc3lub255bSBvZiBtLiAgVGhpcyBpcyB1c2VmdWwgaW4KLS8vCi0vLyAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKF8sIF8pKS5XaXRoKEFsbEFyZ3MoRXEoKSkpOwotLy8KLS8vIHdoaWNoIGlzIGVhc2llciB0byByZWFkIHRoYW4KLS8vCi0vLyAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKF8sIF8pKS5XaXRoKEVxKCkpOwotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBJbm5lck1hdGNoZXIgQWxsQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsgcmV0dXJuIG1hdGNoZXI7IH0KLQotLy8gVGhlc2UgbWFjcm9zIGFsbG93IHVzaW5nIG1hdGNoZXJzIHRvIGNoZWNrIHZhbHVlcyBpbiBHb29nbGUgVGVzdAotLy8gdGVzdHMuICBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcikgYW5kIEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKQotLy8gc3VjY2VlZCBpZmYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIG1hdGNoZXIuICBJZiB0aGUgYXNzZXJ0aW9uIGZhaWxzLAotLy8gdGhlIHZhbHVlIGFuZCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1hdGNoZXIgd2lsbCBiZSBwcmludGVkLgotI2RlZmluZSBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcikgQVNTRVJUX1BSRURfRk9STUFUMShcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZVByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKG1hdGNoZXIpLCB2YWx1ZSkKLSNkZWZpbmUgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpIEVYUEVDVF9QUkVEX0ZPUk1BVDEoXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihtYXRjaGVyKSwgdmFsdWUpCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIEluY2x1ZGUgYW55IGN1c3RvbSBjYWxsYmFjayBtYXRjaGVycyBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLW1hdGNoZXJzLmgiCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTUFUQ0hFUlNfSF8KKyNlbmRpZiAgLy8gVEVTVElOR19HTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDM4N2I2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBhY3Rpb25zIHRoYXQgZGVwZW5kIG9uIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZShmKSBhY3Rpb24uICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKLS8vIEZ1bmN0aW9uSW1wbCBpcyB0aGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiBmLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEKLS8vIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSBmdW5jdG9yLiAgSW52b2tlKGYpIGNhbiBiZSB1c2VkIGFzIGFuCi0vLyBBY3Rpb248Rj4gYXMgbG9uZyBhcyBmJ3MgdHlwZSBpcyBjb21wYXRpYmxlIHdpdGggRiAoaS5lLiBmIGNhbiBiZQotLy8gYXNzaWduZWQgdG8gYSB0cjE6OmZ1bmN0aW9uPEY+KS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+Ci1jbGFzcyBJbnZva2VBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yIG1ha2VzIGEgY29weSBvZiBmdW5jdGlvbl9pbXBsIChlaXRoZXIgYSBmdW5jdGlvbgotICAvLyBwb2ludGVyIG9yIGEgZnVuY3RvcikuCi0gIGV4cGxpY2l0IEludm9rZUFjdGlvbihGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbCkKLSAgICAgIDogZnVuY3Rpb25faW1wbF8oZnVuY3Rpb25faW1wbCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIEludm9rZUhlbHBlcjxSZXN1bHQsIEFyZ3VtZW50VHVwbGU+OjpJbnZva2UoZnVuY3Rpb25faW1wbF8sIGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlKG9iamVjdF9wdHIsICZDbGFzczo6TWV0aG9kKSBhY3Rpb24uCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLWNsYXNzIEludm9rZU1ldGhvZEFjdGlvbiB7Ci0gcHVibGljOgotICBJbnZva2VNZXRob2RBY3Rpb24oQ2xhc3MqIG9ial9wdHIsIE1ldGhvZFB0ciBtZXRob2RfcHRyKQotICAgICAgOiBtZXRob2RfcHRyXyhtZXRob2RfcHRyKSwgb2JqX3B0cl8ob2JqX3B0cikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0gICAgcmV0dXJuIEludm9rZUhlbHBlcjxSZXN1bHQsIEFyZ3VtZW50VHVwbGU+OjpJbnZva2VNZXRob2QoCi0gICAgICAgIG9ial9wdHJfLCBtZXRob2RfcHRyXywgYXJncyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBvcmRlciBvZiB0aGVzZSBtZW1iZXJzIG1hdHRlcnMuICBSZXZlcnNpbmcgdGhlIG9yZGVyIGNhbiB0cmlnZ2VyCi0gIC8vIHdhcm5pbmcgQzQxMjEgaW4gTVNWQyAoc2VlCi0gIC8vIGh0dHA6Ly9jb21wdXRlci1wcm9ncmFtbWluZy1mb3J1bS5jb20vNy12Yy5uZXQvNmZiYzMwMjY1Zjg2MGFkMS5odG0gKS4KLSAgY29uc3QgTWV0aG9kUHRyIG1ldGhvZF9wdHJfOwotICBDbGFzcyogY29uc3Qgb2JqX3B0cl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VNZXRob2RBY3Rpb24pOwotfTsKLQotLy8gQW4gaW50ZXJuYWwgcmVwbGFjZW1lbnQgZm9yIHN0ZDo6Y29weSB3aGljaCBtaW1pY3MgaXRzIGJlaGF2aW9yLiBUaGlzIGlzCi0vLyBuZWNlc3NhcnkgYmVjYXVzZSBWaXN1YWwgU3R1ZGlvIGRlcHJlY2F0ZXMgOjpzdGQ6OmNvcHksIGlzc3Vpbmcgd2FybmluZyA0OTk2LgotLy8gSG93ZXZlciBWaXN1YWwgU3R1ZGlvIDIwMTAgYW5kIGxhdGVyIGRvIG5vdCBob25vciAjcHJhZ21hcyB3aGljaCBkaXNhYmxlIHRoYXQKLS8vIHdhcm5pbmcuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBPdXRwdXRJdGVyYXRvcj4KLWlubGluZSBPdXRwdXRJdGVyYXRvciBDb3B5RWxlbWVudHMoSW5wdXRJdGVyYXRvciBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRJdGVyYXRvciBvdXRwdXQpIHsKLSAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QsICsrb3V0cHV0KSB7Ci0gICAgKm91dHB1dCA9ICpmaXJzdDsKLSAgfQotICByZXR1cm4gb3V0cHV0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgJ2Z1bmN0aW9uX2ltcGwnIHdpdGggdGhlIG1vY2sKLS8vIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSW1wbD4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VBY3Rpb248RnVuY3Rpb25JbXBsPiA+IEludm9rZSgKLSAgICBGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKAotICAgICAgaW50ZXJuYWw6Okludm9rZUFjdGlvbjxGdW5jdGlvbkltcGw+KGZ1bmN0aW9uX2ltcGwpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBnaXZlbiBtZXRob2Qgb24gdGhlIGdpdmVuIG9iamVjdAotLy8gd2l0aCB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50cy4KLXRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZU1ldGhvZEFjdGlvbjxDbGFzcywgTWV0aG9kUHRyPiA+IEludm9rZSgKLSAgICBDbGFzcyogb2JqX3B0ciwgTWV0aG9kUHRyIG1ldGhvZF9wdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpJbnZva2VNZXRob2RBY3Rpb248Q2xhc3MsIE1ldGhvZFB0cj4ob2JqX3B0ciwgbWV0aG9kX3B0cikpOwotfQotCi0vLyBXaXRob3V0QXJncyhpbm5lcl9hY3Rpb24pIGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbiB3aXRoIGEKLS8vIG5vbi1lbXB0eSBhcmd1bWVudCBsaXN0IHRvIHBlcmZvcm0gaW5uZXJfYWN0aW9uLCB3aGljaCB0YWtlcyBubwotLy8gYXJndW1lbnQuICBJbiBvdGhlciB3b3JkcywgaXQgYWRhcHRzIGFuIGFjdGlvbiBhY2NlcHRpbmcgbm8KLS8vIGFyZ3VtZW50IHRvIG9uZSB0aGF0IGFjY2VwdHMgKGFuZCBpZ25vcmVzKSBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uPgotV2l0aG91dEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uPihhY3Rpb24pOwotfQotCi0vLyBXaXRoQXJnPGs+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMgdGhlIGstdGgKLS8vICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kIHBlcmZvcm1zCi0vLyBpdC4gIEl0IGFkYXB0cyBhbiBhY3Rpb24gYWNjZXB0aW5nIG9uZSBhcmd1bWVudCB0byBvbmUgdGhhdCBhY2NlcHRzCi0vLyBtdWx0aXBsZSBhcmd1bWVudHMuICBGb3IgY29udmVuaWVuY2UsIHdlIGFsc28gcHJvdmlkZQotLy8gV2l0aEFyZ3M8az4oYW5fYWN0aW9uKSAoZGVmaW5lZCBiZWxvdykgYXMgYSBzeW5vbnltLgotdGVtcGxhdGUgPGludCBrLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGs+Ci1XaXRoQXJnKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgaz4oYWN0aW9uKTsKLX0KLQotLy8gVGhlIEFDVElPTiooKSBtYWNyb3MgdHJpZ2dlciB3YXJuaW5nIEM0MTAwICh1bnJlZmVyZW5jZWQgZm9ybWFsCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluCi0vLyB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgYXMgdGhlIHdhcm5pbmdzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgbWFjcm8KLS8vIGlzIGV4cGFuZGVkIGFuZCBtYWNybyBleHBhbnNpb24gY2Fubm90IGNvbnRhaW4gI3ByYWdtYS4gIFRoZXJlZm9yZQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKLSNlbmRpZgotCi0vLyBBY3Rpb24gUmV0dXJuQXJnPGs+KCkgcmV0dXJucyB0aGUgay10aCBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbi4KLUFDVElPTl9URU1QTEFURShSZXR1cm5BcmcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKLSAgcmV0dXJuIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpOwotfQotCi0vLyBBY3Rpb24gU2F2ZUFyZzxrPihwb2ludGVyKSBzYXZlcyB0aGUgay10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlCi0vLyBtb2NrIGZ1bmN0aW9uIHRvICpwb2ludGVyLgotQUNUSU9OX1RFTVBMQVRFKFNhdmVBcmcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHBvaW50ZXIpKSB7Ci0gICpwb2ludGVyID0gOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyk7Ci19Ci0KLS8vIEFjdGlvbiBTYXZlQXJnUG9pbnRlZTxrPihwb2ludGVyKSBzYXZlcyB0aGUgdmFsdWUgcG9pbnRlZCB0bwotLy8gYnkgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRvICpwb2ludGVyLgotQUNUSU9OX1RFTVBMQVRFKFNhdmVBcmdQb2ludGVlLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwb2ludGVyKSkgewotICAqcG9pbnRlciA9ICo6OnRlc3Rpbmc6OmdldDxrPihhcmdzKTsKLX0KLQotLy8gQWN0aW9uIFNldEFyZ1JlZmVyZWU8az4odmFsdWUpIGFzc2lnbnMgJ3ZhbHVlJyB0byB0aGUgdmFyaWFibGUKLS8vIHJlZmVyZW5jZWQgYnkgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uLgotQUNUSU9OX1RFTVBMQVRFKFNldEFyZ1JlZmVyZWUsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHZhbHVlKSkgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxrLCBhcmdzX3R5cGU+Ojp0eXBlIGFyZ2tfdHlwZTsKLSAgLy8gRW5zdXJlcyB0aGF0IGFyZ3VtZW50ICNrIGlzIGEgcmVmZXJlbmNlLiAgSWYgeW91IGdldCBhIGNvbXBpbGVyCi0gIC8vIGVycm9yIG9uIHRoZSBuZXh0IGxpbmUsIHlvdSBhcmUgdXNpbmcgU2V0QXJnUmVmZXJlZTxrPih2YWx1ZSkgaW4KLSAgLy8gYSBtb2NrIGZ1bmN0aW9uIHdob3NlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IGlzIG5vdCBhIHJlZmVyZW5jZS4KLSAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGludGVybmFsOjppc19yZWZlcmVuY2U8YXJna190eXBlPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXRBcmdSZWZlcmVlX211c3RfYmVfdXNlZF93aXRoX2FfcmVmZXJlbmNlX2FyZ3VtZW50KTsKLSAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykgPSB2YWx1ZTsKLX0KLQotLy8gQWN0aW9uIFNldEFycmF5QXJndW1lbnQ8az4oZmlyc3QsIGxhc3QpIGNvcGllcyB0aGUgZWxlbWVudHMgaW4KLS8vIHNvdXJjZSByYW5nZSBbZmlyc3QsIGxhc3QpIHRvIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5IHRoZSBrLXRoCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBwb2ludGVyIG9yIGFuCi0vLyBpdGVyYXRvci4gVGhlIGFjdGlvbiBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCi0vLyBzb3VyY2UgcmFuZ2UuCi1BQ1RJT05fVEVNUExBVEUoU2V0QXJyYXlBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMoZmlyc3QsIGxhc3QpKSB7Ci0gIC8vIFZpc3VhbCBTdHVkaW8gZGVwcmVjYXRlcyA6OnN0ZDo6Y29weSwgc28gd2UgdXNlIG91ciBvd24gY29weSBpbiB0aGF0IGNhc2UuCi0jaWZkZWYgX01TQ19WRVIKLSAgaW50ZXJuYWw6OkNvcHlFbGVtZW50cyhmaXJzdCwgbGFzdCwgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOwotI2Vsc2UKLSAgOjpzdGQ6OmNvcHkoZmlyc3QsIGxhc3QsIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLSNlbmRpZgotfQotCi0vLyBBY3Rpb24gRGVsZXRlQXJnPGs+KCkgZGVsZXRlcyB0aGUgay10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLgotQUNUSU9OX1RFTVBMQVRFKERlbGV0ZUFyZywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgewotICBkZWxldGUgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyk7Ci19Ci0KLS8vIFRoaXMgYWN0aW9uIHJldHVybnMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3BvaW50ZXInLgotQUNUSU9OX1AoUmV0dXJuUG9pbnRlZSwgcG9pbnRlcikgeyByZXR1cm4gKnBvaW50ZXI7IH0KLQotLy8gQWN0aW9uIFRocm93KGV4Y2VwdGlvbikgY2FuIGJlIHVzZWQgaW4gYSBtb2NrIGZ1bmN0aW9uIG9mIGFueSB0eXBlCi0vLyB0byB0aHJvdyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLiAgQW55IGNvcHlhYmxlIHZhbHVlIGNhbiBiZSB0aHJvd24uCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gU3VwcHJlc3NlcyB0aGUgJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgdGhhdCBWQyBnZW5lcmF0ZXMgaW4gb3B0IG1vZGVzLgotIyBpZmRlZiBfTVNDX1ZFUgotIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KLSMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcwMikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDcwMi4KLSMgZW5kaWYKLUFDVElPTl9QKFRocm93LCBleGNlcHRpb24pIHsgdGhyb3cgZXhjZXB0aW9uOyB9Ci0jIGlmZGVmIF9NU0NfVkVSCi0jICBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KLSMgZW5kaWYKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmggYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1tYXRjaGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI4OTlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiBtYXJjdXMuYm9lcmdlckBnb29nbGUuY29tIChNYXJjdXMgQm9lcmdlcikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgbWF0Y2hlcnMgdGhhdCBkZXBlbmQgb24gZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmguCi0vLwotLy8gTm90ZSB0aGF0IHRlc3RzIGFyZSBpbXBsZW1lbnRlZCBpbiBnbW9jay1tYXRjaGVyc190ZXN0LmNjIHJhdGhlciB0aGFuCi0vLyBnbW9jay1tb3JlLW1hdGNoZXJzLXRlc3QuY2MuCi0KLSNpZm5kZWYgR01PQ0tfR01PQ0tfTU9SRV9NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWZpbmVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gZW1wdHkgY29udGFpbmVyLiBUaGUgY29udGFpbmVyIG11c3QKLS8vIHN1cHBvcnQgYm90aCBzaXplKCkgYW5kIGVtcHR5KCksIHdoaWNoIGFsbCBTVEwtbGlrZSBjb250YWluZXJzIHByb3ZpZGUuCi1NQVRDSEVSKElzRW1wdHksIG5lZ2F0aW9uID8gImlzbid0IGVtcHR5IiA6ICJpcyBlbXB0eSIpIHsKLSAgaWYgKGFyZy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgKnJlc3VsdF9saXN0ZW5lciA8PCAid2hvc2Ugc2l6ZSBpcyAiIDw8IGFyZy5zaXplKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkN2RlNi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIE9OX0NBTEwoKSBhbmQgRVhQRUNUX0NBTEwoKSBtYWNyb3MuCi0vLwotLy8gQSB1c2VyIGNhbiB1c2UgdGhlIE9OX0NBTEwoKSBtYWNybyB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFjdGlvbiBvZgotLy8gYSBtb2NrIG1ldGhvZC4gIFRoZSBzeW50YXggaXM6Ci0vLwotLy8gICBPTl9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QoYXJndW1lbnQtbWF0Y2hlcnMpKQotLy8gICAgICAgLldpdGgobXVsdGktYXJndW1lbnQtbWF0Y2hlcikKLS8vICAgICAgIC5XaWxsQnlEZWZhdWx0KGFjdGlvbik7Ci0vLwotLy8gIHdoZXJlIHRoZSAuV2l0aCgpIGNsYXVzZSBpcyBvcHRpb25hbC4KLS8vCi0vLyBBIHVzZXIgY2FuIHVzZSB0aGUgRVhQRUNUX0NBTEwoKSBtYWNybyB0byBzcGVjaWZ5IGFuIGV4cGVjdGF0aW9uIG9uCi0vLyBhIG1vY2sgbWV0aG9kLiAgVGhlIHN5bnRheCBpczoKLS8vCi0vLyAgIEVYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QoYXJndW1lbnQtbWF0Y2hlcnMpKQotLy8gICAgICAgLldpdGgobXVsdGktYXJndW1lbnQtbWF0Y2hlcnMpCi0vLyAgICAgICAuVGltZXMoY2FyZGluYWxpdHkpCi0vLyAgICAgICAuSW5TZXF1ZW5jZShzZXF1ZW5jZXMpCi0vLyAgICAgICAuQWZ0ZXIoZXhwZWN0YXRpb25zKQotLy8gICAgICAgLldpbGxPbmNlKGFjdGlvbikKLS8vICAgICAgIC5XaWxsUmVwZWF0ZWRseShhY3Rpb24pCi0vLyAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotLy8KLS8vIHdoZXJlIGFsbCBjbGF1c2VzIGFyZSBvcHRpb25hbCwgYW5kIC5JblNlcXVlbmNlKCkvLkFmdGVyKCkvCi0vLyAuV2lsbE9uY2UoKSBjYW4gYXBwZWFyIGFueSBudW1iZXIgb2YgdGltZXMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19TUEVDX0JVSUxERVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfU1BFQ19CVUlMREVSU19IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotIyBpbmNsdWRlIDxzdGRleGNlcHQ+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gQW4gYWJzdHJhY3QgaGFuZGxlIG9mIGFuIGV4cGVjdGF0aW9uLgotY2xhc3MgRXhwZWN0YXRpb247Ci0KLS8vIEEgc2V0IG9mIGV4cGVjdGF0aW9uIGhhbmRsZXMuCi1jbGFzcyBFeHBlY3RhdGlvblNldDsKLQotLy8gQW55dGhpbmcgaW5zaWRlIHRoZSAnaW50ZXJuYWwnIG5hbWVzcGFjZSBJUyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTgotLy8gYW5kIE1VU1QgTk9UIEJFIFVTRUQgSU4gVVNFUiBDT0RFISEhCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJbXBsZW1lbnRzIGEgbW9jayBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBGdW5jdGlvbk1vY2tlcjsKLQotLy8gQmFzZSBjbGFzcyBmb3IgZXhwZWN0YXRpb25zLgotY2xhc3MgRXhwZWN0YXRpb25CYXNlOwotCi0vLyBJbXBsZW1lbnRzIGFuIGV4cGVjdGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+IGNsYXNzIFR5cGVkRXhwZWN0YXRpb247Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyB0aGUgRXhwZWN0YXRpb24gY2xhc3MgdGVtcGxhdGUuCi1jbGFzcyBFeHBlY3RhdGlvblRlc3RlcjsKLQotLy8gQmFzZSBjbGFzcyBmb3IgZnVuY3Rpb24gbW9ja2Vycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLS8vIFByb3RlY3RzIHRoZSBtb2NrIG9iamVjdCByZWdpc3RyeSAoaW4gY2xhc3MgTW9jayksIGFsbCBmdW5jdGlvbgotLy8gbW9ja2VycywgYW5kIGFsbCBleHBlY3RhdGlvbnMuCi0vLwotLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCB1c2UgbW9yZSBmaW5lLWdyYWluZWQgcHJvdGVjdGlvbiBpczogd2hlbiBhCi0vLyBtb2NrIGZ1bmN0aW9uIEZvbygpIGlzIGNhbGxlZCwgaXQgbmVlZHMgdG8gY29uc3VsdCBpdHMgZXhwZWN0YXRpb25zCi0vLyB0byBzZWUgd2hpY2ggb25lIHNob3VsZCBiZSBwaWNrZWQuICBJZiBhbm90aGVyIHRocmVhZCBpcyBhbGxvd2VkIHRvCi0vLyBjYWxsIGEgbW9jayBmdW5jdGlvbiAoZWl0aGVyIEZvbygpIG9yIGEgZGlmZmVyZW50IG9uZSkgYXQgdGhlIHNhbWUKLS8vIHRpbWUsIGl0IGNvdWxkIGFmZmVjdCB0aGUgInJldGlyZWQiIGF0dHJpYnV0ZXMgb2YgRm9vKCkncwotLy8gZXhwZWN0YXRpb25zIHdoZW4gSW5TZXF1ZW5jZSgpIGlzIHVzZWQsIGFuZCB0aHVzIGFmZmVjdCB3aGljaAotLy8gZXhwZWN0YXRpb24gZ2V0cyBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIHNlcXVlbmNlIGFsbCBtb2NrIGZ1bmN0aW9uCi0vLyBjYWxscyB0byBlbnN1cmUgdGhlIGludGVncml0eSBvZiB0aGUgbW9jayBvYmplY3RzJyBzdGF0ZXMuCi1HVEVTVF9BUElfIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX2dtb2NrX211dGV4KTsKLQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBBY3Rpb25SZXN1bHRIb2xkZXI8Uj4uCi1jbGFzcyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZTsKLQotLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBGdW5jdGlvbk1vY2tlckJhc2UuICBUaGlzIGlzIHRoZQotLy8gdHlwZS1hZ25vc3RpYyBwYXJ0IG9mIHRoZSBmdW5jdGlvbiBtb2NrZXIgaW50ZXJmYWNlLiAgSXRzIHB1cmUKLS8vIHZpcnR1YWwgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgYnkgRnVuY3Rpb25Nb2NrZXJCYXNlLgotY2xhc3MgR1RFU1RfQVBJXyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKTsKLSAgdmlydHVhbCB+VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpOwotCi0gIC8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sgZnVuY3Rpb24gaGF2ZSBiZWVuCi0gIC8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzCi0gIC8vIGFuZCByZXR1cm5zIGZhbHNlIGlmIG5vdC4KLSAgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gQ2xlYXJzIHRoZSBPTl9DQUxMKClzIHNldCBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCkKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSA9IDA7Ci0KLSAgLy8gSW4gYWxsIG9mIHRoZSBmb2xsb3dpbmcgVW50eXBlZCogZnVuY3Rpb25zLCBpdCdzIHRoZSBjYWxsZXIncwotICAvLyByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhcmd1bWVudHMnCi0gIC8vIHR5cGVzLgotCi0gIC8vIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsIGRlc2NyaXB0aW9uIHN0cmluZyB3aWxsIGJlIHVzZWQgaW4KLSAgLy8gdGhlIGVycm9yIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhlIGNhbGwgaW4gdGhlIGNhc2UgdGhlIGRlZmF1bHQKLSAgLy8gYWN0aW9uIGZhaWxzLgotICAvLyBMID0gKgotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24oCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIGNvbnN0ID0gMDsKLQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucwotICAvLyB0aGUgYWN0aW9uJ3MgcmVzdWx0LgotICAvLyBMID0gKgotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybUFjdGlvbigKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYWN0aW9uLAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKSBjb25zdCA9IDA7Ci0KLSAgLy8gV3JpdGVzIGEgbWVzc2FnZSB0aGF0IHRoZSBjYWxsIGlzIHVuaW50ZXJlc3RpbmcgKGkuZS4gbmVpdGhlcgotICAvLyBleHBsaWNpdGx5IGV4cGVjdGVkIG5vciBleHBsaWNpdGx5IHVuZXhwZWN0ZWQpIHRvIHRoZSBnaXZlbgotICAvLyBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgVW50eXBlZERlc2NyaWJlVW5pbnRlcmVzdGluZ0NhbGwoCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXJndW1lbnRzCi0gIC8vIChvciBOVUxMIGlzIHRoZXJlJ3Mgbm8gbWF0Y2gpOyB3aGVuIGEgbWF0Y2ggaXMgZm91bmQsCi0gIC8vIHVudHlwZWRfYWN0aW9uIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlCi0gIC8vIHBlcmZvcm1lZCAob3IgTlVMTCBpZiB0aGUgYWN0aW9uIGlzICJkbyBkZWZhdWx0IiksIGFuZAotICAvLyBpc19leGNlc3NpdmUgaXMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY2FsbCBleGNlZWRzIHRoZQotICAvLyBleHBlY3RlZCBudW1iZXIuCi0gIHZpcnR1YWwgY29uc3QgRXhwZWN0YXRpb25CYXNlKiBVbnR5cGVkRmluZE1hdGNoaW5nRXhwZWN0YXRpb24oCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICBjb25zdCB2b2lkKiogdW50eXBlZF9hY3Rpb24sIGJvb2wqIGlzX2V4Y2Vzc2l2ZSwKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aGF0LCA6OnN0ZDo6b3N0cmVhbSogd2h5KQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpID0gMDsKLQotICAvLyBQcmludHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byB0aGUgb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFVudHlwZWRQcmludEFyZ3MoY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKLQotICAvLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCByZWdpc3RlcnMKLSAgLy8gdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2xvYmFsIG1vY2sgcmVnaXN0cnkuICBXaWxsIGJlIGNhbGxlZAotICAvLyB3aGVuZXZlciBhbiBFWFBFQ1RfQ0FMTCgpIG9yIE9OX0NBTEwoKSBpcyBleGVjdXRlZCBvbiB0aGlzIG1vY2sKLSAgLy8gbWV0aG9kLgotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVuYW1lIHRvIFNldEFuZFJlZ2lzdGVyT3duZXIoKS4KLSAgdm9pZCBSZWdpc3Rlck93bmVyKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gU2V0cyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLCBhbmQgc2V0cyB0aGUKLSAgLy8gbmFtZSBvZiB0aGUgbW9jayBmdW5jdGlvbi4gIFdpbGwgYmUgY2FsbGVkIHVwb24gZWFjaCBpbnZvY2F0aW9uCi0gIC8vIG9mIHRoaXMgbW9jayBmdW5jdGlvbi4KLSAgdm9pZCBTZXRPd25lckFuZE5hbWUoY29uc3Qgdm9pZCogbW9ja19vYmosIGNvbnN0IGNoYXIqIG5hbWUpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBSZXR1cm5zIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8uICBNdXN0IGJlCi0gIC8vIGNhbGxlZCBhZnRlciBSZWdpc3Rlck93bmVyKCkgb3IgU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4KLSAgLy8gY2FsbGVkLgotICBjb25zdCB2b2lkKiBNb2NrT2JqZWN0KCkgY29uc3QKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtb2NrIG1ldGhvZC4gIE11c3QgYmUgY2FsbGVkIGFmdGVyCi0gIC8vIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgY29uc3QgY2hhciogTmFtZSgpIGNvbnN0Ci0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhpcyBtb2NrIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuCi0gIC8vIGFyZ3VtZW50cy4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHNhZmVseSBjYWxsZWQgZnJvbSBtdWx0aXBsZQotICAvLyB0aHJlYWRzIGNvbmN1cnJlbnRseS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotICAvLyByZXN1bHQuCi0gIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkSW52b2tlV2l0aCgKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncykKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotIHByb3RlY3RlZDoKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCB2b2lkKj4gVW50eXBlZE9uQ2FsbFNwZWNzOwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OmxpbmtlZF9wdHI8RXhwZWN0YXRpb25CYXNlPiA+Ci0gIFVudHlwZWRFeHBlY3RhdGlvbnM7Ci0KLSAgLy8gUmV0dXJucyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIGV4cCwKLSAgLy8gd2hpY2ggbXVzdCBiZSBhbiBleHBlY3RhdGlvbiBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIEV4cGVjdGF0aW9uIEdldEhhbmRsZU9mKEV4cGVjdGF0aW9uQmFzZSogZXhwKTsKLQotICAvLyBBZGRyZXNzIG9mIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8uICBPbmx5Ci0gIC8vIHZhbGlkIGFmdGVyIHRoaXMgbW9jayBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIG9yCi0gIC8vIE9OX0NBTEwvRVhQRUNUX0NBTEwgaGFzIGJlZW4gaW52b2tlZCBvbiBpdC4KLSAgY29uc3Qgdm9pZCogbW9ja19vYmpfOyAgLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguCi0KLSAgLy8gTmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgbW9ja2VkLiAgT25seSB2YWxpZCBhZnRlciB0aGlzIG1vY2sKLSAgLy8gbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KLSAgY29uc3QgY2hhciogbmFtZV87ICAvLyBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KLQotICAvLyBBbGwgZGVmYXVsdCBhY3Rpb24gc3BlY3MgZm9yIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgotICBVbnR5cGVkT25DYWxsU3BlY3MgdW50eXBlZF9vbl9jYWxsX3NwZWNzXzsKLQotICAvLyBBbGwgZXhwZWN0YXRpb25zIGZvciB0aGlzIGZ1bmN0aW9uIG1vY2tlci4KLSAgVW50eXBlZEV4cGVjdGF0aW9ucyB1bnR5cGVkX2V4cGVjdGF0aW9uc187Ci19OyAgLy8gY2xhc3MgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZQotCi0vLyBVbnR5cGVkIGJhc2UgY2xhc3MgZm9yIE9uQ2FsbFNwZWM8Rj4uCi1jbGFzcyBVbnR5cGVkT25DYWxsU3BlY0Jhc2UgewotIHB1YmxpYzoKLSAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50LgotICBVbnR5cGVkT25DYWxsU3BlY0Jhc2UoY29uc3QgY2hhciogYV9maWxlLCBpbnQgYV9saW5lKQotICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBsYXN0X2NsYXVzZV8oa05vbmUpIHt9Ci0KLSAgLy8gV2hlcmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdhcyB0aGUgZGVmYXVsdCBhY3Rpb24gc3BlYyBkZWZpbmVkPwotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0KLSAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQotCi0gcHJvdGVjdGVkOgotICAvLyBHaXZlcyBlYWNoIGNsYXVzZSBpbiB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBhIG5hbWUuCi0gIGVudW0gQ2xhdXNlIHsKLSAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBtZW1iZXJzISAgVGhlIHJ1bi10aW1lCi0gICAgLy8gc3ludGF4IGNoZWNraW5nIHJlbGllcyBvbiBpdC4KLSAgICBrTm9uZSwKLSAgICBrV2l0aCwKLSAgICBrV2lsbEJ5RGVmYXVsdAotICB9OwotCi0gIC8vIEFzc2VydHMgdGhhdCB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBoYXMgYSBjZXJ0YWluIHByb3BlcnR5LgotICB2b2lkIEFzc2VydFNwZWNQcm9wZXJ0eShib29sIHByb3BlcnR5LCBjb25zdCBzdHJpbmcmIGZhaWx1cmVfbWVzc2FnZSkgY29uc3QgewotICAgIEFzc2VydChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOwotICB9Ci0KLSAgLy8gRXhwZWN0cyB0aGF0IHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGhhcyBhIGNlcnRhaW4gcHJvcGVydHkuCi0gIHZvaWQgRXhwZWN0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7Ci0gICAgRXhwZWN0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBmaWxlXzsKLSAgaW50IGxpbmVfOwotCi0gIC8vIFRoZSBsYXN0IGNsYXVzZSBpbiB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBhcyBzZWVuIHNvIGZhci4KLSAgLy8gSW5pdGlhbGx5IGtOb25lIGFuZCBjaGFuZ2VzIGFzIHRoZSBzdGF0ZW1lbnQgaXMgcGFyc2VkLgotICBDbGF1c2UgbGFzdF9jbGF1c2VfOwotfTsgIC8vIGNsYXNzIFVudHlwZWRPbkNhbGxTcGVjQmFzZQotCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIGltcGxlbWVudHMgYW4gT05fQ0FMTCBzcGVjLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBPbkNhbGxTcGVjIDogcHVibGljIFVudHlwZWRPbkNhbGxTcGVjQmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotCi0gIC8vIENvbnN0cnVjdHMgYW4gT25DYWxsU3BlYyBvYmplY3QgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW5zaWRlCi0gIC8vIHRoZSBwYXJlbnRoZXNpcyBvZiBhbiBPTl9DQUxMKCkgc3RhdGVtZW50LgotICBPbkNhbGxTcGVjKGNvbnN0IGNoYXIqIGFfZmlsZSwgaW50IGFfbGluZSwKLSAgICAgICAgICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMpCi0gICAgICA6IFVudHlwZWRPbkNhbGxTcGVjQmFzZShhX2ZpbGUsIGFfbGluZSksCi0gICAgICAgIG1hdGNoZXJzXyhtYXRjaGVycyksCi0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGV4dHJhX21hdGNoZXJfIHNob3VsZCBtYXRjaCBhbnl0aGluZy4gIEhvd2V2ZXIsCi0gICAgICAgIC8vIHdlIGNhbm5vdCBpbml0aWFsaXplIGl0IHdpdGggXyBhcyB0aGF0IHRyaWdnZXJzIGEgY29tcGlsZXIKLSAgICAgICAgLy8gYnVnIGluIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgKGNhbm5vdCBkZWNpZGUgYmV0d2VlbiB0d28KLSAgICAgICAgLy8gb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgb2YgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4pLgotICAgICAgICBleHRyYV9tYXRjaGVyXyhBPGNvbnN0IEFyZ3VtZW50VHVwbGUmPigpKSB7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuV2l0aCgpIGNsYXVzZS4KLSAgT25DYWxsU3BlYyYgV2l0aChjb25zdCBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiYgbSkgewotICAgIC8vIE1ha2VzIHN1cmUgdGhpcyBpcyBjYWxsZWQgYXQgbW9zdCBvbmNlLgotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaXRoKCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25jZSBpbiBhbiBPTl9DQUxMKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga1dpdGg7Ci0KLSAgICBleHRyYV9tYXRjaGVyXyA9IG07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpbGxCeURlZmF1bHQoKSBjbGF1c2UuCi0gIE9uQ2FsbFNwZWMmIFdpbGxCeURlZmF1bHQoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1dpbGxCeURlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyICIKLSAgICAgICAgICAgICAgICAgICAgICAgImV4YWN0bHkgb25jZSBpbiBhbiBPTl9DQUxMKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga1dpbGxCeURlZmF1bHQ7Ci0KLSAgICBFeHBlY3RTcGVjUHJvcGVydHkoIWFjdGlvbi5Jc0RvRGVmYXVsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAiRG9EZWZhdWx0KCkgY2Fubm90IGJlIHVzZWQgaW4gT05fQ0FMTCgpLiIpOwotICAgIGFjdGlvbl8gPSBhY3Rpb247Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIG1hdGNoIHRoZSBtYXRjaGVycy4KLSAgYm9vbCBNYXRjaGVzKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsKLSAgICByZXR1cm4gVHVwbGVNYXRjaGVzKG1hdGNoZXJzXywgYXJncykgJiYgZXh0cmFfbWF0Y2hlcl8uTWF0Y2hlcyhhcmdzKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi0gIGNvbnN0IEFjdGlvbjxGPiYgR2V0QWN0aW9uKCkgY29uc3QgewotICAgIEFzc2VydFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPT0ga1dpbGxCeURlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkgIgotICAgICAgICAgICAgICAgICAgICAgICAib25jZSBpbiBhbiBPTl9DQUxMKCkuIik7Ci0gICAgcmV0dXJuIGFjdGlvbl87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBpbmZvcm1hdGlvbiBpbiBzdGF0ZW1lbnQKLSAgLy8KLSAgLy8gICBPTl9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QobWF0Y2hlcnMpKQotICAvLyAgICAgICAuV2l0aChtdWx0aS1hcmd1bWVudC1tYXRjaGVyKQotICAvLyAgICAgICAuV2lsbEJ5RGVmYXVsdChhY3Rpb24pOwotICAvLwotICAvLyBpcyByZWNvcmRlZCBpbiB0aGUgZGF0YSBtZW1iZXJzIGxpa2UgdGhpczoKLSAgLy8KLSAgLy8gICBzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzdGF0ZW1lbnQgPT4gZmlsZV8KLSAgLy8gICBsaW5lIG51bWJlciBvZiB0aGUgc3RhdGVtZW50ICAgICAgICAgICAgPT4gbGluZV8KLSAgLy8gICBtYXRjaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gbWF0Y2hlcnNfCi0gIC8vICAgbXVsdGktYXJndW1lbnQtbWF0Y2hlciAgICAgICAgICAgICAgICAgID0+IGV4dHJhX21hdGNoZXJfCi0gIC8vICAgYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IGFjdGlvbl8KLSAgQXJndW1lbnRNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOwotICBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiBleHRyYV9tYXRjaGVyXzsKLSAgQWN0aW9uPEY+IGFjdGlvbl87Ci19OyAgLy8gY2xhc3MgT25DYWxsU3BlYwotCi0vLyBQb3NzaWJsZSByZWFjdGlvbnMgb24gdW5pbnRlcmVzdGluZyBjYWxscy4KLWVudW0gQ2FsbFJlYWN0aW9uIHsKLSAga0FsbG93LAotICBrV2FybiwKLSAga0ZhaWwsCi0gIGtEZWZhdWx0ID0ga1dhcm4gIC8vIEJ5IGRlZmF1bHQsIHdhcm4gYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscy4KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBVdGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBtb2NrIG9iamVjdHMuCi1jbGFzcyBHVEVTVF9BUElfIE1vY2sgewotIHB1YmxpYzoKLSAgLy8gVGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kcyBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseS4KLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0byBpZ25vcmUgbW9ja19vYmogd2hlbiBjaGVja2luZyBmb3IgbGVha2VkCi0gIC8vIG1vY2sgb2JqZWN0cy4KLSAgc3RhdGljIHZvaWQgQWxsb3dMZWFrKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIC8vIElmIHRoZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZCwgZ2VuZXJhdGVzIG9uZSBvciBtb3JlCi0gIC8vIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZS4KLSAgc3RhdGljIGJvb2wgVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnModm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVmVyaWZpZXMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgYW5kIGNsZWFycyBpdHMKLSAgLy8gZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMuICBSZXR1cm5zIHRydWUgaWZmIHRoZQotICAvLyB2ZXJpZmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gIHN0YXRpYyBib29sIFZlcmlmeUFuZENsZWFyKHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIC8vIE5lZWRlZCBmb3IgYSBmdW5jdGlvbiBtb2NrZXIgdG8gcmVnaXN0ZXIgaXRzZWxmIChzbyB0aGF0IHdlIGtub3cKLSAgLy8gaG93IHRvIGNsZWFyIGEgbW9jayBvYmplY3QpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci0gIGZyaWVuZCBjbGFzcyBOaWNlTW9jazsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLSAgZnJpZW5kIGNsYXNzIE5hZ2d5TW9jazsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLSAgZnJpZW5kIGNsYXNzIFN0cmljdE1vY2s7Ci0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gYWxsb3cgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jawotICAvLyBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIEFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIHdhcm4gdGhlIHVzZXIgYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscyBvbgotICAvLyB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIFdhcm5VbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gZmFpbCB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZSBnaXZlbiBtb2NrCi0gIC8vIG9iamVjdC4KLSAgc3RhdGljIHZvaWQgRmFpbFVuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgaXMgYmVpbmcgZGVzdHJveWVkIGFuZAotICAvLyBpdHMgZW50cnkgaW4gdGhlIGNhbGwtcmVhY3Rpb24gdGFibGUgc2hvdWxkIGJlIHJlbW92ZWQuCi0gIHN0YXRpYyB2b2lkIFVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgd2lsbCBoYXZlIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMKLSAgLy8gbWFkZSBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIHN0YXRpYyBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIEdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICBjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBoYXZlIGJlZW4KLSAgLy8gc2F0aXNmaWVkLiAgUmVwb3J0cyBvbmUgb3IgbW9yZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMKLSAgLy8gYW5kIHJldHVybnMgZmFsc2UgaWYgbm90LgotICBzdGF0aWMgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gQ2xlYXJzIGFsbCBPTl9DQUxMKClzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQodm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJlZ2lzdGVycyBhIG1vY2sgb2JqZWN0IGFuZCBhIG1vY2sgbWV0aG9kIGl0IG93bnMuCi0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKAotICAgICAgY29uc3Qgdm9pZCogbW9ja19vYmosCi0gICAgICBpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB3aGVyZSBpbiB0aGUgc291cmNlIGNvZGUgbW9ja19vYmogaXMgdXNlZCBpbiBhbgotICAvLyBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMLiAgSW4gY2FzZSBtb2NrX29iaiBpcyBsZWFrZWQsIHRoaXMKLSAgLy8gaW5mb3JtYXRpb24gaGVscHMgdGhlIHVzZXIgaWRlbnRpZnkgd2hpY2ggb2JqZWN0IGl0IGlzLgotICBzdGF0aWMgdm9pZCBSZWdpc3RlclVzZUJ5T25DYWxsT3JFeHBlY3RDYWxsKAotICAgICAgY29uc3Qgdm9pZCogbW9ja19vYmosIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBVbnJlZ2lzdGVycyBhIG1vY2sgbWV0aG9kOyByZW1vdmVzIHRoZSBvd25pbmcgbW9jayBvYmplY3QgZnJvbQotICAvLyB0aGUgcmVnaXN0cnkgd2hlbiB0aGUgbGFzdCBtb2NrIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggaXQgaGFzCi0gIC8vIGJlZW4gdW5yZWdpc3RlcmVkLiAgVGhpcyBpcyBjYWxsZWQgb25seSBpbiB0aGUgZGVzdHJ1Y3RvciBvZgotICAvLyBGdW5jdGlvbk1vY2tlckJhc2UuCi0gIHN0YXRpYyB2b2lkIFVucmVnaXN0ZXJMb2NrZWQoaW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UqIG1vY2tlcikKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci19OyAgLy8gY2xhc3MgTW9jawotCi0vLyBBbiBhYnN0cmFjdCBoYW5kbGUgb2YgYW4gZXhwZWN0YXRpb24uICBVc2VmdWwgaW4gdGhlIC5BZnRlcigpCi0vLyBjbGF1c2Ugb2YgRVhQRUNUX0NBTEwoKSBmb3Igc2V0dGluZyB0aGUgKHBhcnRpYWwpIG9yZGVyIG9mCi0vLyBleHBlY3RhdGlvbnMuICBUaGUgc3ludGF4OgotLy8KLS8vICAgRXhwZWN0YXRpb24gZTEgPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOwotLy8gICBFWFBFQ1RfQ0FMTCguLi4pLkFmdGVyKGUxKS4uLjsKLS8vCi0vLyBzZXRzIHR3byBleHBlY3RhdGlvbnMgd2hlcmUgdGhlIGxhdHRlciBjYW4gb25seSBiZSBtYXRjaGVkIGFmdGVyCi0vLyB0aGUgZm9ybWVyIGhhcyBiZWVuIHNhdGlzZmllZC4KLS8vCi0vLyBOb3RlczoKLS8vICAgLSBUaGlzIGNsYXNzIGlzIGNvcHlhYmxlIGFuZCBoYXMgdmFsdWUgc2VtYW50aWNzLgotLy8gICAtIENvbnN0bmVzcyBpcyBzaGFsbG93OiBhIGNvbnN0IEV4cGVjdGF0aW9uIG9iamVjdCBpdHNlbGYgY2Fubm90Ci0vLyAgICAgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgbXV0YWJsZSBtZXRob2RzIG9mIHRoZSBFeHBlY3RhdGlvbkJhc2UKLS8vICAgICBvYmplY3QgaXQgcmVmZXJlbmNlcyBjYW4gYmUgY2FsbGVkIHZpYSBleHBlY3RhdGlvbl9iYXNlKCkuCi0vLyAgIC0gVGhlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvciBhcmUgZGVmaW5lZCBvdXQtb2YtbGluZSBiZWNhdXNlCi0vLyAgICAgdGhlIFN5bWJpYW4gV0lOU0NXIGNvbXBpbGVyIHdhbnRzIHRvIG90aGVyd2lzZSBpbnN0YW50aWF0ZSB0aGVtCi0vLyAgICAgd2hlbiBpdCBzZWVzIHRoaXMgY2xhc3MgZGVmaW5pdGlvbiwgYXQgd2hpY2ggcG9pbnQgaXQgZG9lc24ndCBoYXZlCi0vLyAgICAgRXhwZWN0YXRpb25CYXNlIGF2YWlsYWJsZSB5ZXQsIGxlYWRpbmcgdG8gaW5jb3JyZWN0IGRlc3RydWN0aW9uCi0vLyAgICAgaW4gdGhlIGxpbmtlZF9wdHIgKG9yIGNvbXBpbGF0aW9uIGVycm9ycyBpZiB1c2luZyBhIGNoZWNraW5nCi0vLyAgICAgbGlua2VkX3B0cikuCi1jbGFzcyBHVEVTVF9BUElfIEV4cGVjdGF0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBudWxsIG9iamVjdCB0aGF0IGRvZXNuJ3QgcmVmZXJlbmNlIGFueSBleHBlY3RhdGlvbi4KLSAgRXhwZWN0YXRpb24oKTsKLQotICB+RXhwZWN0YXRpb24oKTsKLQotICAvLyBUaGlzIHNpbmdsZS1hcmd1bWVudCBjdG9yIG11c3Qgbm90IGJlIGV4cGxpY2l0LCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZQotICAvLyAgIEV4cGVjdGF0aW9uIGUgPSBFWFBFQ1RfQ0FMTCguLi4pOwotICAvLyBzeW50YXguCi0gIC8vCi0gIC8vIEEgVHlwZWRFeHBlY3RhdGlvbiBvYmplY3Qgc3RvcmVzIGl0cyBwcmUtcmVxdWlzaXRlcyBhcwotICAvLyBFeHBlY3RhdGlvbiBvYmplY3RzLCBhbmQgbmVlZHMgdG8gY2FsbCB0aGUgbm9uLWNvbnN0IFJldGlyZSgpCi0gIC8vIG1ldGhvZCBvbiB0aGUgRXhwZWN0YXRpb25CYXNlIG9iamVjdHMgdGhleSByZWZlcmVuY2UuICBUaGVyZWZvcmUKLSAgLy8gRXhwZWN0YXRpb24gbXVzdCByZWNlaXZlIGEgKm5vbi1jb25zdCogcmVmZXJlbmNlIHRvIHRoZQotICAvLyBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0LgotICBFeHBlY3RhdGlvbihpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlJiBleHApOyAgLy8gTk9MSU5UCi0KLSAgLy8gVGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBjb3B5IGN0b3IgYW5kIG9wZXJhdG9yPSB3b3JrIGV4YWN0bHkgYXMKLSAgLy8gaW50ZW5kZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVmaW5lIG91ciBvd24uCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiByaHMgcmVmZXJlbmNlcyB0aGUgc2FtZSBleHBlY3RhdGlvbiBhcyB0aGlzIG9iamVjdCBkb2VzLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBleHBlY3RhdGlvbl9iYXNlXyA9PSByaHMuZXhwZWN0YXRpb25fYmFzZV87Ci0gIH0KLQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgRXhwZWN0YXRpb25TZXQ7Ci0gIGZyaWVuZCBjbGFzcyBTZXF1ZW5jZTsKLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZTsKLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZEV4cGVjdGF0aW9uOwotCi0gIC8vIFRoaXMgY29tcGFyYXRvciBpcyBuZWVkZWQgZm9yIHB1dHRpbmcgRXhwZWN0YXRpb24gb2JqZWN0cyBpbnRvIGEgc2V0LgotICBjbGFzcyBMZXNzIHsKLSAgIHB1YmxpYzoKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgRXhwZWN0YXRpb24mIGxocywgY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgewotICAgICAgcmV0dXJuIGxocy5leHBlY3RhdGlvbl9iYXNlXy5nZXQoKSA8IHJocy5leHBlY3RhdGlvbl9iYXNlXy5nZXQoKTsKLSAgICB9Ci0gIH07Ci0KLSAgdHlwZWRlZiA6OnN0ZDo6c2V0PEV4cGVjdGF0aW9uLCBMZXNzPiBTZXQ7Ci0KLSAgRXhwZWN0YXRpb24oCi0gICAgICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlPiYgZXhwZWN0YXRpb25fYmFzZSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhpcyBvYmplY3QgcmVmZXJlbmNlcy4KLSAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mCi0gIGV4cGVjdGF0aW9uX2Jhc2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4cGVjdGF0aW9uX2Jhc2VfOwotICB9Ci0KLSAgLy8gQSBsaW5rZWRfcHRyIHRoYXQgY28tb3ducyB0aGUgZXhwZWN0YXRpb24gdGhpcyBoYW5kbGUgcmVmZXJlbmNlcy4KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4gZXhwZWN0YXRpb25fYmFzZV87Ci19OwotCi0vLyBBIHNldCBvZiBleHBlY3RhdGlvbiBoYW5kbGVzLiAgVXNlZnVsIGluIHRoZSAuQWZ0ZXIoKSBjbGF1c2Ugb2YKLS8vIEVYUEVDVF9DQUxMKCkgZm9yIHNldHRpbmcgdGhlIChwYXJ0aWFsKSBvcmRlciBvZiBleHBlY3RhdGlvbnMuICBUaGUKLS8vIHN5bnRheDoKLS8vCi0vLyAgIEV4cGVjdGF0aW9uU2V0IGVzOwotLy8gICBlcyArPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOwotLy8gICBlcyArPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOwotLy8gICBFWFBFQ1RfQ0FMTCguLi4pLkFmdGVyKGVzKS4uLjsKLS8vCi0vLyBzZXRzIHRocmVlIGV4cGVjdGF0aW9ucyB3aGVyZSB0aGUgbGFzdCBvbmUgY2FuIG9ubHkgYmUgbWF0Y2hlZAotLy8gYWZ0ZXIgdGhlIGZpcnN0IHR3byBoYXZlIGJvdGggYmVlbiBzYXRpc2ZpZWQuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBjb3B5YWJsZSBhbmQgaGFzIHZhbHVlIHNlbWFudGljcy4KLWNsYXNzIEV4cGVjdGF0aW9uU2V0IHsKLSBwdWJsaWM6Ci0gIC8vIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvciB0aGF0IGNhbiByZWFkIGEgY29uc3QgZWxlbWVudCBpbiB0aGUgc2V0LgotICB0eXBlZGVmIEV4cGVjdGF0aW9uOjpTZXQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotCi0gIC8vIEFuIG9iamVjdCBzdG9yZWQgaW4gdGhlIHNldC4gIFRoaXMgaXMgYW4gYWxpYXMgb2YgRXhwZWN0YXRpb24uCi0gIHR5cGVkZWYgRXhwZWN0YXRpb246OlNldDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotCi0gIC8vIENvbnN0cnVjdHMgYW4gZW1wdHkgc2V0LgotICBFeHBlY3RhdGlvblNldCgpIHt9Ci0KLSAgLy8gVGhpcyBzaW5nbGUtYXJndW1lbnQgY3RvciBtdXN0IG5vdCBiZSBleHBsaWNpdCwgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUKLSAgLy8gICBFeHBlY3RhdGlvblNldCBlcyA9IEVYUEVDVF9DQUxMKC4uLik7Ci0gIC8vIHN5bnRheC4KLSAgRXhwZWN0YXRpb25TZXQoaW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZSYgZXhwKSB7ICAvLyBOT0xJTlQKLSAgICAqdGhpcyArPSBFeHBlY3RhdGlvbihleHApOwotICB9Ci0KLSAgLy8gVGhpcyBzaW5nbGUtYXJndW1lbnQgY3RvciBpbXBsZW1lbnRzIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbQotICAvLyBFeHBlY3RhdGlvbiBhbmQgdGh1cyBtdXN0IG5vdCBiZSBleHBsaWNpdC4gIFRoaXMgYWxsb3dzIGVpdGhlciBhbgotICAvLyBFeHBlY3RhdGlvbiBvciBhbiBFeHBlY3RhdGlvblNldCB0byBiZSB1c2VkIGluIC5BZnRlcigpLgotICBFeHBlY3RhdGlvblNldChjb25zdCBFeHBlY3RhdGlvbiYgZSkgeyAgLy8gTk9MSU5UCi0gICAgKnRoaXMgKz0gZTsKLSAgfQotCi0gIC8vIFRoZSBjb21waWxlci1nZW5lcmF0b3IgY3RvciBhbmQgb3BlcmF0b3I9IHdvcmtzIGV4YWN0bHkgYXMKLSAgLy8gaW50ZW5kZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVmaW5lIG91ciBvd24uCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiByaHMgY29udGFpbnMgdGhlIHNhbWUgc2V0IG9mIEV4cGVjdGF0aW9uIG9iamVjdHMKLSAgLy8gYXMgdGhpcyBkb2VzLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXhwZWN0YXRpb25TZXQmIHJocykgY29uc3QgewotICAgIHJldHVybiBleHBlY3RhdGlvbnNfID09IHJocy5leHBlY3RhdGlvbnNfOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4cGVjdGF0aW9uU2V0JiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIHN5bnRheAotICAvLyAgIGV4cGVjdGF0aW9uX3NldCArPSBFWFBFQ1RfQ0FMTCguLi4pOwotICBFeHBlY3RhdGlvblNldCYgb3BlcmF0b3IrPShjb25zdCBFeHBlY3RhdGlvbiYgZSkgewotICAgIGV4cGVjdGF0aW9uc18uaW5zZXJ0KGUpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihleHBlY3RhdGlvbnNfLnNpemUoKSk7IH0KLQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGV4cGVjdGF0aW9uc18uYmVnaW4oKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBleHBlY3RhdGlvbnNfLmVuZCgpOyB9Ci0KLSBwcml2YXRlOgotICBFeHBlY3RhdGlvbjo6U2V0IGV4cGVjdGF0aW9uc187Ci19OwotCi0KLS8vIFNlcXVlbmNlIG9iamVjdHMgYXJlIHVzZWQgYnkgYSB1c2VyIHRvIHNwZWNpZnkgdGhlIHJlbGF0aXZlIG9yZGVyCi0vLyBpbiB3aGljaCB0aGUgZXhwZWN0YXRpb25zIHNob3VsZCBtYXRjaC4gIFRoZXkgYXJlIGNvcHlhYmxlICh3ZSByZWx5Ci0vLyBvbiB0aGUgY29tcGlsZXItZGVmaW5lZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yKS4KLWNsYXNzIEdURVNUX0FQSV8gU2VxdWVuY2UgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBzZXF1ZW5jZS4KLSAgU2VxdWVuY2UoKSA6IGxhc3RfZXhwZWN0YXRpb25fKG5ldyBFeHBlY3RhdGlvbikge30KLQotICAvLyBBZGRzIGFuIGV4cGVjdGF0aW9uIHRvIHRoaXMgc2VxdWVuY2UuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlCi0gIC8vIHRoYXQgbm8gb3RoZXIgdGhyZWFkIGlzIGFjY2Vzc2luZyB0aGlzIFNlcXVlbmNlIG9iamVjdC4KLSAgdm9pZCBBZGRFeHBlY3RhdGlvbihjb25zdCBFeHBlY3RhdGlvbiYgZXhwZWN0YXRpb24pIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGxhc3QgZXhwZWN0YXRpb24gaW4gdGhpcyBzZXF1ZW5jZS4gIFdlIHVzZSBhIGxpbmtlZF9wdHIgaGVyZQotICAvLyBiZWNhdXNlIFNlcXVlbmNlIG9iamVjdHMgYXJlIGNvcHlhYmxlIGFuZCB3ZSB3YW50IHRoZSBjb3BpZXMgdG8KLSAgLy8gYmUgYWxpYXNlcy4gIFRoZSBsaW5rZWRfcHRyIGFsbG93cyB0aGUgY29waWVzIHRvIGNvLW93biBhbmQgc2hhcmUKLSAgLy8gdGhlIHNhbWUgRXhwZWN0YXRpb24gb2JqZWN0LgotICBpbnRlcm5hbDo6bGlua2VkX3B0cjxFeHBlY3RhdGlvbj4gbGFzdF9leHBlY3RhdGlvbl87Ci19OyAgLy8gY2xhc3MgU2VxdWVuY2UKLQotLy8gQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYXVzZXMgYWxsIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50cwotLy8gZW5jb3VudGVyZWQgaW4gaXRzIHNjb3BlIHRvIGJlIHB1dCBpbiBhbiBhbm9ueW1vdXMgc2VxdWVuY2UuICBUaGUKLS8vIHdvcmsgaXMgZG9uZSBpbiB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IuICBZb3Ugc2hvdWxkIG9ubHkKLS8vIGNyZWF0ZSBhbiBJblNlcXVlbmNlIG9iamVjdCBvbiB0aGUgc3RhY2suCi0vLwotLy8gVGhlIHNvbGUgcHVycG9zZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBzdXBwb3J0IGVhc3kgZGVmaW5pdGlvbiBvZgotLy8gc2VxdWVudGlhbCBleHBlY3RhdGlvbnMsIGUuZy4KLS8vCi0vLyAgIHsKLS8vICAgICBJblNlcXVlbmNlIGR1bW15OyAgLy8gVGhlIG5hbWUgb2YgdGhlIG9iamVjdCBkb2Vzbid0IG1hdHRlci4KLS8vCi0vLyAgICAgLy8gVGhlIGZvbGxvd2luZyBleHBlY3RhdGlvbnMgbXVzdCBtYXRjaCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuCi0vLyAgICAgRVhQRUNUX0NBTEwoYSwgQmFyKCkpLi4uOwotLy8gICAgIEVYUEVDVF9DQUxMKGEsIEJheigpKS4uLjsKLS8vICAgICAuLi4KLS8vICAgICBFWFBFQ1RfQ0FMTChiLCBYeXooKSkuLi47Ci0vLyAgIH0KLS8vCi0vLyBZb3UgY2FuIGNyZWF0ZSBJblNlcXVlbmNlIG9iamVjdHMgaW4gbXVsdGlwbGUgdGhyZWFkcywgYXMgbG9uZyBhcwotLy8gdGhleSBhcmUgdXNlZCB0byBhZmZlY3QgZGlmZmVyZW50IG1vY2sgb2JqZWN0cy4gIFRoZSBpZGVhIGlzIHRoYXQKLS8vIGVhY2ggdGhyZWFkIGNhbiBjcmVhdGUgYW5kIHNldCB1cCBpdHMgb3duIG1vY2tzIGFzIGlmIGl0J3MgdGhlIG9ubHkKLS8vIHRocmVhZC4gIEhvd2V2ZXIsIGZvciBjbGFyaXR5IG9mIHlvdXIgdGVzdHMgd2UgcmVjb21tZW5kIHlvdSB0byBzZXQKLS8vIHVwIG1vY2tzIGluIHRoZSBtYWluIHRocmVhZCB1bmxlc3MgeW91IGhhdmUgYSBnb29kIHJlYXNvbiBub3QgdG8gZG8KLS8vIHNvLgotY2xhc3MgR1RFU1RfQVBJXyBJblNlcXVlbmNlIHsKLSBwdWJsaWM6Ci0gIEluU2VxdWVuY2UoKTsKLSAgfkluU2VxdWVuY2UoKTsKLSBwcml2YXRlOgotICBib29sIHNlcXVlbmNlX2NyZWF0ZWRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW5TZXF1ZW5jZSk7ICAvLyBOT0xJTlQKLX0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFBvaW50cyB0byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaW50cm9kdWNlZCBieSBhIGxpdmluZyBJblNlcXVlbmNlCi0vLyBvYmplY3QgKGlmIGFueSkgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIE5VTEwuCi1HVEVTVF9BUElfIGV4dGVybiBUaHJlYWRMb2NhbDxTZXF1ZW5jZSo+IGdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2U7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBleHBlY3RhdGlvbnMuCi0vLwotLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIGZvciBoYXZpbmcgYSB0eXBlLWFnbm9zdGljIGJhc2UgY2xhc3MgZm9yCi0vLyBFeHBlY3RhdGlvbjoKLS8vCi0vLyAgIDEuIFdlIG5lZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2YgZXhwZWN0YXRpb25zIG9mIGRpZmZlcmVudAotLy8gICB0eXBlcyAoZS5nLiBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgYSBwYXJ0aWN1bGFyIGV4cGVjdGF0aW9uLCBhbGwKLS8vICAgZXhwZWN0YXRpb25zIGluIGEgc2VxdWVuY2UpLiAgVGhlcmVmb3JlIHRoZXNlIGV4cGVjdGF0aW9uIG9iamVjdHMKLS8vICAgbXVzdCBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzLgotLy8KLS8vICAgMi4gV2UgY2FuIGF2b2lkIGJpbmFyeSBjb2RlIGJsb2F0IGJ5IG1vdmluZyBtZXRob2RzIG5vdCBkZXBlbmRpbmcKLS8vICAgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IG9mIEV4cGVjdGF0aW9uIHRvIHRoZSBiYXNlIGNsYXNzLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgYW5kIG11c3RuJ3QgYmUgdXNlZCBieSB1c2VyIGNvZGUgZGlyZWN0bHkuCi1jbGFzcyBHVEVTVF9BUElfIEV4cGVjdGF0aW9uQmFzZSB7Ci0gcHVibGljOgotICAvLyBzb3VyY2VfdGV4dCBpcyB0aGUgRVhQRUNUX0NBTEwoLi4uKSBzb3VyY2UgdGhhdCBjcmVhdGVkIHRoaXMgRXhwZWN0YXRpb24uCi0gIEV4cGVjdGF0aW9uQmFzZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3Qgc3RyaW5nJiBzb3VyY2VfdGV4dCk7Ci0KLSAgdmlydHVhbCB+RXhwZWN0YXRpb25CYXNlKCk7Ci0KLSAgLy8gV2hlcmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdhcyB0aGUgZXhwZWN0YXRpb24gc3BlYyBkZWZpbmVkPwotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0KLSAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQotICBjb25zdCBjaGFyKiBzb3VyY2VfdGV4dCgpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV90ZXh0Xy5jX3N0cigpOyB9Ci0gIC8vIFJldHVybnMgdGhlIGNhcmRpbmFsaXR5IHNwZWNpZmllZCBpbiB0aGUgZXhwZWN0YXRpb24gc3BlYy4KLSAgY29uc3QgQ2FyZGluYWxpdHkmIGNhcmRpbmFsaXR5KCkgY29uc3QgeyByZXR1cm4gY2FyZGluYWxpdHlfOyB9Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBvZiB0aGlzIGV4cGVjdGF0aW9uLgotICB2b2lkIERlc2NyaWJlTG9jYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUoKSwgbGluZSgpKSA8PCAiICI7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgaG93IG1hbnkgdGltZXMgYSBmdW5jdGlvbiBjYWxsIG1hdGNoaW5nIHRoaXMKLSAgLy8gZXhwZWN0YXRpb24gaGFzIG9jY3VycmVkLgotICB2b2lkIERlc2NyaWJlQ2FsbENvdW50VG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIElmIHRoaXMgbW9jayBtZXRob2QgaGFzIGFuIGV4dHJhIG1hdGNoZXIgKGkuZS4gLldpdGgobWF0Y2hlcikpLAotICAvLyBkZXNjcmliZXMgaXQgdG8gdGhlIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBNYXliZURlc2NyaWJlRXh0cmFNYXRjaGVyVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OkV4cGVjdGF0aW9uOwotICBmcmllbmQgY2xhc3MgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTsKLQotICBlbnVtIENsYXVzZSB7Ci0gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBtZW1iZXJzIQotICAgIGtOb25lLAotICAgIGtXaXRoLAotICAgIGtUaW1lcywKLSAgICBrSW5TZXF1ZW5jZSwKLSAgICBrQWZ0ZXIsCi0gICAga1dpbGxPbmNlLAotICAgIGtXaWxsUmVwZWF0ZWRseSwKLSAgICBrUmV0aXJlc09uU2F0dXJhdGlvbgotICB9OwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3Qgdm9pZCo+IFVudHlwZWRBY3Rpb25zOwotCi0gIC8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uLgotICB2aXJ0dWFsIEV4cGVjdGF0aW9uIEdldEhhbmRsZSgpID0gMDsKLQotICAvLyBBc3NlcnRzIHRoYXQgdGhlIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0gIHZvaWQgQXNzZXJ0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7Ci0gICAgQXNzZXJ0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7Ci0gIH0KLQotICAvLyBFeHBlY3RzIHRoYXQgdGhlIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0gIHZvaWQgRXhwZWN0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7Ci0gICAgRXhwZWN0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7Ci0gIH0KLQotICAvLyBFeHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgY2FyZGluYWxpdHkgb2YgdGhpcyBleHBlY3RhdGlvbi4gIFVzZWQKLSAgLy8gYnkgdGhlIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSAuVGltZXMoKSBjbGF1c2UuCi0gIHZvaWQgU3BlY2lmeUNhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5JiBjYXJkaW5hbGl0eSk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIGNhcmRpbmFsaXR5IGV4cGxpY2l0bHkKLSAgLy8gdXNpbmcgYSAuVGltZXMoKS4KLSAgYm9vbCBjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSBjb25zdCB7IHJldHVybiBjYXJkaW5hbGl0eV9zcGVjaWZpZWRfOyB9Ci0KLSAgLy8gU2V0cyB0aGUgY2FyZGluYWxpdHkgb2YgdGhpcyBleHBlY3RhdGlvbiBzcGVjLgotICB2b2lkIHNldF9jYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgewotICAgIGNhcmRpbmFsaXR5XyA9IGFfY2FyZGluYWxpdHk7Ci0gIH0KLQotICAvLyBUaGUgZm9sbG93aW5nIGdyb3VwIG9mIG1ldGhvZHMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZQotICAvLyBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCwgYW5kIG9ubHkgd2hlbiBnX2dtb2NrX211dGV4IGlzIGhlbGQgYnkKLSAgLy8gdGhlIGN1cnJlbnQgdGhyZWFkLgotCi0gIC8vIFJldGlyZXMgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24uCi0gIHZvaWQgUmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHJldGlyZWQuCi0gIGJvb2wgaXNfcmV0aXJlZCgpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIHJldHVybiByZXRpcmVkXzsKLSAgfQotCi0gIC8vIFJldGlyZXMgdGhpcyBleHBlY3RhdGlvbi4KLSAgdm9pZCBSZXRpcmUoKQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICByZXRpcmVkXyA9IHRydWU7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgc2F0aXNmaWVkLgotICBib29sIElzU2F0aXNmaWVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgc2F0dXJhdGVkLgotICBib29sIElzU2F0dXJhdGVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgb3Zlci1zYXR1cmF0ZWQuCi0gIGJvb2wgSXNPdmVyU2F0dXJhdGVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNPdmVyU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudF8pOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiBhcmUgc2F0aXNmaWVkLgotICBib29sIEFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIEFkZHMgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiB0byAncmVzdWx0Jy4KLSAgdm9pZCBGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKEV4cGVjdGF0aW9uU2V0KiByZXN1bHQpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIHRoaXMgZXhwZWN0YXRpb24gaGFzIGJlZW4gaW52b2tlZC4KLSAgaW50IGNhbGxfY291bnQoKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICByZXR1cm4gY2FsbF9jb3VudF87Ci0gIH0KLQotICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgdGhpcyBleHBlY3RhdGlvbiBoYXMgYmVlbiBpbnZva2VkLgotICB2b2lkIEluY3JlbWVudENhbGxDb3VudCgpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGNhbGxfY291bnRfKys7Ci0gIH0KLQotICAvLyBDaGVja3MgdGhlIGFjdGlvbiBjb3VudCAoaS5lLiB0aGUgbnVtYmVyIG9mIFdpbGxPbmNlKCkgYW5kCi0gIC8vIFdpbGxSZXBlYXRlZGx5KCkgY2xhdXNlcykgYWdhaW5zdCB0aGUgY2FyZGluYWxpdHkgaWYgdGhpcyBoYXNuJ3QKLSAgLy8gYmVlbiBkb25lIGJlZm9yZS4gIFByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIHRvbyBtYW55IG9yIHRvbwotICAvLyBmZXcgYWN0aW9ucy4KLSAgdm9pZCBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCkgY29uc3QKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0KLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6U2VxdWVuY2U7Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpFeHBlY3RhdGlvblRlc3RlcjsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIGZyaWVuZCBjbGFzcyBUeXBlZEV4cGVjdGF0aW9uOwotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KLSAgdm9pZCBVbnR5cGVkVGltZXMoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpOwotCi0gIC8vIFRoaXMgZ3JvdXAgb2YgZmllbGRzIGFyZSBwYXJ0IG9mIHRoZSBzcGVjIGFuZCB3b24ndCBjaGFuZ2UgYWZ0ZXIKLSAgLy8gYW4gRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnQgZmluaXNoZXMuCi0gIGNvbnN0IGNoYXIqIGZpbGVfOyAgICAgICAgICAvLyBUaGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBleHBlY3RhdGlvbi4KLSAgaW50IGxpbmVfOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhwZWN0YXRpb24uCi0gIGNvbnN0IHN0cmluZyBzb3VyY2VfdGV4dF87ICAvLyBUaGUgRVhQRUNUX0NBTEwoLi4uKSBzb3VyY2UgdGV4dC4KLSAgLy8gVHJ1ZSBpZmYgdGhlIGNhcmRpbmFsaXR5IGlzIHNwZWNpZmllZCBleHBsaWNpdGx5LgotICBib29sIGNhcmRpbmFsaXR5X3NwZWNpZmllZF87Ci0gIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5XzsgICAgICAgICAgICAvLyBUaGUgY2FyZGluYWxpdHkgb2YgdGhlIGV4cGVjdGF0aW9uLgotICAvLyBUaGUgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIChpLmUuIGV4cGVjdGF0aW9ucyB0aGF0IG11c3QgYmUKLSAgLy8gc2F0aXNmaWVkIGJlZm9yZSB0aGlzIGV4cGVjdGF0aW9uIGNhbiBiZSBtYXRjaGVkKSBvZiB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uLiAgV2UgdXNlIGxpbmtlZF9wdHIgaW4gdGhlIHNldCBiZWNhdXNlIHdlIHdhbnQgYW4KLSAgLy8gRXhwZWN0YXRpb24gb2JqZWN0IHRvIGJlIGNvLW93bmVkIGJ5IGl0cyBGdW5jdGlvbk1vY2tlciBhbmQgaXRzCi0gIC8vIHN1Y2Nlc3NvcnMuICBUaGlzIGFsbG93cyBtdWx0aXBsZSBtb2NrIG9iamVjdHMgdG8gYmUgZGVsZXRlZCBhdAotICAvLyBkaWZmZXJlbnQgdGltZXMuCi0gIEV4cGVjdGF0aW9uU2V0IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXzsKLQotICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBhcmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGV4cGVjdGF0aW9uLAotICAvLyBhbmQgY2FuIGNoYW5nZSBhcyB0aGUgbW9jayBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gIGludCBjYWxsX2NvdW50XzsgIC8vIEhvdyBtYW55IHRpbWVzIHRoaXMgZXhwZWN0YXRpb24gaGFzIGJlZW4gaW52b2tlZC4KLSAgYm9vbCByZXRpcmVkXzsgICAgLy8gVHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBoYXMgcmV0aXJlZC4KLSAgVW50eXBlZEFjdGlvbnMgdW50eXBlZF9hY3Rpb25zXzsKLSAgYm9vbCBleHRyYV9tYXRjaGVyX3NwZWNpZmllZF87Ci0gIGJvb2wgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF87ICAvLyBUcnVlIGlmIGEgV2lsbFJlcGVhdGVkbHkoKSB3YXMgc3BlY2lmaWVkLgotICBib29sIHJldGlyZXNfb25fc2F0dXJhdGlvbl87Ci0gIENsYXVzZSBsYXN0X2NsYXVzZV87Ci0gIG11dGFibGUgYm9vbCBhY3Rpb25fY291bnRfY2hlY2tlZF87ICAvLyBVbmRlciBtdXRleF8uCi0gIG11dGFibGUgTXV0ZXggbXV0ZXhfOyAgLy8gUHJvdGVjdHMgYWN0aW9uX2NvdW50X2NoZWNrZWRfLgotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRXhwZWN0YXRpb25CYXNlKTsKLX07ICAvLyBjbGFzcyBFeHBlY3RhdGlvbkJhc2UKLQotLy8gSW1wZW1lbnRzIGFuIGV4cGVjdGF0aW9uIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgVHlwZWRFeHBlY3RhdGlvbiA6IHB1YmxpYyBFeHBlY3RhdGlvbkJhc2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudE1hdGNoZXJUdXBsZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLQotICBUeXBlZEV4cGVjdGF0aW9uKEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogb3duZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlLCBpbnQgYV9saW5lLCBjb25zdCBzdHJpbmcmIGFfc291cmNlX3RleHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG0pCi0gICAgICA6IEV4cGVjdGF0aW9uQmFzZShhX2ZpbGUsIGFfbGluZSwgYV9zb3VyY2VfdGV4dCksCi0gICAgICAgIG93bmVyXyhvd25lciksCi0gICAgICAgIG1hdGNoZXJzXyhtKSwKLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgZXh0cmFfbWF0Y2hlcl8gc2hvdWxkIG1hdGNoIGFueXRoaW5nLiAgSG93ZXZlciwKLSAgICAgICAgLy8gd2UgY2Fubm90IGluaXRpYWxpemUgaXQgd2l0aCBfIGFzIHRoYXQgdHJpZ2dlcnMgYSBjb21waWxlcgotICAgICAgICAvLyBidWcgaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciAoY2Fubm90IGRlY2lkZSBiZXR3ZWVuIHR3bwotICAgICAgICAvLyBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBvZiBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPikuCi0gICAgICAgIGV4dHJhX21hdGNoZXJfKEE8Y29uc3QgQXJndW1lbnRUdXBsZSY+KCkpLAotICAgICAgICByZXBlYXRlZF9hY3Rpb25fKERvRGVmYXVsdCgpKSB7fQotCi0gIHZpcnR1YWwgflR5cGVkRXhwZWN0YXRpb24oKSB7Ci0gICAgLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBhY3Rpb24gY291bnQgaWYgaXQgaGFzbid0IGJlZW4gZG9uZQotICAgIC8vIHlldCAoZm9yIGV4YW1wbGUsIGlmIHRoZSBleHBlY3RhdGlvbiB3YXMgbmV2ZXIgdXNlZCkuCi0gICAgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpOwotICAgIGZvciAoVW50eXBlZEFjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW50eXBlZF9hY3Rpb25zXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdW50eXBlZF9hY3Rpb25zXy5lbmQoKTsgKytpdCkgewotICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IEFjdGlvbjxGPio+KCppdCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpdGgoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFdpdGgoY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIG0pIHsKLSAgICBpZiAobGFzdF9jbGF1c2VfID09IGtXaXRoKSB7Ci0gICAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi5XaXRoKCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiLldpdGgoKSBtdXN0IGJlIHRoZSBmaXJzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNsYXVzZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpLiIpOwotICAgIH0KLSAgICBsYXN0X2NsYXVzZV8gPSBrV2l0aDsKLQotICAgIGV4dHJhX21hdGNoZXJfID0gbTsKLSAgICBleHRyYV9tYXRjaGVyX3NwZWNpZmllZF8gPSB0cnVlOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgVGltZXMoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKLSAgICBFeHBlY3RhdGlvbkJhc2U6OlVudHlwZWRUaW1lcyhhX2NhcmRpbmFsaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFRpbWVzKGludCBuKSB7Ci0gICAgcmV0dXJuIFRpbWVzKEV4YWN0bHkobikpOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLkluU2VxdWVuY2UoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDw9IGtJblNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAiLkluU2VxdWVuY2UoKSBjYW5ub3QgYXBwZWFyIGFmdGVyIC5BZnRlcigpLCIKLSAgICAgICAgICAgICAgICAgICAgICAgIiAuV2lsbE9uY2UoKSwgLldpbGxSZXBlYXRlZGx5KCksIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga0luU2VxdWVuY2U7Ci0KLSAgICBzLkFkZEV4cGVjdGF0aW9uKEdldEhhbmRsZSgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMikgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxKS5JblNlcXVlbmNlKHMyKTsKLSAgfQotICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzMSwgY29uc3QgU2VxdWVuY2UmIHMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlJiBzMykgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxLCBzMikuSW5TZXF1ZW5jZShzMyk7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczMsIGNvbnN0IFNlcXVlbmNlJiBzNCkgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxLCBzMiwgczMpLkluU2VxdWVuY2UoczQpOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHMzLCBjb25zdCBTZXF1ZW5jZSYgczQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHM1KSB7Ci0gICAgcmV0dXJuIEluU2VxdWVuY2UoczEsIHMyLCBzMywgczQpLkluU2VxdWVuY2UoczUpOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGF0IC5BZnRlcigpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDw9IGtBZnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5BZnRlcigpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgLldpbGxPbmNlKCksIgotICAgICAgICAgICAgICAgICAgICAgICAiIC5XaWxsUmVwZWF0ZWRseSgpLCBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICIuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOwotICAgIGxhc3RfY2xhdXNlXyA9IGtBZnRlcjsKLQotICAgIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcy5iZWdpbigpOyBpdCAhPSBzLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18gKz0gKml0OwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIpIHsKLSAgICByZXR1cm4gQWZ0ZXIoczEpLkFmdGVyKHMyKTsKLSAgfQotICBUeXBlZEV4cGVjdGF0aW9uJiBBZnRlcihjb25zdCBFeHBlY3RhdGlvblNldCYgczEsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMzKSB7Ci0gICAgcmV0dXJuIEFmdGVyKHMxLCBzMikuQWZ0ZXIoczMpOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMSwgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNCkgewotICAgIHJldHVybiBBZnRlcihzMSwgczIsIHMzKS5BZnRlcihzNCk7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMywgY29uc3QgRXhwZWN0YXRpb25TZXQmIHM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczUpIHsKLSAgICByZXR1cm4gQWZ0ZXIoczEsIHMyLCBzMywgczQpLkFmdGVyKHM1KTsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaWxsT25jZSgpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgV2lsbE9uY2UoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDw9IGtXaWxsT25jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsT25jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxSZXBlYXRlZGx5KCkgb3IgLlJldGlyZXNPblNhdHVyYXRpb24oKS4iKTsKLSAgICBsYXN0X2NsYXVzZV8gPSBrV2lsbE9uY2U7Ci0KLSAgICB1bnR5cGVkX2FjdGlvbnNfLnB1c2hfYmFjayhuZXcgQWN0aW9uPEY+KGFjdGlvbikpOwotICAgIGlmICghY2FyZGluYWxpdHlfc3BlY2lmaWVkKCkpIHsKLSAgICAgIHNldF9jYXJkaW5hbGl0eShFeGFjdGx5KHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpKSk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaWxsUmVwZWF0ZWRseSgpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgV2lsbFJlcGVhdGVkbHkoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsKLSAgICBpZiAobGFzdF9jbGF1c2VfID09IGtXaWxsUmVwZWF0ZWRseSkgewotICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICIuV2lsbFJlcGVhdGVkbHkoKSBjYW5ub3QgYXBwZWFyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsKLSAgICB9IGVsc2UgewotICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtXaWxsUmVwZWF0ZWRseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxSZXBlYXRlZGx5KCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7Ci0gICAgfQotICAgIGxhc3RfY2xhdXNlXyA9IGtXaWxsUmVwZWF0ZWRseTsKLSAgICByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXyA9IHRydWU7Ci0KLSAgICByZXBlYXRlZF9hY3Rpb25fID0gYWN0aW9uOwotICAgIGlmICghY2FyZGluYWxpdHlfc3BlY2lmaWVkKCkpIHsKLSAgICAgIHNldF9jYXJkaW5hbGl0eShBdExlYXN0KHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpKSk7Ci0gICAgfQotCi0gICAgLy8gTm93IHRoYXQgbm8gbW9yZSBhY3Rpb24gY2xhdXNlcyBjYW4gYmUgc3BlY2lmaWVkLCB3ZSBjaGVjawotICAgIC8vIHdoZXRoZXIgdGhlaXIgY291bnQgbWFrZXMgc2Vuc2UuCi0gICAgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2xhdXNlLgotICBUeXBlZEV4cGVjdGF0aW9uJiBSZXRpcmVzT25TYXR1cmF0aW9uKCkgewotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrUmV0aXJlc09uU2F0dXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25jZS4iKTsKLSAgICBsYXN0X2NsYXVzZV8gPSBrUmV0aXJlc09uU2F0dXJhdGlvbjsKLSAgICByZXRpcmVzX29uX3NhdHVyYXRpb25fID0gdHJ1ZTsKLQotICAgIC8vIE5vdyB0aGF0IG5vIG1vcmUgYWN0aW9uIGNsYXVzZXMgY2FuIGJlIHNwZWNpZmllZCwgd2UgY2hlY2sKLSAgICAvLyB3aGV0aGVyIHRoZWlyIGNvdW50IG1ha2VzIHNlbnNlLgotICAgIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBtYXRjaGVycyBmb3IgdGhlIGFyZ3VtZW50cyBhcyBzcGVjaWZpZWQgaW5zaWRlIHRoZQotICAvLyBFWFBFQ1RfQ0FMTCgpIG1hY3JvLgotICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hdGNoZXJzXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG1hdGNoZXIgc3BlY2lmaWVkIGJ5IHRoZSAuV2l0aCgpIGNsYXVzZS4KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIGV4dHJhX21hdGNoZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4dHJhX21hdGNoZXJfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSB0aGUgLldpbGxSZXBlYXRlZGx5KCkgY2xhdXNlLgotICBjb25zdCBBY3Rpb248Rj4mIHJlcGVhdGVkX2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIHJlcGVhdGVkX2FjdGlvbl87IH0KLQotICAvLyBJZiB0aGlzIG1vY2sgbWV0aG9kIGhhcyBhbiBleHRyYSBtYXRjaGVyIChpLmUuIC5XaXRoKG1hdGNoZXIpKSwKLSAgLy8gZGVzY3JpYmVzIGl0IHRvIHRoZSBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgTWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGlmIChleHRyYV9tYXRjaGVyX3NwZWNpZmllZF8pIHsKLSAgICAgICpvcyA8PCAiICAgIEV4cGVjdGVkIGFyZ3M6ICI7Ci0gICAgICBleHRyYV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAgICpvcyA8PCAiXG4iOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBmcmllbmQgY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIC8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uLgotICB2aXJ0dWFsIEV4cGVjdGF0aW9uIEdldEhhbmRsZSgpIHsKLSAgICByZXR1cm4gb3duZXJfLT5HZXRIYW5kbGVPZih0aGlzKTsKLSAgfQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBFWFBFQ1RfQ0FMTCgpCi0gIC8vIHN0YXRlbWVudCBmaW5pc2hlcyBhbmQgd2hlbiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMKLSAgLy8gZ19nbW9ja19tdXRleC4KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICBib29sIE1hdGNoZXMoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIFR1cGxlTWF0Y2hlcyhtYXRjaGVyc18sIGFyZ3MpICYmIGV4dHJhX21hdGNoZXJfLk1hdGNoZXMoYXJncyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gc2hvdWxkIGhhbmRsZSB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICBib29sIFNob3VsZEhhbmRsZUFyZ3VtZW50cyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLQotICAgIC8vIEluIGNhc2UgdGhlIGFjdGlvbiBjb3VudCB3YXNuJ3QgY2hlY2tlZCB3aGVuIHRoZSBleHBlY3RhdGlvbgotICAgIC8vIHdhcyBkZWZpbmVkIChlLmcuIGlmIHRoaXMgZXhwZWN0YXRpb24gaGFzIG5vIFdpbGxSZXBlYXRlZGx5KCkKLSAgICAvLyBvciBSZXRpcmVzT25TYXR1cmF0aW9uKCkgY2xhdXNlKSwgd2UgY2hlY2sgaXQgd2hlbiB0aGUKLSAgICAvLyBleHBlY3RhdGlvbiBpcyB1c2VkIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7Ci0gICAgcmV0dXJuICFpc19yZXRpcmVkKCkgJiYgQWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpICYmIE1hdGNoZXMoYXJncyk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBtYXRjaGluZyB0aGUgYXJndW1lbnRzIGFnYWluc3QgdGhpcwotICAvLyBleHBlY3RhdGlvbiB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4KLSAgdm9pZCBFeHBsYWluTWF0Y2hSZXN1bHRUbygKLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLQotICAgIGlmIChpc19yZXRpcmVkKCkpIHsKLSAgICAgICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IHRoZSBleHBlY3RhdGlvbiBpcyBhY3RpdmVcbiIKLSAgICAgICAgICA8PCAiICAgICAgICAgICBBY3R1YWw6IGl0IGlzIHJldGlyZWRcbiI7Ci0gICAgfSBlbHNlIGlmICghTWF0Y2hlcyhhcmdzKSkgewotICAgICAgaWYgKCFUdXBsZU1hdGNoZXMobWF0Y2hlcnNfLCBhcmdzKSkgewotICAgICAgICBFeHBsYWluTWF0Y2hGYWlsdXJlVHVwbGVUbyhtYXRjaGVyc18sIGFyZ3MsIG9zKTsKLSAgICAgIH0KLSAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgICBpZiAoIWV4dHJhX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhcmdzLCAmbGlzdGVuZXIpKSB7Ci0gICAgICAgICpvcyA8PCAiICAgIEV4cGVjdGVkIGFyZ3M6ICI7Ci0gICAgICAgIGV4dHJhX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgICAgICAqb3MgPDwgIlxuICAgICAgICAgICBBY3R1YWw6IGRvbid0IG1hdGNoIjsKLQotICAgICAgICBpbnRlcm5hbDo6UHJpbnRJZk5vdEVtcHR5KGxpc3RlbmVyLnN0cigpLCBvcyk7Ci0gICAgICAgICpvcyA8PCAiXG4iOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoIUFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSkgewotICAgICAgKm9zIDw8ICIgICAgICAgICBFeHBlY3RlZDogYWxsIHByZS1yZXF1aXNpdGVzIGFyZSBzYXRpc2ZpZWRcbiIKLSAgICAgICAgICA8PCAiICAgICAgICAgICBBY3R1YWw6IHRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzICIKLSAgICAgICAgICA8PCAiYXJlIG5vdCBzYXRpc2ZpZWQ6XG4iOwotICAgICAgRXhwZWN0YXRpb25TZXQgdW5zYXRpc2ZpZWRfcHJlcmVxczsKLSAgICAgIEZpbmRVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMoJnVuc2F0aXNmaWVkX3ByZXJlcXMpOwotICAgICAgaW50IGkgPSAwOwotICAgICAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB1bnNhdGlzZmllZF9wcmVyZXFzLmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ICE9IHVuc2F0aXNmaWVkX3ByZXJlcXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+RGVzY3JpYmVMb2NhdGlvblRvKG9zKTsKLSAgICAgICAgKm9zIDw8ICJwcmUtcmVxdWlzaXRlICMiIDw8IGkrKyA8PCAiXG4iOwotICAgICAgfQotICAgICAgKm9zIDw8ICIgICAgICAgICAgICAgICAgICAgKGVuZCBvZiBwcmUtcmVxdWlzaXRlcylcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoaXMgbGluZSBpcyBoZXJlIGp1c3QgZm9yIGNvbXBsZXRlbmVzcycgc2FrZS4gIEl0IHdpbGwgbmV2ZXIKLSAgICAgIC8vIGJlIGV4ZWN1dGVkIGFzIGN1cnJlbnRseSB0aGUgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKSBmdW5jdGlvbgotICAgICAgLy8gaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgbW9jayBmdW5jdGlvbiBjYWxsIGRvZXMgTk9UIG1hdGNoIHRoZQotICAgICAgLy8gZXhwZWN0YXRpb24uCi0gICAgICAqb3MgPDwgIlRoZSBjYWxsIG1hdGNoZXMgdGhlIGV4cGVjdGF0aW9uLlxuIjsKLSAgICB9Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgdGFrZW4gZm9yIHRoZSBjdXJyZW50IGludm9jYXRpb24uCi0gIGNvbnN0IEFjdGlvbjxGPiYgR2V0Q3VycmVudEFjdGlvbigKLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogbW9ja2VyLAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGNvbnN0IGludCBjb3VudCA9IGNhbGxfY291bnQoKTsKLSAgICBBc3NlcnQoY291bnQgPj0gMSwgX19GSUxFX18sIF9fTElORV9fLAotICAgICAgICAgICAiY2FsbF9jb3VudCgpIGlzIDw9IDAgd2hlbiBHZXRDdXJyZW50QWN0aW9uKCkgaXMgIgotICAgICAgICAgICAiY2FsbGVkIC0gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiIpOwotCi0gICAgY29uc3QgaW50IGFjdGlvbl9jb3VudCA9IHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpOwotICAgIGlmIChhY3Rpb25fY291bnQgPiAwICYmICFyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXyAmJgotICAgICAgICBjb3VudCA+IGFjdGlvbl9jb3VudCkgewotICAgICAgLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFdpbGxPbmNlKCkgYW5kIG5vIFdpbGxSZXBlYXRlZGx5KCksCi0gICAgICAvLyB3ZSB3YXJuIHRoZSB1c2VyIHdoZW4gdGhlIFdpbGxPbmNlKCkgY2xhdXNlcyByYW4gb3V0LgotICAgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIERlc2NyaWJlTG9jYXRpb25Ubygmc3MpOwotICAgICAgc3MgPDwgIkFjdGlvbnMgcmFuIG91dCBpbiAiIDw8IHNvdXJjZV90ZXh0KCkgPDwgIi4uLlxuIgotICAgICAgICAgPDwgIkNhbGxlZCAiIDw8IGNvdW50IDw8ICIgdGltZXMsIGJ1dCBvbmx5ICIKLSAgICAgICAgIDw8IGFjdGlvbl9jb3VudCA8PCAiIFdpbGxPbmNlKCkiCi0gICAgICAgICA8PCAoYWN0aW9uX2NvdW50ID09IDEgPyAiIGlzIiA6ICJzIGFyZSIpIDw8ICIgc3BlY2lmaWVkIC0gIjsKLSAgICAgIG1vY2tlci0+RGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgJnNzKTsKLSAgICAgIExvZyhrV2FybmluZywgc3Muc3RyKCksIDEpOwotICAgIH0KLQotICAgIHJldHVybiBjb3VudCA8PSBhY3Rpb25fY291bnQgPwotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQWN0aW9uPEY+Kj4odW50eXBlZF9hY3Rpb25zX1tjb3VudCAtIDFdKSA6Ci0gICAgICAgIHJlcGVhdGVkX2FjdGlvbigpOwotICB9Ci0KLSAgLy8gR2l2ZW4gdGhlIGFyZ3VtZW50cyBvZiBhIG1vY2sgZnVuY3Rpb24gY2FsbCwgaWYgdGhlIGNhbGwgd2lsbAotICAvLyBvdmVyLXNhdHVyYXRlIHRoaXMgZXhwZWN0YXRpb24sIHJldHVybnMgdGhlIGRlZmF1bHQgYWN0aW9uOwotICAvLyBvdGhlcndpc2UsIHJldHVybnMgdGhlIG5leHQgYWN0aW9uIGluIHRoaXMgZXhwZWN0YXRpb24uICBBbHNvCi0gIC8vIGRlc2NyaWJlcyAqd2hhdCogaGFwcGVuZWQgdG8gJ3doYXQnLCBhbmQgZXhwbGFpbnMgKndoeSogR29vZ2xlCi0gIC8vIE1vY2sgZG9lcyBpdCB0byAnd2h5Jy4gIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdCBhcyBpdCBjYWxscwotICAvLyBJbmNyZW1lbnRDYWxsQ291bnQoKS4gIEEgcmV0dXJuIHZhbHVlIG9mIE5VTEwgbWVhbnMgdGhlIGRlZmF1bHQKLSAgLy8gYWN0aW9uLgotICBjb25zdCBBY3Rpb248Rj4qIEdldEFjdGlvbkZvckFyZ3VtZW50cygKLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogbW9ja2VyLAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aGF0LAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoeSkKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGlmIChJc1NhdHVyYXRlZCgpKSB7Ci0gICAgICAvLyBXZSBoYXZlIGFuIGV4Y2Vzc2l2ZSBjYWxsLgotICAgICAgSW5jcmVtZW50Q2FsbENvdW50KCk7Ci0gICAgICAqd2hhdCA8PCAiTW9jayBmdW5jdGlvbiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIC0gIjsKLSAgICAgIG1vY2tlci0+RGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgd2hhdCk7Ci0gICAgICBEZXNjcmliZUNhbGxDb3VudFRvKHdoeSk7Ci0KLSAgICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBhbGxvdyB0aGUgdXNlciB0byBjb250cm9sIHdoZXRoZXIKLSAgICAgIC8vIHVuZXhwZWN0ZWQgY2FsbHMgc2hvdWxkIGZhaWwgaW1tZWRpYXRlbHkgb3IgY29udGludWUgdXNpbmcgYQotICAgICAgLy8gZmxhZyAtLWdtb2NrX3VuZXhwZWN0ZWRfY2FsbHNfYXJlX2ZhdGFsLgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgSW5jcmVtZW50Q2FsbENvdW50KCk7Ci0gICAgUmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpOwotCi0gICAgaWYgKHJldGlyZXNfb25fc2F0dXJhdGlvbl8gJiYgSXNTYXR1cmF0ZWQoKSkgewotICAgICAgUmV0aXJlKCk7Ci0gICAgfQotCi0gICAgLy8gTXVzdCBiZSBkb25lIGFmdGVyIEluY3JlbWVudENvdW50KCkhCi0gICAgKndoYXQgPDwgIk1vY2sgZnVuY3Rpb24gY2FsbCBtYXRjaGVzICIgPDwgc291cmNlX3RleHQoKSA8PCIuLi5cbiI7Ci0gICAgcmV0dXJuICYoR2V0Q3VycmVudEFjdGlvbihtb2NrZXIsIGFyZ3MpKTsKLSAgfQotCi0gIC8vIEFsbCB0aGUgZmllbGRzIGJlbG93IHdvbid0IGNoYW5nZSBvbmNlIHRoZSBFWFBFQ1RfQ0FMTCgpCi0gIC8vIHN0YXRlbWVudCBmaW5pc2hlcy4KLSAgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBjb25zdCBvd25lcl87Ci0gIEFyZ3VtZW50TWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKLSAgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4gZXh0cmFfbWF0Y2hlcl87Ci0gIEFjdGlvbjxGPiByZXBlYXRlZF9hY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVHlwZWRFeHBlY3RhdGlvbik7Ci19OyAgLy8gY2xhc3MgVHlwZWRFeHBlY3RhdGlvbgotCi0vLyBBIE1vY2tTcGVjIG9iamVjdCBpcyB1c2VkIGJ5IE9OX0NBTEwoKSBvciBFWFBFQ1RfQ0FMTCgpIGZvcgotLy8gc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiwgb3IgZXhwZWN0YXRpb24gb24sIGEgbW9jawotLy8gZnVuY3Rpb24uCi0KLS8vIE5vdGU6IGNsYXNzIE1vY2tTcGVjIHJlYWxseSBiZWxvbmdzIHRvIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLgotLy8gSG93ZXZlciBpZiB3ZSBkZWZpbmUgaXQgaW4gOjp0ZXN0aW5nLCBNU1ZDIHdpbGwgY29tcGxhaW4gd2hlbgotLy8gY2xhc3NlcyBpbiA6OnRlc3Rpbmc6OmludGVybmFsIGRlY2xhcmUgaXQgYXMgYSBmcmllbmQgY2xhc3MKLS8vIHRlbXBsYXRlLiAgVG8gd29ya2Fyb3VuZCB0aGlzIGNvbXBpbGVyIGJ1Zywgd2UgZGVmaW5lIE1vY2tTcGVjIGluCi0vLyA6OnRlc3Rpbmc6OmludGVybmFsIGFuZCBpbXBvcnQgaXQgaW50byA6OnRlc3RpbmcuCi0KLS8vIExvZ3MgYSBtZXNzYWdlIGluY2x1ZGluZyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLUdURVNUX0FQSV8gdm9pZCBMb2dXaXRoTG9jYXRpb24odGVzdGluZzo6aW50ZXJuYWw6OkxvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBNb2NrU3BlYyB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUKLSAgICAgIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotCi0gIC8vIENvbnN0cnVjdHMgYSBNb2NrU3BlYyBvYmplY3QsIGdpdmVuIHRoZSBmdW5jdGlvbiBtb2NrZXIgb2JqZWN0Ci0gIC8vIHRoYXQgdGhlIHNwZWMgaXMgYXNzb2NpYXRlZCB3aXRoLgotICBleHBsaWNpdCBNb2NrU3BlYyhpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBmdW5jdGlvbl9tb2NrZXIpCi0gICAgICA6IGZ1bmN0aW9uX21vY2tlcl8oZnVuY3Rpb25fbW9ja2VyKSB7fQotCi0gIC8vIEFkZHMgYSBuZXcgZGVmYXVsdCBhY3Rpb24gc3BlYyB0byB0aGUgZnVuY3Rpb24gbW9ja2VyIGFuZCByZXR1cm5zCi0gIC8vIHRoZSBuZXdseSBjcmVhdGVkIHNwZWMuCi0gIGludGVybmFsOjpPbkNhbGxTcGVjPEY+JiBJbnRlcm5hbERlZmF1bHRBY3Rpb25TZXRBdCgKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBvYmosIGNvbnN0IGNoYXIqIGNhbGwpIHsKLSAgICBMb2dXaXRoTG9jYXRpb24oaW50ZXJuYWw6OmtJbmZvLCBmaWxlLCBsaW5lLAotICAgICAgICBzdHJpbmcoIk9OX0NBTEwoIikgKyBvYmogKyAiLCAiICsgY2FsbCArICIpIGludm9rZWQiKTsKLSAgICByZXR1cm4gZnVuY3Rpb25fbW9ja2VyXy0+QWRkTmV3T25DYWxsU3BlYyhmaWxlLCBsaW5lLCBtYXRjaGVyc18pOwotICB9Ci0KLSAgLy8gQWRkcyBhIG5ldyBleHBlY3RhdGlvbiBzcGVjIHRvIHRoZSBmdW5jdGlvbiBtb2NrZXIgYW5kIHJldHVybnMKLSAgLy8gdGhlIG5ld2x5IGNyZWF0ZWQgc3BlYy4KLSAgaW50ZXJuYWw6OlR5cGVkRXhwZWN0YXRpb248Rj4mIEludGVybmFsRXhwZWN0ZWRBdCgKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBvYmosIGNvbnN0IGNoYXIqIGNhbGwpIHsKLSAgICBjb25zdCBzdHJpbmcgc291cmNlX3RleHQoc3RyaW5nKCJFWFBFQ1RfQ0FMTCgiKSArIG9iaiArICIsICIgKyBjYWxsICsgIikiKTsKLSAgICBMb2dXaXRoTG9jYXRpb24oaW50ZXJuYWw6OmtJbmZvLCBmaWxlLCBsaW5lLCBzb3VyY2VfdGV4dCArICIgaW52b2tlZCIpOwotICAgIHJldHVybiBmdW5jdGlvbl9tb2NrZXJfLT5BZGROZXdFeHBlY3RhdGlvbigKLSAgICAgICAgZmlsZSwgbGluZSwgc291cmNlX3RleHQsIG1hdGNoZXJzXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpGdW5jdGlvbk1vY2tlcjsKLQotICB2b2lkIFNldE1hdGNoZXJzKGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtYXRjaGVycykgewotICAgIG1hdGNoZXJzXyA9IG1hdGNoZXJzOwotICB9Ci0KLSAgLy8gVGhlIGZ1bmN0aW9uIG1vY2tlciB0aGF0IG93bnMgdGhpcyBzcGVjLgotICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBjb25zdCBmdW5jdGlvbl9tb2NrZXJfOwotICAvLyBUaGUgYXJndW1lbnQgbWF0Y2hlcnMgc3BlY2lmaWVkIGluIHRoZSBzcGVjLgotICBBcmd1bWVudE1hdGNoZXJUdXBsZSBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNb2NrU3BlYyk7Ci19OyAgLy8gY2xhc3MgTW9ja1NwZWMKLQotLy8gV3JhcHBlciB0eXBlIGZvciBnZW5lcmljYWxseSBob2xkaW5nIGFuIG9yZGluYXJ5IHZhbHVlIG9yIGx2YWx1ZSByZWZlcmVuY2UuCi0vLyBJZiBUIGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlLCBpdCBtdXN0IGJlIGNvcHlhYmxlIG9yIG1vdmFibGUuCi0vLyBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcjxUPiBpcyBtb3ZhYmxlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcHlhYmxlIHVubGVzcwotLy8gVCBpcyBhIG1vdmUtb25seSB2YWx1ZSB0eXBlICh3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIGNvcHlhYmxlCi0vLyBpZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IG1vdmUgc2VtYW50aWNzKS4KLS8vCi0vLyBUaGUgcHJpbWFyeSB0ZW1wbGF0ZSBkZWZpbmVzIGhhbmRsaW5nIGZvciB2YWx1ZXMsIGJ1dCBmdW5jdGlvbiBoZWFkZXIKLS8vIGNvbW1lbnRzIGRlc2NyaWJlIHRoZSBjb250cmFjdCBmb3IgdGhlIHdob2xlIHRlbXBsYXRlIChpbmNsdWRpbmcKLS8vIHNwZWNpYWxpemF0aW9ucykuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSB3cmFwcGVyIGZyb20gdGhlIGdpdmVuIHZhbHVlL3JlZmVyZW5jZS4KLSAgZXhwbGljaXQgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXIoVCB2YWx1ZSkKLSAgICAgIDogdmFsdWVfKDo6dGVzdGluZzo6aW50ZXJuYWw6Om1vdmUodmFsdWUpKSB7Ci0gIH0KLQotICAvLyBVbndyYXBzIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHZhbHVlL3JlZmVyZW5jZSwgZXhhY3RseSBhcwotICAvLyBvcmlnaW5hbGx5IHBhc3NlZC4gVGhlIGJlaGF2aW9yIG9mIGNhbGxpbmcgdGhpcyBtb3JlIHRoYW4gb25jZSBvbgotICAvLyB0aGUgc2FtZSBvYmplY3QgaXMgdW5zcGVjaWZpZWQuCi0gIFQgVW53cmFwKCkgeyByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6bW92ZSh2YWx1ZV8pOyB9Ci0KLSAgLy8gUHJvdmlkZXMgbm9uZGVzdHJ1Y3RpdmUgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlL3JlZmVyZW5jZS4KLSAgLy8gQWx3YXlzIHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgKG1vcmUgcHJlY2lzZWx5LAotICAvLyBjb25zdCBSZW1vdmVSZWZlcmVuY2U8VD4mKS4gVGhlIGJlaGF2aW9yIG9mIGNhbGxpbmcgdGhpcyBhZnRlcgotICAvLyBjYWxsaW5nIFVud3JhcCBvbiB0aGUgc2FtZSBvYmplY3QgaXMgdW5zcGVjaWZpZWQuCi0gIGNvbnN0IFQmIFBlZWsoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVCB2YWx1ZV87Ci19OwotCi0vLyBTcGVjaWFsaXphdGlvbiBmb3IgbHZhbHVlIHJlZmVyZW5jZSB0eXBlcy4gU2VlIHByaW1hcnkgdGVtcGxhdGUKLS8vIGZvciBkb2N1bWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcjxUJj4gewotIHB1YmxpYzoKLSAgLy8gV29ya2Fyb3VuZCBmb3IgZGViYXRhYmxlIHBhc3MtYnktcmVmZXJlbmNlIGxpbnQgd2FybmluZyAoYy1saWJyYXJ5LXRlYW0KLSAgLy8gcG9saWN5IHByZWNsdWRlcyBOT0xJTlQgaW4gdGhpcyBjb250ZXh0KQotICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKLSAgZXhwbGljaXQgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXIocmVmZXJlbmNlIHJlZikKLSAgICAgIDogdmFsdWVfcHRyXygmcmVmKSB7fQotICBUJiBVbndyYXAoKSB7IHJldHVybiAqdmFsdWVfcHRyXzsgfQotICBjb25zdCBUJiBQZWVrKCkgY29uc3QgeyByZXR1cm4gKnZhbHVlX3B0cl87IH0KLQotIHByaXZhdGU6Ci0gIFQqIHZhbHVlX3B0cl87Ci19OwotCi0vLyBNU1ZDIHdhcm5zIGFib3V0IHVzaW5nICd0aGlzJyBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0LCBzbwotLy8gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSB3YXJuaW5nLiAgV2UgaGF2ZSB0byBkbyBpdCBmb3IKLS8vIHRoZSBlbnRpcmUgY2xhc3MgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcsIGV2ZW4gdGhvdWdoIGl0J3MgYWJvdXQKLS8vIHRoZSBjb25zdHJ1Y3RvciBvbmx5LgotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzU1KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MzU1LgotI2VuZGlmICAvLyBfTVNWX1ZFUgotCi0vLyBDKysgdHJlYXRzIHRoZSB2b2lkIHR5cGUgc3BlY2lhbGx5LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW5ub3QgZGVmaW5lCi0vLyBhIHZvaWQtdHlwZWQgdmFyaWFibGUgb3IgcGFzcyBhIHZvaWQgdmFsdWUgdG8gYSBmdW5jdGlvbi4KLS8vIEFjdGlvblJlc3VsdEhvbGRlcjxUPiBob2xkcyBhIHZhbHVlIG9mIHR5cGUgVCwgd2hlcmUgVCBtdXN0IGJlIGEKLS8vIGNvcHlhYmxlIHR5cGUgb3Igdm9pZCAoVCBkb2Vzbid0IG5lZWQgdG8gYmUgZGVmYXVsdC1jb25zdHJ1Y3RhYmxlKS4KLS8vIEl0IGhpZGVzIHRoZSBzeW50YWN0aWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHZvaWQgYW5kIG90aGVyIHR5cGVzLCBhbmQKLS8vIGlzIHVzZWQgdG8gdW5pZnkgdGhlIGNvZGUgZm9yIGludm9raW5nIGJvdGggdm9pZC1yZXR1cm5pbmcgYW5kCi0vLyBub24tdm9pZC1yZXR1cm5pbmcgbW9jayBmdW5jdGlvbnMuCi0KLS8vIFVudHlwZWQgYmFzZSBjbGFzcyBmb3IgQWN0aW9uUmVzdWx0SG9sZGVyPFQ+LgotY2xhc3MgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UoKSB7fQotCi0gIC8vIFByaW50cyB0aGUgaGVsZCB2YWx1ZSBhcyBhbiBhY3Rpb24ncyByZXN1bHQgdG8gb3MuCi0gIHZpcnR1YWwgdm9pZCBQcmludEFzQWN0aW9uUmVzdWx0KDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotfTsKLQotLy8gVGhpcyBnZW5lcmljIGRlZmluaXRpb24gaXMgdXNlZCB3aGVuIFQgaXMgbm90IHZvaWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEFjdGlvblJlc3VsdEhvbGRlciA6IHB1YmxpYyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSB7Ci0gcHVibGljOgotICAvLyBSZXR1cm5zIHRoZSBoZWxkIHZhbHVlLiBNdXN0IG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0gIFQgVW53cmFwKCkgewotICAgIHJldHVybiByZXN1bHRfLlVud3JhcCgpOwotICB9Ci0KLSAgLy8gUHJpbnRzIHRoZSBoZWxkIHZhbHVlIGFzIGFuIGFjdGlvbidzIHJlc3VsdCB0byBvcy4KLSAgdmlydHVhbCB2b2lkIFByaW50QXNBY3Rpb25SZXN1bHQoOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJcbiAgICAgICAgICBSZXR1cm5zOiAiOwotICAgIC8vIFQgbWF5IGJlIGEgcmVmZXJlbmNlIHR5cGUsIHNvIHdlIGRvbid0IHVzZSBVbml2ZXJzYWxQcmludCgpLgotICAgIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHJlc3VsdF8uUGVlaygpLCBvcyk7Ci0gIH0KLQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gbW9jayBmdW5jdGlvbidzIGRlZmF1bHQgYWN0aW9uIGFuZCByZXR1cm5zIHRoZQotICAvLyByZXN1bHQgaW4gYSBuZXctZWQgQWN0aW9uUmVzdWx0SG9sZGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgc3RhdGljIEFjdGlvblJlc3VsdEhvbGRlciogUGVyZm9ybURlZmF1bHRBY3Rpb24oCi0gICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGZ1bmNfbW9ja2VyLAotICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MsCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIHsKLSAgICByZXR1cm4gbmV3IEFjdGlvblJlc3VsdEhvbGRlcihXcmFwcGVyKAotICAgICAgICBmdW5jX21vY2tlci0+UGVyZm9ybURlZmF1bHRBY3Rpb24oYXJncywgY2FsbF9kZXNjcmlwdGlvbikpKTsKLSAgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBhY3Rpb24gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIG5ldy1lZAotICAvLyBBY3Rpb25SZXN1bHRIb2xkZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBzdGF0aWMgQWN0aW9uUmVzdWx0SG9sZGVyKgotICBQZXJmb3JtQWN0aW9uKGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIG5ldyBBY3Rpb25SZXN1bHRIb2xkZXIoV3JhcHBlcihhY3Rpb24uUGVyZm9ybShhcmdzKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyPFQ+IFdyYXBwZXI7Ci0KLSAgZXhwbGljaXQgQWN0aW9uUmVzdWx0SG9sZGVyKFdyYXBwZXIgcmVzdWx0KQotICAgICAgOiByZXN1bHRfKDo6dGVzdGluZzo6aW50ZXJuYWw6Om1vdmUocmVzdWx0KSkgewotICB9Ci0KLSAgV3JhcHBlciByZXN1bHRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWN0aW9uUmVzdWx0SG9sZGVyKTsKLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBUID0gdm9pZC4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBBY3Rpb25SZXN1bHRIb2xkZXI8dm9pZD4gOiBwdWJsaWMgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBVbndyYXAoKSB7IH0KLQotICB2aXJ0dWFsIHZvaWQgUHJpbnRBc0FjdGlvblJlc3VsdCg6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIGNvbnN0IHt9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIG1vY2sgZnVuY3Rpb24ncyBkZWZhdWx0IGFjdGlvbiBhbmQgcmV0dXJucyBvd25lcnNoaXAKLSAgLy8gb2YgYW4gZW1wdHkgQWN0aW9uUmVzdWx0SG9sZGVyKi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1EZWZhdWx0QWN0aW9uKAotICAgICAgY29uc3QgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBmdW5jX21vY2tlciwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSB7Ci0gICAgZnVuY19tb2NrZXItPlBlcmZvcm1EZWZhdWx0QWN0aW9uKGFyZ3MsIGNhbGxfZGVzY3JpcHRpb24pOwotICAgIHJldHVybiBuZXcgQWN0aW9uUmVzdWx0SG9sZGVyOwotICB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiBhbmQgcmV0dXJucyBvd25lcnNoaXAgb2YgYW4gZW1wdHkKLSAgLy8gQWN0aW9uUmVzdWx0SG9sZGVyKi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1BY3Rpb24oCi0gICAgICBjb25zdCBBY3Rpb248Rj4mIGFjdGlvbiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgYWN0aW9uLlBlcmZvcm0oYXJncyk7Ci0gICAgcmV0dXJuIG5ldyBBY3Rpb25SZXN1bHRIb2xkZXI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEFjdGlvblJlc3VsdEhvbGRlcigpIHt9Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWN0aW9uUmVzdWx0SG9sZGVyKTsKLX07Ci0KLS8vIFRoZSBiYXNlIG9mIHRoZSBmdW5jdGlvbiBtb2NrZXIgY2xhc3MgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgotLy8gV2UgcHV0IHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgaW5zdGVhZCBvZiBpdHMgY2hpbGQgdG8gYXZvaWQgY29kZQotLy8gYmxvYXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZSA6IHB1YmxpYyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0KLSAgRnVuY3Rpb25Nb2NrZXJCYXNlKCkgOiBjdXJyZW50X3NwZWNfKHRoaXMpIHt9Ci0KLSAgLy8gVGhlIGRlc3RydWN0b3IgdmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jawotICAvLyBmdW5jdGlvbiBoYXZlIGJlZW4gc2F0aXNmaWVkLiAgSWYgbm90LCBpdCB3aWxsIHJlcG9ydCBHb29nbGUgVGVzdAotICAvLyBub24tZmF0YWwgZmFpbHVyZXMgZm9yIHRoZSB2aW9sYXRpb25zLgotICB2aXJ0dWFsIH5GdW5jdGlvbk1vY2tlckJhc2UoKQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOwotICAgIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCk7Ci0gICAgTW9jazo6VW5yZWdpc3RlckxvY2tlZCh0aGlzKTsKLSAgICBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBPTl9DQUxMIHNwZWMgdGhhdCBtYXRjaGVzIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZQotICAvLyBnaXZlbiBhcmd1bWVudHM7IHJldHVybnMgTlVMTCBpZiBubyBtYXRjaGluZyBPTl9DQUxMIGlzIGZvdW5kLgotICAvLyBMID0gKgotICBjb25zdCBPbkNhbGxTcGVjPEY+KiBGaW5kT25DYWxsU3BlYygKLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsKLSAgICBmb3IgKFVudHlwZWRPbkNhbGxTcGVjczo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdAotICAgICAgICAgICAgID0gdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5yYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHVudHlwZWRfb25fY2FsbF9zcGVjc18ucmVuZCgpOyArK2l0KSB7Ci0gICAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBzcGVjID0gc3RhdGljX2Nhc3Q8Y29uc3QgT25DYWxsU3BlYzxGPio+KCppdCk7Ci0gICAgICBpZiAoc3BlYy0+TWF0Y2hlcyhhcmdzKSkKLSAgICAgICAgcmV0dXJuIHNwZWM7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhpcyBtb2NrIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQXNzZXJ0cyAob3IgdGhyb3dzIGlmCi0gIC8vIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQpIHdpdGggYSBoZWxwZnVsIGNhbGwgZGVzY3JwdGlvbiBpZiB0aGVyZQotICAvLyBpcyBubyB2YWxpZCByZXR1cm4gdmFsdWUuIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZQotICAvLyBtdXRhYmxlIHN0YXRlIG9mIHRoaXMgb2JqZWN0LCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseQotICAvLyB3aXRob3V0IGxvY2tpbmcuCi0gIC8vIEwgPSAqCi0gIFJlc3VsdCBQZXJmb3JtRGVmYXVsdEFjdGlvbihjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSBjb25zdCB7Ci0gICAgY29uc3QgT25DYWxsU3BlYzxGPiogY29uc3Qgc3BlYyA9Ci0gICAgICAgIHRoaXMtPkZpbmRPbkNhbGxTcGVjKGFyZ3MpOwotICAgIGlmIChzcGVjICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBzcGVjLT5HZXRBY3Rpb24oKS5QZXJmb3JtKGFyZ3MpOwotICAgIH0KLSAgICBjb25zdCBzdHJpbmcgbWVzc2FnZSA9IGNhbGxfZGVzY3JpcHRpb24gKwotICAgICAgICAiXG4gICAgVGhlIG1vY2sgZnVuY3Rpb24gaGFzIG5vIGRlZmF1bHQgYWN0aW9uICIKLSAgICAgICAgInNldCwgYW5kIGl0cyByZXR1cm4gdHlwZSBoYXMgbm8gZGVmYXVsdCB2YWx1ZSBzZXQuIjsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICAgIGlmICghRGVmYXVsdFZhbHVlPFJlc3VsdD46OkV4aXN0cygpKSB7Ci0gICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IobWVzc2FnZSk7Ci0gICAgfQotI2Vsc2UKLSAgICBBc3NlcnQoRGVmYXVsdFZhbHVlPFJlc3VsdD46OkV4aXN0cygpLCAiIiwgLTEsIG1lc3NhZ2UpOwotI2VuZGlmCi0gICAgcmV0dXJuIERlZmF1bHRWYWx1ZTxSZXN1bHQ+OjpHZXQoKTsKLSAgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsIGRlc2NyaXB0aW9uIHN0cmluZyB3aWxsIGJlIHVzZWQgaW4KLSAgLy8gdGhlIGVycm9yIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhlIGNhbGwgaW4gdGhlIGNhc2UgdGhlIGRlZmF1bHQKLSAgLy8gYWN0aW9uIGZhaWxzLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJlc3VsdC4KLSAgLy8gTCA9ICoKLSAgdmlydHVhbCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLCAgLy8gbXVzdCBwb2ludCB0byBhbiBBcmd1bWVudFR1cGxlCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIGNvbnN0IHsKLSAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOwotICAgIHJldHVybiBSZXN1bHRIb2xkZXI6OlBlcmZvcm1EZWZhdWx0QWN0aW9uKHRoaXMsIGFyZ3MsIGNhbGxfZGVzY3JpcHRpb24pOwotICB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotICAvLyByZXN1bHQuCi0gIC8vIEwgPSAqCi0gIHZpcnR1YWwgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRQZXJmb3JtQWN0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hY3Rpb24sIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncykgY29uc3QgewotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhY3Rpb24gYmVmb3JlIHBlcmZvcm1pbmcgaXQsIGluIGNhc2UgdGhlCi0gICAgLy8gYWN0aW9uIGRlbGV0ZXMgdGhlIG1vY2sgb2JqZWN0IChhbmQgdGh1cyBkZWxldGVzIGl0c2VsZikuCi0gICAgY29uc3QgQWN0aW9uPEY+IGFjdGlvbiA9ICpzdGF0aWNfY2FzdDxjb25zdCBBY3Rpb248Rj4qPih1bnR5cGVkX2FjdGlvbik7Ci0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9Ci0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKLSAgICByZXR1cm4gUmVzdWx0SG9sZGVyOjpQZXJmb3JtQWN0aW9uKGFjdGlvbiwgYXJncyk7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OkNsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKToKLSAgLy8gY2xlYXJzIHRoZSBPTl9DQUxMKClzIHNldCBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCkKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgICAvLyBEZWxldGluZyBvdXIgZGVmYXVsdCBhY3Rpb25zIG1heSB0cmlnZ2VyIG90aGVyIG1vY2sgb2JqZWN0cyB0byBiZQotICAgIC8vIGRlbGV0ZWQsIGZvciBleGFtcGxlIGlmIGFuIGFjdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSBjb3VudGVkIHNtYXJ0Ci0gICAgLy8gcG9pbnRlciB0byB0aGF0IG1vY2sgb2JqZWN0LCBhbmQgdGhhdCBpcyB0aGUgbGFzdCByZWZlcmVuY2UuIFNvIGlmIHdlCi0gICAgLy8gZGVsZXRlIG91ciBhY3Rpb25zIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2xvYmFsIG11dGV4IHdlIG1heSBkZWFkbG9jawotICAgIC8vIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLiBJbnN0ZWFkLCBtYWtlIGEgY29weSBvZiB0aGUgc2V0IG9mCi0gICAgLy8gYWN0aW9ucyB0byBkZWxldGUsIGNsZWFyIG91ciBzZXQgd2l0aGluIHRoZSBtdXRleCwgYW5kIHRoZW4gZGVsZXRlIHRoZQotICAgIC8vIGFjdGlvbnMgb3V0c2lkZSBvZiB0aGUgbXV0ZXguCi0gICAgVW50eXBlZE9uQ2FsbFNwZWNzIHNwZWNzX3RvX2RlbGV0ZTsKLSAgICB1bnR5cGVkX29uX2NhbGxfc3BlY3NfLnN3YXAoc3BlY3NfdG9fZGVsZXRlKTsKLQotICAgIGdfZ21vY2tfbXV0ZXguVW5sb2NrKCk7Ci0gICAgZm9yIChVbnR5cGVkT25DYWxsU3BlY3M6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICBzcGVjc190b19kZWxldGUuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHNwZWNzX3RvX2RlbGV0ZS5lbmQoKTsgKytpdCkgewotICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IE9uQ2FsbFNwZWM8Rj4qPigqaXQpOwotICAgIH0KLQotICAgIC8vIExvY2sgdGhlIG11dGV4IGFnYWluLCBzaW5jZSB0aGUgY2FsbGVyIGV4cGVjdHMgaXQgdG8gYmUgbG9ja2VkIHdoZW4gd2UKLSAgICAvLyByZXR1cm4uCi0gICAgZ19nbW9ja19tdXRleC5Mb2NrKCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBmcmllbmQgY2xhc3MgTW9ja1NwZWM7Ci0KLSAgdHlwZWRlZiBBY3Rpb25SZXN1bHRIb2xkZXI8UmVzdWx0PiBSZXN1bHRIb2xkZXI7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAgLy8gdGhyZWFkcyBjb25jdXJyZW50bHkuCi0gIFJlc3VsdCBJbnZva2VXaXRoKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpCi0gICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBzY29wZWRfcHRyPFJlc3VsdEhvbGRlcj4gaG9sZGVyKAotICAgICAgICBEb3duQ2FzdF88UmVzdWx0SG9sZGVyKj4odGhpcy0+VW50eXBlZEludm9rZVdpdGgoJmFyZ3MpKSk7Ci0gICAgcmV0dXJuIGhvbGRlci0+VW53cmFwKCk7Ci0gIH0KLQotICAvLyBBZGRzIGFuZCByZXR1cm5zIGEgZGVmYXVsdCBhY3Rpb24gc3BlYyBmb3IgdGhpcyBtb2NrIGZ1bmN0aW9uLgotICBPbkNhbGxTcGVjPEY+JiBBZGROZXdPbkNhbGxTcGVjKAotICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbSkKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgTW9jazo6UmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbChNb2NrT2JqZWN0KCksIGZpbGUsIGxpbmUpOwotICAgIE9uQ2FsbFNwZWM8Rj4qIGNvbnN0IG9uX2NhbGxfc3BlYyA9IG5ldyBPbkNhbGxTcGVjPEY+KGZpbGUsIGxpbmUsIG0pOwotICAgIHVudHlwZWRfb25fY2FsbF9zcGVjc18ucHVzaF9iYWNrKG9uX2NhbGxfc3BlYyk7Ci0gICAgcmV0dXJuICpvbl9jYWxsX3NwZWM7Ci0gIH0KLQotICAvLyBBZGRzIGFuZCByZXR1cm5zIGFuIGV4cGVjdGF0aW9uIHNwZWMgZm9yIHRoaXMgbW9jayBmdW5jdGlvbi4KLSAgVHlwZWRFeHBlY3RhdGlvbjxGPiYgQWRkTmV3RXhwZWN0YXRpb24oCi0gICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgaW50IGxpbmUsCi0gICAgICBjb25zdCBzdHJpbmcmIHNvdXJjZV90ZXh0LAotICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG0pCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIE1vY2s6OlJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoTW9ja09iamVjdCgpLCBmaWxlLCBsaW5lKTsKLSAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBjb25zdCBleHBlY3RhdGlvbiA9Ci0gICAgICAgIG5ldyBUeXBlZEV4cGVjdGF0aW9uPEY+KHRoaXMsIGZpbGUsIGxpbmUsIHNvdXJjZV90ZXh0LCBtKTsKLSAgICBjb25zdCBsaW5rZWRfcHRyPEV4cGVjdGF0aW9uQmFzZT4gdW50eXBlZF9leHBlY3RhdGlvbihleHBlY3RhdGlvbik7Ci0gICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLnB1c2hfYmFjayh1bnR5cGVkX2V4cGVjdGF0aW9uKTsKLQotICAgIC8vIEFkZHMgdGhpcyBleHBlY3RhdGlvbiBpbnRvIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbmUuCi0gICAgU2VxdWVuY2UqIGNvbnN0IGltcGxpY2l0X3NlcXVlbmNlID0gZ19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5nZXQoKTsKLSAgICBpZiAoaW1wbGljaXRfc2VxdWVuY2UgIT0gTlVMTCkgewotICAgICAgaW1wbGljaXRfc2VxdWVuY2UtPkFkZEV4cGVjdGF0aW9uKEV4cGVjdGF0aW9uKHVudHlwZWRfZXhwZWN0YXRpb24pKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKmV4cGVjdGF0aW9uOwotICB9Ci0KLSAgLy8gVGhlIGN1cnJlbnQgc3BlYyAoZWl0aGVyIGRlZmF1bHQgYWN0aW9uIHNwZWMgb3IgZXhwZWN0YXRpb24gc3BlYykKLSAgLy8gYmVpbmcgZGVzY3JpYmVkIG9uIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgotICBNb2NrU3BlYzxGPiYgY3VycmVudF9zcGVjKCkgeyByZXR1cm4gY3VycmVudF9zcGVjXzsgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+IGZyaWVuZCBjbGFzcyBUeXBlZEV4cGVjdGF0aW9uOwotCi0gIC8vIFNvbWUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIFVudHlwZWRJbnZva2VXaXRoKCkuCi0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgZGVmYXVsdCBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQgZm9yIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMuCi0gIC8vIEwgPSAqCi0gIHZvaWQgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBjb25zdCBzcGVjID0gRmluZE9uQ2FsbFNwZWMoYXJncyk7Ci0KLSAgICBpZiAoc3BlYyA9PSBOVUxMKSB7Ci0gICAgICAqb3MgPDwgKGludGVybmFsOjp0eXBlX2VxdWFsczxSZXN1bHQsIHZvaWQ+Ojp2YWx1ZSA/Ci0gICAgICAgICAgICAgICJyZXR1cm5pbmcgZGlyZWN0bHkuXG4iIDoKLSAgICAgICAgICAgICAgInJldHVybmluZyBkZWZhdWx0IHZhbHVlLlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpvcyA8PCAidGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDpcbiIKLSAgICAgICAgICA8PCBGb3JtYXRGaWxlTG9jYXRpb24oc3BlYy0+ZmlsZSgpLCBzcGVjLT5saW5lKCkpIDw8ICJcbiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGVzIGEgbWVzc2FnZSB0aGF0IHRoZSBjYWxsIGlzIHVuaW50ZXJlc3RpbmcgKGkuZS4gbmVpdGhlcgotICAvLyBleHBsaWNpdGx5IGV4cGVjdGVkIG5vciBleHBsaWNpdGx5IHVuZXhwZWN0ZWQpIHRvIHRoZSBnaXZlbgotICAvLyBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgVW50eXBlZERlc2NyaWJlVW5pbnRlcmVzdGluZ0NhbGwoCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7Ci0gICAgKm9zIDw8ICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtICI7Ci0gICAgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgb3MpOwotICAgICpvcyA8PCAiICAgIEZ1bmN0aW9uIGNhbGw6ICIgPDwgTmFtZSgpOwotICAgIFVuaXZlcnNhbFByaW50KGFyZ3MsIG9zKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXJndW1lbnRzCi0gIC8vIChvciBOVUxMIGlzIHRoZXJlJ3Mgbm8gbWF0Y2gpOyB3aGVuIGEgbWF0Y2ggaXMgZm91bmQsCi0gIC8vIHVudHlwZWRfYWN0aW9uIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlCi0gIC8vIHBlcmZvcm1lZCAob3IgTlVMTCBpZiB0aGUgYWN0aW9uIGlzICJkbyBkZWZhdWx0IiksIGFuZAotICAvLyBpc19leGNlc3NpdmUgaXMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY2FsbCBleGNlZWRzIHRoZQotICAvLyBleHBlY3RlZCBudW1iZXIuCi0gIC8vCi0gIC8vIENyaXRpY2FsIHNlY3Rpb246IFdlIG11c3QgZmluZCB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gYW5kIHRoZQotICAvLyBjb3JyZXNwb25kaW5nIGFjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHRha2VuIGluIGFuIEFUT01JQwotICAvLyB0cmFuc2FjdGlvbi4gIE90aGVyd2lzZSBhbm90aGVyIHRocmVhZCBtYXkgY2FsbCB0aGlzIG1vY2sKLSAgLy8gbWV0aG9kIGluIHRoZSBtaWRkbGUgYW5kIG1lc3MgdXAgdGhlIHN0YXRlLgotICAvLwotICAvLyBIb3dldmVyLCBwZXJmb3JtaW5nIHRoZSBhY3Rpb24gaGFzIHRvIGJlIGxlZnQgb3V0IG9mIHRoZSBjcml0aWNhbAotICAvLyBzZWN0aW9uLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgbm8gY29udHJvbCBvbiB3aGF0IHRoZQotICAvLyBhY3Rpb24gZG9lcyAoaXQgY2FuIGludm9rZSBhbiBhcmJpdHJhcnkgdXNlciBmdW5jdGlvbiBvciBldmVuIGEKLSAgLy8gbW9jayBmdW5jdGlvbikgYW5kIGV4Y2Vzc2l2ZSBsb2NraW5nIGNvdWxkIGNhdXNlIGEgZGVhZCBsb2NrLgotICB2aXJ0dWFsIGNvbnN0IEV4cGVjdGF0aW9uQmFzZSogVW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgY29uc3Qgdm9pZCoqIHVudHlwZWRfYWN0aW9uLCBib29sKiBpc19leGNlc3NpdmUsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogd2hhdCwgOjpzdGQ6Om9zdHJlYW0qIHdoeSkKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9Ci0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7Ci0gICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogZXhwID0gdGhpcy0+RmluZE1hdGNoaW5nRXhwZWN0YXRpb25Mb2NrZWQoYXJncyk7Ci0gICAgaWYgKGV4cCA9PSBOVUxMKSB7ICAvLyBBIG1hdGNoIHdhc24ndCBmb3VuZC4KLSAgICAgIHRoaXMtPkZvcm1hdFVuZXhwZWN0ZWRDYWxsTWVzc2FnZUxvY2tlZChhcmdzLCB3aGF0LCB3aHkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBsaW5lIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBHZXRBY3Rpb25Gb3JBcmd1bWVudHMoKSwKLSAgICAvLyB3aGljaCB3aWxsIGluY3JlbWVudCB0aGUgY2FsbCBjb3VudCBmb3IgKmV4cCBhbmQgdGh1cyBhZmZlY3QKLSAgICAvLyBpdHMgc2F0dXJhdGlvbiBzdGF0dXMuCi0gICAgKmlzX2V4Y2Vzc2l2ZSA9IGV4cC0+SXNTYXR1cmF0ZWQoKTsKLSAgICBjb25zdCBBY3Rpb248Rj4qIGFjdGlvbiA9IGV4cC0+R2V0QWN0aW9uRm9yQXJndW1lbnRzKHRoaXMsIGFyZ3MsIHdoYXQsIHdoeSk7Ci0gICAgaWYgKGFjdGlvbiAhPSBOVUxMICYmIGFjdGlvbi0+SXNEb0RlZmF1bHQoKSkKLSAgICAgIGFjdGlvbiA9IE5VTEw7ICAvLyBOb3JtYWxpemUgImRvIGRlZmF1bHQiIHRvIE5VTEwuCi0gICAgKnVudHlwZWRfYWN0aW9uID0gYWN0aW9uOwotICAgIHJldHVybiBleHA7Ci0gIH0KLQotICAvLyBQcmludHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byB0aGUgb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFVudHlwZWRQcmludEFyZ3MoY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOwotICAgIFVuaXZlcnNhbFByaW50KGFyZ3MsIG9zKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYXJndW1lbnRzLCBvciBOVUxMIGlmIG5vCi0gIC8vIGV4cGVjdGF0aW9uIG1hdGNoZXMgdGhlbS4KLSAgVHlwZWRFeHBlY3RhdGlvbjxGPiogRmluZE1hdGNoaW5nRXhwZWN0YXRpb25Mb2NrZWQoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdAotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgZm9yICh0eXBlbmFtZSBVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uc18ucmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB1bnR5cGVkX2V4cGVjdGF0aW9uc18ucmVuZCgpOyArK2l0KSB7Ci0gICAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBjb25zdCBleHAgPQotICAgICAgICAgIHN0YXRpY19jYXN0PFR5cGVkRXhwZWN0YXRpb248Rj4qPihpdC0+Z2V0KCkpOwotICAgICAgaWYgKGV4cC0+U2hvdWxkSGFuZGxlQXJndW1lbnRzKGFyZ3MpKSB7Ci0gICAgICAgIHJldHVybiBleHA7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIG1lc3NhZ2UgdGhhdCB0aGUgYXJndW1lbnRzIGRvbid0IG1hdGNoIGFueSBleHBlY3RhdGlvbi4KLSAgdm9pZCBGb3JtYXRVbmV4cGVjdGVkQ2FsbE1lc3NhZ2VMb2NrZWQoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoeSkgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgICpvcyA8PCAiXG5VbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtICI7Ci0gICAgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgb3MpOwotICAgIFByaW50VHJpZWRFeHBlY3RhdGlvbnNMb2NrZWQoYXJncywgd2h5KTsKLSAgfQotCi0gIC8vIFByaW50cyBhIGxpc3Qgb2YgZXhwZWN0YXRpb25zIHRoYXQgaGF2ZSBiZWVuIHRyaWVkIGFnYWluc3QgdGhlCi0gIC8vIGN1cnJlbnQgbW9jayBmdW5jdGlvbiBjYWxsLgotICB2b2lkIFByaW50VHJpZWRFeHBlY3RhdGlvbnNMb2NrZWQoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoeSkgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGNvbnN0IGludCBjb3VudCA9IHN0YXRpY19jYXN0PGludD4odW50eXBlZF9leHBlY3RhdGlvbnNfLnNpemUoKSk7Ci0gICAgKndoeSA8PCAiR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAiIDw8IGNvdW50IDw8ICIgIgotICAgICAgICAgPDwgKGNvdW50ID09IDEgPyAiZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2giIDoKLSAgICAgICAgICAgICAiZXhwZWN0YXRpb25zLCBidXQgbm9uZSBtYXRjaGVkIikKLSAgICAgICAgIDw8ICI6XG4iOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogY29uc3QgZXhwZWN0YXRpb24gPQotICAgICAgICAgIHN0YXRpY19jYXN0PFR5cGVkRXhwZWN0YXRpb248Rj4qPih1bnR5cGVkX2V4cGVjdGF0aW9uc19baV0uZ2V0KCkpOwotICAgICAgKndoeSA8PCAiXG4iOwotICAgICAgZXhwZWN0YXRpb24tPkRlc2NyaWJlTG9jYXRpb25Ubyh3aHkpOwotICAgICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICAqd2h5IDw8ICJ0cmllZCBleHBlY3RhdGlvbiAjIiA8PCBpIDw8ICI6ICI7Ci0gICAgICB9Ci0gICAgICAqd2h5IDw8IGV4cGVjdGF0aW9uLT5zb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiI7Ci0gICAgICBleHBlY3RhdGlvbi0+RXhwbGFpbk1hdGNoUmVzdWx0VG8oYXJncywgd2h5KTsKLSAgICAgIGV4cGVjdGF0aW9uLT5EZXNjcmliZUNhbGxDb3VudFRvKHdoeSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlIGN1cnJlbnQgc3BlYyAoZWl0aGVyIGRlZmF1bHQgYWN0aW9uIHNwZWMgb3IgZXhwZWN0YXRpb24gc3BlYykKLSAgLy8gYmVpbmcgZGVzY3JpYmVkIG9uIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgotICBNb2NrU3BlYzxGPiBjdXJyZW50X3NwZWNfOwotCi0gIC8vIFRoZXJlIGlzIG5vIGdlbmVyYWxseSB1c2VmdWwgYW5kIGltcGxlbWVudGFibGUgc2VtYW50aWNzIG9mCi0gIC8vIGNvcHlpbmcgYSBtb2NrIG9iamVjdCwgc28gY29weWluZyBhIG1vY2sgaXMgdXN1YWxseSBhIHVzZXIgZXJyb3IuCi0gIC8vIFRodXMgd2UgZGlzYWxsb3cgY29weWluZyBmdW5jdGlvbiBtb2NrZXJzLiAgSWYgdGhlIHVzZXIgcmVhbGx5Ci0gIC8vIHdhbnRzIHRvIGNvcHkgYSBtb2NrIG9iamVjdCwgaGUgc2hvdWxkIGltcGxlbWVudCBoaXMgb3duIGNvcHkKLSAgLy8gb3BlcmF0aW9uLCBmb3IgZXhhbXBsZToKLSAgLy8KLSAgLy8gICBjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7Ci0gIC8vICAgIHB1YmxpYzoKLSAgLy8gICAgIC8vIERlZmluZXMgYSBjb3B5IGNvbnN0cnVjdG9yIGV4cGxpY2l0bHkuCi0gIC8vICAgICBNb2NrRm9vKGNvbnN0IE1vY2tGb28mIHNyYykge30KLSAgLy8gICAgIC4uLgotICAvLyAgIH07Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRnVuY3Rpb25Nb2NrZXJCYXNlKTsKLX07ICAvLyBjbGFzcyBGdW5jdGlvbk1vY2tlckJhc2UKLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgotI2VuZGlmICAvLyBfTVNWX1ZFUgotCi0vLyBJbXBsZW1lbnRzIG1ldGhvZHMgb2YgRnVuY3Rpb25Nb2NrZXJCYXNlLgotCi0vLyBWZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhpcyBtb2NrIGZ1bmN0aW9uIGhhdmUgYmVlbgotLy8gc2F0aXNmaWVkLiAgUmVwb3J0cyBvbmUgb3IgbW9yZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kCi0vLyByZXR1cm5zIGZhbHNlIGlmIG5vdC4KLQotLy8gUmVwb3J0cyBhbiB1bmludGVyZXN0aW5nIGNhbGwgKHdob3NlIGRlc2NyaXB0aW9uIGlzIGluIG1zZykgaW4gdGhlCi0vLyBtYW5uZXIgc3BlY2lmaWVkIGJ5ICdyZWFjdGlvbicuCi12b2lkIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKENhbGxSZWFjdGlvbiByZWFjdGlvbiwgY29uc3Qgc3RyaW5nJiBtc2cpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIHN0eWxlIGd1aWRlIHByb2hpYml0cyAidXNpbmciIHN0YXRlbWVudHMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUKLS8vIGluc2lkZSBhIGhlYWRlciBmaWxlLiAgSG93ZXZlciwgdGhlIE1vY2tTcGVjIGNsYXNzIHRlbXBsYXRlIGlzCi0vLyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZyBsaW5lCi0vLyBpcyBqdXN0IGEgdHJpY2sgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLCB3aGljaCBjYW5ub3QKLS8vIGhhbmRsZSBpdCBpZiB3ZSBkZWZpbmUgTW9ja1NwZWMgaW4gOjp0ZXN0aW5nLgotdXNpbmcgaW50ZXJuYWw6Ok1vY2tTcGVjOwotCi0vLyBDb25zdCh4KSBpcyBhIGNvbnZlbmllbnQgZnVuY3Rpb24gZm9yIG9idGFpbmluZyBhIGNvbnN0IHJlZmVyZW5jZQotLy8gdG8geC4gIFRoaXMgaXMgdXNlZnVsIGZvciBzZXR0aW5nIGV4cGVjdGF0aW9ucyBvbiBhbiBvdmVybG9hZGVkCi0vLyBjb25zdCBtb2NrIG1ldGhvZCwgZS5nLgotLy8KLS8vICAgY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb29JbnRlcmZhY2UgewotLy8gICAgcHVibGljOgotLy8gICAgIE1PQ0tfTUVUSE9EMChCYXIsIGludCgpKTsKLS8vICAgICBNT0NLX0NPTlNUX01FVEhPRDAoQmFyLCBpbnQmKCkpOwotLy8gICB9OwotLy8KLS8vICAgTW9ja0ZvbyBmb287Ci0vLyAgIC8vIEV4cGVjdHMgYSBjYWxsIHRvIG5vbi1jb25zdCBNb2NrRm9vOjpCYXIoKS4KLS8vICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSk7Ci0vLyAgIC8vIEV4cGVjdHMgYSBjYWxsIHRvIGNvbnN0IE1vY2tGb286OkJhcigpLgotLy8gICBFWFBFQ1RfQ0FMTChDb25zdChmb28pLCBCYXIoKSk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBjb25zdCBUJiBDb25zdChjb25zdCBUJiB4KSB7IHJldHVybiB4OyB9Ci0KLS8vIENvbnN0cnVjdHMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyBleHAuCi1pbmxpbmUgRXhwZWN0YXRpb246OkV4cGVjdGF0aW9uKGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCkgIC8vIE5PTElOVAotICAgIDogZXhwZWN0YXRpb25fYmFzZV8oZXhwLkdldEhhbmRsZSgpLmV4cGVjdGF0aW9uX2Jhc2UoKSkge30KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gQSBzZXBhcmF0ZSBtYWNybyBpcyByZXF1aXJlZCB0byBhdm9pZCBjb21waWxlIGVycm9ycyB3aGVuIHRoZSBuYW1lCi0vLyBvZiB0aGUgbWV0aG9kIHVzZWQgaW4gY2FsbCBpcyBhIHJlc3VsdCBvZiBtYWNybyBleHBhbnNpb24uCi0vLyBTZWUgQ29tcGlsZXNXaXRoTWV0aG9kTmFtZUV4cGFuZGVkRnJvbU1hY3JvIHRlc3RzIGluCi0vLyBpbnRlcm5hbC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MgZm9yIG1vcmUgZGV0YWlscy4KLSNkZWZpbmUgR01PQ0tfT05fQ0FMTF9JTVBMXyhvYmosIGNhbGwpIFwKLSAgICAoKG9iaikuZ21vY2tfIyNjYWxsKS5JbnRlcm5hbERlZmF1bHRBY3Rpb25TZXRBdChfX0ZJTEVfXywgX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb2JqLCAjY2FsbCkKLSNkZWZpbmUgT05fQ0FMTChvYmosIGNhbGwpIEdNT0NLX09OX0NBTExfSU1QTF8ob2JqLCBjYWxsKQotCi0jZGVmaW5lIEdNT0NLX0VYUEVDVF9DQUxMX0lNUExfKG9iaiwgY2FsbCkgXAotICAgICgob2JqKS5nbW9ja18jI2NhbGwpLkludGVybmFsRXhwZWN0ZWRBdChfX0ZJTEVfXywgX19MSU5FX18sICNvYmosICNjYWxsKQotI2RlZmluZSBFWFBFQ1RfQ0FMTChvYmosIGNhbGwpIEdNT0NLX0VYUEVDVF9DQUxMX0lNUExfKG9iaiwgY2FsbCkKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX1NQRUNfQlVJTERFUlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKaW5kZXggNjczNWM3MS4uZThkMWIzYiAxMDA2NDQKLS0tIGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKKysrIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKQEAgLTEsOTQgKzEsMTUgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgaXMgdGhlIG1haW4gaGVhZGVyIGZpbGUgYSB1c2VyIHNob3VsZCBpbmNsdWRlLgorI2lmbmRlZiBURVNUSU5HX0dNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfSF8KKyNkZWZpbmUgVEVTVElOR19HTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0hfCiAKLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0hfCisvLyBUaGUgZmlsZS9kaXJlY3RvcnkgbGF5b3V0IG9mIEdvb2dsZSBUZXN0IGlzIG5vdCB5ZXQgY29uc2lkZXJlZCBzdGFibGUuIFVudGlsCisvLyBpdCBzdGFiaWxpemVzLCBDaHJvbWl1bSBjb2RlIHdpbGwgdXNlIGZvcndhcmRpbmcgaGVhZGVycyBpbiB0ZXN0aW5nL2d0ZXN0CisvLyBhbmQgdGVzdGluZy9nbW9jaywgaW5zdGVhZCBvZiBkaXJlY3RseSBpbmNsdWRpbmcgZmlsZXMgaW4KKy8vIHRoaXJkX3BhcnR5L2dvb2dsZXRlc3QuCiAKLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgc3ludGF4OgotLy8KLS8vICAgT05fQ0FMTChtb2NrX29iamVjdC5NZXRob2QoLi4uKSkKLS8vICAgICAuV2l0aCguLi4pID8KLS8vICAgICAuV2lsbEJ5RGVmYXVsdCguLi4pOwotLy8KLS8vIHdoZXJlIFdpdGgoKSBpcyBvcHRpb25hbCBhbmQgV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkKLS8vIG9uY2UuCi0vLwotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX29iamVjdC5NZXRob2QoLi4uKSkKLS8vICAgICAuV2l0aCguLi4pID8KLS8vICAgICAuVGltZXMoLi4uKSA/Ci0vLyAgICAgLkluU2VxdWVuY2UoLi4uKSAqCi0vLyAgICAgLldpbGxPbmNlKC4uLikgKgotLy8gICAgIC5XaWxsUmVwZWF0ZWRseSguLi4pID8KLS8vICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpID8gOwotLy8KLS8vIHdoZXJlIGFsbCBjbGF1c2VzIGFyZSBvcHRpb25hbCBhbmQgV2lsbE9uY2UoKSBjYW4gYmUgcmVwZWF0ZWQuCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLSNpbmNsdWRlICJnbW9jay9nbW9jay1hY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1vcmUtbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIERlY2xhcmVzIEdvb2dsZSBNb2NrIGZsYWdzIHRoYXQgd2Ugd2FudCBhIHVzZXIgdG8gdXNlIHByb2dyYW1tYXRpY2FsbHkuCi1HTU9DS19ERUNMQVJFX2Jvb2xfKGNhdGNoX2xlYWtlZF9tb2Nrcyk7Ci1HTU9DS19ERUNMQVJFX3N0cmluZ18odmVyYm9zZSk7Ci0KLS8vIEluaXRpYWxpemVzIEdvb2dsZSBNb2NrLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUKLS8vIHRlc3RzLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSBmbGFncwotLy8gdGhhdCBHb29nbGUgTW9jayByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgTW9jayBmbGFnIGlzIHNlZW4sCi0vLyBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgotLy8KLS8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBNb2NrIGZsYWcgdmFyaWFibGVzIGFyZQotLy8gdXBkYXRlZC4KLS8vCi0vLyBTaW5jZSBHb29nbGUgVGVzdCBpcyBuZWVkZWQgZm9yIEdvb2dsZSBNb2NrIHRvIHdvcmssIHRoaXMgZnVuY3Rpb24KLS8vIGFsc28gaW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QgYW5kIHBhcnNlcyBpdHMgZmxhZ3MsIGlmIHRoYXQgaGFzbid0Ci0vLyBiZWVuIGRvbmUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZU1vY2soaW50KiBhcmdjLCBjaGFyKiogYXJndik7Ci0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KLS8vIFVOSUNPREUgbW9kZS4KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlTW9jayhpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0hfCisjZW5kaWYgIC8vIFRFU1RJTkdfR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMzYjFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmM4YTAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlIChodHRwOi8vZ28vcHVtcCkuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydAotJCQgaXQgdG8gY2FsbGJhY2stYWN0aW9ucy5oLgotJCQKLSR2YXIgbWF4X2NhbGxiYWNrX2FyaXR5ID0gNQotJCR9fSBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIGVkaXRvcnMuCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlZmVmOS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBBbiBpbnN0YWxsYXRpb24tc3BlY2lmaWMgZXh0ZW5zaW9uIHBvaW50IGZvciBnbW9jay1tYXRjaGVycy5oLgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gQWRkcyBnb29nbGUzIGNhbGxiYWNrIHN1cHBvcnQgdG8gQ2FsbGFibGVUcmFpdHMuCi0vLwotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwotCi0jZW5kaWYgIC8vICBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmggYi90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlOGJmZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBJbmplY3Rpb24gcG9pbnQgZm9yIGN1c3RvbSB1c2VyIGNvbmZpZ3VyYXRpb25zLgotLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgY2FuIGJlIGRlZmluZWQ6Ci0vLwotLy8gICBGbGFnIHJlbGF0ZWQgbWFjcm9zOgotLy8gICAgIEdNT0NLX0RFQ0xBUkVfYm9vbF8obmFtZSkKLS8vICAgICBHTU9DS19ERUNMQVJFX2ludDMyXyhuYW1lKQotLy8gICAgIEdNT0NLX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKQotLy8gICAgIEdNT0NLX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8gICAgIEdNT0NLX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykKLS8vICAgICBHTU9DS19ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8KLS8vICoqIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZSAqKgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX1BPUlRfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfUE9SVF9IXwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxMWU0My4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAKLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0ZW1wbGF0ZSBtZXRhLXByb2dyYW1taW5nIHV0aWxpdHkgY2xhc3NlcyBuZWVkZWQKLS8vIGZvciBpbXBsZW1lbnRpbmcgR29vZ2xlIE1vY2suCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXI7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEFuIElnbm9yZWRWYWx1ZSBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuCi0vLyBUaGlzIGlzIHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSBJZ25vcmVSZXN1bHQoYSkgYWN0aW9uLgotY2xhc3MgSWdub3JlZFZhbHVlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgY29uc3RydWN0b3IgdGVtcGxhdGUgYWxsb3dzIGFueSB2YWx1ZSB0byBiZSBpbXBsaWNpdGx5Ci0gIC8vIGNvbnZlcnRlZCB0byBJZ25vcmVkVmFsdWUuICBUaGUgb2JqZWN0IGhhcyBubyBkYXRhIG1lbWJlciBhbmQKLSAgLy8gZG9lc24ndCB0cnkgdG8gcmVtZW1iZXIgYW55dGhpbmcgYWJvdXQgdGhlIGFyZ3VtZW50LiAgV2UKLSAgLy8gZGVsaWJlcmF0ZWx5IG9taXQgdGhlICdleHBsaWNpdCcga2V5d29yZCBpbiBvcmRlciB0byBhbGxvdyB0aGUKLSAgLy8gY29udmVyc2lvbiB0byBiZSBpbXBsaWNpdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIElnbm9yZWRWYWx1ZShjb25zdCBUJiAvKiBpZ25vcmVkICovKSB7fSAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCi19OwotCi0vLyBNYXRjaGVyVHVwbGU8VD46OnR5cGUgaXMgYSB0dXBsZSB0eXBlIHdoZXJlIGVhY2ggZmllbGQgaXMgYSBNYXRjaGVyCi0vLyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotc3RydWN0IE1hdGNoZXJUdXBsZTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExPiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sCi0gICAgICBNYXRjaGVyPEE0PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTU+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgIHR5cGVuYW1lIEE2Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNz4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKLSAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiwgTWF0Y2hlcjxBNz4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTg+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+LCBNYXRjaGVyPEE4PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiwgTWF0Y2hlcjxBOD4sIE1hdGNoZXI8QTk+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwKLSAgICBBMTA+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+LCBNYXRjaGVyPEE4PiwgTWF0Y2hlcjxBOT4sCi0gICAgICBNYXRjaGVyPEExMD4gPiB0eXBlOwotfTsKLQotLy8gVGVtcGxhdGUgc3RydWN0IEZ1bmN0aW9uPEY+LCB3aGVyZSBGIG11c3QgYmUgYSBmdW5jdGlvbiB0eXBlLCBjb250YWlucwotLy8gdGhlIGZvbGxvd2luZyB0eXBlZGVmczoKLS8vCi0vLyAgIFJlc3VsdDogICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdHlwZS4KLS8vICAgQXJndW1lbnROOiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBOLXRoIGFyZ3VtZW50LCB3aGVyZSBOIHN0YXJ0cyB3aXRoIDEuCi0vLyAgIEFyZ3VtZW50VHVwbGU6ICAgICAgICB0aGUgdHVwbGUgdHlwZSBjb25zaXN0aW5nIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIEYuCi0vLyAgIEFyZ3VtZW50TWF0Y2hlclR1cGxlOiB0aGUgdHVwbGUgdHlwZSBjb25zaXN0aW5nIG9mIE1hdGNoZXJzIGZvciBhbGwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb2YgRi4KLS8vICAgTWFrZVJlc3VsdFZvaWQ6ICAgICAgIHRoZSBmdW5jdGlvbiB0eXBlIG9idGFpbmVkIGJ5IHN1YnN0aXR1dGluZyB2b2lkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHJldHVybiB0eXBlIG9mIEYuCi0vLyAgIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWU6Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gdHlwZSBvYnRhaW5lZCBieSBzdWJzdGl0dXRpbmcgU29tZXRoaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHJldHVybiB0eXBlIG9mIEYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLXN0cnVjdCBGdW5jdGlvbjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1zdHJ1Y3QgRnVuY3Rpb248UigpPiB7Ci0gIHR5cGVkZWYgUiBSZXN1bHQ7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTw+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZSgpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgotc3RydWN0IEZ1bmN0aW9uPFIoQTEpPgotICAgIDogRnVuY3Rpb248UigpPiB7Ci0gIHR5cGVkZWYgQTEgQXJndW1lbnQxOwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTE+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIpPgotICAgIDogRnVuY3Rpb248UihBMSk+IHsKLSAgdHlwZWRlZiBBMiBBcmd1bWVudDI7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTI+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzKT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyKT4gewotICB0eXBlZGVmIEEzIEFyZ3VtZW50MzsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMyk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMyk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMpPiB7Ci0gIHR5cGVkZWYgQTQgQXJndW1lbnQ0OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQ+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNT4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0KT4gewotICB0eXBlZGVmIEE1IEFyZ3VtZW50NTsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2Pgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSk+IHsKLSAgdHlwZWRlZiBBNiBBcmd1bWVudDY7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7Ci0gIHR5cGVkZWYgQTcgQXJndW1lbnQ3OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTc+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gewotICB0eXBlZGVmIEE4IEFyZ3VtZW50ODsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5Pgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IHsKLSAgdHlwZWRlZiBBOSBBcmd1bWVudDk7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwKLSAgICAgIEE5KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCi0gICAgdHlwZW5hbWUgQTEwPgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IHsKLSAgdHlwZWRlZiBBMTAgQXJndW1lbnQxMDsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksCi0gICAgICBBMTA+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICBBOSwgQTEwKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBhZjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bwotJCQgZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC4KLSQkCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZyB1dGlsaXR5IGNsYXNzZXMgbmVlZGVkCi0vLyBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZSBNb2NrLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBNYXRjaGVyOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBbiBJZ25vcmVkVmFsdWUgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnN0cnVjdGVkIGZyb20gQU5ZIHZhbHVlLgotLy8gVGhpcyBpcyB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgSWdub3JlUmVzdWx0KGEpIGFjdGlvbi4KLWNsYXNzIElnbm9yZWRWYWx1ZSB7Ci0gcHVibGljOgotICAvLyBUaGlzIGNvbnN0cnVjdG9yIHRlbXBsYXRlIGFsbG93cyBhbnkgdmFsdWUgdG8gYmUgaW1wbGljaXRseQotICAvLyBjb252ZXJ0ZWQgdG8gSWdub3JlZFZhbHVlLiAgVGhlIG9iamVjdCBoYXMgbm8gZGF0YSBtZW1iZXIgYW5kCi0gIC8vIGRvZXNuJ3QgdHJ5IHRvIHJlbWVtYmVyIGFueXRoaW5nIGFib3V0IHRoZSBhcmd1bWVudC4gIFdlCi0gIC8vIGRlbGliZXJhdGVseSBvbWl0IHRoZSAnZXhwbGljaXQnIGtleXdvcmQgaW4gb3JkZXIgdG8gYWxsb3cgdGhlCi0gIC8vIGNvbnZlcnNpb24gdG8gYmUgaW1wbGljaXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBJZ25vcmVkVmFsdWUoY29uc3QgVCYgLyogaWdub3JlZCAqLykge30gIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQotfTsKLQotLy8gTWF0Y2hlclR1cGxlPFQ+Ojp0eXBlIGlzIGEgdHVwbGUgdHlwZSB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgTWF0Y2hlcgotLy8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHR1cGxlIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KLXN0cnVjdCBNYXRjaGVyVHVwbGU7Ci0KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgQSRqXV1dXQotJHZhciBBcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgbWF0Y2hlcl9BcyA9IFtbJGZvciBqLCBbW01hdGNoZXI8QSRqPl1dXV0KLXRlbXBsYXRlIDwkdHlwZW5hbWVfQXM+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPCRBcz4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkbWF0Y2hlcl9BcyA+IHR5cGU7Ci19OwotCi0KLV1dCi0vLyBUZW1wbGF0ZSBzdHJ1Y3QgRnVuY3Rpb248Rj4sIHdoZXJlIEYgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGNvbnRhaW5zCi0vLyB0aGUgZm9sbG93aW5nIHR5cGVkZWZzOgotLy8KLS8vICAgUmVzdWx0OiAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLgotLy8gICBBcmd1bWVudE46ICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIE4tdGggYXJndW1lbnQsIHdoZXJlIE4gc3RhcnRzIHdpdGggMS4KLS8vICAgQXJndW1lbnRUdXBsZTogICAgICAgIHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgYWxsIHBhcmFtZXRlcnMgb2YgRi4KLS8vICAgQXJndW1lbnRNYXRjaGVyVHVwbGU6IHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgTWF0Y2hlcnMgZm9yIGFsbAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBvZiBGLgotLy8gICBNYWtlUmVzdWx0Vm9pZDogICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIHZvaWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KLS8vICAgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZToKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB0eXBlIG9idGFpbmVkIGJ5IHN1YnN0aXR1dGluZyBTb21ldGhpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotc3RydWN0IEZ1bmN0aW9uOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLXN0cnVjdCBGdW5jdGlvbjxSKCk+IHsKLSAgdHlwZWRlZiBSIFJlc3VsdDsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZCgpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKCk7Ci19OwotCi0KLSRyYW5nZSBpIDEuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHZhciB0eXBlbmFtZV9BcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dCi0kdmFyIEFzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBtYXRjaGVyX0FzID0gW1skZm9yIGosIFtbTWF0Y2hlcjxBJGo+XV1dXQotJHJhbmdlIGsgMS4uaS0xCi0kdmFyIHByZXZfQXMgPSBbWyRmb3IgaywgW1tBJGtdXV1dCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiR0eXBlbmFtZV9Bcz4KLXN0cnVjdCBGdW5jdGlvbjxSKCRBcyk+Ci0gICAgOiBGdW5jdGlvbjxSKCRwcmV2X0FzKT4gewotICB0eXBlZGVmIEEkaSBBcmd1bWVudCRpOwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8JEFzPiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKCRBcyk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoJEFzKTsKLX07Ci0KLQotXV0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCBiL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM0ZWVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIHV0aWxpdGllcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBHb29nbGUKLS8vIE1vY2suICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgc28gcGxlYXNlIERPIE5PVAotLy8gVVNFIFRIRU0gSU4gVVNFUiBDT0RFLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfSU5URVJOQUxfVVRJTFNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXwotCi0jaWYgIWRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQ29udmVydHMgYW4gaWRlbnRpZmllciBuYW1lIHRvIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbG93ZXItY2FzZQotLy8gd29yZHMuICBFYWNoIG1heGltdW0gc3Vic3RyaW5nIG9mIHRoZSBmb3JtIFtBLVphLXpdW2Etel0qfFxkKyBpcwotLy8gdHJlYXRlZCBhcyBvbmUgd29yZC4gIEZvciBleGFtcGxlLCBib3RoICJGb29CYXIxMjMiIGFuZAotLy8gImZvb19iYXJfMTIzIiBhcmUgY29udmVydGVkIHRvICJmb28gYmFyIDEyMyIuCi1HVEVTVF9BUElfIHN0cmluZyBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKGNvbnN0IGNoYXIqIGlkX25hbWUpOwotCi0vLyBQb2ludGVlT2Y8UG9pbnRlcj46OnR5cGUgaXMgdGhlIHR5cGUgb2YgYSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGEKLS8vIFBvaW50ZXIsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzbWFydCBwb2ludGVyIG9yIGEgcmF3IHBvaW50ZXIuICBUaGUKLS8vIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgY2FzZSB3aGVyZSBQb2ludGVyIGlzIGEKLS8vIHNtYXJ0IHBvaW50ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLXN0cnVjdCBQb2ludGVlT2YgewotICAvLyBTbWFydCBwb2ludGVyIGNsYXNzZXMgZGVmaW5lIHR5cGUgZWxlbWVudF90eXBlIGFzIHRoZSB0eXBlIG9mCi0gIC8vIHRoZWlyIHBvaW50ZWVzLgotICB0eXBlZGVmIHR5cGVuYW1lIFBvaW50ZXI6OmVsZW1lbnRfdHlwZSB0eXBlOwotfTsKLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgZm9yIHRoZSByYXcgcG9pbnRlciBjYXNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUG9pbnRlZU9mPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi0KLS8vIEdldFJhd1BvaW50ZXIocCkgcmV0dXJucyB0aGUgcmF3IHBvaW50ZXIgdW5kZXJseWluZyBwIHdoZW4gcCBpcyBhCi0vLyBzbWFydCBwb2ludGVyLCBvciByZXR1cm5zIHAgaXRzZWxmIHdoZW4gcCBpcyBhbHJlYWR5IGEgcmF3IHBvaW50ZXIuCi0vLyBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZm9yIHRoZSBzbWFydCBwb2ludGVyIGNhc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLWlubGluZSBjb25zdCB0eXBlbmFtZSBQb2ludGVyOjplbGVtZW50X3R5cGUqIEdldFJhd1BvaW50ZXIoY29uc3QgUG9pbnRlciYgcCkgewotICByZXR1cm4gcC5nZXQoKTsKLX0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGlzIGZvciB0aGUgcmF3IHBvaW50ZXIgY2FzZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIEVsZW1lbnQqIEdldFJhd1BvaW50ZXIoRWxlbWVudCogcCkgeyByZXR1cm4gcDsgfQotCi0vLyBUaGlzIGNvbXBhcmF0b3IgYWxsb3dzIGxpbmtlZF9wdHIgdG8gYmUgc3RvcmVkIGluIHNldHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBMaW5rZWRQdHJMZXNzVGhhbiB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPFQ+JiBsaHMsCi0gICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPFQ+JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbGhzLmdldCgpIDwgcmhzLmdldCgpOwotICB9Ci19OwotCi0vLyBTeW1iaWFuIGNvbXBpbGF0aW9uIGNhbiBiZSBkb25lIHdpdGggd2NoYXJfdCBiZWluZyBlaXRoZXIgYSBuYXRpdmUKLS8vIHR5cGUgb3IgYSB0eXBlZGVmLiAgVXNpbmcgR29vZ2xlIE1vY2sgd2l0aCBPcGVuQyB3aXRob3V0IHdjaGFyX3QKLS8vIHNob3VsZCByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIF9TVExQX05PX1dDSEFSX1QuCi0vLwotLy8gTVNWQyB0cmVhdHMgd2NoYXJfdCBhcyBhIG5hdGl2ZSB0eXBlIHVzdWFsbHksIGJ1dCB0cmVhdHMgaXQgYXMgdGhlCi0vLyBzYW1lIGFzIHVuc2lnbmVkIHNob3J0IHdoZW4gdGhlIGNvbXBpbGVyIG9wdGlvbiAvWmM6d2NoYXJfdC0gaXMKLS8vIHNwZWNpZmllZC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4gd2NoYXJfdAotLy8gaXMgYSBuYXRpdmUgdHlwZS4KLSNpZiAoR1RFU1RfT1NfU1lNQklBTiAmJiBkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpKSB8fCBcCi0gICAgKGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKSkKLS8vIHdjaGFyX3QgaXMgYSB0eXBlZGVmLgotI2Vsc2UKLSMgZGVmaW5lIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXyAxCi0jZW5kaWYKLQotLy8gc2lnbmVkIHdjaGFyX3QgYW5kIHVuc2lnbmVkIHdjaGFyX3QgYXJlIE5PVCBpbiB0aGUgQysrIHN0YW5kYXJkLgotLy8gVXNpbmcgdGhlbSBpcyBhIGJhZCBwcmFjdGljZSBhbmQgbm90IHBvcnRhYmxlLiAgU28gRE9OJ1QgdXNlIHRoZW0uCi0vLwotLy8gU3RpbGwsIEdvb2dsZSBNb2NrIGlzIGRlc2lnbmVkIHRvIHdvcmsgZXZlbiBpZiB0aGUgdXNlciB1c2VzIHNpZ25lZAotLy8gd2NoYXJfdCBvciB1bnNpZ25lZCB3Y2hhcl90IChvYnZpb3VzbHksIGFzc3VtaW5nIHRoZSBjb21waWxlcgotLy8gc3VwcG9ydHMgdGhlbSkuCi0vLwotLy8gVG8gZ2NjLAotLy8gICB3Y2hhcl90ID09IHNpZ25lZCB3Y2hhcl90ICE9IHVuc2lnbmVkIHdjaGFyX3QgPT0gdW5zaWduZWQgaW50Ci0jaWZkZWYgX19HTlVDX18KLS8vIHNpZ25lZC91bnNpZ25lZCB3Y2hhcl90IGFyZSB2YWxpZCB0eXBlcy4KLSMgZGVmaW5lIEdNT0NLX0hBU19TSUdORURfV0NIQVJfVF8gMQotI2VuZGlmCi0KLS8vIEluIHdoYXQgZm9sbG93cywgd2UgdXNlIHRoZSB0ZXJtICJraW5kIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgdHlwZQotLy8gaXMgYm9vbCwgYW4gaW50ZWdlciB0eXBlIChleGNsdWRpbmcgYm9vbCksIGEgZmxvYXRpbmctcG9pbnQgdHlwZSwKLS8vIG9yIG5vbmUgb2YgdGhlbS4gIFRoaXMgY2F0ZWdvcml6YXRpb24gaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZwotLy8gd2hlbiBhIG1hdGNoZXIgYXJndW1lbnQgdHlwZSBjYW4gYmUgc2FmZWx5IGNvbnZlcnRlZCB0byBhbm90aGVyCi0vLyB0eXBlIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTYWZlTWF0Y2hlckNhc3QuCi1lbnVtIFR5cGVLaW5kIHsKLSAga0Jvb2wsIGtJbnRlZ2VyLCBrRmxvYXRpbmdQb2ludCwga090aGVyCi19OwotCi0vLyBLaW5kT2Y8VD46OnZhbHVlIGlzIHRoZSBraW5kIG9mIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgS2luZE9mIHsKLSAgZW51bSB7IHZhbHVlID0ga090aGVyIH07ICAvLyBUaGUgZGVmYXVsdCBraW5kLgotfTsKLQotLy8gVGhpcyBtYWNybyBkZWNsYXJlcyB0aGF0IHRoZSBraW5kIG9mICd0eXBlJyBpcyAna2luZCcuCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfS0lORF8odHlwZSwga2luZCkgXAotICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgS2luZE9mPHR5cGU+IHsgZW51bSB7IHZhbHVlID0ga2luZCB9OyB9Ci0KLUdNT0NLX0RFQ0xBUkVfS0lORF8oYm9vbCwga0Jvb2wpOwotCi0vLyBBbGwgc3RhbmRhcmQgaW50ZWdlciB0eXBlcy4KLUdNT0NLX0RFQ0xBUkVfS0lORF8oY2hhciwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhzaWduZWQgY2hhciwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyh1bnNpZ25lZCBjaGFyLCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKHNob3J0LCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgc2hvcnQsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVAotR01PQ0tfREVDTEFSRV9LSU5EXyhpbnQsIGtJbnRlZ2VyKTsKLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgaW50LCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKGxvbmcsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVAotR01PQ0tfREVDTEFSRV9LSU5EXyh1bnNpZ25lZCBsb25nLCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKLQotI2lmIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXwotR01PQ0tfREVDTEFSRV9LSU5EXyh3Y2hhcl90LCBrSW50ZWdlcik7Ci0jZW5kaWYKLQotLy8gTm9uLXN0YW5kYXJkIGludGVnZXIgdHlwZXMuCi1HTU9DS19ERUNMQVJFX0tJTkRfKEludDY0LCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKFVJbnQ2NCwga0ludGVnZXIpOwotCi0vLyBBbGwgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQgdHlwZXMuCi1HTU9DS19ERUNMQVJFX0tJTkRfKGZsb2F0LCBrRmxvYXRpbmdQb2ludCk7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhsb25nIGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOwotCi0jdW5kZWYgR01PQ0tfREVDTEFSRV9LSU5EXwotCi0vLyBFdmFsdWF0ZXMgdG8gdGhlIGtpbmQgb2YgJ3R5cGUnLgotI2RlZmluZSBHTU9DS19LSU5EX09GXyh0eXBlKSBcCi0gIHN0YXRpY19jYXN0PCA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlS2luZD4oIFwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OktpbmRPZjx0eXBlPjo6dmFsdWUpCi0KLS8vIEV2YWx1YXRlcyB0byB0cnVlIGlmZiBpbnRlZ2VyIHR5cGUgVCBpcyBzaWduZWQuCi0jZGVmaW5lIEdNT0NLX0lTX1NJR05FRF8oVCkgKHN0YXRpY19jYXN0PFQ+KC0xKSA8IDApCi0KLS8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRnJvbUtpbmQsIEZyb20sIGtUb0tpbmQsIFRvPjo6dmFsdWUKLS8vIGlzIHRydWUgaWZmIGFyaXRobWV0aWMgdHlwZSBGcm9tIGNhbiBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0bwotLy8gYXJpdGhtZXRpYyB0eXBlIFRvLgotLy8KLS8vIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBib3RoIEZyb20gYW5kIFRvIGFyZQotLy8gcmF3IChpLmUuIGhhcyBubyBDViBtb2RpZmllciwgaXMgbm90IGEgcG9pbnRlciwgYW5kIGlzIG5vdCBhCi0vLyByZWZlcmVuY2UpIGJ1aWx0LWluIGFyaXRobWV0aWMgdHlwZXMsIGtGcm9tS2luZCBpcyB0aGUga2luZCBvZgotLy8gRnJvbSwgYW5kIGtUb0tpbmQgaXMgdGhlIGtpbmQgb2YgVG87IHRoZSB2YWx1ZSBpcwotLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGVuIHRoZSBhYm92ZSBwcmUtY29uZGl0aW9uIGlzIHZpb2xhdGVkLgotdGVtcGxhdGUgPFR5cGVLaW5kIGtGcm9tS2luZCwgdHlwZW5hbWUgRnJvbSwgVHlwZUtpbmQga1RvS2luZCwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsIDogcHVibGljIGZhbHNlX3R5cGUge307Ci0KLS8vIENvbnZlcnRpbmcgYm9vbCB0byBib29sIGlzIGxvc3NsZXNzLgotdGVtcGxhdGUgPD4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtCb29sLCBib29sPgotICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGJvb2wgdG8gYW55IGludGVnZXIgdHlwZSBpcyBsb3NzbGVzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtJbnRlZ2VyLCBUbz4KLSAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBib29sIHRvIGFueSBmbG9hdGluZy1wb2ludCB0eXBlIGlzIGxvc3NsZXNzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrQm9vbCwgYm9vbCwga0Zsb2F0aW5nUG9pbnQsIFRvPgotICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYm9vbCBpcyBsb3NzeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrSW50ZWdlciwgRnJvbSwga0Jvb2wsIGJvb2w+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYW5vdGhlciBub24tYm9vbCBpbnRlZ2VyIGlzIGxvc3NsZXNzIGlmZgotLy8gdGhlIHRhcmdldCB0eXBlJ3MgcmFuZ2UgZW5jbG9zZXMgdGhlIHNvdXJjZSB0eXBlJ3MgcmFuZ2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrSW50ZWdlciwgVG8+Ci0gICAgOiBwdWJsaWMgYm9vbF9jb25zdGFudDwKLSAgICAgIC8vIFdoZW4gY29udmVydGluZyBmcm9tIGEgc21hbGxlciBzaXplIHRvIGEgbGFyZ2VyIHNpemUsIHdlIGFyZQotICAgICAgLy8gZmluZSBhcyBsb25nIGFzIHdlIGFyZSBub3QgY29udmVydGluZyBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZC4KLSAgICAgICgoc2l6ZW9mKEZyb20pIDwgc2l6ZW9mKFRvKSkgJiYKLSAgICAgICAoIUdNT0NLX0lTX1NJR05FRF8oRnJvbSkgfHwgR01PQ0tfSVNfU0lHTkVEXyhUbykpKSB8fAotICAgICAgLy8gV2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIHNhbWUgc2l6ZSwgdGhlIHNpZ25lZG5lc3MgbXVzdCBtYXRjaC4KLSAgICAgICgoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpICYmCi0gICAgICAgKEdNT0NLX0lTX1NJR05FRF8oRnJvbSkgPT0gR01PQ0tfSVNfU0lHTkVEXyhUbykpKT4ge307ICAvLyBOT0xJTlQKLQotI3VuZGVmIEdNT0NLX0lTX1NJR05FRF8KLQotLy8gQ29udmVydGluZyBhbiBpbnRlZ2VyIHRvIGEgZmxvYXRpbmctcG9pbnQgdHlwZSBtYXkgYmUgbG9zc3ksIHNpbmNlCi0vLyB0aGUgZm9ybWF0IG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrRmxvYXRpbmdQb2ludCwgVG8+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYm9vbCBpcyBsb3NzeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRmxvYXRpbmdQb2ludCwgRnJvbSwga0Jvb2wsIGJvb2w+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYW4gaW50ZWdlciBpcyBsb3NzeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtJbnRlZ2VyLCBUbz4KLSAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OyAgLy8gTk9MSU5UCi0KLS8vIENvbnZlcnRpbmcgYSBmbG9hdGluZy1wb2ludCB0byBhbm90aGVyIGZsb2F0aW5nLXBvaW50IGlzIGxvc3NsZXNzCi0vLyBpZmYgdGhlIHRhcmdldCB0eXBlIGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgc291cmNlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPAotICBrRmxvYXRpbmdQb2ludCwgRnJvbSwga0Zsb2F0aW5nUG9pbnQsIFRvPgotICAgIDogcHVibGljIGJvb2xfY29uc3RhbnQ8c2l6ZW9mKEZyb20pIDw9IHNpemVvZihUbyk+IHt9OyAgLy8gTk9MSU5UCi0KLS8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWUgaXMgdHJ1ZSBpZmYgYXJpdGhtZXRpYwotLy8gdHlwZSBGcm9tIGNhbiBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0byBhcml0aG1ldGljIHR5cGUgVG8uCi0vLwotLy8gSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IGJvdGggRnJvbSBhbmQgVG8gYXJlCi0vLyByYXcgKGkuZS4gaGFzIG5vIENWIG1vZGlmaWVyLCBpcyBub3QgYSBwb2ludGVyLCBhbmQgaXMgbm90IGEKLS8vIHJlZmVyZW5jZSkgYnVpbHQtaW4gYXJpdGhtZXRpYyB0eXBlczsgdGhlIHZhbHVlIGlzCi0vLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZW4gdGhlIGFib3ZlIHByZS1jb25kaXRpb24gaXMgdmlvbGF0ZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGUKLSAgICA6IHB1YmxpYyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8Ci0gIEdNT0NLX0tJTkRfT0ZfKEZyb20pLCBGcm9tLCBHTU9DS19LSU5EX09GXyhUbyksIFRvPiB7fTsgIC8vIE5PTElOVAotCi0vLyBUaGlzIGludGVyZmFjZSBrbm93cyBob3cgdG8gcmVwb3J0IGEgR29vZ2xlIE1vY2sgZmFpbHVyZSAoZWl0aGVyCi0vLyBub24tZmF0YWwgb3IgZmF0YWwpLgotY2xhc3MgRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSB0eXBlIG9mIGEgZmFpbHVyZSAoZWl0aGVyIG5vbi1mYXRhbCBvciBmYXRhbCkuCi0gIGVudW0gRmFpbHVyZVR5cGUgewotICAgIGtOb25mYXRhbCwga0ZhdGFsCi0gIH07Ci0KLSAgdmlydHVhbCB+RmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKCkge30KLQotICAvLyBSZXBvcnRzIGEgZmFpbHVyZSB0aGF0IG9jY3VycmVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbi4KLSAgdmlydHVhbCB2b2lkIFJlcG9ydEZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOwotfTsKLQotLy8gUmV0dXJucyB0aGUgZmFpbHVyZSByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBNb2NrLgotR1RFU1RfQVBJXyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIEdldEZhaWx1cmVSZXBvcnRlcigpOwotCi0vLyBBc3NlcnRzIHRoYXQgY29uZGl0aW9uIGlzIHRydWU7IGFib3J0cyB0aGUgcHJvY2VzcyB3aXRoIHRoZSBnaXZlbgotLy8gbWVzc2FnZSBpZiBjb25kaXRpb24gaXMgZmFsc2UuICBXZSBjYW5ub3QgdXNlIExPRyhGQVRBTCkgb3IgQ0hFQ0soKQotLy8gYXMgR29vZ2xlIE1vY2sgbWlnaHQgYmUgdXNlZCB0byBtb2NrIHRoZSBsb2cgc2luayBpdHNlbGYuICBXZQotLy8gaW5saW5lIHRoaXMgZnVuY3Rpb24gdG8gcHJldmVudCBpdCBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrCi0vLyB0cmFjZS4KLWlubGluZSB2b2lkIEFzc2VydChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtc2cpIHsKLSAgaWYgKCFjb25kaXRpb24pIHsKLSAgICBHZXRGYWlsdXJlUmVwb3J0ZXIoKS0+UmVwb3J0RmFpbHVyZShGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2U6OmtGYXRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBtc2cpOwotICB9Ci19Ci1pbmxpbmUgdm9pZCBBc3NlcnQoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7Ci0gIEFzc2VydChjb25kaXRpb24sIGZpbGUsIGxpbmUsICJBc3NlcnRpb24gZmFpbGVkLiIpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlOyBnZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZSBpZgotLy8gY29uZGl0aW9uIGlzIGZhbHNlLgotaW5saW5lIHZvaWQgRXhwZWN0KGJvb2wgY29uZGl0aW9uLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1zZykgewotICBpZiAoIWNvbmRpdGlvbikgewotICAgIEdldEZhaWx1cmVSZXBvcnRlcigpLT5SZXBvcnRGYWlsdXJlKEZhaWx1cmVSZXBvcnRlckludGVyZmFjZTo6a05vbmZhdGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIG1zZyk7Ci0gIH0KLX0KLWlubGluZSB2b2lkIEV4cGVjdChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKLSAgRXhwZWN0KGNvbmRpdGlvbiwgZmlsZSwgbGluZSwgIkV4cGVjdGF0aW9uIGZhaWxlZC4iKTsKLX0KLQotLy8gU2V2ZXJpdHkgbGV2ZWwgb2YgYSBsb2cuCi1lbnVtIExvZ1NldmVyaXR5IHsKLSAga0luZm8gPSAwLAotICBrV2FybmluZyA9IDEKLX07Ci0KLS8vIFZhbGlkIHZhbHVlcyBmb3IgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgotCi0vLyBBbGwgbG9ncyAoaW5mb3JtYXRpb25hbCBhbmQgd2FybmluZ3MpIGFyZSBwcmludGVkLgotY29uc3QgY2hhciBrSW5mb1ZlcmJvc2l0eVtdID0gImluZm8iOwotLy8gT25seSB3YXJuaW5ncyBhcmUgcHJpbnRlZC4KLWNvbnN0IGNoYXIga1dhcm5pbmdWZXJib3NpdHlbXSA9ICJ3YXJuaW5nIjsKLS8vIE5vIGxvZ3MgYXJlIHByaW50ZWQuCi1jb25zdCBjaGFyIGtFcnJvclZlcmJvc2l0eVtdID0gImVycm9yIjsKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBhIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBpcyB2aXNpYmxlIGFjY29yZGluZwotLy8gdG8gdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgotR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSk7Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBzdGRvdXQgaWZmICdzZXZlcml0eScgPj0gdGhlIGxldmVsCi0vLyBzcGVjaWZpZWQgYnkgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLiAgSWYgc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0KLS8vIDAsIGFsc28gcHJpbnRzIHRoZSBzdGFjayB0cmFjZSBleGNsdWRpbmcgdGhlIHRvcAotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgZnJhbWVzLiAgSW4gb3B0IG1vZGUsIGFueSBwb3NpdGl2ZQotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgaXMgdHJlYXRlZCBhcyAwLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoCi0vLyBmdW5jdGlvbiBjYWxscyB3aWxsIGJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBuZWVkIHRvIGJlCi0vLyBjb25zZXJ2YXRpdmUuCi1HVEVTVF9BUElfIHZvaWQgTG9nKExvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGFja19mcmFtZXNfdG9fc2tpcCk7Ci0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBncm91cCBhbGwgdHlwZSB1dGlsaXRpZXMgdG9nZXRoZXIuCi0KLS8vIFR5cGUgdHJhaXRzLgotCi0vLyBpc19yZWZlcmVuY2U8VD46OnZhbHVlIGlzIG5vbi16ZXJvIGlmZiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3JlZmVyZW5jZSA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19yZWZlcmVuY2U8VCY+IDogcHVibGljIHRydWVfdHlwZSB7fTsKLQotLy8gdHlwZV9lcXVhbHM8VDEsIFQyPjo6dmFsdWUgaXMgbm9uLXplcm8gaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCB0eXBlX2VxdWFscyA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0eXBlX2VxdWFsczxULCBUPiA6IHB1YmxpYyB0cnVlX3R5cGUge307Ci0KLS8vIHJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlIGZyb20gdHlwZSBULCBpZiBhbnkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9yZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAvLyBOT0xJTlQKLQotLy8gRGVjYXlBcnJheTxUPjo6dHlwZSB0dXJucyBhbiBhcnJheSB0eXBlIFVbTl0gdG8gY29uc3QgVSogYW5kIHByZXNlcnZlcwotLy8gb3RoZXIgdHlwZXMuICBVc2VmdWwgZm9yIHNhdmluZyBhIGNvcHkgb2YgYSBmdW5jdGlvbiBhcmd1bWVudC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVjYXlBcnJheSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+IHN0cnVjdCBEZWNheUFycmF5PFRbTl0+IHsKLSAgdHlwZWRlZiBjb25zdCBUKiB0eXBlOwotfTsKLS8vIFNvbWV0aW1lcyBwZW9wbGUgdXNlIGFycmF5cyB3aG9zZSBzaXplIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHVzZSBzaXRlCi0vLyAoZS5nLiBleHRlcm4gY29uc3QgY2hhciBrTmFtZVByZWZpeFtdKS4gIFRoaXMgc3BlY2lhbGl6YXRpb24gY292ZXJzIHRoYXQKLS8vIGNhc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlY2F5QXJyYXk8VFtdPiB7Ci0gIHR5cGVkZWYgY29uc3QgVCogdHlwZTsKLX07Ci0KLS8vIERpc2FibGUgTVNWQyB3YXJuaW5ncyBmb3IgaW5maW5pdGUgcmVjdXJzaW9uLCBzaW5jZSBpbiB0aGlzIGNhc2UgdGhlCi0vLyB0aGUgcmVjdXJzaW9uIGlzIHVucmVhY2hhYmxlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcxNykKLSNlbmRpZgotCi0vLyBJbnZhbGlkPFQ+KCkgaXMgdXNhYmxlIGFzIGFuIGV4cHJlc3Npb24gb2YgdHlwZSBULCBidXQgd2lsbCB0ZXJtaW5hdGUKLS8vIHRoZSBwcm9ncmFtIHdpdGggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgYWN0dWFsbHkgcnVuLiAgVGhpcyBpcyB1c2VmdWwKLS8vIHdoZW4gYSB2YWx1ZSBvZiB0eXBlIFQgaXMgbmVlZGVkIGZvciBjb21waWxhdGlvbiwgYnV0IHRoZSBzdGF0ZW1lbnQKLS8vIHdpbGwgbm90IHJlYWxseSBiZSBleGVjdXRlZCAob3Igd2UgZG9uJ3QgY2FyZSBpZiB0aGUgc3RhdGVtZW50Ci0vLyBjcmFzaGVzKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIFQgSW52YWxpZCgpIHsKLSAgQXNzZXJ0KGZhbHNlLCAiIiwgLTEsICJJbnRlcm5hbCBlcnJvcjogYXR0ZW1wdCB0byByZXR1cm4gaW52YWxpZCB2YWx1ZSIpOwotICAvLyBUaGlzIHN0YXRlbWVudCBpcyB1bnJlYWNoYWJsZSwgYW5kIHdvdWxkIG5ldmVyIHRlcm1pbmF0ZSBldmVuIGlmIGl0Ci0gIC8vIGNvdWxkIGJlIHJlYWNoZWQuIEl0IGlzIHByb3ZpZGVkIG9ubHkgdG8gcGxhY2F0ZSBjb21waWxlciB3YXJuaW5ncwotICAvLyBhYm91dCBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzLgotICByZXR1cm4gSW52YWxpZDxUPigpOwotfQotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCi0KLS8vIEdpdmVuIGEgcmF3IHR5cGUgKGkuZS4gaGF2aW5nIG5vIHRvcC1sZXZlbCByZWZlcmVuY2Ugb3IgY29uc3QKLS8vIG1vZGlmaWVyKSBSYXdDb250YWluZXIgdGhhdCdzIGVpdGhlciBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEKLS8vIG5hdGl2ZSBhcnJheSwgY2xhc3MgU3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IGhhcyB0aGUKLS8vIGZvbGxvd2luZyBtZW1iZXJzOgotLy8KLS8vICAgLSB0eXBlIGlzIGEgdHlwZSB0aGF0IHByb3ZpZGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgdmlldyB0bwotLy8gICAgIChpLmUuIGltcGxlbWVudHMgdGhlIFNUTCBjb250YWluZXIgY29uY2VwdCBmb3IpIFJhd0NvbnRhaW5lcjsKLS8vICAgLSBjb25zdF9yZWZlcmVuY2UgaXMgYSB0eXBlIHRoYXQgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBjb25zdAotLy8gICAgIFJhd0NvbnRhaW5lcjsKLS8vICAgLSBDb25zdFJlZmVyZW5jZShyYXdfY29udGFpbmVyKSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGFuIFNUTC1zdHlsZQotLy8gICAgIGNvbnRhaW5lciB2aWV3IHRvIHJhd19jb250YWluZXIsIHdoaWNoIGlzIGEgUmF3Q29udGFpbmVyLgotLy8gICAtIENvcHkocmF3X2NvbnRhaW5lcikgcmV0dXJucyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHZpZXcgb2YgYQotLy8gICAgIGNvcHkgb2YgcmF3X2NvbnRhaW5lciwgd2hpY2ggaXMgYSBSYXdDb250YWluZXIuCi0vLwotLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIFJhd0NvbnRhaW5lciBpdHNlbGYgaXMgYWxyZWFkeSBhbgotLy8gU1RMLXN0eWxlIGNvbnRhaW5lci4KLXRlbXBsYXRlIDxjbGFzcyBSYXdDb250YWluZXI+Ci1jbGFzcyBTdGxDb250YWluZXJWaWV3IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmF3Q29udGFpbmVyIHR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgdHlwZSYgY29uc3RfcmVmZXJlbmNlOwotCi0gIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UgQ29uc3RSZWZlcmVuY2UoY29uc3QgUmF3Q29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgICAvLyBFbnN1cmVzIHRoYXQgUmF3Q29udGFpbmVyIGlzIG5vdCBhIGNvbnN0IHR5cGUuCi0gICAgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFJhd0NvbnRhaW5lciwKLSAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhSYXdDb250YWluZXIpPigpOwotICAgIHJldHVybiBjb250YWluZXI7Ci0gIH0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCBSYXdDb250YWluZXImIGNvbnRhaW5lcikgeyByZXR1cm4gY29udGFpbmVyOyB9Ci19OwotCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiBSYXdDb250YWluZXIgaXMgYSBuYXRpdmUgYXJyYXkgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LCBzaXplX3QgTj4KLWNsYXNzIFN0bENvbnRhaW5lclZpZXc8RWxlbWVudFtOXT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKEVsZW1lbnQpIFJhd0VsZW1lbnQ7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7Ci0gIC8vIE5hdGl2ZUFycmF5PFQ+IGNhbiByZXByZXNlbnQgYSBuYXRpdmUgYXJyYXkgZWl0aGVyIGJ5IHZhbHVlIG9yIGJ5Ci0gIC8vIHJlZmVyZW5jZSAoc2VsZWN0ZWQgYnkgYSBjb25zdHJ1Y3RvciBhcmd1bWVudCksIHNvICdjb25zdCB0eXBlJwotICAvLyBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYSBjb25zdCBuYXRpdmUgYXJyYXkuICBXZSBjYW5ub3QKLSAgLy8gJ3R5cGVkZWYgY29uc3QgdHlwZSYgY29uc3RfcmVmZXJlbmNlJyBoZXJlLCBhcyB0aGF0IHdvdWxkIG1lYW4KLSAgLy8gQ29uc3RSZWZlcmVuY2UoKSBoYXMgdG8gcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgdmFyaWFibGUuCi0gIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZSBDb25zdFJlZmVyZW5jZShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7Ci0gICAgLy8gRW5zdXJlcyB0aGF0IEVsZW1lbnQgaXMgbm90IGEgY29uc3QgdHlwZS4KLSAgICB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8RWxlbWVudCwgUmF3RWxlbWVudD4oKTsKLSNpZiBHVEVTVF9PU19TWU1CSUFOCi0gICAgLy8gVGhlIE5va2lhIFN5bWJpYW4gY29tcGlsZXIgY29uZnVzZXMgaXRzZWxmIGluIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgICAvLyBmb3IgdGhpcyBjYWxsIHdpdGhvdXQgdGhlIGNhc3QgdG8gRWxlbWVudCo6Ci0gICAgLy8gZnVuY3Rpb24gY2FsbCAnW3Rlc3Rpbmc6OmludGVybmFsOjpOYXRpdmVBcnJheTxjaGFyICo+XS5OYXRpdmVBcnJheSgKLSAgICAvLyAgICAge2x2YWx9IGNvbnN0IGNoYXIgKls0XSwgbG9uZywgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJwotICAgIC8vICAgICBkb2VzIG5vdCBtYXRjaAotICAgIC8vICd0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk8Y2hhciAqPjo6TmF0aXZlQXJyYXkoCi0gICAgLy8gICAgIGNoYXIgKmNvbnN0ICosIHVuc2lnbmVkIGludCwgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJwotICAgIC8vIChpbnN0YW50aWF0aW5nOiAndGVzdGluZzo6aW50ZXJuYWw6OkNvbnRhaW5zTWF0Y2hlckltcGwKLSAgICAvLyAgICAgPGNvbnN0IGNoYXIgKiAoJilbNF0+OjpNYXRjaGVzKGNvbnN0IGNoYXIgKiAoJilbNF0pIGNvbnN0JykKLSAgICAvLyAoaW5zdGFudGlhdGluZzogJ3Rlc3Rpbmc6OmludGVybmFsOjpTdGxDb250YWluZXJWaWV3PGNoYXIgKls0XT46OgotICAgIC8vICAgICBDb25zdFJlZmVyZW5jZShjb25zdCBjaGFyICogKCYpWzRdKScpCi0gICAgLy8gKGFuZCB0aG91Z2ggdGhlIE4gcGFyYW1ldGVyIHR5cGUgaXMgbWlzbWF0Y2hlZCBpbiB0aGUgYWJvdmUgZXhwbGljaXQKLSAgICAvLyBjb252ZXJzaW9uIG9mIGl0IGRvZXNuJ3QgaGVscCAtIG9ubHkgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFycmF5KS4KLSAgICByZXR1cm4gdHlwZShjb25zdF9jYXN0PEVsZW1lbnQqPigmYXJyYXlbMF0pLCBOLAotICAgICAgICAgICAgICAgIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7Ci0jZWxzZQotICAgIHJldHVybiB0eXBlKGFycmF5LCBOLCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOwotI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCi0gIH0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7Ci0jaWYgR1RFU1RfT1NfU1lNQklBTgotICAgIHJldHVybiB0eXBlKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KCZhcnJheVswXSksIE4sIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KCkpOwotI2Vsc2UKLSAgICByZXR1cm4gdHlwZShhcnJheSwgTiwgUmVsYXRpb25Ub1NvdXJjZUNvcHkoKSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KLSAgfQotfTsKLQotLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gUmF3Q29udGFpbmVyIGlzIGEgbmF0aXZlIGFycmF5Ci0vLyByZXByZXNlbnRlZCBhcyBhIChwb2ludGVyLCBzaXplKSB0dXBsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50UG9pbnRlciwgdHlwZW5hbWUgU2l6ZT4KLWNsYXNzIFN0bENvbnRhaW5lclZpZXc8IDo6dGVzdGluZzo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OlBvaW50ZWVPZjxFbGVtZW50UG9pbnRlcj46OnR5cGUpIFJhd0VsZW1lbnQ7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZSBDb25zdFJlZmVyZW5jZSgKLSAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+JiBhcnJheSkgewotICAgIHJldHVybiB0eXBlKGdldDwwPihhcnJheSksIGdldDwxPihhcnJheSksIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7Ci0gIH0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEVsZW1lbnRQb2ludGVyLCBTaXplPiYgYXJyYXkpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8MD4oYXJyYXkpLCBnZXQ8MT4oYXJyYXkpLCBSZWxhdGlvblRvU291cmNlQ29weSgpKTsKLSAgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGluc3RhbnRpYXRpbmcKLS8vIFN0bENvbnRhaW5lciB3aXRoIGEgcmVmZXJlbmNlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU3RsQ29udGFpbmVyVmlldzxUJj47Ci0KLS8vIEEgdHlwZSB0cmFuc2Zvcm0gdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcGFpci4KLS8vIFBhaXJzIGxpa2UgdGhhdCBhcmUgdXNlZCBhcyB0aGUgdmFsdWVfdHlwZSBvZiBhc3NvY2lhdGl2ZSBjb250YWluZXJzLAotLy8gYW5kIHRoaXMgdHJhbnNmb3JtIHByb2R1Y2VzIGEgc2ltaWxhciBidXQgYXNzaWduYWJsZSBwYWlyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3RGcm9tS2V5IHsKLSAgdHlwZWRlZiBUIHR5cGU7Ci19OwotCi0vLyBQYXJ0aWFsbHkgc3BlY2lhbGl6ZWQgdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHN0ZDo6cGFpcjxjb25zdCBLLCBWPi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotc3RydWN0IFJlbW92ZUNvbnN0RnJvbUtleTxzdGQ6OnBhaXI8Y29uc3QgSywgVj4gPiB7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPEssIFY+IHR5cGU7Ci19OwotCi0vLyBNYXBwaW5nIGZyb20gYm9vbGVhbnMgdG8gdHlwZXMuIFNpbWlsYXIgdG8gYm9vc3Q6OmJvb2xfPGtWYWx1ZT4gYW5kCi0vLyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGtWYWx1ZT4uCi10ZW1wbGF0ZSA8Ym9vbCBrVmFsdWU+Ci1zdHJ1Y3QgQm9vbGVhbkNvbnN0YW50IHt9OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXwotCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIGIvdGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwZmUxNi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmFkaW1iQGdvb2dsZS5jb20gKFZhZGltIEJlcm1hbikKLS8vCi0vLyBMb3ctbGV2ZWwgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgcG9ydGluZyBHb29nbGUgTW9jayB0byB2YXJpb3VzCi0vLyBwbGF0Zm9ybXMuICBBbGwgbWFjcm9zIGVuZGluZyB3aXRoIF8gYW5kIHN5bWJvbHMgZGVmaW5lZCBpbiBhbgotLy8gaW50ZXJuYWwgbmFtZXNwYWNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIENvZGUKLS8vIG91dHNpZGUgR29vZ2xlIE1vY2sgTVVTVCBOT1QgVVNFIFRIRU0gRElSRUNUTFkuICBNYWNyb3MgdGhhdCBkb24ndAotLy8gZW5kIHdpdGggXyBhcmUgcGFydCBvZiBHb29nbGUgTW9jaydzIHB1YmxpYyBBUEkgYW5kIGNhbiBiZSB1c2VkIGJ5Ci0vLyBjb2RlIG91dHNpZGUgR29vZ2xlIE1vY2suCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19QT1JUX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfUE9SVF9IXwotCi0jaWYgIWRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotLy8gTW9zdCBvZiB0aGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgcG9ydGluZyBHb29nbGUgTW9jayBhcmUgYWxzbwotLy8gcmVxdWlyZWQgZm9yIEdvb2dsZSBUZXN0IGFuZCBhcmUgZGVmaW5lZCBpbiBndGVzdC1wb3J0LmguCi0vLwotLy8gTm90ZSB0byBtYWludGFpbmVyczogdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24sIHByZWZlciBhZGRpbmcKLS8vIHBvcnRhYmlsaXR5IHV0aWxpdGllcyB0byBHb29nbGUgVGVzdCdzIGd0ZXN0LXBvcnQuaCBpbnN0ZWFkIG9mCi0vLyBoZXJlLCBhcyBHb29nbGUgTW9jayBkZXBlbmRzIG9uIEdvb2dsZSBUZXN0LiAgT25seSBhZGQgYSB1dGlsaXR5Ci0vLyBoZXJlIGlmIGl0J3MgdHJ1bHkgc3BlY2lmaWMgdG8gR29vZ2xlIE1vY2suCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stcG9ydC5oIgotCi0vLyBUbyBhdm9pZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBldmVyeXdoZXJlLCB3ZSBtYWtlIGl0Ci0vLyBnbW9jay1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZwotLy8gdHIxL3R1cGxlLiAgZ21vY2stcG9ydC5oIGRvZXMgdGhpcyB2aWEgZ3Rlc3QtcG9ydC5oLCB3aGljaCBpcwotLy8gZ3VhcmFudGVlZCB0byBwdWxsIGluIHRoZSB0dXBsZSBoZWFkZXIuCi0KLS8vIEZvciBNUyBWaXN1YWwgQysrLCBjaGVjayB0aGUgY29tcGlsZXIgdmVyc2lvbi4gQXQgbGVhc3QgVlMgMjAwMyBpcwotLy8gcmVxdWlyZWQgdG8gY29tcGlsZSBHb29nbGUgTW9jay4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDEzMTAKLSMgZXJyb3IgIkF0IGxlYXN0IFZpc3VhbCBDKysgMjAwMyAoNy4xKSBpcyByZXF1aXJlZCB0byBjb21waWxlIEdvb2dsZSBNb2NrLiIKLSNlbmRpZgotCi0vLyBNYWNybyBmb3IgcmVmZXJlbmNpbmcgZmxhZ3MuICBUaGlzIGlzIHB1YmxpYyBhcyB3ZSB3YW50IHRoZSB1c2VyIHRvCi0vLyB1c2UgdGhpcyBzeW50YXggdG8gcmVmZXJlbmNlIEdvb2dsZSBNb2NrIGZsYWdzLgotI2RlZmluZSBHTU9DS19GTEFHKG5hbWUpIEZMQUdTX2dtb2NrXyMjbmFtZQotCi0jaWYgIWRlZmluZWQoR01PQ0tfREVDTEFSRV9ib29sXykKLQotLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfYm9vbF8obmFtZSkgZXh0ZXJuIEdURVNUX0FQSV8gYm9vbCBHTU9DS19GTEFHKG5hbWUpCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKLSAgICBleHRlcm4gR1RFU1RfQVBJXyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHTU9DS19GTEFHKG5hbWUpCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCi0gICAgZXh0ZXJuIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHTU9DS19GTEFHKG5hbWUpCi0KLS8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCi0jZGVmaW5lIEdNT0NLX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCi0gICAgR1RFU1RfQVBJXyBib29sIEdNT0NLX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCi0jZGVmaW5lIEdNT0NLX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR01PQ0tfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKLSNkZWZpbmUgR01PQ0tfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHTU9DS19GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQotCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdNT0NLX0RFQ0xBUkVfYm9vbF8pCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19QT1JUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL21ha2UvTWFrZWZpbGUgYi90ZXN0aW5nL2dtb2NrL21ha2UvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2MwZTkuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9tYWtlL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLSMgQSBzYW1wbGUgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGJvdGggR29vZ2xlIE1vY2sgYW5kIEdvb2dsZSBUZXN0IGFuZAotIyB1c2luZyB0aGVtIGluIHVzZXIgdGVzdHMuICBUaGlzIGZpbGUgaXMgc2VsZi1jb250YWluZWQsIHNvIHlvdSBkb24ndAotIyBuZWVkIHRvIHVzZSB0aGUgTWFrZWZpbGUgaW4gR29vZ2xlIFRlc3QncyBzb3VyY2UgdHJlZS4gIFBsZWFzZSB0d2VhawotIyBpdCB0byBzdWl0IHlvdXIgZW52aXJvbm1lbnQgYW5kIHByb2plY3QuICBZb3UgbWF5IHdhbnQgdG8gbW92ZSBpdCB0bwotIyB5b3VyIHByb2plY3QncyByb290IGRpcmVjdG9yeS4KLSMKLSMgU1lOT1BTSVM6Ci0jCi0jICAgbWFrZSBbYWxsXSAgLSBtYWtlcyBldmVyeXRoaW5nLgotIyAgIG1ha2UgVEFSR0VUIC0gbWFrZXMgdGhlIGdpdmVuIHRhcmdldC4KLSMgICBtYWtlIGNsZWFuICAtIHJlbW92ZXMgYWxsIGZpbGVzIGdlbmVyYXRlZCBieSBtYWtlLgotCi0jIFBsZWFzZSB0d2VhayB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGRlZmluaXRpb25zIGFzIG5lZWRlZCBieSB5b3VyCi0jIHByb2plY3QsIGV4Y2VwdCBHTU9DS19IRUFERVJTIGFuZCBHVEVTVF9IRUFERVJTLCB3aGljaCB5b3UgY2FuIHVzZQotIyBpbiB5b3VyIG93biB0YXJnZXRzIGJ1dCBzaG91bGRuJ3QgbW9kaWZ5LgotCi0jIFBvaW50cyB0byB0aGUgcm9vdCBvZiBHb29nbGUgVGVzdCwgcmVsYXRpdmUgdG8gd2hlcmUgdGhpcyBmaWxlIGlzLgotIyBSZW1lbWJlciB0byB0d2VhayB0aGlzIGlmIHlvdSBtb3ZlIHRoaXMgZmlsZSwgb3IgaWYgeW91IHdhbnQgdG8gdXNlCi0jIGEgY29weSBvZiBHb29nbGUgVGVzdCBhdCBhIGRpZmZlcmVudCBsb2NhdGlvbi4KLUdURVNUX0RJUiA9IC4uL2d0ZXN0Ci0KLSMgUG9pbnRzIHRvIHRoZSByb290IG9mIEdvb2dsZSBNb2NrLCByZWxhdGl2ZSB0byB3aGVyZSB0aGlzIGZpbGUgaXMuCi0jIFJlbWVtYmVyIHRvIHR3ZWFrIHRoaXMgaWYgeW91IG1vdmUgdGhpcyBmaWxlLgotR01PQ0tfRElSID0gLi4KLQotIyBXaGVyZSB0byBmaW5kIHVzZXIgY29kZS4KLVVTRVJfRElSID0gLi4vdGVzdAotCi0jIEZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yLgotIyBTZXQgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrJ3MgaGVhZGVyIGRpcmVjdG9yaWVzIGFzIHN5c3RlbQotIyBkaXJlY3Rvcmllcywgc3VjaCB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGdlbmVyYXRlIHdhcm5pbmdzIGluCi0jIHRoZXNlIGhlYWRlcnMuCi1DUFBGTEFHUyArPSAtaXN5c3RlbSAkKEdURVNUX0RJUikvaW5jbHVkZSAtaXN5c3RlbSAkKEdNT0NLX0RJUikvaW5jbHVkZQotCi0jIEZsYWdzIHBhc3NlZCB0byB0aGUgQysrIGNvbXBpbGVyLgotQ1hYRkxBR1MgKz0gLWcgLVdhbGwgLVdleHRyYSAtcHRocmVhZAotCi0jIEFsbCB0ZXN0cyBwcm9kdWNlZCBieSB0aGlzIE1ha2VmaWxlLiAgUmVtZW1iZXIgdG8gYWRkIG5ldyB0ZXN0cyB5b3UKLSMgY3JlYXRlZCB0byB0aGUgbGlzdC4KLVRFU1RTID0gZ21vY2tfdGVzdAotCi0jIEFsbCBHb29nbGUgVGVzdCBoZWFkZXJzLiAgVXN1YWxseSB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzCi0jIGRlZmluaXRpb24uCi1HVEVTVF9IRUFERVJTID0gJChHVEVTVF9ESVIpL2luY2x1ZGUvZ3Rlc3QvKi5oIFwKLSAgICAgICAgICAgICAgICAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC8qLmgKLQotIyBBbGwgR29vZ2xlIE1vY2sgaGVhZGVycy4gTm90ZSB0aGF0IGFsbCBHb29nbGUgVGVzdCBoZWFkZXJzIGFyZQotIyBpbmNsdWRlZCBoZXJlIHRvbywgYXMgdGhleSBhcmUgI2luY2x1ZGVkIGJ5IEdvb2dsZSBNb2NrIGhlYWRlcnMuCi0jIFVzdWFsbHkgeW91IHNob3VsZG4ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uLgkKLUdNT0NLX0hFQURFUlMgPSAkKEdNT0NLX0RJUikvaW5jbHVkZS9nbW9jay8qLmggXAotICAgICAgICAgICAgICAgICQoR01PQ0tfRElSKS9pbmNsdWRlL2dtb2NrL2ludGVybmFsLyouaCBcCi0gICAgICAgICAgICAgICAgJChHVEVTVF9IRUFERVJTKQotCi0jIEhvdXNlLWtlZXBpbmcgYnVpbGQgdGFyZ2V0cy4KLQotYWxsIDogJChURVNUUykKLQotY2xlYW4gOgotCXJtIC1mICQoVEVTVFMpIGdtb2NrLmEgZ21vY2tfbWFpbi5hICoubwotCi0jIEJ1aWxkcyBnbW9jay5hIGFuZCBnbW9ja19tYWluLmEuICBUaGVzZSBsaWJyYXJpZXMgY29udGFpbiBib3RoCi0jIEdvb2dsZSBNb2NrIGFuZCBHb29nbGUgVGVzdC4gIEEgdGVzdCBzaG91bGQgbGluayB3aXRoIGVpdGhlciBnbW9jay5hCi0jIG9yIGdtb2NrX21haW4uYSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgZGVmaW5lcyBpdHMgb3duIG1haW4oKQotIyBmdW5jdGlvbi4gIEl0J3MgZmluZSBpZiB5b3VyIHRlc3Qgb25seSB1c2VzIGZlYXR1cmVzIGZyb20gR29vZ2xlCi0jIFRlc3QgKGFuZCBub3QgR29vZ2xlIE1vY2spLgotCi0jIFVzdWFsbHkgeW91IHNob3VsZG4ndCB0d2VhayBzdWNoIGludGVybmFsIHZhcmlhYmxlcywgaW5kaWNhdGVkIGJ5IGEKLSMgdHJhaWxpbmcgXy4KLUdURVNUX1NSQ1NfID0gJChHVEVTVF9ESVIpL3NyYy8qLmNjICQoR1RFU1RfRElSKS9zcmMvKi5oICQoR1RFU1RfSEVBREVSUykKLUdNT0NLX1NSQ1NfID0gJChHTU9DS19ESVIpL3NyYy8qLmNjICQoR01PQ0tfSEVBREVSUykKLQotIyBGb3Igc2ltcGxpY2l0eSBhbmQgdG8gYXZvaWQgZGVwZW5kaW5nIG9uIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YKLSMgR29vZ2xlIE1vY2sgYW5kIEdvb2dsZSBUZXN0LCB0aGUgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBiZWxvdyBhcmUKLSMgY29uc2VydmF0aXZlIGFuZCBub3Qgb3B0aW1pemVkLiAgVGhpcyBpcyBmaW5lIGFzIEdvb2dsZSBNb2NrIGFuZAotIyBHb29nbGUgVGVzdCBjb21waWxlIGZhc3QgYW5kIGZvciBvcmRpbmFyeSB1c2VycyB0aGVpciBzb3VyY2UgcmFyZWx5Ci0jIGNoYW5nZXMuCi1ndGVzdC1hbGwubyA6ICQoR1RFU1RfU1JDU18pCi0JJChDWFgpICQoQ1BQRkxBR1MpIC1JJChHVEVTVF9ESVIpIC1JJChHTU9DS19ESVIpICQoQ1hYRkxBR1MpIFwKLSAgICAgICAgICAgIC1jICQoR1RFU1RfRElSKS9zcmMvZ3Rlc3QtYWxsLmNjCi0KLWdtb2NrLWFsbC5vIDogJChHTU9DS19TUkNTXykKLQkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgLUkkKEdNT0NLX0RJUikgJChDWFhGTEFHUykgXAotICAgICAgICAgICAgLWMgJChHTU9DS19ESVIpL3NyYy9nbW9jay1hbGwuY2MKLQotZ21vY2tfbWFpbi5vIDogJChHTU9DS19TUkNTXykKLQkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgLUkkKEdNT0NLX0RJUikgJChDWFhGTEFHUykgXAotICAgICAgICAgICAgLWMgJChHTU9DS19ESVIpL3NyYy9nbW9ja19tYWluLmNjCi0KLWdtb2NrLmEgOiBnbW9jay1hbGwubyBndGVzdC1hbGwubwotCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KLQotZ21vY2tfbWFpbi5hIDogZ21vY2stYWxsLm8gZ3Rlc3QtYWxsLm8gZ21vY2tfbWFpbi5vCi0JJChBUikgJChBUkZMQUdTKSAkQCAkXgotCi0jIEJ1aWxkcyBhIHNhbXBsZSB0ZXN0LgotCi1nbW9ja190ZXN0Lm8gOiAkKFVTRVJfRElSKS9nbW9ja190ZXN0LmNjICQoR01PQ0tfSEVBREVSUykKLQkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChVU0VSX0RJUikvZ21vY2tfdGVzdC5jYwotCi1nbW9ja190ZXN0IDogZ21vY2tfdGVzdC5vIGdtb2NrX21haW4uYQotCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtbHB0aHJlYWQgJF4gLW8gJEAKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrLnNsbiBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrLnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1MmY4Ny4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAwNS9nbW9jay5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi3vu78NCi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwDQotIyBWaXN1YWwgU3R1ZGlvIDIwMDUNCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImdtb2NrIiwgImdtb2NrLnZjcHJvaiIsICJ7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fSINCi1FbmRQcm9qZWN0DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbW9ja190ZXN0IiwgImdtb2NrX3Rlc3QudmNwcm9qIiwgIntGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9Ig0KLUVuZFByb2plY3QNCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImdtb2NrX21haW4iLCAiZ21vY2tfbWFpbi52Y3Byb2oiLCAie0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KLQkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCQl7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJe0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXtGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JCXtFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQotCQl7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXtFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KLQkJe0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrLnZjcHJvaiBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrLnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZmU5OC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAwNS9nbW9jay52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQotPFZpc3VhbFN0dWRpb1Byb2plY3QNCi0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQotCVZlcnNpb249IjguMDAiDQotCU5hbWU9Imdtb2NrIg0KLQlQcm9qZWN0R1VJRD0iezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0iDQotCVJvb3ROYW1lc3BhY2U9Imdtb2NrIg0KLQlLZXl3b3JkPSJXaW4zMlByb2oiDQotCT4NCi0JPFBsYXRmb3Jtcz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbjMyIg0KLQkJLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxUb29sRmlsZXM+DQotCTwvVG9vbEZpbGVzPg0KLQk8Q29uZmlndXJhdGlvbnM+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlxnbW9ja19jb25maWcudnNwcm9wcyINCi0JCQlDaGFyYWN0ZXJTZXQ9IjEiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlOy4uXC4uIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlxnbW9ja19jb25maWcudnNwcm9wcyINCi0JCQlDaGFyYWN0ZXJTZXQ9IjEiDQotCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGU7Li5cLi4iDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCTwvQ29uZmlndXJhdGlvbnM+DQotCTxSZWZlcmVuY2VzPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZ21vY2stYWxsLmNjIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iJChHVGVzdERpcilcc3JjXGd0ZXN0LWFsbC5jYyINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoR1Rlc3REaXIpIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoR1Rlc3REaXIpIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJQdWJsaWMgSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KLQkJCT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlByaXZhdGUgSGVhZGVyIEZpbGVzIg0KLQkJCT4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAwNS9nbW9ja19jb25maWcudnNwcm9wcyBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrX2NvbmZpZy52c3Byb3BzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjY1Y2ZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrX2NvbmZpZy52c3Byb3BzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQotPFZpc3VhbFN0dWRpb1Byb3BlcnR5U2hlZXQNCi0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQotCVZlcnNpb249IjguMDAiDQotCU5hbWU9Imdtb2NrX2NvbmZpZyINCi0JPg0KLQk8VG9vbA0KLQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoR1Rlc3REaXIpL2luY2x1ZGUmcXVvdDsiDQotCS8+DQotCTxVc2VyTWFjcm8NCi0JCU5hbWU9IkdUZXN0RGlyIg0KLQkJVmFsdWU9Ii4uLy4uL2d0ZXN0Ig0KLQkvPg0KLTwvVmlzdWFsU3R1ZGlvUHJvcGVydHlTaGVldD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAwNS9nbW9ja19tYWluLnZjcHJvaiBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrX21haW4udmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTUwNWE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrX21haW4udmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI4LjAwIg0KLQlOYW1lPSJnbW9ja19tYWluIg0KLQlQcm9qZWN0R1VJRD0ie0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0iDQotCVJvb3ROYW1lc3BhY2U9Imdtb2NrX21haW4iDQotCUtleXdvcmQ9IldpbjMyUHJvaiINCi0JPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiDQotCQkvPg0KLQk8L1BsYXRmb3Jtcz4NCi0JPFRvb2xGaWxlcz4NCi0JPC9Ub29sRmlsZXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpXCQoUHJvamVjdE5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXGdtb2NrX2NvbmZpZy52c3Byb3BzIg0KLQkJCUNoYXJhY3RlclNldD0iMSINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL2luY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0xJQiINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpXCQoUHJvamVjdE5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXGdtb2NrX2NvbmZpZy52c3Byb3BzIg0KLQkJCUNoYXJhY3RlclNldD0iMSINCi0JCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vaW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0iDQotCQkJUmVsYXRpdmVQYXRoVG9Qcm9qZWN0PSIuXGdtb2NrLnZjcHJvaiINCi0JCS8+DQotCTwvUmVmZXJlbmNlcz4NCi0JPEZpbGVzPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCi0JCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ig0KLQkJCT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xnbW9ja19tYWluLmNjIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vaW5jbHVkZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQotCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iDQotCQkJPg0KLQkJPC9GaWx0ZXI+DQotCTwvRmlsZXM+DQotCTxHbG9iYWxzPg0KLQk8L0dsb2JhbHM+DQotPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDA1L2dtb2NrX3Rlc3QudmNwcm9qIGIvdGVzdGluZy9nbW9jay9tc3ZjLzIwMDUvZ21vY2tfdGVzdC52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTAxZTcuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9tc3ZjLzIwMDUvZ21vY2tfdGVzdC52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQotPFZpc3VhbFN0dWRpb1Byb2plY3QNCi0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQotCVZlcnNpb249IjguMDAiDQotCU5hbWU9Imdtb2NrX3Rlc3QiDQotCVByb2plY3RHVUlEPSJ7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfSINCi0JUm9vdE5hbWVzcGFjZT0iZ21vY2tfdGVzdCINCi0JS2V5d29yZD0iV2luMzJQcm9qIg0KLQk+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiINCi0JCS8+DQotCTwvUGxhdGZvcm1zPg0KLQk8VG9vbEZpbGVzPg0KLQk8L1Rvb2xGaWxlcz4NCi0JPENvbmZpZ3VyYXRpb25zPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcilcJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cZ21vY2tfY29uZmlnLnZzcHJvcHMiDQotCQkJQ2hhcmFjdGVyU2V0PSIxIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvYmlnb2JqIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGU7Li5cLi4iDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KLQkJCQlTdWJTeXN0ZW09IjEiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpXCQoUHJvamVjdE5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXGdtb2NrX2NvbmZpZy52c3Byb3BzIg0KLQkJCUNoYXJhY3RlclNldD0iMSINCi0JCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9iaWdvYmoiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGU7Li5cLi4iDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KLQkJCQlTdWJTeXN0ZW09IjEiDQotCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCi0JCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCi0JCQkJVGFyZ2V0TWFjaGluZT0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0iDQotCQkJUmVsYXRpdmVQYXRoVG9Qcm9qZWN0PSIuXGdtb2NrX21haW4udmNwcm9qIg0KLQkJLz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cdGVzdFxnbW9ja19hbGxfdGVzdC5jYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSINCi0JCQk+DQotCQk8L0ZpbHRlcj4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9tc3ZjLzIwMTAvZ21vY2suc2xuIGIvdGVzdGluZy9nbW9jay9tc3ZjLzIwMTAvZ21vY2suc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ5NjU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrLnNsbgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLe+7vw0KLU1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwDQotIyBWaXN1YWwgQysrIEV4cHJlc3MgMjAxMA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ21vY2siLCAiZ21vY2sudmN4cHJvaiIsICJ7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fSINCi1FbmRQcm9qZWN0DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbW9ja190ZXN0IiwgImdtb2NrX3Rlc3QudmN4cHJvaiIsICJ7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfSINCi1FbmRQcm9qZWN0DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbW9ja19tYWluIiwgImdtb2NrX21haW4udmN4cHJvaiIsICJ7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fSINCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyDQotCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQotCQl7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JCXtGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQotCQl7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXtGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KLQkJe0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KLQkJe0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXtFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJe0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9tc3ZjLzIwMTAvZ21vY2sudmN4cHJvaiBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrLnZjeHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTg1ZWYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9tc3ZjLzIwMTAvZ21vY2sudmN4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQotICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KLSAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCi0gICAgPFByb2plY3RHdWlkPnszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9PC9Qcm9qZWN0R3VpZD4NCi0gICAgPFJvb3ROYW1lc3BhY2U+Z21vY2s8L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQotICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQotICA8L0ltcG9ydEdyb3VwPg0KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCi0gICAgPEltcG9ydCBQcm9qZWN0PSJnbW9ja19jb25maWcucHJvcHMiIC8+DQotICA8L0ltcG9ydEdyb3VwPg0KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQotICAgIDxJbXBvcnQgUHJvamVjdD0iZ21vY2tfY29uZmlnLnByb3BzIiAvPg0KLSAgPC9JbXBvcnRHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KLSAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKE91dERpcikkKFByb2plY3ROYW1lKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQotICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChPdXREaXIpJChQcm9qZWN0TmFtZSlcPC9JbnREaXI+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li5cLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCi0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQotICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCi0gICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgPC9DbENvbXBpbGU+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCi0gICAgPENsQ29tcGlsZT4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KLSAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxzcmNcZ21vY2stYWxsLmNjIiAvPg0KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoR1Rlc3REaXIpXHNyY1xndGVzdC1hbGwuY2MiPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKEdUZXN0RGlyKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoR1Rlc3REaXIpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCi0gIDwvSW1wb3J0R3JvdXA+DQotPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrX2NvbmZpZy5wcm9wcyBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrX2NvbmZpZy5wcm9wcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0OTdmMS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAxMC9nbW9ja19jb25maWcucHJvcHMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiPg0KLSAgICA8R1Rlc3REaXI+Li4vLi4vZ3Rlc3Q8L0dUZXN0RGlyPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoR1Rlc3REaXIpL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgPC9DbENvbXBpbGU+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJHVGVzdERpciI+DQotICAgICAgPFZhbHVlPiQoR1Rlc3REaXIpPC9WYWx1ZT4NCi0gICAgPC9CdWlsZE1hY3JvPg0KLSAgPC9JdGVtR3JvdXA+DQotPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrX21haW4udmN4cHJvaiBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrX21haW4udmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmZWNkNS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAxMC9nbW9ja19tYWluLnZjeHByb2oKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCi0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQotICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCi0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQotICAgIDxQcm9qZWN0R3VpZD57RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fTwvUHJvamVjdEd1aWQ+DQotICAgIDxSb290TmFtZXNwYWNlPmdtb2NrX21haW48L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQotICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCi0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQotICA8L0ltcG9ydEdyb3VwPg0KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCi0gICAgPEltcG9ydCBQcm9qZWN0PSJnbW9ja19jb25maWcucHJvcHMiIC8+DQotICA8L0ltcG9ydEdyb3VwPg0KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQotICAgIDxJbXBvcnQgUHJvamVjdD0iZ21vY2tfY29uZmlnLnByb3BzIiAvPg0KLSAgPC9JbXBvcnRHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KLSAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKE91dERpcikkKFByb2plY3ROYW1lKVw8L0ludERpcj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQotICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChPdXREaXIpJChQcm9qZWN0TmFtZSlcPC9JbnREaXI+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQotICAgIDxDbENvbXBpbGU+DQotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLy4uL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCi0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQotICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCi0gICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgPC9DbENvbXBpbGU+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCi0gICAgPENsQ29tcGlsZT4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi8uLi9pbmNsdWRlOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KLSAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQotICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iZ21vY2sudmN4cHJvaiI+DQotICAgICAgPFByb2plY3Q+ezM0NjgxZjBkLWNlNDUtNDE1ZC1iNWYyLTVjNjYyZGZlM2JkNX08L1Byb2plY3Q+DQotICAgICAgPENvcHlMb2NhbFNhdGVsbGl0ZUFzc2VtYmxpZXM+dHJ1ZTwvQ29weUxvY2FsU2F0ZWxsaXRlQXNzZW1ibGllcz4NCi0gICAgICA8UmVmZXJlbmNlT3V0cHV0QXNzZW1ibHk+dHJ1ZTwvUmVmZXJlbmNlT3V0cHV0QXNzZW1ibHk+DQotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxzcmNcZ21vY2tfbWFpbi5jYyI+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPi4uLy4uL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4uLi8uLi9pbmNsdWRlOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgIDwvQ2xDb21waWxlPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCi0gIDwvSW1wb3J0R3JvdXA+DQotPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrX3Rlc3QudmN4cHJvaiBiL3Rlc3RpbmcvZ21vY2svbXN2Yy8yMDEwL2dtb2NrX3Rlc3QudmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1NDM5ZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL21zdmMvMjAxMC9nbW9ja190ZXN0LnZjeHByb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCi0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KLSAgICA8UHJvamVjdEd1aWQ+e0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn08L1Byb2plY3RHdWlkPg0KLSAgICA8Um9vdE5hbWVzcGFjZT5nbW9ja190ZXN0PC9Sb290TmFtZXNwYWNlPg0KLSAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCi0gICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQotICA8L0ltcG9ydEdyb3VwPg0KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCi0gICAgPEltcG9ydCBQcm9qZWN0PSJnbW9ja19jb25maWcucHJvcHMiIC8+DQotICA8L0ltcG9ydEdyb3VwPg0KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQotICAgIDxJbXBvcnQgUHJvamVjdD0iZ21vY2tfY29uZmlnLnByb3BzIiAvPg0KLSAgPC9JbXBvcnRHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCi0gICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KLSAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKE91dERpcikkKFByb2plY3ROYW1lKVw8L0ludERpcj4NCi0gICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KLSAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCi0gICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKE91dERpcikkKFByb2plY3ROYW1lKVw8L0ludERpcj4NCi0gICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vYmlnb2JqICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCi0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCi0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4NCi0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCi0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQotICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCi0gICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgPC9DbENvbXBpbGU+DQotICAgIDxMaW5rPg0KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KLSAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQotICAgIDwvTGluaz4NCi0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCi0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KLSAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vYmlnb2JqICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCi0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCi0gICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KLSAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICA8L0NsQ29tcGlsZT4NCi0gICAgPExpbms+DQotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCi0gICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KLSAgICA8L0xpbms+DQotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSJnbW9ja19tYWluLnZjeHByb2oiPg0KLSAgICAgIDxQcm9qZWN0PntlNGVmNjE0Yi0zMGRmLTQ5NTQtOGM1My01ODBhMGJmNmI1ODl9PC9Qcm9qZWN0Pg0KLSAgICAgIDxDb3B5TG9jYWxTYXRlbGxpdGVBc3NlbWJsaWVzPnRydWU8L0NvcHlMb2NhbFNhdGVsbGl0ZUFzc2VtYmxpZXM+DQotICAgICAgPFJlZmVyZW5jZU91dHB1dEFzc2VtYmx5PnRydWU8L1JlZmVyZW5jZU91dHB1dEFzc2VtYmx5Pg0KLSAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdGVzdFxnbW9ja19hbGxfdGVzdC5jYyIgLz4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCi0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQotICA8L0ltcG9ydEdyb3VwPg0KLTwvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZnVzZV9nbW9ja19maWxlcy5weSBiL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9mdXNlX2dtb2NrX2ZpbGVzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzBiYWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9mdXNlX2dtb2NrX2ZpbGVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiImZ1c2VfZ21vY2tfZmlsZXMucHkgdjAuMS4wCi1GdXNlcyBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3Qgc291cmNlIGNvZGUgaW50byB0d28gLmggZmlsZXMgYW5kIGEgLmNjIGZpbGUuCi0KLVNZTk9QU0lTCi0gICAgICAgZnVzZV9nbW9ja19maWxlcy5weSBbR01PQ0tfUk9PVF9ESVJdIE9VVFBVVF9ESVIKLQotICAgICAgIFNjYW5zIEdNT0NLX1JPT1RfRElSIGZvciBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3Qgc291cmNlCi0gICAgICAgY29kZSwgYXNzdW1pbmcgR29vZ2xlIFRlc3QgaXMgaW4gdGhlIEdNT0NLX1JPT1RfRElSL2d0ZXN0Ci0gICAgICAgc3ViLWRpcmVjdG9yeSwgYW5kIGdlbmVyYXRlcyB0aHJlZSBmaWxlczoKLSAgICAgICBPVVRQVVRfRElSL2d0ZXN0L2d0ZXN0LmgsIE9VVFBVVF9ESVIvZ21vY2svZ21vY2suaCwgYW5kCi0gICAgICAgT1VUUFVUX0RJUi9nbW9jay1ndGVzdC1hbGwuY2MuICBUaGVuIHlvdSBjYW4gYnVpbGQgeW91ciB0ZXN0cwotICAgICAgIGJ5IGFkZGluZyBPVVRQVVRfRElSIHRvIHRoZSBpbmNsdWRlIHNlYXJjaCBwYXRoIGFuZCBsaW5raW5nCi0gICAgICAgd2l0aCBPVVRQVVRfRElSL2dtb2NrLWd0ZXN0LWFsbC5jYy4gIFRoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4KLSAgICAgICBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHVzZSBHb29nbGUgTW9jay4gIEhlbmNlIHlvdSBjYW4KLSAgICAgICAiaW5zdGFsbCIgR29vZ2xlIE1vY2sgYnkgY29weWluZyB0aGVtIHRvIHdoZXJldmVyIHlvdSB3YW50LgotCi0gICAgICAgR01PQ0tfUk9PVF9ESVIgY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIHRoZSBwYXJlbnQKLSAgICAgICBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoaXMgc2NyaXB0LgotCi1FWEFNUExFUwotICAgICAgIC4vZnVzZV9nbW9ja19maWxlcy5weSBmdXNlZF9nbW9jawotICAgICAgIC4vZnVzZV9nbW9ja19maWxlcy5weSBwYXRoL3RvL3VucGFja2VkL2dtb2NrIGZ1c2VkX2dtb2NrCi0KLVRoaXMgdG9vbCBpcyBleHBlcmltZW50YWwuICBJbiBwYXJ0aWN1bGFyLCBpdCBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgbm8KLWNvbmRpdGlvbmFsIGluY2x1c2lvbiBvZiBHb29nbGUgTW9jayBvciBHb29nbGUgVGVzdCBoZWFkZXJzLiAgUGxlYXNlCi1yZXBvcnQgYW55IHByb2JsZW1zIHRvIGdvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbS4gIFlvdSBjYW4gcmVhZAotaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayBmb3IgbW9yZQotaW5mb3JtYXRpb24uCi0iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzZXRzCi1pbXBvcnQgc3lzCi0KLSMgV2UgYXNzdW1lIHRoYXQgdGhpcyBmaWxlIGlzIGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkgaW4gdGhlIEdvb2dsZQotIyBNb2NrIHJvb3QgZGlyZWN0b3J5LgotREVGQVVMVF9HTU9DS19ST09UX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nKQotCi0jIFdlIG5lZWQgdG8gY2FsbCBpbnRvIGd0ZXN0L3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weS4KLXN5cy5wYXRoLmFwcGVuZChvcy5wYXRoLmpvaW4oREVGQVVMVF9HTU9DS19ST09UX0RJUiwgJ2d0ZXN0L3NjcmlwdHMnKSkKLWltcG9ydCBmdXNlX2d0ZXN0X2ZpbGVzCi1ndGVzdCA9IGZ1c2VfZ3Rlc3RfZmlsZXMKLQotIyBSZWdleCBmb3IgbWF0Y2hpbmcgJyNpbmNsdWRlICJnbW9jay8uLi4iJy4KLUlOQ0xVREVfR01PQ0tfRklMRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXHMqI1xzKmluY2x1ZGVccyoiKGdtb2NrLy4rKSInKQotCi0jIFdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBzZWVkIGZpbGVzLgotR01PQ0tfSF9TRUVEID0gJ2luY2x1ZGUvZ21vY2svZ21vY2suaCcKLUdNT0NLX0FMTF9DQ19TRUVEID0gJ3NyYy9nbW9jay1hbGwuY2MnCi0KLSMgV2hlcmUgdG8gcHV0IHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi1HVEVTVF9IX09VVFBVVCA9ICdndGVzdC9ndGVzdC5oJwotR01PQ0tfSF9PVVRQVVQgPSAnZ21vY2svZ21vY2suaCcKLUdNT0NLX0dURVNUX0FMTF9DQ19PVVRQVVQgPSAnZ21vY2stZ3Rlc3QtYWxsLmNjJwotCi0KLWRlZiBHZXRHVGVzdFJvb3REaXIoZ21vY2tfcm9vdCk6Ci0gICIiIlJldHVybnMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIEdvb2dsZSBUZXN0LiIiIgotCi0gIHJldHVybiBvcy5wYXRoLmpvaW4oZ21vY2tfcm9vdCwgJ2d0ZXN0JykKLQotCi1kZWYgVmFsaWRhdGVHTW9ja1Jvb3REaXIoZ21vY2tfcm9vdCk6Ci0gICIiIk1ha2VzIHN1cmUgZ21vY2tfcm9vdCBwb2ludHMgdG8gYSB2YWxpZCBnbW9jayByb290IGRpcmVjdG9yeS4KLQotICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCi0gICIiIgotCi0gIGd0ZXN0LlZhbGlkYXRlR1Rlc3RSb290RGlyKEdldEdUZXN0Um9vdERpcihnbW9ja19yb290KSkKLSAgZ3Rlc3QuVmVyaWZ5RmlsZUV4aXN0cyhnbW9ja19yb290LCBHTU9DS19IX1NFRUQpCi0gIGd0ZXN0LlZlcmlmeUZpbGVFeGlzdHMoZ21vY2tfcm9vdCwgR01PQ0tfQUxMX0NDX1NFRUQpCi0KLQotZGVmIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpOgotICAiIiJNYWtlcyBzdXJlIG91dHB1dF9kaXIgcG9pbnRzIHRvIGEgdmFsaWQgb3V0cHV0IGRpcmVjdG9yeS4KLQotICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCi0gICIiIgotCi0gIGd0ZXN0LlZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgZ3Rlc3QuR1RFU1RfSF9PVVRQVVQpCi0gIGd0ZXN0LlZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgR01PQ0tfSF9PVVRQVVQpCi0gIGd0ZXN0LlZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgR01PQ0tfR1RFU1RfQUxMX0NDX09VVFBVVCkKLQotCi1kZWYgRnVzZUdNb2NrSChnbW9ja19yb290LCBvdXRwdXRfZGlyKToKLSAgIiIiU2NhbnMgZm9sZGVyIGdtb2NrX3Jvb3QgdG8gZ2VuZXJhdGUgZ21vY2svZ21vY2suaCBpbiBvdXRwdXRfZGlyLiIiIgotCi0gIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR01PQ0tfSF9PVVRQVVQpLCAndycpCi0gIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkgICMgSG9sZHMgYWxsIGdtb2NrIGhlYWRlcnMgd2UndmUgcHJvY2Vzc2VkLgotCi0gIGRlZiBQcm9jZXNzRmlsZShnbW9ja19oZWFkZXJfcGF0aCk6Ci0gICAgIiIiUHJvY2Vzc2VzIHRoZSBnaXZlbiBnbW9jayBoZWFkZXIgZmlsZS4iIiIKLQotICAgICMgV2UgZG9uJ3QgcHJvY2VzcyB0aGUgc2FtZSBoZWFkZXIgdHdpY2UuCi0gICAgaWYgZ21vY2tfaGVhZGVyX3BhdGggaW4gcHJvY2Vzc2VkX2ZpbGVzOgotICAgICAgcmV0dXJuCi0KLSAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGdtb2NrX2hlYWRlcl9wYXRoKQotCi0gICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGdtb2NrIGhlYWRlci4KLSAgICBmb3IgbGluZSBpbiBmaWxlKG9zLnBhdGguam9pbihnbW9ja19yb290LCBnbW9ja19oZWFkZXJfcGF0aCksICdyJyk6Ci0gICAgICBtID0gSU5DTFVERV9HTU9DS19GSUxFX1JFR0VYLm1hdGNoKGxpbmUpCi0gICAgICBpZiBtOgotICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJnbW9jay8uLi4iJyAtIGxldCdzIHByb2Nlc3MgaXQgcmVjdXJzaXZlbHkuCi0gICAgICAgIFByb2Nlc3NGaWxlKCdpbmNsdWRlLycgKyBtLmdyb3VwKDEpKQotICAgICAgZWxzZToKLSAgICAgICAgbSA9IGd0ZXN0LklOQ0xVREVfR1RFU1RfRklMRV9SRUdFWC5tYXRjaChsaW5lKQotICAgICAgICBpZiBtOgotICAgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0L2Zvby5oIicuICBXZSB0cmFuc2xhdGUgaXQgdG8KLSAgICAgICAgICAjICJndGVzdC9ndGVzdC5oIiwgcmVnYXJkbGVzcyBvZiB3aGF0IGZvbyBpcywgc2luY2UgYWxsCi0gICAgICAgICAgIyBndGVzdCBoZWFkZXJzIGFyZSBmdXNlZCBpbnRvIGd0ZXN0L2d0ZXN0LmguCi0KLSAgICAgICAgICAjIFRoZXJlIGlzIG5vIG5lZWQgdG8gI2luY2x1ZGUgZ3Rlc3QuaCB0d2ljZS4KLSAgICAgICAgICBpZiBub3QgZ3Rlc3QuR1RFU1RfSF9TRUVEIGluIHByb2Nlc3NlZF9maWxlczoKLSAgICAgICAgICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoZ3Rlc3QuR1RFU1RfSF9TRUVEKQotICAgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoJyNpbmNsdWRlICIlcyJcbicgJSAoZ3Rlc3QuR1RFU1RfSF9PVVRQVVQsKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAjIE90aGVyd2lzZSB3ZSBjb3B5IHRoZSBsaW5lIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUobGluZSkKLQotICBQcm9jZXNzRmlsZShHTU9DS19IX1NFRUQpCi0gIG91dHB1dF9maWxlLmNsb3NlKCkKLQotCi1kZWYgRnVzZUdNb2NrQWxsQ2NUb0ZpbGUoZ21vY2tfcm9vdCwgb3V0cHV0X2ZpbGUpOgotICAiIiJTY2FucyBmb2xkZXIgZ21vY2tfcm9vdCB0byBmdXNlIGdtb2NrLWFsbC5jYyBpbnRvIG91dHB1dF9maWxlLiIiIgotCi0gIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkKLQotICBkZWYgUHJvY2Vzc0ZpbGUoZ21vY2tfc291cmNlX2ZpbGUpOgotICAgICIiIlByb2Nlc3NlcyB0aGUgZ2l2ZW4gZ21vY2sgc291cmNlIGZpbGUuIiIiCi0KLSAgICAjIFdlIGRvbid0IHByb2Nlc3MgdGhlIHNhbWUgI2luY2x1ZGVkIGZpbGUgdHdpY2UuCi0gICAgaWYgZ21vY2tfc291cmNlX2ZpbGUgaW4gcHJvY2Vzc2VkX2ZpbGVzOgotICAgICAgcmV0dXJuCi0KLSAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGdtb2NrX3NvdXJjZV9maWxlKQotCi0gICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGdtb2NrIHNvdXJjZSBmaWxlLgotICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKGdtb2NrX3Jvb3QsIGdtb2NrX3NvdXJjZV9maWxlKSwgJ3InKToKLSAgICAgIG0gPSBJTkNMVURFX0dNT0NLX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKLSAgICAgIGlmIG06Ci0gICAgICAgICMgSXQncyAnI2luY2x1ZGUgImdtb2NrL2Zvby5oIicuICBXZSB0cmVhdCBpdCBhcyAnI2luY2x1ZGUKLSAgICAgICAgIyAiZ21vY2svZ21vY2suaCInLCBhcyBhbGwgb3RoZXIgZ21vY2sgaGVhZGVycyBhcmUgYmVpbmcgZnVzZWQKLSAgICAgICAgIyBpbnRvIGdtb2NrLmggYW5kIGNhbm5vdCBiZSAjaW5jbHVkZWQgZGlyZWN0bHkuCi0KLSAgICAgICAgIyBUaGVyZSBpcyBubyBuZWVkIHRvICNpbmNsdWRlICJnbW9jay9nbW9jay5oIiBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgaWYgbm90IEdNT0NLX0hfU0VFRCBpbiBwcm9jZXNzZWRfZmlsZXM6Ci0gICAgICAgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChHTU9DS19IX1NFRUQpCi0gICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoJyNpbmNsdWRlICIlcyJcbicgJSAoR01PQ0tfSF9PVVRQVVQsKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIG0gPSBndGVzdC5JTkNMVURFX0dURVNUX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKLSAgICAgICAgaWYgbToKLSAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJndGVzdC8uLi4iJy4KLSAgICAgICAgICAjIFRoZXJlIGlzIG5vIG5lZWQgdG8gI2luY2x1ZGUgZ3Rlc3QuaCBhcyBpdCBoYXMgYmVlbgotICAgICAgICAgICMgI2luY2x1ZGVkIGJ5IGd0ZXN0LWFsbC5jYy4KLSAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgbSA9IGd0ZXN0LklOQ0xVREVfU1JDX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKLSAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAic3JjL2ZvbyInIC0gbGV0J3MgcHJvY2VzcyBpdCByZWN1cnNpdmVseS4KLSAgICAgICAgICAgIFByb2Nlc3NGaWxlKG0uZ3JvdXAoMSkpCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgT3RoZXJ3aXNlIHdlIGNvcHkgdGhlIGxpbmUgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgICAgICAgIG91dHB1dF9maWxlLndyaXRlKGxpbmUpCi0KLSAgUHJvY2Vzc0ZpbGUoR01PQ0tfQUxMX0NDX1NFRUQpCi0KLQotZGVmIEZ1c2VHTW9ja0dUZXN0QWxsQ2MoZ21vY2tfcm9vdCwgb3V0cHV0X2Rpcik6Ci0gICIiIlNjYW5zIGZvbGRlciBnbW9ja19yb290IHRvIGdlbmVyYXRlIGdtb2NrLWd0ZXN0LWFsbC5jYyBpbiBvdXRwdXRfZGlyLiIiIgotCi0gIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR01PQ0tfR1RFU1RfQUxMX0NDX09VVFBVVCksICd3JykKLSAgIyBGaXJzdCwgZnVzZSBndGVzdC1hbGwuY2MgaW50byBnbW9jay1ndGVzdC1hbGwuY2MuCi0gIGd0ZXN0LkZ1c2VHVGVzdEFsbENjVG9GaWxlKEdldEdUZXN0Um9vdERpcihnbW9ja19yb290KSwgb3V0cHV0X2ZpbGUpCi0gICMgTmV4dCwgYXBwZW5kIGZ1c2VkIGdtb2NrLWFsbC5jYyB0byBnbW9jay1ndGVzdC1hbGwuY2MuCi0gIEZ1c2VHTW9ja0FsbENjVG9GaWxlKGdtb2NrX3Jvb3QsIG91dHB1dF9maWxlKQotICBvdXRwdXRfZmlsZS5jbG9zZSgpCi0KLQotZGVmIEZ1c2VHTW9jayhnbW9ja19yb290LCBvdXRwdXRfZGlyKToKLSAgIiIiRnVzZXMgZ3Rlc3QuaCwgZ21vY2suaCwgYW5kIGdtb2NrLWd0ZXN0LWFsbC5oLiIiIgotCi0gIFZhbGlkYXRlR01vY2tSb290RGlyKGdtb2NrX3Jvb3QpCi0gIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpCi0KLSAgZ3Rlc3QuRnVzZUdUZXN0SChHZXRHVGVzdFJvb3REaXIoZ21vY2tfcm9vdCksIG91dHB1dF9kaXIpCi0gIEZ1c2VHTW9ja0goZ21vY2tfcm9vdCwgb3V0cHV0X2RpcikKLSAgRnVzZUdNb2NrR1Rlc3RBbGxDYyhnbW9ja19yb290LCBvdXRwdXRfZGlyKQotCi0KLWRlZiBtYWluKCk6Ci0gIGFyZ2MgPSBsZW4oc3lzLmFyZ3YpCi0gIGlmIGFyZ2MgPT0gMjoKLSAgICAjIGZ1c2VfZ21vY2tfZmlsZXMucHkgT1VUUFVUX0RJUgotICAgIEZ1c2VHTW9jayhERUZBVUxUX0dNT0NLX1JPT1RfRElSLCBzeXMuYXJndlsxXSkKLSAgZWxpZiBhcmdjID09IDM6Ci0gICAgIyBmdXNlX2dtb2NrX2ZpbGVzLnB5IEdNT0NLX1JPT1RfRElSIE9VVFBVVF9ESVIKLSAgICBGdXNlR01vY2soc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQotICBlbHNlOgotICAgIHByaW50IF9fZG9jX18KLSAgICBzeXMuZXhpdCgxKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9zY3JpcHRzL2dlbmVyYXRvci9MSUNFTlNFIGIvdGVzdGluZy9nbW9jay9zY3JpcHRzL2dlbmVyYXRvci9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2VhMDYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbMjAwN10gTmVhbCBOb3J3aXR6Ci0gICBQb3J0aW9ucyBDb3B5cmlnaHQgWzIwMDddIEdvb2dsZSBJbmMuCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRSBiL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmY5NTk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotCi1UaGUgR29vZ2xlIE1vY2sgY2xhc3MgZ2VuZXJhdG9yIGlzIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgcGFydCBvZiBjcHBjbGVhbi4KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNwcGNsZWFuLCBzZWUgdGhlIFJFQURNRS5jcHBjbGVhbiBmaWxlIG9yCi12aXNpdCBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY3BwY2xlYW4vCi0KLWNwcGNsZWFuIHJlcXVpcmVzIFB5dGhvbiAyLjMuNSBvciBsYXRlci4gIElmIHlvdSBkb24ndCBoYXZlIFB5dGhvbiBpbnN0YWxsZWQKLW9uIHlvdXIgc3lzdGVtLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gaW5zdGFsbCBpdC4gIFlvdSBjYW4gZG93bmxvYWQgUHl0aG9uCi1mcm9tOiAgaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLwotCi1UbyB1c2UgdGhlIEdvb2dsZSBNb2NrIGNsYXNzIGdlbmVyYXRvciwgeW91IG5lZWQgdG8gY2FsbCBpdAotb24gdGhlIGNvbW1hbmQgbGluZSBwYXNzaW5nIHRoZSBoZWFkZXIgZmlsZSBhbmQgY2xhc3MgZm9yIHdoaWNoIHlvdSB3YW50Ci10byBnZW5lcmF0ZSBhIEdvb2dsZSBNb2NrIGNsYXNzLgotCi1NYWtlIHN1cmUgdG8gaW5zdGFsbCB0aGUgc2NyaXB0cyBzb21ld2hlcmUgaW4geW91ciBwYXRoLiAgVGhlbiB5b3UgY2FuCi1ydW4gdGhlIHByb2dyYW0uCi0KLSAgZ21vY2tfZ2VuLnB5IGhlYWRlci1maWxlLmggW0NsYXNzTmFtZV0uLi4KLQotSWYgbm8gQ2xhc3NOYW1lcyBhcmUgc3BlY2lmaWVkLCBhbGwgY2xhc3NlcyBpbiB0aGUgZmlsZSBhcmUgZW1pdHRlZC4KLQotVG8gY2hhbmdlIHRoZSBpbmRlbnRhdGlvbiBmcm9tIHRoZSBkZWZhdWx0IG9mIDIsIHNldCBJTkRFTlQgaW4KLXRoZSBlbnZpcm9ubWVudC4gIEZvciBleGFtcGxlIHRvIHVzZSBhbiBpbmRlbnQgb2YgNCBzcGFjZXM6Ci0KLUlOREVOVD00IGdtb2NrX2dlbi5weSBoZWFkZXItZmlsZS5oIENsYXNzTmFtZQotCi1UaGlzIHZlcnNpb24gd2FzIG1hZGUgZnJvbSBTVk4gcmV2aXNpb24gMjgxIGluIHRoZSBjcHBjbGVhbiByZXBvc2l0b3J5LgotCi1Lbm93biBMaW1pdGF0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0KLU5vdCBhbGwgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCBwcm9wZXJseS4gIEZvciBleGFtcGxlLCB3aGVuIG1vY2tpbmcgdGVtcGxhdGVkCi1jbGFzc2VzLCB0aGUgdGVtcGxhdGUgaW5mb3JtYXRpb24gaXMgbG9zdC4gIFlvdSB3aWxsIG5lZWQgdG8gYWRkIHRoZSB0ZW1wbGF0ZQotaW5mb3JtYXRpb24gbWFudWFsbHkuCi0KLU5vdCBhbGwgcGVybXV0YXRpb25zIG9mIHVzaW5nIG11bHRpcGxlIHBvaW50ZXJzL3JlZmVyZW5jZXMgd2lsbCBiZSByZW5kZXJlZAotcHJvcGVybHkuICBUaGVzZSB3aWxsIGFsc28gaGF2ZSB0byBiZSBmaXhlZCBtYW51YWxseS4KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvUkVBRE1FLmNwcGNsZWFuIGIvdGVzdGluZy9nbW9jay9zY3JpcHRzL2dlbmVyYXRvci9SRUFETUUuY3BwY2xlYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDMxYjYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9zY3JpcHRzL2dlbmVyYXRvci9SRUFETUUuY3BwY2xlYW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotR29hbDoKLS0tLS0tCi0gIENwcENsZWFuIGF0dGVtcHRzIHRvIGZpbmQgcHJvYmxlbXMgaW4gQysrIHNvdXJjZSB0aGF0IHNsb3cgZGV2ZWxvcG1lbnQKLSAgaW4gbGFyZ2UgY29kZSBiYXNlcywgZm9yIGV4YW1wbGUgdmFyaW91cyBmb3JtcyBvZiB1bnVzZWQgY29kZS4KLSAgVW51c2VkIGNvZGUgY2FuIGJlIHVudXNlZCBmdW5jdGlvbnMsIG1ldGhvZHMsIGRhdGEgbWVtYmVycywgdHlwZXMsIGV0YwotICB0byB1bm5lY2Vzc2FyeSAjaW5jbHVkZSBkaXJlY3RpdmVzLiAgVW5uZWNlc3NhcnkgI2luY2x1ZGVzIGNhbiBjYXVzZQotICBjb25zaWRlcmFibGUgZXh0cmEgY29tcGlsZXMgaW5jcmVhc2luZyB0aGUgZWRpdC1jb21waWxlLXJ1biBjeWNsZS4KLQotICBUaGUgcHJvamVjdCBob21lIHBhZ2UgaXM6ICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLwotCi0KLUZlYXR1cmVzOgotLS0tLS0tLS0tCi0gKiBGaW5kIGFuZCBwcmludCBDKysgbGFuZ3VhZ2UgY29uc3RydWN0czogY2xhc3NlcywgbWV0aG9kcywgZnVuY3Rpb25zLCBldGMuCi0gKiBGaW5kIGNsYXNzZXMgd2l0aCB2aXJ0dWFsIG1ldGhvZHMsIG5vIHZpcnR1YWwgZGVzdHJ1Y3RvciwgYW5kIG5vIGJhc2VzCi0gKiBGaW5kIGdsb2JhbC9zdGF0aWMgZGF0YSB0aGF0IGFyZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2hlbiB1c2luZyB0aHJlYWRzCi0gKiBVbm5lY2Vzc2FyeSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucwotICogVW5uZWNlc3NhcnkgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0gKiBVbmRlY2xhcmVkIGZ1bmN0aW9uIGRlZmluaXRpb25zCi0gKiAocGxhbm5lZCkgRmluZCB1bm5lY2Vzc2FyeSBoZWFkZXIgZmlsZXMgI2luY2x1ZGVkCi0gICAtIE5vIGRpcmVjdCByZWZlcmVuY2UgdG8gYW55dGhpbmcgaW4gdGhlIGhlYWRlcgotICAgLSBIZWFkZXIgaXMgdW5uZWNlc3NhcnkgaWYgY2xhc3NlcyB3ZXJlIGZvcndhcmQgZGVjbGFyZWQgaW5zdGVhZAotICogKHBsYW5uZWQpIFNvdXJjZSBmaWxlcyB0aGF0IHJlZmVyZW5jZSBoZWFkZXJzIG5vdCBkaXJlY3RseSAjaW5jbHVkZWQsCi0gICBpZSwgZmlsZXMgdGhhdCByZWx5IG9uIGEgdHJhbnNpdGl2ZSAjaW5jbHVkZSBmcm9tIGFub3RoZXIgaGVhZGVyCi0gKiAocGxhbm5lZCkgVW51c2VkIG1lbWJlcnMgKHByaXZhdGUsIHByb3RlY3RlZCwgJiBwdWJsaWMpIG1ldGhvZHMgYW5kIGRhdGEKLSAqIChwbGFubmVkKSBTdG9yZSBBU1QgaW4gYSBTUUwgZGF0YWJhc2Ugc28gcmVsYXRpb25zaGlwcyBjYW4gYmUgcXVlcmllZAotCi1BU1QgaXMgQWJzdHJhY3QgU3ludGF4IFRyZWUsIGEgcmVwcmVzZW50YXRpb24gb2YgcGFyc2VkIHNvdXJjZSBjb2RlLgotaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BYnN0cmFjdF9zeW50YXhfdHJlZQotCi0KLVN5c3RlbSBSZXF1aXJlbWVudHM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHl0aG9uIDIuNCBvciBsYXRlciAoMi4zIHByb2JhYmx5IHdvcmtzIHRvbykKLSAqIFdvcmtzIG9uIFdpbmRvd3MgKHVudGVzdGVkKSwgTWFjIE9TIFgsIGFuZCBVbml4Ci0KLQotSG93IHRvIFJ1bjoKLS0tLS0tLS0tLS0tCi0gIEZvciBhbGwgZXhhbXBsZXMsIGl0IGlzIGFzc3VtZWQgdGhhdCBjcHBjbGVhbiByZXNpZGVzIGluIGEgZGlyZWN0b3J5IGNhbGxlZAotICAvY3BwY2xlYW4uCi0KLSAgVG8gcHJpbnQgd2FybmluZ3MgZm9yIGNsYXNzZXMgd2l0aCB2aXJ0dWFsIG1ldGhvZHMsIG5vIHZpcnR1YWwgZGVzdHJ1Y3RvciBhbmQKLSAgbm8gYmFzZSBjbGFzc2VzOgotCi0gICAgICAvY3BwY2xlYW4vcnVuLnNoIG5vbnZpcnR1YWxfZHRvcnMucHkgZmlsZTEuaCBmaWxlMi5oIGZpbGUzLmNjIC4uLgotCi0gIFRvIHByaW50IGFsbCB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUocyk6Ci0KLSAgICAgIC9jcHBjbGVhbi9ydW4uc2ggZnVuY3Rpb25zLnB5IGZpbGUxLmggZmlsZTIuaCAuLi4KLQotICBBbGwgdGhlIGNvbW1hbmRzIHRha2UgbXVsdGlwbGUgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIE90aGVyIHByb2dyYW1zCi0gIGluY2x1ZGU6IGZpbmRfd2FybmluZ3MsIGhlYWRlcnMsIG1ldGhvZHMsIGFuZCB0eXBlcy4gIFNvbWUgb3RoZXIgcHJvZ3JhbXMKLSAgYXJlIGF2YWlsYWJsZSwgYnV0IHVzZWQgcHJpbWFyaWx5IGZvciBkZWJ1Z2dpbmcuCi0KLSAgcnVuLnNoIGlzIGEgc2ltcGxlIHdyYXBwZXIgdGhhdCBzZXRzIFBZVEhPTlBBVEggdG8gL2NwcGNsZWFuIGFuZCB0aGVuCi0gIHJ1bnMgdGhlIHByb2dyYW0gaW4gL2NwcGNsZWFuL2NwcC9QUk9HUkFNLnB5LiAgVGhlcmUgaXMgY3VycmVudGx5Ci0gIG5vIGVxdWl2YWxlbnQgZm9yIFdpbmRvd3MuICBDb250cmlidXRpb25zIGZvciBhIHJ1bi5iYXQgZmlsZQotICB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLgotCi0KLUhvdyB0byBDb25maWd1cmU6Ci0tLS0tLS0tLS0tLS0tLS0tLQotICBZb3UgY2FuIGFkZCBhIHNpdGVoZWFkZXJzLnB5IGZpbGUgaW4gL2NwcGNsZWFuL2NwcCB0byBjb25maWd1cmUgd2hlcmUKLSAgdG8gbG9vayBmb3Igb3RoZXIgaGVhZGVycyAodHlwaWNhbGx5IC1JIG9wdGlvbnMgcGFzc2VkIHRvIGEgY29tcGlsZXIpLgotICBDdXJyZW50bHkgdHdvIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAgX1RSQU5TSVRJVkUgYW5kIEdldEluY2x1ZGVEaXJzLgotICBfVFJBTlNJVElWRSBzaG91bGQgYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSAoVHJ1ZSBvciBGYWxzZSkgaW5kaWNhdGluZwotICB3aGV0aGVyIHRvIHRyYW5zaXRpdmVseSBwcm9jZXNzIGFsbCBoZWFkZXIgZmlsZXMuICBUaGUgZGVmYXVsdCBpcyBGYWxzZS4KLQotICBHZXRJbmNsdWRlRGlycyBpcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgYW5kIHJldHVybnMKLSAgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcmllcyB0byBpbmNsdWRlLiAgVGhpcyBjYW4gYmUgYSBnZW5lcmF0b3Igb3IKLSAgcmV0dXJuIGEgc3RhdGljIGxpc3QuCi0KLSAgICAgIGRlZiBHZXRJbmNsdWRlRGlycyhmaWxlbmFtZSk6Ci0gICAgICAgICAgcmV0dXJuIFsnL3NvbWUvcGF0aC93aXRoL290aGVyL2hlYWRlcnMnXQotCi0gICAgICAjIEhlcmUgaXMgYSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUuCi0gICAgICBkZWYgR2V0SW5jbHVkZURpcnMoZmlsZW5hbWUpOgotICAgICAgICAgIHlpZWxkICcvcGF0aDEnCi0gICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKCcvcGF0aDInLCBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpKQotICAgICAgICAgIHlpZWxkICcvcGF0aDMnCi0KLQotSG93IHRvIFRlc3Q6Ci0tLS0tLS0tLS0tLS0KLSAgRm9yIGFsbCBleGFtcGxlcywgaXQgaXMgYXNzdW1lZCB0aGF0IGNwcGNsZWFuIHJlc2lkZXMgaW4gYSBkaXJlY3RvcnkgY2FsbGVkCi0gIC9jcHBjbGVhbi4gIFRoZSB0ZXN0cyByZXF1aXJlCi0KLSAgY2QgL2NwcGNsZWFuCi0gIG1ha2UgdGVzdAotICAjIFRvIGdlbmVyYXRlIGV4cGVjdGVkIHJlc3VsdHMgYWZ0ZXIgYSBjaGFuZ2U6Ci0gIG1ha2UgZXhwZWN0ZWQKLQotCi1DdXJyZW50IFN0YXR1czoKLS0tLS0tLS0tLS0tLS0tLQotICBUaGUgcGFyc2VyIHdvcmtzIHByZXR0eSB3ZWxsIGZvciBoZWFkZXIgZmlsZXMsIHBhcnNpbmcgYWJvdXQgOTklIG9mIEdvb2dsZSdzCi0gIGhlYWRlciBmaWxlcy4gIEFueXRoaW5nIHdoaWNoIGluc3BlY3RzIHN0cnVjdHVyZSBvZiBDKysgc291cmNlIGZpbGVzIHNob3VsZAotICB3b3JrIHJlYXNvbmFibHkgd2VsbC4gIEZ1bmN0aW9uIGJvZGllcyBhcmUgbm90IHRyYW5zZm9ybWVkIHRvIGFuIEFTVCwKLSAgYnV0IGxlZnQgYXMgdG9rZW5zLiAgTXVjaCB3b3JrIGlzIHN0aWxsIG5lZWRlZCBvbiBmaW5kaW5nIHVudXNlZCBoZWFkZXIgZmlsZXMKLSAgYW5kIHN0b3JpbmcgYW4gQVNUIGluIGEgZGF0YWJhc2UuCi0KLQotTm9uLWdvYWxzOgotLS0tLS0tLS0tLQotICogUGFyc2luZyBhbGwgdmFsaWQgQysrIHNvdXJjZQotICogSGFuZGxpbmcgaW52YWxpZCBDKysgc291cmNlIGdyYWNlZnVsbHkKLSAqIENvbXBpbGluZyB0byBtYWNoaW5lIGNvZGUgKG9yIGFueXRoaW5nIGJleW9uZCBhbiBBU1QpCi0KLQotQ29udGFjdDoKLS0tLS0tLS0tCi0gIElmIHlvdSB1c2VkIGNwcGNsZWFuLCBJIHdvdWxkIGxvdmUgdG8gaGVhciBhYm91dCB5b3VyIGV4cGVyaWVuY2VzCi0gIGNwcGNsZWFuQGdvb2dsZWdyb3Vwcy5jb20uICBFdmVuIGlmIHlvdSBkb24ndCB1c2UgY3BwY2xlYW4sIEknZCBsaWtlIHRvCi0gIGhlYXIgZnJvbSB5b3UuICA6LSkgIChZb3UgY2FuIGNvbnRhY3QgbWUgZGlyZWN0bHkgYXQ6ICBubm9yd2l0ekBnbWFpbC5jb20pCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9hc3QucHkgYi90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9hc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExY2JlOTEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9zY3JpcHRzL2dlbmVyYXRvci9jcHAvYXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTczMyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDcgTmVhbCBOb3J3aXR6Ci0jIFBvcnRpb25zIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0iIiJHZW5lcmF0ZSBhbiBBYnN0cmFjdCBTeW50YXggVHJlZSAoQVNUKSBmb3IgQysrLiIiIgotCi1fX2F1dGhvcl9fID0gJ25ub3J3aXR6QGdvb2dsZS5jb20gKE5lYWwgTm9yd2l0eiknCi0KLQotIyBUT0RPOgotIyAgKiBUb2tlbnMgc2hvdWxkIG5ldmVyIGJlIGV4cG9ydGVkLCBuZWVkIHRvIGNvbnZlcnQgdG8gTm9kZXMKLSMgICAgKHJldHVybiB0eXBlcywgcGFyYW1ldGVycywgZXRjLikKLSMgICogSGFuZGxlIHN0YXRpYyBjbGFzcyBkYXRhIGZvciB0ZW1wbGF0aXplZCBjbGFzc2VzCi0jICAqIEhhbmRsZSBjYXN0cyAoYm90aCBDKysgYW5kIEMtc3R5bGUpCi0jICAqIEhhbmRsZSBjb25kaXRpb25zIGFuZCBsb29wcyAoaWYvZWxzZSwgc3dpdGNoLCBmb3IsIHdoaWxlL2RvKQotIwotIyBUT0RPIG11Y2gsIG11Y2ggbGF0ZXI6Ci0jICAqIEhhbmRsZSAjZGVmaW5lCi0jICAqIGV4Y2VwdGlvbnMKLQotCi10cnk6Ci0gICAgIyBQeXRob24gMy54Ci0gICAgaW1wb3J0IGJ1aWx0aW5zCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgIyBQeXRob24gMi54Ci0gICAgaW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCi0KLWltcG9ydCBzeXMKLWltcG9ydCB0cmFjZWJhY2sKLQotZnJvbSBjcHAgaW1wb3J0IGtleXdvcmRzCi1mcm9tIGNwcCBpbXBvcnQgdG9rZW5pemUKLWZyb20gY3BwIGltcG9ydCB1dGlscwotCi0KLWlmIG5vdCBoYXNhdHRyKGJ1aWx0aW5zLCAncmV2ZXJzZWQnKToKLSAgICAjIFN1cHBvcnQgUHl0aG9uIDIuMyBhbmQgZWFybGllci4KLSAgICBkZWYgcmV2ZXJzZWQoc2VxKToKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlcSktMSwgLTEsIC0xKToKLSAgICAgICAgICAgIHlpZWxkIHNlcVtpXQotCi1pZiBub3QgaGFzYXR0cihidWlsdGlucywgJ25leHQnKToKLSAgICAjIFN1cHBvcnQgUHl0aG9uIDIuNSBhbmQgZWFybGllci4KLSAgICBkZWYgbmV4dChvYmopOgotICAgICAgICByZXR1cm4gb2JqLm5leHQoKQotCi0KLVZJU0lCSUxJVFlfUFVCTElDLCBWSVNJQklMSVRZX1BST1RFQ1RFRCwgVklTSUJJTElUWV9QUklWQVRFID0gcmFuZ2UoMykKLQotRlVOQ1RJT05fTk9ORSA9IDB4MDAKLUZVTkNUSU9OX0NPTlNUID0gMHgwMQotRlVOQ1RJT05fVklSVFVBTCA9IDB4MDIKLUZVTkNUSU9OX1BVUkVfVklSVFVBTCA9IDB4MDQKLUZVTkNUSU9OX0NUT1IgPSAweDA4Ci1GVU5DVElPTl9EVE9SID0gMHgxMAotRlVOQ1RJT05fQVRUUklCVVRFID0gMHgyMAotRlVOQ1RJT05fVU5LTk9XTl9BTk5PVEFUSU9OID0gMHg0MAotRlVOQ1RJT05fVEhST1cgPSAweDgwCi1GVU5DVElPTl9PVkVSUklERSA9IDB4MTAwCi0KLSIiIgotVGhlc2UgYXJlIGN1cnJlbnRseSB1bnVzZWQuICBTaG91bGQgcmVhbGx5IGhhbmRsZSB0aGVzZSBwcm9wZXJseSBhdCBzb21lIHBvaW50LgotCi1UWVBFX01PRElGSUVSX0lOTElORSAgID0gMHgwMTAwMDAKLVRZUEVfTU9ESUZJRVJfRVhURVJOICAgPSAweDAyMDAwMAotVFlQRV9NT0RJRklFUl9TVEFUSUMgICA9IDB4MDQwMDAwCi1UWVBFX01PRElGSUVSX0NPTlNUICAgID0gMHgwODAwMDAKLVRZUEVfTU9ESUZJRVJfUkVHSVNURVIgPSAweDEwMDAwMAotVFlQRV9NT0RJRklFUl9WT0xBVElMRSA9IDB4MjAwMDAwCi1UWVBFX01PRElGSUVSX01VVEFCTEUgID0gMHg0MDAwMDAKLQotVFlQRV9NT0RJRklFUl9NQVAgPSB7Ci0gICAgJ2lubGluZSc6IFRZUEVfTU9ESUZJRVJfSU5MSU5FLAotICAgICdleHRlcm4nOiBUWVBFX01PRElGSUVSX0VYVEVSTiwKLSAgICAnc3RhdGljJzogVFlQRV9NT0RJRklFUl9TVEFUSUMsCi0gICAgJ2NvbnN0JzogVFlQRV9NT0RJRklFUl9DT05TVCwKLSAgICAncmVnaXN0ZXInOiBUWVBFX01PRElGSUVSX1JFR0lTVEVSLAotICAgICd2b2xhdGlsZSc6IFRZUEVfTU9ESUZJRVJfVk9MQVRJTEUsCi0gICAgJ211dGFibGUnOiBUWVBFX01PRElGSUVSX01VVEFCTEUsCi0gICAgfQotIiIiCi0KLV9JTlRFUk5BTF9UT0tFTiA9ICdpbnRlcm5hbCcKLV9OQU1FU1BBQ0VfUE9QID0gJ25zLXBvcCcKLQotCi0jIFRPRE8obm5vcndpdHopOiB1c2UgdGhpcyBhcyBhIHNpbmdsZXRvbiBmb3IgdGVtcGxhdGVkX3R5cGVzLCBldGMKLSMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgZW1wdHkgZGljdCBlYWNoIHRpbWUuICBJdCBpcyBhbHNvIGNvbnN0LgotY2xhc3MgX051bGxEaWN0KG9iamVjdCk6Ci0gICAgX19jb250YWluc19fID0gbGFtYmRhIHNlbGY6IEZhbHNlCi0gICAga2V5cyA9IHZhbHVlcyA9IGl0ZW1zID0gaXRlcmtleXMgPSBpdGVydmFsdWVzID0gaXRlcml0ZW1zID0gbGFtYmRhIHNlbGY6ICgpCi0KLQotIyBUT0RPKG5ub3J3aXR6KTogbW92ZSBBU1Qgbm9kZXMgaW50byBhIHNlcGFyYXRlIG1vZHVsZS4KLWNsYXNzIE5vZGUob2JqZWN0KToKLSAgICAiIiJCYXNlIEFTVCBub2RlLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQpOgotICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKLSAgICAgICAgc2VsZi5lbmQgPSBlbmQKLQotICAgIGRlZiBJc0RlY2xhcmF0aW9uKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm5zIGJvb2wgaWYgdGhpcyBub2RlIGlzIGEgZGVjbGFyYXRpb24uIiIiCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIElzRGVmaW5pdGlvbihzZWxmKToKLSAgICAgICAgIiIiUmV0dXJucyBib29sIGlmIHRoaXMgbm9kZSBpcyBhIGRlZmluaXRpb24uIiIiCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKLSAgICAgICAgIiIiUmV0dXJucyBib29sIGlmIHRoaXMgbm9kZSBleHBvcnRhYmxlIGZyb20gYSBoZWFkZXIgZmlsZS4iIiIKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgUmVxdWlyZXMoc2VsZiwgbm9kZSk6Ci0gICAgICAgICIiIkRvZXMgdGhpcyBBU1Qgbm9kZSByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBub2RlIHBhc3NlZCBpbj8iIiIKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgWFhYX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX1N0cmluZ0hlbHBlcihzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJycpCi0KLSAgICBkZWYgX1N0cmluZ0hlbHBlcihzZWxmLCBuYW1lLCBzdWZmaXgpOgotICAgICAgICBpZiBub3QgdXRpbHMuREVCVUc6Ci0gICAgICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAobmFtZSwgc3VmZml4KQotICAgICAgICByZXR1cm4gJyVzKCVkLCAlZCwgJXMpJyAlIChuYW1lLCBzZWxmLnN0YXJ0LCBzZWxmLmVuZCwgc3VmZml4KQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc3RyKHNlbGYpCi0KLQotY2xhc3MgRGVmaW5lKE5vZGUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBkZWZpbml0aW9uKToKLSAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgICAgIHNlbGYuZGVmaW5pdGlvbiA9IGRlZmluaXRpb24KLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICB2YWx1ZSA9ICclcyAlcycgJSAoc2VsZi5uYW1lLCBzZWxmLmRlZmluaXRpb24pCi0gICAgICAgIHJldHVybiBzZWxmLl9TdHJpbmdIZWxwZXIoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHZhbHVlKQotCi0KLWNsYXNzIEluY2x1ZGUoTm9kZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIGZpbGVuYW1lLCBzeXN0ZW0pOgotICAgICAgICBOb2RlLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQpCi0gICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQotICAgICAgICBzZWxmLnN5c3RlbSA9IHN5c3RlbQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIGZtdCA9ICciJXMiJwotICAgICAgICBpZiBzZWxmLnN5c3RlbToKLSAgICAgICAgICAgIGZtdCA9ICc8JXM+JwotICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBmbXQgJSBzZWxmLmZpbGVuYW1lKQotCi0KLWNsYXNzIEdvdG8oTm9kZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIGxhYmVsKToKLSAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQotICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5sYWJlbCkpCi0KLQotY2xhc3MgRXhwcihOb2RlKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgZXhwcik6Ci0gICAgICAgIE5vZGUuX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCkKLSAgICAgICAgc2VsZi5leHByID0gZXhwcgotCi0gICAgZGVmIFJlcXVpcmVzKHNlbGYsIG5vZGUpOgotICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpbXBsLgotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5leHByKSkKLQotCi1jbGFzcyBSZXR1cm4oRXhwcik6Ci0gICAgcGFzcwotCi0KLWNsYXNzIERlbGV0ZShFeHByKToKLSAgICBwYXNzCi0KLQotY2xhc3MgRnJpZW5kKEV4cHIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBleHByLCBuYW1lc3BhY2UpOgotICAgICAgICBFeHByLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIGV4cHIpCi0gICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlWzpdCi0KLQotY2xhc3MgVXNpbmcoTm9kZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWVzKToKLSAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQotICAgICAgICBzZWxmLm5hbWVzID0gbmFtZXMKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5uYW1lcykpCi0KLQotY2xhc3MgUGFyYW1ldGVyKE5vZGUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBwYXJhbWV0ZXJfdHlwZSwgZGVmYXVsdCk6Ci0gICAgICAgIE5vZGUuX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCkKLSAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICBzZWxmLnR5cGUgPSBwYXJhbWV0ZXJfdHlwZQotICAgICAgICBzZWxmLmRlZmF1bHQgPSBkZWZhdWx0Ci0KLSAgICBkZWYgUmVxdWlyZXMoc2VsZiwgbm9kZSk6Ci0gICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBuYW1lc3BhY2VzLCBldGMuCi0gICAgICAgIHJldHVybiBzZWxmLnR5cGUubmFtZSA9PSBub2RlLm5hbWUKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICBuYW1lID0gc3RyKHNlbGYudHlwZSkKLSAgICAgICAgc3VmZml4ID0gJyVzICVzJyAlIChuYW1lLCBzZWxmLm5hbWUpCi0gICAgICAgIGlmIHNlbGYuZGVmYXVsdDoKLSAgICAgICAgICAgIHN1ZmZpeCArPSAnID0gJyArICcnLmpvaW4oW2QubmFtZSBmb3IgZCBpbiBzZWxmLmRlZmF1bHRdKQotICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdWZmaXgpCi0KLQotY2xhc3MgX0dlbmVyaWNEZWNsYXJhdGlvbihOb2RlKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgbmFtZSwgbmFtZXNwYWNlKToKLSAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlWzpdCi0KLSAgICBkZWYgRnVsbE5hbWUoc2VsZik6Ci0gICAgICAgIHByZWZpeCA9ICcnCi0gICAgICAgIGlmIHNlbGYubmFtZXNwYWNlIGFuZCBzZWxmLm5hbWVzcGFjZVstMV06Ci0gICAgICAgICAgICBwcmVmaXggPSAnOjonLmpvaW4oc2VsZi5uYW1lc3BhY2UpICsgJzo6JwotICAgICAgICByZXR1cm4gcHJlZml4ICsgc2VsZi5uYW1lCi0KLSAgICBkZWYgX1R5cGVTdHJpbmdIZWxwZXIoc2VsZiwgc3VmZml4KToKLSAgICAgICAgaWYgc2VsZi5uYW1lc3BhY2U6Ci0gICAgICAgICAgICBuYW1lcyA9IFtuIG9yICc8YW5vbnltb3VzPicgZm9yIG4gaW4gc2VsZi5uYW1lc3BhY2VdCi0gICAgICAgICAgICBzdWZmaXggKz0gJyBpbiAnICsgJzo6Jy5qb2luKG5hbWVzKQotICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdWZmaXgpCi0KLQotIyBUT0RPKG5ub3J3aXR6KTogbWVyZ2Ugd2l0aCBQYXJhbWV0ZXIgaW4gc29tZSB3YXk/Ci1jbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uKF9HZW5lcmljRGVjbGFyYXRpb24pOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCB2YXJfdHlwZSwgaW5pdGlhbF92YWx1ZSwgbmFtZXNwYWNlKToKLSAgICAgICAgX0dlbmVyaWNEZWNsYXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBuYW1lc3BhY2UpCi0gICAgICAgIHNlbGYudHlwZSA9IHZhcl90eXBlCi0gICAgICAgIHNlbGYuaW5pdGlhbF92YWx1ZSA9IGluaXRpYWxfdmFsdWUKLQotICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG5hbWVzcGFjZXMsIGV0Yy4KLSAgICAgICAgcmV0dXJuIHNlbGYudHlwZS5uYW1lID09IG5vZGUubmFtZQotCi0gICAgZGVmIFRvU3RyaW5nKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCB0cmllcyB0byByZWNvbnN0aXR1dGUgdGhlIHZhcmlhYmxlIGRlY2wuIiIiCi0gICAgICAgIHN1ZmZpeCA9ICclcyAlcycgJSAoc2VsZi50eXBlLCBzZWxmLm5hbWUpCi0gICAgICAgIGlmIHNlbGYuaW5pdGlhbF92YWx1ZToKLSAgICAgICAgICAgIHN1ZmZpeCArPSAnID0gJyArIHNlbGYuaW5pdGlhbF92YWx1ZQotICAgICAgICByZXR1cm4gc3VmZml4Ci0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX1N0cmluZ0hlbHBlcihzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5Ub1N0cmluZygpKQotCi0KLWNsYXNzIFR5cGVkZWYoX0dlbmVyaWNEZWNsYXJhdGlvbik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIGFsaWFzLCBuYW1lc3BhY2UpOgotICAgICAgICBfR2VuZXJpY0RlY2xhcmF0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIG5hbWVzcGFjZSkKLSAgICAgICAgc2VsZi5hbGlhcyA9IGFsaWFzCi0KLSAgICBkZWYgSXNEZWZpbml0aW9uKHNlbGYpOgotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG5hbWVzcGFjZXMsIGV0Yy4KLSAgICAgICAgbmFtZSA9IG5vZGUubmFtZQotICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5hbGlhczoKLSAgICAgICAgICAgIGlmIHRva2VuIGlzIG5vdCBOb25lIGFuZCBuYW1lID09IHRva2VuLm5hbWU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgc3VmZml4ID0gJyVzLCAlcycgJSAoc2VsZi5uYW1lLCBzZWxmLmFsaWFzKQotICAgICAgICByZXR1cm4gc2VsZi5fVHlwZVN0cmluZ0hlbHBlcihzdWZmaXgpCi0KLQotY2xhc3MgX05lc3RlZFR5cGUoX0dlbmVyaWNEZWNsYXJhdGlvbik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIGZpZWxkcywgbmFtZXNwYWNlKToKLSAgICAgICAgX0dlbmVyaWNEZWNsYXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBuYW1lc3BhY2UpCi0gICAgICAgIHNlbGYuZmllbGRzID0gZmllbGRzCi0KLSAgICBkZWYgSXNEZWZpbml0aW9uKHNlbGYpOgotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICBzdWZmaXggPSAnJXMsIHslc30nICUgKHNlbGYubmFtZSwgc2VsZi5maWVsZHMpCi0gICAgICAgIHJldHVybiBzZWxmLl9UeXBlU3RyaW5nSGVscGVyKHN1ZmZpeCkKLQotCi1jbGFzcyBVbmlvbihfTmVzdGVkVHlwZSk6Ci0gICAgcGFzcwotCi0KLWNsYXNzIEVudW0oX05lc3RlZFR5cGUpOgotICAgIHBhc3MKLQotCi1jbGFzcyBDbGFzcyhfR2VuZXJpY0RlY2xhcmF0aW9uKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgbmFtZSwgYmFzZXMsIHRlbXBsYXRlZF90eXBlcywgYm9keSwgbmFtZXNwYWNlKToKLSAgICAgICAgX0dlbmVyaWNEZWNsYXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBuYW1lc3BhY2UpCi0gICAgICAgIHNlbGYuYmFzZXMgPSBiYXNlcwotICAgICAgICBzZWxmLmJvZHkgPSBib2R5Ci0gICAgICAgIHNlbGYudGVtcGxhdGVkX3R5cGVzID0gdGVtcGxhdGVkX3R5cGVzCi0KLSAgICBkZWYgSXNEZWNsYXJhdGlvbihzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuYmFzZXMgaXMgTm9uZSBhbmQgc2VsZi5ib2R5IGlzIE5vbmUKLQotICAgIGRlZiBJc0RlZmluaXRpb24oc2VsZik6Ci0gICAgICAgIHJldHVybiBub3Qgc2VsZi5Jc0RlY2xhcmF0aW9uKCkKLQotICAgIGRlZiBJc0V4cG9ydGFibGUoc2VsZik6Ci0gICAgICAgIHJldHVybiBub3Qgc2VsZi5Jc0RlY2xhcmF0aW9uKCkKLQotICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG5hbWVzcGFjZXMsIGV0Yy4KLSAgICAgICAgaWYgc2VsZi5iYXNlczoKLSAgICAgICAgICAgIGZvciB0b2tlbl9saXN0IGluIHNlbGYuYmFzZXM6Ci0gICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogYmFzZXMgYXJlIHRva2VucywgZG8gbmFtZSBjb21wYXJpc2lvbi4KLSAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5fbGlzdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSBub2RlLm5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAjIFRPRE8obm5vcndpdHopOiBzZWFyY2ggaW4gYm9keSB0b28uCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKLSAgICAgICAgaWYgc2VsZi50ZW1wbGF0ZWRfdHlwZXM6Ci0gICAgICAgICAgICBuYW1lICs9ICc8JXM+JyAlIHNlbGYudGVtcGxhdGVkX3R5cGVzCi0gICAgICAgIHN1ZmZpeCA9ICclcywgJXMsICVzJyAlIChuYW1lLCBzZWxmLmJhc2VzLCBzZWxmLmJvZHkpCi0gICAgICAgIHJldHVybiBzZWxmLl9UeXBlU3RyaW5nSGVscGVyKHN1ZmZpeCkKLQotCi1jbGFzcyBTdHJ1Y3QoQ2xhc3MpOgotICAgIHBhc3MKLQotCi1jbGFzcyBGdW5jdGlvbihfR2VuZXJpY0RlY2xhcmF0aW9uKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgbmFtZSwgcmV0dXJuX3R5cGUsIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdGVtcGxhdGVkX3R5cGVzLCBib2R5LCBuYW1lc3BhY2UpOgotICAgICAgICBfR2VuZXJpY0RlY2xhcmF0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIG5hbWVzcGFjZSkKLSAgICAgICAgY29udmVydGVyID0gVHlwZUNvbnZlcnRlcihuYW1lc3BhY2UpCi0gICAgICAgIHNlbGYucmV0dXJuX3R5cGUgPSBjb252ZXJ0ZXIuQ3JlYXRlUmV0dXJuVHlwZShyZXR1cm5fdHlwZSkKLSAgICAgICAgc2VsZi5wYXJhbWV0ZXJzID0gY29udmVydGVyLlRvUGFyYW1ldGVycyhwYXJhbWV0ZXJzKQotICAgICAgICBzZWxmLm1vZGlmaWVycyA9IG1vZGlmaWVycwotICAgICAgICBzZWxmLmJvZHkgPSBib2R5Ci0gICAgICAgIHNlbGYudGVtcGxhdGVkX3R5cGVzID0gdGVtcGxhdGVkX3R5cGVzCi0KLSAgICBkZWYgSXNEZWNsYXJhdGlvbihzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuYm9keSBpcyBOb25lCi0KLSAgICBkZWYgSXNEZWZpbml0aW9uKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5ib2R5IGlzIG5vdCBOb25lCi0KLSAgICBkZWYgSXNFeHBvcnRhYmxlKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnJldHVybl90eXBlIGFuZCAnc3RhdGljJyBpbiBzZWxmLnJldHVybl90eXBlLm1vZGlmaWVyczoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gTm9uZSBub3QgaW4gc2VsZi5uYW1lc3BhY2UKLQotICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKLSAgICAgICAgaWYgc2VsZi5wYXJhbWV0ZXJzOgotICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogcGFyYW1ldGVycyBhcmUgdG9rZW5zLCBkbyBuYW1lIGNvbXBhcmlzaW9uLgotICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbWV0ZXJzOgotICAgICAgICAgICAgICAgIGlmIHAubmFtZSA9PSBub2RlLm5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICMgVE9ETyhubm9yd2l0eik6IHNlYXJjaCBpbiBib2R5IHRvby4KLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogYWRkIHRlbXBsYXRlZF90eXBlcy4KLSAgICAgICAgc3VmZml4ID0gKCclcyAlcyglcyksIDB4JTAyeCwgJXMnICUKLSAgICAgICAgICAgICAgICAgIChzZWxmLnJldHVybl90eXBlLCBzZWxmLm5hbWUsIHNlbGYucGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGlmaWVycywgc2VsZi5ib2R5KSkKLSAgICAgICAgcmV0dXJuIHNlbGYuX1R5cGVTdHJpbmdIZWxwZXIoc3VmZml4KQotCi0KLWNsYXNzIE1ldGhvZChGdW5jdGlvbik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIGluX2NsYXNzLCByZXR1cm5fdHlwZSwgcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMsIGJvZHksIG5hbWVzcGFjZSk6Ci0gICAgICAgIEZ1bmN0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIHJldHVybl90eXBlLCBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsIHRlbXBsYXRlZF90eXBlcywgYm9keSwgbmFtZXNwYWNlKQotICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpbl9jbGFzcyBjb3VsZCBhbHNvIGJlIGEgbmFtZXNwYWNlIHdoaWNoIGNhbgotICAgICAgICAjIG1lc3MgdXAgZmluZGluZyBmdW5jdGlvbnMgcHJvcGVybHkuCi0gICAgICAgIHNlbGYuaW5fY2xhc3MgPSBpbl9jbGFzcwotCi0KLWNsYXNzIFR5cGUoX0dlbmVyaWNEZWNsYXJhdGlvbik6Ci0gICAgIiIiVHlwZSB1c2VkIGZvciBhbnkgdmFyaWFibGUgKGVnIGNsYXNzLCBwcmltaXRpdmUsIHN0cnVjdCwgZXRjKS4iIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCB0ZW1wbGF0ZWRfdHlwZXMsIG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLCBwb2ludGVyLCBhcnJheSk6Ci0gICAgICAgICIiIgotICAgICAgICBBcmdzOgotICAgICAgICAgIG5hbWU6IHN0ciBuYW1lIG9mIG1haW4gdHlwZQotICAgICAgICAgIHRlbXBsYXRlZF90eXBlczogW0NsYXNzIChUeXBlPyldIHRlbXBsYXRlIHR5cGUgaW5mbyBiZXR3ZWVuIDw+Ci0gICAgICAgICAgbW9kaWZpZXJzOiBbc3RyXSB0eXBlIG1vZGlmaWVycyAoa2V5d29yZHMpIGVnLCBjb25zdCwgbXV0YWJsZSwgZXRjLgotICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXk6IGJvb2xzCi0gICAgICAgICIiIgotICAgICAgICBfR2VuZXJpY0RlY2xhcmF0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIFtdKQotICAgICAgICBzZWxmLnRlbXBsYXRlZF90eXBlcyA9IHRlbXBsYXRlZF90eXBlcwotICAgICAgICBpZiBub3QgbmFtZSBhbmQgbW9kaWZpZXJzOgotICAgICAgICAgICAgc2VsZi5uYW1lID0gbW9kaWZpZXJzLnBvcCgpCi0gICAgICAgIHNlbGYubW9kaWZpZXJzID0gbW9kaWZpZXJzCi0gICAgICAgIHNlbGYucmVmZXJlbmNlID0gcmVmZXJlbmNlCi0gICAgICAgIHNlbGYucG9pbnRlciA9IHBvaW50ZXIKLSAgICAgICAgc2VsZi5hcnJheSA9IGFycmF5Ci0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcHJlZml4ID0gJycKLSAgICAgICAgaWYgc2VsZi5tb2RpZmllcnM6Ci0gICAgICAgICAgICBwcmVmaXggPSAnICcuam9pbihzZWxmLm1vZGlmaWVycykgKyAnICcKLSAgICAgICAgbmFtZSA9IHN0cihzZWxmLm5hbWUpCi0gICAgICAgIGlmIHNlbGYudGVtcGxhdGVkX3R5cGVzOgotICAgICAgICAgICAgbmFtZSArPSAnPCVzPicgJSBzZWxmLnRlbXBsYXRlZF90eXBlcwotICAgICAgICBzdWZmaXggPSBwcmVmaXggKyBuYW1lCi0gICAgICAgIGlmIHNlbGYucmVmZXJlbmNlOgotICAgICAgICAgICAgc3VmZml4ICs9ICcmJwotICAgICAgICBpZiBzZWxmLnBvaW50ZXI6Ci0gICAgICAgICAgICBzdWZmaXggKz0gJyonCi0gICAgICAgIGlmIHNlbGYuYXJyYXk6Ci0gICAgICAgICAgICBzdWZmaXggKz0gJ1tdJwotICAgICAgICByZXR1cm4gc2VsZi5fVHlwZVN0cmluZ0hlbHBlcihzdWZmaXgpCi0KLSAgICAjIEJ5IGRlZmluaXRpb24sIElzKiBhcmUgYWx3YXlzIEZhbHNlLiAgQSBUeXBlIGNhbiBvbmx5IGV4aXN0IGluCi0gICAgIyBzb21lIHNvcnQgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24sIHBhcmFtZXRlciwgb3IgcmV0dXJuIHZhbHVlLgotICAgIGRlZiBJc0RlY2xhcmF0aW9uKHNlbGYpOgotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGRlZiBJc0RlZmluaXRpb24oc2VsZik6Ci0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLQotY2xhc3MgVHlwZUNvbnZlcnRlcihvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZV9zdGFjayk6Ci0gICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrID0gbmFtZXNwYWNlX3N0YWNrCi0KLSAgICBkZWYgX0dldFRlbXBsYXRlRW5kKHNlbGYsIHRva2Vucywgc3RhcnQpOgotICAgICAgICBjb3VudCA9IDEKLSAgICAgICAgZW5kID0gc3RhcnQKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2VuZF0KLSAgICAgICAgICAgIGVuZCArPSAxCi0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc8JzoKLSAgICAgICAgICAgICAgICBjb3VudCArPSAxCi0gICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJz4nOgotICAgICAgICAgICAgICAgIGNvdW50IC09IDEKLSAgICAgICAgICAgICAgICBpZiBjb3VudCA9PSAwOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICByZXR1cm4gdG9rZW5zW3N0YXJ0OmVuZC0xXSwgZW5kCi0KLSAgICBkZWYgVG9UeXBlKHNlbGYsIHRva2Vucyk6Ci0gICAgICAgICIiIkNvbnZlcnQgW1Rva2VuLC4uLl0gdG8gW0NsYXNzKC4uLiksIF0gdXNlZnVsIGZvciBiYXNlIGNsYXNzZXMuCi0gICAgICAgIEZvciBleGFtcGxlLCBjb2RlIGxpa2UgY2xhc3MgRm9vIDogcHVibGljIEJhcjx4LCB5PiB7IC4uLiB9OwotICAgICAgICB0aGUgIkJhcjx4LCB5PiIgcG9ydGlvbiBnZXRzIGNvbnZlcnRlZCB0byBhbiBBU1QuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBbQ2xhc3MoLi4uKSwgLi4uXQotICAgICAgICAiIiIKLSAgICAgICAgcmVzdWx0ID0gW10KLSAgICAgICAgbmFtZV90b2tlbnMgPSBbXQotICAgICAgICByZWZlcmVuY2UgPSBwb2ludGVyID0gYXJyYXkgPSBGYWxzZQotCi0gICAgICAgIGRlZiBBZGRUeXBlKHRlbXBsYXRlZF90eXBlcyk6Ci0gICAgICAgICAgICAjIFBhcnRpdGlvbiB0b2tlbnMgaW50byBuYW1lIGFuZCBtb2RpZmllciB0b2tlbnMuCi0gICAgICAgICAgICBuYW1lcyA9IFtdCi0gICAgICAgICAgICBtb2RpZmllcnMgPSBbXQotICAgICAgICAgICAgZm9yIHQgaW4gbmFtZV90b2tlbnM6Ci0gICAgICAgICAgICAgICAgaWYga2V5d29yZHMuSXNLZXl3b3JkKHQubmFtZSk6Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycy5hcHBlbmQodC5uYW1lKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZCh0Lm5hbWUpCi0gICAgICAgICAgICBuYW1lID0gJycuam9pbihuYW1lcykKLSAgICAgICAgICAgIGlmIG5hbWVfdG9rZW5zOgotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVHlwZShuYW1lX3Rva2Vuc1swXS5zdGFydCwgbmFtZV90b2tlbnNbLTFdLmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGVtcGxhdGVkX3R5cGVzLCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXkpKQotICAgICAgICAgICAgZGVsIG5hbWVfdG9rZW5zWzpdCi0KLSAgICAgICAgaSA9IDAKLSAgICAgICAgZW5kID0gbGVuKHRva2VucykKLSAgICAgICAgd2hpbGUgaSA8IGVuZDoKLSAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldCi0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc8JzoKLSAgICAgICAgICAgICAgICBuZXdfdG9rZW5zLCBuZXdfZW5kID0gc2VsZi5fR2V0VGVtcGxhdGVFbmQodG9rZW5zLCBpKzEpCi0gICAgICAgICAgICAgICAgQWRkVHlwZShzZWxmLlRvVHlwZShuZXdfdG9rZW5zKSkKLSAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIGEgY29tbWEgYWZ0ZXIgdGhlIHRlbXBsYXRlLCB3ZSBuZWVkIHRvIGNvbnN1bWUKLSAgICAgICAgICAgICAgICAjIHRoYXQgaGVyZSBvdGhlcndpc2UgaXQgYmVjb21lcyBwYXJ0IG9mIHRoZSBuYW1lLgotICAgICAgICAgICAgICAgIGkgPSBuZXdfZW5kCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcG9pbnRlciA9IGFycmF5ID0gRmFsc2UKLSAgICAgICAgICAgIGVsaWYgdG9rZW4ubmFtZSA9PSAnLCc6Ci0gICAgICAgICAgICAgICAgQWRkVHlwZShbXSkKLSAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBwb2ludGVyID0gYXJyYXkgPSBGYWxzZQotICAgICAgICAgICAgZWxpZiB0b2tlbi5uYW1lID09ICcqJzoKLSAgICAgICAgICAgICAgICBwb2ludGVyID0gVHJ1ZQotICAgICAgICAgICAgZWxpZiB0b2tlbi5uYW1lID09ICcmJzoKLSAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBUcnVlCi0gICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJ1snOgotICAgICAgICAgICAgICAgcG9pbnRlciA9IFRydWUKLSAgICAgICAgICAgIGVsaWYgdG9rZW4ubmFtZSA9PSAnXSc6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBuYW1lX3Rva2Vucy5hcHBlbmQodG9rZW4pCi0gICAgICAgICAgICBpICs9IDEKLQotICAgICAgICBpZiBuYW1lX3Rva2VuczoKLSAgICAgICAgICAgICMgTm8gJzwnIGluIHRoZSB0b2tlbnMsIGp1c3QgYSBzaW1wbGUgbmFtZSBhbmQgbm8gdGVtcGxhdGUuCi0gICAgICAgICAgICBBZGRUeXBlKFtdKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICBkZWYgRGVjbGFyYXRpb25Ub1BhcnRzKHNlbGYsIHBhcnRzLCBuZWVkc19uYW1lX3JlbW92ZWQpOgotICAgICAgICBuYW1lID0gTm9uZQotICAgICAgICBkZWZhdWx0ID0gW10KLSAgICAgICAgaWYgbmVlZHNfbmFtZV9yZW1vdmVkOgotICAgICAgICAgICAgIyBIYW5kbGUgZGVmYXVsdCAoaW5pdGlhbCkgdmFsdWVzIHByb3Blcmx5LgotICAgICAgICAgICAgZm9yIGksIHQgaW4gZW51bWVyYXRlKHBhcnRzKToKLSAgICAgICAgICAgICAgICBpZiB0Lm5hbWUgPT0gJz0nOgotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gcGFydHNbaSsxOl0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhcnRzW2ktMV0ubmFtZQotICAgICAgICAgICAgICAgICAgICBpZiBuYW1lID09ICddJyBhbmQgcGFydHNbaS0yXS5uYW1lID09ICdbJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJ0c1tpLTNdLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMQotICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhcnRzWzppLTFdCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIHBhcnRzWy0xXS50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUU6Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJ0cy5wb3AoKS5uYW1lCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogdGhpcyBpcyBhIGhhY2sgdGhhdCBoYXBwZW5zIGZvciBjb2RlIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgIyBSZWdpc3RlcihGb288VD4pOyB3aGVyZSBpdCB0aGlua3MgdGhpcyBpcyBhIGZ1bmN0aW9uIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgIyBidXQgaXQncyBhY3R1YWxseSBhIGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgICAgICAgICBuYW1lID0gJz8/PycKLSAgICAgICAgbW9kaWZpZXJzID0gW10KLSAgICAgICAgdHlwZV9uYW1lID0gW10KLSAgICAgICAgb3RoZXJfdG9rZW5zID0gW10KLSAgICAgICAgdGVtcGxhdGVkX3R5cGVzID0gW10KLSAgICAgICAgaSA9IDAKLSAgICAgICAgZW5kID0gbGVuKHBhcnRzKQotICAgICAgICB3aGlsZSBpIDwgZW5kOgotICAgICAgICAgICAgcCA9IHBhcnRzW2ldCi0gICAgICAgICAgICBpZiBrZXl3b3Jkcy5Jc0tleXdvcmQocC5uYW1lKToKLSAgICAgICAgICAgICAgICBtb2RpZmllcnMuYXBwZW5kKHAubmFtZSkKLSAgICAgICAgICAgIGVsaWYgcC5uYW1lID09ICc8JzoKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZWRfdG9rZW5zLCBuZXdfZW5kID0gc2VsZi5fR2V0VGVtcGxhdGVFbmQocGFydHMsIGkrMSkKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZWRfdHlwZXMgPSBzZWxmLlRvVHlwZSh0ZW1wbGF0ZWRfdG9rZW5zKQotICAgICAgICAgICAgICAgIGkgPSBuZXdfZW5kIC0gMQotICAgICAgICAgICAgICAgICMgRG9uJ3QgYWRkIGEgc3B1cmlvdXMgOjogdG8gZGF0YSBtZW1iZXJzIGJlaW5nIGluaXRpYWxpemVkLgotICAgICAgICAgICAgICAgIG5leHRfaW5kZXggPSBpICsgMQotICAgICAgICAgICAgICAgIGlmIG5leHRfaW5kZXggPCBlbmQgYW5kIHBhcnRzW25leHRfaW5kZXhdLm5hbWUgPT0gJzo6JzoKLSAgICAgICAgICAgICAgICAgICAgaSArPSAxCi0gICAgICAgICAgICBlbGlmIHAubmFtZSBpbiAoJ1snLCAnXScsICc9Jyk6Ci0gICAgICAgICAgICAgICAgIyBUaGVzZSBhcmUgaGFuZGxlZCBlbHNld2hlcmUuCi0gICAgICAgICAgICAgICAgb3RoZXJfdG9rZW5zLmFwcGVuZChwKQotICAgICAgICAgICAgZWxpZiBwLm5hbWUgbm90IGluICgnKicsICcmJywgJz4nKToKLSAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IG5hbWVzIGhhdmUgYSBzcGFjZSBiZXR3ZWVuIHRoZW0uCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVfbmFtZSBhbmQgdHlwZV9uYW1lWy0xXS50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUUgYW5kCi0gICAgICAgICAgICAgICAgICAgIHAudG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FKToKLSAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLmFwcGVuZCh0b2tlbml6ZS5Ub2tlbih0b2tlbml6ZS5TWU5UQVgsICcgJywgMCwgMCkpCi0gICAgICAgICAgICAgICAgdHlwZV9uYW1lLmFwcGVuZChwKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBvdGhlcl90b2tlbnMuYXBwZW5kKHApCi0gICAgICAgICAgICBpICs9IDEKLSAgICAgICAgdHlwZV9uYW1lID0gJycuam9pbihbdC5uYW1lIGZvciB0IGluIHR5cGVfbmFtZV0pCi0gICAgICAgIHJldHVybiBuYW1lLCB0eXBlX25hbWUsIHRlbXBsYXRlZF90eXBlcywgbW9kaWZpZXJzLCBkZWZhdWx0LCBvdGhlcl90b2tlbnMKLQotICAgIGRlZiBUb1BhcmFtZXRlcnMoc2VsZiwgdG9rZW5zKToKLSAgICAgICAgaWYgbm90IHRva2VuczoKLSAgICAgICAgICAgIHJldHVybiBbXQotCi0gICAgICAgIHJlc3VsdCA9IFtdCi0gICAgICAgIG5hbWUgPSB0eXBlX25hbWUgPSAnJwotICAgICAgICB0eXBlX21vZGlmaWVycyA9IFtdCi0gICAgICAgIHBvaW50ZXIgPSByZWZlcmVuY2UgPSBhcnJheSA9IEZhbHNlCi0gICAgICAgIGZpcnN0X3Rva2VuID0gTm9uZQotICAgICAgICBkZWZhdWx0ID0gW10KLQotICAgICAgICBkZWYgQWRkUGFyYW1ldGVyKGVuZCk6Ci0gICAgICAgICAgICBpZiBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGRlbCBkZWZhdWx0WzBdICAjIFJlbW92ZSBmbGFnLgotICAgICAgICAgICAgcGFydHMgPSBzZWxmLkRlY2xhcmF0aW9uVG9QYXJ0cyh0eXBlX21vZGlmaWVycywgVHJ1ZSkKLSAgICAgICAgICAgIChuYW1lLCB0eXBlX25hbWUsIHRlbXBsYXRlZF90eXBlcywgbW9kaWZpZXJzLAotICAgICAgICAgICAgIHVudXNlZF9kZWZhdWx0LCB1bnVzZWRfb3RoZXJfdG9rZW5zKSA9IHBhcnRzCi0gICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSA9IFR5cGUoZmlyc3RfdG9rZW4uc3RhcnQsIGZpcnN0X3Rva2VuLmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsIHRlbXBsYXRlZF90eXBlcywgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXkpCi0gICAgICAgICAgICBwID0gUGFyYW1ldGVyKGZpcnN0X3Rva2VuLnN0YXJ0LCBlbmQsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlLCBkZWZhdWx0KQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQotCi0gICAgICAgIHRlbXBsYXRlX2NvdW50ID0gMAotICAgICAgICBmb3IgcyBpbiB0b2tlbnM6Ci0gICAgICAgICAgICBpZiBub3QgZmlyc3RfdG9rZW46Ci0gICAgICAgICAgICAgICAgZmlyc3RfdG9rZW4gPSBzCi0gICAgICAgICAgICBpZiBzLm5hbWUgPT0gJzwnOgotICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NvdW50ICs9IDEKLSAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICc+JzoKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jb3VudCAtPSAxCi0gICAgICAgICAgICBpZiB0ZW1wbGF0ZV9jb3VudCA+IDA6Ci0gICAgICAgICAgICAgICAgdHlwZV9tb2RpZmllcnMuYXBwZW5kKHMpCi0gICAgICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICAgICAgaWYgcy5uYW1lID09ICcsJzoKLSAgICAgICAgICAgICAgICBBZGRQYXJhbWV0ZXIocy5zdGFydCkKLSAgICAgICAgICAgICAgICBuYW1lID0gdHlwZV9uYW1lID0gJycKLSAgICAgICAgICAgICAgICB0eXBlX21vZGlmaWVycyA9IFtdCi0gICAgICAgICAgICAgICAgcG9pbnRlciA9IHJlZmVyZW5jZSA9IGFycmF5ID0gRmFsc2UKLSAgICAgICAgICAgICAgICBmaXJzdF90b2tlbiA9IE5vbmUKLSAgICAgICAgICAgICAgICBkZWZhdWx0ID0gW10KLSAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICcqJzoKLSAgICAgICAgICAgICAgICBwb2ludGVyID0gVHJ1ZQotICAgICAgICAgICAgZWxpZiBzLm5hbWUgPT0gJyYnOgotICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IFRydWUKLSAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICdbJzoKLSAgICAgICAgICAgICAgICBhcnJheSA9IFRydWUKLSAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICddJzoKLSAgICAgICAgICAgICAgICBwYXNzICAjIEp1c3QgZG9uJ3QgYWRkIHRvIHR5cGVfbW9kaWZpZXJzLgotICAgICAgICAgICAgZWxpZiBzLm5hbWUgPT0gJz0nOgotICAgICAgICAgICAgICAgICMgR290IGEgZGVmYXVsdCB2YWx1ZS4gIEFkZCBhbnkgdmFsdWUgKE5vbmUpIGFzIGEgZmxhZy4KLSAgICAgICAgICAgICAgICBkZWZhdWx0LmFwcGVuZChOb25lKQotICAgICAgICAgICAgZWxpZiBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGRlZmF1bHQuYXBwZW5kKHMpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHR5cGVfbW9kaWZpZXJzLmFwcGVuZChzKQotICAgICAgICBBZGRQYXJhbWV0ZXIodG9rZW5zWy0xXS5lbmQpCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotICAgIGRlZiBDcmVhdGVSZXR1cm5UeXBlKHNlbGYsIHJldHVybl90eXBlX3NlcSk6Ci0gICAgICAgIGlmIG5vdCByZXR1cm5fdHlwZV9zZXE6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBzdGFydCA9IHJldHVybl90eXBlX3NlcVswXS5zdGFydAotICAgICAgICBlbmQgPSByZXR1cm5fdHlwZV9zZXFbLTFdLmVuZAotICAgICAgICBfLCBuYW1lLCB0ZW1wbGF0ZWRfdHlwZXMsIG1vZGlmaWVycywgZGVmYXVsdCwgb3RoZXJfdG9rZW5zID0gXAotICAgICAgICAgICBzZWxmLkRlY2xhcmF0aW9uVG9QYXJ0cyhyZXR1cm5fdHlwZV9zZXEsIEZhbHNlKQotICAgICAgICBuYW1lcyA9IFtuLm5hbWUgZm9yIG4gaW4gb3RoZXJfdG9rZW5zXQotICAgICAgICByZWZlcmVuY2UgPSAnJicgaW4gbmFtZXMKLSAgICAgICAgcG9pbnRlciA9ICcqJyBpbiBuYW1lcwotICAgICAgICBhcnJheSA9ICdbJyBpbiBuYW1lcwotICAgICAgICByZXR1cm4gVHlwZShzdGFydCwgZW5kLCBuYW1lLCB0ZW1wbGF0ZWRfdHlwZXMsIG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLCBwb2ludGVyLCBhcnJheSkKLQotICAgIGRlZiBHZXRUZW1wbGF0ZUluZGljZXMoc2VsZiwgbmFtZXMpOgotICAgICAgICAjIG5hbWVzIGlzIGEgbGlzdCBvZiBzdHJpbmdzLgotICAgICAgICBzdGFydCA9IG5hbWVzLmluZGV4KCc8JykKLSAgICAgICAgZW5kID0gbGVuKG5hbWVzKSAtIDEKLSAgICAgICAgd2hpbGUgZW5kID4gMDoKLSAgICAgICAgICAgIGlmIG5hbWVzW2VuZF0gPT0gJz4nOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbmQgLT0gMQotICAgICAgICByZXR1cm4gc3RhcnQsIGVuZCsxCi0KLWNsYXNzIEFzdEJ1aWxkZXIob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5fc3RyZWFtLCBmaWxlbmFtZSwgaW5fY2xhc3M9JycsIHZpc2liaWxpdHk9Tm9uZSwKLSAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3N0YWNrPVtdKToKLSAgICAgICAgc2VsZi50b2tlbnMgPSB0b2tlbl9zdHJlYW0KLSAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCi0gICAgICAgICMgVE9ETyhubm9yd2l0eik6IHVzZSBhIGJldHRlciBkYXRhIHN0cnVjdHVyZSAoZGVxdWUpIGZvciB0aGUgcXVldWUuCi0gICAgICAgICMgU3dpdGNoaW5nIGRpcmVjdGlvbnMgb2YgdGhlICJxdWV1ZSIgaW1wcm92ZWQgcGVyZiBieSBhYm91dCAyNSUuCi0gICAgICAgICMgVXNpbmcgYSBkZXF1ZSBzaG91bGQgYmUgZXZlbiBiZXR0ZXIgc2luY2Ugd2UgYWNjZXNzIGZyb20gYm90aCBzaWRlcy4KLSAgICAgICAgc2VsZi50b2tlbl9xdWV1ZSA9IFtdCi0gICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrID0gbmFtZXNwYWNlX3N0YWNrWzpdCi0gICAgICAgIHNlbGYuaW5fY2xhc3MgPSBpbl9jbGFzcwotICAgICAgICBpZiBpbl9jbGFzcyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5pbl9jbGFzc19uYW1lX29ubHkgPSBOb25lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmluX2NsYXNzX25hbWVfb25seSA9IGluX2NsYXNzLnNwbGl0KCc6OicpWy0xXQotICAgICAgICBzZWxmLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5Ci0gICAgICAgIHNlbGYuaW5fZnVuY3Rpb24gPSBGYWxzZQotICAgICAgICBzZWxmLmN1cnJlbnRfdG9rZW4gPSBOb25lCi0gICAgICAgICMgS2VlcCB0aGUgc3RhdGUgd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5nIGEgdHlwZWRlZiBvciBub3QuCi0gICAgICAgIHNlbGYuX2hhbmRsaW5nX3R5cGVkZWYgPSBGYWxzZQotCi0gICAgICAgIHNlbGYuY29udmVydGVyID0gVHlwZUNvbnZlcnRlcihzZWxmLm5hbWVzcGFjZV9zdGFjaykKLQotICAgIGRlZiBIYW5kbGVFcnJvcihzZWxmLCBtc2csIHRva2VuKToKLSAgICAgICAgcHJpbnRhYmxlX3F1ZXVlID0gbGlzdChyZXZlcnNlZChzZWxmLnRva2VuX3F1ZXVlWy0yMDpdKSkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnR290ICVzIGluICVzIEAgJXMgJXNcbicgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChtc2csIHNlbGYuZmlsZW5hbWUsIHRva2VuLCBwcmludGFibGVfcXVldWUpKQotCi0gICAgZGVmIEdlbmVyYXRlKHNlbGYpOgotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgaWYgbm90IHRva2VuOgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgICAgICMgR2V0IHRoZSBuZXh0IHRva2VuLgotICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rva2VuID0gdG9rZW4KLQotICAgICAgICAgICAgIyBEaXNwYXRjaCBvbiB0aGUgbmV4dCB0b2tlbiB0eXBlLgotICAgICAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSBfSU5URVJOQUxfVE9LRU46Ci0gICAgICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSBfTkFNRVNQQUNFX1BPUDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2sucG9wKCkKLSAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fR2VuZXJhdGVPbmUodG9rZW4pCi0gICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXN1bHQKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBzZWxmLkhhbmRsZUVycm9yKCdleGNlcHRpb24nLCB0b2tlbikKLSAgICAgICAgICAgICAgICByYWlzZQotCi0gICAgZGVmIF9DcmVhdGVWYXJpYWJsZShzZWxmLCBwb3NfdG9rZW4sIG5hbWUsIHR5cGVfbmFtZSwgdHlwZV9tb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWZfcG9pbnRlcl9uYW1lX3NlcSwgdGVtcGxhdGVkX3R5cGVzLCB2YWx1ZT1Ob25lKToKLSAgICAgICAgcmVmZXJlbmNlID0gJyYnIGluIHJlZl9wb2ludGVyX25hbWVfc2VxCi0gICAgICAgIHBvaW50ZXIgPSAnKicgaW4gcmVmX3BvaW50ZXJfbmFtZV9zZXEKLSAgICAgICAgYXJyYXkgPSAnWycgaW4gcmVmX3BvaW50ZXJfbmFtZV9zZXEKLSAgICAgICAgdmFyX3R5cGUgPSBUeXBlKHBvc190b2tlbi5zdGFydCwgcG9zX3Rva2VuLmVuZCwgdHlwZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVkX3R5cGVzLCB0eXBlX21vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXkpCi0gICAgICAgIHJldHVybiBWYXJpYWJsZURlY2xhcmF0aW9uKHBvc190b2tlbi5zdGFydCwgcG9zX3Rva2VuLmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFyX3R5cGUsIHZhbHVlLCBzZWxmLm5hbWVzcGFjZV9zdGFjaykKLQotICAgIGRlZiBfR2VuZXJhdGVPbmUoc2VsZiwgdG9rZW4pOgotICAgICAgICBpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUU6Ci0gICAgICAgICAgICBpZiAoa2V5d29yZHMuSXNLZXl3b3JkKHRva2VuLm5hbWUpIGFuZAotICAgICAgICAgICAgICAgIG5vdCBrZXl3b3Jkcy5Jc0J1aWx0aW5UeXBlKHRva2VuLm5hbWUpKToKLSAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdoYW5kbGVfJyArIHRva2VuLm5hbWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgpCi0gICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gc2VsZi5pbl9jbGFzc19uYW1lX29ubHk6Ci0gICAgICAgICAgICAgICAgIyBUaGUgdG9rZW4gbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgY2xhc3MsIG11c3QgYmUgYSBjdG9yIGlmCi0gICAgICAgICAgICAgICAgIyB0aGVyZSBpcyBhIHBhcmVuLiAgT3RoZXJ3aXNlLCBpdCdzIHRoZSByZXR1cm4gdHlwZS4KLSAgICAgICAgICAgICAgICAjIFBlZWsgYWhlYWQgdG8gZ2V0IHRoZSBuZXh0IHRva2VuIHRvIGZpZ3VyZSBvdXQgd2hpY2guCi0gICAgICAgICAgICAgICAgbmV4dCA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKG5leHQpCi0gICAgICAgICAgICAgICAgaWYgbmV4dC50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQgbmV4dC5uYW1lID09ICcoJzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0dldE1ldGhvZChbdG9rZW5dLCBGVU5DVElPTl9DVE9SLCBOb25lLCBUcnVlKQotICAgICAgICAgICAgICAgICMgRmFsbCB0aHJvdWdoLS1oYW5kbGUgbGlrZSBhbnkgb3RoZXIgbWV0aG9kLgotCi0gICAgICAgICAgICAjIEhhbmRsZSBkYXRhIG9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9uL2RlZmluaXRpb24uCi0gICAgICAgICAgICBzeW50YXggPSB0b2tlbml6ZS5TWU5UQVgKLSAgICAgICAgICAgIHRlbXBfdG9rZW5zLCBsYXN0X3Rva2VuID0gXAotICAgICAgICAgICAgICAgIHNlbGYuX0dldFZhclRva2Vuc1VwVG8oc3ludGF4LCAnKCcsICc7JywgJ3snLCAnWycpCi0gICAgICAgICAgICB0ZW1wX3Rva2Vucy5pbnNlcnQoMCwgdG9rZW4pCi0gICAgICAgICAgICBpZiBsYXN0X3Rva2VuLm5hbWUgPT0gJygnOgotICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgYW4gYXNzaWdubWVudCBiZWZvcmUgdGhlIHBhcmVuLAotICAgICAgICAgICAgICAgICMgdGhpcyBpcyBhbiBleHByZXNzaW9uLCBub3QgYSBtZXRob2QuCi0gICAgICAgICAgICAgICAgZXhwciA9IGJvb2woW2UgZm9yIGUgaW4gdGVtcF90b2tlbnMgaWYgZS5uYW1lID09ICc9J10pCi0gICAgICAgICAgICAgICAgaWYgZXhwcjoKLSAgICAgICAgICAgICAgICAgICAgbmV3X3RlbXAgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQotICAgICAgICAgICAgICAgICAgICB0ZW1wX3Rva2Vucy5hcHBlbmQobGFzdF90b2tlbikKLSAgICAgICAgICAgICAgICAgICAgdGVtcF90b2tlbnMuZXh0ZW5kKG5ld190ZW1wKQotICAgICAgICAgICAgICAgICAgICBsYXN0X3Rva2VuID0gdG9rZW5pemUuVG9rZW4odG9rZW5pemUuU1lOVEFYLCAnOycsIDAsIDApCi0KLSAgICAgICAgICAgIGlmIGxhc3RfdG9rZW4ubmFtZSA9PSAnWyc6Ci0gICAgICAgICAgICAgICAgIyBIYW5kbGUgYXJyYXksIHRoaXMgaXNuJ3QgYSBtZXRob2QsIHVubGVzcyBpdCdzIGFuIG9wZXJhdG9yLgotICAgICAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGtlZXAgdGhlIHNpemUgc29tZXdoZXJlLgotICAgICAgICAgICAgICAgICMgdW51c2VkX3NpemUgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJ10nKQotICAgICAgICAgICAgICAgIHRlbXBfdG9rZW5zLmFwcGVuZChsYXN0X3Rva2VuKQotICAgICAgICAgICAgICAgIGlmIHRlbXBfdG9rZW5zWy0yXS5uYW1lID09ICdvcGVyYXRvcic6Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBfdG9rZW5zLmFwcGVuZChzZWxmLl9HZXROZXh0VG9rZW4oKSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB0ZW1wX3Rva2VuczIsIGxhc3RfdG9rZW4gPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9HZXRWYXJUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQotICAgICAgICAgICAgICAgICAgICB0ZW1wX3Rva2Vucy5leHRlbmQodGVtcF90b2tlbnMyKQotCi0gICAgICAgICAgICBpZiBsYXN0X3Rva2VuLm5hbWUgPT0gJzsnOgotICAgICAgICAgICAgICAgICMgSGFuZGxlIGRhdGEsIHRoaXMgaXNuJ3QgYSBtZXRob2QuCi0gICAgICAgICAgICAgICAgcGFydHMgPSBzZWxmLmNvbnZlcnRlci5EZWNsYXJhdGlvblRvUGFydHModGVtcF90b2tlbnMsIFRydWUpCi0gICAgICAgICAgICAgICAgKG5hbWUsIHR5cGVfbmFtZSwgdGVtcGxhdGVkX3R5cGVzLCBtb2RpZmllcnMsIGRlZmF1bHQsCi0gICAgICAgICAgICAgICAgIHVudXNlZF9vdGhlcl90b2tlbnMpID0gcGFydHMKLQotICAgICAgICAgICAgICAgIHQwID0gdGVtcF90b2tlbnNbMF0KLSAgICAgICAgICAgICAgICBuYW1lcyA9IFt0Lm5hbWUgZm9yIHQgaW4gdGVtcF90b2tlbnNdCi0gICAgICAgICAgICAgICAgaWYgdGVtcGxhdGVkX3R5cGVzOgotICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gc2VsZi5jb252ZXJ0ZXIuR2V0VGVtcGxhdGVJbmRpY2VzKG5hbWVzKQotICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IG5hbWVzWzpzdGFydF0gKyBuYW1lc1tlbmQ6XQotICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAnJy5qb2luKFt0Lm5hbWUgZm9yIHQgaW4gZGVmYXVsdF0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZVZhcmlhYmxlKHQwLCBuYW1lLCB0eXBlX25hbWUsIG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMsIHRlbXBsYXRlZF90eXBlcywgZGVmYXVsdCkKLSAgICAgICAgICAgIGlmIGxhc3RfdG9rZW4ubmFtZSA9PSAneyc6Ci0gICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2Vucyh0ZW1wX3Rva2Vuc1sxOl0pCi0gICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKGxhc3RfdG9rZW4pCi0gICAgICAgICAgICAgICAgbWV0aG9kX25hbWUgPSB0ZW1wX3Rva2Vuc1swXS5uYW1lCi0gICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnaGFuZGxlXycgKyBtZXRob2RfbmFtZSwgTm9uZSkKLSAgICAgICAgICAgICAgICBpZiBub3QgbWV0aG9kOgotICAgICAgICAgICAgICAgICAgICAjIE11c3QgYmUgZGVjbGFyaW5nIGEgdmFyaWFibGUuCi0gICAgICAgICAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSB0aGUgZGVjbGFyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWV0aG9kKHRlbXBfdG9rZW5zLCAwLCBOb25lLCBGYWxzZSkKLSAgICAgICAgZWxpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWDoKLSAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ34nIGFuZCBzZWxmLmluX2NsYXNzOgotICAgICAgICAgICAgICAgICMgTXVzdCBiZSBhIGR0b3IgKHByb2JhYmx5IG5vdCBpbiBtZXRob2QgYm9keSkuCi0gICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgICMgc2VsZi5pbl9jbGFzcyBjYW4gY29udGFpbiBBOjpOYW1lLCBidXQgdGhlIGR0b3Igd2lsbCBvbmx5Ci0gICAgICAgICAgICAgICAgIyBiZSBOYW1lLiAgTWFrZSBzdXJlIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcmlnaHQgdmFsdWUuCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRSBhbmQKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4ubmFtZSA9PSBzZWxmLmluX2NsYXNzX25hbWVfb25seSk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9HZXRNZXRob2QoW3Rva2VuXSwgRlVOQ1RJT05fRFRPUiwgTm9uZSwgVHJ1ZSkKLSAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBhIGxvdCBtb3JlIHN5bnRheC4KLSAgICAgICAgZWxpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlBSRVBST0NFU1NPUjoKLSAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBtb3JlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgotICAgICAgICAgICAgIyB0b2tlbiBzdGFydHMgd2l0aCBhICMsIHNvIHJlbW92ZSBpdCBhbmQgc3RyaXAgd2hpdGVzcGFjZS4KLSAgICAgICAgICAgIG5hbWUgPSB0b2tlbi5uYW1lWzE6XS5sc3RyaXAoKQotICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdpbmNsdWRlJyk6Ci0gICAgICAgICAgICAgICAgIyBSZW1vdmUgImluY2x1ZGUiLgotICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzc6XS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUKLSAgICAgICAgICAgICAgICAjIEhhbmRsZSAjaW5jbHVkZSBcPG5ld2xpbmU+ICJoZWFkZXItb24tc2Vjb25kLWxpbmUuaCIuCi0gICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdcXCcpOgotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVsxOl0uc3RyaXAoKQotICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lWzBdIGluICc8IicsIHRva2VuCi0gICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVbLTFdIGluICc+IicsIHRva2VuCi0gICAgICAgICAgICAgICAgc3lzdGVtID0gbmFtZVswXSA9PSAnPCcKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5hbWVbMTotMV0KLSAgICAgICAgICAgICAgICByZXR1cm4gSW5jbHVkZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCBmaWxlbmFtZSwgc3lzdGVtKQotICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdkZWZpbmUnKToKLSAgICAgICAgICAgICAgICAjIFJlbW92ZSAiZGVmaW5lIi4KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs2Ol0uc3RyaXAoKQotICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAnJwotICAgICAgICAgICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgaWYgYy5pc3NwYWNlKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5hbWVbaTpdLmxzdHJpcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6aV0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgcmV0dXJuIERlZmluZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCBuYW1lLCB2YWx1ZSkKLSAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnaWYnKSBhbmQgbmFtZVsyOjNdLmlzc3BhY2UoKToKLSAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBuYW1lWzM6XS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgaWYgY29uZGl0aW9uLnN0YXJ0c3dpdGgoJzAnKSBvciBjb25kaXRpb24uc3RhcnRzd2l0aCgnKDApJyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX1NraXBJZjBCbG9ja3MoKQotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgZGVmIF9HZXRUb2tlbnNVcFRvKHNlbGYsIGV4cGVjdGVkX3Rva2VuX3R5cGUsIGV4cGVjdGVkX3Rva2VuKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX0dldFZhclRva2Vuc1VwVG8oZXhwZWN0ZWRfdG9rZW5fdHlwZSwgZXhwZWN0ZWRfdG9rZW4pWzBdCi0KLSAgICBkZWYgX0dldFZhclRva2Vuc1VwVG8oc2VsZiwgZXhwZWN0ZWRfdG9rZW5fdHlwZSwgKmV4cGVjdGVkX3Rva2Vucyk6Ci0gICAgICAgIGxhc3RfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICB0b2tlbnMgPSBbXQotICAgICAgICB3aGlsZSAobGFzdF90b2tlbi50b2tlbl90eXBlICE9IGV4cGVjdGVkX3Rva2VuX3R5cGUgb3IKLSAgICAgICAgICAgICAgIGxhc3RfdG9rZW4ubmFtZSBub3QgaW4gZXhwZWN0ZWRfdG9rZW5zKToKLSAgICAgICAgICAgIHRva2Vucy5hcHBlbmQobGFzdF90b2tlbikKLSAgICAgICAgICAgIGxhc3RfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICByZXR1cm4gdG9rZW5zLCBsYXN0X3Rva2VuCi0KLSAgICAjIFRPRE8obm5vcndpdHopOiByZW1vdmUgX0lnbm9yZVVwVG8oKSBpdCBzaG91bGRuJ3QgYmUgbmVjZXNhcnkuCi0gICAgZGVmIF9JZ25vcmVVcFRvKHNlbGYsIHRva2VuX3R5cGUsIHRva2VuKToKLSAgICAgICAgdW51c2VkX3Rva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5fdHlwZSwgdG9rZW4pCi0KLSAgICBkZWYgX1NraXBJZjBCbG9ja3Moc2VsZik6Ci0gICAgICAgIGNvdW50ID0gMQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSAhPSB0b2tlbml6ZS5QUkVQUk9DRVNTT1I6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICAgICAgbmFtZSA9IHRva2VuLm5hbWVbMTpdLmxzdHJpcCgpCi0gICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ2VuZGlmJyk6Ci0gICAgICAgICAgICAgICAgY291bnQgLT0gMQotICAgICAgICAgICAgICAgIGlmIGNvdW50ID09IDA6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbGlmIG5hbWUuc3RhcnRzd2l0aCgnaWYnKToKLSAgICAgICAgICAgICAgICBjb3VudCArPSAxCi0KLSAgICBkZWYgX0dldE1hdGNoaW5nQ2hhcihzZWxmLCBvcGVuX3BhcmVuLCBjbG9zZV9wYXJlbiwgR2V0TmV4dFRva2VuPU5vbmUpOgotICAgICAgICBpZiBHZXROZXh0VG9rZW4gaXMgTm9uZToKLSAgICAgICAgICAgIEdldE5leHRUb2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbgotICAgICAgICAjIEFzc3VtZXMgdGhlIGN1cnJlbnQgdG9rZW4gaXMgb3Blbl9wYXJlbiBhbmQgd2Ugd2lsbCBjb25zdW1lCi0gICAgICAgICMgYW5kIHJldHVybiB1cCB0byB0aGUgY2xvc2VfcGFyZW4uCi0gICAgICAgIGNvdW50ID0gMQotICAgICAgICB0b2tlbiA9IEdldE5leHRUb2tlbigpCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWDoKLSAgICAgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09IG9wZW5fcGFyZW46Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gY2xvc2VfcGFyZW46Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50IC09IDEKLSAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICB5aWVsZCB0b2tlbgotICAgICAgICAgICAgdG9rZW4gPSBHZXROZXh0VG9rZW4oKQotICAgICAgICB5aWVsZCB0b2tlbgotCi0gICAgZGVmIF9HZXRQYXJhbWV0ZXJzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCcoJywgJyknKQotCi0gICAgZGVmIEdldFNjb3BlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCd7JywgJ30nKQotCi0gICAgZGVmIF9HZXROZXh0VG9rZW4oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYudG9rZW5fcXVldWU6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbl9xdWV1ZS5wb3AoKQotICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRva2VucykKLQotICAgIGRlZiBfQWRkQmFja1Rva2VuKHNlbGYsIHRva2VuKToKLSAgICAgICAgaWYgdG9rZW4ud2hlbmNlID09IHRva2VuaXplLldIRU5DRV9TVFJFQU06Ci0gICAgICAgICAgICB0b2tlbi53aGVuY2UgPSB0b2tlbml6ZS5XSEVOQ0VfUVVFVUUKLSAgICAgICAgICAgIHNlbGYudG9rZW5fcXVldWUuaW5zZXJ0KDAsIHRva2VuKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYXNzZXJ0IHRva2VuLndoZW5jZSA9PSB0b2tlbml6ZS5XSEVOQ0VfUVVFVUUsIHRva2VuCi0gICAgICAgICAgICBzZWxmLnRva2VuX3F1ZXVlLmFwcGVuZCh0b2tlbikKLQotICAgIGRlZiBfQWRkQmFja1Rva2VucyhzZWxmLCB0b2tlbnMpOgotICAgICAgICBpZiB0b2tlbnM6Ci0gICAgICAgICAgICBpZiB0b2tlbnNbLTFdLndoZW5jZSA9PSB0b2tlbml6ZS5XSEVOQ0VfU1RSRUFNOgotICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuLndoZW5jZSA9IHRva2VuaXplLldIRU5DRV9RVUVVRQotICAgICAgICAgICAgICAgIHNlbGYudG9rZW5fcXVldWVbOjBdID0gcmV2ZXJzZWQodG9rZW5zKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW5zWy0xXS53aGVuY2UgPT0gdG9rZW5pemUuV0hFTkNFX1FVRVVFLCB0b2tlbnMKLSAgICAgICAgICAgICAgICBzZWxmLnRva2VuX3F1ZXVlLmV4dGVuZChyZXZlcnNlZCh0b2tlbnMpKQotCi0gICAgZGVmIEdldE5hbWUoc2VsZiwgc2VxPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm5zIChbdG9rZW5zXSwgbmV4dF90b2tlbl9pbmZvKS4iIiIKLSAgICAgICAgR2V0TmV4dFRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuCi0gICAgICAgIGlmIHNlcSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGl0ID0gaXRlcihzZXEpCi0gICAgICAgICAgICBHZXROZXh0VG9rZW4gPSBsYW1iZGE6IG5leHQoaXQpCi0gICAgICAgIG5leHRfdG9rZW4gPSBHZXROZXh0VG9rZW4oKQotICAgICAgICB0b2tlbnMgPSBbXQotICAgICAgICBsYXN0X3Rva2VuX3dhc19uYW1lID0gRmFsc2UKLSAgICAgICAgd2hpbGUgKG5leHRfdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIG9yCi0gICAgICAgICAgICAgICAobmV4dF90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQKLSAgICAgICAgICAgICAgICBuZXh0X3Rva2VuLm5hbWUgaW4gKCc6OicsICc8JykpKToKLSAgICAgICAgICAgICMgVHdvIE5BTUVzIGluIGEgcm93IG1lYW5zIHRoZSBpZGVudGlmaWVyIHNob3VsZCB0ZXJtaW5hdGUuCi0gICAgICAgICAgICAjIEl0J3MgcHJvYmFibHkgc29tZSBzb3J0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgaWYgbGFzdF90b2tlbl93YXNfbmFtZSBhbmQgbmV4dF90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUU6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGxhc3RfdG9rZW5fd2FzX25hbWUgPSBuZXh0X3Rva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRQotICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChuZXh0X3Rva2VuKQotICAgICAgICAgICAgIyBIYW5kbGUgdGVtcGxhdGVkIG5hbWVzLgotICAgICAgICAgICAgaWYgbmV4dF90b2tlbi5uYW1lID09ICc8JzoKLSAgICAgICAgICAgICAgICB0b2tlbnMuZXh0ZW5kKHNlbGYuX0dldE1hdGNoaW5nQ2hhcignPCcsICc+JywgR2V0TmV4dFRva2VuKSkKLSAgICAgICAgICAgICAgICBsYXN0X3Rva2VuX3dhc19uYW1lID0gVHJ1ZQotICAgICAgICAgICAgbmV4dF90b2tlbiA9IEdldE5leHRUb2tlbigpCi0gICAgICAgIHJldHVybiB0b2tlbnMsIG5leHRfdG9rZW4KLQotICAgIGRlZiBHZXRNZXRob2Qoc2VsZiwgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMpOgotICAgICAgICByZXR1cm5fdHlwZV9hbmRfbmFtZSA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnKCcpCi0gICAgICAgIGFzc2VydCBsZW4ocmV0dXJuX3R5cGVfYW5kX25hbWUpID49IDEKLSAgICAgICAgcmV0dXJuIHNlbGYuX0dldE1ldGhvZChyZXR1cm5fdHlwZV9hbmRfbmFtZSwgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpCi0KLSAgICBkZWYgX0dldE1ldGhvZChzZWxmLCByZXR1cm5fdHlwZV9hbmRfbmFtZSwgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgZ2V0X3BhcmVuKToKLSAgICAgICAgdGVtcGxhdGVfcG9ydGlvbiA9IE5vbmUKLSAgICAgICAgaWYgZ2V0X3BhcmVuOgotICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuU1lOVEFYLCB0b2tlbgotICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSAnPCc6Ci0gICAgICAgICAgICAgICAgIyBIYW5kbGUgdGVtcGxhdGl6ZWQgZHRvcnMuCi0gICAgICAgICAgICAgICAgdGVtcGxhdGVfcG9ydGlvbiA9IFt0b2tlbl0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9wb3J0aW9uLmV4dGVuZChzZWxmLl9HZXRNYXRjaGluZ0NoYXIoJzwnLCAnPicpKQotICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKLSAgICAgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgdG9rZW4KLSAgICAgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICcoJywgdG9rZW4KLQotICAgICAgICBuYW1lID0gcmV0dXJuX3R5cGVfYW5kX25hbWUucG9wKCkKLSAgICAgICAgIyBIYW5kbGUgdGVtcGxhdGl6ZWQgY3RvcnMuCi0gICAgICAgIGlmIG5hbWUubmFtZSA9PSAnPic6Ci0gICAgICAgICAgICBpbmRleCA9IDEKLSAgICAgICAgICAgIHdoaWxlIHJldHVybl90eXBlX2FuZF9uYW1lW2luZGV4XS5uYW1lICE9ICc8JzoKLSAgICAgICAgICAgICAgICBpbmRleCArPSAxCi0gICAgICAgICAgICB0ZW1wbGF0ZV9wb3J0aW9uID0gcmV0dXJuX3R5cGVfYW5kX25hbWVbaW5kZXg6XSArIFtuYW1lXQotICAgICAgICAgICAgZGVsIHJldHVybl90eXBlX2FuZF9uYW1lW2luZGV4Ol0KLSAgICAgICAgICAgIG5hbWUgPSByZXR1cm5fdHlwZV9hbmRfbmFtZS5wb3AoKQotICAgICAgICBlbGlmIG5hbWUubmFtZSA9PSAnXSc6Ci0gICAgICAgICAgICBydCA9IHJldHVybl90eXBlX2FuZF9uYW1lCi0gICAgICAgICAgICBhc3NlcnQgcnRbLTFdLm5hbWUgPT0gJ1snLCByZXR1cm5fdHlwZV9hbmRfbmFtZQotICAgICAgICAgICAgYXNzZXJ0IHJ0Wy0yXS5uYW1lID09ICdvcGVyYXRvcicsIHJldHVybl90eXBlX2FuZF9uYW1lCi0gICAgICAgICAgICBuYW1lX3NlcSA9IHJldHVybl90eXBlX2FuZF9uYW1lWy0yOl0KLSAgICAgICAgICAgIGRlbCByZXR1cm5fdHlwZV9hbmRfbmFtZVstMjpdCi0gICAgICAgICAgICBuYW1lID0gdG9rZW5pemUuVG9rZW4odG9rZW5pemUuTkFNRSwgJ29wZXJhdG9yW10nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc2VxWzBdLnN0YXJ0LCBuYW1lLmVuZCkKLSAgICAgICAgICAgICMgR2V0IHRoZSBvcGVuIHBhcmVuIHNvIF9HZXRQYXJhbWV0ZXJzKCkgYmVsb3cgd29ya3MuCi0gICAgICAgICAgICB1bnVzZWRfb3Blbl9wYXJlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0KLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogc3RvcmUgdGVtcGxhdGVfcG9ydGlvbi4KLSAgICAgICAgcmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZV9hbmRfbmFtZQotICAgICAgICBpbmRpY2VzID0gbmFtZQotICAgICAgICBpZiByZXR1cm5fdHlwZToKLSAgICAgICAgICAgIGluZGljZXMgPSByZXR1cm5fdHlwZVswXQotCi0gICAgICAgICMgRm9yY2UgY3RvciBmb3IgdGVtcGxhdGl6ZWQgY3RvcnMuCi0gICAgICAgIGlmIG5hbWUubmFtZSA9PSBzZWxmLmluX2NsYXNzIGFuZCBub3QgbW9kaWZpZXJzOgotICAgICAgICAgICAgbW9kaWZpZXJzIHw9IEZVTkNUSU9OX0NUT1IKLSAgICAgICAgcGFyYW1ldGVycyA9IGxpc3Qoc2VsZi5fR2V0UGFyYW1ldGVycygpKQotICAgICAgICBkZWwgcGFyYW1ldGVyc1stMV0gICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICcpJy4KLQotICAgICAgICAjIEhhbmRsaW5nIG9wZXJhdG9yKCkgaXMgZXNwZWNpYWxseSB3ZWlyZC4KLSAgICAgICAgaWYgbmFtZS5uYW1lID09ICdvcGVyYXRvcicgYW5kIG5vdCBwYXJhbWV0ZXJzOgotICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgYXNzZXJ0IHRva2VuLm5hbWUgPT0gJygnLCB0b2tlbgotICAgICAgICAgICAgcGFyYW1ldGVycyA9IGxpc3Qoc2VsZi5fR2V0UGFyYW1ldGVycygpKQotICAgICAgICAgICAgZGVsIHBhcmFtZXRlcnNbLTFdICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICcpJy4KLQotICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgIHdoaWxlIHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKLSAgICAgICAgICAgIG1vZGlmaWVyX3Rva2VuID0gdG9rZW4KLSAgICAgICAgICAgIHRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKLSAgICAgICAgICAgIGlmIG1vZGlmaWVyX3Rva2VuLm5hbWUgPT0gJ2NvbnN0JzoKLSAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gRlVOQ1RJT05fQ09OU1QKLSAgICAgICAgICAgIGVsaWYgbW9kaWZpZXJfdG9rZW4ubmFtZSA9PSAnX19hdHRyaWJ1dGVfXyc6Ci0gICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG1vcmUgX19hdHRyaWJ1dGVfXyBkZXRhaWxzLgotICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBGVU5DVElPTl9BVFRSSUJVVEUKLSAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnKCcsIHRva2VuCi0gICAgICAgICAgICAgICAgIyBDb25zdW1lIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgKHBhcmVucykuCi0gICAgICAgICAgICAgICAgdW51c2VkX3Rva2VucyA9IGxpc3Qoc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCcoJywgJyknKSkKLSAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgICAgICBlbGlmIG1vZGlmaWVyX3Rva2VuLm5hbWUgPT0gJ3Rocm93JzoKLSAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gRlVOQ1RJT05fVEhST1cKLSAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnKCcsIHRva2VuCi0gICAgICAgICAgICAgICAgIyBDb25zdW1lIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgKHBhcmVucykuCi0gICAgICAgICAgICAgICAgdW51c2VkX3Rva2VucyA9IGxpc3Qoc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCcoJywgJyknKSkKLSAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgICAgICBlbGlmIG1vZGlmaWVyX3Rva2VuLm5hbWUgPT0gJ292ZXJyaWRlJzoKLSAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gRlVOQ1RJT05fT1ZFUlJJREUKLSAgICAgICAgICAgIGVsaWYgbW9kaWZpZXJfdG9rZW4ubmFtZSA9PSBtb2RpZmllcl90b2tlbi5uYW1lLnVwcGVyKCk6Ci0gICAgICAgICAgICAgICAgIyBIQUNLKG5ub3J3aXR6KTogIGFzc3VtZSB0aGF0IGFsbCB1cHBlci1jYXNlIG5hbWVzCi0gICAgICAgICAgICAgICAgIyBhcmUgc29tZSBtYWNybyB3ZSBhcmVuJ3QgZXhwYW5kaW5nLgotICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBGVU5DVElPTl9VTktOT1dOX0FOTk9UQVRJT04KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5IYW5kbGVFcnJvcigndW5leHBlY3RlZCB0b2tlbicsIG1vZGlmaWVyX3Rva2VuKQotCi0gICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgdG9rZW4KLSAgICAgICAgIyBIYW5kbGUgY3RvciBpbml0aWFsaXplcnMuCi0gICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJzonOgotICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogYW55dGhpbmcgZWxzZSB0byBoYW5kbGUgZm9yIGluaXRpYWxpemVyIGxpc3Q/Ci0gICAgICAgICAgICB3aGlsZSB0b2tlbi5uYW1lICE9ICc7JyBhbmQgdG9rZW4ubmFtZSAhPSAneyc6Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotCi0gICAgICAgICMgSGFuZGxlIHBvaW50ZXIgdG8gZnVuY3Rpb25zIHRoYXQgYXJlIHJlYWxseSBkYXRhIGJ1dCBsb29rCi0gICAgICAgICMgbGlrZSBtZXRob2QgZGVjbGFyYXRpb25zLgotICAgICAgICBpZiB0b2tlbi5uYW1lID09ICcoJzoKLSAgICAgICAgICAgIGlmIHBhcmFtZXRlcnNbMF0ubmFtZSA9PSAnKic6Ci0gICAgICAgICAgICAgICAgIyBuYW1lIGNvbnRhaW5zIHRoZSByZXR1cm4gdHlwZS4KLSAgICAgICAgICAgICAgICBuYW1lID0gcGFyYW1ldGVycy5wb3AoKQotICAgICAgICAgICAgICAgICMgcGFyYW1ldGVycyBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBbcC5uYW1lIGZvciBwIGluIHBhcmFtZXRlcnNdCi0gICAgICAgICAgICAgICAgIyBBbHJlYWR5IGF0IHRoZSAoIHRvIG9wZW4gdGhlIHBhcmFtZXRlciBsaXN0LgotICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3BhcmFtZXRlcnMgPSBsaXN0KHNlbGYuX0dldE1hdGNoaW5nQ2hhcignKCcsICcpJykpCi0gICAgICAgICAgICAgICAgZGVsIGZ1bmN0aW9uX3BhcmFtZXRlcnNbLTFdICAjIFJlbW92ZSB0cmFpbGluZyAnKScuCi0gICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogc3RvcmUgdGhlIGZ1bmN0aW9uX3BhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgdG9rZW4KLSAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnOycsIHRva2VuCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZVZhcmlhYmxlKGluZGljZXMsIG5hbWUubmFtZSwgaW5kaWNlcy5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsICcnLCBOb25lKQotICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50LCB3ZSBnb3Qgc29tZXRoaW5nIGxpa2U6Ci0gICAgICAgICAgICAjICByZXR1cm5fdHlwZSAodHlwZTo6Km5hbWVfKShwYXJhbXMpOwotICAgICAgICAgICAgIyBUaGlzIGlzIGEgZGF0YSBtZW1iZXIgY2FsbGVkIG5hbWVfIHRoYXQgaXMgYSBmdW5jdGlvbiBwb2ludGVyLgotICAgICAgICAgICAgIyBXaXRoIHRoaXMgY29kZTogdm9pZCAoc3FfdHlwZTo6KmZpZWxkXykoc3RyaW5nJik7Ci0gICAgICAgICAgICAjIFdlIGdldDogbmFtZT12b2lkIHJldHVybl90eXBlPVtdIHBhcmFtZXRlcnM9c3FfdHlwZSAuLi4gZmllbGRfCi0gICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpcyByZXR1cm5fdHlwZSBhbHdheXMgZW1wdHk/Ci0gICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiB0aGlzIGlzbid0IGV2ZW4gY2xvc2UgdG8gYmVpbmcgY29ycmVjdC4KLSAgICAgICAgICAgICMgSnVzdCBwdXQgaW4gc29tZXRoaW5nIHNvIHdlIGRvbid0IGNyYXNoIGFuZCBjYW4gbW92ZSBvbi4KLSAgICAgICAgICAgIHJlYWxfbmFtZSA9IHBhcmFtZXRlcnNbLTFdCi0gICAgICAgICAgICBtb2RpZmllcnMgPSBbcC5uYW1lIGZvciBwIGluIHNlbGYuX0dldFBhcmFtZXRlcnMoKV0KLSAgICAgICAgICAgIGRlbCBtb2RpZmllcnNbLTFdICAgICAgICAgICAjIFJlbW92ZSB0cmFpbGluZyAnKScuCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fQ3JlYXRlVmFyaWFibGUoaW5kaWNlcywgcmVhbF9uYW1lLm5hbWUsIGluZGljZXMubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsICcnLCBOb25lKQotCi0gICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ3snOgotICAgICAgICAgICAgYm9keSA9IGxpc3Qoc2VsZi5HZXRTY29wZSgpKQotICAgICAgICAgICAgZGVsIGJvZHlbLTFdICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICd9Jy4KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGJvZHkgPSBOb25lCi0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc9JzoKLSAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0KLSAgICAgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICdkZWZhdWx0JyBvciB0b2tlbi5uYW1lID09ICdkZWxldGUnOgotICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSBleHBsaWNpdGx5IGRlZmF1bHRlZCBhbmQgZGVsZXRlZCBzcGVjaWFsIG1lbWJlcnMKLSAgICAgICAgICAgICAgICAgICAgIyBpbiBDKysxMS4KLSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIHB1cmUtdmlydHVhbCBkZWNsYXJhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLkNPTlNUQU5ULCB0b2tlbgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnMCcsIHRva2VuCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBGVU5DVElPTl9QVVJFX1ZJUlRVQUwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotCi0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICdbJzoKLSAgICAgICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiBzdG9yZSB0b2tlbnMgYW5kIGltcHJvdmUgcGFyc2luZy4KLSAgICAgICAgICAgICAgICAjIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4gY2hhciAoJkFTSChUICgmc2VxKVtOXSkpW05dOwotICAgICAgICAgICAgICAgIHRva2VucyA9IGxpc3Qoc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCdbJywgJ10nKSkKLSAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0KLSAgICAgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICc7JywgKHRva2VuLCByZXR1cm5fdHlwZV9hbmRfbmFtZSwgcGFyYW1ldGVycykKLQotICAgICAgICAjIExvb2tzIGxpa2Ugd2UgZ290IGEgbWV0aG9kLCBub3QgYSBmdW5jdGlvbi4KLSAgICAgICAgaWYgbGVuKHJldHVybl90eXBlKSA+IDIgYW5kIHJldHVybl90eXBlWy0xXS5uYW1lID09ICc6Oic6Ci0gICAgICAgICAgICByZXR1cm5fdHlwZSwgaW5fY2xhc3MgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fR2V0UmV0dXJuVHlwZUFuZENsYXNzTmFtZShyZXR1cm5fdHlwZSkKLSAgICAgICAgICAgIHJldHVybiBNZXRob2QoaW5kaWNlcy5zdGFydCwgaW5kaWNlcy5lbmQsIG5hbWUubmFtZSwgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl90eXBlLCBwYXJhbWV0ZXJzLCBtb2RpZmllcnMsIHRlbXBsYXRlZF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCi0gICAgICAgIHJldHVybiBGdW5jdGlvbihpbmRpY2VzLnN0YXJ0LCBpbmRpY2VzLmVuZCwgbmFtZS5uYW1lLCByZXR1cm5fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIG1vZGlmaWVycywgdGVtcGxhdGVkX3R5cGVzLCBib2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCi0KLSAgICBkZWYgX0dldFJldHVyblR5cGVBbmRDbGFzc05hbWUoc2VsZiwgdG9rZW5fc2VxKToKLSAgICAgICAgIyBTcGxpdHRpbmcgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGNsYXNzIG5hbWUgaW4gYSBtZXRob2QKLSAgICAgICAgIyBjYW4gYmUgdHJpY2t5LiAgRm9yIGV4YW1wbGUsIFJldHVybjo6VHlwZTo6SXM6OkhhcmQ6OlRvOjpGaW5kKCkuCi0gICAgICAgICMgV2hlcmUgaXMgdGhlIHJldHVybiB0eXBlIGFuZCB3aGVyZSBpcyB0aGUgY2xhc3MgbmFtZT8KLSAgICAgICAgIyBUaGUgaGV1cmlzdGljIHVzZWQgaXMgdG8gcHVsbCB0aGUgbGFzdCBuYW1lIGFzIHRoZSBjbGFzcyBuYW1lLgotICAgICAgICAjIFRoaXMgaW5jbHVkZXMgYWxsIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpbmZvLgotICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpZiB0aGVyZSBpcyBvbmx5IE9uZSBuYW1lIGxpa2UgaW4gdGhlCi0gICAgICAgICMgZXhhbXBsZSBhYm92ZSwgcHVudCBhbmQgYXNzdW1lIHRoZSBsYXN0IGJpdCBpcyB0aGUgY2xhc3MgbmFtZS4KLQotICAgICAgICAjIElnbm9yZSBhIDo6IHByZWZpeCwgaWYgZXhpc3RzIHNvIHdlIGNhbiBmaW5kIHRoZSBmaXJzdCByZWFsIG5hbWUuCi0gICAgICAgIGkgPSAwCi0gICAgICAgIGlmIHRva2VuX3NlcVswXS5uYW1lID09ICc6Oic6Ci0gICAgICAgICAgICBpID0gMQotICAgICAgICAjIElnbm9yZSBhIDo6IHN1ZmZpeCwgaWYgZXhpc3RzLgotICAgICAgICBlbmQgPSBsZW4odG9rZW5fc2VxKSAtIDEKLSAgICAgICAgaWYgdG9rZW5fc2VxW2VuZC0xXS5uYW1lID09ICc6Oic6Ci0gICAgICAgICAgICBlbmQgLT0gMQotCi0gICAgICAgICMgTWFrZSBhIGNvcHkgb2YgdGhlIHNlcXVlbmNlIHNvIHdlIGNhbiBhcHBlbmQgYSBzZW50aW5lbAotICAgICAgICAjIHZhbHVlLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBHZXROYW1lIHdpbGwgaGFzIHRvIGhhdmUgc29tZQotICAgICAgICAjIHRlcm1pbmF0aW5nIGNvbmRpdGlvbiBiZXlvbmQgdGhlIGxhc3QgbmFtZS4KLSAgICAgICAgc2VxX2NvcHkgPSB0b2tlbl9zZXFbaTplbmRdCi0gICAgICAgIHNlcV9jb3B5LmFwcGVuZCh0b2tlbml6ZS5Ub2tlbih0b2tlbml6ZS5TWU5UQVgsICcnLCAwLCAwKSkKLSAgICAgICAgbmFtZXMgPSBbXQotICAgICAgICB3aGlsZSBpIDwgZW5kOgotICAgICAgICAgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHNlcXVlbmNlIHBhcnNpbmcgb3V0IGVhY2ggbmFtZS4KLSAgICAgICAgICAgIG5ld19uYW1lLCBuZXh0ID0gc2VsZi5HZXROYW1lKHNlcV9jb3B5W2k6XSkKLSAgICAgICAgICAgIGFzc2VydCBuZXdfbmFtZSwgJ0dvdCBlbXB0eSBuZXdfbmFtZSwgbmV4dD0lcycgJSBuZXh0Ci0gICAgICAgICAgICAjIFdlIGdvdCBhIHBvaW50ZXIgb3IgcmVmLiAgQWRkIGl0IHRvIHRoZSBuYW1lLgotICAgICAgICAgICAgaWYgbmV4dCBhbmQgbmV4dC50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWDoKLSAgICAgICAgICAgICAgICBuZXdfbmFtZS5hcHBlbmQobmV4dCkKLSAgICAgICAgICAgIG5hbWVzLmFwcGVuZChuZXdfbmFtZSkKLSAgICAgICAgICAgIGkgKz0gbGVuKG5ld19uYW1lKQotCi0gICAgICAgICMgTm93IHRoYXQgd2UgaGF2ZSB0aGUgbmFtZXMsIGl0J3MgdGltZSB0byB1bmRvIHdoYXQgd2UgZGlkLgotCi0gICAgICAgICMgUmVtb3ZlIHRoZSBzZW50aW5lbCB2YWx1ZS4KLSAgICAgICAgbmFtZXNbLTFdLnBvcCgpCi0gICAgICAgICMgRmxhdHRlbiB0aGUgdG9rZW4gc2VxdWVuY2UgZm9yIHRoZSByZXR1cm4gdHlwZS4KLSAgICAgICAgcmV0dXJuX3R5cGUgPSBbZSBmb3Igc2VxIGluIG5hbWVzWzotMV0gZm9yIGUgaW4gc2VxXQotICAgICAgICAjIFRoZSBjbGFzcyBuYW1lIGlzIHRoZSBsYXN0IG5hbWUuCi0gICAgICAgIGNsYXNzX25hbWUgPSBuYW1lc1stMV0KLSAgICAgICAgcmV0dXJuIHJldHVybl90eXBlLCBjbGFzc19uYW1lCi0KLSAgICBkZWYgaGFuZGxlX2Jvb2woc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfY2hhcihzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9pbnQoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfbG9uZyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9zaG9ydChzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9kb3VibGUoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfZmxvYXQoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfdm9pZChzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV93Y2hhcl90KHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX3Vuc2lnbmVkKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX3NpZ25lZChzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIF9HZXROZXN0ZWRUeXBlKHNlbGYsIGN0b3IpOgotICAgICAgICBuYW1lID0gTm9uZQotICAgICAgICBuYW1lX3Rva2VucywgdG9rZW4gPSBzZWxmLkdldE5hbWUoKQotICAgICAgICBpZiBuYW1lX3Rva2VuczoKLSAgICAgICAgICAgIG5hbWUgPSAnJy5qb2luKFt0Lm5hbWUgZm9yIHQgaW4gbmFtZV90b2tlbnNdKQotCi0gICAgICAgICMgSGFuZGxlIGZvcndhcmQgZGVjbGFyYXRpb25zLgotICAgICAgICBpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQgdG9rZW4ubmFtZSA9PSAnOyc6Ci0gICAgICAgICAgICByZXR1cm4gY3Rvcih0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCBuYW1lLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCi0KLSAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIGFuZCBzZWxmLl9oYW5kbGluZ190eXBlZGVmOgotICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHRva2VuKQotICAgICAgICAgICAgcmV0dXJuIGN0b3IodG9rZW4uc3RhcnQsIHRva2VuLmVuZCwgbmFtZSwgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrKQotCi0gICAgICAgICMgTXVzdCBiZSB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLSAgICAgICAgZmllbGRzID0gbGlzdChzZWxmLl9HZXRNYXRjaGluZ0NoYXIoJ3snLCAnfScpKQotICAgICAgICBkZWwgZmllbGRzWy0xXSAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICd9Jy4KLSAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kIHRva2VuLm5hbWUgPT0gJ3snOgotICAgICAgICAgICAgbmV4dCA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgICAgICBuZXdfdHlwZSA9IGN0b3IodG9rZW4uc3RhcnQsIHRva2VuLmVuZCwgbmFtZSwgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrKQotICAgICAgICAgICAgIyBBIG5hbWUgbWVhbnMgdGhpcyBpcyBhbiBhbm9ueW1vdXMgdHlwZSBhbmQgdGhlIG5hbWUKLSAgICAgICAgICAgICMgaXMgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgaWYgbmV4dC50b2tlbl90eXBlICE9IHRva2VuaXplLk5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld190eXBlCi0gICAgICAgICAgICBuYW1lID0gbmV3X3R5cGUKLSAgICAgICAgICAgIHRva2VuID0gbmV4dAotCi0gICAgICAgICMgTXVzdCBiZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB1c2luZyB0aGUgdHlwZSBwcmVmaXhlZCB3aXRoIGtleXdvcmQuCi0gICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUUsIHRva2VuCi0gICAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVWYXJpYWJsZSh0b2tlbiwgdG9rZW4ubmFtZSwgbmFtZSwgW10sICcnLCBOb25lKQotCi0gICAgZGVmIGhhbmRsZV9zdHJ1Y3Qoc2VsZik6Ci0gICAgICAgICMgU3BlY2lhbCBjYXNlIHRoZSBoYW5kbGluZyB0eXBlZGVmL2FsaWFzaW5nIG9mIHN0cnVjdHMgaGVyZS4KLSAgICAgICAgIyBJdCB3b3VsZCBiZSBhIHBhaW4gdG8gaGFuZGxlIGluIHRoZSBjbGFzcyBjb2RlLgotICAgICAgICBuYW1lX3Rva2VucywgdmFyX3Rva2VuID0gc2VsZi5HZXROYW1lKCkKLSAgICAgICAgaWYgbmFtZV90b2tlbnM6Ci0gICAgICAgICAgICBuZXh0X3Rva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKLSAgICAgICAgICAgIGlzX3N5bnRheCA9ICh2YXJfdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3Rva2VuLm5hbWVbMF0gaW4gJyomJykKLSAgICAgICAgICAgIGlzX3ZhcmlhYmxlID0gKHZhcl90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3Rva2VuLm5hbWUgPT0gJzsnKQotICAgICAgICAgICAgdmFyaWFibGUgPSB2YXJfdG9rZW4KLSAgICAgICAgICAgIGlmIGlzX3N5bnRheCBhbmQgbm90IGlzX3ZhcmlhYmxlOgotICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gbmV4dF90b2tlbgotICAgICAgICAgICAgICAgIHRlbXAgPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgIGlmIHRlbXAudG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kIHRlbXAubmFtZSA9PSAnKCc6Ci0gICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIG1ldGhvZHMgZGVjbGFyZWQgdG8gcmV0dXJuIGEgc3RydWN0LgotICAgICAgICAgICAgICAgICAgICB0MCA9IG5hbWVfdG9rZW5zWzBdCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCA9IHRva2VuaXplLlRva2VuKHRva2VuaXplLk5BTUUsICdzdHJ1Y3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MC5zdGFydC03LCB0MC5zdGFydC0yKQotICAgICAgICAgICAgICAgICAgICB0eXBlX2FuZF9uYW1lID0gW3N0cnVjdF0KLSAgICAgICAgICAgICAgICAgICAgdHlwZV9hbmRfbmFtZS5leHRlbmQobmFtZV90b2tlbnMpCi0gICAgICAgICAgICAgICAgICAgIHR5cGVfYW5kX25hbWUuZXh0ZW5kKCh2YXJfdG9rZW4sIG5leHRfdG9rZW4pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWV0aG9kKHR5cGVfYW5kX25hbWUsIDAsIE5vbmUsIEZhbHNlKQotICAgICAgICAgICAgICAgIGFzc2VydCB0ZW1wLm5hbWUgPT0gJzsnLCAodGVtcCwgbmFtZV90b2tlbnMsIHZhcl90b2tlbikKLSAgICAgICAgICAgIGlmIGlzX3N5bnRheCBvciAoaXNfdmFyaWFibGUgYW5kIG5vdCBzZWxmLl9oYW5kbGluZ190eXBlZGVmKToKLSAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBbJ3N0cnVjdCddCi0gICAgICAgICAgICAgICAgdHlwZV9uYW1lID0gJycuam9pbihbdC5uYW1lIGZvciB0IGluIG5hbWVfdG9rZW5zXSkKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG5hbWVfdG9rZW5zWzBdCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZVZhcmlhYmxlKHBvc2l0aW9uLCB2YXJpYWJsZS5uYW1lLCB0eXBlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdmFyX3Rva2VuLm5hbWUsIE5vbmUpCi0gICAgICAgICAgICBuYW1lX3Rva2Vucy5leHRlbmQoKHZhcl90b2tlbiwgbmV4dF90b2tlbikpCi0gICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW5zKG5hbWVfdG9rZW5zKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHZhcl90b2tlbikKLSAgICAgICAgcmV0dXJuIHNlbGYuX0dldENsYXNzKFN0cnVjdCwgVklTSUJJTElUWV9QVUJMSUMsIE5vbmUpCi0KLSAgICBkZWYgaGFuZGxlX3VuaW9uKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fR2V0TmVzdGVkVHlwZShVbmlvbikKLQotICAgIGRlZiBoYW5kbGVfZW51bShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX0dldE5lc3RlZFR5cGUoRW51bSkKLQotICAgIGRlZiBoYW5kbGVfYXV0byhzZWxmKToKLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogd2FybiBhYm91dCB1c2luZyBhdXRvPyAgUHJvYmFibHkgbm90IHNpbmNlIGl0Ci0gICAgICAgICMgd2lsbCBiZSByZWNsYWltZWQgYW5kIHVzZWZ1bCBmb3IgQysrMHguCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfcmVnaXN0ZXIoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfY29uc3Qoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfaW5saW5lKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX2V4dGVybihzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9zdGF0aWMoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfdmlydHVhbChzZWxmKToKLSAgICAgICAgIyBXaGF0IGZvbGxvd3MgbXVzdCBiZSBhIG1ldGhvZC4KLSAgICAgICAgdG9rZW4gPSB0b2tlbjIgPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICBpZiB0b2tlbi5uYW1lID09ICdpbmxpbmUnOgotICAgICAgICAgICAgIyBIQUNLKG5ub3J3aXR6KTogaGFuZGxlIGlubGluZSBkdG9ycyBieSBpZ25vcmluZyAnaW5saW5lJy4KLSAgICAgICAgICAgIHRva2VuMiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgIGlmIHRva2VuMi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQgdG9rZW4yLm5hbWUgPT0gJ34nOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2V0TWV0aG9kKEZVTkNUSU9OX1ZJUlRVQUwgKyBGVU5DVElPTl9EVE9SLCBOb25lKQotICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIG9yIHRva2VuLm5hbWUgPT0gJzo6JywgdG9rZW4KLSAgICAgICAgcmV0dXJuX3R5cGVfYW5kX25hbWUgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJygnKSAgIyApCi0gICAgICAgIHJldHVybl90eXBlX2FuZF9uYW1lLmluc2VydCgwLCB0b2tlbikKLSAgICAgICAgaWYgdG9rZW4yIGlzIG5vdCB0b2tlbjoKLSAgICAgICAgICAgIHJldHVybl90eXBlX2FuZF9uYW1lLmluc2VydCgxLCB0b2tlbjIpCi0gICAgICAgIHJldHVybiBzZWxmLl9HZXRNZXRob2QocmV0dXJuX3R5cGVfYW5kX25hbWUsIEZVTkNUSU9OX1ZJUlRVQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgRmFsc2UpCi0KLSAgICBkZWYgaGFuZGxlX3ZvbGF0aWxlKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX211dGFibGUoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfcHVibGljKHNlbGYpOgotICAgICAgICBhc3NlcnQgc2VsZi5pbl9jbGFzcwotICAgICAgICBzZWxmLnZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BVQkxJQwotCi0gICAgZGVmIGhhbmRsZV9wcm90ZWN0ZWQoc2VsZik6Ci0gICAgICAgIGFzc2VydCBzZWxmLmluX2NsYXNzCi0gICAgICAgIHNlbGYudmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJPVEVDVEVECi0KLSAgICBkZWYgaGFuZGxlX3ByaXZhdGUoc2VsZik6Ci0gICAgICAgIGFzc2VydCBzZWxmLmluX2NsYXNzCi0gICAgICAgIHNlbGYudmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJJVkFURQotCi0gICAgZGVmIGhhbmRsZV9mcmllbmQoc2VsZik6Ci0gICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCi0gICAgICAgIGFzc2VydCB0b2tlbnMKLSAgICAgICAgdDAgPSB0b2tlbnNbMF0KLSAgICAgICAgcmV0dXJuIEZyaWVuZCh0MC5zdGFydCwgdDAuZW5kLCB0b2tlbnMsIHNlbGYubmFtZXNwYWNlX3N0YWNrKQotCi0gICAgZGVmIGhhbmRsZV9zdGF0aWNfY2FzdChzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9jb25zdF9jYXN0KHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX2R5bmFtaWNfY2FzdChzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9yZWludGVycHJldF9jYXN0KHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX25ldyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9kZWxldGUoc2VsZik6Ci0gICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCi0gICAgICAgIGFzc2VydCB0b2tlbnMKLSAgICAgICAgcmV0dXJuIERlbGV0ZSh0b2tlbnNbMF0uc3RhcnQsIHRva2Vuc1swXS5lbmQsIHRva2VucykKLQotICAgIGRlZiBoYW5kbGVfdHlwZWRlZihzZWxmKToKLSAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICBpZiAodG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIGFuZAotICAgICAgICAgICAga2V5d29yZHMuSXNLZXl3b3JkKHRva2VuLm5hbWUpKToKLSAgICAgICAgICAgICMgVG9rZW4gbXVzdCBiZSBzdHJ1Y3QvZW51bS91bmlvbi9jbGFzcy4KLSAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ2hhbmRsZV8nICsgdG9rZW4ubmFtZSkKLSAgICAgICAgICAgIHNlbGYuX2hhbmRsaW5nX3R5cGVkZWYgPSBUcnVlCi0gICAgICAgICAgICB0b2tlbnMgPSBbbWV0aG9kKCldCi0gICAgICAgICAgICBzZWxmLl9oYW5kbGluZ190eXBlZGVmID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRva2VucyA9IFt0b2tlbl0KLQotICAgICAgICAjIEdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0eXBlZGVmIHVwIHRvIHRoZSBzZW1pLWNvbG9uLgotICAgICAgICB0b2tlbnMuZXh0ZW5kKHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpKQotCi0gICAgICAgICMgVE9ETyhubm9yd2l0eik6IGNsZWFuIGFsbCB0aGlzIHVwLgotICAgICAgICBhc3NlcnQgdG9rZW5zCi0gICAgICAgIG5hbWUgPSB0b2tlbnMucG9wKCkKLSAgICAgICAgaW5kaWNlcyA9IG5hbWUKLSAgICAgICAgaWYgdG9rZW5zOgotICAgICAgICAgICAgaW5kaWNlcyA9IHRva2Vuc1swXQotICAgICAgICBpZiBub3QgaW5kaWNlczoKLSAgICAgICAgICAgIGluZGljZXMgPSB0b2tlbgotICAgICAgICBpZiBuYW1lLm5hbWUgPT0gJyknOgotICAgICAgICAgICAgIyBIQUNLKG5ub3J3aXR6KTogSGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyAicHJvcGVybHkiLgotICAgICAgICAgICAgaWYgKGxlbih0b2tlbnMpID49IDQgYW5kCi0gICAgICAgICAgICAgICAgdG9rZW5zWzFdLm5hbWUgPT0gJygnIGFuZCB0b2tlbnNbMl0ubmFtZSA9PSAnKicpOgotICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQobmFtZSkKLSAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5zWzNdCi0gICAgICAgIGVsaWYgbmFtZS5uYW1lID09ICddJzoKLSAgICAgICAgICAgICMgSEFDSyhubm9yd2l0eik6IEhhbmRsZSBhcnJheXMgcHJvcGVybHkuCi0gICAgICAgICAgICBpZiBsZW4odG9rZW5zKSA+PSAyOgotICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQobmFtZSkKLSAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5zWzFdCi0gICAgICAgIG5ld190eXBlID0gdG9rZW5zCi0gICAgICAgIGlmIHRva2VucyBhbmQgaXNpbnN0YW5jZSh0b2tlbnNbMF0sIHRva2VuaXplLlRva2VuKToKLSAgICAgICAgICAgIG5ld190eXBlID0gc2VsZi5jb252ZXJ0ZXIuVG9UeXBlKHRva2VucylbMF0KLSAgICAgICAgcmV0dXJuIFR5cGVkZWYoaW5kaWNlcy5zdGFydCwgaW5kaWNlcy5lbmQsIG5hbWUubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3X3R5cGUsIHNlbGYubmFtZXNwYWNlX3N0YWNrKQotCi0gICAgZGVmIGhhbmRsZV90eXBlaWQoc2VsZik6Ci0gICAgICAgIHBhc3MgICMgTm90IG5lZWRlZCB5ZXQuCi0KLSAgICBkZWYgaGFuZGxlX3R5cGVuYW1lKHNlbGYpOgotICAgICAgICBwYXNzICAjIE5vdCBuZWVkZWQgeWV0LgotCi0gICAgZGVmIF9HZXRUZW1wbGF0ZWRUeXBlcyhzZWxmKToKLSAgICAgICAgcmVzdWx0ID0ge30KLSAgICAgICAgdG9rZW5zID0gbGlzdChzZWxmLl9HZXRNYXRjaGluZ0NoYXIoJzwnLCAnPicpKQotICAgICAgICBsZW5fdG9rZW5zID0gbGVuKHRva2VucykgLSAxICAgICMgSWdub3JlIHRyYWlsaW5nICc+Jy4KLSAgICAgICAgaSA9IDAKLSAgICAgICAgd2hpbGUgaSA8IGxlbl90b2tlbnM6Ci0gICAgICAgICAgICBrZXkgPSB0b2tlbnNbaV0ubmFtZQotICAgICAgICAgICAgaSArPSAxCi0gICAgICAgICAgICBpZiBrZXl3b3Jkcy5Jc0tleXdvcmQoa2V5KSBvciBrZXkgPT0gJywnOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICB0eXBlX25hbWUgPSBkZWZhdWx0ID0gTm9uZQotICAgICAgICAgICAgaWYgaSA8IGxlbl90b2tlbnM6Ci0gICAgICAgICAgICAgICAgaSArPSAxCi0gICAgICAgICAgICAgICAgaWYgdG9rZW5zW2ktMV0ubmFtZSA9PSAnPSc6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgbGVuX3Rva2VucywgJyVzICVzJyAlIChpLCB0b2tlbnMpCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIHVudXNlZF9uZXh0X3Rva2VuID0gc2VsZi5HZXROYW1lKHRva2Vuc1tpOl0pCi0gICAgICAgICAgICAgICAgICAgIGkgKz0gbGVuKGRlZmF1bHQpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zW2ktMV0ubmFtZSAhPSAnLCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGdvdCBzb21ldGhpbmcgbGlrZTogVHlwZSB2YXJpYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICMgUmUtYWRqdXN0IHRoZSBrZXkgKHZhcmlhYmxlKSBhbmQgdHlwZV9uYW1lIChUeXBlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHRva2Vuc1tpLTFdLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSA9IHRva2Vuc1tpLTJdCi0KLSAgICAgICAgICAgIHJlc3VsdFtrZXldID0gKHR5cGVfbmFtZSwgZGVmYXVsdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgZGVmIGhhbmRsZV90ZW1wbGF0ZShzZWxmKToKLSAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVgsIHRva2VuCi0gICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICc8JywgdG9rZW4KLSAgICAgICAgdGVtcGxhdGVkX3R5cGVzID0gc2VsZi5fR2V0VGVtcGxhdGVkVHlwZXMoKQotICAgICAgICAjIFRPRE8obm5vcndpdHopOiBmb3Igbm93LCBqdXN0IGlnbm9yZSB0aGUgdGVtcGxhdGUgcGFyYW1zLgotICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgIGlmIHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKLSAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ2NsYXNzJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fR2V0Q2xhc3MoQ2xhc3MsIFZJU0lCSUxJVFlfUFJJVkFURSwgdGVtcGxhdGVkX3R5cGVzKQotICAgICAgICAgICAgZWxpZiB0b2tlbi5uYW1lID09ICdzdHJ1Y3QnOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9HZXRDbGFzcyhTdHJ1Y3QsIFZJU0lCSUxJVFlfUFVCTElDLCB0ZW1wbGF0ZWRfdHlwZXMpCi0gICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJ2ZyaWVuZCc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2ZyaWVuZCgpCi0gICAgICAgIHNlbGYuX0FkZEJhY2tUb2tlbih0b2tlbikKLSAgICAgICAgdG9rZW5zLCBsYXN0ID0gc2VsZi5fR2V0VmFyVG9rZW5zVXBUbyh0b2tlbml6ZS5TWU5UQVgsICcoJywgJzsnKQotICAgICAgICB0b2tlbnMuYXBwZW5kKGxhc3QpCi0gICAgICAgIHNlbGYuX0FkZEJhY2tUb2tlbnModG9rZW5zKQotICAgICAgICBpZiBsYXN0Lm5hbWUgPT0gJygnOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2V0TWV0aG9kKEZVTkNUSU9OX05PTkUsIHRlbXBsYXRlZF90eXBlcykKLSAgICAgICAgIyBNdXN0IGJlIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4KLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiBoYW5kbGVfdHJ1ZShzZWxmKToKLSAgICAgICAgcGFzcyAgIyBOb3RoaW5nIHRvIGRvLgotCi0gICAgZGVmIGhhbmRsZV9mYWxzZShzZWxmKToKLSAgICAgICAgcGFzcyAgIyBOb3RoaW5nIHRvIGRvLgotCi0gICAgZGVmIGhhbmRsZV9hc20oc2VsZik6Ci0gICAgICAgIHBhc3MgICMgTm90IG5lZWRlZCB5ZXQuCi0KLSAgICBkZWYgaGFuZGxlX2NsYXNzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fR2V0Q2xhc3MoQ2xhc3MsIFZJU0lCSUxJVFlfUFJJVkFURSwgTm9uZSkKLQotICAgIGRlZiBfR2V0QmFzZXMoc2VsZik6Ci0gICAgICAgICMgR2V0IGJhc2UgY2xhc3Nlcy4KLSAgICAgICAgYmFzZXMgPSBbXQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRSwgdG9rZW4KLSAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IHN0b3JlIGtpbmQgb2YgaW5oZXJpdGFuY2UuLi5tYXliZS4KLSAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgbm90IGluICgncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJyk6Ci0gICAgICAgICAgICAgICAgIyBJZiBpbmhlcml0YW5jZSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIHByaXZhdGUuCi0gICAgICAgICAgICAgICAgIyBKdXN0IHB1dCB0aGUgdG9rZW4gYmFjayBzbyB3ZSBjYW4gZm9ybSBhIG5hbWUuCi0gICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaXQgd291bGQgYmUgZ29vZCB0byB3YXJuIGFib3V0IHRoaXMuCi0gICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHRva2VuKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAjIENoZWNrIGZvciB2aXJ0dWFsIGluaGVyaXRhbmNlLgotICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKLSAgICAgICAgICAgICAgICBpZiB0b2tlbi5uYW1lICE9ICd2aXJ0dWFsJzoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHRva2VuKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IHN0b3JlIHRoYXQgd2UgZ290IHZpcnR1YWwgZm9yIHRoaXMgYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgYmFzZSwgbmV4dF90b2tlbiA9IHNlbGYuR2V0TmFtZSgpCi0gICAgICAgICAgICBiYXNlc19hc3QgPSBzZWxmLmNvbnZlcnRlci5Ub1R5cGUoYmFzZSkKLSAgICAgICAgICAgIGFzc2VydCBsZW4oYmFzZXNfYXN0KSA9PSAxLCBiYXNlc19hc3QKLSAgICAgICAgICAgIGJhc2VzLmFwcGVuZChiYXNlc19hc3RbMF0pCi0gICAgICAgICAgICBhc3NlcnQgbmV4dF90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgbmV4dF90b2tlbgotICAgICAgICAgICAgaWYgbmV4dF90b2tlbi5uYW1lID09ICd7JzoKLSAgICAgICAgICAgICAgICB0b2tlbiA9IG5leHRfdG9rZW4KLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgIyBTdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlLgotICAgICAgICAgICAgYXNzZXJ0IG5leHRfdG9rZW4ubmFtZSA9PSAnLCcsIG5leHRfdG9rZW4KLSAgICAgICAgcmV0dXJuIGJhc2VzLCB0b2tlbgotCi0gICAgZGVmIF9HZXRDbGFzcyhzZWxmLCBjbGFzc190eXBlLCB2aXNpYmlsaXR5LCB0ZW1wbGF0ZWRfdHlwZXMpOgotICAgICAgICBjbGFzc19uYW1lID0gTm9uZQotICAgICAgICBjbGFzc190b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgIGlmIGNsYXNzX3Rva2VuLnRva2VuX3R5cGUgIT0gdG9rZW5pemUuTkFNRToKLSAgICAgICAgICAgIGFzc2VydCBjbGFzc190b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgY2xhc3NfdG9rZW4KLSAgICAgICAgICAgIHRva2VuID0gY2xhc3NfdG9rZW4KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgU2tpcCBhbnkgbWFjcm8gKGUuZy4gc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJzKSBhZnRlciB0aGUKLSAgICAgICAgICAgICMgJ2NsYXNzJyBrZXl3b3JkLgotICAgICAgICAgICAgbmV4dF90b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgICAgICBpZiBuZXh0X3Rva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKLSAgICAgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW4obmV4dF90b2tlbikKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VucyhbY2xhc3NfdG9rZW4sIG5leHRfdG9rZW5dKQotICAgICAgICAgICAgbmFtZV90b2tlbnMsIHRva2VuID0gc2VsZi5HZXROYW1lKCkKLSAgICAgICAgICAgIGNsYXNzX25hbWUgPSAnJy5qb2luKFt0Lm5hbWUgZm9yIHQgaW4gbmFtZV90b2tlbnNdKQotICAgICAgICBiYXNlcyA9IE5vbmUKLSAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVg6Ci0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc7JzoKLSAgICAgICAgICAgICAgICAjIEZvcndhcmQgZGVjbGFyYXRpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzX3R5cGUoY2xhc3NfdG9rZW4uc3RhcnQsIGNsYXNzX3Rva2VuLmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lLCBOb25lLCB0ZW1wbGF0ZWRfdHlwZXMsIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCi0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lIGluICcqJic6Ci0gICAgICAgICAgICAgICAgIyBJbmxpbmUgZm9yd2FyZCBkZWNsYXJhdGlvbi4gIENvdWxkIGJlIG1ldGhvZCBvciBkYXRhLgotICAgICAgICAgICAgICAgIG5hbWVfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgIGlmIG5leHRfdG9rZW4ubmFtZSA9PSAnOyc6Ci0gICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzID0gWydjbGFzcyddCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVWYXJpYWJsZShjbGFzc190b2tlbiwgbmFtZV90b2tlbi5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdG9rZW4ubmFtZSwgTm9uZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIEFzc3VtZSB0aGlzIGlzIGEgbWV0aG9kLgotICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSAoY2xhc3NfdG9rZW4sIHRva2VuLCBuYW1lX3Rva2VuLCBuZXh0X3Rva2VuKQotICAgICAgICAgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW5zKHRva2VucykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2V0TWV0aG9kKEZVTkNUSU9OX05PTkUsIE5vbmUpCi0gICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc6JzoKLSAgICAgICAgICAgICAgICBiYXNlcywgdG9rZW4gPSBzZWxmLl9HZXRCYXNlcygpCi0KLSAgICAgICAgYm9keSA9IE5vbmUKLSAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kIHRva2VuLm5hbWUgPT0gJ3snOgotICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuU1lOVEFYLCB0b2tlbgotICAgICAgICAgICAgYXNzZXJ0IHRva2VuLm5hbWUgPT0gJ3snLCB0b2tlbgotCi0gICAgICAgICAgICBhc3QgPSBBc3RCdWlsZGVyKHNlbGYuR2V0U2NvcGUoKSwgc2VsZi5maWxlbmFtZSwgY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eSwgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCi0gICAgICAgICAgICBib2R5ID0gbGlzdChhc3QuR2VuZXJhdGUoKSkKLQotICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhbmRsaW5nX3R5cGVkZWY6Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAgICAgICAgIGlmIHRva2VuLnRva2VuX3R5cGUgIT0gdG9rZW5pemUuTkFNRToKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuU1lOVEFYLCB0b2tlbgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnOycsIHRva2VuCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbmV3X2NsYXNzID0gY2xhc3NfdHlwZShjbGFzc190b2tlbi5zdGFydCwgY2xhc3NfdG9rZW4uZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUsIGJhc2VzLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksIHNlbGYubmFtZXNwYWNlX3N0YWNrKQotCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IFtdCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVWYXJpYWJsZShjbGFzc190b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLm5hbWUsIG5ld19jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdG9rZW4ubmFtZSwgTm9uZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9oYW5kbGluZ190eXBlZGVmOgotICAgICAgICAgICAgICAgIHNlbGYuSGFuZGxlRXJyb3IoJ25vbi10eXBlZGVmIHRva2VuJywgdG9rZW4pCi0gICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW4odG9rZW4pCi0KLSAgICAgICAgcmV0dXJuIGNsYXNzX3R5cGUoY2xhc3NfdG9rZW4uc3RhcnQsIGNsYXNzX3Rva2VuLmVuZCwgY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZXMsIHRlbXBsYXRlZF90eXBlcywgYm9keSwgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCi0KLSAgICBkZWYgaGFuZGxlX25hbWVzcGFjZShzZWxmKToKLSAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICAjIFN1cHBvcnQgYW5vbnltb3VzIG5hbWVzcGFjZXMuCi0gICAgICAgIG5hbWUgPSBOb25lCi0gICAgICAgIGlmIHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKLSAgICAgICAgICAgIG5hbWUgPSB0b2tlbi5uYW1lCi0gICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCi0gICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrLmFwcGVuZChuYW1lKQotICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVgsIHRva2VuCi0gICAgICAgICMgQ3JlYXRlIGFuIGludGVybmFsIHRva2VuIHRoYXQgZGVub3RlcyB3aGVuIHRoZSBuYW1lc3BhY2UgaXMgY29tcGxldGUuCi0gICAgICAgIGludGVybmFsX3Rva2VuID0gdG9rZW5pemUuVG9rZW4oX0lOVEVSTkFMX1RPS0VOLCBfTkFNRVNQQUNFX1BPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lKQotICAgICAgICBpbnRlcm5hbF90b2tlbi53aGVuY2UgPSB0b2tlbi53aGVuY2UKLSAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSAnPSc6Ci0gICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiBoYW5kbGUgYWxpYXNpbmcgbmFtZXNwYWNlcy4KLSAgICAgICAgICAgIG5hbWUsIG5leHRfdG9rZW4gPSBzZWxmLkdldE5hbWUoKQotICAgICAgICAgICAgYXNzZXJ0IG5leHRfdG9rZW4ubmFtZSA9PSAnOycsIG5leHRfdG9rZW4KLSAgICAgICAgICAgIHNlbGYuX0FkZEJhY2tUb2tlbihpbnRlcm5hbF90b2tlbikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICd7JywgdG9rZW4KLSAgICAgICAgICAgIHRva2VucyA9IGxpc3Qoc2VsZi5HZXRTY29wZSgpKQotICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSB0cmFpbGluZyB9IHdpdGggdGhlIGludGVybmFsIG5hbWVzcGFjZSBwb3AgdG9rZW4uCi0gICAgICAgICAgICB0b2tlbnNbLTFdID0gaW50ZXJuYWxfdG9rZW4KLSAgICAgICAgICAgICMgSGFuZGxlIG5hbWVzcGFjZSB3aXRoIG5vdGhpbmcgaW4gaXQuCi0gICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW5zKHRva2VucykKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiBoYW5kbGVfdXNpbmcoc2VsZik6Ci0gICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCi0gICAgICAgIGFzc2VydCB0b2tlbnMKLSAgICAgICAgcmV0dXJuIFVzaW5nKHRva2Vuc1swXS5zdGFydCwgdG9rZW5zWzBdLmVuZCwgdG9rZW5zKQotCi0gICAgZGVmIGhhbmRsZV9leHBsaWNpdChzZWxmKToKLSAgICAgICAgYXNzZXJ0IHNlbGYuaW5fY2xhc3MKLSAgICAgICAgIyBOb3RoaW5nIG11Y2ggdG8gZG8uCi0gICAgICAgICMgVE9ETyhubm9yd2l0eik6IG1heWJlIHZlcmlmeSB0aGUgbWV0aG9kIG5hbWUgPT0gY2xhc3MgbmFtZS4KLSAgICAgICAgIyBUaGlzIG11c3QgYmUgYSBjdG9yLgotICAgICAgICByZXR1cm4gc2VsZi5HZXRNZXRob2QoRlVOQ1RJT05fQ1RPUiwgTm9uZSkKLQotICAgIGRlZiBoYW5kbGVfdGhpcyhzZWxmKToKLSAgICAgICAgcGFzcyAgIyBOb3RoaW5nIHRvIGRvLgotCi0gICAgZGVmIGhhbmRsZV9vcGVyYXRvcihzZWxmKToKLSAgICAgICAgIyBQdWxsIG9mZiB0aGUgbmV4dCB0b2tlbihzPykgYW5kIG1ha2UgdGhhdCBwYXJ0IG9mIHRoZSBtZXRob2QgbmFtZS4KLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9zaXplb2Yoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfY2FzZShzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV9zd2l0Y2goc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfZGVmYXVsdChzZWxmKToKLSAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQotICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVgKLSAgICAgICAgYXNzZXJ0IHRva2VuLm5hbWUgPT0gJzonCi0KLSAgICBkZWYgaGFuZGxlX2lmKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX2Vsc2Uoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfcmV0dXJuKHNlbGYpOgotICAgICAgICB0b2tlbnMgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQotICAgICAgICBpZiBub3QgdG9rZW5zOgotICAgICAgICAgICAgcmV0dXJuIFJldHVybihzZWxmLmN1cnJlbnRfdG9rZW4uc3RhcnQsIHNlbGYuY3VycmVudF90b2tlbi5lbmQsIE5vbmUpCi0gICAgICAgIHJldHVybiBSZXR1cm4odG9rZW5zWzBdLnN0YXJ0LCB0b2tlbnNbMF0uZW5kLCB0b2tlbnMpCi0KLSAgICBkZWYgaGFuZGxlX2dvdG8oc2VsZik6Ci0gICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCi0gICAgICAgIGFzc2VydCBsZW4odG9rZW5zKSA9PSAxLCBzdHIodG9rZW5zKQotICAgICAgICByZXR1cm4gR290byh0b2tlbnNbMF0uc3RhcnQsIHRva2Vuc1swXS5lbmQsIHRva2Vuc1swXS5uYW1lKQotCi0gICAgZGVmIGhhbmRsZV90cnkoc2VsZik6Ci0gICAgICAgIHBhc3MgICMgTm90IG5lZWRlZCB5ZXQuCi0KLSAgICBkZWYgaGFuZGxlX2NhdGNoKHNlbGYpOgotICAgICAgICBwYXNzICAjIE5vdCBuZWVkZWQgeWV0LgotCi0gICAgZGVmIGhhbmRsZV90aHJvdyhzZWxmKToKLSAgICAgICAgcGFzcyAgIyBOb3QgbmVlZGVkIHlldC4KLQotICAgIGRlZiBoYW5kbGVfd2hpbGUoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfZG8oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfZm9yKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX2JyZWFrKHNlbGYpOgotICAgICAgICBzZWxmLl9JZ25vcmVVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQotCi0gICAgZGVmIGhhbmRsZV9jb250aW51ZShzZWxmKToKLSAgICAgICAgc2VsZi5fSWdub3JlVXBUbyh0b2tlbml6ZS5TWU5UQVgsICc7JykKLQotCi1kZWYgQnVpbGRlckZyb21Tb3VyY2Uoc291cmNlLCBmaWxlbmFtZSk6Ci0gICAgIiIiVXRpbGl0eSBtZXRob2QgdGhhdCByZXR1cm5zIGFuIEFzdEJ1aWxkZXIgZnJvbSBzb3VyY2UgY29kZS4KLQotICAgIEFyZ3M6Ci0gICAgICBzb3VyY2U6ICdDKysgc291cmNlIGNvZGUnCi0gICAgICBmaWxlbmFtZTogJ2ZpbGUxJwotCi0gICAgUmV0dXJuczoKLSAgICAgIEFzdEJ1aWxkZXIKLSAgICAiIiIKLSAgICByZXR1cm4gQXN0QnVpbGRlcih0b2tlbml6ZS5HZXRUb2tlbnMoc291cmNlKSwgZmlsZW5hbWUpCi0KLQotZGVmIFByaW50SW5kZW50aWZpZXJzKGZpbGVuYW1lLCBzaG91bGRfcHJpbnQpOgotICAgICIiIlByaW50cyBhbGwgaWRlbnRpZmllcnMgZm9yIGEgQysrIHNvdXJjZSBmaWxlLgotCi0gICAgQXJnczoKLSAgICAgIGZpbGVuYW1lOiAnZmlsZTEnCi0gICAgICBzaG91bGRfcHJpbnQ6IHByZWRpY2F0ZSB3aXRoIHNpZ25hdHVyZTogYm9vbCBGdW5jdGlvbih0b2tlbikKLSAgICAiIiIKLSAgICBzb3VyY2UgPSB1dGlscy5SZWFkRmlsZShmaWxlbmFtZSwgRmFsc2UpCi0gICAgaWYgc291cmNlIGlzIE5vbmU6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1VuYWJsZSB0byBmaW5kOiAlc1xuJyAlIGZpbGVuYW1lKQotICAgICAgICByZXR1cm4KLQotICAgICNwcmludCgnUHJvY2Vzc2luZyAlcycgJSBhY3R1YWxfZmlsZW5hbWUpCi0gICAgYnVpbGRlciA9IEJ1aWxkZXJGcm9tU291cmNlKHNvdXJjZSwgZmlsZW5hbWUpCi0gICAgdHJ5OgotICAgICAgICBmb3Igbm9kZSBpbiBidWlsZGVyLkdlbmVyYXRlKCk6Ci0gICAgICAgICAgICBpZiBzaG91bGRfcHJpbnQobm9kZSk6Ci0gICAgICAgICAgICAgICAgcHJpbnQobm9kZS5uYW1lKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcmV0dXJuCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0KLQotZGVmIFByaW50QWxsSW5kZW50aWZpZXJzKGZpbGVuYW1lcywgc2hvdWxkX3ByaW50KToKLSAgICAiIiJQcmludHMgYWxsIGlkZW50aWZpZXJzIGZvciBlYWNoIEMrKyBzb3VyY2UgZmlsZSBpbiBmaWxlbmFtZXMuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZW5hbWVzOiBbJ2ZpbGUxJywgJ2ZpbGUyJywgLi4uXQotICAgICAgc2hvdWxkX3ByaW50OiBwcmVkaWNhdGUgd2l0aCBzaWduYXR1cmU6IGJvb2wgRnVuY3Rpb24odG9rZW4pCi0gICAgIiIiCi0gICAgZm9yIHBhdGggaW4gZmlsZW5hbWVzOgotICAgICAgICBQcmludEluZGVudGlmaWVycyhwYXRoLCBzaG91bGRfcHJpbnQpCi0KLQotZGVmIG1haW4oYXJndik6Ci0gICAgZm9yIGZpbGVuYW1lIGluIGFyZ3ZbMTpdOgotICAgICAgICBzb3VyY2UgPSB1dGlscy5SZWFkRmlsZShmaWxlbmFtZSkKLSAgICAgICAgaWYgc291cmNlIGlzIE5vbmU6Ci0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIHByaW50KCdQcm9jZXNzaW5nICVzJyAlIGZpbGVuYW1lKQotICAgICAgICBidWlsZGVyID0gQnVpbGRlckZyb21Tb3VyY2Uoc291cmNlLCBmaWxlbmFtZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZW50aXJlX2FzdCA9IGZpbHRlcihOb25lLCBidWlsZGVyLkdlbmVyYXRlKCkpCi0gICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAjIEFscmVhZHkgcHJpbnRlZCBhIHdhcm5pbmcsIHByaW50IHRoZSB0cmFjZWJhY2sgYW5kIGNvbnRpbnVlLgotICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiB1dGlscy5ERUJVRzoKLSAgICAgICAgICAgICAgICBmb3IgYXN0IGluIGVudGlyZV9hc3Q6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KGFzdCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9nbW9ja19jbGFzcy5weSBiL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTk2NmNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSIiIkdlbmVyYXRlIEdvb2dsZSBNb2NrIGNsYXNzZXMgZnJvbSBiYXNlIGNsYXNzZXMuCi0KLVRoaXMgcHJvZ3JhbSB3aWxsIHJlYWQgaW4gYSBDKysgc291cmNlIGZpbGUgYW5kIG91dHB1dCB0aGUgR29vZ2xlIE1vY2sKLWNsYXNzZXMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3Nlcy4gIElmIG5vIGNsYXNzIGlzIHNwZWNpZmllZCwgYWxsCi1jbGFzc2VzIGluIHRoZSBzb3VyY2UgZmlsZSBhcmUgZW1pdHRlZC4KLQotVXNhZ2U6Ci0gIGdtb2NrX2NsYXNzLnB5IGhlYWRlci1maWxlLmggW0NsYXNzTmFtZV0uLi4KLQotT3V0cHV0IGlzIHNlbnQgdG8gc3Rkb3V0LgotIiIiCi0KLV9fYXV0aG9yX18gPSAnbm5vcndpdHpAZ29vZ2xlLmNvbSAoTmVhbCBOb3J3aXR6KScKLQotCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHN5cwotCi1mcm9tIGNwcCBpbXBvcnQgYXN0Ci1mcm9tIGNwcCBpbXBvcnQgdXRpbHMKLQotIyBQcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuMy4KLXRyeToKLSAgX2R1bW15ID0gc2V0Ci1leGNlcHQgTmFtZUVycm9yOgotICBpbXBvcnQgc2V0cwotICBzZXQgPSBzZXRzLlNldAotCi1fVkVSU0lPTiA9ICgxLCAwLCAxKSAgIyBUaGUgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdC4KLSMgSG93IG1hbnkgc3BhY2VzIHRvIGluZGVudC4gIENhbiBzZXQgbWUgd2l0aCB0aGUgSU5ERU5UIGVudmlyb25tZW50IHZhcmlhYmxlLgotX0lOREVOVCA9IDIKLQotCi1kZWYgX0dlbmVyYXRlTWV0aG9kcyhvdXRwdXRfbGluZXMsIHNvdXJjZSwgY2xhc3Nfbm9kZSk6Ci0gIGZ1bmN0aW9uX3R5cGUgPSAoYXN0LkZVTkNUSU9OX1ZJUlRVQUwgfCBhc3QuRlVOQ1RJT05fUFVSRV9WSVJUVUFMIHwKLSAgICAgICAgICAgICAgICAgICBhc3QuRlVOQ1RJT05fT1ZFUlJJREUpCi0gIGN0b3Jfb3JfZHRvciA9IGFzdC5GVU5DVElPTl9DVE9SIHwgYXN0LkZVTkNUSU9OX0RUT1IKLSAgaW5kZW50ID0gJyAnICogX0lOREVOVAotCi0gIGZvciBub2RlIGluIGNsYXNzX25vZGUuYm9keToKLSAgICAjIFdlIG9ubHkgY2FyZSBhYm91dCB2aXJ0dWFsIGZ1bmN0aW9ucy4KLSAgICBpZiAoaXNpbnN0YW5jZShub2RlLCBhc3QuRnVuY3Rpb24pIGFuZAotICAgICAgICBub2RlLm1vZGlmaWVycyAmIGZ1bmN0aW9uX3R5cGUgYW5kCi0gICAgICAgIG5vdCBub2RlLm1vZGlmaWVycyAmIGN0b3Jfb3JfZHRvcik6Ci0gICAgICAjIFBpY2sgb3V0IGFsbCB0aGUgZWxlbWVudHMgd2UgbmVlZCBmcm9tIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4KLSAgICAgIGNvbnN0ID0gJycKLSAgICAgIGlmIG5vZGUubW9kaWZpZXJzICYgYXN0LkZVTkNUSU9OX0NPTlNUOgotICAgICAgICBjb25zdCA9ICdDT05TVF8nCi0gICAgICByZXR1cm5fdHlwZSA9ICd2b2lkJwotICAgICAgaWYgbm9kZS5yZXR1cm5fdHlwZToKLSAgICAgICAgIyBBZGQgbW9kaWZpZXJzIGxpa2UgJ2NvbnN0Jy4KLSAgICAgICAgbW9kaWZpZXJzID0gJycKLSAgICAgICAgaWYgbm9kZS5yZXR1cm5fdHlwZS5tb2RpZmllcnM6Ci0gICAgICAgICAgbW9kaWZpZXJzID0gJyAnLmpvaW4obm9kZS5yZXR1cm5fdHlwZS5tb2RpZmllcnMpICsgJyAnCi0gICAgICAgIHJldHVybl90eXBlID0gbW9kaWZpZXJzICsgbm9kZS5yZXR1cm5fdHlwZS5uYW1lCi0gICAgICAgIHRlbXBsYXRlX2FyZ3MgPSBbYXJnLm5hbWUgZm9yIGFyZyBpbiBub2RlLnJldHVybl90eXBlLnRlbXBsYXRlZF90eXBlc10KLSAgICAgICAgaWYgdGVtcGxhdGVfYXJnczoKLSAgICAgICAgICByZXR1cm5fdHlwZSArPSAnPCcgKyAnLCAnLmpvaW4odGVtcGxhdGVfYXJncykgKyAnPicKLSAgICAgICAgICBpZiBsZW4odGVtcGxhdGVfYXJncykgPiAxOgotICAgICAgICAgICAgZm9yIGxpbmUgaW4gWwotICAgICAgICAgICAgICAgICcvLyBUaGUgZm9sbG93aW5nIGxpbmUgd29uXCd0IHJlYWxseSBjb21waWxlLCBhcyB0aGUgcmV0dXJuJywKLSAgICAgICAgICAgICAgICAnLy8gdHlwZSBoYXMgbXVsdGlwbGUgdGVtcGxhdGUgYXJndW1lbnRzLiAgVG8gZml4IGl0LCB1c2UgYScsCi0gICAgICAgICAgICAgICAgJy8vIHR5cGVkZWYgZm9yIHRoZSByZXR1cm4gdHlwZS4nXToKLSAgICAgICAgICAgICAgb3V0cHV0X2xpbmVzLmFwcGVuZChpbmRlbnQgKyBsaW5lKQotICAgICAgICBpZiBub2RlLnJldHVybl90eXBlLnBvaW50ZXI6Ci0gICAgICAgICAgcmV0dXJuX3R5cGUgKz0gJyonCi0gICAgICAgIGlmIG5vZGUucmV0dXJuX3R5cGUucmVmZXJlbmNlOgotICAgICAgICAgIHJldHVybl90eXBlICs9ICcmJwotICAgICAgICBudW1fcGFyYW1ldGVycyA9IGxlbihub2RlLnBhcmFtZXRlcnMpCi0gICAgICAgIGlmIGxlbihub2RlLnBhcmFtZXRlcnMpID09IDE6Ci0gICAgICAgICAgZmlyc3RfcGFyYW0gPSBub2RlLnBhcmFtZXRlcnNbMF0KLSAgICAgICAgICBpZiBzb3VyY2VbZmlyc3RfcGFyYW0uc3RhcnQ6Zmlyc3RfcGFyYW0uZW5kXS5zdHJpcCgpID09ICd2b2lkJzoKLSAgICAgICAgICAgICMgV2UgbXVzdCB0cmVhdCBUKHZvaWQpIGFzIGEgZnVuY3Rpb24gd2l0aCBubyBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgbnVtX3BhcmFtZXRlcnMgPSAwCi0gICAgICB0bXBsID0gJycKLSAgICAgIGlmIGNsYXNzX25vZGUudGVtcGxhdGVkX3R5cGVzOgotICAgICAgICB0bXBsID0gJ19UJwotICAgICAgbW9ja19tZXRob2RfbWFjcm8gPSAnTU9DS18lc01FVEhPRCVkJXMnICUgKGNvbnN0LCBudW1fcGFyYW1ldGVycywgdG1wbCkKLQotICAgICAgYXJncyA9ICcnCi0gICAgICBpZiBub2RlLnBhcmFtZXRlcnM6Ci0gICAgICAgICMgRHVlIHRvIHRoZSBwYXJzZXIgbGltaXRhdGlvbnMsIGl0IGlzIGltcG9zc2libGUgdG8ga2VlcCBjb21tZW50cwotICAgICAgICAjIHdoaWxlIHN0cmlwcGluZyB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLiAgV2hlbiBkZWZhdWx0cyBhcmUKLSAgICAgICAgIyBwcmVzZW50LCB3ZSBjaG9vc2UgdG8gc3RyaXAgdGhlbSBhbmQgY29tbWVudHMgKGFuZCBwcm9kdWNlCi0gICAgICAgICMgY29tcGlsYWJsZSBjb2RlKS4KLSAgICAgICAgIyBUT0RPKG5ub3J3aXR6QGdvb2dsZS5jb20pOiBJbnZlc3RpZ2F0ZSB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvCi0gICAgICAgICMgcHJlc2VydmUgcGFyYW1ldGVyIG5hbWUgd2hlbiByZWNvbnN0cnVjdGluZyBwYXJhbWV0ZXIgdGV4dCBmcm9tCi0gICAgICAgICMgdGhlIEFTVC4KLSAgICAgICAgaWYgbGVuKFtwYXJhbSBmb3IgcGFyYW0gaW4gbm9kZS5wYXJhbWV0ZXJzIGlmIHBhcmFtLmRlZmF1bHRdKSA+IDA6Ci0gICAgICAgICAgYXJncyA9ICcsICcuam9pbihwYXJhbS50eXBlLm5hbWUgZm9yIHBhcmFtIGluIG5vZGUucGFyYW1ldGVycykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAjIEdldCB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0YXJ0Ci0gICAgICAgICAgIyBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgcGFyYW1ldGVyLgotICAgICAgICAgIHN0YXJ0ID0gbm9kZS5wYXJhbWV0ZXJzWzBdLnN0YXJ0Ci0gICAgICAgICAgZW5kID0gbm9kZS5wYXJhbWV0ZXJzWy0xXS5lbmQKLSAgICAgICAgICAjIFJlbW92ZSAvLyBjb21tZW50cy4KLSAgICAgICAgICBhcmdzX3N0cmluZ3MgPSByZS5zdWIocicvLy4qJywgJycsIHNvdXJjZVtzdGFydDplbmRdKQotICAgICAgICAgICMgQ29uZGVuc2UgbXVsdGlwbGUgc3BhY2VzIGFuZCBlbGltaW5hdGUgbmV3bGluZXMgcHV0dGluZyB0aGUKLSAgICAgICAgICAjIHBhcmFtZXRlcnMgdG9nZXRoZXIgb24gYSBzaW5nbGUgbGluZS4gIEVuc3VyZSB0aGVyZSBpcyBhCi0gICAgICAgICAgIyBzcGFjZSBpbiBhbiBhcmd1bWVudCB3aGljaCBpcyBzcGxpdCBieSBhIG5ld2xpbmUgd2l0aG91dAotICAgICAgICAgICMgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgZS5nLjogaW50XG5CYXIKLSAgICAgICAgICBhcmdzID0gcmUuc3ViKCcgICsnLCAnICcsIGFyZ3Nfc3RyaW5ncy5yZXBsYWNlKCdcbicsICcgJykpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBtb2NrIG1ldGhvZCBkZWZpbml0aW9uLgotICAgICAgb3V0cHV0X2xpbmVzLmV4dGVuZChbJyVzJXMoJXMsJyAlIChpbmRlbnQsIG1vY2tfbWV0aG9kX21hY3JvLCBub2RlLm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJXMoJXMpKTsnICUgKGluZGVudCozLCByZXR1cm5fdHlwZSwgYXJncyldKQotCi0KLWRlZiBfR2VuZXJhdGVNb2NrcyhmaWxlbmFtZSwgc291cmNlLCBhc3RfbGlzdCwgZGVzaXJlZF9jbGFzc19uYW1lcyk6Ci0gIHByb2Nlc3NlZF9jbGFzc19uYW1lcyA9IHNldCgpCi0gIGxpbmVzID0gW10KLSAgZm9yIG5vZGUgaW4gYXN0X2xpc3Q6Ci0gICAgaWYgKGlzaW5zdGFuY2Uobm9kZSwgYXN0LkNsYXNzKSBhbmQgbm9kZS5ib2R5IGFuZAotICAgICAgICAjIGRlc2lyZWRfY2xhc3NfbmFtZXMgYmVpbmcgTm9uZSBtZWFucyB0aGF0IGFsbCBjbGFzc2VzIGFyZSBzZWxlY3RlZC4KLSAgICAgICAgKG5vdCBkZXNpcmVkX2NsYXNzX25hbWVzIG9yIG5vZGUubmFtZSBpbiBkZXNpcmVkX2NsYXNzX25hbWVzKSk6Ci0gICAgICBjbGFzc19uYW1lID0gbm9kZS5uYW1lCi0gICAgICBwYXJlbnRfbmFtZSA9IGNsYXNzX25hbWUKLSAgICAgIHByb2Nlc3NlZF9jbGFzc19uYW1lcy5hZGQoY2xhc3NfbmFtZSkKLSAgICAgIGNsYXNzX25vZGUgPSBub2RlCi0gICAgICAjIEFkZCBuYW1lc3BhY2UgYmVmb3JlIHRoZSBjbGFzcy4KLSAgICAgIGlmIGNsYXNzX25vZGUubmFtZXNwYWNlOgotICAgICAgICBsaW5lcy5leHRlbmQoWyduYW1lc3BhY2UgJXMgeycgJSBuIGZvciBuIGluIGNsYXNzX25vZGUubmFtZXNwYWNlXSkgICMgfQotICAgICAgICBsaW5lcy5hcHBlbmQoJycpCi0KLSAgICAgICMgQWRkIHRlbXBsYXRlIGFyZ3MgZm9yIHRlbXBsYXRlZCBjbGFzc2VzLgotICAgICAgaWYgY2xhc3Nfbm9kZS50ZW1wbGF0ZWRfdHlwZXM6Ci0gICAgICAgICMgVE9ETyhwYXVsY2hhbmcpOiBUaGUgQVNUIGRvZXNuJ3QgcHJlc2VydmUgdGVtcGxhdGUgYXJndW1lbnQgb3JkZXIsCi0gICAgICAgICMgc28gd2UgaGF2ZSB0byBtYWtlIHVwIG5hbWVzIGhlcmUuCi0gICAgICAgICMgVE9ETyhwYXVsY2hhbmcpOiBIYW5kbGUgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnRzIChlLmcuCi0gICAgICAgICMgdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IE4+KS4KLSAgICAgICAgdGVtcGxhdGVfYXJnX2NvdW50ID0gbGVuKGNsYXNzX25vZGUudGVtcGxhdGVkX3R5cGVzLmtleXMoKSkKLSAgICAgICAgdGVtcGxhdGVfYXJncyA9IFsnVCVkJyAlIG4gZm9yIG4gaW4gcmFuZ2UodGVtcGxhdGVfYXJnX2NvdW50KV0KLSAgICAgICAgdGVtcGxhdGVfZGVjbHMgPSBbJ3R5cGVuYW1lICcgKyBhcmcgZm9yIGFyZyBpbiB0ZW1wbGF0ZV9hcmdzXQotICAgICAgICBsaW5lcy5hcHBlbmQoJ3RlbXBsYXRlIDwnICsgJywgJy5qb2luKHRlbXBsYXRlX2RlY2xzKSArICc+JykKLSAgICAgICAgcGFyZW50X25hbWUgKz0gJzwnICsgJywgJy5qb2luKHRlbXBsYXRlX2FyZ3MpICsgJz4nCi0KLSAgICAgICMgQWRkIHRoZSBjbGFzcyBwcm9sb2cuCi0gICAgICBsaW5lcy5hcHBlbmQoJ2NsYXNzIE1vY2slcyA6IHB1YmxpYyAlcyB7JyAgIyB9Ci0gICAgICAgICAgICAgICAgICAgJSAoY2xhc3NfbmFtZSwgcGFyZW50X25hbWUpKQotICAgICAgbGluZXMuYXBwZW5kKCclc3B1YmxpYzonICUgKCcgJyAqIChfSU5ERU5UIC8vIDIpKSkKLQotICAgICAgIyBBZGQgYWxsIHRoZSBtZXRob2RzLgotICAgICAgX0dlbmVyYXRlTWV0aG9kcyhsaW5lcywgc291cmNlLCBjbGFzc19ub2RlKQotCi0gICAgICAjIENsb3NlIHRoZSBjbGFzcy4KLSAgICAgIGlmIGxpbmVzOgotICAgICAgICAjIElmIHRoZXJlIGFyZSBubyB2aXJ0dWFsIG1ldGhvZHMsIG5vIG5lZWQgZm9yIGEgcHVibGljIGxhYmVsLgotICAgICAgICBpZiBsZW4obGluZXMpID09IDI6Ci0gICAgICAgICAgZGVsIGxpbmVzWy0xXQotCi0gICAgICAgICMgT25seSBjbG9zZSB0aGUgY2xhc3MgaWYgdGhlcmUgcmVhbGx5IGlzIGEgY2xhc3MuCi0gICAgICAgIGxpbmVzLmFwcGVuZCgnfTsnKQotICAgICAgICBsaW5lcy5hcHBlbmQoJycpICAjIEFkZCBhbiBleHRyYSBuZXdsaW5lLgotCi0gICAgICAjIENsb3NlIHRoZSBuYW1lc3BhY2UuCi0gICAgICBpZiBjbGFzc19ub2RlLm5hbWVzcGFjZToKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNsYXNzX25vZGUubmFtZXNwYWNlKS0xLCAtMSwgLTEpOgotICAgICAgICAgIGxpbmVzLmFwcGVuZCgnfSAgLy8gbmFtZXNwYWNlICVzJyAlIGNsYXNzX25vZGUubmFtZXNwYWNlW2ldKQotICAgICAgICBsaW5lcy5hcHBlbmQoJycpICAjIEFkZCBhbiBleHRyYSBuZXdsaW5lLgotCi0gIGlmIGRlc2lyZWRfY2xhc3NfbmFtZXM6Ci0gICAgbWlzc2luZ19jbGFzc19uYW1lX2xpc3QgPSBsaXN0KGRlc2lyZWRfY2xhc3NfbmFtZXMgLSBwcm9jZXNzZWRfY2xhc3NfbmFtZXMpCi0gICAgaWYgbWlzc2luZ19jbGFzc19uYW1lX2xpc3Q6Ci0gICAgICBtaXNzaW5nX2NsYXNzX25hbWVfbGlzdC5zb3J0KCkKLSAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ0NsYXNzKGVzKSBub3QgZm91bmQgaW4gJXM6ICVzXG4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCAnLCAnLmpvaW4obWlzc2luZ19jbGFzc19uYW1lX2xpc3QpKSkKLSAgZWxpZiBub3QgcHJvY2Vzc2VkX2NsYXNzX25hbWVzOgotICAgIHN5cy5zdGRlcnIud3JpdGUoJ05vIGNsYXNzIGZvdW5kIGluICVzXG4nICUgZmlsZW5hbWUpCi0KLSAgcmV0dXJuIGxpbmVzCi0KLQotZGVmIG1haW4oYXJndj1zeXMuYXJndik6Ci0gIGlmIGxlbihhcmd2KSA8IDI6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgnR29vZ2xlIE1vY2sgQ2xhc3MgR2VuZXJhdG9yIHYlc1xuXG4nICUKLSAgICAgICAgICAgICAgICAgICAgICcuJy5qb2luKG1hcChzdHIsIF9WRVJTSU9OKSkpCi0gICAgc3lzLnN0ZGVyci53cml0ZShfX2RvY19fKQotICAgIHJldHVybiAxCi0KLSAgZ2xvYmFsIF9JTkRFTlQKLSAgdHJ5OgotICAgIF9JTkRFTlQgPSBpbnQob3MuZW52aXJvblsnSU5ERU5UJ10pCi0gIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICBwYXNzCi0gIGV4Y2VwdDoKLSAgICBzeXMuc3RkZXJyLndyaXRlKCdVbmFibGUgdG8gdXNlIGluZGVudCBvZiAlc1xuJyAlIG9zLmVudmlyb24uZ2V0KCdJTkRFTlQnKSkKLQotICBmaWxlbmFtZSA9IGFyZ3ZbMV0KLSAgZGVzaXJlZF9jbGFzc19uYW1lcyA9IE5vbmUgICMgTm9uZSBtZWFucyBhbGwgY2xhc3NlcyBpbiB0aGUgc291cmNlIGZpbGUuCi0gIGlmIGxlbihhcmd2KSA+PSAzOgotICAgIGRlc2lyZWRfY2xhc3NfbmFtZXMgPSBzZXQoYXJndlsyOl0pCi0gIHNvdXJjZSA9IHV0aWxzLlJlYWRGaWxlKGZpbGVuYW1lKQotICBpZiBzb3VyY2UgaXMgTm9uZToKLSAgICByZXR1cm4gMQotCi0gIGJ1aWxkZXIgPSBhc3QuQnVpbGRlckZyb21Tb3VyY2Uoc291cmNlLCBmaWxlbmFtZSkKLSAgdHJ5OgotICAgIGVudGlyZV9hc3QgPSBmaWx0ZXIoTm9uZSwgYnVpbGRlci5HZW5lcmF0ZSgpKQotICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgcmV0dXJuCi0gIGV4Y2VwdDoKLSAgICAjIEFuIGVycm9yIG1lc3NhZ2Ugd2FzIGFscmVhZHkgcHJpbnRlZCBzaW5jZSB3ZSBjb3VsZG4ndCBwYXJzZS4KLSAgICBzeXMuZXhpdCgxKQotICBlbHNlOgotICAgIGxpbmVzID0gX0dlbmVyYXRlTW9ja3MoZmlsZW5hbWUsIHNvdXJjZSwgZW50aXJlX2FzdCwgZGVzaXJlZF9jbGFzc19uYW1lcykKLSAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicuam9pbihsaW5lcykpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzX3Rlc3QucHkgYi90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9nbW9ja19jbGFzc190ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMThmOTBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA5IE5lYWwgTm9yd2l0eiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIiIiVGVzdHMgZm9yIGdtb2NrLnNjcmlwdHMuZ2VuZXJhdG9yLmNwcC5nbW9ja19jbGFzcy4iIiIKLQotX19hdXRob3JfXyA9ICdubm9yd2l0ekBnb29nbGUuY29tIChOZWFsIE5vcndpdHopJwotCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IHVuaXR0ZXN0Ci0KLSMgQWxsb3cgdGhlIGNwcCBpbXBvcnRzIGJlbG93IHRvIHdvcmsgd2hlbiBydW4gYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KLXN5cy5wYXRoLmFwcGVuZChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJykpCi0KLWZyb20gY3BwIGltcG9ydCBhc3QKLWZyb20gY3BwIGltcG9ydCBnbW9ja19jbGFzcwotCi0KLWNsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiSGVscGVyIGNsYXNzIHRoYXQgYWRkcyBhc3NlcnQgbWV0aG9kcy4iIiIKLQotICBkZWYgU3RyaXBMZWFkaW5nV2hpdGVzcGFjZShzZWxmLCBsaW5lcyk6Ci0gICAgIiIiU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlIGluIGVhY2ggbGluZSBpbiAnbGluZXMnLiIiIgotICAgIHJldHVybiAnXG4nLmpvaW4oW3MubHN0cmlwKCkgZm9yIHMgaW4gbGluZXMuc3BsaXQoJ1xuJyldKQotCi0gIGRlZiBhc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKHNlbGYsIGV4cGVjdGVkX2xpbmVzLCBsaW5lcyk6Ci0gICAgIiIiU3BlY2lhbGl6ZWQgYXNzZXJ0IHRoYXQgaWdub3JlcyB0aGUgaW5kZW50IGxldmVsLiIiIgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfbGluZXMsIHNlbGYuU3RyaXBMZWFkaW5nV2hpdGVzcGFjZShsaW5lcykpCi0KLQotY2xhc3MgR2VuZXJhdGVNZXRob2RzVGVzdChUZXN0Q2FzZSk6Ci0KLSAgZGVmIEdlbmVyYXRlTWV0aG9kU291cmNlKHNlbGYsIGNwcF9zb3VyY2UpOgotICAgICIiIkNvbnZlcnQgQysrIHNvdXJjZSB0byBHb29nbGUgTW9jayBvdXRwdXQgc291cmNlIGxpbmVzLiIiIgotICAgIG1ldGhvZF9zb3VyY2VfbGluZXMgPSBbXQotICAgICMgPHRlc3Q+IGlzIGEgcHNldWRvLWZpbGVuYW1lLCBpdCBpcyBub3QgcmVhZCBvciB3cml0dGVuLgotICAgIGJ1aWxkZXIgPSBhc3QuQnVpbGRlckZyb21Tb3VyY2UoY3BwX3NvdXJjZSwgJzx0ZXN0PicpCi0gICAgYXN0X2xpc3QgPSBsaXN0KGJ1aWxkZXIuR2VuZXJhdGUoKSkKLSAgICBnbW9ja19jbGFzcy5fR2VuZXJhdGVNZXRob2RzKG1ldGhvZF9zb3VyY2VfbGluZXMsIGNwcF9zb3VyY2UsIGFzdF9saXN0WzBdKQotICAgIHJldHVybiAnXG4nLmpvaW4obWV0aG9kX3NvdXJjZV9saW5lcykKLQotICBkZWYgdGVzdFNpbXBsZU1ldGhvZChzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGludCBCYXIoKTsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDAoQmFyLFxuaW50KCkpOycsCi0gICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKLQotICBkZWYgdGVzdFNpbXBsZUNvbnN0cnVjdG9yc0FuZERlc3RydWN0b3Ioc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi1jbGFzcyBGb28gewotIHB1YmxpYzoKLSAgRm9vKCk7Ci0gIEZvbyhpbnQgeCk7Ci0gIEZvbyhjb25zdCBGb28mIGYpOwotICBGb28oRm9vJiYgZik7Ci0gIH5Gb28oKTsKLSAgdmlydHVhbCBpbnQgQmFyKCkgPSAwOwotfTsKLSIiIgotICAgICMgVGhlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvciBzaG91bGQgYmUgaWdub3JlZC4KLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDAoQmFyLFxuaW50KCkpOycsCi0gICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKLQotICBkZWYgdGVzdFZpcnR1YWxEZXN0cnVjdG9yKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkZvbygpOwotICB2aXJ0dWFsIGludCBCYXIoKSA9IDA7Ci19OwotIiIiCi0gICAgIyBUaGUgZGVzdHJ1Y3RvciBzaG91bGQgYmUgaWdub3JlZC4KLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDAoQmFyLFxuaW50KCkpOycsCi0gICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKLQotICBkZWYgdGVzdEV4cGxpY2l0bHlEZWZhdWx0ZWRDb25zdHJ1Y3RvcnNBbmREZXN0cnVjdG9yKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIEZvbygpID0gZGVmYXVsdDsKLSAgRm9vKGNvbnN0IEZvbyYgZikgPSBkZWZhdWx0OwotICBGb28oRm9vJiYgZikgPSBkZWZhdWx0OwotICB+Rm9vKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIGludCBCYXIoKSA9IDA7Ci19OwotIiIiCi0gICAgIyBUaGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yIHNob3VsZCBiZSBpZ25vcmVkLgotICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKLSAgICAgICAgJ01PQ0tfTUVUSE9EMChCYXIsXG5pbnQoKSk7JywKLSAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQotCi0gIGRlZiB0ZXN0RXhwbGljaXRseURlbGV0ZWRDb25zdHJ1Y3RvcnNBbmREZXN0cnVjdG9yKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIEZvbygpID0gZGVsZXRlOwotICBGb28oY29uc3QgRm9vJiBmKSA9IGRlbGV0ZTsKLSAgRm9vKEZvbyYmIGYpID0gZGVsZXRlOwotICB+Rm9vKCkgPSBkZWxldGU7Ci0gIHZpcnR1YWwgaW50IEJhcigpID0gMDsKLX07Ci0iIiIKLSAgICAjIFRoZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3Igc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbmludCgpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RTaW1wbGVPdmVycmlkZU1ldGhvZChzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICBpbnQgQmFyKCkgb3ZlcnJpZGU7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbmludCgpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RTaW1wbGVDb25zdE1ldGhvZChzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQmFyKGJvb2wgZmxhZykgY29uc3Q7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnTU9DS19DT05TVF9NRVRIT0QxKEJhcixcbnZvaWQoYm9vbCBmbGFnKSk7JywKLSAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQotCi0gIGRlZiB0ZXN0RXhwbGljaXRWb2lkKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgaW50IEJhcih2b2lkKTsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDAoQmFyLFxuaW50KHZvaWQpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RTdHJhbmdlTmV3bGluZUluUGFyYW1ldGVyKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBCYXIoaW50Ci1hKSA9IDA7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnTU9DS19NRVRIT0QxKEJhcixcbnZvaWQoaW50IGEpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3REZWZhdWx0UGFyYW1ldGVycyhzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQmFyKGludCBhLCBjaGFyIGMgPSAneCcpID0gMDsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDIoQmFyLFxudm9pZChpbnQsIGNoYXIpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RNdWx0aXBsZURlZmF1bHRQYXJhbWV0ZXJzKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBCYXIoaW50IGEgPSA0MiwgY2hhciBjID0gJ3gnKSA9IDA7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnTU9DS19NRVRIT0QyKEJhcixcbnZvaWQoaW50LCBjaGFyKSk7JywKLSAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQotCi0gIGRlZiB0ZXN0UmVtb3Zlc0NvbW1lbnRzV2hlbkRlZmF1bHRzQXJlUHJlc2VudChzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQmFyKGludCBhID0gNDIgLyogYSBjb21tZW50ICovLAotICAgICAgICAgICAgICAgICAgIGNoYXIgLyogb3RoZXIgY29tbWVudCAqLyBjPSAneCcpID0gMDsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDIoQmFyLFxudm9pZChpbnQsIGNoYXIpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3REb3VibGVTbGFzaENvbW1lbnRzSW5QYXJhbWV0ZXJMaXN0QXJlUmVtb3ZlZChzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQmFyKGludCBhLCAgLy8gaW5saW5lIGNvbW1lbnRzIHNob3VsZCBiZSBlbGlkZWQuCi0gICAgICAgICAgICAgICAgICAgaW50IGIgICAvLyBpbmxpbmUgY29tbWVudHMgc2hvdWxkIGJlIGVsaWRlZC4KLSAgICAgICAgICAgICAgICAgICApIGNvbnN0ID0gMDsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX0NPTlNUX01FVEhPRDIoQmFyLFxudm9pZChpbnQgYSwgaW50IGIpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RDU3R5bGVDb21tZW50c0luUGFyYW1ldGVyTGlzdEFyZU5vdFJlbW92ZWQoc2VsZik6Ci0gICAgIyBOT1RFKG5ub3J3aXR6KTogSSdtIG5vdCBzdXJlIGlmIGl0J3MgdGhlIGJlc3QgYmVoYXZpb3IgdG8ga2VlcCB0aGVzZQotICAgICMgY29tbWVudHMuICBBbHNvIG5vdGUgdGhhdCBDIHN0eWxlIGNvbW1lbnRzIGFmdGVyIHRoZSBsYXN0IHBhcmFtZXRlcgotICAgICMgYXJlIHN0aWxsIGVsaWRlZC4KLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgQmFyKGludCAvKiBrZWVwZXIgKi8sIGludCBiKTsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDIoQmFyLFxuY29uc3Qgc3RyaW5nJihpbnQgLyoga2VlcGVyICovLCBpbnQgYikpOycsCi0gICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKLQotICBkZWYgdGVzdEFyZ3NPZlRlbXBsYXRlVHlwZXMoc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi1jbGFzcyBGb28gewotIHB1YmxpYzoKLSAgdmlydHVhbCBpbnQgQmFyKGNvbnN0IHZlY3RvcjxpbnQ+JiB2LCBtYXA8aW50LCBzdHJpbmc+KiBvdXRwdXQpOwotfTsiIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgICdNT0NLX01FVEhPRDIoQmFyLFxuJwotICAgICAgICAnaW50KGNvbnN0IHZlY3RvcjxpbnQ+JiB2LCBtYXA8aW50LCBzdHJpbmc+KiBvdXRwdXQpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RSZXR1cm5UeXBlV2l0aE9uZVRlbXBsYXRlQXJnKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdmVjdG9yPGludD4qIEJhcihpbnQgbik7Ci19OyIiIgotICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKLSAgICAgICAgJ01PQ0tfTUVUSE9EMShCYXIsXG52ZWN0b3I8aW50PiooaW50IG4pKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RSZXR1cm5UeXBlV2l0aE1hbnlUZW1wbGF0ZUFyZ3Moc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi1jbGFzcyBGb28gewotIHB1YmxpYzoKLSAgdmlydHVhbCBtYXA8aW50LCBzdHJpbmc+IEJhcigpOwotfTsiIiIKLSAgICAjIENvbXBhcmluZyB0aGUgY29tbWVudCB0ZXh0IGlzIGJyaXR0bGUgLSB3ZSdsbCB0aGluayBvZiBzb21ldGhpbmcKLSAgICAjIGJldHRlciBpbiBjYXNlIHRoaXMgZ2V0cyBhbm5veWluZywgYnV0IGZvciBub3cgbGV0J3Mga2VlcCBpdCBzaW1wbGUuCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnLy8gVGhlIGZvbGxvd2luZyBsaW5lIHdvblwndCByZWFsbHkgY29tcGlsZSwgYXMgdGhlIHJldHVyblxuJwotICAgICAgICAnLy8gdHlwZSBoYXMgbXVsdGlwbGUgdGVtcGxhdGUgYXJndW1lbnRzLiAgVG8gZml4IGl0LCB1c2UgYVxuJwotICAgICAgICAnLy8gdHlwZWRlZiBmb3IgdGhlIHJldHVybiB0eXBlLlxuJwotICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbm1hcDxpbnQsIHN0cmluZz4oKSk7JywKLSAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQotCi0gIGRlZiB0ZXN0U2ltcGxlTWV0aG9kSW5UZW1wbGF0ZWRDbGFzcyhzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jbGFzcyBGb28gewotIHB1YmxpYzoKLSAgdmlydHVhbCBpbnQgQmFyKCk7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICAnTU9DS19NRVRIT0QwX1QoQmFyLFxuaW50KCkpOycsCi0gICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKLQotICBkZWYgdGVzdFBvaW50ZXJBcmdXaXRob3V0TmFtZXMoc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi1jbGFzcyBGb28gewotICB2aXJ0dWFsIGludCBCYXIoQyopOwotfTsKLSIiIgotICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKLSAgICAgICAgJ01PQ0tfTUVUSE9EMShCYXIsXG5pbnQoQyopKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RSZWZlcmVuY2VBcmdXaXRob3V0TmFtZXMoc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi1jbGFzcyBGb28gewotICB2aXJ0dWFsIGludCBCYXIoQyYpOwotfTsKLSIiIgotICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKLSAgICAgICAgJ01PQ0tfTUVUSE9EMShCYXIsXG5pbnQoQyYpKTsnLAotICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RBcnJheUFyZ1dpdGhvdXROYW1lcyhzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIEZvbyB7Ci0gIHZpcnR1YWwgaW50IEJhcihDW10pOwotfTsKLSIiIgotICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKLSAgICAgICAgJ01PQ0tfTUVUSE9EMShCYXIsXG5pbnQoQ1tdKSk7JywKLSAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQotCi0KLWNsYXNzIEdlbmVyYXRlTW9ja3NUZXN0KFRlc3RDYXNlKToKLQotICBkZWYgR2VuZXJhdGVNb2NrcyhzZWxmLCBjcHBfc291cmNlKToKLSAgICAiIiJDb252ZXJ0IEMrKyBzb3VyY2UgdG8gY29tcGxldGUgR29vZ2xlIE1vY2sgb3V0cHV0IHNvdXJjZS4iIiIKLSAgICAjIDx0ZXN0PiBpcyBhIHBzZXVkby1maWxlbmFtZSwgaXQgaXMgbm90IHJlYWQgb3Igd3JpdHRlbi4KLSAgICBmaWxlbmFtZSA9ICc8dGVzdD4nCi0gICAgYnVpbGRlciA9IGFzdC5CdWlsZGVyRnJvbVNvdXJjZShjcHBfc291cmNlLCBmaWxlbmFtZSkKLSAgICBhc3RfbGlzdCA9IGxpc3QoYnVpbGRlci5HZW5lcmF0ZSgpKQotICAgIGxpbmVzID0gZ21vY2tfY2xhc3MuX0dlbmVyYXRlTW9ja3MoZmlsZW5hbWUsIGNwcF9zb3VyY2UsIGFzdF9saXN0LCBOb25lKQotICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCi0KLSAgZGVmIHRlc3ROYW1lc3BhY2VzKHNlbGYpOgotICAgIHNvdXJjZSA9ICIiIgotbmFtZXNwYWNlIEZvbyB7Ci1uYW1lc3BhY2UgQmFyIHsgY2xhc3MgRm9yd2FyZDsgfQotbmFtZXNwYWNlIEJheiB7Ci0KLWNsYXNzIFRlc3QgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIEZvbygpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIEJhegotfSAgLy8gbmFtZXNwYWNlIEZvbwotIiIiCi0gICAgZXhwZWN0ZWQgPSAiIiJcCi1uYW1lc3BhY2UgRm9vIHsKLW5hbWVzcGFjZSBCYXogewotCi1jbGFzcyBNb2NrVGVzdCA6IHB1YmxpYyBUZXN0IHsKLXB1YmxpYzoKLU1PQ0tfTUVUSE9EMChGb28sCi12b2lkKCkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIEJhegotfSAgLy8gbmFtZXNwYWNlIEZvbwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICBleHBlY3RlZCwgc2VsZi5HZW5lcmF0ZU1vY2tzKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RDbGFzc1dpdGhTdG9yYWdlU3BlY2lmaWVyTWFjcm8oc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi1jbGFzcyBTVE9SQUdFX1NQRUNJRklFUiBUZXN0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBGb28oKTsKLX07Ci0iIiIKLSAgICBleHBlY3RlZCA9ICIiIlwKLWNsYXNzIE1vY2tUZXN0IDogcHVibGljIFRlc3QgewotcHVibGljOgotTU9DS19NRVRIT0QwKEZvbywKLXZvaWQoKSk7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICBleHBlY3RlZCwgc2VsZi5HZW5lcmF0ZU1vY2tzKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RUZW1wbGF0ZWRGb3J3YXJkRGVjbGFyYXRpb24oc2VsZik6Ci0gICAgc291cmNlID0gIiIiCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRm9yd2FyZDsgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuCi1jbGFzcyBUZXN0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBGb28oKTsKLX07Ci0iIiIKLSAgICBleHBlY3RlZCA9ICIiIlwKLWNsYXNzIE1vY2tUZXN0IDogcHVibGljIFRlc3QgewotcHVibGljOgotTU9DS19NRVRIT0QwKEZvbywKLXZvaWQoKSk7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICBleHBlY3RlZCwgc2VsZi5HZW5lcmF0ZU1vY2tzKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RUZW1wbGF0ZWRDbGFzcyhzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLXRlbXBsYXRlIDx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgotY2xhc3MgVGVzdCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgRm9vKCk7Ci19OwotIiIiCi0gICAgZXhwZWN0ZWQgPSAiIiJcCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgotY2xhc3MgTW9ja1Rlc3QgOiBwdWJsaWMgVGVzdDxUMCwgVDE+IHsKLXB1YmxpYzoKLU1PQ0tfTUVUSE9EMF9UKEZvbywKLXZvaWQoKSk7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICBleHBlY3RlZCwgc2VsZi5HZW5lcmF0ZU1vY2tzKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RUZW1wbGF0ZUluQVRlbXBsYXRlVHlwZWRlZihzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIFRlc3QgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6Omxpc3Q8aW50Pj4gRm9vVHlwZTsKLSAgdmlydHVhbCB2b2lkIEJhcihjb25zdCBGb29UeXBlJiB0ZXN0X2FyZyk7Ci19OwotIiIiCi0gICAgZXhwZWN0ZWQgPSAiIiJcCi1jbGFzcyBNb2NrVGVzdCA6IHB1YmxpYyBUZXN0IHsKLXB1YmxpYzoKLU1PQ0tfTUVUSE9EMShCYXIsCi12b2lkKGNvbnN0IEZvb1R5cGUmIHRlc3RfYXJnKSk7Ci19OwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAotICAgICAgICBleHBlY3RlZCwgc2VsZi5HZW5lcmF0ZU1vY2tzKHNvdXJjZSkpCi0KLSAgZGVmIHRlc3RUZW1wbGF0ZUluQVRlbXBsYXRlVHlwZWRlZldpdGhDb21tYShzZWxmKToKLSAgICBzb3VyY2UgPSAiIiIKLWNsYXNzIFRlc3QgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoCi0gICAgICBjb25zdCB2ZWN0b3I8c3RkOjpsaXN0PGludD4+JiwgaW50PiBGb29UeXBlOwotICB2aXJ0dWFsIHZvaWQgQmFyKGNvbnN0IEZvb1R5cGUmIHRlc3RfYXJnKTsKLX07Ci0iIiIKLSAgICBleHBlY3RlZCA9ICIiIlwKLWNsYXNzIE1vY2tUZXN0IDogcHVibGljIFRlc3QgewotcHVibGljOgotTU9DS19NRVRIT0QxKEJhciwKLXZvaWQoY29uc3QgRm9vVHlwZSYgdGVzdF9hcmcpKTsKLX07Ci0iIiIKLSAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCi0gICAgICAgIGV4cGVjdGVkLCBzZWxmLkdlbmVyYXRlTW9ja3Moc291cmNlKSkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9rZXl3b3Jkcy5weSBiL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2tleXdvcmRzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjk0NDUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2tleXdvcmRzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA3IE5lYWwgTm9yd2l0egotIyBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIiIiQysrIGtleXdvcmRzIGFuZCBoZWxwZXIgdXRpbGl0aWVzIGZvciBkZXRlcm1pbmluZyBrZXl3b3Jkcy4iIiIKLQotX19hdXRob3JfXyA9ICdubm9yd2l0ekBnb29nbGUuY29tIChOZWFsIE5vcndpdHopJwotCi0KLXRyeToKLSAgICAjIFB5dGhvbiAzLngKLSAgICBpbXBvcnQgYnVpbHRpbnMKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAjIFB5dGhvbiAyLngKLSAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKLQotCi1pZiBub3QgaGFzYXR0cihidWlsdGlucywgJ3NldCcpOgotICAgICMgTm9taW5hbCBzdXBwb3J0IGZvciBQeXRob24gMi4zLgotICAgIGZyb20gc2V0cyBpbXBvcnQgU2V0IGFzIHNldAotCi0KLVRZUEVTID0gc2V0KCdib29sIGNoYXIgaW50IGxvbmcgc2hvcnQgZG91YmxlIGZsb2F0IHZvaWQgd2NoYXJfdCB1bnNpZ25lZCBzaWduZWQnLnNwbGl0KCkpCi1UWVBFX01PRElGSUVSUyA9IHNldCgnYXV0byByZWdpc3RlciBjb25zdCBpbmxpbmUgZXh0ZXJuIHN0YXRpYyB2aXJ0dWFsIHZvbGF0aWxlIG11dGFibGUnLnNwbGl0KCkpCi1BQ0NFU1MgPSBzZXQoJ3B1YmxpYyBwcm90ZWN0ZWQgcHJpdmF0ZSBmcmllbmQnLnNwbGl0KCkpCi0KLUNBU1RTID0gc2V0KCdzdGF0aWNfY2FzdCBjb25zdF9jYXN0IGR5bmFtaWNfY2FzdCByZWludGVycHJldF9jYXN0Jy5zcGxpdCgpKQotCi1PVEhFUlMgPSBzZXQoJ3RydWUgZmFsc2UgYXNtIGNsYXNzIG5hbWVzcGFjZSB1c2luZyBleHBsaWNpdCB0aGlzIG9wZXJhdG9yIHNpemVvZicuc3BsaXQoKSkKLU9USEVSX1RZUEVTID0gc2V0KCduZXcgZGVsZXRlIHR5cGVkZWYgc3RydWN0IHVuaW9uIGVudW0gdHlwZWlkIHR5cGVuYW1lIHRlbXBsYXRlJy5zcGxpdCgpKQotCi1DT05UUk9MID0gc2V0KCdjYXNlIHN3aXRjaCBkZWZhdWx0IGlmIGVsc2UgcmV0dXJuIGdvdG8nLnNwbGl0KCkpCi1FWENFUFRJT04gPSBzZXQoJ3RyeSBjYXRjaCB0aHJvdycuc3BsaXQoKSkKLUxPT1AgPSBzZXQoJ3doaWxlIGRvIGZvciBicmVhayBjb250aW51ZScuc3BsaXQoKSkKLQotQUxMID0gVFlQRVMgfCBUWVBFX01PRElGSUVSUyB8IEFDQ0VTUyB8IENBU1RTIHwgT1RIRVJTIHwgT1RIRVJfVFlQRVMgfCBDT05UUk9MIHwgRVhDRVBUSU9OIHwgTE9PUAotCi0KLWRlZiBJc0tleXdvcmQodG9rZW4pOgotICAgIHJldHVybiB0b2tlbiBpbiBBTEwKLQotZGVmIElzQnVpbHRpblR5cGUodG9rZW4pOgotICAgIGlmIHRva2VuIGluICgndmlydHVhbCcsICdpbmxpbmUnKToKLSAgICAgICAgIyBUaGVzZSBvbmx5IGFwcGx5IHRvIG1ldGhvZHMsIHRoZXkgY2FuJ3QgYmUgdHlwZXMgYnkgdGhlbXNlbHZlcy4KLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIHRva2VuIGluIFRZUEVTIG9yIHRva2VuIGluIFRZUEVfTU9ESUZJRVJTCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC90b2tlbml6ZS5weSBiL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3Rva2VuaXplLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTlkNTU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3Rva2VuaXplLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwNyBOZWFsIE5vcndpdHoKLSMgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSIiIlRva2VuaXplIEMrKyBzb3VyY2UgY29kZS4iIiIKLQotX19hdXRob3JfXyA9ICdubm9yd2l0ekBnb29nbGUuY29tIChOZWFsIE5vcndpdHopJwotCi0KLXRyeToKLSAgICAjIFB5dGhvbiAzLngKLSAgICBpbXBvcnQgYnVpbHRpbnMKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAjIFB5dGhvbiAyLngKLSAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKLQotCi1pbXBvcnQgc3lzCi0KLWZyb20gY3BwIGltcG9ydCB1dGlscwotCi0KLWlmIG5vdCBoYXNhdHRyKGJ1aWx0aW5zLCAnc2V0Jyk6Ci0gICAgIyBOb21pbmFsIHN1cHBvcnQgZm9yIFB5dGhvbiAyLjMuCi0gICAgZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgc2V0Ci0KLQotIyBBZGQgJCBhcyBhIHZhbGlkIGlkZW50aWZpZXIgY2hhciBzaW5jZSBzbyBtdWNoIGNvZGUgdXNlcyBpdC4KLV9sZXR0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotVkFMSURfSURFTlRJRklFUl9DSEFSUyA9IHNldChfbGV0dGVycyArIF9sZXR0ZXJzLnVwcGVyKCkgKyAnXzAxMjM0NTY3ODkkJykKLUhFWF9ESUdJVFMgPSBzZXQoJzAxMjM0NTY3ODlhYmNkZWZBQkNERUYnKQotSU5UX09SX0ZMT0FUX0RJR0lUUyA9IHNldCgnMDEyMzQ1Njc4OTBlRS0rJykKLQotCi0jIEMrKzB4IHN0cmluZyBwcmVmZml4ZXMuCi1fU1RSX1BSRUZJWEVTID0gc2V0KCgnUicsICd1OCcsICd1OFInLCAndScsICd1UicsICdVJywgJ1VSJywgJ0wnLCAnTFInKSkKLQotCi0jIFRva2VuIHR5cGVzLgotVU5LTk9XTiA9ICdVTktOT1dOJwotU1lOVEFYID0gJ1NZTlRBWCcKLUNPTlNUQU5UID0gJ0NPTlNUQU5UJwotTkFNRSA9ICdOQU1FJwotUFJFUFJPQ0VTU09SID0gJ1BSRVBST0NFU1NPUicKLQotIyBXaGVyZSB0aGUgdG9rZW4gb3JpZ2luYXRlZCBmcm9tLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgYmFja3RyYWNraW5nLgotIyBJdCBpcyBhbHdheXMgc2V0IHRvIFdIRU5DRV9TVFJFQU0gaW4gdGhpcyBjb2RlLgotV0hFTkNFX1NUUkVBTSwgV0hFTkNFX1FVRVVFID0gcmFuZ2UoMikKLQotCi1jbGFzcyBUb2tlbihvYmplY3QpOgotICAgICIiIkRhdGEgY29udGFpbmVyIHRvIHJlcHJlc2VudCBhIEMrKyB0b2tlbi4KLQotICAgIFRva2VucyBjYW4gYmUgaWRlbnRpZmllcnMsIHN5bnRheCBjaGFyKHMpLCBjb25zdGFudHMsIG9yCi0gICAgcHJlLXByb2Nlc3NvciBkaXJlY3RpdmVzLgotCi0gICAgc3RhcnQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyIG9mIHRoZSB0b2tlbiBpbiB0aGUgc291cmNlCi0gICAgZW5kIGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyIG9mIHRoZSB0b2tlbiBpbiB0aGUgc291cmNlCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5fdHlwZSwgbmFtZSwgc3RhcnQsIGVuZCk6Ci0gICAgICAgIHNlbGYudG9rZW5fdHlwZSA9IHRva2VuX3R5cGUKLSAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKLSAgICAgICAgc2VsZi5lbmQgPSBlbmQKLSAgICAgICAgc2VsZi53aGVuY2UgPSBXSEVOQ0VfU1RSRUFNCi0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgaWYgbm90IHV0aWxzLkRFQlVHOgotICAgICAgICAgICAgcmV0dXJuICdUb2tlbiglciknICUgc2VsZi5uYW1lCi0gICAgICAgIHJldHVybiAnVG9rZW4oJXIsICVzLCAlcyknICUgKHNlbGYubmFtZSwgc2VsZi5zdGFydCwgc2VsZi5lbmQpCi0KLSAgICBfX3JlcHJfXyA9IF9fc3RyX18KLQotCi1kZWYgX0dldFN0cmluZyhzb3VyY2UsIHN0YXJ0LCBpKToKLSAgICBpID0gc291cmNlLmZpbmQoJyInLCBpKzEpCi0gICAgd2hpbGUgc291cmNlW2ktMV0gPT0gJ1xcJzoKLSAgICAgICAgIyBDb3VudCB0aGUgdHJhaWxpbmcgYmFja3NsYXNoZXMuCi0gICAgICAgIGJhY2tzbGFzaF9jb3VudCA9IDEKLSAgICAgICAgaiA9IGkgLSAyCi0gICAgICAgIHdoaWxlIHNvdXJjZVtqXSA9PSAnXFwnOgotICAgICAgICAgICAgYmFja3NsYXNoX2NvdW50ICs9IDEKLSAgICAgICAgICAgIGogLT0gMQotICAgICAgICAjIFdoZW4gdHJhaWxpbmcgYmFja3NsYXNoZXMgYXJlIGV2ZW4sIHRoZXkgZXNjYXBlIGVhY2ggb3RoZXIuCi0gICAgICAgIGlmIChiYWNrc2xhc2hfY291bnQgJSAyKSA9PSAwOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgaSA9IHNvdXJjZS5maW5kKCciJywgaSsxKQotICAgIHJldHVybiBpICsgMQotCi0KLWRlZiBfR2V0Q2hhcihzb3VyY2UsIHN0YXJ0LCBpKToKLSAgICAjIE5PVEUobm5vcndpdHopOiBtYXkgbm90IGJlIHF1aXRlIGNvcnJlY3QsIHNob3VsZCBiZSBnb29kIGVub3VnaC4KLSAgICBpID0gc291cmNlLmZpbmQoIiciLCBpKzEpCi0gICAgd2hpbGUgc291cmNlW2ktMV0gPT0gJ1xcJzoKLSAgICAgICAgIyBOZWVkIHRvIHNwZWNpYWwgY2FzZSAnXFwnLgotICAgICAgICBpZiAoaSAtIDIpID4gc3RhcnQgYW5kIHNvdXJjZVtpLTJdID09ICdcXCc6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBpID0gc291cmNlLmZpbmQoIiciLCBpKzEpCi0gICAgIyBUcnkgdG8gaGFuZGxlIHVudGVybWluYXRlZCBzaW5nbGUgcXVvdGVzIChpbiBhICNpZiAwIGJsb2NrKS4KLSAgICBpZiBpIDwgMDoKLSAgICAgICAgaSA9IHN0YXJ0Ci0gICAgcmV0dXJuIGkgKyAxCi0KLQotZGVmIEdldFRva2Vucyhzb3VyY2UpOgotICAgICIiIlJldHVybnMgYSBzZXF1ZW5jZSBvZiBUb2tlbnMuCi0KLSAgICBBcmdzOgotICAgICAgc291cmNlOiBzdHJpbmcgb2YgQysrIHNvdXJjZSBjb2RlLgotCi0gICAgWWllbGRzOgotICAgICAgVG9rZW4gdGhhdCByZXByZXNlbnRzIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzb3VyY2UuCi0gICAgIiIiCi0gICAgIyBDYWNoZSB2YXJpb3VzIHZhbGlkIGNoYXJhY3RlciBzZXRzIGZvciBzcGVlZC4KLSAgICB2YWxpZF9pZGVudGlmaWVyX2NoYXJzID0gVkFMSURfSURFTlRJRklFUl9DSEFSUwotICAgIGhleF9kaWdpdHMgPSBIRVhfRElHSVRTCi0gICAgaW50X29yX2Zsb2F0X2RpZ2l0cyA9IElOVF9PUl9GTE9BVF9ESUdJVFMKLSAgICBpbnRfb3JfZmxvYXRfZGlnaXRzMiA9IGludF9vcl9mbG9hdF9kaWdpdHMgfCBzZXQoJy4nKQotCi0gICAgIyBPbmx5IGlnbm9yZSBlcnJvcnMgd2hpbGUgaW4gYSAjaWYgMCBibG9jay4KLSAgICBpZ25vcmVfZXJyb3JzID0gRmFsc2UKLSAgICBjb3VudF9pZnMgPSAwCi0KLSAgICBpID0gMAotICAgIGVuZCA9IGxlbihzb3VyY2UpCi0gICAgd2hpbGUgaSA8IGVuZDoKLSAgICAgICAgIyBTa2lwIHdoaXRlc3BhY2UuCi0gICAgICAgIHdoaWxlIGkgPCBlbmQgYW5kIHNvdXJjZVtpXS5pc3NwYWNlKCk6Ci0gICAgICAgICAgICBpICs9IDEKLSAgICAgICAgaWYgaSA+PSBlbmQ6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICB0b2tlbl90eXBlID0gVU5LTk9XTgotICAgICAgICBzdGFydCA9IGkKLSAgICAgICAgYyA9IHNvdXJjZVtpXQotICAgICAgICBpZiBjLmlzYWxwaGEoKSBvciBjID09ICdfJzogICAgICAgICAgICAgICMgRmluZCBhIHN0cmluZyB0b2tlbi4KLSAgICAgICAgICAgIHRva2VuX3R5cGUgPSBOQU1FCi0gICAgICAgICAgICB3aGlsZSBzb3VyY2VbaV0gaW4gdmFsaWRfaWRlbnRpZmllcl9jaGFyczoKLSAgICAgICAgICAgICAgICBpICs9IDEKLSAgICAgICAgICAgICMgU3RyaW5nIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzIGNhbiBsb29rIGxpa2UgYSBuYW1lIGlmCi0gICAgICAgICAgICAjIHRoZXkgYXJlIHNvbWV0aGluZyBsaWtlIEwiIi4KLSAgICAgICAgICAgIGlmIChzb3VyY2VbaV0gPT0gIiciIGFuZCAoaSAtIHN0YXJ0KSA9PSAxIGFuZAotICAgICAgICAgICAgICAgIHNvdXJjZVtzdGFydDppXSBpbiAndVVMJyk6Ci0gICAgICAgICAgICAgICAgIyB1LCBVLCBhbmQgTCBhcmUgdmFsaWQgQysrMHggY2hhcmFjdGVyIHByZWZmaXhlcy4KLSAgICAgICAgICAgICAgICB0b2tlbl90eXBlID0gQ09OU1RBTlQKLSAgICAgICAgICAgICAgICBpID0gX0dldENoYXIoc291cmNlLCBzdGFydCwgaSkKLSAgICAgICAgICAgIGVsaWYgc291cmNlW2ldID09ICInIiBhbmQgc291cmNlW3N0YXJ0OmldIGluIF9TVFJfUFJFRklYRVM6Ci0gICAgICAgICAgICAgICAgdG9rZW5fdHlwZSA9IENPTlNUQU5UCi0gICAgICAgICAgICAgICAgaSA9IF9HZXRTdHJpbmcoc291cmNlLCBzdGFydCwgaSkKLSAgICAgICAgZWxpZiBjID09ICcvJyBhbmQgc291cmNlW2krMV0gPT0gJy8nOiAgICAjIEZpbmQgLy8gY29tbWVudHMuCi0gICAgICAgICAgICBpID0gc291cmNlLmZpbmQoJ1xuJywgaSkKLSAgICAgICAgICAgIGlmIGkgPT0gLTE6ICAjIEhhbmRsZSBFT0YuCi0gICAgICAgICAgICAgICAgaSA9IGVuZAotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZWxpZiBjID09ICcvJyBhbmQgc291cmNlW2krMV0gPT0gJyonOiAgICAjIEZpbmQgLyogY29tbWVudHMuICovCi0gICAgICAgICAgICBpID0gc291cmNlLmZpbmQoJyovJywgaSkgKyAyCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBlbGlmIGMgaW4gJzorLTw+JnwqPSc6ICAgICAgICAgICAgICAgICAgICMgOiBvciA6OiAocGx1cyBvdGhlciBjaGFycykuCi0gICAgICAgICAgICB0b2tlbl90eXBlID0gU1lOVEFYCi0gICAgICAgICAgICBpICs9IDEKLSAgICAgICAgICAgIG5ld19jaCA9IHNvdXJjZVtpXQotICAgICAgICAgICAgaWYgbmV3X2NoID09IGMgYW5kIGMgIT0gJz4nOiAgICAgICAgICMgVHJlYXQgIj4+IiBhcyB0d28gdG9rZW5zLgotICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgZWxpZiBjID09ICctJyBhbmQgbmV3X2NoID09ICc+JzoKLSAgICAgICAgICAgICAgICBpICs9IDEKLSAgICAgICAgICAgIGVsaWYgbmV3X2NoID09ICc9JzoKLSAgICAgICAgICAgICAgICBpICs9IDEKLSAgICAgICAgZWxpZiBjIGluICcoKVtde31+IT9eJTsvLiwnOiAgICAgICAgICAgICAjIEhhbmRsZSBzaW5nbGUgY2hhciB0b2tlbnMuCi0gICAgICAgICAgICB0b2tlbl90eXBlID0gU1lOVEFYCi0gICAgICAgICAgICBpICs9IDEKLSAgICAgICAgICAgIGlmIGMgPT0gJy4nIGFuZCBzb3VyY2VbaV0uaXNkaWdpdCgpOgotICAgICAgICAgICAgICAgIHRva2VuX3R5cGUgPSBDT05TVEFOVAotICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgICAgIHdoaWxlIHNvdXJjZVtpXSBpbiBpbnRfb3JfZmxvYXRfZGlnaXRzOgotICAgICAgICAgICAgICAgICAgICBpICs9IDEKLSAgICAgICAgICAgICAgICAjIEhhbmRsZSBmbG9hdCBzdWZmaXhlcy4KLSAgICAgICAgICAgICAgICBmb3Igc3VmZml4IGluICgnbCcsICdmJyk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHN1ZmZpeCA9PSBzb3VyY2VbaTppKzFdLmxvd2VyKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsaWYgYy5pc2RpZ2l0KCk6ICAgICAgICAgICAgICAgICAgICAgICAgIyBGaW5kIGludGVnZXIuCi0gICAgICAgICAgICB0b2tlbl90eXBlID0gQ09OU1RBTlQKLSAgICAgICAgICAgIGlmIGMgPT0gJzAnIGFuZCBzb3VyY2VbaSsxXSBpbiAneFgnOgotICAgICAgICAgICAgICAgICMgSGFuZGxlIGhleCBkaWdpdHMuCi0gICAgICAgICAgICAgICAgaSArPSAyCi0gICAgICAgICAgICAgICAgd2hpbGUgc291cmNlW2ldIGluIGhleF9kaWdpdHM6Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB3aGlsZSBzb3VyY2VbaV0gaW4gaW50X29yX2Zsb2F0X2RpZ2l0czI6Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgIyBIYW5kbGUgaW50ZWdlciAoYW5kIGZsb2F0KSBzdWZmaXhlcy4KLSAgICAgICAgICAgIGZvciBzdWZmaXggaW4gKCd1bGwnLCAnbGwnLCAndWwnLCAnbCcsICdmJywgJ3UnKToKLSAgICAgICAgICAgICAgICBzaXplID0gbGVuKHN1ZmZpeCkKLSAgICAgICAgICAgICAgICBpZiBzdWZmaXggPT0gc291cmNlW2k6aStzaXplXS5sb3dlcigpOgotICAgICAgICAgICAgICAgICAgICBpICs9IHNpemUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZWxpZiBjID09ICciJzogICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZpbmQgc3RyaW5nLgotICAgICAgICAgICAgdG9rZW5fdHlwZSA9IENPTlNUQU5UCi0gICAgICAgICAgICBpID0gX0dldFN0cmluZyhzb3VyY2UsIHN0YXJ0LCBpKQotICAgICAgICBlbGlmIGMgPT0gIiciOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRmluZCBjaGFyLgotICAgICAgICAgICAgdG9rZW5fdHlwZSA9IENPTlNUQU5UCi0gICAgICAgICAgICBpID0gX0dldENoYXIoc291cmNlLCBzdGFydCwgaSkKLSAgICAgICAgZWxpZiBjID09ICcjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZpbmQgcHJlLXByb2Nlc3NvciBjb21tYW5kLgotICAgICAgICAgICAgdG9rZW5fdHlwZSA9IFBSRVBST0NFU1NPUgotICAgICAgICAgICAgZ290X2lmID0gc291cmNlW2k6aSszXSA9PSAnI2lmJyBhbmQgc291cmNlW2krMzppKzRdLmlzc3BhY2UoKQotICAgICAgICAgICAgaWYgZ290X2lmOgotICAgICAgICAgICAgICAgIGNvdW50X2lmcyArPSAxCi0gICAgICAgICAgICBlbGlmIHNvdXJjZVtpOmkrNl0gPT0gJyNlbmRpZic6Ci0gICAgICAgICAgICAgICAgY291bnRfaWZzIC09IDEKLSAgICAgICAgICAgICAgICBpZiBjb3VudF9pZnMgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgaWdub3JlX2Vycm9ycyA9IEZhbHNlCi0KLSAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBwcmVwcm9jZXNzb3Igc3RhdGVtZW50cyAoXCBjb250aW51YXRpb25zKS4KLSAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgaTEgPSBzb3VyY2UuZmluZCgnXG4nLCBpKQotICAgICAgICAgICAgICAgIGkyID0gc291cmNlLmZpbmQoJy8vJywgaSkKLSAgICAgICAgICAgICAgICBpMyA9IHNvdXJjZS5maW5kKCcvKicsIGkpCi0gICAgICAgICAgICAgICAgaTQgPSBzb3VyY2UuZmluZCgnIicsIGkpCi0gICAgICAgICAgICAgICAgIyBOT1RFKG5ub3J3aXR6KTogZG9lc24ndCBoYW5kbGUgY29tbWVudHMgaW4gI2RlZmluZSBtYWNyb3MuCi0gICAgICAgICAgICAgICAgIyBHZXQgdGhlIGZpcnN0IGltcG9ydGFudCBzeW1ib2wgKG5ld2xpbmUsIGNvbW1lbnQsIEVPRi9lbmQpLgotICAgICAgICAgICAgICAgIGkgPSBtaW4oW3ggZm9yIHggaW4gKGkxLCBpMiwgaTMsIGk0LCBlbmQpIGlmIHggIT0gLTFdKQotCi0gICAgICAgICAgICAgICAgIyBIYW5kbGUgI2luY2x1ZGUgImRpci8vZm9vLmgiIHByb3Blcmx5LgotICAgICAgICAgICAgICAgIGlmIHNvdXJjZVtpXSA9PSAnIic6Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBzb3VyY2UuZmluZCgnIicsIGkrMSkgKyAxCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpID4gMAotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICMgS2VlcCBnb2luZyBpZiBlbmQgb2YgdGhlIGxpbmUgYW5kIHRoZSBsaW5lIGVuZHMgd2l0aCBcLgotICAgICAgICAgICAgICAgIGlmIG5vdCAoaSA9PSBpMSBhbmQgc291cmNlW2ktMV0gPT0gJ1xcJyk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGdvdF9pZjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHNvdXJjZVtzdGFydCs0OmldLmxzdHJpcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLnN0YXJ0c3dpdGgoJzAnKSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5zdGFydHN3aXRoKCcoMCknKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX2Vycm9ycyA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpICs9IDEKLSAgICAgICAgZWxpZiBjID09ICdcXCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBcIGluIGNvZGUuCi0gICAgICAgICAgICAjIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZS1wcm9jZXNzb3IgXCBoYW5kbGluZy4KLSAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZWxpZiBpZ25vcmVfZXJyb3JzOgotICAgICAgICAgICAgIyBUaGUgdG9rZW5pemVyIHNlZW1zIHRvIGJlIGluIHByZXR0eSBnb29kIHNoYXBlLiAgVGhpcwotICAgICAgICAgICAgIyByYWlzZSBpcyBjb25kaXRpb25hbGx5IGRpc2FibGVkIHNvIHRoYXQgYm9ndXMgY29kZQotICAgICAgICAgICAgIyBpbiBhbiAjaWYgMCBibG9jayBjYW4gYmUgaGFuZGxlZC4gIFNpbmNlIHdlIHdpbGwgaWdub3JlCi0gICAgICAgICAgICAjIGl0IGFueXdheXMsIHRoaXMgaXMgcHJvYmFibHkgZmluZS4gIFNvIGRpc2FibGUgdGhlCi0gICAgICAgICAgICAjIGV4Y2VwdGlvbiBhbmQgIHJldHVybiB0aGUgYm9ndXMgY2hhci4KLSAgICAgICAgICAgIGkgKz0gMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnR290IGludmFsaWQgdG9rZW4gaW4gJXMgQCAlZCB0b2tlbjolczogJXJcbicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJz8nLCBpLCBjLCBzb3VyY2VbaS0xMDppKzEwXSkpCi0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3VuZXhwZWN0ZWQgdG9rZW4nKQotCi0gICAgICAgIGlmIGkgPD0gMDoKLSAgICAgICAgICAgIHByaW50KCdJbnZhbGlkIGluZGV4LCBleGl0aW5nIG5vdy4nKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHlpZWxkIFRva2VuKHRva2VuX3R5cGUsIHNvdXJjZVtzdGFydDppXSwgc3RhcnQsIGkpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBkZWYgbWFpbihhcmd2KToKLSAgICAgICAgIiIiRHJpdmVyIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4iIiIKLSAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3ZbMTpdOgotICAgICAgICAgICAgc291cmNlID0gdXRpbHMuUmVhZEZpbGUoZmlsZW5hbWUpCi0gICAgICAgICAgICBpZiBzb3VyY2UgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICAgICBmb3IgdG9rZW4gaW4gR2V0VG9rZW5zKHNvdXJjZSk6Ci0gICAgICAgICAgICAgICAgcHJpbnQoJyUtMTJzOiAlcycgJSAodG9rZW4udG9rZW5fdHlwZSwgdG9rZW4ubmFtZSkpCi0gICAgICAgICAgICAgICAgIyBwcmludCgnXHIlNi4yZiUlJyAlICgxMDAuMCAqIGluZGV4IC8gdG9rZW4uZW5kKSwpCi0gICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCi0KLQotICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC91dGlscy5weSBiL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3V0aWxzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYWIzNmVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3V0aWxzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA3IE5lYWwgTm9yd2l0egotIyBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIiIiR2VuZXJpYyB1dGlsaXRpZXMgZm9yIEMrKyBwYXJzaW5nLiIiIgotCi1fX2F1dGhvcl9fID0gJ25ub3J3aXR6QGdvb2dsZS5jb20gKE5lYWwgTm9yd2l0eiknCi0KLQotaW1wb3J0IHN5cwotCi0KLSMgU2V0IHRvIFRydWUgdG8gc2VlIHRoZSBzdGFydC9lbmQgdG9rZW4gaW5kaWNlcy4KLURFQlVHID0gVHJ1ZQotCi0KLWRlZiBSZWFkRmlsZShmaWxlbmFtZSwgcHJpbnRfZXJyb3I9VHJ1ZSk6Ci0gICAgIiIiUmV0dXJucyB0aGUgY29udGVudHMgb2YgYSBmaWxlLiIiIgotICAgIHRyeToKLSAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gZnAucmVhZCgpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBmcC5jbG9zZSgpCi0gICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgIGlmIHByaW50X2Vycm9yOgotICAgICAgICAgICAgcHJpbnQoJ0Vycm9yIHJlYWRpbmcgJXM6ICVzJyAlIChmaWxlbmFtZSwgc3lzLmV4Y19pbmZvKClbMV0pKQotICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9zY3JpcHRzL2dlbmVyYXRvci9nbW9ja19nZW4ucHkgYi90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2dtb2NrX2dlbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNjMGQxMy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2dtb2NrX2dlbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIiIiRHJpdmVyIGZvciBzdGFydGluZyB1cCBHb29nbGUgTW9jayBjbGFzcyBnZW5lcmF0b3IuIiIiCi0KLV9fYXV0aG9yX18gPSAnbm5vcndpdHpAZ29vZ2xlLmNvbSAoTmVhbCBOb3J3aXR6KScKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICMgQWRkIHRoZSBkaXJlY3Rvcnkgb2YgdGhpcyBzY3JpcHQgdG8gdGhlIHBhdGggc28gd2UgY2FuIGltcG9ydCBnbW9ja19jbGFzcy4KLSAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCi0KLSAgZnJvbSBjcHAgaW1wb3J0IGdtb2NrX2NsYXNzCi0gICMgRml4IHRoZSBkb2NzdHJpbmcgaW4gY2FzZSB0aGV5IHJlcXVpcmUgdGhlIHVzYWdlLgotICBnbW9ja19jbGFzcy5fX2RvY19fID0gZ21vY2tfY2xhc3MuX19kb2NfXy5yZXBsYWNlKCdnbW9ja19jbGFzcy5weScsIF9fZmlsZV9fKQotICBnbW9ja19jbGFzcy5tYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nbW9jay1jb25maWcuaW4gYi90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ21vY2stY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmFlZmU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nbW9jay1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgVGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGZpbGxlZCBpbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KLW5hbWU9IkBQQUNLQUdFX1RBUk5BTUVAIgotdmVyc2lvbj0iQFBBQ0tBR0VfVkVSU0lPTkAiCi0KLXNob3dfdXNhZ2UoKQotewotICBlY2hvICJVc2FnZTogZ21vY2stY29uZmlnIFtPUFRJT05TLi4uXSIKLX0KLQotc2hvd19oZWxwKCkKLXsKLSAgc2hvd191c2FnZQotICBjYXQgPDxcRU9GCi0KLVRoZSBgZ21vY2stY29uZmlnJyBzY3JpcHQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBuZWNlc3NhcnkgY29tcGlsZSBhbmQgbGlua2luZwotZmxhZ3MgdG8gY29ubmVjdCB3aXRoIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmssIGJvdGggaW4gYSBidWlsZCBwcmlvciB0bwotaW5zdGFsbGF0aW9uLCBhbmQgb24gdGhlIHN5c3RlbSBwcm9wZXIgYWZ0ZXIgaW5zdGFsbGF0aW9uLiBUaGUgaW5zdGFsbGF0aW9uCi1vdmVycmlkZXMgbWF5IGJlIGlzc3VlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGFueSBvdGhlciBxdWVyaWVzLCBidXQgd2lsbCBvbmx5Ci1hZmZlY3QgaW5zdGFsbGF0aW9uIHF1ZXJpZXMgaWYgY2FsbGVkIG9uIGEgYnVpbHQgYnV0IG5vdCBpbnN0YWxsZWQgZ21vY2suIFRoZQotaW5zdGFsbGF0aW9uIHF1ZXJpZXMgbWF5IG5vdCBiZSBpc3N1ZWQgd2l0aCBhbnkgb3RoZXIgdHlwZXMgb2YgcXVlcmllcywgYW5kCi1vbmx5IG9uZSBpbnN0YWxsYXRpb24gcXVlcnkgbWF5IGJlIG1hZGUgYXQgYSB0aW1lLiBUaGUgdmVyc2lvbiBxdWVyaWVzIGFuZAotY29tcGlsZXIgZmxhZyBxdWVyaWVzIG1heSBiZSBjb21iaW5lZCBhcyBkZXNpcmVkIGJ1dCBub3QgbWl4ZWQuIERpZmZlcmVudAotdmVyc2lvbiBxdWVyaWVzIGFyZSBhbHdheXMgY29tYmluZWQgd2l0aCBsb2dpY2FsICJhbmQiIHNlbWFudGljcywgYW5kIG9ubHkgdGhlCi1sYXN0IG9mIGFueSBwYXJ0aWN1bGFyIHF1ZXJ5IGlzIHVzZWQgd2hpbGUgYWxsIHByZXZpb3VzIG9uZXMgaWdub3JlZC4gQWxsCi12ZXJzaW9ucyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIHNlcXVlbmNlIG9mIG51bWJlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMuCi1Db21waWxlciBmbGFnIHF1ZXJpZXMgb3V0cHV0IHRoZSB1bmlvbiBvZiB0aGUgc2V0cyBvZiBmbGFncyB3aGVuIGNvbWJpbmVkLgotCi0gRXhhbXBsZXM6Ci0gIGdtb2NrLWNvbmZpZyAtLW1pbi12ZXJzaW9uPTEuMCB8fCBlY2hvICJJbnN1ZmZpY2llbnQgR29vZ2xlIE1vY2sgdmVyc2lvbi4iCi0KLSAgZysrICQoZ21vY2stY29uZmlnIC0tY3BwZmxhZ3MgLS1jeHhmbGFncykgLW8gZm9vLm8gLWMgZm9vLmNwcAotICBnKysgJChnbW9jay1jb25maWcgLS1sZGZsYWdzIC0tbGlicykgLW8gZm9vIGZvby5vCi0KLSAgIyBXaGVuIHVzaW5nIGEgYnVpbHQgYnV0IG5vdCBpbnN0YWxsZWQgR29vZ2xlIE1vY2s6Ci0gIGcrKyAkKC4uLy4uL215X2dtb2NrX2J1aWxkL3NjcmlwdHMvZ21vY2stY29uZmlnIC4uLikgLi4uCi0KLSAgIyBXaGVuIHVzaW5nIGFuIGluc3RhbGxlZCBHb29nbGUgTW9jaywgYnV0IHdpdGggaW5zdGFsbGF0aW9uIG92ZXJyaWRlczoKLSAgZXhwb3J0IEdNT0NLX1BSRUZJWD0iL29wdCIKLSAgZysrICQoZ21vY2stY29uZmlnIC0tbGliZGlyPSIvb3B0L2xpYjY0IiAuLi4pIC4uLgotCi0gSGVscDoKLSAgLS11c2FnZSAgICAgICAgICAgICAgICAgICAgYnJpZWYgdXNhZ2UgaW5mb3JtYXRpb24KLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZQotCi0gSW5zdGFsbGF0aW9uIE92ZXJyaWRlczoKLSAgLS1wcmVmaXg9PGRpcj4gICAgICAgICAgICAgb3ZlcnJpZGVzIHRoZSBpbnN0YWxsYXRpb24gcHJlZml4Ci0gIC0tZXhlYy1wcmVmaXg9PGRpcj4gICAgICAgIG92ZXJyaWRlcyB0aGUgZXhlY3V0YWJsZSBpbnN0YWxsYXRpb24gcHJlZml4Ci0gIC0tbGliZGlyPTxkaXI+ICAgICAgICAgICAgIG92ZXJyaWRlcyB0aGUgbGlicmFyeSBpbnN0YWxsYXRpb24gcHJlZml4Ci0gIC0taW5jbHVkZWRpcj08ZGlyPiAgICAgICAgIG92ZXJyaWRlcyB0aGUgaGVhZGVyIGZpbGUgaW5zdGFsbGF0aW9uIHByZWZpeAotCi0gSW5zdGFsbGF0aW9uIFF1ZXJpZXM6Ci0gIC0tcHJlZml4ICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbiBwcmVmaXgKLSAgLS1leGVjLXByZWZpeCAgICAgICAgICAgICAgZXhlY3V0YWJsZSBpbnN0YWxsYXRpb24gcHJlZml4Ci0gIC0tbGliZGlyICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotICAtLWluY2x1ZGVkaXIgICAgICAgICAgICAgICBoZWFkZXIgZmlsZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBHb29nbGUgTW9jayBpbnN0YWxsYXRpb24KLQotIFZlcnNpb24gUXVlcmllczoKLSAgLS1taW4tdmVyc2lvbj1WRVJTSU9OICAgICAgcmV0dXJuIDAgaWYgdGhlIHZlcnNpb24gaXMgYXQgbGVhc3QgVkVSU0lPTgotICAtLWV4YWN0LXZlcnNpb249VkVSU0lPTiAgICByZXR1cm4gMCBpZiB0aGUgdmVyc2lvbiBpcyBleGFjdGx5IFZFUlNJT04KLSAgLS1tYXgtdmVyc2lvbj1WRVJTSU9OICAgICAgcmV0dXJuIDAgaWYgdGhlIHZlcnNpb24gaXMgYXQgbW9zdCBWRVJTSU9OCi0KLSBDb21waWxhdGlvbiBGbGFnIFF1ZXJpZXM6Ci0gIC0tY3BwZmxhZ3MgICAgICAgICAgICAgICAgIGNvbXBpbGUgZmxhZ3Mgc3BlY2lmaWMgdG8gdGhlIEMtbGlrZSBwcmVwcm9jZXNzb3JzCi0gIC0tY3h4ZmxhZ3MgICAgICAgICAgICAgICAgIGNvbXBpbGUgZmxhZ3MgYXBwcm9wcmlhdGUgZm9yIEMrKyBwcm9ncmFtcwotICAtLWxkZmxhZ3MgICAgICAgICAgICAgICAgICBsaW5rZXIgZmxhZ3MKLSAgLS1saWJzICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzIGZvciBsaW5raW5nCi0KLUVPRgotfQotCi0jIFRoaXMgZnVuY3Rpb24gYm91bmRzIG91ciB2ZXJzaW9uIHdpdGggYSBtaW4gYW5kIGEgbWF4LiBJdCB1c2VzIHNvbWUgY2xldmVyCi0jIFBPU0lYLWNvbXBsaWFudCB2YXJpYWJsZSBleHBhbnNpb24gdG8gcG9ydGFibHkgZG8gYWxsIHRoZSB3b3JrIGluIHRoZSBzaGVsbAotIyBhbmQgYXZvaWQgYW55IGRlcGVuZGVuY3kgb24gYSBwYXJ0aWN1bGFyICJzZWQiIG9yICJhd2siIGltcGxlbWVudGF0aW9uLgotIyBOb3RhYmxlIGlzIHRoYXQgaXQgd2lsbCBvbmx5IGV2ZXIgY29tcGFyZSB0aGUgZmlyc3QgMyBjb21wb25lbnRzIG9mIHZlcnNpb25zLgotIyBGdXJ0aGVyIGNvbXBvbmVudHMgd2lsbCBiZSBjbGVhbmx5IHN0cmlwcGVkIG9mZi4gQWxsIHZlcnNpb25zIG11c3QgYmUKLSMgdW5hZG9ybmVkLCBzbyAidjEuMCIgd2lsbCAqbm90KiB3b3JrLiBUaGUgbWluaW11bSB2ZXJzaW9uIG11c3QgYmUgaW4gJDEsIGFuZAotIyB0aGUgbWF4IGluICQyLiBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogSWYgdGhpcyBldmVyIGJyZWFrcywgd2Ugc2hvdWxkCi0jIGludmVzdGlnYXRlIGV4cGFuZGluZyB0aGlzIHZpYSBhdXRvbTR0ZSBmcm9tIEFTX1ZFUlNJT05fQ09NUEFSRSByYXRoZXIgdGhhbgotIyBjb250aW51aW5nIHRvIG1haW50YWluIG91ciBvd24gc2hlbGwgdmVyc2lvbi4KLWNoZWNrX3ZlcnNpb25zKCkKLXsKLSAgbWFqb3JfdmVyc2lvbj0ke3ZlcnNpb24lJS4qfQotICBtaW5vcl92ZXJzaW9uPSIwIgotICBwb2ludF92ZXJzaW9uPSIwIgotICBpZiB0ZXN0ICIke3ZlcnNpb24jKi59IiAhPSAiJHt2ZXJzaW9ufSI7IHRoZW4KLSAgICBtaW5vcl92ZXJzaW9uPSR7dmVyc2lvbiMqLn0KLSAgICBtaW5vcl92ZXJzaW9uPSR7bWlub3JfdmVyc2lvbiUlLip9Ci0gIGZpCi0gIGlmIHRlc3QgIiR7dmVyc2lvbiMqLioufSIgIT0gIiR7dmVyc2lvbn0iOyB0aGVuCi0gICAgcG9pbnRfdmVyc2lvbj0ke3ZlcnNpb24jKi4qLn0KLSAgICBwb2ludF92ZXJzaW9uPSR7cG9pbnRfdmVyc2lvbiUlLip9Ci0gIGZpCi0KLSAgbWluX3ZlcnNpb249IiQxIgotICBtaW5fbWFqb3JfdmVyc2lvbj0ke21pbl92ZXJzaW9uJSUuKn0KLSAgbWluX21pbm9yX3ZlcnNpb249IjAiCi0gIG1pbl9wb2ludF92ZXJzaW9uPSIwIgotICBpZiB0ZXN0ICIke21pbl92ZXJzaW9uIyoufSIgIT0gIiR7bWluX3ZlcnNpb259IjsgdGhlbgotICAgIG1pbl9taW5vcl92ZXJzaW9uPSR7bWluX3ZlcnNpb24jKi59Ci0gICAgbWluX21pbm9yX3ZlcnNpb249JHttaW5fbWlub3JfdmVyc2lvbiUlLip9Ci0gIGZpCi0gIGlmIHRlc3QgIiR7bWluX3ZlcnNpb24jKi4qLn0iICE9ICIke21pbl92ZXJzaW9ufSI7IHRoZW4KLSAgICBtaW5fcG9pbnRfdmVyc2lvbj0ke21pbl92ZXJzaW9uIyouKi59Ci0gICAgbWluX3BvaW50X3ZlcnNpb249JHttaW5fcG9pbnRfdmVyc2lvbiUlLip9Ci0gIGZpCi0KLSAgbWF4X3ZlcnNpb249IiQyIgotICBtYXhfbWFqb3JfdmVyc2lvbj0ke21heF92ZXJzaW9uJSUuKn0KLSAgbWF4X21pbm9yX3ZlcnNpb249IjAiCi0gIG1heF9wb2ludF92ZXJzaW9uPSIwIgotICBpZiB0ZXN0ICIke21heF92ZXJzaW9uIyoufSIgIT0gIiR7bWF4X3ZlcnNpb259IjsgdGhlbgotICAgIG1heF9taW5vcl92ZXJzaW9uPSR7bWF4X3ZlcnNpb24jKi59Ci0gICAgbWF4X21pbm9yX3ZlcnNpb249JHttYXhfbWlub3JfdmVyc2lvbiUlLip9Ci0gIGZpCi0gIGlmIHRlc3QgIiR7bWF4X3ZlcnNpb24jKi4qLn0iICE9ICIke21heF92ZXJzaW9ufSI7IHRoZW4KLSAgICBtYXhfcG9pbnRfdmVyc2lvbj0ke21heF92ZXJzaW9uIyouKi59Ci0gICAgbWF4X3BvaW50X3ZlcnNpb249JHttYXhfcG9pbnRfdmVyc2lvbiUlLip9Ci0gIGZpCi0KLSAgdGVzdCAkKCgkbWFqb3JfdmVyc2lvbikpIC1sdCAkKCgkbWluX21ham9yX3ZlcnNpb24pKSAmJiBleGl0IDEKLSAgaWYgdGVzdCAkKCgkbWFqb3JfdmVyc2lvbikpIC1lcSAkKCgkbWluX21ham9yX3ZlcnNpb24pKTsgdGhlbgotICAgIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9taW5vcl92ZXJzaW9uKSkgJiYgZXhpdCAxCi0gICAgaWYgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1lcSAkKCgkbWluX21pbm9yX3ZlcnNpb24pKTsgdGhlbgotICAgICAgdGVzdCAkKCgkcG9pbnRfdmVyc2lvbikpIC1sdCAkKCgkbWluX3BvaW50X3ZlcnNpb24pKSAmJiBleGl0IDEKLSAgICBmaQotICBmaQotCi0gIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtZ3QgJCgoJG1heF9tYWpvcl92ZXJzaW9uKSkgJiYgZXhpdCAxCi0gIGlmIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtZXEgJCgoJG1heF9tYWpvcl92ZXJzaW9uKSk7IHRoZW4KLSAgICB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfbWlub3JfdmVyc2lvbikpICYmIGV4aXQgMQotICAgIGlmIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZXEgJCgoJG1heF9taW5vcl92ZXJzaW9uKSk7IHRoZW4KLSAgICAgIHRlc3QgJCgoJHBvaW50X3ZlcnNpb24pKSAtZ3QgJCgoJG1heF9wb2ludF92ZXJzaW9uKSkgJiYgZXhpdCAxCi0gICAgZmkKLSAgZmkKLQotICBleGl0IDAKLX0KLQotIyBTaG93IHRoZSB1c2FnZSBsaW5lIHdoZW4gbm8gYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQuCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIHNob3dfdXNhZ2UKLSAgZXhpdCAxCi1maQotCi13aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbwotICBjYXNlICQxIGluCi0gICAgLS11c2FnZSkgICAgICAgICAgc2hvd191c2FnZTsgICAgICAgICBleGl0IDA7OwotICAgIC0taGVscCkgICAgICAgICAgIHNob3dfaGVscDsgICAgICAgICAgZXhpdCAwOzsKLQotICAgICMgSW5zdGFsbGF0aW9uIG92ZXJyaWRlcwotICAgIC0tcHJlZml4PSopICAgICAgIEdNT0NLX1BSRUZJWD0kezEjLS1wcmVmaXg9fTs7Ci0gICAgLS1leGVjLXByZWZpeD0qKSAgR01PQ0tfRVhFQ19QUkVGSVg9JHsxIy0tZXhlYy1wcmVmaXg9fTs7Ci0gICAgLS1saWJkaXI9KikgICAgICAgR01PQ0tfTElCRElSPSR7MSMtLWxpYmRpcj19OzsKLSAgICAtLWluY2x1ZGVkaXI9KikgICBHTU9DS19JTkNMVURFRElSPSR7MSMtLWluY2x1ZGVkaXI9fTs7Ci0KLSAgICAjIEluc3RhbGxhdGlvbiBxdWVyaWVzCi0gICAgLS1wcmVmaXh8LS1leGVjLXByZWZpeHwtLWxpYmRpcnwtLWluY2x1ZGVkaXJ8LS12ZXJzaW9uKQotICAgICAgaWYgdGVzdCAtbiAiJHtkb19xdWVyeX0iOyB0aGVuCi0gICAgICAgIHNob3dfdXNhZ2UKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotICAgICAgZG9fcXVlcnk9JHsxIy0tfQotICAgICAgOzsKLQotICAgICMgVmVyc2lvbiBjaGVja2luZwotICAgIC0tbWluLXZlcnNpb249KikKLSAgICAgIGRvX2NoZWNrX3ZlcnNpb25zPXllcwotICAgICAgbWluX3ZlcnNpb249JHsxIy0tbWluLXZlcnNpb249fQotICAgICAgOzsKLSAgICAtLW1heC12ZXJzaW9uPSopCi0gICAgICBkb19jaGVja192ZXJzaW9ucz15ZXMKLSAgICAgIG1heF92ZXJzaW9uPSR7MSMtLW1heC12ZXJzaW9uPX0KLSAgICAgIDs7Ci0gICAgLS1leGFjdC12ZXJzaW9uPSopCi0gICAgICBkb19jaGVja192ZXJzaW9ucz15ZXMKLSAgICAgIGV4YWN0X3ZlcnNpb249JHsxIy0tZXhhY3QtdmVyc2lvbj19Ci0gICAgICA7OwotCi0gICAgIyBDb21waWxlciBmbGFnIG91dHB1dAotICAgIC0tY3BwZmxhZ3MpICAgICAgIGVjaG9fY3BwZmxhZ3M9eWVzOzsKLSAgICAtLWN4eGZsYWdzKSAgICAgICBlY2hvX2N4eGZsYWdzPXllczs7Ci0gICAgLS1sZGZsYWdzKSAgICAgICAgZWNob19sZGZsYWdzPXllczs7Ci0gICAgLS1saWJzKSAgICAgICAgICAgZWNob19saWJzPXllczs7Ci0KLSAgICAjIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbiBlcnJvcgotICAgICopICAgICAgICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAxOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi0jIFRoZXNlIGhhdmUgZGVmYXVsdHMgZmlsbGVkIGluIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGJ1dCBjYW4gYWxzbyBiZQotIyBvdmVycmlkZGVuIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KLXByZWZpeD0iJHtHTU9DS19QUkVGSVg6LUBwcmVmaXhAfSIKLWV4ZWNfcHJlZml4PSIke0dNT0NLX0VYRUNfUFJFRklYOi1AZXhlY19wcmVmaXhAfSIKLWxpYmRpcj0iJHtHTU9DS19MSUJESVI6LUBsaWJkaXJAfSIKLWluY2x1ZGVkaXI9IiR7R01PQ0tfSU5DTFVERURJUjotQGluY2x1ZGVkaXJAfSIKLQotIyBXZSB0cnkgYW5kIGRldGVjdCBpZiBvdXIgYmluYXJ5IGlzIG5vdCBsb2NhdGVkIGF0IGl0cyBpbnN0YWxsZWQgbG9jYXRpb24uIElmCi0jIGl0J3Mgbm90LCB3ZSBwcm92aWRlIHZhcmlhYmxlcyBwb2ludGluZyB0byB0aGUgc291cmNlIGFuZCBidWlsZCB0cmVlIHJhdGhlcgotIyB0aGFuIHRvIHRoZSBpbnN0YWxsIHRyZWUuIFdlIGFsc28gbG9jYXRlIEdvb2dsZSBUZXN0IHVzaW5nIHRoZSBjb25maWd1cmVkCi0jIGd0ZXN0LWNvbmZpZyBzY3JpcHQgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRoZSBQQVRIIGFuZCBvdXIgYmluZGlyIGZvciBvbmUuCi0jIFRoaXMgYWxsb3dzIGJ1aWxkaW5nIGFnYWluc3QgYSBqdXN0LWJ1aWx0IGdtb2NrIHJhdGhlciB0aGFuIGFuIGluc3RhbGxlZAotIyBnbW9jay4KLWJpbmRpcj0iQGJpbmRpckAiCi10aGlzX3JlbGF0aXZlX2JpbmRpcj1gZGlybmFtZSAkMGAKLXRoaXNfYmluZGlyPWBjZCAke3RoaXNfcmVsYXRpdmVfYmluZGlyfTsgcHdkIC1QYAotaWYgdGVzdCAiJHt0aGlzX2JpbmRpcn0iID0gIiR7dGhpc19iaW5kaXIlJHtiaW5kaXJ9fSI7IHRoZW4KLSAgIyBUaGUgcGF0aCB0byB0aGUgc2NyaXB0IGRvZXNuJ3QgZW5kIGluIHRoZSBiaW5kaXIgc2VxdWVuY2UgZnJvbSBBdXRvY29uZiwKLSAgIyBhc3N1bWUgdGhhdCB3ZSBhcmUgaW4gYSBidWlsZCB0cmVlLgotICBidWlsZF9kaXI9YGRpcm5hbWUgJHt0aGlzX2JpbmRpcn1gCi0gIHNyY19kaXI9YGNkICR7dGhpc19iaW5kaXJ9L0B0b3Bfc3JjZGlyQDsgcHdkIC1QYAotCi0gICMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IFRoaXMgaXMgYSBkYW5nZXJvdXMgZGVwZW5kZW5jeSBvbiBsaWJ0b29sLCB3ZQotICAjIHNob3VsZCB3b3JrIHRvIHJlbW92ZSBpdCwgYW5kL29yIHJlbW92ZSBsaWJ0b29sIGFsdG9nZXRoZXIsIHJlcGxhY2luZyBpdAotICAjIHdpdGggZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIGxpYnJhcnkgYW5kIGEgbGluayBwYXRoLgotICBnbW9ja19saWJzPSIke2J1aWxkX2Rpcn0vbGliL2xpYmdtb2NrLmxhIgotICBnbW9ja19sZGZsYWdzPSIiCi0KLSAgIyBXZSBwcm92aWRlIGhvb2tzIHRvIGluY2x1ZGUgZnJvbSBlaXRoZXIgdGhlIHNvdXJjZSBvciBidWlsZCBkaXIsIHdoZXJlIHRoZQotICAjIGJ1aWxkIGRpciBpcyBhbHdheXMgcHJlZmVycmVkLiBUaGlzIHdpbGwgcG90ZW50aWFsbHkgYWxsb3cgdXMgdG8gd3JpdGUKLSAgIyBidWlsZCBydWxlcyBmb3IgZ2VuZXJhdGVkIGhlYWRlcnMgYW5kIGhhdmUgdGhlbSBhdXRvbWF0aWNhbGx5IGJlIHByZWZlcnJlZAotICAjIG92ZXIgcHJvdmlkZWQgdmVyc2lvbnMuCi0gIGdtb2NrX2NwcGZsYWdzPSItSSR7YnVpbGRfZGlyfS9pbmNsdWRlIC1JJHtzcmNfZGlyfS9pbmNsdWRlIgotICBnbW9ja19jeHhmbGFncz0iIgotCi0gICMgRGlyZWN0bHkgaW52b2tlIHRoZSBndGVzdC1jb25maWcgc2NyaXB0IHVzZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLgotICBndGVzdF9jb25maWc9IkBHVEVTVF9DT05GSUdAIgotZWxzZQotICAjIFdlJ3JlIHVzaW5nIGFuIGluc3RhbGxlZCBnbW9jaywgYWx0aG91Z2ggaXQgbWF5IGJlIHN0YWdlZCB1bmRlciBzb21lCi0gICMgcHJlZml4LiBBc3N1bWUgKGFzIG91ciBvd24gbGlicmFyaWVzIGRvKSB0aGF0IHdlIGNhbiByZXNvbHZlIHRoZSBwcmVmaXgsCi0gICMgYW5kIGFyZSBwcmVzZW50IGluIHRoZSBkeW5hbWljIGxpbmsgcGF0aHMuCi0gIGdtb2NrX2xkZmxhZ3M9Ii1MJHtsaWJkaXJ9IgotICBnbW9ja19saWJzPSItbCR7bmFtZX0iCi0gIGdtb2NrX2NwcGZsYWdzPSItSSR7aW5jbHVkZWRpcn0iCi0gIGdtb2NrX2N4eGZsYWdzPSIiCi0KLSAgIyBXZSBhbHNvIHByZWZlciBhbnkgZ3Rlc3QtY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgaW4gb3VyIHByZWZpeC4gTGFja2luZwotICAjIG9uZSwgd2UgbG9vayBpbiB0aGUgUEFUSCBmb3Igb25lLgotICBndGVzdF9jb25maWc9IiR7YmluZGlyfS9ndGVzdC1jb25maWciCi0gIGlmIHRlc3QgISAteCAiJHtndGVzdF9jb25maWd9IjsgdGhlbgotICAgIGd0ZXN0X2NvbmZpZz1gd2hpY2ggZ3Rlc3QtY29uZmlnYAotICBmaQotZmkKLQotIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGxvY2F0ZWQgYSBHb29nbGUgVGVzdCB0byBsaW5rIGFnYWluc3QuCi1pZiAhIHRlc3QgLXggIiR7Z3Rlc3RfY29uZmlnfSI7IHRoZW4KLSAgZWNobyAiVW5hYmxlIHRvIGxvY2F0ZSBHb29nbGUgVGVzdCwgY2hlY2sgeW91ciBHb29nbGUgTW9jayBjb25maWd1cmF0aW9uIiBcCi0gICAgICAgImFuZCBpbnN0YWxsYXRpb24iID4mMgotICBleGl0IDEKLWVsaWYgISAiJHtndGVzdF9jb25maWd9IiAiLS1leGFjdC12ZXJzaW9uPUBHVEVTVF9WRVJTSU9OQCI7IHRoZW4KLSAgZWNobyAiVGhlIEdvb2dsZSBUZXN0IGZvdW5kIGlzIG5vdCB0aGUgc2FtZSB2ZXJzaW9uIGFzIEdvb2dsZSBNb2NrIHdhcyAiIFwKLSAgICAgICAiYnVpbHQgYWdhaW5zdCIgPiYyCi0gIGV4aXQgMQotZmkKLQotIyBBZGQgdGhlIG5lY2Vzc2FyeSBHb29nbGUgVGVzdCBiaXRzIGludG8gdGhlIHZhcmlvdXMgZmxhZyB2YXJpYWJsZXMKLWdtb2NrX2NwcGZsYWdzPSIke2dtb2NrX2NwcGZsYWdzfSBgJHtndGVzdF9jb25maWd9IC0tY3BwZmxhZ3NgIgotZ21vY2tfY3h4ZmxhZ3M9IiR7Z21vY2tfY3h4ZmxhZ3N9IGAke2d0ZXN0X2NvbmZpZ30gLS1jeHhmbGFnc2AiCi1nbW9ja19sZGZsYWdzPSIke2dtb2NrX2xkZmxhZ3N9IGAke2d0ZXN0X2NvbmZpZ30gLS1sZGZsYWdzYCIKLWdtb2NrX2xpYnM9IiR7Z21vY2tfbGlic30gYCR7Z3Rlc3RfY29uZmlnfSAtLWxpYnNgIgotCi0jIERvIGFuIGluc3RhbGxhdGlvbiBxdWVyeSBpZiByZXF1ZXN0ZWQuCi1pZiB0ZXN0IC1uICIkZG9fcXVlcnkiOyB0aGVuCi0gIGNhc2UgJGRvX3F1ZXJ5IGluCi0gICAgcHJlZml4KSAgICAgICAgICAgZWNobyAkcHJlZml4OyAgICAgICBleGl0IDA7OwotICAgIGV4ZWMtcHJlZml4KSAgICAgIGVjaG8gJGV4ZWNfcHJlZml4OyAgZXhpdCAwOzsKLSAgICBsaWJkaXIpICAgICAgICAgICBlY2hvICRsaWJkaXI7ICAgICAgIGV4aXQgMDs7Ci0gICAgaW5jbHVkZWRpcikgICAgICAgZWNobyAkaW5jbHVkZWRpcjsgICBleGl0IDA7OwotICAgIHZlcnNpb24pICAgICAgICAgIGVjaG8gJHZlcnNpb247ICAgICAgZXhpdCAwOzsKLSAgICAqKSAgICAgICAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMTs7Ci0gIGVzYWMKLWZpCi0KLSMgRG8gYSB2ZXJzaW9uIGNoZWNrIGlmIHJlcXVlc3RlZC4KLWlmIHRlc3QgIiRkb19jaGVja192ZXJzaW9ucyIgPSAieWVzIjsgdGhlbgotICAjIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgcmVjZWl2ZSBhIGJhZCBjb21iaW5hdGlvbiBvZiBwYXJhbWV0ZXJzLgotICB0ZXN0ICIkZWNob19jcHBmbGFncyIgPSAieWVzIiAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQotICB0ZXN0ICIkZWNob19jeHhmbGFncyIgPSAieWVzIiAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQotICB0ZXN0ICIkZWNob19sZGZsYWdzIiA9ICJ5ZXMiICAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQotICB0ZXN0ICIkZWNob19saWJzIiA9ICJ5ZXMiICAgICAmJiBzaG93X3VzYWdlICYmIGV4aXQgMQotCi0gIGlmIHRlc3QgIiRleGFjdF92ZXJzaW9uIiAhPSAiIjsgdGhlbgotICAgIGNoZWNrX3ZlcnNpb25zICRleGFjdF92ZXJzaW9uICRleGFjdF92ZXJzaW9uCi0gICAgIyB1bnJlYWNoYWJsZQotICBlbHNlCi0gICAgY2hlY2tfdmVyc2lvbnMgJHttaW5fdmVyc2lvbjotMC4wLjB9ICR7bWF4X3ZlcnNpb246LTk5OTkuOTk5OS45OTk5fQotICAgICMgdW5yZWFjaGFibGUKLSAgZmkKLWZpCi0KLSMgRG8gdGhlIG91dHB1dCBpbiB0aGUgY29ycmVjdCBvcmRlciBzbyB0aGF0IHRoZXNlIGNhbiBiZSB1c2VkIGluLWxpbmUgb2YKLSMgYSBjb21waWxlciBpbnZvY2F0aW9uLgotb3V0cHV0PSIiCi10ZXN0ICIkZWNob19jcHBmbGFncyIgPSAieWVzIiAmJiBvdXRwdXQ9IiRvdXRwdXQgJGdtb2NrX2NwcGZsYWdzIgotdGVzdCAiJGVjaG9fY3h4ZmxhZ3MiID0gInllcyIgJiYgb3V0cHV0PSIkb3V0cHV0ICRnbW9ja19jeHhmbGFncyIKLXRlc3QgIiRlY2hvX2xkZmxhZ3MiID0gInllcyIgICYmIG91dHB1dD0iJG91dHB1dCAkZ21vY2tfbGRmbGFncyIKLXRlc3QgIiRlY2hvX2xpYnMiID0gInllcyIgICAgICYmIG91dHB1dD0iJG91dHB1dCAkZ21vY2tfbGlicyIKLWVjaG8gJG91dHB1dAotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nbW9ja19kb2N0b3IucHkgYi90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvZ21vY2tfZG9jdG9yLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWM0NjUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy9nbW9ja19kb2N0b3IucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NDAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiQ29udmVydHMgY29tcGlsZXIncyBlcnJvcnMgaW4gY29kZSB1c2luZyBHb29nbGUgTW9jayB0byBwbGFpbiBFbmdsaXNoLiIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLQotX1ZFUlNJT04gPSAnMS4wLjMnCi0KLV9FTUFJTCA9ICdnb29nbGVtb2NrQGdvb2dsZWdyb3Vwcy5jb20nCi0KLV9DT01NT05fR01PQ0tfU1lNQk9MUyA9IFsKLSAgICAjIE1hdGNoZXJzCi0gICAgJ18nLAotICAgICdBJywKLSAgICAnQWRkcmVzc1NhdGlzZmllcycsCi0gICAgJ0FsbE9mJywKLSAgICAnQW4nLAotICAgICdBbnlPZicsCi0gICAgJ0NvbnRhaW5lckVxJywKLSAgICAnQ29udGFpbnMnLAotICAgICdDb250YWluc1JlZ2V4JywKLSAgICAnRG91YmxlRXEnLAotICAgICdFbGVtZW50c0FyZScsCi0gICAgJ0VsZW1lbnRzQXJlQXJyYXknLAotICAgICdFbmRzV2l0aCcsCi0gICAgJ0VxJywKLSAgICAnRmllbGQnLAotICAgICdGbG9hdEVxJywKLSAgICAnR2UnLAotICAgICdHdCcsCi0gICAgJ0hhc1N1YnN0cicsCi0gICAgJ0lzSW5pdGlhbGl6ZWRQcm90bycsCi0gICAgJ0xlJywKLSAgICAnTHQnLAotICAgICdNYXRjaGVyQ2FzdCcsCi0gICAgJ01hdGNoZXMnLAotICAgICdNYXRjaGVzUmVnZXgnLAotICAgICdOYW5TZW5zaXRpdmVEb3VibGVFcScsCi0gICAgJ05hblNlbnNpdGl2ZUZsb2F0RXEnLAotICAgICdOZScsCi0gICAgJ05vdCcsCi0gICAgJ05vdE51bGwnLAotICAgICdQb2ludGVlJywKLSAgICAnUHJvcGVydHknLAotICAgICdSZWYnLAotICAgICdSZXN1bHRPZicsCi0gICAgJ1NhZmVNYXRjaGVyQ2FzdCcsCi0gICAgJ1N0YXJ0c1dpdGgnLAotICAgICdTdHJDYXNlRXEnLAotICAgICdTdHJDYXNlTmUnLAotICAgICdTdHJFcScsCi0gICAgJ1N0ck5lJywKLSAgICAnVHJ1bHknLAotICAgICdUeXBlZEVxJywKLSAgICAnVmFsdWUnLAotCi0gICAgIyBBY3Rpb25zCi0gICAgJ0Fzc2lnbicsCi0gICAgJ0J5UmVmJywKLSAgICAnRGVsZXRlQXJnJywKLSAgICAnRG9BbGwnLAotICAgICdEb0RlZmF1bHQnLAotICAgICdJZ25vcmVSZXN1bHQnLAotICAgICdJbnZva2UnLAotICAgICdJbnZva2VBcmd1bWVudCcsCi0gICAgJ0ludm9rZVdpdGhvdXRBcmdzJywKLSAgICAnUmV0dXJuJywKLSAgICAnUmV0dXJuTmV3JywKLSAgICAnUmV0dXJuTnVsbCcsCi0gICAgJ1JldHVyblJlZicsCi0gICAgJ1NhdmVBcmcnLAotICAgICdTZXRBcmdSZWZlcmVlJywKLSAgICAnU2V0QXJnUG9pbnRlZScsCi0gICAgJ1NldEFyZ3VtZW50UG9pbnRlZScsCi0gICAgJ1NldEFycmF5QXJndW1lbnQnLAotICAgICdTZXRFcnJub0FuZFJldHVybicsCi0gICAgJ1Rocm93JywKLSAgICAnV2l0aEFyZycsCi0gICAgJ1dpdGhBcmdzJywKLSAgICAnV2l0aG91dEFyZ3MnLAotCi0gICAgIyBDYXJkaW5hbGl0aWVzCi0gICAgJ0FueU51bWJlcicsCi0gICAgJ0F0TGVhc3QnLAotICAgICdBdE1vc3QnLAotICAgICdCZXR3ZWVuJywKLSAgICAnRXhhY3RseScsCi0KLSAgICAjIFNlcXVlbmNlcwotICAgICdJblNlcXVlbmNlJywKLSAgICAnU2VxdWVuY2UnLAotCi0gICAgIyBNaXNjCi0gICAgJ0RlZmF1bHRWYWx1ZScsCi0gICAgJ01vY2snLAotICAgIF0KLQotIyBSZWdleCBmb3IgbWF0Y2hpbmcgc291cmNlIGZpbGUgcGF0aCBhbmQgbGluZSBudW1iZXIgaW4gdGhlIGNvbXBpbGVyJ3MgZXJyb3JzLgotX0dDQ19GSUxFX0xJTkVfUkUgPSByJyg/UDxmaWxlPi4qKTooP1A8bGluZT5cZCspOihcZCs6KT9ccysnCi1fQ0xBTkdfRklMRV9MSU5FX1JFID0gcicoP1A8ZmlsZT4uKik6KD9QPGxpbmU+XGQrKTooP1A8Y29sdW1uPlxkKyk6XHMrJwotX0NMQU5HX05PTl9HTU9DS19GSUxFX0xJTkVfUkUgPSAoCi0gICAgcicoP1A8ZmlsZT4uKlsvXFxeXSg/IWdtb2NrLSlbXi9cXF0rKTooP1A8bGluZT5cZCspOig/UDxjb2x1bW4+XGQrKTpccysnKQotCi0KLWRlZiBfRmluZEFsbE1hdGNoZXMocmVnZXgsIHMpOgotICAiIiJHZW5lcmF0ZXMgYWxsIG1hdGNoZXMgb2YgcmVnZXggaW4gc3RyaW5nIHMuIiIiCi0KLSAgciA9IHJlLmNvbXBpbGUocmVnZXgpCi0gIHJldHVybiByLmZpbmRpdGVyKHMpCi0KLQotZGVmIF9HZW5lcmljRGlhZ25vc2VyKHNob3J0X25hbWUsIGxvbmdfbmFtZSwgZGlhZ25vc2VzLCBtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIGdpdmVuIGRpc2Vhc2UgYnkgcGF0dGVybiBtYXRjaGluZy4KLQotICBDYW4gcHJvdmlkZSBkaWZmZXJlbnQgZGlhZ25vc2VzIGZvciBkaWZmZXJlbnQgcGF0dGVybnMuCi0KLSAgQXJnczoKLSAgICBzaG9ydF9uYW1lOiBTaG9ydCBuYW1lIG9mIHRoZSBkaXNlYXNlLgotICAgIGxvbmdfbmFtZTogIExvbmcgbmFtZSBvZiB0aGUgZGlzZWFzZS4KLSAgICBkaWFnbm9zZXM6ICBBIGxpc3Qgb2YgcGFpcnMgKHJlZ2V4LCBwYXR0ZXJuIGZvciBmb3JtYXR0aW5nIHRoZSBkaWFnbm9zaXMKLSAgICAgICAgICAgICAgICBmb3IgbWF0Y2hpbmcgcmVnZXgpLgotICAgIG1zZzogICAgICAgIENvbXBpbGVyJ3MgZXJyb3IgbWVzc2FnZXMuCi0gIFlpZWxkczoKLSAgICBUdXBsZXMgb2YgdGhlIGZvcm0KLSAgICAgIChzaG9ydCBuYW1lIG9mIGRpc2Vhc2UsIGxvbmcgbmFtZSBvZiBkaXNlYXNlLCBkaWFnbm9zaXMpLgotICAiIiIKLSAgZm9yIHJlZ2V4LCBkaWFnbm9zaXMgaW4gZGlhZ25vc2VzOgotICAgIGlmIHJlLnNlYXJjaChyZWdleCwgbXNnKToKLSAgICAgIGRpYWdub3NpcyA9ICclKGZpbGUpczolKGxpbmUpczonICsgZGlhZ25vc2lzCi0gICAgICBmb3IgbSBpbiBfRmluZEFsbE1hdGNoZXMocmVnZXgsIG1zZyk6Ci0gICAgICAgIHlpZWxkIChzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRpYWdub3NpcyAlIG0uZ3JvdXBkaWN0KCkpCi0KLQotZGVmIF9OZWVkVG9SZXR1cm5SZWZlcmVuY2VEaWFnbm9zZXIobXNnKToKLSAgIiIiRGlhZ25vc2VzIHRoZSBOUlIgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKLQotICBnY2NfcmVnZXggPSAocidJbiBtZW1iZXIgZnVuY3Rpb24gXCd0ZXN0aW5nOjppbnRlcm5hbDo6UmV0dXJuQWN0aW9uPFI+LipcbicKLSAgICAgICAgICAgICAgICsgX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2luc3RhbnRpYXRlZCBmcm9tIGhlcmVcbicKLSAgICAgICAgICAgICAgIHInLipnbW9jay1hY3Rpb25zXC5oLiplcnJvcjogY3JlYXRpbmcgYXJyYXkgd2l0aCBuZWdhdGl2ZSBzaXplJykKLSAgY2xhbmdfcmVnZXggPSAocidlcnJvcjouKmFycmF5LipuZWdhdGl2ZS4qXHI/XG4nCi0gICAgICAgICAgICAgICAgIHInKC4qXG4pKj8nICsKLSAgICAgICAgICAgICAgICAgX0NMQU5HX05PTl9HTU9DS19GSUxFX0xJTkVfUkUgKwotICAgICAgICAgICAgICAgICByJ25vdGU6IGluIGluc3RhbnRpYXRpb24gb2YgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gJwotICAgICAgICAgICAgICAgICByJ1wndGVzdGluZzo6aW50ZXJuYWw6OlJldHVybkFjdGlvbjwoP1A8dHlwZT4uKik+JwotICAgICAgICAgICAgICAgICByJzo6b3BlcmF0b3IgQWN0aW9uPC4qPlwnIHJlcXVlc3RlZCBoZXJlJykKLSAgY2xhbmcxMV9yZSA9IChyJ3VzZV9SZXR1cm5SZWZfaW5zdGVhZF9vZl9SZXR1cm5fdG9fcmV0dXJuX2FfcmVmZXJlbmNlLionCi0gICAgICAgICAgICAgICAgcicoLipcbikqPycgKyBfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSkKLQotICBkaWFnbm9zaXMgPSAiIiIKLVlvdSBhcmUgdXNpbmcgYSBSZXR1cm4oKSBhY3Rpb24gaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8KLSUodHlwZSlzLiAgUGxlYXNlIHVzZSBSZXR1cm5SZWYoKSBpbnN0ZWFkLiIiIgotICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ05SUicsICdOZWVkIHRvIFJldHVybiBSZWZlcmVuY2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjbGFuZ19yZWdleCwgZGlhZ25vc2lzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhbmcxMV9yZSwgZGlhZ25vc2lzICUgeyd0eXBlJzogJ2EgdHlwZSd9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMgJSB7J3R5cGUnOiAnYSB0eXBlJ30pXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZykKLQotCi1kZWYgX05lZWRUb1JldHVyblNvbWV0aGluZ0RpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIE5SUyBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInKGluc3RhbnRpYXRlZCBmcm9tIGhlcmVcbi4nCi0gICAgICAgICAgICAgICByJypnbW9jay4qYWN0aW9uc1wuaC4qZXJyb3I6IHZvaWQgdmFsdWUgbm90IGlnbm9yZWQpJwotICAgICAgICAgICAgICAgcid8KGVycm9yOiBjb250cm9sIHJlYWNoZXMgZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uKScpCi0gIGNsYW5nX3JlZ2V4MSA9IChfQ0xBTkdfRklMRV9MSU5FX1JFICsKLSAgICAgICAgICAgICAgICAgIHInZXJyb3I6IGNhbm5vdCBpbml0aWFsaXplIHJldHVybiBvYmplY3QgJwotICAgICAgICAgICAgICAgICAgcidvZiB0eXBlIFwnUmVzdWx0XCcgXChha2EgXCcoP1A8cmV0dXJuX3R5cGU+LiopXCdcKSAnCi0gICAgICAgICAgICAgICAgICByJ3dpdGggYW4gcnZhbHVlIG9mIHR5cGUgXCd2b2lkXCcnKQotICBjbGFuZ19yZWdleDIgPSAoX0NMQU5HX0ZJTEVfTElORV9SRSArCi0gICAgICAgICAgICAgICAgICByJ2Vycm9yOiBjYW5ub3QgaW5pdGlhbGl6ZSByZXR1cm4gb2JqZWN0ICcKLSAgICAgICAgICAgICAgICAgIHInb2YgdHlwZSBcJyg/UDxyZXR1cm5fdHlwZT4uKilcJyAnCi0gICAgICAgICAgICAgICAgICByJ3dpdGggYW4gcnZhbHVlIG9mIHR5cGUgXCd2b2lkXCcnKQotICBkaWFnbm9zaXMgPSAiIiIKLVlvdSBhcmUgdXNpbmcgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB2b2lkLCBidXQgaXQgbmVlZHMgdG8gcmV0dXJuCi0lKHJldHVybl90eXBlKXMuICBQbGVhc2UgdGVsbCBpdCAqd2hhdCogdG8gcmV0dXJuLiAgUGVyaGFwcyB5b3UgY2FuIHVzZQotdGhlIHBhdHRlcm4gRG9BbGwoc29tZV9hY3Rpb24sIFJldHVybihzb21lX3ZhbHVlKSk/IiIiCi0gIHJldHVybiBfR2VuZXJpY0RpYWdub3NlcigKLSAgICAgICdOUlMnLAotICAgICAgJ05lZWQgdG8gUmV0dXJuIFNvbWV0aGluZycsCi0gICAgICBbKGdjY19yZWdleCwgZGlhZ25vc2lzICUgeydyZXR1cm5fdHlwZSc6ICcqc29tZXRoaW5nKid9KSwKLSAgICAgICAoY2xhbmdfcmVnZXgxLCBkaWFnbm9zaXMpLAotICAgICAgIChjbGFuZ19yZWdleDIsIGRpYWdub3NpcyldLAotICAgICAgbXNnKQotCi0KLWRlZiBfTmVlZFRvUmV0dXJuTm90aGluZ0RpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIE5STiBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInaW5zdGFudGlhdGVkIGZyb20gaGVyZVxuJwotICAgICAgICAgICAgICAgcicuKmdtb2NrLWFjdGlvbnNcLmguKmVycm9yOiBpbnN0YW50aWF0aW9uIG9mICcKLSAgICAgICAgICAgICAgIHInXCd0ZXN0aW5nOjppbnRlcm5hbDo6UmV0dXJuQWN0aW9uPFI+OjpJbXBsPEY+Ojp2YWx1ZV9cJyAnCi0gICAgICAgICAgICAgICByJ2FzIHR5cGUgXCd2b2lkXCcnKQotICBjbGFuZ19yZWdleDEgPSAocidlcnJvcjogZmllbGQgaGFzIGluY29tcGxldGUgdHlwZSAnCi0gICAgICAgICAgICAgICAgICByJ1wnUmVzdWx0XCcgXChha2EgXCd2b2lkXCdcKShccik/XG4nCi0gICAgICAgICAgICAgICAgICByJyguKlxuKSo/JyArCi0gICAgICAgICAgICAgICAgICBfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSArIHInbm90ZTogaW4gaW5zdGFudGlhdGlvbiAnCi0gICAgICAgICAgICAgICAgICByJ29mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICcKLSAgICAgICAgICAgICAgICAgIHInXCd0ZXN0aW5nOjppbnRlcm5hbDo6UmV0dXJuQWN0aW9uPCg/UDxyZXR1cm5fdHlwZT4uKik+JwotICAgICAgICAgICAgICAgICAgcic6Om9wZXJhdG9yIEFjdGlvbjx2b2lkIFwoLipcKT5cJyByZXF1ZXN0ZWQgaGVyZScpCi0gIGNsYW5nX3JlZ2V4MiA9IChyJ2Vycm9yOiBmaWVsZCBoYXMgaW5jb21wbGV0ZSB0eXBlICcKLSAgICAgICAgICAgICAgICAgIHInXCdSZXN1bHRcJyBcKGFrYSBcJ3ZvaWRcJ1wpKFxyKT9cbicKLSAgICAgICAgICAgICAgICAgIHInKC4qXG4pKj8nICsKLSAgICAgICAgICAgICAgICAgIF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsgcidub3RlOiBpbiBpbnN0YW50aWF0aW9uICcKLSAgICAgICAgICAgICAgICAgIHInb2YgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gJwotICAgICAgICAgICAgICAgICAgcidcJ3Rlc3Rpbmc6OmludGVybmFsOjpEb0JvdGhBY3Rpb248Lio+JwotICAgICAgICAgICAgICAgICAgcic6Om9wZXJhdG9yIEFjdGlvbjwoP1A8cmV0dXJuX3R5cGU+LiopIFwoLipcKT5cJyAnCi0gICAgICAgICAgICAgICAgICByJ3JlcXVlc3RlZCBoZXJlJykKLSAgZGlhZ25vc2lzID0gIiIiCi1Zb3UgYXJlIHVzaW5nIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgJShyZXR1cm5fdHlwZSlzLCBidXQgaXQgbmVlZHMgdG8gcmV0dXJuCi12b2lkLiAgUGxlYXNlIHVzZSBhIHZvaWQtcmV0dXJuaW5nIGFjdGlvbiBpbnN0ZWFkLgotCi1BbGwgYWN0aW9ucyBidXQgdGhlIGxhc3QgaW4gRG9BbGwoLi4uKSBtdXN0IHJldHVybiB2b2lkLiAgUGVyaGFwcyB5b3UgbmVlZAotdG8gcmUtYXJyYW5nZSB0aGUgb3JkZXIgb2YgYWN0aW9ucyBpbiBhIERvQWxsKCksIGlmIHlvdSBhcmUgdXNpbmcgb25lPyIiIgotICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoCi0gICAgICAnTlJOJywKLSAgICAgICdOZWVkIHRvIFJldHVybiBOb3RoaW5nJywKLSAgICAgIFsoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMgJSB7J3JldHVybl90eXBlJzogJypzb21ldGhpbmcqJ30pLAotICAgICAgIChjbGFuZ19yZWdleDEsIGRpYWdub3NpcyksCi0gICAgICAgKGNsYW5nX3JlZ2V4MiwgZGlhZ25vc2lzKV0sCi0gICAgICBtc2cpCi0KLQotZGVmIF9JbmNvbXBsZXRlQnlSZWZlcmVuY2VBcmd1bWVudERpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIElCUkEgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKLQotICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2luc3RhbnRpYXRlZCBmcm9tIGhlcmVcbicKLSAgICAgICAgICAgICAgIHInLipndGVzdC1wcmludGVyc1wuaC4qZXJyb3I6IGludmFsaWQgYXBwbGljYXRpb24gb2YgJwotICAgICAgICAgICAgICAgcidcJ3NpemVvZlwnIHRvIGluY29tcGxldGUgdHlwZSBcJyg/UDx0eXBlPi4qKVwnJykKLQotICBjbGFuZ19yZWdleCA9IChyJy4qZ3Rlc3QtcHJpbnRlcnNcLmguKmVycm9yOiBpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICcKLSAgICAgICAgICAgICAgICAgcidcJ3NpemVvZlwnIHRvIGFuIGluY29tcGxldGUgdHlwZSAnCi0gICAgICAgICAgICAgICAgIHInXCcoP1A8dHlwZT4uKikoIGNvbnN0KT9cJ1xyP1xuJwotICAgICAgICAgICAgICAgICByJyguKlxuKSo/JyArCi0gICAgICAgICAgICAgICAgIF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsKLSAgICAgICAgICAgICAgICAgcidub3RlOiBpbiBpbnN0YW50aWF0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiAnCi0gICAgICAgICAgICAgICAgIHInXCd0ZXN0aW5nOjppbnRlcm5hbDI6OlR5cGVXaXRob3V0Rm9ybWF0dGVyPC4qPjo6JwotICAgICAgICAgICAgICAgICByJ1ByaW50VmFsdWVcJyByZXF1ZXN0ZWQgaGVyZScpCi0gIGRpYWdub3NpcyA9ICIiIgotSW4gb3JkZXIgdG8gbW9jayB0aGlzIGZ1bmN0aW9uLCBHb29nbGUgTW9jayBuZWVkcyB0byBzZWUgdGhlIGRlZmluaXRpb24KLW9mIHR5cGUgIiUodHlwZSlzIiAtIGRlY2xhcmF0aW9uIGFsb25lIGlzIG5vdCBlbm91Z2guICBFaXRoZXIgI2luY2x1ZGUKLXRoZSBoZWFkZXIgdGhhdCBkZWZpbmVzIGl0LCBvciBjaGFuZ2UgdGhlIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAotYnkgcG9pbnRlci4iIiIKLQotICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ0lCUkEnLCAnSW5jb21wbGV0ZSBCeS1SZWZlcmVuY2UgQXJndW1lbnQgVHlwZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbKGdjY19yZWdleCwgZGlhZ25vc2lzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhbmdfcmVnZXgsIGRpYWdub3NpcyldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKQotCi0KLWRlZiBfT3ZlcmxvYWRlZEZ1bmN0aW9uTWF0Y2hlckRpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIE9GTSBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciAnCi0gICAgICAgICAgICAgICByJ2NhbGwgdG8gXCdUcnVseVwoPHVucmVzb2x2ZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0eXBlPlwpJykKLSAgY2xhbmdfcmVnZXggPSAoX0NMQU5HX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciAnCi0gICAgICAgICAgICAgICAgIHInY2FsbCB0byBcJ1RydWx5JykKLSAgZGlhZ25vc2lzID0gIiIiCi1UaGUgYXJndW1lbnQgeW91IGdhdmUgdG8gVHJ1bHkoKSBpcyBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uLiAgUGxlYXNlIHRlbGwKLXlvdXIgY29tcGlsZXIgd2hpY2ggb3ZlcmxvYWRlZCB2ZXJzaW9uIHlvdSB3YW50IHRvIHVzZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgdmVyc2lvbiB3aG9zZSBzaWduYXR1cmUgaXMKLSAgYm9vbCBGb28oaW50IG4pOwoteW91IHNob3VsZCB3cml0ZQotICBUcnVseShzdGF0aWNfY2FzdDxib29sICgqKShpbnQgbik+KEZvbykpIiIiCi0gIHJldHVybiBfR2VuZXJpY0RpYWdub3NlcignT0ZNJywgJ092ZXJsb2FkZWQgRnVuY3Rpb24gTWF0Y2hlcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbKGdjY19yZWdleCwgZGlhZ25vc2lzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhbmdfcmVnZXgsIGRpYWdub3NpcyldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKQotCi0KLWRlZiBfT3ZlcmxvYWRlZEZ1bmN0aW9uQWN0aW9uRGlhZ25vc2VyKG1zZyk6Ci0gICIiIkRpYWdub3NlcyB0aGUgT0ZBIGRpc2Vhc2UsIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlcyBieSB0aGUgY29tcGlsZXIuIiIiCi0KLSAgZ2NjX3JlZ2V4ID0gKF9HQ0NfRklMRV9MSU5FX1JFICsgcidlcnJvcjogbm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gJwotICAgICAgICAgICAgICAgcidcJ0ludm9rZVwoPHVucmVzb2x2ZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0eXBlPicpCi0gIGNsYW5nX3JlZ2V4ID0gKF9DTEFOR19GSUxFX0xJTkVfUkUgKyByJ2Vycm9yOiBubyBtYXRjaGluZyAnCi0gICAgICAgICAgICAgICAgIHInZnVuY3Rpb24gZm9yIGNhbGwgdG8gXCdJbnZva2VcJ1xyP1xuJwotICAgICAgICAgICAgICAgICByJyguKlxuKSo/JwotICAgICAgICAgICAgICAgICByJy4qXGJnbW9jay1nZW5lcmF0ZWQtYWN0aW9uc1wuaDpcZCs6XGQrOlxzKycKLSAgICAgICAgICAgICAgICAgcidub3RlOiBjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZDpccysnCi0gICAgICAgICAgICAgICAgIHInY291bGRuXCd0IGluZmVyIHRlbXBsYXRlIGFyZ3VtZW50IFwnRnVuY3Rpb25JbXBsXCcnKQotICBkaWFnbm9zaXMgPSAiIiIKLUZ1bmN0aW9uIHlvdSBhcmUgcGFzc2luZyB0byBJbnZva2UgaXMgb3ZlcmxvYWRlZC4gIFBsZWFzZSB0ZWxsIHlvdXIgY29tcGlsZXIKLXdoaWNoIG92ZXJsb2FkZWQgdmVyc2lvbiB5b3Ugd2FudCB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHZlcnNpb24gd2hvc2Ugc2lnbmF0dXJlIGlzCi0gIGJvb2wgTXlGdW5jdGlvbihpbnQgbiwgZG91YmxlIHgpOwoteW91IHNob3VsZCB3cml0ZSBzb21ldGhpbmcgbGlrZQotICBJbnZva2Uoc3RhdGljX2Nhc3Q8Ym9vbCAoKikoaW50IG4sIGRvdWJsZSB4KT4oTXlGdW5jdGlvbikpIiIiCi0gIHJldHVybiBfR2VuZXJpY0RpYWdub3NlcignT0ZBJywgJ092ZXJsb2FkZWQgRnVuY3Rpb24gQWN0aW9uJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFuZ19yZWdleCwgZGlhZ25vc2lzKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCi0KLQotZGVmIF9PdmVybG9hZGVkTWV0aG9kQWN0aW9uRGlhZ25vc2VyKG1zZyk6Ci0gICIiIkRpYWdub3NlcyB0aGUgT01BIGRpc2Vhc2UsIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlcyBieSB0aGUgY29tcGlsZXIuIiIiCi0KLSAgZ2NjX3JlZ2V4ID0gKF9HQ0NfRklMRV9MSU5FX1JFICsgcidlcnJvcjogbm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yICcKLSAgICAgICAgICAgICAgIHInY2FsbCB0byBcJ0ludm9rZVwoLissIDx1bnJlc29sdmVkIG92ZXJsb2FkZWQgZnVuY3Rpb24gJwotICAgICAgICAgICAgICAgcid0eXBlPlwpJykKLSAgY2xhbmdfcmVnZXggPSAoX0NMQU5HX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uICcKLSAgICAgICAgICAgICAgICAgcidmb3IgY2FsbCB0byBcJ0ludm9rZVwnXHI/XG4nCi0gICAgICAgICAgICAgICAgIHInKC4qXG4pKj8nCi0gICAgICAgICAgICAgICAgIHInLipcYmdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zXC5oOlxkKzpcZCs6ICcKLSAgICAgICAgICAgICAgICAgcidub3RlOiBjYW5kaWRhdGUgZnVuY3Rpb24gdGVtcGxhdGUgbm90IHZpYWJsZTogJwotICAgICAgICAgICAgICAgICByJ3JlcXVpcmVzIC4qLCBidXQgMiAoYXJndW1lbnRzICk/d2VyZSBwcm92aWRlZCcpCi0gIGRpYWdub3NpcyA9ICIiIgotVGhlIHNlY29uZCBhcmd1bWVudCB5b3UgZ2F2ZSB0byBJbnZva2UoKSBpcyBhbiBvdmVybG9hZGVkIG1ldGhvZC4gIFBsZWFzZQotdGVsbCB5b3VyIGNvbXBpbGVyIHdoaWNoIG92ZXJsb2FkZWQgdmVyc2lvbiB5b3Ugd2FudCB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHZlcnNpb24gd2hvc2Ugc2lnbmF0dXJlIGlzCi0gIGNsYXNzIEZvbyB7Ci0gICAgLi4uCi0gICAgYm9vbCBCYXIoaW50IG4sIGRvdWJsZSB4KTsKLSAgfTsKLXlvdSBzaG91bGQgd3JpdGUgc29tZXRoaW5nIGxpa2UKLSAgSW52b2tlKGZvbywgc3RhdGljX2Nhc3Q8Ym9vbCAoRm9vOjoqKShpbnQgbiwgZG91YmxlIHgpPigmRm9vOjpCYXIpKSIiIgotICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ09NQScsICdPdmVybG9hZGVkIE1ldGhvZCBBY3Rpb24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhnY2NfcmVnZXgsIGRpYWdub3NpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYW5nX3JlZ2V4LCBkaWFnbm9zaXMpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZykKLQotCi1kZWYgX01vY2tPYmplY3RQb2ludGVyRGlhZ25vc2VyKG1zZyk6Ci0gICIiIkRpYWdub3NlcyB0aGUgTU9QIGRpc2Vhc2UsIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlcyBieSB0aGUgY29tcGlsZXIuIiIiCi0KLSAgZ2NjX3JlZ2V4ID0gKF9HQ0NfRklMRV9MSU5FX1JFICsgcidlcnJvcjogcmVxdWVzdCBmb3IgbWVtYmVyICcKLSAgICAgICAgICAgICAgIHInXCdnbW9ja18oP1A8bWV0aG9kPi4rKVwnIGluIFwnKD9QPG1vY2tfb2JqZWN0Pi4rKVwnLCAnCi0gICAgICAgICAgICAgICByJ3doaWNoIGlzIG9mIG5vbi1jbGFzcyB0eXBlIFwnKC4qOjopKig/UDxjbGFzc19uYW1lPi4rKVwqXCcnKQotICBjbGFuZ19yZWdleCA9IChfQ0xBTkdfRklMRV9MSU5FX1JFICsgcidlcnJvcjogbWVtYmVyIHJlZmVyZW5jZSB0eXBlICcKLSAgICAgICAgICAgICAgICAgcidcJyg/UDxjbGFzc19uYW1lPi4qPykgKlwnIGlzIGEgcG9pbnRlcjsgJwotICAgICAgICAgICAgICAgICByJyhkaWQgeW91IG1lYW58bWF5YmUgeW91IG1lYW50KSB0byB1c2UgXCctPlwnXD8nKQotICBkaWFnbm9zaXMgPSAiIiIKLVRoZSBmaXJzdCBhcmd1bWVudCB0byBPTl9DQUxMKCkgYW5kIEVYUEVDVF9DQUxMKCkgbXVzdCBiZSBhIG1vY2sgKm9iamVjdCosCi1ub3QgYSAqcG9pbnRlciogdG8gaXQuICBQbGVhc2Ugd3JpdGUgJyooJShtb2NrX29iamVjdClzKScgaW5zdGVhZCBvZgotJyUobW9ja19vYmplY3QpcycgYXMgeW91ciBmaXJzdCBhcmd1bWVudC4KLQotRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBtb2NrIGNsYXNzOgotCi0gIGNsYXNzICUoY2xhc3NfbmFtZSlzIDogcHVibGljIC4uLiB7Ci0gICAgLi4uCi0gICAgTU9DS19NRVRIT0QwKCUobWV0aG9kKXMsIC4uLik7Ci0gIH07Ci0KLWFuZCB0aGUgZm9sbG93aW5nIG1vY2sgaW5zdGFuY2U6Ci0KLSAgJShjbGFzc19uYW1lKXMqIG1vY2tfcHRyID0gLi4uCi0KLXlvdSBzaG91bGQgdXNlIHRoZSBFWFBFQ1RfQ0FMTCBsaWtlIHRoaXM6Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfcHRyLCAlKG1ldGhvZClzKC4uLikpOyIiIgotCi0gIHJldHVybiBfR2VuZXJpY0RpYWdub3NlcigKLSAgICAgICdNT1AnLAotICAgICAgJ01vY2sgT2JqZWN0IFBvaW50ZXInLAotICAgICAgWyhnY2NfcmVnZXgsIGRpYWdub3NpcyksCi0gICAgICAgKGNsYW5nX3JlZ2V4LCBkaWFnbm9zaXMgJSB7J21vY2tfb2JqZWN0JzogJ21vY2tfb2JqZWN0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWV0aG9kJzogJ21ldGhvZCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzX25hbWUnOiAnJShjbGFzc19uYW1lKXMnfSldLAotICAgICAgIG1zZykKLQotCi1kZWYgX05lZWRUb1VzZVN5bWJvbERpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIE5VUyBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IFwnKD9QPHN5bWJvbD4uKylcJyAnCi0gICAgICAgICAgICAgICByJyh3YXMgbm90IGRlY2xhcmVkIGluIHRoaXMgc2NvcGV8aGFzIG5vdCBiZWVuIGRlY2xhcmVkKScpCi0gIGNsYW5nX3JlZ2V4ID0gKF9DTEFOR19GSUxFX0xJTkVfUkUgKwotICAgICAgICAgICAgICAgICByJ2Vycm9yOiAodXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllcnx1bmtub3duIHR5cGUgbmFtZXwnCi0gICAgICAgICAgICAgICAgIHInbm8gdGVtcGxhdGUgbmFtZWQpIFwnKD9QPHN5bWJvbD5bXlwnXSspXCcnKQotICBkaWFnbm9zaXMgPSAiIiIKLSclKHN5bWJvbClzJyBpcyBkZWZpbmVkIGJ5IEdvb2dsZSBNb2NrIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZS4KLURpZCB5b3UgZm9yZ2V0IHRvIHdyaXRlCi0gIHVzaW5nIHRlc3Rpbmc6OiUoc3ltYm9sKXM7Ci0/IiIiCi0gIGZvciBtIGluIChsaXN0KF9GaW5kQWxsTWF0Y2hlcyhnY2NfcmVnZXgsIG1zZykpICsKLSAgICAgICAgICAgIGxpc3QoX0ZpbmRBbGxNYXRjaGVzKGNsYW5nX3JlZ2V4LCBtc2cpKSk6Ci0gICAgc3ltYm9sID0gbS5ncm91cGRpY3QoKVsnc3ltYm9sJ10KLSAgICBpZiBzeW1ib2wgaW4gX0NPTU1PTl9HTU9DS19TWU1CT0xTOgotICAgICAgeWllbGQgKCdOVVMnLCAnTmVlZCB0byBVc2UgU3ltYm9sJywgZGlhZ25vc2lzICUgbS5ncm91cGRpY3QoKSkKLQotCi1kZWYgX05lZWRUb1VzZVJldHVybk51bGxEaWFnbm9zZXIobXNnKToKLSAgIiIiRGlhZ25vc2VzIHRoZSBOUk5VTEwgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKLQotICBnY2NfcmVnZXggPSAoJ2luc3RhbnRpYXRlZCBmcm9tIFwndGVzdGluZzo6aW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPicKLSAgICAgICAgICAgICAgICc6Om9wZXJhdG9yIHRlc3Rpbmc6OkFjdGlvbjxGdW5jPlwoXCkgY29uc3QuKlxuJyArCi0gICAgICAgICAgICAgICBfR0NDX0ZJTEVfTElORV9SRSArIHInaW5zdGFudGlhdGVkIGZyb20gaGVyZVxuJwotICAgICAgICAgICAgICAgcicuKmVycm9yOiBubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byBcJ0ltcGxpY2l0Q2FzdF9cKCcKLSAgICAgICAgICAgICAgIHInKDo/bG9uZyApP2ludCZcKScpCi0gIGNsYW5nX3JlZ2V4ID0gKHInXGJnbW9jay1hY3Rpb25zLmg6LiogZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciAnCi0gICAgICAgICAgICAgICAgIHInY2FsbCB0byBcJ0ltcGxpY2l0Q2FzdF9cJ1xyP1xuJwotICAgICAgICAgICAgICAgICByJyguKlxuKSo/JyArCi0gICAgICAgICAgICAgICAgIF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsgcidub3RlOiBpbiBpbnN0YW50aWF0aW9uICcKLSAgICAgICAgICAgICAgICAgcidvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnCi0gICAgICAgICAgICAgICAgIHInXCd0ZXN0aW5nOjppbnRlcm5hbDo6UmV0dXJuQWN0aW9uPChpbnR8bG9uZyk+OjpvcGVyYXRvciAnCi0gICAgICAgICAgICAgICAgIHInQWN0aW9uPCg/UDx0eXBlPi4qKVwoXCk+XCcgcmVxdWVzdGVkIGhlcmUnKQotICBkaWFnbm9zaXMgPSAiIiIKLVlvdSBhcmUgcHJvYmFibHkgY2FsbGluZyBSZXR1cm4oTlVMTCkgYW5kIHRoZSBjb21waWxlciBpc24ndCBzdXJlIGhvdyB0byB0dXJuCi1OVUxMIGludG8gJSh0eXBlKXMuIFVzZSBSZXR1cm5OdWxsKCkgaW5zdGVhZC4KLU5vdGU6IHRoZSBsaW5lIG51bWJlciBtYXkgYmUgb2ZmOyBwbGVhc2UgZml4IGFsbCBpbnN0YW5jZXMgb2YgUmV0dXJuKE5VTEwpLiIiIgotICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoCi0gICAgICAnTlJOVUxMJywgJ05lZWQgdG8gdXNlIFJldHVybk51bGwnLAotICAgICAgWyhjbGFuZ19yZWdleCwgZGlhZ25vc2lzKSwKLSAgICAgICAoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMgJSB7J3R5cGUnOiAndGhlIHJpZ2h0IHR5cGUnfSldLAotICAgICAgbXNnKQotCi0KLWRlZiBfVHlwZUluVGVtcGxhdGVkQmFzZURpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIFRUQiBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gICMgVGhpcyB2ZXJzaW9uIHdvcmtzIHdoZW4gdGhlIHR5cGUgaXMgdXNlZCBhcyB0aGUgbW9jayBmdW5jdGlvbidzIHJldHVybgotICAjIHR5cGUuCi0gIGdjY180XzNfMV9yZWdleF90eXBlX2luX3JldHZhbCA9ICgKLSAgICAgIHInSW4gbWVtYmVyIGZ1bmN0aW9uIFwnaW50IC4qXG4nICsgX0dDQ19GSUxFX0xJTkVfUkUgKwotICAgICAgcidlcnJvcjogYSBmdW5jdGlvbiBjYWxsIGNhbm5vdCBhcHBlYXIgaW4gYSBjb25zdGFudC1leHByZXNzaW9uJykKLSAgZ2NjXzRfNF8wX3JlZ2V4X3R5cGVfaW5fcmV0dmFsID0gKAotICAgICAgcidlcnJvcjogYSBmdW5jdGlvbiBjYWxsIGNhbm5vdCBhcHBlYXIgaW4gYSBjb25zdGFudC1leHByZXNzaW9uJwotICAgICAgKyBfR0NDX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IHRlbXBsYXRlIGFyZ3VtZW50IDEgaXMgaW52YWxpZFxuJykKLSAgIyBUaGlzIHZlcnNpb24gd29ya3Mgd2hlbiB0aGUgdHlwZSBpcyB1c2VkIGFzIHRoZSBtb2NrIGZ1bmN0aW9uJ3Mgc29sZQotICAjIHBhcmFtZXRlciB0eXBlLgotICBnY2NfcmVnZXhfdHlwZV9vZl9zb2xlX3BhcmFtID0gKAotICAgICAgX0dDQ19GSUxFX0xJTkVfUkUgKwotICAgICAgcidlcnJvcjogXCcoP1A8dHlwZT4uKylcJyB3YXMgbm90IGRlY2xhcmVkIGluIHRoaXMgc2NvcGVcbicKLSAgICAgIHInLiplcnJvcjogdGVtcGxhdGUgYXJndW1lbnQgMSBpcyBpbnZhbGlkXG4nKQotICAjIFRoaXMgdmVyc2lvbiB3b3JrcyB3aGVuIHRoZSB0eXBlIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgb2YgYSBtb2NrCi0gICMgZnVuY3Rpb24gdGhhdCBoYXMgbXVsdGlwbGUgcGFyYW1ldGVycy4KLSAgZ2NjX3JlZ2V4X3R5cGVfb2ZfYV9wYXJhbSA9ICgKLSAgICAgIHInZXJyb3I6IGV4cGVjdGVkIGA7XCcgYmVmb3JlIFwnOjpcJyB0b2tlblxuJwotICAgICAgKyBfR0NDX0ZJTEVfTElORV9SRSArCi0gICAgICByJ2Vycm9yOiBcJyg/UDx0eXBlPi4rKVwnIHdhcyBub3QgZGVjbGFyZWQgaW4gdGhpcyBzY29wZVxuJwotICAgICAgcicuKmVycm9yOiB0ZW1wbGF0ZSBhcmd1bWVudCAxIGlzIGludmFsaWRcbicKLSAgICAgIHInLiplcnJvcjogXCcuK1wnIHdhcyBub3QgZGVjbGFyZWQgaW4gdGhpcyBzY29wZScpCi0gIGNsYW5nX3JlZ2V4X3R5cGVfb2ZfcmV0dmFsX29yX3NvbGVfcGFyYW0gPSAoCi0gICAgICBfQ0xBTkdfRklMRV9MSU5FX1JFICsKLSAgICAgIHInZXJyb3I6IHVzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgXCcoP1A8dHlwZT4uKilcJ1xuJwotICAgICAgcicoLipcbikqPycKLSAgICAgIHInKD9QPWZpbGUpOig/UD1saW5lKTpcZCs6IGVycm9yOiAnCi0gICAgICByJ25vbi1mcmllbmQgY2xhc3MgbWVtYmVyIFwnUmVzdWx0XCcgY2Fubm90IGhhdmUgYSBxdWFsaWZpZWQgbmFtZScKLSAgICAgICkKLSAgY2xhbmdfcmVnZXhfdHlwZV9vZl9hX3BhcmFtID0gKAotICAgICAgX0NMQU5HX0ZJTEVfTElORV9SRSArCi0gICAgICByJ2Vycm9yOiBDXCtcKyByZXF1aXJlcyBhIHR5cGUgc3BlY2lmaWVyIGZvciBhbGwgZGVjbGFyYXRpb25zXG4nCi0gICAgICByJyguKlxuKSo/JwotICAgICAgcicoP1A9ZmlsZSk6KD9QPWxpbmUpOig/UD1jb2x1bW4pOiBlcnJvcjogJwotICAgICAgcidDXCtcKyByZXF1aXJlcyBhIHR5cGUgc3BlY2lmaWVyIGZvciBhbGwgZGVjbGFyYXRpb25zJwotICAgICAgKQotICBjbGFuZ19yZWdleF91bmtub3duX3R5cGUgPSAoCi0gICAgICBfQ0xBTkdfRklMRV9MSU5FX1JFICsKLSAgICAgIHInZXJyb3I6IHVua25vd24gdHlwZSBuYW1lIFwnKD9QPHR5cGU+W15cJ10rKVwnJwotICAgICAgKQotCi0gIGRpYWdub3NpcyA9ICIiIgotSW4gYSBtb2NrIGNsYXNzIHRlbXBsYXRlLCB0eXBlcyBvciB0eXBlZGVmcyBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzCi10ZW1wbGF0ZSBhcmUgKm5vdCogYXV0b21hdGljYWxseSB2aXNpYmxlLiAgVGhpcyBpcyBob3cgQysrIHdvcmtzLiAgQmVmb3JlCi15b3UgY2FuIHVzZSBhIHR5cGUgb3IgdHlwZWRlZiBuYW1lZCAlKHR5cGUpcyBkZWZpbmVkIGluIGJhc2UgY2xhc3MgQmFzZTxUPiwgeW91Ci1uZWVkIHRvIG1ha2UgaXQgdmlzaWJsZS4gIE9uZSB3YXkgdG8gZG8gaXQgaXM6Ci0KLSAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlPFQ+OjolKHR5cGUpcyAlKHR5cGUpczsiIiIKLQotICBmb3IgZGlhZyBpbiBfR2VuZXJpY0RpYWdub3NlcigKLSAgICAgICdUVEInLCAnVHlwZSBpbiBUZW1wbGF0ZSBCYXNlJywKLSAgICAgIFsoZ2NjXzRfM18xX3JlZ2V4X3R5cGVfaW5fcmV0dmFsLCBkaWFnbm9zaXMgJSB7J3R5cGUnOiAnRm9vJ30pLAotICAgICAgIChnY2NfNF80XzBfcmVnZXhfdHlwZV9pbl9yZXR2YWwsIGRpYWdub3NpcyAlIHsndHlwZSc6ICdGb28nfSksCi0gICAgICAgKGdjY19yZWdleF90eXBlX29mX3NvbGVfcGFyYW0sIGRpYWdub3NpcyksCi0gICAgICAgKGdjY19yZWdleF90eXBlX29mX2FfcGFyYW0sIGRpYWdub3NpcyksCi0gICAgICAgKGNsYW5nX3JlZ2V4X3R5cGVfb2ZfcmV0dmFsX29yX3NvbGVfcGFyYW0sIGRpYWdub3NpcyksCi0gICAgICAgKGNsYW5nX3JlZ2V4X3R5cGVfb2ZfYV9wYXJhbSwgZGlhZ25vc2lzICUgeyd0eXBlJzogJ0Zvbyd9KV0sCi0gICAgICBtc2cpOgotICAgIHlpZWxkIGRpYWcKLSAgIyBBdm9pZCBvdmVybGFwIHdpdGggdGhlIE5VUyBwYXR0ZXJuLgotICBmb3IgbSBpbiBfRmluZEFsbE1hdGNoZXMoY2xhbmdfcmVnZXhfdW5rbm93bl90eXBlLCBtc2cpOgotICAgIHR5cGVfID0gbS5ncm91cGRpY3QoKVsndHlwZSddCi0gICAgaWYgdHlwZV8gbm90IGluIF9DT01NT05fR01PQ0tfU1lNQk9MUzoKLSAgICAgIHlpZWxkICgnVFRCJywgJ1R5cGUgaW4gVGVtcGxhdGUgQmFzZScsIGRpYWdub3NpcyAlIG0uZ3JvdXBkaWN0KCkpCi0KLQotZGVmIF9Xcm9uZ01vY2tNZXRob2RNYWNyb0RpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIFdNTSBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArCi0gICAgICAgICAgICAgICByJy4qdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8oP1A8d3JvbmdfYXJncz5cZCspX2FyZ3VtZW50LipcbicKLSAgICAgICAgICAgICAgIHInLipcbicKLSAgICAgICAgICAgICAgIHInLipjYW5kaWRhdGVzIGFyZS4qRnVuY3Rpb25Nb2NrZXI8W14+XStBKD9QPGFyZ3M+XGQrKVwpPicpCi0gIGNsYW5nX3JlZ2V4ID0gKF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsKLSAgICAgICAgICAgICAgICAgcidlcnJvcjouKmFycmF5LipuZWdhdGl2ZS4qcj9cbicKLSAgICAgICAgICAgICAgICAgcicoLipcbikqPycKLSAgICAgICAgICAgICAgICAgcicoP1A9ZmlsZSk6KD9QPWxpbmUpOig/UD1jb2x1bW4pOiBlcnJvcjogdG9vIGZldyBhcmd1bWVudHMgJwotICAgICAgICAgICAgICAgICByJ3RvIGZ1bmN0aW9uIGNhbGwsIGV4cGVjdGVkICg/UDxhcmdzPlxkKyksICcKLSAgICAgICAgICAgICAgICAgcidoYXZlICg/UDx3cm9uZ19hcmdzPlxkKyknKQotICBjbGFuZzExX3JlID0gKF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsKLSAgICAgICAgICAgICAgICByJy4qdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8nCi0gICAgICAgICAgICAgICAgcicoP1A8d3JvbmdfYXJncz5cZCspX2FyZ3VtZW50LionKQotICBkaWFnbm9zaXMgPSAiIiIKLVlvdSBhcmUgdXNpbmcgTU9DS19NRVRIT0QlKHdyb25nX2FyZ3MpcyB0byBkZWZpbmUgYSBtb2NrIG1ldGhvZCB0aGF0IGhhcwotJShhcmdzKXMgYXJndW1lbnRzLiBVc2UgTU9DS19NRVRIT0QlKGFyZ3MpcyAob3IgTU9DS19DT05TVF9NRVRIT0QlKGFyZ3MpcywKLU1PQ0tfTUVUSE9EJShhcmdzKXNfVCwgTU9DS19DT05TVF9NRVRIT0QlKGFyZ3Mpc19UIGFzIGFwcHJvcHJpYXRlKSBpbnN0ZWFkLiIiIgotICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ1dNTScsICdXcm9uZyBNT0NLX01FVEhPRG4gTWFjcm8nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhnY2NfcmVnZXgsIGRpYWdub3NpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYW5nMTFfcmUsIGRpYWdub3NpcyAlIHsnd3JvbmdfYXJncyc6ICdtJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmdzJzogJ24nfSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYW5nX3JlZ2V4LCBkaWFnbm9zaXMpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZykKLQotCi1kZWYgX1dyb25nUGFyZW5Qb3NpdGlvbkRpYWdub3Nlcihtc2cpOgotICAiIiJEaWFnbm9zZXMgdGhlIFdQUCBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgotCi0gIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArCi0gICAgICAgICAgICAgICByJ2Vycm9yOi4qdGVzdGluZzo6aW50ZXJuYWw6Ok1vY2tTcGVjPC4qIGhhcyBubyBtZW1iZXIgbmFtZWQgXCcnCi0gICAgICAgICAgICAgICByJyg/UDxtZXRob2Q+XHcrKVwnJykKLSAgY2xhbmdfcmVnZXggPSAoX0NMQU5HX05PTl9HTU9DS19GSUxFX0xJTkVfUkUgKwotICAgICAgICAgICAgICAgICByJ2Vycm9yOiBubyBtZW1iZXIgbmFtZWQgXCcoP1A8bWV0aG9kPlx3KylcJyBpbiAnCi0gICAgICAgICAgICAgICAgIHInXCd0ZXN0aW5nOjppbnRlcm5hbDo6TW9ja1NwZWM8Lio+XCcnKQotICBkaWFnbm9zaXMgPSAiIiIKLVRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIG9mIE9OX0NBTEwgb3IgRVhQRUNUX0NBTEwgc2hvdWxkIGJlICpiZWZvcmUqCi0iLiUobWV0aG9kKXMiLiAgRm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgd3JpdGU6Ci0gIEVYUEVDVF9DQUxMKG15X21vY2ssIEZvbyhfKSkuJShtZXRob2QpcyguLi4pOwotaW5zdGVhZCBvZjoKLSAgRVhQRUNUX0NBTEwobXlfbW9jaywgRm9vKF8pLiUobWV0aG9kKXMoLi4uKSk7IiIiCi0gIHJldHVybiBfR2VuZXJpY0RpYWdub3NlcignV1BQJywgJ1dyb25nIFBhcmVudGhlc2lzIFBvc2l0aW9uJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFuZ19yZWdleCwgZGlhZ25vc2lzKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCi0KLQotX0RJQUdOT1NFUlMgPSBbCi0gICAgX0luY29tcGxldGVCeVJlZmVyZW5jZUFyZ3VtZW50RGlhZ25vc2VyLAotICAgIF9Nb2NrT2JqZWN0UG9pbnRlckRpYWdub3NlciwKLSAgICBfTmVlZFRvUmV0dXJuTm90aGluZ0RpYWdub3NlciwKLSAgICBfTmVlZFRvUmV0dXJuUmVmZXJlbmNlRGlhZ25vc2VyLAotICAgIF9OZWVkVG9SZXR1cm5Tb21ldGhpbmdEaWFnbm9zZXIsCi0gICAgX05lZWRUb1VzZVJldHVybk51bGxEaWFnbm9zZXIsCi0gICAgX05lZWRUb1VzZVN5bWJvbERpYWdub3NlciwKLSAgICBfT3ZlcmxvYWRlZEZ1bmN0aW9uQWN0aW9uRGlhZ25vc2VyLAotICAgIF9PdmVybG9hZGVkRnVuY3Rpb25NYXRjaGVyRGlhZ25vc2VyLAotICAgIF9PdmVybG9hZGVkTWV0aG9kQWN0aW9uRGlhZ25vc2VyLAotICAgIF9UeXBlSW5UZW1wbGF0ZWRCYXNlRGlhZ25vc2VyLAotICAgIF9Xcm9uZ01vY2tNZXRob2RNYWNyb0RpYWdub3NlciwKLSAgICBfV3JvbmdQYXJlblBvc2l0aW9uRGlhZ25vc2VyLAotICAgIF0KLQotCi1kZWYgRGlhZ25vc2UobXNnKToKLSAgIiIiR2VuZXJhdGVzIGFsbCBwb3NzaWJsZSBkaWFnbm9zZXMgZ2l2ZW4gdGhlIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2UuIiIiCi0KLSAgbXNnID0gcmUuc3ViKHInXHgxYlxbW15tXSptJywgJycsIG1zZykgICMgU3RyaXBzIGFsbCBjb2xvciBmb3JtYXR0aW5nLgotICAjIEFzc3VtaW5nIHRoZSBzdHJpbmcgaXMgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLCByZXBsYWNlcyB0aGUgbGVmdCBhbmQKLSAgIyB0aGUgcmlnaHQgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBhcG9zdHJvcGhlcy4KLSAgbXNnID0gcmUuc3ViKHInKFx4ZTJceDgwXHg5OHxceGUyXHg4MFx4OTkpJywgIiciLCBtc2cpCi0KLSAgZGlhZ25vc2VzID0gW10KLSAgZm9yIGRpYWdub3NlciBpbiBfRElBR05PU0VSUzoKLSAgICBmb3IgZGlhZyBpbiBkaWFnbm9zZXIobXNnKToKLSAgICAgIGRpYWdub3NpcyA9ICdbJXMgLSAlc11cbiVzJyAlIGRpYWcKLSAgICAgIGlmIG5vdCBkaWFnbm9zaXMgaW4gZGlhZ25vc2VzOgotICAgICAgICBkaWFnbm9zZXMuYXBwZW5kKGRpYWdub3NpcykKLSAgcmV0dXJuIGRpYWdub3NlcwotCi0KLWRlZiBtYWluKCk6Ci0gIHByaW50ICgnR29vZ2xlIE1vY2sgRG9jdG9yIHYlcyAtICcKLSAgICAgICAgICdkaWFnbm9zZXMgcHJvYmxlbXMgaW4gY29kZSB1c2luZyBHb29nbGUgTW9jay4nICUgX1ZFUlNJT04pCi0KLSAgaWYgc3lzLnN0ZGluLmlzYXR0eSgpOgotICAgIHByaW50ICgnUGxlYXNlIGNvcHkgYW5kIHBhc3RlIHRoZSBjb21waWxlciBlcnJvcnMgaGVyZS4gIFByZXNzIGMtRCB3aGVuICcKLSAgICAgICAgICAgJ3lvdSBhcmUgZG9uZTonKQotICBlbHNlOgotICAgIHByaW50ICdXYWl0aW5nIGZvciBjb21waWxlciBlcnJvcnMgb24gc3RkaW4gLiAuIC4nCi0KLSAgbXNnID0gc3lzLnN0ZGluLnJlYWQoKS5zdHJpcCgpCi0gIGRpYWdub3NlcyA9IERpYWdub3NlKG1zZykKLSAgY291bnQgPSBsZW4oZGlhZ25vc2VzKQotICBpZiBub3QgY291bnQ6Ci0gICAgcHJpbnQgKCIiIgotWW91ciBjb21waWxlciBjb21wbGFpbmVkOgotODwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+OAotCi1VaC1vaCwgSSdtIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCB3aGF0IHRoZSBwcm9ibGVtIGlzLiA6LSgKLUhvd2V2ZXIuLi4KLUlmIHlvdSBzZW5kIHlvdXIgc291cmNlIGNvZGUgYW5kIHRoZSBjb21waWxlcidzIGVycm9yIG1lc3NhZ2VzIHRvCi0lcywgeW91IGNhbiBiZSBoZWxwZWQgYW5kIEkgY2FuIGdldCBzbWFydGVyIC0tCi13aW4td2luIGZvciB1cyEiIiIgJSAobXNnLCBfRU1BSUwpKQotICBlbHNlOgotICAgIHByaW50ICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi0gICAgcHJpbnQgJ1lvdXIgY29kZSBhcHBlYXJzIHRvIGhhdmUgdGhlIGZvbGxvd2luZycsCi0gICAgaWYgY291bnQgPiAxOgotICAgICAgcHJpbnQgJyVzIGRpc2Vhc2VzOicgJSAoY291bnQsKQotICAgIGVsc2U6Ci0gICAgICBwcmludCAnZGlzZWFzZTonCi0gICAgaSA9IDAKLSAgICBmb3IgZCBpbiBkaWFnbm9zZXM6Ci0gICAgICBpICs9IDEKLSAgICAgIGlmIGNvdW50ID4gMToKLSAgICAgICAgcHJpbnQgJ1xuIyVzOicgJSAoaSwpCi0gICAgICBwcmludCBkCi0gICAgcHJpbnQgKCIiIgotSG93IGRpZCBJIGRvPyAgSWYgeW91IHRoaW5rIEknbSB3cm9uZyBvciB1bmhlbHBmdWwsIHBsZWFzZSBzZW5kIHlvdXIKLXNvdXJjZSBjb2RlIGFuZCB0aGUgY29tcGlsZXIncyBlcnJvciBtZXNzYWdlcyB0byAlcy4KLVRoZW4geW91IGNhbiBiZSBoZWxwZWQgYW5kIEkgY2FuIGdldCBzbWFydGVyIC0tIEkgcHJvbWlzZSBJIHdvbid0IGJlIHVwc2V0ISIiIiAlCi0gICAgICAgICAgIF9FTUFJTCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy91cGxvYWQucHkgYi90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvdXBsb2FkLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTZmOWExLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc2NyaXB0cy91cGxvYWQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0iIiJUb29sIGZvciB1cGxvYWRpbmcgZGlmZnMgZnJvbSBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gdGhlIGNvZGVyZXZpZXcgYXBwLgotCi1Vc2FnZSBzdW1tYXJ5OiB1cGxvYWQucHkgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdCi0KLURpZmYgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBkaWZmIGNvbW1hbmQgb2YgdGhlIHVuZGVybHlpbmcgc3lzdGVtLgotCi1TdXBwb3J0ZWQgdmVyc2lvbiBjb250cm9sIHN5c3RlbXM6Ci0gIEdpdAotICBNZXJjdXJpYWwKLSAgU3VidmVyc2lvbgotCi1JdCBpcyBpbXBvcnRhbnQgZm9yIEdpdC9NZXJjdXJpYWwgdXNlcnMgdG8gc3BlY2lmeSBhIHRyZWUvbm9kZS9icmFuY2ggdG8gZGlmZgotYWdhaW5zdCBieSB1c2luZyB0aGUgJy0tcmV2JyBvcHRpb24uCi0iIiIKLSMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBhcHBjZmcucHkgaW4gdGhlIEFwcCBFbmdpbmUgU0RLIChvcGVuIHNvdXJjZSksCi0jIGFuZCBmcm9tIEFTUE4gcmVjaXBlICMxNDYzMDYuCi0KLWltcG9ydCBjb29raWVsaWIKLWltcG9ydCBnZXRwYXNzCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG1kNQotaW1wb3J0IG1pbWV0eXBlcwotaW1wb3J0IG9wdHBhcnNlCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHNvY2tldAotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLWltcG9ydCB1cmxsaWIKLWltcG9ydCB1cmxsaWIyCi1pbXBvcnQgdXJscGFyc2UKLQotdHJ5OgotICBpbXBvcnQgcmVhZGxpbmUKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgcGFzcwotCi0jIFRoZSBsb2dnaW5nIHZlcmJvc2l0eToKLSMgIDA6IEVycm9ycyBvbmx5LgotIyAgMTogU3RhdHVzIG1lc3NhZ2VzLgotIyAgMjogSW5mbyBsb2dzLgotIyAgMzogRGVidWcgbG9ncy4KLXZlcmJvc2l0eSA9IDEKLQotIyBNYXggc2l6ZSBvZiBwYXRjaCBvciBiYXNlIGZpbGUuCi1NQVhfVVBMT0FEX1NJWkUgPSA5MDAgKiAxMDI0Ci0KLQotZGVmIEdldEVtYWlsKHByb21wdCk6Ci0gICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIHRoZWlyIGVtYWlsIGFkZHJlc3MgYW5kIHJldHVybnMgaXQuCi0KLSAgVGhlIGxhc3QgdXNlZCBlbWFpbCBhZGRyZXNzIGlzIHNhdmVkIHRvIGEgZmlsZSBhbmQgb2ZmZXJlZCB1cCBhcyBhIHN1Z2dlc3Rpb24KLSAgdG8gdGhlIHVzZXIuIElmIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIgd2l0aG91dCB0eXBpbmcgaW4gYW55dGhpbmcgdGhlIGxhc3QKLSAgdXNlZCBlbWFpbCBhZGRyZXNzIGlzIHVzZWQuIElmIHRoZSB1c2VyIGVudGVycyBhIG5ldyBhZGRyZXNzLCBpdCBpcyBzYXZlZAotICBmb3IgbmV4dCB0aW1lIHdlIHByb21wdC4KLQotICAiIiIKLSAgbGFzdF9lbWFpbF9maWxlX25hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxhc3RfY29kZXJldmlld19lbWFpbF9hZGRyZXNzIikKLSAgbGFzdF9lbWFpbCA9ICIiCi0gIGlmIG9zLnBhdGguZXhpc3RzKGxhc3RfZW1haWxfZmlsZV9uYW1lKToKLSAgICB0cnk6Ci0gICAgICBsYXN0X2VtYWlsX2ZpbGUgPSBvcGVuKGxhc3RfZW1haWxfZmlsZV9uYW1lLCAiciIpCi0gICAgICBsYXN0X2VtYWlsID0gbGFzdF9lbWFpbF9maWxlLnJlYWRsaW5lKCkuc3RyaXAoIlxuIikKLSAgICAgIGxhc3RfZW1haWxfZmlsZS5jbG9zZSgpCi0gICAgICBwcm9tcHQgKz0gIiBbJXNdIiAlIGxhc3RfZW1haWwKLSAgICBleGNlcHQgSU9FcnJvciwgZToKLSAgICAgIHBhc3MKLSAgZW1haWwgPSByYXdfaW5wdXQocHJvbXB0ICsgIjogIikuc3RyaXAoKQotICBpZiBlbWFpbDoKLSAgICB0cnk6Ci0gICAgICBsYXN0X2VtYWlsX2ZpbGUgPSBvcGVuKGxhc3RfZW1haWxfZmlsZV9uYW1lLCAidyIpCi0gICAgICBsYXN0X2VtYWlsX2ZpbGUud3JpdGUoZW1haWwpCi0gICAgICBsYXN0X2VtYWlsX2ZpbGUuY2xvc2UoKQotICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgotICAgICAgcGFzcwotICBlbHNlOgotICAgIGVtYWlsID0gbGFzdF9lbWFpbAotICByZXR1cm4gZW1haWwKLQotCi1kZWYgU3RhdHVzVXBkYXRlKG1zZyk6Ci0gICIiIlByaW50IGEgc3RhdHVzIG1lc3NhZ2UgdG8gc3Rkb3V0LgotCi0gIElmICd2ZXJib3NpdHknIGlzIGdyZWF0ZXIgdGhhbiAwLCBwcmludCB0aGUgbWVzc2FnZS4KLQotICBBcmdzOgotICAgIG1zZzogVGhlIHN0cmluZyB0byBwcmludC4KLSAgIiIiCi0gIGlmIHZlcmJvc2l0eSA+IDA6Ci0gICAgcHJpbnQgbXNnCi0KLQotZGVmIEVycm9yRXhpdChtc2cpOgotICAiIiJQcmludCBhbiBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgZXhpdC4iIiIKLSAgcHJpbnQgPj5zeXMuc3RkZXJyLCBtc2cKLSAgc3lzLmV4aXQoMSkKLQotCi1jbGFzcyBDbGllbnRMb2dpbkVycm9yKHVybGxpYjIuSFRUUEVycm9yKToKLSAgIiIiUmFpc2VkIHRvIGluZGljYXRlIHRoZXJlIHdhcyBhbiBlcnJvciBhdXRoZW50aWNhdGluZyB3aXRoIENsaWVudExvZ2luLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGNvZGUsIG1zZywgaGVhZGVycywgYXJncyk6Ci0gICAgdXJsbGliMi5IVFRQRXJyb3IuX19pbml0X18oc2VsZiwgdXJsLCBjb2RlLCBtc2csIGhlYWRlcnMsIE5vbmUpCi0gICAgc2VsZi5hcmdzID0gYXJncwotICAgIHNlbGYucmVhc29uID0gYXJnc1siRXJyb3IiXQotCi0KLWNsYXNzIEFic3RyYWN0UnBjU2VydmVyKG9iamVjdCk6Ci0gICIiIlByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBmb3IgYSBzaW1wbGUgUlBDIHNlcnZlci4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgYXV0aF9mdW5jdGlvbiwgaG9zdF9vdmVycmlkZT1Ob25lLCBleHRyYV9oZWFkZXJzPXt9LAotICAgICAgICAgICAgICAgc2F2ZV9jb29raWVzPUZhbHNlKToKLSAgICAiIiJDcmVhdGVzIGEgbmV3IEh0dHBScGNTZXJ2ZXIuCi0KLSAgICBBcmdzOgotICAgICAgaG9zdDogVGhlIGhvc3QgdG8gc2VuZCByZXF1ZXN0cyB0by4KLSAgICAgIGF1dGhfZnVuY3Rpb246IEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4KLSAgICAgICAgKGVtYWlsLCBwYXNzd29yZCkgdHVwbGUgd2hlbiBjYWxsZWQuIFdpbGwgYmUgY2FsbGVkIGlmIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIGlzIHJlcXVpcmVkLgotICAgICAgaG9zdF9vdmVycmlkZTogVGhlIGhvc3QgaGVhZGVyIHRvIHNlbmQgdG8gdGhlIHNlcnZlciAoZGVmYXVsdHMgdG8gaG9zdCkuCi0gICAgICBleHRyYV9oZWFkZXJzOiBBIGRpY3Qgb2YgZXh0cmEgaGVhZGVycyB0byBhcHBlbmQgdG8gZXZlcnkgcmVxdWVzdC4KLSAgICAgIHNhdmVfY29va2llczogSWYgVHJ1ZSwgc2F2ZSB0aGUgYXV0aGVudGljYXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLgotICAgICAgICBJZiBGYWxzZSwgdXNlIGFuIGluLW1lbW9yeSBjb29raWVqYXIgaW5zdGVhZC4gIFN1YmNsYXNzZXMgbXVzdAotICAgICAgICBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5LiAgRGVmYXVsdHMgdG8gRmFsc2UuCi0gICAgIiIiCi0gICAgc2VsZi5ob3N0ID0gaG9zdAotICAgIHNlbGYuaG9zdF9vdmVycmlkZSA9IGhvc3Rfb3ZlcnJpZGUKLSAgICBzZWxmLmF1dGhfZnVuY3Rpb24gPSBhdXRoX2Z1bmN0aW9uCi0gICAgc2VsZi5hdXRoZW50aWNhdGVkID0gRmFsc2UKLSAgICBzZWxmLmV4dHJhX2hlYWRlcnMgPSBleHRyYV9oZWFkZXJzCi0gICAgc2VsZi5zYXZlX2Nvb2tpZXMgPSBzYXZlX2Nvb2tpZXMKLSAgICBzZWxmLm9wZW5lciA9IHNlbGYuX0dldE9wZW5lcigpCi0gICAgaWYgc2VsZi5ob3N0X292ZXJyaWRlOgotICAgICAgbG9nZ2luZy5pbmZvKCJTZXJ2ZXI6ICVzOyBIb3N0OiAlcyIsIHNlbGYuaG9zdCwgc2VsZi5ob3N0X292ZXJyaWRlKQotICAgIGVsc2U6Ci0gICAgICBsb2dnaW5nLmluZm8oIlNlcnZlcjogJXMiLCBzZWxmLmhvc3QpCi0KLSAgZGVmIF9HZXRPcGVuZXIoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhbiBPcGVuZXJEaXJlY3RvciBmb3IgbWFraW5nIEhUVFAgcmVxdWVzdHMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLQotICBkZWYgX0NyZWF0ZVJlcXVlc3Qoc2VsZiwgdXJsLCBkYXRhPU5vbmUpOgotICAgICIiIkNyZWF0ZXMgYSBuZXcgdXJsbGliIHJlcXVlc3QuIiIiCi0gICAgbG9nZ2luZy5kZWJ1ZygiQ3JlYXRpbmcgcmVxdWVzdCBmb3I6ICclcycgd2l0aCBwYXlsb2FkOlxuJXMiLCB1cmwsIGRhdGEpCi0gICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybCwgZGF0YT1kYXRhKQotICAgIGlmIHNlbGYuaG9zdF9vdmVycmlkZToKLSAgICAgIHJlcS5hZGRfaGVhZGVyKCJIb3N0Iiwgc2VsZi5ob3N0X292ZXJyaWRlKQotICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZXh0cmFfaGVhZGVycy5pdGVyaXRlbXMoKToKLSAgICAgIHJlcS5hZGRfaGVhZGVyKGtleSwgdmFsdWUpCi0gICAgcmV0dXJuIHJlcQotCi0gIGRlZiBfR2V0QXV0aFRva2VuKHNlbGYsIGVtYWlsLCBwYXNzd29yZCk6Ci0gICAgIiIiVXNlcyBDbGllbnRMb2dpbiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHJldHVybmluZyBhbiBhdXRoIHRva2VuLgotCi0gICAgQXJnczoKLSAgICAgIGVtYWlsOiAgICBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MKLSAgICAgIHBhc3N3b3JkOiBUaGUgdXNlcidzIHBhc3N3b3JkCi0KLSAgICBSYWlzZXM6Ci0gICAgICBDbGllbnRMb2dpbkVycm9yOiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXV0aGVudGljYXRpbmcgd2l0aCBDbGllbnRMb2dpbi4KLSAgICAgIEhUVFBFcnJvcjogSWYgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZm9ybSBvZiBIVFRQIGVycm9yLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiByZXR1cm5lZCBieSBDbGllbnRMb2dpbi4KLSAgICAiIiIKLSAgICBhY2NvdW50X3R5cGUgPSAiR09PR0xFIgotICAgIGlmIHNlbGYuaG9zdC5lbmRzd2l0aCgiLmdvb2dsZS5jb20iKToKLSAgICAgICMgTmVlZGVkIGZvciB1c2UgaW5zaWRlIEdvb2dsZS4KLSAgICAgIGFjY291bnRfdHlwZSA9ICJIT1NURUQiCi0gICAgcmVxID0gc2VsZi5fQ3JlYXRlUmVxdWVzdCgKLSAgICAgICAgdXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL0NsaWVudExvZ2luIiwKLSAgICAgICAgZGF0YT11cmxsaWIudXJsZW5jb2RlKHsKLSAgICAgICAgICAgICJFbWFpbCI6IGVtYWlsLAotICAgICAgICAgICAgIlBhc3N3ZCI6IHBhc3N3b3JkLAotICAgICAgICAgICAgInNlcnZpY2UiOiAiYWgiLAotICAgICAgICAgICAgInNvdXJjZSI6ICJyaWV0dmVsZC1jb2RlcmV2aWV3LXVwbG9hZCIsCi0gICAgICAgICAgICAiYWNjb3VudFR5cGUiOiBhY2NvdW50X3R5cGUsCi0gICAgICAgIH0pLAotICAgICkKLSAgICB0cnk6Ci0gICAgICByZXNwb25zZSA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQotICAgICAgcmVzcG9uc2VfYm9keSA9IHJlc3BvbnNlLnJlYWQoKQotICAgICAgcmVzcG9uc2VfZGljdCA9IGRpY3QoeC5zcGxpdCgiPSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByZXNwb25zZV9ib2R5LnNwbGl0KCJcbiIpIGlmIHgpCi0gICAgICByZXR1cm4gcmVzcG9uc2VfZGljdFsiQXV0aCJdCi0gICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBlOgotICAgICAgaWYgZS5jb2RlID09IDQwMzoKLSAgICAgICAgYm9keSA9IGUucmVhZCgpCi0gICAgICAgIHJlc3BvbnNlX2RpY3QgPSBkaWN0KHguc3BsaXQoIj0iLCAxKSBmb3IgeCBpbiBib2R5LnNwbGl0KCJcbiIpIGlmIHgpCi0gICAgICAgIHJhaXNlIENsaWVudExvZ2luRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBlLmNvZGUsIGUubXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGVhZGVycywgcmVzcG9uc2VfZGljdCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlCi0KLSAgZGVmIF9HZXRBdXRoQ29va2llKHNlbGYsIGF1dGhfdG9rZW4pOgotICAgICIiIkZldGNoZXMgYXV0aGVudGljYXRpb24gY29va2llcyBmb3IgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uCi0KLSAgICBBcmdzOgotICAgICAgYXV0aF90b2tlbjogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHJldHVybmVkIGJ5IENsaWVudExvZ2luLgotCi0gICAgUmFpc2VzOgotICAgICAgSFRUUEVycm9yOiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgZmV0Y2hpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMuCi0gICAgIiIiCi0gICAgIyBUaGlzIGlzIGEgZHVtbXkgdmFsdWUgdG8gYWxsb3cgdXMgdG8gaWRlbnRpZnkgd2hlbiB3ZSdyZSBzdWNjZXNzZnVsLgotICAgIGNvbnRpbnVlX2xvY2F0aW9uID0gImh0dHA6Ly9sb2NhbGhvc3QvIgotICAgIGFyZ3MgPSB7ImNvbnRpbnVlIjogY29udGludWVfbG9jYXRpb24sICJhdXRoIjogYXV0aF90b2tlbn0KLSAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KCJodHRwOi8vJXMvX2FoL2xvZ2luPyVzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCB1cmxsaWIudXJsZW5jb2RlKGFyZ3MpKSkKLSAgICB0cnk6Ci0gICAgICByZXNwb25zZSA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQotICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKLSAgICAgIHJlc3BvbnNlID0gZQotICAgIGlmIChyZXNwb25zZS5jb2RlICE9IDMwMiBvcgotICAgICAgICByZXNwb25zZS5pbmZvKClbImxvY2F0aW9uIl0gIT0gY29udGludWVfbG9jYXRpb24pOgotICAgICAgcmFpc2UgdXJsbGliMi5IVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCByZXNwb25zZS5jb2RlLCByZXNwb25zZS5tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5mcCkKLSAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCi0KLSAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6Ci0gICAgIiIiQXV0aGVudGljYXRlcyB0aGUgdXNlci4KLQotICAgIFRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIHdvcmtzIGFzIGZvbGxvd3M6Ci0gICAgIDEpIFdlIGdldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmcm9tIHRoZSB1c2VyCi0gICAgIDIpIFdlIHVzZSBDbGllbnRMb2dpbiB0byBvYnRhaW4gYW4gQVVUSCB0b2tlbiBmb3IgdGhlIHVzZXIKLSAgICAgICAgKHNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvYWNjb3VudHMvQXV0aEZvckluc3RhbGxlZEFwcHMuaHRtbCkuCi0gICAgIDMpIFdlIHBhc3MgdGhlIGF1dGggdG9rZW4gdG8gL19haC9sb2dpbiBvbiB0aGUgc2VydmVyIHRvIG9idGFpbiBhbgotICAgICAgICBhdXRoZW50aWNhdGlvbiBjb29raWUuIElmIGxvZ2luIHdhcyBzdWNjZXNzZnVsLCBpdCB0cmllcyB0byByZWRpcmVjdAotICAgICAgICB1cyB0byB0aGUgVVJMIHdlIHByb3ZpZGVkLgotCi0gICAgSWYgd2UgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIHVwbG9hZCBBUEkgd2l0aG91dCBmaXJzdCBvYnRhaW5pbmcgYW4KLSAgICBhdXRoZW50aWNhdGlvbiBjb29raWUsIGl0IHJldHVybnMgYSA0MDEgcmVzcG9uc2UgYW5kIGRpcmVjdHMgdXMgdG8KLSAgICBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHdpdGggQ2xpZW50TG9naW4uCi0gICAgIiIiCi0gICAgZm9yIGkgaW4gcmFuZ2UoMyk6Ci0gICAgICBjcmVkZW50aWFscyA9IHNlbGYuYXV0aF9mdW5jdGlvbigpCi0gICAgICB0cnk6Ci0gICAgICAgIGF1dGhfdG9rZW4gPSBzZWxmLl9HZXRBdXRoVG9rZW4oY3JlZGVudGlhbHNbMF0sIGNyZWRlbnRpYWxzWzFdKQotICAgICAgZXhjZXB0IENsaWVudExvZ2luRXJyb3IsIGU6Ci0gICAgICAgIGlmIGUucmVhc29uID09ICJCYWRBdXRoZW50aWNhdGlvbiI6Ci0gICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4iCi0gICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIkNhcHRjaGFSZXF1aXJlZCI6Ci0gICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCi0gICAgICAgICAgICAgICJQbGVhc2UgZ28gdG9cbiIKLSAgICAgICAgICAgICAgImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvRGlzcGxheVVubG9ja0NhcHRjaGFcbiIKLSAgICAgICAgICAgICAgImFuZCB2ZXJpZnkgeW91IGFyZSBhIGh1bWFuLiAgVGhlbiB0cnkgYWdhaW4uIikKLSAgICAgICAgICBicmVhawotICAgICAgICBpZiBlLnJlYXNvbiA9PSAiTm90VmVyaWZpZWQiOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkFjY291bnQgbm90IHZlcmlmaWVkLiIKLSAgICAgICAgICBicmVhawotICAgICAgICBpZiBlLnJlYXNvbiA9PSAiVGVybXNOb3RBZ3JlZWQiOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlVzZXIgaGFzIG5vdCBhZ3JlZWQgdG8gVE9TLiIKLSAgICAgICAgICBicmVhawotICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQWNjb3VudERlbGV0ZWQiOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlRoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGVsZXRlZC4iCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIkFjY291bnREaXNhYmxlZCI6Ci0gICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVGhlIHVzZXIgYWNjb3VudCBoYXMgYmVlbiBkaXNhYmxlZC4iCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIlNlcnZpY2VEaXNhYmxlZCI6Ci0gICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoIlRoZSB1c2VyJ3MgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIGhhcyBiZWVuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQuIikKLSAgICAgICAgICBicmVhawotICAgICAgICBpZiBlLnJlYXNvbiA9PSAiU2VydmljZVVuYXZhaWxhYmxlIjoKLSAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUaGUgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlOyB0cnkgYWdhaW4gbGF0ZXIuIgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIHJhaXNlCi0gICAgICBzZWxmLl9HZXRBdXRoQ29va2llKGF1dGhfdG9rZW4pCi0gICAgICByZXR1cm4KLQotICBkZWYgU2VuZChzZWxmLCByZXF1ZXN0X3BhdGgsIHBheWxvYWQ9Tm9uZSwKLSAgICAgICAgICAgY29udGVudF90eXBlPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLAotICAgICAgICAgICB0aW1lb3V0PU5vbmUsCi0gICAgICAgICAgICoqa3dhcmdzKToKLSAgICAiIiJTZW5kcyBhbiBSUEMgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlLgotCi0gICAgQXJnczoKLSAgICAgIHJlcXVlc3RfcGF0aDogVGhlIHBhdGggdG8gc2VuZCB0aGUgcmVxdWVzdCB0bywgZWcgL2FwaS9hcHB2ZXJzaW9uL2NyZWF0ZS4KLSAgICAgIHBheWxvYWQ6IFRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LCBvciBOb25lIHRvIHNlbmQgYW4gZW1wdHkgcmVxdWVzdC4KLSAgICAgIGNvbnRlbnRfdHlwZTogVGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdXNlLgotICAgICAgdGltZW91dDogdGltZW91dCBpbiBzZWNvbmRzOyBkZWZhdWx0IE5vbmUgaS5lLiBubyB0aW1lb3V0LgotICAgICAgICAoTm90ZTogZm9yIGxhcmdlIHJlcXVlc3RzIG9uIE9TIFgsIHRoZSB0aW1lb3V0IGRvZXNuJ3Qgd29yayByaWdodC4pCi0gICAgICBrd2FyZ3M6IEFueSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIGludG8gcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIHJlc3BvbnNlIGJvZHksIGFzIGEgc3RyaW5nLgotICAgICIiIgotICAgICMgVE9ETzogRG9uJ3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIExldCB0aGUgc2VydmVyIHNheQotICAgICMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkuCi0gICAgaWYgbm90IHNlbGYuYXV0aGVudGljYXRlZDoKLSAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCi0KLSAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCi0gICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCi0gICAgdHJ5OgotICAgICAgdHJpZXMgPSAwCi0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICB0cmllcyArPSAxCi0gICAgICAgIGFyZ3MgPSBkaWN0KGt3YXJncykKLSAgICAgICAgdXJsID0gImh0dHA6Ly8lcyVzIiAlIChzZWxmLmhvc3QsIHJlcXVlc3RfcGF0aCkKLSAgICAgICAgaWYgYXJnczoKLSAgICAgICAgICB1cmwgKz0gIj8iICsgdXJsbGliLnVybGVuY29kZShhcmdzKQotICAgICAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KHVybD11cmwsIGRhdGE9cGF5bG9hZCkKLSAgICAgICAgcmVxLmFkZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIGNvbnRlbnRfdHlwZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgIGYgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKLSAgICAgICAgICByZXNwb25zZSA9IGYucmVhZCgpCi0gICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCi0gICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKLSAgICAgICAgICBpZiB0cmllcyA+IDM6Ci0gICAgICAgICAgICByYWlzZQotICAgICAgICAgIGVsaWYgZS5jb2RlID09IDQwMToKLSAgICAgICAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCi0jIyAgICAgICAgICAgZWxpZiBlLmNvZGUgPj0gNTAwIGFuZCBlLmNvZGUgPCA2MDA6Ci0jIyAgICAgICAgICAgICAjIFNlcnZlciBFcnJvciAtIHRyeSBhZ2Fpbi4KLSMjICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlCi0gICAgZmluYWxseToKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKLQotCi1jbGFzcyBIdHRwUnBjU2VydmVyKEFic3RyYWN0UnBjU2VydmVyKToKLSAgIiIiUHJvdmlkZXMgYSBzaW1wbGlmaWVkIFJQQy1zdHlsZSBpbnRlcmZhY2UgZm9yIEhUVFAgcmVxdWVzdHMuIiIiCi0KLSAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6Ci0gICAgIiIiU2F2ZSB0aGUgY29va2llIGphciBhZnRlciBhdXRoZW50aWNhdGlvbi4iIiIKLSAgICBzdXBlcihIdHRwUnBjU2VydmVyLCBzZWxmKS5fQXV0aGVudGljYXRlKCkKLSAgICBpZiBzZWxmLnNhdmVfY29va2llczoKLSAgICAgIFN0YXR1c1VwZGF0ZSgiU2F2aW5nIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gJXMiICUgc2VsZi5jb29raWVfZmlsZSkKLSAgICAgIHNlbGYuY29va2llX2phci5zYXZlKCkKLQotICBkZWYgX0dldE9wZW5lcihzZWxmKToKLSAgICAiIiJSZXR1cm5zIGFuIE9wZW5lckRpcmVjdG9yIHRoYXQgc3VwcG9ydHMgY29va2llcyBhbmQgaWdub3JlcyByZWRpcmVjdHMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KLSAgICAiIiIKLSAgICBvcGVuZXIgPSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yKCkKLSAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Qcm94eUhhbmRsZXIoKSkKLSAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Vbmtub3duSGFuZGxlcigpKQotICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBIYW5kbGVyKCkpCi0gICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUERlZmF1bHRFcnJvckhhbmRsZXIoKSkKLSAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQU0hhbmRsZXIoKSkKLSAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQRXJyb3JQcm9jZXNzb3IoKSkKLSAgICBpZiBzZWxmLnNhdmVfY29va2llczoKLSAgICAgIHNlbGYuY29va2llX2ZpbGUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvZGVyZXZpZXdfdXBsb2FkX2Nvb2tpZXMiKQotICAgICAgc2VsZi5jb29raWVfamFyID0gY29va2llbGliLk1vemlsbGFDb29raWVKYXIoc2VsZi5jb29raWVfZmlsZSkKLSAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuY29va2llX2ZpbGUpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgc2VsZi5jb29raWVfamFyLmxvYWQoKQotICAgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKLSAgICAgICAgICBTdGF0dXNVcGRhdGUoIkxvYWRlZCBhdXRoZW50aWNhdGlvbiBjb29raWVzIGZyb20gJXMiICUKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29raWVfZmlsZSkKLSAgICAgICAgZXhjZXB0IChjb29raWVsaWIuTG9hZEVycm9yLCBJT0Vycm9yKToKLSAgICAgICAgICAjIEZhaWxlZCB0byBsb2FkIGNvb2tpZXMgLSBqdXN0IGlnbm9yZSB0aGVtLgotICAgICAgICAgIHBhc3MKLSAgICAgIGVsc2U6Ci0gICAgICAgICMgQ3JlYXRlIGFuIGVtcHR5IGNvb2tpZSBmaWxlIHdpdGggbW9kZSA2MDAKLSAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuY29va2llX2ZpbGUsIG9zLk9fQ1JFQVQsIDA2MDApCi0gICAgICAgIG9zLmNsb3NlKGZkKQotICAgICAgIyBBbHdheXMgY2htb2QgdGhlIGNvb2tpZSBmaWxlCi0gICAgICBvcy5jaG1vZChzZWxmLmNvb2tpZV9maWxlLCAwNjAwKQotICAgIGVsc2U6Ci0gICAgICAjIERvbid0IHNhdmUgY29va2llcyBhY3Jvc3MgcnVucyBvZiB1cGRhdGUucHkuCi0gICAgICBzZWxmLmNvb2tpZV9qYXIgPSBjb29raWVsaWIuQ29va2llSmFyKCkKLSAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKHNlbGYuY29va2llX2phcikpCi0gICAgcmV0dXJuIG9wZW5lcgotCi0KLXBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdIikKLXBhcnNlci5hZGRfb3B0aW9uKCIteSIsICItLWFzc3VtZV95ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAotICAgICAgICAgICAgICAgICAgZGVzdD0iYXNzdW1lX3llcyIsIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgICAgICAgICAgICBoZWxwPSJBc3N1bWUgdGhhdCB0aGUgYW5zd2VyIHRvIHllcy9ubyBxdWVzdGlvbnMgaXMgJ3llcycuIikKLSMgTG9nZ2luZwotZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiTG9nZ2luZyBvcHRpb25zIikKLWdyb3VwLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MCwKLSAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGhlbHA9IlByaW50IGVycm9ycyBvbmx5LiIpCi1ncm91cC5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MiwKLSAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9MSwKLSAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgaW5mbyBsZXZlbCBsb2dzIChkZWZhdWx0KS4iKQotZ3JvdXAuYWRkX29wdGlvbigiLS1ub2lzeSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0zLAotICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgaGVscD0iUHJpbnQgYWxsIGxvZ3MuIikKLSMgUmV2aWV3IHNlcnZlcgotZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUmV2aWV3IHNlcnZlciBvcHRpb25zIikKLWdyb3VwLmFkZF9vcHRpb24oIi1zIiwgIi0tc2VydmVyIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InNlcnZlciIsCi0gICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImNvZGVyZXZpZXcuYXBwc3BvdC5jb20iLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJTRVJWRVIiLAotICAgICAgICAgICAgICAgICBoZWxwPSgiVGhlIHNlcnZlciB0byB1cGxvYWQgdG8uIFRoZSBmb3JtYXQgaXMgaG9zdFs6cG9ydF0uICIKLSAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRzIHRvICdjb2RlcmV2aWV3LmFwcHNwb3QuY29tJy4iKSkKLWdyb3VwLmFkZF9vcHRpb24oIi1lIiwgIi0tZW1haWwiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZW1haWwiLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJFTUFJTCIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iVGhlIHVzZXJuYW1lIHRvIHVzZS4gV2lsbCBwcm9tcHQgaWYgb21pdHRlZC4iKQotZ3JvdXAuYWRkX29wdGlvbigiLUgiLCAiLS1ob3N0IiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9Imhvc3QiLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJIT1NUIiwgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgICBoZWxwPSJPdmVycmlkZXMgdGhlIEhvc3QgaGVhZGVyIHNlbnQgd2l0aCBhbGwgUlBDcy4iKQotZ3JvdXAuYWRkX29wdGlvbigiLS1ub19jb29raWVzIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCi0gICAgICAgICAgICAgICAgIGRlc3Q9InNhdmVfY29va2llcyIsIGRlZmF1bHQ9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iRG8gbm90IHNhdmUgYXV0aGVudGljYXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLiIpCi0jIElzc3VlCi1ncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJJc3N1ZSBvcHRpb25zIikKLWdyb3VwLmFkZF9vcHRpb24oIi1kIiwgIi0tZGVzY3JpcHRpb24iLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJERVNDUklQVElPTiIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgZGVzY3JpcHRpb24gd2hlbiBjcmVhdGluZyBhbiBpc3N1ZS4iKQotZ3JvdXAuYWRkX29wdGlvbigiLWYiLCAiLS1kZXNjcmlwdGlvbl9maWxlIiwgYWN0aW9uPSJzdG9yZSIsCi0gICAgICAgICAgICAgICAgIGRlc3Q9ImRlc2NyaXB0aW9uX2ZpbGUiLCBtZXRhdmFyPSJERVNDUklQVElPTl9GSUxFIiwKLSAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgICBoZWxwPSJPcHRpb25hbCBwYXRoIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zICIKLSAgICAgICAgICAgICAgICAgICAgICAidGhlIGRlc2NyaXB0aW9uIHdoZW4gY3JlYXRpbmcgYW4gaXNzdWUuIikKLWdyb3VwLmFkZF9vcHRpb24oIi1yIiwgIi0tcmV2aWV3ZXJzIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlld2VycyIsCi0gICAgICAgICAgICAgICAgIG1ldGF2YXI9IlJFVklFV0VSUyIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iQWRkIHJldmlld2VycyAoY29tbWEgc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcykuIikKLWdyb3VwLmFkZF9vcHRpb24oIi0tY2MiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iY2MiLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJDQyIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iQWRkIENDIChjb21tYSBzZXBhcmF0ZWQgZW1haWwgYWRkcmVzc2VzKS4iKQotIyBVcGxvYWQgb3B0aW9ucwotZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUGF0Y2ggb3B0aW9ucyIpCi1ncm91cC5hZGRfb3B0aW9uKCItbSIsICItLW1lc3NhZ2UiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0ibWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIG1ldGF2YXI9Ik1FU1NBR0UiLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9IkEgbWVzc2FnZSB0byBpZGVudGlmeSB0aGUgcGF0Y2guICIKLSAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBwcm9tcHQgaWYgb21pdHRlZC4iKQotZ3JvdXAuYWRkX29wdGlvbigiLWkiLCAiLS1pc3N1ZSIsIHR5cGU9ImludCIsIGFjdGlvbj0ic3RvcmUiLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJJU1NVRSIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iSXNzdWUgbnVtYmVyIHRvIHdoaWNoIHRvIGFkZC4gRGVmYXVsdHMgdG8gbmV3IGlzc3VlLiIpCi1ncm91cC5hZGRfb3B0aW9uKCItLWRvd25sb2FkX2Jhc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLAotICAgICAgICAgICAgICAgICBkZXN0PSJkb3dubG9hZF9iYXNlIiwgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iQmFzZSBmaWxlcyB3aWxsIGJlIGRvd25sb2FkZWQgYnkgdGhlIHNlcnZlciAiCi0gICAgICAgICAgICAgICAgICIoc2lkZS1ieS1zaWRlIGRpZmZzIG1heSBub3Qgd29yayBvbiBmaWxlcyB3aXRoIENScykuIikKLWdyb3VwLmFkZF9vcHRpb24oIi0tcmV2IiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlzaW9uIiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iUkVWIiwgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgICBoZWxwPSJCcmFuY2gvdHJlZS9yZXZpc2lvbiB0byBkaWZmIGFnYWluc3QgKHVzZWQgYnkgRFZDUykuIikKLWdyb3VwLmFkZF9vcHRpb24oIi0tc2VuZF9tYWlsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKLSAgICAgICAgICAgICAgICAgZGVzdD0ic2VuZF9tYWlsIiwgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iU2VuZCBub3RpZmljYXRpb24gZW1haWwgdG8gcmV2aWV3ZXJzLiIpCi0KLQotZGVmIEdldFJwY1NlcnZlcihvcHRpb25zKToKLSAgIiIiUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhbiBBYnN0cmFjdFJwY1NlcnZlci4KLQotICBSZXR1cm5zOgotICAgIEEgbmV3IEFic3RyYWN0UnBjU2VydmVyLCBvbiB3aGljaCBSUEMgY2FsbHMgY2FuIGJlIG1hZGUuCi0gICIiIgotCi0gIHJwY19zZXJ2ZXJfY2xhc3MgPSBIdHRwUnBjU2VydmVyCi0KLSAgZGVmIEdldFVzZXJDcmVkZW50aWFscygpOgotICAgICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiIiIgotICAgIGVtYWlsID0gb3B0aW9ucy5lbWFpbAotICAgIGlmIGVtYWlsIGlzIE5vbmU6Ci0gICAgICBlbWFpbCA9IEdldEVtYWlsKCJFbWFpbCAobG9naW4gZm9yIHVwbG9hZGluZyB0byAlcykiICUgb3B0aW9ucy5zZXJ2ZXIpCi0gICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIlBhc3N3b3JkIGZvciAlczogIiAlIGVtYWlsKQotICAgIHJldHVybiAoZW1haWwsIHBhc3N3b3JkKQotCi0gICMgSWYgdGhpcyBpcyB0aGUgZGV2X2FwcHNlcnZlciwgdXNlIGZha2UgYXV0aGVudGljYXRpb24uCi0gIGhvc3QgPSAob3B0aW9ucy5ob3N0IG9yIG9wdGlvbnMuc2VydmVyKS5sb3dlcigpCi0gIGlmIGhvc3QgPT0gImxvY2FsaG9zdCIgb3IgaG9zdC5zdGFydHN3aXRoKCJsb2NhbGhvc3Q6Iik6Ci0gICAgZW1haWwgPSBvcHRpb25zLmVtYWlsCi0gICAgaWYgZW1haWwgaXMgTm9uZToKLSAgICAgIGVtYWlsID0gInRlc3RAZXhhbXBsZS5jb20iCi0gICAgICBsb2dnaW5nLmluZm8oIlVzaW5nIGRlYnVnIHVzZXIgJXMuICBPdmVycmlkZSB3aXRoIC0tZW1haWwiICUgZW1haWwpCi0gICAgc2VydmVyID0gcnBjX3NlcnZlcl9jbGFzcygKLSAgICAgICAgb3B0aW9ucy5zZXJ2ZXIsCi0gICAgICAgIGxhbWJkYTogKGVtYWlsLCAicGFzc3dvcmQiKSwKLSAgICAgICAgaG9zdF9vdmVycmlkZT1vcHRpb25zLmhvc3QsCi0gICAgICAgIGV4dHJhX2hlYWRlcnM9eyJDb29raWUiOgotICAgICAgICAgICAgICAgICAgICAgICAnZGV2X2FwcHNlcnZlcl9sb2dpbj0iJXM6RmFsc2UiJyAlIGVtYWlsfSwKLSAgICAgICAgc2F2ZV9jb29raWVzPW9wdGlvbnMuc2F2ZV9jb29raWVzKQotICAgICMgRG9uJ3QgdHJ5IHRvIHRhbGsgdG8gQ2xpZW50TG9naW4uCi0gICAgc2VydmVyLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCi0gICAgcmV0dXJuIHNlcnZlcgotCi0gIHJldHVybiBycGNfc2VydmVyX2NsYXNzKG9wdGlvbnMuc2VydmVyLCBHZXRVc2VyQ3JlZGVudGlhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3ZlcnJpZGU9b3B0aW9ucy5ob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2Nvb2tpZXM9b3B0aW9ucy5zYXZlX2Nvb2tpZXMpCi0KLQotZGVmIEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZpZWxkcywgZmlsZXMpOgotICAiIiJFbmNvZGUgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydC9mb3JtLWRhdGEuCi0KLSAgQXJnczoKLSAgICBmaWVsZHM6IEEgc2VxdWVuY2Ugb2YgKG5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgcmVndWxhciBmb3JtIGZpZWxkcy4KLSAgICBmaWxlczogQSBzZXF1ZW5jZSBvZiAobmFtZSwgZmlsZW5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgZGF0YSB0byBiZQotICAgICAgICAgICB1cGxvYWRlZCBhcyBmaWxlcy4KLSAgUmV0dXJuczoKLSAgICAoY29udGVudF90eXBlLCBib2R5KSByZWFkeSBmb3IgaHR0cGxpYi5IVFRQIGluc3RhbmNlLgotCi0gIFNvdXJjZToKLSAgICBodHRwOi8vYXNwbi5hY3RpdmVzdGF0ZS5jb20vQVNQTi9Db29rYm9vay9QeXRob24vUmVjaXBlLzE0NjMwNgotICAiIiIKLSAgQk9VTkRBUlkgPSAnLU0tQS1HLUktQy0tLUItTy1VLU4tRC1BLVItWS0nCi0gIENSTEYgPSAnXHJcbicKLSAgbGluZXMgPSBbXQotICBmb3IgKGtleSwgdmFsdWUpIGluIGZpZWxkczoKLSAgICBsaW5lcy5hcHBlbmQoJy0tJyArIEJPVU5EQVJZKQotICAgIGxpbmVzLmFwcGVuZCgnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUga2V5KQotICAgIGxpbmVzLmFwcGVuZCgnJykKLSAgICBsaW5lcy5hcHBlbmQodmFsdWUpCi0gIGZvciAoa2V5LCBmaWxlbmFtZSwgdmFsdWUpIGluIGZpbGVzOgotICAgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkpCi0gICAgbGluZXMuYXBwZW5kKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIjsgZmlsZW5hbWU9IiVzIicgJQotICAgICAgICAgICAgIChrZXksIGZpbGVuYW1lKSkKLSAgICBsaW5lcy5hcHBlbmQoJ0NvbnRlbnQtVHlwZTogJXMnICUgR2V0Q29udGVudFR5cGUoZmlsZW5hbWUpKQotICAgIGxpbmVzLmFwcGVuZCgnJykKLSAgICBsaW5lcy5hcHBlbmQodmFsdWUpCi0gIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkgKyAnLS0nKQotICBsaW5lcy5hcHBlbmQoJycpCi0gIGJvZHkgPSBDUkxGLmpvaW4obGluZXMpCi0gIGNvbnRlbnRfdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBCT1VOREFSWQotICByZXR1cm4gY29udGVudF90eXBlLCBib2R5Ci0KLQotZGVmIEdldENvbnRlbnRUeXBlKGZpbGVuYW1lKToKLSAgIiIiSGVscGVyIHRvIGd1ZXNzIHRoZSBjb250ZW50LXR5cGUgZnJvbSB0aGUgZmlsZW5hbWUuIiIiCi0gIHJldHVybiBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0gb3IgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScKLQotCi0jIFVzZSBhIHNoZWxsIGZvciBzdWJjb21tYW5kcyBvbiBXaW5kb3dzIHRvIGdldCBhIFBBVEggc2VhcmNoLgotdXNlX3NoZWxsID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpCi0KLWRlZiBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNvbW1hbmQsIHByaW50X291dHB1dD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKToKLSAgIiIiRXhlY3V0ZXMgYSBjb21tYW5kIGFuZCByZXR1cm5zIHRoZSBvdXRwdXQgZnJvbSBzdGRvdXQgYW5kIHRoZSByZXR1cm4gY29kZS4KLQotICBBcmdzOgotICAgIGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZS4KLSAgICBwcmludF9vdXRwdXQ6IElmIFRydWUsIHRoZSBvdXRwdXQgaXMgcHJpbnRlZCB0byBzdGRvdXQuCi0gICAgICAgICAgICAgICAgICBJZiBGYWxzZSwgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgaWdub3JlZC4KLSAgICB1bml2ZXJzYWxfbmV3bGluZXM6IFVzZSB1bml2ZXJzYWxfbmV3bGluZXMgZmxhZyAoZGVmYXVsdDogVHJ1ZSkuCi0KLSAgUmV0dXJuczoKLSAgICBUdXBsZSAob3V0cHV0LCByZXR1cm4gY29kZSkKLSAgIiIiCi0gIGxvZ2dpbmcuaW5mbygiUnVubmluZyAlcyIsIGNvbW1hbmQpCi0gIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNoZWxsPXVzZV9zaGVsbCwgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcykKLSAgaWYgcHJpbnRfb3V0cHV0OgotICAgIG91dHB1dF9hcnJheSA9IFtdCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGxpbmUgPSBwLnN0ZG91dC5yZWFkbGluZSgpCi0gICAgICBpZiBub3QgbGluZToKLSAgICAgICAgYnJlYWsKLSAgICAgIHByaW50IGxpbmUuc3RyaXAoIlxuIikKLSAgICAgIG91dHB1dF9hcnJheS5hcHBlbmQobGluZSkKLSAgICBvdXRwdXQgPSAiIi5qb2luKG91dHB1dF9hcnJheSkKLSAgZWxzZToKLSAgICBvdXRwdXQgPSBwLnN0ZG91dC5yZWFkKCkKLSAgcC53YWl0KCkKLSAgZXJyb3V0ID0gcC5zdGRlcnIucmVhZCgpCi0gIGlmIHByaW50X291dHB1dCBhbmQgZXJyb3V0OgotICAgIHByaW50ID4+c3lzLnN0ZGVyciwgZXJyb3V0Ci0gIHAuc3Rkb3V0LmNsb3NlKCkKLSAgcC5zdGRlcnIuY2xvc2UoKQotICByZXR1cm4gb3V0cHV0LCBwLnJldHVybmNvZGUKLQotCi1kZWYgUnVuU2hlbGwoY29tbWFuZCwgc2lsZW50X29rPUZhbHNlLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKLSAgICAgICAgICAgICBwcmludF9vdXRwdXQ9RmFsc2UpOgotICBkYXRhLCByZXRjb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjb21tYW5kLCBwcmludF9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcykKLSAgaWYgcmV0Y29kZToKLSAgICBFcnJvckV4aXQoIkdvdCBlcnJvciBzdGF0dXMgZnJvbSAlczpcbiVzIiAlIChjb21tYW5kLCBkYXRhKSkKLSAgaWYgbm90IHNpbGVudF9vayBhbmQgbm90IGRhdGE6Ci0gICAgRXJyb3JFeGl0KCJObyBvdXRwdXQgZnJvbSAlcyIgJSBjb21tYW5kKQotICByZXR1cm4gZGF0YQotCi0KLWNsYXNzIFZlcnNpb25Db250cm9sU3lzdGVtKG9iamVjdCk6Ci0gICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgVkNTLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zKToKLSAgICAiIiJDb25zdHJ1Y3Rvci4KLQotICAgIEFyZ3M6Ci0gICAgICBvcHRpb25zOiBDb21tYW5kIGxpbmUgb3B0aW9ucy4KLSAgICAiIiIKLSAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCi0KLSAgZGVmIEdlbmVyYXRlRGlmZihzZWxmLCBhcmdzKToKLSAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGlmZiBhcyBhIHN0cmluZy4KLQotICAgIEFyZ3M6Ci0gICAgICBhcmdzOiBFeHRyYSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZGlmZiBjb21tYW5kLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCi0gICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKLQotICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgotICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdW5rbm93biB0byB0aGUgVkNTLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCi0gICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKLQotICBkZWYgQ2hlY2tGb3JVbmtub3duRmlsZXMoc2VsZik6Ci0gICAgIiIiU2hvdyBhbiAiYXJlIHlvdSBzdXJlPyIgcHJvbXB0IGlmIHRoZXJlIGFyZSB1bmtub3duIGZpbGVzLiIiIgotICAgIHVua25vd25fZmlsZXMgPSBzZWxmLkdldFVua25vd25GaWxlcygpCi0gICAgaWYgdW5rbm93bl9maWxlczoKLSAgICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBub3QgYWRkZWQgdG8gdmVyc2lvbiBjb250cm9sOiIKLSAgICAgIGZvciBsaW5lIGluIHVua25vd25fZmlsZXM6Ci0gICAgICAgIHByaW50IGxpbmUKLSAgICAgIHByb21wdCA9ICJBcmUgeW91IHN1cmUgdG8gY29udGludWU/KHkvTikgIgotICAgICAgYW5zd2VyID0gcmF3X2lucHV0KHByb21wdCkuc3RyaXAoKQotICAgICAgaWYgYW5zd2VyICE9ICJ5IjoKLSAgICAgICAgRXJyb3JFeGl0KCJVc2VyIGFib3J0ZWQiKQotCi0gIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAgIiIiR2V0IHRoZSBjb250ZW50IG9mIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIG9mIGEgZmlsZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIHR1cGxlIChiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cykKLSAgICAgICAgYmFzZV9jb250ZW50OiBUaGUgY29udGVudHMgb2YgdGhlIGJhc2UgZmlsZS4KLSAgICAgICAgbmV3X2NvbnRlbnQ6IEZvciB0ZXh0IGZpbGVzLCB0aGlzIGlzIGVtcHR5LiAgRm9yIGJpbmFyeSBmaWxlcywgdGhpcyBpcwotICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IGZpbGUsIHNpbmNlIHRoZSBkaWZmIG91dHB1dCB3b24ndCBjb250YWluCi0gICAgICAgICAgaW5mb3JtYXRpb24gdG8gcmVjb25zdHJ1Y3QgdGhlIGN1cnJlbnQgZmlsZS4KLSAgICAgICAgaXNfYmluYXJ5OiBUcnVlIGlmZiB0aGUgZmlsZSBpcyBiaW5hcnkuCi0gICAgICAgIHN0YXR1czogVGhlIHN0YXR1cyBvZiB0aGUgZmlsZS4KLSAgICAiIiIKLQotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCi0gICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKLQotCi0gIGRlZiBHZXRCYXNlRmlsZXMoc2VsZiwgZGlmZik6Ci0gICAgIiIiSGVscGVyIHRoYXQgY2FsbHMgR2V0QmFzZSBmaWxlIGZvciBlYWNoIGZpbGUgaW4gdGhlIHBhdGNoLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgZnJvbSBmaWxlbmFtZSB0byBHZXRCYXNlRmlsZSdzIHR1cGxlLiAgRmlsZW5hbWVzCi0gICAgICBhcmUgcmV0cmlldmVkIGJhc2VkIG9uIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAiSW5kZXg6IiBvcgotICAgICAgIlByb3BlcnR5IGNoYW5nZXMgb246Ii4KLSAgICAiIiIKLSAgICBmaWxlcyA9IHt9Ci0gICAgZm9yIGxpbmUgaW4gZGlmZi5zcGxpdGxpbmVzKFRydWUpOgotICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdJbmRleDonKSBvciBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6Ci0gICAgICAgIHVudXNlZCwgZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKLSAgICAgICAgIyBPbiBXaW5kb3dzIGlmIGEgZmlsZSBoYXMgcHJvcGVydHkgY2hhbmdlcyBpdHMgZmlsZW5hbWUgdXNlcyAnXCcKLSAgICAgICAgIyBpbnN0ZWFkIG9mICcvJy4KLSAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQotICAgICAgICBmaWxlc1tmaWxlbmFtZV0gPSBzZWxmLkdldEJhc2VGaWxlKGZpbGVuYW1lKQotICAgIHJldHVybiBmaWxlcwotCi0KLSAgZGVmIFVwbG9hZEJhc2VGaWxlcyhzZWxmLCBpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hfbGlzdCwgcGF0Y2hzZXQsIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZXMpOgotICAgICIiIlVwbG9hZHMgdGhlIGJhc2UgZmlsZXMgKGFuZCBpZiBuZWNlc3NhcnksIHRoZSBjdXJyZW50IG9uZXMgYXMgd2VsbCkuIiIiCi0KLSAgICBkZWYgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIGlzX2Jhc2UpOgotICAgICAgIiIiVXBsb2FkcyBhIGZpbGUgdG8gdGhlIHNlcnZlci4iIiIKLSAgICAgIGZpbGVfdG9vX2xhcmdlID0gRmFsc2UKLSAgICAgIGlmIGlzX2Jhc2U6Ci0gICAgICAgIHR5cGUgPSAiYmFzZSIKLSAgICAgIGVsc2U6Ci0gICAgICAgIHR5cGUgPSAiY3VycmVudCIKLSAgICAgIGlmIGxlbihjb250ZW50KSA+IE1BWF9VUExPQURfU0laRToKLSAgICAgICAgcHJpbnQgKCJOb3QgdXBsb2FkaW5nIHRoZSAlcyBmaWxlIGZvciAlcyBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlLiIgJQotICAgICAgICAgICAgICAgKHR5cGUsIGZpbGVuYW1lKSkKLSAgICAgICAgZmlsZV90b29fbGFyZ2UgPSBUcnVlCi0gICAgICAgIGNvbnRlbnQgPSAiIgotICAgICAgY2hlY2tzdW0gPSBtZDUubmV3KGNvbnRlbnQpLmhleGRpZ2VzdCgpCi0gICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwIGFuZCBub3QgZmlsZV90b29fbGFyZ2U6Ci0gICAgICAgIHByaW50ICJVcGxvYWRpbmcgJXMgZmlsZSBmb3IgJXMiICUgKHR5cGUsIGZpbGVuYW1lKQotICAgICAgdXJsID0gIi8lZC91cGxvYWRfY29udGVudC8lZC8lZCIgJSAoaW50KGlzc3VlKSwgaW50KHBhdGNoc2V0KSwgZmlsZV9pZCkKLSAgICAgIGZvcm1fZmllbGRzID0gWygiZmlsZW5hbWUiLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAoInN0YXR1cyIsIHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICAoImNoZWNrc3VtIiwgY2hlY2tzdW0pLAotICAgICAgICAgICAgICAgICAgICAgKCJpc19iaW5hcnkiLCBzdHIoaXNfYmluYXJ5KSksCi0gICAgICAgICAgICAgICAgICAgICAoImlzX2N1cnJlbnQiLCBzdHIobm90IGlzX2Jhc2UpKSwKLSAgICAgICAgICAgICAgICAgICAgXQotICAgICAgaWYgZmlsZV90b29fbGFyZ2U6Ci0gICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImZpbGVfdG9vX2xhcmdlIiwgIjEiKSkKLSAgICAgIGlmIG9wdGlvbnMuZW1haWw6Ci0gICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKLSAgICAgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZm9ybV9maWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoImRhdGEiLCBmaWxlbmFtZSwgY29udGVudCldKQotICAgICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZT1jdHlwZSkKLSAgICAgIGlmIG5vdCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIk9LIik6Ci0gICAgICAgIFN0YXR1c1VwZGF0ZSgiICAtLT4gJXMiICUgcmVzcG9uc2VfYm9keSkKLSAgICAgICAgc3lzLmV4aXQoMSkKLQotICAgIHBhdGNoZXMgPSBkaWN0KCkKLSAgICBbcGF0Y2hlcy5zZXRkZWZhdWx0KHYsIGspIGZvciBrLCB2IGluIHBhdGNoX2xpc3RdCi0gICAgZm9yIGZpbGVuYW1lIGluIHBhdGNoZXMua2V5cygpOgotICAgICAgYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMgPSBmaWxlc1tmaWxlbmFtZV0KLSAgICAgIGZpbGVfaWRfc3RyID0gcGF0Y2hlcy5nZXQoZmlsZW5hbWUpCi0gICAgICBpZiBmaWxlX2lkX3N0ci5maW5kKCJub2Jhc2UiKSAhPSAtMToKLSAgICAgICAgYmFzZV9jb250ZW50ID0gTm9uZQotICAgICAgICBmaWxlX2lkX3N0ciA9IGZpbGVfaWRfc3RyW2ZpbGVfaWRfc3RyLnJmaW5kKCJfIikgKyAxOl0KLSAgICAgIGZpbGVfaWQgPSBpbnQoZmlsZV9pZF9zdHIpCi0gICAgICBpZiBiYXNlX2NvbnRlbnQgIT0gTm9uZToKLSAgICAgICAgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgYmFzZV9jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgVHJ1ZSkKLSAgICAgIGlmIG5ld19jb250ZW50ICE9IE5vbmU6Ci0gICAgICAgIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgRmFsc2UpCi0KLSAgZGVmIElzSW1hZ2Uoc2VsZiwgZmlsZW5hbWUpOgotICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaGFzIGFuIGltYWdlIGV4dGVuc2lvbi4iIiIKLSAgICBtaW1ldHlwZSA9ICBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0KLSAgICBpZiBub3QgbWltZXR5cGU6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gbWltZXR5cGUuc3RhcnRzd2l0aCgiaW1hZ2UvIikKLQotCi1jbGFzcyBTdWJ2ZXJzaW9uVkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKLSAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgU3VidmVyc2lvbi4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6Ci0gICAgc3VwZXIoU3VidmVyc2lvblZDUywgc2VsZikuX19pbml0X18ob3B0aW9ucykKLSAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246Ci0gICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiKFxkKykoOihcZCspKT8iLCBzZWxmLm9wdGlvbnMucmV2aXNpb24pCi0gICAgICBpZiBub3QgbWF0Y2g6Ci0gICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBTdWJ2ZXJzaW9uIHJldmlzaW9uICVzLiIgJSBzZWxmLm9wdGlvbnMucmV2aXNpb24pCi0gICAgICBzZWxmLnJldl9zdGFydCA9IG1hdGNoLmdyb3VwKDEpCi0gICAgICBzZWxmLnJldl9lbmQgPSBtYXRjaC5ncm91cCgzKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnJldl9zdGFydCA9IHNlbGYucmV2X2VuZCA9IE5vbmUKLSAgICAjIENhY2hlIG91dHB1dCBmcm9tICJzdm4gbGlzdCAtciBSRVZOTyBkaXJuYW1lIi4KLSAgICAjIEtleXM6IGRpcm5hbWUsIFZhbHVlczogMi10dXBsZSAob3VwdXQgZm9yIHN0YXJ0IHJldiBhbmQgZW5kIHJldikuCi0gICAgc2VsZi5zdm5sc19jYWNoZSA9IHt9Ci0gICAgIyBTVk4gYmFzZSBVUkwgaXMgcmVxdWlyZWQgdG8gZmV0Y2ggZmlsZXMgZGVsZXRlZCBpbiBhbiBvbGRlciByZXZpc2lvbi4KLSAgICAjIFJlc3VsdCBpcyBjYWNoZWQgdG8gbm90IGd1ZXNzIGl0IG92ZXIgYW5kIG92ZXIgYWdhaW4gaW4gR2V0QmFzZUZpbGUoKS4KLSAgICByZXF1aXJlZCA9IHNlbGYub3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIHNlbGYub3B0aW9ucy5yZXZpc2lvbiBpcyBub3QgTm9uZQotICAgIHNlbGYuc3ZuX2Jhc2UgPSBzZWxmLl9HdWVzc0Jhc2UocmVxdWlyZWQpCi0KLSAgZGVmIEd1ZXNzQmFzZShzZWxmLCByZXF1aXJlZCk6Ci0gICAgIiIiV3JhcHBlciBmb3IgX0d1ZXNzQmFzZS4iIiIKLSAgICByZXR1cm4gc2VsZi5zdm5fYmFzZQotCi0gIGRlZiBfR3Vlc3NCYXNlKHNlbGYsIHJlcXVpcmVkKToKLSAgICAiIiJSZXR1cm5zIHRoZSBTVk4gYmFzZSBVUkwuCi0KLSAgICBBcmdzOgotICAgICAgcmVxdWlyZWQ6IElmIHRydWUsIGV4aXRzIGlmIHRoZSB1cmwgY2FuJ3QgYmUgZ3Vlc3NlZCwgb3RoZXJ3aXNlIE5vbmUgaXMKLSAgICAgICAgcmV0dXJuZWQuCi0gICAgIiIiCi0gICAgaW5mbyA9IFJ1blNoZWxsKFsic3ZuIiwgImluZm8iXSkKLSAgICBmb3IgbGluZSBpbiBpbmZvLnNwbGl0bGluZXMoKToKLSAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCi0gICAgICBpZiBsZW4od29yZHMpID09IDIgYW5kIHdvcmRzWzBdID09ICJVUkw6IjoKLSAgICAgICAgdXJsID0gd29yZHNbMV0KLSAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQotICAgICAgICB1c2VybmFtZSwgbmV0bG9jID0gdXJsbGliLnNwbGl0dXNlcihuZXRsb2MpCi0gICAgICAgIGlmIHVzZXJuYW1lOgotICAgICAgICAgIGxvZ2dpbmcuaW5mbygiUmVtb3ZlZCB1c2VybmFtZSBmcm9tIGJhc2UgVVJMIikKLSAgICAgICAgaWYgbmV0bG9jLmVuZHN3aXRoKCJzdm4ucHl0aG9uLm9yZyIpOgotICAgICAgICAgIGlmIG5ldGxvYyA9PSAic3ZuLnB5dGhvbi5vcmciOgotICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCIvcHJvamVjdHMvIik6Ci0gICAgICAgICAgICAgIHBhdGggPSBwYXRoWzk6XQotICAgICAgICAgIGVsaWYgbmV0bG9jICE9ICJweXRob25kZXZAc3ZuLnB5dGhvbi5vcmciOgotICAgICAgICAgICAgRXJyb3JFeGl0KCJVbnJlY29nbml6ZWQgUHl0aG9uIFVSTDogJXMiICUgdXJsKQotICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5weXRob24ub3JnL3ZpZXcvKmNoZWNrb3V0KiVzLyIgJSBwYXRoCi0gICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFB5dGhvbiBiYXNlID0gJXMiLCBiYXNlKQotICAgICAgICBlbGlmIG5ldGxvYy5lbmRzd2l0aCgic3ZuLmNvbGxhYi5uZXQiKToKLSAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoIi9yZXBvcy8iKToKLSAgICAgICAgICAgIHBhdGggPSBwYXRoWzY6XQotICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5jb2xsYWIubmV0L3ZpZXd2Yy8qY2hlY2tvdXQqJXMvIiAlIHBhdGgKLSAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgQ29sbGFiTmV0IGJhc2UgPSAlcyIsIGJhc2UpCi0gICAgICAgIGVsaWYgbmV0bG9jLmVuZHN3aXRoKCIuZ29vZ2xlY29kZS5jb20iKToKLSAgICAgICAgICBwYXRoID0gcGF0aCArICIvIgotICAgICAgICAgIGJhc2UgPSB1cmxwYXJzZS51cmx1bnBhcnNlKCgiaHR0cCIsIG5ldGxvYywgcGF0aCwgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQpKQotICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBHb29nbGUgQ29kZSBiYXNlID0gJXMiLCBiYXNlKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iCi0gICAgICAgICAgYmFzZSA9IHVybHBhcnNlLnVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFnbWVudCkpCi0gICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIGJhc2UgPSAlcyIsIGJhc2UpCi0gICAgICAgIHJldHVybiBiYXNlCi0gICAgaWYgcmVxdWlyZWQ6Ci0gICAgICBFcnJvckV4aXQoIkNhbid0IGZpbmQgVVJMIGluIG91dHB1dCBmcm9tIHN2biBpbmZvIikKLSAgICByZXR1cm4gTm9uZQotCi0gIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgYXJncyk6Ci0gICAgY21kID0gWyJzdm4iLCAiZGlmZiJdCi0gICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgotICAgICAgY21kICs9IFsiLXIiLCBzZWxmLm9wdGlvbnMucmV2aXNpb25dCi0gICAgY21kLmV4dGVuZChhcmdzKQotICAgIGRhdGEgPSBSdW5TaGVsbChjbWQpCi0gICAgY291bnQgPSAwCi0gICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6Ci0gICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkluZGV4OiIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiUHJvcGVydHkgY2hhbmdlcyBvbjoiKToKLSAgICAgICAgY291bnQgKz0gMQotICAgICAgICBsb2dnaW5nLmluZm8obGluZSkKLSAgICBpZiBub3QgY291bnQ6Ci0gICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gc3ZuIGRpZmYiKQotICAgIHJldHVybiBkYXRhCi0KLSAgZGVmIF9Db2xsYXBzZUtleXdvcmRzKHNlbGYsIGNvbnRlbnQsIGtleXdvcmRfc3RyKToKLSAgICAiIiJDb2xsYXBzZXMgU1ZOIGtleXdvcmRzLiIiIgotICAgICMgc3ZuIGNhdCB0cmFuc2xhdGVzIGtleXdvcmRzIGJ1dCBzdm4gZGlmZiBkb2Vzbid0LiBBcyBhIHJlc3VsdCBvZiB0aGlzCi0gICAgIyBiZWhhdmlvciBwYXRjaGluZy5QYXRjaENodW5rcygpIGZhaWxzIHdpdGggYSBjaHVuayBtaXNtYXRjaCBlcnJvci4KLSAgICAjIFRoaXMgcGFydCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IHRoZSBSZXZpZXcgQm9hcmQgZGV2ZWxvcG1lbnQgdGVhbQotICAgICMgd2hvIGhhZCB0aGUgc2FtZSBwcm9ibGVtIChodHRwOi8vcmV2aWV3cy5yZXZpZXctYm9hcmQub3JnL3IvMjc2LykuCi0gICAgIyBNYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtub3duIGFsaWFzZXMKLSAgICBzdm5fa2V5d29yZHMgPSB7Ci0gICAgICAjIFN0YW5kYXJkIGtleXdvcmRzCi0gICAgICAnRGF0ZSc6ICAgICAgICAgICAgICAgIFsnRGF0ZScsICdMYXN0Q2hhbmdlZERhdGUnXSwKLSAgICAgICdSZXZpc2lvbic6ICAgICAgICAgICAgWydSZXZpc2lvbicsICdMYXN0Q2hhbmdlZFJldmlzaW9uJywgJ1JldiddLAotICAgICAgJ0F1dGhvcic6ICAgICAgICAgICAgICBbJ0F1dGhvcicsICdMYXN0Q2hhbmdlZEJ5J10sCi0gICAgICAnSGVhZFVSTCc6ICAgICAgICAgICAgIFsnSGVhZFVSTCcsICdVUkwnXSwKLSAgICAgICdJZCc6ICAgICAgICAgICAgICAgICAgWydJZCddLAotCi0gICAgICAjIEFsaWFzZXMKLSAgICAgICdMYXN0Q2hhbmdlZERhdGUnOiAgICAgWydMYXN0Q2hhbmdlZERhdGUnLCAnRGF0ZSddLAotICAgICAgJ0xhc3RDaGFuZ2VkUmV2aXNpb24nOiBbJ0xhc3RDaGFuZ2VkUmV2aXNpb24nLCAnUmV2JywgJ1JldmlzaW9uJ10sCi0gICAgICAnTGFzdENoYW5nZWRCeSc6ICAgICAgIFsnTGFzdENoYW5nZWRCeScsICdBdXRob3InXSwKLSAgICAgICdVUkwnOiAgICAgICAgICAgICAgICAgWydVUkwnLCAnSGVhZFVSTCddLAotICAgIH0KLQotICAgIGRlZiByZXBsKG0pOgotICAgICAgIGlmIG0uZ3JvdXAoMik6Ci0gICAgICAgICByZXR1cm4gIiQlczo6JXMkIiAlIChtLmdyb3VwKDEpLCAiICIgKiBsZW4obS5ncm91cCgzKSkpCi0gICAgICAgcmV0dXJuICIkJXMkIiAlIG0uZ3JvdXAoMSkKLSAgICBrZXl3b3JkcyA9IFtrZXl3b3JkCi0gICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4ga2V5d29yZF9zdHIuc3BsaXQoIiAiKQotICAgICAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIHN2bl9rZXl3b3Jkcy5nZXQobmFtZSwgW10pXQotICAgIHJldHVybiByZS5zdWIociJcJCglcyk6KDo/KShbXlwkXSspXCQiICUgJ3wnLmpvaW4oa2V5d29yZHMpLCByZXBsLCBjb250ZW50KQotCi0gIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6Ci0gICAgc3RhdHVzID0gUnVuU2hlbGwoWyJzdm4iLCAic3RhdHVzIiwgIi0taWdub3JlLWV4dGVybmFscyJdLCBzaWxlbnRfb2s9VHJ1ZSkKLSAgICB1bmtub3duX2ZpbGVzID0gW10KLSAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXQoIlxuIik6Ci0gICAgICBpZiBsaW5lIGFuZCBsaW5lWzBdID09ICI/IjoKLSAgICAgICAgdW5rbm93bl9maWxlcy5hcHBlbmQobGluZSkKLSAgICByZXR1cm4gdW5rbm93bl9maWxlcwotCi0gIGRlZiBSZWFkRmlsZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJucyB0aGUgY29udGVudHMgb2YgYSBmaWxlLiIiIgotICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lLCAncmInKQotICAgIHJlc3VsdCA9ICIiCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gZmlsZS5yZWFkKCkKLSAgICBmaW5hbGx5OgotICAgICAgZmlsZS5jbG9zZSgpCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBHZXRTdGF0dXMoc2VsZiwgZmlsZW5hbWUpOgotICAgICIiIlJldHVybnMgdGhlIHN0YXR1cyBvZiBhIGZpbGUuIiIiCi0gICAgaWYgbm90IHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKLSAgICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsic3ZuIiwgInN0YXR1cyIsICItLWlnbm9yZS1leHRlcm5hbHMiLCBmaWxlbmFtZV0pCi0gICAgICBpZiBub3Qgc3RhdHVzOgotICAgICAgICBFcnJvckV4aXQoInN2biBzdGF0dXMgcmV0dXJuZWQgbm8gb3V0cHV0IGZvciAlcyIgJSBmaWxlbmFtZSkKLSAgICAgIHN0YXR1c19saW5lcyA9IHN0YXR1cy5zcGxpdGxpbmVzKCkKLSAgICAgICMgSWYgZmlsZSBpcyBpbiBhIGNsLCB0aGUgb3V0cHV0IHdpbGwgYmVnaW4gd2l0aAotICAgICAgIyAiXG4tLS0gQ2hhbmdlbGlzdCAnY2xfbmFtZSc6XG4iLiAgU2VlCi0gICAgICAjIGh0dHA6Ly9zdm4uY29sbGFiLm5ldC9yZXBvcy9zdm4vdHJ1bmsvbm90ZXMvY2hhbmdlbGlzdC1kZXNpZ24udHh0Ci0gICAgICBpZiAobGVuKHN0YXR1c19saW5lcykgPT0gMyBhbmQKLSAgICAgICAgICBub3Qgc3RhdHVzX2xpbmVzWzBdIGFuZAotICAgICAgICAgIHN0YXR1c19saW5lc1sxXS5zdGFydHN3aXRoKCItLS0gQ2hhbmdlbGlzdCIpKToKLSAgICAgICAgc3RhdHVzID0gc3RhdHVzX2xpbmVzWzJdCi0gICAgICBlbHNlOgotICAgICAgICBzdGF0dXMgPSBzdGF0dXNfbGluZXNbMF0KLSAgICAjIElmIHdlIGhhdmUgYSByZXZpc2lvbiB0byBkaWZmIGFnYWluc3Qgd2UgbmVlZCB0byBydW4gInN2biBsaXN0IgotICAgICMgZm9yIHRoZSBvbGQgYW5kIHRoZSBuZXcgcmV2aXNpb24gYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMgdG8gZ2V0Ci0gICAgIyB0aGUgY29ycmVjdCBzdGF0dXMgZm9yIGEgZmlsZS4KLSAgICBlbHNlOgotICAgICAgZGlybmFtZSwgcmVsZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQotICAgICAgaWYgZGlybmFtZSBub3QgaW4gc2VsZi5zdm5sc19jYWNoZToKLSAgICAgICAgY21kID0gWyJzdm4iLCAibGlzdCIsICItciIsIHNlbGYucmV2X3N0YXJ0LCBkaXJuYW1lIG9yICIuIl0KLSAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCi0gICAgICAgIGlmIHJldHVybmNvZGU6Ci0gICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyBmb3IgJXMuIiAlIGZpbGVuYW1lKQotICAgICAgICBvbGRfZmlsZXMgPSBvdXQuc3BsaXRsaW5lcygpCi0gICAgICAgIGFyZ3MgPSBbInN2biIsICJsaXN0Il0KLSAgICAgICAgaWYgc2VsZi5yZXZfZW5kOgotICAgICAgICAgIGFyZ3MgKz0gWyItciIsIHNlbGYucmV2X2VuZF0KLSAgICAgICAgY21kID0gYXJncyArIFtkaXJuYW1lIG9yICIuIl0KLSAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCi0gICAgICAgIGlmIHJldHVybmNvZGU6Ci0gICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJXMiICUgY21kKQotICAgICAgICBzZWxmLnN2bmxzX2NhY2hlW2Rpcm5hbWVdID0gKG9sZF9maWxlcywgb3V0LnNwbGl0bGluZXMoKSkKLSAgICAgIG9sZF9maWxlcywgbmV3X2ZpbGVzID0gc2VsZi5zdm5sc19jYWNoZVtkaXJuYW1lXQotICAgICAgaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBub3QgaW4gbmV3X2ZpbGVzOgotICAgICAgICBzdGF0dXMgPSAiRCAgICIKLSAgICAgIGVsaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBpbiBuZXdfZmlsZXM6Ci0gICAgICAgIHN0YXR1cyA9ICJNICAgIgotICAgICAgZWxzZToKLSAgICAgICAgc3RhdHVzID0gIkEgICAiCi0gICAgcmV0dXJuIHN0YXR1cwotCi0gIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAgc3RhdHVzID0gc2VsZi5HZXRTdGF0dXMoZmlsZW5hbWUpCi0gICAgYmFzZV9jb250ZW50ID0gTm9uZQotICAgIG5ld19jb250ZW50ID0gTm9uZQotCi0gICAgIyBJZiBhIGZpbGUgaXMgY29waWVkIGl0cyBzdGF0dXMgd2lsbCBiZSAiQSAgKyIsIHdoaWNoIHNpZ25pZmllcwotICAgICMgImFkZGl0aW9uLXdpdGgtaGlzdG9yeSIuICBTZWUgInN2biBzdCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBXZSBuZWVkIHRvCi0gICAgIyB1cGxvYWQgdGhlIG9yaWdpbmFsIGZpbGUgb3IgZWxzZSBkaWZmIHBhcnNpbmcgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIHdhcwotICAgICMgZWRpdGVkLgotICAgIGlmIHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSAhPSAiKyI6Ci0gICAgICAjIFdlJ2xsIG5lZWQgdG8gdXBsb2FkIHRoZSBuZXcgY29udGVudCBpZiB3ZSdyZSBhZGRpbmcgYSBiaW5hcnkgZmlsZQotICAgICAgIyBzaW5jZSBkaWZmJ3Mgb3V0cHV0IHdvbid0IGNvbnRhaW4gaXQuCi0gICAgICBtaW1ldHlwZSA9IFJ1blNoZWxsKFsic3ZuIiwgInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIGZpbGVuYW1lXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCi0gICAgICBiYXNlX2NvbnRlbnQgPSAiIgotICAgICAgaXNfYmluYXJ5ID0gbWltZXR5cGUgYW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCi0gICAgICBpZiBpc19iaW5hcnkgYW5kIHNlbGYuSXNJbWFnZShmaWxlbmFtZSk6Ci0gICAgICAgIG5ld19jb250ZW50ID0gc2VsZi5SZWFkRmlsZShmaWxlbmFtZSkKLSAgICBlbGlmIChzdGF0dXNbMF0gaW4gKCJNIiwgIkQiLCAiUiIpIG9yCi0gICAgICAgICAgKHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSA9PSAiKyIpIG9yICAjIENvcGllZCBmaWxlLgotICAgICAgICAgIChzdGF0dXNbMF0gPT0gIiAiIGFuZCBzdGF0dXNbMV0gPT0gIk0iKSk6ICAjIFByb3BlcnR5IGNoYW5nZS4KLSAgICAgIGFyZ3MgPSBbXQotICAgICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgotICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKLSAgICAgIGVsc2U6Ci0gICAgICAgICMgRG9uJ3QgY2hhbmdlIGZpbGVuYW1lLCBpdCdzIG5lZWRlZCBsYXRlci4KLSAgICAgICAgdXJsID0gZmlsZW5hbWUKLSAgICAgICAgYXJncyArPSBbIi1yIiwgIkJBU0UiXQotICAgICAgY21kID0gWyJzdm4iXSArIGFyZ3MgKyBbInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIHVybF0KLSAgICAgIG1pbWV0eXBlLCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCi0gICAgICBpZiByZXR1cm5jb2RlOgotICAgICAgICAjIEZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHJlcXVlc3RlZCByZXZpc2lvbi4KLSAgICAgICAgIyBSZXNldCBtaW1ldHlwZSwgaXQgY29udGFpbnMgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgICAgbWltZXR5cGUgPSAiIgotICAgICAgZ2V0X2Jhc2UgPSBGYWxzZQotICAgICAgaXNfYmluYXJ5ID0gbWltZXR5cGUgYW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCi0gICAgICBpZiBzdGF0dXNbMF0gPT0gIiAiOgotICAgICAgICAjIEVtcHR5IGJhc2UgY29udGVudCBqdXN0IHRvIGZvcmNlIGFuIHVwbG9hZC4KLSAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKLSAgICAgIGVsaWYgaXNfYmluYXJ5OgotICAgICAgICBpZiBzZWxmLklzSW1hZ2UoZmlsZW5hbWUpOgotICAgICAgICAgIGdldF9iYXNlID0gVHJ1ZQotICAgICAgICAgIGlmIHN0YXR1c1swXSA9PSAiTSI6Ci0gICAgICAgICAgICBpZiBub3Qgc2VsZi5yZXZfZW5kOgotICAgICAgICAgICAgICBuZXdfY29udGVudCA9IHNlbGYuUmVhZEZpbGUoZmlsZW5hbWUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9lbmQpCi0gICAgICAgICAgICAgIG5ld19jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgdXJsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwgc2lsZW50X29rPVRydWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKLSAgICAgIGVsc2U6Ci0gICAgICAgIGdldF9iYXNlID0gVHJ1ZQotCi0gICAgICBpZiBnZXRfYmFzZToKLSAgICAgICAgaWYgaXNfYmluYXJ5OgotICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcyA9IEZhbHNlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzID0gVHJ1ZQotICAgICAgICBpZiBzZWxmLnJldl9zdGFydDoKLSAgICAgICAgICAjICJzdm4gY2F0IC1yIFJFViBkZWxldGVfZmlsZS50eHQiIGRvZXNuJ3Qgd29yay4gY2F0IHJlcXVpcmVzCi0gICAgICAgICAgIyB0aGUgZnVsbCBVUkwgd2l0aCAiQFJFViIgYXBwZW5kZWQgaW5zdGVhZCBvZiB1c2luZyAiLXIiIG9wdGlvbi4KLSAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKLSAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbInN2biIsICJjYXQiLCB1cmxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgZmlsZW5hbWVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCi0gICAgICAgIGlmIG5vdCBpc19iaW5hcnk6Ci0gICAgICAgICAgYXJncyA9IFtdCi0gICAgICAgICAgaWYgc2VsZi5yZXZfc3RhcnQ6Ci0gICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgdXJsID0gZmlsZW5hbWUKLSAgICAgICAgICAgIGFyZ3MgKz0gWyItciIsICJCQVNFIl0KLSAgICAgICAgICBjbWQgPSBbInN2biJdICsgYXJncyArIFsicHJvcGdldCIsICJzdm46a2V5d29yZHMiLCB1cmxdCi0gICAgICAgICAga2V5d29yZHMsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNtZCkKLSAgICAgICAgICBpZiBrZXl3b3JkcyBhbmQgbm90IHJldHVybmNvZGU6Ci0gICAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBzZWxmLl9Db2xsYXBzZUtleXdvcmRzKGJhc2VfY29udGVudCwga2V5d29yZHMpCi0gICAgZWxzZToKLSAgICAgIFN0YXR1c1VwZGF0ZSgic3ZuIHN0YXR1cyByZXR1cm5lZCB1bmV4cGVjdGVkIG91dHB1dDogJXMiICUgc3RhdHVzKQotICAgICAgc3lzLmV4aXQoMSkKLSAgICByZXR1cm4gYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXNbMDo1XQotCi0KLWNsYXNzIEdpdFZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6Ci0gICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2UgZm9yIEdpdC4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6Ci0gICAgc3VwZXIoR2l0VkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQotICAgICMgTWFwIG9mIGZpbGVuYW1lIC0+IGhhc2ggb2YgYmFzZSBmaWxlLgotICAgIHNlbGYuYmFzZV9oYXNoZXMgPSB7fQotCi0gIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgZXh0cmFfYXJncyk6Ci0gICAgIyBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBzdm4ncyBHZW5lcmF0ZURpZmYgYmVjYXVzZSB3ZSBtdXN0IGNvbnZlcnQKLSAgICAjIHRoZSBkaWZmIG91dHB1dCB0byBpbmNsdWRlIGFuIHN2bi1zdHlsZSAiSW5kZXg6IiBsaW5lIGFzIHdlbGwgYXMgcmVjb3JkCi0gICAgIyB0aGUgaGFzaGVzIG9mIHRoZSBiYXNlIGZpbGVzLCBzbyB3ZSBjYW4gdXBsb2FkIHRoZW0gYWxvbmcgd2l0aCBvdXIgZGlmZi4KLSAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246Ci0gICAgICBleHRyYV9hcmdzID0gW3NlbGYub3B0aW9ucy5yZXZpc2lvbl0gKyBleHRyYV9hcmdzCi0gICAgZ2l0ZGlmZiA9IFJ1blNoZWxsKFsiZ2l0IiwgImRpZmYiLCAiLS1mdWxsLWluZGV4Il0gKyBleHRyYV9hcmdzKQotICAgIHN2bmRpZmYgPSBbXQotICAgIGZpbGVjb3VudCA9IDAKLSAgICBmaWxlbmFtZSA9IE5vbmUKLSAgICBmb3IgbGluZSBpbiBnaXRkaWZmLnNwbGl0bGluZXMoKToKLSAgICAgIG1hdGNoID0gcmUubWF0Y2gociJkaWZmIC0tZ2l0IGEvKC4qKSBiLy4qJCIsIGxpbmUpCi0gICAgICBpZiBtYXRjaDoKLSAgICAgICAgZmlsZWNvdW50ICs9IDEKLSAgICAgICAgZmlsZW5hbWUgPSBtYXRjaC5ncm91cCgxKQotICAgICAgICBzdm5kaWZmLmFwcGVuZCgiSW5kZXg6ICVzXG4iICUgZmlsZW5hbWUpCi0gICAgICBlbHNlOgotICAgICAgICAjIFRoZSAiaW5kZXgiIGxpbmUgaW4gYSBnaXQgZGlmZiBsb29rcyBsaWtlIHRoaXMgKGxvbmcgaGFzaGVzIGVsaWRlZCk6Ci0gICAgICAgICMgICBpbmRleCA4MmMwZDQ0Li5iMmNlZTNmIDEwMDc1NQotICAgICAgICAjIFdlIHdhbnQgdG8gc2F2ZSB0aGUgbGVmdCBoYXNoLCBhcyB0aGF0IGlkZW50aWZpZXMgdGhlIGJhc2UgZmlsZS4KLSAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyImluZGV4IChcdyspXC5cLiIsIGxpbmUpCi0gICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgIHNlbGYuYmFzZV9oYXNoZXNbZmlsZW5hbWVdID0gbWF0Y2guZ3JvdXAoMSkKLSAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUgKyAiXG4iKQotICAgIGlmIG5vdCBmaWxlY291bnQ6Ci0gICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gZ2l0IGRpZmYiKQotICAgIHJldHVybiAiIi5qb2luKHN2bmRpZmYpCi0KLSAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKLSAgICBzdGF0dXMgPSBSdW5TaGVsbChbImdpdCIsICJscy1maWxlcyIsICItLWV4Y2x1ZGUtc3RhbmRhcmQiLCAiLS1vdGhlcnMiXSwKLSAgICAgICAgICAgICAgICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKLSAgICByZXR1cm4gc3RhdHVzLnNwbGl0bGluZXMoKQotCi0gIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAgaGFzaCA9IHNlbGYuYmFzZV9oYXNoZXNbZmlsZW5hbWVdCi0gICAgYmFzZV9jb250ZW50ID0gTm9uZQotICAgIG5ld19jb250ZW50ID0gTm9uZQotICAgIGlzX2JpbmFyeSA9IEZhbHNlCi0gICAgaWYgaGFzaCA9PSAiMCIgKiA0MDogICMgQWxsLXplcm8gaGFzaCBpbmRpY2F0ZXMgbm8gYmFzZSBmaWxlLgotICAgICAgc3RhdHVzID0gIkEiCi0gICAgICBiYXNlX2NvbnRlbnQgPSAiIgotICAgIGVsc2U6Ci0gICAgICBzdGF0dXMgPSAiTSIKLSAgICAgIGJhc2VfY29udGVudCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAic2hvdyIsIGhhc2hdKQotICAgICAgaWYgcmV0dXJuY29kZToKLSAgICAgICAgRXJyb3JFeGl0KCJHb3QgZXJyb3Igc3RhdHVzIGZyb20gJ2dpdCBzaG93ICVzJyIgJSBoYXNoKQotICAgIHJldHVybiAoYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMpCi0KLQotY2xhc3MgTWVyY3VyaWFsVkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKLSAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgTWVyY3VyaWFsLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCByZXBvX2Rpcik6Ci0gICAgc3VwZXIoTWVyY3VyaWFsVkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQotICAgICMgQWJzb2x1dGUgcGF0aCB0byByZXBvc2l0b3J5ICh3ZSBjYW4gYmUgaW4gYSBzdWJkaXIpCi0gICAgc2VsZi5yZXBvX2RpciA9IG9zLnBhdGgubm9ybXBhdGgocmVwb19kaXIpCi0gICAgIyBDb21wdXRlIHRoZSBzdWJkaXIKLSAgICBjd2QgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLmdldGN3ZCgpKQotICAgIGFzc2VydCBjd2Quc3RhcnRzd2l0aChzZWxmLnJlcG9fZGlyKQotICAgIHNlbGYuc3ViZGlyID0gY3dkW2xlbihzZWxmLnJlcG9fZGlyKTpdLmxzdHJpcChyIlwvIikKLSAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246Ci0gICAgICBzZWxmLmJhc2VfcmV2ID0gc2VsZi5vcHRpb25zLnJldmlzaW9uCi0gICAgZWxzZToKLSAgICAgIHNlbGYuYmFzZV9yZXYgPSBSdW5TaGVsbChbImhnIiwgInBhcmVudCIsICItcSJdKS5zcGxpdCgnOicpWzFdLnN0cmlwKCkKLQotICBkZWYgX0dldFJlbFBhdGgoc2VsZiwgZmlsZW5hbWUpOgotICAgICIiIkdldCByZWxhdGl2ZSBwYXRoIG9mIGEgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAotICAgIGdpdmVuIGl0cyBsb2dpY2FsIHBhdGggaW4gdGhlIHJlcG8uIiIiCi0gICAgYXNzZXJ0IGZpbGVuYW1lLnN0YXJ0c3dpdGgoc2VsZi5zdWJkaXIpLCBmaWxlbmFtZQotICAgIHJldHVybiBmaWxlbmFtZVtsZW4oc2VsZi5zdWJkaXIpOl0ubHN0cmlwKHIiXC8iKQotCi0gIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgZXh0cmFfYXJncyk6Ci0gICAgIyBJZiBubyBmaWxlIHNwZWNpZmllZCwgcmVzdHJpY3QgdG8gdGhlIGN1cnJlbnQgc3ViZGlyCi0gICAgZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3Mgb3IgWyIuIl0KLSAgICBjbWQgPSBbImhnIiwgImRpZmYiLCAiLS1naXQiLCAiLXIiLCBzZWxmLmJhc2VfcmV2XSArIGV4dHJhX2FyZ3MKLSAgICBkYXRhID0gUnVuU2hlbGwoY21kLCBzaWxlbnRfb2s9VHJ1ZSkKLSAgICBzdm5kaWZmID0gW10KLSAgICBmaWxlY291bnQgPSAwCi0gICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6Ci0gICAgICBtID0gcmUubWF0Y2goImRpZmYgLS1naXQgYS8oXFMrKSBiLyhcUyspIiwgbGluZSkKLSAgICAgIGlmIG06Ci0gICAgICAgICMgTW9kaWZ5IGxpbmUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYXMgaXQgY29tZXMgZnJvbSBzdm4gZGlmZi4KLSAgICAgICAgIyBXaXRoIHRoaXMgbW9kaWZpY2F0aW9uIG5vIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlIGFyZSByZXF1aXJlZAotICAgICAgICAjIHRvIG1ha2UgdXBsb2FkLnB5IHdvcmsgd2l0aCBNZXJjdXJpYWwgcmVwb3MuCi0gICAgICAgICMgTk9URTogZm9yIHByb3BlciBoYW5kbGluZyBvZiBtb3ZlZC9jb3BpZWQgZmlsZXMsIHdlIGhhdmUgdG8gdXNlCi0gICAgICAgICMgdGhlIHNlY29uZCBmaWxlbmFtZS4KLSAgICAgICAgZmlsZW5hbWUgPSBtLmdyb3VwKDIpCi0gICAgICAgIHN2bmRpZmYuYXBwZW5kKCJJbmRleDogJXMiICUgZmlsZW5hbWUpCi0gICAgICAgIHN2bmRpZmYuYXBwZW5kKCI9IiAqIDY3KQotICAgICAgICBmaWxlY291bnQgKz0gMQotICAgICAgICBsb2dnaW5nLmluZm8obGluZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUpCi0gICAgaWYgbm90IGZpbGVjb3VudDoKLSAgICAgIEVycm9yRXhpdCgiTm8gdmFsaWQgcGF0Y2hlcyBmb3VuZCBpbiBvdXRwdXQgZnJvbSBoZyBkaWZmIikKLSAgICByZXR1cm4gIlxuIi5qb2luKHN2bmRpZmYpICsgIlxuIgotCi0gIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6Ci0gICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlcyB1bmtub3duIHRvIHRoZSBWQ1MuIiIiCi0gICAgYXJncyA9IFtdCi0gICAgc3RhdHVzID0gUnVuU2hlbGwoWyJoZyIsICJzdGF0dXMiLCAiLS1yZXYiLCBzZWxmLmJhc2VfcmV2LCAiLXUiLCAiLiJdLAotICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKLSAgICB1bmtub3duX2ZpbGVzID0gW10KLSAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXRsaW5lcygpOgotICAgICAgc3QsIGZuID0gbGluZS5zcGxpdCgiICIsIDEpCi0gICAgICBpZiBzdCA9PSAiPyI6Ci0gICAgICAgIHVua25vd25fZmlsZXMuYXBwZW5kKGZuKQotICAgIHJldHVybiB1bmtub3duX2ZpbGVzCi0KLSAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKLSAgICAjICJoZyBzdGF0dXMiIGFuZCAiaGcgY2F0IiBib3RoIHRha2UgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN1YmRpcgotICAgICMgcmF0aGVyIHRoYW4gdG8gdGhlIHJlcG8gcm9vdCwgYnV0ICJoZyBkaWZmIiBoYXMgZ2l2ZW4gdXMgdGhlIGZ1bGwgcGF0aAotICAgICMgdG8gdGhlIHJlcG8gcm9vdC4KLSAgICBiYXNlX2NvbnRlbnQgPSAiIgotICAgIG5ld19jb250ZW50ID0gTm9uZQotICAgIGlzX2JpbmFyeSA9IEZhbHNlCi0gICAgb2xkcmVscGF0aCA9IHJlbHBhdGggPSBzZWxmLl9HZXRSZWxQYXRoKGZpbGVuYW1lKQotICAgICMgImhnIHN0YXR1cyAtQyIgcmV0dXJucyB0d28gbGluZXMgZm9yIG1vdmVkL2NvcGllZCBmaWxlcywgb25lIG90aGVyd2lzZQotICAgIG91dCA9IFJ1blNoZWxsKFsiaGciLCAic3RhdHVzIiwgIi1DIiwgIi0tcmV2Iiwgc2VsZi5iYXNlX3JldiwgcmVscGF0aF0pCi0gICAgb3V0ID0gb3V0LnNwbGl0bGluZXMoKQotICAgICMgSEFDSzogc3RyaXAgZXJyb3IgbWVzc2FnZSBhYm91dCBtaXNzaW5nIGZpbGUvZGlyZWN0b3J5IGlmIGl0IGlzbid0IGluCi0gICAgIyB0aGUgd29ya2luZyBjb3B5Ci0gICAgaWYgb3V0WzBdLnN0YXJ0c3dpdGgoJyVzOiAnICUgcmVscGF0aCk6Ci0gICAgICBvdXQgPSBvdXRbMTpdCi0gICAgaWYgbGVuKG91dCkgPiAxOgotICAgICAgIyBNb3ZlZC9jb3BpZWQgPT4gY29uc2lkZXJlZCBhcyBtb2RpZmllZCwgdXNlIG9sZCBmaWxlbmFtZSB0bwotICAgICAgIyByZXRyaWV2ZSBiYXNlIGNvbnRlbnRzCi0gICAgICBvbGRyZWxwYXRoID0gb3V0WzFdLnN0cmlwKCkKLSAgICAgIHN0YXR1cyA9ICJNIgotICAgIGVsc2U6Ci0gICAgICBzdGF0dXMsIF8gPSBvdXRbMF0uc3BsaXQoJyAnLCAxKQotICAgIGlmIHN0YXR1cyAhPSAiQSI6Ci0gICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbImhnIiwgImNhdCIsICItciIsIHNlbGYuYmFzZV9yZXYsIG9sZHJlbHBhdGhdLAotICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKLSAgICAgIGlzX2JpbmFyeSA9ICJcMCIgaW4gYmFzZV9jb250ZW50ICAjIE1lcmN1cmlhbCdzIGhldXJpc3RpYwotICAgIGlmIHN0YXR1cyAhPSAiUiI6Ci0gICAgICBuZXdfY29udGVudCA9IG9wZW4ocmVscGF0aCwgInJiIikucmVhZCgpCi0gICAgICBpc19iaW5hcnkgPSBpc19iaW5hcnkgb3IgIlwwIiBpbiBuZXdfY29udGVudAotICAgIGlmIGlzX2JpbmFyeSBhbmQgYmFzZV9jb250ZW50OgotICAgICAgIyBGZXRjaCBhZ2FpbiB3aXRob3V0IGNvbnZlcnRpbmcgbmV3bGluZXMKLSAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsiaGciLCAiY2F0IiwgIi1yIiwgc2VsZi5iYXNlX3Jldiwgb2xkcmVscGF0aF0sCi0gICAgICAgIHNpbGVudF9vaz1UcnVlLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UpCi0gICAgaWYgbm90IGlzX2JpbmFyeSBvciBub3Qgc2VsZi5Jc0ltYWdlKHJlbHBhdGgpOgotICAgICAgbmV3X2NvbnRlbnQgPSBOb25lCi0gICAgcmV0dXJuIGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzCi0KLQotIyBOT1RFOiBUaGUgU3BsaXRQYXRjaCBmdW5jdGlvbiBpcyBkdXBsaWNhdGVkIGluIGVuZ2luZS5weSwga2VlcCB0aGVtIGluIHN5bmMuCi1kZWYgU3BsaXRQYXRjaChkYXRhKToKLSAgIiIiU3BsaXRzIGEgcGF0Y2ggaW50byBzZXBhcmF0ZSBwaWVjZXMgZm9yIGVhY2ggZmlsZS4KLQotICBBcmdzOgotICAgIGRhdGE6IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG91dHB1dCBvZiBzdm4gZGlmZi4KLQotICBSZXR1cm5zOgotICAgIEEgbGlzdCBvZiAyLXR1cGxlIChmaWxlbmFtZSwgdGV4dCkgd2hlcmUgdGV4dCBpcyB0aGUgc3ZuIGRpZmYgb3V0cHV0Ci0gICAgICBwZXJ0YWluaW5nIHRvIGZpbGVuYW1lLgotICAiIiIKLSAgcGF0Y2hlcyA9IFtdCi0gIGZpbGVuYW1lID0gTm9uZQotICBkaWZmID0gW10KLSAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKFRydWUpOgotICAgIG5ld19maWxlbmFtZSA9IE5vbmUKLSAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0luZGV4OicpOgotICAgICAgdW51c2VkLCBuZXdfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKLSAgICAgIG5ld19maWxlbmFtZSA9IG5ld19maWxlbmFtZS5zdHJpcCgpCi0gICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6Ci0gICAgICB1bnVzZWQsIHRlbXBfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKLSAgICAgICMgV2hlbiBhIGZpbGUgaXMgbW9kaWZpZWQsIHBhdGhzIHVzZSAnLycgYmV0d2VlbiBkaXJlY3RvcmllcywgaG93ZXZlcgotICAgICAgIyB3aGVuIGEgcHJvcGVydHkgaXMgbW9kaWZpZWQgJ1wnIGlzIHVzZWQgb24gV2luZG93cy4gIE1ha2UgdGhlbSB0aGUgc2FtZQotICAgICAgIyBvdGhlcndpc2UgdGhlIGZpbGUgc2hvd3MgdXAgdHdpY2UuCi0gICAgICB0ZW1wX2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZS5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQotICAgICAgaWYgdGVtcF9maWxlbmFtZSAhPSBmaWxlbmFtZToKLSAgICAgICAgIyBGaWxlIGhhcyBwcm9wZXJ0eSBjaGFuZ2VzIGJ1dCBubyBtb2RpZmljYXRpb25zLCBjcmVhdGUgYSBuZXcgZGlmZi4KLSAgICAgICAgbmV3X2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZQotICAgIGlmIG5ld19maWxlbmFtZToKLSAgICAgIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgotICAgICAgICBwYXRjaGVzLmFwcGVuZCgoZmlsZW5hbWUsICcnLmpvaW4oZGlmZikpKQotICAgICAgZmlsZW5hbWUgPSBuZXdfZmlsZW5hbWUKLSAgICAgIGRpZmYgPSBbbGluZV0KLSAgICAgIGNvbnRpbnVlCi0gICAgaWYgZGlmZiBpcyBub3QgTm9uZToKLSAgICAgIGRpZmYuYXBwZW5kKGxpbmUpCi0gIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgotICAgIHBhdGNoZXMuYXBwZW5kKChmaWxlbmFtZSwgJycuam9pbihkaWZmKSkpCi0gIHJldHVybiBwYXRjaGVzCi0KLQotZGVmIFVwbG9hZFNlcGFyYXRlUGF0Y2hlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hzZXQsIGRhdGEsIG9wdGlvbnMpOgotICAiIiJVcGxvYWRzIGEgc2VwYXJhdGUgcGF0Y2ggZm9yIGVhY2ggZmlsZSBpbiB0aGUgZGlmZiBvdXRwdXQuCi0KLSAgUmV0dXJucyBhIGxpc3Qgb2YgW3BhdGNoX2tleSwgZmlsZW5hbWVdIGZvciBlYWNoIGZpbGUuCi0gICIiIgotICBwYXRjaGVzID0gU3BsaXRQYXRjaChkYXRhKQotICBydiA9IFtdCi0gIGZvciBwYXRjaCBpbiBwYXRjaGVzOgotICAgIGlmIGxlbihwYXRjaFsxXSkgPiBNQVhfVVBMT0FEX1NJWkU6Ci0gICAgICBwcmludCAoIk5vdCB1cGxvYWRpbmcgdGhlIHBhdGNoIGZvciAiICsgcGF0Y2hbMF0gKwotICAgICAgICAgICAgICIgYmVjYXVzZSB0aGUgZmlsZSBpcyB0b28gbGFyZ2UuIikKLSAgICAgIGNvbnRpbnVlCi0gICAgZm9ybV9maWVsZHMgPSBbKCJmaWxlbmFtZSIsIHBhdGNoWzBdKV0KLSAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgotICAgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY29udGVudF91cGxvYWQiLCAiMSIpKQotICAgIGZpbGVzID0gWygiZGF0YSIsICJkYXRhLmRpZmYiLCBwYXRjaFsxXSldCi0gICAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmb3JtX2ZpZWxkcywgZmlsZXMpCi0gICAgdXJsID0gIi8lZC91cGxvYWRfcGF0Y2gvJWQiICUgKGludChpc3N1ZSksIGludChwYXRjaHNldCkpCi0gICAgcHJpbnQgIlVwbG9hZGluZyBwYXRjaCBmb3IgIiArIHBhdGNoWzBdCi0gICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksIGNvbnRlbnRfdHlwZT1jdHlwZSkKLSAgICBsaW5lcyA9IHJlc3BvbnNlX2JvZHkuc3BsaXRsaW5lcygpCi0gICAgaWYgbm90IGxpbmVzIG9yIGxpbmVzWzBdICE9ICJPSyI6Ci0gICAgICBTdGF0dXNVcGRhdGUoIiAgLS0+ICVzIiAlIHJlc3BvbnNlX2JvZHkpCi0gICAgICBzeXMuZXhpdCgxKQotICAgIHJ2LmFwcGVuZChbbGluZXNbMV0sIHBhdGNoWzBdXSkKLSAgcmV0dXJuIHJ2Ci0KLQotZGVmIEd1ZXNzVkNTKG9wdGlvbnMpOgotICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCi0KLSAgVGhpcyBleGFtaW5lcyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGd1ZXNzZXMgd2hpY2ggVmVyc2lvbkNvbnRyb2xTeXN0ZW0KLSAgd2UncmUgdXNpbmcsIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBjbGFzcy4gIEV4aXQgd2l0aCBhbgotICBlcnJvciBpZiB3ZSBjYW4ndCBmaWd1cmUgaXQgb3V0LgotCi0gIFJldHVybnM6Ci0gICAgQSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnN0YW5jZS4gRXhpdHMgaWYgdGhlIFZDUyBjYW4ndCBiZSBndWVzc2VkLgotICAiIiIKLSAgIyBNZXJjdXJpYWwgaGFzIGEgY29tbWFuZCB0byBnZXQgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIGEgcmVwb3NpdG9yeQotICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdlIGRvbid0IGhhdmUgaGcgaW5zdGFsbGVkLgotICAjIE5PVEU6IHdlIHRyeSBNZXJjdXJpYWwgZmlyc3QgYXMgaXQgY2FuIHNpdCBvbiB0b3Agb2YgYW4gU1ZOIHdvcmtpbmcgY29weS4KLSAgdHJ5OgotICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJoZyIsICJyb290Il0pCi0gICAgaWYgcmV0dXJuY29kZSA9PSAwOgotICAgICAgcmV0dXJuIE1lcmN1cmlhbFZDUyhvcHRpb25zLCBvdXQuc3RyaXAoKSkKLSAgZXhjZXB0IE9TRXJyb3IsIChlcnJubywgbWVzc2FnZSk6Ci0gICAgaWYgZXJybm8gIT0gMjogICMgRU5PRU5UIC0tIHRoZXkgZG9uJ3QgaGF2ZSBoZyBpbnN0YWxsZWQuCi0gICAgICByYWlzZQotCi0gICMgU3VidmVyc2lvbiBoYXMgYSAuc3ZuIGluIGFsbCB3b3JraW5nIGRpcmVjdG9yaWVzLgotICBpZiBvcy5wYXRoLmlzZGlyKCcuc3ZuJyk6Ci0gICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFZDUyA9IFN1YnZlcnNpb24iKQotICAgIHJldHVybiBTdWJ2ZXJzaW9uVkNTKG9wdGlvbnMpCi0KLSAgIyBHaXQgaGFzIGEgY29tbWFuZCB0byB0ZXN0IGlmIHlvdSdyZSBpbiBhIGdpdCB0cmVlLgotICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdlIGRvbid0IGhhdmUgZ2l0IGluc3RhbGxlZC4KLSAgdHJ5OgotICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAicmV2LXBhcnNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1pcy1pbnNpZGUtd29yay10cmVlIl0pCi0gICAgaWYgcmV0dXJuY29kZSA9PSAwOgotICAgICAgcmV0dXJuIEdpdFZDUyhvcHRpb25zKQotICBleGNlcHQgT1NFcnJvciwgKGVycm5vLCBtZXNzYWdlKToKLSAgICBpZiBlcnJubyAhPSAyOiAgIyBFTk9FTlQgLS0gdGhleSBkb24ndCBoYXZlIGdpdCBpbnN0YWxsZWQuCi0gICAgICByYWlzZQotCi0gIEVycm9yRXhpdCgoIkNvdWxkIG5vdCBndWVzcyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLiAiCi0gICAgICAgICAgICAgIkFyZSB5b3UgaW4gYSB3b3JraW5nIGNvcHkgZGlyZWN0b3J5PyIpKQotCi0KLWRlZiBSZWFsTWFpbihhcmd2LCBkYXRhPU5vbmUpOgotICAiIiJUaGUgcmVhbCBtYWluIGZ1bmN0aW9uLgotCi0gIEFyZ3M6Ci0gICAgYXJndjogQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICBkYXRhOiBEaWZmIGNvbnRlbnRzLiBJZiBOb25lIChkZWZhdWx0KSB0aGUgZGlmZiBpcyBnZW5lcmF0ZWQgYnkKLSAgICAgIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBieSBHdWVzc1ZDUygpLgotCi0gIFJldHVybnM6Ci0gICAgQSAyLXR1cGxlIChpc3N1ZSBpZCwgcGF0Y2hzZXQgaWQpLgotICAgIFRoZSBwYXRjaHNldCBpZCBpcyBOb25lIGlmIHRoZSBiYXNlIGZpbGVzIGFyZSBub3QgdXBsb2FkZWQgYnkgdGhpcwotICAgIHNjcmlwdCAoYXBwbGllcyBvbmx5IHRvIFNWTiBjaGVja291dHMpLgotICAiIiIKLSAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmb3JtYXQ9KCIlKGFzY3RpbWUpLjE5cyAlKGxldmVsbmFtZSlzICUoZmlsZW5hbWUpczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJShsaW5lbm8pcyAlKG1lc3NhZ2UpcyAiKSkKLSAgb3MuZW52aXJvblsnTENfQUxMJ10gPSAnQycKLSAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQotICBnbG9iYWwgdmVyYm9zaXR5Ci0gIHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zZQotICBpZiB2ZXJib3NpdHkgPj0gMzoKLSAgICBsb2dnaW5nLmdldExvZ2dlcigpLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCi0gIGVsaWYgdmVyYm9zaXR5ID49IDI6Ci0gICAgbG9nZ2luZy5nZXRMb2dnZXIoKS5zZXRMZXZlbChsb2dnaW5nLklORk8pCi0gIHZjcyA9IEd1ZXNzVkNTKG9wdGlvbnMpCi0gIGlmIGlzaW5zdGFuY2UodmNzLCBTdWJ2ZXJzaW9uVkNTKToKLSAgICAjIGJhc2UgZmllbGQgaXMgb25seSBhbGxvd2VkIGZvciBTdWJ2ZXJzaW9uLgotICAgICMgTm90ZTogRmV0Y2hpbmcgYmFzZSBmaWxlcyBtYXkgYmVjb21lIGRlcHJlY2F0ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgotICAgIGJhc2UgPSB2Y3MuR3Vlc3NCYXNlKG9wdGlvbnMuZG93bmxvYWRfYmFzZSkKLSAgZWxzZToKLSAgICBiYXNlID0gTm9uZQotICBpZiBub3QgYmFzZSBhbmQgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgotICAgIG9wdGlvbnMuZG93bmxvYWRfYmFzZSA9IFRydWUKLSAgICBsb2dnaW5nLmluZm8oIkVuYWJsZWQgdXBsb2FkIG9mIGJhc2UgZmlsZSIpCi0gIGlmIG5vdCBvcHRpb25zLmFzc3VtZV95ZXM6Ci0gICAgdmNzLkNoZWNrRm9yVW5rbm93bkZpbGVzKCkKLSAgaWYgZGF0YSBpcyBOb25lOgotICAgIGRhdGEgPSB2Y3MuR2VuZXJhdGVEaWZmKGFyZ3MpCi0gIGZpbGVzID0gdmNzLkdldEJhc2VGaWxlcyhkYXRhKQotICBpZiB2ZXJib3NpdHkgPj0gMToKLSAgICBwcmludCAiVXBsb2FkIHNlcnZlcjoiLCBvcHRpb25zLnNlcnZlciwgIihjaGFuZ2Ugd2l0aCAtcy8tLXNlcnZlcikiCi0gIGlmIG9wdGlvbnMuaXNzdWU6Ci0gICAgcHJvbXB0ID0gIk1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHBhdGNoIHNldDogIgotICBlbHNlOgotICAgIHByb21wdCA9ICJOZXcgaXNzdWUgc3ViamVjdDogIgotICBtZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlIG9yIHJhd19pbnB1dChwcm9tcHQpLnN0cmlwKCkKLSAgaWYgbm90IG1lc3NhZ2U6Ci0gICAgRXJyb3JFeGl0KCJBIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHJlcXVpcmVkIikKLSAgcnBjX3NlcnZlciA9IEdldFJwY1NlcnZlcihvcHRpb25zKQotICBmb3JtX2ZpZWxkcyA9IFsoInN1YmplY3QiLCBtZXNzYWdlKV0KLSAgaWYgYmFzZToKLSAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJiYXNlIiwgYmFzZSkpCi0gIGlmIG9wdGlvbnMuaXNzdWU6Ci0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiaXNzdWUiLCBzdHIob3B0aW9ucy5pc3N1ZSkpKQotICBpZiBvcHRpb25zLmVtYWlsOgotICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKLSAgaWYgb3B0aW9ucy5yZXZpZXdlcnM6Ci0gICAgZm9yIHJldmlld2VyIGluIG9wdGlvbnMucmV2aWV3ZXJzLnNwbGl0KCcsJyk6Ci0gICAgICBpZiAiQCIgaW4gcmV2aWV3ZXIgYW5kIG5vdCByZXZpZXdlci5zcGxpdCgiQCIpWzFdLmNvdW50KCIuIikgPT0gMToKLSAgICAgICAgRXJyb3JFeGl0KCJJbnZhbGlkIGVtYWlsIGFkZHJlc3M6ICVzIiAlIHJldmlld2VyKQotICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInJldmlld2VycyIsIG9wdGlvbnMucmV2aWV3ZXJzKSkKLSAgaWYgb3B0aW9ucy5jYzoKLSAgICBmb3IgY2MgaW4gb3B0aW9ucy5jYy5zcGxpdCgnLCcpOgotICAgICAgaWYgIkAiIGluIGNjIGFuZCBub3QgY2Muc3BsaXQoIkAiKVsxXS5jb3VudCgiLiIpID09IDE6Ci0gICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBlbWFpbCBhZGRyZXNzOiAlcyIgJSBjYykKLSAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjYyIsIG9wdGlvbnMuY2MpKQotICBkZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24KLSAgaWYgb3B0aW9ucy5kZXNjcmlwdGlvbl9maWxlOgotICAgIGlmIG9wdGlvbnMuZGVzY3JpcHRpb246Ci0gICAgICBFcnJvckV4aXQoIkNhbid0IHNwZWNpZnkgZGVzY3JpcHRpb24gYW5kIGRlc2NyaXB0aW9uX2ZpbGUiKQotICAgIGZpbGUgPSBvcGVuKG9wdGlvbnMuZGVzY3JpcHRpb25fZmlsZSwgJ3InKQotICAgIGRlc2NyaXB0aW9uID0gZmlsZS5yZWFkKCkKLSAgICBmaWxlLmNsb3NlKCkKLSAgaWYgZGVzY3JpcHRpb246Ci0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbikpCi0gICMgU2VuZCBhIGhhc2ggb2YgYWxsIHRoZSBiYXNlIGZpbGUgc28gdGhlIHNlcnZlciBjYW4gZGV0ZXJtaW5lIGlmIGEgY29weQotICAjIGFscmVhZHkgZXhpc3RzIGluIGFuIGVhcmxpZXIgcGF0Y2hzZXQuCi0gIGJhc2VfaGFzaGVzID0gIiIKLSAgZm9yIGZpbGUsIGluZm8gaW4gZmlsZXMuaXRlcml0ZW1zKCk6Ci0gICAgaWYgbm90IGluZm9bMF0gaXMgTm9uZToKLSAgICAgIGNoZWNrc3VtID0gbWQ1Lm5ldyhpbmZvWzBdKS5oZXhkaWdlc3QoKQotICAgICAgaWYgYmFzZV9oYXNoZXM6Ci0gICAgICAgIGJhc2VfaGFzaGVzICs9ICJ8IgotICAgICAgYmFzZV9oYXNoZXMgKz0gY2hlY2tzdW0gKyAiOiIgKyBmaWxlCi0gIGZvcm1fZmllbGRzLmFwcGVuZCgoImJhc2VfaGFzaGVzIiwgYmFzZV9oYXNoZXMpKQotICAjIElmIHdlJ3JlIHVwbG9hZGluZyBiYXNlIGZpbGVzLCBkb24ndCBzZW5kIHRoZSBlbWFpbCBiZWZvcmUgdGhlIHVwbG9hZHMsIHNvCi0gICMgdGhhdCBpdCBjb250YWlucyB0aGUgZmlsZSBzdGF0dXMuCi0gIGlmIG9wdGlvbnMuc2VuZF9tYWlsIGFuZCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6Ci0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgic2VuZF9tYWlsIiwgIjEiKSkKLSAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKLSAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjb250ZW50X3VwbG9hZCIsICIxIikpCi0gIGlmIGxlbihkYXRhKSA+IE1BWF9VUExPQURfU0laRToKLSAgICBwcmludCAiUGF0Y2ggaXMgbGFyZ2UsIHNvIHVwbG9hZGluZyBmaWxlIHBhdGNoZXMgc2VwYXJhdGVseS4iCi0gICAgdXBsb2FkZWRfZGlmZl9maWxlID0gW10KLSAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJzZXBhcmF0ZV9wYXRjaGVzIiwgIjEiKSkKLSAgZWxzZToKLSAgICB1cGxvYWRlZF9kaWZmX2ZpbGUgPSBbKCJkYXRhIiwgImRhdGEuZGlmZiIsIGRhdGEpXQotICBjdHlwZSwgYm9keSA9IEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1fZmllbGRzLCB1cGxvYWRlZF9kaWZmX2ZpbGUpCi0gIHJlc3BvbnNlX2JvZHkgPSBycGNfc2VydmVyLlNlbmQoIi91cGxvYWQiLCBib2R5LCBjb250ZW50X3R5cGU9Y3R5cGUpCi0gIHBhdGNoc2V0ID0gTm9uZQotICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIG5vdCB1cGxvYWRlZF9kaWZmX2ZpbGU6Ci0gICAgbGluZXMgPSByZXNwb25zZV9ib2R5LnNwbGl0bGluZXMoKQotICAgIGlmIGxlbihsaW5lcykgPj0gMjoKLSAgICAgIG1zZyA9IGxpbmVzWzBdCi0gICAgICBwYXRjaHNldCA9IGxpbmVzWzFdLnN0cmlwKCkKLSAgICAgIHBhdGNoZXMgPSBbeC5zcGxpdCgiICIsIDEpIGZvciB4IGluIGxpbmVzWzI6XV0KLSAgICBlbHNlOgotICAgICAgbXNnID0gcmVzcG9uc2VfYm9keQotICBlbHNlOgotICAgIG1zZyA9IHJlc3BvbnNlX2JvZHkKLSAgU3RhdHVzVXBkYXRlKG1zZykKLSAgaWYgbm90IHJlc3BvbnNlX2JvZHkuc3RhcnRzd2l0aCgiSXNzdWUgY3JlYXRlZC4iKSBhbmQgXAotICBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJJc3N1ZSB1cGRhdGVkLiIpOgotICAgIHN5cy5leGl0KDApCi0gIGlzc3VlID0gbXNnW21zZy5yZmluZCgiLyIpKzE6XQotCi0gIGlmIG5vdCB1cGxvYWRlZF9kaWZmX2ZpbGU6Ci0gICAgcmVzdWx0ID0gVXBsb2FkU2VwYXJhdGVQYXRjaGVzKGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaHNldCwgZGF0YSwgb3B0aW9ucykKLSAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgotICAgICAgcGF0Y2hlcyA9IHJlc3VsdAotCi0gIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6Ci0gICAgdmNzLlVwbG9hZEJhc2VGaWxlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hlcywgcGF0Y2hzZXQsIG9wdGlvbnMsIGZpbGVzKQotICAgIGlmIG9wdGlvbnMuc2VuZF9tYWlsOgotICAgICAgcnBjX3NlcnZlci5TZW5kKCIvIiArIGlzc3VlICsgIi9tYWlsIiwgcGF5bG9hZD0iIikKLSAgcmV0dXJuIGlzc3VlLCBwYXRjaHNldAotCi0KLWRlZiBtYWluKCk6Ci0gIHRyeToKLSAgICBSZWFsTWFpbihzeXMuYXJndikKLSAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgIHByaW50Ci0gICAgU3RhdHVzVXBkYXRlKCJJbnRlcnJ1cHRlZC4iKQotICAgIHN5cy5leGl0KDEpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgbWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvdXBsb2FkX2dtb2NrLnB5IGIvdGVzdGluZy9nbW9jay9zY3JpcHRzL3VwbG9hZF9nbW9jay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWRjNDg0Yi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3NjcmlwdHMvdXBsb2FkX2dtb2NrLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIidXBsb2FkX2dtb2NrLnB5IHYwLjEuMCAtLSB1cGxvYWRzIGEgR29vZ2xlIE1vY2sgcGF0Y2ggZm9yIHJldmlldy4KLQotVGhpcyBzaW1wbGUgd3JhcHBlciBwYXNzZXMgYWxsIGNvbW1hbmQgbGluZSBmbGFncyBhbmQKLS0tY2M9Z29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tIHRvIHVwbG9hZC5weS4KLQotVVNBR0U6IHVwbG9hZF9nbW9jay5weSBbb3B0aW9ucyBmb3IgdXBsb2FkLnB5XQotIiIiCi0KLV9fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotCi1DQ19GTEFHID0gJy0tY2M9JwotR01PQ0tfR1JPVVAgPSAnZ29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tJwotCi0KLWRlZiBtYWluKCk6Ci0gICMgRmluZHMgdGhlIHBhdGggdG8gdXBsb2FkLnB5LCBhc3N1bWluZyBpdCBpcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKLSAgIyBhcyB0aGlzIGZpbGUuCi0gIG15X2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQotICB1cGxvYWRfcHlfcGF0aCA9IG9zLnBhdGguam9pbihteV9kaXIsICd1cGxvYWQucHknKQotCi0gICMgQWRkcyBHb29nbGUgTW9jayBkaXNjdXNzaW9uIGdyb3VwIHRvIHRoZSBjYyBsaW5lIGlmIGl0J3Mgbm90IHRoZXJlCi0gICMgYWxyZWFkeS4KLSAgdXBsb2FkX3B5X2FyZ3YgPSBbdXBsb2FkX3B5X3BhdGhdCi0gIGZvdW5kX2NjX2ZsYWcgPSBGYWxzZQotICBmb3IgYXJnIGluIHN5cy5hcmd2WzE6XToKLSAgICBpZiBhcmcuc3RhcnRzd2l0aChDQ19GTEFHKToKLSAgICAgIGZvdW5kX2NjX2ZsYWcgPSBUcnVlCi0gICAgICBjY19saW5lID0gYXJnW2xlbihDQ19GTEFHKTpdCi0gICAgICBjY19saXN0ID0gW2FkZHIgZm9yIGFkZHIgaW4gY2NfbGluZS5zcGxpdCgnLCcpIGlmIGFkZHJdCi0gICAgICBpZiBHTU9DS19HUk9VUCBub3QgaW4gY2NfbGlzdDoKLSAgICAgICAgY2NfbGlzdC5hcHBlbmQoR01PQ0tfR1JPVVApCi0gICAgICB1cGxvYWRfcHlfYXJndi5hcHBlbmQoQ0NfRkxBRyArICcsJy5qb2luKGNjX2xpc3QpKQotICAgIGVsc2U6Ci0gICAgICB1cGxvYWRfcHlfYXJndi5hcHBlbmQoYXJnKQotCi0gIGlmIG5vdCBmb3VuZF9jY19mbGFnOgotICAgIHVwbG9hZF9weV9hcmd2LmFwcGVuZChDQ19GTEFHICsgR01PQ0tfR1JPVVApCi0KLSAgIyBJbnZva2VzIHVwbG9hZC5weSB3aXRoIHRoZSBtb2RpZmllZCBjb21tYW5kIGxpbmUgZmxhZ3MuCi0gIG9zLmV4ZWN2KHVwbG9hZF9weV9wYXRoLCB1cGxvYWRfcHlfYXJndikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLWFsbC5jYyBiL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLWFsbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlYmNlNy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3NyYy9nbW9jay1hbGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmsgKEdvb2dsZSBNb2NrKQotLy8KLS8vIFRoaXMgZmlsZSAjaW5jbHVkZXMgYWxsIEdvb2dsZSBNb2NrIGltcGxlbWVudGF0aW9uIC5jYyBmaWxlcy4gIFRoZQotLy8gcHVycG9zZSBpcyB0byBhbGxvdyBhIHVzZXIgdG8gYnVpbGQgR29vZ2xlIE1vY2sgYnkgY29tcGlsaW5nIHRoaXMKLS8vIGZpbGUgYWxvbmUuCi0KLS8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ21vY2suaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbgotLy8gd2hlbiBpdCdzIGZ1c2VkLgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0KLS8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBnbW9jayAqLmNjIGZpbGVzLgotI2luY2x1ZGUgInNyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjIgotI2luY2x1ZGUgInNyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYyIKLSNpbmNsdWRlICJzcmMvZ21vY2stbWF0Y2hlcnMuY2MiCi0jaW5jbHVkZSAic3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MiCi0jaW5jbHVkZSAic3JjL2dtb2NrLmNjIgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYyBiL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLWNhcmRpbmFsaXRpZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDBhYWUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgY2FyZGluYWxpdGllcy4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCIKLQotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZiAgLy8gIUdURVNUX09TX1NUQVJCT0FSRAotCi0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBCZXR3ZWVuKG0sIG4pIGNhcmRpbmFsaXR5LgotY2xhc3MgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbCA6IHB1YmxpYyBDYXJkaW5hbGl0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICBCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsKGludCBtaW4sIGludCBtYXgpCi0gICAgICA6IG1pbl8obWluID49IDAgPyBtaW4gOiAwKSwKLSAgICAgICAgbWF4XyhtYXggPj0gbWluXyA/IG1heCA6IG1pbl8pIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBpZiAobWluIDwgMCkgewotICAgICAgc3MgPDwgIlRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kIG11c3QgYmUgPj0gMCwgIgotICAgICAgICAgPDwgImJ1dCBpcyBhY3R1YWxseSAiIDw8IG1pbiA8PCAiLiI7Ci0gICAgICBpbnRlcm5hbDo6RXhwZWN0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18sIHNzLnN0cigpKTsKLSAgICB9IGVsc2UgaWYgKG1heCA8IDApIHsKLSAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCBtdXN0IGJlID49IDAsICIKLSAgICAgICAgIDw8ICJidXQgaXMgYWN0dWFsbHkgIiA8PCBtYXggPDwgIi4iOwotICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7Ci0gICAgfSBlbHNlIGlmIChtaW4gPiBtYXgpIHsKLSAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCAoIiA8PCBtYXgKLSAgICAgICAgIDw8ICIpIG11c3QgYmUgPj0gdGhlIGludm9jYXRpb24gbG93ZXIgYm91bmQgKCIgPDwgbWluCi0gICAgICAgICA8PCAiKS4iOwotICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mCi0gIC8vIGNhbGxzIGFsbG93ZWQuCi0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSBjb25zdCB7IHJldHVybiBtaW5fOyB9Ci0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBtYXhfOyB9Ci0KLSAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKLSAgICByZXR1cm4gbWluXyA8PSBjYWxsX2NvdW50ICYmIGNhbGxfY291bnQgPD0gbWF4XzsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbGxfY291bnQgPj0gbWF4XzsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnQgbWluXzsKLSAgY29uc3QgaW50IG1heF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsKTsKLX07Ci0KLS8vIEZvcm1hdHMgIm4gdGltZXMiIGluIGEgaHVtYW4tZnJpZW5kbHkgd2F5LgotaW5saW5lIGludGVybmFsOjpzdHJpbmcgRm9ybWF0VGltZXMoaW50IG4pIHsKLSAgaWYgKG4gPT0gMSkgewotICAgIHJldHVybiAib25jZSI7Ci0gIH0gZWxzZSBpZiAobiA9PSAyKSB7Ci0gICAgcmV0dXJuICJ0d2ljZSI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgbiA8PCAiIHRpbWVzIjsKLSAgICByZXR1cm4gc3Muc3RyKCk7Ci0gIH0KLX0KLQotLy8gRGVzY3JpYmVzIHRoZSBCZXR3ZWVuKG0sIG4pIGNhcmRpbmFsaXR5IGluIGh1bWFuLWZyaWVuZGx5IHRleHQuCi12b2lkIEJldHdlZW5DYXJkaW5hbGl0eUltcGw6OkRlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gIGlmIChtaW5fID09IDApIHsKLSAgICBpZiAobWF4XyA9PSAwKSB7Ci0gICAgICAqb3MgPDwgIm5ldmVyIGNhbGxlZCI7Ci0gICAgfSBlbHNlIGlmIChtYXhfID09IElOVF9NQVgpIHsKLSAgICAgICpvcyA8PCAiY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMiOwotICAgIH0gZWxzZSB7Ci0gICAgICAqb3MgPDwgImNhbGxlZCBhdCBtb3N0ICIgPDwgRm9ybWF0VGltZXMobWF4Xyk7Ci0gICAgfQotICB9IGVsc2UgaWYgKG1pbl8gPT0gbWF4XykgewotICAgICpvcyA8PCAiY2FsbGVkICIgPDwgRm9ybWF0VGltZXMobWluXyk7Ci0gIH0gZWxzZSBpZiAobWF4XyA9PSBJTlRfTUFYKSB7Ci0gICAgKm9zIDw8ICJjYWxsZWQgYXQgbGVhc3QgIiA8PCBGb3JtYXRUaW1lcyhtaW5fKTsKLSAgfSBlbHNlIHsKLSAgICAvLyAwIDwgbWluXyA8IG1heF8gPCBJTlRfTUFYCi0gICAgKm9zIDw8ICJjYWxsZWQgYmV0d2VlbiAiIDw8IG1pbl8gPDwgIiBhbmQgIiA8PCBtYXhfIDw8ICIgdGltZXMiOwotICB9Ci19Ci0KLX0gIC8vIFVubmFtZWQgbmFtZXNwYWNlCi0KLS8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gY2FsbCBjb3VudCB0byBhbiBvc3RyZWFtLgotdm9pZCBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhpbnQgYWN0dWFsX2NhbGxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBpZiAoYWN0dWFsX2NhbGxfY291bnQgPiAwKSB7Ci0gICAgKm9zIDw8ICJjYWxsZWQgIiA8PCBGb3JtYXRUaW1lcyhhY3R1YWxfY2FsbF9jb3VudCk7Ci0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8ICJuZXZlciBjYWxsZWQiOwotICB9Ci19Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBsZWFzdCBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdExlYXN0KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKG4sIElOVF9NQVgpOyB9Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBtb3N0IG4gY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEF0TW9zdChpbnQgbikgeyByZXR1cm4gQmV0d2VlbigwLCBuKTsgfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYW55IG51bWJlciBvZiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQW55TnVtYmVyKCkgeyByZXR1cm4gQXRMZWFzdCgwKTsgfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYmV0d2VlbiBtaW4gYW5kIG1heCBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQmV0d2VlbihpbnQgbWluLCBpbnQgbWF4KSB7Ci0gIHJldHVybiBDYXJkaW5hbGl0eShuZXcgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbChtaW4sIG1heCkpOwotfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgZXhhY3RseSBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBFeGFjdGx5KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKG4sIG4pOyB9Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYyBiL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY1Mjg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIHV0aWxpdGllcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBHb29nbGUKLS8vIE1vY2suICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgc28gcGxlYXNlIERPIE5PVAotLy8gVVNFIFRIRU0gSU4gVVNFUiBDT0RFLgotCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbG9nLmgiCi0jZW5kaWYKLSNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNlbmRpZiAgLy8gIUdURVNUX09TX1NUQVJCT0FSRAotCi0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBDb252ZXJ0cyBhbiBpZGVudGlmaWVyIG5hbWUgdG8gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsb3dlci1jYXNlCi0vLyB3b3Jkcy4gIEVhY2ggbWF4aW11bSBzdWJzdHJpbmcgb2YgdGhlIGZvcm0gW0EtWmEtel1bYS16XSp8XGQrIGlzCi0vLyB0cmVhdGVkIGFzIG9uZSB3b3JkLiAgRm9yIGV4YW1wbGUsIGJvdGggIkZvb0JhcjEyMyIgYW5kCi0vLyAiZm9vX2Jhcl8xMjMiIGFyZSBjb252ZXJ0ZWQgdG8gImZvbyBiYXIgMTIzIi4KLUdURVNUX0FQSV8gc3RyaW5nIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoY29uc3QgY2hhciogaWRfbmFtZSkgewotICBzdHJpbmcgcmVzdWx0OwotICBjaGFyIHByZXZfY2hhciA9ICdcMCc7Ci0gIGZvciAoY29uc3QgY2hhciogcCA9IGlkX25hbWU7ICpwICE9ICdcMCc7IHByZXZfY2hhciA9ICoocCsrKSkgewotICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGN1cnJlbnQgbG9jYWxlIGFzIHRoZSBpbnB1dCBpcwotICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgYSB2YWxpZCBDKysgaWRlbnRpZmllciBuYW1lLgotICAgIGNvbnN0IGJvb2wgc3RhcnRzX25ld193b3JkID0gSXNVcHBlcigqcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghSXNBbHBoYShwcmV2X2NoYXIpICYmIElzTG93ZXIoKnApKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFJc0RpZ2l0KHByZXZfY2hhcikgJiYgSXNEaWdpdCgqcCkpOwotCi0gICAgaWYgKElzQWxOdW0oKnApKSB7Ci0gICAgICBpZiAoc3RhcnRzX25ld193b3JkICYmIHJlc3VsdCAhPSAiIikKLSAgICAgICAgcmVzdWx0ICs9ICcgJzsKLSAgICAgIHJlc3VsdCArPSBUb0xvd2VyKCpwKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gVGhpcyBjbGFzcyByZXBvcnRzIEdvb2dsZSBNb2NrIGZhaWx1cmVzIGFzIEdvb2dsZSBUZXN0IGZhaWx1cmVzLiAgQQotLy8gdXNlciBjYW4gZGVmaW5lIGFub3RoZXIgY2xhc3MgaW4gYSBzaW1pbGFyIGZhc2hpb24gaWYgaGUgaW50ZW5kcyB0bwotLy8gdXNlIEdvb2dsZSBNb2NrIHdpdGggYSB0ZXN0aW5nIGZyYW1ld29yayBvdGhlciB0aGFuIEdvb2dsZSBUZXN0LgotY2xhc3MgR29vZ2xlVGVzdEZhaWx1cmVSZXBvcnRlciA6IHB1YmxpYyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIFJlcG9ydEZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIEFzc2VydEhlbHBlcih0eXBlID09IGtGYXRhbCA/IFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIG1lc3NhZ2UuY19zdHIoKSkgPSBNZXNzYWdlKCk7Ci0gICAgaWYgKHR5cGUgPT0ga0ZhdGFsKSB7Ci0gICAgICBwb3NpeDo6QWJvcnQoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLS8vIFJldHVybnMgdGhlIGdsb2JhbCBmYWlsdXJlIHJlcG9ydGVyLiAgV2lsbCBjcmVhdGUgYQotLy8gR29vZ2xlVGVzdEZhaWx1cmVSZXBvcnRlciBhbmQgcmV0dXJuIGl0IHRoZSBmaXJzdCB0aW1lIGNhbGxlZC4KLUdURVNUX0FQSV8gRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKiBHZXRGYWlsdXJlUmVwb3J0ZXIoKSB7Ci0gIC8vIFBvaW50cyB0byB0aGUgZ2xvYmFsIGZhaWx1cmUgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgTW9jay4gIGdjYwotICAvLyBndWFyYW50ZWVzIHRoYXQgdGhlIGZvbGxvd2luZyB1c2Ugb2YgZmFpbHVyZV9yZXBvcnRlciBpcwotICAvLyB0aHJlYWQtc2FmZS4gIFdlIG1heSBuZWVkIHRvIGFkZCBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiB0bwotICAvLyBwcm90ZWN0IGZhaWx1cmVfcmVwb3J0ZXIgaWYgd2UgcG9ydCBHb29nbGUgTW9jayB0byBvdGhlcgotICAvLyBjb21waWxlcnMuCi0gIHN0YXRpYyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIGNvbnN0IGZhaWx1cmVfcmVwb3J0ZXIgPQotICAgICAgbmV3IEdvb2dsZVRlc3RGYWlsdXJlUmVwb3J0ZXIoKTsKLSAgcmV0dXJuIGZhaWx1cmVfcmVwb3J0ZXI7Ci19Ci0KLS8vIFByb3RlY3RzIGdsb2JhbCByZXNvdXJjZXMgKHN0ZG91dCBpbiBwYXJ0aWN1bGFyKSB1c2VkIGJ5IExvZygpLgotc3RhdGljIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfbG9nX211dGV4KTsKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBhIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBpcyB2aXNpYmxlIGFjY29yZGluZwotLy8gdG8gdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgotR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSkgewotICBpZiAoR01PQ0tfRkxBRyh2ZXJib3NlKSA9PSBrSW5mb1ZlcmJvc2l0eSkgewotICAgIC8vIEFsd2F5cyBzaG93IHRoZSBsb2cgaWYgLS1nbW9ja192ZXJib3NlPWluZm8uCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoR01PQ0tfRkxBRyh2ZXJib3NlKSA9PSBrRXJyb3JWZXJib3NpdHkpIHsKLSAgICAvLyBBbHdheXMgaGlkZSBpdCBpZiAtLWdtb2NrX3ZlcmJvc2U9ZXJyb3IuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIC8vIElmIC0tZ21vY2tfdmVyYm9zZSBpcyBuZWl0aGVyICJpbmZvIiBub3IgImVycm9yIiwgd2UgdHJlYXQgaXQKLSAgICAvLyBhcyAid2FybmluZyIgKGl0cyBkZWZhdWx0IHZhbHVlKS4KLSAgICByZXR1cm4gc2V2ZXJpdHkgPT0ga1dhcm5pbmc7Ci0gIH0KLX0KLQotLy8gUHJpbnRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHN0ZG91dCBpZmYgJ3NldmVyaXR5JyA+PSB0aGUgbGV2ZWwKLS8vIHNwZWNpZmllZCBieSB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcuICBJZiBzdGFja19mcmFtZXNfdG9fc2tpcCA+PQotLy8gMCwgYWxzbyBwcmludHMgdGhlIHN0YWNrIHRyYWNlIGV4Y2x1ZGluZyB0aGUgdG9wCi0vLyBzdGFja19mcmFtZXNfdG9fc2tpcCBmcmFtZXMuICBJbiBvcHQgbW9kZSwgYW55IHBvc2l0aXZlCi0vLyBzdGFja19mcmFtZXNfdG9fc2tpcCBpcyB0cmVhdGVkIGFzIDAsIHNpbmNlIHdlIGRvbid0IGtub3cgd2hpY2gKLS8vIGZ1bmN0aW9uIGNhbGxzIHdpbGwgYmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIG5lZWQgdG8gYmUKLS8vIGNvbnNlcnZhdGl2ZS4KLUdURVNUX0FQSV8gdm9pZCBMb2coTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrX2ZyYW1lc190b19za2lwKSB7Ci0gIGlmICghTG9nSXNWaXNpYmxlKHNldmVyaXR5KSkKLSAgICByZXR1cm47Ci0KLSAgLy8gRW5zdXJlcyB0aGF0IGxvZ3MgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBkb24ndCBpbnRlcmxlYXZlLgotICBNdXRleExvY2sgbCgmZ19sb2dfbXV0ZXgpOwotCi0gIC8vICJ1c2luZyA6OnN0ZDo6Y291dDsiIGRvZXNuJ3Qgd29yayB3aXRoIFN5bWJpYW4ncyBTVExwb3J0LCB3aGVyZSBjb3V0IGlzIGEKLSAgLy8gbWFjcm8uCi0KLSAgaWYgKHNldmVyaXR5ID09IGtXYXJuaW5nKSB7Ci0vLyBQcmludHMgYSBHTU9DSyBXQVJOSU5HIG1hcmtlciB0byBtYWtlIHRoZSB3YXJuaW5ncyBlYXNpbHkgc2VhcmNoYWJsZS4KLSNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECi0gICAgc3RkOjpjb3V0IDw8ICJcbkdNT0NLIFdBUk5JTkc6IjsKLSNlbmRpZgotICB9Ci0gIC8vIFByZS1wZW5kcyBhIG5ldy1saW5lIHRvIG1lc3NhZ2UgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIG9uZS4KLSAgaWYgKG1lc3NhZ2UuZW1wdHkoKSB8fCBtZXNzYWdlWzBdICE9ICdcbicpIHsKLSNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECi0gICAgc3RkOjpjb3V0IDw8ICJcbiI7Ci0jZW5kaWYKLSAgfQotCi0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0gIFNCX0xPRyhJTkZPKSA8PCAiXG5HTU9DSyIgPDwgKChzZXZlcml0eSA9PSBrV2FybmluZykgPyAiIFdBUk5JTkciIDogIiIpCi0gICAgICAgICAgICAgICA8PCAiOiAiIDw8IG1lc3NhZ2U7Ci0jZWxzZQotICBzdGQ6OmNvdXQgPDwgbWVzc2FnZTsKLSNlbmRpZgotICBpZiAoc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0gMCkgewotI2lmZGVmIE5ERUJVRwotICAgIC8vIEluIG9wdCBtb2RlLCB3ZSBoYXZlIHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgc2tpcCBubyBzdGFjayBmcmFtZS4KLSAgICBjb25zdCBpbnQgYWN0dWFsX3RvX3NraXAgPSAwOwotI2Vsc2UKLSAgICAvLyBJbiBkYmcgbW9kZSwgd2UgY2FuIGRvIHdoYXQgdGhlIGNhbGxlciB0ZWxsIHVzIHRvIGRvIChwbHVzIG9uZQotICAgIC8vIGZvciBza2lwcGluZyB0aGlzIGZ1bmN0aW9uJ3Mgc3RhY2sgZnJhbWUpLgotICAgIGNvbnN0IGludCBhY3R1YWxfdG9fc2tpcCA9IHN0YWNrX2ZyYW1lc190b19za2lwICsgMTsKLSNlbmRpZiAgLy8gTkRFQlVHCi0KLSAgICAvLyBBcHBlbmRzIGEgbmV3LWxpbmUgdG8gbWVzc2FnZSBpZiBpdCBkb2Vzbid0IGVuZCB3aXRoIG9uZS4KLSAgICBpZiAoIW1lc3NhZ2UuZW1wdHkoKSAmJiAqbWVzc2FnZS5yYmVnaW4oKSAhPSAnXG4nKSB7Ci0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0gICAgICBTQl9MT0coSU5GTykgPDwgIlxuIjsKLSNlbHNlCi0gICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKLSNlbmRpZgotICAgIH0KLQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotICAgIFNCX0xPRyhJTkZPKSA8PCAiU3RhY2sgdHJhY2U6XG4iCi0gICAgICAgICAgICAgICAgIDw8IDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLCBhY3R1YWxfdG9fc2tpcCk7Ci0gIH0KLSAgU0JfTE9HKElORk8pIDw8IDo6c3RkOjpmbHVzaDsKLSNlbHNlCi0gICAgc3RkOjpjb3V0IDw8ICJTdGFjayB0cmFjZTpcbiIKLSAgICAgICAgICAgICAgPDwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgKLSAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCksIGFjdHVhbF90b19za2lwKTsKLSAgfQotICBzdGQ6OmNvdXQgPDwgOjpzdGQ6OmZsdXNoOwotI2VuZGlmCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLW1hdGNoZXJzLmNjIGIvdGVzdGluZy9nbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjg0YjYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4sIE1hdGNoZXI8c3RyaW5nPiwgYW5kCi0vLyB1dGlsaXRpZXMgZm9yIGRlZmluaW5nIG1hdGNoZXJzLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLQotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZiAgLy8gIUdURVNUX09TX1NUQVJCT0FSRAotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3Qgc3RyaW5nJiB3aG9zZSB2YWx1ZSBpcwotLy8gZXF1YWwgdG8gcy4KLU1hdGNoZXI8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsKLSAgKnRoaXMgPSBFcShzKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3Qgc3RyaW5nJiB3aG9zZSB2YWx1ZSBpcwotLy8gZXF1YWwgdG8gcy4KLU1hdGNoZXI8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+OjpNYXRjaGVyKGNvbnN0IGNoYXIqIHMpIHsKLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGludGVybmFsOjpzdHJpbmc+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsgKnRoaXMgPSBFcShzKTsgfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4KLU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgewotICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnN0IFN0cmluZ1BpZWNlJiB3aG9zZSB2YWx1ZSBpcwotLy8gZXF1YWwgdG8gcy4KLU1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPjo6TWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKSB7Ci0gICp0aGlzID0gRXEocyk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnN0IFN0cmluZ1BpZWNlJiB3aG9zZSB2YWx1ZSBpcwotLy8gZXF1YWwgdG8gcy4KLU1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPjo6TWF0Y2hlcihjb25zdCBjaGFyKiBzKSB7Ci0gICp0aGlzID0gRXEoaW50ZXJuYWw6OnN0cmluZyhzKSk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnN0IFN0cmluZ1BpZWNlJiB3aG9zZSB2YWx1ZSBpcwotLy8gZXF1YWwgdG8gcy4KLU1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPjo6TWF0Y2hlcihTdHJpbmdQaWVjZSBzKSB7Ci0gICp0aGlzID0gRXEocy5Ub1N0cmluZygpKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgU3RyaW5nUGllY2Ugd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4KLU1hdGNoZXI8U3RyaW5nUGllY2U+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsKLSAgKnRoaXMgPSBFcShzKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgU3RyaW5nUGllY2Ugd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4KLU1hdGNoZXI8U3RyaW5nUGllY2U+OjpNYXRjaGVyKGNvbnN0IGNoYXIqIHMpIHsKLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgU3RyaW5nUGllY2Ugd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4KLU1hdGNoZXI8U3RyaW5nUGllY2U+OjpNYXRjaGVyKFN0cmluZ1BpZWNlIHMpIHsKLSAgKnRoaXMgPSBFcShzLlRvU3RyaW5nKCkpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBKb2lucyBhIHZlY3RvciBvZiBzdHJpbmdzIGFzIGlmIHRoZXkgYXJlIGZpZWxkcyBvZiBhIHR1cGxlOyByZXR1cm5zCi0vLyB0aGUgam9pbmVkIHN0cmluZy4KLUdURVNUX0FQSV8gc3RyaW5nIEpvaW5Bc1R1cGxlKGNvbnN0IFN0cmluZ3MmIGZpZWxkcykgewotICBzd2l0Y2ggKGZpZWxkcy5zaXplKCkpIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIGZpZWxkc1swXTsKLSAgICBkZWZhdWx0OgotICAgICAgc3RyaW5nIHJlc3VsdCA9ICIoIiArIGZpZWxkc1swXTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgICAgICByZXN1bHQgKz0gZmllbGRzW2ldOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9ICIpIjsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgbWF0Y2hlciBkZWZpbmVkIHVzaW5nIHRoZSBNQVRDSEVSKigpCi0vLyBtYWNybyB3aGVyZSB0aGUgdXNlci1zdXBwbGllZCBkZXNjcmlwdGlvbiBzdHJpbmcgaXMgIiIsIGlmCi0vLyAnbmVnYXRpb24nIGlzIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi0vLyBuZWdhdGlvbiBvZiB0aGUgbWF0Y2hlci4gICdwYXJhbV92YWx1ZXMnIGNvbnRhaW5zIGEgbGlzdCBvZiBzdHJpbmdzCi0vLyB0aGF0IGFyZSB0aGUgcHJpbnQtb3V0IG9mIHRoZSBtYXRjaGVyJ3MgcGFyYW1ldGVycy4KLUdURVNUX0FQSV8gc3RyaW5nIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1hdGNoZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzJiBwYXJhbV92YWx1ZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMobWF0Y2hlcl9uYW1lKTsKLSAgaWYgKHBhcmFtX3ZhbHVlcy5zaXplKCkgPj0gMSkKLSAgICByZXN1bHQgKz0gIiAiICsgSm9pbkFzVHVwbGUocGFyYW1fdmFsdWVzKTsKLSAgcmV0dXJuIG5lZ2F0aW9uID8gIm5vdCAoIiArIHJlc3VsdCArICIpIiA6IHJlc3VsdDsKLX0KLQotLy8gRmluZE1heEJpcGFydGl0ZU1hdGNoaW5nIGFuZCBpdHMgaGVscGVyIGNsYXNzLgotLy8KLS8vIFVzZXMgdGhlIHdlbGwta25vd24gRm9yZC1GdWxrZXJzb24gbWF4IGZsb3cgbWV0aG9kIHRvIGZpbmQgYSBtYXhpbXVtCi0vLyBiaXBhcnRpdGUgbWF0Y2hpbmcuIEZsb3cgaXMgY29uc2lkZXJlZCB0byBiZSBmcm9tIGxlZnQgdG8gcmlnaHQuCi0vLyBUaGVyZSBpcyBhbiBpbXBsaWNpdCBzb3VyY2Ugbm9kZSB0aGF0IGlzIGNvbm5lY3RlZCB0byBhbGwgb2YgdGhlIGxlZnQKLS8vIG5vZGVzLCBhbmQgYW4gaW1wbGljaXQgc2luayBub2RlIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFsbCBvZiB0aGUKLS8vIHJpZ2h0IG5vZGVzLiBBbGwgZWRnZXMgaGF2ZSB1bml0IGNhcGFjaXR5LgotLy8KLS8vIE5laXRoZXIgdGhlIGZsb3cgZ3JhcGggbm9yIHRoZSByZXNpZHVhbCBmbG93IGdyYXBoIGFyZSByZXByZXNlbnRlZAotLy8gZXhwbGljaXRseS4gSW5zdGVhZCwgdGhleSBhcmUgaW1wbGllZCBieSB0aGUgaW5mb3JtYXRpb24gaW4gJ2dyYXBoJyBhbmQKLS8vIGEgdmVjdG9yPGludD4gY2FsbGVkICdsZWZ0Xycgd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxpemVkIHRvIHRoZQotLy8gdmFsdWUga1VudXNlZC4gVGhpcyByZXByZXNlbnRzIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBhbGdvcml0aG0sCi0vLyB3aGVyZSB0aGUgZmxvdyBncmFwaCBpcyBlbXB0eSwgYW5kIHRoZSByZXNpZHVhbCBmbG93IGdyYXBoIGhhcyB0aGUKLS8vIGZvbGxvd2luZyBlZGdlczoKLS8vICAgLSBBbiBlZGdlIGZyb20gc291cmNlIHRvIGVhY2ggbGVmdF8gbm9kZQotLy8gICAtIEFuIGVkZ2UgZnJvbSBlYWNoIHJpZ2h0XyBub2RlIHRvIHNpbmsKLS8vICAgLSBBbiBlZGdlIGZyb20gZWFjaCBsZWZ0XyBub2RlIHRvIGVhY2ggcmlnaHRfIG5vZGUsIGlmIHRoZQotLy8gICAgIGNvcnJlc3BvbmRpbmcgZWRnZSBleGlzdHMgaW4gJ2dyYXBoJy4KLS8vCi0vLyBXaGVuIHRoZSBUcnlBdWdtZW50KCkgbWV0aG9kIGFkZHMgYSBmbG93LCBpdCBzZXRzIGxlZnRfW2xdID0gciBmb3Igc29tZQotLy8gbm9kZXMgbCBhbmQgci4gVGhpcyBpbmR1Y2VzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKLS8vICAgLSBUaGUgZWRnZXMgKHNvdXJjZSwgbCksIChsLCByKSwgYW5kIChyLCBzaW5rKSBhcmUgYWRkZWQgdG8gdGhlCi0vLyAgICAgZmxvdyBncmFwaC4KLS8vICAgLSBUaGUgc2FtZSB0aHJlZSBlZGdlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNpZHVhbCBmbG93IGdyYXBoLgotLy8gICAtIFRoZSByZXZlcnNlIGVkZ2VzIChsLCBzb3VyY2UpLCAociwgbCksIGFuZCAoc2luaywgcikgYXJlIGFkZGVkCi0vLyAgICAgdG8gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGgsIHdoaWNoIGlzIGEgZGlyZWN0aW9uYWwgZ3JhcGgKLS8vICAgICByZXByZXNlbnRpbmcgdW51c2VkIGZsb3cgY2FwYWNpdHkuCi0vLwotLy8gV2hlbiB0aGUgbWV0aG9kIGF1Z21lbnRzIGEgZmxvdyAobW92aW5nIGxlZnRfW2xdIGZyb20gc29tZSByMSB0byBzb21lCi0vLyBvdGhlciByMiksIHRoaXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgInVuZG9pbmciIHRoZSBhYm92ZSBzdGVwcyB3aXRoCi0vLyByZXNwZWN0IHRvIHIxIGFuZCAicmVkb2luZyIgdGhlbSB3aXRoIHJlc3BlY3QgdG8gcjIuCi0vLwotLy8gSXQgYmVhcnMgcmVwZWF0aW5nIHRoYXQgdGhlIGZsb3cgZ3JhcGggYW5kIHJlc2lkdWFsIGZsb3cgZ3JhcGggYXJlCi0vLyBuZXZlciByZXByZXNlbnRlZCBleHBsaWNpdGx5LCBidXQgY2FuIGJlIGRlcml2ZWQgYnkgbG9va2luZyBhdCB0aGUKLS8vIGluZm9ybWF0aW9uIGluICdncmFwaCcgYW5kIGluIGxlZnRfLgotLy8KLS8vIEFzIGFuIG9wdGltaXphdGlvbiwgdGhlcmUgaXMgYSBzZWNvbmQgdmVjdG9yPGludD4gY2FsbGVkIHJpZ2h0XyB3aGljaAotLy8gZG9lcyBub3QgcHJvdmlkZSBhbnkgbmV3IGluZm9ybWF0aW9uLiBJbnN0ZWFkLCBpdCBlbmFibGVzIG1vcmUKLS8vIGVmZmljaWVudCBxdWVyaWVzIGFib3V0IGVkZ2VzIGVudGVyaW5nIG9yIGxlYXZpbmcgdGhlIHJpZ2h0LXNpZGUgbm9kZXMKLS8vIG9mIHRoZSBmbG93IG9yIHJlc2lkdWFsIGZsb3cgZ3JhcGhzLiBUaGUgZm9sbG93aW5nIGludmFyaWFudHMgYXJlCi0vLyBtYWludGFpbmVkOgotLy8KLS8vIGxlZnRbbF0gPT0ga1VudXNlZCBvciByaWdodFtsZWZ0W2xdXSA9PSBsCi0vLyByaWdodFtyXSA9PSBrVW51c2VkIG9yIGxlZnRbcmlnaHRbcl1dID09IHIKLS8vCi0vLyAuIFsgc291cmNlIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotLy8gLiAgIHx8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLS8vIC4gICB8fHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0vLyAuICAgfHxcLS0+IGxlZnRbMF09MSAgLS0tXCAgICByaWdodFswXT0tMSAtLS0tXCAgICAgLgotLy8gLiAgIHx8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgIC4KLS8vIC4gICB8XC0tLT4gbGVmdFsxXT0tMSAgICBcLS0+IHJpZ2h0WzFdPTAgIC0tLVx8ICAgICAuCi0vLyAuICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgLgotLy8gLiAgIFwtLS0tPiBsZWZ0WzJdPTIgIC0tLS0tLT4gcmlnaHRbMl09MiAgLS1cfHwgICAgIC4KLS8vIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHx8ICAgICAuCi0vLyAuICAgICAgICAgZWxlbWVudHMgICAgICAgICAgIG1hdGNoZXJzICAgICAgIHZ2diAgICAgLgotLy8gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBzaW5rIF0gIC4KLS8vCi0vLyBTZWUgQWxzbzoKLS8vICAgWzFdIENvcm1lbiwgZXQgYWwgKDIwMDEpLiAiU2VjdGlvbiAyNi4yOiBUaGUgRm9yZC1GdWxrZXJzb24gbWV0aG9kIi4KLS8vICAgICAgICJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyAoU2Vjb25kIGVkLikiLCBwcC4gNjUxLTY2NC4KLS8vICAgWzJdICJGb3JkLUZ1bGtlcnNvbiBhbGdvcml0aG0iLCBXaWtpcGVkaWEsCi0vLyAgICAgICAnaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Gb3JkJUUyJTgwJTkzRnVsa2Vyc29uX2FsZ29yaXRobScKLWNsYXNzIE1heEJpcGFydGl0ZU1hdGNoU3RhdGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZShjb25zdCBNYXRjaE1hdHJpeCYgZ3JhcGgpCi0gICAgICA6IGdyYXBoXygmZ3JhcGgpLAotICAgICAgICBsZWZ0XyhncmFwaF8tPkxoc1NpemUoKSwga1VudXNlZCksCi0gICAgICAgIHJpZ2h0XyhncmFwaF8tPlJoc1NpemUoKSwga1VudXNlZCkgewotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZWRnZXMgb2YgYSBtYXhpbWFsIG1hdGNoLCBlYWNoIGluIHRoZSBmb3JtIHtsZWZ0LCByaWdodH0uCi0gIEVsZW1lbnRNYXRjaGVyUGFpcnMgQ29tcHV0ZSgpIHsKLSAgICAvLyAnc2VlbicgaXMgdXNlZCBmb3IgcGF0aCBmaW5kaW5nIHsgMDogdW5zZWVuLCAxOiBzZWVuIH0uCi0gICAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBzZWVuOwotICAgIC8vIFNlYXJjaGVzIHRoZSByZXNpZHVhbCBmbG93IGdyYXBoIGZvciBhIHBhdGggZnJvbSBlYWNoIGxlZnQgbm9kZSB0bwotICAgIC8vIHRoZSBzaW5rIGluIHRoZSByZXNpZHVhbCBmbG93IGdyYXBoLCBhbmQgaWYgb25lIGlzIGZvdW5kLCBhZGQgZmxvdwotICAgIC8vIHRvIHRoZSBncmFwaC4gSXQncyBva2F5IHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBsZWZ0IG5vZGVzIG9uY2UuIFRoZQotICAgIC8vIGVkZ2UgZnJvbSB0aGUgaW1wbGljaXQgc291cmNlIG5vZGUgdG8gZWFjaCBwcmV2aW91c2x5LXZpc2l0ZWQgbGVmdAotICAgIC8vIG5vZGUgd2lsbCBoYXZlIGZsb3cgaWYgdGhhdCBsZWZ0IG5vZGUgaGFzIGFueSBwYXRoIHRvIHRoZSBzaW5rCi0gICAgLy8gd2hhdHNvZXZlci4gU3Vic2VxdWVudCBhdWdtZW50YXRpb25zIGNhbiBvbmx5IGFkZCBmbG93IHRvIHRoZQotICAgIC8vIG5ldHdvcmssIGFuZCBjYW5ub3QgdGFrZSBhd2F5IHRoYXQgcHJldmlvdXMgZmxvdyB1bml0IGZyb20gdGhlIHNvdXJjZS4KLSAgICAvLyBTaW5jZSB0aGUgc291cmNlLXRvLWxlZnQgZWRnZSBjYW4gb25seSBjYXJyeSBvbmUgZmxvdyB1bml0IChvciwKLSAgICAvLyBlYWNoIGVsZW1lbnQgY2FuIGJlIG1hdGNoZWQgdG8gb25seSBvbmUgbWF0Y2hlciksIHRoZXJlIGlzIG5vIG5lZWQKLSAgICAvLyB0byB2aXNpdCB0aGUgbGVmdCBub2RlcyBtb3JlIHRoYW4gb25jZSBsb29raW5nIGZvciBhdWdtZW50ZWQgcGF0aHMuCi0gICAgLy8gVGhlIGZsb3cgaXMga25vd24gdG8gYmUgcG9zc2libGUgb3IgaW1wb3NzaWJsZSBieSBsb29raW5nIGF0IHRoZQotICAgIC8vIG5vZGUgb25jZS4KLSAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IGdyYXBoXy0+TGhzU2l6ZSgpOyArK2lsaHMpIHsKLSAgICAgIC8vIFJlc2V0IHRoZSBwYXRoLW1hcmtpbmcgdmVjdG9yIGFuZCB0cnkgdG8gZmluZCBhIHBhdGggZnJvbQotICAgICAgLy8gc291cmNlIHRvIHNpbmsgc3RhcnRpbmcgYXQgdGhlIGxlZnRfW2lsaHNdIG5vZGUuCi0gICAgICBHVEVTVF9DSEVDS18obGVmdF9baWxoc10gPT0ga1VudXNlZCkKLSAgICAgICAgICA8PCAiaWxoczogIiA8PCBpbGhzIDw8ICIsIGxlZnRfW2lsaHNdOiAiIDw8IGxlZnRfW2lsaHNdOwotICAgICAgLy8gJ3NlZW4nIGluaXRpYWxpemVkIHRvICdncmFwaF8tPlJoc1NpemUoKScgY29waWVzIG9mIDAuCi0gICAgICBzZWVuLmFzc2lnbihncmFwaF8tPlJoc1NpemUoKSwgMCk7Ci0gICAgICBUcnlBdWdtZW50KGlsaHMsICZzZWVuKTsKLSAgICB9Ci0gICAgRWxlbWVudE1hdGNoZXJQYWlycyByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBsZWZ0Xy5zaXplKCk7ICsraWxocykgewotICAgICAgc2l6ZV90IGlyaHMgPSBsZWZ0X1tpbGhzXTsKLSAgICAgIGlmIChpcmhzID09IGtVbnVzZWQpIGNvbnRpbnVlOwotICAgICAgcmVzdWx0LnB1c2hfYmFjayhFbGVtZW50TWF0Y2hlclBhaXIoaWxocywgaXJocykpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtVbnVzZWQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKTsKLQotICAvLyBQZXJmb3JtIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIGZyb20gbGVmdCBub2RlIGlsaHMgdG8gdGhlIHNpbmsuICBJZiBhCi0gIC8vIHBhdGggaXMgZm91bmQsIGZsb3cgaXMgYWRkZWQgdG8gdGhlIG5ldHdvcmsgYnkgbGlua2luZyB0aGUgbGVmdCBhbmQKLSAgLy8gcmlnaHQgdmVjdG9yIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgZWFjaCBzZWdtZW50IG9mIHRoZSBwYXRoLgotICAvLyBSZXR1cm5zIHRydWUgaWYgYSBwYXRoIHRvIHNpbmsgd2FzIGZvdW5kLCB3aGljaCBtZWFucyB0aGF0IGEgdW5pdCBvZgotICAvLyBmbG93IHdhcyBhZGRlZCB0byB0aGUgbmV0d29yay4gVGhlICdzZWVuJyB2ZWN0b3IgZWxlbWVudHMgY29ycmVzcG9uZAotICAvLyB0byByaWdodCBub2RlcyBhbmQgYXJlIG1hcmtlZCB0byBlbGltaW5hdGUgY3ljbGVzIGZyb20gdGhlIHNlYXJjaC4KLSAgLy8KLSAgLy8gTGVmdCBub2RlcyB3aWxsIG9ubHkgYmUgZXhwbG9yZWQgYXQgbW9zdCBvbmNlIGJlY2F1c2UgdGhleQotICAvLyBhcmUgYWNjZXNzaWJsZSBmcm9tIGF0IG1vc3Qgb25lIHJpZ2h0IG5vZGUgaW4gdGhlIHJlc2lkdWFsIGZsb3cKLSAgLy8gZ3JhcGguCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCBsZWZ0X1tpbGhzXSBpcyB0aGUgb25seSBlbGVtZW50IG9mIGxlZnRfIHRoYXQgVHJ5QXVnbWVudCB3aWxsCi0gIC8vIHBvdGVudGlhbGx5IHRyYW5zaXRpb24gZnJvbSBrVW51c2VkIHRvIGFub3RoZXIgdmFsdWUuIEFueSBvdGhlcgotICAvLyBsZWZ0XyBlbGVtZW50IGhvbGRpbmcga1VudXNlZCBiZWZvcmUgVHJ5QXVnbWVudCB3aWxsIGJlIGhvbGRpbmcgaXQKLSAgLy8gd2hlbiBUcnlBdWdtZW50IHJldHVybnMuCi0gIC8vCi0gIGJvb2wgVHJ5QXVnbWVudChzaXplX3QgaWxocywgOjpzdGQ6OnZlY3RvcjxjaGFyPiogc2VlbikgewotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgZ3JhcGhfLT5SaHNTaXplKCk7ICsraXJocykgewotICAgICAgaWYgKCgqc2VlbilbaXJoc10pCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgaWYgKCFncmFwaF8tPkhhc0VkZ2UoaWxocywgaXJocykpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgLy8gVGhlcmUncyBhbiBhdmFpbGFibGUgZWRnZSBmcm9tIGlsaHMgdG8gaXJocy4KLSAgICAgICgqc2VlbilbaXJoc10gPSAxOwotICAgICAgLy8gTmV4dCBhIHNlYXJjaCBpcyBwZXJmb3JtZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLSAgICAgIC8vIHRoaXMgZWRnZSBpcyBhIGRlYWQgZW5kIG9yIGxlYWRzIHRvIHRoZSBzaW5rLgotICAgICAgLy8KLSAgICAgIC8vIHJpZ2h0X1tpcmhzXSA9PSBrVW51c2VkIG1lYW5zIHRoYXQgdGhlcmUgaXMgcmVzaWR1YWwgZmxvdyBmcm9tCi0gICAgICAvLyByaWdodCBub2RlIGlyaHMgdG8gdGhlIHNpbmssIHNvIHdlIGNhbiB1c2UgdGhhdCB0byBmaW5pc2ggdGhpcwotICAgICAgLy8gZmxvdyBwYXRoIGFuZCByZXR1cm4gc3VjY2Vzcy4KLSAgICAgIC8vCi0gICAgICAvLyBPdGhlcndpc2UgdGhlcmUgaXMgcmVzaWR1YWwgZmxvdyB0byBzb21lIGlsaHMuIFdlIHB1c2ggZmxvdwotICAgICAgLy8gYWxvbmcgdGhhdCBwYXRoIGFuZCBjYWxsIG91cnNlbHZlcyByZWN1cnNpdmVseSB0byBzZWUgaWYgdGhpcwotICAgICAgLy8gdWx0aW1hdGVseSBsZWFkcyB0byBzaW5rLgotICAgICAgaWYgKHJpZ2h0X1tpcmhzXSA9PSBrVW51c2VkIHx8IFRyeUF1Z21lbnQocmlnaHRfW2lyaHNdLCBzZWVuKSkgewotICAgICAgICAvLyBBZGQgZmxvdyBmcm9tIGxlZnRfW2lsaHNdIHRvIHJpZ2h0X1tpcmhzXS4KLSAgICAgICAgbGVmdF9baWxoc10gPSBpcmhzOwotICAgICAgICByaWdodF9baXJoc10gPSBpbGhzOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgTWF0Y2hNYXRyaXgqIGdyYXBoXzsgIC8vIG5vdCBvd25lZAotICAvLyBFYWNoIGVsZW1lbnQgb2YgdGhlIGxlZnRfIHZlY3RvciByZXByZXNlbnRzIGEgbGVmdCBoYW5kIHNpZGUgbm9kZQotICAvLyAoaS5lLiBhbiBlbGVtZW50KSBhbmQgZWFjaCBlbGVtZW50IG9mIHJpZ2h0XyBpcyBhIHJpZ2h0IGhhbmQgc2lkZQotICAvLyBub2RlIChpLmUuIGEgbWF0Y2hlcikuIFRoZSB2YWx1ZXMgaW4gdGhlIGxlZnRfIHZlY3RvciBpbmRpY2F0ZQotICAvLyBvdXRmbG93IGZyb20gdGhhdCBub2RlIHRvIGEgbm9kZSBvbiB0aGUgdGhlIHJpZ2h0XyBzaWRlLiBUaGUgdmFsdWVzCi0gIC8vIGluIHRoZSByaWdodF8gaW5kaWNhdGUgaW5mbG93LCBhbmQgc3BlY2lmeSB3aGljaCBsZWZ0XyBub2RlIGlzCi0gIC8vIGZlZWRpbmcgdGhhdCByaWdodF8gbm9kZSwgaWYgYW55LiBGb3IgZXhhbXBsZSwgbGVmdF9bM10gPT0gMSBtZWFucwotICAvLyB0aGVyZSdzIGEgZmxvdyBmcm9tIGVsZW1lbnQgIzMgdG8gbWF0Y2hlciAjMS4gU3VjaCBhIGZsb3cgd291bGQgYWxzbwotICAvLyBiZSByZWR1bmRhbnRseSByZXByZXNlbnRlZCBpbiB0aGUgcmlnaHRfIHZlY3RvciBhcyByaWdodF9bMV0gPT0gMy4KLSAgLy8gRWxlbWVudHMgb2YgbGVmdF8gYW5kIHJpZ2h0XyBhcmUgZWl0aGVyIGtVbnVzZWQgb3IgbXV0dWFsbHkKLSAgLy8gcmVmZXJlbnQuIE11dHVhbGx5IHJlZmVyZW50IG1lYW5zIHRoYXQgbGVmdF9bcmlnaHRfW2ldXSA9IGkgYW5kCi0gIC8vIHJpZ2h0X1tsZWZ0X1tpXV0gPSBpLgotICA6OnN0ZDo6dmVjdG9yPHNpemVfdD4gbGVmdF87Ci0gIDo6c3RkOjp2ZWN0b3I8c2l6ZV90PiByaWdodF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNYXhCaXBhcnRpdGVNYXRjaFN0YXRlKTsKLX07Ci0KLWNvbnN0IHNpemVfdCBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlOjprVW51c2VkOwotCi1HVEVTVF9BUElfIEVsZW1lbnRNYXRjaGVyUGFpcnMKLUZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhjb25zdCBNYXRjaE1hdHJpeCYgZykgewotICByZXR1cm4gTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZShnKS5Db21wdXRlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIExvZ0VsZW1lbnRNYXRjaGVyUGFpclZlYyhjb25zdCBFbGVtZW50TWF0Y2hlclBhaXJzJiBwYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogc3RyZWFtKSB7Ci0gIHR5cGVkZWYgRWxlbWVudE1hdGNoZXJQYWlyczo6Y29uc3RfaXRlcmF0b3IgSXRlcjsKLSAgOjpzdGQ6Om9zdHJlYW0mIG9zID0gKnN0cmVhbTsKLSAgb3MgPDwgInsiOwotICBjb25zdCBjaGFyICpzZXAgPSAiIjsKLSAgZm9yIChJdGVyIGl0ID0gcGFpcnMuYmVnaW4oKTsgaXQgIT0gcGFpcnMuZW5kKCk7ICsraXQpIHsKLSAgICBvcyA8PCBzZXAgPDwgIlxuICAoIgotICAgICAgIDw8ICJlbGVtZW50ICMiIDw8IGl0LT5maXJzdCA8PCAiLCAiCi0gICAgICAgPDwgIm1hdGNoZXIgIyIgPDwgaXQtPnNlY29uZCA8PCAiKSI7Ci0gICAgc2VwID0gIiwiOwotICB9Ci0gIG9zIDw8ICJcbn0iOwotfQotCi0vLyBUcmllcyB0byBmaW5kIGEgcGFpcmluZywgYW5kIGV4cGxhaW5zIHRoZSByZXN1bHQuCi1HVEVTVF9BUElfIGJvb2wgRmluZFBhaXJpbmcoY29uc3QgTWF0Y2hNYXRyaXgmIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgewotICBFbGVtZW50TWF0Y2hlclBhaXJzIG1hdGNoZXMgPSBGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcobWF0cml4KTsKLQotICBzaXplX3QgbWF4X2Zsb3cgPSBtYXRjaGVzLnNpemUoKTsKLSAgYm9vbCByZXN1bHQgPSAobWF4X2Zsb3cgPT0gbWF0cml4LlJoc1NpemUoKSk7Ci0KLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoZXJlIG5vIHBlcm11dGF0aW9uIG9mIHRoZSBlbGVtZW50cyBjYW4gIgotICAgICAgICAgICAgICAgICAgICJzYXRpc2Z5IGFsbCBtYXRjaGVycywgYW5kIHRoZSBjbG9zZXN0IG1hdGNoIGlzICIKLSAgICAgICAgICAgICAgICA8PCBtYXhfZmxvdyA8PCAiIG9mICIgPDwgbWF0cml4LlJoc1NpemUoKQotICAgICAgICAgICAgICAgIDw8ICIgbWF0Y2hlcnMgd2l0aCB0aGUgcGFpcmluZ3M6XG4iOwotICAgICAgTG9nRWxlbWVudE1hdGNoZXJQYWlyVmVjKG1hdGNoZXMsIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChtYXRjaGVzLnNpemUoKSA+IDEpIHsKLSAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICBjb25zdCBjaGFyICpzZXAgPSAid2hlcmU6XG4iOwotICAgICAgZm9yIChzaXplX3QgbWkgPSAwOyBtaSA8IG1hdGNoZXMuc2l6ZSgpOyArK21pKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCBzZXAgPDwgIiAtIGVsZW1lbnQgIyIgPDwgbWF0Y2hlc1ttaV0uZmlyc3QKLSAgICAgICAgICAgICAgICAgIDw8ICIgaXMgbWF0Y2hlZCBieSBtYXRjaGVyICMiIDw8IG1hdGNoZXNbbWldLnNlY29uZDsKLSAgICAgICAgc2VwID0gIixcbiI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1hdGNoTWF0cml4OjpOZXh0R3JhcGgoKSB7Ci0gIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgTGhzU2l6ZSgpOyArK2lsaHMpIHsKLSAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyA8IFJoc1NpemUoKTsgKytpcmhzKSB7Ci0gICAgICBjaGFyJiBiID0gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV07Ci0gICAgICBpZiAoIWIpIHsKLSAgICAgICAgYiA9IDE7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYiA9IDA7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBNYXRjaE1hdHJpeDo6UmFuZG9taXplKCkgewotICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IExoc1NpemUoKTsgKytpbGhzKSB7Ci0gICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgPCBSaHNTaXplKCk7ICsraXJocykgewotICAgICAgY2hhciYgYiA9IG1hdGNoZWRfW1NwYWNlSW5kZXgoaWxocywgaXJocyldOwotICAgICAgYiA9IHN0YXRpY19jYXN0PGNoYXI+KHJhbmQoKSAmIDEpOyAgLy8gTk9MSU5UCi0gICAgfQotICB9Ci19Ci0KLXN0cmluZyBNYXRjaE1hdHJpeDo6RGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIGNvbnN0IGNoYXIgKnNlcCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IExoc1NpemUoKTsgKytpKSB7Ci0gICAgc3MgPDwgc2VwOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgUmhzU2l6ZSgpOyArK2opIHsKLSAgICAgIHNzIDw8IEhhc0VkZ2UoaSwgaik7Ci0gICAgfQotICAgIHNlcCA9ICI7IjsKLSAgfQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLXZvaWQgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OkRlc2NyaWJlVG9JbXBsKAotICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5lbXB0eSgpKSB7Ci0gICAgKm9zIDw8ICJpcyBlbXB0eSI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSA9PSAxKSB7Ci0gICAgKm9zIDw8ICJoYXMgIiA8PCBFbGVtZW50cygxKSA8PCAiIGFuZCB0aGF0IGVsZW1lbnQgIjsKLSAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfWzBdLT5EZXNjcmliZVRvKG9zKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgKm9zIDw8ICJoYXMgIiA8PCBFbGVtZW50cyhtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSkKLSAgICAgIDw8ICIgYW5kIHRoZXJlIGV4aXN0cyBzb21lIHBlcm11dGF0aW9uIG9mIGVsZW1lbnRzIHN1Y2ggdGhhdDpcbiI7Ci0gIGNvbnN0IGNoYXIqIHNlcCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKTsgKytpKSB7Ci0gICAgKm9zIDw8IHNlcCA8PCAiIC0gZWxlbWVudCAjIiA8PCBpIDw8ICIgIjsKLSAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW2ldLT5EZXNjcmliZVRvKG9zKTsKLSAgICBzZXAgPSAiLCBhbmRcbiI7Ci0gIH0KLX0KLQotdm9pZCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVOZWdhdGlvblRvSW1wbCgKLSAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgaWYgKG1hdGNoZXJfZGVzY3JpYmVyc18uZW1wdHkoKSkgewotICAgICpvcyA8PCAiaXNuJ3QgZW1wdHkiOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCkgPT0gMSkgewotICAgICpvcyA8PCAiZG9lc24ndCBoYXZlICIgPDwgRWxlbWVudHMoMSkKLSAgICAgICAgPDwgIiwgb3IgaGFzICIgPDwgRWxlbWVudHMoMSkgPDwgIiB0aGF0ICI7Ci0gICAgbWF0Y2hlcl9kZXNjcmliZXJzX1swXS0+RGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgIiA8PCBFbGVtZW50cyhtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSkKLSAgICAgIDw8ICIsIG9yIHRoZXJlIGV4aXN0cyBubyBwZXJtdXRhdGlvbiBvZiBlbGVtZW50cyBzdWNoIHRoYXQ6XG4iOwotICBjb25zdCBjaGFyKiBzZXAgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCk7ICsraSkgewotICAgICpvcyA8PCBzZXAgPDwgIiAtIGVsZW1lbnQgIyIgPDwgaSA8PCAiICI7Ci0gICAgbWF0Y2hlcl9kZXNjcmliZXJzX1tpXS0+RGVzY3JpYmVUbyhvcyk7Ci0gICAgc2VwID0gIiwgYW5kXG4iOwotICB9Ci19Ci0KLS8vIENoZWNrcyB0aGF0IGFsbCBtYXRjaGVycyBtYXRjaCBhdCBsZWFzdCBvbmUgZWxlbWVudCwgYW5kIHRoYXQgYWxsCi0vLyBlbGVtZW50cyBtYXRjaCBhdCBsZWFzdCBvbmUgbWF0Y2hlci4gVGhpcyBlbmFibGVzIGZhc3RlciBtYXRjaGluZwotLy8gYW5kIGJldHRlciBlcnJvciByZXBvcnRpbmcuCi0vLyBSZXR1cm5zIGZhbHNlLCB3cml0aW5nIGFuIGV4cGxhbmF0aW9uIHRvICdsaXN0ZW5lcicsIGlmIGFuZCBvbmx5Ci0vLyBpZiB0aGUgc3VjY2VzcyBjcml0ZXJpYSBhcmUgbm90IG1ldC4KLWJvb2wgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OgotVmVyaWZ5QWxsRWxlbWVudHNBbmRNYXRjaGVyc0FyZU1hdGNoZWQoCi0gICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+JiBlbGVtZW50X3ByaW50b3V0cywKLSAgICBjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LAotICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKLSAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBlbGVtZW50X21hdGNoZWQobWF0cml4Lkxoc1NpemUoKSwgMCk7Ci0gIDo6c3RkOjp2ZWN0b3I8Y2hhcj4gbWF0Y2hlcl9tYXRjaGVkKG1hdHJpeC5SaHNTaXplKCksIDApOwotCi0gIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgbWF0cml4Lkxoc1NpemUoKTsgaWxocysrKSB7Ci0gICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgPCBtYXRyaXguUmhzU2l6ZSgpOyBpcmhzKyspIHsKLSAgICAgIGNoYXIgbWF0Y2hlZCA9IG1hdHJpeC5IYXNFZGdlKGlsaHMsIGlyaHMpOwotICAgICAgZWxlbWVudF9tYXRjaGVkW2lsaHNdIHw9IG1hdGNoZWQ7Ci0gICAgICBtYXRjaGVyX21hdGNoZWRbaXJoc10gfD0gbWF0Y2hlZDsKLSAgICB9Ci0gIH0KLQotICB7Ci0gICAgY29uc3QgY2hhciogc2VwID0KLSAgICAgICAgIndoZXJlIHRoZSBmb2xsb3dpbmcgbWF0Y2hlcnMgZG9uJ3QgbWF0Y2ggYW55IGVsZW1lbnRzOlxuIjsKLSAgICBmb3IgKHNpemVfdCBtaSA9IDA7IG1pIDwgbWF0Y2hlcl9tYXRjaGVkLnNpemUoKTsgKyttaSkgewotICAgICAgaWYgKG1hdGNoZXJfbWF0Y2hlZFttaV0pCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCBzZXAgPDwgIm1hdGNoZXIgIyIgPDwgbWkgPDwgIjogIjsKLSAgICAgICAgbWF0Y2hlcl9kZXNjcmliZXJzX1ttaV0tPkRlc2NyaWJlVG8obGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICAgc2VwID0gIixcbiI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgewotICAgIGNvbnN0IGNoYXIqIHNlcCA9Ci0gICAgICAgICJ3aGVyZSB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGRvbid0IG1hdGNoIGFueSBtYXRjaGVyczpcbiI7Ci0gICAgY29uc3QgY2hhciogb3V0ZXJfc2VwID0gIiI7Ci0gICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgIG91dGVyX3NlcCA9ICJcbmFuZCAiOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBlaSA9IDA7IGVpIDwgZWxlbWVudF9tYXRjaGVkLnNpemUoKTsgKytlaSkgewotICAgICAgaWYgKGVsZW1lbnRfbWF0Y2hlZFtlaV0pCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCBvdXRlcl9zZXAgPDwgc2VwIDw8ICJlbGVtZW50ICMiIDw8IGVpIDw8ICI6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGVsZW1lbnRfcHJpbnRvdXRzW2VpXTsKLSAgICAgICAgc2VwID0gIixcbiI7Ci0gICAgICAgIG91dGVyX3NlcCA9ICIiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3NyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjIGIvdGVzdGluZy9nbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4MTBmZi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3NyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgc3BlYyBidWlsZGVyIHN5bnRheCAoT05fQ0FMTCBhbmQKLS8vIEVYUEVDVF9DQUxMKS4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKLQotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZiAgLy8gIUdURVNUX09TX1NUQVJCT0FSRAotCi0jaW5jbHVkZSA8aW9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUHJvdGVjdHMgdGhlIG1vY2sgb2JqZWN0IHJlZ2lzdHJ5IChpbiBjbGFzcyBNb2NrKSwgYWxsIGZ1bmN0aW9uCi0vLyBtb2NrZXJzLCBhbmQgYWxsIGV4cGVjdGF0aW9ucy4KLUdURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19nbW9ja19tdXRleCk7Ci0KLS8vIExvZ3MgYSBtZXNzYWdlIGluY2x1ZGluZyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLUdURVNUX0FQSV8gdm9pZCBMb2dXaXRoTG9jYXRpb24odGVzdGluZzo6aW50ZXJuYWw6OkxvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gIDo6c3RkOjpvc3RyaW5nc3RyZWFtIHM7Ci0gIHMgPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCAiOiAiIDw8IG1lc3NhZ2UgPDwgOjpzdGQ6OmVuZGw7Ci0gIExvZyhzZXZlcml0eSwgcy5zdHIoKSwgMCk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYW4gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4KLUV4cGVjdGF0aW9uQmFzZTo6RXhwZWN0YXRpb25CYXNlKGNvbnN0IGNoYXIqIGFfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGFfc291cmNlX3RleHQpCi0gICAgOiBmaWxlXyhhX2ZpbGUpLAotICAgICAgbGluZV8oYV9saW5lKSwKLSAgICAgIHNvdXJjZV90ZXh0XyhhX3NvdXJjZV90ZXh0KSwKLSAgICAgIGNhcmRpbmFsaXR5X3NwZWNpZmllZF8oZmFsc2UpLAotICAgICAgY2FyZGluYWxpdHlfKEV4YWN0bHkoMSkpLAotICAgICAgY2FsbF9jb3VudF8oMCksCi0gICAgICByZXRpcmVkXyhmYWxzZSksCi0gICAgICBleHRyYV9tYXRjaGVyX3NwZWNpZmllZF8oZmFsc2UpLAotICAgICAgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8oZmFsc2UpLAotICAgICAgcmV0aXJlc19vbl9zYXR1cmF0aW9uXyhmYWxzZSksCi0gICAgICBsYXN0X2NsYXVzZV8oa05vbmUpLAotICAgICAgYWN0aW9uX2NvdW50X2NoZWNrZWRfKGZhbHNlKSB7fQotCi0vLyBEZXN0cnVjdHMgYW4gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4KLUV4cGVjdGF0aW9uQmFzZTo6fkV4cGVjdGF0aW9uQmFzZSgpIHt9Ci0KLS8vIEV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBjYXJkaW5hbGl0eSBvZiB0aGlzIGV4cGVjdGF0aW9uLiAgVXNlZCBieQotLy8gdGhlIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSAuVGltZXMoKSBjbGF1c2UuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6U3BlY2lmeUNhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5JiBhX2NhcmRpbmFsaXR5KSB7Ci0gIGNhcmRpbmFsaXR5X3NwZWNpZmllZF8gPSB0cnVlOwotICBjYXJkaW5hbGl0eV8gPSBhX2NhcmRpbmFsaXR5OwotfQotCi0vLyBSZXRpcmVzIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uLgotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OlJldGlyZUFsbFByZVJlcXVpc2l0ZXMoKQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGlmIChpc19yZXRpcmVkKCkpIHsKLSAgICAvLyBXZSBjYW4gdGFrZSB0aGlzIHNob3J0LWN1dCBhcyB3ZSBuZXZlciByZXRpcmUgYW4gZXhwZWN0YXRpb24KLSAgICAvLyB1bnRpbCB3ZSBoYXZlIHJldGlyZWQgYWxsIGl0cyBwcmUtcmVxdWlzaXRlcy4KLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5lbmQoKTsgKytpdCkgewotICAgIEV4cGVjdGF0aW9uQmFzZSogY29uc3QgcHJlcmVxdWlzaXRlID0gaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS5nZXQoKTsKLSAgICBpZiAoIXByZXJlcXVpc2l0ZS0+aXNfcmV0aXJlZCgpKSB7Ci0gICAgICBwcmVyZXF1aXNpdGUtPlJldGlyZUFsbFByZVJlcXVpc2l0ZXMoKTsKLSAgICAgIHByZXJlcXVpc2l0ZS0+UmV0aXJlKCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gaGF2ZSBiZWVuCi0vLyBzYXRpc2ZpZWQuCi1ib29sIEV4cGVjdGF0aW9uQmFzZTo6QWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpIGNvbnN0Ci0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKCEoaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+SXNTYXRpc2ZpZWQoKSkgfHwKLSAgICAgICAgIShpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5BbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBZGRzIHVuc2F0aXNmaWVkIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gdG8gJ3Jlc3VsdCcuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6RmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcyhFeHBlY3RhdGlvblNldCogcmVzdWx0KSBjb25zdAotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5Jc1NhdGlzZmllZCgpKSB7Ci0gICAgICAvLyBJZiAqaXQgaXMgc2F0aXNmaWVkIGFuZCBoYXMgYSBjYWxsIGNvdW50IG9mIDAsIHNvbWUgb2YgaXRzCi0gICAgICAvLyBwcmUtcmVxdWlzaXRlcyBtYXkgbm90IGJlIHNhdGlzZmllZCB5ZXQuCi0gICAgICBpZiAoaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+Y2FsbF9jb3VudF8gPT0gMCkgewotICAgICAgICBpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5GaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgKml0IGlzIHVuc2F0aXNmaWVkLCB3ZSBhcmUgbm90IHNvIGludGVyZXN0ZWQKLSAgICAgIC8vIGluIHdoZXRoZXIgaXRzIHByZS1yZXF1aXNpdGVzIGFyZSBzYXRpc2ZpZWQuICBUaGVyZWZvcmUgd2UKLSAgICAgIC8vIGRvbid0IHJlY3Vyc2l2ZWx5IGNhbGwgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcygpIGhlcmUuCi0gICAgICAqcmVzdWx0ICs9ICppdDsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIGEgZnVuY3Rpb24gY2FsbCBtYXRjaGluZyB0aGlzCi0vLyBleHBlY3RhdGlvbiBoYXMgb2NjdXJyZWQuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6RGVzY3JpYmVDYWxsQ291bnRUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIHRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQuCi0gICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlICI7Ci0gIGNhcmRpbmFsaXR5KCkuRGVzY3JpYmVUbyhvcyk7Ci0gICpvcyA8PCAiXG4gICAgICAgICAgIEFjdHVhbDogIjsKLSAgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oY2FsbF9jb3VudCgpLCBvcyk7Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgZXhwZWN0YXRpb24gKGUuZy4gaXMgaXQgc2F0aXNmaWVkPwotICAvLyBpcyBpdCBhY3RpdmU/KS4KLSAgKm9zIDw8ICIgLSAiIDw8IChJc092ZXJTYXR1cmF0ZWQoKSA/ICJvdmVyLXNhdHVyYXRlZCIgOgotICAgICAgICAgICAgICAgICAgIElzU2F0dXJhdGVkKCkgPyAic2F0dXJhdGVkIiA6Ci0gICAgICAgICAgICAgICAgICAgSXNTYXRpc2ZpZWQoKSA/ICJzYXRpc2ZpZWQiIDogInVuc2F0aXNmaWVkIikKLSAgICAgIDw8ICIgYW5kICIKLSAgICAgIDw8IChpc19yZXRpcmVkKCkgPyAicmV0aXJlZCIgOiAiYWN0aXZlIik7Ci19Ci0KLS8vIENoZWNrcyB0aGUgYWN0aW9uIGNvdW50IChpLmUuIHRoZSBudW1iZXIgb2YgV2lsbE9uY2UoKSBhbmQKLS8vIFdpbGxSZXBlYXRlZGx5KCkgY2xhdXNlcykgYWdhaW5zdCB0aGUgY2FyZGluYWxpdHkgaWYgdGhpcyBoYXNuJ3QKLS8vIGJlZW4gZG9uZSBiZWZvcmUuICBQcmludHMgYSB3YXJuaW5nIGlmIHRoZXJlIGFyZSB0b28gbWFueSBvciB0b28KLS8vIGZldyBhY3Rpb25zLgotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OkNoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBib29sIHNob3VsZF9jaGVjayA9IGZhbHNlOwotICB7Ci0gICAgTXV0ZXhMb2NrIGwoJm11dGV4Xyk7Ci0gICAgaWYgKCFhY3Rpb25fY291bnRfY2hlY2tlZF8pIHsKLSAgICAgIGFjdGlvbl9jb3VudF9jaGVja2VkXyA9IHRydWU7Ci0gICAgICBzaG91bGRfY2hlY2sgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChzaG91bGRfY2hlY2spIHsKLSAgICBpZiAoIWNhcmRpbmFsaXR5X3NwZWNpZmllZF8pIHsKLSAgICAgIC8vIFRoZSBjYXJkaW5hbGl0eSB3YXMgaW5mZXJyZWQgLSBubyBuZWVkIHRvIGNoZWNrIHRoZSBhY3Rpb24KLSAgICAgIC8vIGNvdW50IGFnYWluc3QgaXQuCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGNhcmRpbmFsaXR5IHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLSAgICBjb25zdCBpbnQgYWN0aW9uX2NvdW50ID0gc3RhdGljX2Nhc3Q8aW50Pih1bnR5cGVkX2FjdGlvbnNfLnNpemUoKSk7Ci0gICAgY29uc3QgaW50IHVwcGVyX2JvdW5kID0gY2FyZGluYWxpdHkoKS5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCk7Ci0gICAgY29uc3QgaW50IGxvd2VyX2JvdW5kID0gY2FyZGluYWxpdHkoKS5Db25zZXJ2YXRpdmVMb3dlckJvdW5kKCk7Ci0gICAgYm9vbCB0b29fbWFueTsgIC8vIFRydWUgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFjdGlvbnMsIG9yIGZhbHNlCi0gICAgLy8gaWYgdGhlcmUgYXJlIHRvbyBmZXcuCi0gICAgaWYgKGFjdGlvbl9jb3VudCA+IHVwcGVyX2JvdW5kIHx8Ci0gICAgICAgIChhY3Rpb25fY291bnQgPT0gdXBwZXJfYm91bmQgJiYgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8pKSB7Ci0gICAgICB0b29fbWFueSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICgwIDwgYWN0aW9uX2NvdW50ICYmIGFjdGlvbl9jb3VudCA8IGxvd2VyX2JvdW5kICYmCi0gICAgICAgICAgICAgICAhcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8pIHsKLSAgICAgIHRvb19tYW55ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIERlc2NyaWJlTG9jYXRpb25Ubygmc3MpOwotICAgIHNzIDw8ICJUb28gIiA8PCAodG9vX21hbnkgPyAibWFueSIgOiAiZmV3IikKLSAgICAgICA8PCAiIGFjdGlvbnMgc3BlY2lmaWVkIGluICIgPDwgc291cmNlX3RleHQoKSA8PCAiLi4uXG4iCi0gICAgICAgPDwgIkV4cGVjdGVkIHRvIGJlICI7Ci0gICAgY2FyZGluYWxpdHkoKS5EZXNjcmliZVRvKCZzcyk7Ci0gICAgc3MgPDwgIiwgYnV0IGhhcyAiIDw8ICh0b29fbWFueSA/ICIiIDogIm9ubHkgIikKLSAgICAgICA8PCBhY3Rpb25fY291bnQgPDwgIiBXaWxsT25jZSgpIgotICAgICAgIDw8IChhY3Rpb25fY291bnQgPT0gMSA/ICIiIDogInMiKTsKLSAgICBpZiAocmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8pIHsKLSAgICAgIHNzIDw8ICIgYW5kIGEgV2lsbFJlcGVhdGVkbHkoKSI7Ci0gICAgfQotICAgIHNzIDw8ICIuIjsKLSAgICBMb2coa1dhcm5pbmcsIHNzLnN0cigpLCAtMSk7ICAvLyAtMSBtZWFucyAiZG9uJ3QgcHJpbnQgc3RhY2sgdHJhY2UiLgotICB9Ci19Ci0KLS8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpVbnR5cGVkVGltZXMoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKLSAgaWYgKGxhc3RfY2xhdXNlXyA9PSBrVGltZXMpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICIuVGltZXMoKSBjYW5ub3QgYXBwZWFyICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7Ci0gIH0gZWxzZSB7Ci0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtUaW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAiLkluU2VxdWVuY2UoKSwgLldpbGxPbmNlKCksIC5XaWxsUmVwZWF0ZWRseSgpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJvciAuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOwotICB9Ci0gIGxhc3RfY2xhdXNlXyA9IGtUaW1lczsKLQotICBTcGVjaWZ5Q2FyZGluYWxpdHkoYV9jYXJkaW5hbGl0eSk7Ci19Ci0KLS8vIFBvaW50cyB0byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaW50cm9kdWNlZCBieSBhIGxpdmluZyBJblNlcXVlbmNlCi0vLyBvYmplY3QgKGlmIGFueSkgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIE5VTEwuCi1HVEVTVF9BUElfIFRocmVhZExvY2FsPFNlcXVlbmNlKj4gZ19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZTsKLQotLy8gUmVwb3J0cyBhbiB1bmludGVyZXN0aW5nIGNhbGwgKHdob3NlIGRlc2NyaXB0aW9uIGlzIGluIG1zZykgaW4gdGhlCi0vLyBtYW5uZXIgc3BlY2lmaWVkIGJ5ICdyZWFjdGlvbicuCi12b2lkIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKENhbGxSZWFjdGlvbiByZWFjdGlvbiwgY29uc3Qgc3RyaW5nJiBtc2cpIHsKLSAgLy8gSW5jbHVkZSBhIHN0YWNrIHRyYWNlIG9ubHkgaWYgLS1nbW9ja192ZXJib3NlPWluZm8gaXMgc3BlY2lmaWVkLgotICBjb25zdCBpbnQgc3RhY2tfZnJhbWVzX3RvX3NraXAgPQotICAgICAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9PSBrSW5mb1ZlcmJvc2l0eSA/IDMgOiAtMTsKLSAgc3dpdGNoIChyZWFjdGlvbikgewotICAgIGNhc2Uga0FsbG93OgotICAgICAgTG9nKGtJbmZvLCBtc2csIHN0YWNrX2ZyYW1lc190b19za2lwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dhcm46Ci0gICAgICBMb2coa1dhcm5pbmcsCi0gICAgICAgICAgbXNnICsKLSAgICAgICAgICAiXG5OT1RFOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGFib3ZlIHdhcm5pbmcgdW5sZXNzIHRoaXMgIgotICAgICAgICAgICJjYWxsIHNob3VsZCBub3QgaGFwcGVuLiAgRG8gbm90IHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nICIKLSAgICAgICAgICAiYW4gRVhQRUNUX0NBTEwoKSBpZiB5b3UgZG9uJ3QgbWVhbiB0byBlbmZvcmNlIHRoZSBjYWxsLiAgIgotICAgICAgICAgICJTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayMiCi0gICAgICAgICAgIktub3dpbmdfV2hlbl90b19FeHBlY3QgZm9yIGRldGFpbHMuXG4iLAotICAgICAgICAgIHN0YWNrX2ZyYW1lc190b19za2lwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAvLyBGQUlMCi0gICAgICBFeHBlY3QoZmFsc2UsIE5VTEwsIC0xLCBtc2cpOwotICB9Ci19Ci0KLVVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKQotICAgIDogbW9ja19vYmpfKE5VTEwpLCBuYW1lXygiIikge30KLQotVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6flVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKSB7fQotCi0vLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCByZWdpc3RlcnMKLS8vIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIGdsb2JhbCBtb2NrIHJlZ2lzdHJ5LiAgV2lsbCBiZSBjYWxsZWQKLS8vIHdoZW5ldmVyIGFuIEVYUEVDVF9DQUxMKCkgb3IgT05fQ0FMTCgpIGlzIGV4ZWN1dGVkIG9uIHRoaXMgbW9jawotLy8gbWV0aG9kLgotdm9pZCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpSZWdpc3Rlck93bmVyKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgewotICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgICBtb2NrX29ial8gPSBtb2NrX29iajsKLSAgfQotICBNb2NrOjpSZWdpc3Rlcihtb2NrX29iaiwgdGhpcyk7Ci19Ci0KLS8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHNldHMgdGhlIG5hbWUKLS8vIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiAgV2lsbCBiZSBjYWxsZWQgdXBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhpcwotLy8gbW9jayBmdW5jdGlvbi4KLXZvaWQgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6U2V0T3duZXJBbmROYW1lKGNvbnN0IHZvaWQqIG1vY2tfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIC8vIFdlIHByb3RlY3QgbmFtZV8gdW5kZXIgZ19nbW9ja19tdXRleCBpbiBjYXNlIHRoaXMgbW9jayBmdW5jdGlvbgotICAvLyBpcyBjYWxsZWQgZnJvbSB0d28gdGhyZWFkcyBjb25jdXJyZW50bHkuCi0gIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgbW9ja19vYmpfID0gbW9ja19vYmo7Ci0gIG5hbWVfID0gbmFtZTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgbW9ja2VkLiAgTXVzdCBiZSBjYWxsZWQKLS8vIGFmdGVyIFJlZ2lzdGVyT3duZXIoKSBvciBTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbiBjYWxsZWQuCi1jb25zdCB2b2lkKiBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpNb2NrT2JqZWN0KCkgY29uc3QKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGNvbnN0IHZvaWQqIG1vY2tfb2JqOwotICB7Ci0gICAgLy8gV2UgcHJvdGVjdCBtb2NrX29ial8gdW5kZXIgZ19nbW9ja19tdXRleCBpbiBjYXNlIHRoaXMgbW9jawotICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7Ci0gICAgQXNzZXJ0KG1vY2tfb2JqXyAhPSBOVUxMLCBfX0ZJTEVfXywgX19MSU5FX18sCi0gICAgICAgICAgICJNb2NrT2JqZWN0KCkgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBSZWdpc3Rlck93bmVyKCkgb3IgIgotICAgICAgICAgICAiU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLiIpOwotICAgIG1vY2tfb2JqID0gbW9ja19vYmpfOwotICB9Ci0gIHJldHVybiBtb2NrX29iajsKLX0KLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG1vY2sgbWV0aG9kLiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLS8vIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4KLWNvbnN0IGNoYXIqIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6Ok5hbWUoKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgewotICAgIC8vIFdlIHByb3RlY3QgbmFtZV8gdW5kZXIgZ19nbW9ja19tdXRleCBpbiBjYXNlIHRoaXMgbW9jawotICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7Ci0gICAgQXNzZXJ0KG5hbWVfICE9IE5VTEwsIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgIk5hbWUoKSBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIFNldE93bmVyQW5kTmFtZSgpIGhhcyAiCi0gICAgICAgICAgICJiZWVuIGNhbGxlZC4iKTsKLSAgICBuYW1lID0gbmFtZV87Ci0gIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8vIENhbGN1bGF0ZXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4KLS8vIGFyZ3VtZW50cywgcHJpbnRzIGl0LCBhbmQgcmV0dXJucyBpdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKLS8vIGZvciBkZWxldGluZyB0aGUgcmVzdWx0LgotVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqCi1VbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpVbnR5cGVkSW52b2tlV2l0aChjb25zdCB2b2lkKiBjb25zdCB1bnR5cGVkX2FyZ3MpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICBpZiAodW50eXBlZF9leHBlY3RhdGlvbnNfLnNpemUoKSA9PSAwKSB7Ci0gICAgLy8gTm8gZXhwZWN0YXRpb24gaXMgc2V0IG9uIHRoaXMgbW9jayBtZXRob2QgLSB3ZSBoYXZlIGFuCi0gICAgLy8gdW5pbnRlcmVzdGluZyBjYWxsLgotCi0gICAgLy8gV2UgbXVzdCBnZXQgR29vZ2xlIE1vY2sncyByZWFjdGlvbiBvbiB1bmludGVyZXN0aW5nIGNhbGxzCi0gICAgLy8gbWFkZSBvbiB0aGlzIG1vY2sgb2JqZWN0IEJFRk9SRSBwZXJmb3JtaW5nIHRoZSBhY3Rpb24sCi0gICAgLy8gYmVjYXVzZSB0aGUgYWN0aW9uIG1heSBERUxFVEUgdGhlIG1vY2sgb2JqZWN0IGFuZCBtYWtlIHRoZQotICAgIC8vIGZvbGxvd2luZyBleHByZXNzaW9uIG1lYW5pbmdsZXNzLgotICAgIGNvbnN0IENhbGxSZWFjdGlvbiByZWFjdGlvbiA9Ci0gICAgICAgIE1vY2s6OkdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoTW9ja09iamVjdCgpKTsKLQotICAgIC8vIFRydWUgaWZmIHdlIG5lZWQgdG8gcHJpbnQgdGhpcyBjYWxsJ3MgYXJndW1lbnRzIGFuZCByZXR1cm4KLSAgICAvLyB2YWx1ZS4gIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoCi0gICAgLy8gdGhlIGJlaGF2aW9yIG9mIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKCkuCi0gICAgY29uc3QgYm9vbCBuZWVkX3RvX3JlcG9ydF91bmludGVyZXN0aW5nX2NhbGwgPQotICAgICAgICAvLyBJZiB0aGUgdXNlciBhbGxvd3MgdGhpcyB1bmludGVyZXN0aW5nIGNhbGwsIHdlIHByaW50IGl0Ci0gICAgICAgIC8vIG9ubHkgd2hlbiBoZSB3YW50cyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICAgICAgICByZWFjdGlvbiA9PSBrQWxsb3cgPyBMb2dJc1Zpc2libGUoa0luZm8pIDoKLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgdGhpcyB0byBiZSBhIHdhcm5pbmcsIHdlIHByaW50IGl0IG9ubHkKLSAgICAgICAgLy8gd2hlbiBoZSB3YW50cyB0byBzZWUgd2FybmluZ3MuCi0gICAgICAgIHJlYWN0aW9uID09IGtXYXJuID8gTG9nSXNWaXNpYmxlKGtXYXJuaW5nKSA6Ci0gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHVzZXIgd2FudHMgdGhpcyB0byBiZSBhbiBlcnJvciwgYW5kIHdlCi0gICAgICAgIC8vIHNob3VsZCBhbHdheXMgcHJpbnQgZGV0YWlsZWQgaW5mb3JtYXRpb24gaW4gdGhlIGVycm9yLgotICAgICAgICB0cnVlOwotCi0gICAgaWYgKCFuZWVkX3RvX3JlcG9ydF91bmludGVyZXN0aW5nX2NhbGwpIHsKLSAgICAgIC8vIFBlcmZvcm0gdGhlIGFjdGlvbiB3aXRob3V0IHByaW50aW5nIHRoZSBjYWxsIGluZm9ybWF0aW9uLgotICAgICAgcmV0dXJuIHRoaXMtPlVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbih1bnR5cGVkX2FyZ3MsICIiKTsKLSAgICB9Ci0KLSAgICAvLyBXYXJucyBhYm91dCB0aGUgdW5pbnRlcmVzdGluZyBjYWxsLgotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgdGhpcy0+VW50eXBlZERlc2NyaWJlVW5pbnRlcmVzdGluZ0NhbGwodW50eXBlZF9hcmdzLCAmc3MpOwotCi0gICAgLy8gQ2FsY3VsYXRlcyB0aGUgZnVuY3Rpb24gcmVzdWx0LgotICAgIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBjb25zdCByZXN1bHQgPQotICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCBzcy5zdHIoKSk7Ci0KLSAgICAvLyBQcmludHMgdGhlIGZ1bmN0aW9uIHJlc3VsdC4KLSAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgICByZXN1bHQtPlByaW50QXNBY3Rpb25SZXN1bHQoJnNzKTsKLQotICAgIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKHJlYWN0aW9uLCBzcy5zdHIoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGJvb2wgaXNfZXhjZXNzaXZlID0gZmFsc2U7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gd2h5OwotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGxvYzsKLSAgY29uc3Qgdm9pZCogdW50eXBlZF9hY3Rpb24gPSBOVUxMOwotCi0gIC8vIFRoZSBVbnR5cGVkRmluZE1hdGNoaW5nRXhwZWN0YXRpb24oKSBmdW5jdGlvbiBhY3F1aXJlcyBhbmQKLSAgLy8gcmVsZWFzZXMgZ19nbW9ja19tdXRleC4KLSAgY29uc3QgRXhwZWN0YXRpb25CYXNlKiBjb25zdCB1bnR5cGVkX2V4cGVjdGF0aW9uID0KLSAgICAgIHRoaXMtPlVudHlwZWRGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbigKLSAgICAgICAgICB1bnR5cGVkX2FyZ3MsICZ1bnR5cGVkX2FjdGlvbiwgJmlzX2V4Y2Vzc2l2ZSwKLSAgICAgICAgICAmc3MsICZ3aHkpOwotICBjb25zdCBib29sIGZvdW5kID0gdW50eXBlZF9leHBlY3RhdGlvbiAhPSBOVUxMOwotCi0gIC8vIFRydWUgaWZmIHdlIG5lZWQgdG8gcHJpbnQgdGhlIGNhbGwncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS4KLSAgLy8gVGhpcyBkZWZpbml0aW9uIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHVzZXMgb2YgRXhwZWN0KCkKLSAgLy8gYW5kIExvZygpIGluIHRoaXMgZnVuY3Rpb24uCi0gIGNvbnN0IGJvb2wgbmVlZF90b19yZXBvcnRfY2FsbCA9Ci0gICAgICAhZm91bmQgfHwgaXNfZXhjZXNzaXZlIHx8IExvZ0lzVmlzaWJsZShrSW5mbyk7Ci0gIGlmICghbmVlZF90b19yZXBvcnRfY2FsbCkgewotICAgIC8vIFBlcmZvcm0gdGhlIGFjdGlvbiB3aXRob3V0IHByaW50aW5nIHRoZSBjYWxsIGluZm9ybWF0aW9uLgotICAgIHJldHVybgotICAgICAgICB1bnR5cGVkX2FjdGlvbiA9PSBOVUxMID8KLSAgICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgIiIpIDoKLSAgICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1BY3Rpb24odW50eXBlZF9hY3Rpb24sIHVudHlwZWRfYXJncyk7Ci0gIH0KLQotICBzcyA8PCAiICAgIEZ1bmN0aW9uIGNhbGw6ICIgPDwgTmFtZSgpOwotICB0aGlzLT5VbnR5cGVkUHJpbnRBcmdzKHVudHlwZWRfYXJncywgJnNzKTsKLQotICAvLyBJbiBjYXNlIHRoZSBhY3Rpb24gZGVsZXRlcyBhIHBpZWNlIG9mIHRoZSBleHBlY3RhdGlvbiwgd2UKLSAgLy8gZ2VuZXJhdGUgdGhlIG1lc3NhZ2UgYmVmb3JlaGFuZC4KLSAgaWYgKGZvdW5kICYmICFpc19leGNlc3NpdmUpIHsKLSAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5EZXNjcmliZUxvY2F0aW9uVG8oJmxvYyk7Ci0gIH0KLQotICBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogY29uc3QgcmVzdWx0ID0KLSAgICAgIHVudHlwZWRfYWN0aW9uID09IE5VTEwgPwotICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgc3Muc3RyKCkpIDoKLSAgICAgIHRoaXMtPlVudHlwZWRQZXJmb3JtQWN0aW9uKHVudHlwZWRfYWN0aW9uLCB1bnR5cGVkX2FyZ3MpOwotICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgcmVzdWx0LT5QcmludEFzQWN0aW9uUmVzdWx0KCZzcyk7Ci0gIHNzIDw8ICJcbiIgPDwgd2h5LnN0cigpOwotCi0gIGlmICghZm91bmQpIHsKLSAgICAvLyBObyBleHBlY3RhdGlvbiBtYXRjaGVzIHRoaXMgY2FsbCAtIHJlcG9ydHMgYSBmYWlsdXJlLgotICAgIEV4cGVjdChmYWxzZSwgTlVMTCwgLTEsIHNzLnN0cigpKTsKLSAgfSBlbHNlIGlmIChpc19leGNlc3NpdmUpIHsKLSAgICAvLyBXZSBoYWQgYW4gdXBwZXItYm91bmQgdmlvbGF0aW9uIGFuZCB0aGUgZmFpbHVyZSBtZXNzYWdlIGlzIGluIHNzLgotICAgIEV4cGVjdChmYWxzZSwgdW50eXBlZF9leHBlY3RhdGlvbi0+ZmlsZSgpLAotICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5saW5lKCksIHNzLnN0cigpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBoYWQgYW4gZXhwZWN0ZWQgY2FsbCBhbmQgdGhlIG1hdGNoaW5nIGV4cGVjdGF0aW9uIGlzCi0gICAgLy8gZGVzY3JpYmVkIGluIHNzLgotICAgIExvZyhrSW5mbywgbG9jLnN0cigpICsgc3Muc3RyKCksIDIpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmV0dXJucyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIGV4cCwKLS8vIHdoaWNoIG11c3QgYmUgYW4gZXhwZWN0YXRpb24gb24gdGhpcyBtb2NrIGZ1bmN0aW9uLgotRXhwZWN0YXRpb24gVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6R2V0SGFuZGxlT2YoRXhwZWN0YXRpb25CYXNlKiBleHApIHsKLSAgZm9yIChVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9Ci0gICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5iZWdpbigpOwotICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+Z2V0KCkgPT0gZXhwKSB7Ci0gICAgICByZXR1cm4gRXhwZWN0YXRpb24oKml0KTsKLSAgICB9Ci0gIH0KLQotICBBc3NlcnQoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgIkNhbm5vdCBmaW5kIGV4cGVjdGF0aW9uLiIpOwotICByZXR1cm4gRXhwZWN0YXRpb24oKTsKLSAgLy8gVGhlIGFib3ZlIHN0YXRlbWVudCBpcyBqdXN0IHRvIG1ha2UgdGhlIGNvZGUgY29tcGlsZSwgYW5kIHdpbGwKLSAgLy8gbmV2ZXIgYmUgZXhlY3V0ZWQuCi19Ci0KLS8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sgZnVuY3Rpb24gaGF2ZSBiZWVuCi0vLyBzYXRpc2ZpZWQuICBSZXBvcnRzIG9uZSBvciBtb3JlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcwotLy8gYW5kIHJldHVybnMgZmFsc2UgaWYgbm90LgotYm9vbCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGJvb2wgZXhwZWN0YXRpb25zX21ldCA9IHRydWU7Ci0gIGZvciAoVW50eXBlZEV4cGVjdGF0aW9uczo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uc18uYmVnaW4oKTsKLSAgICAgICBpdCAhPSB1bnR5cGVkX2V4cGVjdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKLSAgICBFeHBlY3RhdGlvbkJhc2UqIGNvbnN0IHVudHlwZWRfZXhwZWN0YXRpb24gPSBpdC0+Z2V0KCk7Ci0gICAgaWYgKHVudHlwZWRfZXhwZWN0YXRpb24tPklzT3ZlclNhdHVyYXRlZCgpKSB7Ci0gICAgICAvLyBUaGVyZSB3YXMgYW4gdXBwZXItYm91bmQgdmlvbGF0aW9uLiAgU2luY2UgdGhlIGVycm9yIHdhcwotICAgICAgLy8gYWxyZWFkeSByZXBvcnRlZCB3aGVuIGl0IG9jY3VycmVkLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRvCi0gICAgICAvLyBhbnl0aGluZyBoZXJlLgotICAgICAgZXhwZWN0YXRpb25zX21ldCA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoIXVudHlwZWRfZXhwZWN0YXRpb24tPklzU2F0aXNmaWVkKCkpIHsKLSAgICAgIGV4cGVjdGF0aW9uc19tZXQgPSBmYWxzZTsKLSAgICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICBzcyAgPDwgIkFjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggIgotICAgICAgICAgIDw8IHVudHlwZWRfZXhwZWN0YXRpb24tPnNvdXJjZV90ZXh0KCkgPDwgIi4uLlxuIjsKLSAgICAgIC8vIE5vIG5lZWQgdG8gc2hvdyB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gb2YgdGhlIGV4cGVjdGF0aW9uCi0gICAgICAvLyBpbiB0aGUgZGVzY3JpcHRpb24sIGFzIHRoZSBFeHBlY3QoKSBjYWxsIHRoYXQgZm9sbG93cyBhbHJlYWR5Ci0gICAgICAvLyB0YWtlcyBjYXJlIG9mIGl0LgotICAgICAgdW50eXBlZF9leHBlY3RhdGlvbi0+TWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKCZzcyk7Ci0gICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5EZXNjcmliZUNhbGxDb3VudFRvKCZzcyk7Ci0gICAgICBFeHBlY3QoZmFsc2UsIHVudHlwZWRfZXhwZWN0YXRpb24tPmZpbGUoKSwKLSAgICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5saW5lKCksIHNzLnN0cigpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZWxldGluZyBvdXIgZXhwZWN0YXRpb25zIG1heSB0cmlnZ2VyIG90aGVyIG1vY2sgb2JqZWN0cyB0byBiZSBkZWxldGVkLCBmb3IKLSAgLy8gZXhhbXBsZSBpZiBhbiBhY3Rpb24gY29udGFpbnMgYSByZWZlcmVuY2UgY291bnRlZCBzbWFydCBwb2ludGVyIHRvIHRoYXQKLSAgLy8gbW9jayBvYmplY3QsIGFuZCB0aGF0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZS4gU28gaWYgd2UgZGVsZXRlIG91cgotICAvLyBleHBlY3RhdGlvbnMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBnbG9iYWwgbXV0ZXggd2UgbWF5IGRlYWRsb2NrIHdoZW4KLSAgLy8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLiBJbnN0ZWFkLCBtYWtlIGEgY29weSBvZiB0aGUgc2V0IG9mCi0gIC8vIGV4cGVjdGF0aW9ucyB0byBkZWxldGUsIGNsZWFyIG91ciBzZXQgd2l0aGluIHRoZSBtdXRleCwgYW5kIHRoZW4gY2xlYXIgdGhlCi0gIC8vIGNvcGllZCBzZXQgb3V0c2lkZSBvZiBpdC4KLSAgVW50eXBlZEV4cGVjdGF0aW9ucyBleHBlY3RhdGlvbnNfdG9fZGVsZXRlOwotICB1bnR5cGVkX2V4cGVjdGF0aW9uc18uc3dhcChleHBlY3RhdGlvbnNfdG9fZGVsZXRlKTsKLQotICBnX2dtb2NrX211dGV4LlVubG9jaygpOwotICBleHBlY3RhdGlvbnNfdG9fZGVsZXRlLmNsZWFyKCk7Ci0gIGdfZ21vY2tfbXV0ZXguTG9jaygpOwotCi0gIHJldHVybiBleHBlY3RhdGlvbnNfbWV0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQ2xhc3MgTW9jay4KLQotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiBzdGQ6OnNldDxpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSo+IEZ1bmN0aW9uTW9ja2VyczsKLQotLy8gVGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBtb2NrIG9iamVjdC4gIFN1Y2ggaW5mb3JtYXRpb24gaXMgbmVlZGVkIGZvcgotLy8gZGV0ZWN0aW5nIGxlYWtlZCBtb2NrIG9iamVjdHMgYW5kIGV4cGxpY2l0bHkgdmVyaWZ5aW5nIGEgbW9jaydzCi0vLyBleHBlY3RhdGlvbnMuCi1zdHJ1Y3QgTW9ja09iamVjdFN0YXRlIHsKLSAgTW9ja09iamVjdFN0YXRlKCkKLSAgICAgIDogZmlyc3RfdXNlZF9maWxlKE5VTEwpLCBmaXJzdF91c2VkX2xpbmUoLTEpLCBsZWFrYWJsZShmYWxzZSkge30KLQotICAvLyBXaGVyZSBpbiB0aGUgc291cmNlIGZpbGUgYW4gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTCBpcyBmaXJzdAotICAvLyBpbnZva2VkIG9uIHRoaXMgbW9jayBvYmplY3QuCi0gIGNvbnN0IGNoYXIqIGZpcnN0X3VzZWRfZmlsZTsKLSAgaW50IGZpcnN0X3VzZWRfbGluZTsKLSAgOjpzdGQ6OnN0cmluZyBmaXJzdF91c2VkX3Rlc3RfY2FzZTsKLSAgOjpzdGQ6OnN0cmluZyBmaXJzdF91c2VkX3Rlc3Q7Ci0gIGJvb2wgbGVha2FibGU7ICAvLyB0cnVlIGlmZiBpdCdzIE9LIHRvIGxlYWsgdGhlIG9iamVjdC4KLSAgRnVuY3Rpb25Nb2NrZXJzIGZ1bmN0aW9uX21vY2tlcnM7ICAvLyBBbGwgcmVnaXN0ZXJlZCBtZXRob2RzIG9mIHRoZSBvYmplY3QuCi19OwotCi0vLyBBIGdsb2JhbCByZWdpc3RyeSBob2xkaW5nIHRoZSBzdGF0ZSBvZiBhbGwgbW9jayBvYmplY3RzIHRoYXQgYXJlCi0vLyBhbGl2ZS4gIEEgbW9jayBvYmplY3QgaXMgYWRkZWQgdG8gdGhpcyByZWdpc3RyeSB0aGUgZmlyc3QgdGltZQotLy8gTW9jazo6QWxsb3dMZWFrKCksIE9OX0NBTEwoKSwgb3IgRVhQRUNUX0NBTEwoKSBpcyBjYWxsZWQgb24gaXQuICBJdAotLy8gaXMgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyeSBpbiB0aGUgbW9jayBvYmplY3QncyBkZXN0cnVjdG9yLgotY2xhc3MgTW9ja09iamVjdFJlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIC8vIE1hcHMgYSBtb2NrIG9iamVjdCAoaWRlbnRpZmllZCBieSBpdHMgYWRkcmVzcykgdG8gaXRzIHN0YXRlLgotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBNb2NrT2JqZWN0U3RhdGU+IFN0YXRlTWFwOwotCi0gIC8vIFRoaXMgZGVzdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcHJvZ3JhbSBleGl0cywgYWZ0ZXIgYWxsCi0gIC8vIHRlc3RzIGluIGl0IGhhdmUgYmVlbiBydW4uICBCeSB0aGVuLCB0aGVyZSBzaG91bGQgYmUgbm8gbW9jawotICAvLyBvYmplY3QgYWxpdmUuICBUaGVyZWZvcmUgd2UgcmVwb3J0IGFueSBsaXZpbmcgb2JqZWN0IGFzIHRlc3QKLSAgLy8gZmFpbHVyZSwgdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgdXMgdG8gaWdub3JlIGl0LgotICB+TW9ja09iamVjdFJlZ2lzdHJ5KCkgewotICAgIC8vICJ1c2luZyA6OnN0ZDo6Y291dDsiIGRvZXNuJ3Qgd29yayB3aXRoIFN5bWJpYW4ncyBTVExwb3J0LCB3aGVyZSBjb3V0IGlzCi0gICAgLy8gYSBtYWNyby4KLQotICAgIGlmICghR01PQ0tfRkxBRyhjYXRjaF9sZWFrZWRfbW9ja3MpKQotICAgICAgcmV0dXJuOwotCi0gICAgaW50IGxlYWtlZF9jb3VudCA9IDA7Ci0gICAgZm9yIChTdGF0ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGF0ZXNfLmJlZ2luKCk7IGl0ICE9IHN0YXRlc18uZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBpZiAoaXQtPnNlY29uZC5sZWFrYWJsZSkgIC8vIFRoZSB1c2VyIHNhaWQgaXQncyBmaW5lIHRvIGxlYWsgdGhpcyBvYmplY3QuCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogUHJpbnQgdGhlIHR5cGUgb2YgdGhlIGxlYWtlZCBvYmplY3QuCi0gICAgICAvLyBUaGlzIGNhbiBoZWxwIHRoZSB1c2VyIGlkZW50aWZ5IHRoZSBsZWFrZWQgb2JqZWN0LgotICAgICAgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgICBjb25zdCBNb2NrT2JqZWN0U3RhdGUmIHN0YXRlID0gaXQtPnNlY29uZDsKLSAgICAgIHN0ZDo6Y291dCA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHN0YXRlLmZpcnN0X3VzZWRfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZpcnN0X3VzZWRfbGluZSk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiBFUlJPUjogdGhpcyBtb2NrIG9iamVjdCI7Ci0gICAgICBpZiAoc3RhdGUuZmlyc3RfdXNlZF90ZXN0ICE9ICIiKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICh1c2VkIGluIHRlc3QgIiA8PCBzdGF0ZS5maXJzdF91c2VkX3Rlc3RfY2FzZSA8PCAiLiIKLSAgICAgICAgICAgICA8PCBzdGF0ZS5maXJzdF91c2VkX3Rlc3QgPDwgIikiOwotICAgICAgfQotICAgICAgc3RkOjpjb3V0IDw8ICIgc2hvdWxkIGJlIGRlbGV0ZWQgYnV0IG5ldmVyIGlzLiBJdHMgYWRkcmVzcyBpcyBAIgotICAgICAgICAgICA8PCBpdC0+Zmlyc3QgPDwgIi4iOwotICAgICAgbGVha2VkX2NvdW50Kys7Ci0gICAgfQotICAgIGlmIChsZWFrZWRfY291bnQgPiAwKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlxuRVJST1I6ICIgPDwgbGVha2VkX2NvdW50Ci0gICAgICAgICAgIDw8ICIgbGVha2VkIG1vY2sgIiA8PCAobGVha2VkX2NvdW50ID09IDEgPyAib2JqZWN0IiA6ICJvYmplY3RzIikKLSAgICAgICAgICAgPDwgIiBmb3VuZCBhdCBwcm9ncmFtIGV4aXQuXG4iOwotICAgICAgc3RkOjpjb3V0LmZsdXNoKCk7Ci0gICAgICA6OnN0ZDo6Y2Vyci5mbHVzaCgpOwotICAgICAgLy8gUlVOX0FMTF9URVNUUygpIGhhcyBhbHJlYWR5IHJldHVybmVkIHdoZW4gdGhpcyBkZXN0cnVjdG9yIGlzCi0gICAgICAvLyBjYWxsZWQuICBUaGVyZWZvcmUgd2UgY2Fubm90IHVzZSB0aGUgbm9ybWFsIEdvb2dsZSBUZXN0Ci0gICAgICAvLyBmYWlsdXJlIHJlcG9ydGluZyBtZWNoYW5pc20uCi0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0gICAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7Ci0jZWxzZQotICAgICAgX2V4aXQoMSk7ICAvLyBXZSBjYW5ub3QgY2FsbCBleGl0KCkgYXMgaXQgaXMgbm90IHJlZW50cmFudCBhbmQKLSAgICAgICAgICAgICAgICAgLy8gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhbGxlZC4KLSNlbmRpZgotICAgIH0KLSAgfQotCi0gIFN0YXRlTWFwJiBzdGF0ZXMoKSB7IHJldHVybiBzdGF0ZXNfOyB9Ci0KLSBwcml2YXRlOgotICBTdGF0ZU1hcCBzdGF0ZXNfOwotfTsKLQotLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguCi1Nb2NrT2JqZWN0UmVnaXN0cnkgZ19tb2NrX29iamVjdF9yZWdpc3RyeTsKLQotLy8gTWFwcyBhIG1vY2sgb2JqZWN0IHRvIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayBzaG91bGQgaGF2ZSB3aGVuIGFuCi0vLyB1bmludGVyZXN0aW5nIG1ldGhvZCBpcyBjYWxsZWQuICBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KLXN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uPiBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvbjsKLQotLy8gU2V0cyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgc2hvdWxkIGhhdmUgd2hlbiBhbiB1bmludGVyZXN0aW5nCi0vLyBtZXRob2Qgb2YgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGNhbGxlZC4KLXZvaWQgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIHJlYWN0aW9uKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvblttb2NrX29ial0gPSByZWFjdGlvbjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGFsbG93IHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sKLS8vIG9iamVjdC4KLXZvaWQgTW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtBbGxvdyk7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIHdhcm4gdGhlIHVzZXIgYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUKLS8vIGdpdmVuIG1vY2sgb2JqZWN0Lgotdm9pZCBNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIFNldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMobW9ja19vYmosIGludGVybmFsOjprV2Fybik7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGZhaWwgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jawotLy8gb2JqZWN0Lgotdm9pZCBNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIFNldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMobW9ja19vYmosIGludGVybmFsOjprRmFpbCk7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBpcyBiZWluZyBkZXN0cm95ZWQgYW5kIGl0cwotLy8gZW50cnkgaW4gdGhlIGNhbGwtcmVhY3Rpb24gdGFibGUgc2hvdWxkIGJlIHJlbW92ZWQuCi12b2lkIE1vY2s6OlVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uLmVyYXNlKG1vY2tfb2JqKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgd2lsbCBoYXZlIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMKLS8vIG1hZGUgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotaW50ZXJuYWw6OkNhbGxSZWFjdGlvbiBNb2NrOjpHZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgIGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgcmV0dXJuIChnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvbi5jb3VudChtb2NrX29iaikgPT0gMCkgPwotICAgICAgaW50ZXJuYWw6OmtEZWZhdWx0IDogZ191bmludGVyZXN0aW5nX2NhbGxfcmVhY3Rpb25bbW9ja19vYmpdOwotfQotCi0vLyBUZWxscyBHb29nbGUgTW9jayB0byBpZ25vcmUgbW9ja19vYmogd2hlbiBjaGVja2luZyBmb3IgbGVha2VkIG1vY2sKLS8vIG9iamVjdHMuCi12b2lkIE1vY2s6OkFsbG93TGVhayhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0ubGVha2FibGUgPSB0cnVlOwotfQotCi0vLyBWZXJpZmllcyBhbmQgY2xlYXJzIGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LiAgSWYKLS8vIHRoZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZCwgZ2VuZXJhdGVzIG9uZSBvciBtb3JlIEdvb2dsZQotLy8gVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UuCi1ib29sIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICByZXR1cm4gVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQobW9ja19vYmopOwotfQotCi0vLyBWZXJpZmllcyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBhbmQgY2xlYXJzIGl0cwotLy8gZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMuICBSZXR1cm5zIHRydWUgaWZmIHRoZQotLy8gdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLgotYm9vbCBNb2NrOjpWZXJpZnlBbmRDbGVhcih2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZChtb2NrX29iaik7Ci0gIHJldHVybiBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZChtb2NrX29iaik7Ci19Ci0KLS8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuICBJZgotLy8gdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUgR29vZ2xlCi0vLyBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZS4KLWJvb2wgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQodm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgaWYgKGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuY291bnQobW9ja19vYmopID09IDApIHsKLSAgICAvLyBObyBFWFBFQ1RfQ0FMTCgpIHdhcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gVmVyaWZpZXMgYW5kIGNsZWFycyB0aGUgZXhwZWN0YXRpb25zIG9uIGVhY2ggbW9jayBtZXRob2QgaW4gdGhlCi0gIC8vIGdpdmVuIG1vY2sgb2JqZWN0LgotICBib29sIGV4cGVjdGF0aW9uc19tZXQgPSB0cnVlOwotICBGdW5jdGlvbk1vY2tlcnMmIG1vY2tlcnMgPQotICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0uZnVuY3Rpb25fbW9ja2VyczsKLSAgZm9yIChGdW5jdGlvbk1vY2tlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbW9ja2Vycy5iZWdpbigpOwotICAgICAgIGl0ICE9IG1vY2tlcnMuZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoISgqaXQpLT5WZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpKSB7Ci0gICAgICBleHBlY3RhdGlvbnNfbWV0ID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gV2UgZG9uJ3QgY2xlYXIgdGhlIGNvbnRlbnQgb2YgbW9ja2VycywgYXMgdGhleSBtYXkgc3RpbGwgYmUKLSAgLy8gbmVlZGVkIGJ5IENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKS4KLSAgcmV0dXJuIGV4cGVjdGF0aW9uc19tZXQ7Ci19Ci0KLS8vIFJlZ2lzdGVycyBhIG1vY2sgb2JqZWN0IGFuZCBhIG1vY2sgbWV0aG9kIGl0IG93bnMuCi12b2lkIE1vY2s6OlJlZ2lzdGVyKGNvbnN0IHZvaWQqIG1vY2tfb2JqLAotICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5mdW5jdGlvbl9tb2NrZXJzLmluc2VydChtb2NrZXIpOwotfQotCi0vLyBUZWxscyBHb29nbGUgTW9jayB3aGVyZSBpbiB0aGUgc291cmNlIGNvZGUgbW9ja19vYmogaXMgdXNlZCBpbiBhbgotLy8gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTC4gIEluIGNhc2UgbW9ja19vYmogaXMgbGVha2VkLCB0aGlzCi0vLyBpbmZvcm1hdGlvbiBoZWxwcyB0aGUgdXNlciBpZGVudGlmeSB3aGljaCBvYmplY3QgaXQgaXMuCi12b2lkIE1vY2s6OlJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoY29uc3Qgdm9pZCogbW9ja19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIE1vY2tPYmplY3RTdGF0ZSYgc3RhdGUgPSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXTsKLSAgaWYgKHN0YXRlLmZpcnN0X3VzZWRfZmlsZSA9PSBOVUxMKSB7Ci0gICAgc3RhdGUuZmlyc3RfdXNlZF9maWxlID0gZmlsZTsKLSAgICBzdGF0ZS5maXJzdF91c2VkX2xpbmUgPSBsaW5lOwotICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgICBpZiAodGVzdF9pbmZvICE9IE5VTEwpIHsKLSAgICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZWNvcmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdoZW4gdGhlCi0gICAgICAvLyBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMIGlzIGludm9rZWQgZnJvbSBTZXRVcFRlc3RDYXNlKCkgb3IKLSAgICAgIC8vIFRlYXJEb3duVGVzdENhc2UoKS4KLSAgICAgIHN0YXRlLmZpcnN0X3VzZWRfdGVzdF9jYXNlID0gdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpOwotICAgICAgc3RhdGUuZmlyc3RfdXNlZF90ZXN0ID0gdGVzdF9pbmZvLT5uYW1lKCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFVucmVnaXN0ZXJzIGEgbW9jayBtZXRob2Q7IHJlbW92ZXMgdGhlIG93bmluZyBtb2NrIG9iamVjdCBmcm9tIHRoZQotLy8gcmVnaXN0cnkgd2hlbiB0aGUgbGFzdCBtb2NrIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggaXQgaGFzIGJlZW4KLS8vIHVucmVnaXN0ZXJlZC4gIFRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdGhlIGRlc3RydWN0b3Igb2YKLS8vIEZ1bmN0aW9uTW9ja2VyQmFzZS4KLXZvaWQgTW9jazo6VW5yZWdpc3RlckxvY2tlZChpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6Z19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGZvciAoTW9ja09iamVjdFJlZ2lzdHJ5OjpTdGF0ZU1hcDo6aXRlcmF0b3IgaXQgPQotICAgICAgICAgICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5lbmQoKTsgKytpdCkgewotICAgIEZ1bmN0aW9uTW9ja2VycyYgbW9ja2VycyA9IGl0LT5zZWNvbmQuZnVuY3Rpb25fbW9ja2VyczsKLSAgICBpZiAobW9ja2Vycy5lcmFzZShtb2NrZXIpID4gMCkgewotICAgICAgLy8gbW9ja2VyIHdhcyBpbiBtb2NrZXJzIGFuZCBoYXMgYmVlbiBqdXN0IHJlbW92ZWQuCi0gICAgICBpZiAobW9ja2Vycy5lbXB0eSgpKSB7Ci0gICAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuZXJhc2UoaXQpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0vLyBDbGVhcnMgYWxsIE9OX0NBTEwoKXMgc2V0IG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4KLXZvaWQgTW9jazo6Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotCi0gIGlmIChnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmNvdW50KG1vY2tfb2JqKSA9PSAwKSB7Ci0gICAgLy8gTm8gT05fQ0FMTCgpIHdhcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIENsZWFycyB0aGUgZGVmYXVsdCBhY3Rpb25zIGZvciBlYWNoIG1vY2sgbWV0aG9kIGluIHRoZSBnaXZlbiBtb2NrCi0gIC8vIG9iamVjdC4KLSAgRnVuY3Rpb25Nb2NrZXJzJiBtb2NrZXJzID0KLSAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdLmZ1bmN0aW9uX21vY2tlcnM7Ci0gIGZvciAoRnVuY3Rpb25Nb2NrZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1vY2tlcnMuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBtb2NrZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgKCppdCktPkNsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKTsKLSAgfQotCi0gIC8vIFdlIGRvbid0IGNsZWFyIHRoZSBjb250ZW50IG9mIG1vY2tlcnMsIGFzIHRoZXkgbWF5IHN0aWxsIGJlCi0gIC8vIG5lZWRlZCBieSBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpLgotfQotCi1FeHBlY3RhdGlvbjo6RXhwZWN0YXRpb24oKSB7fQotCi1FeHBlY3RhdGlvbjo6RXhwZWN0YXRpb24oCi0gICAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mIGFuX2V4cGVjdGF0aW9uX2Jhc2UpCi0gICAgOiBleHBlY3RhdGlvbl9iYXNlXyhhbl9leHBlY3RhdGlvbl9iYXNlKSB7fQotCi1FeHBlY3RhdGlvbjo6fkV4cGVjdGF0aW9uKCkge30KLQotLy8gQWRkcyBhbiBleHBlY3RhdGlvbiB0byBhIHNlcXVlbmNlLgotdm9pZCBTZXF1ZW5jZTo6QWRkRXhwZWN0YXRpb24oY29uc3QgRXhwZWN0YXRpb24mIGV4cGVjdGF0aW9uKSBjb25zdCB7Ci0gIGlmICgqbGFzdF9leHBlY3RhdGlvbl8gIT0gZXhwZWN0YXRpb24pIHsKLSAgICBpZiAobGFzdF9leHBlY3RhdGlvbl8tPmV4cGVjdGF0aW9uX2Jhc2UoKSAhPSBOVUxMKSB7Ci0gICAgICBleHBlY3RhdGlvbi5leHBlY3RhdGlvbl9iYXNlKCktPmltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXwotICAgICAgICAgICs9ICpsYXN0X2V4cGVjdGF0aW9uXzsKLSAgICB9Ci0gICAgKmxhc3RfZXhwZWN0YXRpb25fID0gZXhwZWN0YXRpb247Ci0gIH0KLX0KLQotLy8gQ3JlYXRlcyB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaWYgdGhlcmUgaXNuJ3Qgb25lLgotSW5TZXF1ZW5jZTo6SW5TZXF1ZW5jZSgpIHsKLSAgaWYgKGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLmdldCgpID09IE5VTEwpIHsKLSAgICBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5zZXQobmV3IFNlcXVlbmNlKTsKLSAgICBzZXF1ZW5jZV9jcmVhdGVkXyA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgc2VxdWVuY2VfY3JlYXRlZF8gPSBmYWxzZTsKLSAgfQotfQotCi0vLyBEZWxldGVzIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiBpdCB3YXMgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IKLS8vIG9mIHRoaXMgb2JqZWN0LgotSW5TZXF1ZW5jZTo6fkluU2VxdWVuY2UoKSB7Ci0gIGlmIChzZXF1ZW5jZV9jcmVhdGVkXykgewotICAgIGRlbGV0ZSBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5nZXQoKTsKLSAgICBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5zZXQoTlVMTCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrLmNjIGIvdGVzdGluZy9nbW9jay9zcmMvZ21vY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzZkYWYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay9zcmMvZ21vY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBzdXBwb3J0IHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bwotLy8gY29udHJvbCB0aGUgZmxhZyB2YWx1ZXMsIGxpa2Ugd2hhdCBHb29nbGUgVGVzdCBkb2VzLgotCi1HTU9DS19ERUZJTkVfYm9vbF8oY2F0Y2hfbGVha2VkX21vY2tzLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICJ0cnVlIGlmZiBHb29nbGUgTW9jayBzaG91bGQgcmVwb3J0IGxlYWtlZCBtb2NrIG9iamVjdHMgIgotICAgICAgICAgICAgICAgICAgICJhcyBmYWlsdXJlcy4iKTsKLQotR01PQ0tfREVGSU5FX3N0cmluZ18odmVyYm9zZSwgaW50ZXJuYWw6OmtXYXJuaW5nVmVyYm9zaXR5LAotICAgICAgICAgICAgICAgICAgICAgIkNvbnRyb2xzIGhvdyB2ZXJib3NlIEdvb2dsZSBNb2NrJ3Mgb3V0cHV0IGlzLiIKLSAgICAgICAgICAgICAgICAgICAgICIgIFZhbGlkIHZhbHVlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgICIgIGluZm8gICAgLSBwcmludHMgYWxsIG1lc3NhZ2VzLlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgd2FybmluZyAtIHByaW50cyB3YXJuaW5ncyBhbmQgZXJyb3JzLlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgZXJyb3IgICAtIHByaW50cyBlcnJvcnMgb25seS4iKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlIHRoZQotLy8gZm9ybWF0ICItLWdtb2NrX2ZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlCi0vLyAiPXZhbHVlIiBwYXJ0IGNhbiBiZSBvbWl0dGVkLgotLy8KLS8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLXN0YXRpYyBjb25zdCBjaGFyKiBQYXJzZUdvb2dsZU1vY2tGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgewotICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KLSAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLWdtb2NrXyIuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyID0gc3RkOjpzdHJpbmcoIi0tZ21vY2tfIikgKyBmbGFnOwotICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKLSAgaWYgKGludGVybmFsOjpwb3NpeDo6U3RyTkNtcChzdHIsIGZsYWdfc3RyLmNfc3RyKCksIGZsYWdfbGVuKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCi0gIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47Ci0KLSAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCi0gIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7Ci0gICAgcmV0dXJuIGZsYWdfZW5kOwotICB9Ci0KLSAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCi0gIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCi0gIC8vIHRoZSBmbGFnIG5hbWUuCi0gIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOwotCi0gIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCi0gIHJldHVybiBmbGFnX2VuZCArIDE7Ci19Ci0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBHb29nbGUgTW9jayBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mCi0vLyAiLS1nbW9ja19mbGFnPXZhbHVlIi4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotc3RhdGljIGJvb2wgUGFyc2VHb29nbGVNb2NrQm9vbEZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogdmFsdWUpIHsKLSAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlR29vZ2xlTW9ja0ZsYWdWYWx1ZShzdHIsIGZsYWcsIHRydWUpOwotCi0gIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCi0gIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdmFsdWUgdG8gYSBib29sLgotICAqdmFsdWUgPSAhKCp2YWx1ZV9zdHIgPT0gJzAnIHx8ICp2YWx1ZV9zdHIgPT0gJ2YnIHx8ICp2YWx1ZV9zdHIgPT0gJ0YnKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBHb29nbGUgTW9jayBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKLS8vICItLWdtb2NrX2ZsYWc9dmFsdWUiLgotLy8KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucwotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nPgotc3RhdGljIGJvb2wgUGFyc2VHb29nbGVNb2NrU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyogdmFsdWUpIHsKLSAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlR29vZ2xlTW9ja0ZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKLQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCi0gICp2YWx1ZSA9IHZhbHVlX3N0cjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlTW9jaygpLgotLy8KLS8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yCi0vLyB3Y2hhcl90LgotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotdm9pZCBJbml0R29vZ2xlTW9ja0ltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKLSAgLy8gTWFrZXMgc3VyZSBHb29nbGUgVGVzdCBpcyBpbml0aWFsaXplZC4gIEluaXRHb29nbGVUZXN0KCkgaXMKLSAgLy8gaWRlbXBvdGVudCwgc28gaXQncyBmaW5lIGlmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGNhbGxlZCBpdC4KLSAgSW5pdEdvb2dsZVRlc3QoYXJnYywgYXJndik7Ci0gIGlmICgqYXJnYyA8PSAwKSByZXR1cm47Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgIT0gKmFyZ2M7IGkrKykgewotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19zdHJpbmcgPSBTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSk7Ci0gICAgY29uc3QgY2hhciogY29uc3QgYXJnID0gYXJnX3N0cmluZy5jX3N0cigpOwotCi0gICAgLy8gRG8gd2Ugc2VlIGEgR29vZ2xlIE1vY2sgZmxhZz8KLSAgICBpZiAoUGFyc2VHb29nbGVNb2NrQm9vbEZsYWcoYXJnLCAiY2F0Y2hfbGVha2VkX21vY2tzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkdNT0NLX0ZMQUcoY2F0Y2hfbGVha2VkX21vY2tzKSkgfHwKLSAgICAgICAgUGFyc2VHb29nbGVNb2NrU3RyaW5nRmxhZyhhcmcsICJ2ZXJib3NlIiwgJkdNT0NLX0ZMQUcodmVyYm9zZSkpKSB7Ci0gICAgICAvLyBZZXMuICBTaGlmdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd2IGxpc3QgbGVmdCBieSBvbmUuICBOb3RlCi0gICAgICAvLyB0aGF0IGFyZ3YgaGFzICgqYXJnYyArIDEpIGVsZW1lbnRzLCB0aGUgbGFzdCBvbmUgYWx3YXlzIGJlaW5nCi0gICAgICAvLyBOVUxMLiAgVGhlIGZvbGxvd2luZyBsb29wIG1vdmVzIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnQgYXMKLSAgICAgIC8vIHdlbGwuCi0gICAgICBmb3IgKGludCBqID0gaTsgaiAhPSAqYXJnYzsgaisrKSB7Ci0gICAgICAgIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKLSAgICAgIH0KLQotICAgICAgLy8gRGVjcmVtZW50cyB0aGUgYXJndW1lbnQgY291bnQuCi0gICAgICAoKmFyZ2MpLS07Ci0KLSAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBkZWNyZW1lbnQgdGhlIGl0ZXJhdG9yIGFzIHdlIGp1c3QgcmVtb3ZlZAotICAgICAgLy8gYW4gZWxlbWVudC4KLSAgICAgIGktLTsKLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEluaXRpYWxpemVzIEdvb2dsZSBNb2NrLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUKLS8vIHRlc3RzLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUgZmxhZ3MgdGhhdAotLy8gR29vZ2xlIE1vY2sgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIE1vY2sgZmxhZyBpcyBzZWVuLCBpdCBpcwotLy8gcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KLS8vCi0vLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgTW9jayBmbGFnIHZhcmlhYmxlcyBhcmUKLS8vIHVwZGF0ZWQuCi0vLwotLy8gU2luY2UgR29vZ2xlIFRlc3QgaXMgbmVlZGVkIGZvciBHb29nbGUgTW9jayB0byB3b3JrLCB0aGlzIGZ1bmN0aW9uCi0vLyBhbHNvIGluaXRpYWxpemVzIEdvb2dsZSBUZXN0IGFuZCBwYXJzZXMgaXRzIGZsYWdzLCBpZiB0aGF0IGhhc24ndAotLy8gYmVlbiBkb25lLgotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaW50ZXJuYWw6OkluaXRHb29nbGVNb2NrSW1wbChhcmdjLCBhcmd2KTsKLX0KLQotLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgotLy8gVU5JQ09ERSBtb2RlLgotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKLSAgaW50ZXJuYWw6OkluaXRHb29nbGVNb2NrSW1wbChhcmdjLCBhcmd2KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrX21haW4uY2MgYi90ZXN0aW5nL2dtb2NrL3NyYy9nbW9ja19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDViZTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svc3JjL2dtb2NrX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0vLyBNUyBDKysgY29tcGlsZXIvbGlua2VyIGhhcyBhIGJ1ZyBvbiBXaW5kb3dzIChub3Qgb24gV2luZG93cyBDRSksIHdoaWNoCi0vLyBjYXVzZXMgYSBsaW5rIGVycm9yIHdoZW4gX3RtYWluIGlzIGRlZmluZWQgaW4gYSBzdGF0aWMgbGlicmFyeSBhbmQgVU5JQ09ERQotLy8gaXMgZW5hYmxlZC4gRm9yIHRoaXMgcmVhc29uIGluc3RlYWQgb2YgX3RtYWluLCBtYWluIGZ1bmN0aW9uIGlzIHVzZWQgb24KLS8vIFdpbmRvd3MuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgdG8gdHJhY2sgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMgYnVnOgotLy8gaHR0cDovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svVmlld0ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0zOTQ0NjQgIC8vIE5PTElOVAotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0jIGluY2x1ZGUgPHRjaGFyLmg+ICAvLyBOT0xJTlQKLQotR1RFU1RfQVBJXyBpbnQgX3RtYWluKGludCBhcmdjLCBUQ0hBUioqIGFyZ3YpIHsKLSNlbHNlCi1HVEVTVF9BUElfIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgbWFpbigpIGZyb20gZ21vY2tfbWFpbi5jY1xuIjsKLSAgLy8gU2luY2UgR29vZ2xlIE1vY2sgZGVwZW5kcyBvbiBHb29nbGUgVGVzdCwgSW5pdEdvb2dsZU1vY2soKSBpcwotICAvLyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgR29vZ2xlIFRlc3QuICBUaGVyZWZvcmUgdGhlcmUncwotICAvLyBubyBuZWVkIGZvciBjYWxsaW5nIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkgc2VwYXJhdGVseS4KLSAgdGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOwotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWFjdGlvbnNfdGVzdC5jYyBiL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1hY3Rpb25zX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NjVmYzUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWFjdGlvbnNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0MTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgYnVpbHQtaW4gYWN0aW9ucy4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgotCi1uYW1lc3BhY2UgewotCi0vLyBUaGlzIGxpc3Qgc2hvdWxkIGJlIGtlcHQgc29ydGVkLgotdXNpbmcgdGVzdGluZzo6QWN0aW9uOwotdXNpbmcgdGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlOwotdXNpbmcgdGVzdGluZzo6QXNzaWduOwotdXNpbmcgdGVzdGluZzo6QnlNb3ZlOwotdXNpbmcgdGVzdGluZzo6QnlSZWY7Ci11c2luZyB0ZXN0aW5nOjpEZWZhdWx0VmFsdWU7Ci11c2luZyB0ZXN0aW5nOjpEb0RlZmF1bHQ7Ci11c2luZyB0ZXN0aW5nOjpJZ25vcmVSZXN1bHQ7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2VXaXRob3V0QXJnczsKLXVzaW5nIHRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY0FjdGlvbjsKLXVzaW5nIHRlc3Rpbmc6Ok5lOwotdXNpbmcgdGVzdGluZzo6UG9seW1vcnBoaWNBY3Rpb247Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm5OdWxsOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuUmVmOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuUmVmT2ZDb3B5OwotdXNpbmcgdGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlNldEFyZ3VtZW50UG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpnZXQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2NDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpVSW50NjQ7Ci11c2luZyB0ZXN0aW5nOjptYWtlX3R1cGxlOwotdXNpbmcgdGVzdGluZzo6dHVwbGU7Ci11c2luZyB0ZXN0aW5nOjp0dXBsZV9lbGVtZW50OwotCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi11c2luZyB0ZXN0aW5nOjpTZXRFcnJub0FuZFJldHVybjsKLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX1BST1RPQlVGXwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXNzYWdlOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfUFJPVE9CVUZfCi0KLS8vIFRlc3RzIHRoYXQgQnVpbHRJbkRlZmF1bHRWYWx1ZTxUKj46OkdldCgpIHJldHVybnMgTlVMTC4KLVRFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIElzTnVsbEZvclBvaW50ZXJUeXBlcykgewotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGludCo+OjpHZXQoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBjaGFyKj46OkdldCgpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHZvaWQqPjo6R2V0KCkgPT0gTlVMTCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQnVpbHRJbkRlZmF1bHRWYWx1ZTxUKj46OkV4aXN0cygpIHJldHVybiB0cnVlLgotVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgRXhpc3RzRm9yUG9pbnRlclR5cGVzKSB7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8aW50Kj46OkV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBjaGFyKj46OkV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTx2b2lkKj46OkV4aXN0cygpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSByZXR1cm5zIDAgd2hlbiBUIGlzIGEKLS8vIGJ1aWx0LWluIG51bWVyaWMgdHlwZS4KLVRFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIElzWmVyb0Zvck51bWVyaWNUeXBlcykgewotICBFWFBFQ1RfRVEoMFUsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgY2hhcj46OkdldCgpKTsKLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIGNoYXI+OjpHZXQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPGNoYXI+OjpHZXQoKSk7Ci0jaWYgR01PQ0tfSEFTX1NJR05FRF9XQ0hBUl9UXwotICBFWFBFQ1RfRVEoMFUsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgd2NoYXJfdD46OkdldCgpKTsKLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIHdjaGFyX3Q+OjpHZXQoKSk7Ci0jZW5kaWYKLSNpZiBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8KLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8d2NoYXJfdD46OkdldCgpKTsKLSNlbmRpZgotICBFWFBFQ1RfRVEoMFUsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgc2hvcnQ+OjpHZXQoKSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIHNob3J0Pjo6R2V0KCkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHNob3J0Pjo6R2V0KCkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgwVSwgQnVpbHRJbkRlZmF1bHRWYWx1ZTx1bnNpZ25lZCBpbnQ+OjpHZXQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBpbnQ+OjpHZXQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPGludD46OkdldCgpKTsKLSAgRVhQRUNUX0VRKDBVLCBCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIGxvbmc+OjpHZXQoKSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIGxvbmc+OjpHZXQoKSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8bG9uZz46OkdldCgpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMFUsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VUludDY0Pjo6R2V0KCkpOwotICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxJbnQ2ND46OkdldCgpKTsKLSAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8ZmxvYXQ+OjpHZXQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPGRvdWJsZT46OkdldCgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpFeGlzdHMoKSByZXR1cm5zIHRydWUgd2hlbiBUIGlzIGEKLS8vIGJ1aWx0LWluIG51bWVyaWMgdHlwZS4KLVRFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIEV4aXN0c0Zvck51bWVyaWNUeXBlcykgewotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIGNoYXI+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIGNoYXI+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y2hhcj46OkV4aXN0cygpKTsKLSNpZiBHTU9DS19IQVNfU0lHTkVEX1dDSEFSX1RfCi0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgd2NoYXJfdD46OkV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaWduZWQgd2NoYXJfdD46OkV4aXN0cygpKTsKLSNlbmRpZgotI2lmIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXwotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHdjaGFyX3Q+OjpFeGlzdHMoKSk7Ci0jZW5kaWYKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTx1bnNpZ25lZCBzaG9ydD46OkV4aXN0cygpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBzaG9ydD46OkV4aXN0cygpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHNob3J0Pjo6RXhpc3RzKCkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgaW50Pjo6RXhpc3RzKCkpOwotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBpbnQ+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8aW50Pjo6RXhpc3RzKCkpOwotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIGxvbmc+OjpFeGlzdHMoKSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaWduZWQgbG9uZz46OkV4aXN0cygpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGxvbmc+OjpFeGlzdHMoKSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxVSW50NjQ+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8SW50NjQ+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8ZmxvYXQ+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8ZG91YmxlPjo6RXhpc3RzKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8Ym9vbD46OkdldCgpIHJldHVybnMgZmFsc2UuCi1URVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBJc0ZhbHNlRm9yQm9vbCkgewotICBFWFBFQ1RfRkFMU0UoQnVpbHRJbkRlZmF1bHRWYWx1ZTxib29sPjo6R2V0KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8Ym9vbD46OkV4aXN0cygpIHJldHVybnMgdHJ1ZS4KLVRFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIEJvb2xFeGlzdHMpIHsKLSAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxib29sPjo6RXhpc3RzKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpIHJldHVybnMgIiIgd2hlbiBUIGlzIGEKLS8vIHN0cmluZyB0eXBlLgotVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgSXNFbXB0eVN0cmluZ0ZvclN0cmluZykgewotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0gIEVYUEVDVF9FUSgiIiwgQnVpbHRJbkRlZmF1bHRWYWx1ZTwgOjpzdHJpbmc+OjpHZXQoKSk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgRVhQRUNUX0VRKCIiLCBCdWlsdEluRGVmYXVsdFZhbHVlPCA6OnN0ZDo6c3RyaW5nPjo6R2V0KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkV4aXN0cygpIHJldHVybnMgdHJ1ZSB3aGVuIFQgaXMgYQotLy8gc3RyaW5nIHR5cGUuCi1URVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBFeGlzdHNGb3JTdHJpbmcpIHsKLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPCA6OnN0cmluZz46OkV4aXN0cygpKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLQotICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPCA6OnN0ZDo6c3RyaW5nPjo6RXhpc3RzKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y29uc3QgVD46OkdldCgpIHJldHVybnMgdGhlIHNhbWUKLS8vIHZhbHVlIGFzIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpIGRvZXMuCi1URVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBXb3Jrc0ZvckNvbnN0VHlwZXMpIHsKLSAgRVhQRUNUX0VRKCIiLCBCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IHN0ZDo6c3RyaW5nPjo6R2V0KCkpOwotICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBpbnQ+OjpHZXQoKSk7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y2hhciogY29uc3Q+OjpHZXQoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX0ZBTFNFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y29uc3QgYm9vbD46OkdldCgpKTsKLX0KLQotLy8gQSB0eXBlIHRoYXQncyBkZWZhdWx0IGNvbnN0cnVjdGlibGUuCi1jbGFzcyBNeURlZmF1bHRDb25zdHJ1Y3RpYmxlIHsKLSBwdWJsaWM6Ci0gIE15RGVmYXVsdENvbnN0cnVjdGlibGUoKSA6IHZhbHVlXyg0Mikge30KLQotICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotIHByaXZhdGU6Ci0gIGludCB2YWx1ZV87Ci19OwotCi0vLyBBIHR5cGUgdGhhdCdzIG5vdCBkZWZhdWx0IGNvbnN0cnVjdGlibGUuCi1jbGFzcyBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlIHsKLSBwdWJsaWM6Ci0gIC8vIERvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGN0b3IuCi0gIGV4cGxpY2l0IE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoaW50IGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9Ci0KLSAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSBwcml2YXRlOgotICBpbnQgdmFsdWVfOwotfTsKLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLQotVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgRXhpc3RzRm9yRGVmYXVsdENvbnN0cnVjdGlibGVUeXBlKSB7Ci0gIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8TXlEZWZhdWx0Q29uc3RydWN0aWJsZT46OkV4aXN0cygpKTsKLX0KLQotVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgSXNEZWZhdWx0Q29uc3RydWN0ZWRGb3JEZWZhdWx0Q29uc3RydWN0aWJsZVR5cGUpIHsKLSAgRVhQRUNUX0VRKDQyLCBCdWlsdEluRGVmYXVsdFZhbHVlPE15RGVmYXVsdENvbnN0cnVjdGlibGU+OjpHZXQoKS52YWx1ZSgpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0KLVRFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIERvZXNOb3RFeGlzdEZvck5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlVHlwZSkgewotICBFWFBFQ1RfRkFMU0UoQnVpbHRJbkRlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6RXhpc3RzKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8VCY+OjpHZXQoKSBhYm9ydHMgdGhlIHByb2dyYW0uCi1URVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVEZWF0aFRlc3QsIElzVW5kZWZpbmVkRm9yUmVmZXJlbmNlcykgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKLSAgICBCdWlsdEluRGVmYXVsdFZhbHVlPGludCY+OjpHZXQoKTsKLSAgfSwgIiIpOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKLSAgICBCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IGNoYXImPjo6R2V0KCk7Ci0gIH0sICIiKTsKLX0KLQotVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlRGVhdGhUZXN0LCBJc1VuZGVmaW5lZEZvck5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlVHlwZSkgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKLSAgICBCdWlsdEluRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpHZXQoKTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IERlZmF1bHRWYWx1ZTxUPjo6SXNTZXQoKSBpcyBmYWxzZSBpbml0aWFsbHkuCi1URVNUKERlZmF1bHRWYWx1ZVRlc3QsIElzSW5pdGlhbGx5VW5zZXQpIHsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxpbnQ+OjpJc1NldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeURlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6SXNTZXQoKSk7Ci0gIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OklzU2V0KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IERlZmF1bHRWYWx1ZTxUPiBjYW4gYmUgc2V0IGFuZCB0aGVuIHVuc2V0LgotVEVTVChEZWZhdWx0VmFsdWVUZXN0LCBDYW5CZVNldEFuZFVuc2V0KSB7Ci0gIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxpbnQ+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkV4aXN0cygpKTsKLQotICBEZWZhdWx0VmFsdWU8aW50Pjo6U2V0KDEpOwotICBEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OlNldCgKLSAgICAgIE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoNDIpKTsKLQotICBFWFBFQ1RfRVEoMSwgRGVmYXVsdFZhbHVlPGludD46OkdldCgpKTsKLSAgRVhQRUNUX0VRKDQyLCBEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkdldCgpLnZhbHVlKCkpOwotCi0gIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxpbnQ+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxjb25zdCBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6RXhpc3RzKCkpOwotCi0gIERlZmF1bHRWYWx1ZTxpbnQ+OjpDbGVhcigpOwotICBEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkNsZWFyKCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxpbnQ+OjpJc1NldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxjb25zdCBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6SXNTZXQoKSk7Ci0KLSAgRVhQRUNUX1RSVUUoRGVmYXVsdFZhbHVlPGludD46OkV4aXN0cygpKTsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxjb25zdCBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6RXhpc3RzKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IERlZmF1bHRWYWx1ZTxUPjo6R2V0KCkgcmV0dXJucyB0aGUKLS8vIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpIHdoZW4gRGVmYXVsdFZhbHVlPFQ+OjpJc1NldCgpIGlzCi0vLyBmYWxzZS4KLVRFU1QoRGVmYXVsdFZhbHVlRGVhdGhUZXN0LCBHZXRSZXR1cm5zQnVpbHRJbkRlZmF1bHRWYWx1ZVdoZW5VbnNldCkgewotICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPGludD46OklzU2V0KCkpOwotICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8aW50Pjo6RXhpc3RzKCkpOwotICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpJc1NldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6RXhpc3RzKCkpOwotCi0gIEVYUEVDVF9FUSgwLCBEZWZhdWx0VmFsdWU8aW50Pjo6R2V0KCkpOwotCi0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoewotICAgIERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6R2V0KCk7Ci0gIH0sICIiKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KLVRFU1QoRGVmYXVsdFZhbHVlVGVzdCwgR2V0V29ya3NGb3JNb3ZlT25seUlmU2V0KSB7Ci0gIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj46OkV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoRGVmYXVsdFZhbHVlPHN0ZDo6dW5pcXVlX3B0cjxpbnQ+Pjo6R2V0KCkgPT0gTlVMTCk7Ci0gIERlZmF1bHRWYWx1ZTxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj46OlNldEZhY3RvcnkoW10gewotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8aW50PihuZXcgaW50KDQyKSk7Ci0gIH0pOwotICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8c3RkOjp1bmlxdWVfcHRyPGludD4+OjpFeGlzdHMoKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbnQ+IGkgPSBEZWZhdWx0VmFsdWU8c3RkOjp1bmlxdWVfcHRyPGludD4+OjpHZXQoKTsKLSAgRVhQRUNUX0VRKDQyLCAqaSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KLQotLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8dm9pZD46OkdldCgpIHJldHVybnMgdm9pZC4KLVRFU1QoRGVmYXVsdFZhbHVlVGVzdCwgR2V0V29ya3NGb3JWb2lkKSB7Ci0gIHJldHVybiBEZWZhdWx0VmFsdWU8dm9pZD46OkdldCgpOwotfQotCi0vLyBUZXN0cyB1c2luZyBEZWZhdWx0VmFsdWUgd2l0aCBhIHJlZmVyZW5jZSB0eXBlLgotCi0vLyBUZXN0cyB0aGF0IERlZmF1bHRWYWx1ZTxUJj46OklzU2V0KCkgaXMgZmFsc2UgaW5pdGlhbGx5LgotVEVTVChEZWZhdWx0VmFsdWVPZlJlZmVyZW5jZVRlc3QsIElzSW5pdGlhbGx5VW5zZXQpIHsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxpbnQmPjo6SXNTZXQoKSk7Ci0gIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlEZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpJc1NldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OklzU2V0KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IERlZmF1bHRWYWx1ZTxUJj46OkV4aXN0cyBpcyBmYWxzZSBpbml0aWFsbGx5LgotVEVTVChEZWZhdWx0VmFsdWVPZlJlZmVyZW5jZVRlc3QsIElzSW5pdGlhbGx5Tm90RXhpc3RpbmcpIHsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxpbnQmPjo6RXhpc3RzKCkpOwotICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPE15RGVmYXVsdENvbnN0cnVjdGlibGUmPjo6RXhpc3RzKCkpOwotICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUmPjo6RXhpc3RzKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IERlZmF1bHRWYWx1ZTxUJj4gY2FuIGJlIHNldCBhbmQgdGhlbiB1bnNldC4KLVRFU1QoRGVmYXVsdFZhbHVlT2ZSZWZlcmVuY2VUZXN0LCBDYW5CZVNldEFuZFVuc2V0KSB7Ci0gIGludCBuID0gMTsKLSAgRGVmYXVsdFZhbHVlPGNvbnN0IGludCY+OjpTZXQobik7Ci0gIE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUgeCg0Mik7Ci0gIERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OlNldCh4KTsKLQotICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8Y29uc3QgaW50Jj46OkV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUmPjo6RXhpc3RzKCkpOwotCi0gIEVYUEVDVF9FUSgmbiwgJihEZWZhdWx0VmFsdWU8Y29uc3QgaW50Jj46OkdldCgpKSk7Ci0gIEVYUEVDVF9FUSgmeCwgJihEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpHZXQoKSkpOwotCi0gIERlZmF1bHRWYWx1ZTxjb25zdCBpbnQmPjo6Q2xlYXIoKTsKLSAgRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUmPjo6Q2xlYXIoKTsKLQotICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPGNvbnN0IGludCY+OjpFeGlzdHMoKSk7Ci0gIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpFeGlzdHMoKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxjb25zdCBpbnQmPjo6SXNTZXQoKSk7Ci0gIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpJc1NldCgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VCY+OjpHZXQoKSByZXR1cm5zIHRoZQotLy8gQnVpbHRJbkRlZmF1bHRWYWx1ZTxUJj46OkdldCgpIHdoZW4gRGVmYXVsdFZhbHVlPFQmPjo6SXNTZXQoKSBpcwotLy8gZmFsc2UuCi1URVNUKERlZmF1bHRWYWx1ZU9mUmVmZXJlbmNlRGVhdGhUZXN0LCBHZXRSZXR1cm5zQnVpbHRJbkRlZmF1bHRWYWx1ZVdoZW5VbnNldCkgewotICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPGludCY+OjpJc1NldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OklzU2V0KCkpOwotCi0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoewotICAgIERlZmF1bHRWYWx1ZTxpbnQmPjo6R2V0KCk7Ci0gIH0sICIiKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7Ci0gICAgRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpHZXQoKTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEFjdGlvbkludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgZGVmaW5pbmcgdGhlCi0vLyBQZXJmb3JtIG1ldGhvZC4KLQotdHlwZWRlZiBpbnQgTXlHbG9iYWxGdW5jdGlvbihib29sLCBpbnQpOwotCi1jbGFzcyBNeUFjdGlvbkltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPE15R2xvYmFsRnVuY3Rpb24+IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgaW50IFBlcmZvcm0oY29uc3QgdHVwbGU8Ym9vbCwgaW50PiYgYXJncykgewotICAgIHJldHVybiBnZXQ8MD4oYXJncykgPyBnZXQ8MT4oYXJncykgOiAwOwotICB9Ci19OwotCi1URVNUKEFjdGlvbkludGVyZmFjZVRlc3QsIENhbkJlSW1wbGVtZW50ZWRCeURlZmluaW5nUGVyZm9ybSkgewotICBNeUFjdGlvbkltcGwgbXlfYWN0aW9uX2ltcGw7Ci0gICh2b2lkKW15X2FjdGlvbl9pbXBsOwotfQotCi1URVNUKEFjdGlvbkludGVyZmFjZVRlc3QsIE1ha2VBY3Rpb24pIHsKLSAgQWN0aW9uPE15R2xvYmFsRnVuY3Rpb24+IGFjdGlvbiA9IE1ha2VBY3Rpb24obmV3IE15QWN0aW9uSW1wbCk7Ci0KLSAgLy8gV2hlbiBleGVyY2lzaW5nIHRoZSBQZXJmb3JtKCkgbWV0aG9kIG9mIEFjdGlvbjxGPiwgd2UgbXVzdCBwYXNzCi0gIC8vIGl0IGEgdHVwbGUgd2hvc2Ugc2l6ZSBhbmQgdHlwZSBhcmUgY29tcGF0aWJsZSB3aXRoIEYncyBhcmd1bWVudAotICAvLyB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiBGIGlzIGludCgpLCB0aGVuIFBlcmZvcm0oKSB0YWtlcyBhCi0gIC8vIDAtdHVwbGU7IGlmIEYgaXMgdm9pZChib29sLCBpbnQpLCB0aGVuIFBlcmZvcm0oKSB0YWtlcyBhCi0gIC8vIHR1cGxlPGJvb2wsIGludD4sIGFuZCBzbyBvbi4KLSAgRVhQRUNUX0VRKDUsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgNSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBY3Rpb248Rj4gY2FuIGJlIGNvbnRydWN0ZWQgZnJvbSBhIHBvaW50ZXIgdG8KLS8vIEFjdGlvbkludGVyZmFjZTxGPi4KLVRFU1QoQWN0aW9uVGVzdCwgQ2FuQmVDb25zdHJ1Y3RlZEZyb21BY3Rpb25JbnRlcmZhY2UpIHsKLSAgQWN0aW9uPE15R2xvYmFsRnVuY3Rpb24+IGFjdGlvbihuZXcgTXlBY3Rpb25JbXBsKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBY3Rpb248Rj4gZGVsZWdhdGVzIGFjdHVhbCB3b3JrIHRvIEFjdGlvbkludGVyZmFjZTxGPi4KLVRFU1QoQWN0aW9uVGVzdCwgRGVsZWdhdGVzV29ya1RvQWN0aW9uSW50ZXJmYWNlKSB7Ci0gIGNvbnN0IEFjdGlvbjxNeUdsb2JhbEZ1bmN0aW9uPiBhY3Rpb24obmV3IE15QWN0aW9uSW1wbCk7Ci0KLSAgRVhQRUNUX0VRKDUsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgNSkpKTsKLSAgRVhQRUNUX0VRKDAsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIDEpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQWN0aW9uPEY+IGNhbiBiZSBjb3BpZWQuCi1URVNUKEFjdGlvblRlc3QsIElzQ29weWFibGUpIHsKLSAgQWN0aW9uPE15R2xvYmFsRnVuY3Rpb24+IGExKG5ldyBNeUFjdGlvbkltcGwpOwotICBBY3Rpb248TXlHbG9iYWxGdW5jdGlvbj4gYTIoYTEpOyAgLy8gVGVzdHMgdGhlIGNvcHkgY29uc3RydWN0b3IuCi0KLSAgLy8gYTEgc2hvdWxkIGNvbnRpbnVlIHRvIHdvcmsgYWZ0ZXIgYmVpbmcgY29waWVkIGZyb20uCi0gIEVYUEVDVF9FUSg1LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgNSkpKTsKLSAgRVhQRUNUX0VRKDAsIGExLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSwgMSkpKTsKLQotICAvLyBhMiBzaG91bGQgd29yayBsaWtlIHRoZSBhY3Rpb24gaXQgd2FzIGNvcGllZCBmcm9tLgotICBFWFBFQ1RfRVEoNSwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIDUpKSk7Ci0gIEVYUEVDVF9FUSgwLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIDEpKSk7Ci0KLSAgYTIgPSBhMTsgIC8vIFRlc3RzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgotCi0gIC8vIGExIHNob3VsZCBjb250aW51ZSB0byB3b3JrIGFmdGVyIGJlaW5nIGNvcGllZCBmcm9tLgotICBFWFBFQ1RfRVEoNSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIDUpKSk7Ci0gIEVYUEVDVF9FUSgwLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIDEpKSk7Ci0KLSAgLy8gYTIgc2hvdWxkIHdvcmsgbGlrZSB0aGUgYWN0aW9uIGl0IHdhcyBjb3BpZWQgZnJvbS4KLSAgRVhQRUNUX0VRKDUsIGEyLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCA1KSkpOwotICBFWFBFQ1RfRVEoMCwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCAxKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFuIEFjdGlvbjxGcm9tPiBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCB0byBhCi0vLyBjb21wYXRpYmxlIEFjdGlvbjxUbz4gb2JqZWN0LgotCi1jbGFzcyBJc05vdFplcm8gOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPGJvb2woaW50KT4geyAgLy8gTk9MSU5UCi0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgUGVyZm9ybShjb25zdCB0dXBsZTxpbnQ+JiBhcmcpIHsKLSAgICByZXR1cm4gZ2V0PDA+KGFyZykgIT0gMDsKLSAgfQotfTsKLQotI2lmICFHVEVTVF9PU19TWU1CSUFOCi0vLyBDb21waWxpbmcgdGhpcyB0ZXN0IG9uIE5va2lhJ3MgU3ltYmlhbiBjb21waWxlciBmYWlscyB3aXRoOgotLy8gICdSZXN1bHQnIGlzIG5vdCBhIG1lbWJlciBvZiBjbGFzcyAndGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPGludD4nCi0vLyAgKHBvaW50IG9mIGluc3RhbnRpYXRpb246ICdAdW5uYW1lZEBnbW9ja19hY3Rpb25zX3Rlc3RfY2NAOjoKLS8vICAgICAgQWN0aW9uVGVzdF9DYW5CZUNvbnZlcnRlZFRvT3RoZXJBY3Rpb25UeXBlX1Rlc3Q6OlRlc3RCb2R5KCknKQotLy8gd2l0aCBubyBvYnZpb3VzIGZpeC4KLVRFU1QoQWN0aW9uVGVzdCwgQ2FuQmVDb252ZXJ0ZWRUb090aGVyQWN0aW9uVHlwZSkgewotICBjb25zdCBBY3Rpb248Ym9vbChpbnQpPiBhMShuZXcgSXNOb3RaZXJvKTsgIC8vIE5PTElOVAotICBjb25zdCBBY3Rpb248aW50KGNoYXIpPiBhMiA9IEFjdGlvbjxpbnQoY2hhcik+KGExKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKCdhJykpKTsKLSAgRVhQRUNUX0VRKDAsIGEyLlBlcmZvcm0obWFrZV90dXBsZSgnXDAnKSkpOwotfQotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgotCi0vLyBUaGUgZm9sbG93aW5nIHR3byBjbGFzc2VzIGFyZSBmb3IgdGVzdGluZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKS4KLQotLy8gSW1wbGVtZW50cyBhIHBvbHltb3JwaGljIGFjdGlvbiB0aGF0IHJldHVybnMgdGhlIHNlY29uZCBvZiB0aGUKLS8vIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4KLWNsYXNzIFJldHVyblNlY29uZEFyZ3VtZW50QWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIFdlIHdhbnQgdG8gdmVyaWZ5IHRoYXQgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkgY2FuIHdvcmsgd2l0aCBhCi0gIC8vIHBvbHltb3JwaGljIGFjdGlvbiB3aG9zZSBQZXJmb3JtKCkgbWV0aG9kIHRlbXBsYXRlIGlzIGVpdGhlcgotICAvLyBjb25zdCBvciBub3QuICBUaGlzIGxldHMgdXMgdmVyaWZ5IHRoZSBub24tY29uc3QgY2FzZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeyByZXR1cm4gZ2V0PDE+KGFyZ3MpOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIGEgcG9seW1vcnBoaWMgYWN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBudWxsYXJ5Ci0vLyBmdW5jdGlvbiB0byByZXR1cm4gMC4KLWNsYXNzIFJldHVyblplcm9Gcm9tTnVsbGFyeUZ1bmN0aW9uQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIEZvciB0ZXN0aW5nIHRoYXQgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkgd29ya3Mgd2hlbiB0aGUKLSAgLy8gaW1wbGVtZW50YXRpb24gY2xhc3MnIFBlcmZvcm0oKSBtZXRob2QgdGVtcGxhdGUgdGFrZXMgb25seSBvbmUKLSAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyLgotICAvLwotICAvLyBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIGNhbiB3b3JrIHdpdGggYQotICAvLyBwb2x5bW9ycGhpYyBhY3Rpb24gd2hvc2UgUGVyZm9ybSgpIG1ldGhvZCB0ZW1wbGF0ZSBpcyBlaXRoZXIKLSAgLy8gY29uc3Qgb3Igbm90LiAgVGhpcyBsZXRzIHVzIHZlcmlmeSB0aGUgY29uc3QgY2FzZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdD4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgdHVwbGU8PiYpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLX07Ci0KLS8vIFRoZXNlIGZ1bmN0aW9ucyB2ZXJpZnkgdGhhdCBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSByZXR1cm5zIGEKLS8vIFBvbHltb3JwaGljQWN0aW9uPFQ+IHdoZXJlIFQgaXMgdGhlIGFyZ3VtZW50J3MgdHlwZS4KLQotUG9seW1vcnBoaWNBY3Rpb248UmV0dXJuU2Vjb25kQXJndW1lbnRBY3Rpb24+IFJldHVyblNlY29uZEFyZ3VtZW50KCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKFJldHVyblNlY29uZEFyZ3VtZW50QWN0aW9uKCkpOwotfQotCi1Qb2x5bW9ycGhpY0FjdGlvbjxSZXR1cm5aZXJvRnJvbU51bGxhcnlGdW5jdGlvbkFjdGlvbj4KLVJldHVyblplcm9Gcm9tTnVsbGFyeUZ1bmN0aW9uKCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKFJldHVyblplcm9Gcm9tTnVsbGFyeUZ1bmN0aW9uQWN0aW9uKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIHR1cm5zIGEgcG9seW1vcnBoaWMgYWN0aW9uCi0vLyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpbnRvIGEgcG9seW1vcnBoaWMgYWN0aW9uLgotVEVTVChNYWtlUG9seW1vcnBoaWNBY3Rpb25UZXN0LCBDb25zdHJ1Y3RzQWN0aW9uRnJvbUltcGwpIHsKLSAgQWN0aW9uPGludChib29sLCBpbnQsIGRvdWJsZSk+IGExID0gUmV0dXJuU2Vjb25kQXJndW1lbnQoKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoNSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCA1LCAyLjApKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkgd29ya3Mgd2hlbiB0aGUgaW1wbGVtZW50YXRpb24KLS8vIGNsYXNzJyBQZXJmb3JtKCkgbWV0aG9kIHRlbXBsYXRlIGhhcyBvbmx5IG9uZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCi1URVNUKE1ha2VQb2x5bW9ycGhpY0FjdGlvblRlc3QsIFdvcmtzV2hlblBlcmZvcm1IYXNPbmVUZW1wbGF0ZVBhcmFtZXRlcikgewotICBBY3Rpb248aW50KCk+IGExID0gUmV0dXJuWmVyb0Zyb21OdWxsYXJ5RnVuY3Rpb24oKTsKLSAgRVhQRUNUX0VRKDAsIGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0KLSAgQWN0aW9uPHZvaWQqKCk+IGEyID0gUmV0dXJuWmVyb0Zyb21OdWxsYXJ5RnVuY3Rpb24oKTsKLSAgRVhQRUNUX1RSVUUoYTIuUGVyZm9ybShtYWtlX3R1cGxlKCkpID09IE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJldHVybigpIHdvcmtzIGFzIGFuIGFjdGlvbiBmb3Igdm9pZC1yZXR1cm5pbmcKLS8vIGZ1bmN0aW9ucy4KLVRFU1QoUmV0dXJuVGVzdCwgV29ya3NGb3JWb2lkKSB7Ci0gIGNvbnN0IEFjdGlvbjx2b2lkKGludCk+IHJldCA9IFJldHVybigpOyAgLy8gTk9MSU5UCi0gIHJldHVybiByZXQuUGVyZm9ybShtYWtlX3R1cGxlKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSZXR1cm4odikgcmV0dXJucyB2LgotVEVTVChSZXR1cm5UZXN0LCBSZXR1cm5zR2l2ZW5WYWx1ZSkgewotICBBY3Rpb248aW50KCk+IHJldCA9IFJldHVybigxKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgcmV0LlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0KLSAgcmV0ID0gUmV0dXJuKC01KTsKLSAgRVhQRUNUX0VRKC01LCByZXQuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSZXR1cm4oInN0cmluZyBsaXRlcmFsIikgd29ya3MuCi1URVNUKFJldHVyblRlc3QsIEFjY2VwdHNTdHJpbmdMaXRlcmFsKSB7Ci0gIEFjdGlvbjxjb25zdCBjaGFyKigpPiBhMSA9IFJldHVybigiSGVsbG8iKTsKLSAgRVhQRUNUX1NUUkVRKCJIZWxsbyIsIGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0KLSAgQWN0aW9uPHN0ZDo6c3RyaW5nKCk+IGEyID0gUmV0dXJuKCJ3b3JsZCIpOwotICBFWFBFQ1RfRVEoIndvcmxkIiwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotLy8gVGVzdCBzdHJ1Y3Qgd2hpY2ggd3JhcHMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMuIFVzZWQgaW4KLS8vICdTdXBwb3J0c1dyYXBwZXJSZXR1cm5UeXBlJyB0ZXN0Lgotc3RydWN0IEludGVnZXJWZWN0b3JXcmFwcGVyIHsKLSAgc3RkOjp2ZWN0b3I8aW50PiAqIHY7Ci0gIEludGVnZXJWZWN0b3JXcmFwcGVyKHN0ZDo6dmVjdG9yPGludD4mIF92KSA6IHYoJl92KSB7fSAgLy8gTk9MSU5UCi19OwotCi0vLyBUZXN0cyB0aGF0IFJldHVybigpIHdvcmtzIHdoZW4gcmV0dXJuIHR5cGUgaXMgYSB3cmFwcGVyIHR5cGUuCi1URVNUKFJldHVyblRlc3QsIFN1cHBvcnRzV3JhcHBlclJldHVyblR5cGUpIHsKLSAgLy8gSW5pdGlhbGl6ZSB2ZWN0b3Igb2YgaW50ZWdlcnMuCi0gIHN0ZDo6dmVjdG9yPGludD4gdjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHYucHVzaF9iYWNrKGkpOwotCi0gIC8vIFJldHVybigpIGNhbGxlZCB3aXRoICd2JyBhcyBhcmd1bWVudC4gVGhlIEFjdGlvbiB3aWxsIHJldHVybiB0aGUgc2FtZSBkYXRhCi0gIC8vIGFzICd2JyAoY29weSkgYnV0IGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBhbiBJbnRlZ2VyVmVjdG9yV3JhcHBlci4KLSAgQWN0aW9uPEludGVnZXJWZWN0b3JXcmFwcGVyKCk+IGEgPSBSZXR1cm4odik7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHJlc3VsdCA9ICooYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkudik7Ci0gIEVYUEVDVF9USEFUKHJlc3VsdCwgOjp0ZXN0aW5nOjpFbGVtZW50c0FyZSgwLCAxLCAyLCAzLCA0KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmV0dXJuKHYpIGlzIGNvdmFyYWludC4KLQotc3RydWN0IEJhc2UgewotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQmFzZSYpIHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLXN0cnVjdCBEZXJpdmVkIDogcHVibGljIEJhc2UgewotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVyaXZlZCYpIHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLVRFU1QoUmV0dXJuVGVzdCwgSXNDb3ZhcmlhbnQpIHsKLSAgQmFzZSBiYXNlOwotICBEZXJpdmVkIGRlcml2ZWQ7Ci0gIEFjdGlvbjxCYXNlKigpPiByZXQgPSBSZXR1cm4oJmJhc2UpOwotICBFWFBFQ1RfRVEoJmJhc2UsIHJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotCi0gIHJldCA9IFJldHVybigmZGVyaXZlZCk7Ci0gIEVYUEVDVF9FUSgmZGVyaXZlZCwgcmV0LlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHBhc3NlZCBpbnRvIFJldHVybiBpcyBjb252ZXJ0ZWQgaW50byBUCi0vLyB3aGVuIHRoZSBhY3Rpb24gaXMgY2FzdCB0byBBY3Rpb248VCguLi4pPiByYXRoZXIgdGhhbiB3aGVuIHRoZSBhY3Rpb24gaXMKLS8vIHBlcmZvcm1lZC4gU2VlIGNvbW1lbnRzIG9uIHRlc3Rpbmc6OmludGVybmFsOjpSZXR1cm5BY3Rpb24gaW4KLS8vIGdtb2NrLWFjdGlvbnMuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWNsYXNzIEZyb21UeXBlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEZyb21UeXBlKGJvb2wqIGlzX2NvbnZlcnRlZCkgOiBjb252ZXJ0ZWRfKGlzX2NvbnZlcnRlZCkge30KLSAgYm9vbCogY29udmVydGVkKCkgY29uc3QgeyByZXR1cm4gY29udmVydGVkXzsgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCogY29uc3QgY29udmVydGVkXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEZyb21UeXBlKTsKLX07Ci0KLWNsYXNzIFRvVHlwZSB7Ci0gcHVibGljOgotICAvLyBNdXN0IGFsbG93IGltcGxpY2l0IGNvbnZlcnNpb24gZHVlIHRvIHVzZSBpbiBJbXBsaWNpdENhc3RfPFQ+LgotICBUb1R5cGUoY29uc3QgRnJvbVR5cGUmIHgpIHsgKnguY29udmVydGVkKCkgPSB0cnVlOyB9ICAvLyBOT0xJTlQKLX07Ci0KLVRFU1QoUmV0dXJuVGVzdCwgQ29udmVydHNBcmd1bWVudFdoZW5Db252ZXJ0ZWQpIHsKLSAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKLSAgRnJvbVR5cGUgeCgmY29udmVydGVkKTsKLSAgQWN0aW9uPFRvVHlwZSgpPiBhY3Rpb24oUmV0dXJuKHgpKTsKLSAgRVhQRUNUX1RSVUUoY29udmVydGVkKSA8PCAiUmV0dXJuIG11c3QgY29udmVydCBpdHMgYXJndW1lbnQgaW4gaXRzIG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgImNvbnZlcnNpb24gb3BlcmF0b3IuIjsKLSAgY29udmVydGVkID0gZmFsc2U7Ci0gIGFjdGlvbi5QZXJmb3JtKHR1cGxlPD4oKSk7Ci0gIEVYUEVDVF9GQUxTRShjb252ZXJ0ZWQpIDw8ICJBY3Rpb24gbXVzdCBOT1QgY29udmVydCBpdHMgYXJndW1lbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAid2hlbiBwZXJmb3JtZWQuIjsKLX0KLQotY2xhc3MgRGVzdGluYXRpb25UeXBlIHt9OwotCi1jbGFzcyBTb3VyY2VUeXBlIHsKLSBwdWJsaWM6Ci0gIC8vIE5vdGU6IGEgbm9uLWNvbnN0IHR5cGVjYXN0IG9wZXJhdG9yLgotICBvcGVyYXRvciBEZXN0aW5hdGlvblR5cGUoKSB7IHJldHVybiBEZXN0aW5hdGlvblR5cGUoKTsgfQotfTsKLQotVEVTVChSZXR1cm5UZXN0LCBDYW5Db252ZXJ0QXJndW1lbnRVc2luZ05vbkNvbnN0VHlwZUNhc3RPcGVyYXRvcikgewotICBTb3VyY2VUeXBlIHM7Ci0gIEFjdGlvbjxEZXN0aW5hdGlvblR5cGUoKT4gYWN0aW9uKFJldHVybihzKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmV0dXJuTnVsbCgpIHJldHVybnMgTlVMTCBpbiBhIHBvaW50ZXItcmV0dXJuaW5nIGZ1bmN0aW9uLgotVEVTVChSZXR1cm5OdWxsVGVzdCwgV29ya3NJblBvaW50ZXJSZXR1cm5pbmdGdW5jdGlvbikgewotICBjb25zdCBBY3Rpb248aW50KigpPiBhMSA9IFJldHVybk51bGwoKTsKLSAgRVhQRUNUX1RSVUUoYTEuUGVyZm9ybShtYWtlX3R1cGxlKCkpID09IE5VTEwpOwotCi0gIGNvbnN0IEFjdGlvbjxjb25zdCBjaGFyKihib29sKT4gYTIgPSBSZXR1cm5OdWxsKCk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX1RSVUUoYTIuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUpKSA9PSBOVUxMKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KLS8vIFRlc3RzIHRoYXQgUmV0dXJuTnVsbCgpIHJldHVybnMgTlVMTCBmb3Igc2hhcmVkX3B0ciBhbmQgdW5pcXVlX3B0ciByZXR1cm5pbmcKLS8vIGZ1bmN0aW9ucy4KLVRFU1QoUmV0dXJuTnVsbFRlc3QsIFdvcmtzSW5TbWFydFBvaW50ZXJSZXR1cm5pbmdGdW5jdGlvbikgewotICBjb25zdCBBY3Rpb248c3RkOjp1bmlxdWVfcHRyPGNvbnN0IGludD4oKT4gYTEgPSBSZXR1cm5OdWxsKCk7Ci0gIEVYUEVDVF9UUlVFKGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSA9PSBudWxscHRyKTsKLQotICBjb25zdCBBY3Rpb248c3RkOjpzaGFyZWRfcHRyPGludD4oc3RkOjpzdHJpbmcpPiBhMiA9IFJldHVybk51bGwoKTsKLSAgRVhQRUNUX1RSVUUoYTIuUGVyZm9ybShtYWtlX3R1cGxlKCJmb28iKSkgPT0gbnVsbHB0cik7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KLQotLy8gVGVzdHMgdGhhdCBSZXR1cm5SZWYodikgd29ya3MgZm9yIHJlZmVyZW5jZSB0eXBlcy4KLVRFU1QoUmV0dXJuUmVmVGVzdCwgV29ya3NGb3JSZWZlcmVuY2UpIHsKLSAgY29uc3QgaW50IG4gPSAwOwotICBjb25zdCBBY3Rpb248Y29uc3QgaW50Jihib29sKT4gcmV0ID0gUmV0dXJuUmVmKG4pOyAgLy8gTk9MSU5UCi0KLSAgRVhQRUNUX0VRKCZuLCAmcmV0LlBlcmZvcm0obWFrZV90dXBsZSh0cnVlKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJldHVyblJlZih2KSBpcyBjb3ZhcmlhbnQuCi1URVNUKFJldHVyblJlZlRlc3QsIElzQ292YXJpYW50KSB7Ci0gIEJhc2UgYmFzZTsKLSAgRGVyaXZlZCBkZXJpdmVkOwotICBBY3Rpb248QmFzZSYoKT4gYSA9IFJldHVyblJlZihiYXNlKTsKLSAgRVhQRUNUX0VRKCZiYXNlLCAmYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotCi0gIGEgPSBSZXR1cm5SZWYoZGVyaXZlZCk7Ci0gIEVYUEVDVF9FUSgmZGVyaXZlZCwgJmEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSZXR1cm5SZWZPZkNvcHkodikgd29ya3MgZm9yIHJlZmVyZW5jZSB0eXBlcy4KLVRFU1QoUmV0dXJuUmVmT2ZDb3B5VGVzdCwgV29ya3NGb3JSZWZlcmVuY2UpIHsKLSAgaW50IG4gPSA0MjsKLSAgY29uc3QgQWN0aW9uPGNvbnN0IGludCYoKT4gcmV0ID0gUmV0dXJuUmVmT2ZDb3B5KG4pOwotCi0gIEVYUEVDVF9ORSgmbiwgJnJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotICBFWFBFQ1RfRVEoNDIsIHJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotCi0gIG4gPSA0MzsKLSAgRVhQRUNUX05FKCZuLCAmcmV0LlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0gIEVYUEVDVF9FUSg0MiwgcmV0LlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmV0dXJuUmVmT2ZDb3B5KHYpIGlzIGNvdmFyaWFudC4KLVRFU1QoUmV0dXJuUmVmT2ZDb3B5VGVzdCwgSXNDb3ZhcmlhbnQpIHsKLSAgQmFzZSBiYXNlOwotICBEZXJpdmVkIGRlcml2ZWQ7Ci0gIEFjdGlvbjxCYXNlJigpPiBhID0gUmV0dXJuUmVmT2ZDb3B5KGJhc2UpOwotICBFWFBFQ1RfTkUoJmJhc2UsICZhLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0KLSAgYSA9IFJldHVyblJlZk9mQ29weShkZXJpdmVkKTsKLSAgRVhQRUNUX05FKCZkZXJpdmVkLCAmYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IERvRGVmYXVsdCgpIGRvZXMgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgbW9jayBtZXRob2QuCi0KLWNsYXNzIE1vY2tDbGFzcyB7Ci0gcHVibGljOgotICBNb2NrQ2xhc3MoKSB7fQotCi0gIE1PQ0tfTUVUSE9EMShJbnRGdW5jLCBpbnQoYm9vbCBmbGFnKSk7ICAvLyBOT0xJTlQKLSAgTU9DS19NRVRIT0QwKEZvbywgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSgpKTsKLSNpZiBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCi0gIE1PQ0tfTUVUSE9EMChNYWtlVW5pcXVlLCBzdGQ6OnVuaXF1ZV9wdHI8aW50PigpKTsKLSAgTU9DS19NRVRIT0QwKE1ha2VVbmlxdWVCYXNlLCBzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4oKSk7Ci0gIE1PQ0tfTUVUSE9EMChNYWtlVmVjdG9yVW5pcXVlLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4oKSk7Ci0jZW5kaWYKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0NsYXNzKTsKLX07Ci0KLS8vIFRlc3RzIHRoYXQgRG9EZWZhdWx0KCkgcmV0dXJucyB0aGUgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0vLyByZXR1cm4gdHlwZSBieSBkZWZhdWx0LgotVEVTVChEb0RlZmF1bHRUZXN0LCBSZXR1cm5zQnVpbHRJbkRlZmF1bHRWYWx1ZUJ5RGVmYXVsdCkgewotICBNb2NrQ2xhc3MgbW9jazsKLSAgRVhQRUNUX0NBTEwobW9jaywgSW50RnVuYyhfKSkKLSAgICAgIC5XaWxsT25jZShEb0RlZmF1bHQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtb2NrLkludEZ1bmModHJ1ZSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IERvRGVmYXVsdCgpIHRocm93cyAod2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkKSBvciBhYm9ydHMKLS8vIHRoZSBwcm9jZXNzIHdoZW4gdGhlcmUgaXMgbm8gYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHJldHVybiB0eXBlLgotVEVTVChEb0RlZmF1bHREZWF0aFRlc3QsIERpZXNGb3JVbmtub3dUeXBlKSB7Ci0gIE1vY2tDbGFzcyBtb2NrOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShEb0RlZmF1bHQoKSk7Ci0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgRVhQRUNUX0FOWV9USFJPVyhtb2NrLkZvbygpKTsKLSNlbHNlCi0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoewotICAgIG1vY2suRm9vKCk7Ci0gIH0sICIiKTsKLSNlbmRpZgotfQotCi0vLyBUZXN0cyB0aGF0IHVzaW5nIERvRGVmYXVsdCgpIGluc2lkZSBhIGNvbXBvc2l0ZSBhY3Rpb24gbGVhZHMgdG8gYQotLy8gcnVuLXRpbWUgZXJyb3IuCi0KLXZvaWQgVm9pZEZ1bmMoYm9vbCAvKiBmbGFnICovKSB7fQotCi1URVNUKERvRGVmYXVsdERlYXRoVGVzdCwgRGllc0lmVXNlZEluQ29tcG9zaXRlQWN0aW9uKSB7Ci0gIE1vY2tDbGFzcyBtb2NrOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBJbnRGdW5jKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KERvQWxsKEludm9rZShWb2lkRnVuYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9EZWZhdWx0KCkpKTsKLQotICAvLyBJZGVhbGx5IHdlIHNob3VsZCB2ZXJpZnkgdGhlIGVycm9yIG1lc3NhZ2UgYXMgd2VsbC4gIFNhZGx5LAotICAvLyBFWFBFQ1RfREVBVEgoKSBjYW4gb25seSBjYXB0dXJlIHN0ZGVyciwgd2hpbGUgR29vZ2xlIE1vY2sncwotICAvLyBlcnJvcnMgYXJlIHByaW50ZWQgb24gc3Rkb3V0LiAgVGhlcmVmb3JlIHdlIGhhdmUgdG8gc2V0dGxlIGZvcgotICAvLyBub3QgdmVyaWZ5aW5nIHRoZSBtZXNzYWdlLgotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKLSAgICBtb2NrLkludEZ1bmModHJ1ZSk7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBEb0RlZmF1bHQoKSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHNldCBieQotLy8gRGVmYXVsdFZhbHVlPFQ+OjpTZXQoKSB3aGVuIGl0J3Mgbm90IG92ZXJyaWRlbiBieSBhbiBPTl9DQUxMKCkuCi1URVNUKERvRGVmYXVsdFRlc3QsIFJldHVybnNVc2VyU3BlY2lmaWVkUGVyVHlwZURlZmF1bHRWYWx1ZVdoZW5UaGVyZUlzT25lKSB7Ci0gIERlZmF1bHRWYWx1ZTxpbnQ+OjpTZXQoMSk7Ci0gIE1vY2tDbGFzcyBtb2NrOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBJbnRGdW5jKF8pKQotICAgICAgLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKLSAgRVhQRUNUX0VRKDEsIG1vY2suSW50RnVuYyhmYWxzZSkpOwotICBEZWZhdWx0VmFsdWU8aW50Pjo6Q2xlYXIoKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBEb0RlZmF1bHQoKSBkb2VzIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGJ5IE9OX0NBTEwoKS4KLVRFU1QoRG9EZWZhdWx0VGVzdCwgRG9lc1doYXRPbkNhbGxTcGVjaWZpZXMpIHsKLSAgTW9ja0NsYXNzIG1vY2s7Ci0gIE9OX0NBTEwobW9jaywgSW50RnVuYyhfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigyKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2ssIEludEZ1bmMoXykpCi0gICAgICAuV2lsbE9uY2UoRG9EZWZhdWx0KCkpOwotICBFWFBFQ1RfRVEoMiwgbW9jay5JbnRGdW5jKGZhbHNlKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdXNpbmcgRG9EZWZhdWx0KCkgaW4gT05fQ0FMTCgpIGxlYWRzIHRvIGEgcnVuLXRpbWUgZmFpbHVyZS4KLVRFU1QoRG9EZWZhdWx0VGVzdCwgQ2Fubm90QmVVc2VkSW5PbkNhbGwpIHsKLSAgTW9ja0NsYXNzIG1vY2s7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIE9OX0NBTEwobW9jaywgSW50RnVuYyhfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KERvRGVmYXVsdCgpKTsKLSAgfSwgIkRvRGVmYXVsdCgpIGNhbm5vdCBiZSB1c2VkIGluIE9OX0NBTEwoKSIpOwotfQotCi0vLyBUZXN0cyB0aGF0IFNldEFyZ1BvaW50ZWU8Tj4odikgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieQotLy8gdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIHYuCi1URVNUKFNldEFyZ1BvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZSkgewotICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBpbnQqLCBjaGFyKik7Ci0gIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJnUG9pbnRlZTwxPigyKTsKLQotICBpbnQgbiA9IDA7Ci0gIGNoYXIgY2ggPSAnXDAnOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmbiwgJmNoKSk7Ci0gIEVYUEVDVF9FUSgyLCBuKTsKLSAgRVhQRUNUX0VRKCdcMCcsIGNoKTsKLQotICBhID0gU2V0QXJnUG9pbnRlZTwyPignYScpOwotICBuID0gMDsKLSAgY2ggPSAnXDAnOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmbiwgJmNoKSk7Ci0gIEVYUEVDVF9FUSgwLCBuKTsKLSAgRVhQRUNUX0VRKCdhJywgY2gpOwotfQotCi0jaWYgISgoR1RFU1RfR0NDX1ZFUl8gJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDAwMCkgfHwgR1RFU1RfT1NfU1lNQklBTikKLS8vIFRlc3RzIHRoYXQgU2V0QXJnUG9pbnRlZTxOPigpIGFjY2VwdHMgYSBzdHJpbmcgbGl0ZXJhbC4KLS8vIEdDQyBwcmlvciB0byB2NC4wIGFuZCB0aGUgU3ltYmlhbiBjb21waWxlciBkbyBub3Qgc3VwcG9ydCB0aGlzLgotVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgQWNjZXB0c1N0cmluZ0xpdGVyYWwpIHsKLSAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oc3RkOjpzdHJpbmcqLCBjb25zdCBjaGFyKiopOwotICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFyZ1BvaW50ZWU8MD4oImhpIik7Ci0gIHN0ZDo6c3RyaW5nIHN0cjsKLSAgY29uc3QgY2hhciogcHRyID0gTlVMTDsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJnN0ciwgJnB0cikpOwotICBFWFBFQ1RfRVEoImhpIiwgc3RyKTsKLSAgRVhQRUNUX1RSVUUocHRyID09IE5VTEwpOwotCi0gIGEgPSBTZXRBcmdQb2ludGVlPDE+KCJ3b3JsZCIpOwotICBzdHIgPSAiIjsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJnN0ciwgJnB0cikpOwotICBFWFBFQ1RfRVEoIiIsIHN0cik7Ci0gIEVYUEVDVF9TVFJFUSgid29ybGQiLCBwdHIpOwotfQotCi1URVNUKFNldEFyZ1BvaW50ZWVUZXN0LCBBY2NlcHRzV2lkZVN0cmluZ0xpdGVyYWwpIHsKLSAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oY29uc3Qgd2NoYXJfdCoqKTsKLSAgQWN0aW9uPE15RnVuY3Rpb24+IGEgPSBTZXRBcmdQb2ludGVlPDA+KEwid29ybGQiKTsKLSAgY29uc3Qgd2NoYXJfdCogcHRyID0gTlVMTDsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJnB0cikpOwotICBFWFBFQ1RfU1RSRVEoTCJ3b3JsZCIsIHB0cik7Ci0KLSMgaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLSAgdHlwZWRlZiB2b2lkIE15U3RyaW5nRnVuY3Rpb24oc3RkOjp3c3RyaW5nKik7Ci0gIEFjdGlvbjxNeVN0cmluZ0Z1bmN0aW9uPiBhMiA9IFNldEFyZ1BvaW50ZWU8MD4oTCJ3b3JsZCIpOwotICBzdGQ6OndzdHJpbmcgc3RyID0gTCIiOwotICBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoJnN0cikpOwotICBFWFBFQ1RfRVEoTCJ3b3JsZCIsIHN0cik7Ci0KLSMgZW5kaWYKLX0KLSNlbmRpZgotCi0vLyBUZXN0cyB0aGF0IFNldEFyZ1BvaW50ZWU8Tj4oKSBhY2NlcHRzIGEgY2hhciBwb2ludGVyLgotVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgQWNjZXB0c0NoYXJQb2ludGVyKSB7Ci0gIHR5cGVkZWYgdm9pZCBNeUZ1bmN0aW9uKGJvb2wsIHN0ZDo6c3RyaW5nKiwgY29uc3QgY2hhcioqKTsKLSAgY29uc3QgY2hhciogY29uc3QgaGkgPSAiaGkiOwotICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFyZ1BvaW50ZWU8MT4oaGkpOwotICBzdGQ6OnN0cmluZyBzdHI7Ci0gIGNvbnN0IGNoYXIqIHB0ciA9IE5VTEw7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZzdHIsICZwdHIpKTsKLSAgRVhQRUNUX0VRKCJoaSIsIHN0cik7Ci0gIEVYUEVDVF9UUlVFKHB0ciA9PSBOVUxMKTsKLQotICBjaGFyIHdvcmxkX2FycmF5W10gPSAid29ybGQiOwotICBjaGFyKiBjb25zdCB3b3JsZCA9IHdvcmxkX2FycmF5OwotICBhID0gU2V0QXJnUG9pbnRlZTwyPih3b3JsZCk7Ci0gIHN0ciA9ICIiOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmc3RyLCAmcHRyKSk7Ci0gIEVYUEVDVF9FUSgiIiwgc3RyKTsKLSAgRVhQRUNUX0VRKHdvcmxkLCBwdHIpOwotfQotCi1URVNUKFNldEFyZ1BvaW50ZWVUZXN0LCBBY2NlcHRzV2lkZUNoYXJQb2ludGVyKSB7Ci0gIHR5cGVkZWYgdm9pZCBNeUZ1bmN0aW9uKGJvb2wsIGNvbnN0IHdjaGFyX3QqKik7Ci0gIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGhpID0gTCJoaSI7Ci0gIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJnUG9pbnRlZTwxPihoaSk7Ci0gIGNvbnN0IHdjaGFyX3QqIHB0ciA9IE5VTEw7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZwdHIpKTsKLSAgRVhQRUNUX0VRKGhpLCBwdHIpOwotCi0jIGlmIEdURVNUX0hBU19TVERfV1NUUklORwotCi0gIHR5cGVkZWYgdm9pZCBNeVN0cmluZ0Z1bmN0aW9uKGJvb2wsIHN0ZDo6d3N0cmluZyopOwotICB3Y2hhcl90IHdvcmxkX2FycmF5W10gPSBMIndvcmxkIjsKLSAgd2NoYXJfdCogY29uc3Qgd29ybGQgPSB3b3JsZF9hcnJheTsKLSAgQWN0aW9uPE15U3RyaW5nRnVuY3Rpb24+IGEyID0gU2V0QXJnUG9pbnRlZTwxPih3b3JsZCk7Ci0gIHN0ZDo6d3N0cmluZyBzdHI7Ci0gIGEyLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmc3RyKSk7Ci0gIEVYUEVDVF9FUSh3b3JsZF9hcnJheSwgc3RyKTsKLSMgZW5kaWYKLX0KLQotI2lmIEdURVNUX0hBU19QUk9UT0JVRl8KLQotLy8gVGVzdHMgdGhhdCBTZXRBcmdQb2ludGVlPE4+KHByb3RvX2J1ZmZlcikgc2V0cyB0aGUgdjEgcHJvdG9idWYKLS8vIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIHByb3RvX2J1ZmZlci4KLVRFU1QoU2V0QXJnUG9pbnRlZVRlc3QsIFNldHNUaGVOdGhQb2ludGVlT2ZQcm90b0J1ZmZlclR5cGUpIHsKLSAgVGVzdE1lc3NhZ2UqIGNvbnN0IG1zZyA9IG5ldyBUZXN0TWVzc2FnZTsKLSAgbXNnLT5zZXRfbWVtYmVyKCJ5ZXMiKTsKLSAgVGVzdE1lc3NhZ2Ugb3JpZ19tc2c7Ci0gIG9yaWdfbXNnLkNvcHlGcm9tKCptc2cpOwotCi0gIEFjdGlvbjx2b2lkKGJvb2wsIFRlc3RNZXNzYWdlKik+IGEgPSBTZXRBcmdQb2ludGVlPDE+KCptc2cpOwotICAvLyBTZXRBcmdQb2ludGVlPE4+KHByb3RvX2J1ZmZlcikgbWFrZXMgYSBjb3B5IG9mIHByb3RvX2J1ZmZlcgotICAvLyBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBwcm90b19idWZmZXIgaGFzCi0gIC8vIGRpZWQuICBXZSBlbnN1cmUgdGhpcyBiZWhhdmlvciBieSBkZWxldGluZyBtc2cgYmVmb3JlIHVzaW5nIHRoZQotICAvLyBhY3Rpb24uCi0gIGRlbGV0ZSBtc2c7Ci0KLSAgVGVzdE1lc3NhZ2UgZGVzdDsKLSAgRVhQRUNUX0ZBTFNFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZkZXN0KSk7Ci0gIEVYUEVDVF9UUlVFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU2V0QXJnUG9pbnRlZTxOPihwcm90b19idWZmZXIpIHNldHMgdGhlCi0vLyA6OlByb3RvY29sTWVzc2FnZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZSBOLXRoICgwLWJhc2VkKQotLy8gYXJndW1lbnQgdG8gcHJvdG9fYnVmZmVyLgotVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWVPZlByb3RvQnVmZmVyQmFzZVR5cGUpIHsKLSAgVGVzdE1lc3NhZ2UqIGNvbnN0IG1zZyA9IG5ldyBUZXN0TWVzc2FnZTsKLSAgbXNnLT5zZXRfbWVtYmVyKCJ5ZXMiKTsKLSAgVGVzdE1lc3NhZ2Ugb3JpZ19tc2c7Ci0gIG9yaWdfbXNnLkNvcHlGcm9tKCptc2cpOwotCi0gIEFjdGlvbjx2b2lkKGJvb2wsIDo6UHJvdG9jb2xNZXNzYWdlKik+IGEgPSBTZXRBcmdQb2ludGVlPDE+KCptc2cpOwotICAvLyBTZXRBcmdQb2ludGVlPE4+KHByb3RvX2J1ZmZlcikgbWFrZXMgYSBjb3B5IG9mIHByb3RvX2J1ZmZlcgotICAvLyBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBwcm90b19idWZmZXIgaGFzCi0gIC8vIGRpZWQuICBXZSBlbnN1cmUgdGhpcyBiZWhhdmlvciBieSBkZWxldGluZyBtc2cgYmVmb3JlIHVzaW5nIHRoZQotICAvLyBhY3Rpb24uCi0gIGRlbGV0ZSBtc2c7Ci0KLSAgVGVzdE1lc3NhZ2UgZGVzdDsKLSAgOjpQcm90b2NvbE1lc3NhZ2UqIGNvbnN0IGRlc3RfYmFzZSA9ICZkZXN0OwotICBFWFBFQ1RfRkFMU0Uob3JpZ19tc2cuRXF1YWxzKGRlc3QpKTsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgZGVzdF9iYXNlKSk7Ci0gIEVYUEVDVF9UUlVFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU2V0QXJnUG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBzZXRzIHRoZSB2MgotLy8gcHJvdG9idWYgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQgdG8KLS8vIHByb3RvMl9idWZmZXIuCi1URVNUKFNldEFyZ1BvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZU9mUHJvdG8yQnVmZmVyVHlwZSkgewotICB1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9vTWVzc2FnZTsKLSAgRm9vTWVzc2FnZSogY29uc3QgbXNnID0gbmV3IEZvb01lc3NhZ2U7Ci0gIG1zZy0+c2V0X2ludF9maWVsZCgyKTsKLSAgbXNnLT5zZXRfc3RyaW5nX2ZpZWxkKCJoaSIpOwotICBGb29NZXNzYWdlIG9yaWdfbXNnOwotICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKLQotICBBY3Rpb248dm9pZChib29sLCBGb29NZXNzYWdlKik+IGEgPSBTZXRBcmdQb2ludGVlPDE+KCptc2cpOwotICAvLyBTZXRBcmdQb2ludGVlPE4+KHByb3RvMl9idWZmZXIpIG1ha2VzIGEgY29weSBvZgotICAvLyBwcm90bzJfYnVmZmVyIHMudC4gdGhlIGFjdGlvbiB3b3JrcyBldmVuIHdoZW4gdGhlIG9yaWdpbmFsCi0gIC8vIHByb3RvMl9idWZmZXIgaGFzIGRpZWQuICBXZSBlbnN1cmUgdGhpcyBiZWhhdmlvciBieSBkZWxldGluZyBtc2cKLSAgLy8gYmVmb3JlIHVzaW5nIHRoZSBhY3Rpb24uCi0gIGRlbGV0ZSBtc2c7Ci0KLSAgRm9vTWVzc2FnZSBkZXN0OwotICBkZXN0LnNldF9pbnRfZmllbGQoMCk7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZkZXN0KSk7Ci0gIEVYUEVDVF9FUSgyLCBkZXN0LmludF9maWVsZCgpKTsKLSAgRVhQRUNUX0VRKCJoaSIsIGRlc3Quc3RyaW5nX2ZpZWxkKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFNldEFyZ1BvaW50ZWU8Tj4ocHJvdG8yX2J1ZmZlcikgc2V0cyB0aGUKLS8vIHByb3RvMjo6TWVzc2FnZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZSBOLXRoICgwLWJhc2VkKSBhcmd1bWVudAotLy8gdG8gcHJvdG8yX2J1ZmZlci4KLVRFU1QoU2V0QXJnUG9pbnRlZVRlc3QsIFNldHNUaGVOdGhQb2ludGVlT2ZQcm90bzJCdWZmZXJCYXNlVHlwZSkgewotICB1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9vTWVzc2FnZTsKLSAgRm9vTWVzc2FnZSogY29uc3QgbXNnID0gbmV3IEZvb01lc3NhZ2U7Ci0gIG1zZy0+c2V0X2ludF9maWVsZCgyKTsKLSAgbXNnLT5zZXRfc3RyaW5nX2ZpZWxkKCJoaSIpOwotICBGb29NZXNzYWdlIG9yaWdfbXNnOwotICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKLQotICBBY3Rpb248dm9pZChib29sLCA6OnByb3RvMjo6TWVzc2FnZSopPiBhID0gU2V0QXJnUG9pbnRlZTwxPigqbXNnKTsKLSAgLy8gU2V0QXJnUG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBtYWtlcyBhIGNvcHkgb2YKLSAgLy8gcHJvdG8yX2J1ZmZlciBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbAotICAvLyBwcm90bzJfYnVmZmVyIGhhcyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnCi0gIC8vIGJlZm9yZSB1c2luZyB0aGUgYWN0aW9uLgotICBkZWxldGUgbXNnOwotCi0gIEZvb01lc3NhZ2UgZGVzdDsKLSAgZGVzdC5zZXRfaW50X2ZpZWxkKDApOwotICA6OnByb3RvMjo6TWVzc2FnZSogY29uc3QgZGVzdF9iYXNlID0gJmRlc3Q7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIGRlc3RfYmFzZSkpOwotICBFWFBFQ1RfRVEoMiwgZGVzdC5pbnRfZmllbGQoKSk7Ci0gIEVYUEVDVF9FUSgiaGkiLCBkZXN0LnN0cmluZ19maWVsZCgpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUFJPVE9CVUZfCi0KLS8vIFRlc3RzIHRoYXQgU2V0QXJndW1lbnRQb2ludGVlPE4+KHYpIHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkKLS8vIHRoZSBOLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0byB2LgotVEVTVChTZXRBcmd1bWVudFBvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZSkgewotICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBpbnQqLCBjaGFyKik7Ci0gIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJndW1lbnRQb2ludGVlPDE+KDIpOwotCi0gIGludCBuID0gMDsKLSAgY2hhciBjaCA9ICdcMCc7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZuLCAmY2gpKTsKLSAgRVhQRUNUX0VRKDIsIG4pOwotICBFWFBFQ1RfRVEoJ1wwJywgY2gpOwotCi0gIGEgPSBTZXRBcmd1bWVudFBvaW50ZWU8Mj4oJ2EnKTsKLSAgbiA9IDA7Ci0gIGNoID0gJ1wwJzsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJm4sICZjaCkpOwotICBFWFBFQ1RfRVEoMCwgbik7Ci0gIEVYUEVDVF9FUSgnYScsIGNoKTsKLX0KLQotI2lmIEdURVNUX0hBU19QUk9UT0JVRl8KLQotLy8gVGVzdHMgdGhhdCBTZXRBcmd1bWVudFBvaW50ZWU8Tj4ocHJvdG9fYnVmZmVyKSBzZXRzIHRoZSB2MSBwcm90b2J1ZgotLy8gdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQgdG8gcHJvdG9fYnVmZmVyLgotVEVTVChTZXRBcmd1bWVudFBvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZU9mUHJvdG9CdWZmZXJUeXBlKSB7Ci0gIFRlc3RNZXNzYWdlKiBjb25zdCBtc2cgPSBuZXcgVGVzdE1lc3NhZ2U7Ci0gIG1zZy0+c2V0X21lbWJlcigieWVzIik7Ci0gIFRlc3RNZXNzYWdlIG9yaWdfbXNnOwotICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKLQotICBBY3Rpb248dm9pZChib29sLCBUZXN0TWVzc2FnZSopPiBhID0gU2V0QXJndW1lbnRQb2ludGVlPDE+KCptc2cpOwotICAvLyBTZXRBcmd1bWVudFBvaW50ZWU8Tj4ocHJvdG9fYnVmZmVyKSBtYWtlcyBhIGNvcHkgb2YgcHJvdG9fYnVmZmVyCi0gIC8vIHMudC4gdGhlIGFjdGlvbiB3b3JrcyBldmVuIHdoZW4gdGhlIG9yaWdpbmFsIHByb3RvX2J1ZmZlciBoYXMKLSAgLy8gZGllZC4gIFdlIGVuc3VyZSB0aGlzIGJlaGF2aW9yIGJ5IGRlbGV0aW5nIG1zZyBiZWZvcmUgdXNpbmcgdGhlCi0gIC8vIGFjdGlvbi4KLSAgZGVsZXRlIG1zZzsKLQotICBUZXN0TWVzc2FnZSBkZXN0OwotICBFWFBFQ1RfRkFMU0Uob3JpZ19tc2cuRXF1YWxzKGRlc3QpKTsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJmRlc3QpKTsKLSAgRVhQRUNUX1RSVUUob3JpZ19tc2cuRXF1YWxzKGRlc3QpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBTZXRBcmd1bWVudFBvaW50ZWU8Tj4ocHJvdG9fYnVmZmVyKSBzZXRzIHRoZQotLy8gOjpQcm90b2NvbE1lc3NhZ2UgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgTi10aCAoMC1iYXNlZCkKLS8vIGFyZ3VtZW50IHRvIHByb3RvX2J1ZmZlci4KLVRFU1QoU2V0QXJndW1lbnRQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWVPZlByb3RvQnVmZmVyQmFzZVR5cGUpIHsKLSAgVGVzdE1lc3NhZ2UqIGNvbnN0IG1zZyA9IG5ldyBUZXN0TWVzc2FnZTsKLSAgbXNnLT5zZXRfbWVtYmVyKCJ5ZXMiKTsKLSAgVGVzdE1lc3NhZ2Ugb3JpZ19tc2c7Ci0gIG9yaWdfbXNnLkNvcHlGcm9tKCptc2cpOwotCi0gIEFjdGlvbjx2b2lkKGJvb2wsIDo6UHJvdG9jb2xNZXNzYWdlKik+IGEgPSBTZXRBcmd1bWVudFBvaW50ZWU8MT4oKm1zZyk7Ci0gIC8vIFNldEFyZ3VtZW50UG9pbnRlZTxOPihwcm90b19idWZmZXIpIG1ha2VzIGEgY29weSBvZiBwcm90b19idWZmZXIKLSAgLy8gcy50LiB0aGUgYWN0aW9uIHdvcmtzIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwgcHJvdG9fYnVmZmVyIGhhcwotICAvLyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnIGJlZm9yZSB1c2luZyB0aGUKLSAgLy8gYWN0aW9uLgotICBkZWxldGUgbXNnOwotCi0gIFRlc3RNZXNzYWdlIGRlc3Q7Ci0gIDo6UHJvdG9jb2xNZXNzYWdlKiBjb25zdCBkZXN0X2Jhc2UgPSAmZGVzdDsKLSAgRVhQRUNUX0ZBTFNFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIGRlc3RfYmFzZSkpOwotICBFWFBFQ1RfVFJVRShvcmlnX21zZy5FcXVhbHMoZGVzdCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFNldEFyZ3VtZW50UG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBzZXRzIHRoZSB2MgotLy8gcHJvdG9idWYgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQgdG8KLS8vIHByb3RvMl9idWZmZXIuCi1URVNUKFNldEFyZ3VtZW50UG9pbnRlZVRlc3QsIFNldHNUaGVOdGhQb2ludGVlT2ZQcm90bzJCdWZmZXJUeXBlKSB7Ci0gIHVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb29NZXNzYWdlOwotICBGb29NZXNzYWdlKiBjb25zdCBtc2cgPSBuZXcgRm9vTWVzc2FnZTsKLSAgbXNnLT5zZXRfaW50X2ZpZWxkKDIpOwotICBtc2ctPnNldF9zdHJpbmdfZmllbGQoImhpIik7Ci0gIEZvb01lc3NhZ2Ugb3JpZ19tc2c7Ci0gIG9yaWdfbXNnLkNvcHlGcm9tKCptc2cpOwotCi0gIEFjdGlvbjx2b2lkKGJvb2wsIEZvb01lc3NhZ2UqKT4gYSA9IFNldEFyZ3VtZW50UG9pbnRlZTwxPigqbXNnKTsKLSAgLy8gU2V0QXJndW1lbnRQb2ludGVlPE4+KHByb3RvMl9idWZmZXIpIG1ha2VzIGEgY29weSBvZgotICAvLyBwcm90bzJfYnVmZmVyIHMudC4gdGhlIGFjdGlvbiB3b3JrcyBldmVuIHdoZW4gdGhlIG9yaWdpbmFsCi0gIC8vIHByb3RvMl9idWZmZXIgaGFzIGRpZWQuICBXZSBlbnN1cmUgdGhpcyBiZWhhdmlvciBieSBkZWxldGluZyBtc2cKLSAgLy8gYmVmb3JlIHVzaW5nIHRoZSBhY3Rpb24uCi0gIGRlbGV0ZSBtc2c7Ci0KLSAgRm9vTWVzc2FnZSBkZXN0OwotICBkZXN0LnNldF9pbnRfZmllbGQoMCk7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZkZXN0KSk7Ci0gIEVYUEVDVF9FUSgyLCBkZXN0LmludF9maWVsZCgpKTsKLSAgRVhQRUNUX0VRKCJoaSIsIGRlc3Quc3RyaW5nX2ZpZWxkKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFNldEFyZ3VtZW50UG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBzZXRzIHRoZQotLy8gcHJvdG8yOjpNZXNzYWdlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50Ci0vLyB0byBwcm90bzJfYnVmZmVyLgotVEVTVChTZXRBcmd1bWVudFBvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZU9mUHJvdG8yQnVmZmVyQmFzZVR5cGUpIHsKLSAgdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvb01lc3NhZ2U7Ci0gIEZvb01lc3NhZ2UqIGNvbnN0IG1zZyA9IG5ldyBGb29NZXNzYWdlOwotICBtc2ctPnNldF9pbnRfZmllbGQoMik7Ci0gIG1zZy0+c2V0X3N0cmluZ19maWVsZCgiaGkiKTsKLSAgRm9vTWVzc2FnZSBvcmlnX21zZzsKLSAgb3JpZ19tc2cuQ29weUZyb20oKm1zZyk7Ci0KLSAgQWN0aW9uPHZvaWQoYm9vbCwgOjpwcm90bzI6Ok1lc3NhZ2UqKT4gYSA9IFNldEFyZ3VtZW50UG9pbnRlZTwxPigqbXNnKTsKLSAgLy8gU2V0QXJndW1lbnRQb2ludGVlPE4+KHByb3RvMl9idWZmZXIpIG1ha2VzIGEgY29weSBvZgotICAvLyBwcm90bzJfYnVmZmVyIHMudC4gdGhlIGFjdGlvbiB3b3JrcyBldmVuIHdoZW4gdGhlIG9yaWdpbmFsCi0gIC8vIHByb3RvMl9idWZmZXIgaGFzIGRpZWQuICBXZSBlbnN1cmUgdGhpcyBiZWhhdmlvciBieSBkZWxldGluZyBtc2cKLSAgLy8gYmVmb3JlIHVzaW5nIHRoZSBhY3Rpb24uCi0gIGRlbGV0ZSBtc2c7Ci0KLSAgRm9vTWVzc2FnZSBkZXN0OwotICBkZXN0LnNldF9pbnRfZmllbGQoMCk7Ci0gIDo6cHJvdG8yOjpNZXNzYWdlKiBjb25zdCBkZXN0X2Jhc2UgPSAmZGVzdDsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgZGVzdF9iYXNlKSk7Ci0gIEVYUEVDVF9FUSgyLCBkZXN0LmludF9maWVsZCgpKTsKLSAgRVhQRUNUX0VRKCJoaSIsIGRlc3Quc3RyaW5nX2ZpZWxkKCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QUk9UT0JVRl8KLQotLy8gU2FtcGxlIGZ1bmN0aW9ucyBhbmQgZnVuY3RvcnMgZm9yIHRlc3RpbmcgSW52b2tlKCkgYW5kIGV0Yy4KLWludCBOdWxsYXJ5KCkgeyByZXR1cm4gMTsgfQotCi1jbGFzcyBOdWxsYXJ5RnVuY3RvciB7Ci0gcHVibGljOgotICBpbnQgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIDI7IH0KLX07Ci0KLWJvb2wgZ19kb25lID0gZmFsc2U7Ci12b2lkIFZvaWROdWxsYXJ5KCkgeyBnX2RvbmUgPSB0cnVlOyB9Ci0KLWNsYXNzIFZvaWROdWxsYXJ5RnVuY3RvciB7Ci0gcHVibGljOgotICB2b2lkIG9wZXJhdG9yKCkoKSB7IGdfZG9uZSA9IHRydWU7IH0KLX07Ci0KLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICBGb28oKSA6IHZhbHVlXygxMjMpIHt9Ci0KLSAgaW50IE51bGxhcnkoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotIHByaXZhdGU6Ci0gIGludCB2YWx1ZV87Ci19OwotCi0vLyBUZXN0cyBJbnZva2VXaXRob3V0QXJncyhmdW5jdGlvbikuCi1URVNUKEludm9rZVdpdGhvdXRBcmdzVGVzdCwgRnVuY3Rpb24pIHsKLSAgLy8gQXMgYW4gYWN0aW9uIHRoYXQgdGFrZXMgb25lIGFyZ3VtZW50LgotICBBY3Rpb248aW50KGludCk+IGEgPSBJbnZva2VXaXRob3V0QXJncyhOdWxsYXJ5KTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMikpKTsKLQotICAvLyBBcyBhbiBhY3Rpb24gdGhhdCB0YWtlcyB0d28gYXJndW1lbnRzLgotICBBY3Rpb248aW50KGludCwgZG91YmxlKT4gYTIgPSBJbnZva2VXaXRob3V0QXJncyhOdWxsYXJ5KTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKDIsIDMuNSkpKTsKLQotICAvLyBBcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHZvaWQuCi0gIEFjdGlvbjx2b2lkKGludCk+IGEzID0gSW52b2tlV2l0aG91dEFyZ3MoVm9pZE51bGxhcnkpOyAgLy8gTk9MSU5UCi0gIGdfZG9uZSA9IGZhbHNlOwotICBhMy5QZXJmb3JtKG1ha2VfdHVwbGUoMSkpOwotICBFWFBFQ1RfVFJVRShnX2RvbmUpOwotfQotCi0vLyBUZXN0cyBJbnZva2VXaXRob3V0QXJncyhmdW5jdG9yKS4KLVRFU1QoSW52b2tlV2l0aG91dEFyZ3NUZXN0LCBGdW5jdG9yKSB7Ci0gIC8vIEFzIGFuIGFjdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50LgotICBBY3Rpb248aW50KCk+IGEgPSBJbnZva2VXaXRob3V0QXJncyhOdWxsYXJ5RnVuY3RvcigpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotCi0gIC8vIEFzIGFuIGFjdGlvbiB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cy4KLSAgQWN0aW9uPGludChpbnQsIGRvdWJsZSwgY2hhcik+IGEyID0gIC8vIE5PTElOVAotICAgICAgSW52b2tlV2l0aG91dEFyZ3MoTnVsbGFyeUZ1bmN0b3IoKSk7Ci0gIEVYUEVDVF9FUSgyLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoMywgMy41LCAnYScpKSk7Ci0KLSAgLy8gQXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB2b2lkLgotICBBY3Rpb248dm9pZCgpPiBhMyA9IEludm9rZVdpdGhvdXRBcmdzKFZvaWROdWxsYXJ5RnVuY3RvcigpKTsKLSAgZ19kb25lID0gZmFsc2U7Ci0gIGEzLlBlcmZvcm0obWFrZV90dXBsZSgpKTsKLSAgRVhQRUNUX1RSVUUoZ19kb25lKTsKLX0KLQotLy8gVGVzdHMgSW52b2tlV2l0aG91dEFyZ3Mob2JqX3B0ciwgbWV0aG9kKS4KLVRFU1QoSW52b2tlV2l0aG91dEFyZ3NUZXN0LCBNZXRob2QpIHsKLSAgRm9vIGZvbzsKLSAgQWN0aW9uPGludChib29sLCBjaGFyKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIEludm9rZVdpdGhvdXRBcmdzKCZmb28sICZGb286Ok51bGxhcnkpOwotICBFWFBFQ1RfRVEoMTIzLCBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAnYScpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIElnbm9yZVJlc3VsdCgpIG9uIGEgcG9seW1vcnBoaWMgYWN0aW9uLgotVEVTVChJZ25vcmVSZXN1bHRUZXN0LCBQb2x5bW9ycGhpY0FjdGlvbikgewotICBBY3Rpb248dm9pZChpbnQpPiBhID0gSWdub3JlUmVzdWx0KFJldHVybig1KSk7ICAvLyBOT0xJTlQKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJZ25vcmVSZXN1bHQoKSBvbiBhIG1vbm9tb3JwaGljIGFjdGlvbi4KLQotaW50IFJldHVybk9uZSgpIHsKLSAgZ19kb25lID0gdHJ1ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLVRFU1QoSWdub3JlUmVzdWx0VGVzdCwgTW9ub21vcnBoaWNBY3Rpb24pIHsKLSAgZ19kb25lID0gZmFsc2U7Ci0gIEFjdGlvbjx2b2lkKCk+IGEgPSBJZ25vcmVSZXN1bHQoSW52b2tlKFJldHVybk9uZSkpOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSgpKTsKLSAgRVhQRUNUX1RSVUUoZ19kb25lKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSWdub3JlUmVzdWx0KCkgb24gYW4gYWN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIHR5cGUuCi0KLU15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUgUmV0dXJuTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZShkb3VibGUgLyogeCAqLykgewotICBnX2RvbmUgPSB0cnVlOwotICByZXR1cm4gTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSg0Mik7Ci19Ci0KLVRFU1QoSWdub3JlUmVzdWx0VGVzdCwgQWN0aW9uUmV0dXJuaW5nQ2xhc3MpIHsKLSAgZ19kb25lID0gZmFsc2U7Ci0gIEFjdGlvbjx2b2lkKGludCk+IGEgPQotICAgICAgSWdub3JlUmVzdWx0KEludm9rZShSZXR1cm5NeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKSk7ICAvLyBOT0xJTlQKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMikpOwotICBFWFBFQ1RfVFJVRShnX2RvbmUpOwotfQotCi1URVNUKEFzc2lnblRlc3QsIEludCkgewotICBpbnQgeCA9IDA7Ci0gIEFjdGlvbjx2b2lkKGludCk+IGEgPSBBc3NpZ24oJngsIDUpOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSgwKSk7Ci0gIEVYUEVDVF9FUSg1LCB4KTsKLX0KLQotVEVTVChBc3NpZ25UZXN0LCBTdHJpbmcpIHsKLSAgOjpzdGQ6OnN0cmluZyB4OwotICBBY3Rpb248dm9pZCh2b2lkKT4gYSA9IEFzc2lnbigmeCwgIkhlbGxvLCB3b3JsZCIpOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSgpKTsKLSAgRVhQRUNUX0VRKCJIZWxsbywgd29ybGQiLCB4KTsKLX0KLQotVEVTVChBc3NpZ25UZXN0LCBDb21wYXRpYmxlVHlwZXMpIHsKLSAgZG91YmxlIHggPSAwOwotICBBY3Rpb248dm9pZChpbnQpPiBhID0gQXNzaWduKCZ4LCA1KTsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMCkpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDUsIHgpOwotfQotCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLWNsYXNzIFNldEVycm5vQW5kUmV0dXJuVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgZXJybm8gPSAwOyB9Ci0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgZXJybm8gPSAwOyB9Ci19OwotCi1URVNUX0YoU2V0RXJybm9BbmRSZXR1cm5UZXN0LCBJbnQpIHsKLSAgQWN0aW9uPGludCh2b2lkKT4gYSA9IFNldEVycm5vQW5kUmV0dXJuKEVOT1RUWSwgLTUpOwotICBFWFBFQ1RfRVEoLTUsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLSAgRVhQRUNUX0VRKEVOT1RUWSwgZXJybm8pOwotfQotCi1URVNUX0YoU2V0RXJybm9BbmRSZXR1cm5UZXN0LCBQdHIpIHsKLSAgaW50IHg7Ci0gIEFjdGlvbjxpbnQqKHZvaWQpPiBhID0gU2V0RXJybm9BbmRSZXR1cm4oRU5PVFRZLCAmeCk7Ci0gIEVYUEVDVF9FUSgmeCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotICBFWFBFQ1RfRVEoRU5PVFRZLCBlcnJubyk7Ci19Ci0KLVRFU1RfRihTZXRFcnJub0FuZFJldHVyblRlc3QsIENvbXBhdGlibGVUeXBlcykgewotICBBY3Rpb248ZG91YmxlKCk+IGEgPSBTZXRFcnJub0FuZFJldHVybihFSU5WQUwsIDUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDUuMCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotICBFWFBFQ1RfRVEoRUlOVkFMLCBlcnJubyk7Ci19Ci0KLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIFRlc3RzIEJ5UmVmKCkuCi0KLS8vIFRlc3RzIHRoYXQgUmVmZXJlbmNlV3JhcHBlcjxUPiBpcyBjb3B5YWJsZS4KLVRFU1QoQnlSZWZUZXN0LCBJc0NvcHlhYmxlKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHMxID0gIkhpIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgczIgPSAiSGVsbG8iOwotCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJlZmVyZW5jZVdyYXBwZXI8Y29uc3Qgc3RkOjpzdHJpbmc+IHJlZl93cmFwcGVyID0KLSAgICAgIEJ5UmVmKHMxKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHIxID0gcmVmX3dyYXBwZXI7Ci0gIEVYUEVDVF9FUSgmczEsICZyMSk7Ci0KLSAgLy8gQXNzaWducyBhIG5ldyB2YWx1ZSB0byByZWZfd3JhcHBlci4KLSAgcmVmX3dyYXBwZXIgPSBCeVJlZihzMik7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiByMiA9IHJlZl93cmFwcGVyOwotICBFWFBFQ1RfRVEoJnMyLCAmcjIpOwotCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJlZmVyZW5jZVdyYXBwZXI8Y29uc3Qgc3RkOjpzdHJpbmc+IHJlZl93cmFwcGVyMSA9Ci0gICAgICBCeVJlZihzMSk7Ci0gIC8vIENvcGllcyByZWZfd3JhcHBlcjEgdG8gcmVmX3dyYXBwZXIuCi0gIHJlZl93cmFwcGVyID0gcmVmX3dyYXBwZXIxOwotICBjb25zdCBzdGQ6OnN0cmluZyYgcjMgPSByZWZfd3JhcHBlcjsKLSAgRVhQRUNUX0VRKCZzMSwgJnIzKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgQnlSZWYoKSBvbiBhIGNvbnN0IHZhbHVlLgotVEVTVChCeVJlZlRlc3QsIENvbnN0VmFsdWUpIHsKLSAgY29uc3QgaW50IG4gPSAwOwotICAvLyBpbnQmIHJlZiA9IEJ5UmVmKG4pOyAgLy8gVGhpcyBzaG91bGRuJ3QgY29tcGlsZSAtIHdlIGhhdmUgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgY29tcGlsYXRpb24gdGVzdCB0byBjYXRjaCBpdC4KLSAgY29uc3QgaW50JiBjb25zdF9yZWYgPSBCeVJlZihuKTsKLSAgRVhQRUNUX0VRKCZuLCAmY29uc3RfcmVmKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgQnlSZWYoKSBvbiBhIG5vbi1jb25zdCB2YWx1ZS4KLVRFU1QoQnlSZWZUZXN0LCBOb25Db25zdFZhbHVlKSB7Ci0gIGludCBuID0gMDsKLQotICAvLyBCeVJlZihuKSBjYW4gYmUgdXNlZCBhcyBlaXRoZXIgYW4gaW50JiwKLSAgaW50JiByZWYgPSBCeVJlZihuKTsKLSAgRVhQRUNUX0VRKCZuLCAmcmVmKTsKLQotICAvLyBvciBhIGNvbnN0IGludCYuCi0gIGNvbnN0IGludCYgY29uc3RfcmVmID0gQnlSZWYobik7Ci0gIEVYUEVDVF9FUSgmbiwgJmNvbnN0X3JlZik7Ci19Ci0KLS8vIFRlc3RzIGV4cGxpY2l0bHkgc3BlY2lmeWluZyB0aGUgdHlwZSB3aGVuIHVzaW5nIEJ5UmVmKCkuCi1URVNUKEJ5UmVmVGVzdCwgRXhwbGljaXRUeXBlKSB7Ci0gIGludCBuID0gMDsKLSAgY29uc3QgaW50JiByMSA9IEJ5UmVmPGNvbnN0IGludD4obik7Ci0gIEVYUEVDVF9FUSgmbiwgJnIxKTsKLQotICAvLyBCeVJlZjxjaGFyPihuKTsgIC8vIFRoaXMgc2hvdWxkbid0IGNvbXBpbGUgLSB3ZSBoYXZlIGEgbmVnYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAvLyBjb21waWxhdGlvbiB0ZXN0IHRvIGNhdGNoIGl0LgotCi0gIERlcml2ZWQgZDsKLSAgRGVyaXZlZCYgcjIgPSBCeVJlZjxEZXJpdmVkPihkKTsKLSAgRVhQRUNUX0VRKCZkLCAmcjIpOwotCi0gIGNvbnN0IERlcml2ZWQmIHIzID0gQnlSZWY8Y29uc3QgRGVyaXZlZD4oZCk7Ci0gIEVYUEVDVF9FUSgmZCwgJnIzKTsKLQotICBCYXNlJiByNCA9IEJ5UmVmPEJhc2U+KGQpOwotICBFWFBFQ1RfRVEoJmQsICZyNCk7Ci0KLSAgY29uc3QgQmFzZSYgcjUgPSBCeVJlZjxjb25zdCBCYXNlPihkKTsKLSAgRVhQRUNUX0VRKCZkLCAmcjUpOwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkbid0IGNvbXBpbGUgLSB3ZSBoYXZlIGEgbmVnYXRpdmUgY29tcGlsYXRpb24KLSAgLy8gdGVzdCBmb3IgaXQuCi0gIC8vCi0gIC8vIEJhc2UgYjsKLSAgLy8gQnlSZWY8RGVyaXZlZD4oYik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgcHJpbnRzIGV4cHJlc3Npb24gQnlSZWYoeCkgYXMgYSByZWZlcmVuY2UgdG8geC4KLVRFU1QoQnlSZWZUZXN0LCBQcmludHNDb3JyZWN0bHkpIHsKLSAgaW50IG4gPSA0MjsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBleHBlY3RlZCwgYWN0dWFsOwotICB0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxjb25zdCBpbnQmPjo6UHJpbnQobiwgJmV4cGVjdGVkKTsKLSAgdGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KEJ5UmVmKG4pLCAmYWN0dWFsKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkLnN0cigpLCBhY3R1YWwuc3RyKCkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXwotCi1zdGQ6OnVuaXF1ZV9wdHI8aW50PiBVbmlxdWVQdHJTb3VyY2UoKSB7Ci0gIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8aW50PihuZXcgaW50KDE5KSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxpbnQ+PiBWZWN0b3JVbmlxdWVQdHJTb3VyY2UoKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxpbnQ+PiBvdXQ7Ci0gIG91dC5lbXBsYWNlX2JhY2sobmV3IGludCg3KSk7Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLVRFU1QoTW9ja01ldGhvZFRlc3QsIENhblJldHVybk1vdmVPbmx5VmFsdWVfUmV0dXJuKSB7Ci0gIE1vY2tDbGFzcyBtb2NrOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiBpKG5ldyBpbnQoMTkpKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgTWFrZVVuaXF1ZSgpKS5XaWxsT25jZShSZXR1cm4oQnlNb3ZlKHN0ZDo6bW92ZShpKSkpKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgTWFrZVZlY3RvclVuaXF1ZSgpKQotICAgICAgLldpbGxPbmNlKFJldHVybihCeU1vdmUoVmVjdG9yVW5pcXVlUHRyU291cmNlKCkpKSk7Ci0gIERlcml2ZWQqIGQgPSBuZXcgRGVyaXZlZDsKLSAgRVhQRUNUX0NBTEwobW9jaywgTWFrZVVuaXF1ZUJhc2UoKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQnlNb3ZlKHN0ZDo6dW5pcXVlX3B0cjxEZXJpdmVkPihkKSkpKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiByZXN1bHQxID0gbW9jay5NYWtlVW5pcXVlKCk7Ci0gIEVYUEVDVF9FUSgxOSwgKnJlc3VsdDEpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxpbnQ+PiB2cmVzdWx0ID0gbW9jay5NYWtlVmVjdG9yVW5pcXVlKCk7Ci0gIEVYUEVDVF9FUSgxdSwgdnJlc3VsdC5zaXplKCkpOwotICBFWFBFQ1RfTkUobnVsbHB0ciwgdnJlc3VsdFswXSk7Ci0gIEVYUEVDVF9FUSg3LCAqdnJlc3VsdFswXSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPEJhc2U+IHJlc3VsdDIgPSBtb2NrLk1ha2VVbmlxdWVCYXNlKCk7Ci0gIEVYUEVDVF9FUShkLCByZXN1bHQyLmdldCgpKTsKLX0KLQotVEVTVChNb2NrTWV0aG9kVGVzdCwgQ2FuUmV0dXJuTW92ZU9ubHlWYWx1ZV9Eb0FsbFJldHVybikgewotICB0ZXN0aW5nOjpNb2NrRnVuY3Rpb248dm9pZCgpPiBtb2NrX2Z1bmN0aW9uOwotICBNb2NrQ2xhc3MgbW9jazsKLSAgc3RkOjp1bmlxdWVfcHRyPGludD4gaShuZXcgaW50KDE5KSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZnVuY3Rpb24sIENhbGwoKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2ssIE1ha2VVbmlxdWUoKSkuV2lsbE9uY2UoRG9BbGwoCi0gICAgICBJbnZva2VXaXRob3V0QXJncygmbW9ja19mdW5jdGlvbiwgJnRlc3Rpbmc6Ok1vY2tGdW5jdGlvbjx2b2lkKCk+OjpDYWxsKSwKLSAgICAgIFJldHVybihCeU1vdmUoc3RkOjptb3ZlKGkpKSkpKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiByZXN1bHQxID0gbW9jay5NYWtlVW5pcXVlKCk7Ci0gIEVYUEVDVF9FUSgxOSwgKnJlc3VsdDEpOwotfQotCi1URVNUKE1vY2tNZXRob2RUZXN0LCBDYW5SZXR1cm5Nb3ZlT25seVZhbHVlX0ludm9rZSkgewotICBNb2NrQ2xhc3MgbW9jazsKLQotICAvLyBDaGVjayBkZWZhdWx0IHZhbHVlCi0gIERlZmF1bHRWYWx1ZTxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj46OlNldEZhY3RvcnkoW10gewotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8aW50PihuZXcgaW50KDQyKSk7Ci0gIH0pOwotICBFWFBFQ1RfRVEoNDIsICptb2NrLk1ha2VVbmlxdWUoKSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9jaywgTWFrZVVuaXF1ZSgpKS5XaWxsUmVwZWF0ZWRseShJbnZva2UoVW5pcXVlUHRyU291cmNlKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2ssIE1ha2VWZWN0b3JVbmlxdWUoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShJbnZva2UoVmVjdG9yVW5pcXVlUHRyU291cmNlKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbnQ+IHJlc3VsdDEgPSBtb2NrLk1ha2VVbmlxdWUoKTsKLSAgRVhQRUNUX0VRKDE5LCAqcmVzdWx0MSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbnQ+IHJlc3VsdDIgPSBtb2NrLk1ha2VVbmlxdWUoKTsKLSAgRVhQRUNUX0VRKDE5LCAqcmVzdWx0Mik7Ci0gIEVYUEVDVF9ORShyZXN1bHQxLCByZXN1bHQyKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gdnJlc3VsdCA9IG1vY2suTWFrZVZlY3RvclVuaXF1ZSgpOwotICBFWFBFQ1RfRVEoMXUsIHZyZXN1bHQuc2l6ZSgpKTsKLSAgRVhQRUNUX05FKG51bGxwdHIsIHZyZXN1bHRbMF0pOwotICBFWFBFQ1RfRVEoNywgKnZyZXN1bHRbMF0pOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KLQotfSAgLy8gVW5uYW1lZCBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1jYXJkaW5hbGl0aWVzX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stY2FyZGluYWxpdGllc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDgxNWU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1jYXJkaW5hbGl0aWVzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgYnVpbHQtaW4gY2FyZGluYWxpdGllcy4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyB0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyB0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgdGVzdGluZzo6QXRNb3N0OwotdXNpbmcgdGVzdGluZzo6QmV0d2VlbjsKLXVzaW5nIHRlc3Rpbmc6OkNhcmRpbmFsaXR5OwotdXNpbmcgdGVzdGluZzo6Q2FyZGluYWxpdHlJbnRlcmZhY2U7Ci11c2luZyB0ZXN0aW5nOjpFeGFjdGx5OwotdXNpbmcgdGVzdGluZzo6SXNTdWJzdHJpbmc7Ci11c2luZyB0ZXN0aW5nOjpNYWtlQ2FyZGluYWxpdHk7Ci0KLWNsYXNzIE1vY2tGb28gewotIHB1YmxpYzoKLSAgTW9ja0ZvbygpIHt9Ci0gIE1PQ0tfTUVUSE9EMChCYXIsIGludCgpKTsgIC8vIE5PTElOVAotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRm9vKTsKLX07Ci0KLS8vIFRlc3RzIHRoYXQgQ2FyZGluYWxpdHkgb2JqZWN0cyBjYW4gYmUgZGVmYXVsdCBjb25zdHJ1Y3RlZC4KLVRFU1QoQ2FyZGluYWxpdHlUZXN0LCBJc0RlZmF1bHRDb25zdHJ1Y3RhYmxlKSB7Ci0gIENhcmRpbmFsaXR5IGM7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQ2FyZGluYWxpdHkgb2JqZWN0cyBhcmUgY29weWFibGUuCi1URVNUKENhcmRpbmFsaXR5VGVzdCwgSXNDb3B5YWJsZSkgewotICAvLyBUZXN0cyB0aGUgY29weSBjb25zdHJ1Y3Rvci4KLSAgQ2FyZGluYWxpdHkgYyA9IEV4YWN0bHkoMSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOwotCi0gIC8vIFRlc3RzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgotICBjID0gRXhhY3RseSgyKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgxKSk7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7Ci19Ci0KLVRFU1QoQ2FyZGluYWxpdHlUZXN0LCBJc092ZXJTYXR1cmF0ZWRCeUNhbGxDb3VudFdvcmtzKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdE1vc3QoNSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KDQpKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNPdmVyU2F0dXJhdGVkQnlDYWxsQ291bnQoNSkpOwotICBFWFBFQ1RfVFJVRShjLklzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KDYpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbygpIGNyZWF0ZXMgdGhlCi0vLyBjb3JyZWN0IGRlc2NyaXB0aW9uLgotVEVTVChDYXJkaW5hbGl0eVRlc3QsIENhbkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50KSB7Ci0gIHN0cmluZ3N0cmVhbSBzczA7Ci0gIENhcmRpbmFsaXR5OjpEZXNjcmliZUFjdHVhbENhbGxDb3VudFRvKDAsICZzczApOwotICBFWFBFQ1RfRVEoIm5ldmVyIGNhbGxlZCIsIHNzMC5zdHIoKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMTsKLSAgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oMSwgJnNzMSk7Ci0gIEVYUEVDVF9FUSgiY2FsbGVkIG9uY2UiLCBzczEuc3RyKCkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczI7Ci0gIENhcmRpbmFsaXR5OjpEZXNjcmliZUFjdHVhbENhbGxDb3VudFRvKDIsICZzczIpOwotICBFWFBFQ1RfRVEoImNhbGxlZCB0d2ljZSIsIHNzMi5zdHIoKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMzsKLSAgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oMywgJnNzMyk7Ci0gIEVYUEVDVF9FUSgiY2FsbGVkIDMgdGltZXMiLCBzczMuc3RyKCkpOwotfQotCi0vLyBUZXN0cyBBbnlOdW1iZXIoKQotVEVTVChBbnlOdW1iZXIsIFdvcmtzKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBbnlOdW1iZXIoKTsKLSAgRVhQRUNUX1RSVUUoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDApKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgwKSk7Ci0KLSAgRVhQRUNUX1RSVUUoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDEpKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgxKSk7Ci0KLSAgRVhQRUNUX1RSVUUoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDkpKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCg5KSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzOwotICBjLkRlc2NyaWJlVG8oJnNzKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKSk7Ci19Ci0KLVRFU1QoQW55TnVtYmVyVGVzdCwgSGFzQ29ycmVjdEJvdW5kcykgewotICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQW55TnVtYmVyKCk7Ci0gIEVYUEVDVF9FUSgwLCBjLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSk7Ci0gIEVYUEVDVF9FUShJTlRfTUFYLCBjLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSk7Ci19Ci0KLS8vIFRlc3RzIEF0TGVhc3QobikuCi0KLVRFU1QoQXRMZWFzdFRlc3QsIE9uTmVnYXRpdmVOdW1iZXIpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQXRMZWFzdCgtMSk7Ci0gIH0sICJUaGUgaW52b2NhdGlvbiBsb3dlciBib3VuZCBtdXN0IGJlID49IDAiKTsKLX0KLQotVEVTVChBdExlYXN0VGVzdCwgT25aZXJvKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdExlYXN0KDApOwotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDApKTsKLQotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDEpKTsKLQotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGMuRGVzY3JpYmVUbygmc3MpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiYW55IG51bWJlciBvZiB0aW1lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgc3Muc3RyKCkpOwotfQotCi1URVNUKEF0TGVhc3RUZXN0LCBPblBvc2l0aXZlTnVtYmVyKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdExlYXN0KDIpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDApKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgwKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgxKSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOwotCi0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMikpOwotCi0gIHN0cmluZ3N0cmVhbSBzczE7Ci0gIEF0TGVhc3QoMSkuRGVzY3JpYmVUbygmc3MxKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImF0IGxlYXN0IG9uY2UiLAotICAgICAgICAgICAgICAgICAgICAgIHNzMS5zdHIoKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMjsKLSAgYy5EZXNjcmliZVRvKCZzczIpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiYXQgbGVhc3QgdHdpY2UiLAotICAgICAgICAgICAgICAgICAgICAgIHNzMi5zdHIoKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMzsKLSAgQXRMZWFzdCgzKS5EZXNjcmliZVRvKCZzczMpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiYXQgbGVhc3QgMyB0aW1lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgc3MzLnN0cigpKTsKLX0KLQotVEVTVChBdExlYXN0VGVzdCwgSGFzQ29ycmVjdEJvdW5kcykgewotICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQXRMZWFzdCgyKTsKLSAgRVhQRUNUX0VRKDIsIGMuQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpKTsKLSAgRVhQRUNUX0VRKElOVF9NQVgsIGMuQ29uc2VydmF0aXZlVXBwZXJCb3VuZCgpKTsKLX0KLQotLy8gVGVzdHMgQXRNb3N0KG4pLgotCi1URVNUKEF0TW9zdFRlc3QsIE9uTmVnYXRpdmVOdW1iZXIpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQXRNb3N0KC0xKTsKLSAgfSwgIlRoZSBpbnZvY2F0aW9uIHVwcGVyIGJvdW5kIG11c3QgYmUgPj0gMCIpOwotfQotCi1URVNUKEF0TW9zdFRlc3QsIE9uWmVybykgewotICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQXRNb3N0KDApOwotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczsKLSAgYy5EZXNjcmliZVRvKCZzcyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJuZXZlciBjYWxsZWQiLAotICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpKTsKLX0KLQotVEVTVChBdE1vc3RUZXN0LCBPblBvc2l0aXZlTnVtYmVyKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdE1vc3QoMik7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgwKSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOwotCi0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgxKSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOwotCi0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMTsKLSAgQXRNb3N0KDEpLkRlc2NyaWJlVG8oJnNzMSk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJjYWxsZWQgYXQgbW9zdCBvbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICBzczEuc3RyKCkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczI7Ci0gIGMuRGVzY3JpYmVUbygmc3MyKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCBhdCBtb3N0IHR3aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICBzczIuc3RyKCkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczM7Ci0gIEF0TW9zdCgzKS5EZXNjcmliZVRvKCZzczMpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiY2FsbGVkIGF0IG1vc3QgMyB0aW1lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgc3MzLnN0cigpKTsKLX0KLQotVEVTVChBdE1vc3RUZXN0LCBIYXNDb3JyZWN0Qm91bmRzKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdE1vc3QoMik7Ci0gIEVYUEVDVF9FUSgwLCBjLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSk7Ci0gIEVYUEVDVF9FUSgyLCBjLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSk7Ci19Ci0KLS8vIFRlc3RzIEJldHdlZW4obSwgbikuCi0KLVRFU1QoQmV0d2VlblRlc3QsIE9uTmVnYXRpdmVTdGFydCkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBCZXR3ZWVuKC0xLCAyKTsKLSAgfSwgIlRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kIG11c3QgYmUgPj0gMCwgYnV0IGlzIGFjdHVhbGx5IC0xIik7Ci19Ci0KLVRFU1QoQmV0d2VlblRlc3QsIE9uTmVnYXRpdmVFbmQpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQmV0d2VlbigxLCAtMik7Ci0gIH0sICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCBtdXN0IGJlID49IDAsIGJ1dCBpcyBhY3R1YWxseSAtMiIpOwotfQotCi1URVNUKEJldHdlZW5UZXN0LCBPblN0YXJ0QmlnZ2VyVGhhbkVuZCkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBCZXR3ZWVuKDIsIDEpOwotICB9LCAiVGhlIGludm9jYXRpb24gdXBwZXIgYm91bmQgKDEpIG11c3QgYmUgPj0gIgotICAgICAidGhlIGludm9jYXRpb24gbG93ZXIgYm91bmQgKDIpIik7Ci19Ci0KLVRFU1QoQmV0d2VlblRlc3QsIE9uWmVyb1N0YXJ0QW5kWmVyb0VuZCkgewotICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQmV0d2VlbigwLCAwKTsKLQotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczsKLSAgYy5EZXNjcmliZVRvKCZzcyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJuZXZlciBjYWxsZWQiLAotICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpKTsKLX0KLQotVEVTVChCZXR3ZWVuVGVzdCwgT25aZXJvU3RhcnRBbmROb25aZXJvRW5kKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBCZXR3ZWVuKDAsIDIpOwotCi0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgwKSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOwotCi0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCg0KSk7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCg0KSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzOwotICBjLkRlc2NyaWJlVG8oJnNzKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCBhdCBtb3N0IHR3aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKSk7Ci19Ci0KLVRFU1QoQmV0d2VlblRlc3QsIE9uU2FtZVN0YXJ0QW5kRW5kKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBCZXR3ZWVuKDMsIDMpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMikpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDIpKTsKLQotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMykpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMykpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoNCkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoNCkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczsKLSAgYy5EZXNjcmliZVRvKCZzcyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJjYWxsZWQgMyB0aW1lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgc3Muc3RyKCkpOwotfQotCi1URVNUKEJldHdlZW5UZXN0LCBPbkRpZmZlcmVudFN0YXJ0QW5kRW5kKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBCZXR3ZWVuKDMsIDUpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMikpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDIpKTsKLQotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMykpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDMpKTsKLQotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoNSkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoNSkpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoNikpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoNikpOwotCi0gIHN0cmluZ3N0cmVhbSBzczsKLSAgYy5EZXNjcmliZVRvKCZzcyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJjYWxsZWQgYmV0d2VlbiAzIGFuZCA1IHRpbWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKSk7Ci19Ci0KLVRFU1QoQmV0d2VlblRlc3QsIEhhc0NvcnJlY3RCb3VuZHMpIHsKLSAgY29uc3QgQ2FyZGluYWxpdHkgYyA9IEJldHdlZW4oMywgNSk7Ci0gIEVYUEVDVF9FUSgzLCBjLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSk7Ci0gIEVYUEVDVF9FUSg1LCBjLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSk7Ci19Ci0KLS8vIFRlc3RzIEV4YWN0bHkobikuCi0KLVRFU1QoRXhhY3RseVRlc3QsIE9uTmVnYXRpdmVOdW1iZXIpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRXhhY3RseSgtMSk7Ci0gIH0sICJUaGUgaW52b2NhdGlvbiBsb3dlciBib3VuZCBtdXN0IGJlID49IDAiKTsKLX0KLQotVEVTVChFeGFjdGx5VGVzdCwgT25aZXJvKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBFeGFjdGx5KDApOwotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOwotCi0gIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOwotICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczsKLSAgYy5EZXNjcmliZVRvKCZzcyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJuZXZlciBjYWxsZWQiLAotICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpKTsKLX0KLQotVEVTVChFeGFjdGx5VGVzdCwgT25Qb3NpdGl2ZU51bWJlcikgewotICBjb25zdCBDYXJkaW5hbGl0eSBjID0gRXhhY3RseSgyKTsKLSAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgwKSk7Ci0gIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOwotCi0gIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7Ci0gIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMTsKLSAgRXhhY3RseSgxKS5EZXNjcmliZVRvKCZzczEpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiY2FsbGVkIG9uY2UiLAotICAgICAgICAgICAgICAgICAgICAgIHNzMS5zdHIoKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzMjsKLSAgYy5EZXNjcmliZVRvKCZzczIpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiY2FsbGVkIHR3aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICBzczIuc3RyKCkpOwotCi0gIHN0cmluZ3N0cmVhbSBzczM7Ci0gIEV4YWN0bHkoMykuRGVzY3JpYmVUbygmc3MzKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCAzIHRpbWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBzczMuc3RyKCkpOwotfQotCi1URVNUKEV4YWN0bHlUZXN0LCBIYXNDb3JyZWN0Qm91bmRzKSB7Ci0gIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBFeGFjdGx5KDMpOwotICBFWFBFQ1RfRVEoMywgYy5Db25zZXJ2YXRpdmVMb3dlckJvdW5kKCkpOwotICBFWFBFQ1RfRVEoMywgYy5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgdXNlciBjYW4gbWFrZSBoaXMgb3duIGNhcmRpbmFsaXR5IGJ5IGltcGxlbWVudGluZwotLy8gQ2FyZGluYWxpdHlJbnRlcmZhY2UgYW5kIGNhbGxpbmcgTWFrZUNhcmRpbmFsaXR5KCkuCi0KLWNsYXNzIEV2ZW5DYXJkaW5hbGl0eSA6IHB1YmxpYyBDYXJkaW5hbGl0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCi0gIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIChjYWxsX2NvdW50ICUgMiA9PSAwKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCi0gIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCAvKiBjYWxsX2NvdW50ICovKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIHNzKSBjb25zdCB7Ci0gICAgKnNzIDw8ICJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiOwotICB9Ci19OwotCi1URVNUKE1ha2VDYXJkaW5hbGl0eVRlc3QsIENvbnN0cnVjdHNDYXJkaW5hbGl0eUZyb21JbnRlcmZhY2UpIHsKLSAgY29uc3QgQ2FyZGluYWxpdHkgYyA9IE1ha2VDYXJkaW5hbGl0eShuZXcgRXZlbkNhcmRpbmFsaXR5KTsKLQotICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMikpOwotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDMpKTsKLQotICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDEwMDAwKSk7Ci0KLSAgc3RyaW5nc3RyZWFtIHNzOwotICBjLkRlc2NyaWJlVG8oJnNzKTsKLSAgRVhQRUNUX0VRKCJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiLCBzcy5zdHIoKSk7Ci19Ci0KLX0gIC8vIFVubmFtZWQgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnNfdGVzdC5jYyBiL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtYWN0aW9uc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQyYTBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtYWN0aW9uc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBidWlsdC1pbiBhY3Rpb25zIGdlbmVyYXRlZCBieSBhIHNjcmlwdC4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGdtb2NrX2dlbmVyYXRlZF9hY3Rpb25zX3Rlc3QgewotCi11c2luZyA6OnN0ZDo6cGx1czsKLXVzaW5nIDo6c3RkOjpzdHJpbmc7Ci11c2luZyB0ZXN0aW5nOjpnZXQ7Ci11c2luZyB0ZXN0aW5nOjptYWtlX3R1cGxlOwotdXNpbmcgdGVzdGluZzo6dHVwbGU7Ci11c2luZyB0ZXN0aW5nOjp0dXBsZV9lbGVtZW50OwotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkFjdGlvbjsKLXVzaW5nIHRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTsKLXVzaW5nIHRlc3Rpbmc6OkJ5UmVmOwotdXNpbmcgdGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm5OZXc7Ci11c2luZyB0ZXN0aW5nOjpTZXRBcmdQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwotdXNpbmcgdGVzdGluZzo6VW51c2VkOwotdXNpbmcgdGVzdGluZzo6V2l0aEFyZ3M7Ci0KLS8vIEZvciBzdXBwcmVzc2luZyBjb21waWxlciB3YXJuaW5ncyBvbiBjb252ZXJzaW9uIHBvc3NpYmx5IGxvc2luZyBwcmVjaXNpb24uCi1pbmxpbmUgc2hvcnQgU2hvcnQoc2hvcnQgbikgeyByZXR1cm4gbjsgfSAgLy8gTk9MSU5UCi1pbmxpbmUgY2hhciBDaGFyKGNoYXIgY2gpIHsgcmV0dXJuIGNoOyB9Ci0KLS8vIFNhbXBsZSBmdW5jdGlvbnMgYW5kIGZ1bmN0b3JzIGZvciB0ZXN0aW5nIHZhcmlvdXMgYWN0aW9ucy4KLWludCBOdWxsYXJ5KCkgeyByZXR1cm4gMTsgfQotCi1jbGFzcyBOdWxsYXJ5RnVuY3RvciB7Ci0gcHVibGljOgotICBpbnQgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIDI7IH0KLX07Ci0KLWJvb2wgZ19kb25lID0gZmFsc2U7Ci0KLWJvb2wgVW5hcnkoaW50IHgpIHsgcmV0dXJuIHggPCAwOyB9Ci0KLWNvbnN0IGNoYXIqIFBsdXMxKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIHMgKyAxOyB9Ci0KLWJvb2wgQnlDb25zdFJlZihjb25zdCBzdHJpbmcmIHMpIHsgcmV0dXJuIHMgPT0gIkhpIjsgfQotCi1jb25zdCBkb3VibGUgZ19kb3VibGUgPSAwOwotYm9vbCBSZWZlcmVuY2VzR2xvYmFsRG91YmxlKGNvbnN0IGRvdWJsZSYgeCkgeyByZXR1cm4gJnggPT0gJmdfZG91YmxlOyB9Ci0KLXN0cmluZyBCeU5vbkNvbnN0UmVmKHN0cmluZyYgcykgeyByZXR1cm4gcyArPSAiKyI7IH0gIC8vIE5PTElOVAotCi1zdHJ1Y3QgVW5hcnlGdW5jdG9yIHsKLSAgaW50IG9wZXJhdG9yKCkoYm9vbCB4KSB7IHJldHVybiB4ID8gMSA6IC0xOyB9Ci19OwotCi1jb25zdCBjaGFyKiBCaW5hcnkoY29uc3QgY2hhciogaW5wdXQsIHNob3J0IG4pIHsgcmV0dXJuIGlucHV0ICsgbjsgfSAgLy8gTk9MSU5UCi0KLXZvaWQgVm9pZEJpbmFyeShpbnQsIGNoYXIpIHsgZ19kb25lID0gdHJ1ZTsgfQotCi1pbnQgVGVybmFyeShpbnQgeCwgY2hhciB5LCBzaG9ydCB6KSB7IHJldHVybiB4ICsgeSArIHo7IH0gIC8vIE5PTElOVAotCi12b2lkIFZvaWRUZXJuYXJ5KGludCwgY2hhciwgYm9vbCkgeyBnX2RvbmUgPSB0cnVlOyB9Ci0KLWludCBTdW1PZjQoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsgcmV0dXJuIGEgKyBiICsgYyArIGQ7IH0KLQotc3RyaW5nIENvbmNhdDQoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0KSB7Ci0gIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0OwotfQotCi1pbnQgU3VtT2Y1KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSkgeyByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7IH0KLQotc3RydWN0IFN1bU9mNUZ1bmN0b3IgewotICBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpIHsKLSAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7Ci0gIH0KLX07Ci0KLXN0cmluZyBDb25jYXQ1KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUpIHsKLSAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNTsKLX0KLQotaW50IFN1bU9mNihpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUsIGludCBmKSB7Ci0gIHJldHVybiBhICsgYiArIGMgKyBkICsgZSArIGY7Ci19Ci0KLXN0cnVjdCBTdW1PZjZGdW5jdG9yIHsKLSAgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlLCBpbnQgZikgewotICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZSArIGY7Ci0gIH0KLX07Ci0KLXN0cmluZyBDb25jYXQ2KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2KSB7Ci0gIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNjsKLX0KLQotc3RyaW5nIENvbmNhdDcoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNykgewotICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNzsKLX0KLQotc3RyaW5nIENvbmNhdDgoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgpIHsKLSAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczcgKyBzODsKLX0KLQotc3RyaW5nIENvbmNhdDkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgsIGNvbnN0IGNoYXIqIHM5KSB7Ci0gIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczggKyBzOTsKLX0KLQotc3RyaW5nIENvbmNhdDEwKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgsIGNvbnN0IGNoYXIqIHM5LAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxMCkgewotICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4ICsgczkgKyBzMTA7Ci19Ci0KLS8vIEEgaGVscGVyIHRoYXQgdHVybnMgdGhlIHR5cGUgb2YgYSBDLXN0cmluZyBsaXRlcmFsIGZyb20gY29uc3QKLS8vIGNoYXJbTl0gdG8gY29uc3QgY2hhciouCi1pbmxpbmUgY29uc3QgY2hhciogQ2hhclB0cihjb25zdCBjaGFyKiBzKSB7IHJldHVybiBzOyB9Ci0KLS8vIFRlc3RzIEludm9rZUFyZ3VtZW50PE4+KC4uLikuCi0KLS8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSBudWxsYXJ5IGZ1bmN0aW9uLgotVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uMCkgewotICBBY3Rpb248aW50KGludCwgaW50KCopKCkpPiBhID0gSW52b2tlQXJndW1lbnQ8MT4oKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMiwgJk51bGxhcnkpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSB1bmFyeSBmdW5jdGlvbi4KLVRFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBGdW5jdG9yMSkgewotICBBY3Rpb248aW50KFVuYXJ5RnVuY3Rvcik+IGEgPSBJbnZva2VBcmd1bWVudDwwPih0cnVlKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoVW5hcnlGdW5jdG9yKCkpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSA1LWFyeSBmdW5jdGlvbi4KLVRFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBGdW5jdGlvbjUpIHsKLSAgQWN0aW9uPGludChpbnQoKikoaW50LCBpbnQsIGludCwgaW50LCBpbnQpKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIEludm9rZUFyZ3VtZW50PDA+KDEwMDAwLCAyMDAwLCAzMDAsIDQwLCA1KTsKLSAgRVhQRUNUX0VRKDEyMzQ1LCBhLlBlcmZvcm0obWFrZV90dXBsZSgmU3VtT2Y1KSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgNS1hcnkgZnVuY3Rvci4KLVRFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBGdW5jdG9yNSkgewotICBBY3Rpb248aW50KFN1bU9mNUZ1bmN0b3IpPiBhID0gIC8vIE5PTElOVAotICAgICAgSW52b2tlQXJndW1lbnQ8MD4oMTAwMDAsIDIwMDAsIDMwMCwgNDAsIDUpOwotICBFWFBFQ1RfRVEoMTIzNDUsIGEuUGVyZm9ybShtYWtlX3R1cGxlKFN1bU9mNUZ1bmN0b3IoKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDYtYXJ5IGZ1bmN0aW9uLgotVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uNikgewotICBBY3Rpb248aW50KGludCgqKShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSk+IGEgPSAgLy8gTk9MSU5UCi0gICAgICBJbnZva2VBcmd1bWVudDwwPigxMDAwMDAsIDIwMDAwLCAzMDAwLCA0MDAsIDUwLCA2KTsKLSAgRVhQRUNUX0VRKDEyMzQ1NiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJlN1bU9mNikpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDYtYXJ5IGZ1bmN0b3IuCi1URVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3RvcjYpIHsKLSAgQWN0aW9uPGludChTdW1PZjZGdW5jdG9yKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIEludm9rZUFyZ3VtZW50PDA+KDEwMDAwMCwgMjAwMDAsIDMwMDAsIDQwMCwgNTAsIDYpOwotICBFWFBFQ1RfRVEoMTIzNDU2LCBhLlBlcmZvcm0obWFrZV90dXBsZShTdW1PZjZGdW5jdG9yKCkpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSA3LWFyeSBmdW5jdGlvbi4KLVRFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBGdW5jdGlvbjcpIHsKLSAgQWN0aW9uPHN0cmluZyhzdHJpbmcoKikoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciopKT4gYSA9Ci0gICAgICBJbnZva2VBcmd1bWVudDwwPigiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIpOwotICBFWFBFQ1RfRVEoIjEyMzQ1NjciLCBhLlBlcmZvcm0obWFrZV90dXBsZSgmQ29uY2F0NykpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDgtYXJ5IGZ1bmN0aW9uLgotVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uOCkgewotICBBY3Rpb248c3RyaW5nKHN0cmluZygqKShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopKT4gYSA9Ci0gICAgICBJbnZva2VBcmd1bWVudDwwPigiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4Iik7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2NzgiLCBhLlBlcmZvcm0obWFrZV90dXBsZSgmQ29uY2F0OCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDktYXJ5IGZ1bmN0aW9uLgotVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uOSkgewotICBBY3Rpb248c3RyaW5nKHN0cmluZygqKShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSk+IGEgPQotICAgICAgSW52b2tlQXJndW1lbnQ8MD4oIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5Iik7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2Nzg5IiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJkNvbmNhdDkpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSAxMC1hcnkgZnVuY3Rpb24uCi1URVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3Rpb24xMCkgewotICBBY3Rpb248c3RyaW5nKHN0cmluZygqKShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKikpPiBhID0KLSAgICAgIEludm9rZUFyZ3VtZW50PDA+KCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIwIik7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2Nzg5MCIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZDb25jYXQxMCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBwb2ludGVyIGFyZ3VtZW50LgotVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEJ5UG9pbnRlckZ1bmN0aW9uKSB7Ci0gIEFjdGlvbjxjb25zdCBjaGFyKihjb25zdCBjaGFyKigqKShjb25zdCBjaGFyKiBpbnB1dCwgc2hvcnQgbikpPiBhID0gIC8vIE5PTElOVAotICAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KCJIaSIpLCBTaG9ydCgxKSk7Ci0gIEVYUEVDVF9TVFJFUSgiaSIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZCaW5hcnkpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29uc3QgY2hhcioKLS8vIGJ5IHBhc3NpbmcgaXQgYSBDLXN0cmluZyBsaXRlcmFsLgotVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uV2l0aENTdHJpbmdMaXRlcmFsKSB7Ci0gIEFjdGlvbjxjb25zdCBjaGFyKihjb25zdCBjaGFyKigqKShjb25zdCBjaGFyKiBpbnB1dCwgc2hvcnQgbikpPiBhID0gIC8vIE5PTElOVAotICAgICAgSW52b2tlQXJndW1lbnQ8MD4oIkhpIiwgU2hvcnQoMSkpOwotICBFWFBFQ1RfU1RSRVEoImkiLCBhLlBlcmZvcm0obWFrZV90dXBsZSgmQmluYXJ5KSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGNvbnN0IHJlZmVyZW5jZS4KLVRFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBCeUNvbnN0UmVmZXJlbmNlRnVuY3Rpb24pIHsKLSAgQWN0aW9uPGJvb2woYm9vbCgqZnVuY3Rpb24pKGNvbnN0IHN0cmluZyYgcykpPiBhID0gIC8vIE5PTElOVAotICAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RyaW5nKCJIaSIpKTsKLSAgLy8gV2hlbiBhY3Rpb24gJ2EnIGlzIGNvbnN0cnVjdGVkLCBpdCBtYWtlcyBhIGNvcHkgb2YgdGhlIHRlbXBvcmFyeQotICAvLyBzdHJpbmcgb2JqZWN0IHBhc3NlZCB0byBpdCwgc28gaXQncyBPSyB0byB1c2UgJ2EnIGxhdGVyLCB3aGVuIHRoZQotICAvLyB0ZW1wb3Jhcnkgb2JqZWN0IGhhcyBhbHJlYWR5IGRpZWQuCi0gIEVYUEVDVF9UUlVFKGEuUGVyZm9ybShtYWtlX3R1cGxlKCZCeUNvbnN0UmVmKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIEJ5UmVmKCkgYW5kIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhCi0vLyBjb25zdCByZWZlcmVuY2UuCi1URVNUKEludm9rZUFyZ3VtZW50VGVzdCwgQnlFeHBsaWNpdENvbnN0UmVmZXJlbmNlRnVuY3Rpb24pIHsKLSAgQWN0aW9uPGJvb2woYm9vbCgqKShjb25zdCBkb3VibGUmIHgpKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIEludm9rZUFyZ3VtZW50PDA+KEJ5UmVmKGdfZG91YmxlKSk7Ci0gIC8vIFRoZSBhYm92ZSBsaW5lIGNhbGxzIEJ5UmVmKCkgb24gYSBjb25zdCB2YWx1ZS4KLSAgRVhQRUNUX1RSVUUoYS5QZXJmb3JtKG1ha2VfdHVwbGUoJlJlZmVyZW5jZXNHbG9iYWxEb3VibGUpKSk7Ci0KLSAgZG91YmxlIHggPSAwOwotICBhID0gSW52b2tlQXJndW1lbnQ8MD4oQnlSZWYoeCkpOyAgLy8gVGhpcyBjYWxscyBCeVJlZigpIG9uIGEgbm9uLWNvbnN0LgotICBFWFBFQ1RfRkFMU0UoYS5QZXJmb3JtKG1ha2VfdHVwbGUoJlJlZmVyZW5jZXNHbG9iYWxEb3VibGUpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIGFuZCB3aXRoIGFuIGFjdGlvbiB0aGF0IHRha2VzIDEgYXJndW1lbnQuCi1URVNUKFdpdGhBcmdzVGVzdCwgT25lQXJnKSB7Ci0gIEFjdGlvbjxib29sKGRvdWJsZSB4LCBpbnQgbik+IGEgPSBXaXRoQXJnczwxPihJbnZva2UoVW5hcnkpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVFJVRShhLlBlcmZvcm0obWFrZV90dXBsZSgxLjUsIC0xKSkpOwotICBFWFBFQ1RfRkFMU0UoYS5QZXJmb3JtKG1ha2VfdHVwbGUoMS41LCAxKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIGFuIGFjdGlvbiB0aGF0IHRha2VzIDIgYXJndW1lbnRzLgotVEVTVChXaXRoQXJnc1Rlc3QsIFR3b0FyZ3MpIHsKLSAgQWN0aW9uPGNvbnN0IGNoYXIqKGNvbnN0IGNoYXIqIHMsIGRvdWJsZSB4LCBzaG9ydCBuKT4gYSA9Ci0gICAgICBXaXRoQXJnczwwLCAyPihJbnZva2UoQmluYXJ5KSk7Ci0gIGNvbnN0IGNoYXIgc1tdID0gIkhlbGxvIjsKLSAgRVhQRUNUX0VRKHMgKyAyLCBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKHMpLCAwLjUsIFNob3J0KDIpKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIGFuIGFjdGlvbiB0aGF0IHRha2VzIDMgYXJndW1lbnRzLgotVEVTVChXaXRoQXJnc1Rlc3QsIFRocmVlQXJncykgewotICBBY3Rpb248aW50KGludCwgZG91YmxlLCBjaGFyLCBzaG9ydCk+IGEgPSAgLy8gTk9MSU5UCi0gICAgICBXaXRoQXJnczwwLCAyLCAzPihJbnZva2UoVGVybmFyeSkpOwotICBFWFBFQ1RfRVEoMTIzLCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAsIDYuNSwgQ2hhcigyMCksIFNob3J0KDMpKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIGFuIGFjdGlvbiB0aGF0IHRha2VzIDQgYXJndW1lbnRzLgotVEVTVChXaXRoQXJnc1Rlc3QsIEZvdXJBcmdzKSB7Ci0gIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBkb3VibGUsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPQotICAgICAgV2l0aEFyZ3M8NCwgMywgMSwgMD4oSW52b2tlKENvbmNhdDQpKTsKLSAgRVhQRUNUX0VRKCI0MzEwIiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMCIpLCBDaGFyUHRyKCIxIiksIDIuNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiMyIpLCBDaGFyUHRyKCI0IikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgNSBhcmd1bWVudHMuCi1URVNUKFdpdGhBcmdzVGVzdCwgRml2ZUFyZ3MpIHsKLSAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPQotICAgICAgV2l0aEFyZ3M8NCwgMywgMiwgMSwgMD4oSW52b2tlKENvbmNhdDUpKTsKLSAgRVhQRUNUX0VRKCI0MzIxMCIsCi0gICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIwIiksIENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiMyIpLCBDaGFyUHRyKCI0IikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgNiBhcmd1bWVudHMuCi1URVNUKFdpdGhBcmdzVGVzdCwgU2l4QXJncykgewotICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KLSAgICAgIFdpdGhBcmdzPDAsIDEsIDIsIDIsIDEsIDA+KEludm9rZShDb25jYXQ2KSk7Ci0gIEVYUEVDVF9FUSgiMDEyMjEwIiwKLSAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjAiKSwgQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgNyBhcmd1bWVudHMuCi1URVNUKFdpdGhBcmdzVGVzdCwgU2V2ZW5BcmdzKSB7Ci0gIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KLSAgICAgIFdpdGhBcmdzPDAsIDEsIDIsIDMsIDIsIDEsIDA+KEludm9rZShDb25jYXQ3KSk7Ci0gIEVYUEVDVF9FUSgiMDEyMzIxMCIsCi0gICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIwIiksIENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiMyIpKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIGFuIGFjdGlvbiB0aGF0IHRha2VzIDggYXJndW1lbnRzLgotVEVTVChXaXRoQXJnc1Rlc3QsIEVpZ2h0QXJncykgewotICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9Ci0gICAgICBXaXRoQXJnczwwLCAxLCAyLCAzLCAwLCAxLCAyLCAzPihJbnZva2UoQ29uY2F0OCkpOwotICBFWFBFQ1RfRVEoIjAxMjMwMTIzIiwKLSAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjAiKSwgQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCIzIikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgOSBhcmd1bWVudHMuCi1URVNUKFdpdGhBcmdzVGVzdCwgTmluZUFyZ3MpIHsKLSAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPQotICAgICAgV2l0aEFyZ3M8MCwgMSwgMiwgMywgMSwgMiwgMywgMiwgMz4oSW52b2tlKENvbmNhdDkpKTsKLSAgRVhQRUNUX0VRKCIwMTIzMTIzMjMiLAotICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMCIpLCBDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjMiKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyAxMCBhcmd1bWVudHMuCi1URVNUKFdpdGhBcmdzVGVzdCwgVGVuQXJncykgewotICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9Ci0gICAgICBXaXRoQXJnczwwLCAxLCAyLCAzLCAyLCAxLCAwLCAxLCAyLCAzPihJbnZva2UoQ29uY2F0MTApKTsKLSAgRVhQRUNUX0VRKCIwMTIzMjEwMTIzIiwKLSAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjAiKSwgQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCIzIikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgaXMgbm90IEludm9rZSgpLgotY2xhc3MgU3Vic3RyYWN0QWN0aW9uIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxpbnQoaW50LCBpbnQpPiB7ICAvLyBOT0xJTlQKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgaW50IFBlcmZvcm0oY29uc3QgdHVwbGU8aW50LCBpbnQ+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGdldDwwPihhcmdzKSAtIGdldDwxPihhcmdzKTsKLSAgfQotfTsKLQotVEVTVChXaXRoQXJnc1Rlc3QsIE5vbkludm9rZUFjdGlvbikgewotICBBY3Rpb248aW50KGNvbnN0IHN0cmluZyYsIGludCwgaW50KT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIFdpdGhBcmdzPDIsIDE+KE1ha2VBY3Rpb24obmV3IFN1YnN0cmFjdEFjdGlvbikpOwotICBFWFBFQ1RfRVEoOCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoc3RyaW5nKCJoaSIpLCAyLCAxMCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3MgdG8gcGFzcyBhbGwgb3JpZ2luYWwgYXJndW1lbnRzIGluIHRoZSBvcmlnaW5hbCBvcmRlci4KLVRFU1QoV2l0aEFyZ3NUZXN0LCBJZGVudGl0eSkgewotICBBY3Rpb248aW50KGludCB4LCBjaGFyIHksIHNob3J0IHopPiBhID0gIC8vIE5PTElOVAotICAgICAgV2l0aEFyZ3M8MCwgMSwgMj4oSW52b2tlKFRlcm5hcnkpKTsKLSAgRVhQRUNUX0VRKDEyMywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwLCBDaGFyKDIwKSwgU2hvcnQoMykpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggcmVwZWF0ZWQgYXJndW1lbnRzLgotVEVTVChXaXRoQXJnc1Rlc3QsIFJlcGVhdGVkQXJndW1lbnRzKSB7Ci0gIEFjdGlvbjxpbnQoYm9vbCwgaW50IG0sIGludCBuKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIFdpdGhBcmdzPDEsIDEsIDEsIDE+KEludm9rZShTdW1PZjQpKTsKLSAgRVhQRUNUX0VRKDQsIGEuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCAxLCAxMCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCByZXZlcnNlZCBhcmd1bWVudCBvcmRlci4KLVRFU1QoV2l0aEFyZ3NUZXN0LCBSZXZlcnNlZEFyZ3VtZW50T3JkZXIpIHsKLSAgQWN0aW9uPGNvbnN0IGNoYXIqKHNob3J0IG4sIGNvbnN0IGNoYXIqIGlucHV0KT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIFdpdGhBcmdzPDEsIDA+KEludm9rZShCaW5hcnkpKTsKLSAgY29uc3QgY2hhciBzW10gPSAiSGVsbG8iOwotICBFWFBFQ1RfRVEocyArIDIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKFNob3J0KDIpLCBDaGFyUHRyKHMpKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIGNvbXBhdGlibGUsIGJ1dCBub3QgaWRlbnRpY2FsLCBhcmd1bWVudCB0eXBlcy4KLVRFU1QoV2l0aEFyZ3NUZXN0LCBBcmdzT2ZDb21wYXRpYmxlVHlwZXMpIHsKLSAgQWN0aW9uPGxvbmcoc2hvcnQgeCwgY2hhciB5LCBkb3VibGUgeiwgY2hhciBjKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIFdpdGhBcmdzPDAsIDEsIDM+KEludm9rZShUZXJuYXJ5KSk7Ci0gIEVYUEVDVF9FUSgxMjMsIGEuUGVyZm9ybShtYWtlX3R1cGxlKFNob3J0KDEwMCksIENoYXIoMjApLCA1LjYsIENoYXIoMykpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB2b2lkLgotVEVTVChXaXRoQXJnc1Rlc3QsIFZvaWRBY3Rpb24pIHsKLSAgQWN0aW9uPHZvaWQoZG91YmxlIHgsIGNoYXIgYywgaW50IG4pPiBhID0gV2l0aEFyZ3M8MiwgMT4oSW52b2tlKFZvaWRCaW5hcnkpKTsKLSAgZ19kb25lID0gZmFsc2U7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEuNSwgJ2EnLCAzKSk7Ci0gIEVYUEVDVF9UUlVFKGdfZG9uZSk7Ci19Ci0KLS8vIFRlc3RzIERvQWxsKGExLCBhMikuCi1URVNUKERvQWxsVGVzdCwgVHdvQWN0aW9ucykgewotICBpbnQgbiA9IDA7Ci0gIEFjdGlvbjxpbnQoaW50Kik+IGEgPSBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4oMikpOwotICBFWFBFQ1RfRVEoMiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJm4pKSk7Ci0gIEVYUEVDVF9FUSgxLCBuKTsKLX0KLQotLy8gVGVzdHMgRG9BbGwoYTEsIGEyLCBhMykuCi1URVNUKERvQWxsVGVzdCwgVGhyZWVBY3Rpb25zKSB7Ci0gIGludCBtID0gMCwgbiA9IDA7Ci0gIEFjdGlvbjxpbnQoaW50KiwgaW50Kik+IGEgPSBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKDMpKTsKLSAgRVhQRUNUX0VRKDMsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbikpKTsKLSAgRVhQRUNUX0VRKDEsIG0pOwotICBFWFBFQ1RfRVEoMiwgbik7Ci19Ci0KLS8vIFRlc3RzIERvQWxsKGExLCBhMiwgYTMsIGE0KS4KLVRFU1QoRG9BbGxUZXN0LCBGb3VyQWN0aW9ucykgewotICBpbnQgbSA9IDAsIG4gPSAwOwotICBjaGFyIGNoID0gJ1wwJzsKLSAgQWN0aW9uPGludChpbnQqLCBpbnQqLCBjaGFyKik+IGEgPSAgLy8gTk9MSU5UCi0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhLlBlcmZvcm0obWFrZV90dXBsZSgmbSwgJm4sICZjaCkpKTsKLSAgRVhQRUNUX0VRKDEsIG0pOwotICBFWFBFQ1RfRVEoMiwgbik7Ci0gIEVYUEVDVF9FUSgnYScsIGNoKTsKLX0KLQotLy8gVGVzdHMgRG9BbGwoYTEsIGEyLCBhMywgYTQsIGE1KS4KLVRFU1QoRG9BbGxUZXN0LCBGaXZlQWN0aW9ucykgewotICBpbnQgbSA9IDAsIG4gPSAwOwotICBjaGFyIGEgPSAnXDAnLCBiID0gJ1wwJzsKLSAgQWN0aW9uPGludChpbnQqLCBpbnQqLCBjaGFyKiwgY2hhciopPiBhY3Rpb24gPSAgLy8gTk9MSU5UCi0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mz4oJ2InKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmEsICZiKSkpOwotICBFWFBFQ1RfRVEoMSwgbSk7Ci0gIEVYUEVDVF9FUSgyLCBuKTsKLSAgRVhQRUNUX0VRKCdhJywgYSk7Ci0gIEVYUEVDVF9FUSgnYicsIGIpOwotfQotCi0vLyBUZXN0cyBEb0FsbChhMSwgYTIsIC4uLiwgYTYpLgotVEVTVChEb0FsbFRlc3QsIFNpeEFjdGlvbnMpIHsKLSAgaW50IG0gPSAwLCBuID0gMDsKLSAgY2hhciBhID0gJ1wwJywgYiA9ICdcMCcsIGMgPSAnXDAnOwotICBBY3Rpb248aW50KGludCosIGludCosIGNoYXIqLCBjaGFyKiwgY2hhciopPiBhY3Rpb24gPSAgLy8gTk9MSU5UCi0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mz4oJ2InKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8ND4oJ2MnKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmEsICZiLCAmYykpKTsKLSAgRVhQRUNUX0VRKDEsIG0pOwotICBFWFBFQ1RfRVEoMiwgbik7Ci0gIEVYUEVDVF9FUSgnYScsIGEpOwotICBFWFBFQ1RfRVEoJ2InLCBiKTsKLSAgRVhQRUNUX0VRKCdjJywgYyk7Ci19Ci0KLS8vIFRlc3RzIERvQWxsKGExLCBhMiwgLi4uLCBhNykuCi1URVNUKERvQWxsVGVzdCwgU2V2ZW5BY3Rpb25zKSB7Ci0gIGludCBtID0gMCwgbiA9IDA7Ci0gIGNoYXIgYSA9ICdcMCcsIGIgPSAnXDAnLCBjID0gJ1wwJywgZCA9ICdcMCc7Ci0gIEFjdGlvbjxpbnQoaW50KiwgaW50KiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciopPiBhY3Rpb24gPSAgLy8gTk9MSU5UCi0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mz4oJ2InKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8ND4oJ2MnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8NT4oJ2QnKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmEsICZiLCAmYywgJmQpKSk7Ci0gIEVYUEVDVF9FUSgxLCBtKTsKLSAgRVhQRUNUX0VRKDIsIG4pOwotICBFWFBFQ1RfRVEoJ2EnLCBhKTsKLSAgRVhQRUNUX0VRKCdiJywgYik7Ci0gIEVYUEVDVF9FUSgnYycsIGMpOwotICBFWFBFQ1RfRVEoJ2QnLCBkKTsKLX0KLQotLy8gVGVzdHMgRG9BbGwoYTEsIGEyLCAuLi4sIGE4KS4KLVRFU1QoRG9BbGxUZXN0LCBFaWdodEFjdGlvbnMpIHsKLSAgaW50IG0gPSAwLCBuID0gMDsKLSAgY2hhciBhID0gJ1wwJywgYiA9ICdcMCcsIGMgPSAnXDAnLCBkID0gJ1wwJywgZSA9ICdcMCc7Ci0gIEFjdGlvbjxpbnQoaW50KiwgaW50KiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciosICAvLyBOT0xJTlQKLSAgICAgICAgICAgICBjaGFyKik+IGFjdGlvbiA9Ci0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mz4oJ2InKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8ND4oJ2MnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8NT4oJ2QnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Nj4oJ2UnKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmEsICZiLCAmYywgJmQsICZlKSkpOwotICBFWFBFQ1RfRVEoMSwgbSk7Ci0gIEVYUEVDVF9FUSgyLCBuKTsKLSAgRVhQRUNUX0VRKCdhJywgYSk7Ci0gIEVYUEVDVF9FUSgnYicsIGIpOwotICBFWFBFQ1RfRVEoJ2MnLCBjKTsKLSAgRVhQRUNUX0VRKCdkJywgZCk7Ci0gIEVYUEVDVF9FUSgnZScsIGUpOwotfQotCi0vLyBUZXN0cyBEb0FsbChhMSwgYTIsIC4uLiwgYTkpLgotVEVTVChEb0FsbFRlc3QsIE5pbmVBY3Rpb25zKSB7Ci0gIGludCBtID0gMCwgbiA9IDA7Ci0gIGNoYXIgYSA9ICdcMCcsIGIgPSAnXDAnLCBjID0gJ1wwJywgZCA9ICdcMCcsIGUgPSAnXDAnLCBmID0gJ1wwJzsKLSAgQWN0aW9uPGludChpbnQqLCBpbnQqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKiwgIC8vIE5PTElOVAotICAgICAgICAgICAgIGNoYXIqLCBjaGFyKik+IGFjdGlvbiA9Ci0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mz4oJ2InKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8ND4oJ2MnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8NT4oJ2QnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Nj4oJ2UnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Nz4oJ2YnKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmEsICZiLCAmYywgJmQsICZlLCAmZikpKTsKLSAgRVhQRUNUX0VRKDEsIG0pOwotICBFWFBFQ1RfRVEoMiwgbik7Ci0gIEVYUEVDVF9FUSgnYScsIGEpOwotICBFWFBFQ1RfRVEoJ2InLCBiKTsKLSAgRVhQRUNUX0VRKCdjJywgYyk7Ci0gIEVYUEVDVF9FUSgnZCcsIGQpOwotICBFWFBFQ1RfRVEoJ2UnLCBlKTsKLSAgRVhQRUNUX0VRKCdmJywgZik7Ci19Ci0KLS8vIFRlc3RzIERvQWxsKGExLCBhMiwgLi4uLCBhMTApLgotVEVTVChEb0FsbFRlc3QsIFRlbkFjdGlvbnMpIHsKLSAgaW50IG0gPSAwLCBuID0gMDsKLSAgY2hhciBhID0gJ1wwJywgYiA9ICdcMCcsIGMgPSAnXDAnLCBkID0gJ1wwJzsKLSAgY2hhciBlID0gJ1wwJywgZiA9ICdcMCcsIGcgPSAnXDAnOwotICBBY3Rpb248aW50KGludCosIGludCosIGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqLCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgY2hhciosIGNoYXIqLCBjaGFyKik+IGFjdGlvbiA9Ci0gICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLAotICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwxPigyKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Mz4oJ2InKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8ND4oJ2MnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8NT4oJ2QnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Nj4oJ2UnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8Nz4oJ2YnKSwKLSAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8OD4oJ2cnKSwKLSAgICAgICAgICAgIFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgzLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmEsICZiLCAmYywgJmQsICZlLCAmZiwgJmcpKSk7Ci0gIEVYUEVDVF9FUSgxLCBtKTsKLSAgRVhQRUNUX0VRKDIsIG4pOwotICBFWFBFQ1RfRVEoJ2EnLCBhKTsKLSAgRVhQRUNUX0VRKCdiJywgYik7Ci0gIEVYUEVDVF9FUSgnYycsIGMpOwotICBFWFBFQ1RfRVEoJ2QnLCBkKTsKLSAgRVhQRUNUX0VRKCdlJywgZSk7Ci0gIEVYUEVDVF9FUSgnZicsIGYpOwotICBFWFBFQ1RfRVEoJ2cnLCBnKTsKLX0KLQotLy8gVGhlIEFDVElPTiooKSBtYWNyb3MgdHJpZ2dlciB3YXJuaW5nIEM0MTAwICh1bnJlZmVyZW5jZWQgZm9ybWFsCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluCi0vLyB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgYXMgdGhlIHdhcm5pbmdzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgbWFjcm8KLS8vIGlzIGV4cGFuZGVkIGFuZCBtYWNybyBleHBhbnNpb24gY2Fubm90IGNvbnRhaW4gI3ByYWdtYS4gIFRoZXJlZm9yZQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKLSNlbmRpZgotCi0vLyBUZXN0cyB0aGUgQUNUSU9OKigpIG1hY3JvIGZhbWlseS4KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT04oKSBjYW4gZGVmaW5lIGFuIGFjdGlvbiB0aGF0IGRvZXNuJ3QgcmVmZXJlbmNlIHRoZQotLy8gbW9jayBmdW5jdGlvbiBhcmd1bWVudHMuCi1BQ1RJT04oUmV0dXJuNSkgeyByZXR1cm4gNTsgfQotCi1URVNUKEFjdGlvbk1hY3JvVGVzdCwgV29ya3NXaGVuTm90UmVmZXJlbmNpbmdBcmd1bWVudHMpIHsKLSAgQWN0aW9uPGRvdWJsZSgpPiBhMSA9IFJldHVybjUoKTsKLSAgRVhQRUNUX0RPVUJMRV9FUSg1LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotCi0gIEFjdGlvbjxpbnQoZG91YmxlLCBib29sKT4gYTIgPSBSZXR1cm41KCk7Ci0gIEVYUEVDVF9FUSg1LCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoMSwgdHJ1ZSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT04oKSBjYW4gZGVmaW5lIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdm9pZC4KLUFDVElPTihJbmNyZW1lbnRBcmcxKSB7ICgqYXJnMSkrKzsgfQotCi1URVNUKEFjdGlvbk1hY3JvVGVzdCwgV29ya3NXaGVuUmV0dXJuaW5nVm9pZCkgewotICBBY3Rpb248dm9pZChpbnQsIGludCopPiBhMSA9IEluY3JlbWVudEFyZzEoKTsKLSAgaW50IG4gPSAwOwotICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoNSwgJm4pKTsKLSAgRVhQRUNUX0VRKDEsIG4pOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBib2R5IG9mIEFDVElPTigpIGNhbiByZWZlcmVuY2UgdGhlIHR5cGUgb2YgdGhlCi0vLyBhcmd1bWVudC4KLUFDVElPTihJbmNyZW1lbnRBcmcyKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQqLCBhcmcyX3R5cGU+KCk7Ci0gIGFyZzJfdHlwZSB0ZW1wID0gYXJnMjsKLSAgKCp0ZW1wKSsrOwotfQotCi1URVNUKEFjdGlvbk1hY3JvVGVzdCwgQ2FuUmVmZXJlbmNlQXJndW1lbnRUeXBlKSB7Ci0gIEFjdGlvbjx2b2lkKGludCwgYm9vbCwgaW50Kik+IGExID0gSW5jcmVtZW50QXJnMigpOwotICBpbnQgbiA9IDA7Ci0gIGExLlBlcmZvcm0obWFrZV90dXBsZSg1LCBmYWxzZSwgJm4pKTsKLSAgRVhQRUNUX0VRKDEsIG4pOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBib2R5IG9mIEFDVElPTigpIGNhbiByZWZlcmVuY2UgdGhlIGFyZ3VtZW50IHR1cGxlCi0vLyB2aWEgYXJnc190eXBlIGFuZCBhcmdzLgotQUNUSU9OKFN1bTIpIHsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPHR1cGxlPGludCwgY2hhciwgaW50Kj4sIGFyZ3NfdHlwZT4oKTsKLSAgYXJnc190eXBlIGFyZ3NfY29weSA9IGFyZ3M7Ci0gIHJldHVybiBnZXQ8MD4oYXJnc19jb3B5KSArIGdldDwxPihhcmdzX2NvcHkpOwotfQotCi1URVNUKEFjdGlvbk1hY3JvVGVzdCwgQ2FuUmVmZXJlbmNlQXJndW1lbnRUdXBsZSkgewotICBBY3Rpb248aW50KGludCwgY2hhciwgaW50Kik+IGExID0gU3VtMigpOwotICBpbnQgZHVtbXkgPSAwOwotICBFWFBFQ1RfRVEoMTEsIGExLlBlcmZvcm0obWFrZV90dXBsZSg1LCBDaGFyKDYpLCAmZHVtbXkpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIGJvZHkgb2YgQUNUSU9OKCkgY2FuIHJlZmVyZW5jZSB0aGUgbW9jayBmdW5jdGlvbgotLy8gdHlwZS4KLWludCBEdW1teShib29sIGZsYWcpIHsgcmV0dXJuIGZsYWc/IDEgOiAwOyB9Ci0KLUFDVElPTihJbnZva2VEdW1teSkgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50KGJvb2wpLCBmdW5jdGlvbl90eXBlPigpOwotICBmdW5jdGlvbl90eXBlKiBmcCA9ICZEdW1teTsKLSAgcmV0dXJuICgqZnApKHRydWUpOwotfQotCi1URVNUKEFjdGlvbk1hY3JvVGVzdCwgQ2FuUmVmZXJlbmNlTW9ja0Z1bmN0aW9uVHlwZSkgewotICBBY3Rpb248aW50KGJvb2wpPiBhMSA9IEludm9rZUR1bW15KCk7Ci0gIEVYUEVDVF9FUSgxLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSkpKTsKLSAgRVhQRUNUX0VRKDEsIGExLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgYm9keSBvZiBBQ1RJT04oKSBjYW4gcmVmZXJlbmNlIHRoZSBtb2NrIGZ1bmN0aW9uJ3MKLS8vIHJldHVybiB0eXBlLgotQUNUSU9OKEludm9rZUR1bW15MikgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCByZXR1cm5fdHlwZT4oKTsKLSAgcmV0dXJuX3R5cGUgcmVzdWx0ID0gRHVtbXkodHJ1ZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLVRFU1QoQWN0aW9uTWFjcm9UZXN0LCBDYW5SZWZlcmVuY2VNb2NrRnVuY3Rpb25SZXR1cm5UeXBlKSB7Ci0gIEFjdGlvbjxpbnQoYm9vbCk+IGExID0gSW52b2tlRHVtbXkyKCk7Ci0gIEVYUEVDVF9FUSgxLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSkpKTsKLSAgRVhQRUNUX0VRKDEsIGExLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT04oKSB3b3JrcyBmb3IgYXJndW1lbnRzIHBhc3NlZCBieSBjb25zdCByZWZlcmVuY2UuCi1BQ1RJT04oUmV0dXJuQWRkck9mQ29uc3RCb29sUmVmZXJlbmNlQXJnKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBib29sJiwgYXJnMV90eXBlPigpOwotICByZXR1cm4gJmFyZzE7Ci19Ci0KLVRFU1QoQWN0aW9uTWFjcm9UZXN0LCBXb3Jrc0ZvckNvbnN0UmVmZXJlbmNlQXJnKSB7Ci0gIEFjdGlvbjxjb25zdCBib29sKihpbnQsIGNvbnN0IGJvb2wmKT4gYSA9IFJldHVybkFkZHJPZkNvbnN0Qm9vbFJlZmVyZW5jZUFyZygpOwotICBjb25zdCBib29sIGIgPSBmYWxzZTsKLSAgRVhQRUNUX0VRKCZiLCBhLlBlcmZvcm0odHVwbGU8aW50LCBjb25zdCBib29sJj4oMCwgYikpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT04oKSB3b3JrcyBmb3IgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLgotQUNUSU9OKFJldHVybkFkZHJPZkludFJlZmVyZW5jZUFyZykgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50JiwgYXJnMF90eXBlPigpOwotICByZXR1cm4gJmFyZzA7Ci19Ci0KLVRFU1QoQWN0aW9uTWFjcm9UZXN0LCBXb3Jrc0Zvck5vbkNvbnN0UmVmZXJlbmNlQXJnKSB7Ci0gIEFjdGlvbjxpbnQqKGludCYsIGJvb2wsIGludCk+IGEgPSBSZXR1cm5BZGRyT2ZJbnRSZWZlcmVuY2VBcmcoKTsKLSAgaW50IG4gPSAwOwotICBFWFBFQ1RfRVEoJm4sIGEuUGVyZm9ybSh0dXBsZTxpbnQmLCBib29sLCBpbnQ+KG4sIHRydWUsIDEpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQUNUSU9OKCkgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2UuCi1uYW1lc3BhY2UgYWN0aW9uX3Rlc3QgewotQUNUSU9OKFN1bSkgeyByZXR1cm4gYXJnMCArIGFyZzE7IH0KLX0gIC8vIG5hbWVzcGFjZSBhY3Rpb25fdGVzdAotCi1URVNUKEFjdGlvbk1hY3JvVGVzdCwgV29ya3NJbk5hbWVzcGFjZSkgewotICBBY3Rpb248aW50KGludCwgaW50KT4gYTEgPSBhY3Rpb25fdGVzdDo6U3VtKCk7Ci0gIEVYUEVDVF9FUSgzLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMSwgMikpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSBBQ1RJT04gZGVmaW5pdGlvbiB3b3JrcyBmb3IgbW9jayBmdW5jdGlvbnMgd2l0aAotLy8gZGlmZmVyZW50IGFyZ3VtZW50IG51bWJlcnMuCi1BQ1RJT04oUGx1c1R3bykgeyByZXR1cm4gYXJnMCArIDI7IH0KLQotVEVTVChBY3Rpb25NYWNyb1Rlc3QsIFdvcmtzRm9yRGlmZmVyZW50QXJndW1lbnROdW1iZXJzKSB7Ci0gIEFjdGlvbjxpbnQoaW50KT4gYTEgPSBQbHVzVHdvKCk7Ci0gIEVYUEVDVF9FUSg0LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMikpKTsKLQotICBBY3Rpb248ZG91YmxlKGZsb2F0LCB2b2lkKik+IGEyID0gUGx1c1R3bygpOwotICBpbnQgZHVtbXk7Ci0gIEVYUEVDVF9ET1VCTEVfRVEoNiwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKDQuMGYsICZkdW1teSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT05fUCBjYW4gZGVmaW5lIGEgcGFyYW1ldGVyaXplZCBhY3Rpb24uCi1BQ1RJT05fUChQbHVzLCBuKSB7IHJldHVybiBhcmcwICsgbjsgfQotCi1URVNUKEFjdGlvblBNYWNyb1Rlc3QsIERlZmluZXNQYXJhbWV0ZXJpemVkQWN0aW9uKSB7Ci0gIEFjdGlvbjxpbnQoaW50IG0sIGJvb2wgdCk+IGExID0gUGx1cyg5KTsKLSAgRVhQRUNUX0VRKDEwLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMSwgdHJ1ZSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgYm9keSBvZiBBQ1RJT05fUCBjYW4gcmVmZXJlbmNlIHRoZSBhcmd1bWVudCB0eXBlcwotLy8gYW5kIHRoZSBwYXJhbWV0ZXIgdHlwZS4KLUFDVElPTl9QKFR5cGVkUGx1cywgbikgewotICBhcmcwX3R5cGUgdDEgPSBhcmcwOwotICBuX3R5cGUgdDIgPSBuOwotICByZXR1cm4gdDEgKyB0MjsKLX0KLQotVEVTVChBY3Rpb25QTWFjcm9UZXN0LCBDYW5SZWZlcmVuY2VBcmd1bWVudEFuZFBhcmFtZXRlclR5cGVzKSB7Ci0gIEFjdGlvbjxpbnQoY2hhciBtLCBib29sIHQpPiBhMSA9IFR5cGVkUGx1cyg5KTsKLSAgRVhQRUNUX0VRKDEwLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhcigxKSwgdHJ1ZSkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgYWN0aW9uIGNhbiBiZSB1c2VkIGluIGFueSBtb2NrIGZ1bmN0aW9uCi0vLyB3aG9zZSB0eXBlIGlzIGNvbXBhdGlibGUuCi1URVNUKEFjdGlvblBNYWNyb1Rlc3QsIFdvcmtzSW5Db21wYXRpYmxlTW9ja0Z1bmN0aW9uKSB7Ci0gIEFjdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcyk+IGExID0gUGx1cygidGFpbCIpOwotICBjb25zdCBzdGQ6OnN0cmluZyByZSA9ICJyZSI7Ci0gIEVYUEVDVF9FUSgicmV0YWlsIiwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHJlKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiB1c2UgQUNUSU9OKigpIHRvIGRlZmluZSBhY3Rpb25zIG92ZXJsb2FkZWQgb24gdGhlCi0vLyBudW1iZXIgb2YgcGFyYW1ldGVycy4KLQotQUNUSU9OKE92ZXJsb2FkZWRBY3Rpb24pIHsgcmV0dXJuIGFyZzAgPyBhcmcxIDogImhlbGxvIjsgfQotCi1BQ1RJT05fUChPdmVybG9hZGVkQWN0aW9uLCBkZWZhdWx0X3ZhbHVlKSB7Ci0gIHJldHVybiBhcmcwID8gYXJnMSA6IGRlZmF1bHRfdmFsdWU7Ci19Ci0KLUFDVElPTl9QMihPdmVybG9hZGVkQWN0aW9uLCB0cnVlX3ZhbHVlLCBmYWxzZV92YWx1ZSkgewotICByZXR1cm4gYXJnMCA/IHRydWVfdmFsdWUgOiBmYWxzZV92YWx1ZTsKLX0KLQotVEVTVChBY3Rpb25NYWNyb1Rlc3QsIENhbkRlZmluZU92ZXJsb2FkZWRBY3Rpb25zKSB7Ci0gIHR5cGVkZWYgQWN0aW9uPGNvbnN0IGNoYXIqKGJvb2wsIGNvbnN0IGNoYXIqKT4gTXlBY3Rpb247Ci0KLSAgY29uc3QgTXlBY3Rpb24gYTEgPSBPdmVybG9hZGVkQWN0aW9uKCk7Ci0gIEVYUEVDVF9TVFJFUSgiaGVsbG8iLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIENoYXJQdHIoIndvcmxkIikpKSk7Ci0gIEVYUEVDVF9TVFJFUSgid29ybGQiLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgQ2hhclB0cigid29ybGQiKSkpKTsKLQotICBjb25zdCBNeUFjdGlvbiBhMiA9IE92ZXJsb2FkZWRBY3Rpb24oImhpIik7Ci0gIEVYUEVDVF9TVFJFUSgiaGkiLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIENoYXJQdHIoIndvcmxkIikpKSk7Ci0gIEVYUEVDVF9TVFJFUSgid29ybGQiLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgQ2hhclB0cigid29ybGQiKSkpKTsKLQotICBjb25zdCBNeUFjdGlvbiBhMyA9IE92ZXJsb2FkZWRBY3Rpb24oImhpIiwgInlvdSIpOwotICBFWFBFQ1RfU1RSRVEoImhpIiwgYTMuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIENoYXJQdHIoIndvcmxkIikpKSk7Ci0gIEVYUEVDVF9TVFJFUSgieW91IiwgYTMuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCBDaGFyUHRyKCJ3b3JsZCIpKSkpOwotfQotCi0vLyBUZXN0cyBBQ1RJT05fUG4gd2hlcmUgbiA+PSAzLgotCi1BQ1RJT05fUDMoUGx1cywgbSwgbiwgaykgeyByZXR1cm4gYXJnMCArIG0gKyBuICsgazsgfQotCi1URVNUKEFjdGlvblBuTWFjcm9UZXN0LCBXb3Jrc0ZvcjNQYXJhbWV0ZXJzKSB7Ci0gIEFjdGlvbjxkb3VibGUoaW50IG0sIGJvb2wgdCk+IGExID0gUGx1cygxMDAsIDIwLCAzLjQpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDMxMjMuNCwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDMwMDAsIHRydWUpKSk7Ci0KLSAgQWN0aW9uPHN0ZDo6c3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKT4gYTIgPSBQbHVzKCJ0YWlsIiwgIi0iLCAiPiIpOwotICBjb25zdCBzdGQ6OnN0cmluZyByZSA9ICJyZSI7Ci0gIEVYUEVDVF9FUSgicmV0YWlsLT4iLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUocmUpKSk7Ci19Ci0KLUFDVElPTl9QNChQbHVzLCBwMCwgcDEsIHAyLCBwMykgeyByZXR1cm4gYXJnMCArIHAwICsgcDEgKyBwMiArIHAzOyB9Ci0KLVRFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIFdvcmtzRm9yNFBhcmFtZXRlcnMpIHsKLSAgQWN0aW9uPGludChpbnQpPiBhMSA9IFBsdXMoMSwgMiwgMywgNCk7Ci0gIEVYUEVDVF9FUSgxMCArIDEgKyAyICsgMyArIDQsIGExLlBlcmZvcm0obWFrZV90dXBsZSgxMCkpKTsKLX0KLQotQUNUSU9OX1A1KFBsdXMsIHAwLCBwMSwgcDIsIHAzLCBwNCkgeyByZXR1cm4gYXJnMCArIHAwICsgcDEgKyBwMiArIHAzICsgcDQ7IH0KLQotVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3I1UGFyYW1ldGVycykgewotICBBY3Rpb248aW50KGludCk+IGExID0gUGx1cygxLCAyLCAzLCA0LCA1KTsKLSAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCArIDUsIGExLlBlcmZvcm0obWFrZV90dXBsZSgxMCkpKTsKLX0KLQotQUNUSU9OX1A2KFBsdXMsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpIHsKLSAgcmV0dXJuIGFyZzAgKyBwMCArIHAxICsgcDIgKyBwMyArIHA0ICsgcDU7Ci19Ci0KLVRFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIFdvcmtzRm9yNlBhcmFtZXRlcnMpIHsKLSAgQWN0aW9uPGludChpbnQpPiBhMSA9IFBsdXMoMSwgMiwgMywgNCwgNSwgNik7Ci0gIEVYUEVDVF9FUSgxMCArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwKSkpOwotfQotCi1BQ1RJT05fUDcoUGx1cywgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpIHsKLSAgcmV0dXJuIGFyZzAgKyBwMCArIHAxICsgcDIgKyBwMyArIHA0ICsgcDUgKyBwNjsKLX0KLQotVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3I3UGFyYW1ldGVycykgewotICBBY3Rpb248aW50KGludCk+IGExID0gUGx1cygxLCAyLCAzLCA0LCA1LCA2LCA3KTsKLSAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNywgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwKSkpOwotfQotCi1BQ1RJT05fUDgoUGx1cywgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KSB7Ci0gIHJldHVybiBhcmcwICsgcDAgKyBwMSArIHAyICsgcDMgKyBwNCArIHA1ICsgcDYgKyBwNzsKLX0KLQotVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3I4UGFyYW1ldGVycykgewotICBBY3Rpb248aW50KGludCk+IGExID0gUGx1cygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KTsKLSAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNyArIDgsIGExLlBlcmZvcm0obWFrZV90dXBsZSgxMCkpKTsKLX0KLQotQUNUSU9OX1A5KFBsdXMsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpIHsKLSAgcmV0dXJuIGFyZzAgKyBwMCArIHAxICsgcDIgKyBwMyArIHA0ICsgcDUgKyBwNiArIHA3ICsgcDg7Ci19Ci0KLVRFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIFdvcmtzRm9yOVBhcmFtZXRlcnMpIHsKLSAgQWN0aW9uPGludChpbnQpPiBhMSA9IFBsdXMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSk7Ci0gIEVYUEVDVF9FUSgxMCArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcgKyA4ICsgOSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwKSkpOwotfQotCi1BQ1RJT05fUDEwKFBsdXMsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIGxhc3RfcGFyYW0pIHsKLSAgYXJnMF90eXBlIHQwID0gYXJnMDsKLSAgbGFzdF9wYXJhbV90eXBlIHQ5ID0gbGFzdF9wYXJhbTsKLSAgcmV0dXJuIHQwICsgcDAgKyBwMSArIHAyICsgcDMgKyBwNCArIHA1ICsgcDYgKyBwNyArIHA4ICsgdDk7Ci19Ci0KLVRFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIFdvcmtzRm9yMTBQYXJhbWV0ZXJzKSB7Ci0gIEFjdGlvbjxpbnQoaW50KT4gYTEgPSBQbHVzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKTsKLSAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNyArIDggKyA5ICsgMTAsCi0gICAgICAgICAgICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMTApKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIGFjdGlvbiBib2R5IGNhbiBwcm9tb3RlIHRoZSBwYXJhbWV0ZXIgdHlwZXMuCi0KLUFDVElPTl9QMihQYWRBcmd1bWVudCwgcHJlZml4LCBzdWZmaXgpIHsKLSAgLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwcm9tb3RlIHRoZSB0d28gcGFyYW1ldGVycyB0byBkZXNpcmVkIHR5cGVzLgotICBzdGQ6OnN0cmluZyBwcmVmaXhfc3RyKHByZWZpeCk7Ci0gIGNoYXIgc3VmZml4X2NoYXIgPSBzdGF0aWNfY2FzdDxjaGFyPihzdWZmaXgpOwotICByZXR1cm4gcHJlZml4X3N0ciArIGFyZzAgKyBzdWZmaXhfY2hhcjsKLX0KLQotVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgU2ltcGxlVHlwZVByb21vdGlvbikgewotICBBY3Rpb248c3RkOjpzdHJpbmcoY29uc3QgY2hhciopPiBub19wcm9tbyA9Ci0gICAgICBQYWRBcmd1bWVudChzdGQ6OnN0cmluZygiZm9vIiksICdyJyk7Ci0gIEFjdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBjaGFyKik+IHByb21vID0KLSAgICAgIFBhZEFyZ3VtZW50KCJmb28iLCBzdGF0aWNfY2FzdDxpbnQ+KCdyJykpOwotICBFWFBFQ1RfRVEoImZvb2JhciIsIG5vX3Byb21vLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCJiYSIpKSkpOwotICBFWFBFQ1RfRVEoImZvb2JhciIsIHByb21vLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCJiYSIpKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiBwYXJ0aWFsbHkgcmVzdHJpY3QgcGFyYW1ldGVyIHR5cGVzIHVzaW5nIGEKLS8vIHN0cmFpZ2h0LWZvcndhcmQgcGF0dGVybi4KLQotLy8gRGVmaW5lcyBhIGdlbmVyaWMgYWN0aW9uIHRoYXQgZG9lc24ndCByZXN0cmljdCB0aGUgdHlwZXMgb2YgaXRzCi0vLyBwYXJhbWV0ZXJzLgotQUNUSU9OX1AzKENvbmNhdEltcGwsIGEsIGIsIGMpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8IGEgPDwgYiA8PCBjOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIE5leHQsIHdlIHRyeSB0byByZXN0cmljdCB0aGF0IGVpdGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEKLS8vIHN0cmluZywgb3IgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYW4gaW50LgotCi0vLyBEZWZpbmVzIGEgcGFydGlhbGx5IHNwZWNpYWxpemVkIHdyYXBwZXIgdGhhdCByZXN0cmljdHMgdGhlIGZpcnN0Ci0vLyBwYXJhbWV0ZXIgdG8gc3RkOjpzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotLy8gQ29uY2F0SW1wbEFjdGlvblAzIGlzIHRoZSBjbGFzcyB0ZW1wbGF0ZSBBQ1RJT05fUDMgdXNlcyB0bwotLy8gaW1wbGVtZW50IENvbmNhdEltcGwuICBXZSBzaG91bGRuJ3QgY2hhbmdlIHRoZSBuYW1lIGFzIHRoaXMKLS8vIHBhdHRlcm4gcmVxdWlyZXMgdGhlIHVzZXIgdG8gdXNlIGl0IGRpcmVjdGx5LgotQ29uY2F0SW1wbEFjdGlvblAzPHN0ZDo6c3RyaW5nLCBUMSwgVDI+Ci1Db25jYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGEsIFQxIGIsIFQyIGMpIHsKLSAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCi0gIGlmICh0cnVlKSB7Ci0gIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUE9QXygpCi0gICAgLy8gVGhpcyBicmFuY2ggdmVyaWZpZXMgdGhhdCBDb25jYXRJbXBsKCkgY2FuIGJlIGludm9rZWQgd2l0aG91dAotICAgIC8vIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cy4KLSAgICByZXR1cm4gQ29uY2F0SW1wbChhLCBiLCBjKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUaGlzIGJyYW5jaCB2ZXJpZmllcyB0aGF0IENvbmNhdEltcGwoKSBjYW4gYWxzbyBiZSBpbnZva2VkIHdpdGgKLSAgICAvLyBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudHMuICBJdCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvIGJlCi0gICAgLy8gZXhlY3V0ZWQgYXMgdGhpcyBpcyBhIGNvbXBpbGUtdGltZSB2ZXJpZmljYXRpb24uCi0gICAgcmV0dXJuIENvbmNhdEltcGw8c3RkOjpzdHJpbmcsIFQxLCBUMj4oYSwgYiwgYyk7Ci0gIH0KLX0KLQotLy8gRGVmaW5lcyBhbm90aGVyIHBhcnRpYWxseSBzcGVjaWFsaXplZCB3cmFwcGVyIHRoYXQgcmVzdHJpY3RzIHRoZQotLy8gc2Vjb25kIHBhcmFtZXRlciB0byBpbnQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotQ29uY2F0SW1wbEFjdGlvblAzPFQxLCBpbnQsIFQyPgotQ29uY2F0KFQxIGEsIGludCBiLCBUMiBjKSB7Ci0gIHJldHVybiBDb25jYXRJbXBsKGEsIGIsIGMpOwotfQotCi1URVNUKEFjdGlvblBuTWFjcm9UZXN0LCBDYW5QYXJ0aWFsbHlSZXN0cmljdFBhcmFtZXRlclR5cGVzKSB7Ci0gIEFjdGlvbjxjb25zdCBzdGQ6OnN0cmluZygpPiBhMSA9IENvbmNhdCgiSGVsbG8iLCAiMSIsIDIpOwotICBFWFBFQ1RfRVEoIkhlbGxvMTIiLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotCi0gIGExID0gQ29uY2F0KDEsIDIsIDMpOwotICBFWFBFQ1RfRVEoIjEyMyIsIGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci19Ci0KLS8vIFZlcmlmaWVzIHRoZSB0eXBlIG9mIGFuIEFDVElPTiouCi0KLUFDVElPTihEb0Zvbykge30KLUFDVElPTl9QKERvRm9vLCBwKSB7fQotQUNUSU9OX1AyKERvRm9vLCBwMCwgcDEpIHt9Ci0KLVRFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIFR5cGVzQXJlQ29ycmVjdCkgewotICAvLyBEb0ZvbygpIG11c3QgYmUgYXNzaWduYWJsZSB0byBhIERvRm9vQWN0aW9uIHZhcmlhYmxlLgotICBEb0Zvb0FjdGlvbiBhMCA9IERvRm9vKCk7Ci0KLSAgLy8gRG9Gb28oMSkgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIGEgRG9Gb29BY3Rpb25QIHZhcmlhYmxlLgotICBEb0Zvb0FjdGlvblA8aW50PiBhMSA9IERvRm9vKDEpOwotCi0gIC8vIERvRm9vKHAxLCAuLi4sIHBrKSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gYSBEb0Zvb0FjdGlvblBrCi0gIC8vIHZhcmlhYmxlLCBhbmQgc28gb24uCi0gIERvRm9vQWN0aW9uUDI8aW50LCBjaGFyPiBhMiA9IERvRm9vKDEsICcyJyk7Ci0gIFBsdXNBY3Rpb25QMzxpbnQsIGludCwgY2hhcj4gYTMgPSBQbHVzKDEsIDIsICczJyk7Ci0gIFBsdXNBY3Rpb25QNDxpbnQsIGludCwgaW50LCBjaGFyPiBhNCA9IFBsdXMoMSwgMiwgMywgJzQnKTsKLSAgUGx1c0FjdGlvblA1PGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTUgPSBQbHVzKDEsIDIsIDMsIDQsICc1Jyk7Ci0gIFBsdXNBY3Rpb25QNjxpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTYgPSBQbHVzKDEsIDIsIDMsIDQsIDUsICc2Jyk7Ci0gIFBsdXNBY3Rpb25QNzxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhNyA9Ci0gICAgICBQbHVzKDEsIDIsIDMsIDQsIDUsIDYsICc3Jyk7Ci0gIFBsdXNBY3Rpb25QODxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGE4ID0KLSAgICAgIFBsdXMoMSwgMiwgMywgNCwgNSwgNiwgNywgJzgnKTsKLSAgUGx1c0FjdGlvblA5PGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhOSA9Ci0gICAgICBQbHVzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsICc5Jyk7Ci0gIFBsdXNBY3Rpb25QMTA8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTEwID0KLSAgICAgIFBsdXMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgJzAnKTsKLQotICAvLyBBdm9pZCAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5ncy4KLSAgKHZvaWQpYTA7Ci0gICh2b2lkKWExOwotICAodm9pZClhMjsKLSAgKHZvaWQpYTM7Ci0gICh2b2lkKWE0OwotICAodm9pZClhNTsKLSAgKHZvaWQpYTY7Ci0gICh2b2lkKWE3OwotICAodm9pZClhODsKLSAgKHZvaWQpYTk7Ci0gICh2b2lkKWExMDsKLX0KLQotLy8gVGVzdHMgdGhhdCBhbiBBQ1RJT05fUCooKSBhY3Rpb24gY2FuIGJlIGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkCi0vLyB3aXRoIHJlZmVyZW5jZS10eXBlZCBwYXJhbWV0ZXJzLgotCi1BQ1RJT05fUChQbHVzMSwgeCkgeyByZXR1cm4geDsgfQotQUNUSU9OX1AyKFBsdXMyLCB4LCB5KSB7IHJldHVybiB4ICsgeTsgfQotQUNUSU9OX1AzKFBsdXMzLCB4LCB5LCB6KSB7IHJldHVybiB4ICsgeSArIHo7IH0KLUFDVElPTl9QMTAoUGx1czEwLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkgewotICByZXR1cm4gYTAgKyBhMSArIGEyICsgYTMgKyBhNCArIGE1ICsgYTYgKyBhNyArIGE4ICsgYTk7Ci19Ci0KLVRFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIENhbkV4cGxpY2l0bHlJbnN0YW50aWF0ZVdpdGhSZWZlcmVuY2VUeXBlcykgewotICBpbnQgeCA9IDEsIHkgPSAyLCB6ID0gMzsKLSAgY29uc3QgdHVwbGU8PiBlbXB0eSA9IG1ha2VfdHVwbGUoKTsKLQotICBBY3Rpb248aW50KCk+IGEgPSBQbHVzMTxpbnQmPih4KTsKLSAgRVhQRUNUX0VRKDEsIGEuUGVyZm9ybShlbXB0eSkpOwotCi0gIGEgPSBQbHVzMjxjb25zdCBpbnQmLCBpbnQmPih4LCB5KTsKLSAgRVhQRUNUX0VRKDMsIGEuUGVyZm9ybShlbXB0eSkpOwotCi0gIGEgPSBQbHVzMzxpbnQmLCBjb25zdCBpbnQmLCBpbnQmPih4LCB5LCB6KTsKLSAgRVhQRUNUX0VRKDYsIGEuUGVyZm9ybShlbXB0eSkpOwotCi0gIGludCBuWzEwXSA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAgfTsKLSAgYSA9IFBsdXMxMDxjb25zdCBpbnQmLCBpbnQmLCBjb25zdCBpbnQmLCBpbnQmLCBjb25zdCBpbnQmLCBpbnQmLCBjb25zdCBpbnQmLAotICAgICAgaW50JiwgY29uc3QgaW50JiwgaW50Jj4oblswXSwgblsxXSwgblsyXSwgblszXSwgbls0XSwgbls1XSwgbls2XSwgbls3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bOF0sIG5bOV0pOwotICBFWFBFQ1RfRVEoNTUsIGEuUGVyZm9ybShlbXB0eSkpOwotfQotCi1jbGFzcyBOdWxsYXJ5Q29uc3RydWN0b3JDbGFzcyB7Ci0gcHVibGljOgotICBOdWxsYXJ5Q29uc3RydWN0b3JDbGFzcygpIDogdmFsdWVfKDEyMykge30KLSAgaW50IHZhbHVlXzsKLX07Ci0KLS8vIFRlc3RzIHVzaW5nIFJldHVybk5ldygpIHdpdGggYSBudWxsYXJ5IGNvbnN0cnVjdG9yLgotVEVTVChSZXR1cm5OZXdUZXN0LCBOb0FyZ3MpIHsKLSAgQWN0aW9uPE51bGxhcnlDb25zdHJ1Y3RvckNsYXNzKigpPiBhID0gUmV0dXJuTmV3PE51bGxhcnlDb25zdHJ1Y3RvckNsYXNzPigpOwotICBOdWxsYXJ5Q29uc3RydWN0b3JDbGFzcyogYyA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpOwotICBFWFBFQ1RfRVEoMTIzLCBjLT52YWx1ZV8pOwotICBkZWxldGUgYzsKLX0KLQotY2xhc3MgVW5hcnlDb25zdHJ1Y3RvckNsYXNzIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVuYXJ5Q29uc3RydWN0b3JDbGFzcyhpbnQgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICBpbnQgdmFsdWVfOwotfTsKLQotLy8gVGVzdHMgdXNpbmcgUmV0dXJuTmV3KCkgd2l0aCBhIHVuYXJ5IGNvbnN0cnVjdG9yLgotVEVTVChSZXR1cm5OZXdUZXN0LCBVbmFyeSkgewotICBBY3Rpb248VW5hcnlDb25zdHJ1Y3RvckNsYXNzKigpPiBhID0gUmV0dXJuTmV3PFVuYXJ5Q29uc3RydWN0b3JDbGFzcz4oNDAwMCk7Ci0gIFVuYXJ5Q29uc3RydWN0b3JDbGFzcyogYyA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpOwotICBFWFBFQ1RfRVEoNDAwMCwgYy0+dmFsdWVfKTsKLSAgZGVsZXRlIGM7Ci19Ci0KLVRFU1QoUmV0dXJuTmV3VGVzdCwgVW5hcnlXb3Jrc1doZW5Nb2NrTWV0aG9kSGFzQXJncykgewotICBBY3Rpb248VW5hcnlDb25zdHJ1Y3RvckNsYXNzKihib29sLCBpbnQpPiBhID0KLSAgICAgIFJldHVybk5ldzxVbmFyeUNvbnN0cnVjdG9yQ2xhc3M+KDQwMDApOwotICBVbmFyeUNvbnN0cnVjdG9yQ2xhc3MqIGMgPSBhLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSwgNSkpOwotICBFWFBFQ1RfRVEoNDAwMCwgYy0+dmFsdWVfKTsKLSAgZGVsZXRlIGM7Ci19Ci0KLVRFU1QoUmV0dXJuTmV3VGVzdCwgVW5hcnlXb3Jrc1doZW5Nb2NrTWV0aG9kUmV0dXJuc1BvaW50ZXJUb0NvbnN0KSB7Ci0gIEFjdGlvbjxjb25zdCBVbmFyeUNvbnN0cnVjdG9yQ2xhc3MqKCk+IGEgPQotICAgICAgUmV0dXJuTmV3PFVuYXJ5Q29uc3RydWN0b3JDbGFzcz4oNDAwMCk7Ci0gIGNvbnN0IFVuYXJ5Q29uc3RydWN0b3JDbGFzcyogYyA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpOwotICBFWFBFQ1RfRVEoNDAwMCwgYy0+dmFsdWVfKTsKLSAgZGVsZXRlIGM7Ci19Ci0KLWNsYXNzIFRlbkFyZ0NvbnN0cnVjdG9yQ2xhc3MgewotIHB1YmxpYzoKLSAgVGVuQXJnQ29uc3RydWN0b3JDbGFzcyhpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYTYsIGludCBhNywgaW50IGE4LCBpbnQgYTksIGludCBhMTApCi0gICAgOiB2YWx1ZV8oYTEgKyBhMiArIGEzICsgYTQgKyBhNSArIGE2ICsgYTcgKyBhOCArIGE5ICsgYTEwKSB7Ci0gIH0KLSAgaW50IHZhbHVlXzsKLX07Ci0KLS8vIFRlc3RzIHVzaW5nIFJldHVybk5ldygpIHdpdGggYSAxMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLVRFU1QoUmV0dXJuTmV3VGVzdCwgQ29uc3RydWN0b3JUaGF0VGFrZXMxMEFyZ3VtZW50cykgewotICBBY3Rpb248VGVuQXJnQ29uc3RydWN0b3JDbGFzcyooKT4gYSA9Ci0gICAgICBSZXR1cm5OZXc8VGVuQXJnQ29uc3RydWN0b3JDbGFzcz4oMTAwMDAwMDAwMCwgMjAwMDAwMDAwLCAzMDAwMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDAwMDAwLCA1MDAwMDAsIDYwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMDAsIDgwMCwgOTAsIDApOwotICBUZW5BcmdDb25zdHJ1Y3RvckNsYXNzKiBjID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7Ci0gIEVYUEVDVF9FUSgxMjM0NTY3ODkwLCBjLT52YWx1ZV8pOwotICBkZWxldGUgYzsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT05fVEVNUExBVEUgd29ya3Mgd2hlbiB0aGVyZSBpcyBubyB2YWx1ZSBwYXJhbWV0ZXIuCi1BQ1RJT05fVEVNUExBVEUoQ3JlYXRlTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKLSAgcmV0dXJuIG5ldyBUOwotfQotCi1URVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgV29ya3NXaXRob3V0VmFsdWVQYXJhbSkgewotICBjb25zdCBBY3Rpb248aW50KigpPiBhID0gQ3JlYXRlTmV3PGludD4oKTsKLSAgaW50KiBwID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7Ci0gIGRlbGV0ZSBwOwotfQotCi0vLyBUZXN0cyB0aGF0IEFDVElPTl9URU1QTEFURSB3b3JrcyB3aGVuIHRoZXJlIGFyZSB2YWx1ZSBwYXJhbWV0ZXJzLgotQUNUSU9OX1RFTVBMQVRFKENyZWF0ZU5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhhMCkpIHsKLSAgcmV0dXJuIG5ldyBUKGEwKTsKLX0KLQotVEVTVChBY3Rpb25UZW1wbGF0ZVRlc3QsIFdvcmtzV2l0aFZhbHVlUGFyYW1zKSB7Ci0gIGNvbnN0IEFjdGlvbjxpbnQqKCk+IGEgPSBDcmVhdGVOZXc8aW50Pig0Mik7Ci0gIGludCogcCA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpOwotICBFWFBFQ1RfRVEoNDIsICpwKTsKLSAgZGVsZXRlIHA7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQUNUSU9OX1RFTVBMQVRFIHdvcmtzIGZvciBpbnRlZ3JhbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotQUNUSU9OX1RFTVBMQVRFKE15RGVsZXRlQXJnLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7Ci0gIGRlbGV0ZSBnZXQ8az4oYXJncyk7Ci19Ci0KLS8vIFJlc2V0cyBhIGJvb2wgdmFyaWFibGUgaW4gdGhlIGRlc3RydWN0b3IuCi1jbGFzcyBCb29sUmVzZXR0ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQm9vbFJlc2V0dGVyKGJvb2wqIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgfkJvb2xSZXNldHRlcigpIHsgKnZhbHVlXyA9IGZhbHNlOyB9Ci0gcHJpdmF0ZToKLSAgYm9vbCogdmFsdWVfOwotfTsKLQotVEVTVChBY3Rpb25UZW1wbGF0ZVRlc3QsIFdvcmtzRm9ySW50ZWdyYWxUZW1wbGF0ZVBhcmFtcykgewotICBjb25zdCBBY3Rpb248dm9pZChpbnQqLCBCb29sUmVzZXR0ZXIqKT4gYSA9IE15RGVsZXRlQXJnPDE+KCk7Ci0gIGludCBuID0gMDsKLSAgYm9vbCBiID0gdHJ1ZTsKLSAgQm9vbFJlc2V0dGVyKiByZXNldHRlciA9IG5ldyBCb29sUmVzZXR0ZXIoJmIpOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSgmbiwgcmVzZXR0ZXIpKTsKLSAgRVhQRUNUX0ZBTFNFKGIpOyAgLy8gVmVyaWZpZXMgdGhhdCByZXNldHRlciBpcyBkZWxldGVkLgotfQotCi0vLyBUZXN0cyB0aGF0IEFDVElPTl9URU1QTEFURVMgd29ya3MgZm9yIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuU21hcnRQb2ludGVyLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlZT4gY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIpLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwb2ludGVlKSkgewotICByZXR1cm4gUG9pbnRlcjxwb2ludGVlX3R5cGU+KG5ldyBwb2ludGVlX3R5cGUocG9pbnRlZSkpOwotfQotCi1URVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgV29ya3NGb3JUZW1wbGF0ZVRlbXBsYXRlUGFyYW1ldGVycykgewotICB1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOwotICBjb25zdCBBY3Rpb248bGlua2VkX3B0cjxpbnQ+KCk+IGEgPSBSZXR1cm5TbWFydFBvaW50ZXI8bGlua2VkX3B0cj4oNDIpOwotICBsaW5rZWRfcHRyPGludD4gcCA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpOwotICBFWFBFQ1RfRVEoNDIsICpwKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT05fVEVNUExBVEUgd29ya3MgZm9yIDEwIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgaW50IGs0LCBib29sIGs1LAotICAgICAgICAgIHVuc2lnbmVkIGludCBrNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KLXN0cnVjdCBHaWFudFRlbXBsYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdpYW50VGVtcGxhdGUoaW50IGFfdmFsdWUpIDogdmFsdWUoYV92YWx1ZSkge30KLSAgaW50IHZhbHVlOwotfTsKLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybkdpYW50LAotICAgICAgICAgICAgICAgIEhBU18xMF9URU1QTEFURV9QQVJBTVMoCi0gICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lLCBUMSwKLSAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUsIFQyLAotICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSwgVDMsCi0gICAgICAgICAgICAgICAgICAgIGludCwgazQsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wsIGs1LAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQsIGs2LAotICAgICAgICAgICAgICAgICAgICBjbGFzcywgVDcsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzLCBUOCwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3MsIFQ5LAotICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MsIFQxMCksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHZhbHVlKSkgewotICByZXR1cm4gR2lhbnRUZW1wbGF0ZTxUMTA8VDE+LCBUMiwgVDMsIGs0LCBrNSwgazYsIFQ3LCBUOCwgVDk+KHZhbHVlKTsKLX0KLQotVEVTVChBY3Rpb25UZW1wbGF0ZVRlc3QsIFdvcmtzRm9yMTBUZW1wbGF0ZVBhcmFtZXRlcnMpIHsKLSAgdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjsKLSAgdHlwZWRlZiBHaWFudFRlbXBsYXRlPGxpbmtlZF9wdHI8aW50PiwgYm9vbCwgZG91YmxlLCA1LAotICAgICAgdHJ1ZSwgNiwgY2hhciwgdW5zaWduZWQsIGludD4gR2lhbnQ7Ci0gIGNvbnN0IEFjdGlvbjxHaWFudCgpPiBhID0gUmV0dXJuR2lhbnQ8Ci0gICAgICBpbnQsIGJvb2wsIGRvdWJsZSwgNSwgdHJ1ZSwgNiwgY2hhciwgdW5zaWduZWQsIGludCwgbGlua2VkX3B0cj4oNDIpOwotICBHaWFudCBnaWFudCA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpOwotICBFWFBFQ1RfRVEoNDIsIGdpYW50LnZhbHVlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT05fVEVNUExBVEUgd29ya3MgZm9yIDEwIHZhbHVlIHBhcmFtZXRlcnMuCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuU3VtLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgTnVtYmVyKSwKLSAgICAgICAgICAgICAgICBBTkRfMTBfVkFMVUVfUEFSQU1TKHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCkpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PE51bWJlcj4odjEpICsgdjIgKyB2MyArIHY0ICsgdjUgKyB2NiArIHY3ICsgdjggKyB2OSArIHYxMDsKLX0KLQotVEVTVChBY3Rpb25UZW1wbGF0ZVRlc3QsIFdvcmtzRm9yMTBWYWx1ZVBhcmFtZXRlcnMpIHsKLSAgY29uc3QgQWN0aW9uPGludCgpPiBhID0gUmV0dXJuU3VtPGludD4oMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApOwotICBFWFBFQ1RfRVEoNTUsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBQ1RJT05fVEVNUExBVEUgYW5kIEFDVElPTi9BQ1RJT05fUCogY2FuIGJlIG92ZXJsb2FkZWQKLS8vIG9uIHRoZSBudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycy4KLQotQUNUSU9OKFJldHVyblN1bSkgeyByZXR1cm4gMDsgfQotCi1BQ1RJT05fUChSZXR1cm5TdW0sIHgpIHsgcmV0dXJuIHg7IH0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVyblN1bSwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIE51bWJlciksCi0gICAgICAgICAgICAgICAgQU5EXzJfVkFMVUVfUEFSQU1TKHYxLCB2MikpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PE51bWJlcj4odjEpICsgdjI7Ci19Ci0KLUFDVElPTl9URU1QTEFURShSZXR1cm5TdW0sCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBOdW1iZXIpLAotICAgICAgICAgICAgICAgIEFORF8zX1ZBTFVFX1BBUkFNUyh2MSwgdjIsIHYzKSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8TnVtYmVyPih2MSkgKyB2MiArIHYzOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuU3VtLAotICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgTnVtYmVyLCBpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyh2MSwgdjIsIHYzLCB2NCkpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PE51bWJlcj4odjEpICsgdjIgKyB2MyArIHY0ICsgazsKLX0KLQotVEVTVChBY3Rpb25UZW1wbGF0ZVRlc3QsIENhbkJlT3ZlcmxvYWRlZE9uTnVtYmVyT2ZWYWx1ZVBhcmFtZXRlcnMpIHsKLSAgY29uc3QgQWN0aW9uPGludCgpPiBhMCA9IFJldHVyblN1bSgpOwotICBjb25zdCBBY3Rpb248aW50KCk+IGExID0gUmV0dXJuU3VtKDEpOwotICBjb25zdCBBY3Rpb248aW50KCk+IGEyID0gUmV0dXJuU3VtPGludD4oMSwgMik7Ci0gIGNvbnN0IEFjdGlvbjxpbnQoKT4gYTMgPSBSZXR1cm5TdW08aW50PigxLCAyLCAzKTsKLSAgY29uc3QgQWN0aW9uPGludCgpPiBhNCA9IFJldHVyblN1bTxpbnQsIDEwMDAwPigyMDAwLCAzMDAsIDQwLCA1KTsKLSAgRVhQRUNUX0VRKDAsIGEwLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0gIEVYUEVDVF9FUSgxLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOwotICBFWFBFQ1RfRVEoMywgYTIuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLSAgRVhQRUNUX0VRKDYsIGEzLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0gIEVYUEVDVF9FUSgxMjM0NSwgYTQuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgZ21vY2tfZ2VuZXJhdGVkX2FjdGlvbnNfdGVzdAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vyc190ZXN0LmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NmE2MTMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgZnVuY3Rpb24gbW9ja2VyIGNsYXNzZXMuCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oIgotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotLy8gTVNETiBzYXlzIHRoZSBoZWFkZXIgZmlsZSB0byBiZSBpbmNsdWRlZCBmb3IgU1RETUVUSE9EIGlzIEJhc2VUeXBzLmggYnV0Ci0vLyB3ZSBhcmUgZ2V0dGluZyBjb21waWxlciBlcnJvcnMgaWYgd2UgdXNlIGJhc2V0eXBzLmgsIGhlbmNlIGluY2x1ZGluZwotLy8gb2JqYmFzZS5oIGZvciBkZWZpbml0aW9uIG9mIFNURE1FVEhPRC4KLSMgaW5jbHVkZSA8b2JqYmFzZS5oPgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVGhlcmUgaXMgYSBidWcgaW4gTVNWQyAoZml4ZWQgaW4gVlMgMjAwOCkgdGhhdCBwcmV2ZW50cyBjcmVhdGluZyBhCi0vLyBtb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggY29uc3QgYXJndW1lbnRzLCBzbyB3ZSBkb24ndCB0ZXN0IHN1Y2gKLS8vIGNhc2VzIGZvciBNU1ZDIHZlcnNpb25zIG9sZGVyIHRoYW4gMjAwOC4KLSNpZiAhR1RFU1RfT1NfV0lORE9XUyB8fCAoX01TQ19WRVIgPj0gMTUwMCkKLSMgZGVmaW5lIEdNT0NLX0FMTE9XU19DT05TVF9QQVJBTV9GVU5DVElPTlMKLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MgfHwgKF9NU0NfVkVSID49IDE1MDApCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBnbW9ja19nZW5lcmF0ZWRfZnVuY3Rpb25fbW9ja2Vyc190ZXN0IHsKLQotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZzsKLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpBOwotdXNpbmcgdGVzdGluZzo6QW47Ci11c2luZyB0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyB0ZXN0aW5nOjpDb25zdDsKLXVzaW5nIHRlc3Rpbmc6OkRvRGVmYXVsdDsKLXVzaW5nIHRlc3Rpbmc6OkVxOwotdXNpbmcgdGVzdGluZzo6THQ7Ci11c2luZyB0ZXN0aW5nOjpNb2NrRnVuY3Rpb247Ci11c2luZyB0ZXN0aW5nOjpSZWY7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm5SZWY7Ci11c2luZyB0ZXN0aW5nOjpUeXBlZEVxOwotCi1jbGFzcyBGb29JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Rm9vSW50ZXJmYWNlKCkge30KLQotICB2aXJ0dWFsIHZvaWQgVm9pZFJldHVybmluZyhpbnQgeCkgPSAwOwotCi0gIHZpcnR1YWwgaW50IE51bGxhcnkoKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBVbmFyeShpbnQgeCkgPSAwOwotICB2aXJ0dWFsIGxvbmcgQmluYXJ5KHNob3J0IHgsIGludCB5KSA9IDA7ICAvLyBOT0xJTlQKLSAgdmlydHVhbCBpbnQgRGVjaW1hbChib29sIGIsIGNoYXIgYywgc2hvcnQgZCwgaW50IGUsIGxvbmcgZiwgIC8vIE5PTElOVAotICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGcsIGRvdWJsZSBoLCB1bnNpZ25lZCBpLCBjaGFyKiBqLCBjb25zdCBzdHJpbmcmIGspCi0gICAgICA9IDA7Ci0KLSAgdmlydHVhbCBib29sIFRha2VzTm9uQ29uc3RSZWZlcmVuY2UoaW50JiBuKSA9IDA7ICAvLyBOT0xJTlQKLSAgdmlydHVhbCBzdHJpbmcgVGFrZXNDb25zdFJlZmVyZW5jZShjb25zdCBpbnQmIG4pID0gMDsKLSNpZmRlZiBHTU9DS19BTExPV1NfQ09OU1RfUEFSQU1fRlVOQ1RJT05TCi0gIHZpcnR1YWwgYm9vbCBUYWtlc0NvbnN0KGNvbnN0IGludCB4KSA9IDA7Ci0jZW5kaWYgIC8vIEdNT0NLX0FMTE9XU19DT05TVF9QQVJBTV9GVU5DVElPTlMKLQotICB2aXJ0dWFsIGludCBPdmVybG9hZGVkT25Bcmd1bWVudE51bWJlcigpID0gMDsKLSAgdmlydHVhbCBpbnQgT3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIoaW50IG4pID0gMDsKLQotICB2aXJ0dWFsIGludCBPdmVybG9hZGVkT25Bcmd1bWVudFR5cGUoaW50IG4pID0gMDsKLSAgdmlydHVhbCBjaGFyIE92ZXJsb2FkZWRPbkFyZ3VtZW50VHlwZShjaGFyIGMpID0gMDsKLQotICB2aXJ0dWFsIGludCBPdmVybG9hZGVkT25Db25zdG5lc3MoKSA9IDA7Ci0gIHZpcnR1YWwgY2hhciBPdmVybG9hZGVkT25Db25zdG5lc3MoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBpbnQgVHlwZVdpdGhIb2xlKGludCAoKmZ1bmMpKCkpID0gMDsKLSAgdmlydHVhbCBpbnQgVHlwZVdpdGhDb21tYShjb25zdCBzdGQ6Om1hcDxpbnQsIHN0cmluZz4mIGFfbWFwKSA9IDA7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIFNURE1FVEhPRF8oaW50LCBDVE51bGxhcnkpKCkgPSAwOwotICBTVERNRVRIT0RfKGJvb2wsIENUVW5hcnkpKGludCB4KSA9IDA7Ci0gIFNURE1FVEhPRF8oaW50LCBDVERlY2ltYWwpKGJvb2wgYiwgY2hhciBjLCBzaG9ydCBkLCBpbnQgZSwgbG9uZyBmLCAgLy8gTk9MSU5UCi0gICAgICBmbG9hdCBnLCBkb3VibGUgaCwgdW5zaWduZWQgaSwgY2hhciogaiwgY29uc3Qgc3RyaW5nJiBrKSA9IDA7Ci0gIFNURE1FVEhPRF8oY2hhciwgQ1RDb25zdCkoaW50IHgpIGNvbnN0ID0gMDsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotfTsKLQotLy8gQ29uc3QgcXVhbGlmaWVycyBvbiBhcmd1bWVudHMgd2VyZSBvbmNlIChpbmNvcnJlY3RseSkgY29uc2lkZXJlZAotLy8gc2lnbmlmaWNhbnQgaW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0d28gdmlydHVhbCBmdW5jdGlvbnMgaGFkIHRoZSBzYW1lCi0vLyBzaWduYXR1cmUuIFRoaXMgd2FzIGZpeGVkIGluIFZpc3VhbCBTdHVkaW8gMjAwOC4gSG93ZXZlciwgdGhlIGNvbXBpbGVyCi0vLyBzdGlsbCBlbWl0cyBhIHdhcm5pbmcgdGhhdCBhbGVydHMgYWJvdXQgdGhpcyBjaGFuZ2UgaW4gYmVoYXZpb3IuCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkKLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQzNzMpCi0jZW5kaWYKLWNsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1vY2tGb28oKSB7fQotCi0gIC8vIE1ha2VzIHN1cmUgdGhhdCBhIG1vY2sgZnVuY3Rpb24gcGFyYW1ldGVyIGNhbiBiZSBuYW1lZC4KLSAgTU9DS19NRVRIT0QxKFZvaWRSZXR1cm5pbmcsIHZvaWQoaW50IG4pKTsgIC8vIE5PTElOVAotCi0gIE1PQ0tfTUVUSE9EMChOdWxsYXJ5LCBpbnQoKSk7ICAvLyBOT0xJTlQKLQotICAvLyBNYWtlcyBzdXJlIHRoYXQgYSBtb2NrIGZ1bmN0aW9uIHBhcmFtZXRlciBjYW4gYmUgdW5uYW1lZC4KLSAgTU9DS19NRVRIT0QxKFVuYXJ5LCBib29sKGludCkpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfTUVUSE9EMihCaW5hcnksIGxvbmcoc2hvcnQsIGludCkpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfTUVUSE9EMTAoRGVjaW1hbCwgaW50KGJvb2wsIGNoYXIsIHNob3J0LCBpbnQsIGxvbmcsIGZsb2F0LCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgdW5zaWduZWQsIGNoYXIqLCBjb25zdCBzdHJpbmcmIHN0cikpOwotCi0gIE1PQ0tfTUVUSE9EMShUYWtlc05vbkNvbnN0UmVmZXJlbmNlLCBib29sKGludCYpKTsgIC8vIE5PTElOVAotICBNT0NLX01FVEhPRDEoVGFrZXNDb25zdFJlZmVyZW5jZSwgc3RyaW5nKGNvbnN0IGludCYpKTsKLQotI2lmZGVmIEdNT0NLX0FMTE9XU19DT05TVF9QQVJBTV9GVU5DVElPTlMKLSAgTU9DS19NRVRIT0QxKFRha2VzQ29uc3QsIGJvb2woY29uc3QgaW50KSk7ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0gIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGNhbiBjb250YWluIHVucHJvdGVjdGVkIGNvbW1hLgotICBNT0NLX01FVEhPRDAoUmV0dXJuVHlwZVdpdGhDb21tYSwgc3RkOjptYXA8aW50LCBzdHJpbmc+KCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDEoUmV0dXJuVHlwZVdpdGhDb21tYSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGludCwgc3RyaW5nPihpbnQpKTsgIC8vIE5PTElOVAotCi0gIE1PQ0tfTUVUSE9EMChPdmVybG9hZGVkT25Bcmd1bWVudE51bWJlciwgaW50KCkpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfTUVUSE9EMShPdmVybG9hZGVkT25Bcmd1bWVudE51bWJlciwgaW50KGludCkpOyAgLy8gTk9MSU5UCi0KLSAgTU9DS19NRVRIT0QxKE92ZXJsb2FkZWRPbkFyZ3VtZW50VHlwZSwgaW50KGludCkpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfTUVUSE9EMShPdmVybG9hZGVkT25Bcmd1bWVudFR5cGUsIGNoYXIoY2hhcikpOyAgLy8gTk9MSU5UCi0KLSAgTU9DS19NRVRIT0QwKE92ZXJsb2FkZWRPbkNvbnN0bmVzcywgaW50KCkpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfQ09OU1RfTUVUSE9EMChPdmVybG9hZGVkT25Db25zdG5lc3MsIGNoYXIoKSk7ICAvLyBOT0xJTlQKLQotICBNT0NLX01FVEhPRDEoVHlwZVdpdGhIb2xlLCBpbnQoaW50ICgqKSgpKSk7ICAvLyBOT0xJTlQKLSAgTU9DS19NRVRIT0QxKFR5cGVXaXRoQ29tbWEsIGludChjb25zdCBzdGQ6Om1hcDxpbnQsIHN0cmluZz4mKSk7ICAvLyBOT0xJTlQKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgTU9DS19NRVRIT0QwX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIENUTnVsbGFyeSwgaW50KCkpOwotICBNT0NLX01FVEhPRDFfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgQ1RVbmFyeSwgYm9vbChpbnQpKTsKLSAgTU9DS19NRVRIT0QxMF9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBDVERlY2ltYWwsIGludChib29sIGIsIGNoYXIgYywKLSAgICAgIHNob3J0IGQsIGludCBlLCBsb25nIGYsIGZsb2F0IGcsIGRvdWJsZSBoLCB1bnNpZ25lZCBpLCBjaGFyKiBqLAotICAgICAgY29uc3Qgc3RyaW5nJiBrKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMV9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBDVENvbnN0LCBjaGFyKGludCkpOwotCi0gIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGNhbiBjb250YWluIHVucHJvdGVjdGVkIGNvbW1hLgotICBNT0NLX01FVEhPRDBfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgQ1RSZXR1cm5UeXBlV2l0aENvbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxpbnQsIHN0cmluZz4oKSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Zvbyk7Ci19OwotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi1jbGFzcyBGdW5jdGlvbk1vY2tlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBGdW5jdGlvbk1vY2tlclRlc3QoKSA6IGZvb18oJm1vY2tfZm9vXykge30KLQotICBGb29JbnRlcmZhY2UqIGNvbnN0IGZvb187Ci0gIE1vY2tGb28gbW9ja19mb29fOwotfTsKLQotLy8gVGVzdHMgbW9ja2luZyBhIHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NWb2lkRnVuY3Rpb24pIHsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBWb2lkUmV0dXJuaW5nKEx0KDEwMCkpKTsKLSAgZm9vXy0+Vm9pZFJldHVybmluZygwKTsKLX0KLQotLy8gVGVzdHMgbW9ja2luZyBhIG51bGxhcnkgZnVuY3Rpb24uCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc051bGxhcnlGdW5jdGlvbikgewotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIE51bGxhcnkoKSkKLSAgICAgIC5XaWxsT25jZShEb0RlZmF1bHQoKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOwotCi0gIEVYUEVDVF9FUSgwLCBmb29fLT5OdWxsYXJ5KCkpOwotICBFWFBFQ1RfRVEoMSwgZm9vXy0+TnVsbGFyeSgpKTsKLX0KLQotLy8gVGVzdHMgbW9ja2luZyBhIHVuYXJ5IGZ1bmN0aW9uLgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NVbmFyeUZ1bmN0aW9uKSB7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgVW5hcnkoRXEoMikpKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBFWFBFQ1RfVFJVRShmb29fLT5VbmFyeSgyKSk7Ci0gIEVYUEVDVF9GQUxTRShmb29fLT5VbmFyeSgyKSk7Ci19Ci0KLS8vIFRlc3RzIG1vY2tpbmcgYSBiaW5hcnkgZnVuY3Rpb24uCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc0JpbmFyeUZ1bmN0aW9uKSB7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgQmluYXJ5KDIsIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybigzKSk7Ci0KLSAgRVhQRUNUX0VRKDMsIGZvb18tPkJpbmFyeSgyLCAxKSk7Ci19Ci0KLS8vIFRlc3RzIG1vY2tpbmcgYSBkZWNpbWFsIGZ1bmN0aW9uLgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NEZWNpbWFsRnVuY3Rpb24pIHsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBEZWNpbWFsKHRydWUsICdhJywgMCwgMCwgMUwsIEE8ZmxvYXQ+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMdCgxMDApLCA1VSwgTlVMTCwgImhpIikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDUpKTsKLQotICBFWFBFQ1RfRVEoNSwgZm9vXy0+RGVjaW1hbCh0cnVlLCAnYScsIDAsIDAsIDEsIDAsIDAsIDUsIE5VTEwsICJoaSIpKTsKLX0KLQotLy8gVGVzdHMgbW9ja2luZyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBub24tY29uc3QgcmVmZXJlbmNlLgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbldpdGhOb25Db25zdFJlZmVyZW5jZUFyZ3VtZW50KSB7Ci0gIGludCBhID0gMDsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBUYWtlc05vbkNvbnN0UmVmZXJlbmNlKFJlZihhKSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBFWFBFQ1RfVFJVRShmb29fLT5UYWtlc05vbkNvbnN0UmVmZXJlbmNlKGEpKTsKLX0KLQotLy8gVGVzdHMgbW9ja2luZyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjb25zdCByZWZlcmVuY2UuCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc0Z1bmN0aW9uV2l0aENvbnN0UmVmZXJlbmNlQXJndW1lbnQpIHsKLSAgaW50IGEgPSAwOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIFRha2VzQ29uc3RSZWZlcmVuY2UoUmVmKGEpKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oIkhlbGxvIikpOwotCi0gIEVYUEVDVF9FUSgiSGVsbG8iLCBmb29fLT5UYWtlc0NvbnN0UmVmZXJlbmNlKGEpKTsKLX0KLQotI2lmZGVmIEdNT0NLX0FMTE9XU19DT05TVF9QQVJBTV9GVU5DVElPTlMKLS8vIFRlc3RzIG1vY2tpbmcgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29uc3QgdmFyaWFibGUuCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc0Z1bmN0aW9uV2l0aENvbnN0QXJndW1lbnQpIHsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBUYWtlc0NvbnN0KEx0KDEwKSkpCi0gICAgICAuV2lsbE9uY2UoRG9EZWZhdWx0KCkpOwotCi0gIEVYUEVDVF9GQUxTRShmb29fLT5UYWtlc0NvbnN0KDUpKTsKLX0KLSNlbmRpZiAgLy8gR01PQ0tfQUxMT1dTX0NPTlNUX1BBUkFNX0ZVTkNUSU9OUwotCi0vLyBUZXN0cyBtb2NraW5nIGZ1bmN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbnNPdmVybG9hZGVkT25Bcmd1bWVudE51bWJlcikgewotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIE92ZXJsb2FkZWRPbkFyZ3VtZW50TnVtYmVyKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBPdmVybG9hZGVkT25Bcmd1bWVudE51bWJlcihfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOwotCi0gIEVYUEVDVF9FUSgyLCBmb29fLT5PdmVybG9hZGVkT25Bcmd1bWVudE51bWJlcigxKSk7Ci0gIEVYUEVDVF9FUSgxLCBmb29fLT5PdmVybG9hZGVkT25Bcmd1bWVudE51bWJlcigpKTsKLX0KLQotLy8gVGVzdHMgbW9ja2luZyBmdW5jdGlvbnMgb3ZlcmxvYWRlZCBvbiB0aGUgdHlwZXMgb2YgYXJndW1lbnQuCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc0Z1bmN0aW9uc092ZXJsb2FkZWRPbkFyZ3VtZW50VHlwZSkgewotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIE92ZXJsb2FkZWRPbkFyZ3VtZW50VHlwZShBbjxpbnQ+KCkpKQotICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgT3ZlcmxvYWRlZE9uQXJndW1lbnRUeXBlKFR5cGVkRXE8Y2hhcj4oJ2EnKSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCdiJykpOwotCi0gIEVYUEVDVF9FUSgxLCBmb29fLT5PdmVybG9hZGVkT25Bcmd1bWVudFR5cGUoMCkpOwotICBFWFBFQ1RfRVEoJ2InLCBmb29fLT5PdmVybG9hZGVkT25Bcmd1bWVudFR5cGUoJ2EnKSk7Ci19Ci0KLS8vIFRlc3RzIG1vY2tpbmcgZnVuY3Rpb25zIG92ZXJsb2FkZWQgb24gdGhlIGNvbnN0LW5lc3Mgb2YgdGhpcyBvYmplY3QuCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc0Z1bmN0aW9uc092ZXJsb2FkZWRPbkNvbnN0bmVzc09mVGhpcykgewotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIE92ZXJsb2FkZWRPbkNvbnN0bmVzcygpKTsKLSAgRVhQRUNUX0NBTEwoQ29uc3QobW9ja19mb29fKSwgT3ZlcmxvYWRlZE9uQ29uc3RuZXNzKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCdhJykpOwotCi0gIEVYUEVDVF9FUSgwLCBmb29fLT5PdmVybG9hZGVkT25Db25zdG5lc3MoKSk7Ci0gIEVYUEVDVF9FUSgnYScsIENvbnN0KCpmb29fKS5PdmVybG9hZGVkT25Db25zdG5lc3MoKSk7Ci19Ci0KLVRFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzUmV0dXJuVHlwZVdpdGhDb21tYSkgewotICBjb25zdCBzdGQ6Om1hcDxpbnQsIHN0cmluZz4gYV9tYXA7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgUmV0dXJuVHlwZVdpdGhDb21tYSgpKQotICAgICAgLldpbGxPbmNlKFJldHVybihhX21hcCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIFJldHVyblR5cGVXaXRoQ29tbWEoNDIpKQotICAgICAgLldpbGxPbmNlKFJldHVybihhX21hcCkpOwotCi0gIEVYUEVDVF9FUShhX21hcCwgbW9ja19mb29fLlJldHVyblR5cGVXaXRoQ29tbWEoKSk7Ci0gIEVYUEVDVF9FUShhX21hcCwgbW9ja19mb29fLlJldHVyblR5cGVXaXRoQ29tbWEoNDIpKTsKLX0KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLS8vIFRlc3RzIG1vY2tpbmcgYSBudWxsYXJ5IGZ1bmN0aW9uIHdpdGggY2FsbHR5cGUuCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc051bGxhcnlGdW5jdGlvbldpdGhDYWxsVHlwZSkgewotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIENUTnVsbGFyeSgpKQotICAgICAgLldpbGxPbmNlKFJldHVybigtMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLQotICBFWFBFQ1RfRVEoLTEsIGZvb18tPkNUTnVsbGFyeSgpKTsKLSAgRVhQRUNUX0VRKDAsIGZvb18tPkNUTnVsbGFyeSgpKTsKLX0KLQotLy8gVGVzdHMgbW9ja2luZyBhIHVuYXJ5IGZ1bmN0aW9uIHdpdGggY2FsbHR5cGUuCi1URVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc1VuYXJ5RnVuY3Rpb25XaXRoQ2FsbFR5cGUpIHsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBDVFVuYXJ5KEVxKDIpKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKLQotICBFWFBFQ1RfVFJVRShmb29fLT5DVFVuYXJ5KDIpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPkNUVW5hcnkoMikpOwotfQotCi0vLyBUZXN0cyBtb2NraW5nIGEgZGVjaW1hbCBmdW5jdGlvbiB3aXRoIGNhbGx0eXBlLgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NEZWNpbWFsRnVuY3Rpb25XaXRoQ2FsbFR5cGUpIHsKLSAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBDVERlY2ltYWwodHJ1ZSwgJ2EnLCAwLCAwLCAxTCwgQTxmbG9hdD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHQoMTAwKSwgNVUsIE5VTEwsICJoaSIpKQotICAgICAgLldpbGxPbmNlKFJldHVybigxMCkpOwotCi0gIEVYUEVDVF9FUSgxMCwgZm9vXy0+Q1REZWNpbWFsKHRydWUsICdhJywgMCwgMCwgMSwgMCwgMCwgNSwgTlVMTCwgImhpIikpOwotfQotCi0vLyBUZXN0cyBtb2NraW5nIGZ1bmN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBjb25zdC1uZXNzIG9mIHRoaXMgb2JqZWN0LgotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbnNDb25zdEZ1bmN0aW9uV2l0aENhbGxUeXBlKSB7Ci0gIEVYUEVDVF9DQUxMKENvbnN0KG1vY2tfZm9vXyksIENUQ29uc3QoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCdhJykpOwotCi0gIEVYUEVDVF9FUSgnYScsIENvbnN0KCpmb29fKS5DVENvbnN0KDApKTsKLX0KLQotVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NSZXR1cm5UeXBlV2l0aENvbW1hQW5kQ2FsbFR5cGUpIHsKLSAgY29uc3Qgc3RkOjptYXA8aW50LCBzdHJpbmc+IGFfbWFwOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIENUUmV0dXJuVHlwZVdpdGhDb21tYSgpKQotICAgICAgLldpbGxPbmNlKFJldHVybihhX21hcCkpOwotCi0gIEVYUEVDVF9FUShhX21hcCwgbW9ja19mb29fLkNUUmV0dXJuVHlwZVdpdGhDb21tYSgpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLWNsYXNzIE1vY2tCIHsKLSBwdWJsaWM6Ci0gIE1vY2tCKCkge30KLQotICBNT0NLX01FVEhPRDAoRG9CLCB2b2lkKCkpOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrQik7Ci19OwotCi0vLyBUZXN0cyB0aGF0IGZ1bmN0aW9ucyB3aXRoIG5vIEVYUEVDVF9DQUxMKCkgcnVscyBjYW4gYmUgY2FsbGVkIGFueQotLy8gbnVtYmVyIG9mIHRpbWVzLgotVEVTVChFeHBlY3RDYWxsVGVzdCwgVW5tZW50aW9uZWRGdW5jdGlvbkNhbkJlQ2FsbGVkQW55TnVtYmVyT2ZUaW1lcykgewotICB7Ci0gICAgTW9ja0IgYjsKLSAgfQotCi0gIHsKLSAgICBNb2NrQiBiOwotICAgIGIuRG9CKCk7Ci0gIH0KLQotICB7Ci0gICAgTW9ja0IgYjsKLSAgICBiLkRvQigpOwotICAgIGIuRG9CKCk7Ci0gIH0KLX0KLQotLy8gVGVzdHMgbW9ja2luZyB0ZW1wbGF0ZSBpbnRlcmZhY2VzLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFN0YWNrSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflN0YWNrSW50ZXJmYWNlKCkge30KLQotICAvLyBUZW1wbGF0ZSBwYXJhbWV0ZXIgYXBwZWFycyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXIuCi0gIHZpcnR1YWwgdm9pZCBQdXNoKGNvbnN0IFQmIHZhbHVlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBQb3AoKSA9IDA7Ci0gIHZpcnR1YWwgaW50IEdldFNpemUoKSBjb25zdCA9IDA7Ci0gIC8vIFRlbXBsYXRlIHBhcmFtZXRlciBhcHBlYXJzIGluIGZ1bmN0aW9uIHJldHVybiB0eXBlLgotICB2aXJ0dWFsIGNvbnN0IFQmIEdldFRvcCgpIGNvbnN0ID0gMDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTW9ja1N0YWNrIDogcHVibGljIFN0YWNrSW50ZXJmYWNlPFQ+IHsKLSBwdWJsaWM6Ci0gIE1vY2tTdGFjaygpIHt9Ci0KLSAgTU9DS19NRVRIT0QxX1QoUHVzaCwgdm9pZChjb25zdCBUJiBlbGVtKSk7Ci0gIE1PQ0tfTUVUSE9EMF9UKFBvcCwgdm9pZCgpKTsKLSAgTU9DS19DT05TVF9NRVRIT0QwX1QoR2V0U2l6ZSwgaW50KCkpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKEdldFRvcCwgY29uc3QgVCYoKSk7Ci0KLSAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgY2FuIGNvbnRhaW4gdW5wcm90ZWN0ZWQgY29tbWEuCi0gIE1PQ0tfTUVUSE9EMF9UKFJldHVyblR5cGVXaXRoQ29tbWEsIHN0ZDo6bWFwPGludCwgaW50PigpKTsKLSAgTU9DS19DT05TVF9NRVRIT0QxX1QoUmV0dXJuVHlwZVdpdGhDb21tYSwgc3RkOjptYXA8aW50LCBpbnQ+KGludCkpOyAgLy8gTk9MSU5UCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tTdGFjayk7Ci19OwotCi0vLyBUZXN0cyB0aGF0IHRlbXBsYXRlIG1vY2sgd29ya3MuCi1URVNUKFRlbXBsYXRlTW9ja1Rlc3QsIFdvcmtzKSB7Ci0gIE1vY2tTdGFjazxpbnQ+IG1vY2s7Ci0KLSAgRVhQRUNUX0NBTEwobW9jaywgR2V0U2l6ZSgpKQotICAgICAgLldpbGxPbmNlKFJldHVybigwKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgUHVzaChfKSk7Ci0gIGludCBuID0gNTsKLSAgRVhQRUNUX0NBTEwobW9jaywgR2V0VG9wKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKG4pKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgUG9wKCkpCi0gICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotCi0gIEVYUEVDVF9FUSgwLCBtb2NrLkdldFNpemUoKSk7Ci0gIG1vY2suUHVzaCg1KTsKLSAgRVhQRUNUX0VRKDEsIG1vY2suR2V0U2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDUsIG1vY2suR2V0VG9wKCkpOwotICBtb2NrLlBvcCgpOwotICBFWFBFQ1RfRVEoMCwgbW9jay5HZXRTaXplKCkpOwotfQotCi1URVNUKFRlbXBsYXRlTW9ja1Rlc3QsIE1ldGhvZFdpdGhDb21tYUluUmV0dXJuVHlwZVdvcmtzKSB7Ci0gIE1vY2tTdGFjazxpbnQ+IG1vY2s7Ci0KLSAgY29uc3Qgc3RkOjptYXA8aW50LCBpbnQ+IGFfbWFwOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBSZXR1cm5UeXBlV2l0aENvbW1hKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGFfbWFwKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2ssIFJldHVyblR5cGVXaXRoQ29tbWEoMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGFfbWFwKSk7Ci0KLSAgRVhQRUNUX0VRKGFfbWFwLCBtb2NrLlJldHVyblR5cGVXaXRoQ29tbWEoKSk7Ci0gIEVYUEVDVF9FUShhX21hcCwgbW9jay5SZXR1cm5UeXBlV2l0aENvbW1hKDEpKTsKLX0KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLS8vIFRlc3RzIG1vY2tpbmcgdGVtcGxhdGUgaW50ZXJmYWNlcyB3aXRoIGNhbGx0eXBlLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFN0YWNrSW50ZXJmYWNlV2l0aENhbGxUeXBlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflN0YWNrSW50ZXJmYWNlV2l0aENhbGxUeXBlKCkge30KLQotICAvLyBUZW1wbGF0ZSBwYXJhbWV0ZXIgYXBwZWFycyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXIuCi0gIFNURE1FVEhPRF8odm9pZCwgUHVzaCkoY29uc3QgVCYgdmFsdWUpID0gMDsKLSAgU1RETUVUSE9EXyh2b2lkLCBQb3ApKCkgPSAwOwotICBTVERNRVRIT0RfKGludCwgR2V0U2l6ZSkoKSBjb25zdCA9IDA7Ci0gIC8vIFRlbXBsYXRlIHBhcmFtZXRlciBhcHBlYXJzIGluIGZ1bmN0aW9uIHJldHVybiB0eXBlLgotICBTVERNRVRIT0RfKGNvbnN0IFQmLCBHZXRUb3ApKCkgY29uc3QgPSAwOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBNb2NrU3RhY2tXaXRoQ2FsbFR5cGUgOiBwdWJsaWMgU3RhY2tJbnRlcmZhY2VXaXRoQ2FsbFR5cGU8VD4gewotIHB1YmxpYzoKLSAgTW9ja1N0YWNrV2l0aENhbGxUeXBlKCkge30KLQotICBNT0NLX01FVEhPRDFfVF9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBQdXNoLCB2b2lkKGNvbnN0IFQmIGVsZW0pKTsKLSAgTU9DS19NRVRIT0QwX1RfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgUG9wLCB2b2lkKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDBfVF9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBHZXRTaXplLCBpbnQoKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMF9UX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIEdldFRvcCwgY29uc3QgVCYoKSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tTdGFja1dpdGhDYWxsVHlwZSk7Ci19OwotCi0vLyBUZXN0cyB0aGF0IHRlbXBsYXRlIG1vY2sgd2l0aCBjYWxsdHlwZSB3b3Jrcy4KLVRFU1QoVGVtcGxhdGVNb2NrVGVzdFdpdGhDYWxsVHlwZSwgV29ya3MpIHsKLSAgTW9ja1N0YWNrV2l0aENhbGxUeXBlPGludD4gbW9jazsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBHZXRTaXplKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKQotICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBQdXNoKF8pKTsKLSAgaW50IG4gPSA1OwotICBFWFBFQ1RfQ0FMTChtb2NrLCBHZXRUb3AoKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm5SZWYobikpOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBQb3AoKSkKLSAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1vY2suR2V0U2l6ZSgpKTsKLSAgbW9jay5QdXNoKDUpOwotICBFWFBFQ1RfRVEoMSwgbW9jay5HZXRTaXplKCkpOwotICBFWFBFQ1RfRVEoNSwgbW9jay5HZXRUb3AoKSk7Ci0gIG1vY2suUG9wKCk7Ci0gIEVYUEVDVF9FUSgwLCBtb2NrLkdldFNpemUoKSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2RlZmluZSBNWV9NT0NLX01FVEhPRFMxXyBcCi0gICAgTU9DS19NRVRIT0QwKE92ZXJsb2FkZWQsIHZvaWQoKSk7IFwKLSAgICBNT0NLX0NPTlNUX01FVEhPRDEoT3ZlcmxvYWRlZCwgaW50KGludCBuKSk7IFwKLSAgICBNT0NLX01FVEhPRDIoT3ZlcmxvYWRlZCwgYm9vbChib29sIGYsIGludCBuKSkKLQotY2xhc3MgTW9ja092ZXJsb2FkZWRPbkFyZ051bWJlciB7Ci0gcHVibGljOgotICBNb2NrT3ZlcmxvYWRlZE9uQXJnTnVtYmVyKCkge30KLQotICBNWV9NT0NLX01FVEhPRFMxXzsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja092ZXJsb2FkZWRPbkFyZ051bWJlcik7Ci19OwotCi1URVNUKE92ZXJsb2FkZWRNb2NrTWV0aG9kVGVzdCwgQ2FuT3ZlcmxvYWRPbkFyZ051bWJlckluTWFjcm9Cb2R5KSB7Ci0gIE1vY2tPdmVybG9hZGVkT25BcmdOdW1iZXIgbW9jazsKLSAgRVhQRUNUX0NBTEwobW9jaywgT3ZlcmxvYWRlZCgpKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgT3ZlcmxvYWRlZCgxKSkuV2lsbE9uY2UoUmV0dXJuKDIpKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgT3ZlcmxvYWRlZCh0cnVlLCAxKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBtb2NrLk92ZXJsb2FkZWQoKTsKLSAgRVhQRUNUX0VRKDIsIG1vY2suT3ZlcmxvYWRlZCgxKSk7Ci0gIEVYUEVDVF9UUlVFKG1vY2suT3ZlcmxvYWRlZCh0cnVlLCAxKSk7Ci19Ci0KLSNkZWZpbmUgTVlfTU9DS19NRVRIT0RTMl8gXAotICAgIE1PQ0tfQ09OU1RfTUVUSE9EMShPdmVybG9hZGVkLCBpbnQoaW50IG4pKTsgXAotICAgIE1PQ0tfTUVUSE9EMShPdmVybG9hZGVkLCBpbnQoaW50IG4pKTsKLQotY2xhc3MgTW9ja092ZXJsb2FkZWRPbkNvbnN0bmVzcyB7Ci0gcHVibGljOgotICBNb2NrT3ZlcmxvYWRlZE9uQ29uc3RuZXNzKCkge30KLQotICBNWV9NT0NLX01FVEhPRFMyXzsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja092ZXJsb2FkZWRPbkNvbnN0bmVzcyk7Ci19OwotCi1URVNUKE92ZXJsb2FkZWRNb2NrTWV0aG9kVGVzdCwgQ2FuT3ZlcmxvYWRPbkNvbnN0bmVzc0luTWFjcm9Cb2R5KSB7Ci0gIE1vY2tPdmVybG9hZGVkT25Db25zdG5lc3MgbW9jazsKLSAgY29uc3QgTW9ja092ZXJsb2FkZWRPbkNvbnN0bmVzcyogY29uc3RfbW9jayA9ICZtb2NrOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBPdmVybG9hZGVkKDEpKS5XaWxsT25jZShSZXR1cm4oMikpOwotICBFWFBFQ1RfQ0FMTCgqY29uc3RfbW9jaywgT3ZlcmxvYWRlZCgxKSkuV2lsbE9uY2UoUmV0dXJuKDMpKTsKLQotICBFWFBFQ1RfRVEoMiwgbW9jay5PdmVybG9hZGVkKDEpKTsKLSAgRVhQRUNUX0VRKDMsIGNvbnN0X21vY2stPk92ZXJsb2FkZWQoMSkpOwotfQotCi1URVNUKE1vY2tGdW5jdGlvblRlc3QsIFdvcmtzRm9yVm9pZE51bGxhcnkpIHsKLSAgTW9ja0Z1bmN0aW9uPHZvaWQoKT4gZm9vOwotICBFWFBFQ1RfQ0FMTChmb28sIENhbGwoKSk7Ci0gIGZvby5DYWxsKCk7Ci19Ci0KLVRFU1QoTW9ja0Z1bmN0aW9uVGVzdCwgV29ya3NGb3JOb25Wb2lkTnVsbGFyeSkgewotICBNb2NrRnVuY3Rpb248aW50KCk+IGZvbzsKLSAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0gIEVYUEVDVF9FUSgxLCBmb28uQ2FsbCgpKTsKLSAgRVhQRUNUX0VRKDIsIGZvby5DYWxsKCkpOwotfQotCi1URVNUKE1vY2tGdW5jdGlvblRlc3QsIFdvcmtzRm9yVm9pZFVuYXJ5KSB7Ci0gIE1vY2tGdW5jdGlvbjx2b2lkKGludCk+IGZvbzsKLSAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKDEpKTsKLSAgZm9vLkNhbGwoMSk7Ci19Ci0KLVRFU1QoTW9ja0Z1bmN0aW9uVGVzdCwgV29ya3NGb3JOb25Wb2lkQmluYXJ5KSB7Ci0gIE1vY2tGdW5jdGlvbjxpbnQoYm9vbCwgaW50KT4gZm9vOwotICBFWFBFQ1RfQ0FMTChmb28sIENhbGwoZmFsc2UsIDQyKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKLSAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKHRydWUsIEdlKDEwMCkpKQotICAgICAgLldpbGxPbmNlKFJldHVybigzKSk7Ci0gIEVYUEVDVF9FUSgxLCBmb28uQ2FsbChmYWxzZSwgNDIpKTsKLSAgRVhQRUNUX0VRKDIsIGZvby5DYWxsKGZhbHNlLCA0MikpOwotICBFWFBFQ1RfRVEoMywgZm9vLkNhbGwodHJ1ZSwgMTIwKSk7Ci19Ci0KLVRFU1QoTW9ja0Z1bmN0aW9uVGVzdCwgV29ya3NGb3IxMEFyZ3VtZW50cykgewotICBNb2NrRnVuY3Rpb248aW50KGJvb2wgYTAsIGNoYXIgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsCi0gICAgICAgICAgICAgICAgICAgaW50IGE1LCBpbnQgYTYsIGNoYXIgYTcsIGludCBhOCwgYm9vbCBhOSk+IGZvbzsKLSAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKF8sICdhJywgXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0gIEVYUEVDVF9FUSgxLCBmb28uQ2FsbChmYWxzZSwgJ2EnLCAwLCAwLCAwLCAwLCAwLCAnYicsIDAsIHRydWUpKTsKLSAgRVhQRUNUX0VRKDIsIGZvby5DYWxsKHRydWUsICdhJywgMCwgMCwgMCwgMCwgMCwgJ2InLCAxLCBmYWxzZSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLVRFU1QoTW9ja0Z1bmN0aW9uVGVzdCwgQXNTdGRGdW5jdGlvbikgewotICBNb2NrRnVuY3Rpb248aW50KGludCk+IGZvbzsKLSAgYXV0byBjYWxsID0gW10oY29uc3Qgc3RkOjpmdW5jdGlvbjxpbnQoaW50KT4gJmYsIGludCBpKSB7Ci0gICAgcmV0dXJuIGYoaSk7Ci0gIH07Ci0gIEVYUEVDVF9DQUxMKGZvbywgQ2FsbCgxKSkuV2lsbE9uY2UoUmV0dXJuKC0xKSk7Ci0gIEVYUEVDVF9DQUxMKGZvbywgQ2FsbCgyKSkuV2lsbE9uY2UoUmV0dXJuKC0yKSk7Ci0gIEVYUEVDVF9FUSgtMSwgY2FsbChmb28uQXNTdGRGdW5jdGlvbigpLCAxKSk7Ci0gIEVYUEVDVF9FUSgtMiwgY2FsbChmb28uQXNTdGRGdW5jdGlvbigpLCAyKSk7Ci19Ci0KLVRFU1QoTW9ja0Z1bmN0aW9uVGVzdCwgQXNTdGRGdW5jdGlvblJldHVybnNSZWZlcmVuY2UpIHsKLSAgTW9ja0Z1bmN0aW9uPGludCYoKT4gZm9vOwotICBpbnQgdmFsdWUgPSAxOwotICBFWFBFQ1RfQ0FMTChmb28sIENhbGwoKSkuV2lsbE9uY2UoUmV0dXJuUmVmKHZhbHVlKSk7Ci0gIGludCYgcmVmID0gZm9vLkFzU3RkRnVuY3Rpb24oKSgpOwotICBFWFBFQ1RfRVEoMSwgcmVmKTsKLSAgdmFsdWUgPSAyOwotICBFWFBFQ1RfRVEoMiwgcmVmKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotfSAgLy8gbmFtZXNwYWNlIGdtb2NrX2dlbmVyYXRlZF9mdW5jdGlvbl9tb2NrZXJzX3Rlc3QKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTUzNWEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlsc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGludGVybmFsIHV0aWxpdGllcy4KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjp0ZXN0aW5nOjp0dXBsZTsKLXVzaW5nIDo6dGVzdGluZzo6TWF0Y2hlcjsKLXVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWF0Y2hlclR1cGxlOwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb247Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpJZ25vcmVkVmFsdWU7Ci0KLS8vIFRlc3RzIHRoZSBNYXRjaGVyVHVwbGUgdGVtcGxhdGUgc3RydWN0LgotCi1URVNUKE1hdGNoZXJUdXBsZVRlc3QsIEZvclNpemUwKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPD4sIE1hdGNoZXJUdXBsZTx0dXBsZTw+ID46OnR5cGU+KCk7Ci19Ci0KLVRFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRm9yU2l6ZTEpIHsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8TWF0Y2hlcjxpbnQ+ID4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJUdXBsZTx0dXBsZTxpbnQ+ID46OnR5cGU+KCk7Ci19Ci0KLVRFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRm9yU2l6ZTIpIHsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8TWF0Y2hlcjxpbnQ+LCBNYXRjaGVyPGNoYXI+ID4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJUdXBsZTx0dXBsZTxpbnQsIGNoYXI+ID46OnR5cGU+KCk7Ci19Ci0KLVRFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRm9yU2l6ZTUpIHsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8TWF0Y2hlcjxpbnQ+LCBNYXRjaGVyPGNoYXI+LCBNYXRjaGVyPGJvb2w+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyPGRvdWJsZT4sIE1hdGNoZXI8Y2hhcio+ID4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJUdXBsZTx0dXBsZTxpbnQsIGNoYXIsIGJvb2wsIGRvdWJsZSwgY2hhcio+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGU+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSBzdHJ1Y3QuCi0KLVRFU1QoRnVuY3Rpb25UZXN0LCBOdWxsYXJ5KSB7Ci0gIHR5cGVkZWYgRnVuY3Rpb248aW50KCk+IEY7ICAvLyBOT0xJTlQKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBGOjpSZXN1bHQ+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPD4sIEY6OkFyZ3VtZW50VHVwbGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPD4sIEY6OkFyZ3VtZW50TWF0Y2hlclR1cGxlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkKCksIEY6Ok1ha2VSZXN1bHRWb2lkPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxJZ25vcmVkVmFsdWUoKSwgRjo6TWFrZVJlc3VsdElnbm9yZWRWYWx1ZT4oKTsKLX0KLQotVEVTVChGdW5jdGlvblRlc3QsIFVuYXJ5KSB7Ci0gIHR5cGVkZWYgRnVuY3Rpb248aW50KGJvb2wpPiBGOyAgLy8gTk9MSU5UCi0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgRjo6UmVzdWx0PigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxib29sLCBGOjpBcmd1bWVudDE+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPGJvb2w+LCBGOjpBcmd1bWVudFR1cGxlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx0dXBsZTxNYXRjaGVyPGJvb2w+ID4sIEY6OkFyZ3VtZW50TWF0Y2hlclR1cGxlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkKGJvb2wpLCBGOjpNYWtlUmVzdWx0Vm9pZD4oKTsgIC8vIE5PTElOVAotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxJZ25vcmVkVmFsdWUoYm9vbCksICAvLyBOT0xJTlQKLSAgICAgIEY6Ok1ha2VSZXN1bHRJZ25vcmVkVmFsdWU+KCk7Ci19Ci0KLVRFU1QoRnVuY3Rpb25UZXN0LCBCaW5hcnkpIHsKLSAgdHlwZWRlZiBGdW5jdGlvbjxpbnQoYm9vbCwgY29uc3QgbG9uZyYpPiBGOyAgLy8gTk9MSU5UCi0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgRjo6UmVzdWx0PigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxib29sLCBGOjpBcmd1bWVudDE+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGxvbmcmLCBGOjpBcmd1bWVudDI+KCk7ICAvLyBOT0xJTlQKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8Ym9vbCwgY29uc3QgbG9uZyY+LCBGOjpBcmd1bWVudFR1cGxlPigpOyAgLy8gTk9MSU5UCi0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPE1hdGNoZXI8Ym9vbD4sIE1hdGNoZXI8Y29uc3QgbG9uZyY+ID4sICAvLyBOT0xJTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRjo6QXJndW1lbnRNYXRjaGVyVHVwbGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQoYm9vbCwgY29uc3QgbG9uZyYpLCBGOjpNYWtlUmVzdWx0Vm9pZD4oKTsgIC8vIE5PTElOVAotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxJZ25vcmVkVmFsdWUoYm9vbCwgY29uc3QgbG9uZyYpLCAgLy8gTk9MSU5UCi0gICAgICBGOjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlPigpOwotfQotCi1URVNUKEZ1bmN0aW9uVGVzdCwgTG9uZ0FyZ3VtZW50TGlzdCkgewotICB0eXBlZGVmIEZ1bmN0aW9uPGNoYXIoYm9vbCwgaW50LCBjaGFyKiwgaW50JiwgY29uc3QgbG9uZyYpPiBGOyAgLy8gTk9MSU5UCi0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXIsIEY6OlJlc3VsdD4oKTsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Ym9vbCwgRjo6QXJndW1lbnQxPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIEY6OkFyZ3VtZW50Mj4oKTsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhciosIEY6OkFyZ3VtZW50Mz4oKTsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50JiwgRjo6QXJndW1lbnQ0PigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBsb25nJiwgRjo6QXJndW1lbnQ1PigpOyAgLy8gTk9MSU5UCi0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPGJvb2wsIGludCwgY2hhciosIGludCYsIGNvbnN0IGxvbmcmPiwgIC8vIE5PTElOVAotICAgICAgICAgICAgICAgICAgICAgICAgICBGOjpBcmd1bWVudFR1cGxlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx0dXBsZTxNYXRjaGVyPGJvb2w+LCBNYXRjaGVyPGludD4sIE1hdGNoZXI8Y2hhcio+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyPGludCY+LCBNYXRjaGVyPGNvbnN0IGxvbmcmPiA+LCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEY6OkFyZ3VtZW50TWF0Y2hlclR1cGxlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkKGJvb2wsIGludCwgY2hhciosIGludCYsIGNvbnN0IGxvbmcmKSwgIC8vIE5PTElOVAotICAgICAgICAgICAgICAgICAgICAgICAgICBGOjpNYWtlUmVzdWx0Vm9pZD4oKTsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Ci0gICAgICBJZ25vcmVkVmFsdWUoYm9vbCwgaW50LCBjaGFyKiwgaW50JiwgY29uc3QgbG9uZyYpLCAgLy8gTk9MSU5UCi0gICAgICBGOjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlPigpOwotfQotCi19ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVyc190ZXN0LmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVyc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTlmNzdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBidWlsdC1pbiBtYXRjaGVycyBnZW5lcmF0ZWQgYnkgYSBzY3JpcHQuCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgc3RkOjpsaXN0OwotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6OnBhaXI7Ci11c2luZyBzdGQ6OnNldDsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci11c2luZyB0ZXN0aW5nOjpnZXQ7Ci11c2luZyB0ZXN0aW5nOjptYWtlX3R1cGxlOwotdXNpbmcgdGVzdGluZzo6dHVwbGU7Ci11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6QXJnczsKLXVzaW5nIHRlc3Rpbmc6OkNvbnRhaW5zOwotdXNpbmcgdGVzdGluZzo6RWxlbWVudHNBcmU7Ci11c2luZyB0ZXN0aW5nOjpFbGVtZW50c0FyZUFycmF5OwotdXNpbmcgdGVzdGluZzo6RXE7Ci11c2luZyB0ZXN0aW5nOjpHZTsKLXVzaW5nIHRlc3Rpbmc6Okd0OwotdXNpbmcgdGVzdGluZzo6TGU7Ci11c2luZyB0ZXN0aW5nOjpMdDsKLXVzaW5nIHRlc3Rpbmc6Ok1ha2VNYXRjaGVyOwotdXNpbmcgdGVzdGluZzo6TWF0Y2hlcjsKLXVzaW5nIHRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Ci11c2luZyB0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOwotdXNpbmcgdGVzdGluZzo6TmU7Ci11c2luZyB0ZXN0aW5nOjpOb3Q7Ci11c2luZyB0ZXN0aW5nOjpQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6UHJpbnRUb1N0cmluZzsKLXVzaW5nIHRlc3Rpbmc6OlJlZjsKLXVzaW5nIHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTsKLXVzaW5nIHRlc3Rpbmc6OlN0ckVxOwotdXNpbmcgdGVzdGluZzo6VmFsdWU7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nOwotCi0vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RyaW5nIERlc2NyaWJlKGNvbnN0IE1hdGNoZXI8VD4mIG0pIHsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICBtLkRlc2NyaWJlVG8oJnNzKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbmVnYXRpb24gb2YgdGhlIGdpdmVuIG1hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cmluZyBEZXNjcmliZU5lZ2F0aW9uKGNvbnN0IE1hdGNoZXI8VD4mIG0pIHsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICBtLkRlc2NyaWJlTmVnYXRpb25Ubygmc3MpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHJlYXNvbiB3aHkgeCBtYXRjaGVzLCBvciBkb2Vzbid0IG1hdGNoLCBtLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUeXBlLCB0eXBlbmFtZSBWYWx1ZT4KLXN0cmluZyBFeHBsYWluKGNvbnN0IE1hdGNoZXJUeXBlJiBtLCBjb25zdCBWYWx1ZSYgeCkgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIG0uRXhwbGFpbk1hdGNoUmVzdWx0VG8oeCwgJnNzKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBUZXN0cyBBcmdzPGswLCAuLi4sIGtuPihtKS4KLQotVEVTVChBcmdzVGVzdCwgQWNjZXB0c1plcm9UZW1wbGF0ZUFyZykgewotICBjb25zdCB0dXBsZTxpbnQsIGJvb2w+IHQoNSwgdHJ1ZSk7Ci0gIEVYUEVDVF9USEFUKHQsIEFyZ3M8PihFcSh0dXBsZTw+KCkpKSk7Ci0gIEVYUEVDVF9USEFUKHQsIE5vdChBcmdzPD4oTmUodHVwbGU8PigpKSkpKTsKLX0KLQotVEVTVChBcmdzVGVzdCwgQWNjZXB0c09uZVRlbXBsYXRlQXJnKSB7Ci0gIGNvbnN0IHR1cGxlPGludCwgYm9vbD4gdCg1LCB0cnVlKTsKLSAgRVhQRUNUX1RIQVQodCwgQXJnczwwPihFcShtYWtlX3R1cGxlKDUpKSkpOwotICBFWFBFQ1RfVEhBVCh0LCBBcmdzPDE+KEVxKG1ha2VfdHVwbGUodHJ1ZSkpKSk7Ci0gIEVYUEVDVF9USEFUKHQsIE5vdChBcmdzPDE+KEVxKG1ha2VfdHVwbGUoZmFsc2UpKSkpKTsKLX0KLQotVEVTVChBcmdzVGVzdCwgQWNjZXB0c1R3b1RlbXBsYXRlQXJncykgewotICBjb25zdCB0dXBsZTxzaG9ydCwgaW50LCBsb25nPiB0KDQsIDUsIDZMKTsgIC8vIE5PTElOVAotCi0gIEVYUEVDVF9USEFUKHQsIChBcmdzPDAsIDE+KEx0KCkpKSk7Ci0gIEVYUEVDVF9USEFUKHQsIChBcmdzPDEsIDI+KEx0KCkpKSk7Ci0gIEVYUEVDVF9USEFUKHQsIE5vdChBcmdzPDAsIDI+KEd0KCkpKSk7Ci19Ci0KLVRFU1QoQXJnc1Rlc3QsIEFjY2VwdHNSZXBlYXRlZFRlbXBsYXRlQXJncykgewotICBjb25zdCB0dXBsZTxzaG9ydCwgaW50LCBsb25nPiB0KDQsIDUsIDZMKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVEhBVCh0LCAoQXJnczwwLCAwPihFcSgpKSkpOwotICBFWFBFQ1RfVEhBVCh0LCBOb3QoQXJnczwxLCAxPihOZSgpKSkpOwotfQotCi1URVNUKEFyZ3NUZXN0LCBBY2NlcHRzRGVjcmVhc2luZ1RlbXBsYXRlQXJncykgewotICBjb25zdCB0dXBsZTxzaG9ydCwgaW50LCBsb25nPiB0KDQsIDUsIDZMKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVEhBVCh0LCAoQXJnczwyLCAwPihHdCgpKSkpOwotICBFWFBFQ1RfVEhBVCh0LCBOb3QoQXJnczwyLCAxPihMdCgpKSkpOwotfQotCi0vLyBUaGUgTUFUQ0hFUiooKSBtYWNyb3MgdHJpZ2dlciB3YXJuaW5nIEM0MTAwICh1bnJlZmVyZW5jZWQgZm9ybWFsCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluCi0vLyB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgYXMgdGhlIHdhcm5pbmdzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgbWFjcm8KLS8vIGlzIGV4cGFuZGVkIGFuZCBtYWNybyBleHBhbnNpb24gY2Fubm90IGNvbnRhaW4gI3ByYWdtYS4gIFRoZXJlZm9yZQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKLSNlbmRpZgotCi1NQVRDSEVSKFN1bUlzWmVybywgIiIpIHsKLSAgcmV0dXJuIGdldDwwPihhcmcpICsgZ2V0PDE+KGFyZykgKyBnZXQ8Mj4oYXJnKSA9PSAwOwotfQotCi1URVNUKEFyZ3NUZXN0LCBBY2NlcHRzTW9yZVRlbXBsYXRlQXJnc1RoYW5Bcml0eU9mT3JpZ2luYWxUdXBsZSkgewotICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKC0xLCAyKSwgKEFyZ3M8MCwgMCwgMT4oU3VtSXNaZXJvKCkpKSk7Ci0gIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUoMSwgMiksIE5vdChBcmdzPDAsIDAsIDE+KFN1bUlzWmVybygpKSkpOwotfQotCi1URVNUKEFyZ3NUZXN0LCBDYW5CZU5lc3RlZCkgewotICBjb25zdCB0dXBsZTxzaG9ydCwgaW50LCBsb25nLCBpbnQ+IHQoNCwgNSwgNkwsIDYpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9USEFUKHQsIChBcmdzPDEsIDIsIDM+KEFyZ3M8MSwgMj4oRXEoKSkpKSk7Ci0gIEVYUEVDVF9USEFUKHQsIChBcmdzPDAsIDEsIDM+KEFyZ3M8MCwgMj4oTHQoKSkpKSk7Ci19Ci0KLVRFU1QoQXJnc1Rlc3QsIENhbk1hdGNoVHVwbGVCeVZhbHVlKSB7Ci0gIHR5cGVkZWYgdHVwbGU8Y2hhciwgaW50LCBpbnQ+IFR1cGxlMzsKLSAgY29uc3QgTWF0Y2hlcjxUdXBsZTM+IG0gPSBBcmdzPDEsIDI+KEx0KCkpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoVHVwbGUzKCdhJywgMSwgMikpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTMoJ2InLCAyLCAyKSkpOwotfQotCi1URVNUKEFyZ3NUZXN0LCBDYW5NYXRjaFR1cGxlQnlSZWZlcmVuY2UpIHsKLSAgdHlwZWRlZiB0dXBsZTxjaGFyLCBjaGFyLCBpbnQ+IFR1cGxlMzsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBUdXBsZTMmPiBtID0gQXJnczwwLCAxPihMdCgpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMygnYScsICdiJywgMikpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTMoJ2InLCAnYicsIDIpKSk7Ci19Ci0KLS8vIFZhbGlkYXRlcyB0aGF0IGFyZyBpcyBwcmludGVkIGFzIHN0ci4KLU1BVENIRVJfUChQcmludHNBcywgc3RyLCAiIikgewotICByZXR1cm4gdGVzdGluZzo6UHJpbnRUb1N0cmluZyhhcmcpID09IHN0cjsKLX0KLQotVEVTVChBcmdzVGVzdCwgQWNjZXB0c1RlblRlbXBsYXRlQXJncykgewotICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKDAsIDFMLCAyLCAzTCwgNCwgNSwgNiwgNywgOCwgOSksCi0gICAgICAgICAgICAgIChBcmdzPDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDA+KAotICAgICAgICAgICAgICAgICAgUHJpbnRzQXMoIig5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKSIpKSkpOwotICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKDAsIDFMLCAyLCAzTCwgNCwgNSwgNiwgNywgOCwgOSksCi0gICAgICAgICAgICAgIE5vdChBcmdzPDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDA+KAotICAgICAgICAgICAgICAgICAgICAgIFByaW50c0FzKCIoMCwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMCkiKSkpKTsKLX0KLQotVEVTVChBcmdzVGVzdCwgRGVzY2lyYmVzU2VsZkNvcnJlY3RseSkgewotICBjb25zdCBNYXRjaGVyPHR1cGxlPGludCwgYm9vbCwgY2hhcj4gPiBtID0gQXJnczwyLCAwPihMdCgpKTsKLSAgRVhQRUNUX0VRKCJhcmUgYSB0dXBsZSB3aG9zZSBmaWVsZHMgKCMyLCAjMCkgYXJlIGEgcGFpciB3aGVyZSAiCi0gICAgICAgICAgICAidGhlIGZpcnN0IDwgdGhlIHNlY29uZCIsCi0gICAgICAgICAgICBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoQXJnc1Rlc3QsIERlc2NpcmJlc05lc3RlZEFyZ3NDb3JyZWN0bHkpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCB0dXBsZTxpbnQsIGJvb2wsIGNoYXIsIGludD4mPiBtID0KLSAgICAgIEFyZ3M8MCwgMiwgMz4oQXJnczwyLCAwPihMdCgpKSk7Ci0gIEVYUEVDVF9FUSgiYXJlIGEgdHVwbGUgd2hvc2UgZmllbGRzICgjMCwgIzIsICMzKSBhcmUgYSB0dXBsZSAiCi0gICAgICAgICAgICAid2hvc2UgZmllbGRzICgjMiwgIzApIGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IDwgdGhlIHNlY29uZCIsCi0gICAgICAgICAgICBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoQXJnc1Rlc3QsIERlc2NyaWJlc05lZ2F0aW9uQ29ycmVjdGx5KSB7Ci0gIGNvbnN0IE1hdGNoZXI8dHVwbGU8aW50LCBjaGFyPiA+IG0gPSBBcmdzPDEsIDA+KEd0KCkpOwotICBFWFBFQ1RfRVEoImFyZSBhIHR1cGxlIHdob3NlIGZpZWxkcyAoIzEsICMwKSBhcmVuJ3QgYSBwYWlyICIKLSAgICAgICAgICAgICJ3aGVyZSB0aGUgZmlyc3QgPiB0aGUgc2Vjb25kIiwKLSAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOwotfQotCi1URVNUKEFyZ3NUZXN0LCBFeHBsYWluc01hdGNoUmVzdWx0V2l0aG91dElubmVyRXhwbGFuYXRpb24pIHsKLSAgY29uc3QgTWF0Y2hlcjx0dXBsZTxib29sLCBpbnQsIGludD4gPiBtID0gQXJnczwxLCAyPihFcSgpKTsKLSAgRVhQRUNUX0VRKCJ3aG9zZSBmaWVsZHMgKCMxLCAjMikgYXJlICg0MiwgNDIpIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV90dXBsZShmYWxzZSwgNDIsIDQyKSkpOwotICBFWFBFQ1RfRVEoIndob3NlIGZpZWxkcyAoIzEsICMyKSBhcmUgKDQyLCA0MykiLAotICAgICAgICAgICAgRXhwbGFpbihtLCBtYWtlX3R1cGxlKGZhbHNlLCA0MiwgNDMpKSk7Ci19Ci0KLS8vIEZvciB0ZXN0aW5nIEFyZ3M8PidzIGV4cGxhbmF0aW9uLgotY2xhc3MgTGVzc1RoYW5NYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8dHVwbGU8Y2hhciwgaW50PiA+IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qge30KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKHR1cGxlPGNoYXIsIGludD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBjb25zdCBpbnQgZGlmZiA9IGdldDwwPih2YWx1ZSkgLSBnZXQ8MT4odmFsdWUpOwotICAgIGlmIChkaWZmID4gMCkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgIiA8PCBkaWZmCi0gICAgICAgICAgICAgICAgPDwgIiBtb3JlIHRoYW4gdGhlIHNlY29uZCI7Ci0gICAgfQotICAgIHJldHVybiBkaWZmIDwgMDsKLSAgfQotfTsKLQotTWF0Y2hlcjx0dXBsZTxjaGFyLCBpbnQ+ID4gTGVzc1RoYW4oKSB7Ci0gIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgTGVzc1RoYW5NYXRjaGVyKTsKLX0KLQotVEVTVChBcmdzVGVzdCwgRXhwbGFpbnNNYXRjaFJlc3VsdFdpdGhJbm5lckV4cGxhbmF0aW9uKSB7Ci0gIGNvbnN0IE1hdGNoZXI8dHVwbGU8Y2hhciwgaW50LCBpbnQ+ID4gbSA9IEFyZ3M8MCwgMj4oTGVzc1RoYW4oKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZmllbGRzICgjMCwgIzIpIGFyZSAoJ2EnICg5NywgMHg2MSksIDQyKSwgIgotICAgICAgICAgICAgIndoZXJlIHRoZSBmaXJzdCB2YWx1ZSBpcyA1NSBtb3JlIHRoYW4gdGhlIHNlY29uZCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfdHVwbGUoJ2EnLCA0MiwgNDIpKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZmllbGRzICgjMCwgIzIpIGFyZSAoJ1xcMCcsIDQzKSIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfdHVwbGUoJ1wwJywgNDIsIDQzKSkpOwotfQotCi0vLyBGb3IgdGVzdGluZyBFeHBsYWluTWF0Y2hSZXN1bHRUbygpLgotY2xhc3MgR3JlYXRlclRoYW5NYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHcmVhdGVyVGhhbk1hdGNoZXIoaW50IHJocykgOiByaHNfKHJocykge30KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGdyZWF0ZXIgdGhhbiAiIDw8IHJoc187Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBjb25zdCBpbnQgZGlmZiA9IGxocyAtIHJoc187Ci0gICAgaWYgKGRpZmYgPiAwKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgZGlmZiA8PCAiIG1vcmUgdGhhbiAiIDw8IHJoc187Ci0gICAgfSBlbHNlIGlmIChkaWZmID09IDApIHsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgdGhlIHNhbWUgYXMgIiA8PCByaHNfOwotICAgIH0gZWxzZSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgLWRpZmYgPDwgIiBsZXNzIHRoYW4gIiA8PCByaHNfOwotICAgIH0KLQotICAgIHJldHVybiBsaHMgPiByaHNfOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQgcmhzXzsKLX07Ci0KLU1hdGNoZXI8aW50PiBHcmVhdGVyVGhhbihpbnQgbikgewotICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEdyZWF0ZXJUaGFuTWF0Y2hlcihuKSk7Ci19Ci0KLS8vIFRlc3RzIGZvciBFbGVtZW50c0FyZSgpLgotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgQ2FuRGVzY3JpYmVFeHBlY3RpbmdOb0VsZW1lbnQpIHsKLSAgTWF0Y2hlcjxjb25zdCB2ZWN0b3I8aW50PiY+IG0gPSBFbGVtZW50c0FyZSgpOwotICBFWFBFQ1RfRVEoImlzIGVtcHR5IiwgRGVzY3JpYmUobSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgQ2FuRGVzY3JpYmVFeHBlY3RpbmdPbmVFbGVtZW50KSB7Ci0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gRWxlbWVudHNBcmUoR3QoNSkpOwotICBFWFBFQ1RfRVEoImhhcyAxIGVsZW1lbnQgdGhhdCBpcyA+IDUiLCBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5EZXNjcmliZUV4cGVjdGluZ01hbnlFbGVtZW50cykgewotICBNYXRjaGVyPGxpc3Q8c3RyaW5nPiA+IG0gPSBFbGVtZW50c0FyZShTdHJFcSgib25lIiksICJ0d28iKTsKLSAgRVhQRUNUX0VRKCJoYXMgMiBlbGVtZW50cyB3aGVyZVxuIgotICAgICAgICAgICAgImVsZW1lbnQgIzAgaXMgZXF1YWwgdG8gXCJvbmVcIixcbiIKLSAgICAgICAgICAgICJlbGVtZW50ICMxIGlzIGVxdWFsIHRvIFwidHdvXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5EZXNjcmliZU5lZ2F0aW9uT2ZFeHBlY3RpbmdOb0VsZW1lbnQpIHsKLSAgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBFbGVtZW50c0FyZSgpOwotICBFWFBFQ1RfRVEoImlzbid0IGVtcHR5IiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5EZXNjcmliZU5lZ2F0aW9uT2ZFeHBlY3RpbmdPbmVFbG1lbnQpIHsKLSAgTWF0Y2hlcjxjb25zdCBsaXN0PGludD4mID4gbSA9IEVsZW1lbnRzQXJlKEd0KDUpKTsKLSAgRVhQRUNUX0VRKCJkb2Vzbid0IGhhdmUgMSBlbGVtZW50LCBvclxuIgotICAgICAgICAgICAgImVsZW1lbnQgIzAgaXNuJ3QgPiA1IiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5EZXNjcmliZU5lZ2F0aW9uT2ZFeHBlY3RpbmdNYW55RWxlbWVudHMpIHsKLSAgTWF0Y2hlcjxjb25zdCBsaXN0PHN0cmluZz4mID4gbSA9IEVsZW1lbnRzQXJlKCJvbmUiLCAidHdvIik7Ci0gIEVYUEVDVF9FUSgiZG9lc24ndCBoYXZlIDIgZWxlbWVudHMsIG9yXG4iCi0gICAgICAgICAgICAiZWxlbWVudCAjMCBpc24ndCBlcXVhbCB0byBcIm9uZVwiLCBvclxuIgotICAgICAgICAgICAgImVsZW1lbnQgIzEgaXNuJ3QgZXF1YWwgdG8gXCJ0d29cIiIsIERlc2NyaWJlTmVnYXRpb24obSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgRG9lc05vdEV4cGxhaW5Ucml2aWFsTWF0Y2gpIHsKLSAgTWF0Y2hlcjxjb25zdCBsaXN0PGludD4mID4gbSA9IEVsZW1lbnRzQXJlKDEsIE5lKDIpKTsKLQotICBsaXN0PGludD4gdGVzdF9saXN0OwotICB0ZXN0X2xpc3QucHVzaF9iYWNrKDEpOwotICB0ZXN0X2xpc3QucHVzaF9iYWNrKDMpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgdGVzdF9saXN0KSk7ICAvLyBObyBuZWVkIHRvIGV4cGxhaW4gYW55dGhpbmcuCi19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBFeHBsYWluc05vblRyaXZpYWxNYXRjaCkgewotICBNYXRjaGVyPGNvbnN0IHZlY3RvcjxpbnQ+JiA+IG0gPQotICAgICAgRWxlbWVudHNBcmUoR3JlYXRlclRoYW4oMSksIDAsIEdyZWF0ZXJUaGFuKDIpKTsKLQotICBjb25zdCBpbnQgYVtdID0geyAxMCwgMCwgMTAwIH07Ci0gIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMCBtYXRjaGVzLCB3aGljaCBpcyA5IG1vcmUgdGhhbiAxLFxuIgotICAgICAgICAgICAgImFuZCB3aG9zZSBlbGVtZW50ICMyIG1hdGNoZXMsIHdoaWNoIGlzIDk4IG1vcmUgdGhhbiAyIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF92ZWN0b3IpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIENhbkV4cGxhaW5NaXNtYXRjaFdyb25nU2l6ZSkgewotICBNYXRjaGVyPGNvbnN0IGxpc3Q8aW50PiYgPiBtID0gRWxlbWVudHNBcmUoMSwgMyk7Ci0KLSAgbGlzdDxpbnQ+IHRlc3RfbGlzdDsKLSAgLy8gTm8gbmVlZCB0byBleHBsYWluIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBlbXB0eS4KLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHRlc3RfbGlzdCkpOwotCi0gIHRlc3RfbGlzdC5wdXNoX2JhY2soMSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaGFzIDEgZWxlbWVudCIsIEV4cGxhaW4obSwgdGVzdF9saXN0KSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5FeHBsYWluTWlzbWF0Y2hSaWdodFNpemUpIHsKLSAgTWF0Y2hlcjxjb25zdCB2ZWN0b3I8aW50PiYgPiBtID0gRWxlbWVudHNBcmUoMSwgR3JlYXRlclRoYW4oNSkpOwotCi0gIHZlY3RvcjxpbnQ+IHY7Ci0gIHYucHVzaF9iYWNrKDIpOwotICB2LnB1c2hfYmFjaygxKTsKLSAgRVhQRUNUX0VRKCJ3aG9zZSBlbGVtZW50ICMwIGRvZXNuJ3QgbWF0Y2giLCBFeHBsYWluKG0sIHYpKTsKLQotICB2WzBdID0gMTsKLSAgRVhQRUNUX0VRKCJ3aG9zZSBlbGVtZW50ICMxIGRvZXNuJ3QgbWF0Y2gsIHdoaWNoIGlzIDQgbGVzcyB0aGFuIDUiLAotICAgICAgICAgICAgRXhwbGFpbihtLCB2KSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzT25lRWxlbWVudFZlY3RvcikgewotICB2ZWN0b3I8c3RyaW5nPiB0ZXN0X3ZlY3RvcjsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0ZXN0IHN0cmluZyIpOwotCi0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZShTdHJFcSgidGVzdCBzdHJpbmciKSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgTWF0Y2hlc09uZUVsZW1lbnRMaXN0KSB7Ci0gIGxpc3Q8c3RyaW5nPiB0ZXN0X2xpc3Q7Ci0gIHRlc3RfbGlzdC5wdXNoX2JhY2soInRlc3Qgc3RyaW5nIik7Ci0KLSAgRVhQRUNUX1RIQVQodGVzdF9saXN0LCBFbGVtZW50c0FyZSgidGVzdCBzdHJpbmciKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzVGhyZWVFbGVtZW50VmVjdG9yKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IHRlc3RfdmVjdG9yOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soIm9uZSIpOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInR3byIpOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInRocmVlIik7Ci0KLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlKCJvbmUiLCBTdHJFcSgidHdvIiksIF8pKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIE1hdGNoZXNPbmVFbGVtZW50RXFNYXRjaGVyKSB7Ci0gIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soNCk7Ci0KLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlKEVxKDQpKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzT25lRWxlbWVudEFueU1hdGNoZXIpIHsKLSAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3I7Ci0gIHRlc3RfdmVjdG9yLnB1c2hfYmFjayg0KTsKLQotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmUoXykpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgTWF0Y2hlc09uZUVsZW1lbnRWYWx1ZSkgewotICB2ZWN0b3I8aW50PiB0ZXN0X3ZlY3RvcjsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKDQpOwotCi0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZSg0KSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzVGhyZWVFbGVtZW50c01peGVkTWF0Y2hlcnMpIHsKLSAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3I7Ci0gIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygxKTsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKDIpOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soMyk7Ci0KLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlKDEsIEVxKDIpLCBfKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzVGVuRWxlbWVudFZlY3RvcikgewotICBjb25zdCBpbnQgYVtdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH07Ci0gIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0KLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsCi0gICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IGxpc3QgY2FuIGNvbnRhaW4gdmFsdWVzIGFuZC9vciBtYXRjaGVycwotICAgICAgICAgICAgICAvLyBvZiBkaWZmZXJlbnQgdHlwZXMuCi0gICAgICAgICAgICAgIEVsZW1lbnRzQXJlKDAsIEdlKDApLCBfLCAzLCA0LCBOZSgyKSwgRXEoNiksIDcsIDgsIF8pKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIERvZXNOb3RNYXRjaFdyb25nU2l6ZSkgewotICB2ZWN0b3I8c3RyaW5nPiB0ZXN0X3ZlY3RvcjsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0ZXN0IHN0cmluZyIpOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInRlc3Qgc3RyaW5nIik7Ci0KLSAgTWF0Y2hlcjx2ZWN0b3I8c3RyaW5nPiA+IG0gPSBFbGVtZW50c0FyZShTdHJFcSgidGVzdCBzdHJpbmciKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF92ZWN0b3IpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIERvZXNOb3RNYXRjaFdyb25nVmFsdWUpIHsKLSAgdmVjdG9yPHN0cmluZz4gdGVzdF92ZWN0b3I7Ci0gIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygib3RoZXIgc3RyaW5nIik7Ci0KLSAgTWF0Y2hlcjx2ZWN0b3I8c3RyaW5nPiA+IG0gPSBFbGVtZW50c0FyZShTdHJFcSgidGVzdCBzdHJpbmciKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF92ZWN0b3IpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIERvZXNOb3RNYXRjaFdyb25nT3JkZXIpIHsKLSAgdmVjdG9yPHN0cmluZz4gdGVzdF92ZWN0b3I7Ci0gIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygib25lIik7Ci0gIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygidGhyZWUiKTsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0d28iKTsKLQotICBNYXRjaGVyPHZlY3RvcjxzdHJpbmc+ID4gbSA9IEVsZW1lbnRzQXJlKAotICAgIFN0ckVxKCJvbmUiKSwgU3RyRXEoInR3byIpLCBTdHJFcSgidGhyZWUiKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF92ZWN0b3IpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIFdvcmtzRm9yTmVzdGVkQ29udGFpbmVyKSB7Ci0gIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsKLSAgICAiSGkiLAotICAgICJ3b3JsZCIKLSAgfTsKLQotICB2ZWN0b3I8bGlzdDxjaGFyPiA+IG5lc3RlZDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHVEVTVF9BUlJBWV9TSVpFXyhzdHJpbmdzKTsgaSsrKSB7Ci0gICAgbmVzdGVkLnB1c2hfYmFjayhsaXN0PGNoYXI+KHN0cmluZ3NbaV0sIHN0cmluZ3NbaV0gKyBzdHJsZW4oc3RyaW5nc1tpXSkpKTsKLSAgfQotCi0gIEVYUEVDVF9USEFUKG5lc3RlZCwgRWxlbWVudHNBcmUoRWxlbWVudHNBcmUoJ0gnLCBOZSgnZScpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50c0FyZSgndycsICdvJywgXywgXywgJ2QnKSkpOwotICBFWFBFQ1RfVEhBVChuZXN0ZWQsIE5vdChFbGVtZW50c0FyZShFbGVtZW50c0FyZSgnSCcsICdlJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCd3JywgJ28nLCBfLCBfLCAnZCcpKSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoQnlSZWZFbGVtZW50TWF0Y2hlcnMpIHsKLSAgaW50IGFbXSA9IHsgMCwgMSwgMiB9OwotICB2ZWN0b3I8aW50PiB2KGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0KLSAgRVhQRUNUX1RIQVQodiwgRWxlbWVudHNBcmUoUmVmKHZbMF0pLCBSZWYodlsxXSksIFJlZih2WzJdKSkpOwotICBFWFBFQ1RfVEhBVCh2LCBOb3QoRWxlbWVudHNBcmUoUmVmKHZbMF0pLCBSZWYodlsxXSksIFJlZihhWzJdKSkpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIFdvcmtzV2l0aENvbnRhaW5lclBvaW50ZXJVc2luZ1BvaW50ZWUpIHsKLSAgaW50IGFbXSA9IHsgMCwgMSwgMiB9OwotICB2ZWN0b3I8aW50PiB2KGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0KLSAgRVhQRUNUX1RIQVQoJnYsIFBvaW50ZWUoRWxlbWVudHNBcmUoMCwgMSwgXykpKTsKLSAgRVhQRUNUX1RIQVQoJnYsIE5vdChQb2ludGVlKEVsZW1lbnRzQXJlKDAsIF8sIDMpKSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoTmF0aXZlQXJyYXlQYXNzZWRCeVJlZmVyZW5jZSkgewotICBpbnQgYXJyYXlbXSA9IHsgMCwgMSwgMiB9OwotICBFWFBFQ1RfVEhBVChhcnJheSwgRWxlbWVudHNBcmUoMCwgMSwgXykpOwotICBFWFBFQ1RfVEhBVChhcnJheSwgTm90KEVsZW1lbnRzQXJlKDEsIF8sIF8pKSk7Ci0gIEVYUEVDVF9USEFUKGFycmF5LCBOb3QoRWxlbWVudHNBcmUoMCwgXykpKTsKLX0KLQotY2xhc3MgTmF0aXZlQXJyYXlQYXNzZWRBc1BvaW50ZXJBbmRTaXplIHsKLSBwdWJsaWM6Ci0gIE5hdGl2ZUFycmF5UGFzc2VkQXNQb2ludGVyQW5kU2l6ZSgpIHt9Ci0KLSAgTU9DS19NRVRIT0QyKEhlbHBlciwgdm9pZChpbnQqIGFycmF5LCBpbnQgc2l6ZSkpOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOYXRpdmVBcnJheVBhc3NlZEFzUG9pbnRlckFuZFNpemUpOwotfTsKLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIFdvcmtzV2l0aE5hdGl2ZUFycmF5UGFzc2VkQXNQb2ludGVyQW5kU2l6ZSkgewotICBpbnQgYXJyYXlbXSA9IHsgMCwgMSB9OwotICA6OnRlc3Rpbmc6OnR1cGxlPGludCosIHNpemVfdD4gYXJyYXlfYXNfdHVwbGUoYXJyYXksIDIpOwotICBFWFBFQ1RfVEhBVChhcnJheV9hc190dXBsZSwgRWxlbWVudHNBcmUoMCwgMSkpOwotICBFWFBFQ1RfVEhBVChhcnJheV9hc190dXBsZSwgTm90KEVsZW1lbnRzQXJlKDApKSk7Ci0KLSAgTmF0aXZlQXJyYXlQYXNzZWRBc1BvaW50ZXJBbmRTaXplIGhlbHBlcjsKLSAgRVhQRUNUX0NBTEwoaGVscGVyLCBIZWxwZXIoXywgXykpCi0gICAgICAuV2l0aChFbGVtZW50c0FyZSgwLCAxKSk7Ci0gIGhlbHBlci5IZWxwZXIoYXJyYXksIDIpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoVHdvRGltZW5zaW9uYWxOYXRpdmVBcnJheSkgewotICBjb25zdCBjaGFyIGEyW11bM10gPSB7ICJoaSIsICJsbyIgfTsKLSAgRVhQRUNUX1RIQVQoYTIsIEVsZW1lbnRzQXJlKEVsZW1lbnRzQXJlKCdoJywgJ2knLCAnXDAnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCdsJywgJ28nLCAnXDAnKSkpOwotICBFWFBFQ1RfVEhBVChhMiwgRWxlbWVudHNBcmUoU3RyRXEoImhpIiksIFN0ckVxKCJsbyIpKSk7Ci0gIEVYUEVDVF9USEFUKGEyLCBFbGVtZW50c0FyZShOb3QoRWxlbWVudHNBcmUoJ2gnLCAnbycsICdcMCcpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCdsJywgJ28nLCAnXDAnKSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlVGVzdCwgQWNjZXB0c1N0cmluZ0xpdGVyYWwpIHsKLSAgc3RyaW5nIGFycmF5W10gPSB7ICJoaSIsICJvbmUiLCAidHdvIiB9OwotICBFWFBFQ1RfVEhBVChhcnJheSwgRWxlbWVudHNBcmUoImhpIiwgIm9uZSIsICJ0d28iKSk7Ci0gIEVYUEVDVF9USEFUKGFycmF5LCBOb3QoRWxlbWVudHNBcmUoImhpIiwgIm9uZSIsICJ0b28iKSkpOwotfQotCi0jaWZuZGVmIF9NU0NfVkVSCi0KLS8vIFRoZSBmb2xsb3dpbmcgdGVzdCBwYXNzZXMgYSB2YWx1ZSBvZiB0eXBlIGNvbnN0IGNoYXJbXSB0byBhCi0vLyBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGV4cGVjdHMgY29uc3QgVCYuICBTb21lIHZlcnNpb25zIG9mIE1TVkMKLS8vIGdlbmVyYXRlcyBhIGNvbXBpbGVyIGVycm9yIEMyNjY1IGZvciB0aGF0LiAgV2UgYmVsaWV2ZSBpdCdzIGEgYnVnCi0vLyBpbiBNU1ZDLiAgVGhlcmVmb3JlIHRoaXMgdGVzdCBpcyAjaWYtZWQgb3V0IGZvciBNU1ZDLgotCi0vLyBEZWNsYXJlZCBoZXJlIHdpdGggdGhlIHNpemUgdW5rbm93bi4gIERlZmluZWQgQUZURVIgdGhlIGZvbGxvd2luZyB0ZXN0LgotZXh0ZXJuIGNvbnN0IGNoYXIga0hpW107Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBBY2NlcHRzQXJyYXlXaXRoVW5rbm93blNpemUpIHsKLSAgLy8gVGhlIHNpemUgb2Yga0hpIGlzIG5vdCBrbm93biBpbiB0aGlzIHRlc3QsIGJ1dCBFbGVtZW50c0FyZSgpIHNob3VsZAotICAvLyBzdGlsbCBhY2NlcHQgaXQuCi0KLSAgc3RyaW5nIGFycmF5MVtdID0geyAiaGkiIH07Ci0gIEVYUEVDVF9USEFUKGFycmF5MSwgRWxlbWVudHNBcmUoa0hpKSk7Ci0KLSAgc3RyaW5nIGFycmF5MltdID0geyAiaG8iIH07Ci0gIEVYUEVDVF9USEFUKGFycmF5MiwgTm90KEVsZW1lbnRzQXJlKGtIaSkpKTsKLX0KLQotY29uc3QgY2hhciBrSGlbXSA9ICJoaSI7Ci0KLSNlbmRpZiAgLy8gX01TQ19WRVIKLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIE1ha2VzQ29weU9mQXJndW1lbnRzKSB7Ci0gIGludCB4ID0gMTsKLSAgaW50IHkgPSAyOwotICAvLyBUaGlzIHNob3VsZCBtYWtlIGEgY29weSBvZiB4IGFuZCB5LgotICA6OnRlc3Rpbmc6OmludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8dGVzdGluZzo6dHVwbGU8aW50LCBpbnQ+ID4KLSAgICAgICAgICBwb2x5bW9ycGhpY19tYXRjaGVyID0gRWxlbWVudHNBcmUoeCwgeSk7Ci0gIC8vIENoYW5naW5nIHggYW5kIHkgbm93IHNob3VsZG4ndCBhZmZlY3QgdGhlIG1lYW5pbmcgb2YgdGhlIGFib3ZlIG1hdGNoZXIuCi0gIHggPSB5ID0gMDsKLSAgY29uc3QgaW50IGFycmF5MVtdID0geyAxLCAyIH07Ci0gIEVYUEVDVF9USEFUKGFycmF5MSwgcG9seW1vcnBoaWNfbWF0Y2hlcik7Ci0gIGNvbnN0IGludCBhcnJheTJbXSA9IHsgMCwgMCB9OwotICBFWFBFQ1RfVEhBVChhcnJheTIsIE5vdChwb2x5bW9ycGhpY19tYXRjaGVyKSk7Ci19Ci0KLQotLy8gVGVzdHMgZm9yIEVsZW1lbnRzQXJlQXJyYXkoKS4gIFNpbmNlIEVsZW1lbnRzQXJlQXJyYXkoKSBzaGFyZXMgbW9zdAotLy8gb2YgdGhlIGltcGxlbWVudGF0aW9uIHdpdGggRWxlbWVudHNBcmUoKSwgd2UgZG9uJ3QgdGVzdCBpdCBhcwotLy8gdGhvcm91Z2hseSBoZXJlLgotCi1URVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBDYW5CZUNyZWF0ZWRXaXRoVmFsdWVBcnJheSkgewotICBjb25zdCBpbnQgYVtdID0geyAxLCAyLCAzIH07Ci0KLSAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3IoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlQXJyYXkoYSkpOwotCi0gIHRlc3RfdmVjdG9yWzJdID0gMDsKLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIE5vdChFbGVtZW50c0FyZUFycmF5KGEpKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIENhbkJlQ3JlYXRlZFdpdGhBcnJheVNpemUpIHsKLSAgY29uc3QgY2hhciogYVtdID0geyAib25lIiwgInR3byIsICJ0aHJlZSIgfTsKLQotICB2ZWN0b3I8c3RyaW5nPiB0ZXN0X3ZlY3RvcihhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmVBcnJheShhLCBHVEVTVF9BUlJBWV9TSVpFXyhhKSkpOwotCi0gIGNvbnN0IGNoYXIqKiBwID0gYTsKLSAgdGVzdF92ZWN0b3JbMF0gPSAiMSI7Ci0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBOb3QoRWxlbWVudHNBcmVBcnJheShwLCBHVEVTVF9BUlJBWV9TSVpFXyhhKSkpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgQ2FuQmVDcmVhdGVkV2l0aG91dEFycmF5U2l6ZSkgewotICBjb25zdCBjaGFyKiBhW10gPSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OwotCi0gIHZlY3RvcjxzdHJpbmc+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGEpKTsKLQotICB0ZXN0X3ZlY3RvclswXSA9ICIxIjsKLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIE5vdChFbGVtZW50c0FyZUFycmF5KGEpKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIENhbkJlQ3JlYXRlZFdpdGhNYXRjaGVyQXJyYXkpIHsKLSAgY29uc3QgTWF0Y2hlcjxzdHJpbmc+IGtNYXRjaGVyQXJyYXlbXSA9Ci0gICAgeyBTdHJFcSgib25lIiksIFN0ckVxKCJ0d28iKSwgU3RyRXEoInRocmVlIikgfTsKLQotICB2ZWN0b3I8c3RyaW5nPiB0ZXN0X3ZlY3RvcjsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJvbmUiKTsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0d28iKTsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0aHJlZSIpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmVBcnJheShrTWF0Y2hlckFycmF5KSk7Ci0KLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0aHJlZSIpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgTm90KEVsZW1lbnRzQXJlQXJyYXkoa01hdGNoZXJBcnJheSkpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgQ2FuQmVDcmVhdGVkV2l0aFZlY3RvcikgewotICBjb25zdCBpbnQgYVtdID0geyAxLCAyLCAzIH07Ci0gIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIGNvbnN0IHZlY3RvcjxpbnQ+IGV4cGVjdGVkKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7Ci0gIHRlc3RfdmVjdG9yLnB1c2hfYmFjayg0KTsKLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIE5vdChFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi1URVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc0luaXRpYWxpemVyTGlzdCkgewotICBjb25zdCBpbnQgYVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OwotICBFWFBFQ1RfVEhBVChhLCBFbGVtZW50c0FyZUFycmF5KHsgMSwgMiwgMywgNCwgNSB9KSk7Ci0gIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5KHsgMSwgMiwgMywgNSwgNCB9KSkpOwotICBFWFBFQ1RfVEhBVChhLCBOb3QoRWxlbWVudHNBcmVBcnJheSh7IDEsIDIsIDMsIDQsIDYgfSkpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgVGFrZXNJbml0aWFsaXplckxpc3RPZkNTdHJpbmdzKSB7Ci0gIGNvbnN0IHN0cmluZyBhWzVdID0geyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiB9OwotICBFWFBFQ1RfVEhBVChhLCBFbGVtZW50c0FyZUFycmF5KHsgImEiLCAiYiIsICJjIiwgImQiLCAiZSIgfSkpOwotICBFWFBFQ1RfVEhBVChhLCBOb3QoRWxlbWVudHNBcmVBcnJheSh7ICJhIiwgImIiLCAiYyIsICJlIiwgImQiIH0pKSk7Ci0gIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5KHsgImEiLCAiYiIsICJjIiwgImQiLCAiZWYiIH0pKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIFRha2VzSW5pdGlhbGl6ZXJMaXN0T2ZTYW1lVHlwZWRNYXRjaGVycykgewotICBjb25zdCBpbnQgYVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OwotICBFWFBFQ1RfVEhBVChhLCBFbGVtZW50c0FyZUFycmF5KAotICAgICAgeyBFcSgxKSwgRXEoMiksIEVxKDMpLCBFcSg0KSwgRXEoNSkgfSkpOwotICBFWFBFQ1RfVEhBVChhLCBOb3QoRWxlbWVudHNBcmVBcnJheSgKLSAgICAgIHsgRXEoMSksIEVxKDIpLCBFcSgzKSwgRXEoNCksIEVxKDYpIH0pKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsCi0gICAgIFRha2VzSW5pdGlhbGl6ZXJMaXN0T2ZEaWZmZXJlbnRUeXBlZE1hdGNoZXJzKSB7Ci0gIGNvbnN0IGludCBhWzVdID0geyAxLCAyLCAzLCA0LCA1IH07Ci0gIC8vIFRoZSBjb21waWxlciBjYW5ub3QgaW5mZXIgdGhlIHR5cGUgb2YgdGhlIGluaXRpYWxpemVyIGxpc3QgaWYgaXRzCi0gIC8vIGVsZW1lbnRzIGhhdmUgZGlmZmVyZW50IHR5cGVzLiAgV2UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZnkgdGhlCi0gIC8vIHVuaWZpZWQgZWxlbWVudCB0eXBlIGluIHRoaXMgY2FzZS4KLSAgRVhQRUNUX1RIQVQoYSwgRWxlbWVudHNBcmVBcnJheTxNYXRjaGVyPGludD4gPigKLSAgICAgIHsgRXEoMSksIE5lKC0yKSwgR2UoMyksIExlKDQpLCBFcSg1KSB9KSk7Ci0gIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5PE1hdGNoZXI8aW50PiA+KAotICAgICAgeyBFcSgxKSwgTmUoLTIpLCBHZSgzKSwgTGUoNCksIEVxKDYpIH0pKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi1URVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBDYW5CZUNyZWF0ZWRXaXRoTWF0Y2hlclZlY3RvcikgewotICBjb25zdCBpbnQgYVtdID0geyAxLCAyLCAzIH07Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBrTWF0Y2hlcnNbXSA9IHsgRXEoMSksIEVxKDIpLCBFcSgzKSB9OwotICB2ZWN0b3I8aW50PiB0ZXN0X3ZlY3RvcihhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBjb25zdCB2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gZXhwZWN0ZWQoCi0gICAgICBrTWF0Y2hlcnMsIGtNYXRjaGVycyArIEdURVNUX0FSUkFZX1NJWkVfKGtNYXRjaGVycykpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmVBcnJheShleHBlY3RlZCkpOwotICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soNCk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBOb3QoRWxlbWVudHNBcmVBcnJheShleHBlY3RlZCkpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgQ2FuQmVDcmVhdGVkV2l0aEl0ZXJhdG9yUmFuZ2UpIHsKLSAgY29uc3QgaW50IGFbXSA9IHsgMSwgMiwgMyB9OwotICBjb25zdCB2ZWN0b3I8aW50PiB0ZXN0X3ZlY3RvcihhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBjb25zdCB2ZWN0b3I8aW50PiBleHBlY3RlZChhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmVBcnJheShleHBlY3RlZC5iZWdpbigpLCBleHBlY3RlZC5lbmQoKSkpOwotICAvLyBQb2ludGVycyBhcmUgaXRlcmF0b3JzLCB0b28uCi0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSkpOwotICAvLyBUaGUgZW1wdHkgcmFuZ2Ugb2YgTlVMTCBwb2ludGVycyBzaG91bGQgYWxzbyBiZSBva2F5LgotICBpbnQqIGNvbnN0IG51bGxfaW50ID0gTlVMTDsKLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIE5vdChFbGVtZW50c0FyZUFycmF5KG51bGxfaW50LCBudWxsX2ludCkpKTsKLSAgRVhQRUNUX1RIQVQoKHZlY3RvcjxpbnQ+KCkpLCBFbGVtZW50c0FyZUFycmF5KG51bGxfaW50LCBudWxsX2ludCkpOwotfQotCi0vLyBTaW5jZSBFbGVtZW50c0FyZSgpIGFuZCBFbGVtZW50c0FyZUFycmF5KCkgc2hhcmUgbXVjaCBvZiB0aGUKLS8vIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5IGRvIGEgc2FuaXR5IHRlc3QgZm9yIG5hdGl2ZSBhcnJheXMgaGVyZS4KLVRFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIFdvcmtzV2l0aE5hdGl2ZUFycmF5KSB7Ci0gIDo6c3RkOjpzdHJpbmcgYVtdID0geyAiaGkiLCAiaG8iIH07Ci0gIDo6c3RkOjpzdHJpbmcgYltdID0geyAiaGkiLCAiaG8iIH07Ci0KLSAgRVhQRUNUX1RIQVQoYSwgRWxlbWVudHNBcmVBcnJheShiKSk7Ci0gIEVYUEVDVF9USEFUKGEsIEVsZW1lbnRzQXJlQXJyYXkoYiwgMikpOwotICBFWFBFQ1RfVEhBVChhLCBOb3QoRWxlbWVudHNBcmVBcnJheShiLCAxKSkpOwotfQotCi1URVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBTb3VyY2VMaWZlU3BhbikgewotICBjb25zdCBpbnQgYVtdID0geyAxLCAyLCAzIH07Ci0gIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIHZlY3RvcjxpbnQ+IGV4cGVjdChhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxpbnQ+IG1hdGNoZXJfbWFrZXIgPQotICAgICAgRWxlbWVudHNBcmVBcnJheShleHBlY3QuYmVnaW4oKSwgZXhwZWN0LmVuZCgpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIG1hdGNoZXJfbWFrZXIpOwotICAvLyBDaGFuZ2luZyBpbiBwbGFjZSB0aGUgdmFsdWVzIHRoYXQgaW5pdGlhbGl6ZWQgbWF0Y2hlcl9tYWtlciBzaG91bGQgbm90Ci0gIC8vIGFmZmVjdCBtYXRjaGVyX21ha2VyIGFueW1vcmUuIEl0IHNob3VsZCBoYXZlIG1hZGUgaXRzIG93biBjb3B5IG9mIHRoZW0uCi0gIHR5cGVkZWYgdmVjdG9yPGludD46Oml0ZXJhdG9yIEl0ZXI7Ci0gIGZvciAoSXRlciBpdCA9IGV4cGVjdC5iZWdpbigpOyBpdCAhPSBleHBlY3QuZW5kKCk7ICsraXQpIHsgKml0ICs9IDEwOyB9Ci0gIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBtYXRjaGVyX21ha2VyKTsKLSAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKDMpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgTm90KG1hdGNoZXJfbWFrZXIpKTsKLX0KLQotLy8gVGVzdHMgZm9yIHRoZSBNQVRDSEVSKigpIG1hY3JvIGZhbWlseS4KLQotLy8gVGVzdHMgdGhhdCBhIHNpbXBsZSBNQVRDSEVSKCkgZGVmaW5pdGlvbiB3b3Jrcy4KLQotTUFUQ0hFUihJc0V2ZW4sICIiKSB7IHJldHVybiAoYXJnICUgMikgPT0gMDsgfQotCi1URVNUKE1hdGNoZXJNYWNyb1Rlc3QsIFdvcmtzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gSXNFdmVuKCk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyg2KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoNykpOwotCi0gIEVYUEVDVF9FUSgiaXMgZXZlbiIsIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJub3QgKGlzIGV2ZW4pIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCA2KSk7Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCA3KSk7Ci19Ci0KLS8vIFRoaXMgYWxzbyB0ZXN0cyB0aGF0IHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgY2FuIHJlZmVyZW5jZSAnbmVnYXRpb24nLgotTUFUQ0hFUihJc0V2ZW4yLCBuZWdhdGlvbiA/ICJpcyBvZGQiIDogImlzIGV2ZW4iKSB7Ci0gIGlmICgoYXJnICUgMikgPT0gMCkgewotICAgIC8vIFZlcmlmaWVzIHRoYXQgd2UgY2FuIHN0cmVhbSB0byByZXN1bHRfbGlzdGVuZXIsIGEgbGlzdGVuZXIKLSAgICAvLyBzdXBwbGllZCBieSB0aGUgTUFUQ0hFUiBtYWNybyBpbXBsaWNpdGx5LgotICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgIk9LIjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICIlIDIgPT0gIiA8PCAoYXJnICUgMik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8vIFRoaXMgYWxzbyB0ZXN0cyB0aGF0IHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgY2FuIHJlZmVyZW5jZSBtYXRjaGVyCi0vLyBwYXJhbWV0ZXJzLgotTUFUQ0hFUl9QMihFcVN1bU9mLCB4LCB5LAotICAgICAgICAgICBzdHJpbmcobmVnYXRpb24gPyAiZG9lc24ndCBlcXVhbCIgOiAiZXF1YWxzIikgKyAiIHRoZSBzdW0gb2YgIiArCi0gICAgICAgICAgIFByaW50VG9TdHJpbmcoeCkgKyAiIGFuZCAiICsgUHJpbnRUb1N0cmluZyh5KSkgewotICBpZiAoYXJnID09ICh4ICsgeSkpIHsKLSAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJPSyI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBvZgotICAgIC8vIHJlc3VsdF9saXN0ZW5lci4KLSAgICBpZiAocmVzdWx0X2xpc3RlbmVyLT5zdHJlYW0oKSAhPSBOVUxMKSB7Ci0gICAgICAqcmVzdWx0X2xpc3RlbmVyLT5zdHJlYW0oKSA8PCAiZGlmZiA9PSAiIDw8ICh4ICsgeSAtIGFyZyk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGNhbiByZWZlcmVuY2UgJ25lZ2F0aW9uJyBhbmQgdGhlCi0vLyBtYXRjaGVyIHBhcmFtZXRlcnMuCi1URVNUKE1hdGNoZXJNYWNyb1Rlc3QsIERlc2NyaXB0aW9uQ2FuUmVmZXJlbmNlTmVnYXRpb25BbmRQYXJhbWV0ZXJzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtMSA9IElzRXZlbjIoKTsKLSAgRVhQRUNUX0VRKCJpcyBldmVuIiwgRGVzY3JpYmUobTEpKTsKLSAgRVhQRUNUX0VRKCJpcyBvZGQiLCBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxpbnQ+IG0yID0gRXFTdW1PZig1LCA5KTsKLSAgRVhQRUNUX0VRKCJlcXVhbHMgdGhlIHN1bSBvZiA1IGFuZCA5IiwgRGVzY3JpYmUobTIpKTsKLSAgRVhQRUNUX0VRKCJkb2Vzbid0IGVxdWFsIHRoZSBzdW0gb2YgNSBhbmQgOSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKLX0KLQotLy8gVGVzdHMgZXhwbGFpbmluZyBtYXRjaCByZXN1bHQgaW4gYSBNQVRDSEVSKiBtYWNyby4KLVRFU1QoTWF0Y2hlck1hY3JvVGVzdCwgQ2FuRXhwbGFpbk1hdGNoUmVzdWx0KSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtMSA9IElzRXZlbjIoKTsKLSAgRVhQRUNUX0VRKCJPSyIsIEV4cGxhaW4obTEsIDQpKTsKLSAgRVhQRUNUX0VRKCIlIDIgPT0gMSIsIEV4cGxhaW4obTEsIDUpKTsKLQotICBjb25zdCBNYXRjaGVyPGludD4gbTIgPSBFcVN1bU9mKDEsIDIpOwotICBFWFBFQ1RfRVEoIk9LIiwgRXhwbGFpbihtMiwgMykpOwotICBFWFBFQ1RfRVEoImRpZmYgPT0gLTEiLCBFeHBsYWluKG0yLCA0KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIGJvZHkgb2YgTUFUQ0hFUigpIGNhbiByZWZlcmVuY2UgdGhlIHR5cGUgb2YgdGhlCi0vLyB2YWx1ZSBiZWluZyBtYXRjaGVkLgotCi1NQVRDSEVSKElzRW1wdHlTdHJpbmcsICIiKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTwgOjpzdGQ6OnN0cmluZywgYXJnX3R5cGU+KCk7Ci0gIHJldHVybiBhcmcgPT0gIiI7Ci19Ci0KLU1BVENIRVIoSXNFbXB0eVN0cmluZ0J5UmVmLCAiIikgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgOjpzdGQ6OnN0cmluZyYsIGFyZ190eXBlPigpOwotICByZXR1cm4gYXJnID09ICIiOwotfQotCi1URVNUKE1hdGNoZXJNYWNyb1Rlc3QsIENhblJlZmVyZW5jZUFyZ1R5cGUpIHsKLSAgY29uc3QgTWF0Y2hlcjwgOjpzdGQ6OnN0cmluZz4gbTEgPSBJc0VtcHR5U3RyaW5nKCk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoIiIpKTsKLQotICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6c3RkOjpzdHJpbmcmPiBtMiA9IElzRW1wdHlTdHJpbmdCeVJlZigpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCIiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTUFUQ0hFUigpIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlLgotCi1uYW1lc3BhY2UgbWF0Y2hlcl90ZXN0IHsKLU1BVENIRVIoSXNPZGQsICIiKSB7IHJldHVybiAoYXJnICUgMikgIT0gMDsgfQotfSAgLy8gbmFtZXNwYWNlIG1hdGNoZXJfdGVzdAotCi1URVNUKE1hdGNoZXJNYWNyb1Rlc3QsIFdvcmtzSW5OYW1lc3BhY2UpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBtYXRjaGVyX3Rlc3Q6OklzT2RkKCk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoNCkpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoNSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFZhbHVlKCkgY2FuIGJlIHVzZWQgdG8gY29tcG9zZSBtYXRjaGVycy4KLU1BVENIRVIoSXNQb3NpdGl2ZU9kZCwgIiIpIHsKLSAgcmV0dXJuIFZhbHVlKGFyZywgbWF0Y2hlcl90ZXN0OjpJc09kZCgpKSAmJiBhcmcgPiAwOwotfQotCi1URVNUKE1hdGNoZXJNYWNyb1Rlc3QsIENhbkJlQ29tcG9zZWRVc2luZ1ZhbHVlKSB7Ci0gIEVYUEVDVF9USEFUKDMsIElzUG9zaXRpdmVPZGQoKSk7Ci0gIEVYUEVDVF9USEFUKDQsIE5vdChJc1Bvc2l0aXZlT2RkKCkpKTsKLSAgRVhQRUNUX1RIQVQoLTEsIE5vdChJc1Bvc2l0aXZlT2RkKCkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIHNpbXBsZSBNQVRDSEVSX1AoKSBkZWZpbml0aW9uIHdvcmtzLgotCi1NQVRDSEVSX1AoSXNHcmVhdGVyVGhhbjMyQW5kLCBuLCAiIikgeyByZXR1cm4gYXJnID4gMzIgJiYgYXJnID4gbjsgfQotCi1URVNUKE1hdGNoZXJQTWFjcm9UZXN0LCBXb3JrcykgewotICBjb25zdCBNYXRjaGVyPGludD4gbSA9IElzR3JlYXRlclRoYW4zMkFuZCg1KTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDM2KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoNSkpOwotCi0gIEVYUEVDVF9FUSgiaXMgZ3JlYXRlciB0aGFuIDMyIGFuZCA1IiwgRGVzY3JpYmUobSkpOwotICBFWFBFQ1RfRVEoIm5vdCAoaXMgZ3JlYXRlciB0aGFuIDMyIGFuZCA1KSIsIERlc2NyaWJlTmVnYXRpb24obSkpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgMzYpKTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDUpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgZGVzY3JpcHRpb24gaXMgY2FsY3VsYXRlZCBjb3JyZWN0bHkgZnJvbSB0aGUgbWF0Y2hlciBuYW1lLgotTUFUQ0hFUl9QKF9pc19HcmVhdGVyX1RoYW4zMmFuZF8sIG4sICIiKSB7IHJldHVybiBhcmcgPiAzMiAmJiBhcmcgPiBuOyB9Ci0KLVRFU1QoTWF0Y2hlclBNYWNyb1Rlc3QsIEdlbmVyYXRlc0NvcnJlY3REZXNjcmlwdGlvbikgewotICBjb25zdCBNYXRjaGVyPGludD4gbSA9IF9pc19HcmVhdGVyX1RoYW4zMmFuZF8oNSk7Ci0KLSAgRVhQRUNUX0VRKCJpcyBncmVhdGVyIHRoYW4gMzIgYW5kIDUiLCBEZXNjcmliZShtKSk7Ci0gIEVYUEVDVF9FUSgibm90IChpcyBncmVhdGVyIHRoYW4gMzIgYW5kIDUpIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCAzNikpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgNSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgTUFUQ0hFUl9QIG1hdGNoZXIgY2FuIGJlIGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIHdpdGgKLS8vIGEgcmVmZXJlbmNlIHBhcmFtZXRlciB0eXBlLgotCi1jbGFzcyBVbmNvcHlhYmxlRm9vIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVuY29weWFibGVGb28oY2hhciB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gcHJpdmF0ZToKLSAgVW5jb3B5YWJsZUZvbyhjb25zdCBVbmNvcHlhYmxlRm9vJik7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFVuY29weWFibGVGb28mKTsKLQotICBjaGFyIHZhbHVlXzsKLX07Ci0KLU1BVENIRVJfUChSZWZlcmVuY2VzVW5jb3B5YWJsZSwgdmFyaWFibGUsICIiKSB7IHJldHVybiAmYXJnID09ICZ2YXJpYWJsZTsgfQotCi1URVNUKE1hdGNoZXJQTWFjcm9UZXN0LCBXb3Jrc1doZW5FeHBsaWNpdGx5SW5zdGFudGlhdGVkV2l0aFJlZmVyZW5jZSkgewotICBVbmNvcHlhYmxlRm9vIGZvbzEoJzEnKSwgZm9vMignMicpOwotICBjb25zdCBNYXRjaGVyPGNvbnN0IFVuY29weWFibGVGb28mPiBtID0KLSAgICAgIFJlZmVyZW5jZXNVbmNvcHlhYmxlPGNvbnN0IFVuY29weWFibGVGb28mPihmb28xKTsKLQotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoZm9vMSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGZvbzIpKTsKLQotICAvLyBXZSBkb24ndCB3YW50IHRoZSBhZGRyZXNzIG9mIHRoZSBwYXJhbWV0ZXIgcHJpbnRlZCwgYXMgbW9zdAotICAvLyBsaWtlbHkgaXQgd2lsbCBqdXN0IGFubm95IHRoZSB1c2VyLiAgSWYgdGhlIGFkZHJlc3MgaXMKLSAgLy8gaW50ZXJlc3RpbmcsIHRoZSB1c2VyIHNob3VsZCBjb25zaWRlciBwYXNzaW5nIHRoZSBwYXJhbWV0ZXIgYnkKLSAgLy8gcG9pbnRlciBpbnN0ZWFkLgotICBFWFBFQ1RfRVEoInJlZmVyZW5jZXMgdW5jb3B5YWJsZSAxLWJ5dGUgb2JqZWN0IDwzMT4iLCBEZXNjcmliZShtKSk7Ci19Ci0KLQotLy8gVGVzdHMgdGhhdCB0aGUgYm9keSBvZiBNQVRDSEVSX1BuKCkgY2FuIHJlZmVyZW5jZSB0aGUgcGFyYW1ldGVyCi0vLyB0eXBlcy4KLQotTUFUQ0hFUl9QMyhQYXJhbVR5cGVzQXJlSW50TG9uZ0FuZENoYXIsIGZvbywgYmFyLCBiYXosICIiKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIGZvb190eXBlPigpOwotICBTdGF0aWNBc3NlcnRUeXBlRXE8bG9uZywgYmFyX3R5cGU+KCk7ICAvLyBOT0xJTlQKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIGJhel90eXBlPigpOwotICByZXR1cm4gYXJnID09IDA7Ci19Ci0KLVRFU1QoTWF0Y2hlclBuTWFjcm9UZXN0LCBDYW5SZWZlcmVuY2VQYXJhbVR5cGVzKSB7Ci0gIEVYUEVDVF9USEFUKDAsIFBhcmFtVHlwZXNBcmVJbnRMb25nQW5kQ2hhcigxMCwgMjBMLCAnYScpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIE1BVENIRVJfUG4gbWF0Y2hlciBjYW4gYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQgd2l0aAotLy8gcmVmZXJlbmNlIHBhcmFtZXRlciB0eXBlcy4KLQotTUFUQ0hFUl9QMihSZWZlcmVuY2VzQW55T2YsIHZhcmlhYmxlMSwgdmFyaWFibGUyLCAiIikgewotICByZXR1cm4gJmFyZyA9PSAmdmFyaWFibGUxIHx8ICZhcmcgPT0gJnZhcmlhYmxlMjsKLX0KLQotVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIFdvcmtzV2hlbkV4cGxpY2l0bHlJbnN0YW50aWF0ZWRXaXRoUmVmZXJlbmNlcykgewotICBVbmNvcHlhYmxlRm9vIGZvbzEoJzEnKSwgZm9vMignMicpLCBmb28zKCczJyk7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgVW5jb3B5YWJsZUZvbyY+IG0gPQotICAgICAgUmVmZXJlbmNlc0FueU9mPGNvbnN0IFVuY29weWFibGVGb28mLCBjb25zdCBVbmNvcHlhYmxlRm9vJj4oZm9vMSwgZm9vMik7Ci0KLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGZvbzEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGZvbzIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhmb28zKSk7Ci19Ci0KLVRFU1QoTWF0Y2hlclBuTWFjcm9UZXN0LAotICAgICBHZW5lcmF0ZXNDb3JyZXREZXNjcmlwdGlvbldoZW5FeHBsaWNpdGx5SW5zdGFudGlhdGVkV2l0aFJlZmVyZW5jZXMpIHsKLSAgVW5jb3B5YWJsZUZvbyBmb28xKCcxJyksIGZvbzIoJzInKTsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBVbmNvcHlhYmxlRm9vJj4gbSA9Ci0gICAgICBSZWZlcmVuY2VzQW55T2Y8Y29uc3QgVW5jb3B5YWJsZUZvbyYsIGNvbnN0IFVuY29weWFibGVGb28mPihmb28xLCBmb28yKTsKLQotICAvLyBXZSBkb24ndCB3YW50IHRoZSBhZGRyZXNzZXMgb2YgdGhlIHBhcmFtZXRlcnMgcHJpbnRlZCwgYXMgbW9zdAotICAvLyBsaWtlbHkgdGhleSB3aWxsIGp1c3QgYW5ub3kgdGhlIHVzZXIuICBJZiB0aGUgYWRkcmVzc2VzIGFyZQotICAvLyBpbnRlcmVzdGluZywgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMgYnkKLSAgLy8gcG9pbnRlcnMgaW5zdGVhZC4KLSAgRVhQRUNUX0VRKCJyZWZlcmVuY2VzIGFueSBvZiAoMS1ieXRlIG9iamVjdCA8MzE+LCAxLWJ5dGUgb2JqZWN0IDwzMj4pIiwKLSAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIHNpbXBsZSBNQVRDSEVSX1AyKCkgZGVmaW5pdGlvbiB3b3Jrcy4KLQotTUFUQ0hFUl9QMihJc05vdEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksICIiKSB7IHJldHVybiBhcmcgPCBsb3cgfHwgYXJnID4gaGk7IH0KLQotVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIFdvcmtzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgbG9uZyY+IG0gPSBJc05vdEluQ2xvc2VkUmFuZ2UoMTAsIDIwKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMzZMKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMTVMKSk7Ci0KLSAgRVhQRUNUX0VRKCJpcyBub3QgaW4gY2xvc2VkIHJhbmdlICgxMCwgMjApIiwgRGVzY3JpYmUobSkpOwotICBFWFBFQ1RfRVEoIm5vdCAoaXMgbm90IGluIGNsb3NlZCByYW5nZSAoMTAsIDIwKSkiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDM2TCkpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgMTVMKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTUFUQ0hFUiooKSBkZWZpbml0aW9ucyBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUgbnVtYmVyCi0vLyBvZiBwYXJhbWV0ZXJzOyBhbHNvIHRlc3RzIE1BVENIRVJfUG4oKSB3aGVyZSBuID49IDMuCi0KLU1BVENIRVIoRXF1YWxzU3VtT2YsICIiKSB7IHJldHVybiBhcmcgPT0gMDsgfQotTUFUQ0hFUl9QKEVxdWFsc1N1bU9mLCBhLCAiIikgeyByZXR1cm4gYXJnID09IGE7IH0KLU1BVENIRVJfUDIoRXF1YWxzU3VtT2YsIGEsIGIsICIiKSB7IHJldHVybiBhcmcgPT0gYSArIGI7IH0KLU1BVENIRVJfUDMoRXF1YWxzU3VtT2YsIGEsIGIsIGMsICIiKSB7IHJldHVybiBhcmcgPT0gYSArIGIgKyBjOyB9Ci1NQVRDSEVSX1A0KEVxdWFsc1N1bU9mLCBhLCBiLCBjLCBkLCAiIikgeyByZXR1cm4gYXJnID09IGEgKyBiICsgYyArIGQ7IH0KLU1BVENIRVJfUDUoRXF1YWxzU3VtT2YsIGEsIGIsIGMsIGQsIGUsICIiKSB7IHJldHVybiBhcmcgPT0gYSArIGIgKyBjICsgZCArIGU7IH0KLU1BVENIRVJfUDYoRXF1YWxzU3VtT2YsIGEsIGIsIGMsIGQsIGUsIGYsICIiKSB7Ci0gIHJldHVybiBhcmcgPT0gYSArIGIgKyBjICsgZCArIGUgKyBmOwotfQotTUFUQ0hFUl9QNyhFcXVhbHNTdW1PZiwgYSwgYiwgYywgZCwgZSwgZiwgZywgIiIpIHsKLSAgcmV0dXJuIGFyZyA9PSBhICsgYiArIGMgKyBkICsgZSArIGYgKyBnOwotfQotTUFUQ0hFUl9QOChFcXVhbHNTdW1PZiwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgIiIpIHsKLSAgcmV0dXJuIGFyZyA9PSBhICsgYiArIGMgKyBkICsgZSArIGYgKyBnICsgaDsKLX0KLU1BVENIRVJfUDkoRXF1YWxzU3VtT2YsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksICIiKSB7Ci0gIHJldHVybiBhcmcgPT0gYSArIGIgKyBjICsgZCArIGUgKyBmICsgZyArIGggKyBpOwotfQotTUFUQ0hFUl9QMTAoRXF1YWxzU3VtT2YsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosICIiKSB7Ci0gIHJldHVybiBhcmcgPT0gYSArIGIgKyBjICsgZCArIGUgKyBmICsgZyArIGggKyBpICsgajsKLX0KLQotVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIENhbkJlT3ZlcmxvYWRlZE9uTnVtYmVyT2ZQYXJhbWV0ZXJzKSB7Ci0gIEVYUEVDVF9USEFUKDAsIEVxdWFsc1N1bU9mKCkpOwotICBFWFBFQ1RfVEhBVCgxLCBFcXVhbHNTdW1PZigxKSk7Ci0gIEVYUEVDVF9USEFUKDEyLCBFcXVhbHNTdW1PZigxMCwgMikpOwotICBFWFBFQ1RfVEhBVCgxMjMsIEVxdWFsc1N1bU9mKDEwMCwgMjAsIDMpKTsKLSAgRVhQRUNUX1RIQVQoMTIzNCwgRXF1YWxzU3VtT2YoMTAwMCwgMjAwLCAzMCwgNCkpOwotICBFWFBFQ1RfVEhBVCgxMjM0NSwgRXF1YWxzU3VtT2YoMTAwMDAsIDIwMDAsIDMwMCwgNDAsIDUpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZiIsCi0gICAgICAgICAgICAgIEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZmciLAotICAgICAgICAgICAgICBFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICdiJywgJ2MnLCAiZCIsICJlIiwgJ2YnLCAnZycpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZmdoIiwKLSAgICAgICAgICAgICAgRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJywgJ2cnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaCIpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZmdoaSIsCi0gICAgICAgICAgICAgIEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicsICdnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImgiLCAnaScpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZmdoaWoiLAotICAgICAgICAgICAgICBFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICdiJywgJ2MnLCAiZCIsICJlIiwgJ2YnLCAnZycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJoIiwgJ2knLCA6OnN0ZDo6c3RyaW5nKCJqIikpKTsKLQotICBFWFBFQ1RfVEhBVCgxLCBOb3QoRXF1YWxzU3VtT2YoKSkpOwotICBFWFBFQ1RfVEhBVCgtMSwgTm90KEVxdWFsc1N1bU9mKDEpKSk7Ci0gIEVYUEVDVF9USEFUKC0xMiwgTm90KEVxdWFsc1N1bU9mKDEwLCAyKSkpOwotICBFWFBFQ1RfVEhBVCgtMTIzLCBOb3QoRXF1YWxzU3VtT2YoMTAwLCAyMCwgMykpKTsKLSAgRVhQRUNUX1RIQVQoLTEyMzQsIE5vdChFcXVhbHNTdW1PZigxMDAwLCAyMDAsIDMwLCA0KSkpOwotICBFWFBFQ1RfVEhBVCgtMTIzNDUsIE5vdChFcXVhbHNTdW1PZigxMDAwMCwgMjAwMCwgMzAwLCA0MCwgNSkpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZiAiLAotICAgICAgICAgICAgICBOb3QoRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJykpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZmcgIiwKLSAgICAgICAgICAgICAgTm90KEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycpKSk7Ci0gIEVYUEVDVF9USEFUKCJhYmNkZWZnaCAiLAotICAgICAgICAgICAgICBOb3QoRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJywgJ2cnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImgiKSkpOwotICBFWFBFQ1RfVEhBVCgiYWJjZGVmZ2hpICIsCi0gICAgICAgICAgICAgIE5vdChFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICdiJywgJ2MnLCAiZCIsICJlIiwgJ2YnLCAnZycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaCIsICdpJykpKTsKLSAgRVhQRUNUX1RIQVQoImFiY2RlZmdoaWogIiwKLSAgICAgICAgICAgICAgTm90KEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicsICdnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoIiwgJ2knLCA6OnN0ZDo6c3RyaW5nKCJqIikpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBNQVRDSEVSX1BuKCkgZGVmaW5pdGlvbiBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGggYW55Ci0vLyBjb21wYXRpYmxlIHBhcmFtZXRlciB0eXBlcy4KLVRFU1QoTWF0Y2hlclBuTWFjcm9UZXN0LCBXb3Jrc0ZvckRpZmZlcmVudFBhcmFtZXRlclR5cGVzKSB7Ci0gIEVYUEVDVF9USEFUKDEyMywgRXF1YWxzU3VtT2YoMTAwTCwgMjAsIHN0YXRpY19jYXN0PGNoYXI+KDMpKSk7Ci0gIEVYUEVDVF9USEFUKCJhYmNkIiwgRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAiYiIsICdjJywgImQiKSk7Ci0KLSAgRVhQRUNUX1RIQVQoMTI0LCBOb3QoRXF1YWxzU3VtT2YoMTAwTCwgMjAsIHN0YXRpY19jYXN0PGNoYXI+KDMpKSkpOwotICBFWFBFQ1RfVEhBVCgiYWJjZGUiLCBOb3QoRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAiYiIsICdjJywgImQiKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBtYXRjaGVyIGJvZHkgY2FuIHByb21vdGUgdGhlIHBhcmFtZXRlciB0eXBlcy4KLQotTUFUQ0hFUl9QMihFcUNvbmNhdCwgcHJlZml4LCBzdWZmaXgsICIiKSB7Ci0gIC8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHJvbW90ZSB0aGUgdHdvIHBhcmFtZXRlcnMgdG8gZGVzaXJlZCB0eXBlcy4KLSAgc3RkOjpzdHJpbmcgcHJlZml4X3N0cihwcmVmaXgpOwotICBjaGFyIHN1ZmZpeF9jaGFyID0gc3RhdGljX2Nhc3Q8Y2hhcj4oc3VmZml4KTsKLSAgcmV0dXJuIGFyZyA9PSBwcmVmaXhfc3RyICsgc3VmZml4X2NoYXI7Ci19Ci0KLVRFU1QoTWF0Y2hlclBuTWFjcm9UZXN0LCBTaW1wbGVUeXBlUHJvbW90aW9uKSB7Ci0gIE1hdGNoZXI8c3RkOjpzdHJpbmc+IG5vX3Byb21vID0KLSAgICAgIEVxQ29uY2F0KHN0ZDo6c3RyaW5nKCJmb28iKSwgJ3QnKTsKLSAgTWF0Y2hlcjxjb25zdCBzdGQ6OnN0cmluZyY+IHByb21vID0KLSAgICAgIEVxQ29uY2F0KCJmb28iLCBzdGF0aWNfY2FzdDxpbnQ+KCd0JykpOwotICBFWFBFQ1RfRkFMU0Uobm9fcHJvbW8uTWF0Y2hlcygiZm9vbCIpKTsKLSAgRVhQRUNUX0ZBTFNFKHByb21vLk1hdGNoZXMoImZvb2wiKSk7Ci0gIEVYUEVDVF9UUlVFKG5vX3Byb21vLk1hdGNoZXMoImZvb3QiKSk7Ci0gIEVYUEVDVF9UUlVFKHByb21vLk1hdGNoZXMoImZvb3QiKSk7Ci19Ci0KLS8vIFZlcmlmaWVzIHRoZSB0eXBlIG9mIGEgTUFUQ0hFUiouCi0KLVRFU1QoTWF0Y2hlclBuTWFjcm9UZXN0LCBUeXBlc0FyZUNvcnJlY3QpIHsKLSAgLy8gRXF1YWxzU3VtT2YoKSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gYSBFcXVhbHNTdW1PZk1hdGNoZXIgdmFyaWFibGUuCi0gIEVxdWFsc1N1bU9mTWF0Y2hlciBhMCA9IEVxdWFsc1N1bU9mKCk7Ci0KLSAgLy8gRXF1YWxzU3VtT2YoMSkgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIGEgRXF1YWxzU3VtT2ZNYXRjaGVyUCB2YXJpYWJsZS4KLSAgRXF1YWxzU3VtT2ZNYXRjaGVyUDxpbnQ+IGExID0gRXF1YWxzU3VtT2YoMSk7Ci0KLSAgLy8gRXF1YWxzU3VtT2YocDEsIC4uLiwgcGspIG11c3QgYmUgYXNzaWduYWJsZSB0byBhIEVxdWFsc1N1bU9mTWF0Y2hlclBrCi0gIC8vIHZhcmlhYmxlLCBhbmQgc28gb24uCi0gIEVxdWFsc1N1bU9mTWF0Y2hlclAyPGludCwgY2hhcj4gYTIgPSBFcXVhbHNTdW1PZigxLCAnMicpOwotICBFcXVhbHNTdW1PZk1hdGNoZXJQMzxpbnQsIGludCwgY2hhcj4gYTMgPSBFcXVhbHNTdW1PZigxLCAyLCAnMycpOwotICBFcXVhbHNTdW1PZk1hdGNoZXJQNDxpbnQsIGludCwgaW50LCBjaGFyPiBhNCA9IEVxdWFsc1N1bU9mKDEsIDIsIDMsICc0Jyk7Ci0gIEVxdWFsc1N1bU9mTWF0Y2hlclA1PGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTUgPQotICAgICAgRXF1YWxzU3VtT2YoMSwgMiwgMywgNCwgJzUnKTsKLSAgRXF1YWxzU3VtT2ZNYXRjaGVyUDY8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGE2ID0KLSAgICAgIEVxdWFsc1N1bU9mKDEsIDIsIDMsIDQsIDUsICc2Jyk7Ci0gIEVxdWFsc1N1bU9mTWF0Y2hlclA3PGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGE3ID0KLSAgICAgIEVxdWFsc1N1bU9mKDEsIDIsIDMsIDQsIDUsIDYsICc3Jyk7Ci0gIEVxdWFsc1N1bU9mTWF0Y2hlclA4PGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTggPQotICAgICAgRXF1YWxzU3VtT2YoMSwgMiwgMywgNCwgNSwgNiwgNywgJzgnKTsKLSAgRXF1YWxzU3VtT2ZNYXRjaGVyUDk8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGE5ID0KLSAgICAgIEVxdWFsc1N1bU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsICc5Jyk7Ci0gIEVxdWFsc1N1bU9mTWF0Y2hlclAxMDxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhMTAgPQotICAgICAgRXF1YWxzU3VtT2YoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgJzAnKTsKLQotICAvLyBBdm9pZCAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5ncy4KLSAgKHZvaWQpYTA7Ci0gICh2b2lkKWExOwotICAodm9pZClhMjsKLSAgKHZvaWQpYTM7Ci0gICh2b2lkKWE0OwotICAodm9pZClhNTsKLSAgKHZvaWQpYTY7Ci0gICh2b2lkKWE3OwotICAodm9pZClhODsKLSAgKHZvaWQpYTk7Ci0gICh2b2lkKWExMDsKLX0KLQotLy8gVGVzdHMgdGhhdCBtYXRjaGVyLXR5cGVkIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgaW4gVmFsdWUoKSBpbnNpZGUgYQotLy8gTUFUQ0hFUl9QbiBkZWZpbml0aW9uLgotCi0vLyBTdWNjZWVkcyBpZiBhcmcgbWF0Y2hlcyBleGFjdGx5IDIgb2YgdGhlIDMgbWF0Y2hlcnMuCi1NQVRDSEVSX1AzKFR3b09mLCBtMSwgbTIsIG0zLCAiIikgewotICBjb25zdCBpbnQgY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KFZhbHVlKGFyZywgbTEpKQotICAgICAgKyBzdGF0aWNfY2FzdDxpbnQ+KFZhbHVlKGFyZywgbTIpKSArIHN0YXRpY19jYXN0PGludD4oVmFsdWUoYXJnLCBtMykpOwotICByZXR1cm4gY291bnQgPT0gMjsKLX0KLQotVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIENhblVzZU1hdGNoZXJUeXBlZFBhcmFtZXRlckluVmFsdWUpIHsKLSAgRVhQRUNUX1RIQVQoNDIsIFR3b09mKEd0KDApLCBMdCg1MCksIEVxKDEwKSkpOwotICBFWFBFQ1RfVEhBVCgwLCBOb3QoVHdvT2YoR3QoLTEpLCBMdCgxKSwgRXEoMCkpKSk7Ci19Ci0KLS8vIFRlc3RzIENvbnRhaW5zKCkuCi0KLVRFU1QoQ29udGFpbnNUZXN0LCBMaXN0TWF0Y2hlc1doZW5FbGVtZW50SXNJbkNvbnRhaW5lcikgewotICBsaXN0PGludD4gc29tZV9saXN0OwotICBzb21lX2xpc3QucHVzaF9iYWNrKDMpOwotICBzb21lX2xpc3QucHVzaF9iYWNrKDEpOwotICBzb21lX2xpc3QucHVzaF9iYWNrKDIpOwotICBFWFBFQ1RfVEhBVChzb21lX2xpc3QsIENvbnRhaW5zKDEpKTsKLSAgRVhQRUNUX1RIQVQoc29tZV9saXN0LCBDb250YWlucyhHdCgyLjUpKSk7Ci0gIEVYUEVDVF9USEFUKHNvbWVfbGlzdCwgQ29udGFpbnMoRXEoMi4wZikpKTsKLQotICBsaXN0PHN0cmluZz4gYW5vdGhlcl9saXN0OwotICBhbm90aGVyX2xpc3QucHVzaF9iYWNrKCJmZWUiKTsKLSAgYW5vdGhlcl9saXN0LnB1c2hfYmFjaygiZmllIik7Ci0gIGFub3RoZXJfbGlzdC5wdXNoX2JhY2soImZvZSIpOwotICBhbm90aGVyX2xpc3QucHVzaF9iYWNrKCJmdW0iKTsKLSAgRVhQRUNUX1RIQVQoYW5vdGhlcl9saXN0LCBDb250YWlucyhzdHJpbmcoImZlZSIpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbnNUZXN0LCBMaXN0RG9lc05vdE1hdGNoV2hlbkVsZW1lbnRJc05vdEluQ29udGFpbmVyKSB7Ci0gIGxpc3Q8aW50PiBzb21lX2xpc3Q7Ci0gIHNvbWVfbGlzdC5wdXNoX2JhY2soMyk7Ci0gIHNvbWVfbGlzdC5wdXNoX2JhY2soMSk7Ci0gIEVYUEVDVF9USEFUKHNvbWVfbGlzdCwgTm90KENvbnRhaW5zKDQpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbnNUZXN0LCBTZXRNYXRjaGVzV2hlbkVsZW1lbnRJc0luQ29udGFpbmVyKSB7Ci0gIHNldDxpbnQ+IHNvbWVfc2V0OwotICBzb21lX3NldC5pbnNlcnQoMyk7Ci0gIHNvbWVfc2V0Lmluc2VydCgxKTsKLSAgc29tZV9zZXQuaW5zZXJ0KDIpOwotICBFWFBFQ1RfVEhBVChzb21lX3NldCwgQ29udGFpbnMoRXEoMS4wKSkpOwotICBFWFBFQ1RfVEhBVChzb21lX3NldCwgQ29udGFpbnMoRXEoMy4wZikpKTsKLSAgRVhQRUNUX1RIQVQoc29tZV9zZXQsIENvbnRhaW5zKDIpKTsKLQotICBzZXQ8Y29uc3QgY2hhcio+IGFub3RoZXJfc2V0OwotICBhbm90aGVyX3NldC5pbnNlcnQoImZlZSIpOwotICBhbm90aGVyX3NldC5pbnNlcnQoImZpZSIpOwotICBhbm90aGVyX3NldC5pbnNlcnQoImZvZSIpOwotICBhbm90aGVyX3NldC5pbnNlcnQoImZ1bSIpOwotICBFWFBFQ1RfVEhBVChhbm90aGVyX3NldCwgQ29udGFpbnMoRXEoc3RyaW5nKCJmdW0iKSkpKTsKLX0KLQotVEVTVChDb250YWluc1Rlc3QsIFNldERvZXNOb3RNYXRjaFdoZW5FbGVtZW50SXNOb3RJbkNvbnRhaW5lcikgewotICBzZXQ8aW50PiBzb21lX3NldDsKLSAgc29tZV9zZXQuaW5zZXJ0KDMpOwotICBzb21lX3NldC5pbnNlcnQoMSk7Ci0gIEVYUEVDVF9USEFUKHNvbWVfc2V0LCBOb3QoQ29udGFpbnMoNCkpKTsKLQotICBzZXQ8Y29uc3QgY2hhcio+IGNfc3RyaW5nX3NldDsKLSAgY19zdHJpbmdfc2V0Lmluc2VydCgiaGVsbG8iKTsKLSAgRVhQRUNUX1RIQVQoY19zdHJpbmdfc2V0LCBOb3QoQ29udGFpbnMoc3RyaW5nKCJoZWxsbyIpLmNfc3RyKCkpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbnNUZXN0LCBFeHBsYWluc01hdGNoUmVzdWx0Q29ycmVjdGx5KSB7Ci0gIGNvbnN0IGludCBhWzJdID0geyAxLCAyIH07Ci0gIE1hdGNoZXI8Y29uc3QgaW50ICgmKVsyXT4gbSA9IENvbnRhaW5zKDIpOwotICBFWFBFQ1RfRVEoIndob3NlIGVsZW1lbnQgIzEgbWF0Y2hlcyIsIEV4cGxhaW4obSwgYSkpOwotCi0gIG0gPSBDb250YWlucygzKTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIGEpKTsKLQotICBtID0gQ29udGFpbnMoR3JlYXRlclRoYW4oMCkpOwotICBFWFBFQ1RfRVEoIndob3NlIGVsZW1lbnQgIzAgbWF0Y2hlcywgd2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsIEV4cGxhaW4obSwgYSkpOwotCi0gIG0gPSBDb250YWlucyhHcmVhdGVyVGhhbigxMCkpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgYSkpOwotfQotCi1URVNUKENvbnRhaW5zVGVzdCwgRGVzY3JpYmVzSXRzZWxmQ29ycmVjdGx5KSB7Ci0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gQ29udGFpbnMoMSk7Ci0gIEVYUEVDVF9FUSgiY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgdGhhdCBpcyBlcXVhbCB0byAxIiwgRGVzY3JpYmUobSkpOwotCi0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtMiA9IE5vdChtKTsKLSAgRVhQRUNUX0VRKCJkb2Vzbid0IGNvbnRhaW4gYW55IGVsZW1lbnQgdGhhdCBpcyBlcXVhbCB0byAxIiwgRGVzY3JpYmUobTIpKTsKLX0KLQotVEVTVChDb250YWluc1Rlc3QsIE1hcE1hdGNoZXNXaGVuRWxlbWVudElzSW5Db250YWluZXIpIHsKLSAgbWFwPGNvbnN0IGNoYXIqLCBpbnQ+IG15X21hcDsKLSAgY29uc3QgY2hhciogYmFyID0gImEgc3RyaW5nIjsKLSAgbXlfbWFwW2Jhcl0gPSAyOwotICBFWFBFQ1RfVEhBVChteV9tYXAsIENvbnRhaW5zKHBhaXI8Y29uc3QgY2hhciogY29uc3QsIGludD4oYmFyLCAyKSkpOwotCi0gIG1hcDxzdHJpbmcsIGludD4gYW5vdGhlcl9tYXA7Ci0gIGFub3RoZXJfbWFwWyJmZWUiXSA9IDE7Ci0gIGFub3RoZXJfbWFwWyJmaWUiXSA9IDI7Ci0gIGFub3RoZXJfbWFwWyJmb2UiXSA9IDM7Ci0gIGFub3RoZXJfbWFwWyJmdW0iXSA9IDQ7Ci0gIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBDb250YWlucyhwYWlyPGNvbnN0IHN0cmluZywgaW50PihzdHJpbmcoImZlZSIpLCAxKSkpOwotICBFWFBFQ1RfVEhBVChhbm90aGVyX21hcCwgQ29udGFpbnMocGFpcjxjb25zdCBzdHJpbmcsIGludD4oImZpZSIsIDIpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbnNUZXN0LCBNYXBEb2VzTm90TWF0Y2hXaGVuRWxlbWVudElzTm90SW5Db250YWluZXIpIHsKLSAgbWFwPGludCwgaW50PiBzb21lX21hcDsKLSAgc29tZV9tYXBbMV0gPSAxMTsKLSAgc29tZV9tYXBbMl0gPSAyMjsKLSAgRVhQRUNUX1RIQVQoc29tZV9tYXAsIE5vdChDb250YWlucyhwYWlyPGNvbnN0IGludCwgaW50PigyLCAyMykpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbnNUZXN0LCBBcnJheU1hdGNoZXNXaGVuRWxlbWVudElzSW5Db250YWluZXIpIHsKLSAgY29uc3QgY2hhciogc3RyaW5nX2FycmF5W10gPSB7ICJmZWUiLCAiZmllIiwgImZvZSIsICJmdW0iIH07Ci0gIEVYUEVDVF9USEFUKHN0cmluZ19hcnJheSwgQ29udGFpbnMoRXEoc3RyaW5nKCJmdW0iKSkpKTsKLX0KLQotVEVTVChDb250YWluc1Rlc3QsIEFycmF5RG9lc05vdE1hdGNoV2hlbkVsZW1lbnRJc05vdEluQ29udGFpbmVyKSB7Ci0gIGludCBpbnRfYXJyYXlbXSA9IHsgMSwgMiwgMywgNCB9OwotICBFWFBFQ1RfVEhBVChpbnRfYXJyYXksIE5vdChDb250YWlucyg1KSkpOwotfQotCi1URVNUKENvbnRhaW5zVGVzdCwgQWNjZXB0c01hdGNoZXIpIHsKLSAgY29uc3QgaW50IGFbXSA9IHsgMSwgMiwgMyB9OwotICBFWFBFQ1RfVEhBVChhLCBDb250YWlucyhHdCgyKSkpOwotICBFWFBFQ1RfVEhBVChhLCBOb3QoQ29udGFpbnMoR3QoNCkpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbnNUZXN0LCBXb3Jrc0Zvck5hdGl2ZUFycmF5QXNUdXBsZSkgewotICBjb25zdCBpbnQgYVtdID0geyAxLCAyIH07Ci0gIGNvbnN0IGludCogY29uc3QgcG9pbnRlciA9IGE7Ci0gIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUocG9pbnRlciwgMiksIENvbnRhaW5zKDEpKTsKLSAgRVhQRUNUX1RIQVQobWFrZV90dXBsZShwb2ludGVyLCAyKSwgTm90KENvbnRhaW5zKEd0KDMpKSkpOwotfQotCi1URVNUKENvbnRhaW5zVGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbE5hdGl2ZUFycmF5KSB7Ci0gIGludCBhW11bM10gPSB7IHsgMSwgMiwgMyB9LCB7IDQsIDUsIDYgfSB9OwotICBFWFBFQ1RfVEhBVChhLCBDb250YWlucyhFbGVtZW50c0FyZSg0LCA1LCA2KSkpOwotICBFWFBFQ1RfVEhBVChhLCBDb250YWlucyhDb250YWlucyg1KSkpOwotICBFWFBFQ1RfVEhBVChhLCBOb3QoQ29udGFpbnMoRWxlbWVudHNBcmUoMywgNCwgNSkpKSk7Ci0gIEVYUEVDVF9USEFUKGEsIENvbnRhaW5zKE5vdChDb250YWlucyg1KSkpKTsKLX0KLQotVEVTVChBbGxPZlRlc3QsIEh1Z2VNYXRjaGVyKSB7Ci0gIC8vIFZlcmlmeSB0aGF0IHVzaW5nIEFsbE9mIHdpdGggbWFueSBhcmd1bWVudHMgZG9lc24ndCBjYXVzZQotICAvLyB0aGUgY29tcGlsZXIgdG8gZXhjZWVkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGggbGltaXQuCi0gIEVYUEVDVF9USEFUKDAsIHRlc3Rpbmc6OkFsbE9mKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkFsbE9mKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKSk7Ci19Ci0KLVRFU1QoQW55T2ZUZXN0LCBIdWdlTWF0Y2hlcikgewotICAvLyBWZXJpZnkgdGhhdCB1c2luZyBBbnlPZiB3aXRoIG1hbnkgYXJndW1lbnRzIGRvZXNuJ3QgY2F1c2UKLSAgLy8gdGhlIGNvbXBpbGVyIHRvIGV4Y2VlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGRlcHRoIGxpbWl0LgotICBFWFBFQ1RfVEhBVCgwLCB0ZXN0aW5nOjpBbnlPZihfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpBbnlPZihfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkpOwotfQotCi1uYW1lc3BhY2UgYWRsX3Rlc3QgewotCi0vLyBWZXJpZmllcyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiA6OnRlc3Rpbmc6OkFsbE9mIGFuZCA6OnRlc3Rpbmc6OkFueU9mCi0vLyBkb24ndCBpc3N1ZSB1bnF1YWxpZmllZCByZWN1cnNpdmUgY2FsbHMuICBJZiB0aGV5IGRvLCB0aGUgYXJndW1lbnQgZGVwZW5kZW50Ci0vLyBuYW1lIGxvb2t1cCB3aWxsIGNhdXNlIEFsbE9mL0FueU9mIGluIHRoZSAnYWRsX3Rlc3QnIG5hbWVzcGFjZSB0byBiZSBmb3VuZAotLy8gYXMgYSBjYW5kaWRhdGUgYW5kIHRoZSBjb21waWxhdGlvbiB3aWxsIGJyZWFrIGR1ZSB0byBhbiBhbWJpZ3VvdXMgb3ZlcmxvYWQuCi0KLS8vIFRoZSBtYXRjaGVyIG11c3QgYmUgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIEFsbE9mL0FueU9mIHRvIG1ha2UgYXJndW1lbnQKLS8vIGRlcGVuZGVudCBsb29rdXAgZmluZCB0aG9zZS4KLU1BVENIRVIoTSwgIiIpIHsgcmV0dXJuIHRydWU7IH0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWJvb2wgQWxsT2YoY29uc3QgVDEmIHQxLCBjb25zdCBUMiYgdDIpIHsgcmV0dXJuIHRydWU7IH0KLQotVEVTVChBbGxPZlRlc3QsIERvZXNOb3RDYWxsQWxsT2ZVbnF1YWxpZmllZCkgewotICBFWFBFQ1RfVEhBVCg0MiwgdGVzdGluZzo6QWxsT2YoCi0gICAgICBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCkpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gYm9vbAotQW55T2YoY29uc3QgVDEmIHQxLCBjb25zdCBUMiYgdDIpIHsgcmV0dXJuIHRydWU7IH0KLQotVEVTVChBbnlPZlRlc3QsIERvZXNOb3RDYWxsQW55T2ZVbnF1YWxpZmllZCkgewotICBFWFBFQ1RfVEhBVCg0MiwgdGVzdGluZzo6QW55T2YoCi0gICAgICBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCkpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFkbF90ZXN0Ci0KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2staW50ZXJuYWwtdXRpbHNfdGVzdC5jYyBiL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1pbnRlcm5hbC11dGlsc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAwZjBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1pbnRlcm5hbC11dGlsc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGludGVybmFsIHV0aWxpdGllcy4KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgotCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCi0vLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKLS8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCi0vLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KLS8vIGhpcyBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotI2lmIEdURVNUX09TX0NZR1dJTgotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8vIEZvciBzc2l6ZV90LiBOT0xJTlQKLSNlbmRpZgotCi1jbGFzcyBQcm90b2NvbE1lc3NhZ2U7Ci0KLW5hbWVzcGFjZSBwcm90bzIgewotY2xhc3MgTWVzc2FnZTsKLX0gIC8vIG5hbWVzcGFjZSBwcm90bzIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotbmFtZXNwYWNlIHsKLQotVEVTVChDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzVGVzdCwgV29ya3NXaGVuTmFtZUNvbnRhaW5zTm9Xb3JkKSB7Ci0gIEVYUEVDVF9FUSgiIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiIikpOwotICBFWFBFQ1RfRVEoIiIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl8iKSk7Ci0gIEVYUEVDVF9FUSgiIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiX18iKSk7Ci19Ci0KLVRFU1QoQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3Jkc1Rlc3QsIFdvcmtzV2hlbk5hbWVDb250YWluc0RpZ2l0cykgewotICBFWFBFQ1RfRVEoIjEiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfMSIpKTsKLSAgRVhQRUNUX0VRKCIyIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiMl8iKSk7Ci0gIEVYUEVDVF9FUSgiMzQiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfMzRfIikpOwotICBFWFBFQ1RfRVEoIjM0IDU2IiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiXzM0XzU2IikpOwotfQotCi1URVNUKENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHNUZXN0LCBXb3Jrc1doZW5OYW1lQ29udGFpbnNDYW1lbENhc2VXb3JkcykgewotICBFWFBFQ1RfRVEoImEgYmlnIHdvcmQiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJBQmlnV29yZCIpKTsKLSAgRVhQRUNUX0VRKCJmb28gYmFyIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiRm9vQmFyIikpOwotICBFWFBFQ1RfRVEoImZvbyIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIkZvb18iKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIGJhciIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl9Gb29fQmFyXyIpKTsKLSAgRVhQRUNUX0VRKCJmb28gYW5kIGJhciIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl9Gb29fX0FuZF9CYXIiKSk7Ci19Ci0KLVRFU1QoQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3Jkc1Rlc3QsIFdvcmtzV2hlbk5hbWVDb250YWluc19TZXBhcmF0ZWRXb3JkcykgewotICBFWFBFQ1RfRVEoImZvbyBiYXIiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJmb29fYmFyIikpOwotICBFWFBFQ1RfRVEoImZvbyIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl9mb29fIikpOwotICBFWFBFQ1RfRVEoImZvbyBiYXIiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfZm9vX2Jhcl8iKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIGFuZCBiYXIiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfZm9vX19hbmRfYmFyIikpOwotfQotCi1URVNUKENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHNUZXN0LCBXb3Jrc1doZW5OYW1lSXNNaXh0dXJlKSB7Ci0gIEVYUEVDVF9FUSgiZm9vIGJhciAxMjMiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJGb29fYmFyMTIzIikpOwotICBFWFBFQ1RfRVEoImNoYXB0ZXIgMTEgc2VjdGlvbiAxIiwKLSAgICAgICAgICAgIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl9DaGFwdGVyMTFTZWN0aW9uXzFfIikpOwotfQotCi1URVNUKFBvaW50ZWVPZlRlc3QsIFdvcmtzRm9yU21hcnRQb2ludGVycykgewotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyLAotICAgICAgUG9pbnRlZU9mPGludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IGNoYXI+ID46OnR5cGU+KCk7Ci0jaWYgR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFBvaW50ZWVPZjxzdGQ6OnVuaXF1ZV9wdHI8aW50PiA+Ojp0eXBlPigpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCi0jaWYgR1RFU1RfSEFTX1NURF9TSEFSRURfUFRSXwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxzdGQ6OnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlZU9mPHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnN0cmluZz4gPjo6dHlwZT4oKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9TSEFSRURfUFRSXwotfQotCi1URVNUKFBvaW50ZWVPZlRlc3QsIFdvcmtzRm9yUmF3UG9pbnRlcnMpIHsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBQb2ludGVlT2Y8aW50Kj46OnR5cGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXIsIFBvaW50ZWVPZjxjb25zdCBjaGFyKj46OnR5cGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFBvaW50ZWVPZjx2b2lkKj46OnR5cGU+KCk7Ci19Ci0KLVRFU1QoR2V0UmF3UG9pbnRlclRlc3QsIFdvcmtzRm9yU21hcnRQb2ludGVycykgewotI2lmIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KLSAgY29uc3QgY2hhciogY29uc3QgcmF3X3AxID0gbmV3IGNvbnN0IGNoYXIoJ2EnKTsgIC8vIE5PTElOVAotICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgY2hhcj4gcDEocmF3X3AxKTsKLSAgRVhQRUNUX0VRKHJhd19wMSwgR2V0UmF3UG9pbnRlcihwMSkpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCi0jaWYgR1RFU1RfSEFTX1NURF9TSEFSRURfUFRSXwotICBkb3VibGUqIGNvbnN0IHJhd19wMiA9IG5ldyBkb3VibGUoMi41KTsgIC8vIE5PTElOVAotICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZG91YmxlPiBwMihyYXdfcDIpOwotICBFWFBFQ1RfRVEocmF3X3AyLCBHZXRSYXdQb2ludGVyKHAyKSk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfU0hBUkVEX1BUUl8KLQotICBjb25zdCBjaGFyKiBjb25zdCByYXdfcDQgPSBuZXcgY29uc3QgY2hhcignYScpOyAgLy8gTk9MSU5UCi0gIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IGNoYXI+IHA0KHJhd19wNCk7Ci0gIEVYUEVDVF9FUShyYXdfcDQsIEdldFJhd1BvaW50ZXIocDQpKTsKLX0KLQotVEVTVChHZXRSYXdQb2ludGVyVGVzdCwgV29ya3NGb3JSYXdQb2ludGVycykgewotICBpbnQqIHAgPSBOVUxMOwotICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGFzIG5vIE5VTEwtdGVzdGluZyBtYWdpYyBvbiBTeW1iaWFuLgotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldFJhd1BvaW50ZXIocCkpOwotICBpbnQgbiA9IDE7Ci0gIEVYUEVDVF9FUSgmbiwgR2V0UmF3UG9pbnRlcigmbikpOwotfQotCi0vLyBUZXN0cyBLaW5kT2Y8VD4uCi0KLWNsYXNzIEJhc2Uge307Ci1jbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2Uge307Ci0KLVRFU1QoS2luZE9mVGVzdCwgQm9vbCkgewotICBFWFBFQ1RfRVEoa0Jvb2wsIEdNT0NLX0tJTkRfT0ZfKGJvb2wpKTsgIC8vIE5PTElOVAotfQotCi1URVNUKEtpbmRPZlRlc3QsIEludGVnZXIpIHsKLSAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyhjaGFyKSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyhzaWduZWQgY2hhcikpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8odW5zaWduZWQgY2hhcikpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8oc2hvcnQpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHVuc2lnbmVkIHNob3J0KSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyhpbnQpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHVuc2lnbmVkIGludCkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8obG9uZykpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8odW5zaWduZWQgbG9uZykpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8od2NoYXJfdCkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8oSW50NjQpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKFVJbnQ2NCkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8oc2l6ZV90KSk7ICAvLyBOT0xJTlQKLSNpZiBHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfQ1lHV0lOCi0gIC8vIHNzaXplX3QgaXMgbm90IGRlZmluZWQgb24gV2luZG93cyBhbmQgcG9zc2libHkgc29tZSBvdGhlciBPU2VzLgotICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHNzaXplX3QpKTsgIC8vIE5PTElOVAotI2VuZGlmCi19Ci0KLVRFU1QoS2luZE9mVGVzdCwgRmxvYXRpbmdQb2ludCkgewotICBFWFBFQ1RfRVEoa0Zsb2F0aW5nUG9pbnQsIEdNT0NLX0tJTkRfT0ZfKGZsb2F0KSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKGtGbG9hdGluZ1BvaW50LCBHTU9DS19LSU5EX09GXyhkb3VibGUpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoa0Zsb2F0aW5nUG9pbnQsIEdNT0NLX0tJTkRfT0ZfKGxvbmcgZG91YmxlKSk7ICAvLyBOT0xJTlQKLX0KLQotVEVTVChLaW5kT2ZUZXN0LCBPdGhlcikgewotICBFWFBFQ1RfRVEoa090aGVyLCBHTU9DS19LSU5EX09GXyh2b2lkKikpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrT3RoZXIsIEdNT0NLX0tJTkRfT0ZfKGNoYXIqKikpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUShrT3RoZXIsIEdNT0NLX0tJTkRfT0ZfKEJhc2UpKTsgIC8vIE5PTElOVAotfQotCi0vLyBUZXN0cyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxULCBVPi4KLQotVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEJvb2xUb0Jvb2wpIHsKLSAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGJvb2wsIGJvb2w+Ojp2YWx1ZSkpOwotfQotCi1URVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgQm9vbFRvSW50ZWdlcikgewotICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ym9vbCwgY2hhcj46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxib29sLCBpbnQ+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxib29sLCB1bnNpZ25lZCBsb25nPjo6dmFsdWUpKTsgIC8vIE5PTElOVAotfQotCi1URVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgQm9vbFRvRmxvYXRpbmdQb2ludCkgewotICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ym9vbCwgZmxvYXQ+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ym9vbCwgZG91YmxlPjo6dmFsdWUpKTsKLX0KLQotVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEludGVnZXJUb0Jvb2wpIHsKLSAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTx1bnNpZ25lZCBjaGFyLCBib29sPjo6dmFsdWUpKTsKLSAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxpbnQsIGJvb2w+Ojp2YWx1ZSkpOwotfQotCi1URVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgSW50ZWdlclRvSW50ZWdlcikgewotICAvLyBVbnNpZ25lZCA9PiBsYXJnZXIgc2lnbmVkIGlzIGZpbmUuCi0gIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTx1bnNpZ25lZCBjaGFyLCBpbnQ+Ojp2YWx1ZSkpOwotCi0gIC8vIFVuc2lnbmVkID0+IGxhcmdlciB1bnNpZ25lZCBpcyBmaW5lLgotICBFWFBFQ1RfVFJVRSgKLSAgICAgIChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTx1bnNpZ25lZCBzaG9ydCwgVUludDY0Pjo6dmFsdWUpKTsgLy8gTk9MSU5UCi0KLSAgLy8gU2lnbmVkID0+IHVuc2lnbmVkIGlzIG5vdCBmaW5lLgotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPHNob3J0LCBVSW50NjQ+Ojp2YWx1ZSkpOyAvLyBOT0xJTlQKLSAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTwKLSAgICAgIHNpZ25lZCBjaGFyLCB1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSkpOyAgLy8gTk9MSU5UCi0KLSAgLy8gU2FtZSBzaXplIGFuZCBzYW1lIHNpZ25lZG5lc3M6IGZpbmUgdG9vLgotICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ci0gICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyPjo6dmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGludCwgaW50Pjo6dmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPHdjaGFyX3QsIHdjaGFyX3Q+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ci0gICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nPjo6dmFsdWUpKTsgIC8vIE5PTElOVAotCi0gIC8vIFNhbWUgc2l6ZSwgZGlmZmVyZW50IHNpZ25lZG5lc3M6IG5vdCBmaW5lLgotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIsIHNpZ25lZCBjaGFyPjo6dmFsdWUpKTsKLSAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxpbnQsIHVuc2lnbmVkIGludD46OnZhbHVlKSk7Ci0gIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8VUludDY0LCBJbnQ2ND46OnZhbHVlKSk7Ci0KLSAgLy8gTGFyZ2VyIHNpemUgPT4gc21hbGxlciBzaXplIGlzIG5vdCBmaW5lLgotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGxvbmcsIGNoYXI+Ojp2YWx1ZSkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8aW50LCBzaWduZWQgY2hhcj46OnZhbHVlKSk7Ci0gIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8SW50NjQsIHVuc2lnbmVkIGludD46OnZhbHVlKSk7Ci19Ci0KLVRFU1QoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVUZXN0LCBJbnRlZ2VyVG9GbG9hdGluZ1BvaW50KSB7Ci0gIC8vIEludGVnZXJzIGNhbm5vdCBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0byBmbG9hdGluZy1wb2ludHMsIGFzCi0gIC8vIHRoZSBmb3JtYXQgb2YgdGhlIGxhdHRlciBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGNoYXIsIGZsb2F0Pjo6dmFsdWUpKTsKLSAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxpbnQsIGRvdWJsZT46OnZhbHVlKSk7Ci0gIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ci0gICAgICAgICAgICAgICAgc2hvcnQsIGxvbmcgZG91YmxlPjo6dmFsdWUpKTsgIC8vIE5PTElOVAotfQotCi1URVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgRmxvYXRpbmdQb2ludFRvQm9vbCkgewotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGZsb2F0LCBib29sPjo6dmFsdWUpKTsKLSAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxkb3VibGUsIGJvb2w+Ojp2YWx1ZSkpOwotfQotCi1URVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgRmxvYXRpbmdQb2ludFRvSW50ZWdlcikgewotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGZsb2F0LCBsb25nPjo6dmFsdWUpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGRvdWJsZSwgSW50NjQ+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGxvbmcgZG91YmxlLCBpbnQ+Ojp2YWx1ZSkpOwotfQotCi1URVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgRmxvYXRpbmdQb2ludFRvRmxvYXRpbmdQb2ludCkgewotICAvLyBTbWFsbGVyIHNpemUgPT4gbGFyZ2VyIHNpemUgaXMgZmluZS4KLSAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGZsb2F0LCBkb3VibGU+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8ZmxvYXQsIGxvbmcgZG91YmxlPjo6dmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGRvdWJsZSwgbG9uZyBkb3VibGU+Ojp2YWx1ZSkpOwotCi0gIC8vIFNhbWUgc2l6ZTogZmluZS4KLSAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGZsb2F0LCBmbG9hdD46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxkb3VibGUsIGRvdWJsZT46OnZhbHVlKSk7Ci0KLSAgLy8gTGFyZ2VyIHNpemUgPT4gc21hbGxlciBzaXplIGlzIG5vdCBmaW5lLgotICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGRvdWJsZSwgZmxvYXQ+Ojp2YWx1ZSkpOwotICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkKLSAgaWYgKHNpemVvZihkb3VibGUpID09IHNpemVvZihsb25nIGRvdWJsZSkpIHsgIC8vIE5PTElOVAotICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQotICAgIC8vIEluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIE1TVkMpLCBkb3VibGUgYW5kIGxvbmcgZG91YmxlCi0gICAgLy8gaGF2ZSB0aGUgc2FtZSBzaXplLgotICAgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxsb25nIGRvdWJsZSwgZG91YmxlPjo6dmFsdWUpKTsKLSAgfSBlbHNlIHsKLSAgICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGxvbmcgZG91YmxlLCBkb3VibGU+Ojp2YWx1ZSkpOwotICB9Ci19Ci0KLS8vIFRlc3RzIHRoZSBUdXBsZU1hdGNoZXMoKSB0ZW1wbGF0ZSBmdW5jdGlvbi4KLQotVEVTVChUdXBsZU1hdGNoZXNUZXN0LCBXb3Jrc0ZvclNpemUwKSB7Ci0gIHR1cGxlPD4gbWF0Y2hlcnM7Ci0gIHR1cGxlPD4gdmFsdWVzOwotCi0gIEVYUEVDVF9UUlVFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzKSk7Ci19Ci0KLVRFU1QoVHVwbGVNYXRjaGVzVGVzdCwgV29ya3NGb3JTaXplMSkgewotICB0dXBsZTxNYXRjaGVyPGludD4gPiBtYXRjaGVycyhFcSgxKSk7Ci0gIHR1cGxlPGludD4gdmFsdWVzMSgxKSwKLSAgICAgIHZhbHVlczIoMik7Ci0KLSAgRVhQRUNUX1RSVUUoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXMxKSk7Ci0gIEVYUEVDVF9GQUxTRShUdXBsZU1hdGNoZXMobWF0Y2hlcnMsIHZhbHVlczIpKTsKLX0KLQotVEVTVChUdXBsZU1hdGNoZXNUZXN0LCBXb3Jrc0ZvclNpemUyKSB7Ci0gIHR1cGxlPE1hdGNoZXI8aW50PiwgTWF0Y2hlcjxjaGFyPiA+IG1hdGNoZXJzKEVxKDEpLCBFcSgnYScpKTsKLSAgdHVwbGU8aW50LCBjaGFyPiB2YWx1ZXMxKDEsICdhJyksCi0gICAgICB2YWx1ZXMyKDEsICdiJyksCi0gICAgICB2YWx1ZXMzKDIsICdhJyksCi0gICAgICB2YWx1ZXM0KDIsICdiJyk7Ci0KLSAgRVhQRUNUX1RSVUUoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXMxKSk7Ci0gIEVYUEVDVF9GQUxTRShUdXBsZU1hdGNoZXMobWF0Y2hlcnMsIHZhbHVlczIpKTsKLSAgRVhQRUNUX0ZBTFNFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzMykpOwotICBFWFBFQ1RfRkFMU0UoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXM0KSk7Ci19Ci0KLVRFU1QoVHVwbGVNYXRjaGVzVGVzdCwgV29ya3NGb3JTaXplNSkgewotICB0dXBsZTxNYXRjaGVyPGludD4sIE1hdGNoZXI8Y2hhcj4sIE1hdGNoZXI8Ym9vbD4sIE1hdGNoZXI8bG9uZz4sICAvLyBOT0xJTlQKLSAgICAgIE1hdGNoZXI8c3RyaW5nPiA+Ci0gICAgICBtYXRjaGVycyhFcSgxKSwgRXEoJ2EnKSwgRXEodHJ1ZSksIEVxKDJMKSwgRXEoImhpIikpOwotICB0dXBsZTxpbnQsIGNoYXIsIGJvb2wsIGxvbmcsIHN0cmluZz4gIC8vIE5PTElOVAotICAgICAgdmFsdWVzMSgxLCAnYScsIHRydWUsIDJMLCAiaGkiKSwKLSAgICAgIHZhbHVlczIoMSwgJ2EnLCB0cnVlLCAyTCwgImhlbGxvIiksCi0gICAgICB2YWx1ZXMzKDIsICdhJywgdHJ1ZSwgMkwsICJoaSIpOwotCi0gIEVYUEVDVF9UUlVFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzMSkpOwotICBFWFBFQ1RfRkFMU0UoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXMyKSk7Ci0gIEVYUEVDVF9GQUxTRShUdXBsZU1hdGNoZXMobWF0Y2hlcnMsIHZhbHVlczMpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBc3NlcnQodHJ1ZSwgLi4uKSBzdWNjZWVkcy4KLVRFU1QoQXNzZXJ0VGVzdCwgU3VjY2VlZHNPblRydWUpIHsKLSAgQXNzZXJ0KHRydWUsIF9fRklMRV9fLCBfX0xJTkVfXywgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIik7Ci0gIEFzc2VydCh0cnVlLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgLy8gVGhpcyBzaG91bGQgc3VjY2VlZCB0b28uCi19Ci0KLS8vIFRlc3RzIHRoYXQgQXNzZXJ0KGZhbHNlLCAuLi4pIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUuCi1URVNUKEFzc2VydFRlc3QsIEZhaWxzRmF0YWxseU9uRmFsc2UpIHsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7Ci0gICAgQXNzZXJ0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18sICJUaGlzIHNob3VsZCBmYWlsLiIpOwotICB9LCAiIik7Ci0KLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7Ci0gICAgQXNzZXJ0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRXhwZWN0KHRydWUsIC4uLikgc3VjY2VlZHMuCi1URVNUKEV4cGVjdFRlc3QsIFN1Y2NlZWRzT25UcnVlKSB7Ci0gIEV4cGVjdCh0cnVlLCBfX0ZJTEVfXywgX19MSU5FX18sICJUaGlzIHNob3VsZCBzdWNjZWVkLiIpOwotICBFeHBlY3QodHJ1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgIC8vIFRoaXMgc2hvdWxkIHN1Y2NlZWQgdG9vLgotfQotCi0vLyBUZXN0cyB0aGF0IEV4cGVjdChmYWxzZSwgLi4uKSBnZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZS4KLVRFU1QoRXhwZWN0VGVzdCwgRmFpbHNOb25mYXRhbGx5T25GYWxzZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFeHBlY3QoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgIlRoaXMgc2hvdWxkIGZhaWwuIik7Ci0gIH0sICJUaGlzIHNob3VsZCBmYWlsIik7Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRXhwZWN0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICB9LCAiRXhwZWN0YXRpb24gZmFpbGVkIik7Ci19Ci0KLS8vIFRlc3RzIExvZ0lzVmlzaWJsZSgpLgotCi1jbGFzcyBMb2dJc1Zpc2libGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgb3JpZ2luYWxfdmVyYm9zZV8gPSBHTU9DS19GTEFHKHZlcmJvc2UpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyBHTU9DS19GTEFHKHZlcmJvc2UpID0gb3JpZ2luYWxfdmVyYm9zZV87IH0KLQotICBzdHJpbmcgb3JpZ2luYWxfdmVyYm9zZV87Ci19OwotCi1URVNUX0YoTG9nSXNWaXNpYmxlVGVzdCwgQWx3YXlzUmV0dXJuc1RydWVJZlZlcmJvc2l0eUlzSW5mbykgewotICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0luZm9WZXJib3NpdHk7Ci0gIEVYUEVDVF9UUlVFKExvZ0lzVmlzaWJsZShrSW5mbykpOwotICBFWFBFQ1RfVFJVRShMb2dJc1Zpc2libGUoa1dhcm5pbmcpKTsKLX0KLQotVEVTVF9GKExvZ0lzVmlzaWJsZVRlc3QsIEFsd2F5c1JldHVybnNGYWxzZUlmVmVyYm9zaXR5SXNFcnJvcikgewotICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0Vycm9yVmVyYm9zaXR5OwotICBFWFBFQ1RfRkFMU0UoTG9nSXNWaXNpYmxlKGtJbmZvKSk7Ci0gIEVYUEVDVF9GQUxTRShMb2dJc1Zpc2libGUoa1dhcm5pbmcpKTsKLX0KLQotVEVTVF9GKExvZ0lzVmlzaWJsZVRlc3QsIFdvcmtzV2hlblZlcmJvc2l0eUlzV2FybmluZykgewotICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga1dhcm5pbmdWZXJib3NpdHk7Ci0gIEVYUEVDVF9GQUxTRShMb2dJc1Zpc2libGUoa0luZm8pKTsKLSAgRVhQRUNUX1RSVUUoTG9nSXNWaXNpYmxlKGtXYXJuaW5nKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIFRlc3RzIHRoZSBMb2coKSBmdW5jdGlvbi4KLQotLy8gVmVyaWZpZXMgdGhhdCBMb2coKSBiZWhhdmVzIGNvcnJlY3RseSBmb3IgdGhlIGdpdmVuIHZlcmJvc2l0eSBsZXZlbAotLy8gYW5kIGxvZyBzZXZlcml0eS4KLXZvaWQgVGVzdExvZ1dpdGhTZXZlcml0eShjb25zdCBzdHJpbmcmIHZlcmJvc2l0eSwgTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRfcHJpbnQpIHsKLSAgY29uc3Qgc3RyaW5nIG9sZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHZlcmJvc2l0eTsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBMb2coc2V2ZXJpdHksICJUZXN0IGxvZy5cbiIsIDApOwotICBpZiAoc2hvdWxkX3ByaW50KSB7Ci0gICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRvdXQoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgIENvbnRhaW5zUmVnZXgoCi0gICAgICAgICAgICAgICAgICAgIHNldmVyaXR5ID09IGtXYXJuaW5nID8KLSAgICAgICAgICAgICAgICAgICAgIl5cbkdNT0NLIFdBUk5JTkc6XG5UZXN0IGxvZ1xcLlxuU3RhY2sgdHJhY2U6XG4iIDoKLSAgICAgICAgICAgICAgICAgICAgIl5cblRlc3QgbG9nXFwuXG5TdGFjayB0cmFjZTpcbiIpKTsKLSAgfSBlbHNlIHsKLSAgICBFWFBFQ1RfU1RSRVEoIiIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7Ci0gIH0KLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IG9sZF9mbGFnOwotfQotCi0vLyBUZXN0cyB0aGF0IHdoZW4gdGhlIHN0YWNrX2ZyYW1lc190b19za2lwIHBhcmFtZXRlciBpcyBuZWdhdGl2ZSwKLS8vIExvZygpIGRvZXNuJ3QgaW5jbHVkZSB0aGUgc3RhY2sgdHJhY2UgaW4gdGhlIG91dHB1dC4KLVRFU1QoTG9nVGVzdCwgTm9TdGFja1RyYWNlV2hlblN0YWNrRnJhbWVzVG9Ta2lwSXNOZWdhdGl2ZSkgewotICBjb25zdCBzdHJpbmcgc2F2ZWRfZmxhZyA9IEdNT0NLX0ZMQUcodmVyYm9zZSk7Ci0gIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBrSW5mb1ZlcmJvc2l0eTsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBMb2coa0luZm8sICJUZXN0IGxvZy5cbiIsIC0xKTsKLSAgRVhQRUNUX1NUUkVRKCJcblRlc3QgbG9nLlxuIiwgR2V0Q2FwdHVyZWRTdGRvdXQoKS5jX3N0cigpKTsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX2ZsYWc7Ci19Ci0KLXN0cnVjdCBNb2NrU3RhY2tUcmFjZUdldHRlciA6IHRlc3Rpbmc6OmludGVybmFsOjpPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgewotICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkgewotICAgIHJldHVybiAodGVzdGluZzo6TWVzc2FnZSgpIDw8IG1heF9kZXB0aCA8PCAiOjoiIDw8IHNraXBfY291bnQgPDwgIlxuIikKLSAgICAgICAgLkdldFN0cmluZygpOwotICB9Ci0gIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCkge30KLX07Ci0KLS8vIFRlc3RzIHRoYXQgaW4gb3B0IG1vZGUsIGEgcG9zaXRpdmUgc3RhY2tfZnJhbWVzX3RvX3NraXAgYXJndW1lbnQgaXMKLS8vIHRyZWF0ZWQgYXMgMC4KLVRFU1QoTG9nVGVzdCwgTm9Ta2lwcGluZ1N0YWNrRnJhbWVJbk9wdE1vZGUpIHsKLSAgTW9ja1N0YWNrVHJhY2VHZXR0ZXIqIG1vY2tfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyID0gbmV3IE1vY2tTdGFja1RyYWNlR2V0dGVyOwotICBHZXRVbml0VGVzdEltcGwoKS0+c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcihtb2NrX29zX3N0YWNrX3RyYWNlX2dldHRlcik7Ci0KLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBMb2coa1dhcm5pbmcsICJUZXN0IGxvZy5cbiIsIDEwMCk7Ci0gIGNvbnN0IHN0cmluZyBsb2cgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOwotCi0gIHN0cmluZyBleHBlY3RlZF90cmFjZSA9Ci0gICAgICAodGVzdGluZzo6TWVzc2FnZSgpIDw8IEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpIDw8ICI6OiIpLkdldFN0cmluZygpOwotICBzdHJpbmcgZXhwZWN0ZWRfbWVzc2FnZSA9Ci0gICAgICAiXG5HTU9DSyBXQVJOSU5HOlxuIgotICAgICAgIlRlc3QgbG9nLlxuIgotICAgICAgIlN0YWNrIHRyYWNlOlxuIiArCi0gICAgICBleHBlY3RlZF90cmFjZTsKLSAgRVhQRUNUX1RIQVQobG9nLCBIYXNTdWJzdHIoZXhwZWN0ZWRfbWVzc2FnZSkpOwotICBpbnQgc2tpcF9jb3VudCA9IGF0b2kobG9nLnN1YnN0cihleHBlY3RlZF9tZXNzYWdlLnNpemUoKSkuY19zdHIoKSk7Ci0KLSMgaWYgZGVmaW5lZChOREVCVUcpCi0gIC8vIEluIG9wdCBtb2RlLCBubyBzdGFjayBmcmFtZSBzaG91bGQgYmUgc2tpcHBlZC4KLSAgY29uc3QgaW50IGV4cGVjdGVkX3NraXBfY291bnQgPSAwOwotIyBlbHNlCi0gIC8vIEluIGRiZyBtb2RlLCB0aGUgc3RhY2sgZnJhbWVzIHNob3VsZCBiZSBza2lwcGVkLgotICBjb25zdCBpbnQgZXhwZWN0ZWRfc2tpcF9jb3VudCA9IDEwMDsKLSMgZW5kaWYKLQotICAvLyBOb3RlIHRoYXQgZWFjaCBpbm5lciBpbXBsZW1lbnRhdGlvbiBsYXllciB3aWxsICsxIHRoZSBudW1iZXIgdG8gcmVtb3ZlCi0gIC8vIGl0c2VsZiBmcm9tIHRoZSB0cmFjZS4gVGhpcyBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcyBhIGxpdHRsZSBoaWdoZXIgdGhhbgotICAvLyBleHBlY3RlZCwgYnV0IGNsb3NlIGVub3VnaC4KLSAgRVhQRUNUX1RIQVQoc2tpcF9jb3VudCwKLSAgICAgICAgICAgICAgQWxsT2YoR2UoZXhwZWN0ZWRfc2tpcF9jb3VudCksIExlKGV4cGVjdGVkX3NraXBfY291bnQgKyAxMCkpKTsKLQotICAvLyBSZXN0b3JlcyB0aGUgZGVmYXVsdCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCi0gIEdldFVuaXRUZXN0SW1wbCgpLT5zZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFsbCBsb2dzIGFyZSBwcmludGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZQotLy8gLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgImluZm8iLgotVEVTVChMb2dUZXN0LCBBbGxMb2dzQXJlUHJpbnRlZFdoZW5WZXJib3NpdHlJc0luZm8pIHsKLSAgVGVzdExvZ1dpdGhTZXZlcml0eShrSW5mb1ZlcmJvc2l0eSwga0luZm8sIHRydWUpOwotICBUZXN0TG9nV2l0aFNldmVyaXR5KGtJbmZvVmVyYm9zaXR5LCBrV2FybmluZywgdHJ1ZSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgb25seSB3YXJuaW5ncyBhcmUgcHJpbnRlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUKLS8vIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGlzICJ3YXJuaW5nIi4KLVRFU1QoTG9nVGVzdCwgT25seVdhcm5pbmdzQXJlUHJpbnRlZFdoZW5WZXJib3NpdHlJc1dhcm5pbmcpIHsKLSAgVGVzdExvZ1dpdGhTZXZlcml0eShrV2FybmluZ1ZlcmJvc2l0eSwga0luZm8sIGZhbHNlKTsKLSAgVGVzdExvZ1dpdGhTZXZlcml0eShrV2FybmluZ1ZlcmJvc2l0eSwga1dhcm5pbmcsIHRydWUpOwotfQotCi0vLyBUZXN0cyB0aGF0IG5vIGxvZ3MgYXJlIHByaW50ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlCi0vLyAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBpcyAiZXJyb3IiLgotVEVTVChMb2dUZXN0LCBOb0xvZ3NBcmVQcmludGVkV2hlblZlcmJvc2l0eUlzRXJyb3IpIHsKLSAgVGVzdExvZ1dpdGhTZXZlcml0eShrRXJyb3JWZXJib3NpdHksIGtJbmZvLCBmYWxzZSk7Ci0gIFRlc3RMb2dXaXRoU2V2ZXJpdHkoa0Vycm9yVmVyYm9zaXR5LCBrV2FybmluZywgZmFsc2UpOwotfQotCi0vLyBUZXN0cyB0aGF0IG9ubHkgd2FybmluZ3MgYXJlIHByaW50ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlCi0vLyAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBpcyBpbnZhbGlkLgotVEVTVChMb2dUZXN0LCBPbmx5V2FybmluZ3NBcmVQcmludGVkV2hlblZlcmJvc2l0eUlzSW52YWxpZCkgewotICBUZXN0TG9nV2l0aFNldmVyaXR5KCJpbnZhbGlkIiwga0luZm8sIGZhbHNlKTsKLSAgVGVzdExvZ1dpdGhTZXZlcml0eSgiaW52YWxpZCIsIGtXYXJuaW5nLCB0cnVlKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLVRFU1QoVHlwZVRyYWl0c1Rlc3QsIHRydWVfdHlwZSkgewotICBFWFBFQ1RfVFJVRSh0cnVlX3R5cGU6OnZhbHVlKTsKLX0KLQotVEVTVChUeXBlVHJhaXRzVGVzdCwgZmFsc2VfdHlwZSkgewotICBFWFBFQ1RfRkFMU0UoZmFsc2VfdHlwZTo6dmFsdWUpOwotfQotCi1URVNUKFR5cGVUcmFpdHNUZXN0LCBpc19yZWZlcmVuY2UpIHsKLSAgRVhQRUNUX0ZBTFNFKGlzX3JlZmVyZW5jZTxpbnQ+Ojp2YWx1ZSk7Ci0gIEVYUEVDVF9GQUxTRShpc19yZWZlcmVuY2U8Y2hhcio+Ojp2YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKGlzX3JlZmVyZW5jZTxjb25zdCBpbnQmPjo6dmFsdWUpOwotfQotCi1URVNUKFR5cGVUcmFpdHNUZXN0LCBpc19wb2ludGVyKSB7Ci0gIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPGludD46OnZhbHVlKTsKLSAgRVhQRUNUX0ZBTFNFKGlzX3BvaW50ZXI8Y2hhciY+Ojp2YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKGlzX3BvaW50ZXI8Y29uc3QgaW50Kj46OnZhbHVlKTsKLX0KLQotVEVTVChUeXBlVHJhaXRzVGVzdCwgdHlwZV9lcXVhbHMpIHsKLSAgRVhQRUNUX0ZBTFNFKCh0eXBlX2VxdWFsczxpbnQsIGNvbnN0IGludD46OnZhbHVlKSk7Ci0gIEVYUEVDVF9GQUxTRSgodHlwZV9lcXVhbHM8aW50LCBpbnQmPjo6dmFsdWUpKTsKLSAgRVhQRUNUX0ZBTFNFKCh0eXBlX2VxdWFsczxpbnQsIGRvdWJsZT46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKCh0eXBlX2VxdWFsczxjaGFyLCBjaGFyPjo6dmFsdWUpKTsKLX0KLQotVEVTVChUeXBlVHJhaXRzVGVzdCwgcmVtb3ZlX3JlZmVyZW5jZSkgewotICBFWFBFQ1RfVFJVRSgodHlwZV9lcXVhbHM8Y2hhciwgcmVtb3ZlX3JlZmVyZW5jZTxjaGFyJj46OnR5cGU+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRSgodHlwZV9lcXVhbHM8Y29uc3QgaW50LAotICAgICAgICAgICAgICAgcmVtb3ZlX3JlZmVyZW5jZTxjb25zdCBpbnQmPjo6dHlwZT46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKCh0eXBlX2VxdWFsczxpbnQsIHJlbW92ZV9yZWZlcmVuY2U8aW50Pjo6dHlwZT46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKCh0eXBlX2VxdWFsczxkb3VibGUqLCByZW1vdmVfcmVmZXJlbmNlPGRvdWJsZSo+Ojp0eXBlPjo6dmFsdWUpKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotLy8gVmVyaWZpZXMgdGhhdCBMb2coKSBiZWhhdmVzIGNvcnJlY3RseSBmb3IgdGhlIGdpdmVuIHZlcmJvc2l0eSBsZXZlbAotLy8gYW5kIGxvZyBzZXZlcml0eS4KLXN0ZDo6c3RyaW5nIEdyYWJPdXRwdXQodm9pZCgqbG9nZ2VyKSgpLCBjb25zdCBjaGFyKiB2ZXJib3NpdHkpIHsKLSAgY29uc3Qgc3RyaW5nIHNhdmVkX2ZsYWcgPSBHTU9DS19GTEFHKHZlcmJvc2UpOwotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gdmVyYm9zaXR5OwotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIGxvZ2dlcigpOwotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gc2F2ZWRfZmxhZzsKLSAgcmV0dXJuIEdldENhcHR1cmVkU3Rkb3V0KCk7Ci19Ci0KLWNsYXNzIER1bW15TW9jayB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDAoVGVzdE1ldGhvZCwgdm9pZCgpKTsKLSAgTU9DS19NRVRIT0QxKFRlc3RNZXRob2RBcmcsIHZvaWQoaW50IGR1bW15KSk7Ci19OwotCi12b2lkIEV4cGVjdENhbGxMb2dnZXIoKSB7Ci0gIER1bW15TW9jayBtb2NrOwotICBFWFBFQ1RfQ0FMTChtb2NrLCBUZXN0TWV0aG9kKCkpOwotICBtb2NrLlRlc3RNZXRob2QoKTsKLX07Ci0KLS8vIFZlcmlmaWVzIHRoYXQgRVhQRUNUX0NBTEwgbG9ncyBpZiB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgc2V0IHRvICJpbmZvIi4KLVRFU1QoRXhwZWN0Q2FsbFRlc3QsIExvZ3NXaGVuVmVyYm9zaXR5SXNJbmZvKSB7Ci0gIEVYUEVDVF9USEFUKHN0ZDo6c3RyaW5nKEdyYWJPdXRwdXQoRXhwZWN0Q2FsbExvZ2dlciwga0luZm9WZXJib3NpdHkpKSwKLSAgICAgICAgICAgICAgSGFzU3Vic3RyKCJFWFBFQ1RfQ0FMTChtb2NrLCBUZXN0TWV0aG9kKCkpIikpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IEVYUEVDVF9DQUxMIGRvZXNuJ3QgbG9nCi0vLyBpZiB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgc2V0IHRvICJ3YXJuaW5nIi4KLVRFU1QoRXhwZWN0Q2FsbFRlc3QsIERvZXNOb3RMb2dXaGVuVmVyYm9zaXR5SXNXYXJuaW5nKSB7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgR3JhYk91dHB1dChFeHBlY3RDYWxsTG9nZ2VyLCBrV2FybmluZ1ZlcmJvc2l0eSkuY19zdHIoKSk7Ci19Ci0KLS8vIFZlcmlmaWVzIHRoYXQgRVhQRUNUX0NBTEwgZG9lc24ndCBsb2cKLS8vIGlmIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gImVycm9yIi4KLVRFU1QoRXhwZWN0Q2FsbFRlc3QsICBEb2VzTm90TG9nV2hlblZlcmJvc2l0eUlzRXJyb3IpIHsKLSAgRVhQRUNUX1NUUkVRKCIiLCBHcmFiT3V0cHV0KEV4cGVjdENhbGxMb2dnZXIsIGtFcnJvclZlcmJvc2l0eSkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgT25DYWxsTG9nZ2VyKCkgewotICBEdW1teU1vY2sgbW9jazsKLSAgT05fQ0FMTChtb2NrLCBUZXN0TWV0aG9kKCkpOwotfTsKLQotLy8gVmVyaWZpZXMgdGhhdCBPTl9DQUxMIGxvZ3MgaWYgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGlzIHNldCB0byAiaW5mbyIuCi1URVNUKE9uQ2FsbFRlc3QsIExvZ3NXaGVuVmVyYm9zaXR5SXNJbmZvKSB7Ci0gIEVYUEVDVF9USEFUKHN0ZDo6c3RyaW5nKEdyYWJPdXRwdXQoT25DYWxsTG9nZ2VyLCBrSW5mb1ZlcmJvc2l0eSkpLAotICAgICAgICAgICAgICBIYXNTdWJzdHIoIk9OX0NBTEwobW9jaywgVGVzdE1ldGhvZCgpKSIpKTsKLX0KLQotLy8gVmVyaWZpZXMgdGhhdCBPTl9DQUxMIGRvZXNuJ3QgbG9nCi0vLyBpZiB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgc2V0IHRvICJ3YXJuaW5nIi4KLVRFU1QoT25DYWxsVGVzdCwgRG9lc05vdExvZ1doZW5WZXJib3NpdHlJc1dhcm5pbmcpIHsKLSAgRVhQRUNUX1NUUkVRKCIiLCBHcmFiT3V0cHV0KE9uQ2FsbExvZ2dlciwga1dhcm5pbmdWZXJib3NpdHkpLmNfc3RyKCkpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IE9OX0NBTEwgZG9lc24ndCBsb2cgaWYKLS8vIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gImVycm9yIi4KLVRFU1QoT25DYWxsVGVzdCwgRG9lc05vdExvZ1doZW5WZXJib3NpdHlJc0Vycm9yKSB7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgR3JhYk91dHB1dChPbkNhbGxMb2dnZXIsIGtFcnJvclZlcmJvc2l0eSkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgT25DYWxsQW55QXJndW1lbnRMb2dnZXIoKSB7Ci0gIER1bW15TW9jayBtb2NrOwotICBPTl9DQUxMKG1vY2ssIFRlc3RNZXRob2RBcmcoXykpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IE9OX0NBTEwgcHJpbnRzIHByb3ZpZGVkIF8gYXJndW1lbnQuCi1URVNUKE9uQ2FsbFRlc3QsIExvZ3NBbnl0aGluZ0FyZ3VtZW50KSB7Ci0gIEVYUEVDVF9USEFUKHN0ZDo6c3RyaW5nKEdyYWJPdXRwdXQoT25DYWxsQW55QXJndW1lbnRMb2dnZXIsIGtJbmZvVmVyYm9zaXR5KSksCi0gICAgICAgICAgICAgIEhhc1N1YnN0cigiT05fQ0FMTChtb2NrLCBUZXN0TWV0aG9kQXJnKF8pIikpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotLy8gVGVzdHMgU3RsQ29udGFpbmVyVmlldy4KLQotVEVTVChTdGxDb250YWluZXJWaWV3VGVzdCwgV29ya3NGb3JTdGxDb250YWluZXIpIHsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPHN0ZDo6dmVjdG9yPGludD4sCi0gICAgICBTdGxDb250YWluZXJWaWV3PHN0ZDo6dmVjdG9yPGludD4gPjo6dHlwZT4oKTsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mLAotICAgICAgU3RsQ29udGFpbmVyVmlldzxzdGQ6OnZlY3Rvcjxkb3VibGU+ID46OmNvbnN0X3JlZmVyZW5jZT4oKTsKLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNoYXI+IENoYXJzOwotICBDaGFycyB2MTsKLSAgY29uc3QgQ2hhcnMmIHYyKFN0bENvbnRhaW5lclZpZXc8Q2hhcnM+OjpDb25zdFJlZmVyZW5jZSh2MSkpOwotICBFWFBFQ1RfRVEoJnYxLCAmdjIpOwotCi0gIHYxLnB1c2hfYmFjaygnYScpOwotICBDaGFycyB2MyA9IFN0bENvbnRhaW5lclZpZXc8Q2hhcnM+OjpDb3B5KHYxKTsKLSAgRVhQRUNUX1RIQVQodjMsIEVxKHYzKSk7Ci19Ci0KLVRFU1QoU3RsQ29udGFpbmVyVmlld1Rlc3QsIFdvcmtzRm9yU3RhdGljTmF0aXZlQXJyYXkpIHsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPE5hdGl2ZUFycmF5PGludD4sCi0gICAgICBTdGxDb250YWluZXJWaWV3PGludFszXT46OnR5cGU+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxOYXRpdmVBcnJheTxkb3VibGU+LAotICAgICAgU3RsQ29udGFpbmVyVmlldzxjb25zdCBkb3VibGVbNF0+Ojp0eXBlPigpOwotICBTdGF0aWNBc3NlcnRUeXBlRXE8TmF0aXZlQXJyYXk8Y2hhclszXT4sCi0gICAgICBTdGxDb250YWluZXJWaWV3PGNvbnN0IGNoYXJbMl1bM10+Ojp0eXBlPigpOwotCi0gIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBOYXRpdmVBcnJheTxpbnQ+LAotICAgICAgU3RsQ29udGFpbmVyVmlldzxpbnRbMl0+Ojpjb25zdF9yZWZlcmVuY2U+KCk7Ci0KLSAgaW50IGExWzNdID0geyAwLCAxLCAyIH07Ci0gIE5hdGl2ZUFycmF5PGludD4gYTIgPSBTdGxDb250YWluZXJWaWV3PGludFszXT46OkNvbnN0UmVmZXJlbmNlKGExKTsKLSAgRVhQRUNUX0VRKDNVLCBhMi5zaXplKCkpOwotICBFWFBFQ1RfRVEoYTEsIGEyLmJlZ2luKCkpOwotCi0gIGNvbnN0IE5hdGl2ZUFycmF5PGludD4gYTMgPSBTdGxDb250YWluZXJWaWV3PGludFszXT46OkNvcHkoYTEpOwotICBBU1NFUlRfRVEoM1UsIGEzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBhMy5iZWdpbigpWzBdKTsKLSAgRVhQRUNUX0VRKDEsIGEzLmJlZ2luKClbMV0pOwotICBFWFBFQ1RfRVEoMiwgYTMuYmVnaW4oKVsyXSk7Ci0KLSAgLy8gTWFrZXMgc3VyZSBhMSBhbmQgYTMgYXJlbid0IGFsaWFzZXMuCi0gIGExWzBdID0gMzsKLSAgRVhQRUNUX0VRKDAsIGEzLmJlZ2luKClbMF0pOwotfQotCi1URVNUKFN0bENvbnRhaW5lclZpZXdUZXN0LCBXb3Jrc0ZvckR5bmFtaWNOYXRpdmVBcnJheSkgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8TmF0aXZlQXJyYXk8aW50PiwKLSAgICAgIFN0bENvbnRhaW5lclZpZXc8dHVwbGU8Y29uc3QgaW50Kiwgc2l6ZV90PiA+Ojp0eXBlPigpOwotICBTdGF0aWNBc3NlcnRUeXBlRXE8TmF0aXZlQXJyYXk8ZG91YmxlPiwKLSAgICAgIFN0bENvbnRhaW5lclZpZXc8dHVwbGU8bGlua2VkX3B0cjxkb3VibGU+LCBpbnQ+ID46OnR5cGU+KCk7Ci0KLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IE5hdGl2ZUFycmF5PGludD4sCi0gICAgICBTdGxDb250YWluZXJWaWV3PHR1cGxlPGNvbnN0IGludCosIGludD4gPjo6Y29uc3RfcmVmZXJlbmNlPigpOwotCi0gIGludCBhMVszXSA9IHsgMCwgMSwgMiB9OwotICBjb25zdCBpbnQqIGNvbnN0IHAxID0gYTE7Ci0gIE5hdGl2ZUFycmF5PGludD4gYTIgPSBTdGxDb250YWluZXJWaWV3PHR1cGxlPGNvbnN0IGludCosIGludD4gPjo6Ci0gICAgICBDb25zdFJlZmVyZW5jZShtYWtlX3R1cGxlKHAxLCAzKSk7Ci0gIEVYUEVDVF9FUSgzVSwgYTIuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGExLCBhMi5iZWdpbigpKTsKLQotICBjb25zdCBOYXRpdmVBcnJheTxpbnQ+IGEzID0gU3RsQ29udGFpbmVyVmlldzx0dXBsZTxpbnQqLCBzaXplX3Q+ID46OgotICAgICAgQ29weShtYWtlX3R1cGxlKHN0YXRpY19jYXN0PGludCo+KGExKSwgMykpOwotICBBU1NFUlRfRVEoM1UsIGEzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBhMy5iZWdpbigpWzBdKTsKLSAgRVhQRUNUX0VRKDEsIGEzLmJlZ2luKClbMV0pOwotICBFWFBFQ1RfRVEoMiwgYTMuYmVnaW4oKVsyXSk7Ci0KLSAgLy8gTWFrZXMgc3VyZSBhMSBhbmQgYTMgYXJlbid0IGFsaWFzZXMuCi0gIGExWzBdID0gMzsKLSAgRVhQRUNUX0VRKDAsIGEzLmJlZ2luKClbMF0pOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1tYXRjaGVyc190ZXN0LmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLW1hdGNoZXJzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWFjYmEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLW1hdGNoZXJzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgc29tZSBjb21tb25seSB1c2VkIGFyZ3VtZW50IG1hdGNoZXJzLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotI2lmIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXwotIyBpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1HVEVTVF9BUElfIHN0cmluZyBKb2luQXNUdXBsZShjb25zdCBTdHJpbmdzJiBmaWVsZHMpOwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLW5hbWVzcGFjZSBnbW9ja19tYXRjaGVyc190ZXN0IHsKLQotdXNpbmcgc3RkOjpncmVhdGVyOwotdXNpbmcgc3RkOjpsZXNzOwotdXNpbmcgc3RkOjpsaXN0OwotdXNpbmcgc3RkOjptYWtlX3BhaXI7Ci11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6bXVsdGltYXA7Ci11c2luZyBzdGQ6Om11bHRpc2V0OwotdXNpbmcgc3RkOjpvc3RyZWFtOwotdXNpbmcgc3RkOjpwYWlyOwotdXNpbmcgc3RkOjpzZXQ7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotdXNpbmcgdGVzdGluZzo6QTsKLXVzaW5nIHRlc3Rpbmc6OkFsbEFyZ3M7Ci11c2luZyB0ZXN0aW5nOjpBbGxPZjsKLXVzaW5nIHRlc3Rpbmc6OkFuOwotdXNpbmcgdGVzdGluZzo6QW55T2Y7Ci11c2luZyB0ZXN0aW5nOjpCeVJlZjsKLXVzaW5nIHRlc3Rpbmc6OkNvbnRhaW5zUmVnZXg7Ci11c2luZyB0ZXN0aW5nOjpEb3VibGVFcTsKLXVzaW5nIHRlc3Rpbmc6OkRvdWJsZU5lYXI7Ci11c2luZyB0ZXN0aW5nOjpFbmRzV2l0aDsKLXVzaW5nIHRlc3Rpbmc6OkVxOwotdXNpbmcgdGVzdGluZzo6RXhwbGFpbk1hdGNoUmVzdWx0OwotdXNpbmcgdGVzdGluZzo6RmllbGQ7Ci11c2luZyB0ZXN0aW5nOjpGbG9hdEVxOwotdXNpbmcgdGVzdGluZzo6RmxvYXROZWFyOwotdXNpbmcgdGVzdGluZzo6R2U7Ci11c2luZyB0ZXN0aW5nOjpHdDsKLXVzaW5nIHRlc3Rpbmc6Okhhc1N1YnN0cjsKLXVzaW5nIHRlc3Rpbmc6OklzRW1wdHk7Ci11c2luZyB0ZXN0aW5nOjpJc051bGw7Ci11c2luZyB0ZXN0aW5nOjpLZXk7Ci11c2luZyB0ZXN0aW5nOjpMZTsKLXVzaW5nIHRlc3Rpbmc6Okx0OwotdXNpbmcgdGVzdGluZzo6TWFrZU1hdGNoZXI7Ci11c2luZyB0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNNYXRjaGVyOwotdXNpbmcgdGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKLXVzaW5nIHRlc3Rpbmc6Ok1hdGNoZXI7Ci11c2luZyB0ZXN0aW5nOjpNYXRjaGVyQ2FzdDsKLXVzaW5nIHRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Ci11c2luZyB0ZXN0aW5nOjpNYXRjaGVzOwotdXNpbmcgdGVzdGluZzo6TWF0Y2hlc1JlZ2V4OwotdXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRG91YmxlRXE7Ci11c2luZyB0ZXN0aW5nOjpOYW5TZW5zaXRpdmVEb3VibGVOZWFyOwotdXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRmxvYXRFcTsKLXVzaW5nIHRlc3Rpbmc6Ok5hblNlbnNpdGl2ZUZsb2F0TmVhcjsKLXVzaW5nIHRlc3Rpbmc6Ok5lOwotdXNpbmcgdGVzdGluZzo6Tm90OwotdXNpbmcgdGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIHRlc3Rpbmc6OlBhaXI7Ci11c2luZyB0ZXN0aW5nOjpQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6UG9pbnR3aXNlOwotdXNpbmcgdGVzdGluZzo6UG9seW1vcnBoaWNNYXRjaGVyOwotdXNpbmcgdGVzdGluZzo6UHJvcGVydHk7Ci11c2luZyB0ZXN0aW5nOjpSZWY7Ci11c2luZyB0ZXN0aW5nOjpSZXN1bHRPZjsKLXVzaW5nIHRlc3Rpbmc6OlNpemVJczsKLXVzaW5nIHRlc3Rpbmc6OlN0YXJ0c1dpdGg7Ci11c2luZyB0ZXN0aW5nOjpTdHJDYXNlRXE7Ci11c2luZyB0ZXN0aW5nOjpTdHJDYXNlTmU7Ci11c2luZyB0ZXN0aW5nOjpTdHJFcTsKLXVzaW5nIHRlc3Rpbmc6OlN0ck5lOwotdXNpbmcgdGVzdGluZzo6U3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lcjsKLXVzaW5nIHRlc3Rpbmc6OlRydWx5OwotdXNpbmcgdGVzdGluZzo6VHlwZWRFcTsKLXVzaW5nIHRlc3Rpbmc6OlVub3JkZXJlZFBvaW50d2lzZTsKLXVzaW5nIHRlc3Rpbmc6OlZhbHVlOwotdXNpbmcgdGVzdGluZzo6V2hlblNvcnRlZDsKLXVzaW5nIHRlc3Rpbmc6OldoZW5Tb3J0ZWRCeTsKLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpnZXQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkVsZW1lbnRNYXRjaGVyUGFpcjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpFbGVtZW50TWF0Y2hlclBhaXJzOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkV4cGxhaW5NYXRjaEZhaWx1cmVUdXBsZVRvOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc1JlYWRhYmxlVHlwZU5hbWU7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Sm9pbkFzVHVwbGU7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpNYXRjaE1hdHJpeDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpSRTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nczsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nOwotdXNpbmcgdGVzdGluZzo6bWFrZV90dXBsZTsKLXVzaW5nIHRlc3Rpbmc6OnR1cGxlOwotCi0vLyBGb3IgdGVzdGluZyBFeHBsYWluTWF0Y2hSZXN1bHRUbygpLgotY2xhc3MgR3JlYXRlclRoYW5NYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHcmVhdGVyVGhhbk1hdGNoZXIoaW50IHJocykgOiByaHNfKHJocykge30KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaXMgPiAiIDw8IHJoc187Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBjb25zdCBpbnQgZGlmZiA9IGxocyAtIHJoc187Ci0gICAgaWYgKGRpZmYgPiAwKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgZGlmZiA8PCAiIG1vcmUgdGhhbiAiIDw8IHJoc187Ci0gICAgfSBlbHNlIGlmIChkaWZmID09IDApIHsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgdGhlIHNhbWUgYXMgIiA8PCByaHNfOwotICAgIH0gZWxzZSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgLWRpZmYgPDwgIiBsZXNzIHRoYW4gIiA8PCByaHNfOwotICAgIH0KLQotICAgIHJldHVybiBsaHMgPiByaHNfOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQgcmhzXzsKLX07Ci0KLU1hdGNoZXI8aW50PiBHcmVhdGVyVGhhbihpbnQgbikgewotICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEdyZWF0ZXJUaGFuTWF0Y2hlcihuKSk7Ci19Ci0KLXN0cmluZyBPZlR5cGUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKLSNpZiBHVEVTVF9IQVNfUlRUSQotICByZXR1cm4gIiAob2YgdHlwZSAiICsgdHlwZV9uYW1lICsgIikiOwotI2Vsc2UKLSAgcmV0dXJuICIiOwotI2VuZGlmCi19Ci0KLS8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBtYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJpbmcgRGVzY3JpYmUoY29uc3QgTWF0Y2hlcjxUPiYgbSkgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIG0uRGVzY3JpYmVUbygmc3MpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWdhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RyaW5nIERlc2NyaWJlTmVnYXRpb24oY29uc3QgTWF0Y2hlcjxUPiYgbSkgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIG0uRGVzY3JpYmVOZWdhdGlvblRvKCZzcyk7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgcmVhc29uIHdoeSB4IG1hdGNoZXMsIG9yIGRvZXNuJ3QgbWF0Y2gsIG0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR5cGUsIHR5cGVuYW1lIFZhbHVlPgotc3RyaW5nIEV4cGxhaW4oY29uc3QgTWF0Y2hlclR5cGUmIG0sIGNvbnN0IFZhbHVlJiB4KSB7Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gIEV4cGxhaW5NYXRjaFJlc3VsdChtLCB4LCAmbGlzdGVuZXIpOwotICByZXR1cm4gbGlzdGVuZXIuc3RyKCk7Ci19Ci0KLVRFU1QoTWF0Y2hSZXN1bHRMaXN0ZW5lclRlc3QsIFN0cmVhbWluZ1dvcmtzKSB7Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gIGxpc3RlbmVyIDw8ICJoaSIgPDwgNTsKLSAgRVhQRUNUX0VRKCJoaTUiLCBsaXN0ZW5lci5zdHIoKSk7Ci0KLSAgbGlzdGVuZXIuQ2xlYXIoKTsKLSAgRVhQRUNUX0VRKCIiLCBsaXN0ZW5lci5zdHIoKSk7Ci0KLSAgbGlzdGVuZXIgPDwgNDI7Ci0gIEVYUEVDVF9FUSgiNDIiLCBsaXN0ZW5lci5zdHIoKSk7Ci0KLSAgLy8gU3RyZWFtaW5nIHNob3VsZG4ndCBjcmFzaCB3aGVuIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW0gaXMgTlVMTC4KLSAgRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyIGR1bW15OwotICBkdW1teSA8PCAiaGkiIDw8IDU7Ci19Ci0KLVRFU1QoTWF0Y2hSZXN1bHRMaXN0ZW5lclRlc3QsIENhbkFjY2Vzc1VuZGVybHlpbmdTdHJlYW0pIHsKLSAgRVhQRUNUX1RSVUUoRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKCkuc3RyZWFtKCkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIoTlVMTCkuc3RyZWFtKCkgPT0gTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKCZzdGQ6OmNvdXQsIFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIoJnN0ZDo6Y291dCkuc3RyZWFtKCkpOwotfQotCi1URVNUKE1hdGNoUmVzdWx0TGlzdGVuZXJUZXN0LCBJc0ludGVyZXN0ZWRXb3JrcykgewotICBFWFBFQ1RfVFJVRShTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKCkuSXNJbnRlcmVzdGVkKCkpOwotICBFWFBFQ1RfVFJVRShTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyKCZzdGQ6OmNvdXQpLklzSW50ZXJlc3RlZCgpKTsKLQotICBFWFBFQ1RfRkFMU0UoRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKCkuSXNJbnRlcmVzdGVkKCkpOwotICBFWFBFQ1RfRkFMU0UoU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lcihOVUxMKS5Jc0ludGVyZXN0ZWQoKSk7Ci19Ci0KLS8vIE1ha2VzIHN1cmUgdGhhdCB0aGUgTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UgZG9lc24ndAotLy8gY2hhbmdlLgotY2xhc3MgRXZlbk1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgcmV0dXJuIHggJSAyID09IDA7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaXMgYW4gZXZlbiBudW1iZXIiOwotICB9Ci0KLSAgLy8gV2UgZGVsaWJlcmF0ZWx5IGRvbid0IGRlZmluZSBEZXNjcmliZU5lZ2F0aW9uVG8oKSBhbmQKLSAgLy8gRXhwbGFpbk1hdGNoUmVzdWx0VG8oKSBoZXJlLCB0byBtYWtlIHN1cmUgdGhlIGRlZmluaXRpb24gb2YgdGhlc2UKLSAgLy8gdHdvIG1ldGhvZHMgaXMgb3B0aW9uYWwuCi19OwotCi0vLyBNYWtlcyBzdXJlIHRoYXQgdGhlIE1hdGNoZXJJbnRlcmZhY2UgQVBJIGRvZXNuJ3QgY2hhbmdlLgotVEVTVChNYXRjaGVySW50ZXJmYWNlVGVzdCwgQ2FuQmVJbXBsZW1lbnRlZFVzaW5nUHVibGlzaGVkQVBJKSB7Ci0gIEV2ZW5NYXRjaGVySW1wbCBtOwotfQotCi0vLyBUZXN0cyBpbXBsZW1lbnRpbmcgYSBtb25vbW9ycGhpYyBtYXRjaGVyIHVzaW5nIE1hdGNoQW5kRXhwbGFpbigpLgotCi1jbGFzcyBOZXdFdmVuTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxpbnQ+IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oaW50IHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgY29uc3QgYm9vbCBtYXRjaCA9IHggJSAyID09IDA7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIGEgbGlzdGVuZXIgZGlyZWN0bHkuCi0gICAgKmxpc3RlbmVyIDw8ICJ2YWx1ZSAlICIgPDwgMjsKLSAgICBpZiAobGlzdGVuZXItPnN0cmVhbSgpICE9IE5VTEwpIHsKLSAgICAgIC8vIFZlcmlmaWVzIHRoYXQgd2UgY2FuIHN0cmVhbSB0byBhIGxpc3RlbmVyJ3MgdW5kZXJseWluZyBzdHJlYW0KLSAgICAgIC8vIHRvby4KLSAgICAgICpsaXN0ZW5lci0+c3RyZWFtKCkgPDwgIiA9PSAiIDw8ICh4ICUgMik7Ci0gICAgfQotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKG9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBhbiBldmVuIG51bWJlciI7Ci0gIH0KLX07Ci0KLVRFU1QoTWF0Y2hlckludGVyZmFjZVRlc3QsIENhbkJlSW1wbGVtZW50ZWRVc2luZ05ld0FQSSkgewotICBNYXRjaGVyPGludD4gbSA9IE1ha2VNYXRjaGVyKG5ldyBOZXdFdmVuTWF0Y2hlckltcGwpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDMpKTsKLSAgRVhQRUNUX0VRKCJ2YWx1ZSAlIDIgPT0gMCIsIEV4cGxhaW4obSwgMikpOwotICBFWFBFQ1RfRVEoInZhbHVlICUgMiA9PSAxIiwgRXhwbGFpbihtLCAzKSk7Ci19Ci0KLS8vIFRlc3RzIGRlZmF1bHQtY29uc3RydWN0aW5nIGEgbWF0Y2hlci4KLVRFU1QoTWF0Y2hlclRlc3QsIENhbkJlRGVmYXVsdENvbnN0cnVjdGVkKSB7Ci0gIE1hdGNoZXI8ZG91YmxlPiBtOwotfQotCi0vLyBUZXN0cyB0aGF0IE1hdGNoZXI8VD4gY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYSBNYXRjaGVySW50ZXJmYWNlPFQ+Ki4KLVRFU1QoTWF0Y2hlclRlc3QsIENhbkJlQ29uc3RydWN0ZWRGcm9tTWF0Y2hlckludGVyZmFjZSkgewotICBjb25zdCBNYXRjaGVySW50ZXJmYWNlPGludD4qIGltcGwgPSBuZXcgRXZlbk1hdGNoZXJJbXBsOwotICBNYXRjaGVyPGludD4gbShpbXBsKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDQpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg1KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdmFsdWUgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgRXEodmFsdWUpLgotVEVTVChNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tVmFsdWUpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0xID0gNTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyg1KSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKDYpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBOVUxMIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIEVxKE5VTEwpLgotVEVTVChNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tTlVMTCkgewotICBNYXRjaGVyPGludCo+IG0xID0gTlVMTDsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhOVUxMKSk7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoJm4pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBtYXRjaGVycyBhcmUgY29weWFibGUuCi1URVNUKE1hdGNoZXJUZXN0LCBJc0NvcHlhYmxlKSB7Ci0gIC8vIFRlc3RzIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgotICBNYXRjaGVyPGJvb2w+IG0xID0gRXEoZmFsc2UpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGZhbHNlKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKHRydWUpKTsKLQotICAvLyBUZXN0cyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgbTEgPSBFcSh0cnVlKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyh0cnVlKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKGZhbHNlKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlcjxUPjo6RGVzY3JpYmVUbygpIGNhbGxzCi0vLyBNYXRjaGVySW50ZXJmYWNlPFQ+OjpEZXNjcmliZVRvKCkuCi1URVNUKE1hdGNoZXJUZXN0LCBDYW5EZXNjcmliZUl0c2VsZikgewotICBFWFBFQ1RfRVEoImlzIGFuIGV2ZW4gbnVtYmVyIiwKLSAgICAgICAgICAgIERlc2NyaWJlKE1hdGNoZXI8aW50PihuZXcgRXZlbk1hdGNoZXJJbXBsKSkpOwotfQotCi0vLyBUZXN0cyBNYXRjaGVyPFQ+OjpNYXRjaEFuZEV4cGxhaW4oKS4KLVRFU1QoTWF0Y2hlclRlc3QsIE1hdGNoQW5kRXhwbGFpbikgewotICBNYXRjaGVyPGludD4gbSA9IEdyZWF0ZXJUaGFuKDApOwotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaEFuZEV4cGxhaW4oNDIsICZsaXN0ZW5lcjEpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyA0MiBtb3JlIHRoYW4gMCIsIGxpc3RlbmVyMS5zdHIoKSk7Ci0KLSAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjI7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoQW5kRXhwbGFpbigtOSwgJmxpc3RlbmVyMikpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDkgbGVzcyB0aGFuIDAiLCBsaXN0ZW5lcjIuc3RyKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgQy1zdHJpbmcgbGl0ZXJhbCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYQotLy8gTWF0Y2hlcjxzdHJpbmc+IG9yIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4uCi1URVNUKFN0cmluZ01hdGNoZXJUZXN0LCBDYW5CZUltcGxpY2l0bHlDb25zdHJ1Y3RlZEZyb21DU3RyaW5nTGl0ZXJhbCkgewotICBNYXRjaGVyPHN0cmluZz4gbTEgPSAiaGkiOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJoaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoImhlbGxvIikpOwotCi0gIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTIgPSAiaGkiOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJoaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoImhlbGxvIikpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgc3RyaW5nIG9iamVjdCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYQotLy8gTWF0Y2hlcjxzdHJpbmc+IG9yIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4uCi1URVNUKFN0cmluZ01hdGNoZXJUZXN0LCBDYW5CZUltcGxpY2l0bHlDb25zdHJ1Y3RlZEZyb21TdHJpbmcpIHsKLSAgTWF0Y2hlcjxzdHJpbmc+IG0xID0gc3RyaW5nKCJoaSIpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJoaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoImhlbGxvIikpOwotCi0gIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTIgPSBzdHJpbmcoImhpIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImhpIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiaGVsbG8iKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXwotLy8gVGVzdHMgdGhhdCBhIEMtc3RyaW5nIGxpdGVyYWwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEKLS8vIE1hdGNoZXI8U3RyaW5nUGllY2U+IG9yIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPi4KLVRFU1QoU3RyaW5nUGllY2VNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tQ1N0cmluZ0xpdGVyYWwpIHsKLSAgTWF0Y2hlcjxTdHJpbmdQaWVjZT4gbTEgPSAiY2F0cyI7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoImNhdHMiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKCJkb2dzIikpOwotCi0gIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPiBtMiA9ICJjYXRzIjsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiY2F0cyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoImRvZ3MiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBzdHJpbmcgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhCi0vLyBNYXRjaGVyPFN0cmluZ1BpZWNlPiBvciBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4uCi1URVNUKFN0cmluZ1BpZWNlTWF0Y2hlclRlc3QsIENhbkJlSW1wbGljaXRseUNvbnN0cnVjdGVkRnJvbVN0cmluZykgewotICBNYXRjaGVyPFN0cmluZ1BpZWNlPiBtMSA9IHN0cmluZygiY2F0cyIpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJjYXRzIikpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygiZG9ncyIpKTsKLQotICBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4gbTIgPSBzdHJpbmcoImNhdHMiKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiY2F0cyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoImRvZ3MiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBTdHJpbmdQaWVjZSBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEKLS8vIE1hdGNoZXI8U3RyaW5nUGllY2U+IG9yIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPi4KLVRFU1QoU3RyaW5nUGllY2VNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tU3RyaW5nUGllY2UpIHsKLSAgTWF0Y2hlcjxTdHJpbmdQaWVjZT4gbTEgPSBTdHJpbmdQaWVjZSgiY2F0cyIpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJjYXRzIikpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygiZG9ncyIpKTsKLQotICBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4gbTIgPSBTdHJpbmdQaWVjZSgiY2F0cyIpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJjYXRzIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiZG9ncyIpKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KLQotLy8gVGVzdHMgdGhhdCBNYWtlTWF0Y2hlcigpIGNvbnN0cnVjdHMgYSBNYXRjaGVyPFQ+IGZyb20gYQotLy8gTWF0Y2hlckludGVyZmFjZSogd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhwbGljaXRseQotLy8gd3JpdGUgdGhlIHR5cGUuCi1URVNUKE1ha2VNYXRjaGVyVGVzdCwgQ29uc3RydWN0c01hdGNoZXJGcm9tTWF0Y2hlckludGVyZmFjZSkgewotICBjb25zdCBNYXRjaGVySW50ZXJmYWNlPGludD4qIGR1bW15X2ltcGwgPSBOVUxMOwotICBNYXRjaGVyPGludD4gbSA9IE1ha2VNYXRjaGVyKGR1bW15X2ltcGwpOwotfQotCi0vLyBUZXN0cyB0aGF0IE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKSBjYW4gY29uc3RydWN0IGEgcG9seW1vcnBoaWMKLS8vIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIG9sZCBBUEkuCi1jb25zdCBpbnQgZ19iYXIgPSAxOwotY2xhc3MgUmVmZXJlbmNlc0Jhck9ySXNaZXJvSW1wbCB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVCYgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICBjb25zdCB2b2lkKiBwID0gJng7Ci0gICAgcmV0dXJuIHAgPT0gJmdfYmFyIHx8IHggPT0gMDsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImdfYmFyIG9yIHplcm8iOyB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8ob3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImRvZXNuJ3QgcmVmZXJlbmNlIGdfYmFyIGFuZCBpcyBub3QgemVybyI7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhhdCBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkgcmV0dXJucyBhCi0vLyBQb2x5bW9ycGhpY01hdGNoZXI8VD4gd2hlcmUgVCBpcyB0aGUgYXJndW1lbnQncyB0eXBlLgotUG9seW1vcnBoaWNNYXRjaGVyPFJlZmVyZW5jZXNCYXJPcklzWmVyb0ltcGw+IFJlZmVyZW5jZXNCYXJPcklzWmVybygpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoUmVmZXJlbmNlc0Jhck9ySXNaZXJvSW1wbCgpKTsKLX0KLQotVEVTVChNYWtlUG9seW1vcnBoaWNNYXRjaGVyVGVzdCwgQ29uc3RydWN0c01hdGNoZXJVc2luZ09sZEFQSSkgewotICAvLyBVc2luZyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdG8gbWF0Y2ggYSByZWZlcmVuY2UgdHlwZS4KLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtMSA9IFJlZmVyZW5jZXNCYXJPcklzWmVybygpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDApKTsKLSAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgaWRlbnRpdHkgb2YgYSBieS1yZWZlcmVuY2UgYXJndW1lbnQgaXMgcHJlc2VydmVkLgotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGdfYmFyKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX0VRKCJnX2JhciBvciB6ZXJvIiwgRGVzY3JpYmUobTEpKTsKLQotICAvLyBVc2luZyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdG8gbWF0Y2ggYSB2YWx1ZSB0eXBlLgotICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBSZWZlcmVuY2VzQmFyT3JJc1plcm8oKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwLjApKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMC4xKSk7Ci0gIEVYUEVDVF9FUSgiZ19iYXIgb3IgemVybyIsIERlc2NyaWJlKG0yKSk7Ci19Ci0KLS8vIFRlc3RzIGltcGxlbWVudGluZyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdXNpbmcgTWF0Y2hBbmRFeHBsYWluKCkuCi0KLWNsYXNzIFBvbHltb3JwaGljSXNFdmVuSW1wbCB7Ci0gcHVibGljOgotICB2b2lkIERlc2NyaWJlVG8ob3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBldmVuIjsgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKG9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBvZGQiOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIHRoZSBsaXN0ZW5lciBkaXJlY3RseS4KLSAgICAqbGlzdGVuZXIgPDwgIiUgIiA8PCAyOwotICAgIGlmIChsaXN0ZW5lci0+c3RyZWFtKCkgIT0gTlVMTCkgewotICAgICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIHRoZSBsaXN0ZW5lcidzIHVuZGVybHlpbmcgc3RyZWFtCi0gICAgICAvLyB0b28uCi0gICAgICAqbGlzdGVuZXItPnN0cmVhbSgpIDw8ICIgPT0gIiA8PCAoeCAlIDIpOwotICAgIH0KLSAgICByZXR1cm4gKHggJSAyKSA9PSAwOwotICB9Ci19OwotCi1Qb2x5bW9ycGhpY01hdGNoZXI8UG9seW1vcnBoaWNJc0V2ZW5JbXBsPiBQb2x5bW9ycGhpY0lzRXZlbigpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoUG9seW1vcnBoaWNJc0V2ZW5JbXBsKCkpOwotfQotCi1URVNUKE1ha2VQb2x5bW9ycGhpY01hdGNoZXJUZXN0LCBDb25zdHJ1Y3RzTWF0Y2hlclVzaW5nTmV3QVBJKSB7Ci0gIC8vIFVzaW5nIFBvbHltb3JwaGljSXNFdmVuKCkgYXMgYSBNYXRjaGVyPGludD4uCi0gIGNvbnN0IE1hdGNoZXI8aW50PiBtMSA9IFBvbHltb3JwaGljSXNFdmVuKCk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoNDIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoNDMpKTsKLSAgRVhQRUNUX0VRKCJpcyBldmVuIiwgRGVzY3JpYmUobTEpKTsKLQotICBjb25zdCBNYXRjaGVyPGludD4gbm90X20xID0gTm90KG0xKTsKLSAgRVhQRUNUX0VRKCJpcyBvZGQiLCBEZXNjcmliZShub3RfbTEpKTsKLQotICBFWFBFQ1RfRVEoIiUgMiA9PSAwIiwgRXhwbGFpbihtMSwgNDIpKTsKLQotICAvLyBVc2luZyBQb2x5bW9ycGhpY0lzRXZlbigpIGFzIGEgTWF0Y2hlcjxjaGFyPi4KLSAgY29uc3QgTWF0Y2hlcjxjaGFyPiBtMiA9IFBvbHltb3JwaGljSXNFdmVuKCk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoJ1x4NDInKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCdceDQzJykpOwotICBFWFBFQ1RfRVEoImlzIGV2ZW4iLCBEZXNjcmliZShtMikpOwotCi0gIGNvbnN0IE1hdGNoZXI8Y2hhcj4gbm90X20yID0gTm90KG0yKTsKLSAgRVhQRUNUX0VRKCJpcyBvZGQiLCBEZXNjcmliZShub3RfbTIpKTsKLQotICBFWFBFQ1RfRVEoIiUgMiA9PSAwIiwgRXhwbGFpbihtMiwgJ1x4NDInKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8VD4obSkgd29ya3Mgd2hlbiBtIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlci4KLVRFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tUG9seW1vcnBoaWNNYXRjaGVyKSB7Ci0gIE1hdGNoZXI8aW50PiBtID0gTWF0Y2hlckNhc3Q8aW50PihFcSg1KSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyg1KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoNikpOwotfQotCi0vLyBGb3IgdGVzdGluZyBjYXN0aW5nIG1hdGNoZXJzIGJldHdlZW4gY29tcGF0aWJsZSB0eXBlcy4KLWNsYXNzIEludFZhbHVlIHsKLSBwdWJsaWM6Ci0gIC8vIEFuIGludCBjYW4gYmUgc3RhdGljYWxseSAoYWx0aG91Z2ggbm90IGltcGxpY2l0bHkpIGNhc3QgdG8gYQotICAvLyBJbnRWYWx1ZS4KLSAgZXhwbGljaXQgSW50VmFsdWUoaW50IGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9Ci0KLSAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0gcHJpdmF0ZToKLSAgaW50IHZhbHVlXzsKLX07Ci0KLS8vIEZvciB0ZXN0aW5nIGNhc3RpbmcgbWF0Y2hlcnMgYmV0d2VlbiBjb21wYXRpYmxlIHR5cGVzLgotYm9vbCBJc1Bvc2l0aXZlSW50VmFsdWUoY29uc3QgSW50VmFsdWUmIGZvbykgewotICByZXR1cm4gZm9vLnZhbHVlKCkgPiAwOwotfQotCi0vLyBUZXN0cyB0aGF0IE1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VT4gd2hlcmUgVAotLy8gY2FuIGJlIHN0YXRpY2FsbHkgY29udmVydGVkIHRvIFUuCi1URVNUKE1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbXBhdGlibGVUeXBlKSB7Ci0gIE1hdGNoZXI8ZG91YmxlPiBtMSA9IEVxKDIuMCk7Ci0gIE1hdGNoZXI8aW50PiBtMiA9IE1hdGNoZXJDYXN0PGludD4obTEpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMykpOwotCi0gIE1hdGNoZXI8SW50VmFsdWU+IG0zID0gVHJ1bHkoSXNQb3NpdGl2ZUludFZhbHVlKTsKLSAgTWF0Y2hlcjxpbnQ+IG00ID0gTWF0Y2hlckNhc3Q8aW50PihtMyk7Ci0gIC8vIEluIHRoZSBmb2xsb3dpbmcsIHRoZSBhcmd1bWVudHMgMSBhbmQgMCBhcmUgc3RhdGljYWxseSBjb252ZXJ0ZWQKLSAgLy8gdG8gSW50VmFsdWUgb2JqZWN0cywgYW5kIHRoZW4gdGVzdGVkIGJ5IHRoZSBJc1Bvc2l0aXZlSW50VmFsdWUoKQotICAvLyBwcmVkaWNhdGUuCi0gIEVYUEVDVF9UUlVFKG00Lk1hdGNoZXMoMSkpOwotICBFWFBFQ1RfRkFMU0UobTQuTWF0Y2hlcygwKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8VD4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxjb25zdCBUJj4uCi1URVNUKE1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbnN0UmVmZXJlbmNlVG9Ob25SZWZlcmVuY2UpIHsKLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtMSA9IEVxKDApOwotICBNYXRjaGVyPGludD4gbTIgPSBNYXRjaGVyQ2FzdDxpbnQ+KG0xKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBNYXRjaGVyQ2FzdDxUPihtKSB3b3JrcyB3aGVuIG0gaXMgYSBNYXRjaGVyPFQmPi4KLVRFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tUmVmZXJlbmNlVG9Ob25SZWZlcmVuY2UpIHsKLSAgTWF0Y2hlcjxpbnQmPiBtMSA9IEVxKDApOwotICBNYXRjaGVyPGludD4gbTIgPSBNYXRjaGVyQ2FzdDxpbnQ+KG0xKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBNYXRjaGVyQ2FzdDxjb25zdCBUJj4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxUPi4KLVRFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tTm9uUmVmZXJlbmNlVG9Db25zdFJlZmVyZW5jZSkgewotICBNYXRjaGVyPGludD4gbTEgPSBFcSgwKTsKLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtMiA9IE1hdGNoZXJDYXN0PGNvbnN0IGludCY+KG0xKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBNYXRjaGVyQ2FzdDxUJj4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxUPi4KLVRFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tTm9uUmVmZXJlbmNlVG9SZWZlcmVuY2UpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0xID0gRXEoMCk7Ci0gIE1hdGNoZXI8aW50Jj4gbTIgPSBNYXRjaGVyQ2FzdDxpbnQmPihtMSk7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhuKSk7Ci0gIG4gPSAxOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhuKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8VD4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxUPi4KLVRFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tU2FtZVR5cGUpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0xID0gRXEoMCk7Ci0gIE1hdGNoZXI8aW50PiBtMiA9IE1hdGNoZXJDYXN0PGludD4obTEpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDApKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMSkpOwotfQotCi0vLyBJbXBsaWNpdGx5IGNvbnZlcnRpYmxlIGZyb20gYW55IHR5cGUuCi1zdHJ1Y3QgQ29udmVydGlibGVGcm9tQW55IHsKLSAgQ29udmVydGlibGVGcm9tQW55KGludCBhX3ZhbHVlKSA6IHZhbHVlKGFfdmFsdWUpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBDb252ZXJ0aWJsZUZyb21BbnkoY29uc3QgVCYgLyphX3ZhbHVlKi8pIDogdmFsdWUoLTEpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJDb252ZXJzaW9uIGNvbnN0cnVjdG9yIGNhbGxlZCI7Ci0gIH0KLSAgaW50IHZhbHVlOwotfTsKLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnZlcnRpYmxlRnJvbUFueSYgYSwgY29uc3QgQ29udmVydGlibGVGcm9tQW55JiBiKSB7Ci0gIHJldHVybiBhLnZhbHVlID09IGIudmFsdWU7Ci19Ci0KLW9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IENvbnZlcnRpYmxlRnJvbUFueSYgYSkgewotICByZXR1cm4gb3MgPDwgYS52YWx1ZTsKLX0KLQotVEVTVChNYXRjaGVyQ2FzdFRlc3QsIENvbnZlcnNpb25Db25zdHJ1Y3RvcklzVXNlZCkgewotICBNYXRjaGVyPENvbnZlcnRpYmxlRnJvbUFueT4gbSA9IE1hdGNoZXJDYXN0PENvbnZlcnRpYmxlRnJvbUFueT4oMSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhDb252ZXJ0aWJsZUZyb21BbnkoMSkpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhDb252ZXJ0aWJsZUZyb21BbnkoMikpKTsKLX0KLQotVEVTVChNYXRjaGVyQ2FzdFRlc3QsIEZyb21Db252ZXJ0aWJsZUZyb21BbnkpIHsKLSAgTWF0Y2hlcjxDb252ZXJ0aWJsZUZyb21Bbnk+IG0gPQotICAgICAgTWF0Y2hlckNhc3Q8Q29udmVydGlibGVGcm9tQW55PihFcShDb252ZXJ0aWJsZUZyb21BbnkoMSkpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgxKSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgyKSkpOwotfQotCi1zdHJ1Y3QgSW50UmVmZXJlbmNlV3JhcHBlciB7Ci0gIEludFJlZmVyZW5jZVdyYXBwZXIoY29uc3QgaW50JiBhX3ZhbHVlKSA6IHZhbHVlKCZhX3ZhbHVlKSB7fQotICBjb25zdCBpbnQqIHZhbHVlOwotfTsKLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludFJlZmVyZW5jZVdyYXBwZXImIGEsIGNvbnN0IEludFJlZmVyZW5jZVdyYXBwZXImIGIpIHsKLSAgcmV0dXJuIGEudmFsdWUgPT0gYi52YWx1ZTsKLX0KLQotVEVTVChNYXRjaGVyQ2FzdFRlc3QsIFZhbHVlSXNOb3RDb3BpZWQpIHsKLSAgaW50IG4gPSA0MjsKLSAgTWF0Y2hlcjxJbnRSZWZlcmVuY2VXcmFwcGVyPiBtID0gTWF0Y2hlckNhc3Q8SW50UmVmZXJlbmNlV3JhcHBlcj4obik7Ci0gIC8vIFZlcmlmeSB0aGF0IHRoZSBtYXRjaGVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIG4sIG5vdCB0byBpdHMgdGVtcG9yYXJ5IGNvcHkuCi0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuKSk7Ci19Ci0KLWNsYXNzIEJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+QmFzZSgpIHt9Ci0gIEJhc2UoKSB7fQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQmFzZSk7Ci19OwotCi1jbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgewotIHB1YmxpYzoKLSAgRGVyaXZlZCgpIDogQmFzZSgpIHt9Ci0gIGludCBpOwotfTsKLQotY2xhc3MgT3RoZXJEZXJpdmVkIDogcHVibGljIEJhc2Uge307Ci0KLS8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXIuCi1URVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21Qb2x5bW9ycGhpY01hdGNoZXIpIHsKLSAgTWF0Y2hlcjxjaGFyPiBtMiA9IFNhZmVNYXRjaGVyQ2FzdDxjaGFyPihFcSgzMikpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCcgJykpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygnXG4nKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VT4gd2hlcmUKLS8vIFQgYW5kIFUgYXJlIGFyaXRobWV0aWMgdHlwZXMgYW5kIFQgY2FuIGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvCi0vLyBVLgotVEVTVChTYWZlTWF0Y2hlckNhc3RUZXN0LCBGcm9tTG9zc2xlc3NseUNvbnZlcnRpYmxlQXJpdGhtZXRpY1R5cGUpIHsKLSAgTWF0Y2hlcjxkb3VibGU+IG0xID0gRG91YmxlRXEoMS4wKTsKLSAgTWF0Y2hlcjxmbG9hdD4gbTIgPSBTYWZlTWF0Y2hlckNhc3Q8ZmxvYXQ+KG0xKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygxLjBmKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDIuMGYpKTsKLQotICBNYXRjaGVyPGNoYXI+IG0zID0gU2FmZU1hdGNoZXJDYXN0PGNoYXI+KFR5cGVkRXE8aW50PignYScpKTsKLSAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcygnYScpKTsKLSAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoJ2InKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VT4gd2hlcmUgVCBhbmQgVQotLy8gYXJlIHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMgdG8gYSBkZXJpdmVkIGFuZCBhIGJhc2UgY2xhc3MsIGNvcnJlc3BvbmRpbmdseS4KLVRFU1QoU2FmZU1hdGNoZXJDYXN0VGVzdCwgRnJvbUJhc2VDbGFzcykgewotICBEZXJpdmVkIGQsIGQyOwotICBNYXRjaGVyPEJhc2UqPiBtMSA9IEVxKCZkKTsKLSAgTWF0Y2hlcjxEZXJpdmVkKj4gbTIgPSBTYWZlTWF0Y2hlckNhc3Q8RGVyaXZlZCo+KG0xKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygmZCkpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygmZDIpKTsKLQotICBNYXRjaGVyPEJhc2UmPiBtMyA9IFJlZihkKTsKLSAgTWF0Y2hlcjxEZXJpdmVkJj4gbTQgPSBTYWZlTWF0Y2hlckNhc3Q8RGVyaXZlZCY+KG0zKTsKLSAgRVhQRUNUX1RSVUUobTQuTWF0Y2hlcyhkKSk7Ci0gIEVYUEVDVF9GQUxTRShtNC5NYXRjaGVzKGQyKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQmPihtKSB3b3JrcyB3aGVuIG0gaXMgYSBNYXRjaGVyPGNvbnN0IFQmPi4KLVRFU1QoU2FmZU1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbnN0UmVmZXJlbmNlVG9SZWZlcmVuY2UpIHsKLSAgaW50IG4gPSAwOwotICBNYXRjaGVyPGNvbnN0IGludCY+IG0xID0gUmVmKG4pOwotICBNYXRjaGVyPGludCY+IG0yID0gU2FmZU1hdGNoZXJDYXN0PGludCY+KG0xKTsKLSAgaW50IG4xID0gMDsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhuKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKG4xKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VD4uCi1URVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21Ob25SZWZlcmVuY2VUb0NvbnN0UmVmZXJlbmNlKSB7Ci0gIE1hdGNoZXI8aW50PiBtMSA9IEVxKDApOwotICBNYXRjaGVyPGNvbnN0IGludCY+IG0yID0gU2FmZU1hdGNoZXJDYXN0PGNvbnN0IGludCY+KG0xKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBTYWZlTWF0Y2hlckNhc3Q8VCY+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VD4uCi1URVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21Ob25SZWZlcmVuY2VUb1JlZmVyZW5jZSkgewotICBNYXRjaGVyPGludD4gbTEgPSBFcSgwKTsKLSAgTWF0Y2hlcjxpbnQmPiBtMiA9IFNhZmVNYXRjaGVyQ2FzdDxpbnQmPihtMSk7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhuKSk7Ci0gIG4gPSAxOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhuKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VD4uCi1URVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21TYW1lVHlwZSkgewotICBNYXRjaGVyPGludD4gbTEgPSBFcSgwKTsKLSAgTWF0Y2hlcjxpbnQ+IG0yID0gU2FmZU1hdGNoZXJDYXN0PGludD4obTEpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDApKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMSkpOwotfQotCi1URVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIENvbnZlcnNpb25Db25zdHJ1Y3RvcklzVXNlZCkgewotICBNYXRjaGVyPENvbnZlcnRpYmxlRnJvbUFueT4gbSA9IFNhZmVNYXRjaGVyQ2FzdDxDb252ZXJ0aWJsZUZyb21Bbnk+KDEpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoQ29udmVydGlibGVGcm9tQW55KDEpKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoQ29udmVydGlibGVGcm9tQW55KDIpKSk7Ci19Ci0KLVRFU1QoU2FmZU1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbnZlcnRpYmxlRnJvbUFueSkgewotICBNYXRjaGVyPENvbnZlcnRpYmxlRnJvbUFueT4gbSA9Ci0gICAgICBTYWZlTWF0Y2hlckNhc3Q8Q29udmVydGlibGVGcm9tQW55PihFcShDb252ZXJ0aWJsZUZyb21BbnkoMSkpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgxKSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgyKSkpOwotfQotCi1URVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIFZhbHVlSXNOb3RDb3BpZWQpIHsKLSAgaW50IG4gPSA0MjsKLSAgTWF0Y2hlcjxJbnRSZWZlcmVuY2VXcmFwcGVyPiBtID0gU2FmZU1hdGNoZXJDYXN0PEludFJlZmVyZW5jZVdyYXBwZXI+KG4pOwotICAvLyBWZXJpZnkgdGhhdCB0aGUgbWF0Y2hlciBob2xkcyBhIHJlZmVyZW5jZSB0byBuLCBub3QgdG8gaXRzIHRlbXBvcmFyeSBjb3B5LgotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobikpOwotfQotCi1URVNUKEV4cGVjdFRoYXQsIFRha2VzTGl0ZXJhbHMpIHsKLSAgRVhQRUNUX1RIQVQoMSwgMSk7Ci0gIEVYUEVDVF9USEFUKDEuMCwgMS4wKTsKLSAgRVhQRUNUX1RIQVQoc3RyaW5nKCksICIiKTsKLX0KLQotVEVTVChFeHBlY3RUaGF0LCBUYWtlc0Z1bmN0aW9ucykgewotICBzdHJ1Y3QgSGVscGVyIHsKLSAgICBzdGF0aWMgdm9pZCBGdW5jKCkge30KLSAgfTsKLSAgdm9pZCAoKmZ1bmMpKCkgPSBIZWxwZXI6OkZ1bmM7Ci0gIEVYUEVDVF9USEFUKGZ1bmMsIEhlbHBlcjo6RnVuYyk7Ci0gIEVYUEVDVF9USEFUKGZ1bmMsICZIZWxwZXI6OkZ1bmMpOwotfQotCi0vLyBUZXN0cyB0aGF0IEE8VD4oKSBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0eXBlIFQuCi1URVNUKEFUZXN0LCBNYXRjaGVzQW55VmFsdWUpIHsKLSAgLy8gVGVzdHMgYSBtYXRjaGVyIGZvciBhIHZhbHVlIHR5cGUuCi0gIE1hdGNoZXI8ZG91YmxlPiBtMSA9IEE8ZG91YmxlPigpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDkxLjQzKSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoLTE1LjMyKSk7Ci0KLSAgLy8gVGVzdHMgYSBtYXRjaGVyIGZvciBhIHJlZmVyZW5jZSB0eXBlLgotICBpbnQgYSA9IDI7Ci0gIGludCBiID0gLTY7Ci0gIE1hdGNoZXI8aW50Jj4gbTIgPSBBPGludCY+KCk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoYSkpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKGIpKTsKLX0KLQotVEVTVChBVGVzdCwgV29ya3NGb3JEZXJpdmVkQ2xhc3MpIHsKLSAgQmFzZSBiYXNlOwotICBEZXJpdmVkIGRlcml2ZWQ7Ci0gIEVYUEVDVF9USEFUKCZiYXNlLCBBPEJhc2UqPigpKTsKLSAgLy8gVGhpcyBzaG91bGRuJ3QgY29tcGlsZTogRVhQRUNUX1RIQVQoJmJhc2UsIEE8RGVyaXZlZCo+KCkpOwotICBFWFBFQ1RfVEhBVCgmZGVyaXZlZCwgQTxCYXNlKj4oKSk7Ci0gIEVYUEVDVF9USEFUKCZkZXJpdmVkLCBBPERlcml2ZWQqPigpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBPFQ+KCkgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoQVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBFWFBFQ1RfRVEoImlzIGFueXRoaW5nIiwgRGVzY3JpYmUoQTxib29sPigpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQW48VD4oKSBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0eXBlIFQuCi1URVNUKEFuVGVzdCwgTWF0Y2hlc0FueVZhbHVlKSB7Ci0gIC8vIFRlc3RzIGEgbWF0Y2hlciBmb3IgYSB2YWx1ZSB0eXBlLgotICBNYXRjaGVyPGludD4gbTEgPSBBbjxpbnQ+KCk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoOTE0MykpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKC0xNTMyKSk7Ci0KLSAgLy8gVGVzdHMgYSBtYXRjaGVyIGZvciBhIHJlZmVyZW5jZSB0eXBlLgotICBpbnQgYSA9IDI7Ci0gIGludCBiID0gLTY7Ci0gIE1hdGNoZXI8aW50Jj4gbTIgPSBBbjxpbnQmPigpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKGEpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQW48VD4oKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChBblRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBFWFBFQ1RfRVEoImlzIGFueXRoaW5nIiwgRGVzY3JpYmUoQW48aW50PigpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgXyBjYW4gYmUgdXNlZCBhcyBhIG1hdGNoZXIgZm9yIGFueSB0eXBlIGFuZCBtYXRjaGVzIGFueQotLy8gdmFsdWUgb2YgdGhhdCB0eXBlLgotVEVTVChVbmRlcnNjb3JlVGVzdCwgTWF0Y2hlc0FueVZhbHVlKSB7Ci0gIC8vIFVzZXMgXyBhcyBhIG1hdGNoZXIgZm9yIGEgdmFsdWUgdHlwZS4KLSAgTWF0Y2hlcjxpbnQ+IG0xID0gXzsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygxMjMpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygtMjQyKSk7Ci0KLSAgLy8gVXNlcyBfIGFzIGEgbWF0Y2hlciBmb3IgYSByZWZlcmVuY2UgdHlwZS4KLSAgYm9vbCBhID0gZmFsc2U7Ci0gIGNvbnN0IGJvb2wgYiA9IHRydWU7Ci0gIE1hdGNoZXI8Y29uc3QgYm9vbCY+IG0yID0gXzsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhhKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoYikpOwotfQotCi0vLyBUZXN0cyB0aGF0IF8gZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoVW5kZXJzY29yZVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGludD4gbSA9IF87Ci0gIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRXEoeCkgbWF0Y2hlcyBhbnkgdmFsdWUgZXF1YWwgdG8geC4KLVRFU1QoRXFUZXN0LCBNYXRjaGVzRXF1YWxWYWx1ZSkgewotICAvLyAyIEMtc3RyaW5ncyB3aXRoIHNhbWUgY29udGVudCBidXQgZGlmZmVyZW50IGFkZHJlc3Nlcy4KLSAgY29uc3QgY2hhciBhMVtdID0gImhpIjsKLSAgY29uc3QgY2hhciBhMltdID0gImhpIjsKLQotICBNYXRjaGVyPGNvbnN0IGNoYXIqPiBtMSA9IEVxKGExKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhhMSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhhMikpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVxKHYpIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCi0KLWNsYXNzIFVucHJpbnRhYmxlIHsKLSBwdWJsaWM6Ci0gIFVucHJpbnRhYmxlKCkgOiBjXygnYScpIHt9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVucHJpbnRhYmxlJiAvKiByaHMgKi8pIHsgcmV0dXJuIHRydWU7IH0KLSBwcml2YXRlOgotICBjaGFyIGNfOwotfTsKLQotVEVTVChFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPFVucHJpbnRhYmxlPiBtID0gRXEoVW5wcmludGFibGUoKSk7Ci0gIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gMS1ieXRlIG9iamVjdCA8NjE+IiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVxKHYpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMKLS8vIGNvbXBhcmluZyB3aXRoIHR5cGUgVCwgd2hlcmUgVCBpcyB2J3MgdHlwZS4KLVRFU1QoRXFUZXN0LCBJc1BvbHltb3JwaGljKSB7Ci0gIE1hdGNoZXI8aW50PiBtMSA9IEVxKDEpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoMikpOwotCi0gIE1hdGNoZXI8Y2hhcj4gbTIgPSBFcSgxKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygnXDEnKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCdhJykpOwotfQotCi0vLyBUZXN0cyB0aGF0IFR5cGVkRXE8VD4odikgbWF0Y2hlcyB2YWx1ZXMgb2YgdHlwZSBUIHRoYXQncyBlcXVhbCB0byB2LgotVEVTVChUeXBlZEVxVGVzdCwgQ2hlY2tzRXF1YWxpdHlGb3JHaXZlblR5cGUpIHsKLSAgTWF0Y2hlcjxjaGFyPiBtMSA9IFR5cGVkRXE8Y2hhcj4oJ2EnKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygnYScpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoJ2InKSk7Ci0KLSAgTWF0Y2hlcjxpbnQ+IG0yID0gVHlwZWRFcTxpbnQ+KDYpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDYpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoNykpOwotfQotCi0vLyBUZXN0cyB0aGF0IFR5cGVkRXEodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoVHlwZWRFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIDIiLCBEZXNjcmliZShUeXBlZEVxPGludD4oMikpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBUeXBlZEVxPFQ+KHYpIGhhcyB0eXBlIE1hdGNoZXI8VD4uCi0KLS8vIFR5cGU8VD46OklzVHlwZU9mKHYpIGNvbXBpbGVzIGlmZiB0aGUgdHlwZSBvZiB2YWx1ZSB2IGlzIFQsIHdoZXJlIFQKLS8vIGlzIGEgImJhcmUiIHR5cGUgKGkuZS4gbm90IGluIHRoZSBmb3JtIG9mIGNvbnN0IFUgb3IgVSYpLiAgSWYgdidzCi0vLyB0eXBlIGlzIG5vdCBULCB0aGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhIG1lc3NhZ2UgYWJvdXQKLS8vICJ1bmRlZmluZWQgcmVmZXJlY2UiLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgVHlwZSB7Ci0gIHN0YXRpYyBib29sIElzVHlwZU9mKGNvbnN0IFQmIC8qIHYgKi8pIHsgcmV0dXJuIHRydWU7IH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDI+Ci0gIHN0YXRpYyB2b2lkIElzVHlwZU9mKFQyIHYpOwotfTsKLQotVEVTVChUeXBlZEVxVGVzdCwgSGFzU3BlY2lmaWVkVHlwZSkgewotICAvLyBWZXJmaWVzIHRoYXQgdGhlIHR5cGUgb2YgVHlwZWRFcTxUPih2KSBpcyBNYXRjaGVyPFQ+LgotICBUeXBlPE1hdGNoZXI8aW50PiA+OjpJc1R5cGVPZihUeXBlZEVxPGludD4oNSkpOwotICBUeXBlPE1hdGNoZXI8ZG91YmxlPiA+OjpJc1R5cGVPZihUeXBlZEVxPGRvdWJsZT4oNSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdlKHYpIG1hdGNoZXMgYW55dGhpbmcgPj0gdi4KLVRFU1QoR2VUZXN0LCBJbXBsZW1lbnRzR3JlYXRlclRoYW5PckVxdWFsKSB7Ci0gIE1hdGNoZXI8aW50PiBtMSA9IEdlKDApOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKC0xKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR2UodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoR2VUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBHZSg1KTsKLSAgRVhQRUNUX0VRKCJpcyA+PSA1IiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEd0KHYpIG1hdGNoZXMgYW55dGhpbmcgPiB2LgotVEVTVChHdFRlc3QsIEltcGxlbWVudHNHcmVhdGVyVGhhbikgewotICBNYXRjaGVyPGRvdWJsZT4gbTEgPSBHdCgwKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygxLjApKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoMC4wKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKC0xLjApKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBHdCh2KSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChHdFRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGludD4gbSA9IEd0KDUpOwotICBFWFBFQ1RfRVEoImlzID4gNSIsIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBMZSh2KSBtYXRjaGVzIGFueXRoaW5nIDw9IHYuCi1URVNUKExlVGVzdCwgSW1wbGVtZW50c0xlc3NUaGFuT3JFcXVhbCkgewotICBNYXRjaGVyPGNoYXI+IG0xID0gTGUoJ2InKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygnYScpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygnYicpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoJ2MnKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTGUodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoTGVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBMZSg1KTsKLSAgRVhQRUNUX0VRKCJpcyA8PSA1IiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEx0KHYpIG1hdGNoZXMgYW55dGhpbmcgPCB2LgotVEVTVChMdFRlc3QsIEltcGxlbWVudHNMZXNzVGhhbikgewotICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0xID0gTHQoIkhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoIkFiYyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygiSGVsbG8sIHdvcmxkISIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBMdCh2KSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChMdFRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGludD4gbSA9IEx0KDUpOwotICBFWFBFQ1RfRVEoImlzIDwgNSIsIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBOZSh2KSBtYXRjaGVzIGFueXRoaW5nICE9IHYuCi1URVNUKE5lVGVzdCwgSW1wbGVtZW50c05vdEVxdWFsKSB7Ci0gIE1hdGNoZXI8aW50PiBtMSA9IE5lKDApOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygtMSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygwKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTmUodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoTmVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBOZSg1KTsKLSAgRVhQRUNUX0VRKCJpc24ndCBlcXVhbCB0byA1IiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzTnVsbCgpIG1hdGNoZXMgYW55IE5VTEwgcG9pbnRlciBvZiBhbnkgdHlwZS4KLVRFU1QoSXNOdWxsVGVzdCwgTWF0Y2hlc051bGxQb2ludGVyKSB7Ci0gIE1hdGNoZXI8aW50Kj4gbTEgPSBJc051bGwoKTsKLSAgaW50KiBwMSA9IE5VTEw7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhwMSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygmbikpOwotCi0gIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0yID0gSXNOdWxsKCk7Ci0gIGNvbnN0IGNoYXIqIHAyID0gTlVMTDsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhwMikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiaGkiKSk7Ci0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTgotICAvLyBOb2tpYSdzIFN5bWJpYW4gY29tcGlsZXIgZ2VuZXJhdGVzOgotICAvLyBnbW9jay1tYXRjaGVycy5oOiBhbWJpZ3VvdXMgYWNjZXNzIHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24KLSAgLy8gZ21vY2stbWF0Y2hlcnMuaDogJ3Rlc3Rpbmc6Ok1hdGNoZXI8dm9pZCAqPjo6TWF0Y2hlcih2b2lkICopJwotICAvLyBnbW9jay1tYXRjaGVycy5oOiAndGVzdGluZzo6TWF0Y2hlcjx2b2lkICo+OjpNYXRjaGVyKGNvbnN0IHRlc3Rpbmc6OgotICAvLyAgICAgTWF0Y2hlckludGVyZmFjZTx2b2lkICo+ICopJwotICAvLyBnbW9jay1tYXRjaGVycy5oOiAgKHBvaW50IG9mIGluc3RhbnRpYXRpb246ICd0ZXN0aW5nOjoKLSAgLy8gICAgIGdtb2NrX21hdGNoZXJzX3Rlc3Q6OklzTnVsbFRlc3RfTWF0Y2hlc051bGxQb2ludGVyX1Rlc3Q6OlRlc3RCb2R5KCknKQotICAvLyBnbW9jay1tYXRjaGVycy5oOiAgIChpbnN0YW50aWF0aW5nOiAndGVzdGluZzo6UG9seW1vcnBoaWNNYXRjCi0gIE1hdGNoZXI8dm9pZCo+IG0zID0gSXNOdWxsKCk7Ci0gIHZvaWQqIHAzID0gTlVMTDsKLSAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhwMykpOwotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhyZWludGVycHJldF9jYXN0PHZvaWQqPigweGJlZWYpKSk7Ci0jZW5kaWYKLX0KLQotVEVTVChJc051bGxUZXN0LCBMaW5rZWRQdHIpIHsKLSAgY29uc3QgTWF0Y2hlcjxsaW5rZWRfcHRyPGludD4gPiBtID0gSXNOdWxsKCk7Ci0gIGNvbnN0IGxpbmtlZF9wdHI8aW50PiBudWxsX3A7Ci0gIGNvbnN0IGxpbmtlZF9wdHI8aW50PiBub25fbnVsbF9wKG5ldyBpbnQpOwotCi0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhudWxsX3ApKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhub25fbnVsbF9wKSk7Ci19Ci0KLVRFU1QoSXNOdWxsVGVzdCwgUmVmZXJlbmNlVG9Db25zdExpbmtlZFB0cikgewotICBjb25zdCBNYXRjaGVyPGNvbnN0IGxpbmtlZF9wdHI8ZG91YmxlPiY+IG0gPSBJc051bGwoKTsKLSAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG51bGxfcDsKLSAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG5vbl9udWxsX3AobmV3IGRvdWJsZSk7Ci0KLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG51bGxfcCkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5vbl9udWxsX3ApKTsKLX0KLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLVRFU1QoSXNOdWxsVGVzdCwgU3RkRnVuY3Rpb24pIHsKLSAgY29uc3QgTWF0Y2hlcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+IG0gPSBJc051bGwoKTsKLQotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoc3RkOjpmdW5jdGlvbjx2b2lkKCk+KCkpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhbXXt9KSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLQotLy8gVGVzdHMgdGhhdCBJc051bGwoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChJc051bGxUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxpbnQqPiBtID0gSXNOdWxsKCk7Ci0gIEVYUEVDVF9FUSgiaXMgTlVMTCIsIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBOVUxMIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTm90TnVsbCgpIG1hdGNoZXMgYW55IG5vbi1OVUxMIHBvaW50ZXIgb2YgYW55IHR5cGUuCi1URVNUKE5vdE51bGxUZXN0LCBNYXRjaGVzTm9uTnVsbFBvaW50ZXIpIHsKLSAgTWF0Y2hlcjxpbnQqPiBtMSA9IE5vdE51bGwoKTsKLSAgaW50KiBwMSA9IE5VTEw7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMocDEpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygmbikpOwotCi0gIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0yID0gTm90TnVsbCgpOwotICBjb25zdCBjaGFyKiBwMiA9IE5VTEw7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKHAyKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImhpIikpOwotfQotCi1URVNUKE5vdE51bGxUZXN0LCBMaW5rZWRQdHIpIHsKLSAgY29uc3QgTWF0Y2hlcjxsaW5rZWRfcHRyPGludD4gPiBtID0gTm90TnVsbCgpOwotICBjb25zdCBsaW5rZWRfcHRyPGludD4gbnVsbF9wOwotICBjb25zdCBsaW5rZWRfcHRyPGludD4gbm9uX251bGxfcChuZXcgaW50KTsKLQotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG51bGxfcCkpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobm9uX251bGxfcCkpOwotfQotCi1URVNUKE5vdE51bGxUZXN0LCBSZWZlcmVuY2VUb0NvbnN0TGlua2VkUHRyKSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgbGlua2VkX3B0cjxkb3VibGU+Jj4gbSA9IE5vdE51bGwoKTsKLSAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG51bGxfcDsKLSAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG5vbl9udWxsX3AobmV3IGRvdWJsZSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhudWxsX3ApKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5vbl9udWxsX3ApKTsKLX0KLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLVRFU1QoTm90TnVsbFRlc3QsIFN0ZEZ1bmN0aW9uKSB7Ci0gIGNvbnN0IE1hdGNoZXI8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBtID0gTm90TnVsbCgpOwotCi0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhbXXt9KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoc3RkOjpmdW5jdGlvbjx2b2lkKCk+KCkpKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi0vLyBUZXN0cyB0aGF0IE5vdE51bGwoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChOb3ROdWxsVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8aW50Kj4gbSA9IE5vdE51bGwoKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBOVUxMIiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJlZih2YXJpYWJsZSkgbWF0Y2hlcyBhbiBhcmd1bWVudCB0aGF0IHJlZmVyZW5jZXMKLS8vICd2YXJpYWJsZScuCi1URVNUKFJlZlRlc3QsIE1hdGNoZXNTYW1lVmFyaWFibGUpIHsKLSAgaW50IGEgPSAwOwotICBpbnQgYiA9IDA7Ci0gIE1hdGNoZXI8aW50Jj4gbSA9IFJlZihhKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVmKHZhcmlhYmxlKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChSZWZUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgaW50IG4gPSA1OwotICBNYXRjaGVyPGludCY+IG0gPSBSZWYobik7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgInJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlIEAiIDw8ICZuIDw8ICIgNSI7Ci0gIEVYUEVDVF9FUShzdHJpbmcoc3Muc3RyKCkpLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCBSZWYobm9uX2NvbnN0X3ZhcmlhbGJlKSBjYW4gYmUgdXNlZCBhcyBhIG1hdGNoZXIgZm9yIGEKLS8vIGNvbnN0IHJlZmVyZW5jZS4KLVRFU1QoUmVmVGVzdCwgQ2FuQmVVc2VkQXNNYXRjaGVyRm9yQ29uc3RSZWZlcmVuY2UpIHsKLSAgaW50IGEgPSAwOwotICBpbnQgYiA9IDA7Ci0gIE1hdGNoZXI8Y29uc3QgaW50Jj4gbSA9IFJlZihhKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVmKHZhcmlhYmxlKSBpcyBjb3ZhcmlhbnQsIGkuZS4gUmVmKGRlcml2ZWQpIGNhbiBiZQotLy8gdXNlZCB3aGVyZXZlciBSZWYoYmFzZSkgY2FuIGJlIHVzZWQgKFJlZihkZXJpdmVkKSBpcyBhIHN1Yi10eXBlCi0vLyBvZiBSZWYoYmFzZSksIGJ1dCBub3QgdmljZSB2ZXJzYS4KLQotVEVTVChSZWZUZXN0LCBJc0NvdmFyaWFudCkgewotICBCYXNlIGJhc2UsIGJhc2UyOwotICBEZXJpdmVkIGRlcml2ZWQ7Ci0gIE1hdGNoZXI8Y29uc3QgQmFzZSY+IG0xID0gUmVmKGJhc2UpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGJhc2UpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoYmFzZTIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoZGVyaXZlZCkpOwotCi0gIG0xID0gUmVmKGRlcml2ZWQpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGRlcml2ZWQpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoYmFzZSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhiYXNlMikpOwotfQotCi1URVNUKFJlZlRlc3QsIEV4cGxhaW5zUmVzdWx0KSB7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX1RIQVQoRXhwbGFpbihNYXRjaGVyPGNvbnN0IGludCY+KFJlZihuKSksIG4pLAotICAgICAgICAgICAgICBTdGFydHNXaXRoKCJ3aGljaCBpcyBsb2NhdGVkIEAiKSk7Ci0KLSAgaW50IG0gPSAwOwotICBFWFBFQ1RfVEhBVChFeHBsYWluKE1hdGNoZXI8Y29uc3QgaW50Jj4oUmVmKG4pKSwgbSksCi0gICAgICAgICAgICAgIFN0YXJ0c1dpdGgoIndoaWNoIGlzIGxvY2F0ZWQgQCIpKTsKLX0KLQotLy8gVGVzdHMgc3RyaW5nIGNvbXBhcmlzb24gbWF0Y2hlcnMuCi0KLVRFU1QoU3RyRXFUZXN0LCBNYXRjaGVzRXF1YWxTdHJpbmcpIHsKLSAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFN0ckVxKHN0cmluZygiSGVsbG8iKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygiSGVsbG8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoImhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKLQotICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gU3RyRXEoIkhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGkiKSk7Ci19Ci0KLVRFU1QoU3RyRXFUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxzdHJpbmc+IG0gPSBTdHJFcSgiSGktXCdcIj9cXFxhXGJcZlxuXHJcdFx2XHhEMyIpOwotICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIFwiSGktXCdcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXHhEM1wiIiwKLSAgICAgIERlc2NyaWJlKG0pKTsKLQotICBzdHJpbmcgc3RyKCIwMTIwNDUwMDgwMCIpOwotICBzdHJbM10gPSAnXDAnOwotICBNYXRjaGVyPHN0cmluZz4gbTIgPSBTdHJFcShzdHIpOwotICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIFwiMDEyXFwwNDUwMDgwMFwiIiwgRGVzY3JpYmUobTIpKTsKLSAgc3RyWzBdID0gc3RyWzZdID0gc3RyWzddID0gc3RyWzldID0gc3RyWzEwXSA9ICdcMCc7Ci0gIE1hdGNoZXI8c3RyaW5nPiBtMyA9IFN0ckVxKHN0cik7Ci0gIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gXCJcXDAxMlxcMDQ1XFwwXFwwOFxcMFxcMFwiIiwgRGVzY3JpYmUobTMpKTsKLX0KLQotVEVTVChTdHJOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nKSB7Ci0gIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0gPSBTdHJOZSgiSGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCIiKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoIkhlbGxvIikpOwotCi0gIE1hdGNoZXI8c3RyaW5nPiBtMiA9IFN0ck5lKHN0cmluZygiSGVsbG8iKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGVsbG8iKSk7Ci19Ci0KLVRFU1QoU3RyTmVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFN0ck5lKCJIaSIpOwotICBFWFBFQ1RfRVEoImlzbid0IGVxdWFsIHRvIFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKLX0KLQotVEVTVChTdHJDYXNlRXFUZXN0LCBNYXRjaGVzRXF1YWxTdHJpbmdJZ25vcmluZ0Nhc2UpIHsKLSAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFN0ckNhc2VFcShzdHJpbmcoIkhlbGxvIikpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoIkhlbGxvIikpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoImhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCJIaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcSgiSGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiaGVsbG8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJIaSIpKTsKLX0KLQotVEVTVChTdHJDYXNlRXFUZXN0LCBNYXRjaGVzRXF1YWxTdHJpbmdXaXRoMElnbm9yaW5nQ2FzZSkgewotICBzdHJpbmcgc3RyMSgib2Fib2Nkb29lb28iKTsKLSAgc3RyaW5nIHN0cjIoIk9BQk9DRE9PRU9PIik7Ci0gIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTAgPSBTdHJDYXNlRXEoc3RyMSk7Ci0gIEVYUEVDVF9GQUxTRShtMC5NYXRjaGVzKHN0cjIgKyBzdHJpbmcoMSwgJ1wwJykpKTsKLQotICBzdHIxWzNdID0gc3RyMlszXSA9ICdcMCc7Ci0gIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTEgPSBTdHJDYXNlRXEoc3RyMSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoc3RyMikpOwotCi0gIHN0cjFbMF0gPSBzdHIxWzZdID0gc3RyMVs3XSA9IHN0cjFbMTBdID0gJ1wwJzsKLSAgc3RyMlswXSA9IHN0cjJbNl0gPSBzdHIyWzddID0gc3RyMlsxMF0gPSAnXDAnOwotICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gU3RyQ2FzZUVxKHN0cjEpOwotICBzdHIxWzldID0gc3RyMls5XSA9ICdcMCc7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKHN0cjIpKTsKLQotICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0zID0gU3RyQ2FzZUVxKHN0cjEpOwotICBFWFBFQ1RfVFJVRShtMy5NYXRjaGVzKHN0cjIpKTsKLQotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhzdHIyICsgIngiKSk7Ci0gIHN0cjIuYXBwZW5kKDEsICdcMCcpOwotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhzdHIyKSk7Ci0gIEVYUEVDVF9GQUxTRShtMy5NYXRjaGVzKHN0cmluZyhzdHIyLCAwLCA5KSkpOwotfQotCi1URVNUKFN0ckNhc2VFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPHN0cmluZz4gbSA9IFN0ckNhc2VFcSgiSGkiKTsKLSAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byAoaWdub3JpbmcgY2FzZSkgXCJIaVwiIiwgRGVzY3JpYmUobSkpOwotfQotCi1URVNUKFN0ckNhc2VOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7Ci0gIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0gPSBTdHJDYXNlTmUoIkhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygiSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCJoZWxsbyIpKTsKLQotICBNYXRjaGVyPHN0cmluZz4gbTIgPSBTdHJDYXNlTmUoc3RyaW5nKCJIZWxsbyIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGVsbG8iKSk7Ci19Ci0KLVRFU1QoU3RyQ2FzZU5lVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0gPSBTdHJDYXNlTmUoIkhpIik7Ci0gIEVYUEVDVF9FUSgiaXNuJ3QgZXF1YWwgdG8gKGlnbm9yaW5nIGNhc2UpIFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgc3RyaW5nLXR5cGVkIHZhbHVlcy4KLVRFU1QoSGFzU3Vic3RyVGVzdCwgV29ya3NGb3JTdHJpbmdDbGFzc2VzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8c3RyaW5nPiBtMSA9IEhhc1N1YnN0cigiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoc3RyaW5nKCJJIGxvdmUgZm9vZC4iKSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhzdHJpbmcoInRvZm8iKSkpOwotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmcmPiBtMiA9IEhhc1N1YnN0cigiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoc3RkOjpzdHJpbmcoIkkgbG92ZSBmb29kLiIpKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKHN0ZDo6c3RyaW5nKCJ0b2ZvIikpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgQy1zdHJpbmctdHlwZWQgdmFsdWVzLgotVEVTVChIYXNTdWJzdHJUZXN0LCBXb3Jrc0ZvckNTdHJpbmdzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y2hhcio+IG0xID0gSGFzU3Vic3RyKCJmb28iKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhjb25zdF9jYXN0PGNoYXIqPigiSSBsb3ZlIGZvb2QuIikpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoY29uc3RfY2FzdDxjaGFyKj4oInRvZm8iKSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTIgPSBIYXNTdWJzdHIoImZvbyIpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJJIGxvdmUgZm9vZC4iKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJ0b2ZvIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhOVUxMKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgSGFzU3Vic3RyKHMpIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCi1URVNUKEhhc1N1YnN0clRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPHN0cmluZz4gbSA9IEhhc1N1YnN0cigiZm9vXG5cIiIpOwotICBFWFBFQ1RfRVEoImhhcyBzdWJzdHJpbmcgXCJmb29cXG5cXFwiXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoS2V5VGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3QgcGFpcjxzdGQ6OnN0cmluZywgaW50PiY+IG0gPSBLZXkoImZvbyIpOwotICBFWFBFQ1RfRVEoImhhcyBhIGtleSB0aGF0IGlzIGVxdWFsIHRvIFwiZm9vXCIiLCBEZXNjcmliZShtKSk7Ci0gIEVYUEVDVF9FUSgiZG9lc24ndCBoYXZlIGEga2V5IHRoYXQgaXMgZXF1YWwgdG8gXCJmb29cIiIsIERlc2NyaWJlTmVnYXRpb24obSkpOwotfQotCi1URVNUKEtleVRlc3QsIEV4cGxhaW5zUmVzdWx0KSB7Ci0gIE1hdGNoZXI8cGFpcjxpbnQsIGJvb2w+ID4gbSA9IEtleShHcmVhdGVyVGhhbigxMCkpOwotICBFWFBFQ1RfRVEoIndob3NlIGZpcnN0IGZpZWxkIGlzIGEgdmFsdWUgd2hpY2ggaXMgNSBsZXNzIHRoYW4gMTAiLAotICAgICAgICAgICAgRXhwbGFpbihtLCBtYWtlX3BhaXIoNSwgdHJ1ZSkpKTsKLSAgRVhQRUNUX0VRKCJ3aG9zZSBmaXJzdCBmaWVsZCBpcyBhIHZhbHVlIHdoaWNoIGlzIDUgbW9yZSB0aGFuIDEwIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV9wYWlyKDE1LCB0cnVlKSkpOwotfQotCi1URVNUKEtleVRlc3QsIE1hdGNoZXNDb3JyZWN0bHkpIHsKLSAgcGFpcjxpbnQsIHN0ZDo6c3RyaW5nPiBwKDI1LCAiZm9vIik7Ci0gIEVYUEVDVF9USEFUKHAsIEtleSgyNSkpOwotICBFWFBFQ1RfVEhBVChwLCBOb3QoS2V5KDQyKSkpOwotICBFWFBFQ1RfVEhBVChwLCBLZXkoR2UoMjApKSk7Ci0gIEVYUEVDVF9USEFUKHAsIE5vdChLZXkoTHQoMjUpKSkpOwotfQotCi1URVNUKEtleVRlc3QsIFNhZmVseUNhc3RzSW5uZXJNYXRjaGVyKSB7Ci0gIE1hdGNoZXI8aW50PiBpc19wb3NpdGl2ZSA9IEd0KDApOwotICBNYXRjaGVyPGludD4gaXNfbmVnYXRpdmUgPSBMdCgwKTsKLSAgcGFpcjxjaGFyLCBib29sPiBwKCdhJywgdHJ1ZSk7Ci0gIEVYUEVDVF9USEFUKHAsIEtleShpc19wb3NpdGl2ZSkpOwotICBFWFBFQ1RfVEhBVChwLCBOb3QoS2V5KGlzX25lZ2F0aXZlKSkpOwotfQotCi1URVNUKEtleVRlc3QsIEluc2lkZUNvbnRhaW5zVXNpbmdNYXApIHsKLSAgbWFwPGludCwgY2hhcj4gY29udGFpbmVyOwotICBjb250YWluZXIuaW5zZXJ0KG1ha2VfcGFpcigxLCAnYScpKTsKLSAgY29udGFpbmVyLmluc2VydChtYWtlX3BhaXIoMiwgJ2InKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDQsICdjJykpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIENvbnRhaW5zKEtleSgxKSkpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChDb250YWlucyhLZXkoMykpKSk7Ci19Ci0KLVRFU1QoS2V5VGVzdCwgSW5zaWRlQ29udGFpbnNVc2luZ011bHRpbWFwKSB7Ci0gIG11bHRpbWFwPGludCwgY2hhcj4gY29udGFpbmVyOwotICBjb250YWluZXIuaW5zZXJ0KG1ha2VfcGFpcigxLCAnYScpKTsKLSAgY29udGFpbmVyLmluc2VydChtYWtlX3BhaXIoMiwgJ2InKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDQsICdjJykpOwotCi0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KENvbnRhaW5zKEtleSgyNSkpKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDI1LCAnZCcpKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhLZXkoMjUpKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDI1LCAnZScpKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhLZXkoMjUpKSk7Ci0KLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhLZXkoMSkpKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoQ29udGFpbnMoS2V5KDMpKSkpOwotfQotCi1URVNUKFBhaXJUZXN0LCBUeXBpbmcpIHsKLSAgLy8gVGVzdCB2ZXJpZmllcyB0aGUgZm9sbG93aW5nIHR5cGUgY29udmVyc2lvbnMgY2FuIGJlIGNvbXBpbGVkLgotICBNYXRjaGVyPGNvbnN0IHBhaXI8Y29uc3QgY2hhciosIGludD4mPiBtMSA9IFBhaXIoImZvbyIsIDQyKTsKLSAgTWF0Y2hlcjxjb25zdCBwYWlyPGNvbnN0IGNoYXIqLCBpbnQ+ID4gbTIgPSBQYWlyKCJmb28iLCA0Mik7Ci0gIE1hdGNoZXI8cGFpcjxjb25zdCBjaGFyKiwgaW50PiA+IG0zID0gUGFpcigiZm9vIiwgNDIpOwotCi0gIE1hdGNoZXI8cGFpcjxpbnQsIGNvbnN0IHN0ZDo6c3RyaW5nPiA+IG00ID0gUGFpcigyNSwgIjQyIik7Ci0gIE1hdGNoZXI8cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgaW50PiA+IG01ID0gUGFpcigiMjUiLCA0Mik7Ci19Ci0KLVRFU1QoUGFpclRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IHBhaXI8c3RkOjpzdHJpbmcsIGludD4mPiBtMSA9IFBhaXIoImZvbyIsIDQyKTsKLSAgRVhQRUNUX0VRKCJoYXMgYSBmaXJzdCBmaWVsZCB0aGF0IGlzIGVxdWFsIHRvIFwiZm9vXCIiCi0gICAgICAgICAgICAiLCBhbmQgaGFzIGEgc2Vjb25kIGZpZWxkIHRoYXQgaXMgZXF1YWwgdG8gNDIiLAotICAgICAgICAgICAgRGVzY3JpYmUobTEpKTsKLSAgRVhQRUNUX0VRKCJoYXMgYSBmaXJzdCBmaWVsZCB0aGF0IGlzbid0IGVxdWFsIHRvIFwiZm9vXCIiCi0gICAgICAgICAgICAiLCBvciBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCBpc24ndCBlcXVhbCB0byA0MiIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7Ci0gIC8vIERvdWJsZSBhbmQgdHJpcGxlIG5lZ2F0aW9uICgxIG9yIDIgdGltZXMgbm90IGFuZCBkZXNjcmlwdGlvbiBvZiBuZWdhdGlvbikuCi0gIE1hdGNoZXI8Y29uc3QgcGFpcjxpbnQsIGludD4mPiBtMiA9IE5vdChQYWlyKE5vdCgxMyksIDQyKSk7Ci0gIEVYUEVDVF9FUSgiaGFzIGEgZmlyc3QgZmllbGQgdGhhdCBpc24ndCBlcXVhbCB0byAxMyIKLSAgICAgICAgICAgICIsIGFuZCBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCBpcyBlcXVhbCB0byA0MiIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0yKSk7Ci19Ci0KLVRFU1QoUGFpclRlc3QsIENhbkV4cGxhaW5NYXRjaFJlc3VsdFRvKSB7Ci0gIC8vIElmIG5laXRoZXIgZmllbGQgbWF0Y2hlcywgUGFpcigpIHNob3VsZCBleHBsYWluIGFib3V0IHRoZSBmaXJzdAotICAvLyBmaWVsZC4KLSAgY29uc3QgTWF0Y2hlcjxwYWlyPGludCwgaW50PiA+IG0gPSBQYWlyKEdyZWF0ZXJUaGFuKDApLCBHcmVhdGVyVGhhbigwKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZmlyc3QgZmllbGQgZG9lcyBub3QgbWF0Y2gsIHdoaWNoIGlzIDEgbGVzcyB0aGFuIDAiLAotICAgICAgICAgICAgRXhwbGFpbihtLCBtYWtlX3BhaXIoLTEsIC0yKSkpOwotCi0gIC8vIElmIHRoZSBmaXJzdCBmaWVsZCBtYXRjaGVzIGJ1dCB0aGUgc2Vjb25kIGRvZXNuJ3QsIFBhaXIoKSBzaG91bGQKLSAgLy8gZXhwbGFpbiBhYm91dCB0aGUgc2Vjb25kIGZpZWxkLgotICBFWFBFQ1RfRVEoIndob3NlIHNlY29uZCBmaWVsZCBkb2VzIG5vdCBtYXRjaCwgd2hpY2ggaXMgMiBsZXNzIHRoYW4gMCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfcGFpcigxLCAtMikpKTsKLQotICAvLyBJZiB0aGUgZmlyc3QgZmllbGQgZG9lc24ndCBtYXRjaCBidXQgdGhlIHNlY29uZCBkb2VzLCBQYWlyKCkKLSAgLy8gc2hvdWxkIGV4cGxhaW4gYWJvdXQgdGhlIGZpcnN0IGZpZWxkLgotICBFWFBFQ1RfRVEoIndob3NlIGZpcnN0IGZpZWxkIGRvZXMgbm90IG1hdGNoLCB3aGljaCBpcyAxIGxlc3MgdGhhbiAwIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV9wYWlyKC0xLCAyKSkpOwotCi0gIC8vIElmIGJvdGggZmllbGRzIG1hdGNoLCBQYWlyKCkgc2hvdWxkIGV4cGxhaW4gYWJvdXQgdGhlbSBib3RoLgotICBFWFBFQ1RfRVEoIndob3NlIGJvdGggZmllbGRzIG1hdGNoLCB3aGVyZSB0aGUgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiCi0gICAgICAgICAgICAid2hpY2ggaXMgMSBtb3JlIHRoYW4gMCwgYW5kIHRoZSBzZWNvbmQgZmllbGQgaXMgYSB2YWx1ZSAiCi0gICAgICAgICAgICAid2hpY2ggaXMgMiBtb3JlIHRoYW4gMCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfcGFpcigxLCAyKSkpOwotCi0gIC8vIElmIG9ubHkgdGhlIGZpcnN0IG1hdGNoIGhhcyBhbiBleHBsYW5hdGlvbiwgb25seSB0aGlzIGV4cGxhbmF0aW9uIHNob3VsZAotICAvLyBiZSBwcmludGVkLgotICBjb25zdCBNYXRjaGVyPHBhaXI8aW50LCBpbnQ+ID4gZXhwbGFpbl9maXJzdCA9IFBhaXIoR3JlYXRlclRoYW4oMCksIDApOwotICBFWFBFQ1RfRVEoIndob3NlIGJvdGggZmllbGRzIG1hdGNoLCB3aGVyZSB0aGUgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiCi0gICAgICAgICAgICAid2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCi0gICAgICAgICAgICBFeHBsYWluKGV4cGxhaW5fZmlyc3QsIG1ha2VfcGFpcigxLCAwKSkpOwotCi0gIC8vIElmIG9ubHkgdGhlIHNlY29uZCBtYXRjaCBoYXMgYW4gZXhwbGFuYXRpb24sIG9ubHkgdGhpcyBleHBsYW5hdGlvbiBzaG91bGQKLSAgLy8gYmUgcHJpbnRlZC4KLSAgY29uc3QgTWF0Y2hlcjxwYWlyPGludCwgaW50PiA+IGV4cGxhaW5fc2Vjb25kID0gUGFpcigwLCBHcmVhdGVyVGhhbigwKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgYm90aCBmaWVsZHMgbWF0Y2gsIHdoZXJlIHRoZSBzZWNvbmQgZmllbGQgaXMgYSB2YWx1ZSAiCi0gICAgICAgICAgICAid2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCi0gICAgICAgICAgICBFeHBsYWluKGV4cGxhaW5fc2Vjb25kLCBtYWtlX3BhaXIoMCwgMSkpKTsKLX0KLQotVEVTVChQYWlyVGVzdCwgTWF0Y2hlc0NvcnJlY3RseSkgewotICBwYWlyPGludCwgc3RkOjpzdHJpbmc+IHAoMjUsICJmb28iKTsKLQotICAvLyBCb3RoIGZpZWxkcyBtYXRjaC4KLSAgRVhQRUNUX1RIQVQocCwgUGFpcigyNSwgImZvbyIpKTsKLSAgRVhQRUNUX1RIQVQocCwgUGFpcihHZSgyMCksIEhhc1N1YnN0cigibyIpKSk7Ci0KLSAgLy8gJ2ZpcnN0JyBkb2VzbnQnIG1hdGNoLCBidXQgJ3NlY29uZCcgbWF0Y2hlcy4KLSAgRVhQRUNUX1RIQVQocCwgTm90KFBhaXIoNDIsICJmb28iKSkpOwotICBFWFBFQ1RfVEhBVChwLCBOb3QoUGFpcihMdCgyNSksICJmb28iKSkpOwotCi0gIC8vICdmaXJzdCcgbWF0Y2hlcywgYnV0ICdzZWNvbmQnIGRvZXNuJ3QgbWF0Y2guCi0gIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKDI1LCAiYmFyIikpKTsKLSAgRVhQRUNUX1RIQVQocCwgTm90KFBhaXIoMjUsIE5vdCgiZm9vIikpKSk7Ci0KLSAgLy8gTmVpdGhlciBmaWVsZCBtYXRjaGVzLgotICBFWFBFQ1RfVEhBVChwLCBOb3QoUGFpcigxMywgImJhciIpKSk7Ci0gIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKEx0KDEzKSwgSGFzU3Vic3RyKCJhIikpKSk7Ci19Ci0KLVRFU1QoUGFpclRlc3QsIFNhZmVseUNhc3RzSW5uZXJNYXRjaGVycykgewotICBNYXRjaGVyPGludD4gaXNfcG9zaXRpdmUgPSBHdCgwKTsKLSAgTWF0Y2hlcjxpbnQ+IGlzX25lZ2F0aXZlID0gTHQoMCk7Ci0gIHBhaXI8Y2hhciwgYm9vbD4gcCgnYScsIHRydWUpOwotICBFWFBFQ1RfVEhBVChwLCBQYWlyKGlzX3Bvc2l0aXZlLCBfKSk7Ci0gIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKGlzX25lZ2F0aXZlLCBfKSkpOwotICBFWFBFQ1RfVEhBVChwLCBQYWlyKF8sIGlzX3Bvc2l0aXZlKSk7Ci0gIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKF8sIGlzX25lZ2F0aXZlKSkpOwotfQotCi1URVNUKFBhaXJUZXN0LCBJbnNpZGVDb250YWluc1VzaW5nTWFwKSB7Ci0gIG1hcDxpbnQsIGNoYXI+IGNvbnRhaW5lcjsKLSAgY29udGFpbmVyLmluc2VydChtYWtlX3BhaXIoMSwgJ2EnKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDIsICdiJykpOwotICBjb250YWluZXIuaW5zZXJ0KG1ha2VfcGFpcig0LCAnYycpKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhQYWlyKDEsICdhJykpKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhQYWlyKDEsIF8pKSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgQ29udGFpbnMoUGFpcihfLCAnYScpKSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KENvbnRhaW5zKFBhaXIoMywgXykpKSk7Ci19Ci0KLS8vIFRlc3RzIFN0YXJ0c1dpdGgocykuCi0KLVRFU1QoU3RhcnRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5QcmVmaXgpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTEgPSBTdGFydHNXaXRoKHN0cmluZygiIikpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygiIikpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtMiA9IFN0YXJ0c1dpdGgoIkhpIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIkhpIikpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJIaSBIaSEiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIkhpZ2giKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJIIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiIEhpIikpOwotfQotCi1URVNUKFN0YXJ0c1dpdGhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBzdGQ6OnN0cmluZz4gbSA9IFN0YXJ0c1dpdGgoIkhpIik7Ci0gIEVYUEVDVF9FUSgic3RhcnRzIHdpdGggXCJIaVwiIiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyBFbmRzV2l0aChzKS4KLQotVEVTVChFbmRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5TdWZmaXgpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTEgPSBFbmRzV2l0aCgiIik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoIkhpIikpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCIiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKLQotICBjb25zdCBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gRW5kc1dpdGgoc3RyaW5nKCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIldvdyBIaSBIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiU3VwZXIgSGkiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJpIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGkgIikpOwotfQotCi1URVNUKEVuZHNXaXRoVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmc+IG0gPSBFbmRzV2l0aCgiSGkiKTsKLSAgRVhQRUNUX0VRKCJlbmRzIHdpdGggXCJIaVwiIiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyBNYXRjaGVzUmVnZXgoKS4KLQotVEVTVChNYXRjaGVzUmVnZXhUZXN0LCBNYXRjaGVzU3RyaW5nTWF0Y2hpbmdHaXZlblJlZ2V4KSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgY2hhcio+IG0xID0gTWF0Y2hlc1JlZ2V4KCJhLip6Iik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoImF6IikpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJhYmN6IikpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtMiA9IE1hdGNoZXNSZWdleChuZXcgUkUoImEuKnoiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImF6YnoiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJhejEiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCIxYXoiKSk7Ci19Ci0KLVRFU1QoTWF0Y2hlc1JlZ2V4VGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmc+IG0xID0gTWF0Y2hlc1JlZ2V4KHN0cmluZygiSGkuKiIpKTsKLSAgRVhQRUNUX0VRKCJtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBcIkhpLipcIiIsIERlc2NyaWJlKG0xKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTIgPSBNYXRjaGVzUmVnZXgobmV3IFJFKCJhLioiKSk7Ci0gIEVYUEVDVF9FUSgibWF0Y2hlcyByZWd1bGFyIGV4cHJlc3Npb24gXCJhLipcIiIsIERlc2NyaWJlKG0yKSk7Ci19Ci0KLS8vIFRlc3RzIENvbnRhaW5zUmVnZXgoKS4KLQotVEVTVChDb250YWluc1JlZ2V4VGVzdCwgTWF0Y2hlc1N0cmluZ0NvbnRhaW5pbmdHaXZlblJlZ2V4KSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgY2hhcio+IG0xID0gQ29udGFpbnNSZWdleChzdHJpbmcoImEuKnoiKSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoImF6IikpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCIwYWJjejEiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKLQotICBjb25zdCBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gQ29udGFpbnNSZWdleChuZXcgUkUoImEuKnoiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImF6YnoiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImF6MSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoIjFhIikpOwotfQotCi1URVNUKENvbnRhaW5zUmVnZXhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBzdGQ6OnN0cmluZz4gbTEgPSBDb250YWluc1JlZ2V4KCJIaS4qIik7Ci0gIEVYUEVDVF9FUSgiY29udGFpbnMgcmVndWxhciBleHByZXNzaW9uIFwiSGkuKlwiIiwgRGVzY3JpYmUobTEpKTsKLQotICBNYXRjaGVyPGNvbnN0IGNoYXIqPiBtMiA9IENvbnRhaW5zUmVnZXgobmV3IFJFKCJhLioiKSk7Ci0gIEVYUEVDVF9FUSgiY29udGFpbnMgcmVndWxhciBleHByZXNzaW9uIFwiYS4qXCIiLCBEZXNjcmliZShtMikpOwotfQotCi0vLyBUZXN0cyBmb3Igd2lkZSBzdHJpbmdzLgotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotVEVTVChTdGRXaWRlU3RyRXFUZXN0LCBNYXRjaGVzRXF1YWwpIHsKLSAgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbSA9IFN0ckVxKDo6c3RkOjp3c3RyaW5nKEwiSGVsbG8iKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiaGVsbG8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOwotCi0gIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IFN0ckVxKEwiSGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIkhpIikpOwotCi0gIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMyA9IFN0ckVxKEwiXHhEM1x4NTc2XHg4RDNceEM3NEQiKTsKLSAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzREIikpOwotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzRFIikpOwotCi0gIDo6c3RkOjp3c3RyaW5nIHN0cihMIjAxMjA0NTAwODAwIik7Ci0gIHN0clszXSA9IEwnXDAnOwotICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTQgPSBTdHJFcShzdHIpOwotICBFWFBFQ1RfVFJVRShtNC5NYXRjaGVzKHN0cikpOwotICBzdHJbMF0gPSBzdHJbNl0gPSBzdHJbN10gPSBzdHJbOV0gPSBzdHJbMTBdID0gTCdcMCc7Ci0gIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtNSA9IFN0ckVxKHN0cik7Ci0gIEVYUEVDVF9UUlVFKG01Lk1hdGNoZXMoc3RyKSk7Ci19Ci0KLVRFU1QoU3RkV2lkZVN0ckVxVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8IDo6c3RkOjp3c3RyaW5nPiBtID0gU3RyRXEoTCJIaS1cJ1wiP1xcXGFcYlxmXG5cclx0XHYiKTsKLSAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byBMXCJIaS1cJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcclxcdFxcdlwiIiwKLSAgICBEZXNjcmliZShtKSk7Ci0KLSAgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0yID0gU3RyRXEoTCJceEQzXHg1NzZceDhEM1x4Qzc0RCIpOwotICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIExcIlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RFwiIiwKLSAgICBEZXNjcmliZShtMikpOwotCi0gIDo6c3RkOjp3c3RyaW5nIHN0cihMIjAxMjA0NTAwODAwIik7Ci0gIHN0clszXSA9IEwnXDAnOwotICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTQgPSBTdHJFcShzdHIpOwotICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIExcIjAxMlxcMDQ1MDA4MDBcIiIsIERlc2NyaWJlKG00KSk7Ci0gIHN0clswXSA9IHN0cls2XSA9IHN0cls3XSA9IHN0cls5XSA9IHN0clsxMF0gPSBMJ1wwJzsKLSAgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZyY+IG01ID0gU3RyRXEoc3RyKTsKLSAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byBMXCJcXDAxMlxcMDQ1XFwwXFwwOFxcMFxcMFwiIiwgRGVzY3JpYmUobTUpKTsKLX0KLQotVEVTVChTdGRXaWRlU3RyTmVUZXN0LCBNYXRjaGVzVW5lcXVhbFN0cmluZykgewotICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyTmUoTCJIZWxsbyIpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCIiKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTCJIZWxsbyIpKTsKLQotICBNYXRjaGVyPCA6OnN0ZDo6d3N0cmluZz4gbTIgPSBTdHJOZSg6OnN0ZDo6d3N0cmluZyhMIkhlbGxvIikpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiaGVsbG8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGVsbG8iKSk7Ci19Ci0KLVRFU1QoU3RkV2lkZVN0ck5lVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJOZShMIkhpIik7Ci0gIEVYUEVDVF9FUSgiaXNuJ3QgZXF1YWwgdG8gTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKLX0KLQotVEVTVChTdGRXaWRlU3RyQ2FzZUVxVGVzdCwgTWF0Y2hlc0VxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlRXEoOjpzdGQ6OndzdHJpbmcoTCJIZWxsbyIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKEwiSGVsbG8iKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhMImhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiSGkiKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOwotCi0gIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShMIkhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJoZWxsbyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIaSIpKTsKLX0KLQotVEVTVChTdGRXaWRlU3RyQ2FzZUVxVGVzdCwgTWF0Y2hlc0VxdWFsU3RyaW5nV2l0aDBJZ25vcmluZ0Nhc2UpIHsKLSAgOjpzdGQ6OndzdHJpbmcgc3RyMShMIm9hYm9jZG9vZW9vIik7Ci0gIDo6c3RkOjp3c3RyaW5nIHN0cjIoTCJPQUJPQ0RPT0VPTyIpOwotICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTAgPSBTdHJDYXNlRXEoc3RyMSk7Ci0gIEVYUEVDVF9GQUxTRShtMC5NYXRjaGVzKHN0cjIgKyA6OnN0ZDo6d3N0cmluZygxLCBMJ1wwJykpKTsKLQotICBzdHIxWzNdID0gc3RyMlszXSA9IEwnXDAnOwotICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTEgPSBTdHJDYXNlRXEoc3RyMSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoc3RyMikpOwotCi0gIHN0cjFbMF0gPSBzdHIxWzZdID0gc3RyMVs3XSA9IHN0cjFbMTBdID0gTCdcMCc7Ci0gIHN0cjJbMF0gPSBzdHIyWzZdID0gc3RyMls3XSA9IHN0cjJbMTBdID0gTCdcMCc7Ci0gIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShzdHIxKTsKLSAgc3RyMVs5XSA9IHN0cjJbOV0gPSBMJ1wwJzsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoc3RyMikpOwotCi0gIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMyA9IFN0ckNhc2VFcShzdHIxKTsKLSAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhzdHIyKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoc3RyMiArIEwieCIpKTsKLSAgc3RyMi5hcHBlbmQoMSwgTCdcMCcpOwotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhzdHIyKSk7Ci0gIEVYUEVDVF9GQUxTRShtMy5NYXRjaGVzKDo6c3RkOjp3c3RyaW5nKHN0cjIsIDAsIDkpKSk7Ci19Ci0KLVRFU1QoU3RkV2lkZVN0ckNhc2VFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPCA6OnN0ZDo6d3N0cmluZz4gbSA9IFN0ckNhc2VFcShMIkhpIik7Ci0gIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gKGlnbm9yaW5nIGNhc2UpIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoU3RkV2lkZVN0ckNhc2VOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlTmUoTCJIZWxsbyIpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiaGVsbG8iKSk7Ci0KLSAgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0yID0gU3RyQ2FzZU5lKDo6c3RkOjp3c3RyaW5nKEwiSGVsbG8iKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCIiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGVsbG8iKSk7Ci19Ci0KLVRFU1QoU3RkV2lkZVN0ckNhc2VOZVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyQ2FzZU5lKEwiSGkiKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBlcXVhbCB0byAoaWdub3JpbmcgY2FzZSkgTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgd3N0cmluZy10eXBlZCB2YWx1ZXMuCi1URVNUKFN0ZFdpZGVIYXNTdWJzdHJUZXN0LCBXb3Jrc0ZvclN0cmluZ0NsYXNzZXMpIHsKLSAgY29uc3QgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0xID0gSGFzU3Vic3RyKEwiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoOjpzdGQ6OndzdHJpbmcoTCJJIGxvdmUgZm9vZC4iKSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyg6OnN0ZDo6d3N0cmluZyhMInRvZm8iKSkpOwotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IEhhc1N1YnN0cihMImZvbyIpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDo6c3RkOjp3c3RyaW5nKEwiSSBsb3ZlIGZvb2QuIikpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoOjpzdGQ6OndzdHJpbmcoTCJ0b2ZvIikpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgQy13aWRlLXN0cmluZy10eXBlZCB2YWx1ZXMuCi1URVNUKFN0ZFdpZGVIYXNTdWJzdHJUZXN0LCBXb3Jrc0ZvckNTdHJpbmdzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8d2NoYXJfdCo+IG0xID0gSGFzU3Vic3RyKEwiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoY29uc3RfY2FzdDx3Y2hhcl90Kj4oTCJJIGxvdmUgZm9vZC4iKSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhjb25zdF9jYXN0PHdjaGFyX3QqPihMInRvZm8iKSkpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbTIgPSBIYXNTdWJzdHIoTCJmb28iKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkkgbG92ZSBmb29kLiIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJ0b2ZvIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhOVUxMKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgSGFzU3Vic3RyKHMpIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCi1URVNUKFN0ZFdpZGVIYXNTdWJzdHJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0gPSBIYXNTdWJzdHIoTCJmb29cblwiIik7Ci0gIEVYUEVDVF9FUSgiaGFzIHN1YnN0cmluZyBMXCJmb29cXG5cXFwiXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIFN0YXJ0c1dpdGgocykuCi0KLVRFU1QoU3RkV2lkZVN0YXJ0c1dpdGhUZXN0LCBNYXRjaGVzU3RyaW5nV2l0aEdpdmVuUHJlZml4KSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0xID0gU3RhcnRzV2l0aCg6OnN0ZDo6d3N0cmluZyhMIiIpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhMIkhpIikpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKEwiIikpOwotICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZyY+IG0yID0gU3RhcnRzV2l0aChMIkhpIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhpIEhpISIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhpZ2giKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSCIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCIgSGkiKSk7Ci19Ci0KLVRFU1QoU3RkV2lkZVN0YXJ0c1dpdGhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZz4gbSA9IFN0YXJ0c1dpdGgoTCJIaSIpOwotICBFWFBFQ1RfRVEoInN0YXJ0cyB3aXRoIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIEVuZHNXaXRoKHMpLgotCi1URVNUKFN0ZFdpZGVFbmRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5TdWZmaXgpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbTEgPSBFbmRzV2l0aChMIiIpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKEwiSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoTCIiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKLQotICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTIgPSBFbmRzV2l0aCg6OnN0ZDo6d3N0cmluZyhMIkhpIikpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJXb3cgSGkgSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJTdXBlciBIaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJpIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIkhpICIpKTsKLX0KLQotVEVTVChTdGRXaWRlRW5kc1dpdGhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZz4gbSA9IEVuZHNXaXRoKEwiSGkiKTsKLSAgRVhQRUNUX0VRKCJlbmRzIHdpdGggTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotVEVTVChHbG9iYWxXaWRlU3RyRXFUZXN0LCBNYXRjaGVzRXF1YWwpIHsKLSAgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbSA9IFN0ckVxKDo6d3N0cmluZyhMIkhlbGxvIikpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIZWxsbyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMImhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKLQotICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZyY+IG0yID0gU3RyRXEoTCJIZWxsbyIpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGVsbG8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGkiKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMyA9IFN0ckVxKEwiXHhEM1x4NTc2XHg4RDNceEM3NEQiKTsKLSAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzREIikpOwotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzRFIikpOwotCi0gIDo6d3N0cmluZyBzdHIoTCIwMTIwNDUwMDgwMCIpOwotICBzdHJbM10gPSBMJ1wwJzsKLSAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtNCA9IFN0ckVxKHN0cik7Ci0gIEVYUEVDVF9UUlVFKG00Lk1hdGNoZXMoc3RyKSk7Ci0gIHN0clswXSA9IHN0cls2XSA9IHN0cls3XSA9IHN0cls5XSA9IHN0clsxMF0gPSBMJ1wwJzsKLSAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtNSA9IFN0ckVxKHN0cik7Ci0gIEVYUEVDVF9UUlVFKG01Lk1hdGNoZXMoc3RyKSk7Ci19Ci0KLVRFU1QoR2xvYmFsV2lkZVN0ckVxVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8IDo6d3N0cmluZz4gbSA9IFN0ckVxKEwiSGktXCdcIj9cXFxhXGJcZlxuXHJcdFx2Iik7Ci0gIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gTFwiSGktXCdcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXHJcXHRcXHZcIiIsCi0gICAgRGVzY3JpYmUobSkpOwotCi0gIE1hdGNoZXI8IDo6d3N0cmluZz4gbTIgPSBTdHJFcShMIlx4RDNceDU3Nlx4OEQzXHhDNzREIik7Ci0gIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gTFwiXFx4RDNcXHg1NzZcXHg4RDNcXHhDNzREXCIiLAotICAgIERlc2NyaWJlKG0yKSk7Ci0KLSAgOjp3c3RyaW5nIHN0cihMIjAxMjA0NTAwODAwIik7Ci0gIHN0clszXSA9IEwnXDAnOwotICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZyY+IG00ID0gU3RyRXEoc3RyKTsKLSAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byBMXCIwMTJcXDA0NTAwODAwXCIiLCBEZXNjcmliZShtNCkpOwotICBzdHJbMF0gPSBzdHJbNl0gPSBzdHJbN10gPSBzdHJbOV0gPSBzdHJbMTBdID0gTCdcMCc7Ci0gIE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTUgPSBTdHJFcShzdHIpOwotICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIExcIlxcMDEyXFwwNDVcXDBcXDA4XFwwXFwwXCIiLCBEZXNjcmliZShtNSkpOwotfQotCi1URVNUKEdsb2JhbFdpZGVTdHJOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJOZShMIkhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhMIiIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOwotCi0gIE1hdGNoZXI8IDo6d3N0cmluZz4gbTIgPSBTdHJOZSg6OndzdHJpbmcoTCJIZWxsbyIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMImhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIkhlbGxvIikpOwotfQotCi1URVNUKEdsb2JhbFdpZGVTdHJOZVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyTmUoTCJIaSIpOwotICBFWFBFQ1RfRVEoImlzbid0IGVxdWFsIHRvIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoR2xvYmFsV2lkZVN0ckNhc2VFcVRlc3QsIE1hdGNoZXNFcXVhbFN0cmluZ0lnbm9yaW5nQ2FzZSkgewotICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyQ2FzZUVxKDo6d3N0cmluZyhMIkhlbGxvIikpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIZWxsbyIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKEwiaGVsbG8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTCJIaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShMIkhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJoZWxsbyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIaSIpKTsKLX0KLQotVEVTVChHbG9iYWxXaWRlU3RyQ2FzZUVxVGVzdCwgTWF0Y2hlc0VxdWFsU3RyaW5nV2l0aDBJZ25vcmluZ0Nhc2UpIHsKLSAgOjp3c3RyaW5nIHN0cjEoTCJvYWJvY2Rvb2VvbyIpOwotICA6OndzdHJpbmcgc3RyMihMIk9BQk9DRE9PRU9PIik7Ci0gIE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTAgPSBTdHJDYXNlRXEoc3RyMSk7Ci0gIEVYUEVDVF9GQUxTRShtMC5NYXRjaGVzKHN0cjIgKyA6OndzdHJpbmcoMSwgTCdcMCcpKSk7Ci0KLSAgc3RyMVszXSA9IHN0cjJbM10gPSBMJ1wwJzsKLSAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMSA9IFN0ckNhc2VFcShzdHIxKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhzdHIyKSk7Ci0KLSAgc3RyMVswXSA9IHN0cjFbNl0gPSBzdHIxWzddID0gc3RyMVsxMF0gPSBMJ1wwJzsKLSAgc3RyMlswXSA9IHN0cjJbNl0gPSBzdHIyWzddID0gc3RyMlsxMF0gPSBMJ1wwJzsKLSAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShzdHIxKTsKLSAgc3RyMVs5XSA9IHN0cjJbOV0gPSBMJ1wwJzsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoc3RyMikpOwotCi0gIE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTMgPSBTdHJDYXNlRXEoc3RyMSk7Ci0gIEVYUEVDVF9UUlVFKG0zLk1hdGNoZXMoc3RyMikpOwotCi0gIEVYUEVDVF9GQUxTRShtMy5NYXRjaGVzKHN0cjIgKyBMIngiKSk7Ci0gIHN0cjIuYXBwZW5kKDEsIEwnXDAnKTsKLSAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoc3RyMikpOwotICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyg6OndzdHJpbmcoc3RyMiwgMCwgOSkpKTsKLX0KLQotVEVTVChHbG9iYWxXaWRlU3RyQ2FzZUVxVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8IDo6d3N0cmluZz4gbSA9IFN0ckNhc2VFcShMIkhpIik7Ci0gIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gKGlnbm9yaW5nIGNhc2UpIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLVRFU1QoR2xvYmFsV2lkZVN0ckNhc2VOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlTmUoTCJIZWxsbyIpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiaGVsbG8iKSk7Ci0KLSAgTWF0Y2hlcjwgOjp3c3RyaW5nPiBtMiA9IFN0ckNhc2VOZSg6OndzdHJpbmcoTCJIZWxsbyIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIiIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIZWxsbyIpKTsKLX0KLQotVEVTVChHbG9iYWxXaWRlU3RyQ2FzZU5lVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlTmUoTCJIaSIpOwotICBFWFBFQ1RfRVEoImlzbid0IGVxdWFsIHRvIChpZ25vcmluZyBjYXNlKSBMXCJIaVwiIiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEhhc1N1YnN0cigpIHdvcmtzIGZvciBtYXRjaGluZyB3c3RyaW5nLXR5cGVkIHZhbHVlcy4KLVRFU1QoR2xvYmFsV2lkZUhhc1N1YnN0clRlc3QsIFdvcmtzRm9yU3RyaW5nQ2xhc3NlcykgewotICBjb25zdCBNYXRjaGVyPCA6OndzdHJpbmc+IG0xID0gSGFzU3Vic3RyKEwiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoOjp3c3RyaW5nKEwiSSBsb3ZlIGZvb2QuIikpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoOjp3c3RyaW5nKEwidG9mbyIpKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMiA9IEhhc1N1YnN0cihMImZvbyIpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDo6d3N0cmluZyhMIkkgbG92ZSBmb29kLiIpKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDo6d3N0cmluZyhMInRvZm8iKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEhhc1N1YnN0cigpIHdvcmtzIGZvciBtYXRjaGluZyBDLXdpZGUtc3RyaW5nLXR5cGVkIHZhbHVlcy4KLVRFU1QoR2xvYmFsV2lkZUhhc1N1YnN0clRlc3QsIFdvcmtzRm9yQ1N0cmluZ3MpIHsKLSAgY29uc3QgTWF0Y2hlcjx3Y2hhcl90Kj4gbTEgPSBIYXNTdWJzdHIoTCJmb28iKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhjb25zdF9jYXN0PHdjaGFyX3QqPihMIkkgbG92ZSBmb29kLiIpKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KEwidG9mbyIpKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKLQotICBjb25zdCBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtMiA9IEhhc1N1YnN0cihMImZvbyIpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSSBsb3ZlIGZvb2QuIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMInRvZm8iKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKE5VTEwpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIocykgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoR2xvYmFsV2lkZUhhc1N1YnN0clRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPCA6OndzdHJpbmc+IG0gPSBIYXNTdWJzdHIoTCJmb29cblwiIik7Ci0gIEVYUEVDVF9FUSgiaGFzIHN1YnN0cmluZyBMXCJmb29cXG5cXFwiXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIFN0YXJ0c1dpdGgocykuCi0KLVRFU1QoR2xvYmFsV2lkZVN0YXJ0c1dpdGhUZXN0LCBNYXRjaGVzU3RyaW5nV2l0aEdpdmVuUHJlZml4KSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0xID0gU3RhcnRzV2l0aCg6OndzdHJpbmcoTCIiKSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoTCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhMIiIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoTlVMTCkpOwotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTIgPSBTdGFydHNXaXRoKEwiSGkiKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhpIikpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGkgSGkhIikpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGlnaCIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIiBIaSIpKTsKLX0KLQotVEVTVChHbG9iYWxXaWRlU3RhcnRzV2l0aFRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZz4gbSA9IFN0YXJ0c1dpdGgoTCJIaSIpOwotICBFWFBFQ1RfRVEoInN0YXJ0cyB3aXRoIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIEVuZHNXaXRoKHMpLgotCi1URVNUKEdsb2JhbFdpZGVFbmRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5TdWZmaXgpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbTEgPSBFbmRzV2l0aChMIiIpOwotICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKEwiSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoTCIiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKLQotICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZyY+IG0yID0gRW5kc1dpdGgoOjp3c3RyaW5nKEwiSGkiKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIldvdyBIaSBIaSIpKTsKLSAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIlN1cGVyIEhpIikpOwotICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMImkiKSk7Ci0gIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGkgIikpOwotfQotCi1URVNUKEdsb2JhbFdpZGVFbmRzV2l0aFRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZz4gbSA9IEVuZHNXaXRoKEwiSGkiKTsKLSAgRVhQRUNUX0VRKCJlbmRzIHdpdGggTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLQotCi10eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8bG9uZywgaW50PiBUdXBsZTI7ICAvLyBOT0xJTlQKLQotLy8gVGVzdHMgdGhhdCBFcSgpIG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZSBmaXJzdCBmaWVsZCA9PSB0aGUKLS8vIHNlY29uZCBmaWVsZC4KLVRFU1QoRXEyVGVzdCwgTWF0Y2hlc0VxdWFsQXJndW1lbnRzKSB7Ci0gIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IEVxKCk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDUpKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA2KSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVxKCkgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoRXEyVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IEVxKCk7Ci0gIEVYUEVDVF9FUSgiYXJlIGFuIGVxdWFsIHBhaXIiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR2UoKSBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgPj0gdGhlCi0vLyBzZWNvbmQgZmllbGQuCi1URVNUKEdlMlRlc3QsIE1hdGNoZXNHcmVhdGVyVGhhbk9yRXF1YWxBcmd1bWVudHMpIHsKLSAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gR2UoKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNCkpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDYpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR2UoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChHZTJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gR2UoKTsKLSAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kIiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEd0KCkgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlIGZpcnN0IGZpZWxkID4gdGhlCi0vLyBzZWNvbmQgZmllbGQuCi1URVNUKEd0MlRlc3QsIE1hdGNoZXNHcmVhdGVyVGhhbkFyZ3VtZW50cykgewotICBNYXRjaGVyPGNvbnN0IFR1cGxlMiY+IG0gPSBHdCgpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA0KSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDYpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR3QoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChHdDJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gR3QoKTsKLSAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+IHRoZSBzZWNvbmQiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTGUoKSBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgPD0gdGhlCi0vLyBzZWNvbmQgZmllbGQuCi1URVNUKExlMlRlc3QsIE1hdGNoZXNMZXNzVGhhbk9yRXF1YWxBcmd1bWVudHMpIHsKLSAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gTGUoKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNikpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDQpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTGUoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChMZTJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gTGUoKTsKLSAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8PSB0aGUgc2Vjb25kIiwgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEx0KCkgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlIGZpcnN0IGZpZWxkIDwgdGhlCi0vLyBzZWNvbmQgZmllbGQuCi1URVNUKEx0MlRlc3QsIE1hdGNoZXNMZXNzVGhhbkFyZ3VtZW50cykgewotICBNYXRjaGVyPGNvbnN0IFR1cGxlMiY+IG0gPSBMdCgpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA2KSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDQpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTHQoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChMdDJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gTHQoKTsKLSAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8IHRoZSBzZWNvbmQiLCBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTmUoKSBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgIT0gdGhlCi0vLyBzZWNvbmQgZmllbGQuCi1URVNUKE5lMlRlc3QsIE1hdGNoZXNVbmVxdWFsQXJndW1lbnRzKSB7Ci0gIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IE5lKCk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDYpKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDQpKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA1KSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IE5lKCkgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoTmUyVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IE5lKCk7Ci0gIEVYUEVDVF9FUSgiYXJlIGFuIHVuZXF1YWwgcGFpciIsIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBOb3QobSkgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBkb2Vzbid0IG1hdGNoIG0uCi1URVNUKE5vdFRlc3QsIE5lZ2F0ZXNNYXRjaGVyKSB7Ci0gIE1hdGNoZXI8aW50PiBtOwotICBtID0gTm90KEVxKDIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDMpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTm90KG0pIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCi1URVNUKE5vdFRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGludD4gbSA9IE5vdChFcSg1KSk7Ci0gIEVYUEVDVF9FUSgiaXNuJ3QgZXF1YWwgdG8gNSIsIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBtb25vbW9ycGhpYyBtYXRjaGVycyBhcmUgc2FmZWx5IGNhc3QgYnkgdGhlIE5vdCBtYXRjaGVyLgotVEVTVChOb3RUZXN0LCBOb3RNYXRjaGVyU2FmZWx5Q2FzdHNNb25vbW9ycGhpY01hdGNoZXJzKSB7Ci0gIC8vIGdyZWF0ZXJfdGhhbl81IGlzIGEgbW9ub21vcnBoaWMgbWF0Y2hlci4KLSAgTWF0Y2hlcjxpbnQ+IGdyZWF0ZXJfdGhhbl81ID0gR3QoNSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtID0gTm90KGdyZWF0ZXJfdGhhbl81KTsKLSAgTWF0Y2hlcjxpbnQmPiBtMiA9IE5vdChncmVhdGVyX3RoYW5fNSk7Ci0gIE1hdGNoZXI8aW50Jj4gbTMgPSBOb3QobSk7Ci19Ci0KLS8vIEhlbHBlciB0byBhbGxvdyBlYXN5IHRlc3Rpbmcgb2YgQWxsT2YgbWF0Y2hlcnMgd2l0aCBudW0gcGFyYW1ldGVycy4KLXZvaWQgQWxsT2ZNYXRjaGVzKGludCBudW0sIGNvbnN0IE1hdGNoZXI8aW50PiYgbSkgewotICBTQ09QRURfVFJBQ0UoRGVzY3JpYmUobSkpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMCkpOwotICBmb3IgKGludCBpID0gMTsgaSA8PSBudW07ICsraSkgewotICAgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoaSkpOwotICB9Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhudW0gKyAxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQWxsT2YobTEsIC4uLiwgbW4pIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbGwgb2YKLS8vIHRoZSBnaXZlbiBtYXRjaGVycy4KLVRFU1QoQWxsT2ZUZXN0LCBNYXRjaGVzV2hlbkFsbE1hdGNoKSB7Ci0gIE1hdGNoZXI8aW50PiBtOwotICBtID0gQWxsT2YoTGUoMiksIEdlKDEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMykpOwotCi0gIG0gPSBBbGxPZihHdCgwKSwgTmUoMSksIE5lKDIpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDMpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKLQotICBtID0gQWxsT2YoR3QoMCksIE5lKDEpLCBOZSgyKSwgTmUoMykpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoNCkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDMpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKLQotICBtID0gQWxsT2YoR2UoMCksIEx0KDEwKSwgTmUoMyksIE5lKDUpLCBOZSg3KSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygwKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygxKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMykpOwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgZm9yIHZhcnlpbmcgbnVtYmVyIG9mIHN1Yi1tYXRjaGVycy4gRHVlIHRvIHRoZSB3YXkKLSAgLy8gdGhlIHN1Yi1tYXRjaGVycyBhcmUgaGFuZGxlZCBpdCBpcyBlbm91Z2ggdG8gdGVzdCBldmVyeSBzdWItbWF0Y2hlciBvbmNlCi0gIC8vIHdpdGggc3ViLW1hdGNoZXJzIHVzaW5nIHRoZSBzYW1lIG1hdGNoZXIgdHlwZS4gVmFyeWluZyBtYXRjaGVyIHR5cGVzIGFyZQotICAvLyBjaGVja2VkIGZvciBhYm92ZS4KLSAgQWxsT2ZNYXRjaGVzKDIsIEFsbE9mKE5lKDEpLCBOZSgyKSkpOwotICBBbGxPZk1hdGNoZXMoMywgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSkpOwotICBBbGxPZk1hdGNoZXMoNCwgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCkpKTsKLSAgQWxsT2ZNYXRjaGVzKDUsIEFsbE9mKE5lKDEpLCBOZSgyKSwgTmUoMyksIE5lKDQpLCBOZSg1KSkpOwotICBBbGxPZk1hdGNoZXMoNiwgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCksIE5lKDUpLCBOZSg2KSkpOwotICBBbGxPZk1hdGNoZXMoNywgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCksIE5lKDUpLCBOZSg2KSwgTmUoNykpKTsKLSAgQWxsT2ZNYXRjaGVzKDgsIEFsbE9mKE5lKDEpLCBOZSgyKSwgTmUoMyksIE5lKDQpLCBOZSg1KSwgTmUoNiksIE5lKDcpLAotICAgICAgICAgICAgICAgICAgICAgICAgTmUoOCkpKTsKLSAgQWxsT2ZNYXRjaGVzKDksIEFsbE9mKE5lKDEpLCBOZSgyKSwgTmUoMyksIE5lKDQpLCBOZSg1KSwgTmUoNiksIE5lKDcpLAotICAgICAgICAgICAgICAgICAgICAgICAgTmUoOCksIE5lKDkpKSk7Ci0gIEFsbE9mTWF0Y2hlcygxMCwgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCksIE5lKDUpLCBOZSg2KSwgTmUoNyksIE5lKDgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDkpLCBOZSgxMCkpKTsKLX0KLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLS8vIFRlc3RzIHRoZSB2YXJpYWRpYyB2ZXJzaW9uIG9mIHRoZSBBbGxPZk1hdGNoZXIuCi1URVNUKEFsbE9mVGVzdCwgVmFyaWFkaWNNYXRjaGVzV2hlbkFsbE1hdGNoKSB7Ci0gIC8vIE1ha2Ugc3VyZSBBbGxPZiBpcyBkZWZpbmVkIGluIHRoZSByaWdodCBuYW1lc3BhY2UgYW5kIGRvZXMgbm90IGRlcGVuZCBvbgotICAvLyBBREwuCi0gIDo6dGVzdGluZzo6QWxsT2YoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExKTsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBBbGxPZihOZSgxKSwgTmUoMiksIE5lKDMpLCBOZSg0KSwgTmUoNSksIE5lKDYpLCBOZSg3KSwgTmUoOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTmUoOSksIE5lKDEwKSwgTmUoMTEpKTsKLSAgRVhQRUNUX1RIQVQoRGVzY3JpYmUobSksIEVuZHNXaXRoKCJhbmQgKGlzbid0IGVxdWFsIHRvIDExKSkpKSkpKSkpKSIpKTsKLSAgQWxsT2ZNYXRjaGVzKDExLCBtKTsKLSAgQWxsT2ZNYXRjaGVzKDUwLCBBbGxPZihOZSgxKSwgTmUoMiksIE5lKDMpLCBOZSg0KSwgTmUoNSksIE5lKDYpLCBOZSg3KSwgTmUoOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTmUoOSksIE5lKDEwKSwgTmUoMTEpLCBOZSgxMiksIE5lKDEzKSwgTmUoMTQpLCBOZSgxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTmUoMTYpLCBOZSgxNyksIE5lKDE4KSwgTmUoMTkpLCBOZSgyMCksIE5lKDIxKSwgTmUoMjIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDIzKSwgTmUoMjQpLCBOZSgyNSksIE5lKDI2KSwgTmUoMjcpLCBOZSgyOCksIE5lKDI5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOZSgzMCksIE5lKDMxKSwgTmUoMzIpLCBOZSgzMyksIE5lKDM0KSwgTmUoMzUpLCBOZSgzNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTmUoMzcpLCBOZSgzOCksIE5lKDM5KSwgTmUoNDApLCBOZSg0MSksIE5lKDQyKSwgTmUoNDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDQ0KSwgTmUoNDUpLCBOZSg0NiksIE5lKDQ3KSwgTmUoNDgpLCBOZSg0OSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTmUoNTApKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi0vLyBUZXN0cyB0aGF0IEFsbE9mKG0xLCAuLi4sIG1uKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgotVEVTVChBbGxPZlRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGludD4gbTsKLSAgbSA9IEFsbE9mKExlKDIpLCBHZSgxKSk7Ci0gIEVYUEVDVF9FUSgiKGlzIDw9IDIpIGFuZCAoaXMgPj0gMSkiLCBEZXNjcmliZShtKSk7Ci0KLSAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMikpOwotICBFWFBFQ1RfRVEoIihpcyA+IDApIGFuZCAiCi0gICAgICAgICAgICAiKChpc24ndCBlcXVhbCB0byAxKSBhbmQgIgotICAgICAgICAgICAgIihpc24ndCBlcXVhbCB0byAyKSkiLAotICAgICAgICAgICAgRGVzY3JpYmUobSkpOwotCi0KLSAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMiksIE5lKDMpKTsKLSAgRVhQRUNUX0VRKCIoKGlzID4gMCkgYW5kICIKLSAgICAgICAgICAgICIoaXNuJ3QgZXF1YWwgdG8gMSkpIGFuZCAiCi0gICAgICAgICAgICAiKChpc24ndCBlcXVhbCB0byAyKSBhbmQgIgotICAgICAgICAgICAgIihpc24ndCBlcXVhbCB0byAzKSkiLAotICAgICAgICAgICAgRGVzY3JpYmUobSkpOwotCi0KLSAgbSA9IEFsbE9mKEdlKDApLCBMdCgxMCksIE5lKDMpLCBOZSg1KSwgTmUoNykpOwotICBFWFBFQ1RfRVEoIigoaXMgPj0gMCkgYW5kICIKLSAgICAgICAgICAgICIoaXMgPCAxMCkpIGFuZCAiCi0gICAgICAgICAgICAiKChpc24ndCBlcXVhbCB0byAzKSBhbmQgIgotICAgICAgICAgICAgIigoaXNuJ3QgZXF1YWwgdG8gNSkgYW5kICIKLSAgICAgICAgICAgICIoaXNuJ3QgZXF1YWwgdG8gNykpKSIsCi0gICAgICAgICAgICBEZXNjcmliZShtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQWxsT2YobTEsIC4uLiwgbW4pIGRlc2NyaWJlcyBpdHMgbmVnYXRpb24gcHJvcGVybHkuCi1URVNUKEFsbE9mVGVzdCwgQ2FuRGVzY3JpYmVOZWdhdGlvbikgewotICBNYXRjaGVyPGludD4gbTsKLSAgbSA9IEFsbE9mKExlKDIpLCBHZSgxKSk7Ci0gIEVYUEVDVF9FUSgiKGlzbid0IDw9IDIpIG9yICIKLSAgICAgICAgICAgICIoaXNuJ3QgPj0gMSkiLAotICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci0KLSAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMikpOwotICBFWFBFQ1RfRVEoIihpc24ndCA+IDApIG9yICIKLSAgICAgICAgICAgICIoKGlzIGVxdWFsIHRvIDEpIG9yICIKLSAgICAgICAgICAgICIoaXMgZXF1YWwgdG8gMikpIiwKLSAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOwotCi0KLSAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMiksIE5lKDMpKTsKLSAgRVhQRUNUX0VRKCIoKGlzbid0ID4gMCkgb3IgIgotICAgICAgICAgICAgIihpcyBlcXVhbCB0byAxKSkgb3IgIgotICAgICAgICAgICAgIigoaXMgZXF1YWwgdG8gMikgb3IgIgotICAgICAgICAgICAgIihpcyBlcXVhbCB0byAzKSkiLAotICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci0KLQotICBtID0gQWxsT2YoR2UoMCksIEx0KDEwKSwgTmUoMyksIE5lKDUpLCBOZSg3KSk7Ci0gIEVYUEVDVF9FUSgiKChpc24ndCA+PSAwKSBvciAiCi0gICAgICAgICAgICAiKGlzbid0IDwgMTApKSBvciAiCi0gICAgICAgICAgICAiKChpcyBlcXVhbCB0byAzKSBvciAiCi0gICAgICAgICAgICAiKChpcyBlcXVhbCB0byA1KSBvciAiCi0gICAgICAgICAgICAiKGlzIGVxdWFsIHRvIDcpKSkiLAotICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIHNhZmVseSBjYXN0IGJ5IHRoZSBBbGxPZiBtYXRjaGVyLgotVEVTVChBbGxPZlRlc3QsIEFsbE9mTWF0Y2hlclNhZmVseUNhc3RzTW9ub21vcnBoaWNNYXRjaGVycykgewotICAvLyBncmVhdGVyX3RoYW5fNSBhbmQgbGVzc190aGFuXzEwIGFyZSBtb25vbW9ycGhpYyBtYXRjaGVycy4KLSAgTWF0Y2hlcjxpbnQ+IGdyZWF0ZXJfdGhhbl81ID0gR3QoNSk7Ci0gIE1hdGNoZXI8aW50PiBsZXNzX3RoYW5fMTAgPSBMdCgxMCk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtID0gQWxsT2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCk7Ci0gIE1hdGNoZXI8aW50Jj4gbTIgPSBBbGxPZihncmVhdGVyX3RoYW5fNSwgbGVzc190aGFuXzEwKTsKLSAgTWF0Y2hlcjxpbnQmPiBtMyA9IEFsbE9mKGdyZWF0ZXJfdGhhbl81LCBtMik7Ci0KLSAgLy8gVGVzdHMgdGhhdCBCb3RoT2Ygd29ya3Mgd2hlbiBjb21wb3NpbmcgaXRzZWxmLgotICBNYXRjaGVyPGNvbnN0IGludCY+IG00ID0gQWxsT2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCwgbGVzc190aGFuXzEwKTsKLSAgTWF0Y2hlcjxpbnQmPiBtNSA9IEFsbE9mKGdyZWF0ZXJfdGhhbl81LCBsZXNzX3RoYW5fMTAsIGxlc3NfdGhhbl8xMCk7Ci19Ci0KLVRFU1QoQWxsT2ZUZXN0LCBFeHBsYWluc1Jlc3VsdCkgewotICBNYXRjaGVyPGludD4gbTsKLQotICAvLyBTdWNjZXNzZnVsIG1hdGNoLiAgQm90aCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uICBUaGUgc2Vjb25kCi0gIC8vIG1hdGNoZXIgZG9lc24ndCBnaXZlIGFuIGV4cGxhbmF0aW9uLCBzbyBvbmx5IHRoZSBmaXJzdCBtYXRjaGVyJ3MKLSAgLy8gZXhwbGFuYXRpb24gaXMgcHJpbnRlZC4KLSAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgTHQoMzApKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyAxNSBtb3JlIHRoYW4gMTAiLCBFeHBsYWluKG0sIDI1KSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIEJvdGggbWF0Y2hlcnMgbmVlZCB0byBleHBsYWluLgotICBtID0gQWxsT2YoR3JlYXRlclRoYW4oMTApLCBHcmVhdGVyVGhhbigyMCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDIwIG1vcmUgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDEwIG1vcmUgdGhhbiAyMCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIDMwKSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIEFsbCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uICBUaGUgc2Vjb25kCi0gIC8vIG1hdGNoZXIgZG9lc24ndCBnaXZlbiBhbiBleHBsYW5hdGlvbi4KLSAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgTHQoMzApLCBHcmVhdGVyVGhhbigyMCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDE1IG1vcmUgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDUgbW9yZSB0aGFuIDIwIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgMjUpKTsKLQotICAvLyBTdWNjZXNzZnVsIG1hdGNoLiAgQWxsIG1hdGNoZXJzIG5lZWQgdG8gZXhwbGFpbi4KLSAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgR3JlYXRlclRoYW4oMjApLCBHcmVhdGVyVGhhbigzMCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDMwIG1vcmUgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDIwIG1vcmUgdGhhbiAyMCwgIgotICAgICAgICAgICAgImFuZCB3aGljaCBpcyAxMCBtb3JlIHRoYW4gMzAiLAotICAgICAgICAgICAgRXhwbGFpbihtLCA0MCkpOwotCi0gIC8vIEZhaWxlZCBtYXRjaC4gIFRoZSBmaXJzdCBtYXRjaGVyLCB3aGljaCBmYWlsZWQsIG5lZWRzIHRvCi0gIC8vIGV4cGxhaW4uCi0gIG0gPSBBbGxPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaXMgNSBsZXNzIHRoYW4gMTAiLCBFeHBsYWluKG0sIDUpKTsKLQotICAvLyBGYWlsZWQgbWF0Y2guICBUaGUgc2Vjb25kIG1hdGNoZXIsIHdoaWNoIGZhaWxlZCwgbmVlZHMgdG8KLSAgLy8gZXhwbGFpbi4gIFNpbmNlIGl0IGRvZXNuJ3QgZ2l2ZW4gYW4gZXhwbGFuYXRpb24sIG5vdGhpbmcgaXMKLSAgLy8gcHJpbnRlZC4KLSAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgTHQoMzApKTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDQwKSk7Ci0KLSAgLy8gRmFpbGVkIG1hdGNoLiAgVGhlIHNlY29uZCBtYXRjaGVyLCB3aGljaCBmYWlsZWQsIG5lZWRzIHRvCi0gIC8vIGV4cGxhaW4uCi0gIG0gPSBBbGxPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaXMgNSBsZXNzIHRoYW4gMjAiLCBFeHBsYWluKG0sIDE1KSk7Ci19Ci0KLS8vIEhlbHBlciB0byBhbGxvdyBlYXN5IHRlc3Rpbmcgb2YgQW55T2YgbWF0Y2hlcnMgd2l0aCBudW0gcGFyYW1ldGVycy4KLXZvaWQgQW55T2ZNYXRjaGVzKGludCBudW0sIGNvbnN0IE1hdGNoZXI8aW50PiYgbSkgewotICBTQ09QRURfVFJBQ0UoRGVzY3JpYmUobSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtOyArK2kpIHsKLSAgICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoaSkpOwotICB9Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobnVtICsgMSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEFueU9mKG0xLCAuLi4sIG1uKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYXQKLS8vIGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW4gbWF0Y2hlcnMuCi1URVNUKEFueU9mVGVzdCwgTWF0Y2hlc1doZW5BbnlNYXRjaGVzKSB7Ci0gIE1hdGNoZXI8aW50PiBtOwotICBtID0gQW55T2YoTGUoMSksIEdlKDMpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDQpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7Ci0KLSAgbSA9IEFueU9mKEx0KDApLCBFcSgxKSwgRXEoMikpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoLTEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDIpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygwKSk7Ci0KLSAgbSA9IEFueU9mKEx0KDApLCBFcSgxKSwgRXEoMiksIEVxKDMpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKC0xKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygxKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygyKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygzKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMCkpOwotCi0gIG0gPSBBbnlPZihMZSgwKSwgR3QoMTApLCAzLCA1LCA3KTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDApKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDExKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygzKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMikpOwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgZm9yIHZhcnlpbmcgbnVtYmVyIG9mIHN1Yi1tYXRjaGVycy4gRHVlIHRvIHRoZSB3YXkKLSAgLy8gdGhlIHN1Yi1tYXRjaGVycyBhcmUgaGFuZGxlZCBpdCBpcyBlbm91Z2ggdG8gdGVzdCBldmVyeSBzdWItbWF0Y2hlciBvbmNlCi0gIC8vIHdpdGggc3ViLW1hdGNoZXJzIHVzaW5nIHRoZSBzYW1lIG1hdGNoZXIgdHlwZS4gVmFyeWluZyBtYXRjaGVyIHR5cGVzIGFyZQotICAvLyBjaGVja2VkIGZvciBhYm92ZS4KLSAgQW55T2ZNYXRjaGVzKDIsIEFueU9mKDEsIDIpKTsKLSAgQW55T2ZNYXRjaGVzKDMsIEFueU9mKDEsIDIsIDMpKTsKLSAgQW55T2ZNYXRjaGVzKDQsIEFueU9mKDEsIDIsIDMsIDQpKTsKLSAgQW55T2ZNYXRjaGVzKDUsIEFueU9mKDEsIDIsIDMsIDQsIDUpKTsKLSAgQW55T2ZNYXRjaGVzKDYsIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYpKTsKLSAgQW55T2ZNYXRjaGVzKDcsIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcpKTsKLSAgQW55T2ZNYXRjaGVzKDgsIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpKTsKLSAgQW55T2ZNYXRjaGVzKDksIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpKTsKLSAgQW55T2ZNYXRjaGVzKDEwLCBBbnlPZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkpOwotfQotCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotLy8gVGVzdHMgdGhlIHZhcmlhZGljIHZlcnNpb24gb2YgdGhlIEFueU9mTWF0Y2hlci4KLVRFU1QoQW55T2ZUZXN0LCBWYXJpYWRpY01hdGNoZXNXaGVuQW55TWF0Y2hlcykgewotICAvLyBBbHNvIG1ha2Ugc3VyZSBBbnlPZiBpcyBkZWZpbmVkIGluIHRoZSByaWdodCBuYW1lc3BhY2UgYW5kIGRvZXMgbm90IGRlcGVuZAotICAvLyBvbiBBREwuCi0gIE1hdGNoZXI8aW50PiBtID0gOjp0ZXN0aW5nOjpBbnlPZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEpOwotCi0gIEVYUEVDVF9USEFUKERlc2NyaWJlKG0pLCBFbmRzV2l0aCgib3IgKGlzIGVxdWFsIHRvIDExKSkpKSkpKSkpKSIpKTsKLSAgQW55T2ZNYXRjaGVzKDExLCBtKTsKLSAgQW55T2ZNYXRjaGVzKDUwLCBBbnlPZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLQotLy8gVGVzdHMgdGhhdCBBbnlPZihtMSwgLi4uLCBtbikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KLVRFU1QoQW55T2ZUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxpbnQ+IG07Ci0gIG0gPSBBbnlPZihMZSgxKSwgR2UoMykpOwotICBFWFBFQ1RfRVEoIihpcyA8PSAxKSBvciAoaXMgPj0gMykiLAotICAgICAgICAgICAgRGVzY3JpYmUobSkpOwotCi0gIG0gPSBBbnlPZihMdCgwKSwgRXEoMSksIEVxKDIpKTsKLSAgRVhQRUNUX0VRKCIoaXMgPCAwKSBvciAiCi0gICAgICAgICAgICAiKChpcyBlcXVhbCB0byAxKSBvciAoaXMgZXF1YWwgdG8gMikpIiwKLSAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKLQotICBtID0gQW55T2YoTHQoMCksIEVxKDEpLCBFcSgyKSwgRXEoMykpOwotICBFWFBFQ1RfRVEoIigoaXMgPCAwKSBvciAiCi0gICAgICAgICAgICAiKGlzIGVxdWFsIHRvIDEpKSBvciAiCi0gICAgICAgICAgICAiKChpcyBlcXVhbCB0byAyKSBvciAiCi0gICAgICAgICAgICAiKGlzIGVxdWFsIHRvIDMpKSIsCi0gICAgICAgICAgICBEZXNjcmliZShtKSk7Ci0KLSAgbSA9IEFueU9mKExlKDApLCBHdCgxMCksIDMsIDUsIDcpOwotICBFWFBFQ1RfRVEoIigoaXMgPD0gMCkgb3IgIgotICAgICAgICAgICAgIihpcyA+IDEwKSkgb3IgIgotICAgICAgICAgICAgIigoaXMgZXF1YWwgdG8gMykgb3IgIgotICAgICAgICAgICAgIigoaXMgZXF1YWwgdG8gNSkgb3IgIgotICAgICAgICAgICAgIihpcyBlcXVhbCB0byA3KSkpIiwKLSAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBbnlPZihtMSwgLi4uLCBtbikgZGVzY3JpYmVzIGl0cyBuZWdhdGlvbiBwcm9wZXJseS4KLVRFU1QoQW55T2ZUZXN0LCBDYW5EZXNjcmliZU5lZ2F0aW9uKSB7Ci0gIE1hdGNoZXI8aW50PiBtOwotICBtID0gQW55T2YoTGUoMSksIEdlKDMpKTsKLSAgRVhQRUNUX0VRKCIoaXNuJ3QgPD0gMSkgYW5kIChpc24ndCA+PSAzKSIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKLQotICBtID0gQW55T2YoTHQoMCksIEVxKDEpLCBFcSgyKSk7Ci0gIEVYUEVDVF9FUSgiKGlzbid0IDwgMCkgYW5kICIKLSAgICAgICAgICAgICIoKGlzbid0IGVxdWFsIHRvIDEpIGFuZCAoaXNuJ3QgZXF1YWwgdG8gMikpIiwKLSAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOwotCi0gIG0gPSBBbnlPZihMdCgwKSwgRXEoMSksIEVxKDIpLCBFcSgzKSk7Ci0gIEVYUEVDVF9FUSgiKChpc24ndCA8IDApIGFuZCAiCi0gICAgICAgICAgICAiKGlzbid0IGVxdWFsIHRvIDEpKSBhbmQgIgotICAgICAgICAgICAgIigoaXNuJ3QgZXF1YWwgdG8gMikgYW5kICIKLSAgICAgICAgICAgICIoaXNuJ3QgZXF1YWwgdG8gMykpIiwKLSAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOwotCi0gIG0gPSBBbnlPZihMZSgwKSwgR3QoMTApLCAzLCA1LCA3KTsKLSAgRVhQRUNUX0VRKCIoKGlzbid0IDw9IDApIGFuZCAiCi0gICAgICAgICAgICAiKGlzbid0ID4gMTApKSBhbmQgIgotICAgICAgICAgICAgIigoaXNuJ3QgZXF1YWwgdG8gMykgYW5kICIKLSAgICAgICAgICAgICIoKGlzbid0IGVxdWFsIHRvIDUpIGFuZCAiCi0gICAgICAgICAgICAiKGlzbid0IGVxdWFsIHRvIDcpKSkiLAotICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIHNhZmVseSBjYXN0IGJ5IHRoZSBBbnlPZiBtYXRjaGVyLgotVEVTVChBbnlPZlRlc3QsIEFueU9mTWF0Y2hlclNhZmVseUNhc3RzTW9ub21vcnBoaWNNYXRjaGVycykgewotICAvLyBncmVhdGVyX3RoYW5fNSBhbmQgbGVzc190aGFuXzEwIGFyZSBtb25vbW9ycGhpYyBtYXRjaGVycy4KLSAgTWF0Y2hlcjxpbnQ+IGdyZWF0ZXJfdGhhbl81ID0gR3QoNSk7Ci0gIE1hdGNoZXI8aW50PiBsZXNzX3RoYW5fMTAgPSBMdCgxMCk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtID0gQW55T2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCk7Ci0gIE1hdGNoZXI8aW50Jj4gbTIgPSBBbnlPZihncmVhdGVyX3RoYW5fNSwgbGVzc190aGFuXzEwKTsKLSAgTWF0Y2hlcjxpbnQmPiBtMyA9IEFueU9mKGdyZWF0ZXJfdGhhbl81LCBtMik7Ci0KLSAgLy8gVGVzdHMgdGhhdCBFaXRoZXJPZiB3b3JrcyB3aGVuIGNvbXBvc2luZyBpdHNlbGYuCi0gIE1hdGNoZXI8Y29uc3QgaW50Jj4gbTQgPSBBbnlPZihncmVhdGVyX3RoYW5fNSwgbGVzc190aGFuXzEwLCBsZXNzX3RoYW5fMTApOwotICBNYXRjaGVyPGludCY+IG01ID0gQW55T2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCwgbGVzc190aGFuXzEwKTsKLX0KLQotVEVTVChBbnlPZlRlc3QsIEV4cGxhaW5zUmVzdWx0KSB7Ci0gIE1hdGNoZXI8aW50PiBtOwotCi0gIC8vIEZhaWxlZCBtYXRjaC4gIEJvdGggbWF0Y2hlcnMgbmVlZCB0byBleHBsYWluLiAgVGhlIHNlY29uZAotICAvLyBtYXRjaGVyIGRvZXNuJ3QgZ2l2ZSBhbiBleHBsYW5hdGlvbiwgc28gb25seSB0aGUgZmlyc3QgbWF0Y2hlcidzCi0gIC8vIGV4cGxhbmF0aW9uIGlzIHByaW50ZWQuCi0gIG0gPSBBbnlPZihHcmVhdGVyVGhhbigxMCksIEx0KDApKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyA1IGxlc3MgdGhhbiAxMCIsIEV4cGxhaW4obSwgNSkpOwotCi0gIC8vIEZhaWxlZCBtYXRjaC4gIEJvdGggbWF0Y2hlcnMgbmVlZCB0byBleHBsYWluLgotICBtID0gQW55T2YoR3JlYXRlclRoYW4oMTApLCBHcmVhdGVyVGhhbigyMCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDUgbGVzcyB0aGFuIDEwLCBhbmQgd2hpY2ggaXMgMTUgbGVzcyB0aGFuIDIwIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgNSkpOwotCi0gIC8vIEZhaWxlZCBtYXRjaC4gIEFsbCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uICBUaGUgc2Vjb25kCi0gIC8vIG1hdGNoZXIgZG9lc24ndCBnaXZlbiBhbiBleHBsYW5hdGlvbi4KLSAgbSA9IEFueU9mKEdyZWF0ZXJUaGFuKDEwKSwgR3QoMjApLCBHcmVhdGVyVGhhbigzMCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDUgbGVzcyB0aGFuIDEwLCBhbmQgd2hpY2ggaXMgMjUgbGVzcyB0aGFuIDMwIiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgNSkpOwotCi0gIC8vIEZhaWxlZCBtYXRjaC4gIEFsbCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uCi0gIG0gPSBBbnlPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSwgR3JlYXRlclRoYW4oMzApKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyA1IGxlc3MgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDE1IGxlc3MgdGhhbiAyMCwgIgotICAgICAgICAgICAgImFuZCB3aGljaCBpcyAyNSBsZXNzIHRoYW4gMzAiLAotICAgICAgICAgICAgRXhwbGFpbihtLCA1KSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIFRoZSBmaXJzdCBtYXRjaGVyLCB3aGljaCBzdWNjZWVkZWQsIG5lZWRzIHRvCi0gIC8vIGV4cGxhaW4uCi0gIG0gPSBBbnlPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaXMgNSBtb3JlIHRoYW4gMTAiLCBFeHBsYWluKG0sIDE1KSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIFRoZSBzZWNvbmQgbWF0Y2hlciwgd2hpY2ggc3VjY2VlZGVkLCBuZWVkcyB0bwotICAvLyBleHBsYWluLiAgU2luY2UgaXQgZG9lc24ndCBnaXZlbiBhbiBleHBsYW5hdGlvbiwgbm90aGluZyBpcwotICAvLyBwcmludGVkLgotICBtID0gQW55T2YoR3JlYXRlclRoYW4oMTApLCBMdCgzMCkpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgMCkpOwotCi0gIC8vIFN1Y2Nlc3NmdWwgbWF0Y2guICBUaGUgc2Vjb25kIG1hdGNoZXIsIHdoaWNoIHN1Y2NlZWRlZCwgbmVlZHMgdG8KLSAgLy8gZXhwbGFpbi4KLSAgbSA9IEFueU9mKEdyZWF0ZXJUaGFuKDMwKSwgR3JlYXRlclRoYW4oMjApKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyA1IG1vcmUgdGhhbiAyMCIsIEV4cGxhaW4obSwgMjUpKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHByZWRpY2F0ZSBmdW5jdG9yIGFyZSBmb3IKLS8vIHRlc3RpbmcgdGhlIFRydWx5KHByZWRpY2F0ZSkgbWF0Y2hlci4KLQotLy8gUmV0dXJucyBub24temVybyBpZiB0aGUgaW5wdXQgaXMgcG9zaXRpdmUuICBOb3RlIHRoYXQgdGhlIHJldHVybgotLy8gdHlwZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBib29sLiAgSXQncyBPSyBhcyBUcnVseSgpIGFjY2VwdHMgYW55Ci0vLyB1bmFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHdob3NlIHJldHVybiB0eXBlIGNhbiBiZSBpbXBsaWNpdGx5Ci0vLyBjb252ZXJ0ZWQgdG8gYm9vbC4KLWludCBJc1Bvc2l0aXZlKGRvdWJsZSB4KSB7Ci0gIHJldHVybiB4ID4gMCA/IDEgOiAwOwotfQotCi0vLyBUaGlzIGZ1bmN0b3IgcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuCi0vLyBudW1iZXIuCi1jbGFzcyBJc0dyZWF0ZXJUaGFuIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IElzR3JlYXRlclRoYW4oaW50IHRocmVzaG9sZCkgOiB0aHJlc2hvbGRfKHRocmVzaG9sZCkge30KLQotICBib29sIG9wZXJhdG9yKCkoaW50IG4pIGNvbnN0IHsgcmV0dXJuIG4gPiB0aHJlc2hvbGRfOyB9Ci0KLSBwcml2YXRlOgotICBpbnQgdGhyZXNob2xkXzsKLX07Ci0KLS8vIEZvciB0ZXN0aW5nIFRydWx5KCkuCi1jb25zdCBpbnQgZm9vID0gMDsKLQotLy8gVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmZiB0aGUgYXJndW1lbnQgcmVmZXJlbmNlcyBmb28gYW5kIGhhcwotLy8gYSB6ZXJvIHZhbHVlLgotYm9vbCBSZWZlcmVuY2VzRm9vQW5kSXNaZXJvKGNvbnN0IGludCYgbikgewotICByZXR1cm4gKCZuID09ICZmb28pICYmIChuID09IDApOwotfQotCi0vLyBUZXN0cyB0aGF0IFRydWx5KHByZWRpY2F0ZSkgbWF0Y2hlcyB3aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4KLS8vIHByZWRpY2F0ZS4KLVRFU1QoVHJ1bHlUZXN0LCBNYXRjaGVzV2hhdFNhdGlzZmllc1RoZVByZWRpY2F0ZSkgewotICBNYXRjaGVyPGRvdWJsZT4gbSA9IFRydWx5KElzUG9zaXRpdmUpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMi4wKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoLTEuNSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFRydWx5KHByZWRpY2F0ZV9mdW5jdG9yKSB3b3JrcyB0b28uCi1URVNUKFRydWx5VGVzdCwgQ2FuQmVVc2VkV2l0aEZ1bmN0b3IpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBUcnVseShJc0dyZWF0ZXJUaGFuKDUpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDYpKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg0KSk7Ci19Ci0KLS8vIEEgY2xhc3MgdGhhdCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYm9vbC4KLWNsYXNzIENvbnZlcnRpYmxlVG9Cb29sIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbnZlcnRpYmxlVG9Cb29sKGludCBudW1iZXIpIDogbnVtYmVyXyhudW1iZXIpIHt9Ci0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBudW1iZXJfICE9IDA7IH0KLQotIHByaXZhdGU6Ci0gIGludCBudW1iZXJfOwotfTsKLQotQ29udmVydGlibGVUb0Jvb2wgSXNOb3RaZXJvKGludCBudW1iZXIpIHsKLSAgcmV0dXJuIENvbnZlcnRpYmxlVG9Cb29sKG51bWJlcik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIHByZWRpY2F0ZSB1c2VkIGluIFRydWx5KCkgbWF5IHJldHVybiBhIGNsYXNzIHRoYXQncwotLy8gaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBib29sLCBldmVuIHdoZW4gdGhlIGNsYXNzIGhhcyBubwotLy8gb3BlcmF0b3IhKCkuCi1URVNUKFRydWx5VGVzdCwgUHJlZGljYXRlQ2FuUmV0dXJuQUNsYXNzQ29udmVydGlibGVUb0Jvb2wpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBUcnVseShJc05vdFplcm8pOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBUcnVseShwcmVkaWNhdGUpIGNhbiBkZXNjcmliZSBpdHNlbGYgcHJvcGVybHkuCi1URVNUKFRydWx5VGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8ZG91YmxlPiBtID0gVHJ1bHkoSXNQb3NpdGl2ZSk7Ci0gIEVYUEVDVF9FUSgic2F0aXNmaWVzIHRoZSBnaXZlbiBwcmVkaWNhdGUiLAotICAgICAgICAgICAgRGVzY3JpYmUobSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFRydWx5KHByZWRpY2F0ZSkgd29ya3Mgd2hlbiB0aGUgbWF0Y2hlciB0YWtlcyBpdHMKLS8vIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZS4KLVRFU1QoVHJ1bHlUZXN0LCBXb3Jrc0ZvckJ5UmVmQXJndW1lbnRzKSB7Ci0gIE1hdGNoZXI8Y29uc3QgaW50Jj4gbSA9IFRydWx5KFJlZmVyZW5jZXNGb29BbmRJc1plcm8pOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoZm9vKSk7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhuKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlcyhtKSBpcyBhIHByZWRpY2F0ZSBzYXRpc2ZpZWQgYnkgd2hhdGV2ZXIgdGhhdAotLy8gbWF0Y2hlcyBtYXRjaGVyIG0uCi1URVNUKE1hdGNoZXNUZXN0LCBJc1NhdGlzZmllZEJ5V2hhdE1hdGNoZXNUaGVNYXRjaGVyKSB7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoZXMoR2UoMCkpKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoZXMoRXEoJ2EnKSkoJ2InKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTWF0Y2hlcyhtKSB3b3JrcyB3aGVuIHRoZSBtYXRjaGVyIHRha2VzIGl0cyBhcmd1bWVudCBieQotLy8gcmVmZXJlbmNlLgotVEVTVChNYXRjaGVzVGVzdCwgV29ya3NPbkJ5UmVmQXJndW1lbnRzKSB7Ci0gIGludCBtID0gMCwgbiA9IDA7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoZXMoQWxsT2YoUmVmKG4pLCBFcSgwKSkpKG4pKTsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoZXMoUmVmKG0pKShuKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBNYXRjaGVyIG9uIG5vbi1yZWZlcmVuY2UgdHlwZSBjYW4gYmUgdXNlZCBpbgotLy8gTWF0Y2hlcygpLgotVEVTVChNYXRjaGVzVGVzdCwgV29ya3NXaXRoTWF0Y2hlck9uTm9uUmVmVHlwZSkgewotICBNYXRjaGVyPGludD4gZXE1ID0gRXEoNSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoZXMoZXE1KSg1KSk7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaGVzKGVxNSkoMikpOwotfQotCi0vLyBUZXN0cyBWYWx1ZSh2YWx1ZSwgbWF0Y2hlcikuICBTaW5jZSBWYWx1ZSgpIGlzIGEgc2ltcGxlIHdyYXBwZXIgZm9yCi0vLyBNYXRjaGVzKCksIHdoaWNoIGhhcyBiZWVuIHRlc3RlZCBhbHJlYWR5LCB3ZSBkb24ndCBzcGVuZCBhIGxvdCBvZgotLy8gZWZmb3J0IG9uIHRlc3RpbmcgVmFsdWUoKS4KLVRFU1QoVmFsdWVUZXN0LCBXb3Jrc1dpdGhQb2x5bW9ycGhpY01hdGNoZXIpIHsKLSAgRVhQRUNUX1RSVUUoVmFsdWUoImhpIiwgU3RhcnRzV2l0aCgiaCIpKSk7Ci0gIEVYUEVDVF9GQUxTRShWYWx1ZSg1LCBHdCgxMCkpKTsKLX0KLQotVEVTVChWYWx1ZVRlc3QsIFdvcmtzV2l0aE1vbm9tb3JwaGljTWF0Y2hlcikgewotICBjb25zdCBNYXRjaGVyPGludD4gaXNfemVybyA9IEVxKDApOwotICBFWFBFQ1RfVFJVRShWYWx1ZSgwLCBpc196ZXJvKSk7Ci0gIEVYUEVDVF9GQUxTRShWYWx1ZSgnYScsIGlzX3plcm8pKTsKLQotICBpbnQgbiA9IDA7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgaW50Jj4gcmVmX24gPSBSZWYobik7Ci0gIEVYUEVDVF9UUlVFKFZhbHVlKG4sIHJlZl9uKSk7Ci0gIEVYUEVDVF9GQUxTRShWYWx1ZSgxLCByZWZfbikpOwotfQotCi1URVNUKEV4cGxhaW5NYXRjaFJlc3VsdFRlc3QsIFdvcmtzV2l0aFBvbHltb3JwaGljTWF0Y2hlcikgewotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKLSAgRVhQRUNUX1RSVUUoRXhwbGFpbk1hdGNoUmVzdWx0KFBvbHltb3JwaGljSXNFdmVuKCksIDQyLCAmbGlzdGVuZXIxKSk7Ci0gIEVYUEVDVF9FUSgiJSAyID09IDAiLCBsaXN0ZW5lcjEuc3RyKCkpOwotCi0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIyOwotICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KEdlKDQyKSwgMS41LCAmbGlzdGVuZXIyKSk7Ci0gIEVYUEVDVF9FUSgiIiwgbGlzdGVuZXIyLnN0cigpKTsKLX0KLQotVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBXb3Jrc1dpdGhNb25vbW9ycGhpY01hdGNoZXIpIHsKLSAgY29uc3QgTWF0Y2hlcjxpbnQ+IGlzX2V2ZW4gPSBQb2x5bW9ycGhpY0lzRXZlbigpOwotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKLSAgRVhQRUNUX1RSVUUoRXhwbGFpbk1hdGNoUmVzdWx0KGlzX2V2ZW4sIDQyLCAmbGlzdGVuZXIxKSk7Ci0gIEVYUEVDVF9FUSgiJSAyID09IDAiLCBsaXN0ZW5lcjEuc3RyKCkpOwotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgZG91YmxlJj4gaXNfemVybyA9IEVxKDApOwotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMjsKLSAgRVhQRUNUX0ZBTFNFKEV4cGxhaW5NYXRjaFJlc3VsdChpc196ZXJvLCAxLjUsICZsaXN0ZW5lcjIpKTsKLSAgRVhQRUNUX0VRKCIiLCBsaXN0ZW5lcjIuc3RyKCkpOwotfQotCi1NQVRDSEVSX1AoUmVhbGx5LCBpbm5lcl9tYXRjaGVyLCAiIikgewotICByZXR1cm4gRXhwbGFpbk1hdGNoUmVzdWx0KGlubmVyX21hdGNoZXIsIGFyZywgcmVzdWx0X2xpc3RlbmVyKTsKLX0KLQotVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBXb3Jrc0luc2lkZU1BVENIRVIpIHsKLSAgRVhQRUNUX1RIQVQoMCwgUmVhbGx5KEVxKDApKSk7Ci19Ci0KLVRFU1QoQWxsQXJnc1Rlc3QsIFdvcmtzRm9yVHVwbGUpIHsKLSAgRVhQRUNUX1RIQVQobWFrZV90dXBsZSgxLCAyTCksIEFsbEFyZ3MoTHQoKSkpOwotICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKDJMLCAxKSwgTm90KEFsbEFyZ3MoTHQoKSkpKTsKLX0KLQotVEVTVChBbGxBcmdzVGVzdCwgV29ya3NGb3JOb25UdXBsZSkgewotICBFWFBFQ1RfVEhBVCg0MiwgQWxsQXJncyhHdCgwKSkpOwotICBFWFBFQ1RfVEhBVCgnYScsIE5vdChBbGxBcmdzKEVxKCdiJykpKSk7Ci19Ci0KLWNsYXNzIEFsbEFyZ3NIZWxwZXIgewotIHB1YmxpYzoKLSAgQWxsQXJnc0hlbHBlcigpIHt9Ci0KLSAgTU9DS19NRVRIT0QyKEhlbHBlciwgaW50KGNoYXIgeCwgaW50IHkpKTsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWxsQXJnc0hlbHBlcik7Ci19OwotCi1URVNUKEFsbEFyZ3NUZXN0LCBXb3Jrc0luV2l0aENsYXVzZSkgewotICBBbGxBcmdzSGVscGVyIGhlbHBlcjsKLSAgT05fQ0FMTChoZWxwZXIsIEhlbHBlcihfLCBfKSkKLSAgICAgIC5XaXRoKEFsbEFyZ3MoTHQoKSkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBFWFBFQ1RfQ0FMTChoZWxwZXIsIEhlbHBlcihfLCBfKSk7Ci0gIEVYUEVDVF9DQUxMKGhlbHBlciwgSGVscGVyKF8sIF8pKQotICAgICAgLldpdGgoQWxsQXJncyhHdCgpKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOwotCi0gIEVYUEVDVF9FUSgxLCBoZWxwZXIuSGVscGVyKCdcMScsIDIpKTsKLSAgRVhQRUNUX0VRKDIsIGhlbHBlci5IZWxwZXIoJ2EnLCAxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKSB3b3JrIHdoZW4gdGhlIHZhbHVlCi0vLyBtYXRjaGVzIHRoZSBtYXRjaGVyLgotVEVTVChNYXRjaGVyQXNzZXJ0aW9uVGVzdCwgV29ya3NXaGVuTWF0Y2hlcklzU2F0aXNmaWVkKSB7Ci0gIEFTU0VSVF9USEFUKDUsIEdlKDIpKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBBU1NFUlRfVEhBVCgiRm9vIiwgRW5kc1dpdGgoIm9vIikpOwotICBFWFBFQ1RfVEhBVCgyLCBBbGxPZihMZSg3KSwgR2UoMCkpKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZCB0b28uIjsKLSAgRVhQRUNUX1RIQVQoIkhlbGxvIiwgU3RhcnRzV2l0aCgiSGVsbCIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBU1NFUlRfVEhBVCgpIGFuZCBFWFBFQ1RfVEhBVCgpIHdvcmsgd2hlbiB0aGUgdmFsdWUKLS8vIGRvZXNuJ3QgbWF0Y2ggdGhlIG1hdGNoZXIuCi1URVNUKE1hdGNoZXJBc3NlcnRpb25UZXN0LCBXb3Jrc1doZW5NYXRjaGVySXNOb3RTYXRpc2ZpZWQpIHsKLSAgLy8gJ24nIG11c3QgYmUgc3RhdGljIGFzIGl0IGlzIHVzZWQgaW4gYW4gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSwKLSAgLy8gd2hpY2ggY2Fubm90IHJlZmVyZW5jZSBhdXRvIHZhcmlhYmxlcy4KLSAgc3RhdGljIHVuc2lnbmVkIHNob3J0IG47ICAvLyBOT0xJTlQKLSAgbiA9IDU7Ci0KLSAgLy8gVkMrKyBwcmlvciB0byB2ZXJzaW9uIDguMCBTUDEgaGFzIGEgYnVnIHdoZXJlIGl0IHdpbGwgbm90IHNlZSBhbnkKLSAgLy8gZnVuY3Rpb25zIGRlY2xhcmVkIGluIHRoZSBuYW1lc3BhY2Ugc2NvcGUgZnJvbSB3aXRoaW4gbmVzdGVkIGNsYXNzZXMuCi0gIC8vIEVYUEVDVC9BU1NFUlRfKE5PTilGQVRBTF9GQUlMVVJFIG1hY3JvcyB1c2UgbmVzdGVkIGNsYXNzZXMgc28gdGhhdCBhbGwKLSAgLy8gbmFtZXNwYWNlLWxldmVsIGZ1bmN0aW9ucyBpbnZva2VkIGluc2lkZSB0aGVtIG5lZWQgdG8gYmUgZXhwbGljaXRseQotICAvLyByZXNvbHZlZC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RIQVQobiwgOjp0ZXN0aW5nOjpHdCgxMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IG5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBpcyA+IDEwXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogNSIgKyBPZlR5cGUoInVuc2lnbmVkIHNob3J0IikpOwotICBuID0gMDsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBFWFBFQ1RfVEhBVChuLCA6OnRlc3Rpbmc6OkFsbE9mKDo6dGVzdGluZzo6TGUoNyksIDo6dGVzdGluZzo6R2UoNSkpKSwKLSAgICAgICJWYWx1ZSBvZjogblxuIgotICAgICAgIkV4cGVjdGVkOiAoaXMgPD0gNykgYW5kIChpcyA+PSA1KVxuIgotICAgICAgIiAgQWN0dWFsOiAwIiArIE9mVHlwZSgidW5zaWduZWQgc2hvcnQiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKSB3b3JrIHdoZW4gdGhlIGFyZ3VtZW50Ci0vLyBoYXMgYSByZWZlcmVuY2UgdHlwZS4KLVRFU1QoTWF0Y2hlckFzc2VydGlvblRlc3QsIFdvcmtzRm9yQnlSZWZBcmd1bWVudHMpIHsKLSAgLy8gV2UgdXNlIGEgc3RhdGljIHZhcmlhYmxlIGhlcmUgYXMgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW5ub3QKLSAgLy8gcmVmZXJlbmNlIGF1dG8gdmFyaWFibGVzLgotICBzdGF0aWMgaW50IG47Ci0gIG4gPSAwOwotICBFWFBFQ1RfVEhBVChuLCBBbGxPZihMZSg3KSwgUmVmKG4pKSk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9USEFUKG4sIDo6dGVzdGluZzo6Tm90KDo6dGVzdGluZzo6UmVmKG4pKSksCi0gICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogblxuIgotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGRvZXMgbm90IHJlZmVyZW5jZSB0aGUgdmFyaWFibGUgQCIpOwotICAvLyBUZXN0cyB0aGUgIkFjdHVhbCIgcGFydC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RIQVQobiwgOjp0ZXN0aW5nOjpOb3QoOjp0ZXN0aW5nOjpSZWYobikpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFjdHVhbDogMCIgKyBPZlR5cGUoImludCIpICsgIiwgd2hpY2ggaXMgbG9jYXRlZCBAIik7Ci19Ci0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTgotLy8gVGVzdHMgdGhhdCBBU1NFUlRfVEhBVCgpIGFuZCBFWFBFQ1RfVEhBVCgpIHdvcmsgd2hlbiB0aGUgbWF0Y2hlciBpcwotLy8gbW9ub21vcnBoaWMuCi0KLS8vIEFTU0VSVF9USEFUKCJoZWxsbyIsIHN0YXJ0c193aXRoX2hlKSBmYWlscyB0byBjb21waWxlIHdpdGggTm9raWEncwotLy8gU3ltYmlhbiBjb21waWxlcjogaXQgdHJpZXMgdG8gY29tcGlsZQotLy8gdGVtcGxhdGU8VCwgVT4gY2xhc3MgTWF0Y2hlckNhc3RJbXBsIHsgLi4uCi0vLyAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCAuLi4pIGNvbnN0IHsKLS8vICAgICByZXR1cm4gc291cmNlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzdGF0aWNfY2FzdDxVPih4KSwgLi4uKTsKLS8vIHdpdGggVSA9PSBzdHJpbmcgYW5kIFQgPT0gY29uc3QgY2hhcioKLS8vIFdpdGggQVNTRVJUX1RIQVQoImhlbGxvIi4uLikgY2hhbmdlZCB0byBBU1NFUlRfVEhBVChzdHJpbmcoImhlbGxvIikgLi4uICkKLS8vIHRoZSBjb21waWxlciBzaWxlbnRseSBjcmFzaGVzIHdpdGggbm8gb3V0cHV0LgotLy8gSWYgTWF0Y2hlckNhc3RJbXBsIGlzIGNoYW5nZWQgdG8gdXNlIFUoeCkgaW5zdGVhZCBvZiBzdGF0aWNfY2FzdDxVPih4KQotLy8gdGhlIGNvZGUgY29tcGlsZXMgYnV0IHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGlzIGJvZ3VzLgotVEVTVChNYXRjaGVyQXNzZXJ0aW9uVGVzdCwgV29ya3NGb3JNb25vbW9ycGhpY01hdGNoZXIpIHsKLSAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gc3RhcnRzX3dpdGhfaGUgPSBTdGFydHNXaXRoKCJoZSIpOwotICBBU1NFUlRfVEhBVCgiaGVsbG8iLCBzdGFydHNfd2l0aF9oZSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBlbmRzX3dpdGhfb2sgPSBFbmRzV2l0aCgib2siKTsKLSAgQVNTRVJUX1RIQVQoImJvb2siLCBlbmRzX3dpdGhfb2spOwotICBjb25zdCBzdHJpbmcgYmFkID0gImJhZCI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USEFUKGJhZCwgZW5kc193aXRoX29rKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBiYWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBlbmRzIHdpdGggXCJva1wiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJiYWRcIiIpOwotICBNYXRjaGVyPGludD4gaXNfZ3JlYXRlcl90aGFuXzUgPSBHdCg1KTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIQVQoNSwgaXNfZ3JlYXRlcl90aGFuXzUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDVcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBpcyA+IDVcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiA1IiArIE9mVHlwZSgiaW50IikpOwotfQotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgotCi0vLyBUZXN0cyBmbG9hdGluZy1wb2ludCBtYXRjaGVycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgotY2xhc3MgRmxvYXRpbmdQb2ludFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB0eXBlZGVmIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ1BvaW50PFJhd1R5cGU+IEZsb2F0aW5nOwotICB0eXBlZGVmIHR5cGVuYW1lIEZsb2F0aW5nOjpCaXRzIEJpdHM7Ci0KLSAgRmxvYXRpbmdQb2ludFRlc3QoKQotICAgICAgOiBtYXhfdWxwc18oRmxvYXRpbmc6OmtNYXhVbHBzKSwKLSAgICAgICAgemVyb19iaXRzXyhGbG9hdGluZygwKS5iaXRzKCkpLAotICAgICAgICBvbmVfYml0c18oRmxvYXRpbmcoMSkuYml0cygpKSwKLSAgICAgICAgaW5maW5pdHlfYml0c18oRmxvYXRpbmcoRmxvYXRpbmc6OkluZmluaXR5KCkpLmJpdHMoKSksCi0gICAgICAgIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fKAotICAgICAgICAgICAgRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyh6ZXJvX2JpdHNfICsgbWF4X3VscHNfLzIpKSwKLSAgICAgICAgY2xvc2VfdG9fbmVnYXRpdmVfemVyb18oCi0gICAgICAgICAgICAtRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyh6ZXJvX2JpdHNfICsgbWF4X3VscHNfIC0gbWF4X3VscHNfLzIpKSwKLSAgICAgICAgZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm9fKC1GbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAotICAgICAgICAgICAgemVyb19iaXRzXyArIG1heF91bHBzXyArIDEgLSBtYXhfdWxwc18vMikpLAotICAgICAgICBjbG9zZV90b19vbmVfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMob25lX2JpdHNfICsgbWF4X3VscHNfKSksCi0gICAgICAgIGZ1cnRoZXJfZnJvbV9vbmVfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMob25lX2JpdHNfICsgbWF4X3VscHNfICsgMSkpLAotICAgICAgICBpbmZpbml0eV8oRmxvYXRpbmc6OkluZmluaXR5KCkpLAotICAgICAgICBjbG9zZV90b19pbmZpbml0eV8oCi0gICAgICAgICAgICBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKGluZmluaXR5X2JpdHNfIC0gbWF4X3VscHNfKSksCi0gICAgICAgIGZ1cnRoZXJfZnJvbV9pbmZpbml0eV8oCi0gICAgICAgICAgICBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKGluZmluaXR5X2JpdHNfIC0gbWF4X3VscHNfIC0gMSkpLAotICAgICAgICBtYXhfKEZsb2F0aW5nOjpNYXgoKSksCi0gICAgICAgIG5hbjFfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoRmxvYXRpbmc6OmtFeHBvbmVudEJpdE1hc2sgfCAxKSksCi0gICAgICAgIG5hbjJfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoRmxvYXRpbmc6OmtFeHBvbmVudEJpdE1hc2sgfCAyMDApKSB7Ci0gIH0KLQotICB2b2lkIFRlc3RTaXplKCkgewotICAgIEVYUEVDVF9FUShzaXplb2YoUmF3VHlwZSksIHNpemVvZihCaXRzKSk7Ci0gIH0KLQotICAvLyBBIGJhdHRlcnkgb2YgdGVzdHMgZm9yIEZsb2F0aW5nRXFNYXRjaGVyOjpNYXRjaGVzLgotICAvLyBtYXRjaGVyX21ha2VyIGlzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBGbG9hdGluZ0VxTWF0Y2hlci4KLSAgdm9pZCBUZXN0TWF0Y2hlcygKLSAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxSYXdUeXBlPiAoKm1hdGNoZXJfbWFrZXIpKFJhd1R5cGUpKSB7Ci0gICAgTWF0Y2hlcjxSYXdUeXBlPiBtMSA9IG1hdGNoZXJfbWFrZXIoMC4wKTsKLSAgICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKC0wLjApKTsKLSAgICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fKSk7Ci0gICAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhjbG9zZV90b19uZWdhdGl2ZV96ZXJvXykpOwotICAgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKDEuMCkpOwotCi0gICAgTWF0Y2hlcjxSYXdUeXBlPiBtMiA9IG1hdGNoZXJfbWFrZXIoY2xvc2VfdG9fcG9zaXRpdmVfemVyb18pOwotICAgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKGZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvXykpOwotCi0gICAgTWF0Y2hlcjxSYXdUeXBlPiBtMyA9IG1hdGNoZXJfbWFrZXIoMS4wKTsKLSAgICBFWFBFQ1RfVFJVRShtMy5NYXRjaGVzKGNsb3NlX3RvX29uZV8pKTsKLSAgICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhmdXJ0aGVyX2Zyb21fb25lXykpOwotCi0gICAgLy8gVGVzdCBjb21tdXRhdGl2aXR5OiBtYXRjaGVyX21ha2VyKDAuMCkuTWF0Y2hlcygxLjApIHdhcyB0ZXN0ZWQgYWJvdmUuCi0gICAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoMC4wKSk7Ci0KLSAgICBNYXRjaGVyPFJhd1R5cGU+IG00ID0gbWF0Y2hlcl9tYWtlcigtaW5maW5pdHlfKTsKLSAgICBFWFBFQ1RfVFJVRShtNC5NYXRjaGVzKC1jbG9zZV90b19pbmZpbml0eV8pKTsKLQotICAgIE1hdGNoZXI8UmF3VHlwZT4gbTUgPSBtYXRjaGVyX21ha2VyKGluZmluaXR5Xyk7Ci0gICAgRVhQRUNUX1RSVUUobTUuTWF0Y2hlcyhjbG9zZV90b19pbmZpbml0eV8pKTsKLQotICAgIC8vIFRoaXMgaXMgaW50ZXJlc3RpbmcgYXMgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eV8gYW5kIG5hbjFfCi0gICAgLy8gYXJlIG9ubHkgMSBETFAgYXBhcnQuCi0gICAgRVhQRUNUX0ZBTFNFKG01Lk1hdGNoZXMobmFuMV8pKTsKLQotICAgIC8vIG1hdGNoZXJfbWFrZXIgY2FuIHByb2R1Y2UgYSBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiwgd2hpY2ggaXMgbmVlZGVkIGluCi0gICAgLy8gc29tZSBjYXNlcy4KLSAgICBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiBtNiA9IG1hdGNoZXJfbWFrZXIoMC4wKTsKLSAgICBFWFBFQ1RfVFJVRShtNi5NYXRjaGVzKC0wLjApKTsKLSAgICBFWFBFQ1RfVFJVRShtNi5NYXRjaGVzKGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG02Lk1hdGNoZXMoMS4wKSk7Ci0KLSAgICAvLyBtYXRjaGVyX21ha2VyIGNhbiBwcm9kdWNlIGEgTWF0Y2hlcjxSYXdUeXBlJj4sIHdoaWNoIGlzIG5lZWRlZCBpbiBzb21lCi0gICAgLy8gY2FzZXMuCi0gICAgTWF0Y2hlcjxSYXdUeXBlJj4gbTcgPSBtYXRjaGVyX21ha2VyKDAuMCk7Ci0gICAgUmF3VHlwZSB4ID0gMC4wOwotICAgIEVYUEVDVF9UUlVFKG03Lk1hdGNoZXMoeCkpOwotICAgIHggPSAwLjAxZjsKLSAgICBFWFBFQ1RfRkFMU0UobTcuTWF0Y2hlcyh4KSk7Ci0gIH0KLQotICAvLyBQcmUtY2FsY3VsYXRlZCBudW1iZXJzIHRvIGJlIHVzZWQgYnkgdGhlIHRlc3RzLgotCi0gIGNvbnN0IHNpemVfdCBtYXhfdWxwc187Ci0KLSAgY29uc3QgQml0cyB6ZXJvX2JpdHNfOyAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMC4wLgotICBjb25zdCBCaXRzIG9uZV9iaXRzXzsgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IDEuMC4KLSAgY29uc3QgQml0cyBpbmZpbml0eV9iaXRzXzsgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50ICtpbmZpbml0eS4KLQotICAvLyBTb21lIG51bWJlcnMgY2xvc2UgdG8gMC4wLgotICBjb25zdCBSYXdUeXBlIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fOwotICBjb25zdCBSYXdUeXBlIGNsb3NlX3RvX25lZ2F0aXZlX3plcm9fOwotICBjb25zdCBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvXzsKLQotICAvLyBTb21lIG51bWJlcnMgY2xvc2UgdG8gMS4wLgotICBjb25zdCBSYXdUeXBlIGNsb3NlX3RvX29uZV87Ci0gIGNvbnN0IFJhd1R5cGUgZnVydGhlcl9mcm9tX29uZV87Ci0KLSAgLy8gU29tZSBudW1iZXJzIGNsb3NlIHRvICtpbmZpbml0eS4KLSAgY29uc3QgUmF3VHlwZSBpbmZpbml0eV87Ci0gIGNvbnN0IFJhd1R5cGUgY2xvc2VfdG9faW5maW5pdHlfOwotICBjb25zdCBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9pbmZpbml0eV87Ci0KLSAgLy8gTWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIHRoYXQncyBub3QgaW5maW5pdHkuCi0gIGNvbnN0IFJhd1R5cGUgbWF4XzsKLQotICAvLyBTb21lIE5hTnMuCi0gIGNvbnN0IFJhd1R5cGUgbmFuMV87Ci0gIGNvbnN0IFJhd1R5cGUgbmFuMl87Ci19OwotCi0vLyBUZXN0cyBmbG9hdGluZy1wb2ludCBtYXRjaGVycyB3aXRoIGZpeGVkIGVwc2lsb25zLgotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Ci1jbGFzcyBGbG9hdGluZ1BvaW50TmVhclRlc3QgOiBwdWJsaWMgRmxvYXRpbmdQb2ludFRlc3Q8UmF3VHlwZT4gewotIHByb3RlY3RlZDoKLSAgdHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxSYXdUeXBlPiBQYXJlbnRUeXBlOwotCi0gIC8vIEEgYmF0dGVyeSBvZiB0ZXN0cyBmb3IgRmxvYXRpbmdFcU1hdGNoZXI6Ok1hdGNoZXMgd2l0aCBhIGZpeGVkIGVwc2lsb24uCi0gIC8vIG1hdGNoZXJfbWFrZXIgaXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIEZsb2F0aW5nRXFNYXRjaGVyLgotICB2b2lkIFRlc3ROZWFyTWF0Y2hlcygKLSAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxSYXdUeXBlPgotICAgICAgICAgICgqbWF0Y2hlcl9tYWtlcikoUmF3VHlwZSwgUmF3VHlwZSkpIHsKLSAgICBNYXRjaGVyPFJhd1R5cGU+IG0xID0gbWF0Y2hlcl9tYWtlcigwLjAsIDAuMCk7Ci0gICAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygwLjApKTsKLSAgICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKC0wLjApKTsKLSAgICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhQYXJlbnRUeXBlOjpjbG9zZV90b19wb3NpdGl2ZV96ZXJvXykpOwotICAgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKFBhcmVudFR5cGU6OmNsb3NlX3RvX25lZ2F0aXZlX3plcm9fKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoMS4wKSk7Ci0KLSAgICBNYXRjaGVyPFJhd1R5cGU+IG0yID0gbWF0Y2hlcl9tYWtlcigwLjAsIDEuMCk7Ci0gICAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwLjApKTsKLSAgICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKC0wLjApKTsKLSAgICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDEuMCkpOwotICAgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoLTEuMCkpOwotICAgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKFBhcmVudFR5cGU6OmNsb3NlX3RvX29uZV8pKTsKLSAgICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygtUGFyZW50VHlwZTo6Y2xvc2VfdG9fb25lXykpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCBpbmYgbWF0Y2hlcyBpbmYsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9mIHRoZSBzcGVjaWZpZWQgbWF4Ci0gICAgLy8gYWJzb2x1dGUgZXJyb3IuCi0gICAgTWF0Y2hlcjxSYXdUeXBlPiBtMyA9IG1hdGNoZXJfbWFrZXIoUGFyZW50VHlwZTo6aW5maW5pdHlfLCAwLjApOwotICAgIEVYUEVDVF9UUlVFKG0zLk1hdGNoZXMoUGFyZW50VHlwZTo6aW5maW5pdHlfKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoUGFyZW50VHlwZTo6Y2xvc2VfdG9faW5maW5pdHlfKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoLVBhcmVudFR5cGU6OmluZmluaXR5XykpOwotCi0gICAgTWF0Y2hlcjxSYXdUeXBlPiBtNCA9IG1hdGNoZXJfbWFrZXIoLVBhcmVudFR5cGU6OmluZmluaXR5XywgMC4wKTsKLSAgICBFWFBFQ1RfVFJVRShtNC5NYXRjaGVzKC1QYXJlbnRUeXBlOjppbmZpbml0eV8pKTsKLSAgICBFWFBFQ1RfRkFMU0UobTQuTWF0Y2hlcygtUGFyZW50VHlwZTo6Y2xvc2VfdG9faW5maW5pdHlfKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG00Lk1hdGNoZXMoUGFyZW50VHlwZTo6aW5maW5pdHlfKSk7Ci0KLSAgICAvLyBUZXN0IHZhcmlvdXMgb3ZlcmZsb3cgc2NlbmFyaW9zLgotICAgIE1hdGNoZXI8UmF3VHlwZT4gbTUgPSBtYXRjaGVyX21ha2VyKFBhcmVudFR5cGU6Om1heF8sIFBhcmVudFR5cGU6Om1heF8pOwotICAgIEVYUEVDVF9UUlVFKG01Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOwotICAgIEVYUEVDVF9GQUxTRShtNS5NYXRjaGVzKC1QYXJlbnRUeXBlOjptYXhfKSk7Ci0KLSAgICBNYXRjaGVyPFJhd1R5cGU+IG02ID0gbWF0Y2hlcl9tYWtlcigtUGFyZW50VHlwZTo6bWF4XywgUGFyZW50VHlwZTo6bWF4Xyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG02Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOwotICAgIEVYUEVDVF9UUlVFKG02Lk1hdGNoZXMoLVBhcmVudFR5cGU6Om1heF8pKTsKLQotICAgIE1hdGNoZXI8UmF3VHlwZT4gbTcgPSBtYXRjaGVyX21ha2VyKFBhcmVudFR5cGU6Om1heF8sIDApOwotICAgIEVYUEVDVF9UUlVFKG03Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOwotICAgIEVYUEVDVF9GQUxTRShtNy5NYXRjaGVzKC1QYXJlbnRUeXBlOjptYXhfKSk7Ci0KLSAgICBNYXRjaGVyPFJhd1R5cGU+IG04ID0gbWF0Y2hlcl9tYWtlcigtUGFyZW50VHlwZTo6bWF4XywgMCk7Ci0gICAgRVhQRUNUX0ZBTFNFKG04Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOwotICAgIEVYUEVDVF9UUlVFKG04Lk1hdGNoZXMoLVBhcmVudFR5cGU6Om1heF8pKTsKLQotICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbWF4KCkgYW5kIC1tYXgoKSBub3JtYWxseSBvdmVyZmxvd3MgdG8gaW5maW5pdHksCi0gICAgLy8gYnV0IGl0IHNob3VsZCBzdGlsbCBtYXRjaCBpZiB0aGUgbWF4X2Fic19lcnJvciBpcyBhbHNvIGluZmluaXR5LgotICAgIE1hdGNoZXI8UmF3VHlwZT4gbTkgPSBtYXRjaGVyX21ha2VyKAotICAgICAgICBQYXJlbnRUeXBlOjptYXhfLCBQYXJlbnRUeXBlOjppbmZpbml0eV8pOwotICAgIEVYUEVDVF9UUlVFKG04Lk1hdGNoZXMoLVBhcmVudFR5cGU6Om1heF8pKTsKLQotICAgIC8vIG1hdGNoZXJfbWFrZXIgY2FuIHByb2R1Y2UgYSBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiwgd2hpY2ggaXMgbmVlZGVkIGluCi0gICAgLy8gc29tZSBjYXNlcy4KLSAgICBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiBtMTAgPSBtYXRjaGVyX21ha2VyKDAuMCwgMS4wKTsKLSAgICBFWFBFQ1RfVFJVRShtMTAuTWF0Y2hlcygtMC4wKSk7Ci0gICAgRVhQRUNUX1RSVUUobTEwLk1hdGNoZXMoUGFyZW50VHlwZTo6Y2xvc2VfdG9fcG9zaXRpdmVfemVyb18pKTsKLSAgICBFWFBFQ1RfRkFMU0UobTEwLk1hdGNoZXMoUGFyZW50VHlwZTo6Y2xvc2VfdG9fb25lXykpOwotCi0gICAgLy8gbWF0Y2hlcl9tYWtlciBjYW4gcHJvZHVjZSBhIE1hdGNoZXI8UmF3VHlwZSY+LCB3aGljaCBpcyBuZWVkZWQgaW4gc29tZQotICAgIC8vIGNhc2VzLgotICAgIE1hdGNoZXI8UmF3VHlwZSY+IG0xMSA9IG1hdGNoZXJfbWFrZXIoMC4wLCAxLjApOwotICAgIFJhd1R5cGUgeCA9IDAuMDsKLSAgICBFWFBFQ1RfVFJVRShtMTEuTWF0Y2hlcyh4KSk7Ci0gICAgeCA9IDEuMGY7Ci0gICAgRVhQRUNUX1RSVUUobTExLk1hdGNoZXMoeCkpOwotICAgIHggPSAtMS4wZjsKLSAgICBFWFBFQ1RfVFJVRShtMTEuTWF0Y2hlcyh4KSk7Ci0gICAgeCA9IDEuMWY7Ci0gICAgRVhQRUNUX0ZBTFNFKG0xMS5NYXRjaGVzKHgpKTsKLSAgICB4ID0gLTEuMWY7Ci0gICAgRVhQRUNUX0ZBTFNFKG0xMS5NYXRjaGVzKHgpKTsKLSAgfQotfTsKLQotLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZmxvYXRzLgotdHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxmbG9hdD4gRmxvYXRUZXN0OwotCi1URVNUX0YoRmxvYXRUZXN0LCBGbG9hdEVxQXBwcm94aW1hdGVseU1hdGNoZXNGbG9hdHMpIHsKLSAgVGVzdE1hdGNoZXMoJkZsb2F0RXEpOwotfQotCi1URVNUX0YoRmxvYXRUZXN0LCBOYW5TZW5zaXRpdmVGbG9hdEVxQXBwcm94aW1hdGVseU1hdGNoZXNGbG9hdHMpIHsKLSAgVGVzdE1hdGNoZXMoJk5hblNlbnNpdGl2ZUZsb2F0RXEpOwotfQotCi1URVNUX0YoRmxvYXRUZXN0LCBGbG9hdEVxQ2Fubm90TWF0Y2hOYU4pIHsKLSAgLy8gRmxvYXRFcSBuZXZlciBtYXRjaGVzIE5hTi4KLSAgTWF0Y2hlcjxmbG9hdD4gbSA9IEZsb2F0RXEobmFuMV8pOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjFfKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobmFuMl8pKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxLjApKTsKLX0KLQotVEVTVF9GKEZsb2F0VGVzdCwgTmFuU2Vuc2l0aXZlRmxvYXRFcUNhbk1hdGNoTmFOKSB7Ci0gIC8vIE5hblNlbnNpdGl2ZUZsb2F0RXEgd2lsbCBtYXRjaCBOYU4uCi0gIE1hdGNoZXI8ZmxvYXQ+IG0gPSBOYW5TZW5zaXRpdmVGbG9hdEVxKG5hbjFfKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5hbjFfKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4yXykpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEuMCkpOwotfQotCi1URVNUX0YoRmxvYXRUZXN0LCBGbG9hdEVxQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8ZmxvYXQ+IG0xID0gRmxvYXRFcSgyLjBmKTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIiLCBEZXNjcmliZShtMSkpOwotICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKLQotICBNYXRjaGVyPGZsb2F0PiBtMiA9IEZsb2F0RXEoMC41Zik7Ci0gIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUiLCBEZXNjcmliZShtMikpOwotICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMC41IiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOwotCi0gIE1hdGNoZXI8ZmxvYXQ+IG0zID0gRmxvYXRFcShuYW4xXyk7Ci0gIEVYUEVDVF9FUSgibmV2ZXIgbWF0Y2hlcyIsIERlc2NyaWJlKG0zKSk7Ci0gIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Ci19Ci0KLVRFU1RfRihGbG9hdFRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0RXFDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxmbG9hdD4gbTEgPSBOYW5TZW5zaXRpdmVGbG9hdEVxKDIuMGYpOwotICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlKG0xKSk7Ci0gIEVYUEVDVF9FUSgiaXNuJ3QgYXBwcm94aW1hdGVseSAyIiwgRGVzY3JpYmVOZWdhdGlvbihtMSkpOwotCi0gIE1hdGNoZXI8ZmxvYXQ+IG0yID0gTmFuU2Vuc2l0aXZlRmxvYXRFcSgwLjVmKTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDAuNSIsIERlc2NyaWJlKG0yKSk7Ci0gIEVYUEVDVF9FUSgiaXNuJ3QgYXBwcm94aW1hdGVseSAwLjUiLCBEZXNjcmliZU5lZ2F0aW9uKG0yKSk7Ci0KLSAgTWF0Y2hlcjxmbG9hdD4gbTMgPSBOYW5TZW5zaXRpdmVGbG9hdEVxKG5hbjFfKTsKLSAgRVhQRUNUX0VRKCJpcyBOYU4iLCBEZXNjcmliZShtMykpOwotICBFWFBFQ1RfRVEoImlzbid0IE5hTiIsIERlc2NyaWJlTmVnYXRpb24obTMpKTsKLX0KLQotLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZmxvYXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZAotLy8gbWF4IGFic29sdXRlIGVycm9yLgotdHlwZWRlZiBGbG9hdGluZ1BvaW50TmVhclRlc3Q8ZmxvYXQ+IEZsb2F0TmVhclRlc3Q7Ci0KLVRFU1RfRihGbG9hdE5lYXJUZXN0LCBGbG9hdE5lYXJNYXRjaGVzKSB7Ci0gIFRlc3ROZWFyTWF0Y2hlcygmRmxvYXROZWFyKTsKLX0KLQotVEVTVF9GKEZsb2F0TmVhclRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0TmVhckFwcHJveGltYXRlbHlNYXRjaGVzRmxvYXRzKSB7Ci0gIFRlc3ROZWFyTWF0Y2hlcygmTmFuU2Vuc2l0aXZlRmxvYXROZWFyKTsKLX0KLQotVEVTVF9GKEZsb2F0TmVhclRlc3QsIEZsb2F0TmVhckNhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGZsb2F0PiBtMSA9IEZsb2F0TmVhcigyLjBmLCAwLjVmKTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMSkpOwotICBFWFBFQ1RfRVEoCi0gICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAyIChhYnNvbHV0ZSBlcnJvciA+IDAuNSkiLCBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7Ci0KLSAgTWF0Y2hlcjxmbG9hdD4gbTIgPSBGbG9hdE5lYXIoMC41ZiwgMC41Zik7Ci0gIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMikpOwotICBFWFBFQ1RfRVEoCi0gICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKLQotICBNYXRjaGVyPGZsb2F0PiBtMyA9IEZsb2F0TmVhcihuYW4xXywgMC4wKTsKLSAgRVhQRUNUX0VRKCJuZXZlciBtYXRjaGVzIiwgRGVzY3JpYmUobTMpKTsKLSAgRVhQRUNUX0VRKCJpcyBhbnl0aGluZyIsIERlc2NyaWJlTmVnYXRpb24obTMpKTsKLX0KLQotVEVTVF9GKEZsb2F0TmVhclRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0TmVhckNhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGZsb2F0PiBtMSA9IE5hblNlbnNpdGl2ZUZsb2F0TmVhcigyLjBmLCAwLjVmKTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMSkpOwotICBFWFBFQ1RfRVEoCi0gICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAyIChhYnNvbHV0ZSBlcnJvciA+IDAuNSkiLCBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7Ci0KLSAgTWF0Y2hlcjxmbG9hdD4gbTIgPSBOYW5TZW5zaXRpdmVGbG9hdE5lYXIoMC41ZiwgMC41Zik7Ci0gIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMikpOwotICBFWFBFQ1RfRVEoCi0gICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKLQotICBNYXRjaGVyPGZsb2F0PiBtMyA9IE5hblNlbnNpdGl2ZUZsb2F0TmVhcihuYW4xXywgMC4xZik7Ci0gIEVYUEVDVF9FUSgiaXMgTmFOIiwgRGVzY3JpYmUobTMpKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBOYU4iLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Ci19Ci0KLVRFU1RfRihGbG9hdE5lYXJUZXN0LCBGbG9hdE5lYXJDYW5ub3RNYXRjaE5hTikgewotICAvLyBGbG9hdE5lYXIgbmV2ZXIgbWF0Y2hlcyBOYU4uCi0gIE1hdGNoZXI8ZmxvYXQ+IG0gPSBGbG9hdE5lYXIoUGFyZW50VHlwZTo6bmFuMV8sIDAuMWYpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjFfKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobmFuMl8pKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxLjApKTsKLX0KLQotVEVTVF9GKEZsb2F0TmVhclRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0TmVhckNhbk1hdGNoTmFOKSB7Ci0gIC8vIE5hblNlbnNpdGl2ZUZsb2F0TmVhciB3aWxsIG1hdGNoIE5hTi4KLSAgTWF0Y2hlcjxmbG9hdD4gbSA9IE5hblNlbnNpdGl2ZUZsb2F0TmVhcihuYW4xXywgMC4xZik7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4xXykpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobmFuMl8pKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxLjApKTsKLX0KLQotLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZG91Ymxlcy4KLXR5cGVkZWYgRmxvYXRpbmdQb2ludFRlc3Q8ZG91YmxlPiBEb3VibGVUZXN0OwotCi1URVNUX0YoRG91YmxlVGVzdCwgRG91YmxlRXFBcHByb3hpbWF0ZWx5TWF0Y2hlc0RvdWJsZXMpIHsKLSAgVGVzdE1hdGNoZXMoJkRvdWJsZUVxKTsKLX0KLQotVEVTVF9GKERvdWJsZVRlc3QsIE5hblNlbnNpdGl2ZURvdWJsZUVxQXBwcm94aW1hdGVseU1hdGNoZXNEb3VibGVzKSB7Ci0gIFRlc3RNYXRjaGVzKCZOYW5TZW5zaXRpdmVEb3VibGVFcSk7Ci19Ci0KLVRFU1RfRihEb3VibGVUZXN0LCBEb3VibGVFcUNhbm5vdE1hdGNoTmFOKSB7Ci0gIC8vIERvdWJsZUVxIG5ldmVyIG1hdGNoZXMgTmFOLgotICBNYXRjaGVyPGRvdWJsZT4gbSA9IERvdWJsZUVxKG5hbjFfKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhuYW4xXykpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjJfKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMS4wKSk7Ci19Ci0KLVRFU1RfRihEb3VibGVUZXN0LCBOYW5TZW5zaXRpdmVEb3VibGVFcUNhbk1hdGNoTmFOKSB7Ci0gIC8vIE5hblNlbnNpdGl2ZURvdWJsZUVxIHdpbGwgbWF0Y2ggTmFOLgotICBNYXRjaGVyPGRvdWJsZT4gbSA9IE5hblNlbnNpdGl2ZURvdWJsZUVxKG5hbjFfKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5hbjFfKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4yXykpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEuMCkpOwotfQotCi1URVNUX0YoRG91YmxlVGVzdCwgRG91YmxlRXFDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxkb3VibGU+IG0xID0gRG91YmxlRXEoMi4wKTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIiLCBEZXNjcmliZShtMSkpOwotICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKLQotICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBEb3VibGVFcSgwLjUpOwotICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMC41IiwgRGVzY3JpYmUobTIpKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBhcHByb3hpbWF0ZWx5IDAuNSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKLQotICBNYXRjaGVyPGRvdWJsZT4gbTMgPSBEb3VibGVFcShuYW4xXyk7Ci0gIEVYUEVDVF9FUSgibmV2ZXIgbWF0Y2hlcyIsIERlc2NyaWJlKG0zKSk7Ci0gIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Ci19Ci0KLVRFU1RfRihEb3VibGVUZXN0LCBOYW5TZW5zaXRpdmVEb3VibGVFcUNhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGRvdWJsZT4gbTEgPSBOYW5TZW5zaXRpdmVEb3VibGVFcSgyLjApOwotICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlKG0xKSk7Ci0gIEVYUEVDVF9FUSgiaXNuJ3QgYXBwcm94aW1hdGVseSAyIiwgRGVzY3JpYmVOZWdhdGlvbihtMSkpOwotCi0gIE1hdGNoZXI8ZG91YmxlPiBtMiA9IE5hblNlbnNpdGl2ZURvdWJsZUVxKDAuNSk7Ci0gIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUiLCBEZXNjcmliZShtMikpOwotICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMC41IiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOwotCi0gIE1hdGNoZXI8ZG91YmxlPiBtMyA9IE5hblNlbnNpdGl2ZURvdWJsZUVxKG5hbjFfKTsKLSAgRVhQRUNUX0VRKCJpcyBOYU4iLCBEZXNjcmliZShtMykpOwotICBFWFBFQ1RfRVEoImlzbid0IE5hTiIsIERlc2NyaWJlTmVnYXRpb24obTMpKTsKLX0KLQotLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZmxvYXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZAotLy8gbWF4IGFic29sdXRlIGVycm9yLgotdHlwZWRlZiBGbG9hdGluZ1BvaW50TmVhclRlc3Q8ZG91YmxlPiBEb3VibGVOZWFyVGVzdDsKLQotVEVTVF9GKERvdWJsZU5lYXJUZXN0LCBEb3VibGVOZWFyTWF0Y2hlcykgewotICBUZXN0TmVhck1hdGNoZXMoJkRvdWJsZU5lYXIpOwotfQotCi1URVNUX0YoRG91YmxlTmVhclRlc3QsIE5hblNlbnNpdGl2ZURvdWJsZU5lYXJBcHByb3hpbWF0ZWx5TWF0Y2hlc0RvdWJsZXMpIHsKLSAgVGVzdE5lYXJNYXRjaGVzKCZOYW5TZW5zaXRpdmVEb3VibGVOZWFyKTsKLX0KLQotVEVTVF9GKERvdWJsZU5lYXJUZXN0LCBEb3VibGVOZWFyQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8ZG91YmxlPiBtMSA9IERvdWJsZU5lYXIoMi4wLCAwLjUpOwotICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0xKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKLQotICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBEb3VibGVOZWFyKDAuNSwgMC41KTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0yKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPiAwLjUpIiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOwotCi0gIE1hdGNoZXI8ZG91YmxlPiBtMyA9IERvdWJsZU5lYXIobmFuMV8sIDAuMCk7Ci0gIEVYUEVDVF9FUSgibmV2ZXIgbWF0Y2hlcyIsIERlc2NyaWJlKG0zKSk7Ci0gIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Ci19Ci0KLVRFU1RfRihEb3VibGVOZWFyVGVzdCwgRXhwbGFpbnNSZXN1bHRXaGVuTWF0Y2hGYWlscykgewotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4oRG91YmxlTmVhcigyLjAsIDAuMSksIDIuMDUpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyAwLjIgZnJvbSAyIiwgRXhwbGFpbihEb3VibGVOZWFyKDIuMCwgMC4xKSwgMi4yKSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaXMgLTAuMyBmcm9tIDIiLCBFeHBsYWluKERvdWJsZU5lYXIoMi4wLCAwLjEpLCAxLjcpKTsKLQotICBjb25zdCBzdHJpbmcgZXhwbGFuYXRpb24gPSBFeHBsYWluKERvdWJsZU5lYXIoMi4xLCAxZS0xMCksIDIuMSArIDEuMmUtMTApOwotICAvLyBEaWZmZXJlbnQgQysrIGltcGxlbWVudGF0aW9ucyBtYXkgcHJpbnQgZmxvYXRpbmctcG9pbnQgbnVtYmVycwotICAvLyBzbGlnaHRseSBkaWZmZXJlbnRseS4KLSAgRVhQRUNUX1RSVUUoZXhwbGFuYXRpb24gPT0gIndoaWNoIGlzIDEuMmUtMTAgZnJvbSAyLjEiIHx8ICAvLyBHQ0MKLSAgICAgICAgICAgICAgZXhwbGFuYXRpb24gPT0gIndoaWNoIGlzIDEuMmUtMDEwIGZyb20gMi4xIikgICAvLyBNU1ZDCi0gICAgICA8PCAiIHdoZXJlIGV4cGxhbmF0aW9uIGlzIFwiIiA8PCBleHBsYW5hdGlvbiA8PCAiXCIuIjsKLX0KLQotVEVTVF9GKERvdWJsZU5lYXJUZXN0LCBOYW5TZW5zaXRpdmVEb3VibGVOZWFyQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8ZG91YmxlPiBtMSA9IE5hblNlbnNpdGl2ZURvdWJsZU5lYXIoMi4wLCAwLjUpOwotICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0xKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKLQotICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBOYW5TZW5zaXRpdmVEb3VibGVOZWFyKDAuNSwgMC41KTsKLSAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0yKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPiAwLjUpIiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOwotCi0gIE1hdGNoZXI8ZG91YmxlPiBtMyA9IE5hblNlbnNpdGl2ZURvdWJsZU5lYXIobmFuMV8sIDAuMSk7Ci0gIEVYUEVDVF9FUSgiaXMgTmFOIiwgRGVzY3JpYmUobTMpKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBOYU4iLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Ci19Ci0KLVRFU1RfRihEb3VibGVOZWFyVGVzdCwgRG91YmxlTmVhckNhbm5vdE1hdGNoTmFOKSB7Ci0gIC8vIERvdWJsZU5lYXIgbmV2ZXIgbWF0Y2hlcyBOYU4uCi0gIE1hdGNoZXI8ZG91YmxlPiBtID0gRG91YmxlTmVhcihQYXJlbnRUeXBlOjpuYW4xXywgMC4xKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhuYW4xXykpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjJfKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMS4wKSk7Ci19Ci0KLVRFU1RfRihEb3VibGVOZWFyVGVzdCwgTmFuU2Vuc2l0aXZlRG91YmxlTmVhckNhbk1hdGNoTmFOKSB7Ci0gIC8vIE5hblNlbnNpdGl2ZURvdWJsZU5lYXIgd2lsbCBtYXRjaCBOYU4uCi0gIE1hdGNoZXI8ZG91YmxlPiBtID0gTmFuU2Vuc2l0aXZlRG91YmxlTmVhcihuYW4xXywgMC4xKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5hbjFfKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4yXykpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEuMCkpOwotfQotCi1URVNUKFBvaW50ZWVUZXN0LCBSYXdQb2ludGVyKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50Kj4gbSA9IFBvaW50ZWUoR2UoMCkpOwotCi0gIGludCBuID0gMTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZuKSk7Ci0gIG4gPSAtMTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygmbikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKLX0KLQotVEVTVChQb2ludGVlVGVzdCwgUmF3UG9pbnRlclRvQ29uc3QpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBkb3VibGUqPiBtID0gUG9pbnRlZShHZSgwKSk7Ci0KLSAgZG91YmxlIHggPSAxOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJngpKTsKLSAgeCA9IC0xOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZ4KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOwotfQotCi1URVNUKFBvaW50ZWVUZXN0LCBSZWZlcmVuY2VUb0NvbnN0UmF3UG9pbnRlcikgewotICBjb25zdCBNYXRjaGVyPGludCogY29uc3QgJj4gbSA9IFBvaW50ZWUoR2UoMCkpOwotCi0gIGludCBuID0gMTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZuKSk7Ci0gIG4gPSAtMTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygmbikpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKLX0KLQotVEVTVChQb2ludGVlVGVzdCwgUmVmZXJlbmNlVG9Ob25Db25zdFJhd1BvaW50ZXIpIHsKLSAgY29uc3QgTWF0Y2hlcjxkb3VibGUqICY+IG0gPSBQb2ludGVlKEdlKDApKTsKLQotICBkb3VibGUgeCA9IDEuMDsKLSAgZG91YmxlKiBwID0gJng7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhwKSk7Ci0gIHggPSAtMTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhwKSk7Ci0gIHAgPSBOVUxMOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHApKTsKLX0KLQotTUFUQ0hFUl9QKEZpZWxkSUlzLCBpbm5lcl9tYXRjaGVyLCAiIikgewotICByZXR1cm4gRXhwbGFpbk1hdGNoUmVzdWx0KGlubmVyX21hdGNoZXIsIGFyZy5pLCByZXN1bHRfbGlzdGVuZXIpOwotfQotCi1URVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgU2FtZVR5cGUpIHsKLSAgRGVyaXZlZCBkZXJpdmVkOwotICBkZXJpdmVkLmkgPSA0OwotCi0gIC8vIFJpZ2h0IHR5cGUuIEEgcG9pbnRlciBpcyBwYXNzZWQgZG93bi4KLSAgQmFzZSogYXNfYmFzZV9wdHIgPSAmZGVyaXZlZDsKLSAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIFdoZW5EeW5hbWljQ2FzdFRvPERlcml2ZWQqPihOb3QoSXNOdWxsKCkpKSk7Ci0gIEVYUEVDVF9USEFUKGFzX2Jhc2VfcHRyLCBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShGaWVsZElJcyg0KSkpKTsKLSAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsCi0gICAgICAgICAgICAgIE5vdChXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShGaWVsZElJcyg1KSkpKSk7Ci19Ci0KLVRFU1QoV2hlbkR5bmFtaWNDYXN0VG9UZXN0LCBXcm9uZ1R5cGVzKSB7Ci0gIEJhc2UgYmFzZTsKLSAgRGVyaXZlZCBkZXJpdmVkOwotICBPdGhlckRlcml2ZWQgb3RoZXJfZGVyaXZlZDsKLQotICAvLyBXcm9uZyB0eXBlcy4gTlVMTCBpcyBwYXNzZWQuCi0gIEVYUEVDVF9USEFUKCZiYXNlLCBOb3QoV2hlbkR5bmFtaWNDYXN0VG88RGVyaXZlZCo+KFBvaW50ZWUoXykpKSk7Ci0gIEVYUEVDVF9USEFUKCZiYXNlLCBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oSXNOdWxsKCkpKTsKLSAgQmFzZSogYXNfYmFzZV9wdHIgPSAmZGVyaXZlZDsKLSAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIE5vdChXaGVuRHluYW1pY0Nhc3RUbzxPdGhlckRlcml2ZWQqPihQb2ludGVlKF8pKSkpOwotICBFWFBFQ1RfVEhBVChhc19iYXNlX3B0ciwgV2hlbkR5bmFtaWNDYXN0VG88T3RoZXJEZXJpdmVkKj4oSXNOdWxsKCkpKTsKLSAgYXNfYmFzZV9wdHIgPSAmb3RoZXJfZGVyaXZlZDsKLSAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIE5vdChXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShfKSkpKTsKLSAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIFdoZW5EeW5hbWljQ2FzdFRvPERlcml2ZWQqPihJc051bGwoKSkpOwotfQotCi1URVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgQWxyZWFkeU51bGwpIHsKLSAgLy8gQWxyZWFkeSBOVUxMLgotICBCYXNlKiBhc19iYXNlX3B0ciA9IE5VTEw7Ci0gIEVYUEVDVF9USEFUKGFzX2Jhc2VfcHRyLCBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oSXNOdWxsKCkpKTsKLX0KLQotc3RydWN0IEFtYmlndW91c0Nhc3RUeXBlcyB7Ci0gIGNsYXNzIFZpcnR1YWxEZXJpdmVkIDogcHVibGljIHZpcnR1YWwgQmFzZSB7fTsKLSAgY2xhc3MgRGVyaXZlZFN1YjEgOiBwdWJsaWMgVmlydHVhbERlcml2ZWQge307Ci0gIGNsYXNzIERlcml2ZWRTdWIyIDogcHVibGljIFZpcnR1YWxEZXJpdmVkIHt9OwotICBjbGFzcyBNYW55RGVyaXZlZEluSGllcmFyY2h5IDogcHVibGljIERlcml2ZWRTdWIxLCBwdWJsaWMgRGVyaXZlZFN1YjIge307Ci19OwotCi1URVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgQW1iaWd1b3VzQ2FzdCkgewotICBBbWJpZ3VvdXNDYXN0VHlwZXM6OkRlcml2ZWRTdWIxIHN1YjE7Ci0gIEFtYmlndW91c0Nhc3RUeXBlczo6TWFueURlcml2ZWRJbkhpZXJhcmNoeSBtYW55X2Rlcml2ZWQ7Ci0gIC8vIE11bHRpcGx5IGRlcml2ZWQgZnJvbSBCYXNlLiBkeW5hbWljX2Nhc3Q8PiByZXR1cm5zIE5VTEwuCi0gIEJhc2UqIGFzX2Jhc2VfcHRyID0KLSAgICAgIHN0YXRpY19jYXN0PEFtYmlndW91c0Nhc3RUeXBlczo6RGVyaXZlZFN1YjEqPigmbWFueV9kZXJpdmVkKTsKLSAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsCi0gICAgICAgICAgICAgIFdoZW5EeW5hbWljQ2FzdFRvPEFtYmlndW91c0Nhc3RUeXBlczo6VmlydHVhbERlcml2ZWQqPihJc051bGwoKSkpOwotICBhc19iYXNlX3B0ciA9ICZzdWIxOwotICBFWFBFQ1RfVEhBVCgKLSAgICAgIGFzX2Jhc2VfcHRyLAotICAgICAgV2hlbkR5bmFtaWNDYXN0VG88QW1iaWd1b3VzQ2FzdFR5cGVzOjpWaXJ0dWFsRGVyaXZlZCo+KE5vdChJc051bGwoKSkpKTsKLX0KLQotVEVTVChXaGVuRHluYW1pY0Nhc3RUb1Rlc3QsIERlc2NyaWJlKSB7Ci0gIE1hdGNoZXI8QmFzZSo+IG1hdGNoZXIgPSBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShfKSk7Ci0jaWYgR1RFU1RfSEFTX1JUVEkKLSAgY29uc3Qgc3RyaW5nIHByZWZpeCA9Ci0gICAgICAid2hlbiBkeW5hbWljX2Nhc3QgdG8gIiArIGludGVybmFsOjpHZXRUeXBlTmFtZTxEZXJpdmVkKj4oKSArICIsICI7Ci0jZWxzZSAgLy8gR1RFU1RfSEFTX1JUVEkKLSAgY29uc3Qgc3RyaW5nIHByZWZpeCA9ICJ3aGVuIGR5bmFtaWNfY2FzdCwgIjsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLSAgRVhQRUNUX0VRKHByZWZpeCArICJwb2ludHMgdG8gYSB2YWx1ZSB0aGF0IGlzIGFueXRoaW5nIiwgRGVzY3JpYmUobWF0Y2hlcikpOwotICBFWFBFQ1RfRVEocHJlZml4ICsgImRvZXMgbm90IHBvaW50IHRvIGEgdmFsdWUgdGhhdCBpcyBhbnl0aGluZyIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG1hdGNoZXIpKTsKLX0KLQotVEVTVChXaGVuRHluYW1pY0Nhc3RUb1Rlc3QsIEV4cGxhaW4pIHsKLSAgTWF0Y2hlcjxCYXNlKj4gbWF0Y2hlciA9IFdoZW5EeW5hbWljQ2FzdFRvPERlcml2ZWQqPihQb2ludGVlKF8pKTsKLSAgQmFzZSogbnVsbCA9IE5VTEw7Ci0gIEVYUEVDVF9USEFUKEV4cGxhaW4obWF0Y2hlciwgbnVsbCksIEhhc1N1YnN0cigiTlVMTCIpKTsKLSAgRGVyaXZlZCBkZXJpdmVkOwotICBFWFBFQ1RfVFJVRShtYXRjaGVyLk1hdGNoZXMoJmRlcml2ZWQpKTsKLSAgRVhQRUNUX1RIQVQoRXhwbGFpbihtYXRjaGVyLCAmZGVyaXZlZCksIEhhc1N1YnN0cigid2hpY2ggcG9pbnRzIHRvICIpKTsKLQotICAvLyBXaXRoIHJlZmVyZW5jZXMsIHRoZSBtYXRjaGVyIGl0c2VsZiBjYW4gZmFpbC4gVGVzdCBmb3IgdGhhdCBvbmUuCi0gIE1hdGNoZXI8Y29uc3QgQmFzZSY+IHJlZl9tYXRjaGVyID0gV2hlbkR5bmFtaWNDYXN0VG88Y29uc3QgT3RoZXJEZXJpdmVkJj4oXyk7Ci0gIEVYUEVDVF9USEFUKEV4cGxhaW4ocmVmX21hdGNoZXIsIGRlcml2ZWQpLAotICAgICAgICAgICAgICBIYXNTdWJzdHIoIndoaWNoIGNhbm5vdCBiZSBkeW5hbWljX2Nhc3QiKSk7Ci19Ci0KLVRFU1QoV2hlbkR5bmFtaWNDYXN0VG9UZXN0LCBHb29kUmVmZXJlbmNlKSB7Ci0gIERlcml2ZWQgZGVyaXZlZDsKLSAgZGVyaXZlZC5pID0gNDsKLSAgQmFzZSYgYXNfYmFzZV9yZWYgPSBkZXJpdmVkOwotICBFWFBFQ1RfVEhBVChhc19iYXNlX3JlZiwgV2hlbkR5bmFtaWNDYXN0VG88Y29uc3QgRGVyaXZlZCY+KEZpZWxkSUlzKDQpKSk7Ci0gIEVYUEVDVF9USEFUKGFzX2Jhc2VfcmVmLCBXaGVuRHluYW1pY0Nhc3RUbzxjb25zdCBEZXJpdmVkJj4oTm90KEZpZWxkSUlzKDUpKSkpOwotfQotCi1URVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgQmFkUmVmZXJlbmNlKSB7Ci0gIERlcml2ZWQgZGVyaXZlZDsKLSAgQmFzZSYgYXNfYmFzZV9yZWYgPSBkZXJpdmVkOwotICBFWFBFQ1RfVEhBVChhc19iYXNlX3JlZiwgTm90KFdoZW5EeW5hbWljQ2FzdFRvPGNvbnN0IE90aGVyRGVyaXZlZCY+KF8pKSk7Ci19Ci0KLS8vIE1pbmltYWwgY29uc3QtcHJvcGFnYXRpbmcgcG9pbnRlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQ29uc3RQcm9wYWdhdGluZ1B0ciB7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOwotCi0gIENvbnN0UHJvcGFnYXRpbmdQdHIoKSA6IHZhbF8oKSB7fQotICBleHBsaWNpdCBDb25zdFByb3BhZ2F0aW5nUHRyKFQqIHQpIDogdmFsXyh0KSB7fQotICBDb25zdFByb3BhZ2F0aW5nUHRyKGNvbnN0IENvbnN0UHJvcGFnYXRpbmdQdHImIG90aGVyKSA6IHZhbF8ob3RoZXIudmFsXykge30KLQotICBUKiBnZXQoKSB7IHJldHVybiB2YWxfOyB9Ci0gIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp2YWxfOyB9Ci0gIC8vIE1vc3Qgc21hcnQgcG9pbnRlcnMgcmV0dXJuIG5vbi1jb25zdCBUKiBhbmQgVCYgZnJvbSB0aGUgbmV4dCBtZXRob2RzLgotICBjb25zdCBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWxfOyB9Ci0gIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICp2YWxfOyB9Ci0KLSBwcml2YXRlOgotICBUKiB2YWxfOwotfTsKLQotVEVTVChQb2ludGVlVGVzdCwgV29ya3NXaXRoQ29uc3RQcm9wYWdhdGluZ1BvaW50ZXJzKSB7Ci0gIGNvbnN0IE1hdGNoZXI8IENvbnN0UHJvcGFnYXRpbmdQdHI8aW50PiA+IG0gPSBQb2ludGVlKEx0KDUpKTsKLSAgaW50IHRocmVlID0gMzsKLSAgY29uc3QgQ29uc3RQcm9wYWdhdGluZ1B0cjxpbnQ+IGNvKCZ0aHJlZSk7Ci0gIENvbnN0UHJvcGFnYXRpbmdQdHI8aW50PiBvKCZ0aHJlZSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhvKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhjbykpOwotICAqbyA9IDY7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobykpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKENvbnN0UHJvcGFnYXRpbmdQdHI8aW50PigpKSk7Ci19Ci0KLVRFU1QoUG9pbnRlZVRlc3QsIE5ldmVyTWF0Y2hlc051bGwpIHsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFBvaW50ZWUoXyk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiB3cml0ZSBQb2ludGVlKHZhbHVlKSBpbnN0ZWFkIG9mIFBvaW50ZWUoRXEodmFsdWUpKS4KLVRFU1QoUG9pbnRlZVRlc3QsIE1hdGNoZXNBZ2FpbnN0QVZhbHVlKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50Kj4gbSA9IFBvaW50ZWUoNSk7Ci0KLSAgaW50IG4gPSA1OwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJm4pKTsKLSAgbiA9IC0xOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZuKSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOwotfQotCi1URVNUKFBvaW50ZWVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgY29uc3QgTWF0Y2hlcjxpbnQqPiBtID0gUG9pbnRlZShHdCgzKSk7Ci0gIEVYUEVDVF9FUSgicG9pbnRzIHRvIGEgdmFsdWUgdGhhdCBpcyA+IDMiLCBEZXNjcmliZShtKSk7Ci0gIEVYUEVDVF9FUSgiZG9lcyBub3QgcG9pbnQgdG8gYSB2YWx1ZSB0aGF0IGlzID4gMyIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKLX0KLQotVEVTVChQb2ludGVlVGVzdCwgQ2FuRXhwbGFpbk1hdGNoUmVzdWx0KSB7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3Qgc3RyaW5nKj4gbSA9IFBvaW50ZWUoU3RhcnRzV2l0aCgiSGkiKSk7Ci0KLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHN0YXRpY19jYXN0PGNvbnN0IHN0cmluZyo+KE5VTEwpKSk7Ci0KLSAgY29uc3QgTWF0Y2hlcjxsb25nKj4gbTIgPSBQb2ludGVlKEdyZWF0ZXJUaGFuKDEpKTsgIC8vIE5PTElOVAotICBsb25nIG4gPSAzOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgid2hpY2ggcG9pbnRzIHRvIDMiICsgT2ZUeXBlKCJsb25nIikgKyAiLCB3aGljaCBpcyAyIG1vcmUgdGhhbiAxIiwKLSAgICAgICAgICAgIEV4cGxhaW4obTIsICZuKSk7Ci19Ci0KLVRFU1QoUG9pbnRlZVRlc3QsIEFsd2F5c0V4cGxhaW5zUG9pbnRlZSkgewotICBjb25zdCBNYXRjaGVyPGludCo+IG0gPSBQb2ludGVlKDApOwotICBpbnQgbiA9IDQyOwotICBFWFBFQ1RfRVEoIndoaWNoIHBvaW50cyB0byA0MiIgKyBPZlR5cGUoImludCIpLCBFeHBsYWluKG0sICZuKSk7Ci19Ci0KLS8vIEFuIHVuY29weWFibGUgY2xhc3MuCi1jbGFzcyBVbmNvcHlhYmxlIHsKLSBwdWJsaWM6Ci0gIFVuY29weWFibGUoKSA6IHZhbHVlXygtMSkge30KLSAgZXhwbGljaXQgVW5jb3B5YWJsZShpbnQgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KLQotICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLSAgdm9pZCBzZXRfdmFsdWUoaW50IGkpIHsgdmFsdWVfID0gaTsgfQotCi0gcHJpdmF0ZToKLSAgaW50IHZhbHVlXzsKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbmNvcHlhYmxlKTsKLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgeC52YWx1ZSgpIGlzIHBvc2l0aXZlLgotYm9vbCBWYWx1ZUlzUG9zaXRpdmUoY29uc3QgVW5jb3B5YWJsZSYgeCkgeyByZXR1cm4geC52YWx1ZSgpID4gMDsgfQotCi1NQVRDSEVSX1AoVW5jb3B5YWJsZUlzLCBpbm5lcl9tYXRjaGVyLCAiIikgewotICByZXR1cm4gRXhwbGFpbk1hdGNoUmVzdWx0KGlubmVyX21hdGNoZXIsIGFyZy52YWx1ZSgpLCByZXN1bHRfbGlzdGVuZXIpOwotfQotCi0vLyBBIHVzZXItZGVmaW5lZCBzdHJ1Y3QgZm9yIHRlc3RpbmcgRmllbGQoKS4KLXN0cnVjdCBBU3RydWN0IHsKLSAgQVN0cnVjdCgpIDogeCgwKSwgeSgxLjApLCB6KDUpLCBwKE5VTEwpIHt9Ci0gIEFTdHJ1Y3QoY29uc3QgQVN0cnVjdCYgcmhzKQotICAgICAgOiB4KHJocy54KSwgeShyaHMueSksIHoocmhzLnoudmFsdWUoKSksIHAocmhzLnApIHt9Ci0KLSAgaW50IHg7ICAgICAgICAgICAvLyBBIG5vbi1jb25zdCBmaWVsZC4KLSAgY29uc3QgZG91YmxlIHk7ICAvLyBBIGNvbnN0IGZpZWxkLgotICBVbmNvcHlhYmxlIHo7ICAgIC8vIEFuIHVuY29weWFibGUgZmllbGQuCi0gIGNvbnN0IGNoYXIqIHA7ICAgLy8gQSBwb2ludGVyIGZpZWxkLgotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBU3RydWN0KTsKLX07Ci0KLS8vIEEgZGVyaXZlZCBzdHJ1Y3QgZm9yIHRlc3RpbmcgRmllbGQoKS4KLXN0cnVjdCBEZXJpdmVkU3RydWN0IDogcHVibGljIEFTdHJ1Y3QgewotICBjaGFyIGNoOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhEZXJpdmVkU3RydWN0KTsKLX07Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiBmaWVsZCBpcyBub24tY29uc3QuCi1URVNUKEZpZWxkVGVzdCwgV29ya3NGb3JOb25Db25zdEZpZWxkKSB7Ci0gIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7Ci0KLSAgQVN0cnVjdCBhOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOwotICBhLnggPSAtMTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiBmaWVsZCBpcyBjb25zdC4KLVRFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvckNvbnN0RmllbGQpIHsKLSAgQVN0cnVjdCBhOwotCi0gIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0Ojp5LCBHZSgwLjApKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKLSAgbSA9IEZpZWxkKCZBU3RydWN0Ojp5LCBMZSgwLjApKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiBmaWVsZCBpcyBub3QgY29weWFibGUuCi1URVNUKEZpZWxkVGVzdCwgV29ya3NGb3JVbmNvcHlhYmxlRmllbGQpIHsKLSAgQVN0cnVjdCBhOwotCi0gIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0Ojp6LCBUcnVseShWYWx1ZUlzUG9zaXRpdmUpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKLSAgbSA9IEZpZWxkKCZBU3RydWN0Ojp6LCBOb3QoVHJ1bHkoVmFsdWVJc1Bvc2l0aXZlKSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBGaWVsZCgmRm9vOjpmaWVsZCwgLi4uKSB3b3JrcyB3aGVuIGZpZWxkIGlzIGEgcG9pbnRlci4KLVRFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvclBvaW50ZXJGaWVsZCkgewotICAvLyBNYXRjaGluZyBhZ2FpbnN0IE5VTEwuCi0gIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0OjpwLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oTlVMTCkpOwotICBBU3RydWN0IGE7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7Ci0gIGEucCA9ICJoaSI7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOwotCi0gIC8vIE1hdGNoaW5nIGEgcG9pbnRlciB0aGF0IGlzIG5vdCBOVUxMLgotICBtID0gRmllbGQoJkFTdHJ1Y3Q6OnAsIFN0YXJ0c1dpdGgoImhpIikpOwotICBhLnAgPSAiaGlsbCI7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7Ci0gIGEucCA9ICJob2xlIjsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoKSB3b3JrcyB3aGVuIHRoZSBvYmplY3QgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KLVRFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvckJ5UmVmQXJndW1lbnQpIHsKLSAgTWF0Y2hlcjxjb25zdCBBU3RydWN0Jj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7Ci0KLSAgQVN0cnVjdCBhOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOwotICBhLnggPSAtMTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQncyB0eXBlCi0vLyBpcyBhIHN1Yi10eXBlIG9mIEZvby4KLVRFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvckFyZ3VtZW50T2ZTdWJUeXBlKSB7Ci0gIC8vIE5vdGUgdGhhdCB0aGUgbWF0Y2hlciBleHBlY3RzIERlcml2ZWRTdHJ1Y3QgYnV0IHdlIHNheSBBU3RydWN0Ci0gIC8vIGluc2lkZSBGaWVsZCgpLgotICBNYXRjaGVyPGNvbnN0IERlcml2ZWRTdHJ1Y3QmPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKLQotICBEZXJpdmVkU3RydWN0IGQ7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhkKSk7Ci0gIGQueCA9IC0xOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGQpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBGaWVsZCgmRm9vOjpmaWVsZCwgbSkgd29ya3Mgd2hlbiBmaWVsZCdzIHR5cGUgYW5kIG0ncwotLy8gYXJndW1lbnQgdHlwZSBhcmUgY29tcGF0aWJsZSBidXQgbm90IHRoZSBzYW1lLgotVEVTVChGaWVsZFRlc3QsIFdvcmtzRm9yQ29tcGF0aWJsZU1hdGNoZXJUeXBlKSB7Ci0gIC8vIFRoZSBmaWVsZCBpcyBhbiBpbnQsIGJ1dCB0aGUgaW5uZXIgbWF0Y2hlciBleHBlY3RzIGEgc2lnbmVkIGNoYXIuCi0gIE1hdGNoZXI8Y29uc3QgQVN0cnVjdCY+IG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXI8c2lnbmVkIGNoYXI+KEdlKDApKSk7Ci0KLSAgQVN0cnVjdCBhOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOwotICBhLnggPSAtMTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZGVzY3JpYmUgaXRzZWxmLgotVEVTVChGaWVsZFRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IEFTdHJ1Y3QmPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKLQotICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpcyA+PSAwIiwgRGVzY3JpYmUobSkpOwotICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpc24ndCA+PSAwIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0LgotVEVTVChGaWVsZFRlc3QsIENhbkV4cGxhaW5NYXRjaFJlc3VsdCkgewotICBNYXRjaGVyPGNvbnN0IEFTdHJ1Y3QmPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKLQotICBBU3RydWN0IGE7Ci0gIGEueCA9IDE7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZ2l2ZW4gZmllbGQgaXMgMSIgKyBPZlR5cGUoImludCIpLCBFeHBsYWluKG0sIGEpKTsKLQotICBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdyZWF0ZXJUaGFuKDApKTsKLSAgRVhQRUNUX0VRKAotICAgICAgIndob3NlIGdpdmVuIGZpZWxkIGlzIDEiICsgT2ZUeXBlKCJpbnQiKSArICIsIHdoaWNoIGlzIDEgbW9yZSB0aGFuIDAiLAotICAgICAgRXhwbGFpbihtLCBhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoKSB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gY29uc3QuCi1URVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yUG9pbnRlclRvQ29uc3QpIHsKLSAgTWF0Y2hlcjxjb25zdCBBU3RydWN0Kj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7Ci0KLSAgQVN0cnVjdCBhOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJmEpKTsKLSAgYS54ID0gLTE7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoJmEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBGaWVsZCgpIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBub24tY29uc3QuCi1URVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yUG9pbnRlclRvTm9uQ29uc3QpIHsKLSAgTWF0Y2hlcjxBU3RydWN0Kj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7Ci0KLSAgQVN0cnVjdCBhOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJmEpKTsKLSAgYS54ID0gLTE7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoJmEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBGaWVsZCgpIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3QgcG9pbnRlci4KLVRFU1QoRmllbGRGb3JQb2ludGVyVGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb0NvbnN0UG9pbnRlcikgewotICBNYXRjaGVyPEFTdHJ1Y3QqIGNvbnN0Jj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7Ci0KLSAgQVN0cnVjdCBhOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJmEpKTsKLSAgYS54ID0gLTE7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoJmEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBGaWVsZCgpIGRvZXMgbm90IG1hdGNoIHRoZSBOVUxMIHBvaW50ZXIuCi1URVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIERvZXNOb3RNYXRjaE51bGwpIHsKLSAgTWF0Y2hlcjxjb25zdCBBU3RydWN0Kj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBfKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQncyB0eXBlCi0vLyBpcyBhIHN1Yi10eXBlIG9mIGNvbnN0IEZvbyouCi1URVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yQXJndW1lbnRPZlN1YlR5cGUpIHsKLSAgLy8gTm90ZSB0aGF0IHRoZSBtYXRjaGVyIGV4cGVjdHMgRGVyaXZlZFN0cnVjdCBidXQgd2Ugc2F5IEFTdHJ1Y3QKLSAgLy8gaW5zaWRlIEZpZWxkKCkuCi0gIE1hdGNoZXI8RGVyaXZlZFN0cnVjdCo+IG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwgR2UoMCkpOwotCi0gIERlcml2ZWRTdHJ1Y3QgZDsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZkKSk7Ci0gIGQueCA9IC0xOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZkKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZGVzY3JpYmUgaXRzZWxmIHdoZW4gdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCi1URVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IEFTdHJ1Y3QqPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKLQotICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpcyA+PSAwIiwgRGVzY3JpYmUobSkpOwotICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpc24ndCA+PSAwIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZXhwbGFpbiB0aGUgcmVzdWx0IG9mIG1hdGNoaW5nIGEgcG9pbnRlci4KLVRFU1QoRmllbGRGb3JQb2ludGVyVGVzdCwgQ2FuRXhwbGFpbk1hdGNoUmVzdWx0KSB7Ci0gIE1hdGNoZXI8Y29uc3QgQVN0cnVjdCo+IG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwgR2UoMCkpOwotCi0gIEFTdHJ1Y3QgYTsKLSAgYS54ID0gMTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHN0YXRpY19jYXN0PGNvbnN0IEFTdHJ1Y3QqPihOVUxMKSkpOwotICBFWFBFQ1RfRVEoIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgaXMgMSIgKyBPZlR5cGUoImludCIpLAotICAgICAgICAgICAgRXhwbGFpbihtLCAmYSkpOwotCi0gIG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwgR3JlYXRlclRoYW4oMCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgaXMgMSIgKyBPZlR5cGUoImludCIpICsKLSAgICAgICAgICAgICIsIHdoaWNoIGlzIDEgbW9yZSB0aGFuIDAiLCBFeHBsYWluKG0sICZhKSk7Ci19Ci0KLS8vIEEgdXNlci1kZWZpbmVkIGNsYXNzIGZvciB0ZXN0aW5nIFByb3BlcnR5KCkuCi1jbGFzcyBBQ2xhc3MgewotIHB1YmxpYzoKLSAgQUNsYXNzKCkgOiBuXygwKSB7fQotCi0gIC8vIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIG5vbi1yZWZlcmVuY2UuCi0gIGludCBuKCkgY29uc3QgeyByZXR1cm4gbl87IH0KLQotICB2b2lkIHNldF9uKGludCBuZXdfbikgeyBuXyA9IG5ld19uOyB9Ci0KLSAgLy8gQSBnZXR0ZXIgdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGNvbnN0LgotICBjb25zdCBzdHJpbmcmIHMoKSBjb25zdCB7IHJldHVybiBzXzsgfQotCi0gIHZvaWQgc2V0X3MoY29uc3Qgc3RyaW5nJiBuZXdfcykgeyBzXyA9IG5ld19zOyB9Ci0KLSAgLy8gQSBnZXR0ZXIgdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIG5vbi1jb25zdC4KLSAgZG91YmxlJiB4KCkgY29uc3QgeyByZXR1cm4geF87IH0KLSBwcml2YXRlOgotICBpbnQgbl87Ci0gIHN0cmluZyBzXzsKLQotICBzdGF0aWMgZG91YmxlIHhfOwotfTsKLQotZG91YmxlIEFDbGFzczo6eF8gPSAwLjA7Ci0KLS8vIEEgZGVyaXZlZCBjbGFzcyBmb3IgdGVzdGluZyBQcm9wZXJ0eSgpLgotY2xhc3MgRGVyaXZlZENsYXNzIDogcHVibGljIEFDbGFzcyB7Ci0gcHVibGljOgotICBpbnQgaygpIGNvbnN0IHsgcmV0dXJuIGtfOyB9Ci0gcHJpdmF0ZToKLSAgaW50IGtfOwotfTsKLQotLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgmRm9vOjpwcm9wZXJ0eSwgLi4uKSB3b3JrcyB3aGVuIHByb3BlcnR5KCkKLS8vIHJldHVybnMgYSBub24tcmVmZXJlbmNlLgotVEVTVChQcm9wZXJ0eVRlc3QsIFdvcmtzRm9yTm9uUmVmZXJlbmNlUHJvcGVydHkpIHsKLSAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR2UoMCkpOwotCi0gIEFDbGFzcyBhOwotICBhLnNldF9uKDEpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOwotCi0gIGEuc2V0X24oLTEpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgmRm9vOjpwcm9wZXJ0eSwgLi4uKSB3b3JrcyB3aGVuIHByb3BlcnR5KCkKLS8vIHJldHVybnMgYSByZWZlcmVuY2UgdG8gY29uc3QuCi1URVNUKFByb3BlcnR5VGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb0NvbnN0UHJvcGVydHkpIHsKLSAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6cywgU3RhcnRzV2l0aCgiaGkiKSk7Ci0KLSAgQUNsYXNzIGE7Ci0gIGEuc2V0X3MoImhpbGwiKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKLQotICBhLnNldF9zKCJob2xlIik7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFByb3BlcnR5KCZGb286OnByb3BlcnR5LCAuLi4pIHdvcmtzIHdoZW4gcHJvcGVydHkoKQotLy8gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBub24tY29uc3QuCi1URVNUKFByb3BlcnR5VGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb05vbkNvbnN0UHJvcGVydHkpIHsKLSAgZG91YmxlIHggPSAwLjA7Ci0gIEFDbGFzcyBhOwotCi0gIE1hdGNoZXI8Y29uc3QgQUNsYXNzJj4gbSA9IFByb3BlcnR5KCZBQ2xhc3M6OngsIFJlZih4KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOwotCi0gIG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjp4LCBOb3QoUmVmKHgpKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUHJvcGVydHkoJkZvbzo6cHJvcGVydHksIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgaXMKLS8vIHBhc3NlZCBieSB2YWx1ZS4KLVRFU1QoUHJvcGVydHlUZXN0LCBXb3Jrc0ZvckJ5VmFsdWVBcmd1bWVudCkgewotICBNYXRjaGVyPEFDbGFzcz4gbSA9IFByb3BlcnR5KCZBQ2xhc3M6OnMsIFN0YXJ0c1dpdGgoImhpIikpOwotCi0gIEFDbGFzcyBhOwotICBhLnNldF9zKCJoaWxsIik7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7Ci0KLSAgYS5zZXRfcygiaG9sZSIpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgmRm9vOjpwcm9wZXJ0eSwgLi4uKSB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCdzCi0vLyB0eXBlIGlzIGEgc3ViLXR5cGUgb2YgRm9vLgotVEVTVChQcm9wZXJ0eVRlc3QsIFdvcmtzRm9yQXJndW1lbnRPZlN1YlR5cGUpIHsKLSAgLy8gVGhlIG1hdGNoZXIgZXhwZWN0cyBhIERlcml2ZWRDbGFzcywgYnV0IGluc2lkZSB0aGUgUHJvcGVydHkoKSB3ZQotICAvLyBzYXkgQUNsYXNzLgotICBNYXRjaGVyPGNvbnN0IERlcml2ZWRDbGFzcyY+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7Ci0KLSAgRGVyaXZlZENsYXNzIGQ7Ci0gIGQuc2V0X24oMSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhkKSk7Ci0KLSAgZC5zZXRfbigtMSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoZCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFByb3BlcnR5KCZGb286OnByb3BlcnR5LCBtKSB3b3JrcyB3aGVuIHByb3BlcnR5KCkncyB0eXBlCi0vLyBhbmQgbSdzIGFyZ3VtZW50IHR5cGUgYXJlIGNvbXBhdGlibGUgYnV0IGRpZmZlcmVudC4KLVRFU1QoUHJvcGVydHlUZXN0LCBXb3Jrc0ZvckNvbXBhdGlibGVNYXRjaGVyVHlwZSkgewotICAvLyBuKCkgcmV0dXJucyBhbiBpbnQgYnV0IHRoZSBpbm5lciBtYXRjaGVyIGV4cGVjdHMgYSBzaWduZWQgY2hhci4KLSAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcjxzaWduZWQgY2hhcj4oR2UoMCkpKTsKLQotICBBQ2xhc3MgYTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKLSAgYS5zZXRfbigtMSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFByb3BlcnR5KCkgY2FuIGRlc2NyaWJlIGl0c2VsZi4KLVRFU1QoUHJvcGVydHlUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR2UoMCkpOwotCi0gIEVYUEVDVF9FUSgiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5IGlzID49IDAiLCBEZXNjcmliZShtKSk7Ci0gIEVYUEVDVF9FUSgiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5IGlzbid0ID49IDAiLAotICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSBjYW4gZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0LgotVEVTVChQcm9wZXJ0eVRlc3QsIENhbkV4cGxhaW5NYXRjaFJlc3VsdCkgewotICBNYXRjaGVyPGNvbnN0IEFDbGFzcyY+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7Ci0KLSAgQUNsYXNzIGE7Ci0gIGEuc2V0X24oMSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgMSIgKyBPZlR5cGUoImludCIpLCBFeHBsYWluKG0sIGEpKTsKLQotICBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR3JlYXRlclRoYW4oMCkpOwotICBFWFBFQ1RfRVEoCi0gICAgICAid2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgMSIgKyBPZlR5cGUoImludCIpICsgIiwgd2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCi0gICAgICBFeHBsYWluKG0sIGEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgpIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBjb25zdC4KLVRFU1QoUHJvcGVydHlGb3JQb2ludGVyVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Db25zdCkgewotICBNYXRjaGVyPGNvbnN0IEFDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7Ci0KLSAgQUNsYXNzIGE7Ci0gIGEuc2V0X24oMSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmYSkpOwotCi0gIGEuc2V0X24oLTEpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gbm9uLWNvbnN0LgotVEVTVChQcm9wZXJ0eUZvclBvaW50ZXJUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb05vbkNvbnN0KSB7Ci0gIE1hdGNoZXI8QUNsYXNzKj4gbSA9IFByb3BlcnR5KCZBQ2xhc3M6OnMsIFN0YXJ0c1dpdGgoImhpIikpOwotCi0gIEFDbGFzcyBhOwotICBhLnNldF9zKCJoaWxsIik7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmYSkpOwotCi0gIGEuc2V0X3MoImhvbGUiKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygmYSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFByb3BlcnR5KCkgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYQotLy8gY29uc3QgcG9pbnRlci4KLVRFU1QoUHJvcGVydHlGb3JQb2ludGVyVGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb0NvbnN0UG9pbnRlcikgewotICBNYXRjaGVyPEFDbGFzcyogY29uc3QmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6cywgU3RhcnRzV2l0aCgiaGkiKSk7Ci0KLSAgQUNsYXNzIGE7Ci0gIGEuc2V0X3MoImhpbGwiKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZhKSk7Ci0KLSAgYS5zZXRfcygiaG9sZSIpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZhKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSBkb2VzIG5vdCBtYXRjaCB0aGUgTlVMTCBwb2ludGVyLgotVEVTVChQcm9wZXJ0eUZvclBvaW50ZXJUZXN0LCBXb3Jrc0ZvclJlZmVyZW5jZVRvTm9uQ29uc3RQcm9wZXJ0eSkgewotICBNYXRjaGVyPGNvbnN0IEFDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjp4LCBfKTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUHJvcGVydHkoJkZvbzo6cHJvcGVydHksIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQncwotLy8gdHlwZSBpcyBhIHN1Yi10eXBlIG9mIGNvbnN0IEZvbyouCi1URVNUKFByb3BlcnR5Rm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yQXJndW1lbnRPZlN1YlR5cGUpIHsKLSAgLy8gVGhlIG1hdGNoZXIgZXhwZWN0cyBhIERlcml2ZWRDbGFzcywgYnV0IGluc2lkZSB0aGUgUHJvcGVydHkoKSB3ZQotICAvLyBzYXkgQUNsYXNzLgotICBNYXRjaGVyPGNvbnN0IERlcml2ZWRDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7Ci0KLSAgRGVyaXZlZENsYXNzIGQ7Ci0gIGQuc2V0X24oMSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmZCkpOwotCi0gIGQuc2V0X24oLTEpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZkKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSBjYW4gZGVzY3JpYmUgaXRzZWxmIHdoZW4gdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCi1URVNUKFByb3BlcnR5Rm9yUG9pbnRlclRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPGNvbnN0IEFDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7Ci0KLSAgRVhQRUNUX0VRKCJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgPj0gMCIsIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXNuJ3QgPj0gMCIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgpIGNhbiBleHBsYWluIHRoZSByZXN1bHQgb2YgbWF0Y2hpbmcgYSBwb2ludGVyLgotVEVTVChQcm9wZXJ0eUZvclBvaW50ZXJUZXN0LCBDYW5FeHBsYWluTWF0Y2hSZXN1bHQpIHsKLSAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MqPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR2UoMCkpOwotCi0gIEFDbGFzcyBhOwotICBhLnNldF9uKDEpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgc3RhdGljX2Nhc3Q8Y29uc3QgQUNsYXNzKj4oTlVMTCkpKTsKLSAgRVhQRUNUX0VRKAotICAgICAgIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgMSIgKyBPZlR5cGUoImludCIpLAotICAgICAgRXhwbGFpbihtLCAmYSkpOwotCi0gIG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHcmVhdGVyVGhhbigwKSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggcG9pbnRzIHRvIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eSBpcyAxIiArCi0gICAgICAgICAgICBPZlR5cGUoImludCIpICsgIiwgd2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sICZhKSk7Ci19Ci0KLS8vIFRlc3RzIFJlc3VsdE9mLgotCi0vLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZiBpcyBhCi0vLyBmdW5jdGlvbiBwb2ludGVyLgotc3RyaW5nIEludFRvU3RyaW5nRnVuY3Rpb24oaW50IGlucHV0KSB7IHJldHVybiBpbnB1dCA9PSAxID8gImZvbyIgOiAiYmFyIjsgfQotCi1URVNUKFJlc3VsdE9mVGVzdCwgV29ya3NGb3JGdW5jdGlvblBvaW50ZXJzKSB7Ci0gIE1hdGNoZXI8aW50PiBtYXRjaGVyID0gUmVzdWx0T2YoJkludFRvU3RyaW5nRnVuY3Rpb24sIEVxKHN0cmluZygiZm9vIikpKTsKLQotICBFWFBFQ1RfVFJVRShtYXRjaGVyLk1hdGNoZXMoMSkpOwotICBFWFBFQ1RfRkFMU0UobWF0Y2hlci5NYXRjaGVzKDIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSZXN1bHRPZigpIGNhbiBkZXNjcmliZSBpdHNlbGYuCi1URVNUKFJlc3VsdE9mVGVzdCwgQ2FuRGVzY3JpYmVJdHNlbGYpIHsKLSAgTWF0Y2hlcjxpbnQ+IG1hdGNoZXIgPSBSZXN1bHRPZigmSW50VG9TdHJpbmdGdW5jdGlvbiwgU3RyRXEoImZvbyIpKTsKLQotICBFWFBFQ1RfRVEoImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICIKLSAgICAgICAgICAgICJpcyBlcXVhbCB0byBcImZvb1wiIiwgRGVzY3JpYmUobWF0Y2hlcikpOwotICBFWFBFQ1RfRVEoImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICIKLSAgICAgICAgICAgICJpc24ndCBlcXVhbCB0byBcImZvb1wiIiwgRGVzY3JpYmVOZWdhdGlvbihtYXRjaGVyKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVzdWx0T2YoKSBjYW4gZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0LgotaW50IEludEZ1bmN0aW9uKGludCBpbnB1dCkgeyByZXR1cm4gaW5wdXQgPT0gNDIgPyA4MCA6IDkwOyB9Ci0KLVRFU1QoUmVzdWx0T2ZUZXN0LCBDYW5FeHBsYWluTWF0Y2hSZXN1bHQpIHsKLSAgTWF0Y2hlcjxpbnQ+IG1hdGNoZXIgPSBSZXN1bHRPZigmSW50RnVuY3Rpb24sIEdlKDg1KSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byA5MCIgKyBPZlR5cGUoImludCIpLAotICAgICAgICAgICAgRXhwbGFpbihtYXRjaGVyLCAzNikpOwotCi0gIG1hdGNoZXIgPSBSZXN1bHRPZigmSW50RnVuY3Rpb24sIEdyZWF0ZXJUaGFuKDg1KSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byA5MCIgKyBPZlR5cGUoImludCIpICsKLSAgICAgICAgICAgICIsIHdoaWNoIGlzIDUgbW9yZSB0aGFuIDg1IiwgRXhwbGFpbihtYXRjaGVyLCAzNikpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZih4KQotLy8gcmV0dXJucyBhIG5vbi1yZWZlcmVuY2UuCi1URVNUKFJlc3VsdE9mVGVzdCwgV29ya3NGb3JOb25SZWZlcmVuY2VSZXN1bHRzKSB7Ci0gIE1hdGNoZXI8aW50PiBtYXRjaGVyID0gUmVzdWx0T2YoJkludEZ1bmN0aW9uLCBFcSg4MCkpOwotCi0gIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcyg0MikpOwotICBFWFBFQ1RfRkFMU0UobWF0Y2hlci5NYXRjaGVzKDM2KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVzdWx0T2YoZiwgLi4uKSBjb21waWxlcyBhbmQgd29ya3MgYXMgZXhwZWN0ZWQgd2hlbiBmKHgpCi0vLyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIG5vbi1jb25zdC4KLWRvdWJsZSYgRG91YmxlRnVuY3Rpb24oZG91YmxlJiBpbnB1dCkgeyByZXR1cm4gaW5wdXQ7IH0gIC8vIE5PTElOVAotCi1VbmNvcHlhYmxlJiBSZWZVbmNvcHlhYmxlRnVuY3Rpb24oVW5jb3B5YWJsZSYgb2JqKSB7ICAvLyBOT0xJTlQKLSAgcmV0dXJuIG9iajsKLX0KLQotVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlVG9Ob25Db25zdFJlc3VsdHMpIHsKLSAgZG91YmxlIHggPSAzLjE0OwotICBkb3VibGUgeDIgPSB4OwotICBNYXRjaGVyPGRvdWJsZSY+IG1hdGNoZXIgPSBSZXN1bHRPZigmRG91YmxlRnVuY3Rpb24sIFJlZih4KSk7Ci0KLSAgRVhQRUNUX1RSVUUobWF0Y2hlci5NYXRjaGVzKHgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIuTWF0Y2hlcyh4MikpOwotCi0gIC8vIFRlc3QgdGhhdCBSZXN1bHRPZiB3b3JrcyB3aXRoIHVuY29weWFibGUgb2JqZWN0cwotICBVbmNvcHlhYmxlIG9iaigwKTsKLSAgVW5jb3B5YWJsZSBvYmoyKDApOwotICBNYXRjaGVyPFVuY29weWFibGUmPiBtYXRjaGVyMiA9Ci0gICAgICBSZXN1bHRPZigmUmVmVW5jb3B5YWJsZUZ1bmN0aW9uLCBSZWYob2JqKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWF0Y2hlcjIuTWF0Y2hlcyhvYmopKTsKLSAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIyLk1hdGNoZXMob2JqMikpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZih4KQotLy8gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBjb25zdC4KLWNvbnN0IHN0cmluZyYgU3RyaW5nRnVuY3Rpb24oY29uc3Qgc3RyaW5nJiBpbnB1dCkgeyByZXR1cm4gaW5wdXQ7IH0KLQotVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlVG9Db25zdFJlc3VsdHMpIHsKLSAgc3RyaW5nIHMgPSAiZm9vIjsKLSAgc3RyaW5nIHMyID0gczsKLSAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtYXRjaGVyID0gUmVzdWx0T2YoJlN0cmluZ0Z1bmN0aW9uLCBSZWYocykpOwotCi0gIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcyhzKSk7Ci0gIEVYUEVDVF9GQUxTRShtYXRjaGVyLk1hdGNoZXMoczIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSZXN1bHRPZihmLCBtKSB3b3JrcyB3aGVuIGYoeCkgYW5kIG0ncwotLy8gYXJndW1lbnQgdHlwZXMgYXJlIGNvbXBhdGlibGUgYnV0IGRpZmZlcmVudC4KLVRFU1QoUmVzdWx0T2ZUZXN0LCBXb3Jrc0ZvckNvbXBhdGlibGVNYXRjaGVyVHlwZXMpIHsKLSAgLy8gSW50RnVuY3Rpb24oKSByZXR1cm5zIGludCBidXQgdGhlIGlubmVyIG1hdGNoZXIgZXhwZWN0cyBhIHNpZ25lZCBjaGFyLgotICBNYXRjaGVyPGludD4gbWF0Y2hlciA9IFJlc3VsdE9mKEludEZ1bmN0aW9uLCBNYXRjaGVyPHNpZ25lZCBjaGFyPihHZSg4NSkpKTsKLQotICBFWFBFQ1RfVFJVRShtYXRjaGVyLk1hdGNoZXMoMzYpKTsKLSAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIuTWF0Y2hlcyg0MikpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBwcm9ncmFtIGFib3J0cyB3aGVuIFJlc3VsdE9mIGlzIHBhc3NlZAotLy8gYSBOVUxMIGZ1bmN0aW9uIHBvaW50ZXIuCi1URVNUKFJlc3VsdE9mRGVhdGhUZXN0LCBEaWVzT25OdWxsRnVuY3Rpb25Qb2ludGVycykgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAotICAgICAgUmVzdWx0T2Yoc3RhdGljX2Nhc3Q8c3RyaW5nKCopKGludCBkdW1teSk+KE5VTEwpLCBFcShzdHJpbmcoImZvbyIpKSksCi0gICAgICAgICAgICAgICAiTlVMTCBmdW5jdGlvbiBwb2ludGVyIGlzIHBhc3NlZCBpbnRvIFJlc3VsdE9mXFwoXFwpXFwuIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVzdWx0T2YoZiwgLi4uKSBjb21waWxlcyBhbmQgd29ya3MgYXMgZXhwZWN0ZWQgd2hlbiBmIGlzIGEKLS8vIGZ1bmN0aW9uIHJlZmVyZW5jZS4KLVRFU1QoUmVzdWx0T2ZUZXN0LCBXb3Jrc0ZvckZ1bmN0aW9uUmVmZXJlbmNlcykgewotICBNYXRjaGVyPGludD4gbWF0Y2hlciA9IFJlc3VsdE9mKEludFRvU3RyaW5nRnVuY3Rpb24sIFN0ckVxKCJmb28iKSk7Ci0gIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcygxKSk7Ci0gIEVYUEVDVF9GQUxTRShtYXRjaGVyLk1hdGNoZXMoMikpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZiBpcyBhCi0vLyBmdW5jdGlvbiBvYmplY3QuCi1zdHJ1Y3QgRnVuY3RvciA6IHB1YmxpYyA6OnN0ZDo6dW5hcnlfZnVuY3Rpb248aW50LCBzdHJpbmc+IHsKLSAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIGlucHV0KSBjb25zdCB7Ci0gICAgcmV0dXJuIEludFRvU3RyaW5nRnVuY3Rpb24oaW5wdXQpOwotICB9Ci19OwotCi1URVNUKFJlc3VsdE9mVGVzdCwgV29ya3NGb3JGdW5jdG9ycykgewotICBNYXRjaGVyPGludD4gbWF0Y2hlciA9IFJlc3VsdE9mKEZ1bmN0b3IoKSwgRXEoc3RyaW5nKCJmb28iKSkpOwotCi0gIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcygxKSk7Ci0gIEVYUEVDVF9GQUxTRShtYXRjaGVyLk1hdGNoZXMoMikpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZiBpcyBhCi0vLyBmdW5jdG9yIHdpdGggbW9yZSB0aGVuIG9uZSBvcGVyYXRvcigpIGRlZmluZWQuIFJlc3VsdE9mKCkgbXVzdCB3b3JrCi0vLyBmb3IgZWFjaCBkZWZpbmVkIG9wZXJhdG9yKCkuCi1zdHJ1Y3QgUG9seW1vcnBoaWNGdW5jdG9yIHsKLSAgdHlwZWRlZiBpbnQgcmVzdWx0X3R5cGU7Ci0gIGludCBvcGVyYXRvcigpKGludCBuKSB7IHJldHVybiBuOyB9Ci0gIGludCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc3RybGVuKHMpKTsgfQotfTsKLQotVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUG9seW1vcnBoaWNGdW5jdG9ycykgewotICBNYXRjaGVyPGludD4gbWF0Y2hlcl9pbnQgPSBSZXN1bHRPZihQb2x5bW9ycGhpY0Z1bmN0b3IoKSwgR2UoNSkpOwotCi0gIEVYUEVDVF9UUlVFKG1hdGNoZXJfaW50Lk1hdGNoZXMoMTApKTsKLSAgRVhQRUNUX0ZBTFNFKG1hdGNoZXJfaW50Lk1hdGNoZXMoMikpOwotCi0gIE1hdGNoZXI8Y29uc3QgY2hhcio+IG1hdGNoZXJfc3RyaW5nID0gUmVzdWx0T2YoUG9seW1vcnBoaWNGdW5jdG9yKCksIEdlKDUpKTsKLQotICBFWFBFQ1RfVFJVRShtYXRjaGVyX3N0cmluZy5NYXRjaGVzKCJsb25nIHN0cmluZyIpKTsKLSAgRVhQRUNUX0ZBTFNFKG1hdGNoZXJfc3RyaW5nLk1hdGNoZXMoInNocnQiKSk7Ci19Ci0KLWNvbnN0IGludCogUmVmZXJlbmNpbmdGdW5jdGlvbihjb25zdCBpbnQmIG4pIHsgcmV0dXJuICZuOyB9Ci0KLXN0cnVjdCBSZWZlcmVuY2luZ0Z1bmN0b3IgewotICB0eXBlZGVmIGNvbnN0IGludCogcmVzdWx0X3R5cGU7Ci0gIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgaW50JiBuKSB7IHJldHVybiAmbjsgfQotfTsKLQotVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNpbmdDYWxsYWJsZXMpIHsKLSAgY29uc3QgaW50IG4gPSAxOwotICBjb25zdCBpbnQgbjIgPSAxOwotICBNYXRjaGVyPGNvbnN0IGludCY+IG1hdGNoZXIyID0gUmVzdWx0T2YoUmVmZXJlbmNpbmdGdW5jdGlvbiwgRXEoJm4pKTsKLSAgRVhQRUNUX1RSVUUobWF0Y2hlcjIuTWF0Y2hlcyhuKSk7Ci0gIEVYUEVDVF9GQUxTRShtYXRjaGVyMi5NYXRjaGVzKG4yKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtYXRjaGVyMyA9IFJlc3VsdE9mKFJlZmVyZW5jaW5nRnVuY3RvcigpLCBFcSgmbikpOwotICBFWFBFQ1RfVFJVRShtYXRjaGVyMy5NYXRjaGVzKG4pKTsKLSAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIzLk1hdGNoZXMobjIpKTsKLX0KLQotY2xhc3MgRGl2aXNpYmxlQnlJbXBsIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IERpdmlzaWJsZUJ5SW1wbChpbnQgYV9kaXZpZGVyKSA6IGRpdmlkZXJfKGFfZGl2aWRlcikge30KLQotICAvLyBGb3IgdGVzdGluZyB1c2luZyBFeHBsYWluTWF0Y2hSZXN1bHRUbygpIHdpdGggcG9seW1vcnBoaWMgbWF0Y2hlcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBUJiBuLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIiA8PCAobiAlIGRpdmlkZXJfKSA8PCAiIG1vZHVsbyAiCi0gICAgICAgICAgICAgIDw8IGRpdmlkZXJfOwotICAgIHJldHVybiAobiAlIGRpdmlkZXJfKSA9PSAwOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKG9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBkaXZpc2libGUgYnkgIiA8PCBkaXZpZGVyXzsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKG9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBub3QgZGl2aXNpYmxlIGJ5ICIgPDwgZGl2aWRlcl87Ci0gIH0KLQotICB2b2lkIHNldF9kaXZpZGVyKGludCBhX2RpdmlkZXIpIHsgZGl2aWRlcl8gPSBhX2RpdmlkZXI7IH0KLSAgaW50IGRpdmlkZXIoKSBjb25zdCB7IHJldHVybiBkaXZpZGVyXzsgfQotCi0gcHJpdmF0ZToKLSAgaW50IGRpdmlkZXJfOwotfTsKLQotUG9seW1vcnBoaWNNYXRjaGVyPERpdmlzaWJsZUJ5SW1wbD4gRGl2aXNpYmxlQnkoaW50IG4pIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoRGl2aXNpYmxlQnlJbXBsKG4pKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3aGVuIEFsbE9mKCkgZmFpbHMsIG9ubHkgdGhlIGZpcnN0IGZhaWxpbmcgbWF0Y2hlciBpcwotLy8gYXNrZWQgdG8gZXhwbGFpbiB3aHkuCi1URVNUKEV4cGxhaW5NYXRjaFJlc3VsdFRlc3QsIEFsbE9mX0ZhbHNlX0ZhbHNlKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoRGl2aXNpYmxlQnkoNCksIERpdmlzaWJsZUJ5KDMpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyAxIG1vZHVsbyA0IiwgRXhwbGFpbihtLCA1KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2hlbiBBbGxPZigpIGZhaWxzLCBvbmx5IHRoZSBmaXJzdCBmYWlsaW5nIG1hdGNoZXIgaXMKLS8vIGFza2VkIHRvIGV4cGxhaW4gd2h5LgotVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBBbGxPZl9GYWxzZV9UcnVlKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoRGl2aXNpYmxlQnkoNCksIERpdmlzaWJsZUJ5KDMpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyAyIG1vZHVsbyA0IiwgRXhwbGFpbihtLCA2KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2hlbiBBbGxPZigpIGZhaWxzLCBvbmx5IHRoZSBmaXJzdCBmYWlsaW5nIG1hdGNoZXIgaXMKLS8vIGFza2VkIHRvIGV4cGxhaW4gd2h5LgotVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBBbGxPZl9UcnVlX0ZhbHNlKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoR2UoMSksIERpdmlzaWJsZUJ5KDMpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyAyIG1vZHVsbyAzIiwgRXhwbGFpbihtLCA1KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2hlbiBBbGxPZigpIHN1Y2NlZWRzLCBhbGwgbWF0Y2hlcnMgYXJlIGFza2VkIHRvIGV4cGxhaW4KLS8vIHdoeS4KLVRFU1QoRXhwbGFpbk1hdGNoUmVzdWx0VGVzdCwgQWxsT2ZfVHJ1ZV9UcnVlKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoRGl2aXNpYmxlQnkoMiksIERpdmlzaWJsZUJ5KDMpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyAwIG1vZHVsbyAyLCBhbmQgd2hpY2ggaXMgMCBtb2R1bG8gMyIsIEV4cGxhaW4obSwgNikpOwotfQotCi1URVNUKEV4cGxhaW5NYXRjaFJlc3VsdFRlc3QsIEFsbE9mX1RydWVfVHJ1ZV8yKSB7Ci0gIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoR2UoMiksIExlKDMpKTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDIpKTsKLX0KLQotVEVTVChFeHBsYWlubWF0Y2hlclJlc3VsdFRlc3QsIE1vbm9tb3JwaGljTWF0Y2hlcikgewotICBjb25zdCBNYXRjaGVyPGludD4gbSA9IEdyZWF0ZXJUaGFuKDUpOwotICBFWFBFQ1RfRVEoIndoaWNoIGlzIDEgbW9yZSB0aGFuIDUiLCBFeHBsYWluKG0sIDYpKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgdmVyaWZ5IHRoYXQgdmFsdWVzIHdpdGhvdXQgYSBwdWJsaWMgY29weQotLy8gY3RvciBjYW4gYmUgdXNlZCBhcyBhcmd1bWVudHMgdG8gbWF0Y2hlcnMgbGlrZSBFcSgpLCBHZSgpLCBhbmQgZXRjCi0vLyB3aXRoIHRoZSBoZWxwIG9mIEJ5UmVmKCkuCi0KLWNsYXNzIE5vdENvcHlhYmxlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE5vdENvcHlhYmxlKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQotCi0gIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOb3RDb3B5YWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlKCkgPT0gcmhzLnZhbHVlKCk7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgTm90Q29weWFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiB2YWx1ZSgpID49IHJocy52YWx1ZSgpOwotICB9Ci0gcHJpdmF0ZToKLSAgaW50IHZhbHVlXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5vdENvcHlhYmxlKTsKLX07Ci0KLVRFU1QoQnlSZWZUZXN0LCBBbGxvd3NOb3RDb3B5YWJsZUNvbnN0VmFsdWVJbk1hdGNoZXJzKSB7Ci0gIGNvbnN0IE5vdENvcHlhYmxlIGNvbnN0X3ZhbHVlMSgxKTsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBOb3RDb3B5YWJsZSY+IG0gPSBFcShCeVJlZihjb25zdF92YWx1ZTEpKTsKLQotICBjb25zdCBOb3RDb3B5YWJsZSBuMSgxKSwgbjIoMik7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuMSkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG4yKSk7Ci19Ci0KLVRFU1QoQnlSZWZUZXN0LCBBbGxvd3NOb3RDb3B5YWJsZVZhbHVlSW5NYXRjaGVycykgewotICBOb3RDb3B5YWJsZSB2YWx1ZTIoMik7Ci0gIGNvbnN0IE1hdGNoZXI8Tm90Q29weWFibGUmPiBtID0gR2UoQnlSZWYodmFsdWUyKSk7Ci0KLSAgTm90Q29weWFibGUgbjEoMSksIG4yKDIpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG4xKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuMikpOwotfQotCi1URVNUKElzRW1wdHlUZXN0LCBJbXBsZW1lbnRzSXNFbXB0eSkgewotICB2ZWN0b3I8aW50PiBjb250YWluZXI7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgSXNFbXB0eSgpKTsKLSAgY29udGFpbmVyLnB1c2hfYmFjaygwKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoSXNFbXB0eSgpKSk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KElzRW1wdHkoKSkpOwotfQotCi1URVNUKElzRW1wdHlUZXN0LCBXb3Jrc1dpdGhTdHJpbmcpIHsKLSAgc3RyaW5nIHRleHQ7Ci0gIEVYUEVDVF9USEFUKHRleHQsIElzRW1wdHkoKSk7Ci0gIHRleHQgPSAiZm9vIjsKLSAgRVhQRUNUX1RIQVQodGV4dCwgTm90KElzRW1wdHkoKSkpOwotICB0ZXh0ID0gc3RyaW5nKCJcMCIsIDEpOwotICBFWFBFQ1RfVEhBVCh0ZXh0LCBOb3QoSXNFbXB0eSgpKSk7Ci19Ci0KLVRFU1QoSXNFbXB0eVRlc3QsIENhbkRlc2NyaWJlU2VsZikgewotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbSA9IElzRW1wdHkoKTsKLSAgRVhQRUNUX0VRKCJpcyBlbXB0eSIsIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJpc24ndCBlbXB0eSIsIERlc2NyaWJlTmVnYXRpb24obSkpOwotfQotCi1URVNUKElzRW1wdHlUZXN0LCBFeHBsYWluc1Jlc3VsdCkgewotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbSA9IElzRW1wdHkoKTsKLSAgdmVjdG9yPGludD4gY29udGFpbmVyOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgY29udGFpbmVyKSk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7Ci0gIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSBpcyAxIiwgRXhwbGFpbihtLCBjb250YWluZXIpKTsKLX0KLQotVEVTVChTaXplSXNUZXN0LCBJbXBsZW1lbnRzU2l6ZUlzKSB7Ci0gIHZlY3RvcjxpbnQ+IGNvbnRhaW5lcjsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoMCkpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChTaXplSXMoMSkpKTsKLSAgY29udGFpbmVyLnB1c2hfYmFjaygwKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoU2l6ZUlzKDApKSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDEpKTsKLSAgY29udGFpbmVyLnB1c2hfYmFjaygwKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoU2l6ZUlzKDApKSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDIpKTsKLX0KLQotVEVTVChTaXplSXNUZXN0LCBXb3Jrc1dpdGhNYXApIHsKLSAgbWFwPHN0cmluZywgaW50PiBjb250YWluZXI7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDApKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoU2l6ZUlzKDEpKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKCJmb28iLCAxKSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KFNpemVJcygwKSkpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIFNpemVJcygxKSk7Ci0gIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKCJiYXIiLCAyKSk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KFNpemVJcygwKSkpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIFNpemVJcygyKSk7Ci19Ci0KLVRFU1QoU2l6ZUlzVGVzdCwgV29ya3NXaXRoUmVmZXJlbmNlcykgewotICB2ZWN0b3I8aW50PiBjb250YWluZXI7Ci0gIE1hdGNoZXI8Y29uc3QgdmVjdG9yPGludD4mPiBtID0gU2l6ZUlzKDEpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChtKSk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgbSk7Ci19Ci0KLVRFU1QoU2l6ZUlzVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gU2l6ZUlzKDIpOwotICBFWFBFQ1RfRVEoInNpemUgaXMgZXF1YWwgdG8gMiIsIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJzaXplIGlzbid0IGVxdWFsIHRvIDIiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKLX0KLQotVEVTVChTaXplSXNUZXN0LCBFeHBsYWluc1Jlc3VsdCkgewotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTEgPSBTaXplSXMoMik7Ci0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtMiA9IFNpemVJcyhMdCgydSkpOwotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTMgPSBTaXplSXMoQW55T2YoMCwgMykpOwotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTQgPSBTaXplSXMoR3JlYXRlclRoYW4oMSkpOwotICB2ZWN0b3I8aW50PiBjb250YWluZXI7Ci0gIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAwIGRvZXNuJ3QgbWF0Y2giLCBFeHBsYWluKG0xLCBjb250YWluZXIpKTsKLSAgRVhQRUNUX0VRKCJ3aG9zZSBzaXplIDAgbWF0Y2hlcyIsIEV4cGxhaW4obTIsIGNvbnRhaW5lcikpOwotICBFWFBFQ1RfRVEoIndob3NlIHNpemUgMCBtYXRjaGVzIiwgRXhwbGFpbihtMywgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAwIGRvZXNuJ3QgbWF0Y2gsIHdoaWNoIGlzIDEgbGVzcyB0aGFuIDEiLAotICAgICAgICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7Ci0gIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAyIG1hdGNoZXMiLCBFeHBsYWluKG0xLCBjb250YWluZXIpKTsKLSAgRVhQRUNUX0VRKCJ3aG9zZSBzaXplIDIgZG9lc24ndCBtYXRjaCIsIEV4cGxhaW4obTIsIGNvbnRhaW5lcikpOwotICBFWFBFQ1RfRVEoIndob3NlIHNpemUgMiBkb2Vzbid0IG1hdGNoIiwgRXhwbGFpbihtMywgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAyIG1hdGNoZXMsIHdoaWNoIGlzIDEgbW9yZSB0aGFuIDEiLAotICAgICAgICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotLy8gVGVzdHMgQ29udGFpbmVyRXEgd2l0aCBkaWZmZXJlbnQgY29udGFpbmVyIHR5cGVzLCBhbmQKLS8vIGRpZmZlcmVudCBlbGVtZW50IHR5cGVzLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENvbnRhaW5lckVxVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHt9OwotCi10eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPAotICAgIHNldDxpbnQ+LAotICAgIHZlY3RvcjxzaXplX3Q+LAotICAgIG11bHRpc2V0PHNpemVfdD4sCi0gICAgbGlzdDxpbnQ+ID4KLSAgICBDb250YWluZXJFcVRlc3RUeXBlczsKLQotVFlQRURfVEVTVF9DQVNFKENvbnRhaW5lckVxVGVzdCwgQ29udGFpbmVyRXFUZXN0VHlwZXMpOwotCi0vLyBUZXN0cyB0aGF0IHRoZSBmaWxsZWQgY29udGFpbmVyIGlzIGVxdWFsIHRvIGl0c2VsZi4KLVRZUEVEX1RFU1QoQ29udGFpbmVyRXFUZXN0LCBFcXVhbHNTZWxmKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsc1tdID0gezEsIDEsIDIsIDMsIDUsIDh9OwotICBUeXBlUGFyYW0gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKLSAgY29uc3QgTWF0Y2hlcjxUeXBlUGFyYW0+IG0gPSBDb250YWluZXJFcShteV9zZXQpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobXlfc2V0KSk7Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCBteV9zZXQpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBtaXNzaW5nIHZhbHVlcyBhcmUgcmVwb3J0ZWQuCi1UWVBFRF9URVNUKENvbnRhaW5lckVxVGVzdCwgVmFsdWVNaXNzaW5nKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsc1tdID0gezEsIDEsIDIsIDMsIDUsIDh9OwotICBzdGF0aWMgY29uc3QgaW50IHRlc3RfdmFsc1tdID0gezIsIDEsIDgsIDV9OwotICBUeXBlUGFyYW0gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKLSAgVHlwZVBhcmFtIHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgNCk7Ci0gIGNvbnN0IE1hdGNoZXI8VHlwZVBhcmFtPiBtID0gQ29udGFpbmVyRXEobXlfc2V0KTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3NldCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogMyIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIHRlc3Rfc2V0KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYWRkZWQgdmFsdWVzIGFyZSByZXBvcnRlZC4KLVRZUEVEX1RFU1QoQ29udGFpbmVyRXFUZXN0LCBWYWx1ZUFkZGVkKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsc1tdID0gezEsIDEsIDIsIDMsIDUsIDh9OwotICBzdGF0aWMgY29uc3QgaW50IHRlc3RfdmFsc1tdID0gezEsIDIsIDMsIDUsIDgsIDQ2fTsKLSAgVHlwZVBhcmFtIG15X3NldCh2YWxzLCB2YWxzICsgNik7Ci0gIFR5cGVQYXJhbSB0ZXN0X3NldCh0ZXN0X3ZhbHMsIHRlc3RfdmFscyArIDYpOwotICBjb25zdCBNYXRjaGVyPGNvbnN0IFR5cGVQYXJhbSY+IG0gPSBDb250YWluZXJFcShteV9zZXQpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHRlc3Rfc2V0KSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaGFzIHRoZXNlIHVuZXhwZWN0ZWQgZWxlbWVudHM6IDQ2IiwgRXhwbGFpbihtLCB0ZXN0X3NldCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFkZGVkIGFuZCBtaXNzaW5nIHZhbHVlcyBhcmUgcmVwb3J0ZWQgdG9nZXRoZXIuCi1UWVBFRF9URVNUKENvbnRhaW5lckVxVGVzdCwgVmFsdWVBZGRlZEFuZFJlbW92ZWQpIHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWxzW10gPSB7MSwgMSwgMiwgMywgNSwgOH07Ci0gIHN0YXRpYyBjb25zdCBpbnQgdGVzdF92YWxzW10gPSB7MSwgMiwgMywgOCwgNDZ9OwotICBUeXBlUGFyYW0gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKLSAgVHlwZVBhcmFtIHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgNSk7Ci0gIGNvbnN0IE1hdGNoZXI8VHlwZVBhcmFtPiBtID0gQ29udGFpbmVyRXEobXlfc2V0KTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3NldCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGhhcyB0aGVzZSB1bmV4cGVjdGVkIGVsZW1lbnRzOiA0NixcbiIKLSAgICAgICAgICAgICJhbmQgZG9lc24ndCBoYXZlIHRoZXNlIGV4cGVjdGVkIGVsZW1lbnRzOiA1IiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKLX0KLQotLy8gVGVzdHMgZHVwbGljYXRlZCB2YWx1ZSAtLSBleHBlY3Qgbm8gZXhwbGFuYXRpb24uCi1UWVBFRF9URVNUKENvbnRhaW5lckVxVGVzdCwgRHVwbGljYXRlRGlmZmVyZW5jZSkgewotICBzdGF0aWMgY29uc3QgaW50IHZhbHNbXSA9IHsxLCAxLCAyLCAzLCA1LCA4fTsKLSAgc3RhdGljIGNvbnN0IGludCB0ZXN0X3ZhbHNbXSA9IHsxLCAyLCAzLCA1LCA4fTsKLSAgVHlwZVBhcmFtIG15X3NldCh2YWxzLCB2YWxzICsgNik7Ci0gIFR5cGVQYXJhbSB0ZXN0X3NldCh0ZXN0X3ZhbHMsIHRlc3RfdmFscyArIDUpOwotICBjb25zdCBNYXRjaGVyPGNvbnN0IFR5cGVQYXJhbSY+IG0gPSBDb250YWluZXJFcShteV9zZXQpOwotICAvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5lciwgbWF0Y2ggbWF5IGJlIHRydWUgb3IgZmFsc2UKLSAgLy8gQnV0IGluIGFueSBjYXNlIHRoZXJlIHNob3VsZCBiZSBubyBleHBsYW5hdGlvbi4KLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHRlc3Rfc2V0KSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLS8vIFRlc3RzIHRoYXQgbXV0bGlwbGUgbWlzc2luZyB2YWx1ZXMgYXJlIHJlcG9ydGVkLgotLy8gVXNpbmcganVzdCB2ZWN0b3IgaGVyZSwgc28gb3JkZXIgaXMgcHJlZGljYXRibGUuCi1URVNUKENvbnRhaW5lckVxRXh0cmFUZXN0LCBNdWx0aXBsZVZhbHVlc01pc3NpbmcpIHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWxzW10gPSB7MSwgMSwgMiwgMywgNSwgOH07Ci0gIHN0YXRpYyBjb25zdCBpbnQgdGVzdF92YWxzW10gPSB7MiwgMSwgNX07Ci0gIHZlY3RvcjxpbnQ+IG15X3NldCh2YWxzLCB2YWxzICsgNik7Ci0gIHZlY3RvcjxpbnQ+IHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgMyk7Ci0gIGNvbnN0IE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gQ29udGFpbmVyRXEobXlfc2V0KTsKLSAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3NldCkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogMywgOCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIHRlc3Rfc2V0KSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYWRkZWQgdmFsdWVzIGFyZSByZXBvcnRlZC4KLS8vIFVzaW5nIGp1c3QgdmVjdG9yIGhlcmUsIHNvIG9yZGVyIGlzIHByZWRpY2F0YmxlLgotVEVTVChDb250YWluZXJFcUV4dHJhVGVzdCwgTXVsdGlwbGVWYWx1ZXNBZGRlZCkgewotICBzdGF0aWMgY29uc3QgaW50IHZhbHNbXSA9IHsxLCAxLCAyLCAzLCA1LCA4fTsKLSAgc3RhdGljIGNvbnN0IGludCB0ZXN0X3ZhbHNbXSA9IHsxLCAyLCA5MiwgMywgNSwgOCwgNDZ9OwotICBsaXN0PHNpemVfdD4gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKLSAgbGlzdDxzaXplX3Q+IHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgNyk7Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgbGlzdDxzaXplX3Q+Jj4gbSA9IENvbnRhaW5lckVxKG15X3NldCk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF9zZXQpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBoYXMgdGhlc2UgdW5leHBlY3RlZCBlbGVtZW50czogOTIsIDQ2IiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhZGRlZCBhbmQgbWlzc2luZyB2YWx1ZXMgYXJlIHJlcG9ydGVkIHRvZ2V0aGVyLgotVEVTVChDb250YWluZXJFcUV4dHJhVGVzdCwgTXVsdGlwbGVWYWx1ZXNBZGRlZEFuZFJlbW92ZWQpIHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWxzW10gPSB7MSwgMSwgMiwgMywgNSwgOH07Ci0gIHN0YXRpYyBjb25zdCBpbnQgdGVzdF92YWxzW10gPSB7MSwgMiwgMywgOTIsIDQ2fTsKLSAgbGlzdDxzaXplX3Q+IG15X3NldCh2YWxzLCB2YWxzICsgNik7Ci0gIGxpc3Q8c2l6ZV90PiB0ZXN0X3NldCh0ZXN0X3ZhbHMsIHRlc3RfdmFscyArIDUpOwotICBjb25zdCBNYXRjaGVyPGNvbnN0IGxpc3Q8c2l6ZV90PiA+IG0gPSBDb250YWluZXJFcShteV9zZXQpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHRlc3Rfc2V0KSk7Ci0gIEVYUEVDVF9FUSgid2hpY2ggaGFzIHRoZXNlIHVuZXhwZWN0ZWQgZWxlbWVudHM6IDkyLCA0NixcbiIKLSAgICAgICAgICAgICJhbmQgZG9lc24ndCBoYXZlIHRoZXNlIGV4cGVjdGVkIGVsZW1lbnRzOiA1LCA4IiwKLSAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKLX0KLQotLy8gVGVzdHMgdG8gc2VlIHRoYXQgZHVwbGljYXRlIGVsZW1lbnRzIGFyZSBkZXRlY3RlZCwKLS8vIGJ1dCAoYXMgYWJvdmUpIG5vdCByZXBvcnRlZCBpbiB0aGUgZXhwbGFuYXRpb24uCi1URVNUKENvbnRhaW5lckVxRXh0cmFUZXN0LCBNdWx0aVNldE9mSW50RHVwbGljYXRlRGlmZmVyZW5jZSkgewotICBzdGF0aWMgY29uc3QgaW50IHZhbHNbXSA9IHsxLCAxLCAyLCAzLCA1LCA4fTsKLSAgc3RhdGljIGNvbnN0IGludCB0ZXN0X3ZhbHNbXSA9IHsxLCAyLCAzLCA1LCA4fTsKLSAgdmVjdG9yPGludD4gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKLSAgdmVjdG9yPGludD4gdGVzdF9zZXQodGVzdF92YWxzLCB0ZXN0X3ZhbHMgKyA1KTsKLSAgY29uc3QgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBDb250YWluZXJFcShteV9zZXQpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobXlfc2V0KSk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF9zZXQpKTsKLSAgLy8gVGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQgd2hlbiBib3RoIHNldHMgY29udGFpbiBhbGwgdGhlIHNhbWUgdmFsdWVzLgotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBDb250YWluZXJFcSB3b3JrcyBmb3Igbm9uLXRyaXZpYWwgYXNzb2NpYXRpdmUgY29udGFpbmVycywKLS8vIGxpa2UgbWFwcy4KLVRFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yTWFwcykgewotICBtYXA8aW50LCBzdGQ6OnN0cmluZz4gbXlfbWFwOwotICBteV9tYXBbMF0gPSAiYSI7Ci0gIG15X21hcFsxXSA9ICJiIjsKLQotICBtYXA8aW50LCBzdGQ6OnN0cmluZz4gdGVzdF9tYXA7Ci0gIHRlc3RfbWFwWzBdID0gImFhIjsKLSAgdGVzdF9tYXBbMV0gPSAiYiI7Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBtYXA8aW50LCBzdGQ6OnN0cmluZz4mPiBtID0gQ29udGFpbmVyRXEobXlfbWFwKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG15X21hcCkpOwotICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHRlc3RfbWFwKSk7Ci0KLSAgRVhQRUNUX0VRKCJ3aGljaCBoYXMgdGhlc2UgdW5leHBlY3RlZCBlbGVtZW50czogKDAsIFwiYWFcIiksXG4iCi0gICAgICAgICAgICAiYW5kIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogKDAsIFwiYVwiKSIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIHRlc3RfbWFwKSk7Ci19Ci0KLVRFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXkpIHsKLSAgaW50IGExW10gPSB7MSwgMiwgM307Ci0gIGludCBhMltdID0gezEsIDIsIDN9OwotICBpbnQgYltdID0gezEsIDIsIDR9OwotCi0gIEVYUEVDVF9USEFUKGExLCBDb250YWluZXJFcShhMikpOwotICBFWFBFQ1RfVEhBVChhMSwgTm90KENvbnRhaW5lckVxKGIpKSk7Ci19Ci0KLVRFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxOYXRpdmVBcnJheSkgewotICBjb25zdCBjaGFyIGExW11bM10gPSB7ImhpIiwgImxvIn07Ci0gIGNvbnN0IGNoYXIgYTJbXVszXSA9IHsiaGkiLCAibG8ifTsKLSAgY29uc3QgY2hhciBiW11bM10gPSB7ImxvIiwgImhpIn07Ci0KLSAgLy8gVGVzdHMgdXNpbmcgQ29udGFpbmVyRXEoKSBpbiB0aGUgZmlyc3QgZGltZW5zaW9uLgotICBFWFBFQ1RfVEhBVChhMSwgQ29udGFpbmVyRXEoYTIpKTsKLSAgRVhQRUNUX1RIQVQoYTEsIE5vdChDb250YWluZXJFcShiKSkpOwotCi0gIC8vIFRlc3RzIHVzaW5nIENvbnRhaW5lckVxKCkgaW4gdGhlIHNlY29uZCBkaW1lbnNpb24uCi0gIEVYUEVDVF9USEFUKGExLCBFbGVtZW50c0FyZShDb250YWluZXJFcShhMlswXSksIENvbnRhaW5lckVxKGEyWzFdKSkpOwotICBFWFBFQ1RfVEhBVChhMSwgRWxlbWVudHNBcmUoTm90KENvbnRhaW5lckVxKGJbMF0pKSwgQ29udGFpbmVyRXEoYTJbMV0pKSk7Ci19Ci0KLVRFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXlBc1R1cGxlKSB7Ci0gIGNvbnN0IGludCBhMVtdID0gezEsIDIsIDN9OwotICBjb25zdCBpbnQgYTJbXSA9IHsxLCAyLCAzfTsKLSAgY29uc3QgaW50IGJbXSA9IHsxLCAyLCAzLCA0fTsKLQotICBjb25zdCBpbnQqIGNvbnN0IHAxID0gYTE7Ci0gIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUocDEsIDMpLCBDb250YWluZXJFcShhMikpOwotICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKHAxLCAzKSwgTm90KENvbnRhaW5lckVxKGIpKSk7Ci0KLSAgY29uc3QgaW50IGNbXSA9IHsxLCAzLCAyfTsKLSAgRVhQRUNUX1RIQVQobWFrZV90dXBsZShwMSwgMyksIE5vdChDb250YWluZXJFcShjKSkpOwotfQotCi1URVNUKENvbnRhaW5lckVxRXh0cmFUZXN0LCBDb3BpZXNOYXRpdmVBcnJheVBhcmFtZXRlcikgewotICBzdGQ6OnN0cmluZyBhMVtdWzNdID0gewotICAgIHsiaGkiLCAiaGVsbG8iLCAiY2lhbyJ9LAotICAgIHsiYnllIiwgInNlZSB5b3UiLCAiY2lhbyJ9Ci0gIH07Ci0KLSAgc3RkOjpzdHJpbmcgYTJbXVszXSA9IHsKLSAgICB7ImhpIiwgImhlbGxvIiwgImNpYW8ifSwKLSAgICB7ImJ5ZSIsICJzZWUgeW91IiwgImNpYW8ifQotICB9OwotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmcoJilbMl1bM10+IG0gPSBDb250YWluZXJFcShhMik7Ci0gIEVYUEVDVF9USEFUKGExLCBtKTsKLQotICBhMlswXVswXSA9ICJoYSI7Ci0gIEVYUEVDVF9USEFUKGExLCBtKTsKLX0KLQotVEVTVChXaGVuU29ydGVkQnlUZXN0LCBXb3Jrc0ZvckVtcHR5Q29udGFpbmVyKSB7Ci0gIGNvbnN0IHZlY3RvcjxpbnQ+IG51bWJlcnM7Ci0gIEVYUEVDVF9USEFUKG51bWJlcnMsIFdoZW5Tb3J0ZWRCeShsZXNzPGludD4oKSwgRWxlbWVudHNBcmUoKSkpOwotICBFWFBFQ1RfVEhBVChudW1iZXJzLCBOb3QoV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgxKSkpKTsKLX0KLQotVEVTVChXaGVuU29ydGVkQnlUZXN0LCBXb3Jrc0Zvck5vbkVtcHR5Q29udGFpbmVyKSB7Ci0gIHZlY3Rvcjx1bnNpZ25lZD4gbnVtYmVyczsKLSAgbnVtYmVycy5wdXNoX2JhY2soMyk7Ci0gIG51bWJlcnMucHVzaF9iYWNrKDEpOwotICBudW1iZXJzLnB1c2hfYmFjaygyKTsKLSAgbnVtYmVycy5wdXNoX2JhY2soMik7Ci0gIEVYUEVDVF9USEFUKG51bWJlcnMsIFdoZW5Tb3J0ZWRCeShncmVhdGVyPHVuc2lnbmVkPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoMywgMiwgMiwgMSkpKTsKLSAgRVhQRUNUX1RIQVQobnVtYmVycywgTm90KFdoZW5Tb3J0ZWRCeShncmVhdGVyPHVuc2lnbmVkPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKDEsIDIsIDIsIDMpKSkpOwotfQotCi1URVNUKFdoZW5Tb3J0ZWRCeVRlc3QsIFdvcmtzRm9yTm9uVmVjdG9yQ29udGFpbmVyKSB7Ci0gIGxpc3Q8c3RyaW5nPiB3b3JkczsKLSAgd29yZHMucHVzaF9iYWNrKCJzYXkiKTsKLSAgd29yZHMucHVzaF9iYWNrKCJoZWxsbyIpOwotICB3b3Jkcy5wdXNoX2JhY2soIndvcmxkIik7Ci0gIEVYUEVDVF9USEFUKHdvcmRzLCBXaGVuU29ydGVkQnkobGVzczxzdHJpbmc+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoImhlbGxvIiwgInNheSIsICJ3b3JsZCIpKSk7Ci0gIEVYUEVDVF9USEFUKHdvcmRzLCBOb3QoV2hlblNvcnRlZEJ5KGxlc3M8c3RyaW5nPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50c0FyZSgic2F5IiwgImhlbGxvIiwgIndvcmxkIikpKSk7Ci19Ci0KLVRFU1QoV2hlblNvcnRlZEJ5VGVzdCwgV29ya3NGb3JOYXRpdmVBcnJheSkgewotICBjb25zdCBpbnQgbnVtYmVyc1tdID0gezEsIDMsIDIsIDR9OwotICBjb25zdCBpbnQgc29ydGVkX251bWJlcnNbXSA9IHsxLCAyLCAzLCA0fTsKLSAgRVhQRUNUX1RIQVQobnVtYmVycywgV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgxLCAyLCAzLCA0KSkpOwotICBFWFBFQ1RfVEhBVChudW1iZXJzLCBXaGVuU29ydGVkQnkobGVzczxpbnQ+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50c0FyZUFycmF5KHNvcnRlZF9udW1iZXJzKSkpOwotICBFWFBFQ1RfVEhBVChudW1iZXJzLCBOb3QoV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgxLCAzLCAyLCA0KSkpKTsKLX0KLQotVEVTVChXaGVuU29ydGVkQnlUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKLSAgY29uc3QgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBXaGVuU29ydGVkQnkobGVzczxpbnQ+KCksIEVsZW1lbnRzQXJlKDEsIDIpKTsKLSAgRVhQRUNUX0VRKCIod2hlbiBzb3J0ZWQpIGhhcyAyIGVsZW1lbnRzIHdoZXJlXG4iCi0gICAgICAgICAgICAiZWxlbWVudCAjMCBpcyBlcXVhbCB0byAxLFxuIgotICAgICAgICAgICAgImVsZW1lbnQgIzEgaXMgZXF1YWwgdG8gMiIsCi0gICAgICAgICAgICBEZXNjcmliZShtKSk7Ci0gIEVYUEVDVF9FUSgiKHdoZW4gc29ydGVkKSBkb2Vzbid0IGhhdmUgMiBlbGVtZW50cywgb3JcbiIKLSAgICAgICAgICAgICJlbGVtZW50ICMwIGlzbid0IGVxdWFsIHRvIDEsIG9yXG4iCi0gICAgICAgICAgICAiZWxlbWVudCAjMSBpc24ndCBlcXVhbCB0byAyIiwKLSAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOwotfQotCi1URVNUKFdoZW5Tb3J0ZWRCeVRlc3QsIEV4cGxhaW5zTWF0Y2hSZXN1bHQpIHsKLSAgY29uc3QgaW50IGFbXSA9IHsyLCAxfTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyB7IDEsIDIgfSB3aGVuIHNvcnRlZCwgd2hvc2UgZWxlbWVudCAjMCBkb2Vzbid0IG1hdGNoIiwKLSAgICAgICAgICAgIEV4cGxhaW4oV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgyLCAzKSksIGEpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBpcyB7IDEsIDIgfSB3aGVuIHNvcnRlZCIsCi0gICAgICAgICAgICBFeHBsYWluKFdoZW5Tb3J0ZWRCeShsZXNzPGludD4oKSwgRWxlbWVudHNBcmUoMSwgMikpLCBhKSk7Ci19Ci0KLS8vIFdoZW5Tb3J0ZWQoKSBpcyBhIHNpbXBsZSB3cmFwcGVyIG9uIFdoZW5Tb3J0ZWRCeSgpLiAgSGVuY2Ugd2UgZG9uJ3QKLS8vIG5lZWQgdG8gdGVzdCBpdCBhcyBleGhhdXN0aXZlbHkgYXMgd2UgdGVzdCB0aGUgbGF0dGVyLgotCi1URVNUKFdoZW5Tb3J0ZWRUZXN0LCBXb3Jrc0ZvckVtcHR5Q29udGFpbmVyKSB7Ci0gIGNvbnN0IHZlY3RvcjxpbnQ+IG51bWJlcnM7Ci0gIEVYUEVDVF9USEFUKG51bWJlcnMsIFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoKSkpOwotICBFWFBFQ1RfVEhBVChudW1iZXJzLCBOb3QoV2hlblNvcnRlZChFbGVtZW50c0FyZSgxKSkpKTsKLX0KLQotVEVTVChXaGVuU29ydGVkVGVzdCwgV29ya3NGb3JOb25FbXB0eUNvbnRhaW5lcikgewotICBsaXN0PHN0cmluZz4gd29yZHM7Ci0gIHdvcmRzLnB1c2hfYmFjaygiMyIpOwotICB3b3Jkcy5wdXNoX2JhY2soIjEiKTsKLSAgd29yZHMucHVzaF9iYWNrKCIyIik7Ci0gIHdvcmRzLnB1c2hfYmFjaygiMiIpOwotICBFWFBFQ1RfVEhBVCh3b3JkcywgV2hlblNvcnRlZChFbGVtZW50c0FyZSgiMSIsICIyIiwgIjIiLCAiMyIpKSk7Ci0gIEVYUEVDVF9USEFUKHdvcmRzLCBOb3QoV2hlblNvcnRlZChFbGVtZW50c0FyZSgiMyIsICIxIiwgIjIiLCAiMiIpKSkpOwotfQotCi1URVNUKFdoZW5Tb3J0ZWRUZXN0LCBXb3Jrc0Zvck1hcFR5cGVzKSB7Ci0gICAgbWFwPHN0cmluZywgaW50PiB3b3JkX2NvdW50czsKLSAgICB3b3JkX2NvdW50c1siYW5kIl0gPSAxOwotICAgIHdvcmRfY291bnRzWyJ0aGUiXSA9IDE7Ci0gICAgd29yZF9jb3VudHNbImJ1ZmZhbG8iXSA9IDI7Ci0gICAgRVhQRUNUX1RIQVQod29yZF9jb3VudHMsIFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoCi0gICAgICAgICAgICBQYWlyKCJhbmQiLCAxKSwgUGFpcigiYnVmZmFsbyIsIDIpLCBQYWlyKCJ0aGUiLCAxKSkpKTsKLSAgICBFWFBFQ1RfVEhBVCh3b3JkX2NvdW50cywgTm90KFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoCi0gICAgICAgICAgICBQYWlyKCJhbmQiLCAxKSwgUGFpcigidGhlIiwgMSksIFBhaXIoImJ1ZmZhbG8iLCAyKSkpKSk7Ci19Ci0KLVRFU1QoV2hlblNvcnRlZFRlc3QsIFdvcmtzRm9yTXVsdGlNYXBUeXBlcykgewotICAgIG11bHRpbWFwPGludCwgaW50PiBpZmliOwotICAgIGlmaWIuaW5zZXJ0KG1ha2VfcGFpcig4LCA2KSk7Ci0gICAgaWZpYi5pbnNlcnQobWFrZV9wYWlyKDIsIDMpKTsKLSAgICBpZmliLmluc2VydChtYWtlX3BhaXIoMSwgMSkpOwotICAgIGlmaWIuaW5zZXJ0KG1ha2VfcGFpcigzLCA0KSk7Ci0gICAgaWZpYi5pbnNlcnQobWFrZV9wYWlyKDEsIDIpKTsKLSAgICBpZmliLmluc2VydChtYWtlX3BhaXIoNSwgNSkpOwotICAgIEVYUEVDVF9USEFUKGlmaWIsIFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoUGFpcigxLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoMSwgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDIsIDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcigzLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoNSwgNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDgsIDYpKSkpOwotICAgIEVYUEVDVF9USEFUKGlmaWIsIE5vdChXaGVuU29ydGVkKEVsZW1lbnRzQXJlKFBhaXIoOCwgNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcigyLCAzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDEsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoMywgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcigxLCAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDUsIDUpKSkpKTsKLX0KLQotVEVTVChXaGVuU29ydGVkVGVzdCwgV29ya3NGb3JQb2x5bW9ycGhpY01hdGNoZXIpIHsKLSAgICBzdGQ6OmRlcXVlPGludD4gZDsKLSAgICBkLnB1c2hfYmFjaygyKTsKLSAgICBkLnB1c2hfYmFjaygxKTsKLSAgICBFWFBFQ1RfVEhBVChkLCBXaGVuU29ydGVkKEVsZW1lbnRzQXJlKDEsIDIpKSk7Ci0gICAgRVhQRUNUX1RIQVQoZCwgTm90KFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoMiwgMSkpKSk7Ci19Ci0KLVRFU1QoV2hlblNvcnRlZFRlc3QsIFdvcmtzRm9yVmVjdG9yQ29uc3RSZWZNYXRjaGVyKSB7Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IGQ7Ci0gICAgZC5wdXNoX2JhY2soMik7Ci0gICAgZC5wdXNoX2JhY2soMSk7Ci0gICAgTWF0Y2hlcjxjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+Jj4gdmVjdG9yX21hdGNoID0gRWxlbWVudHNBcmUoMSwgMik7Ci0gICAgRVhQRUNUX1RIQVQoZCwgV2hlblNvcnRlZCh2ZWN0b3JfbWF0Y2gpKTsKLSAgICBNYXRjaGVyPGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mPiBub3RfdmVjdG9yX21hdGNoID0gRWxlbWVudHNBcmUoMiwgMSk7Ci0gICAgRVhQRUNUX1RIQVQoZCwgTm90KFdoZW5Tb3J0ZWQobm90X3ZlY3Rvcl9tYXRjaCkpKTsKLX0KLQotLy8gRGVsaWJlcmF0ZWx5IGJhcmUgcHNldWRvLWNvbnRhaW5lci4KLS8vIE9mZmVycyBvbmx5IGJlZ2luKCkgYW5kIGVuZCgpIGFjY2Vzc29ycywgeWllbGRpbmcgSW5wdXRJdGVyYXRvci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgU3RyZWFtbGlrZSB7Ci0gcHJpdmF0ZToKLSAgY2xhc3MgQ29uc3RJdGVyOwotIHB1YmxpYzoKLSAgdHlwZWRlZiBDb25zdEl0ZXIgY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbkl0ZXI+Ci0gIFN0cmVhbWxpa2UoSW5JdGVyIGZpcnN0LCBJbkl0ZXIgbGFzdCkgOiByZW1haW5kZXJfKGZpcnN0LCBsYXN0KSB7fQotCi0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLCByZW1haW5kZXJfLmJlZ2luKCkpOwotICB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcywgcmVtYWluZGVyXy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIENvbnN0SXRlciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJj4gewotICAgcHVibGljOgotICAgIENvbnN0SXRlcihjb25zdCBTdHJlYW1saWtlKiBzLAotICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yIHBvcykKLSAgICAgICAgOiBzXyhzKSwgcG9zXyhwb3MpIHt9Ci0KLSAgICBjb25zdCB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcG9zXzsgfQotICAgIGNvbnN0IHZhbHVlX3R5cGUqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKnBvc187IH0KLSAgICBDb25zdEl0ZXImIG9wZXJhdG9yKysoKSB7Ci0gICAgICBzXy0+cmVtYWluZGVyXy5lcmFzZShwb3NfKyspOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8vICppdGVyKysgaXMgcmVxdWlyZWQgdG8gd29yayAoc2VlIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcikuCi0gICAgLy8gKHZvaWQpaXRlcisrIGlzIGFsc28gcmVxdWlyZWQgdG8gd29yay4KLSAgICBjbGFzcyBQb3N0SW5jclByb3h5IHsKLSAgICAgcHVibGljOgotICAgICAgZXhwbGljaXQgUG9zdEluY3JQcm94eShjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gICAgICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICAgICBwcml2YXRlOgotICAgICAgdmFsdWVfdHlwZSB2YWx1ZV87Ci0gICAgfTsKLSAgICBQb3N0SW5jclByb3h5IG9wZXJhdG9yKysoaW50KSB7Ci0gICAgICBQb3N0SW5jclByb3h5IHByb3h5KCoqdGhpcyk7Ci0gICAgICArKygqdGhpcyk7Ci0gICAgICByZXR1cm4gcHJveHk7Ci0gICAgfQotCi0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdEl0ZXImIGEsIGNvbnN0IENvbnN0SXRlciYgYikgewotICAgICAgcmV0dXJuIGEuc18gPT0gYi5zXyAmJiBhLnBvc18gPT0gYi5wb3NfOwotICAgIH0KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbnN0SXRlciYgYSwgY29uc3QgQ29uc3RJdGVyJiBiKSB7Ci0gICAgICByZXR1cm4gIShhID09IGIpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBTdHJlYW1saWtlKiBzXzsKLSAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yIHBvc187Ci0gIH07Ci0KLSAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJlYW1saWtlJiBzKSB7Ci0gICAgb3MgPDwgIlsiOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpsaXN0PHZhbHVlX3R5cGU+Ojpjb25zdF9pdGVyYXRvciBJdGVyOwotICAgIGNvbnN0IGNoYXIqIHNlcCA9ICIiOwotICAgIGZvciAoSXRlciBpdCA9IHMucmVtYWluZGVyXy5iZWdpbigpOyBpdCAhPSBzLnJlbWFpbmRlcl8uZW5kKCk7ICsraXQpIHsKLSAgICAgIG9zIDw8IHNlcCA8PCAqaXQ7Ci0gICAgICBzZXAgPSAiLCI7Ci0gICAgfQotICAgIG9zIDw8ICJdIjsKLSAgICByZXR1cm4gb3M7Ci0gIH0KLQotICBtdXRhYmxlIHN0ZDo6bGlzdDx2YWx1ZV90eXBlPiByZW1haW5kZXJfOyAgLy8gbW9kaWZpZWQgYnkgaXRlcmF0aW9uCi19OwotCi1URVNUKFN0cmVhbWxpa2VUZXN0LCBJdGVyYXRpb24pIHsKLSAgY29uc3QgaW50IGFbNV0gPSB7MiwgMSwgNCwgNSwgM307Ci0gIFN0cmVhbWxpa2U8aW50PiBzKGEsIGEgKyA1KTsKLSAgU3RyZWFtbGlrZTxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHMuYmVnaW4oKTsKLSAgY29uc3QgaW50KiBpcCA9IGE7Ci0gIHdoaWxlIChpdCAhPSBzLmVuZCgpKSB7Ci0gICAgU0NPUEVEX1RSQUNFKGlwIC0gYSk7Ci0gICAgRVhQRUNUX0VRKCppcCsrLCAqaXQrKyk7Ci0gIH0KLX0KLQotI2lmIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXwotVEVTVChCZWdpbkVuZERpc3RhbmNlSXNUZXN0LCBXb3Jrc1dpdGhGb3J3YXJkTGlzdCkgewotICBzdGQ6OmZvcndhcmRfbGlzdDxpbnQ+IGNvbnRhaW5lcjsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBCZWdpbkVuZERpc3RhbmNlSXMoMCkpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChCZWdpbkVuZERpc3RhbmNlSXMoMSkpKTsKLSAgY29udGFpbmVyLnB1c2hfZnJvbnQoMCk7Ci0gIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KEJlZ2luRW5kRGlzdGFuY2VJcygwKSkpOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIEJlZ2luRW5kRGlzdGFuY2VJcygxKSk7Ci0gIGNvbnRhaW5lci5wdXNoX2Zyb250KDApOwotICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChCZWdpbkVuZERpc3RhbmNlSXMoMCkpKTsKLSAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBCZWdpbkVuZERpc3RhbmNlSXMoMikpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZPUldBUkRfTElTVF8KLQotVEVTVChCZWdpbkVuZERpc3RhbmNlSXNUZXN0LCBXb3Jrc1dpdGhOb25TdGRMaXN0KSB7Ci0gIGNvbnN0IGludCBhWzVdID0gezEsIDIsIDMsIDQsIDV9OwotICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgNSk7Ci0gIEVYUEVDVF9USEFUKHMsIEJlZ2luRW5kRGlzdGFuY2VJcyg1KSk7Ci19Ci0KLVRFU1QoQmVnaW5FbmREaXN0YW5jZUlzVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7Ci0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gQmVnaW5FbmREaXN0YW5jZUlzKDIpOwotICBFWFBFQ1RfRVEoImRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgaXMgZXF1YWwgdG8gMiIsIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpIGlzbid0IGVxdWFsIHRvIDIiLAotICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Ci19Ci0KLVRFU1QoQmVnaW5FbmREaXN0YW5jZUlzVGVzdCwgRXhwbGFpbnNSZXN1bHQpIHsKLSAgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0xID0gQmVnaW5FbmREaXN0YW5jZUlzKDIpOwotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTIgPSBCZWdpbkVuZERpc3RhbmNlSXMoTHQoMikpOwotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTMgPSBCZWdpbkVuZERpc3RhbmNlSXMoQW55T2YoMCwgMykpOwotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTQgPSBCZWdpbkVuZERpc3RhbmNlSXMoR3JlYXRlclRoYW4oMSkpOwotICB2ZWN0b3I8aW50PiBjb250YWluZXI7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAwIGRvZXNuJ3QgbWF0Y2giLAotICAgICAgICAgICAgRXhwbGFpbihtMSwgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAwIG1hdGNoZXMiLAotICAgICAgICAgICAgRXhwbGFpbihtMiwgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAwIG1hdGNoZXMiLAotICAgICAgICAgICAgRXhwbGFpbihtMywgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJ3aG9zZSBkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpIDAgZG9lc24ndCBtYXRjaCwgd2hpY2ggaXMgMSAiCi0gICAgICAibGVzcyB0aGFuIDEiLAotICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7Ci0gIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAyIG1hdGNoZXMiLAotICAgICAgICAgICAgRXhwbGFpbihtMSwgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAyIGRvZXNuJ3QgbWF0Y2giLAotICAgICAgICAgICAgRXhwbGFpbihtMiwgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAyIGRvZXNuJ3QgbWF0Y2giLAotICAgICAgICAgICAgRXhwbGFpbihtMywgY29udGFpbmVyKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJ3aG9zZSBkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpIDIgbWF0Y2hlcywgd2hpY2ggaXMgMSBtb3JlICIKLSAgICAgICJ0aGFuIDEiLAotICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7Ci19Ci0KLVRFU1QoV2hlblNvcnRlZFRlc3QsIFdvcmtzRm9yU3RyZWFtbGlrZSkgewotICAvLyBTdHJlYW1saWtlICdjb250YWluZXInIHByb3ZpZGVzIG9ubHkgbWluaW1hbCBpdGVyYXRvciBzdXBwb3J0LgotICAvLyBJdHMgaXRlcmF0b3JzIGFyZSB0YWdnZWQgd2l0aCBpbnB1dF9pdGVyYXRvcl90YWcuCi0gIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OwotICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBFWFBFQ1RfVEhBVChzLCBXaGVuU29ydGVkKEVsZW1lbnRzQXJlKDEsIDIsIDMsIDQsIDUpKSk7Ci0gIEVYUEVDVF9USEFUKHMsIE5vdChXaGVuU29ydGVkKEVsZW1lbnRzQXJlKDIsIDEsIDQsIDUsIDMpKSkpOwotfQotCi1URVNUKFdoZW5Tb3J0ZWRUZXN0LCBXb3Jrc0ZvclZlY3RvckNvbnN0UmVmTWF0Y2hlck9uU3RyZWFtbGlrZSkgewotICBjb25zdCBpbnQgYVtdID0gezIsIDEsIDQsIDUsIDN9OwotICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBNYXRjaGVyPGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mPiB2ZWN0b3JfbWF0Y2ggPSBFbGVtZW50c0FyZSgxLCAyLCAzLCA0LCA1KTsKLSAgRVhQRUNUX1RIQVQocywgV2hlblNvcnRlZCh2ZWN0b3JfbWF0Y2gpKTsKLSAgRVhQRUNUX1RIQVQocywgTm90KFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoMiwgMSwgNCwgNSwgMykpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEVsZW1lbnRzQXJlKCkgYW5kIEVsZW1lbnRzQXJlQXJyYXkoKSB3aXRoIHN0cmVhbS1saWtlCi0vLyAiY29udGFpbmVycyIuCi0KLVRFU1QoRWxlbWVuc0FyZVN0cmVhbVRlc3QsIFdvcmtzRm9yU3RyZWFtbGlrZSkgewotICBjb25zdCBpbnQgYVs1XSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgU3RyZWFtbGlrZTxpbnQ+IHMoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKLSAgRVhQRUNUX1RIQVQocywgRWxlbWVudHNBcmUoMSwgMiwgMywgNCwgNSkpOwotICBFWFBFQ1RfVEhBVChzLCBOb3QoRWxlbWVudHNBcmUoMiwgMSwgNCwgNSwgMykpKTsKLX0KLQotVEVTVChFbGVtZW5zQXJlQXJyYXlTdHJlYW1UZXN0LCBXb3Jrc0ZvclN0cmVhbWxpa2UpIHsKLSAgY29uc3QgaW50IGFbNV0gPSB7MSwgMiwgMywgNCwgNX07Ci0gIFN0cmVhbWxpa2U8aW50PiBzKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0KLSAgdmVjdG9yPGludD4gZXhwZWN0ZWQ7Ci0gIGV4cGVjdGVkLnB1c2hfYmFjaygxKTsKLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDIpOwotICBleHBlY3RlZC5wdXNoX2JhY2soMyk7Ci0gIGV4cGVjdGVkLnB1c2hfYmFjayg0KTsKLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDUpOwotICBFWFBFQ1RfVEhBVChzLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7Ci0KLSAgZXhwZWN0ZWRbM10gPSAwOwotICBFWFBFQ1RfVEhBVChzLCBOb3QoRWxlbWVudHNBcmVBcnJheShleHBlY3RlZCkpKTsKLX0KLQotVEVTVChFbGVtZW50c0FyZVRlc3QsIFdvcmtzV2l0aFVuY29weWFibGUpIHsKLSAgVW5jb3B5YWJsZSBvYmpzWzJdOwotICBvYmpzWzBdLnNldF92YWx1ZSgtMyk7Ci0gIG9ianNbMV0uc2V0X3ZhbHVlKDEpOwotICBFWFBFQ1RfVEhBVChvYmpzLCBFbGVtZW50c0FyZShVbmNvcHlhYmxlSXMoLTMpLCBUcnVseShWYWx1ZUlzUG9zaXRpdmUpKSk7Ci19Ci0KLVRFU1QoRWxlbWVudHNBcmVUZXN0LCBUYWtlc1N0bENvbnRhaW5lcikgewotICBjb25zdCBpbnQgYWN0dWFsW10gPSB7MywgMSwgMn07Ci0KLSAgOjpzdGQ6Omxpc3Q8aW50PiBleHBlY3RlZDsKLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDMpOwotICBleHBlY3RlZC5wdXNoX2JhY2soMSk7Ci0gIGV4cGVjdGVkLnB1c2hfYmFjaygyKTsKLSAgRVhQRUNUX1RIQVQoYWN0dWFsLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7Ci0KLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDQpOwotICBFWFBFQ1RfVEhBVChhY3R1YWwsIE5vdChFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOwotfQotCi0vLyBUZXN0cyBmb3IgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpCi0KLVRFU1QoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheVRlc3QsIFN1Y2NlZWRzV2hlbkV4cGVjdGVkKSB7Ci0gIGNvbnN0IGludCBhW10gPSB7MCwgMSwgMiwgMywgNH07Ci0gIHN0ZDo6dmVjdG9yPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotICBkbyB7Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICBFWFBFQ1RfVFJVRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7Ci0gIH0gd2hpbGUgKHN0ZDo6bmV4dF9wZXJtdXRhdGlvbihzLmJlZ2luKCksIHMuZW5kKCkpKTsKLX0KLQotVEVTVChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5VGVzdCwgVmVjdG9yQm9vbCkgewotICBjb25zdCBib29sIGFbXSA9IHswLCAxLCAwLCAxLCAxfTsKLSAgY29uc3QgYm9vbCBiW10gPSB7MSwgMCwgMSwgMSwgMH07Ci0gIHN0ZDo6dmVjdG9yPGJvb2w+IGV4cGVjdGVkKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIHN0ZDo6dmVjdG9yPGJvb2w+IGFjdHVhbChiLCBiICsgR1RFU1RfQVJSQVlfU0laRV8oYikpOwotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICBFWFBFQ1RfVFJVRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShleHBlY3RlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOwotfQotCi1URVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBXb3Jrc0ZvclN0cmVhbWxpa2UpIHsKLSAgLy8gU3RyZWFtbGlrZSAnY29udGFpbmVyJyBwcm92aWRlcyBvbmx5IG1pbmltYWwgaXRlcmF0b3Igc3VwcG9ydC4KLSAgLy8gSXRzIGl0ZXJhdG9ycyBhcmUgdGFnZ2VkIHdpdGggaW5wdXRfaXRlcmF0b3JfdGFnLCBhbmQgaXQgaGFzIG5vCi0gIC8vIHNpemUoKSBvciBlbXB0eSgpIG1ldGhvZHMuCi0gIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OwotICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotCi0gIDo6c3RkOjp2ZWN0b3I8aW50PiBleHBlY3RlZDsKLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDEpOwotICBleHBlY3RlZC5wdXNoX2JhY2soMik7Ci0gIGV4cGVjdGVkLnB1c2hfYmFjaygzKTsKLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDQpOwotICBleHBlY3RlZC5wdXNoX2JhY2soNSk7Ci0gIEVYUEVDVF9USEFUKHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWQpKTsKLQotICBleHBlY3RlZC5wdXNoX2JhY2soNik7Ci0gIEVYUEVDVF9USEFUKHMsIE5vdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOwotfQotCi1URVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc1N0bENvbnRhaW5lcikgewotICBjb25zdCBpbnQgYWN0dWFsW10gPSB7MywgMSwgMn07Ci0KLSAgOjpzdGQ6Omxpc3Q8aW50PiBleHBlY3RlZDsKLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDEpOwotICBleHBlY3RlZC5wdXNoX2JhY2soMik7Ci0gIGV4cGVjdGVkLnB1c2hfYmFjaygzKTsKLSAgRVhQRUNUX1RIQVQoYWN0dWFsLCBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7Ci0KLSAgZXhwZWN0ZWQucHVzaF9iYWNrKDQpOwotICBFWFBFQ1RfVEhBVChhY3R1YWwsIE5vdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi1URVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc0luaXRpYWxpemVyTGlzdCkgewotICBjb25zdCBpbnQgYVs1XSA9IHsyLCAxLCA0LCA1LCAzfTsKLSAgRVhQRUNUX1RIQVQoYSwgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh7MSwgMiwgMywgNCwgNX0pKTsKLSAgRVhQRUNUX1RIQVQoYSwgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoezEsIDIsIDMsIDQsIDZ9KSkpOwotfQotCi1URVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc0luaXRpYWxpemVyTGlzdE9mQ1N0cmluZ3MpIHsKLSAgY29uc3Qgc3RyaW5nIGFbNV0gPSB7ImEiLCAiYiIsICJjIiwgImQiLCAiZSJ9OwotICBFWFBFQ1RfVEhBVChhLCBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHsiYSIsICJiIiwgImMiLCAiZCIsICJlIn0pKTsKLSAgRVhQRUNUX1RIQVQoYSwgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeyJhIiwgImIiLCAiYyIsICJkIiwgImVmIn0pKSk7Ci19Ci0KLVRFU1QoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheVRlc3QsIFRha2VzSW5pdGlhbGl6ZXJMaXN0T2ZTYW1lVHlwZWRNYXRjaGVycykgewotICBjb25zdCBpbnQgYVs1XSA9IHsyLCAxLCA0LCA1LCAzfTsKLSAgRVhQRUNUX1RIQVQoYSwgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgKLSAgICAgIHtFcSgxKSwgRXEoMiksIEVxKDMpLCBFcSg0KSwgRXEoNSl9KSk7Ci0gIEVYUEVDVF9USEFUKGEsIE5vdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KAotICAgICAge0VxKDEpLCBFcSgyKSwgRXEoMyksIEVxKDQpLCBFcSg2KX0pKSk7Ci19Ci0KLVRFU1QoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheVRlc3QsCi0gICAgIFRha2VzSW5pdGlhbGl6ZXJMaXN0T2ZEaWZmZXJlbnRUeXBlZE1hdGNoZXJzKSB7Ci0gIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OwotICAvLyBUaGUgY29tcGlsZXIgY2Fubm90IGluZmVyIHRoZSB0eXBlIG9mIHRoZSBpbml0aWFsaXplciBsaXN0IGlmIGl0cwotICAvLyBlbGVtZW50cyBoYXZlIGRpZmZlcmVudCB0eXBlcy4gIFdlIG11c3QgZXhwbGljaXRseSBzcGVjaWZ5IHRoZQotICAvLyB1bmlmaWVkIGVsZW1lbnQgdHlwZSBpbiB0aGlzIGNhc2UuCi0gIEVYUEVDVF9USEFUKGEsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXk8TWF0Y2hlcjxpbnQ+ID4oCi0gICAgICB7RXEoMSksIE5lKC0yKSwgR2UoMyksIExlKDQpLCBFcSg1KX0pKTsKLSAgRVhQRUNUX1RIQVQoYSwgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXk8TWF0Y2hlcjxpbnQ+ID4oCi0gICAgICB7RXEoMSksIE5lKC0yKSwgR2UoMyksIExlKDQpLCBFcSg2KX0pKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi1jbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD4gSW50VmVjOwotfTsKLQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoVW5jb3B5YWJsZSkgewotICBVbmNvcHlhYmxlIG9ianNbMl07Ci0gIG9ianNbMF0uc2V0X3ZhbHVlKC0zKTsKLSAgb2Jqc1sxXS5zZXRfdmFsdWUoMSk7Ci0gIEVYUEVDVF9USEFUKG9ianMsCi0gICAgICAgICAgICAgIFVub3JkZXJlZEVsZW1lbnRzQXJlKFRydWx5KFZhbHVlSXNQb3NpdGl2ZSksIFVuY29weWFibGVJcygtMykpKTsKLX0KLQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgU3VjY2VlZHNXaGVuRXhwZWN0ZWQpIHsKLSAgY29uc3QgaW50IGFbXSA9IHsxLCAyLCAzfTsKLSAgc3RkOjp2ZWN0b3I8aW50PiBzKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7Ci0gIGRvIHsKLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICAgIEVYUEVDVF9UUlVFKEV4cGxhaW5NYXRjaFJlc3VsdChVbm9yZGVyZWRFbGVtZW50c0FyZSgxLCAyLCAzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7Ci0gIH0gd2hpbGUgKHN0ZDo6bmV4dF9wZXJtdXRhdGlvbihzLmJlZ2luKCksIHMuZW5kKCkpKTsKLX0KLQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbHNXaGVuQW5FbGVtZW50TWF0Y2hlc05vTWF0Y2hlcikgewotICBjb25zdCBpbnQgYVtdID0gezEsIDIsIDN9OwotICBzdGQ6OnZlY3RvcjxpbnQ+IHMoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKLSAgc3RkOjp2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gbXY7Ci0gIG12LnB1c2hfYmFjaygxKTsKLSAgbXYucHVzaF9iYWNrKDIpOwotICBtdi5wdXNoX2JhY2soMik7Ci0gIC8vIFRoZSBlbGVtZW50IHdpdGggdmFsdWUgJzMnIG1hdGNoZXMgbm90aGluZzogZmFpbCBmYXN0LgotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkobXYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOwotfQotCi1URVNUX0YoVW5vcmRlcmVkRWxlbWVudHNBcmVUZXN0LCBXb3Jrc0ZvclN0cmVhbWxpa2UpIHsKLSAgLy8gU3RyZWFtbGlrZSAnY29udGFpbmVyJyBwcm92aWRlcyBvbmx5IG1pbmltYWwgaXRlcmF0b3Igc3VwcG9ydC4KLSAgLy8gSXRzIGl0ZXJhdG9ycyBhcmUgdGFnZ2VkIHdpdGggaW5wdXRfaXRlcmF0b3JfdGFnLCBhbmQgaXQgaGFzIG5vCi0gIC8vIHNpemUoKSBvciBlbXB0eSgpIG1ldGhvZHMuCi0gIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OwotICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOwotCi0gIEVYUEVDVF9USEFUKHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlKDEsIDIsIDMsIDQsIDUpKTsKLSAgRVhQRUNUX1RIQVQocywgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlKDIsIDIsIDMsIDQsIDUpKSk7Ci19Ci0KLS8vIE9uZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWF0Y2hlciBydW5zIGluIE8oTiEpIHRpbWUsIHdoaWNoIGlzIHRvbwotLy8gc2xvdyBmb3IgbWFueSByZWFsLXdvcmxkIGlucHV0cy4gVGhpcyB0ZXN0IHNob3dzIHRoYXQgb3VyIG1hdGNoZXIgY2FuIG1hdGNoCi0vLyAxMDAgaW5wdXRzIHZlcnkgcXVpY2tseSAoYSBmZXcgbWlsbGlzZWNvbmRzKS4gIEFuIE8oMTAwISkgaXMgMTBeMTU4Ci0vLyBpdGVyYXRpb25zIGFuZCBvYnZpb3VzbHkgZWZmZWN0aXZlbHkgaW5jb21wdXRhYmxlLgotLy8gWyBSVU4gICAgICBdIFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdC5QZXJmb3JtYW5jZQotLy8gWyAgICAgICBPSyBdIFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdC5QZXJmb3JtYW5jZSAoNCBtcykKLVRFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIFBlcmZvcm1hbmNlKSB7Ci0gIHN0ZDo6dmVjdG9yPGludD4gczsKLSAgc3RkOjp2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gbXY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBzLnB1c2hfYmFjayhpKTsKLSAgICBtdi5wdXNoX2JhY2soXyk7Ci0gIH0KLSAgbXZbNTBdID0gRXEoMCk7Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gIEVYUEVDVF9UUlVFKEV4cGxhaW5NYXRjaFJlc3VsdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KG12KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOwotfQotCi0vLyBBbm90aGVyIHZhcmlhbnQgb2YgJ1BlcmZvcm1hbmNlJyB3aXRoIHNpbWlsYXIgZXhwZWN0YXRpb25zLgotLy8gWyBSVU4gICAgICBdIFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdC5QZXJmb3JtYW5jZUhhbGZTdHJpY3QKLS8vIFsgICAgICAgT0sgXSBVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QuUGVyZm9ybWFuY2VIYWxmU3RyaWN0ICg0IG1zKQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgUGVyZm9ybWFuY2VIYWxmU3RyaWN0KSB7Ci0gIHN0ZDo6dmVjdG9yPGludD4gczsKLSAgc3RkOjp2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gbXY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBzLnB1c2hfYmFjayhpKTsKLSAgICBpZiAoaSAmIDEpIHsKLSAgICAgIG12LnB1c2hfYmFjayhfKTsKLSAgICB9IGVsc2UgewotICAgICAgbXYucHVzaF9iYWNrKGkpOwotICAgIH0KLSAgfQotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICBFWFBFQ1RfVFJVRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShtdiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCAmbGlzdGVuZXIpKSA8PCBsaXN0ZW5lci5zdHIoKTsKLX0KLQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbE1lc3NhZ2VDb3VudFdyb25nKSB7Ci0gIHN0ZDo6dmVjdG9yPGludD4gdjsKLSAgdi5wdXNoX2JhY2soNCk7Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gIEVYUEVDVF9GQUxTRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMiwgMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7Ci0gIEVYUEVDVF9USEFUKGxpc3RlbmVyLnN0cigpLCBFcSgid2hpY2ggaGFzIDEgZWxlbWVudCIpKTsKLX0KLQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbE1lc3NhZ2VDb3VudFdyb25nWmVybykgewotICBzdGQ6OnZlY3RvcjxpbnQ+IHY7Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gIEVYUEVDVF9GQUxTRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMiwgMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7Ci0gIEVYUEVDVF9USEFUKGxpc3RlbmVyLnN0cigpLCBFcSgiIikpOwotfQotCi1URVNUX0YoVW5vcmRlcmVkRWxlbWVudHNBcmVUZXN0LCBGYWlsTWVzc2FnZVVubWF0Y2hlZE1hdGNoZXJzKSB7Ci0gIHN0ZDo6dmVjdG9yPGludD4gdjsKLSAgdi5wdXNoX2JhY2soMSk7Ci0gIHYucHVzaF9iYWNrKDEpOwotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KFVub3JkZXJlZEVsZW1lbnRzQXJlKDEsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOwotICBFWFBFQ1RfVEhBVCgKLSAgICAgIGxpc3RlbmVyLnN0cigpLAotICAgICAgRXEoIndoZXJlIHRoZSBmb2xsb3dpbmcgbWF0Y2hlcnMgZG9uJ3QgbWF0Y2ggYW55IGVsZW1lbnRzOlxuIgotICAgICAgICAgIm1hdGNoZXIgIzE6IGlzIGVxdWFsIHRvIDIiKSk7Ci19Ci0KLVRFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIEZhaWxNZXNzYWdlVW5tYXRjaGVkRWxlbWVudHMpIHsKLSAgc3RkOjp2ZWN0b3I8aW50PiB2OwotICB2LnB1c2hfYmFjaygxKTsKLSAgdi5wdXNoX2JhY2soMik7Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gIEVYUEVDVF9GQUxTRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7Ci0gIEVYUEVDVF9USEFUKAotICAgICAgbGlzdGVuZXIuc3RyKCksCi0gICAgICBFcSgid2hlcmUgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBkb24ndCBtYXRjaCBhbnkgbWF0Y2hlcnM6XG4iCi0gICAgICAgICAiZWxlbWVudCAjMTogMiIpKTsKLX0KLQotVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbE1lc3NhZ2VVbm1hdGNoZWRNYXRjaGVyQW5kRWxlbWVudCkgewotICBzdGQ6OnZlY3RvcjxpbnQ+IHY7Ci0gIHYucHVzaF9iYWNrKDIpOwotICB2LnB1c2hfYmFjaygzKTsKLSAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgRVhQRUNUX0ZBTFNFKEV4cGxhaW5NYXRjaFJlc3VsdChVbm9yZGVyZWRFbGVtZW50c0FyZSgxLCAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCAmbGlzdGVuZXIpKSA8PCBsaXN0ZW5lci5zdHIoKTsKLSAgRVhQRUNUX1RIQVQoCi0gICAgICBsaXN0ZW5lci5zdHIoKSwKLSAgICAgIEVxKCJ3aGVyZSIKLSAgICAgICAgICIgdGhlIGZvbGxvd2luZyBtYXRjaGVycyBkb24ndCBtYXRjaCBhbnkgZWxlbWVudHM6XG4iCi0gICAgICAgICAibWF0Y2hlciAjMDogaXMgZXF1YWwgdG8gMVxuIgotICAgICAgICAgImFuZCIKLSAgICAgICAgICIgd2hlcmUiCi0gICAgICAgICAiIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgZG9uJ3QgbWF0Y2ggYW55IG1hdGNoZXJzOlxuIgotICAgICAgICAgImVsZW1lbnQgIzE6IDMiKSk7Ci19Ci0KLS8vIFRlc3QgaGVscGVyIGZvciBmb3JtYXR0aW5nIGVsZW1lbnQsIG1hdGNoZXIgaW5kZXggcGFpcnMgaW4gZXhwZWN0YXRpb25zLgotc3RhdGljIHN0cmluZyBFTVN0cmluZyhpbnQgZWxlbWVudCwgaW50IG1hdGNoZXIpIHsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiKGVsZW1lbnQgIyIgPDwgZWxlbWVudCA8PCAiLCBtYXRjaGVyICMiIDw8IG1hdGNoZXIgPDwgIikiOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLVRFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIEZhaWxNZXNzYWdlSW1wZXJmZWN0TWF0Y2hPbmx5KSB7Ci0gIC8vIEEgc2l0dWF0aW9uIHdoZXJlIGFsbCBlbGVtZW50cyBhbmQgbWF0Y2hlcnMgaGF2ZSBhIG1hdGNoCi0gIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBidXQgdGhlIG1heCBtYXRjaGluZyBpcyBub3QgcGVyZmVjdC4KLSAgc3RkOjp2ZWN0b3I8c3RyaW5nPiB2OwotICB2LnB1c2hfYmFjaygiYSIpOwotICB2LnB1c2hfYmFjaygiYiIpOwotICB2LnB1c2hfYmFjaygiYyIpOwotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KAotICAgICAgVW5vcmRlcmVkRWxlbWVudHNBcmUoImEiLCAiYSIsIEFueU9mKCJiIiwgImMiKSksIHYsICZsaXN0ZW5lcikpCi0gICAgICA8PCBsaXN0ZW5lci5zdHIoKTsKLQotICBzdHJpbmcgcHJlZml4ID0KLSAgICAgICJ3aGVyZSBubyBwZXJtdXRhdGlvbiBvZiB0aGUgZWxlbWVudHMgY2FuIHNhdGlzZnkgYWxsIG1hdGNoZXJzLCAiCi0gICAgICAiYW5kIHRoZSBjbG9zZXN0IG1hdGNoIGlzIDIgb2YgMyBtYXRjaGVycyB3aXRoIHRoZSAiCi0gICAgICAicGFpcmluZ3M6XG4iOwotCi0gIC8vIFdlIGhhdmUgdG8gYmUgYSBiaXQgbG9vc2UgaGVyZSwgYmVjYXVzZSB0aGVyZSBhcmUgNCB2YWxpZCBtYXggbWF0Y2hlcy4KLSAgRVhQRUNUX1RIQVQoCi0gICAgICBsaXN0ZW5lci5zdHIoKSwKLSAgICAgIEFueU9mKHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAwKSArCi0gICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMSwgMikgKyAiXG59IiwKLSAgICAgICAgICAgIHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMSwgMikgKyAiXG59IiwKLSAgICAgICAgICAgIHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAwKSArCi0gICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMiwgMikgKyAiXG59IiwKLSAgICAgICAgICAgIHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMiwgMikgKyAiXG59IikpOwotfQotCi1URVNUX0YoVW5vcmRlcmVkRWxlbWVudHNBcmVUZXN0LCBEZXNjcmliZSkgewotICBFWFBFQ1RfVEhBVChEZXNjcmliZTxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKCkpLAotICAgICAgICAgICAgICBFcSgiaXMgZW1wdHkiKSk7Ci0gIEVYUEVDVF9USEFUKAotICAgICAgRGVzY3JpYmU8SW50VmVjPihVbm9yZGVyZWRFbGVtZW50c0FyZSgzNDUpKSwKLSAgICAgIEVxKCJoYXMgMSBlbGVtZW50IGFuZCB0aGF0IGVsZW1lbnQgaXMgZXF1YWwgdG8gMzQ1IikpOwotICBFWFBFQ1RfVEhBVCgKLSAgICAgIERlc2NyaWJlPEludFZlYz4oVW5vcmRlcmVkRWxlbWVudHNBcmUoMTExLCAyMjIsIDMzMykpLAotICAgICAgRXEoImhhcyAzIGVsZW1lbnRzIGFuZCB0aGVyZSBleGlzdHMgc29tZSBwZXJtdXRhdGlvbiAiCi0gICAgICAgICAib2YgZWxlbWVudHMgc3VjaCB0aGF0OlxuIgotICAgICAgICAgIiAtIGVsZW1lbnQgIzAgaXMgZXF1YWwgdG8gMTExLCBhbmRcbiIKLSAgICAgICAgICIgLSBlbGVtZW50ICMxIGlzIGVxdWFsIHRvIDIyMiwgYW5kXG4iCi0gICAgICAgICAiIC0gZWxlbWVudCAjMiBpcyBlcXVhbCB0byAzMzMiKSk7Ci19Ci0KLVRFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIERlc2NyaWJlTmVnYXRpb24pIHsKLSAgRVhQRUNUX1RIQVQoRGVzY3JpYmVOZWdhdGlvbjxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKCkpLAotICAgICAgICAgICAgICBFcSgiaXNuJ3QgZW1wdHkiKSk7Ci0gIEVYUEVDVF9USEFUKAotICAgICAgRGVzY3JpYmVOZWdhdGlvbjxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKDM0NSkpLAotICAgICAgRXEoImRvZXNuJ3QgaGF2ZSAxIGVsZW1lbnQsIG9yIGhhcyAxIGVsZW1lbnQgdGhhdCBpc24ndCBlcXVhbCB0byAzNDUiKSk7Ci0gIEVYUEVDVF9USEFUKAotICAgICAgRGVzY3JpYmVOZWdhdGlvbjxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKDEyMywgMjM0LCAzNDUpKSwKLSAgICAgIEVxKCJkb2Vzbid0IGhhdmUgMyBlbGVtZW50cywgb3IgdGhlcmUgZXhpc3RzIG5vIHBlcm11dGF0aW9uICIKLSAgICAgICAgICJvZiBlbGVtZW50cyBzdWNoIHRoYXQ6XG4iCi0gICAgICAgICAiIC0gZWxlbWVudCAjMCBpcyBlcXVhbCB0byAxMjMsIGFuZFxuIgotICAgICAgICAgIiAtIGVsZW1lbnQgIzEgaXMgZXF1YWwgdG8gMjM0LCBhbmRcbiIKLSAgICAgICAgICIgLSBlbGVtZW50ICMyIGlzIGVxdWFsIHRvIDM0NSIpKTsKLX0KLQotbmFtZXNwYWNlIHsKLQotLy8gVXNlZCBhcyBhIGNoZWNrIG9uIHRoZSBtb3JlIGNvbXBsZXggbWF4IGZsb3cgbWV0aG9kIHVzZWQgaW4gdGhlCi0vLyByZWFsIHRlc3Rpbmc6OmludGVybmFsOjpGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcuIFRoaXMgbWV0aG9kIGlzCi0vLyBjb21wYXRpYmxlIGJ1dCBydW5zIGluIHdvcnN0LWNhc2UgZmFjdG9yaWFsIHRpbWUsIHNvIHdlIG9ubHkKLS8vIHVzZSBpdCBpbiB0ZXN0aW5nIGZvciBzbWFsbCBwcm9ibGVtIHNpemVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoPgotY2xhc3MgQmFja3RyYWNraW5nTWF4QlBNU3RhdGUgewotIHB1YmxpYzoKLSAgLy8gRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgJ2cnLgotICBleHBsaWNpdCBCYWNrdHJhY2tpbmdNYXhCUE1TdGF0ZShjb25zdCBHcmFwaCogZykgOiBncmFwaF8oZykgeyB9Ci0KLSAgRWxlbWVudE1hdGNoZXJQYWlycyBDb21wdXRlKCkgewotICAgIGlmIChncmFwaF8tPkxoc1NpemUoKSA9PSAwIHx8IGdyYXBoXy0+UmhzU2l6ZSgpID09IDApIHsKLSAgICAgIHJldHVybiBiZXN0X3NvX2Zhcl87Ci0gICAgfQotICAgIGxoc191c2VkXy5hc3NpZ24oZ3JhcGhfLT5MaHNTaXplKCksIGtVbnVzZWQpOwotICAgIHJoc191c2VkXy5hc3NpZ24oZ3JhcGhfLT5SaHNTaXplKCksIGtVbnVzZWQpOwotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgZ3JhcGhfLT5SaHNTaXplKCk7ICsraXJocykgewotICAgICAgbWF0Y2hlc18uY2xlYXIoKTsKLSAgICAgIFJlY3Vyc2VJbnRvKGlyaHMpOwotICAgICAgaWYgKGJlc3Rfc29fZmFyXy5zaXplKCkgPT0gZ3JhcGhfLT5SaHNTaXplKCkpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gYmVzdF9zb19mYXJfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtVbnVzZWQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKTsKLQotICB2b2lkIFB1c2hNYXRjaChzaXplX3QgbGhzLCBzaXplX3QgcmhzKSB7Ci0gICAgbWF0Y2hlc18ucHVzaF9iYWNrKEVsZW1lbnRNYXRjaGVyUGFpcihsaHMsIHJocykpOwotICAgIGxoc191c2VkX1tsaHNdID0gcmhzOwotICAgIHJoc191c2VkX1tyaHNdID0gbGhzOwotICAgIGlmIChtYXRjaGVzXy5zaXplKCkgPiBiZXN0X3NvX2Zhcl8uc2l6ZSgpKSB7Ci0gICAgICBiZXN0X3NvX2Zhcl8gPSBtYXRjaGVzXzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFBvcE1hdGNoKCkgewotICAgIGNvbnN0IEVsZW1lbnRNYXRjaGVyUGFpciYgYmFjayA9IG1hdGNoZXNfLmJhY2soKTsKLSAgICBsaHNfdXNlZF9bYmFjay5maXJzdF0gPSBrVW51c2VkOwotICAgIHJoc191c2VkX1tiYWNrLnNlY29uZF0gPSBrVW51c2VkOwotICAgIG1hdGNoZXNfLnBvcF9iYWNrKCk7Ci0gIH0KLQotICBib29sIFJlY3Vyc2VJbnRvKHNpemVfdCBpcmhzKSB7Ci0gICAgaWYgKHJoc191c2VkX1tpcmhzXSAhPSBrVW51c2VkKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBncmFwaF8tPkxoc1NpemUoKTsgKytpbGhzKSB7Ci0gICAgICBpZiAobGhzX3VzZWRfW2lsaHNdICE9IGtVbnVzZWQpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIWdyYXBoXy0+SGFzRWRnZShpbGhzLCBpcmhzKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFB1c2hNYXRjaChpbGhzLCBpcmhzKTsKLSAgICAgIGlmIChiZXN0X3NvX2Zhcl8uc2l6ZSgpID09IGdyYXBoXy0+UmhzU2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZvciAoc2l6ZV90IG1pID0gaXJocyArIDE7IG1pIDwgZ3JhcGhfLT5SaHNTaXplKCk7ICsrbWkpIHsKLSAgICAgICAgaWYgKCFSZWN1cnNlSW50byhtaSkpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFBvcE1hdGNoKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3QgR3JhcGgqIGdyYXBoXzsgIC8vIG5vdCBvd25lZAotICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGxoc191c2VkXzsKLSAgc3RkOjp2ZWN0b3I8c2l6ZV90PiByaHNfdXNlZF87Ci0gIEVsZW1lbnRNYXRjaGVyUGFpcnMgbWF0Y2hlc187Ci0gIEVsZW1lbnRNYXRjaGVyUGFpcnMgYmVzdF9zb19mYXJfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoPgotY29uc3Qgc2l6ZV90IEJhY2t0cmFja2luZ01heEJQTVN0YXRlPEdyYXBoPjo6a1VudXNlZDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIEltcGxlbWVudCBhIHNpbXBsZSBiYWNrdHJhY2tpbmcgYWxnb3JpdGhtIHRvIGRldGVybWluZSBpZiBpdCBpcyBwb3NzaWJsZQotLy8gdG8gZmluZCBvbmUgZWxlbWVudCBwZXIgbWF0Y2hlciwgd2l0aG91dCByZXVzaW5nIGVsZW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoPgotRWxlbWVudE1hdGNoZXJQYWlycwotRmluZEJhY2t0cmFja2luZ01heEJQTShjb25zdCBHcmFwaCYgZykgewotICByZXR1cm4gQmFja3RyYWNraW5nTWF4QlBNU3RhdGU8R3JhcGg+KCZnKS5Db21wdXRlKCk7Ci19Ci0KLWNsYXNzIEJhY2t0cmFja2luZ0JQTVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsgfTsKLQotLy8gVGVzdHMgdGhlIE1heEJpcGFydGl0ZU1hdGNoaW5nIGFsZ29yaXRobSB3aXRoIHNxdWFyZSBtYXRyaWNlcy4KLS8vIFRoZSBzaW5nbGUgaW50IHBhcmFtIGlzIHRoZSAjIG9mIG5vZGVzIG9uIGVhY2ggb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzLgotY2xhc3MgQmlwYXJ0aXRlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7IH07Ci0KLS8vIFZlcmlmeSBhbGwgbWF0Y2ggZ3JhcGhzIHVwIHRvIHNvbWUgbW9kZXJhdGUgbnVtYmVyIG9mIGVkZ2VzLgotVEVTVF9QKEJpcGFydGl0ZVRlc3QsIEV4aGF1c3RpdmUpIHsKLSAgaW50IG5vZGVzID0gR2V0UGFyYW0oKTsKLSAgTWF0Y2hNYXRyaXggZ3JhcGgobm9kZXMsIG5vZGVzKTsKLSAgZG8gewotICAgIEVsZW1lbnRNYXRjaGVyUGFpcnMgbWF0Y2hlcyA9Ci0gICAgICAgIGludGVybmFsOjpGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcoZ3JhcGgpOwotICAgIEVYUEVDVF9FUShGaW5kQmFja3RyYWNraW5nTWF4QlBNKGdyYXBoKS5zaXplKCksIG1hdGNoZXMuc2l6ZSgpKQotICAgICAgICA8PCAiZ3JhcGg6ICIgPDwgZ3JhcGguRGVidWdTdHJpbmcoKTsKLSAgICAvLyBDaGVjayB0aGF0IGFsbCBlbGVtZW50cyBvZiBtYXRjaGVzIGFyZSBpbiB0aGUgZ3JhcGguCi0gICAgLy8gQ2hlY2sgdGhhdCBlbGVtZW50cyBvZiBmaXJzdCBhbmQgc2Vjb25kIGFyZSB1bmlxdWUuCi0gICAgc3RkOjp2ZWN0b3I8Ym9vbD4gc2Vlbl9lbGVtZW50KGdyYXBoLkxoc1NpemUoKSk7Ci0gICAgc3RkOjp2ZWN0b3I8Ym9vbD4gc2Vlbl9tYXRjaGVyKGdyYXBoLlJoc1NpemUoKSk7Ci0gICAgU0NPUEVEX1RSQUNFKFByaW50VG9TdHJpbmcobWF0Y2hlcykpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hlcy5zaXplKCk7ICsraSkgewotICAgICAgc2l6ZV90IGlsaHMgPSBtYXRjaGVzW2ldLmZpcnN0OwotICAgICAgc2l6ZV90IGlyaHMgPSBtYXRjaGVzW2ldLnNlY29uZDsKLSAgICAgIEVYUEVDVF9UUlVFKGdyYXBoLkhhc0VkZ2UoaWxocywgaXJocykpOwotICAgICAgRVhQRUNUX0ZBTFNFKHNlZW5fZWxlbWVudFtpbGhzXSk7Ci0gICAgICBFWFBFQ1RfRkFMU0Uoc2Vlbl9tYXRjaGVyW2lyaHNdKTsKLSAgICAgIHNlZW5fZWxlbWVudFtpbGhzXSA9IHRydWU7Ci0gICAgICBzZWVuX21hdGNoZXJbaXJoc10gPSB0cnVlOwotICAgIH0KLSAgfSB3aGlsZSAoZ3JhcGguTmV4dEdyYXBoKCkpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChBbGxHcmFwaHMsIEJpcGFydGl0ZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIDUpKTsKLQotLy8gUGFyYW1ldGVyaXplZCBieSBhIHBhaXIgaW50ZXJwcmV0ZWQgYXMgKExoc1NpemUsIFJoc1NpemUpLgotY2xhc3MgQmlwYXJ0aXRlTm9uU3F1YXJlVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+ID4gewotfTsKLQotVEVTVF9GKEJpcGFydGl0ZU5vblNxdWFyZVRlc3QsIFNpbXBsZUJhY2t0cmFja2luZykgewotICAvLyAgIC4uLi4uLi4KLSAgLy8gMDotLS0tLVwgOgotICAvLyAxOi0tLVwgfCA6Ci0gIC8vIDI6LS0tXCB8IDoKLSAgLy8gMzotXCB8IHwgOgotICAvLyAgOi4uLi4uLi46Ci0gIC8vICAgIDAgMSAyCi0gIE1hdGNoTWF0cml4IGcoNCwgMyk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0VkZ2VzW11bMl0gPSB7ezAsIDJ9LCB7MSwgMX0sIHsyLCAxfSwgezMsIDB9fTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHVEVTVF9BUlJBWV9TSVpFXyhrRWRnZXMpOyArK2kpIHsKLSAgICBnLlNldEVkZ2Uoa0VkZ2VzW2ldWzBdLCBrRWRnZXNbaV1bMV0sIHRydWUpOwotICB9Ci0gIEVYUEVDVF9USEFUKEZpbmRCYWNrdHJhY2tpbmdNYXhCUE0oZyksCi0gICAgICAgICAgICAgIEVsZW1lbnRzQXJlKFBhaXIoMywgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoQW55T2YoMSwgMiksIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDAsIDIpKSkgPDwgZy5EZWJ1Z1N0cmluZygpOwotfQotCi0vLyBWZXJpZnkgYSBmZXcgbm9uc3F1YXJlIG1hdHJpY2VzLgotVEVTVF9QKEJpcGFydGl0ZU5vblNxdWFyZVRlc3QsIEV4aGF1c3RpdmUpIHsKLSAgc2l6ZV90IG5saHMgPSBHZXRQYXJhbSgpLmZpcnN0OwotICBzaXplX3QgbnJocyA9IEdldFBhcmFtKCkuc2Vjb25kOwotICBNYXRjaE1hdHJpeCBncmFwaChubGhzLCBucmhzKTsKLSAgZG8gewotICAgIEVYUEVDVF9FUShGaW5kQmFja3RyYWNraW5nTWF4QlBNKGdyYXBoKS5zaXplKCksCi0gICAgICAgICAgICAgIGludGVybmFsOjpGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcoZ3JhcGgpLnNpemUoKSkKLSAgICAgICAgPDwgImdyYXBoOiAiIDw8IGdyYXBoLkRlYnVnU3RyaW5nKCkKLSAgICAgICAgPDwgIlxuYmFja3RyYWNraW5nOiAiCi0gICAgICAgIDw8IFByaW50VG9TdHJpbmcoRmluZEJhY2t0cmFja2luZ01heEJQTShncmFwaCkpCi0gICAgICAgIDw8ICJcbm1heCBmbG93OiAiCi0gICAgICAgIDw8IFByaW50VG9TdHJpbmcoaW50ZXJuYWw6OkZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhncmFwaCkpOwotICB9IHdoaWxlIChncmFwaC5OZXh0R3JhcGgoKSk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFsbEdyYXBocywgQmlwYXJ0aXRlTm9uU3F1YXJlVGVzdCwKLSAgICB0ZXN0aW5nOjpWYWx1ZXMoCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIDIpLAotICAgICAgICBzdGQ6Om1ha2VfcGFpcigyLCAxKSwKLSAgICAgICAgc3RkOjptYWtlX3BhaXIoMywgMiksCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKDIsIDMpLAotICAgICAgICBzdGQ6Om1ha2VfcGFpcig0LCAxKSwKLSAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgNCksCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKDQsIDMpLAotICAgICAgICBzdGQ6Om1ha2VfcGFpcigzLCA0KSkpOwotCi1jbGFzcyBCaXBhcnRpdGVSYW5kb21UZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjxpbnQsIGludD4gPiB7Ci19OwotCi0vLyBWZXJpZmllcyBhIGxhcmdlIHNhbXBsZSBvZiBsYXJnZXIgZ3JhcGhzLgotVEVTVF9QKEJpcGFydGl0ZVJhbmRvbVRlc3QsIExhcmdlck5ldHMpIHsKLSAgaW50IG5vZGVzID0gR2V0UGFyYW0oKS5maXJzdDsKLSAgaW50IGl0ZXJzID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gIE1hdGNoTWF0cml4IGdyYXBoKG5vZGVzLCBub2Rlcyk7Ci0KLSAgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyIHNlZWQgPSBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKLSAgaWYgKHNlZWQgPT0gMCkgewotICAgIHNlZWQgPSBzdGF0aWNfY2FzdDx0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzI+KHRpbWUoTlVMTCkpOwotICB9Ci0KLSAgZm9yICg7IGl0ZXJzID4gMDsgLS1pdGVycywgKytzZWVkKSB7Ci0gICAgc3JhbmQoc3RhdGljX2Nhc3Q8aW50PihzZWVkKSk7Ci0gICAgZ3JhcGguUmFuZG9taXplKCk7Ci0gICAgRVhQRUNUX0VRKEZpbmRCYWNrdHJhY2tpbmdNYXhCUE0oZ3JhcGgpLnNpemUoKSwKLSAgICAgICAgICAgICAgaW50ZXJuYWw6OkZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhncmFwaCkuc2l6ZSgpKQotICAgICAgICA8PCAiIGdyYXBoOiAiIDw8IGdyYXBoLkRlYnVnU3RyaW5nKCkKLSAgICAgICAgPDwgIlxuVG8gcmVwcm9kdWNlIHRoZSBmYWlsdXJlLCByZXJ1biB0aGUgdGVzdCB3aXRoIHRoZSBmbGFnIgotICAgICAgICAgICAiIC0tIiA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgInJhbmRvbV9zZWVkPSIgPDwgc2VlZDsKLSAgfQotfQotCi0vLyBUZXN0IGFyZ3VtZW50IGlzIGEgc3RkOjpwYWlyPGludCwgaW50PiByZXByZXNlbnRpbmcgKG5vZGVzLCBpdGVycykuCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTYW1wbGVzLCBCaXBhcnRpdGVSYW5kb21UZXN0LAotICAgIHRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgc3RkOjptYWtlX3BhaXIoNSwgMTAwMDApLAotICAgICAgICBzdGQ6Om1ha2VfcGFpcig2LCA1MDAwKSwKLSAgICAgICAgc3RkOjptYWtlX3BhaXIoNywgMjAwMCksCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKDgsIDUwMCksCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKDksIDEwMCkpKTsKLQotLy8gVGVzdHMgSXNSZWFkYWJsZVR5cGVOYW1lKCkuCi0KLVRFU1QoSXNSZWFkYWJsZVR5cGVOYW1lVGVzdCwgUmV0dXJuc1RydWVGb3JTaG9ydE5hbWVzKSB7Ci0gIEVYUEVDVF9UUlVFKElzUmVhZGFibGVUeXBlTmFtZSgiaW50IikpOwotICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoImNvbnN0IHVuc2lnbmVkIGNoYXIqIikpOwotICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoIk15TWFwPGludCwgdm9pZCo+IikpOwotICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoInZvaWQgKCopKGludCwgYm9vbCkiKSk7Ci19Ci0KLVRFU1QoSXNSZWFkYWJsZVR5cGVOYW1lVGVzdCwgUmV0dXJuc1RydWVGb3JMb25nTm9uVGVtcGxhdGVOb25GdW5jdGlvbk5hbWVzKSB7Ci0gIEVYUEVDVF9UUlVFKElzUmVhZGFibGVUeXBlTmFtZSgibXlfbG9uZ19uYW1lc3BhY2U6Ok15Q2xhc3NOYW1lIikpOwotICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoImludCBbNV1bNl1bN11bOF1bOV1bMTBdWzExXSIpKTsKLSAgRVhQRUNUX1RSVUUoSXNSZWFkYWJsZVR5cGVOYW1lKCJteV9uYW1lc3BhY2U6Ok15T3V0ZXJDbGFzczo6TXlJbm5lckNsYXNzIikpOwotfQotCi1URVNUKElzUmVhZGFibGVUeXBlTmFtZVRlc3QsIFJldHVybnNGYWxzZUZvckxvbmdUZW1wbGF0ZU5hbWVzKSB7Ci0gIEVYUEVDVF9GQUxTRSgKLSAgICAgIElzUmVhZGFibGVUeXBlTmFtZSgiYmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4gPiIpKTsKLSAgRVhQRUNUX0ZBTFNFKElzUmVhZGFibGVUeXBlTmFtZSgic3RkOjp2ZWN0b3I8aW50LCBzdGQ6OmFsbG9jX3RyYWl0czxpbnQ+ID4iKSk7Ci19Ci0KLVRFU1QoSXNSZWFkYWJsZVR5cGVOYW1lVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTG9uZ0Z1bmN0aW9uVHlwZU5hbWVzKSB7Ci0gIEVYUEVDVF9GQUxTRShJc1JlYWRhYmxlVHlwZU5hbWUoInZvaWQgKCYpKGludCwgYm9vbCwgY2hhciwgZmxvYXQpIikpOwotfQotCi0vLyBUZXN0cyBKb2luQXNUdXBsZSgpLgotCi1URVNUKEpvaW5Bc1R1cGxlVGVzdCwgSm9pbnNFbXB0eVR1cGxlKSB7Ci0gIEVYUEVDVF9FUSgiIiwgSm9pbkFzVHVwbGUoU3RyaW5ncygpKSk7Ci19Ci0KLVRFU1QoSm9pbkFzVHVwbGVUZXN0LCBKb2luc09uZVR1cGxlKSB7Ci0gIGNvbnN0IGNoYXIqIGZpZWxkc1tdID0geyIxIn07Ci0gIEVYUEVDVF9FUSgiMSIsIEpvaW5Bc1R1cGxlKFN0cmluZ3MoZmllbGRzLCBmaWVsZHMgKyAxKSkpOwotfQotCi1URVNUKEpvaW5Bc1R1cGxlVGVzdCwgSm9pbnNUd29UdXBsZSkgewotICBjb25zdCBjaGFyKiBmaWVsZHNbXSA9IHsiMSIsICJhIn07Ci0gIEVYUEVDVF9FUSgiKDEsIGEpIiwgSm9pbkFzVHVwbGUoU3RyaW5ncyhmaWVsZHMsIGZpZWxkcyArIDIpKSk7Ci19Ci0KLVRFU1QoSm9pbkFzVHVwbGVUZXN0LCBKb2luc1RlblR1cGxlKSB7Ci0gIGNvbnN0IGNoYXIqIGZpZWxkc1tdID0geyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCJ9OwotICBFWFBFQ1RfRVEoIigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkiLAotICAgICAgICAgICAgSm9pbkFzVHVwbGUoU3RyaW5ncyhmaWVsZHMsIGZpZWxkcyArIDEwKSkpOwotfQotCi0vLyBUZXN0cyBGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oKS4KLQotVEVTVChGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb25UZXN0LCBXb3Jrc0ZvckVtcHR5RGVzY3JpcHRpb24pIHsKLSAgRVhQRUNUX0VRKCJpcyBldmVuIiwKLSAgICAgICAgICAgIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihmYWxzZSwgIklzRXZlbiIsIFN0cmluZ3MoKSkpOwotICBFWFBFQ1RfRVEoIm5vdCAoaXMgZXZlbikiLAotICAgICAgICAgICAgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKHRydWUsICJJc0V2ZW4iLCBTdHJpbmdzKCkpKTsKLQotICBjb25zdCBjaGFyKiBwYXJhbXNbXSA9IHsiNSJ9OwotICBFWFBFQ1RfRVEoImVxdWFscyA1IiwKLSAgICAgICAgICAgIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihmYWxzZSwgIkVxdWFscyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5ncyhwYXJhbXMsIHBhcmFtcyArIDEpKSk7Ci0KLSAgY29uc3QgY2hhciogcGFyYW1zMltdID0geyI1IiwgIjgifTsKLSAgRVhQRUNUX0VRKCJpcyBpbiByYW5nZSAoNSwgOCkiLAotICAgICAgICAgICAgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGZhbHNlLCAiSXNJblJhbmdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdzKHBhcmFtczIsIHBhcmFtczIgKyAyKSkpOwotfQotCi0vLyBUZXN0cyBQb2x5bW9ycGhpY01hdGNoZXI6Om11dGFibGVfaW1wbCgpLgotVEVTVChQb2x5bW9ycGhpY01hdGNoZXJUZXN0LCBDYW5BY2Nlc3NNdXRhYmxlSW1wbCkgewotICBQb2x5bW9ycGhpY01hdGNoZXI8RGl2aXNpYmxlQnlJbXBsPiBtKERpdmlzaWJsZUJ5SW1wbCg0MikpOwotICBEaXZpc2libGVCeUltcGwmIGltcGwgPSBtLm11dGFibGVfaW1wbCgpOwotICBFWFBFQ1RfRVEoNDIsIGltcGwuZGl2aWRlcigpKTsKLQotICBpbXBsLnNldF9kaXZpZGVyKDApOwotICBFWFBFQ1RfRVEoMCwgbS5tdXRhYmxlX2ltcGwoKS5kaXZpZGVyKCkpOwotfQotCi0vLyBUZXN0cyBQb2x5bW9ycGhpY01hdGNoZXI6OmltcGwoKS4KLVRFU1QoUG9seW1vcnBoaWNNYXRjaGVyVGVzdCwgQ2FuQWNjZXNzSW1wbCkgewotICBjb25zdCBQb2x5bW9ycGhpY01hdGNoZXI8RGl2aXNpYmxlQnlJbXBsPiBtKERpdmlzaWJsZUJ5SW1wbCg0MikpOwotICBjb25zdCBEaXZpc2libGVCeUltcGwmIGltcGwgPSBtLmltcGwoKTsKLSAgRVhQRUNUX0VRKDQyLCBpbXBsLmRpdmlkZXIoKSk7Ci19Ci0KLVRFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRXhwbGFpbnNNYXRjaEZhaWx1cmUpIHsKLSAgc3RyaW5nc3RyZWFtIHNzMTsKLSAgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8obWFrZV90dXBsZShNYXRjaGVyPGNoYXI+KEVxKCdhJykpLCBHcmVhdGVyVGhhbig1KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoJ2EnLCAxMCksICZzczEpOwotICBFWFBFQ1RfRVEoIiIsIHNzMS5zdHIoKSk7ICAvLyBTdWNjZXNzZnVsIG1hdGNoLgotCi0gIHN0cmluZ3N0cmVhbSBzczI7Ci0gIEV4cGxhaW5NYXRjaEZhaWx1cmVUdXBsZVRvKG1ha2VfdHVwbGUoR3JlYXRlclRoYW4oNSksIE1hdGNoZXI8Y2hhcj4oRXEoJ2EnKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsICdiJyksICZzczIpOwotICBFWFBFQ1RfRVEoIiAgRXhwZWN0ZWQgYXJnICMwOiBpcyA+IDVcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgIEFjdHVhbDogMiwgd2hpY2ggaXMgMyBsZXNzIHRoYW4gNVxuIgotICAgICAgICAgICAgIiAgRXhwZWN0ZWQgYXJnICMxOiBpcyBlcXVhbCB0byAnYScgKDk3LCAweDYxKVxuIgotICAgICAgICAgICAgIiAgICAgICAgICAgQWN0dWFsOiAnYicgKDk4LCAweDYyKVxuIiwKLSAgICAgICAgICAgIHNzMi5zdHIoKSk7ICAvLyBGYWlsZWQgbWF0Y2ggd2hlcmUgYm90aCBhcmd1bWVudHMgbmVlZCBleHBsYW5hdGlvbi4KLQotICBzdHJpbmdzdHJlYW0gc3MzOwotICBFeHBsYWluTWF0Y2hGYWlsdXJlVHVwbGVUbyhtYWtlX3R1cGxlKEdyZWF0ZXJUaGFuKDUpLCBNYXRjaGVyPGNoYXI+KEVxKCdhJykpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCAnYScpLCAmc3MzKTsKLSAgRVhQRUNUX0VRKCIgIEV4cGVjdGVkIGFyZyAjMDogaXMgPiA1XG4iCi0gICAgICAgICAgICAiICAgICAgICAgICBBY3R1YWw6IDIsIHdoaWNoIGlzIDMgbGVzcyB0aGFuIDVcbiIsCi0gICAgICAgICAgICBzczMuc3RyKCkpOyAgLy8gRmFpbGVkIG1hdGNoIHdoZXJlIG9ubHkgb25lIGFyZ3VtZW50IG5lZWRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGFuYXRpb24uCi19Ci0KLS8vIFRlc3RzIEVhY2goKS4KLQotVEVTVChFYWNoVGVzdCwgRXhwbGFpbnNNYXRjaFJlc3VsdENvcnJlY3RseSkgewotICBzZXQ8aW50PiBhOyAgLy8gZW1wdHkKLQotICBNYXRjaGVyPHNldDxpbnQ+ID4gbSA9IEVhY2goMik7Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCBhKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBpbnQoJilbMV0+IG4gPSBFYWNoKDEpOyAgLy8gTk9MSU5UCi0KLSAgY29uc3QgaW50IGJbMV0gPSB7MX07Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihuLCBiKSk7Ci0KLSAgbiA9IEVhY2goMyk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMCBkb2Vzbid0IG1hdGNoIiwgRXhwbGFpbihuLCBiKSk7Ci0KLSAgYS5pbnNlcnQoMSk7Ci0gIGEuaW5zZXJ0KDIpOwotICBhLmluc2VydCgzKTsKLSAgbSA9IEVhY2goR3JlYXRlclRoYW4oMCkpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgYSkpOwotCi0gIG0gPSBFYWNoKEdyZWF0ZXJUaGFuKDEwKSk7Ci0gIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMCBkb2Vzbid0IG1hdGNoLCB3aGljaCBpcyA5IGxlc3MgdGhhbiAxMCIsCi0gICAgICAgICAgICBFeHBsYWluKG0sIGEpKTsKLX0KLQotVEVTVChFYWNoVGVzdCwgRGVzY3JpYmVzSXRzZWxmQ29ycmVjdGx5KSB7Ci0gIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gRWFjaCgxKTsKLSAgRVhQRUNUX0VRKCJvbmx5IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgaXMgZXF1YWwgdG8gMSIsIERlc2NyaWJlKG0pKTsKLQotICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTIgPSBOb3QobSk7Ci0gIEVYUEVDVF9FUSgiY29udGFpbnMgc29tZSBlbGVtZW50IHRoYXQgaXNuJ3QgZXF1YWwgdG8gMSIsIERlc2NyaWJlKG0yKSk7Ci19Ci0KLVRFU1QoRWFjaFRlc3QsIE1hdGNoZXNWZWN0b3JXaGVuQWxsRWxlbWVudHNNYXRjaCkgewotICB2ZWN0b3I8aW50PiBzb21lX3ZlY3RvcjsKLSAgRVhQRUNUX1RIQVQoc29tZV92ZWN0b3IsIEVhY2goMSkpOwotICBzb21lX3ZlY3Rvci5wdXNoX2JhY2soMyk7Ci0gIEVYUEVDVF9USEFUKHNvbWVfdmVjdG9yLCBOb3QoRWFjaCgxKSkpOwotICBFWFBFQ1RfVEhBVChzb21lX3ZlY3RvciwgRWFjaCgzKSk7Ci0gIHNvbWVfdmVjdG9yLnB1c2hfYmFjaygxKTsKLSAgc29tZV92ZWN0b3IucHVzaF9iYWNrKDIpOwotICBFWFBFQ1RfVEhBVChzb21lX3ZlY3RvciwgTm90KEVhY2goMykpKTsKLSAgRVhQRUNUX1RIQVQoc29tZV92ZWN0b3IsIEVhY2goTHQoMy41KSkpOwotCi0gIHZlY3RvcjxzdHJpbmc+IGFub3RoZXJfdmVjdG9yOwotICBhbm90aGVyX3ZlY3Rvci5wdXNoX2JhY2soImZlZSIpOwotICBFWFBFQ1RfVEhBVChhbm90aGVyX3ZlY3RvciwgRWFjaChzdHJpbmcoImZlZSIpKSk7Ci0gIGFub3RoZXJfdmVjdG9yLnB1c2hfYmFjaygiZmllIik7Ci0gIGFub3RoZXJfdmVjdG9yLnB1c2hfYmFjaygiZm9lIik7Ci0gIGFub3RoZXJfdmVjdG9yLnB1c2hfYmFjaygiZnVtIik7Ci0gIEVYUEVDVF9USEFUKGFub3RoZXJfdmVjdG9yLCBOb3QoRWFjaChzdHJpbmcoImZlZSIpKSkpOwotfQotCi1URVNUKEVhY2hUZXN0LCBNYXRjaGVzTWFwV2hlbkFsbEVsZW1lbnRzTWF0Y2gpIHsKLSAgbWFwPGNvbnN0IGNoYXIqLCBpbnQ+IG15X21hcDsKLSAgY29uc3QgY2hhciogYmFyID0gImEgc3RyaW5nIjsKLSAgbXlfbWFwW2Jhcl0gPSAyOwotICBFWFBFQ1RfVEhBVChteV9tYXAsIEVhY2gobWFrZV9wYWlyKGJhciwgMikpKTsKLQotICBtYXA8c3RyaW5nLCBpbnQ+IGFub3RoZXJfbWFwOwotICBFWFBFQ1RfVEhBVChhbm90aGVyX21hcCwgRWFjaChtYWtlX3BhaXIoc3RyaW5nKCJmZWUiKSwgMSkpKTsKLSAgYW5vdGhlcl9tYXBbImZlZSJdID0gMTsKLSAgRVhQRUNUX1RIQVQoYW5vdGhlcl9tYXAsIEVhY2gobWFrZV9wYWlyKHN0cmluZygiZmVlIiksIDEpKSk7Ci0gIGFub3RoZXJfbWFwWyJmaWUiXSA9IDI7Ci0gIGFub3RoZXJfbWFwWyJmb2UiXSA9IDM7Ci0gIGFub3RoZXJfbWFwWyJmdW0iXSA9IDQ7Ci0gIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBOb3QoRWFjaChtYWtlX3BhaXIoc3RyaW5nKCJmZWUiKSwgMSkpKSk7Ci0gIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBOb3QoRWFjaChtYWtlX3BhaXIoc3RyaW5nKCJmdW0iKSwgMSkpKSk7Ci0gIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBFYWNoKFBhaXIoXywgR3QoMCkpKSk7Ci19Ci0KLVRFU1QoRWFjaFRlc3QsIEFjY2VwdHNNYXRjaGVyKSB7Ci0gIGNvbnN0IGludCBhW10gPSB7MSwgMiwgM307Ci0gIEVYUEVDVF9USEFUKGEsIEVhY2goR3QoMCkpKTsKLSAgRVhQRUNUX1RIQVQoYSwgTm90KEVhY2goR3QoMSkpKSk7Ci19Ci0KLVRFU1QoRWFjaFRlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXlBc1R1cGxlKSB7Ci0gIGNvbnN0IGludCBhW10gPSB7MSwgMn07Ci0gIGNvbnN0IGludCogY29uc3QgcG9pbnRlciA9IGE7Ci0gIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUocG9pbnRlciwgMiksIEVhY2goR3QoMCkpKTsKLSAgRVhQRUNUX1RIQVQobWFrZV90dXBsZShwb2ludGVyLCAyKSwgTm90KEVhY2goR3QoMSkpKSk7Ci19Ci0KLS8vIEZvciB0ZXN0aW5nIFBvaW50d2lzZSgpLgotY2xhc3MgSXNIYWxmT2ZNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IHR1cGxlPFQxLCBUMj4mIGFfcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBpZiAoZ2V0PDA+KGFfcGFpcikgPT0gZ2V0PDE+KGFfcGFpcikvMikgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgc2Vjb25kIGlzICIgPDwgZ2V0PDE+KGFfcGFpcik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgc2Vjb25kLzIgaXMgIiA8PCBnZXQ8MT4oYV9wYWlyKS8yOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kIjsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKG9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCBpc24ndCBoYWxmIG9mIHRoZSBzZWNvbmQiOwotICB9Ci19OwotCi1Qb2x5bW9ycGhpY01hdGNoZXI8SXNIYWxmT2ZNYXRjaGVyPiBJc0hhbGZPZigpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoSXNIYWxmT2ZNYXRjaGVyKCkpOwotfQotCi1URVNUKFBvaW50d2lzZVRlc3QsIERlc2NyaWJlc1NlbGYpIHsKLSAgdmVjdG9yPGludD4gcmhzOwotICByaHMucHVzaF9iYWNrKDEpOwotICByaHMucHVzaF9iYWNrKDIpOwotICByaHMucHVzaF9iYWNrKDMpOwotICBjb25zdCBNYXRjaGVyPGNvbnN0IHZlY3RvcjxpbnQ+Jj4gbSA9IFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpOwotICBFWFBFQ1RfRVEoImNvbnRhaW5zIDMgdmFsdWVzLCB3aGVyZSBlYWNoIHZhbHVlIGFuZCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSAiCi0gICAgICAgICAgICAiaW4geyAxLCAyLCAzIH0gYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kIiwKLSAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKLSAgRVhQRUNUX0VRKCJkb2Vzbid0IGNvbnRhaW4gZXhhY3RseSAzIHZhbHVlcywgb3IgY29udGFpbnMgYSB2YWx1ZSB4IGF0IHNvbWUgIgotICAgICAgICAgICAgImluZGV4IGkgd2hlcmUgeCBhbmQgdGhlIGktdGggdmFsdWUgb2YgeyAxLCAyLCAzIH0gYXJlIGEgcGFpciAiCi0gICAgICAgICAgICAid2hlcmUgdGhlIGZpcnN0IGlzbid0IGhhbGYgb2YgdGhlIHNlY29uZCIsCi0gICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKLX0KLQotVEVTVChQb2ludHdpc2VUZXN0LCBNYWtlc0NvcHlPZlJocykgewotICBsaXN0PHNpZ25lZCBjaGFyPiByaHM7Ci0gIHJocy5wdXNoX2JhY2soMik7Ci0gIHJocy5wdXNoX2JhY2soNCk7Ci0KLSAgaW50IGxoc1tdID0gezEsIDJ9OwotICBjb25zdCBNYXRjaGVyPGNvbnN0IGludCAoJilbMl0+IG0gPSBQb2ludHdpc2UoSXNIYWxmT2YoKSwgcmhzKTsKLSAgRVhQRUNUX1RIQVQobGhzLCBtKTsKLQotICAvLyBDaGFuZ2luZyByaHMgbm93IHNob3VsZG4ndCBhZmZlY3QgbSwgd2hpY2ggbWFkZSBhIGNvcHkgb2YgcmhzLgotICByaHMucHVzaF9iYWNrKDYpOwotICBFWFBFQ1RfVEhBVChsaHMsIG0pOwotfQotCi1URVNUKFBvaW50d2lzZVRlc3QsIFdvcmtzRm9yTGhzTmF0aXZlQXJyYXkpIHsKLSAgY29uc3QgaW50IGxoc1tdID0gezEsIDIsIDN9OwotICB2ZWN0b3I8aW50PiByaHM7Ci0gIHJocy5wdXNoX2JhY2soMik7Ci0gIHJocy5wdXNoX2JhY2soNCk7Ci0gIHJocy5wdXNoX2JhY2soNik7Ci0gIEVYUEVDVF9USEFUKGxocywgUG9pbnR3aXNlKEx0KCksIHJocykpOwotICBFWFBFQ1RfVEhBVChsaHMsIE5vdChQb2ludHdpc2UoR3QoKSwgcmhzKSkpOwotfQotCi1URVNUKFBvaW50d2lzZVRlc3QsIFdvcmtzRm9yUmhzTmF0aXZlQXJyYXkpIHsKLSAgY29uc3QgaW50IHJoc1tdID0gezEsIDIsIDN9OwotICB2ZWN0b3I8aW50PiBsaHM7Ci0gIGxocy5wdXNoX2JhY2soMik7Ci0gIGxocy5wdXNoX2JhY2soNCk7Ci0gIGxocy5wdXNoX2JhY2soNik7Ci0gIEVYUEVDVF9USEFUKGxocywgUG9pbnR3aXNlKEd0KCksIHJocykpOwotICBFWFBFQ1RfVEhBVChsaHMsIE5vdChQb2ludHdpc2UoTHQoKSwgcmhzKSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi1URVNUKFBvaW50d2lzZVRlc3QsIFdvcmtzRm9yUmhzSW5pdGlhbGl6ZXJMaXN0KSB7Ci0gIGNvbnN0IHZlY3RvcjxpbnQ+IGxoc3syLCA0LCA2fTsKLSAgRVhQRUNUX1RIQVQobGhzLCBQb2ludHdpc2UoR3QoKSwgezEsIDIsIDN9KSk7Ci0gIEVYUEVDVF9USEFUKGxocywgTm90KFBvaW50d2lzZShMdCgpLCB7MywgMywgN30pKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi1URVNUKFBvaW50d2lzZVRlc3QsIFJlamVjdHNXcm9uZ1NpemUpIHsKLSAgY29uc3QgZG91YmxlIGxoc1syXSA9IHsxLCAyfTsKLSAgY29uc3QgaW50IHJoc1sxXSA9IHswfTsKLSAgRVhQRUNUX1RIQVQobGhzLCBOb3QoUG9pbnR3aXNlKEd0KCksIHJocykpKTsKLSAgRVhQRUNUX0VRKCJ3aGljaCBjb250YWlucyAyIHZhbHVlcyIsCi0gICAgICAgICAgICBFeHBsYWluKFBvaW50d2lzZShHdCgpLCByaHMpLCBsaHMpKTsKLQotICBjb25zdCBpbnQgcmhzMlszXSA9IHswLCAxLCAyfTsKLSAgRVhQRUNUX1RIQVQobGhzLCBOb3QoUG9pbnR3aXNlKEd0KCksIHJoczIpKSk7Ci19Ci0KLVRFU1QoUG9pbnR3aXNlVGVzdCwgUmVqZWN0c1dyb25nQ29udGVudCkgewotICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OwotICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDYsIDR9OwotICBFWFBFQ1RfVEhBVChsaHMsIE5vdChQb2ludHdpc2UoSXNIYWxmT2YoKSwgcmhzKSkpOwotICBFWFBFQ1RfRVEoIndoZXJlIHRoZSB2YWx1ZSBwYWlyICgyLCA2KSBhdCBpbmRleCAjMSBkb24ndCBtYXRjaCwgIgotICAgICAgICAgICAgIndoZXJlIHRoZSBzZWNvbmQvMiBpcyAzIiwKLSAgICAgICAgICAgIEV4cGxhaW4oUG9pbnR3aXNlKElzSGFsZk9mKCksIHJocyksIGxocykpOwotfQotCi1URVNUKFBvaW50d2lzZVRlc3QsIEFjY2VwdHNDb3JyZWN0Q29udGVudCkgewotICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OwotICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDQsIDZ9OwotICBFWFBFQ1RfVEhBVChsaHMsIFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpKTsKLSAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpLCBsaHMpKTsKLX0KLQotVEVTVChQb2ludHdpc2VUZXN0LCBBbGxvd3NNb25vbW9ycGhpY0lubmVyTWF0Y2hlcikgewotICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OwotICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDQsIDZ9OwotICBjb25zdCBNYXRjaGVyPHR1cGxlPGNvbnN0IGRvdWJsZSYsIGNvbnN0IGludCY+ID4gbTEgPSBJc0hhbGZPZigpOwotICBFWFBFQ1RfVEhBVChsaHMsIFBvaW50d2lzZShtMSwgcmhzKSk7Ci0gIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihQb2ludHdpc2UobTEsIHJocyksIGxocykpOwotCi0gIC8vIFRoaXMgdHlwZSB3b3JrcyBhcyBhIHR1cGxlPGNvbnN0IGRvdWJsZSYsIGNvbnN0IGludCY+IGNhbiBiZQotICAvLyBpbXBsaWNpdGx5IGNhc3QgdG8gdHVwbGU8ZG91YmxlLCBpbnQ+LgotICBjb25zdCBNYXRjaGVyPHR1cGxlPGRvdWJsZSwgaW50PiA+IG0yID0gSXNIYWxmT2YoKTsKLSAgRVhQRUNUX1RIQVQobGhzLCBQb2ludHdpc2UobTIsIHJocykpOwotICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4oUG9pbnR3aXNlKG0yLCByaHMpLCBsaHMpKTsKLX0KLQotVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBEZXNjcmliZXNTZWxmKSB7Ci0gIHZlY3RvcjxpbnQ+IHJoczsKLSAgcmhzLnB1c2hfYmFjaygxKTsKLSAgcmhzLnB1c2hfYmFjaygyKTsKLSAgcmhzLnB1c2hfYmFjaygzKTsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCB2ZWN0b3I8aW50PiY+IG0gPSBVbm9yZGVyZWRQb2ludHdpc2UoSXNIYWxmT2YoKSwgcmhzKTsKLSAgRVhQRUNUX0VRKAotICAgICAgImhhcyAzIGVsZW1lbnRzIGFuZCB0aGVyZSBleGlzdHMgc29tZSBwZXJtdXRhdGlvbiBvZiBlbGVtZW50cyBzdWNoICIKLSAgICAgICJ0aGF0OlxuIgotICAgICAgIiAtIGVsZW1lbnQgIzAgYW5kIDEgYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kLCAiCi0gICAgICAiYW5kXG4iCi0gICAgICAiIC0gZWxlbWVudCAjMSBhbmQgMiBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCBpcyBoYWxmIG9mIHRoZSBzZWNvbmQsICIKLSAgICAgICJhbmRcbiIKLSAgICAgICIgLSBlbGVtZW50ICMyIGFuZCAzIGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IGlzIGhhbGYgb2YgdGhlIHNlY29uZCIsCi0gICAgICBEZXNjcmliZShtKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJkb2Vzbid0IGhhdmUgMyBlbGVtZW50cywgb3IgdGhlcmUgZXhpc3RzIG5vIHBlcm11dGF0aW9uIG9mIGVsZW1lbnRzICIKLSAgICAgICJzdWNoIHRoYXQ6XG4iCi0gICAgICAiIC0gZWxlbWVudCAjMCBhbmQgMSBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCBpcyBoYWxmIG9mIHRoZSBzZWNvbmQsICIKLSAgICAgICJhbmRcbiIKLSAgICAgICIgLSBlbGVtZW50ICMxIGFuZCAyIGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IGlzIGhhbGYgb2YgdGhlIHNlY29uZCwgIgotICAgICAgImFuZFxuIgotICAgICAgIiAtIGVsZW1lbnQgIzIgYW5kIDMgYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kIiwKLSAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOwotfQotCi1URVNUKFVub3JkZXJlZFBvaW50d2lzZVRlc3QsIE1ha2VzQ29weU9mUmhzKSB7Ci0gIGxpc3Q8c2lnbmVkIGNoYXI+IHJoczsKLSAgcmhzLnB1c2hfYmFjaygyKTsKLSAgcmhzLnB1c2hfYmFjayg0KTsKLQotICBpbnQgbGhzW10gPSB7MiwgMX07Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgaW50ICgmKVsyXT4gbSA9IFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpOwotICBFWFBFQ1RfVEhBVChsaHMsIG0pOwotCi0gIC8vIENoYW5naW5nIHJocyBub3cgc2hvdWxkbid0IGFmZmVjdCBtLCB3aGljaCBtYWRlIGEgY29weSBvZiByaHMuCi0gIHJocy5wdXNoX2JhY2soNik7Ci0gIEVYUEVDVF9USEFUKGxocywgbSk7Ci19Ci0KLVRFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgV29ya3NGb3JMaHNOYXRpdmVBcnJheSkgewotICBjb25zdCBpbnQgbGhzW10gPSB7MSwgMiwgM307Ci0gIHZlY3RvcjxpbnQ+IHJoczsKLSAgcmhzLnB1c2hfYmFjayg0KTsKLSAgcmhzLnB1c2hfYmFjayg2KTsKLSAgcmhzLnB1c2hfYmFjaygyKTsKLSAgRVhQRUNUX1RIQVQobGhzLCBVbm9yZGVyZWRQb2ludHdpc2UoTHQoKSwgcmhzKSk7Ci0gIEVYUEVDVF9USEFUKGxocywgTm90KFVub3JkZXJlZFBvaW50d2lzZShHdCgpLCByaHMpKSk7Ci19Ci0KLVRFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgV29ya3NGb3JSaHNOYXRpdmVBcnJheSkgewotICBjb25zdCBpbnQgcmhzW10gPSB7MSwgMiwgM307Ci0gIHZlY3RvcjxpbnQ+IGxoczsKLSAgbGhzLnB1c2hfYmFjayg0KTsKLSAgbGhzLnB1c2hfYmFjaygyKTsKLSAgbGhzLnB1c2hfYmFjayg2KTsKLSAgRVhQRUNUX1RIQVQobGhzLCBVbm9yZGVyZWRQb2ludHdpc2UoR3QoKSwgcmhzKSk7Ci0gIEVYUEVDVF9USEFUKGxocywgTm90KFVub3JkZXJlZFBvaW50d2lzZShMdCgpLCByaHMpKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLVRFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgV29ya3NGb3JSaHNJbml0aWFsaXplckxpc3QpIHsKLSAgY29uc3QgdmVjdG9yPGludD4gbGhzezIsIDQsIDZ9OwotICBFWFBFQ1RfVEhBVChsaHMsIFVub3JkZXJlZFBvaW50d2lzZShHdCgpLCB7NSwgMSwgM30pKTsKLSAgRVhQRUNUX1RIQVQobGhzLCBOb3QoVW5vcmRlcmVkUG9pbnR3aXNlKEx0KCksIHsxLCAxLCA3fSkpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLVRFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgUmVqZWN0c1dyb25nU2l6ZSkgewotICBjb25zdCBkb3VibGUgbGhzWzJdID0gezEsIDJ9OwotICBjb25zdCBpbnQgcmhzWzFdID0gezB9OwotICBFWFBFQ1RfVEhBVChsaHMsIE5vdChVbm9yZGVyZWRQb2ludHdpc2UoR3QoKSwgcmhzKSkpOwotICBFWFBFQ1RfRVEoIndoaWNoIGhhcyAyIGVsZW1lbnRzIiwKLSAgICAgICAgICAgIEV4cGxhaW4oVW5vcmRlcmVkUG9pbnR3aXNlKEd0KCksIHJocyksIGxocykpOwotCi0gIGNvbnN0IGludCByaHMyWzNdID0gezAsIDEsIDJ9OwotICBFWFBFQ1RfVEhBVChsaHMsIE5vdChVbm9yZGVyZWRQb2ludHdpc2UoR3QoKSwgcmhzMikpKTsKLX0KLQotVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBSZWplY3RzV3JvbmdDb250ZW50KSB7Ci0gIGNvbnN0IGRvdWJsZSBsaHNbM10gPSB7MSwgMiwgM307Ci0gIGNvbnN0IGludCByaHNbM10gPSB7MiwgNiwgNn07Ci0gIEVYUEVDVF9USEFUKGxocywgTm90KFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpKSk7Ci0gIEVYUEVDVF9FUSgid2hlcmUgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBkb24ndCBtYXRjaCBhbnkgbWF0Y2hlcnM6XG4iCi0gICAgICAgICAgICAiZWxlbWVudCAjMTogMiIsCi0gICAgICAgICAgICBFeHBsYWluKFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpLCBsaHMpKTsKLX0KLQotVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBBY2NlcHRzQ29ycmVjdENvbnRlbnRJblNhbWVPcmRlcikgewotICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OwotICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDQsIDZ9OwotICBFWFBFQ1RfVEhBVChsaHMsIFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpKTsKLX0KLQotVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBBY2NlcHRzQ29ycmVjdENvbnRlbnRJbkRpZmZlcmVudE9yZGVyKSB7Ci0gIGNvbnN0IGRvdWJsZSBsaHNbM10gPSB7MSwgMiwgM307Ci0gIGNvbnN0IGludCByaHNbM10gPSB7NiwgNCwgMn07Ci0gIEVYUEVDVF9USEFUKGxocywgVW5vcmRlcmVkUG9pbnR3aXNlKElzSGFsZk9mKCksIHJocykpOwotfQotCi1URVNUKFVub3JkZXJlZFBvaW50d2lzZVRlc3QsIEFsbG93c01vbm9tb3JwaGljSW5uZXJNYXRjaGVyKSB7Ci0gIGNvbnN0IGRvdWJsZSBsaHNbM10gPSB7MSwgMiwgM307Ci0gIGNvbnN0IGludCByaHNbM10gPSB7NCwgNiwgMn07Ci0gIGNvbnN0IE1hdGNoZXI8dHVwbGU8Y29uc3QgZG91YmxlJiwgY29uc3QgaW50Jj4gPiBtMSA9IElzSGFsZk9mKCk7Ci0gIEVYUEVDVF9USEFUKGxocywgVW5vcmRlcmVkUG9pbnR3aXNlKG0xLCByaHMpKTsKLQotICAvLyBUaGlzIHR5cGUgd29ya3MgYXMgYSB0dXBsZTxjb25zdCBkb3VibGUmLCBjb25zdCBpbnQmPiBjYW4gYmUKLSAgLy8gaW1wbGljaXRseSBjYXN0IHRvIHR1cGxlPGRvdWJsZSwgaW50Pi4KLSAgY29uc3QgTWF0Y2hlcjx0dXBsZTxkb3VibGUsIGludD4gPiBtMiA9IElzSGFsZk9mKCk7Ci0gIEVYUEVDVF9USEFUKGxocywgVW5vcmRlcmVkUG9pbnR3aXNlKG0yLCByaHMpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGdtb2NrX21hdGNoZXJzX3Rlc3QKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stbW9yZS1hY3Rpb25zX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stbW9yZS1hY3Rpb25zX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzdmZTkuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrLW1vcmUtYWN0aW9uc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzA1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGJ1aWx0LWluIGFjdGlvbnMgaW4gZ21vY2stbW9yZS1hY3Rpb25zLmguCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaCIKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGdtb2NrX21vcmVfYWN0aW9uc190ZXN0IHsKLQotdXNpbmcgOjpzdGQ6OnBsdXM7Ci11c2luZyA6OnN0ZDo6c3RyaW5nOwotdXNpbmcgdGVzdGluZzo6Z2V0OwotdXNpbmcgdGVzdGluZzo6bWFrZV90dXBsZTsKLXVzaW5nIHRlc3Rpbmc6OnR1cGxlOwotdXNpbmcgdGVzdGluZzo6dHVwbGVfZWxlbWVudDsKLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpBY3Rpb247Ci11c2luZyB0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U7Ci11c2luZyB0ZXN0aW5nOjpEZWxldGVBcmc7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm5Bcmc7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm5Qb2ludGVlOwotdXNpbmcgdGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmdQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6U2V0QXJnUmVmZXJlZTsKLXVzaW5nIHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTsKLXVzaW5nIHRlc3Rpbmc6OlVudXNlZDsKLXVzaW5nIHRlc3Rpbmc6OldpdGhBcmc7Ci11c2luZyB0ZXN0aW5nOjpXaXRob3V0QXJnczsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOwotCi0vLyBGb3Igc3VwcHJlc3NpbmcgY29tcGlsZXIgd2FybmluZ3Mgb24gY29udmVyc2lvbiBwb3NzaWJseSBsb3NpbmcgcHJlY2lzaW9uLgotaW5saW5lIHNob3J0IFNob3J0KHNob3J0IG4pIHsgcmV0dXJuIG47IH0gIC8vIE5PTElOVAotaW5saW5lIGNoYXIgQ2hhcihjaGFyIGNoKSB7IHJldHVybiBjaDsgfQotCi0vLyBTYW1wbGUgZnVuY3Rpb25zIGFuZCBmdW5jdG9ycyBmb3IgdGVzdGluZyBJbnZva2UoKSBhbmQgZXRjLgotaW50IE51bGxhcnkoKSB7IHJldHVybiAxOyB9Ci0KLWNsYXNzIE51bGxhcnlGdW5jdG9yIHsKLSBwdWJsaWM6Ci0gIGludCBvcGVyYXRvcigpKCkgeyByZXR1cm4gMjsgfQotfTsKLQotYm9vbCBnX2RvbmUgPSBmYWxzZTsKLXZvaWQgVm9pZE51bGxhcnkoKSB7IGdfZG9uZSA9IHRydWU7IH0KLQotY2xhc3MgVm9pZE51bGxhcnlGdW5jdG9yIHsKLSBwdWJsaWM6Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgZ19kb25lID0gdHJ1ZTsgfQotfTsKLQotYm9vbCBVbmFyeShpbnQgeCkgeyByZXR1cm4geCA8IDA7IH0KLQotY29uc3QgY2hhciogUGx1czEoY29uc3QgY2hhciogcykgeyByZXR1cm4gcyArIDE7IH0KLQotdm9pZCBWb2lkVW5hcnkoaW50IC8qIG4gKi8pIHsgZ19kb25lID0gdHJ1ZTsgfQotCi1ib29sIEJ5Q29uc3RSZWYoY29uc3Qgc3RyaW5nJiBzKSB7IHJldHVybiBzID09ICJIaSI7IH0KLQotY29uc3QgZG91YmxlIGdfZG91YmxlID0gMDsKLWJvb2wgUmVmZXJlbmNlc0dsb2JhbERvdWJsZShjb25zdCBkb3VibGUmIHgpIHsgcmV0dXJuICZ4ID09ICZnX2RvdWJsZTsgfQotCi1zdHJpbmcgQnlOb25Db25zdFJlZihzdHJpbmcmIHMpIHsgcmV0dXJuIHMgKz0gIisiOyB9ICAvLyBOT0xJTlQKLQotc3RydWN0IFVuYXJ5RnVuY3RvciB7Ci0gIGludCBvcGVyYXRvcigpKGJvb2wgeCkgeyByZXR1cm4geCA/IDEgOiAtMTsgfQotfTsKLQotY29uc3QgY2hhciogQmluYXJ5KGNvbnN0IGNoYXIqIGlucHV0LCBzaG9ydCBuKSB7IHJldHVybiBpbnB1dCArIG47IH0gIC8vIE5PTElOVAotCi12b2lkIFZvaWRCaW5hcnkoaW50LCBjaGFyKSB7IGdfZG9uZSA9IHRydWU7IH0KLQotaW50IFRlcm5hcnkoaW50IHgsIGNoYXIgeSwgc2hvcnQgeikgeyByZXR1cm4geCArIHkgKyB6OyB9ICAvLyBOT0xJTlQKLQotdm9pZCBWb2lkVGVybmFyeShpbnQsIGNoYXIsIGJvb2wpIHsgZ19kb25lID0gdHJ1ZTsgfQotCi1pbnQgU3VtT2Y0KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7IHJldHVybiBhICsgYiArIGMgKyBkOyB9Ci0KLWludCBTdW1PZkZpcnN0MihpbnQgYSwgaW50IGIsIFVudXNlZCwgVW51c2VkKSB7IHJldHVybiBhICsgYjsgfQotCi12b2lkIFZvaWRGdW5jdGlvbldpdGhGb3VyQXJndW1lbnRzKGNoYXIsIGludCwgZmxvYXQsIGRvdWJsZSkgeyBnX2RvbmUgPSB0cnVlOyB9Ci0KLXN0cmluZyBDb25jYXQ0KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCkgewotICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNDsKLX0KLQotaW50IFN1bU9mNShpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpIHsgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlOyB9Ci0KLXN0cnVjdCBTdW1PZjVGdW5jdG9yIHsKLSAgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlKSB7Ci0gICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlOwotICB9Ci19OwotCi1zdHJpbmcgQ29uY2F0NShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1KSB7Ci0gIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczU7Ci19Ci0KLWludCBTdW1PZjYoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlLCBpbnQgZikgewotICByZXR1cm4gYSArIGIgKyBjICsgZCArIGUgKyBmOwotfQotCi1zdHJ1Y3QgU3VtT2Y2RnVuY3RvciB7Ci0gIGludCBvcGVyYXRvcigpKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSwgaW50IGYpIHsKLSAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGUgKyBmOwotICB9Ci19OwotCi1zdHJpbmcgQ29uY2F0Nihjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNikgewotICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczY7Ci19Ci0KLXN0cmluZyBDb25jYXQ3KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcpIHsKLSAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczc7Ci19Ci0KLXN0cmluZyBDb25jYXQ4KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcsIGNvbnN0IGNoYXIqIHM4KSB7Ci0gIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczg7Ci19Ci0KLXN0cmluZyBDb25jYXQ5KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcsIGNvbnN0IGNoYXIqIHM4LCBjb25zdCBjaGFyKiBzOSkgewotICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4ICsgczk7Ci19Ci0KLXN0cmluZyBDb25jYXQxMChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcsIGNvbnN0IGNoYXIqIHM4LCBjb25zdCBjaGFyKiBzOSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMTApIHsKLSAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczcgKyBzOCArIHM5ICsgczEwOwotfQotCi1jbGFzcyBGb28gewotIHB1YmxpYzoKLSAgRm9vKCkgOiB2YWx1ZV8oMTIzKSB7fQotCi0gIGludCBOdWxsYXJ5KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSAgc2hvcnQgVW5hcnkobG9uZyB4KSB7IHJldHVybiBzdGF0aWNfY2FzdDxzaG9ydD4odmFsdWVfICsgeCk7IH0gIC8vIE5PTElOVAotCi0gIHN0cmluZyBCaW5hcnkoY29uc3Qgc3RyaW5nJiBzdHIsIGNoYXIgYykgY29uc3QgeyByZXR1cm4gc3RyICsgYzsgfQotCi0gIGludCBUZXJuYXJ5KGludCB4LCBib29sIHksIGNoYXIgeikgeyByZXR1cm4gdmFsdWVfICsgeCArIHkqejsgfQotCi0gIGludCBTdW1PZjQoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIGNvbnN0IHsKLSAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIHZhbHVlXzsKLSAgfQotCi0gIGludCBTdW1PZkxhc3QyKFVudXNlZCwgVW51c2VkLCBpbnQgYSwgaW50IGIpIGNvbnN0IHsgcmV0dXJuIGEgKyBiOyB9Ci0KLSAgaW50IFN1bU9mNShpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpIHsgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlOyB9Ci0KLSAgaW50IFN1bU9mNihpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUsIGludCBmKSB7Ci0gICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlICsgZjsKLSAgfQotCi0gIHN0cmluZyBDb25jYXQ3KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3KSB7Ci0gICAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczc7Ci0gIH0KLQotICBzdHJpbmcgQ29uY2F0OChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgpIHsKLSAgICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4OwotICB9Ci0KLSAgc3RyaW5nIENvbmNhdDkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcsIGNvbnN0IGNoYXIqIHM4LCBjb25zdCBjaGFyKiBzOSkgewotICAgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczggKyBzOTsKLSAgfQotCi0gIHN0cmluZyBDb25jYXQxMChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3LCBjb25zdCBjaGFyKiBzOCwgY29uc3QgY2hhciogczksCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMTApIHsKLSAgICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4ICsgczkgKyBzMTA7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCB2YWx1ZV87Ci19OwotCi0vLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgbnVsbGFyeSBmdW5jdGlvbi4KLVRFU1QoSW52b2tlVGVzdCwgTnVsbGFyeSkgewotICBBY3Rpb248aW50KCk+IGEgPSBJbnZva2UoTnVsbGFyeSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDEsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIHVuYXJ5IGZ1bmN0aW9uLgotVEVTVChJbnZva2VUZXN0LCBVbmFyeSkgewotICBBY3Rpb248Ym9vbChpbnQpPiBhID0gSW52b2tlKFVuYXJ5KTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRkFMU0UoYS5QZXJmb3JtKG1ha2VfdHVwbGUoMSkpKTsKLSAgRVhQRUNUX1RSVUUoYS5QZXJmb3JtKG1ha2VfdHVwbGUoLTEpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSBiaW5hcnkgZnVuY3Rpb24uCi1URVNUKEludm9rZVRlc3QsIEJpbmFyeSkgewotICBBY3Rpb248Y29uc3QgY2hhciooY29uc3QgY2hhciosIHNob3J0KT4gYSA9IEludm9rZShCaW5hcnkpOyAgLy8gTk9MSU5UCi0gIGNvbnN0IGNoYXIqIHAgPSAiSGVsbG8iOwotICBFWFBFQ1RfRVEocCArIDIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKHAsIFNob3J0KDIpKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgdGVybmFyeSBmdW5jdGlvbi4KLVRFU1QoSW52b2tlVGVzdCwgVGVybmFyeSkgewotICBBY3Rpb248aW50KGludCwgY2hhciwgc2hvcnQpPiBhID0gSW52b2tlKFRlcm5hcnkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSg2LCBhLlBlcmZvcm0obWFrZV90dXBsZSgxLCAnXDInLCBTaG9ydCgzKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDQtYXJndW1lbnQgZnVuY3Rpb24uCi1URVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzNEFyZ3VtZW50cykgewotICBBY3Rpb248aW50KGludCwgaW50LCBpbnQsIGludCk+IGEgPSBJbnZva2UoU3VtT2Y0KTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMTIzNCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwMCwgMjAwLCAzMCwgNCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDUtYXJndW1lbnQgZnVuY3Rpb24uCi1URVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzNUFyZ3VtZW50cykgewotICBBY3Rpb248aW50KGludCwgaW50LCBpbnQsIGludCwgaW50KT4gYSA9IEludm9rZShTdW1PZjUpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgxMjM0NSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwMDAsIDIwMDAsIDMwMCwgNDAsIDUpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSA2LWFyZ3VtZW50IGZ1bmN0aW9uLgotVEVTVChJbnZva2VUZXN0LCBGdW5jdGlvblRoYXRUYWtlczZBcmd1bWVudHMpIHsKLSAgQWN0aW9uPGludChpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KT4gYSA9IEludm9rZShTdW1PZjYpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgxMjM0NTYsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEwMDAwMCwgMjAwMDAsIDMwMDAsIDQwMCwgNTAsIDYpKSk7Ci19Ci0KLS8vIEEgaGVscGVyIHRoYXQgdHVybnMgdGhlIHR5cGUgb2YgYSBDLXN0cmluZyBsaXRlcmFsIGZyb20gY29uc3QKLS8vIGNoYXJbTl0gdG8gY29uc3QgY2hhciouCi1pbmxpbmUgY29uc3QgY2hhciogQ2hhclB0cihjb25zdCBjaGFyKiBzKSB7IHJldHVybiBzOyB9Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSA3LWFyZ3VtZW50IGZ1bmN0aW9uLgotVEVTVChJbnZva2VUZXN0LCBGdW5jdGlvblRoYXRUYWtlczdBcmd1bWVudHMpIHsKLSAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9Ci0gICAgICBJbnZva2UoQ29uY2F0Nyk7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2NyIsCi0gICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDgtYXJndW1lbnQgZnVuY3Rpb24uCi1URVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzOEFyZ3VtZW50cykgewotICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9Ci0gICAgICBJbnZva2UoQ29uY2F0OCk7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2NzgiLAotICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksIENoYXJQdHIoIjMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjQiKSwgQ2hhclB0cigiNSIpLCBDaGFyUHRyKCI2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI3IiksIENoYXJQdHIoIjgiKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDktYXJndW1lbnQgZnVuY3Rpb24uCi1URVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzOUFyZ3VtZW50cykgewotICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKT4gYSA9IEludm9rZShDb25jYXQ5KTsKLSAgRVhQRUNUX0VRKCIxMjM0NTY3ODkiLAotICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksIENoYXJQdHIoIjMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjQiKSwgQ2hhclB0cigiNSIpLCBDaGFyUHRyKCI2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI3IiksIENoYXJQdHIoIjgiKSwgQ2hhclB0cigiOSIpKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgMTAtYXJndW1lbnQgZnVuY3Rpb24uCi1URVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzMTBBcmd1bWVudHMpIHsKLSAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0gSW52b2tlKENvbmNhdDEwKTsKLSAgRVhQRUNUX0VRKCIxMjM0NTY3ODkwIiwKLSAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLCBDaGFyUHRyKCIzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI0IiksIENoYXJQdHIoIjUiKSwgQ2hhclB0cigiNiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNyIpLCBDaGFyUHRyKCI4IiksIENoYXJQdHIoIjkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjAiKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBmdW5jdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGRlY2xhcmVkIGFzIFVudXNlZC4KLVRFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25XaXRoVW51c2VkUGFyYW1ldGVycykgewotICBBY3Rpb248aW50KGludCwgaW50LCBkb3VibGUsIGNvbnN0IHN0cmluZyYpPiBhMSA9Ci0gICAgICBJbnZva2UoU3VtT2ZGaXJzdDIpOwotICBFWFBFQ1RfRVEoMTIsIGExLlBlcmZvcm0obWFrZV90dXBsZSgxMCwgMiwgNS42LCBzdHJpbmcoImhpIikpKSk7Ci0KLSAgQWN0aW9uPGludChpbnQsIGludCwgYm9vbCwgaW50Kik+IGEyID0KLSAgICAgIEludm9rZShTdW1PZkZpcnN0Mik7Ci0gIEVYUEVDVF9FUSgyMywgYTIuUGVyZm9ybShtYWtlX3R1cGxlKDIwLCAzLCB0cnVlLCBzdGF0aWNfY2FzdDxpbnQqPihOVUxMKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBtZXRob2RzIHdpdGggcGFyYW1ldGVycyBkZWNsYXJlZCBhcyBVbnVzZWQuCi1URVNUKEludm9rZVRlc3QsIE1ldGhvZFdpdGhVbnVzZWRQYXJhbWV0ZXJzKSB7Ci0gIEZvbyBmb287Ci0gIEFjdGlvbjxpbnQoc3RyaW5nLCBib29sLCBpbnQsIGludCk+IGExID0KLSAgICAgIEludm9rZSgmZm9vLCAmRm9vOjpTdW1PZkxhc3QyKTsKLSAgRVhQRUNUX0VRKDEyLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiaGkiKSwgdHJ1ZSwgMTAsIDIpKSk7Ci0KLSAgQWN0aW9uPGludChjaGFyLCBkb3VibGUsIGludCwgaW50KT4gYTIgPQotICAgICAgSW52b2tlKCZmb28sICZGb286OlN1bU9mTGFzdDIpOwotICBFWFBFQ1RfRVEoMjMsIGEyLlBlcmZvcm0obWFrZV90dXBsZSgnYScsIDIuNSwgMjAsIDMpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSBmdW5jdG9yLgotVEVTVChJbnZva2VUZXN0LCBGdW5jdG9yKSB7Ci0gIEFjdGlvbjxsb25nKGxvbmcsIGludCk+IGEgPSBJbnZva2UocGx1czxsb25nPigpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoM0wsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEsIDIpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZShmKSBhcyBhbiBhY3Rpb24gb2YgYSBjb21wYXRpYmxlIHR5cGUuCi1URVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uV2l0aENvbXBhdGlibGVUeXBlKSB7Ci0gIEFjdGlvbjxsb25nKGludCwgc2hvcnQsIGNoYXIsIGJvb2wpPiBhID0gSW52b2tlKFN1bU9mNCk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDQzMjEsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDQwMDAsIFNob3J0KDMwMCksIENoYXIoMjApLCB0cnVlKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGFuIG9iamVjdCBwb2ludGVyIGFuZCBhIG1ldGhvZCBwb2ludGVyLgotCi0vLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgbnVsbGFyeSBtZXRob2QuCi1URVNUKEludm9rZU1ldGhvZFRlc3QsIE51bGxhcnkpIHsKLSAgRm9vIGZvbzsKLSAgQWN0aW9uPGludCgpPiBhID0gSW52b2tlKCZmb28sICZGb286Ok51bGxhcnkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgxMjMsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIHVuYXJ5IG1ldGhvZC4KLVRFU1QoSW52b2tlTWV0aG9kVGVzdCwgVW5hcnkpIHsKLSAgRm9vIGZvbzsKLSAgQWN0aW9uPHNob3J0KGxvbmcpPiBhID0gSW52b2tlKCZmb28sICZGb286OlVuYXJ5KTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoNDEyMywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoNDAwMCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIGJpbmFyeSBtZXRob2QuCi1URVNUKEludm9rZU1ldGhvZFRlc3QsIEJpbmFyeSkgewotICBGb28gZm9vOwotICBBY3Rpb248c3RyaW5nKGNvbnN0IHN0cmluZyYsIGNoYXIpPiBhID0gSW52b2tlKCZmb28sICZGb286OkJpbmFyeSk7Ci0gIHN0cmluZyBzKCJIZWxsIik7Ci0gIEVYUEVDVF9FUSgiSGVsbG8iLCBhLlBlcmZvcm0obWFrZV90dXBsZShzLCAnbycpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSB0ZXJuYXJ5IG1ldGhvZC4KLVRFU1QoSW52b2tlTWV0aG9kVGVzdCwgVGVybmFyeSkgewotICBGb28gZm9vOwotICBBY3Rpb248aW50KGludCwgYm9vbCwgY2hhcik+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6VGVybmFyeSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDExMjQsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEwMDAsIHRydWUsIENoYXIoMSkpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSA0LWFyZ3VtZW50IG1ldGhvZC4KLVRFU1QoSW52b2tlTWV0aG9kVGVzdCwgTWV0aG9kVGhhdFRha2VzNEFyZ3VtZW50cykgewotICBGb28gZm9vOwotICBBY3Rpb248aW50KGludCwgaW50LCBpbnQsIGludCk+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6U3VtT2Y0KTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMTM1NywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwMCwgMjAwLCAzMCwgNCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDUtYXJndW1lbnQgbWV0aG9kLgotVEVTVChJbnZva2VNZXRob2RUZXN0LCBNZXRob2RUaGF0VGFrZXM1QXJndW1lbnRzKSB7Ci0gIEZvbyBmb287Ci0gIEFjdGlvbjxpbnQoaW50LCBpbnQsIGludCwgaW50LCBpbnQpPiBhID0gSW52b2tlKCZmb28sICZGb286OlN1bU9mNSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKDEyMzQ1LCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAwMCwgMjAwMCwgMzAwLCA0MCwgNSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDYtYXJndW1lbnQgbWV0aG9kLgotVEVTVChJbnZva2VNZXRob2RUZXN0LCBNZXRob2RUaGF0VGFrZXM2QXJndW1lbnRzKSB7Ci0gIEZvbyBmb287Ci0gIEFjdGlvbjxpbnQoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk+IGEgPSAgLy8gTk9MSU5UCi0gICAgICBJbnZva2UoJmZvbywgJkZvbzo6U3VtT2Y2KTsKLSAgRVhQRUNUX0VRKDEyMzQ1NiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwMDAwLCAyMDAwMCwgMzAwMCwgNDAwLCA1MCwgNikpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDctYXJndW1lbnQgbWV0aG9kLgotVEVTVChJbnZva2VNZXRob2RUZXN0LCBNZXRob2RUaGF0VGFrZXM3QXJndW1lbnRzKSB7Ci0gIEZvbyBmb287Ci0gIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPQotICAgICAgSW52b2tlKCZmb28sICZGb286OkNvbmNhdDcpOwotICBFWFBFQ1RfRVEoIjEyMzQ1NjciLAotICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksIENoYXJQdHIoIjMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjQiKSwgQ2hhclB0cigiNSIpLCBDaGFyUHRyKCI2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI3IikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSA4LWFyZ3VtZW50IG1ldGhvZC4KLVRFU1QoSW52b2tlTWV0aG9kVGVzdCwgTWV0aG9kVGhhdFRha2VzOEFyZ3VtZW50cykgewotICBGb28gZm9vOwotICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9Ci0gICAgICBJbnZva2UoJmZvbywgJkZvbzo6Q29uY2F0OCk7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2NzgiLAotICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksIENoYXJQdHIoIjMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjQiKSwgQ2hhclB0cigiNSIpLCBDaGFyUHRyKCI2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI3IiksIENoYXJQdHIoIjgiKSkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDktYXJndW1lbnQgbWV0aG9kLgotVEVTVChJbnZva2VNZXRob2RUZXN0LCBNZXRob2RUaGF0VGFrZXM5QXJndW1lbnRzKSB7Ci0gIEZvbyBmb287Ci0gIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciopPiBhID0gSW52b2tlKCZmb28sICZGb286OkNvbmNhdDkpOwotICBFWFBFQ1RfRVEoIjEyMzQ1Njc4OSIsCi0gICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSwgQ2hhclB0cigiOCIpLCBDaGFyUHRyKCI5IikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSAxMC1hcmd1bWVudCBtZXRob2QuCi1URVNUKEludm9rZU1ldGhvZFRlc3QsIE1ldGhvZFRoYXRUYWtlczEwQXJndW1lbnRzKSB7Ci0gIEZvbyBmb287Ci0gIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9IEludm9rZSgmZm9vLCAmRm9vOjpDb25jYXQxMCk7Ci0gIEVYUEVDVF9FUSgiMTIzNDU2Nzg5MCIsCi0gICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSwgQ2hhclB0cigiOCIpLCBDaGFyUHRyKCI5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCIwIikpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEludm9rZShmKSBhcyBhbiBhY3Rpb24gb2YgYSBjb21wYXRpYmxlIHR5cGUuCi1URVNUKEludm9rZU1ldGhvZFRlc3QsIE1ldGhvZFdpdGhDb21wYXRpYmxlVHlwZSkgewotICBGb28gZm9vOwotICBBY3Rpb248bG9uZyhpbnQsIHNob3J0LCBjaGFyLCBib29sKT4gYSA9ICAvLyBOT0xJTlQKLSAgICAgIEludm9rZSgmZm9vLCAmRm9vOjpTdW1PZjQpOwotICBFWFBFQ1RfRVEoNDQ0NCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoNDAwMCwgU2hvcnQoMzAwKSwgQ2hhcigyMCksIHRydWUpKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFdpdGhvdXRBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnQuCi1URVNUKFdpdGhvdXRBcmdzVGVzdCwgTm9BcmcpIHsKLSAgQWN0aW9uPGludChpbnQgbik+IGEgPSBXaXRob3V0QXJncyhJbnZva2UoTnVsbGFyeSkpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9FUSgxLCBhLlBlcmZvcm0obWFrZV90dXBsZSgyKSkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBXaXRoQXJnIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgMSBhcmd1bWVudC4KLVRFU1QoV2l0aEFyZ1Rlc3QsIE9uZUFyZykgewotICBBY3Rpb248Ym9vbChkb3VibGUgeCwgaW50IG4pPiBiID0gV2l0aEFyZzwxPihJbnZva2UoVW5hcnkpKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfVFJVRShiLlBlcmZvcm0obWFrZV90dXBsZSgxLjUsIC0xKSkpOwotICBFWFBFQ1RfRkFMU0UoYi5QZXJmb3JtKG1ha2VfdHVwbGUoMS41LCAxKSkpOwotfQotCi1URVNUKFJldHVybkFyZ0FjdGlvblRlc3QsIFdvcmtzRm9yT25lQXJnSW50QXJnMCkgewotICBjb25zdCBBY3Rpb248aW50KGludCk+IGEgPSBSZXR1cm5Bcmc8MD4oKTsKLSAgRVhQRUNUX0VRKDUsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDUpKSk7Ci19Ci0KLVRFU1QoUmV0dXJuQXJnQWN0aW9uVGVzdCwgV29ya3NGb3JNdWx0aUFyZ0Jvb2xBcmcwKSB7Ci0gIGNvbnN0IEFjdGlvbjxib29sKGJvb2wsIGJvb2wsIGJvb2wpPiBhID0gUmV0dXJuQXJnPDA+KCk7Ci0gIEVYUEVDVF9UUlVFKGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIGZhbHNlLCBmYWxzZSkpKTsKLX0KLQotVEVTVChSZXR1cm5BcmdBY3Rpb25UZXN0LCBXb3Jrc0Zvck11bHRpQXJnU3RyaW5nQXJnMikgewotICBjb25zdCBBY3Rpb248c3RyaW5nKGludCwgaW50LCBzdHJpbmcsIGludCk+IGEgPSBSZXR1cm5Bcmc8Mj4oKTsKLSAgRVhQRUNUX0VRKCJzZXZlbiIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDUsIDYsIHN0cmluZygic2V2ZW4iKSwgOCkpKTsKLX0KLQotVEVTVChTYXZlQXJnQWN0aW9uVGVzdCwgV29ya3NGb3JTYW1lVHlwZSkgewotICBpbnQgcmVzdWx0ID0gMDsKLSAgY29uc3QgQWN0aW9uPHZvaWQoaW50IG4pPiBhMSA9IFNhdmVBcmc8MD4oJnJlc3VsdCk7Ci0gIGExLlBlcmZvcm0obWFrZV90dXBsZSg1KSk7Ci0gIEVYUEVDVF9FUSg1LCByZXN1bHQpOwotfQotCi1URVNUKFNhdmVBcmdBY3Rpb25UZXN0LCBXb3Jrc0ZvckNvbXBhdGlibGVUeXBlKSB7Ci0gIGludCByZXN1bHQgPSAwOwotICBjb25zdCBBY3Rpb248dm9pZChib29sLCBjaGFyKT4gYTEgPSBTYXZlQXJnPDE+KCZyZXN1bHQpOwotICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJ2EnKSk7Ci0gIEVYUEVDVF9FUSgnYScsIHJlc3VsdCk7Ci19Ci0KLVRFU1QoU2F2ZUFyZ1BvaW50ZWVBY3Rpb25UZXN0LCBXb3Jrc0ZvclNhbWVUeXBlKSB7Ci0gIGludCByZXN1bHQgPSAwOwotICBjb25zdCBpbnQgdmFsdWUgPSA1OwotICBjb25zdCBBY3Rpb248dm9pZChjb25zdCBpbnQqKT4gYTEgPSBTYXZlQXJnUG9pbnRlZTwwPigmcmVzdWx0KTsKLSAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKCZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoNSwgcmVzdWx0KTsKLX0KLQotVEVTVChTYXZlQXJnUG9pbnRlZUFjdGlvblRlc3QsIFdvcmtzRm9yQ29tcGF0aWJsZVR5cGUpIHsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGNoYXIgdmFsdWUgPSAnYSc7Ci0gIGNvbnN0IEFjdGlvbjx2b2lkKGJvb2wsIGNoYXIqKT4gYTEgPSBTYXZlQXJnUG9pbnRlZTwxPigmcmVzdWx0KTsKLSAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoJ2EnLCByZXN1bHQpOwotfQotCi1URVNUKFNhdmVBcmdQb2ludGVlQWN0aW9uVGVzdCwgV29ya3NGb3JMaW5rZWRQdHIpIHsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGxpbmtlZF9wdHI8aW50PiB2YWx1ZShuZXcgaW50KDUpKTsKLSAgY29uc3QgQWN0aW9uPHZvaWQobGlua2VkX3B0cjxpbnQ+KT4gYTEgPSBTYXZlQXJnUG9pbnRlZTwwPigmcmVzdWx0KTsKLSAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSg1LCByZXN1bHQpOwotfQotCi1URVNUKFNldEFyZ1JlZmVyZWVBY3Rpb25UZXN0LCBXb3Jrc0ZvclNhbWVUeXBlKSB7Ci0gIGludCB2YWx1ZSA9IDA7Ci0gIGNvbnN0IEFjdGlvbjx2b2lkKGludCYpPiBhMSA9IFNldEFyZ1JlZmVyZWU8MD4oMSk7Ci0gIGExLlBlcmZvcm0odHVwbGU8aW50Jj4odmFsdWUpKTsKLSAgRVhQRUNUX0VRKDEsIHZhbHVlKTsKLX0KLQotVEVTVChTZXRBcmdSZWZlcmVlQWN0aW9uVGVzdCwgV29ya3NGb3JDb21wYXRpYmxlVHlwZSkgewotICBpbnQgdmFsdWUgPSAwOwotICBjb25zdCBBY3Rpb248dm9pZChpbnQsIGludCYpPiBhMSA9IFNldEFyZ1JlZmVyZWU8MT4oJ2EnKTsKLSAgYTEuUGVyZm9ybSh0dXBsZTxpbnQsIGludCY+KDAsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgnYScsIHZhbHVlKTsKLX0KLQotVEVTVChTZXRBcmdSZWZlcmVlQWN0aW9uVGVzdCwgV29ya3NXaXRoRXh0cmFBcmd1bWVudHMpIHsKLSAgaW50IHZhbHVlID0gMDsKLSAgY29uc3QgQWN0aW9uPHZvaWQoYm9vbCwgaW50LCBpbnQmLCBjb25zdCBjaGFyKik+IGExID0gU2V0QXJnUmVmZXJlZTwyPignYScpOwotICBhMS5QZXJmb3JtKHR1cGxlPGJvb2wsIGludCwgaW50JiwgY29uc3QgY2hhcio+KHRydWUsIDAsIHZhbHVlLCAiaGkiKSk7Ci0gIEVYUEVDVF9FUSgnYScsIHZhbHVlKTsKLX0KLQotLy8gQSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZDogaXQgd2lsbCBzZXQKLS8vIHRoZSBib29sIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3RvciB0byB0cnVlIHdoZW4gZGVzdHJveWVkLgotY2xhc3MgRGVsZXRpb25UZXN0ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGVsZXRpb25UZXN0ZXIoYm9vbCogaXNfZGVsZXRlZCkKLSAgICA6IGlzX2RlbGV0ZWRfKGlzX2RlbGV0ZWQpIHsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGJpdCBpcyBzZXQgdG8gZmFsc2UuCi0gICAgKmlzX2RlbGV0ZWRfID0gZmFsc2U7Ci0gIH0KLQotICB+RGVsZXRpb25UZXN0ZXIoKSB7Ci0gICAgKmlzX2RlbGV0ZWRfID0gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCogaXNfZGVsZXRlZF87Ci19OwotCi1URVNUKERlbGV0ZUFyZ0FjdGlvblRlc3QsIE9uZUFyZykgewotICBib29sIGlzX2RlbGV0ZWQgPSBmYWxzZTsKLSAgRGVsZXRpb25UZXN0ZXIqIHQgPSBuZXcgRGVsZXRpb25UZXN0ZXIoJmlzX2RlbGV0ZWQpOwotICBjb25zdCBBY3Rpb248dm9pZChEZWxldGlvblRlc3RlciopPiBhMSA9IERlbGV0ZUFyZzwwPigpOyAgICAgIC8vIE5PTElOVAotICBFWFBFQ1RfRkFMU0UoaXNfZGVsZXRlZCk7Ci0gIGExLlBlcmZvcm0obWFrZV90dXBsZSh0KSk7Ci0gIEVYUEVDVF9UUlVFKGlzX2RlbGV0ZWQpOwotfQotCi1URVNUKERlbGV0ZUFyZ0FjdGlvblRlc3QsIFRlbkFyZ3MpIHsKLSAgYm9vbCBpc19kZWxldGVkID0gZmFsc2U7Ci0gIERlbGV0aW9uVGVzdGVyKiB0ID0gbmV3IERlbGV0aW9uVGVzdGVyKCZpc19kZWxldGVkKTsKLSAgY29uc3QgQWN0aW9uPHZvaWQoYm9vbCwgaW50LCBpbnQsIGNvbnN0IGNoYXIqLCBib29sLAotICAgICAgICAgICAgICAgICAgICBpbnQsIGludCwgaW50LCBpbnQsIERlbGV0aW9uVGVzdGVyKik+IGExID0gRGVsZXRlQXJnPDk+KCk7Ci0gIEVYUEVDVF9GQUxTRShpc19kZWxldGVkKTsKLSAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIDUsIDYsIENoYXJQdHIoImhpIiksIGZhbHNlLCA3LCA4LCA5LCAxMCwgdCkpOwotICBFWFBFQ1RfVFJVRShpc19kZWxldGVkKTsKLX0KLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLVRFU1QoVGhyb3dBY3Rpb25UZXN0LCBUaHJvd3NHaXZlbkV4Y2VwdGlvbkluVm9pZEZ1bmN0aW9uKSB7Ci0gIGNvbnN0IEFjdGlvbjx2b2lkKGludCBuKT4gYSA9IFRocm93KCdhJyk7Ci0gIEVYUEVDVF9USFJPVyhhLlBlcmZvcm0obWFrZV90dXBsZSgwKSksIGNoYXIpOwotfQotCi1jbGFzcyBNeUV4Y2VwdGlvbiB7fTsKLQotVEVTVChUaHJvd0FjdGlvblRlc3QsIFRocm93c0dpdmVuRXhjZXB0aW9uSW5Ob25Wb2lkRnVuY3Rpb24pIHsKLSAgY29uc3QgQWN0aW9uPGRvdWJsZShjaGFyIGNoKT4gYSA9IFRocm93KE15RXhjZXB0aW9uKCkpOwotICBFWFBFQ1RfVEhST1coYS5QZXJmb3JtKG1ha2VfdHVwbGUoJzAnKSksIE15RXhjZXB0aW9uKTsKLX0KLQotVEVTVChUaHJvd0FjdGlvblRlc3QsIFRocm93c0dpdmVuRXhjZXB0aW9uSW5OdWxsYXJ5RnVuY3Rpb24pIHsKLSAgY29uc3QgQWN0aW9uPGRvdWJsZSgpPiBhID0gVGhyb3coTXlFeGNlcHRpb24oKSk7Ci0gIEVYUEVDVF9USFJPVyhhLlBlcmZvcm0obWFrZV90dXBsZSgpKSwgTXlFeGNlcHRpb24pOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLS8vIFRlc3RzIHRoYXQgU2V0QXJyYXlBcmd1bWVudDxOPihmaXJzdCwgbGFzdCkgc2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5Ci0vLyBwb2ludGVkIHRvIGJ5IHRoZSBOLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0byB2YWx1ZXMgaW4gcmFuZ2UgW2ZpcnN0LCBsYXN0KS4KLVRFU1QoU2V0QXJyYXlBcmd1bWVudFRlc3QsIFNldHNUaGVOdGhBcnJheSkgewotICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBpbnQqLCBjaGFyKik7Ci0gIGludCBudW1iZXJzW10gPSB7IDEsIDIsIDMgfTsKLSAgQWN0aW9uPE15RnVuY3Rpb24+IGEgPSBTZXRBcnJheUFyZ3VtZW50PDE+KG51bWJlcnMsIG51bWJlcnMgKyAzKTsKLQotICBpbnQgbls0XSA9IHt9OwotICBpbnQqIHBuID0gbjsKLSAgY2hhciBjaFs0XSA9IHt9OwotICBjaGFyKiBwY2ggPSBjaDsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgcG4sIHBjaCkpOwotICBFWFBFQ1RfRVEoMSwgblswXSk7Ci0gIEVYUEVDVF9FUSgyLCBuWzFdKTsKLSAgRVhQRUNUX0VRKDMsIG5bMl0pOwotICBFWFBFQ1RfRVEoMCwgblszXSk7Ci0gIEVYUEVDVF9FUSgnXDAnLCBjaFswXSk7Ci0gIEVYUEVDVF9FUSgnXDAnLCBjaFsxXSk7Ci0gIEVYUEVDVF9FUSgnXDAnLCBjaFsyXSk7Ci0gIEVYUEVDVF9FUSgnXDAnLCBjaFszXSk7Ci0KLSAgLy8gVGVzdHMgZmlyc3QgYW5kIGxhc3QgYXJlIGl0ZXJhdG9ycy4KLSAgc3RkOjpzdHJpbmcgbGV0dGVycyA9ICJhYmMiOwotICBhID0gU2V0QXJyYXlBcmd1bWVudDwyPihsZXR0ZXJzLmJlZ2luKCksIGxldHRlcnMuZW5kKCkpOwotICBzdGQ6OmZpbGxfbihuLCA0LCAwKTsKLSAgc3RkOjpmaWxsX24oY2gsIDQsICdcMCcpOwotICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBwbiwgcGNoKSk7Ci0gIEVYUEVDVF9FUSgwLCBuWzBdKTsKLSAgRVhQRUNUX0VRKDAsIG5bMV0pOwotICBFWFBFQ1RfRVEoMCwgblsyXSk7Ci0gIEVYUEVDVF9FUSgwLCBuWzNdKTsKLSAgRVhQRUNUX0VRKCdhJywgY2hbMF0pOwotICBFWFBFQ1RfRVEoJ2InLCBjaFsxXSk7Ci0gIEVYUEVDVF9FUSgnYycsIGNoWzJdKTsKLSAgRVhQRUNUX0VRKCdcMCcsIGNoWzNdKTsKLX0KLQotLy8gVGVzdHMgU2V0QXJyYXlBcmd1bWVudDxOPihmaXJzdCwgbGFzdCkgd2hlcmUgZmlyc3QgPT0gbGFzdC4KLVRFU1QoU2V0QXJyYXlBcmd1bWVudFRlc3QsIFNldHNUaGVOdGhBcnJheVdpdGhFbXB0eVJhbmdlKSB7Ci0gIHR5cGVkZWYgdm9pZCBNeUZ1bmN0aW9uKGJvb2wsIGludCopOwotICBpbnQgbnVtYmVyc1tdID0geyAxLCAyLCAzIH07Ci0gIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJyYXlBcmd1bWVudDwxPihudW1iZXJzLCBudW1iZXJzKTsKLQotICBpbnQgbls0XSA9IHt9OwotICBpbnQqIHBuID0gbjsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgcG4pKTsKLSAgRVhQRUNUX0VRKDAsIG5bMF0pOwotICBFWFBFQ1RfRVEoMCwgblsxXSk7Ci0gIEVYUEVDVF9FUSgwLCBuWzJdKTsKLSAgRVhQRUNUX0VRKDAsIG5bM10pOwotfQotCi0vLyBUZXN0cyBTZXRBcnJheUFyZ3VtZW50PE4+KGZpcnN0LCBsYXN0KSB3aGVyZSAqZmlyc3QgaXMgY29udmVydGlibGUKLS8vIChidXQgbm90IGVxdWFsKSB0byB0aGUgYXJndW1lbnQgdHlwZS4KLVRFU1QoU2V0QXJyYXlBcmd1bWVudFRlc3QsIFNldHNUaGVOdGhBcnJheVdpdGhDb252ZXJ0aWJsZVR5cGUpIHsKLSAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oYm9vbCwgaW50Kik7Ci0gIGNoYXIgY2hhcnNbXSA9IHsgOTcsIDk4LCA5OSB9OwotICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFycmF5QXJndW1lbnQ8MT4oY2hhcnMsIGNoYXJzICsgMyk7Ci0KLSAgaW50IGNvZGVzWzRdID0geyAxMTEsIDIyMiwgMzMzLCA0NDQgfTsKLSAgaW50KiBwY29kZXMgPSBjb2RlczsKLSAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgcGNvZGVzKSk7Ci0gIEVYUEVDVF9FUSg5NywgY29kZXNbMF0pOwotICBFWFBFQ1RfRVEoOTgsIGNvZGVzWzFdKTsKLSAgRVhQRUNUX0VRKDk5LCBjb2Rlc1syXSk7Ci0gIEVYUEVDVF9FUSg0NDQsIGNvZGVzWzNdKTsKLX0KLQotLy8gVGVzdCBTZXRBcnJheUFyZ3VtZW50PE4+KGZpcnN0LCBsYXN0KSB3aXRoIGl0ZXJhdG9yIGFzIGFyZ3VtZW50LgotVEVTVChTZXRBcnJheUFyZ3VtZW50VGVzdCwgU2V0c1RoZU50aEFycmF5V2l0aEl0ZXJhdG9yQXJndW1lbnQpIHsKLSAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oYm9vbCwgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjxzdGQ6OnN0cmluZz4pOwotICBzdGQ6OnN0cmluZyBsZXR0ZXJzID0gImFiYyI7Ci0gIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJyYXlBcmd1bWVudDwxPihsZXR0ZXJzLmJlZ2luKCksIGxldHRlcnMuZW5kKCkpOwotCi0gIHN0ZDo6c3RyaW5nIHM7Ci0gIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIGJhY2tfaW5zZXJ0ZXIocykpKTsKLSAgRVhQRUNUX0VRKGxldHRlcnMsIHMpOwotfQotCi1URVNUKFJldHVyblBvaW50ZWVUZXN0LCBXb3JrcykgewotICBpbnQgbiA9IDQyOwotICBjb25zdCBBY3Rpb248aW50KCk+IGEgPSBSZXR1cm5Qb2ludGVlKCZuKTsKLSAgRVhQRUNUX0VRKDQyLCBhLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Ci0KLSAgbiA9IDQzOwotICBFWFBFQ1RfRVEoNDMsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGdtb2NrX2dlbmVyYXRlZF9hY3Rpb25zX3Rlc3QKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stbmljZS1zdHJpY3RfdGVzdC5jYyBiL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1uaWNlLXN0cmljdF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFkY2JiLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1uaWNlLXN0cmljdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0KLS8vIFRoaXMgbXVzdCBub3QgYmUgZGVmaW5lZCBpbnNpZGUgdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UsIG9yIGl0IHdpbGwKLS8vIGNsYXNoIHdpdGggOjp0ZXN0aW5nOjpNb2NrLgotY2xhc3MgTW9jayB7Ci0gcHVibGljOgotICBNb2NrKCkge30KLQotICBNT0NLX01FVEhPRDAoRG9UaGlzLCB2b2lkKCkpOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrKTsKLX07Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBnbW9ja19uaWNlX3N0cmljdF90ZXN0IHsKLQotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZzsKLXVzaW5nIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSk7Ci11c2luZyB0ZXN0aW5nOjpIYXNTdWJzdHI7Ci11c2luZyB0ZXN0aW5nOjpOYWdneU1vY2s7Ci11c2luZyB0ZXN0aW5nOjpOaWNlTW9jazsKLXVzaW5nIHRlc3Rpbmc6OlN0cmljdE1vY2s7Ci0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q2FwdHVyZVN0ZG91dDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRDYXB0dXJlZFN0ZG91dDsKLSNlbmRpZgotCi0vLyBEZWZpbmVzIHNvbWUgbW9jayBjbGFzc2VzIG5lZWRlZCBieSB0aGUgdGVzdHMuCi0KLWNsYXNzIEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Gb28oKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBEb1RoaXMoKSA9IDA7Ci0gIHZpcnR1YWwgaW50IERvVGhhdChib29sIGZsYWcpID0gMDsKLX07Ci0KLWNsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKLSBwdWJsaWM6Ci0gIE1vY2tGb28oKSB7fQotICB2b2lkIERlbGV0ZSgpIHsgZGVsZXRlIHRoaXM7IH0KLQotICBNT0NLX01FVEhPRDAoRG9UaGlzLCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDEoRG9UaGF0LCBpbnQoYm9vbCBmbGFnKSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGb28pOwotfTsKLQotY2xhc3MgTW9ja0JhciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNb2NrQmFyKGNvbnN0IHN0cmluZyYgcykgOiBzdHJfKHMpIHt9Ci0KLSAgTW9ja0JhcihjaGFyIGExLCBjaGFyIGEyLCBzdHJpbmcgYTMsIHN0cmluZyBhNCwgaW50IGE1LCBpbnQgYTYsCi0gICAgICAgICAgY29uc3Qgc3RyaW5nJiBhNywgY29uc3Qgc3RyaW5nJiBhOCwgYm9vbCBhOSwgYm9vbCBhMTApIHsKLSAgICBzdHJfID0gc3RyaW5nKCkgKyBhMSArIGEyICsgYTMgKyBhNCArIHN0YXRpY19jYXN0PGNoYXI+KGE1KSArCi0gICAgICAgIHN0YXRpY19jYXN0PGNoYXI+KGE2KSArIGE3ICsgYTggKyAoYTkgPyAnVCcgOiAnRicpICsgKGExMCA/ICdUJyA6ICdGJyk7Ci0gIH0KLQotICB2aXJ0dWFsIH5Nb2NrQmFyKCkge30KLQotICBjb25zdCBzdHJpbmcmIHN0cigpIGNvbnN0IHsgcmV0dXJuIHN0cl87IH0KLQotICBNT0NLX01FVEhPRDAoVGhpcywgaW50KCkpOwotICBNT0NLX01FVEhPRDIoVGhhdCwgc3RyaW5nKGludCwgYm9vbCkpOwotCi0gcHJpdmF0ZToKLSAgc3RyaW5nIHN0cl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrQmFyKTsKLX07Ci0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIFRlc3RzIHRoYXQgYSByYXcgbW9jayBnZW5lcmF0ZXMgd2FybmluZ3MgZm9yIHVuaW50ZXJlc3RpbmcgY2FsbHMuCi1URVNUKFJhd01vY2tUZXN0LCBXYXJuaW5nRm9yVW5pbnRlcmVzdGluZ0NhbGwpIHsKLSAgY29uc3Qgc3RyaW5nIHNhdmVkX2ZsYWcgPSBHTU9DS19GTEFHKHZlcmJvc2UpOwotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gIndhcm5pbmciOwotCi0gIE1vY2tGb28gcmF3X2ZvbzsKLQotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIHJhd19mb28uRG9UaGlzKCk7Ci0gIHJhd19mb28uRG9UaGF0KHRydWUpOwotICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZG91dCgpLAotICAgICAgICAgICAgICBIYXNTdWJzdHIoIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIikpOwotCi0gIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBzYXZlZF9mbGFnOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgcmF3IG1vY2sgZ2VuZXJhdGVzIHdhcm5pbmdzIGZvciB1bmludGVyZXN0aW5nIGNhbGxzCi0vLyB0aGF0IGRlbGV0ZSB0aGUgbW9jayBvYmplY3QuCi1URVNUKFJhd01vY2tUZXN0LCBXYXJuaW5nRm9yVW5pbnRlcmVzdGluZ0NhbGxBZnRlckRlYXRoKSB7Ci0gIGNvbnN0IHN0cmluZyBzYXZlZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJ3YXJuaW5nIjsKLQotICBNb2NrRm9vKiBjb25zdCByYXdfZm9vID0gbmV3IE1vY2tGb287Ci0KLSAgT05fQ0FMTCgqcmF3X2ZvbywgRG9UaGlzKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UocmF3X2ZvbywgJk1vY2tGb286OkRlbGV0ZSkpOwotCi0gIENhcHR1cmVTdGRvdXQoKTsKLSAgcmF3X2Zvby0+RG9UaGlzKCk7Ci0gIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3Rkb3V0KCksCi0gICAgICAgICAgICAgIEhhc1N1YnN0cigiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwiKSk7Ci0KLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX2ZsYWc7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSByYXcgbW9jayBnZW5lcmF0ZXMgaW5mb3JtYXRpb25hbCBsb2dzIGZvcgotLy8gdW5pbnRlcmVzdGluZyBjYWxscy4KLVRFU1QoUmF3TW9ja1Rlc3QsIEluZm9Gb3JVbmludGVyZXN0aW5nQ2FsbCkgewotICBNb2NrRm9vIHJhd19mb287Ci0KLSAgY29uc3Qgc3RyaW5nIHNhdmVkX2ZsYWcgPSBHTU9DS19GTEFHKHZlcmJvc2UpOwotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gImluZm8iOwotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIHJhd19mb28uRG9UaGlzKCk7Ci0gIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3Rkb3V0KCksCi0gICAgICAgICAgICAgIEhhc1N1YnN0cigiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwiKSk7Ci0KLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX2ZsYWc7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBuaWNlIG1vY2sgZ2VuZXJhdGVzIG5vIHdhcm5pbmcgZm9yIHVuaW50ZXJlc3RpbmcgY2FsbHMuCi1URVNUKE5pY2VNb2NrVGVzdCwgTm9XYXJuaW5nRm9yVW5pbnRlcmVzdGluZ0NhbGwpIHsKLSAgTmljZU1vY2s8TW9ja0Zvbz4gbmljZV9mb287Ci0KLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBuaWNlX2Zvby5Eb1RoaXMoKTsKLSAgbmljZV9mb28uRG9UaGF0KHRydWUpOwotICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3Rkb3V0KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgbmljZSBtb2NrIGdlbmVyYXRlcyBubyB3YXJuaW5nIGZvciB1bmludGVyZXN0aW5nIGNhbGxzCi0vLyB0aGF0IGRlbGV0ZSB0aGUgbW9jayBvYmplY3QuCi1URVNUKE5pY2VNb2NrVGVzdCwgTm9XYXJuaW5nRm9yVW5pbnRlcmVzdGluZ0NhbGxBZnRlckRlYXRoKSB7Ci0gIE5pY2VNb2NrPE1vY2tGb28+KiBjb25zdCBuaWNlX2ZvbyA9IG5ldyBOaWNlTW9jazxNb2NrRm9vPjsKLQotICBPTl9DQUxMKCpuaWNlX2ZvbywgRG9UaGlzKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UobmljZV9mb28sICZNb2NrRm9vOjpEZWxldGUpKTsKLQotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIG5pY2VfZm9vLT5Eb1RoaXMoKTsKLSAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZG91dCgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIG5pY2UgbW9jayBnZW5lcmF0ZXMgaW5mb3JtYXRpb25hbCBsb2dzIGZvcgotLy8gdW5pbnRlcmVzdGluZyBjYWxscy4KLVRFU1QoTmljZU1vY2tUZXN0LCBJbmZvRm9yVW5pbnRlcmVzdGluZ0NhbGwpIHsKLSAgTmljZU1vY2s8TW9ja0Zvbz4gbmljZV9mb287Ci0KLSAgY29uc3Qgc3RyaW5nIHNhdmVkX2ZsYWcgPSBHTU9DS19GTEFHKHZlcmJvc2UpOwotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gImluZm8iOwotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIG5pY2VfZm9vLkRvVGhpcygpOwotICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZG91dCgpLAotICAgICAgICAgICAgICBIYXNTdWJzdHIoIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIikpOwotCi0gIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBzYXZlZF9mbGFnOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotLy8gVGVzdHMgdGhhdCBhIG5pY2UgbW9jayBhbGxvd3MgZXhwZWN0ZWQgY2FsbHMuCi1URVNUKE5pY2VNb2NrVGVzdCwgQWxsb3dzRXhwZWN0ZWRDYWxsKSB7Ci0gIE5pY2VNb2NrPE1vY2tGb28+IG5pY2VfZm9vOwotCi0gIEVYUEVDVF9DQUxMKG5pY2VfZm9vLCBEb1RoaXMoKSk7Ci0gIG5pY2VfZm9vLkRvVGhpcygpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFuIHVuZXhwZWN0ZWQgY2FsbCBvbiBhIG5pY2UgbW9jayBmYWlscy4KLVRFU1QoTmljZU1vY2tUZXN0LCBVbmV4cGVjdGVkQ2FsbEZhaWxzKSB7Ci0gIE5pY2VNb2NrPE1vY2tGb28+IG5pY2VfZm9vOwotCi0gIEVYUEVDVF9DQUxMKG5pY2VfZm9vLCBEb1RoaXMoKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKG5pY2VfZm9vLkRvVGhpcygpLCAiY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCIpOwotfQotCi0vLyBUZXN0cyB0aGF0IE5pY2VNb2NrIHdvcmtzIHdpdGggYSBtb2NrIGNsYXNzIHRoYXQgaGFzIGEgbm9uLWRlZmF1bHQKLS8vIGNvbnN0cnVjdG9yLgotVEVTVChOaWNlTW9ja1Rlc3QsIE5vbkRlZmF1bHRDb25zdHJ1Y3RvcikgewotICBOaWNlTW9jazxNb2NrQmFyPiBuaWNlX2JhcigiaGkiKTsKLSAgRVhQRUNUX0VRKCJoaSIsIG5pY2VfYmFyLnN0cigpKTsKLQotICBuaWNlX2Jhci5UaGlzKCk7Ci0gIG5pY2VfYmFyLlRoYXQoNSwgdHJ1ZSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTmljZU1vY2sgd29ya3Mgd2l0aCBhIG1vY2sgY2xhc3MgdGhhdCBoYXMgYSAxMC1hcnkKLS8vIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9yLgotVEVTVChOaWNlTW9ja1Rlc3QsIE5vbkRlZmF1bHRDb25zdHJ1Y3RvcjEwKSB7Ci0gIE5pY2VNb2NrPE1vY2tCYXI+IG5pY2VfYmFyKCdhJywgJ2InLCAiYyIsICJkIiwgJ2UnLCAnZicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnIiwgImgiLCB0cnVlLCBmYWxzZSk7Ci0gIEVYUEVDVF9FUSgiYWJjZGVmZ2hURiIsIG5pY2VfYmFyLnN0cigpKTsKLQotICBuaWNlX2Jhci5UaGlzKCk7Ci0gIG5pY2VfYmFyLlRoYXQoNSwgdHJ1ZSk7Ci19Ci0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTiAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLS8vIFRlc3RzIHRoYXQgTmljZU1vY2s8TW9jaz4gY29tcGlsZXMgd2hlcmUgTW9jayBpcyBhIHVzZXItZGVmaW5lZAotLy8gY2xhc3MgKGFzIG9wcG9zZWQgdG8gOjp0ZXN0aW5nOjpNb2NrKS4gIFdlIGhhZCB0byB3b3JrIGFyb3VuZCBhbgotLy8gTVNWQyA4LjAgYnVnIHRoYXQgY2F1c2VkIHRoZSBzeW1ib2wgTW9jayB1c2VkIGluIHRoZSBkZWZpbml0aW9uIG9mCi0vLyBOaWNlTW9jayB0byBiZSBsb29rZWQgdXAgaW4gdGhlIHdyb25nIGNvbnRleHQsIGFuZCB0aGlzIHRlc3QKLS8vIGVuc3VyZXMgdGhhdCBvdXIgZml4IHdvcmtzLgotLy8KLS8vIFdlIGhhdmUgdG8gc2tpcCB0aGlzIHRlc3Qgb24gU3ltYmlhbiBhbmQgV2luZG93cyBNb2JpbGUsIGFzIGl0Ci0vLyBjYXVzZXMgdGhlIHByb2dyYW0gdG8gY3Jhc2ggdGhlcmUsIGZvciByZWFzb25zIHVuY2xlYXIgdG8gdXMgeWV0LgotVEVTVChOaWNlTW9ja1Rlc3QsIEFjY2VwdHNDbGFzc05hbWVkTW9jaykgewotICBOaWNlTW9jazwgOjpNb2NrPiBuaWNlOwotICBFWFBFQ1RfQ0FMTChuaWNlLCBEb1RoaXMoKSk7Ci0gIG5pY2UuRG9UaGlzKCk7Ci19Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBUZXN0cyB0aGF0IGEgbmFnZ3kgbW9jayBnZW5lcmF0ZXMgd2FybmluZ3MgZm9yIHVuaW50ZXJlc3RpbmcgY2FsbHMuCi1URVNUKE5hZ2d5TW9ja1Rlc3QsIFdhcm5pbmdGb3JVbmludGVyZXN0aW5nQ2FsbCkgewotICBjb25zdCBzdHJpbmcgc2F2ZWRfZmxhZyA9IEdNT0NLX0ZMQUcodmVyYm9zZSk7Ci0gIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSAid2FybmluZyI7Ci0KLSAgTmFnZ3lNb2NrPE1vY2tGb28+IG5hZ2d5X2ZvbzsKLQotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIG5hZ2d5X2Zvby5Eb1RoaXMoKTsKLSAgbmFnZ3lfZm9vLkRvVGhhdCh0cnVlKTsKLSAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRvdXQoKSwKLSAgICAgICAgICAgICAgSGFzU3Vic3RyKCJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpKTsKLQotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gc2F2ZWRfZmxhZzsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIG5hZ2d5IG1vY2sgZ2VuZXJhdGVzIGEgd2FybmluZyBmb3IgYW4gdW5pbnRlcmVzdGluZyBjYWxsCi0vLyB0aGF0IGRlbGV0ZXMgdGhlIG1vY2sgb2JqZWN0LgotVEVTVChOYWdneU1vY2tUZXN0LCBXYXJuaW5nRm9yVW5pbnRlcmVzdGluZ0NhbGxBZnRlckRlYXRoKSB7Ci0gIGNvbnN0IHN0cmluZyBzYXZlZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJ3YXJuaW5nIjsKLQotICBOYWdneU1vY2s8TW9ja0Zvbz4qIGNvbnN0IG5hZ2d5X2ZvbyA9IG5ldyBOYWdneU1vY2s8TW9ja0Zvbz47Ci0KLSAgT05fQ0FMTCgqbmFnZ3lfZm9vLCBEb1RoaXMoKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZShuYWdneV9mb28sICZNb2NrRm9vOjpEZWxldGUpKTsKLQotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIG5hZ2d5X2Zvby0+RG9UaGlzKCk7Ci0gIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3Rkb3V0KCksCi0gICAgICAgICAgICAgIEhhc1N1YnN0cigiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwiKSk7Ci0KLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX2ZsYWc7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBUZXN0cyB0aGF0IGEgbmFnZ3kgbW9jayBhbGxvd3MgZXhwZWN0ZWQgY2FsbHMuCi1URVNUKE5hZ2d5TW9ja1Rlc3QsIEFsbG93c0V4cGVjdGVkQ2FsbCkgewotICBOYWdneU1vY2s8TW9ja0Zvbz4gbmFnZ3lfZm9vOwotCi0gIEVYUEVDVF9DQUxMKG5hZ2d5X2ZvbywgRG9UaGlzKCkpOwotICBuYWdneV9mb28uRG9UaGlzKCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYW4gdW5leHBlY3RlZCBjYWxsIG9uIGEgbmFnZ3kgbW9jayBmYWlscy4KLVRFU1QoTmFnZ3lNb2NrVGVzdCwgVW5leHBlY3RlZENhbGxGYWlscykgewotICBOYWdneU1vY2s8TW9ja0Zvbz4gbmFnZ3lfZm9vOwotCi0gIEVYUEVDVF9DQUxMKG5hZ2d5X2ZvbywgRG9UaGlzKCkpLlRpbWVzKDApOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShuYWdneV9mb28uRG9UaGlzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTmFnZ3lNb2NrIHdvcmtzIHdpdGggYSBtb2NrIGNsYXNzIHRoYXQgaGFzIGEgbm9uLWRlZmF1bHQKLS8vIGNvbnN0cnVjdG9yLgotVEVTVChOYWdneU1vY2tUZXN0LCBOb25EZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgTmFnZ3lNb2NrPE1vY2tCYXI+IG5hZ2d5X2JhcigiaGkiKTsKLSAgRVhQRUNUX0VRKCJoaSIsIG5hZ2d5X2Jhci5zdHIoKSk7Ci0KLSAgbmFnZ3lfYmFyLlRoaXMoKTsKLSAgbmFnZ3lfYmFyLlRoYXQoNSwgdHJ1ZSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgTmFnZ3lNb2NrIHdvcmtzIHdpdGggYSBtb2NrIGNsYXNzIHRoYXQgaGFzIGEgMTAtYXJ5Ci0vLyBub24tZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLVRFU1QoTmFnZ3lNb2NrVGVzdCwgTm9uRGVmYXVsdENvbnN0cnVjdG9yMTApIHsKLSAgTmFnZ3lNb2NrPE1vY2tCYXI+IG5hZ2d5X2JhcignMCcsICcxJywgIjIiLCAiMyIsICc0JywgJzUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2IiwgIjciLCB0cnVlLCBmYWxzZSk7Ci0gIEVYUEVDVF9FUSgiMDEyMzQ1NjdURiIsIG5hZ2d5X2Jhci5zdHIoKSk7Ci0KLSAgbmFnZ3lfYmFyLlRoaXMoKTsKLSAgbmFnZ3lfYmFyLlRoYXQoNSwgdHJ1ZSk7Ci19Ci0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTiAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLS8vIFRlc3RzIHRoYXQgTmFnZ3lNb2NrPE1vY2s+IGNvbXBpbGVzIHdoZXJlIE1vY2sgaXMgYSB1c2VyLWRlZmluZWQKLS8vIGNsYXNzIChhcyBvcHBvc2VkIHRvIDo6dGVzdGluZzo6TW9jaykuICBXZSBoYWQgdG8gd29yayBhcm91bmQgYW4KLS8vIE1TVkMgOC4wIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgc3ltYm9sIE1vY2sgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZgotLy8gTmFnZ3lNb2NrIHRvIGJlIGxvb2tlZCB1cCBpbiB0aGUgd3JvbmcgY29udGV4dCwgYW5kIHRoaXMgdGVzdAotLy8gZW5zdXJlcyB0aGF0IG91ciBmaXggd29ya3MuCi0vLwotLy8gV2UgaGF2ZSB0byBza2lwIHRoaXMgdGVzdCBvbiBTeW1iaWFuIGFuZCBXaW5kb3dzIE1vYmlsZSwgYXMgaXQKLS8vIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBjcmFzaCB0aGVyZSwgZm9yIHJlYXNvbnMgdW5jbGVhciB0byB1cyB5ZXQuCi1URVNUKE5hZ2d5TW9ja1Rlc3QsIEFjY2VwdHNDbGFzc05hbWVkTW9jaykgewotICBOYWdneU1vY2s8IDo6TW9jaz4gbmFnZ3k7Ci0gIEVYUEVDVF9DQUxMKG5hZ2d5LCBEb1RoaXMoKSk7Ci0gIG5hZ2d5LkRvVGhpcygpOwotfQotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTiAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotLy8gVGVzdHMgdGhhdCBhIHN0cmljdCBtb2NrIGFsbG93cyBleHBlY3RlZCBjYWxscy4KLVRFU1QoU3RyaWN0TW9ja1Rlc3QsIEFsbG93c0V4cGVjdGVkQ2FsbCkgewotICBTdHJpY3RNb2NrPE1vY2tGb28+IHN0cmljdF9mb287Ci0KLSAgRVhQRUNUX0NBTEwoc3RyaWN0X2ZvbywgRG9UaGlzKCkpOwotICBzdHJpY3RfZm9vLkRvVGhpcygpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFuIHVuZXhwZWN0ZWQgY2FsbCBvbiBhIHN0cmljdCBtb2NrIGZhaWxzLgotVEVTVChTdHJpY3RNb2NrVGVzdCwgVW5leHBlY3RlZENhbGxGYWlscykgewotICBTdHJpY3RNb2NrPE1vY2tGb28+IHN0cmljdF9mb287Ci0KLSAgRVhQRUNUX0NBTEwoc3RyaWN0X2ZvbywgRG9UaGlzKCkpLlRpbWVzKDApOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdHJpY3RfZm9vLkRvVGhpcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFuIHVuaW50ZXJlc3RpbmcgY2FsbCBvbiBhIHN0cmljdCBtb2NrIGZhaWxzLgotVEVTVChTdHJpY3RNb2NrVGVzdCwgVW5pbnRlcmVzdGluZ0NhbGxGYWlscykgewotICBTdHJpY3RNb2NrPE1vY2tGb28+IHN0cmljdF9mb287Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RyaWN0X2Zvby5Eb1RoaXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYW4gdW5pbnRlcmVzdGluZyBjYWxsIG9uIGEgc3RyaWN0IG1vY2sgZmFpbHMsIGV2ZW4gaWYKLS8vIHRoZSBjYWxsIGRlbGV0ZXMgdGhlIG1vY2sgb2JqZWN0LgotVEVTVChTdHJpY3RNb2NrVGVzdCwgVW5pbnRlcmVzdGluZ0NhbGxGYWlsc0FmdGVyRGVhdGgpIHsKLSAgU3RyaWN0TW9jazxNb2NrRm9vPiogY29uc3Qgc3RyaWN0X2ZvbyA9IG5ldyBTdHJpY3RNb2NrPE1vY2tGb28+OwotCi0gIE9OX0NBTEwoKnN0cmljdF9mb28sIERvVGhpcygpKQotICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKHN0cmljdF9mb28sICZNb2NrRm9vOjpEZWxldGUpKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdHJpY3RfZm9vLT5Eb1RoaXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU3RyaWN0TW9jayB3b3JrcyB3aXRoIGEgbW9jayBjbGFzcyB0aGF0IGhhcyBhCi0vLyBub24tZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLVRFU1QoU3RyaWN0TW9ja1Rlc3QsIE5vbkRlZmF1bHRDb25zdHJ1Y3RvcikgewotICBTdHJpY3RNb2NrPE1vY2tCYXI+IHN0cmljdF9iYXIoImhpIik7Ci0gIEVYUEVDVF9FUSgiaGkiLCBzdHJpY3RfYmFyLnN0cigpKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdHJpY3RfYmFyLlRoYXQoNSwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotfQotCi0vLyBUZXN0cyB0aGF0IFN0cmljdE1vY2sgd29ya3Mgd2l0aCBhIG1vY2sgY2xhc3MgdGhhdCBoYXMgYSAxMC1hcnkKLS8vIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9yLgotVEVTVChTdHJpY3RNb2NrVGVzdCwgTm9uRGVmYXVsdENvbnN0cnVjdG9yMTApIHsKLSAgU3RyaWN0TW9jazxNb2NrQmFyPiBzdHJpY3RfYmFyKCdhJywgJ2InLCAiYyIsICJkIiwgJ2UnLCAnZicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIsICJoIiwgdHJ1ZSwgZmFsc2UpOwotICBFWFBFQ1RfRVEoImFiY2RlZmdoVEYiLCBzdHJpY3RfYmFyLnN0cigpKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdHJpY3RfYmFyLlRoYXQoNSwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotfQotCi0jaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBUZXN0cyB0aGF0IFN0cmljdE1vY2s8TW9jaz4gY29tcGlsZXMgd2hlcmUgTW9jayBpcyBhIHVzZXItZGVmaW5lZAotLy8gY2xhc3MgKGFzIG9wcG9zZWQgdG8gOjp0ZXN0aW5nOjpNb2NrKS4gIFdlIGhhZCB0byB3b3JrIGFyb3VuZCBhbgotLy8gTVNWQyA4LjAgYnVnIHRoYXQgY2F1c2VkIHRoZSBzeW1ib2wgTW9jayB1c2VkIGluIHRoZSBkZWZpbml0aW9uIG9mCi0vLyBTdHJpY3RNb2NrIHRvIGJlIGxvb2tlZCB1cCBpbiB0aGUgd3JvbmcgY29udGV4dCwgYW5kIHRoaXMgdGVzdAotLy8gZW5zdXJlcyB0aGF0IG91ciBmaXggd29ya3MuCi0vLwotLy8gV2UgaGF2ZSB0byBza2lwIHRoaXMgdGVzdCBvbiBTeW1iaWFuIGFuZCBXaW5kb3dzIE1vYmlsZSwgYXMgaXQKLS8vIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBjcmFzaCB0aGVyZSwgZm9yIHJlYXNvbnMgdW5jbGVhciB0byB1cyB5ZXQuCi1URVNUKFN0cmljdE1vY2tUZXN0LCBBY2NlcHRzQ2xhc3NOYW1lZE1vY2spIHsKLSAgU3RyaWN0TW9jazwgOjpNb2NrPiBzdHJpY3Q7Ci0gIEVYUEVDVF9DQUxMKHN0cmljdCwgRG9UaGlzKCkpOwotICBzdHJpY3QuRG9UaGlzKCk7Ci19Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi19ICAvLyBuYW1lc3BhY2UgZ21vY2tfbmljZV9zdHJpY3RfdGVzdAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1wb3J0X3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stcG9ydF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE4ZDQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1wb3J0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBpbnRlcm5hbCBjcm9zcy1wbGF0Zm9ybSBzdXBwb3J0IHV0aWxpdGllcy4KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0vLyBOT1RFOiBpZiB0aGlzIGZpbGUgaXMgbGVmdCB3aXRob3V0IHRlc3RzIGZvciBzb21lIHJlYXNvbiwgcHV0IGEgZHVtbXkKLS8vIHRlc3QgaGVyZSB0byBtYWtlIHJlZmVyZW5jZXMgdG8gc3ltYm9scyBpbiB0aGUgZ3Rlc3QgbGlicmFyeSBhbmQgYXZvaWQKLS8vICd1bmRlZmluZWQgc3ltYm9sJyBsaW5rZXIgZXJyb3JzIGluIGdtb2NrX21haW46Ci0KLVRFU1QoRHVtbXlUZXN0LCBEdW1teSkge30KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2stc3BlYy1idWlsZGVyc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJjMjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgdGhlIHNwZWMgYnVpbGRlciBzeW50YXguCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiCi0KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIHRoZSBFeHBlY3RhdGlvbiBjbGFzcyB0ZW1wbGF0ZS4KLWNsYXNzIEV4cGVjdGF0aW9uVGVzdGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFNldHMgdGhlIGNhbGwgY291bnQgb2YgdGhlIGdpdmVuIGV4cGVjdGF0aW9uIHRvIHRoZSBnaXZlbiBudW1iZXIuCi0gIHZvaWQgU2V0Q2FsbENvdW50KGludCBuLCBFeHBlY3RhdGlvbkJhc2UqIGV4cCkgewotICAgIGV4cC0+Y2FsbF9jb3VudF8gPSBuOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyB0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgdGVzdGluZzo6QXRNb3N0OwotdXNpbmcgdGVzdGluZzo6QmV0d2VlbjsKLXVzaW5nIHRlc3Rpbmc6OkNhcmRpbmFsaXR5OwotdXNpbmcgdGVzdGluZzo6Q2FyZGluYWxpdHlJbnRlcmZhY2U7Ci11c2luZyB0ZXN0aW5nOjpDb250YWluc1JlZ2V4OwotdXNpbmcgdGVzdGluZzo6Q29uc3Q7Ci11c2luZyB0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIHRlc3Rpbmc6OkRvRGVmYXVsdDsKLXVzaW5nIHRlc3Rpbmc6OkVxOwotdXNpbmcgdGVzdGluZzo6RXhwZWN0YXRpb247Ci11c2luZyB0ZXN0aW5nOjpFeHBlY3RhdGlvblNldDsKLXVzaW5nIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSk7Ci11c2luZyB0ZXN0aW5nOjpHdDsKLXVzaW5nIHRlc3Rpbmc6OkluU2VxdWVuY2U7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2VXaXRob3V0QXJnczsKLXVzaW5nIHRlc3Rpbmc6OklzTm90U3Vic3RyaW5nOwotdXNpbmcgdGVzdGluZzo6SXNTdWJzdHJpbmc7Ci11c2luZyB0ZXN0aW5nOjpMdDsKLXVzaW5nIHRlc3Rpbmc6Ok1lc3NhZ2U7Ci11c2luZyB0ZXN0aW5nOjpNb2NrOwotdXNpbmcgdGVzdGluZzo6TmFnZ3lNb2NrOwotdXNpbmcgdGVzdGluZzo6TmU7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpTZXF1ZW5jZTsKLXVzaW5nIHRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RXhwZWN0YXRpb25UZXN0ZXI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtFcnJvclZlcmJvc2l0eTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjprSW5mb1ZlcmJvc2l0eTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjprV2FybmluZ1ZlcmJvc2l0eTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZzsKLQotI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLXVzaW5nIHRlc3Rpbmc6Okhhc1N1YnN0cjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3Rkb3V0OwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3Rkb3V0OwotI2VuZGlmCi0KLWNsYXNzIEluY29tcGxldGU7Ci0KLWNsYXNzIE1vY2tJbmNvbXBsZXRlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgbGluZSB2ZXJpZmllcyB0aGF0IGEgbW9jayBtZXRob2QgY2FuIHRha2UgYSBieS1yZWZlcmVuY2UKLSAgLy8gYXJndW1lbnQgb2YgYW4gaW5jb21wbGV0ZSB0eXBlLgotICBNT0NLX01FVEhPRDEoQnlSZWZGdW5jLCB2b2lkKGNvbnN0IEluY29tcGxldGUmIHgpKTsKLX07Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIGhvdyB0byBwcmludCBhIHZhbHVlIG9mIHR5cGUgSW5jb21wbGV0ZS4KLXZvaWQgUHJpbnRUbyhjb25zdCBJbmNvbXBsZXRlJiB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi1URVNUKE1vY2tNZXRob2RUZXN0LCBDYW5JbnN0YW50aWF0ZVdpdGhJbmNvbXBsZXRlQXJnVHlwZSkgewotICAvLyBFdmVuIHRob3VnaCB0aGlzIG1vY2sgY2xhc3MgY29udGFpbnMgYSBtb2NrIG1ldGhvZCB0aGF0IHRha2VzCi0gIC8vIGJ5LXJlZmVyZW5jZSBhbiBhcmd1bWVudCB3aG9zZSB0eXBlIGlzIGluY29tcGxldGUsIHdlIGNhbiBzdGlsbAotICAvLyB1c2UgdGhlIG1vY2ssIGFzIGxvbmcgYXMgR29vZ2xlIE1vY2sga25vd3MgaG93IHRvIHByaW50IHRoZQotICAvLyBhcmd1bWVudC4KLSAgTW9ja0luY29tcGxldGUgaW5jb21wbGV0ZTsKLSAgRVhQRUNUX0NBTEwoaW5jb21wbGV0ZSwgQnlSZWZGdW5jKF8pKQotICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLX0KLQotLy8gVGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW50ZXIgZm9yIHRoZSBhcmd1bWVudCB0eXBlIGRvZXNuJ3QgaGF2ZSB0bwotLy8gYmUgdmlzaWJsZSB3aGVyZSB0aGUgbW9jayBpcyB1c2VkLgotdm9pZCBQcmludFRvKGNvbnN0IEluY29tcGxldGUmIC8qIHggKi8sIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgImluY29tcGxldGUiOwotfQotCi1jbGFzcyBSZXN1bHQge307Ci0KLS8vIEEgdHlwZSB0aGF0J3Mgbm90IGRlZmF1bHQgY29uc3RydWN0aWJsZS4KLWNsYXNzIE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKGludCAvKiBkdW1teSAqLykge30KLX07Ci0KLWNsYXNzIE1vY2tBIHsKLSBwdWJsaWM6Ci0gIE1vY2tBKCkge30KLQotICBNT0NLX01FVEhPRDEoRG9BLCB2b2lkKGludCBuKSk7Ci0gIE1PQ0tfTUVUSE9EMShSZXR1cm5SZXN1bHQsIFJlc3VsdChpbnQgbikpOwotICBNT0NLX01FVEhPRDAoUmV0dXJuTm9uRGVmYXVsdENvbnN0cnVjdGlibGUsIE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCkpOwotICBNT0NLX01FVEhPRDIoQmluYXJ5LCBib29sKGludCB4LCBpbnQgeSkpOwotICBNT0NLX01FVEhPRDIoUmV0dXJuSW50LCBpbnQoaW50IHgsIGludCB5KSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tBKTsKLX07Ci0KLWNsYXNzIE1vY2tCIHsKLSBwdWJsaWM6Ci0gIE1vY2tCKCkge30KLQotICBNT0NLX0NPTlNUX01FVEhPRDAoRG9CLCBpbnQoKSk7ICAvLyBOT0xJTlQKLSAgTU9DS19NRVRIT0QxKERvQiwgaW50KGludCBuKSk7ICAvLyBOT0xJTlQKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0IpOwotfTsKLQotY2xhc3MgUmVmZXJlbmNlSG9sZGluZ01vY2sgewotIHB1YmxpYzoKLSAgUmVmZXJlbmNlSG9sZGluZ01vY2soKSB7fQotCi0gIE1PQ0tfTUVUSE9EMShBY2NlcHRSZWZlcmVuY2UsIHZvaWQobGlua2VkX3B0cjxNb2NrQT4qKSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJlZmVyZW5jZUhvbGRpbmdNb2NrKTsKLX07Ci0KLS8vIFRlc3RzIHRoYXQgRVhQRUNUX0NBTEwgYW5kIE9OX0NBTEwgY29tcGlsZSBpbiBhIHByZXNlbmNlIG9mIG1hY3JvCi0vLyByZWRlZmluaW5nIGEgbW9jayBtZXRob2QgbmFtZS4gVGhpcyBjb3VsZCBoYXBwZW4sIGZvciBleGFtcGxlLCB3aGVuCi0vLyB0aGUgdGVzdGVkIGNvZGUgI2luY2x1ZGVzIFdpbjMyIEFQSSBoZWFkZXJzIHdoaWNoIGRlZmluZSBtYW55IEFQSXMKLS8vIGFzIG1hY3JvcywgZS5nLiAjZGVmaW5lIFRleHRPdXQgVGV4dE91dFcuCi0KLSNkZWZpbmUgTWV0aG9kIE1ldGhvZFcKLQotY2xhc3MgQ0MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q0MoKSB7fQotICB2aXJ0dWFsIGludCBNZXRob2QoKSA9IDA7Ci19OwotY2xhc3MgTW9ja0NDIDogcHVibGljIENDIHsKLSBwdWJsaWM6Ci0gIE1vY2tDQygpIHt9Ci0KLSAgTU9DS19NRVRIT0QwKE1ldGhvZCwgaW50KCkpOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrQ0MpOwotfTsKLQotLy8gVGVzdHMgdGhhdCBhIG1ldGhvZCB3aXRoIGV4cGFuZGVkIG5hbWUgY29tcGlsZXMuCi1URVNUKE9uQ2FsbFN5bnRheFRlc3QsIENvbXBpbGVzV2l0aE1ldGhvZE5hbWVFeHBhbmRlZEZyb21NYWNybykgewotICBNb2NrQ0MgY2M7Ci0gIE9OX0NBTEwoY2MsIE1ldGhvZCgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgbWV0aG9kIHdpdGggZXhwYW5kZWQgbmFtZSBub3Qgb25seSBjb21waWxlcyBidXQgcnVucwotLy8gYW5kIHJldHVybnMgYSBjb3JyZWN0IHZhbHVlLCB0b28uCi1URVNUKE9uQ2FsbFN5bnRheFRlc3QsIFdvcmtzV2l0aE1ldGhvZE5hbWVFeHBhbmRlZEZyb21NYWNybykgewotICBNb2NrQ0MgY2M7Ci0gIE9OX0NBTEwoY2MsIE1ldGhvZCgpKS5XaWxsQnlEZWZhdWx0KFJldHVybig0MikpOwotICBFWFBFQ1RfRVEoNDIsIGNjLk1ldGhvZCgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIG1ldGhvZCB3aXRoIGV4cGFuZGVkIG5hbWUgY29tcGlsZXMuCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBDb21waWxlc1dpdGhNZXRob2ROYW1lRXhwYW5kZWRGcm9tTWFjcm8pIHsKLSAgTW9ja0NDIGNjOwotICBFWFBFQ1RfQ0FMTChjYywgTWV0aG9kKCkpOwotICBjYy5NZXRob2QoKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBpdCB3b3JrcywgdG9vLgotVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV29ya3NXaXRoTWV0aG9kTmFtZUV4cGFuZGVkRnJvbU1hY3JvKSB7Ci0gIE1vY2tDQyBjYzsKLSAgRVhQRUNUX0NBTEwoY2MsIE1ldGhvZCgpKS5XaWxsT25jZShSZXR1cm4oNDIpKTsKLSAgRVhQRUNUX0VRKDQyLCBjYy5NZXRob2QoKSk7Ci19Ci0KLSN1bmRlZiBNZXRob2QgIC8vIERvbmUgd2l0aCBtYWNybyByZWRlZmluaXRpb24gdGVzdHMuCi0KLS8vIFRlc3RzIHRoYXQgT05fQ0FMTCBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UgYXMgcHJvbWlzZWQKLS8vIGJ5IEdvb2dsZSBNb2NrLgotVEVTVChPbkNhbGxTeW50YXhUZXN0LCBFdmFsdWF0ZXNGaXJzdEFyZ3VtZW50T25jZSkgewotICBNb2NrQSBhOwotICBNb2NrQSogcGEgPSAmYTsKLQotICBPTl9DQUxMKCpwYSsrLCBEb0EoXykpOwotICBFWFBFQ1RfRVEoJmEgKyAxLCBwYSk7Ci19Ci0KLVRFU1QoT25DYWxsU3ludGF4VGVzdCwgRXZhbHVhdGVzU2Vjb25kQXJndW1lbnRPbmNlKSB7Ci0gIE1vY2tBIGE7Ci0gIGludCBuID0gMDsKLQotICBPTl9DQUxMKGEsIERvQShuKyspKTsKLSAgRVhQRUNUX0VRKDEsIG4pOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBzeW50YXggb2YgT05fQ0FMTCgpIGlzIGVuZm9yY2VkIGF0IHJ1biB0aW1lLgotCi1URVNUKE9uQ2FsbFN5bnRheFRlc3QsIFdpdGhJc09wdGlvbmFsKSB7Ci0gIE1vY2tBIGE7Ci0KLSAgT05fQ0FMTChhLCBEb0EoNSkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci0gIE9OX0NBTEwoYSwgRG9BKF8pKQotICAgICAgLldpdGgoXykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotVEVTVChPbkNhbGxTeW50YXhUZXN0LCBXaXRoQ2FuQXBwZWFyQXRNb3N0T25jZSkgewotICBNb2NrQSBhOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIE9OX0NBTEwoYSwgUmV0dXJuUmVzdWx0KF8pKQotICAgICAgICAuV2l0aChfKQotICAgICAgICAuV2l0aChfKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oUmVzdWx0KCkpKTsKLSAgfSwgIi5XaXRoKCkgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhbiBPTl9DQUxMKCkiKTsKLX0KLQotVEVTVChPbkNhbGxTeW50YXhUZXN0LCBXaWxsQnlEZWZhdWx0SXNNYW5kYXRvcnkpIHsKLSAgTW9ja0EgYTsKLQotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKLSAgICBPTl9DQUxMKGEsIERvQSg1KSk7Ci0gICAgYS5Eb0EoNSk7Ci0gIH0sICIiKTsKLX0KLQotVEVTVChPbkNhbGxTeW50YXhUZXN0LCBXaWxsQnlEZWZhdWx0Q2FuQXBwZWFyQXRNb3N0T25jZSkgewotICBNb2NrQSBhOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIE9OX0NBTEwoYSwgRG9BKDUpKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotICB9LCAiLldpbGxCeURlZmF1bHQoKSBtdXN0IGFwcGVhciBleGFjdGx5IG9uY2UgaW4gYW4gT05fQ0FMTCgpIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRVhQRUNUX0NBTEwgZXZhbHVhdGVzIGl0cyBhcmd1bWVudHMgZXhhY3RseSBvbmNlIGFzCi0vLyBwcm9taXNlZCBieSBHb29nbGUgTW9jay4KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIEV2YWx1YXRlc0ZpcnN0QXJndW1lbnRPbmNlKSB7Ci0gIE1vY2tBIGE7Ci0gIE1vY2tBKiBwYSA9ICZhOwotCi0gIEVYUEVDVF9DQUxMKCpwYSsrLCBEb0EoXykpOwotICBhLkRvQSgwKTsKLSAgRVhQRUNUX0VRKCZhICsgMSwgcGEpOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBFdmFsdWF0ZXNTZWNvbmRBcmd1bWVudE9uY2UpIHsKLSAgTW9ja0EgYTsKLSAgaW50IG4gPSAwOwotCi0gIEVYUEVDVF9DQUxMKGEsIERvQShuKyspKTsKLSAgYS5Eb0EoMCk7Ci0gIEVYUEVDVF9FUSgxLCBuKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgc3ludGF4IG9mIEVYUEVDVF9DQUxMKCkgaXMgZW5mb3JjZWQgYXQgcnVuIHRpbWUuCi0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpdGhJc09wdGlvbmFsKSB7Ci0gIE1vY2tBIGE7Ci0KLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDUpKQotICAgICAgLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoNikpCi0gICAgICAuV2l0aChfKQotICAgICAgLlRpbWVzKDApOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBXaXRoQ2FuQXBwZWFyQXRNb3N0T25jZSkgewotICBNb2NrQSBhOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9DQUxMKGEsIERvQSg2KSkKLSAgICAgICAgLldpdGgoXykKLSAgICAgICAgLldpdGgoXyk7Ci0gIH0sICIuV2l0aCgpIGNhbm5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKSIpOwotCi0gIGEuRG9BKDYpOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBXaXRoTXVzdEJlRmlyc3RDbGF1c2UpIHsKLSAgTW9ja0EgYTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2l0aChfKTsKLSAgfSwgIi5XaXRoKCkgbXVzdCBiZSB0aGUgZmlyc3QgY2xhdXNlIGluIGFuIEVYUEVDVF9DQUxMKCkiKTsKLQotICBhLkRvQSgxKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oKSkKLSAgICAgICAgLldpdGgoXyk7Ci0gIH0sICIuV2l0aCgpIG11c3QgYmUgdGhlIGZpcnN0IGNsYXVzZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpIik7Ci0KLSAgYS5Eb0EoMik7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFRpbWVzQ2FuQmVJbmZlcnJlZCkgewotICBNb2NrQSBhOwotCi0gIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oKSk7Ci0KLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigpKTsKLQotICBhLkRvQSgxKTsKLSAgYS5Eb0EoMik7Ci0gIGEuRG9BKDIpOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBUaW1lc0NhbkFwcGVhckF0TW9zdE9uY2UpIHsKLSAgTW9ja0EgYTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuVGltZXMoMik7Ci0gIH0sICIuVGltZXMoKSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkiKTsKLQotICBhLkRvQSgxKTsKLSAgYS5Eb0EoMSk7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFRpbWVzTXVzdEJlQmVmb3JlSW5TZXF1ZW5jZSkgewotICBNb2NrQSBhOwotICBTZXF1ZW5jZSBzOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKLSAgICAgICAgLkluU2VxdWVuY2UocykKLSAgICAgICAgLlRpbWVzKDEpOwotICB9LCAiLlRpbWVzKCkgY2Fubm90IGFwcGVhciBhZnRlciAiKTsKLQotICBhLkRvQSgxKTsKLX0KLQotVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgSW5TZXF1ZW5jZUlzT3B0aW9uYWwpIHsKLSAgTW9ja0EgYTsKLSAgU2VxdWVuY2UgczsKLQotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCi0gICAgICAuSW5TZXF1ZW5jZShzKTsKLQotICBhLkRvQSgxKTsKLSAgYS5Eb0EoMik7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIEluU2VxdWVuY2VDYW5BcHBlYXJNdWx0aXBsZVRpbWVzKSB7Ci0gIE1vY2tBIGE7Ci0gIFNlcXVlbmNlIHMxLCBzMjsKLQotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAuSW5TZXF1ZW5jZShzMSwgczIpCi0gICAgICAuSW5TZXF1ZW5jZShzMSk7Ci0KLSAgYS5Eb0EoMSk7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIEluU2VxdWVuY2VNdXN0QmVCZWZvcmVBZnRlcikgewotICBNb2NrQSBhOwotICBTZXF1ZW5jZSBzOwotCi0gIEV4cGVjdGF0aW9uIGUgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCi0gICAgICAgIC5BZnRlcihlKQotICAgICAgICAuSW5TZXF1ZW5jZShzKTsKLSAgfSwgIi5JblNlcXVlbmNlKCkgY2Fubm90IGFwcGVhciBhZnRlciAiKTsKLQotICBhLkRvQSgyKTsKLX0KLQotVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgSW5TZXF1ZW5jZU11c3RCZUJlZm9yZVdpbGxPbmNlKSB7Ci0gIE1vY2tBIGE7Ci0gIFNlcXVlbmNlIHM7Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpCi0gICAgICAgIC5JblNlcXVlbmNlKHMpOwotICB9LCAiLkluU2VxdWVuY2UoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIpOwotCi0gIGEuRG9BKDEpOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBBZnRlck11c3RCZUJlZm9yZVdpbGxPbmNlKSB7Ci0gIE1vY2tBIGE7Ci0KLSAgRXhwZWN0YXRpb24gZSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oKSkKLSAgICAgICAgLkFmdGVyKGUpOwotICB9LCAiLkFmdGVyKCkgY2Fubm90IGFwcGVhciBhZnRlciAiKTsKLQotICBhLkRvQSgxKTsKLSAgYS5Eb0EoMik7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpbGxJc09wdGlvbmFsKSB7Ci0gIE1vY2tBIGE7Ci0KLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKTsKLQotICBhLkRvQSgxKTsKLSAgYS5Eb0EoMik7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpbGxDYW5BcHBlYXJNdWx0aXBsZVRpbWVzKSB7Ci0gIE1vY2tBIGE7Ci0KLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQotICAgICAgLlRpbWVzKEFueU51bWJlcigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKTsKLX0KLQotVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2lsbE11c3RCZUJlZm9yZVdpbGxSZXBlYXRlZGx5KSB7Ci0gIE1vY2tBIGE7Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oKSk7Ci0gIH0sICIuV2lsbE9uY2UoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIpOwotCi0gIGEuRG9BKDEpOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBXaWxsUmVwZWF0ZWRseUlzT3B0aW9uYWwpIHsKLSAgTW9ja0EgYTsKLQotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpOwotCi0gIGEuRG9BKDEpOwotICBhLkRvQSgyKTsKLSAgYS5Eb0EoMik7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpbGxSZXBlYXRlZGx5Q2Fubm90QXBwZWFyTXVsdGlwbGVUaW1lcykgewotICBNb2NrQSBhOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpOwotICB9LCAiLldpbGxSZXBlYXRlZGx5KCkgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhbiAiCi0gICAgICJFWFBFQ1RfQ0FMTCgpIik7Ci19Ci0KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpbGxSZXBlYXRlZGx5TXVzdEJlQmVmb3JlUmV0aXJlc09uU2F0dXJhdGlvbikgewotICBNb2NrQSBhOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKLSAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpOwotICB9LCAiLldpbGxSZXBlYXRlZGx5KCkgY2Fubm90IGFwcGVhciBhZnRlciAiKTsKLX0KLQotVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgUmV0aXJlc09uU2F0dXJhdGlvbklzT3B0aW9uYWwpIHsKLSAgTW9ja0EgYTsKLQotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotCi0gIGEuRG9BKDEpOwotICBhLkRvQSgxKTsKLX0KLQotVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgUmV0aXJlc09uU2F0dXJhdGlvbkNhbm5vdEFwcGVhck11bHRpcGxlVGltZXMpIHsKLSAgTW9ja0EgYTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkKLSAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgfSwgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZSIpOwotCi0gIGEuRG9BKDEpOwotfQotCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBEZWZhdWx0Q2FyZGluYWxpdHlJc09uY2UpIHsKLSAgewotICAgIE1vY2tBIGE7Ci0gICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgICBhLkRvQSgxKTsKLSAgfQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBNb2NrQSBhOwotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIH0sICJ0byBiZSBjYWxsZWQgb25jZSIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBNb2NrQSBhOwotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gICAgYS5Eb0EoMSk7Ci0gICAgYS5Eb0EoMSk7Ci0gIH0sICJ0byBiZSBjYWxsZWQgb25jZSIpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIGRvZXNuJ3QgcHJpbnQgYSB3YXJuaW5nIHdoZW4gdGhlIG51bWJlciBvZgotLy8gV2lsbE9uY2UoKSBpcyBhZGVxdWF0ZS4KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIERvZXNOb3RXYXJuT25BZGVxdWF0ZUFjdGlvbkNvdW50KSB7Ci0gIENhcHR1cmVTdGRvdXQoKTsKLSAgewotICAgIE1vY2tCIGI7Ci0KLSAgICAvLyBJdCdzIGFsd2F5cyBmaW5lIHRvIG9taXQgV2lsbE9uY2UoKSBlbnRpcmVseS4KLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKLSAgICAgICAgLlRpbWVzKDApOwotICAgIEVYUEVDVF9DQUxMKGIsIERvQigxKSkKLSAgICAgICAgLlRpbWVzKEF0TW9zdCgxKSk7Ci0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKDIpKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigxKSk7Ci0KLSAgICAvLyBJdCdzIGZpbmUgZm9yIHRoZSBudW1iZXIgb2YgV2lsbE9uY2UoKXMgdG8gZXF1YWwgdGhlIHVwcGVyIGJvdW5kLgotICAgIEVYUEVDVF9DQUxMKGIsIERvQigzKSkKLSAgICAgICAgLlRpbWVzKEJldHdlZW4oMSwgMikpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOwotCi0gICAgLy8gSXQncyBmaW5lIGZvciB0aGUgbnVtYmVyIG9mIFdpbGxPbmNlKClzIHRvIGJlIHNtYWxsZXIgdGhhbiB0aGUKLSAgICAvLyB1cHBlciBib3VuZCB3aGVuIHRoZXJlIGlzIGEgV2lsbFJlcGVhdGVkbHkoKS4KLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoNCkpCi0gICAgICAgIC5UaW1lcyhBdE1vc3QoMykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOwotCi0gICAgLy8gU2F0aXNmaWVzIHRoZSBhYm92ZSBleHBlY3RhdGlvbnMuCi0gICAgYi5Eb0IoMik7Ci0gICAgYi5Eb0IoMyk7Ci0gIH0KLSAgRVhQRUNUX1NUUkVRKCIiLCBHZXRDYXB0dXJlZFN0ZG91dCgpLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIHdhcm5zIG9uIGhhdmluZyB0b28gbWFueSBhY3Rpb25zIGluIGFuCi0vLyBleHBlY3RhdGlvbiBjb21wYXJlZCB0byBpdHMgY2FyZGluYWxpdHkuCi1URVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBXYXJuc09uVG9vTWFueUFjdGlvbnMpIHsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICB7Ci0gICAgTW9ja0IgYjsKLQotICAgIC8vIFdhcm5zIHdoZW4gdGhlIG51bWJlciBvZiBXaWxsT25jZSgpcyBpcyBsYXJnZXIgdGhhbiB0aGUgdXBwZXIgYm91bmQuCi0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAgIC5UaW1lcygwKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsgIC8vICMxCi0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAgIC5UaW1lcyhBdE1vc3QoMSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOyAgLy8gIzIKLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoMSkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKQotICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOyAgLy8gIzMKLQotICAgIC8vIFdhcm5zIHdoZW4gdGhlIG51bWJlciBvZiBXaWxsT25jZSgpcyBlcXVhbHMgdGhlIHVwcGVyIGJvdW5kIGFuZAotICAgIC8vIHRoZXJlIGlzIGEgV2lsbFJlcGVhdGVkbHkoKS4KLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKLSAgICAgICAgLlRpbWVzKDApCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMSkpOyAgLy8gIzQKLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoMikpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIpKTsgIC8vICM1Ci0KLSAgICAvLyBTYXRpc2ZpZXMgdGhlIGFib3ZlIGV4cGVjdGF0aW9ucy4KLSAgICBiLkRvQigxKTsKLSAgICBiLkRvQigyKTsKLSAgfQotICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAotICAgICAgSXNTdWJzdHJpbmcsCi0gICAgICAiVG9vIG1hbnkgYWN0aW9ucyBzcGVjaWZpZWQgaW4gRVhQRUNUX0NBTEwoYiwgRG9CKCkpLi4uXG4iCi0gICAgICAiRXhwZWN0ZWQgdG8gYmUgbmV2ZXIgY2FsbGVkLCBidXQgaGFzIDEgV2lsbE9uY2UoKS4iLAotICAgICAgb3V0cHV0KTsgIC8vICMxCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoCi0gICAgICBJc1N1YnN0cmluZywKLSAgICAgICJUb28gbWFueSBhY3Rpb25zIHNwZWNpZmllZCBpbiBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkuLi5cbiIKLSAgICAgICJFeHBlY3RlZCB0byBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLCAiCi0gICAgICAiYnV0IGhhcyAyIFdpbGxPbmNlKClzLiIsCi0gICAgICBvdXRwdXQpOyAgLy8gIzIKLSAgRVhQRUNUX1BSRURfRk9STUFUMigKLSAgICAgIElzU3Vic3RyaW5nLAotICAgICAgIlRvbyBtYW55IGFjdGlvbnMgc3BlY2lmaWVkIGluIEVYUEVDVF9DQUxMKGIsIERvQigxKSkuLi5cbiIKLSAgICAgICJFeHBlY3RlZCB0byBiZSBjYWxsZWQgb25jZSwgYnV0IGhhcyAyIFdpbGxPbmNlKClzLiIsCi0gICAgICBvdXRwdXQpOyAgLy8gIzMKLSAgRVhQRUNUX1BSRURfRk9STUFUMigKLSAgICAgIElzU3Vic3RyaW5nLAotICAgICAgIlRvbyBtYW55IGFjdGlvbnMgc3BlY2lmaWVkIGluIEVYUEVDVF9DQUxMKGIsIERvQigpKS4uLlxuIgotICAgICAgIkV4cGVjdGVkIHRvIGJlIG5ldmVyIGNhbGxlZCwgYnV0IGhhcyAwIFdpbGxPbmNlKClzICIKLSAgICAgICJhbmQgYSBXaWxsUmVwZWF0ZWRseSgpLiIsCi0gICAgICBvdXRwdXQpOyAgLy8gIzQKLSAgRVhQRUNUX1BSRURfRk9STUFUMigKLSAgICAgIElzU3Vic3RyaW5nLAotICAgICAgIlRvbyBtYW55IGFjdGlvbnMgc3BlY2lmaWVkIGluIEVYUEVDVF9DQUxMKGIsIERvQigyKSkuLi5cbiIKLSAgICAgICJFeHBlY3RlZCB0byBiZSBjYWxsZWQgb25jZSwgYnV0IGhhcyAxIFdpbGxPbmNlKCkgIgotICAgICAgImFuZCBhIFdpbGxSZXBlYXRlZGx5KCkuIiwKLSAgICAgIG91dHB1dCk7ICAvLyAjNQotfQotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIHdhcm5zIG9uIGhhdmluZyB0b28gZmV3IGFjdGlvbnMgaW4gYW4KLS8vIGV4cGVjdGF0aW9uIGNvbXBhcmVkIHRvIGl0cyBjYXJkaW5hbGl0eS4KLVRFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdhcm5zT25Ub29GZXdBY3Rpb25zKSB7Ci0gIE1vY2tCIGI7Ci0KLSAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuVGltZXMoQmV0d2VlbigyLCAzKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOwotCi0gIENhcHR1cmVTdGRvdXQoKTsKLSAgYi5Eb0IoKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMigKLSAgICAgIElzU3Vic3RyaW5nLAotICAgICAgIlRvbyBmZXcgYWN0aW9ucyBzcGVjaWZpZWQgaW4gRVhQRUNUX0NBTEwoYiwgRG9CKCkpLi4uXG4iCi0gICAgICAiRXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGJldHdlZW4gMiBhbmQgMyB0aW1lcywgIgotICAgICAgImJ1dCBoYXMgb25seSAxIFdpbGxPbmNlKCkuIiwKLSAgICAgIG91dHB1dCk7Ci0gIGIuRG9CKCk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBUZXN0cyB0aGUgc2VtYW50aWNzIG9mIE9OX0NBTEwoKS4KLQotLy8gVGVzdHMgdGhhdCB0aGUgYnVpbHQtaW4gZGVmYXVsdCBhY3Rpb24gaXMgdGFrZW4gd2hlbiBubyBPTl9DQUxMKCkKLS8vIGlzIHNwZWNpZmllZC4KLVRFU1QoT25DYWxsVGVzdCwgVGFrZXNCdWlsdEluRGVmYXVsdEFjdGlvbldoZW5Ob09uQ2FsbCkgewotICBNb2NrQiBiOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBidWlsdC1pbiBkZWZhdWx0IGFjdGlvbiBpcyB0YWtlbiB3aGVuIG5vIE9OX0NBTEwoKQotLy8gbWF0Y2hlcyB0aGUgaW52b2NhdGlvbi4KLVRFU1QoT25DYWxsVGVzdCwgVGFrZXNCdWlsdEluRGVmYXVsdEFjdGlvbldoZW5Ob09uQ2FsbE1hdGNoZXMpIHsKLSAgTW9ja0IgYjsKLSAgT05fQ0FMTChiLCBEb0IoMSkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpOwotCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigyKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIGxhc3QgbWF0Y2hpbmcgT05fQ0FMTCgpIGFjdGlvbiBpcyB0YWtlbi4KLVRFU1QoT25DYWxsVGVzdCwgUGlja3NMYXN0TWF0Y2hpbmdPbkNhbGwpIHsKLSAgTW9ja0IgYjsKLSAgT05fQ0FMTChiLCBEb0IoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMykpOwotICBPTl9DQUxMKGIsIERvQigyKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigyKSk7Ci0gIE9OX0NBTEwoYiwgRG9CKDEpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKF8pKTsKLQotICBFWFBFQ1RfRVEoMiwgYi5Eb0IoMikpOwotfQotCi0vLyBUZXN0cyB0aGUgc2VtYW50aWNzIG9mIEVYUEVDVF9DQUxMKCkuCi0KLS8vIFRlc3RzIHRoYXQgYW55IGNhbGwgaXMgYWxsb3dlZCB3aGVuIG5vIEVYUEVDVF9DQUxMKCkgaXMgc3BlY2lmaWVkLgotVEVTVChFeHBlY3RDYWxsVGVzdCwgQWxsb3dzQW55Q2FsbFdoZW5Ob1NwZWMpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpOwotICAvLyBUaGVyZSBpcyBubyBleHBlY3RhdGlvbiBvbiBEb0IoaW50KS4KLQotICBiLkRvQigpOwotCi0gIC8vIERvQihpbnQpIGNhbiBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcy4KLSAgYi5Eb0IoMSk7Ci0gIGIuRG9CKDIpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBsYXN0IG1hdGNoaW5nIEVYUEVDVF9DQUxMKCkgZmlyZXMuCi1URVNUKEV4cGVjdENhbGxUZXN0LCBQaWNrc0xhc3RNYXRjaGluZ0V4cGVjdENhbGwpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQigxKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMSkpOwotCi0gIEVYUEVDVF9FUSgxLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIGxvd2VyLWJvdW5kIHZpb2xhdGlvbi4KLVRFU1QoRXhwZWN0Q2FsbFRlc3QsIENhdGNoZXNUb29GZXdDYWxscykgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBNb2NrQiBiOwotICAgIEVYUEVDVF9DQUxMKGIsIERvQig1KSkKLSAgICAgICAgLlRpbWVzKEF0TGVhc3QoMikpOwotCi0gICAgYi5Eb0IoNSk7Ci0gIH0sICJBY3R1YWwgZnVuY3Rpb24gY2FsbCBjb3VudCBkb2Vzbid0IG1hdGNoIEVYUEVDVF9DQUxMKGIsIERvQig1KSkuLi5cbiIKLSAgICAgIiAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgYXQgbGVhc3QgdHdpY2VcbiIKLSAgICAgIiAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgY2FyZGluYWxpdHkgY2FuIGJlIGluZmVycmVkIHdoZW4gbm8gVGltZXMoLi4uKSBpcwotLy8gc3BlY2lmaWVkLgotVEVTVChFeHBlY3RDYWxsVGVzdCwgSW5mZXJzQ2FyZGluYWxpdHlXaGVuVGhlcmVJc05vV2lsbFJlcGVhdGVkbHkpIHsKLSAgewotICAgIE1vY2tCIGI7Ci0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOwotCi0gICAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOwotICAgIEVYUEVDVF9FUSgyLCBiLkRvQigpKTsKLSAgfQotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIE1vY2tCIGI7Ci0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOwotCi0gICAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOwotICB9LCAidG8gYmUgY2FsbGVkIHR3aWNlIik7Ci0KLSAgeyAgLy8gTk9MSU5UCi0gICAgTW9ja0IgYjsKLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0KLSAgICBFWFBFQ1RfRVEoMSwgYi5Eb0IoKSk7Ci0gICAgRVhQRUNUX0VRKDIsIGIuRG9CKCkpOwotICAgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGIuRG9CKCksICJ0byBiZSBjYWxsZWQgdHdpY2UiKTsKLSAgfQotfQotCi1URVNUKEV4cGVjdENhbGxUZXN0LCBJbmZlcnNDYXJkaW5hbGl0eTFXaGVuVGhlcmVJc1dpbGxSZXBlYXRlZGx5KSB7Ci0gIHsKLSAgICBNb2NrQiBiOwotICAgIEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIpKTsKLQotICAgIEVYUEVDVF9FUSgxLCBiLkRvQigpKTsKLSAgfQotCi0gIHsgIC8vIE5PTElOVAotICAgIE1vY2tCIGI7Ci0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOwotCi0gICAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOwotICAgIEVYUEVDVF9FUSgyLCBiLkRvQigpKTsKLSAgICBFWFBFQ1RfRVEoMiwgYi5Eb0IoKSk7Ci0gIH0KLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBNb2NrQiBiOwotICAgIEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIpKTsKLSAgfSwgInRvIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIG4tdGggYWN0aW9uIGlzIHRha2VuIGZvciB0aGUgbi10aCBtYXRjaGluZwotLy8gaW52b2NhdGlvbi4KLVRFU1QoRXhwZWN0Q2FsbFRlc3QsIE50aE1hdGNoVGFrZXNOdGhBY3Rpb24pIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMykpOwotCi0gIEVYUEVDVF9FUSgxLCBiLkRvQigpKTsKLSAgRVhQRUNUX0VRKDIsIGIuRG9CKCkpOwotICBFWFBFQ1RfRVEoMywgYi5Eb0IoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIFdpbGxSZXBlYXRlZGx5KCkgYWN0aW9uIGlzIHRha2VuIHdoZW4gdGhlIFdpbGxPbmNlKC4uLikKLS8vIGxpc3QgaXMgZXhoYXVzdGVkLgotVEVTVChFeHBlY3RDYWxsVGVzdCwgVGFrZXNSZXBlYXRlZEFjdGlvbldoZW5XaWxsTGlzdElzRXhoYXVzdGVkKSB7Ci0gIE1vY2tCIGI7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOwotCi0gIEVYUEVDVF9FUSgxLCBiLkRvQigpKTsKLSAgRVhQRUNUX0VRKDIsIGIuRG9CKCkpOwotICBFWFBFQ1RfRVEoMiwgYi5Eb0IoKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIFRlc3RzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRha2VuIHdoZW4gdGhlIFdpbGxPbmNlKC4uLikgbGlzdCBpcwotLy8gZXhoYXVzdGVkIGFuZCB0aGVyZSBpcyBubyBXaWxsUmVwZWF0ZWRseSgpLgotVEVTVChFeHBlY3RDYWxsVGVzdCwgVGFrZXNEZWZhdWx0QWN0aW9uV2hlbldpbGxMaXN0SXNFeGhhdXN0ZWQpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKF8pKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKLSAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKLQotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7ICAvLyBTaG91bGRuJ3QgZ2VuZXJhdGUgYSB3YXJuaW5nIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0YXRpb24gaGFzIG5vIGFjdGlvbiBjbGF1c2UgYXQgYWxsLgotICBFWFBFQ1RfRVEoMSwgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgyLCBiLkRvQigpKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0MSA9IEdldENhcHR1cmVkU3Rkb3V0KCk7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgb3V0cHV0MS5jX3N0cigpKTsKLQotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQyID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKLSAgRVhQRUNUX1RIQVQob3V0cHV0Mi5jX3N0cigpLAotICAgICAgICAgICAgICBIYXNTdWJzdHIoIkFjdGlvbnMgcmFuIG91dCBpbiBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkuLi5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsZWQgMyB0aW1lcywgYnV0IG9ubHkgMiBXaWxsT25jZSgpcyBhcmUgc3BlY2lmaWVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLiIpKTsKLSAgRVhQRUNUX1RIQVQob3V0cHV0Mi5jX3N0cigpLAotICAgICAgICAgICAgICBIYXNTdWJzdHIoIkFjdGlvbnMgcmFuIG91dCBpbiBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkuLi5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsZWQgNCB0aW1lcywgYnV0IG9ubHkgMiBXaWxsT25jZSgpcyBhcmUgc3BlY2lmaWVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLiIpKTsKLX0KLQotVEVTVChGdW5jdGlvbk1vY2tlck1lc3NhZ2VUZXN0LCBSZXBvcnRzRXhwZWN0Q2FsbExvY2F0aW9uRm9yRXhoYXVzZWRBY3Rpb25zKSB7Ci0gIE1vY2tCIGI7Ci0gIHN0ZDo6c3RyaW5nIGV4cGVjdF9jYWxsX2xvY2F0aW9uID0gRm9ybWF0RmlsZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXyArIDEpOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkuVGltZXMoQW55TnVtYmVyKCkpLldpbGxPbmNlKFJldHVybigxKSk7Ci0KLSAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOwotCi0gIENhcHR1cmVTdGRvdXQoKTsKLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOwotICAvLyBUaGUgd2FybmluZyBtZXNzYWdlIHNob3VsZCBjb250YWluIHRoZSBjYWxsIGxvY2F0aW9uLgotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCBleHBlY3RfY2FsbF9sb2NhdGlvbiwgb3V0cHV0KTsKLX0KLQotVEVTVChGdW5jdGlvbk1vY2tlck1lc3NhZ2VUZXN0LAotICAgICBSZXBvcnRzRGVmYXVsdEFjdGlvbkxvY2F0aW9uT2ZVbmludGVyZXN0aW5nQ2FsbHNGb3JOYWdneU1vY2spIHsKLSAgc3RkOjpzdHJpbmcgb25fY2FsbF9sb2NhdGlvbjsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICB7Ci0gICAgTmFnZ3lNb2NrPE1vY2tCPiBiOwotICAgIG9uX2NhbGxfbG9jYXRpb24gPSBGb3JtYXRGaWxlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fICsgMSk7Ci0gICAgT05fQ0FMTChiLCBEb0IoXykpLldpbGxCeURlZmF1bHQoUmV0dXJuKDApKTsKLSAgICBiLkRvQigwKTsKLSAgfQotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCBvbl9jYWxsX2xvY2F0aW9uLCBHZXRDYXB0dXJlZFN0ZG91dCgpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIFRlc3RzIHRoYXQgYW4gdW5pbnRlcmVzdGluZyBjYWxsIHBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbi4KLVRFU1QoVW5pbnRlcmVzdGluZ0NhbGxUZXN0LCBEb2VzRGVmYXVsdEFjdGlvbikgewotICAvLyBXaGVuIHRoZXJlIGlzIGFuIE9OX0NBTEwoKSBzdGF0ZW1lbnQsIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGJ5IGl0Ci0gIC8vIHNob3VsZCBiZSB0YWtlbi4KLSAgTW9ja0EgYTsKLSAgT05fQ0FMTChhLCBCaW5hcnkoXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfVFJVRShhLkJpbmFyeSgxLCAyKSk7Ci0KLSAgLy8gV2hlbiB0aGVyZSBpcyBubyBPTl9DQUxMKCksIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcmV0dXJuIHR5cGUKLSAgLy8gc2hvdWxkIGJlIHJldHVybmVkLgotICBNb2NrQiBiOwotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYW4gdW5leHBlY3RlZCBjYWxsIHBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbi4KLVRFU1QoVW5leHBlY3RlZENhbGxUZXN0LCBEb2VzRGVmYXVsdEFjdGlvbikgewotICAvLyBXaGVuIHRoZXJlIGlzIGFuIE9OX0NBTEwoKSBzdGF0ZW1lbnQsIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGJ5IGl0Ci0gIC8vIHNob3VsZCBiZSB0YWtlbi4KLSAgTW9ja0EgYTsKLSAgT05fQ0FMTChhLCBCaW5hcnkoXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChhLCBCaW5hcnkoMCwgMCkpOwotICBhLkJpbmFyeSgwLCAwKTsKLSAgYm9vbCByZXN1bHQgPSBmYWxzZTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUocmVzdWx0ID0gYS5CaW5hcnkoMSwgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotCi0gIC8vIFdoZW4gdGhlcmUgaXMgbm8gT05fQ0FMTCgpLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHJldHVybiB0eXBlCi0gIC8vIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDApKQotICAgICAgLlRpbWVzKDApOwotICBpbnQgbiA9IC0xOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShuID0gYi5Eb0IoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotICBFWFBFQ1RfRVEoMCwgbik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2hlbiBhbiB1bmV4cGVjdGVkIHZvaWQgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSByaWdodAotLy8gZmFpbHVyZSBtZXNzYWdlLgotVEVTVChVbmV4cGVjdGVkQ2FsbFRlc3QsIEdlbmVyYXRlc0ZhaWx1cmVGb3JWb2lkRnVuY3Rpb24pIHsKLSAgLy8gRmlyc3QsIHRlc3RzIHRoZSBtZXNzYWdlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgRVhQRUNUX0NBTEwoKS4KLSAgTW9ja0EgYTE7Ci0gIEVYUEVDVF9DQUxMKGExLCBEb0EoMSkpOwotICBhMS5Eb0EoMSk7Ci0gIC8vIElkZWFsbHkgd2Ugc2hvdWxkIG1hdGNoIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYWdhaW5zdCBhIHJlZ2V4LCBidXQKLSAgLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUgZG9lc24ndCBzdXBwb3J0IHRoYXQsIHNvIHdlIHRlc3QgZm9yCi0gIC8vIG11bHRpcGxlIHN1Yi1zdHJpbmdzIGluc3RlYWQuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAotICAgICAgYTEuRG9BKDkpLAotICAgICAgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRpcmVjdGx5LlxuIgotICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBEb0EoOSlcbiIKLSAgICAgICJHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Iik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAotICAgICAgYTEuRG9BKDkpLAotICAgICAgIiAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAxXG4iCi0gICAgICAiICAgICAgICAgICBBY3R1YWw6IDlcbiIKLSAgICAgICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2VcbiIKLSAgICAgICIgICAgICAgICAgIEFjdHVhbDogY2FsbGVkIG9uY2UgLSBzYXR1cmF0ZWQgYW5kIGFjdGl2ZSIpOwotCi0gIC8vIE5leHQsIHRlc3RzIHRoZSBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgRVhQRUNUX0NBTEwoKS4KLSAgTW9ja0EgYTI7Ci0gIEVYUEVDVF9DQUxMKGEyLCBEb0EoMSkpOwotICBFWFBFQ1RfQ0FMTChhMiwgRG9BKDMpKTsKLSAgYTIuRG9BKDEpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIGEyLkRvQSgyKSwKLSAgICAgICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkaXJlY3RseS5cbiIKLSAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogRG9BKDIpXG4iCi0gICAgICAiR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAyIGV4cGVjdGF0aW9ucywgYnV0IG5vbmUgbWF0Y2hlZDoiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBhMi5Eb0EoMiksCi0gICAgICAidHJpZWQgZXhwZWN0YXRpb24gIzA6IEVYUEVDVF9DQUxMKGEyLCBEb0EoMSkpLi4uXG4iCi0gICAgICAiICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDFcbiIKLSAgICAgICIgICAgICAgICAgIEFjdHVhbDogMlxuIgotICAgICAgIiAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZVxuIgotICAgICAgIiAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIHNhdHVyYXRlZCBhbmQgYWN0aXZlIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAotICAgICAgYTIuRG9BKDIpLAotICAgICAgInRyaWVkIGV4cGVjdGF0aW9uICMxOiBFWFBFQ1RfQ0FMTChhMiwgRG9BKDMpKS4uLlxuIgotICAgICAgIiAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAzXG4iCi0gICAgICAiICAgICAgICAgICBBY3R1YWw6IDJcbiIKLSAgICAgICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2VcbiIKLSAgICAgICIgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZSIpOwotICBhMi5Eb0EoMyk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYW4gdW5leHBlY3RlZCBub24tdm9pZCBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIHJpZ2h0Ci0vLyBmYWlsdXJlIG1lc3NhZ2UuCi1URVNUKFVuZXhwZWN0ZWRDYWxsVGVzdCwgR2VuZWFydGVzRmFpbHVyZUZvck5vblZvaWRGdW5jdGlvbikgewotICBNb2NrQiBiMTsKLSAgRVhQRUNUX0NBTEwoYjEsIERvQigxKSk7Ci0gIGIxLkRvQigxKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBiMS5Eb0IoMiksCi0gICAgICAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS5cbiIKLSAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogRG9CKDIpXG4iCi0gICAgICAiICAgICAgICAgIFJldHVybnM6IDBcbiIKLSAgICAgICJHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Iik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAotICAgICAgYjEuRG9CKDIpLAotICAgICAgIiAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAxXG4iCi0gICAgICAiICAgICAgICAgICBBY3R1YWw6IDJcbiIKLSAgICAgICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2VcbiIKLSAgICAgICIgICAgICAgICAgIEFjdHVhbDogY2FsbGVkIG9uY2UgLSBzYXR1cmF0ZWQgYW5kIGFjdGl2ZSIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIGV4cGxhaW5zIHRoYXQgYW4gcmV0aXJlZCBleHBlY3RhdGlvbiBkb2Vzbid0Ci0vLyBtYXRjaCB0aGUgY2FsbC4KLVRFU1QoVW5leHBlY3RlZENhbGxUZXN0LCBSZXRpcmVkRXhwZWN0YXRpb24pIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDEpKQotICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLQotICBiLkRvQigxKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBiLkRvQigxKSwKLSAgICAgICIgICAgICAgICBFeHBlY3RlZDogdGhlIGV4cGVjdGF0aW9uIGlzIGFjdGl2ZVxuIgotICAgICAgIiAgICAgICAgICAgQWN0dWFsOiBpdCBpcyByZXRpcmVkIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgZXhwbGFpbnMgdGhhdCBhbiBleHBlY3RhdGlvbiB0aGF0IGRvZXNuJ3QKLS8vIG1hdGNoIHRoZSBhcmd1bWVudHMgZG9lc24ndCBtYXRjaCB0aGUgY2FsbC4KLVRFU1QoVW5leHBlY3RlZENhbGxUZXN0LCBVbm1hdGNoZWRBcmd1bWVudHMpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDEpKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIGIuRG9CKDIpLAotICAgICAgIiAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAxXG4iCi0gICAgICAiICAgICAgICAgICBBY3R1YWw6IDJcbiIpOwotICBiLkRvQigxKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBHb29nbGUgTW9jayBleHBsYWlucyB0aGF0IGFuIGV4cGVjdGF0aW9uIHdpdGgKLS8vIHVuc2F0aXNmaWVkIHByZS1yZXF1aXNpdGVzIGRvZXNuJ3QgbWF0Y2ggdGhlIGNhbGwuCi1URVNUKFVuZXhwZWN0ZWRDYWxsVGVzdCwgVW5zYXRpc2lmaWVkUHJlcmVxdWlzaXRlcykgewotICBTZXF1ZW5jZSBzMSwgczI7Ci0gIE1vY2tCIGI7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQigxKSkKLSAgICAgIC5JblNlcXVlbmNlKHMxKTsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDIpKQotICAgICAgLlRpbWVzKEFueU51bWJlcigpKQotICAgICAgLkluU2VxdWVuY2UoczEpOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoMykpCi0gICAgICAuSW5TZXF1ZW5jZShzMik7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQig0KSkKLSAgICAgIC5JblNlcXVlbmNlKHMxLCBzMik7Ci0KLSAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGZhaWx1cmVzOwotICB7Ci0gICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigmZmFpbHVyZXMpOwotICAgIGIuRG9CKDQpOwotICAgIC8vIE5vdyAnZmFpbHVyZXMnIGNvbnRhaW5zIHRoZSBHb29nbGUgVGVzdCBmYWlsdXJlcyBnZW5lcmF0ZWQgYnkKLSAgICAvLyB0aGUgYWJvdmUgc3RhdGVtZW50LgotICB9Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG9uZSBub24tZmF0YWwgZmFpbHVyZS4KLSAgQVNTRVJUX0VRKDEsIGZhaWx1cmVzLnNpemUoKSk7Ci0gIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQmIHIgPSBmYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKTsKLSAgRVhQRUNUX0VRKDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIHIudHlwZSgpKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlIHR3byB1bnNhdGlzZmllZAotICAvLyBwcmUtcmVxdWlzaXRlcyBidXQgbm90IHRoZSBzYXRpc2ZpZWQgb25lLgotI2lmIEdURVNUX1VTRVNfUENSRQotICBFWFBFQ1RfVEhBVChyLm1lc3NhZ2UoKSwgQ29udGFpbnNSZWdleCgKLSAgICAgIC8vIFBDUkUgaGFzIHRyb3VibGUgdXNpbmcgKC58XG4pIHRvIG1hdGNoIGFueSBjaGFyYWN0ZXIsIGJ1dAotICAgICAgLy8gc3VwcG9ydHMgdGhlICg/cykgcHJlZml4IGZvciB1c2luZyAuIHRvIG1hdGNoIGFueSBjaGFyYWN0ZXIuCi0gICAgICAiKD9zKXRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIGFyZSBub3Qgc2F0aXNmaWVkOlxuIgotICAgICAgIi4qOiBwcmUtcmVxdWlzaXRlICMwXG4iCi0gICAgICAiLio6IHByZS1yZXF1aXNpdGUgIzEiKSk7Ci0jZWxpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCi0gIEVYUEVDVF9USEFUKHIubWVzc2FnZSgpLCBDb250YWluc1JlZ2V4KAotICAgICAgLy8gUE9TSVggUkUgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAoP3MpIHByZWZpeCwgYnV0IGhhcyBubyB0cm91YmxlCi0gICAgICAvLyB3aXRoICgufFxuKS4KLSAgICAgICJ0aGUgZm9sbG93aW5nIGltbWVkaWF0ZSBwcmUtcmVxdWlzaXRlcyBhcmUgbm90IHNhdGlzZmllZDpcbiIKLSAgICAgICIoLnxcbikqOiBwcmUtcmVxdWlzaXRlICMwXG4iCi0gICAgICAiKC58XG4pKjogcHJlLXJlcXVpc2l0ZSAjMSIpKTsKLSNlbHNlCi0gIC8vIFdlIGNhbiBvbmx5IHVzZSBHb29nbGUgVGVzdCdzIG93biBzaW1wbGUgcmVnZXguCi0gIEVYUEVDVF9USEFUKHIubWVzc2FnZSgpLCBDb250YWluc1JlZ2V4KAotICAgICAgInRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIGFyZSBub3Qgc2F0aXNmaWVkOiIpKTsKLSAgRVhQRUNUX1RIQVQoci5tZXNzYWdlKCksIENvbnRhaW5zUmVnZXgoIjogcHJlLXJlcXVpc2l0ZSAjMCIpKTsKLSAgRVhQRUNUX1RIQVQoci5tZXNzYWdlKCksIENvbnRhaW5zUmVnZXgoIjogcHJlLXJlcXVpc2l0ZSAjMSIpKTsKLSNlbmRpZiAgLy8gR1RFU1RfVVNFU19QQ1JFCi0KLSAgYi5Eb0IoMSk7Ci0gIGIuRG9CKDMpOwotICBiLkRvQig0KTsKLX0KLQotVEVTVChVbmRlZmluZWRSZXR1cm5WYWx1ZVRlc3QsCi0gICAgIFJldHVyblZhbHVlSXNNYW5kYXRvcnlXaGVuTm90RGVmYXVsdENvbnN0cnVjdGlibGUpIHsKLSAgTW9ja0EgYTsKLSAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFdlIHNob3VsZCByZWFsbHkgdmVyaWZ5IHRoZSBvdXRwdXQgbWVzc2FnZSwKLSAgLy8gYnV0IHdlIGNhbm5vdCB5ZXQgZHVlIHRvIHRoYXQgRVhQRUNUX0RFQVRIIG9ubHkgY2FwdHVyZXMgc3RkZXJyCi0gIC8vIHdoaWxlIEdvb2dsZSBNb2NrIGxvZ3MgdG8gc3Rkb3V0LgotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0gIEVYUEVDVF9BTllfVEhST1coYS5SZXR1cm5Ob25EZWZhdWx0Q29uc3RydWN0aWJsZSgpKTsKLSNlbHNlCi0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoYS5SZXR1cm5Ob25EZWZhdWx0Q29uc3RydWN0aWJsZSgpLCAiIik7Ci0jZW5kaWYKLX0KLQotLy8gVGVzdHMgdGhhdCBhbiBleGNlc3NpdmUgY2FsbCAob25lIHdob3NlIGFyZ3VtZW50cyBtYXRjaCB0aGUKLS8vIG1hdGNoZXJzIGJ1dCBpcyBjYWxsZWQgdG9vIG1hbnkgdGltZXMpIHBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbi4KLVRFU1QoRXhjZXNzaXZlQ2FsbFRlc3QsIERvZXNEZWZhdWx0QWN0aW9uKSB7Ci0gIC8vIFdoZW4gdGhlcmUgaXMgYW4gT05fQ0FMTCgpIHN0YXRlbWVudCwgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgaXQKLSAgLy8gc2hvdWxkIGJlIHRha2VuLgotICBNb2NrQSBhOwotICBPTl9DQUxMKGEsIEJpbmFyeShfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7Ci0gIEVYUEVDVF9DQUxMKGEsIEJpbmFyeSgwLCAwKSk7Ci0gIGEuQmluYXJ5KDAsIDApOwotICBib29sIHJlc3VsdCA9IGZhbHNlOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShyZXN1bHQgPSBhLkJpbmFyeSgwLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotCi0gIC8vIFdoZW4gdGhlcmUgaXMgbm8gT05fQ0FMTCgpLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHJldHVybiB0eXBlCi0gIC8vIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDApKQotICAgICAgLlRpbWVzKDApOwotICBpbnQgbiA9IC0xOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShuID0gYi5Eb0IoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJNb2NrIGZ1bmN0aW9uIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQiKTsKLSAgRVhQRUNUX0VRKDAsIG4pOwotfQotCi0vLyBUZXN0cyB0aGF0IHdoZW4gYSB2b2lkIGZ1bmN0aW9uIGlzIGNhbGxlZCB0b28gbWFueSB0aW1lcywKLS8vIHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlIGFyZ3VtZW50IHZhbHVlcy4KLVRFU1QoRXhjZXNzaXZlQ2FsbFRlc3QsIEdlbmVyYXRlc0ZhaWx1cmVGb3JWb2lkRnVuY3Rpb24pIHsKLSAgTW9ja0EgYTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKF8pKQotICAgICAgLlRpbWVzKDApOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIGEuRG9BKDkpLAotICAgICAgIk1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtIHJldHVybmluZyBkaXJlY3RseS5cbiIKLSAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogRG9BKDkpXG4iCi0gICAgICAiICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIG5ldmVyIGNhbGxlZFxuIgotICAgICAgIiAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIG92ZXItc2F0dXJhdGVkIGFuZCBhY3RpdmUiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3aGVuIGEgbm9uLXZvaWQgZnVuY3Rpb24gaXMgY2FsbGVkIHRvbyBtYW55IHRpbWVzLCB0aGUKLS8vIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUgYXJndW1lbnQgdmFsdWVzIGFuZCB0aGUgcmV0dXJuIHZhbHVlLgotVEVTVChFeGNlc3NpdmVDYWxsVGVzdCwgR2VuZXJhdGVzRmFpbHVyZUZvck5vblZvaWRGdW5jdGlvbikgewotICBNb2NrQiBiOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpOwotICBiLkRvQigxKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBiLkRvQigyKSwKLSAgICAgICJNb2NrIGZ1bmN0aW9uIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQgLSAiCi0gICAgICAicmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuXG4iCi0gICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IERvQigyKVxuIgotICAgICAgIiAgICAgICAgICBSZXR1cm5zOiAwXG4iCi0gICAgICAiICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlXG4iCi0gICAgICAiICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCB0d2ljZSAtIG92ZXItc2F0dXJhdGVkIGFuZCBhY3RpdmUiKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgc2VxdWVuY2VzLgotCi1URVNUKEluU2VxdWVuY2VUZXN0LCBBbGxFeHBlY3RhdGlvbkluU2NvcGVBcmVJblNlcXVlbmNlKSB7Ci0gIE1vY2tBIGE7Ci0gIHsKLSAgICBJblNlcXVlbmNlIGR1bW15OwotCi0gICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOwotICB9Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgYS5Eb0EoMik7Ci0gIH0sICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGEuRG9BKDEpOwotICBhLkRvQSgyKTsKLX0KLQotVEVTVChJblNlcXVlbmNlVGVzdCwgTmVzdGVkSW5TZXF1ZW5jZSkgewotICBNb2NrQSBhOwotICB7Ci0gICAgSW5TZXF1ZW5jZSBkdW1teTsKLQotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gICAgewotICAgICAgSW5TZXF1ZW5jZSBkdW1teTI7Ci0KLSAgICAgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpOwotICAgIH0KLSAgfQotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIGEuRG9BKDEpOwotICAgIGEuRG9BKDMpOwotICB9LCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLQotICBhLkRvQSgyKTsKLSAgYS5Eb0EoMyk7Ci19Ci0KLVRFU1QoSW5TZXF1ZW5jZVRlc3QsIEV4cGVjdGF0aW9uc091dE9mU2NvcGVBcmVOb3RBZmZlY3RlZCkgewotICBNb2NrQSBhOwotICB7Ci0gICAgSW5TZXF1ZW5jZSBkdW1teTsKLQotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gICAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKLSAgfQotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIGEuRG9BKDIpOwotICB9LCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLQotICBhLkRvQSgzKTsKLSAgYS5Eb0EoMSk7Ci0gIGEuRG9BKDIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFueSBvcmRlciBpcyBhbGxvd2VkIHdoZW4gbm8gc2VxdWVuY2UgaXMgdXNlZC4KLVRFU1QoU2VxdWVuY2VUZXN0LCBBbnlPcmRlcklzT2tCeURlZmF1bHQpIHsKLSAgewotICAgIE1vY2tBIGE7Ci0gICAgTW9ja0IgYjsKLQotICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0KLSAgICBhLkRvQSgxKTsKLSAgICBiLkRvQigpOwotICB9Ci0KLSAgeyAgLy8gTk9MSU5UCi0gICAgTW9ja0EgYTsKLSAgICBNb2NrQiBiOwotCi0gICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKLQotICAgIGIuRG9CKCk7Ci0gICAgYS5Eb0EoMSk7Ci0gIH0KLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgY2FsbHMgbXVzdCBiZSBpbiBzdHJpY3Qgb3JkZXIgd2hlbiBhIGNvbXBsZXRlIG9yZGVyCi0vLyBpcyBzcGVjaWZpZWQuCi1URVNUKFNlcXVlbmNlVGVzdCwgQ2FsbHNNdXN0QmVJblN0cmljdE9yZGVyV2hlblNhaWRTbzEpIHsKLSAgTW9ja0EgYTsKLSAgT05fQ0FMTChhLCBSZXR1cm5SZXN1bHQoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oUmVzdWx0KCkpKTsKLQotICBTZXF1ZW5jZSBzOwotICBFWFBFQ1RfQ0FMTChhLCBSZXR1cm5SZXN1bHQoMSkpCi0gICAgICAuSW5TZXF1ZW5jZShzKTsKLSAgRVhQRUNUX0NBTEwoYSwgUmV0dXJuUmVzdWx0KDIpKQotICAgICAgLkluU2VxdWVuY2Uocyk7Ci0gIEVYUEVDVF9DQUxMKGEsIFJldHVyblJlc3VsdCgzKSkKLSAgICAgIC5JblNlcXVlbmNlKHMpOwotCi0gIGEuUmV0dXJuUmVzdWx0KDEpOwotCi0gIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhLlJldHVyblJlc3VsdCgyKS4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5SZXR1cm5SZXN1bHQoMyksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGEuUmV0dXJuUmVzdWx0KDIpOwotICBhLlJldHVyblJlc3VsdCgzKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgY2FsbHMgbXVzdCBiZSBpbiBzdHJpY3Qgb3JkZXIgd2hlbiBhIGNvbXBsZXRlIG9yZGVyCi0vLyBpcyBzcGVjaWZpZWQuCi1URVNUKFNlcXVlbmNlVGVzdCwgQ2FsbHNNdXN0QmVJblN0cmljdE9yZGVyV2hlblNhaWRTbzIpIHsKLSAgTW9ja0EgYTsKLSAgT05fQ0FMTChhLCBSZXR1cm5SZXN1bHQoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oUmVzdWx0KCkpKTsKLQotICBTZXF1ZW5jZSBzOwotICBFWFBFQ1RfQ0FMTChhLCBSZXR1cm5SZXN1bHQoMSkpCi0gICAgICAuSW5TZXF1ZW5jZShzKTsKLSAgRVhQRUNUX0NBTEwoYSwgUmV0dXJuUmVzdWx0KDIpKQotICAgICAgLkluU2VxdWVuY2Uocyk7Ci0KLSAgLy8gTWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEuUmV0dXJuUmVzdWx0KDEpLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLlJldHVyblJlc3VsdCgyKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7Ci0KLSAgYS5SZXR1cm5SZXN1bHQoMSk7Ci0gIGEuUmV0dXJuUmVzdWx0KDIpOwotfQotCi0vLyBUZXN0cyBzcGVjaWZ5aW5nIGEgREFHIHVzaW5nIG11bHRpcGxlIHNlcXVlbmNlcy4KLWNsYXNzIFBhcnRpYWxPcmRlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBQYXJ0aWFsT3JkZXJUZXN0KCkgewotICAgIE9OX0NBTEwoYV8sIFJldHVyblJlc3VsdChfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKFJlc3VsdCgpKSk7Ci0KLSAgICAvLyBTcGVjaWZpZXMgdGhpcyBwYXJ0aWFsIG9yZGVyaW5nOgotICAgIC8vCi0gICAgLy8gYS5SZXR1cm5SZXN1bHQoMSkgPT0+Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGEuUmV0dXJuUmVzdWx0KDIpICogbiAgPT0+ICBhLlJldHVyblJlc3VsdCgzKQotICAgIC8vIGIuRG9CKCkgKiAyICAgICAgID09PgotICAgIFNlcXVlbmNlIHgsIHk7Ci0gICAgRVhQRUNUX0NBTEwoYV8sIFJldHVyblJlc3VsdCgxKSkKLSAgICAgICAgLkluU2VxdWVuY2UoeCk7Ci0gICAgRVhQRUNUX0NBTEwoYl8sIERvQigpKQotICAgICAgICAuVGltZXMoMikKLSAgICAgICAgLkluU2VxdWVuY2UoeSk7Ci0gICAgRVhQRUNUX0NBTEwoYV8sIFJldHVyblJlc3VsdCgyKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKQotICAgICAgICAuSW5TZXF1ZW5jZSh4LCB5KTsKLSAgICBFWFBFQ1RfQ0FMTChhXywgUmV0dXJuUmVzdWx0KDMpKQotICAgICAgICAuSW5TZXF1ZW5jZSh4KTsKLSAgfQotCi0gIE1vY2tBIGFfOwotICBNb2NrQiBiXzsKLX07Ci0KLVRFU1RfRihQYXJ0aWFsT3JkZXJUZXN0LCBDYWxsc011c3RDb25mb3JtVG9TcGVjaWZpZWREYWcxKSB7Ci0gIGFfLlJldHVyblJlc3VsdCgxKTsKLSAgYl8uRG9CKCk7Ci0KLSAgLy8gTWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSBzZWNvbmQgRG9CKCkuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGFfLlJldHVyblJlc3VsdCgyKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7Ci0KLSAgYl8uRG9CKCk7Ci0gIGFfLlJldHVyblJlc3VsdCgzKTsKLX0KLQotVEVTVF9GKFBhcnRpYWxPcmRlclRlc3QsIENhbGxzTXVzdENvbmZvcm1Ub1NwZWNpZmllZERhZzIpIHsKLSAgLy8gTWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIFJldHVyblJlc3VsdCgxKS4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYV8uUmV0dXJuUmVzdWx0KDIpLCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLQotICBhXy5SZXR1cm5SZXN1bHQoMSk7Ci0gIGJfLkRvQigpOwotICBiXy5Eb0IoKTsKLSAgYV8uUmV0dXJuUmVzdWx0KDMpOwotfQotCi1URVNUX0YoUGFydGlhbE9yZGVyVGVzdCwgQ2FsbHNNdXN0Q29uZm9ybVRvU3BlY2lmaWVkRGFnMykgewotICAvLyBNYXkgb25seSBiZSBjYWxsZWQgbGFzdC4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYV8uUmV0dXJuUmVzdWx0KDMpLCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLQotICBhXy5SZXR1cm5SZXN1bHQoMSk7Ci0gIGJfLkRvQigpOwotICBiXy5Eb0IoKTsKLSAgYV8uUmV0dXJuUmVzdWx0KDMpOwotfQotCi1URVNUX0YoUGFydGlhbE9yZGVyVGVzdCwgQ2FsbHNNdXN0Q29uZm9ybVRvU3BlY2lmaWVkRGFnNCkgewotICBhXy5SZXR1cm5SZXN1bHQoMSk7Ci0gIGJfLkRvQigpOwotICBiXy5Eb0IoKTsKLSAgYV8uUmV0dXJuUmVzdWx0KDMpOwotCi0gIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgUmV0dXJuUmVzdWx0KDMpLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhXy5SZXR1cm5SZXN1bHQoMiksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotfQotCi1URVNUKFNlcXVlbmNlVGVzdCwgUmV0aXJlbWVudCkgewotICBNb2NrQSBhOwotICBTZXF1ZW5jZSBzOwotCi0gIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKLSAgICAgIC5JblNlcXVlbmNlKHMpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoXykpCi0gICAgICAuSW5TZXF1ZW5jZShzKQotICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQotICAgICAgLkluU2VxdWVuY2Uocyk7Ci0KLSAgYS5Eb0EoMSk7Ci0gIGEuRG9BKDIpOwotICBhLkRvQSgxKTsKLX0KLQotLy8gVGVzdHMgRXhwZWN0YXRpb24uCi0KLVRFU1QoRXhwZWN0YXRpb25UZXN0LCBDb25zdHJ1dG9yc1dvcmspIHsKLSAgTW9ja0EgYTsKLSAgRXhwZWN0YXRpb24gZTE7ICAvLyBEZWZhdWx0IGN0b3IuCi0KLSAgLy8gQ3RvciBmcm9tIHZhcmlvdXMgZm9ybXMgb2YgRVhQRUNUX0NBTEwuCi0gIEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKLSAgRXhwZWN0YXRpb24gZTMgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpLldpdGgoXyk7Ci0gIHsKLSAgICBTZXF1ZW5jZSBzOwotICAgIEV4cGVjdGF0aW9uIGU0ID0gRVhQRUNUX0NBTEwoYSwgRG9BKDQpKS5UaW1lcygxKTsKLSAgICBFeHBlY3RhdGlvbiBlNSA9IEVYUEVDVF9DQUxMKGEsIERvQSg1KSkuSW5TZXF1ZW5jZShzKTsKLSAgfQotICBFeHBlY3RhdGlvbiBlNiA9IEVYUEVDVF9DQUxMKGEsIERvQSg2KSkuQWZ0ZXIoZTIpOwotICBFeHBlY3RhdGlvbiBlNyA9IEVYUEVDVF9DQUxMKGEsIERvQSg3KSkuV2lsbE9uY2UoUmV0dXJuKCkpOwotICBFeHBlY3RhdGlvbiBlOCA9IEVYUEVDVF9DQUxMKGEsIERvQSg4KSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpOwotICBFeHBlY3RhdGlvbiBlOSA9IEVYUEVDVF9DQUxMKGEsIERvQSg5KSkuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotCi0gIEV4cGVjdGF0aW9uIGUxMCA9IGUyOyAgLy8gQ29weSBjdG9yLgotCi0gIEVYUEVDVF9USEFUKGUxLCBOZShlMikpOwotICBFWFBFQ1RfVEhBVChlMiwgRXEoZTEwKSk7Ci0KLSAgYS5Eb0EoMik7Ci0gIGEuRG9BKDMpOwotICBhLkRvQSg0KTsKLSAgYS5Eb0EoNSk7Ci0gIGEuRG9BKDYpOwotICBhLkRvQSg3KTsKLSAgYS5Eb0EoOCk7Ci0gIGEuRG9BKDkpOwotfQotCi1URVNUKEV4cGVjdGF0aW9uVGVzdCwgQXNzaWdubWVudFdvcmtzKSB7Ci0gIE1vY2tBIGE7Ci0gIEV4cGVjdGF0aW9uIGUxOwotICBFeHBlY3RhdGlvbiBlMiA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0KLSAgRVhQRUNUX1RIQVQoZTEsIE5lKGUyKSk7Ci0KLSAgZTEgPSBlMjsKLSAgRVhQRUNUX1RIQVQoZTEsIEVxKGUyKSk7Ci0KLSAgYS5Eb0EoMSk7Ci19Ci0KLS8vIFRlc3RzIEV4cGVjdGF0aW9uU2V0LgotCi1URVNUKEV4cGVjdGF0aW9uU2V0VGVzdCwgTWVtYmVyVHlwZXNBcmVDb3JyZWN0KSB7Ci0gIDo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPEV4cGVjdGF0aW9uLCBFeHBlY3RhdGlvblNldDo6dmFsdWVfdHlwZT4oKTsKLX0KLQotVEVTVChFeHBlY3RhdGlvblNldFRlc3QsIENvbnN0cnVjdG9yc1dvcmspIHsKLSAgTW9ja0EgYTsKLQotICBFeHBlY3RhdGlvbiBlMTsKLSAgY29uc3QgRXhwZWN0YXRpb24gZTI7Ci0gIEV4cGVjdGF0aW9uU2V0IGVzMTsgIC8vIERlZmF1bHQgY3Rvci4KLSAgRXhwZWN0YXRpb25TZXQgZXMyID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsgIC8vIEN0b3IgZnJvbSBFWFBFQ1RfQ0FMTC4KLSAgRXhwZWN0YXRpb25TZXQgZXMzID0gZTE7ICAvLyBDdG9yIGZyb20gRXhwZWN0YXRpb24uCi0gIEV4cGVjdGF0aW9uU2V0IGVzNChlMSk7ICAgLy8gQ3RvciBmcm9tIEV4cGVjdGF0aW9uOyBhbHRlcm5hdGl2ZSBzeW50YXguCi0gIEV4cGVjdGF0aW9uU2V0IGVzNSA9IGUyOyAgLy8gQ3RvciBmcm9tIGNvbnN0IEV4cGVjdGF0aW9uLgotICBFeHBlY3RhdGlvblNldCBlczYoZTIpOyAgIC8vIEN0b3IgZnJvbSBjb25zdCBFeHBlY3RhdGlvbjsgYWx0ZXJuYXRpdmUgc3ludGF4LgotICBFeHBlY3RhdGlvblNldCBlczcgPSBlczI7ICAvLyBDb3B5IGN0b3IuCi0KLSAgRVhQRUNUX0VRKDAsIGVzMS5zaXplKCkpOwotICBFWFBFQ1RfRVEoMSwgZXMyLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgxLCBlczMuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDEsIGVzNC5zaXplKCkpOwotICBFWFBFQ1RfRVEoMSwgZXM1LnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgxLCBlczYuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDEsIGVzNy5zaXplKCkpOwotCi0gIEVYUEVDVF9USEFUKGVzMywgTmUoZXMyKSk7Ci0gIEVYUEVDVF9USEFUKGVzNCwgRXEoZXMzKSk7Ci0gIEVYUEVDVF9USEFUKGVzNSwgRXEoZXM0KSk7Ci0gIEVYUEVDVF9USEFUKGVzNiwgRXEoZXM1KSk7Ci0gIEVYUEVDVF9USEFUKGVzNywgRXEoZXMyKSk7Ci0gIGEuRG9BKDEpOwotfQotCi1URVNUKEV4cGVjdGF0aW9uU2V0VGVzdCwgQXNzaWdubWVudFdvcmtzKSB7Ci0gIEV4cGVjdGF0aW9uU2V0IGVzMTsKLSAgRXhwZWN0YXRpb25TZXQgZXMyID0gRXhwZWN0YXRpb24oKTsKLQotICBlczEgPSBlczI7Ci0gIEVYUEVDVF9FUSgxLCBlczEuc2l6ZSgpKTsKLSAgRVhQRUNUX1RIQVQoKihlczEuYmVnaW4oKSksIEVxKEV4cGVjdGF0aW9uKCkpKTsKLSAgRVhQRUNUX1RIQVQoZXMxLCBFcShlczIpKTsKLX0KLQotVEVTVChFeHBlY3RhdGlvblNldFRlc3QsIEluc2VydGlvbldvcmtzKSB7Ci0gIEV4cGVjdGF0aW9uU2V0IGVzMTsKLSAgRXhwZWN0YXRpb24gZTE7Ci0gIGVzMSArPSBlMTsKLSAgRVhQRUNUX0VRKDEsIGVzMS5zaXplKCkpOwotICBFWFBFQ1RfVEhBVCgqKGVzMS5iZWdpbigpKSwgRXEoZTEpKTsKLQotICBNb2NrQSBhOwotICBFeHBlY3RhdGlvbiBlMiA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIGVzMSArPSBlMjsKLSAgRVhQRUNUX0VRKDIsIGVzMS5zaXplKCkpOwotCi0gIEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdDEgPSBlczEuYmVnaW4oKTsKLSAgRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IGl0MTsKLSAgKytpdDI7Ci0gIEVYUEVDVF9UUlVFKCppdDEgPT0gZTEgfHwgKml0MiA9PSBlMSk7ICAvLyBlMSBtdXN0IGJlIGluIHRoZSBzZXQuCi0gIEVYUEVDVF9UUlVFKCppdDEgPT0gZTIgfHwgKml0MiA9PSBlMik7ICAvLyBlMiBtdXN0IGJlIGluIHRoZSBzZXQgdG9vLgotICBhLkRvQSgxKTsKLX0KLQotVEVTVChFeHBlY3RhdGlvblNldFRlc3QsIFNpemVXb3JrcykgewotICBFeHBlY3RhdGlvblNldCBlczsKLSAgRVhQRUNUX0VRKDAsIGVzLnNpemUoKSk7Ci0KLSAgZXMgKz0gRXhwZWN0YXRpb24oKTsKLSAgRVhQRUNUX0VRKDEsIGVzLnNpemUoKSk7Ci0KLSAgTW9ja0EgYTsKLSAgZXMgKz0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgRVhQRUNUX0VRKDIsIGVzLnNpemUoKSk7Ci0KLSAgYS5Eb0EoMSk7Ci19Ci0KLVRFU1QoRXhwZWN0YXRpb25TZXRUZXN0LCBJc0VudW1lcmFibGUpIHsKLSAgRXhwZWN0YXRpb25TZXQgZXM7Ci0gIEVYUEVDVF9UUlVFKGVzLmJlZ2luKCkgPT0gZXMuZW5kKCkpOwotCi0gIGVzICs9IEV4cGVjdGF0aW9uKCk7Ci0gIEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVzLmJlZ2luKCk7Ci0gIEVYUEVDVF9UUlVFKGl0ICE9IGVzLmVuZCgpKTsKLSAgRVhQRUNUX1RIQVQoKml0LCBFcShFeHBlY3RhdGlvbigpKSk7Ci0gICsraXQ7Ci0gIEVYUEVDVF9UUlVFKGl0PT0gZXMuZW5kKCkpOwotfQotCi0vLyBUZXN0cyB0aGUgLkFmdGVyKCkgY2xhdXNlLgotCi1URVNUKEFmdGVyVGVzdCwgU3VjY2VlZHNXaGVuUGFydGlhbE9yZGVySXNTYXRpc2ZpZWQpIHsKLSAgTW9ja0EgYTsKLSAgRXhwZWN0YXRpb25TZXQgZXM7Ci0gIGVzICs9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIGVzICs9IEVYUEVDVF9DQUxMKGEsIERvQSgyKSk7Ci0gIEVYUEVDVF9DQUxMKGEsIERvQSgzKSkKLSAgICAgIC5BZnRlcihlcyk7Ci0KLSAgYS5Eb0EoMSk7Ci0gIGEuRG9BKDIpOwotICBhLkRvQSgzKTsKLX0KLQotVEVTVChBZnRlclRlc3QsIFN1Y2NlZWRzV2hlblRvdGFsT3JkZXJJc1NhdGlzZmllZCkgewotICBNb2NrQSBhOwotICBNb2NrQiBiOwotICAvLyBUaGUgZm9sbG93aW5nIGFsc28gdmVyaWZpZXMgdGhhdCBjb25zdCBFeHBlY3RhdGlvbiBvYmplY3RzIHdvcmsKLSAgLy8gdG9vLiAgRG8gbm90IHJlbW92ZSB0aGUgY29uc3QgbW9kaWZpZXJzLgotICBjb25zdCBFeHBlY3RhdGlvbiBlMSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIGNvbnN0IEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5BZnRlcihlMSk7Ci0gIEVYUEVDVF9DQUxMKGEsIERvQSgyKSkuQWZ0ZXIoZTIpOwotCi0gIGEuRG9BKDEpOwotICBiLkRvQigpOwotICBiLkRvQigpOwotICBhLkRvQSgyKTsKLX0KLQotLy8gQ2FsbHMgbXVzdCBiZSBpbiBzdHJpY3Qgb3JkZXIgd2hlbiBzcGVjaWZpZWQgc28gdXNpbmcgLkFmdGVyKCkuCi1URVNUKEFmdGVyVGVzdCwgQ2FsbHNNdXN0QmVJblN0cmljdE9yZGVyV2hlblNwZWNpZmllZFNvMSkgewotICBNb2NrQSBhOwotICBNb2NrQiBiOwotCi0gIC8vIERlZmluZSBvcmRlcmluZzoKLSAgLy8gICBhLkRvQSgxKSA9PT4gYi5Eb0IoKSA9PT4gYS5Eb0EoMikKLSAgRXhwZWN0YXRpb24gZTEgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOwotICBFeHBlY3RhdGlvbiBlMiA9IEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgLkFmdGVyKGUxKTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKQotICAgICAgLkFmdGVyKGUyKTsKLQotICBhLkRvQSgxKTsKLQotICAvLyBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgRG9CKCkuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGEuRG9BKDIpLCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLQotICBiLkRvQigpOwotICBhLkRvQSgyKTsKLX0KLQotLy8gQ2FsbHMgbXVzdCBiZSBpbiBzdHJpY3Qgb3JkZXIgd2hlbiBzcGVjaWZpZWQgc28gdXNpbmcgLkFmdGVyKCkuCi1URVNUKEFmdGVyVGVzdCwgQ2FsbHNNdXN0QmVJblN0cmljdE9yZGVyV2hlblNwZWNpZmllZFNvMikgewotICBNb2NrQSBhOwotICBNb2NrQiBiOwotCi0gIC8vIERlZmluZSBvcmRlcmluZzoKLSAgLy8gICBhLkRvQSgxKSA9PT4gYi5Eb0IoKSAqIDIgPT0+IGEuRG9BKDIpCi0gIEV4cGVjdGF0aW9uIGUxID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLkFmdGVyKGUxKTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKQotICAgICAgLkFmdGVyKGUyKTsKLQotICBhLkRvQSgxKTsKLSAgYi5Eb0IoKTsKLQotICAvLyBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHNlY29uZCBEb0IoKS4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5Eb0EoMiksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGIuRG9CKCk7Ci0gIGEuRG9BKDIpOwotfQotCi0vLyBDYWxscyBtdXN0IHNhdGlzZnkgdGhlIHBhcnRpYWwgb3JkZXIgd2hlbiBzcGVjaWZpZWQgc28uCi1URVNUKEFmdGVyVGVzdCwgQ2FsbHNNdXN0U2F0aXNmeVBhcnRpYWxPcmRlcldoZW5TcGVjaWZpZWRTbykgewotICBNb2NrQSBhOwotICBPTl9DQUxMKGEsIFJldHVyblJlc3VsdChfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihSZXN1bHQoKSkpOwotCi0gIC8vIERlZmluZSBvcmRlcmluZzoKLSAgLy8gICBhLkRvQSgxKSA9PT4KLSAgLy8gICBhLkRvQSgyKSA9PT4gYS5SZXR1cm5SZXN1bHQoMykKLSAgRXhwZWN0YXRpb24gZSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIGNvbnN0IEV4cGVjdGF0aW9uU2V0IGVzID0gRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKLSAgRVhQRUNUX0NBTEwoYSwgUmV0dXJuUmVzdWx0KDMpKQotICAgICAgLkFmdGVyKGUsIGVzKTsKLQotICAvLyBNYXkgb25seSBiZSBjYWxsZWQgbGFzdC4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5SZXR1cm5SZXN1bHQoMyksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGEuRG9BKDIpOwotICBhLkRvQSgxKTsKLSAgYS5SZXR1cm5SZXN1bHQoMyk7Ci19Ci0KLS8vIENhbGxzIG11c3Qgc2F0aXNmeSB0aGUgcGFydGlhbCBvcmRlciB3aGVuIHNwZWNpZmllZCBzby4KLVRFU1QoQWZ0ZXJUZXN0LCBDYWxsc011c3RTYXRpc2Z5UGFydGlhbE9yZGVyV2hlblNwZWNpZmllZFNvMikgewotICBNb2NrQSBhOwotCi0gIC8vIERlZmluZSBvcmRlcmluZzoKLSAgLy8gICBhLkRvQSgxKSA9PT4KLSAgLy8gICBhLkRvQSgyKSA9PT4gYS5Eb0EoMykKLSAgRXhwZWN0YXRpb24gZSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIGNvbnN0IEV4cGVjdGF0aW9uU2V0IGVzID0gRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDMpKQotICAgICAgLkFmdGVyKGUsIGVzKTsKLQotICBhLkRvQSgyKTsKLQotICAvLyBNYXkgb25seSBiZSBjYWxsZWQgbGFzdC4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5Eb0EoMyksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGEuRG9BKDEpOwotICBhLkRvQSgzKTsKLX0KLQotLy8gLkFmdGVyKCkgY2FuIGJlIGNvbWJpbmVkIHdpdGggLkluU2VxdWVuY2UoKS4KLVRFU1QoQWZ0ZXJUZXN0LCBDYW5CZVVzZWRXaXRoSW5TZXF1ZW5jZSkgewotICBNb2NrQSBhOwotICBTZXF1ZW5jZSBzOwotICBFeHBlY3RhdGlvbiBlID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKS5JblNlcXVlbmNlKHMpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpCi0gICAgICAuSW5TZXF1ZW5jZShzKQotICAgICAgLkFmdGVyKGUpOwotCi0gIGEuRG9BKDEpOwotCi0gIC8vIE1heSBvbmx5IGJlIGFmdGVyIERvQSgyKS4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5Eb0EoMyksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGEuRG9BKDIpOwotICBhLkRvQSgzKTsKLX0KLQotLy8gLkFmdGVyKCkgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLVRFU1QoQWZ0ZXJUZXN0LCBDYW5CZUNhbGxlZE1hbnlUaW1lcykgewotICBNb2NrQSBhOwotICBFeHBlY3RhdGlvbiBlMSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKLSAgRXhwZWN0YXRpb24gZTMgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoNCkpCi0gICAgICAuQWZ0ZXIoZTEpCi0gICAgICAuQWZ0ZXIoZTIpCi0gICAgICAuQWZ0ZXIoZTMpOwotCi0gIGEuRG9BKDMpOwotICBhLkRvQSgxKTsKLSAgYS5Eb0EoMik7Ci0gIGEuRG9BKDQpOwotfQotCi0vLyAuQWZ0ZXIoKSBhY2NlcHRzIHVwIHRvIDUgYXJndW1lbnRzLgotVEVTVChBZnRlclRlc3QsIEFjY2VwdHNVcFRvRml2ZUFyZ3VtZW50cykgewotICBNb2NrQSBhOwotICBFeHBlY3RhdGlvbiBlMSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7Ci0gIEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKLSAgRXhwZWN0YXRpb24gZTMgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpOwotICBFeHBlY3RhdGlvblNldCBlczEgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoNCkpOwotICBFeHBlY3RhdGlvblNldCBlczIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoNSkpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoNikpCi0gICAgICAuQWZ0ZXIoZTEsIGUyLCBlMywgZXMxLCBlczIpOwotCi0gIGEuRG9BKDUpOwotICBhLkRvQSgyKTsKLSAgYS5Eb0EoNCk7Ci0gIGEuRG9BKDEpOwotICBhLkRvQSgzKTsKLSAgYS5Eb0EoNik7Ci19Ci0KLS8vIC5BZnRlcigpIGFsbG93cyBpbnB1dCB0byBjb250YWluIGR1cGxpY2F0ZWQgRXhwZWN0YXRpb25zLgotVEVTVChBZnRlclRlc3QsIEFjY2VwdHNEdXBsaWNhdGVkSW5wdXQpIHsKLSAgTW9ja0EgYTsKLSAgT05fQ0FMTChhLCBSZXR1cm5SZXN1bHQoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oUmVzdWx0KCkpKTsKLQotICAvLyBEZWZpbmUgb3JkZXJpbmc6Ci0gIC8vICAgRG9BKDEpID09PgotICAvLyAgIERvQSgyKSA9PT4gUmV0dXJuUmVzdWx0KDMpCi0gIEV4cGVjdGF0aW9uIGUxID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOwotICBFeHBlY3RhdGlvblNldCBlczsKLSAgZXMgKz0gZTE7Ci0gIGVzICs9IGUyOwotICBFWFBFQ1RfQ0FMTChhLCBSZXR1cm5SZXN1bHQoMykpCi0gICAgICAuQWZ0ZXIoZTEsIGUyLCBlcywgZTEpOwotCi0gIGEuRG9BKDEpOwotCi0gIC8vIE1heSBvbmx5IGJlIGFmdGVyIERvQSgyKS4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5SZXR1cm5SZXN1bHQoMyksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOwotCi0gIGEuRG9BKDIpOwotICBhLlJldHVyblJlc3VsdCgzKTsKLX0KLQotLy8gQW4gRXhwZWN0YXRpb24gYWRkZWQgdG8gYW4gRXhwZWN0YXRpb25TZXQgYWZ0ZXIgaXQgaGFzIGJlZW4gdXNlZCBpbgotLy8gYW4gLkFmdGVyKCkgaGFzIG5vIGVmZmVjdC4KLVRFU1QoQWZ0ZXJUZXN0LCBDaGFuZ2VzVG9FeHBlY3RhdGlvblNldEhhdmVOb0VmZmVjdEFmdGVyd2FyZHMpIHsKLSAgTW9ja0EgYTsKLSAgRXhwZWN0YXRpb25TZXQgZXMxID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKLSAgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpCi0gICAgICAuQWZ0ZXIoZXMxKTsKLSAgZXMxICs9IGUyOwotCi0gIGEuRG9BKDEpOwotICBhLkRvQSgzKTsKLSAgYS5Eb0EoMik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgY29ycmVjdGx5IGhhbmRsZXMgY2FsbHMgdG8gbW9jayBmdW5jdGlvbnMKLS8vIGFmdGVyIGEgbW9jayBvYmplY3Qgb3duaW5nIG9uZSBvZiB0aGVpciBwcmUtcmVxdWlzaXRlcyBoYXMgZGllZC4KLQotLy8gVGVzdHMgdGhhdCBjYWxscyB0aGF0IHNhdGlzZnkgdGhlIG9yaWdpbmFsIHNwZWMgYXJlIHN1Y2Nlc3NmdWwuCi1URVNUKERlbGV0aW5nTW9ja0Vhcmx5VGVzdCwgU3VjY2VzczEpIHsKLSAgTW9ja0IqIGNvbnN0IGIxID0gbmV3IE1vY2tCOwotICBNb2NrQSogY29uc3QgYSA9IG5ldyBNb2NrQTsKLSAgTW9ja0IqIGNvbnN0IGIyID0gbmV3IE1vY2tCOwotCi0gIHsKLSAgICBJblNlcXVlbmNlIGR1bW15OwotICAgIEVYUEVDVF9DQUxMKCpiMSwgRG9CKF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqYSwgQmluYXJ5KF8sIF8pKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odHJ1ZSkpOwotICAgIEVYUEVDVF9DQUxMKCpiMiwgRG9CKF8pKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOwotICB9Ci0KLSAgRVhQRUNUX0VRKDEsIGIxLT5Eb0IoMSkpOwotICBkZWxldGUgYjE7Ci0gIC8vIGEncyBwcmUtcmVxdWlzaXRlIGhhcyBkaWVkLgotICBFWFBFQ1RfVFJVRShhLT5CaW5hcnkoMCwgMSkpOwotICBkZWxldGUgYjI7Ci0gIC8vIGEncyBzdWNjZXNzb3IgaGFzIGRpZWQuCi0gIEVYUEVDVF9UUlVFKGEtPkJpbmFyeSgxLCAyKSk7Ci0gIGRlbGV0ZSBhOwotfQotCi0vLyBUZXN0cyB0aGF0IGNhbGxzIHRoYXQgc2F0aXNmeSB0aGUgb3JpZ2luYWwgc3BlYyBhcmUgc3VjY2Vzc2Z1bC4KLVRFU1QoRGVsZXRpbmdNb2NrRWFybHlUZXN0LCBTdWNjZXNzMikgewotICBNb2NrQiogY29uc3QgYjEgPSBuZXcgTW9ja0I7Ci0gIE1vY2tBKiBjb25zdCBhID0gbmV3IE1vY2tBOwotICBNb2NrQiogY29uc3QgYjIgPSBuZXcgTW9ja0I7Ci0KLSAgewotICAgIEluU2VxdWVuY2UgZHVtbXk7Ci0gICAgRVhQRUNUX0NBTEwoKmIxLCBEb0IoXykpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOwotICAgIEVYUEVDVF9DQUxMKCphLCBCaW5hcnkoXywgXykpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwoKmIyLCBEb0IoXykpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7Ci0gIH0KLQotICBkZWxldGUgYTsgIC8vIGEgaXMgdHJpdmlhbGx5IHNhdGlzZmllZC4KLSAgRVhQRUNUX0VRKDEsIGIxLT5Eb0IoMSkpOwotICBFWFBFQ1RfRVEoMiwgYjItPkRvQigyKSk7Ci0gIGRlbGV0ZSBiMTsKLSAgZGVsZXRlIGIyOwotfQotCi0vLyBUZXN0cyB0aGF0IGl0J3MgT0sgdG8gZGVsZXRlIGEgbW9jayBvYmplY3QgaXRzZWxmIGluIGl0cyBhY3Rpb24uCi0KLS8vIFN1cHByZXNzZXMgd2FybmluZyBvbiB1bnJlZmVyZW5jZWQgZm9ybWFsIHBhcmFtZXRlciBpbiBNU1ZDIHdpdGgKLS8vIC1XNC4KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwdXNoKQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCi0jZW5kaWYKLQotQUNUSU9OX1AoRGVsZXRlLCBwdHIpIHsgZGVsZXRlIHB0cjsgfQotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCi0KLVRFU1QoRGVsZXRpbmdNb2NrRWFybHlUZXN0LCBDYW5EZWxldGVTZWxmSW5BY3Rpb25SZXR1cm5pbmdWb2lkKSB7Ci0gIE1vY2tBKiBjb25zdCBhID0gbmV3IE1vY2tBOwotICBFWFBFQ1RfQ0FMTCgqYSwgRG9BKF8pKS5XaWxsT25jZShEZWxldGUoYSkpOwotICBhLT5Eb0EoNDIpOyAgLy8gVGhpcyB3aWxsIGNhdXNlIGEgdG8gYmUgZGVsZXRlZC4KLX0KLQotVEVTVChEZWxldGluZ01vY2tFYXJseVRlc3QsIENhbkRlbGV0ZVNlbGZJbkFjdGlvblJldHVybmluZ1ZhbHVlKSB7Ci0gIE1vY2tBKiBjb25zdCBhID0gbmV3IE1vY2tBOwotICBFWFBFQ1RfQ0FMTCgqYSwgUmV0dXJuUmVzdWx0KF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKERlbGV0ZShhKSwgUmV0dXJuKFJlc3VsdCgpKSkpOwotICBhLT5SZXR1cm5SZXN1bHQoNDIpOyAgLy8gVGhpcyB3aWxsIGNhdXNlIGEgdG8gYmUgZGVsZXRlZC4KLX0KLQotLy8gVGVzdHMgdGhhdCBjYWxscyB0aGF0IHZpb2xhdGUgdGhlIG9yaWdpbmFsIHNwZWMgeWllbGQgZmFpbHVyZXMuCi1URVNUKERlbGV0aW5nTW9ja0Vhcmx5VGVzdCwgRmFpbHVyZTEpIHsKLSAgTW9ja0IqIGNvbnN0IGIxID0gbmV3IE1vY2tCOwotICBNb2NrQSogY29uc3QgYSA9IG5ldyBNb2NrQTsKLSAgTW9ja0IqIGNvbnN0IGIyID0gbmV3IE1vY2tCOwotCi0gIHsKLSAgICBJblNlcXVlbmNlIGR1bW15OwotICAgIEVYUEVDVF9DQUxMKCpiMSwgRG9CKF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLSAgICBFWFBFQ1RfQ0FMTCgqYSwgQmluYXJ5KF8sIF8pKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotICAgIEVYUEVDVF9DQUxMKCpiMiwgRG9CKF8pKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOwotICB9Ci0KLSAgZGVsZXRlIGE7ICAvLyBhIGlzIHRyaXZpYWxseSBzYXRpc2ZpZWQuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKLSAgICBiMi0+RG9CKDIpOwotICB9LCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLSAgRVhQRUNUX0VRKDEsIGIxLT5Eb0IoMSkpOwotICBkZWxldGUgYjE7Ci0gIGRlbGV0ZSBiMjsKLX0KLQotLy8gVGVzdHMgdGhhdCBjYWxscyB0aGF0IHZpb2xhdGUgdGhlIG9yaWdpbmFsIHNwZWMgeWllbGQgZmFpbHVyZXMuCi1URVNUKERlbGV0aW5nTW9ja0Vhcmx5VGVzdCwgRmFpbHVyZTIpIHsKLSAgTW9ja0IqIGNvbnN0IGIxID0gbmV3IE1vY2tCOwotICBNb2NrQSogY29uc3QgYSA9IG5ldyBNb2NrQTsKLSAgTW9ja0IqIGNvbnN0IGIyID0gbmV3IE1vY2tCOwotCi0gIHsKLSAgICBJblNlcXVlbmNlIGR1bW15OwotICAgIEVYUEVDVF9DQUxMKCpiMSwgRG9CKF8pKTsKLSAgICBFWFBFQ1RfQ0FMTCgqYSwgQmluYXJ5KF8sIF8pKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotICAgIEVYUEVDVF9DQUxMKCpiMiwgRG9CKF8pKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotICB9Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoZGVsZXRlIGIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsOiBuZXZlciBjYWxsZWQiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS0+QmluYXJ5KDAsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYjItPkRvQigxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7Ci0gIGRlbGV0ZSBhOwotICBkZWxldGUgYjI7Ci19Ci0KLWNsYXNzIEV2ZW5OdW1iZXJDYXJkaW5hbGl0eSA6IHB1YmxpYyBDYXJkaW5hbGl0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCi0gIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbGxfY291bnQgJSAyID09IDA7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXR1cmF0ZSB0aGlzIGNhcmRpbmFsaXR5LgotICB2aXJ0dWFsIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgLyogY2FsbF9jb3VudCAqLykgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIERlc2NyaWJlcyBzZWxmIHRvIGFuIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiY2FsbGVkIGV2ZW4gbnVtYmVyIG9mIHRpbWVzIjsKLSAgfQotfTsKLQotQ2FyZGluYWxpdHkgRXZlbk51bWJlcigpIHsKLSAgcmV0dXJuIENhcmRpbmFsaXR5KG5ldyBFdmVuTnVtYmVyQ2FyZGluYWxpdHkpOwotfQotCi1URVNUKEV4cGVjdGF0aW9uQmFzZVRlc3QsCi0gICAgIEFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWRXb3Jrc0Zvck5vbk1vbm90b25pY0NhcmRpbmFsaXR5KSB7Ci0gIE1vY2tBKiBhID0gbmV3IE1vY2tBOwotICBTZXF1ZW5jZSBzOwotCi0gIEVYUEVDVF9DQUxMKCphLCBEb0EoMSkpCi0gICAgICAuVGltZXMoRXZlbk51bWJlcigpKQotICAgICAgLkluU2VxdWVuY2Uocyk7Ci0gIEVYUEVDVF9DQUxMKCphLCBEb0EoMikpCi0gICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAuSW5TZXF1ZW5jZShzKTsKLSAgRVhQRUNUX0NBTEwoKmEsIERvQSgzKSkKLSAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0KLSAgYS0+RG9BKDMpOwotICBhLT5Eb0EoMSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGEtPkRvQSgyKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGRlbGV0ZSBhLCAidG8gYmUgY2FsbGVkIGV2ZW4gbnVtYmVyIG9mIHRpbWVzIik7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgdmVyaWZ5IHRoZSBtZXNzYWdlIGdlbmVyYXRlZCB3aGVuIGEgbW9jawotLy8gZnVuY3Rpb24gaXMgY2FsbGVkLgotCi1zdHJ1Y3QgUHJpbnRhYmxlIHsKLX07Ci0KLWlubGluZSB2b2lkIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBQcmludGFibGUmKSB7Ci0gIG9zIDw8ICJQcmludGFibGUiOwotfQotCi1zdHJ1Y3QgVW5wcmludGFibGUgewotICBVbnByaW50YWJsZSgpIDogdmFsdWUoMCkge30KLSAgaW50IHZhbHVlOwotfTsKLQotY2xhc3MgTW9ja0MgewotIHB1YmxpYzoKLSAgTW9ja0MoKSB7fQotCi0gIE1PQ0tfTUVUSE9ENihWb2lkTWV0aG9kLCB2b2lkKGJvb2wgY29uZCwgaW50IG4sIHN0cmluZyBzLCB2b2lkKiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGFibGUmIHgsIFVucHJpbnRhYmxlIHkpKTsKLSAgTU9DS19NRVRIT0QwKE5vblZvaWRNZXRob2QsIGludCgpKTsgIC8vIE5PTElOVAotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrQyk7Ci19OwotCi1jbGFzcyBWZXJib3NlRmxhZ1ByZXNlcnZpbmdGaXh0dXJlIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgVmVyYm9zZUZsYWdQcmVzZXJ2aW5nRml4dHVyZSgpCi0gICAgICA6IHNhdmVkX3ZlcmJvc2VfZmxhZ18oR01PQ0tfRkxBRyh2ZXJib3NlKSkge30KLQotICB+VmVyYm9zZUZsYWdQcmVzZXJ2aW5nRml4dHVyZSgpIHsgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX3ZlcmJvc2VfZmxhZ187IH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IHN0cmluZyBzYXZlZF92ZXJib3NlX2ZsYWdfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmVyYm9zZUZsYWdQcmVzZXJ2aW5nRml4dHVyZSk7Ci19OwotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBUZXN0cyB0aGF0IGFuIHVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIG9uIGEgbmFnZ3kgbW9jawotLy8gZ2VuZXJhdGVzIGEgd2FybmluZyB3aXRob3V0IHRoZSBzdGFjayB0cmFjZSB3aGVuCi0vLyAtLWdtb2NrX3ZlcmJvc2U9d2FybmluZyBpcyBzcGVjaWZpZWQuCi1URVNUKEZ1bmN0aW9uQ2FsbE1lc3NhZ2VUZXN0LAotICAgICBVbmludGVyZXN0aW5nQ2FsbE9uTmFnZ3lNb2NrR2VuZXJhdGVzTm9TdGFja1RyYWNlV2hlblZlcmJvc2VXYXJuaW5nKSB7Ci0gIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBrV2FybmluZ1ZlcmJvc2l0eTsKLSAgTmFnZ3lNb2NrPE1vY2tDPiBjOwotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIGMuVm9pZE1ldGhvZChmYWxzZSwgNSwgIkhpIiwgTlVMTCwgUHJpbnRhYmxlKCksIFVucHJpbnRhYmxlKCkpOwotICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiR01PQ0sgV0FSTklORyIsIG91dHB1dCk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNOb3RTdWJzdHJpbmcsICJTdGFjayB0cmFjZToiLCBvdXRwdXQpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFuIHVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIG9uIGEgbmFnZ3kgbW9jawotLy8gZ2VuZXJhdGVzIGEgd2FybmluZyBjb250YWluaW5nIHRoZSBzdGFjayB0cmFjZSB3aGVuCi0vLyAtLWdtb2NrX3ZlcmJvc2U9aW5mbyBpcyBzcGVjaWZpZWQuCi1URVNUKEZ1bmN0aW9uQ2FsbE1lc3NhZ2VUZXN0LAotICAgICBVbmludGVyZXN0aW5nQ2FsbE9uTmFnZ3lNb2NrR2VuZXJhdGVzRnlpV2l0aFN0YWNrVHJhY2VXaGVuVmVyYm9zZUluZm8pIHsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtJbmZvVmVyYm9zaXR5OwotICBOYWdneU1vY2s8TW9ja0M+IGM7Ci0gIENhcHR1cmVTdGRvdXQoKTsKLSAgYy5Wb2lkTWV0aG9kKGZhbHNlLCA1LCAiSGkiLCBOVUxMLCBQcmludGFibGUoKSwgVW5wcmludGFibGUoKSk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dCA9IEdldENhcHR1cmVkU3Rkb3V0KCk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJHTU9DSyBXQVJOSU5HIiwgb3V0cHV0KTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgIlN0YWNrIHRyYWNlOiIsIG91dHB1dCk7Ci0KLSMgaWZuZGVmIE5ERUJVRwotCi0gIC8vIFdlIGNoZWNrIHRoZSBzdGFjayB0cmFjZSBjb250ZW50IGluIGRiZy1tb2RlIG9ubHksIGFzIG9wdC1tb2RlCi0gIC8vIG1heSBpbmxpbmUgdGhlIGNhbGwgd2UgYXJlIGludGVyZXN0ZWQgaW4gc2VlaW5nLgotCi0gIC8vIFZlcmlmaWVzIHRoYXQgYSB2b2lkIG1vY2sgZnVuY3Rpb24ncyBuYW1lIGFwcGVhcnMgaW4gdGhlIHN0YWNrCi0gIC8vIHRyYWNlLgotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiVm9pZE1ldGhvZCgiLCBvdXRwdXQpOwotCi0gIC8vIFZlcmlmaWVzIHRoYXQgYSBub24tdm9pZCBtb2NrIGZ1bmN0aW9uJ3MgbmFtZSBhcHBlYXJzIGluIHRoZQotICAvLyBzdGFjayB0cmFjZS4KLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBjLk5vblZvaWRNZXRob2QoKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0MiA9IEdldENhcHR1cmVkU3Rkb3V0KCk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJOb25Wb2lkTWV0aG9kKCIsIG91dHB1dDIpOwotCi0jIGVuZGlmICAvLyBOREVCVUcKLX0KLQotLy8gVGVzdHMgdGhhdCBhbiB1bmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCBvbiBhIG5hZ2d5IG1vY2sKLS8vIGNhdXNlcyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUgdG8gYmUgcHJpbnRlZC4KLVRFU1QoRnVuY3Rpb25DYWxsTWVzc2FnZVRlc3QsCi0gICAgIFVuaW50ZXJlc3RpbmdDYWxsT25OYWdneU1vY2tQcmludHNBcmd1bWVudHNBbmRSZXR1cm5WYWx1ZSkgewotICAvLyBBIG5vbi12b2lkIG1vY2sgZnVuY3Rpb24uCi0gIE5hZ2d5TW9jazxNb2NrQj4gYjsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBiLkRvQigpOwotICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQxID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMigKLSAgICAgIElzU3Vic3RyaW5nLAotICAgICAgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuXG4iCi0gICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IERvQigpXG4iCi0gICAgICAiICAgICAgICAgIFJldHVybnM6IDBcbiIsIG91dHB1dDEuY19zdHIoKSk7Ci0gIC8vIE1ha2VzIHN1cmUgdGhlIHJldHVybiB2YWx1ZSBpcyBwcmludGVkLgotCi0gIC8vIEEgdm9pZCBtb2NrIGZ1bmN0aW9uLgotICBOYWdneU1vY2s8TW9ja0M+IGM7Ci0gIENhcHR1cmVTdGRvdXQoKTsKLSAgYy5Wb2lkTWV0aG9kKGZhbHNlLCA1LCAiSGkiLCBOVUxMLCBQcmludGFibGUoKSwgVW5wcmludGFibGUoKSk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dDIgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOwotICBFWFBFQ1RfVEhBVChvdXRwdXQyLmNfc3RyKCksCi0gICAgICAgICAgICAgIENvbnRhaW5zUmVnZXgoCi0gICAgICAgICAgICAgICAgICAiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGlyZWN0bHlcXC5cbiIKLSAgICAgICAgICAgICAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogVm9pZE1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICJcXChmYWxzZSwgNSwgXCJIaVwiLCBOVUxMLCBALisgIgotICAgICAgICAgICAgICAgICAgIlByaW50YWJsZSwgNC1ieXRlIG9iamVjdCA8MDAtMDAgMDAtMDA+XFwpIikpOwotICAvLyBBIHZvaWQgZnVuY3Rpb24gaGFzIG5vIHJldHVybiB2YWx1ZSB0byBwcmludC4KLX0KLQotLy8gVGVzdHMgaG93IHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBhZmZlY3RzIEdvb2dsZSBNb2NrJ3Mgb3V0cHV0LgotCi1jbGFzcyBHTW9ja1ZlcmJvc2VGbGFnVGVzdCA6IHB1YmxpYyBWZXJib3NlRmxhZ1ByZXNlcnZpbmdGaXh0dXJlIHsKLSBwdWJsaWM6Ci0gIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIEdvb2dsZSBNb2NrIG91dHB1dCBpcyBjb3JyZWN0LiAgKFdoZW4KLSAgLy8gc2hvdWxkX3ByaW50IGlzIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIG1hdGNoIHRoZSBnaXZlbiByZWdleCBhbmQKLSAgLy8gY29udGFpbiB0aGUgZ2l2ZW4gZnVuY3Rpb24gbmFtZSBpbiB0aGUgc3RhY2sgdHJhY2UuICBXaGVuIGl0J3MKLSAgLy8gZmFsc2UsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGVtcHR5LikKLSAgdm9pZCBWZXJpZnlPdXRwdXQoY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dCwgYm9vbCBzaG91bGRfcHJpbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZ1bmN0aW9uX25hbWUpIHsKLSAgICBpZiAoc2hvdWxkX3ByaW50KSB7Ci0gICAgICBFWFBFQ1RfVEhBVChvdXRwdXQuY19zdHIoKSwgSGFzU3Vic3RyKGV4cGVjdGVkX3N1YnN0cmluZykpOwotIyBpZm5kZWYgTkRFQlVHCi0gICAgICAvLyBXZSBjaGVjayB0aGUgc3RhY2sgdHJhY2UgY29udGVudCBpbiBkYmctbW9kZSBvbmx5LCBhcyBvcHQtbW9kZQotICAgICAgLy8gbWF5IGlubGluZSB0aGUgY2FsbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBzZWVpbmcuCi0gICAgICBFWFBFQ1RfVEhBVChvdXRwdXQuY19zdHIoKSwgSGFzU3Vic3RyKGZ1bmN0aW9uX25hbWUpKTsKLSMgZWxzZQotICAgICAgLy8gU3VwcHJlc3NlcyAndW51c2VkIGZ1bmN0aW9uIHBhcmFtZXRlcicgd2FybmluZ3MuCi0gICAgICBzdGF0aWNfY2FzdDx2b2lkPihmdW5jdGlvbl9uYW1lKTsKLSMgZW5kaWYgIC8vIE5ERUJVRwotICAgIH0gZWxzZSB7Ci0gICAgICBFWFBFQ1RfU1RSRVEoIiIsIG91dHB1dC5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBUZXN0cyBob3cgdGhlIGZsYWcgYWZmZWN0cyBleHBlY3RlZCBjYWxscy4KLSAgdm9pZCBUZXN0RXhwZWN0ZWRDYWxsKGJvb2wgc2hvdWxkX3ByaW50KSB7Ci0gICAgTW9ja0EgYTsKLSAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoNSkpOwotICAgIEVYUEVDVF9DQUxMKGEsIEJpbmFyeShfLCAxKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0KLSAgICAvLyBBIHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLgotICAgIENhcHR1cmVTdGRvdXQoKTsKLSAgICBhLkRvQSg1KTsKLSAgICBWZXJpZnlPdXRwdXQoCi0gICAgICAgIEdldENhcHR1cmVkU3Rkb3V0KCksCi0gICAgICAgIHNob3VsZF9wcmludCwKLSAgICAgICAgIk1vY2sgZnVuY3Rpb24gY2FsbCBtYXRjaGVzIEVYUEVDVF9DQUxMKGEsIERvQSg1KSkuLi5cbiIKLSAgICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBEb0EoNSlcbiIKLSAgICAgICAgIlN0YWNrIHRyYWNlOlxuIiwKLSAgICAgICAgIkRvQSIpOwotCi0gICAgLy8gQSBub24tdm9pZC1yZXR1cm5pbmcgZnVuY3Rpb24uCi0gICAgQ2FwdHVyZVN0ZG91dCgpOwotICAgIGEuQmluYXJ5KDIsIDEpOwotICAgIFZlcmlmeU91dHB1dCgKLSAgICAgICAgR2V0Q2FwdHVyZWRTdGRvdXQoKSwKLSAgICAgICAgc2hvdWxkX3ByaW50LAotICAgICAgICAiTW9jayBmdW5jdGlvbiBjYWxsIG1hdGNoZXMgRVhQRUNUX0NBTEwoYSwgQmluYXJ5KF8sIDEpKS4uLlxuIgotICAgICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IEJpbmFyeSgyLCAxKVxuIgotICAgICAgICAiICAgICAgICAgIFJldHVybnM6IHRydWVcbiIKLSAgICAgICAgIlN0YWNrIHRyYWNlOlxuIiwKLSAgICAgICAgIkJpbmFyeSIpOwotICB9Ci0KLSAgLy8gVGVzdHMgaG93IHRoZSBmbGFnIGFmZmVjdHMgdW5pbnRlcmVzdGluZyBjYWxscyBvbiBhIG5hZ2d5IG1vY2suCi0gIHZvaWQgVGVzdFVuaW50ZXJlc3RpbmdDYWxsT25OYWdneU1vY2soYm9vbCBzaG91bGRfcHJpbnQpIHsKLSAgICBOYWdneU1vY2s8TW9ja0E+IGE7Ci0gICAgY29uc3Qgc3RyaW5nIG5vdGUgPQotICAgICAgICAiTk9URTogWW91IGNhbiBzYWZlbHkgaWdub3JlIHRoZSBhYm92ZSB3YXJuaW5nIHVubGVzcyB0aGlzICIKLSAgICAgICAgImNhbGwgc2hvdWxkIG5vdCBoYXBwZW4uICBEbyBub3Qgc3VwcHJlc3MgaXQgYnkgYmxpbmRseSBhZGRpbmcgIgotICAgICAgICAiYW4gRVhQRUNUX0NBTEwoKSBpZiB5b3UgZG9uJ3QgbWVhbiB0byBlbmZvcmNlIHRoZSBjYWxsLiAgIgotICAgICAgICAiU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjIgotICAgICAgICAiS25vd2luZ19XaGVuX3RvX0V4cGVjdCBmb3IgZGV0YWlscy4iOwotCi0gICAgLy8gQSB2b2lkLXJldHVybmluZyBmdW5jdGlvbi4KLSAgICBDYXB0dXJlU3Rkb3V0KCk7Ci0gICAgYS5Eb0EoNSk7Ci0gICAgVmVyaWZ5T3V0cHV0KAotICAgICAgICBHZXRDYXB0dXJlZFN0ZG91dCgpLAotICAgICAgICBzaG91bGRfcHJpbnQsCi0gICAgICAgICJcbkdNT0NLIFdBUk5JTkc6XG4iCi0gICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkaXJlY3RseS5cbiIKLSAgICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBEb0EoNSlcbiIgKwotICAgICAgICBub3RlLAotICAgICAgICAiRG9BIik7Ci0KLSAgICAvLyBBIG5vbi12b2lkLXJldHVybmluZyBmdW5jdGlvbi4KLSAgICBDYXB0dXJlU3Rkb3V0KCk7Ci0gICAgYS5CaW5hcnkoMiwgMSk7Ci0gICAgVmVyaWZ5T3V0cHV0KAotICAgICAgICBHZXRDYXB0dXJlZFN0ZG91dCgpLAotICAgICAgICBzaG91bGRfcHJpbnQsCi0gICAgICAgICJcbkdNT0NLIFdBUk5JTkc6XG4iCi0gICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLlxuIgotICAgICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IEJpbmFyeSgyLCAxKVxuIgotICAgICAgICAiICAgICAgICAgIFJldHVybnM6IGZhbHNlXG4iICsKLSAgICAgICAgbm90ZSwKLSAgICAgICAgIkJpbmFyeSIpOwotICB9Ci19OwotCi0vLyBUZXN0cyB0aGF0IC0tZ21vY2tfdmVyYm9zZT1pbmZvIGNhdXNlcyBib3RoIGV4cGVjdGVkIGFuZAotLy8gdW5pbnRlcmVzdGluZyBjYWxscyB0byBiZSByZXBvcnRlZC4KLVRFU1RfRihHTW9ja1ZlcmJvc2VGbGFnVGVzdCwgSW5mbykgewotICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0luZm9WZXJib3NpdHk7Ci0gIFRlc3RFeHBlY3RlZENhbGwodHJ1ZSk7Ci0gIFRlc3RVbmludGVyZXN0aW5nQ2FsbE9uTmFnZ3lNb2NrKHRydWUpOwotfQotCi0vLyBUZXN0cyB0aGF0IC0tZ21vY2tfdmVyYm9zZT13YXJuaW5nIGNhdXNlcyB1bmludGVyZXN0aW5nIGNhbGxzIHRvIGJlCi0vLyByZXBvcnRlZC4KLVRFU1RfRihHTW9ja1ZlcmJvc2VGbGFnVGVzdCwgV2FybmluZykgewotICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga1dhcm5pbmdWZXJib3NpdHk7Ci0gIFRlc3RFeHBlY3RlZENhbGwoZmFsc2UpOwotICBUZXN0VW5pbnRlcmVzdGluZ0NhbGxPbk5hZ2d5TW9jayh0cnVlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCAtLWdtb2NrX3ZlcmJvc2U9d2FybmluZyBjYXVzZXMgbmVpdGhlciBleHBlY3RlZCBub3IKLS8vIHVuaW50ZXJlc3RpbmcgY2FsbHMgdG8gYmUgcmVwb3J0ZWQuCi1URVNUX0YoR01vY2tWZXJib3NlRmxhZ1Rlc3QsIEVycm9yKSB7Ci0gIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBrRXJyb3JWZXJib3NpdHk7Ci0gIFRlc3RFeHBlY3RlZENhbGwoZmFsc2UpOwotICBUZXN0VW5pbnRlcmVzdGluZ0NhbGxPbk5hZ2d5TW9jayhmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgLS1nbW9ja192ZXJib3NlPVNPTUVfSU5WQUxJRF9WQUxVRSBoYXMgdGhlIHNhbWUgZWZmZWN0Ci0vLyBhcyAtLWdtb2NrX3ZlcmJvc2U9d2FybmluZy4KLVRFU1RfRihHTW9ja1ZlcmJvc2VGbGFnVGVzdCwgSW52YWxpZEZsYWdJc1RyZWF0ZWRBc1dhcm5pbmcpIHsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJpbnZhbGlkIjsgIC8vIFRyZWF0ZWQgYXMgIndhcm5pbmciLgotICBUZXN0RXhwZWN0ZWRDYWxsKGZhbHNlKTsKLSAgVGVzdFVuaW50ZXJlc3RpbmdDYWxsT25OYWdneU1vY2sodHJ1ZSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBBIGhlbHBlciBjbGFzcyB0aGF0IGdlbmVyYXRlcyBhIGZhaWx1cmUgd2hlbiBwcmludGVkLiAgV2UgdXNlIGl0IHRvCi0vLyBlbnN1cmUgdGhhdCBHb29nbGUgTW9jayBkb2Vzbid0IHByaW50IGEgdmFsdWUgKGV2ZW4gdG8gYW4gaW50ZXJuYWwKLS8vIGJ1ZmZlcikgd2hlbiBpdCBpcyBub3Qgc3VwcG9zZWQgdG8gZG8gc28uCi1jbGFzcyBQcmludE1lTm90IHt9OwotCi12b2lkIFByaW50VG8oUHJpbnRNZU5vdCAvKiBkdW1teSAqLywgOjpzdGQ6Om9zdHJlYW0qIC8qIG9zICovKSB7Ci0gIEFERF9GQUlMVVJFKCkgPDwgIkdvb2dsZSBNb2NrIGlzIHByaW50aW5nIGEgdmFsdWUgdGhhdCBzaG91bGRuJ3QgYmUgIgotICAgICAgICAgICAgICAgIDw8ICJwcmludGVkIGV2ZW4gdG8gYW4gaW50ZXJuYWwgYnVmZmVyLiI7Ci19Ci0KLWNsYXNzIExvZ1Rlc3RIZWxwZXIgewotIHB1YmxpYzoKLSAgTG9nVGVzdEhlbHBlcigpIHt9Ci0KLSAgTU9DS19NRVRIT0QxKEZvbywgUHJpbnRNZU5vdChQcmludE1lTm90KSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKExvZ1Rlc3RIZWxwZXIpOwotfTsKLQotY2xhc3MgR01vY2tMb2dUZXN0IDogcHVibGljIFZlcmJvc2VGbGFnUHJlc2VydmluZ0ZpeHR1cmUgewotIHByb3RlY3RlZDoKLSAgTG9nVGVzdEhlbHBlciBoZWxwZXJfOwotfTsKLQotVEVTVF9GKEdNb2NrTG9nVGVzdCwgRG9lc05vdFByaW50R29vZENhbGxJbnRlcm5hbGx5SWZWZXJib3NpdHlJc1dhcm5pbmcpIHsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtXYXJuaW5nVmVyYm9zaXR5OwotICBFWFBFQ1RfQ0FMTChoZWxwZXJfLCBGb28oXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKFByaW50TWVOb3QoKSkpOwotICBoZWxwZXJfLkZvbyhQcmludE1lTm90KCkpOyAgLy8gVGhpcyBpcyBhbiBleHBlY3RlZCBjYWxsLgotfQotCi1URVNUX0YoR01vY2tMb2dUZXN0LCBEb2VzTm90UHJpbnRHb29kQ2FsbEludGVybmFsbHlJZlZlcmJvc2l0eUlzRXJyb3IpIHsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtFcnJvclZlcmJvc2l0eTsKLSAgRVhQRUNUX0NBTEwoaGVscGVyXywgRm9vKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybihQcmludE1lTm90KCkpKTsKLSAgaGVscGVyXy5Gb28oUHJpbnRNZU5vdCgpKTsgIC8vIFRoaXMgaXMgYW4gZXhwZWN0ZWQgY2FsbC4KLX0KLQotVEVTVF9GKEdNb2NrTG9nVGVzdCwgRG9lc05vdFByaW50V2FybmluZ0ludGVybmFsbHlJZlZlcmJvc2l0eUlzRXJyb3IpIHsKLSAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtFcnJvclZlcmJvc2l0eTsKLSAgT05fQ0FMTChoZWxwZXJfLCBGb28oXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oUHJpbnRNZU5vdCgpKSk7Ci0gIGhlbHBlcl8uRm9vKFByaW50TWVOb3QoKSk7ICAvLyBUaGlzIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcuCi19Ci0KLS8vIFRlc3RzIE1vY2s6OkFsbG93TGVhaygpLgotCi1URVNUKEFsbG93TGVha1Rlc3QsIEFsbG93c0xlYWtpbmdVbnVzZWRNb2NrT2JqZWN0KSB7Ci0gIE1vY2tBKiBhID0gbmV3IE1vY2tBOwotICBNb2NrOjpBbGxvd0xlYWsoYSk7Ci19Ci0KLVRFU1QoQWxsb3dMZWFrVGVzdCwgQ2FuQmVDYWxsZWRCZWZvcmVPbkNhbGwpIHsKLSAgTW9ja0EqIGEgPSBuZXcgTW9ja0E7Ci0gIE1vY2s6OkFsbG93TGVhayhhKTsKLSAgT05fQ0FMTCgqYSwgRG9BKF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgYS0+RG9BKDApOwotfQotCi1URVNUKEFsbG93TGVha1Rlc3QsIENhbkJlQ2FsbGVkQWZ0ZXJPbkNhbGwpIHsKLSAgTW9ja0EqIGEgPSBuZXcgTW9ja0E7Ci0gIE9OX0NBTEwoKmEsIERvQShfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci0gIE1vY2s6OkFsbG93TGVhayhhKTsKLX0KLQotVEVTVChBbGxvd0xlYWtUZXN0LCBDYW5CZUNhbGxlZEJlZm9yZUV4cGVjdENhbGwpIHsKLSAgTW9ja0EqIGEgPSBuZXcgTW9ja0E7Ci0gIE1vY2s6OkFsbG93TGVhayhhKTsKLSAgRVhQRUNUX0NBTEwoKmEsIERvQShfKSk7Ci0gIGEtPkRvQSgwKTsKLX0KLQotVEVTVChBbGxvd0xlYWtUZXN0LCBDYW5CZUNhbGxlZEFmdGVyRXhwZWN0Q2FsbCkgewotICBNb2NrQSogYSA9IG5ldyBNb2NrQTsKLSAgRVhQRUNUX0NBTEwoKmEsIERvQShfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICBNb2NrOjpBbGxvd0xlYWsoYSk7Ci19Ci0KLVRFU1QoQWxsb3dMZWFrVGVzdCwgV29ya3NXaGVuQm90aE9uQ2FsbEFuZEV4cGVjdENhbGxBcmVQcmVzZW50KSB7Ci0gIE1vY2tBKiBhID0gbmV3IE1vY2tBOwotICBPTl9DQUxMKCphLCBEb0EoXykpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotICBFWFBFQ1RfQ0FMTCgqYSwgRG9BKF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gIE1vY2s6OkFsbG93TGVhayhhKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3ZSBjYW4gdmVyaWZ5IGFuZCBjbGVhciBhIG1vY2sgb2JqZWN0J3MgZXhwZWN0YXRpb25zCi0vLyB3aGVuIG5vbmUgb2YgaXRzIG1ldGhvZHMgaGFzIGV4cGVjdGF0aW9ucy4KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNUZXN0LCBOb01ldGhvZEhhc0V4cGVjdGF0aW9ucykgewotICBNb2NrQiBiOwotICBBU1NFUlRfVFJVRShNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYikpOwotCi0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBleHBlY3RhdGlvbnMgb24gdGhlIG1ldGhvZHMgbm93LCBzbyB3ZSBjYW4KLSAgLy8gZnJlZWx5IGNhbGwgdGhlbS4KLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoMSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiB2ZXJpZnkgYW5kIGNsZWFyIGEgbW9jayBvYmplY3QncyBleHBlY3RhdGlvbnMKLS8vIHdoZW4gc29tZSwgYnV0IG5vdCBhbGwsIG9mIGl0cyBtZXRob2RzIGhhdmUgZXhwZWN0YXRpb25zICphbmQqIHRoZQotLy8gdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLgotVEVTVChWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc1Rlc3QsIFNvbWVNZXRob2RzSGF2ZUV4cGVjdGF0aW9uc0FuZFN1Y2NlZWQpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLSAgYi5Eb0IoKTsKLSAgQVNTRVJUX1RSVUUoTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmIpKTsKLQotICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXhwZWN0YXRpb25zIG9uIHRoZSBtZXRob2RzIG5vdywgc28gd2UgY2FuCi0gIC8vIGZyZWVseSBjYWxsIHRoZW0uCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKLSAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3ZSBjYW4gdmVyaWZ5IGFuZCBjbGVhciBhIG1vY2sgb2JqZWN0J3MgZXhwZWN0YXRpb25zCi0vLyB3aGVuIHNvbWUsIGJ1dCBub3QgYWxsLCBvZiBpdHMgbWV0aG9kcyBoYXZlIGV4cGVjdGF0aW9ucyAqYW5kKiB0aGUKLS8vIHZlcmlmaWNhdGlvbiBmYWlscy4KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNUZXN0LCBTb21lTWV0aG9kc0hhdmVFeHBlY3RhdGlvbnNBbmRGYWlsKSB7Ci0gIE1vY2tCIGI7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7Ci0gIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUocmVzdWx0ID0gTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsOiBuZXZlciBjYWxsZWQiKTsKLSAgQVNTRVJUX0ZBTFNFKHJlc3VsdCk7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgotICAvLyBmcmVlbHkgY2FsbCB0aGVtLgotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2UgY2FuIHZlcmlmeSBhbmQgY2xlYXIgYSBtb2NrIG9iamVjdCdzIGV4cGVjdGF0aW9ucwotLy8gd2hlbiBhbGwgb2YgaXRzIG1ldGhvZHMgaGF2ZSBleHBlY3RhdGlvbnMuCi1URVNUKFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zVGVzdCwgQWxsTWV0aG9kc0hhdmVFeHBlY3RhdGlvbnMpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0gIGIuRG9CKCk7Ci0gIGIuRG9CKDEpOwotICBBU1NFUlRfVFJVRShNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYikpOwotCi0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBleHBlY3RhdGlvbnMgb24gdGhlIG1ldGhvZHMgbm93LCBzbyB3ZSBjYW4KLSAgLy8gZnJlZWx5IGNhbGwgdGhlbS4KLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoMSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiB2ZXJpZnkgYW5kIGNsZWFyIGEgbW9jayBvYmplY3QncyBleHBlY3RhdGlvbnMKLS8vIHdoZW4gYSBtZXRob2QgaGFzIG1vcmUgdGhhbiBvbmUgZXhwZWN0YXRpb24uCi1URVNUKFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zVGVzdCwgQU1ldGhvZEhhc01hbnlFeHBlY3RhdGlvbnMpIHsKLSAgTW9ja0IgYjsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDApKQotICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQihfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOwotICBiLkRvQigxKTsKLSAgYm9vbCByZXN1bHQgPSB0cnVlOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShyZXN1bHQgPSBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJBY3R1YWw6IG5ldmVyIGNhbGxlZCIpOwotICBBU1NFUlRfRkFMU0UocmVzdWx0KTsKLQotICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXhwZWN0YXRpb25zIG9uIHRoZSBtZXRob2RzIG5vdywgc28gd2UgY2FuCi0gIC8vIGZyZWVseSBjYWxsIHRoZW0uCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKLSAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY2FsbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygpIG9uIHRoZSBzYW1lCi0vLyBtb2NrIG9iamVjdCBtdWx0aXBsZSB0aW1lcy4KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNUZXN0LCBDYW5DYWxsTWFueVRpbWVzKSB7Ci0gIE1vY2tCIGI7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQigpKTsKLSAgYi5Eb0IoKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmIpOwotCi0gIEVYUEVDVF9DQUxMKGIsIERvQihfKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOwotICBiLkRvQigxKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmIpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYik7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgotICAvLyBmcmVlbHkgY2FsbCB0aGVtLgotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2UgY2FuIGNsZWFyIGEgbW9jayBvYmplY3QncyBkZWZhdWx0IGFjdGlvbnMgd2hlbiBub25lCi0vLyBvZiBpdHMgbWV0aG9kcyBoYXMgZGVmYXVsdCBhY3Rpb25zLgotVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsIE5vTWV0aG9kSGFzRGVmYXVsdEFjdGlvbnMpIHsKLSAgTW9ja0IgYjsKLSAgLy8gSWYgdGhpcyBjcmFzaGVzIG9yIGdlbmVyYXRlcyBhIGZhaWx1cmUsIHRoZSB0ZXN0IHdpbGwgY2F0Y2ggaXQuCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiBjbGVhciBhIG1vY2sgb2JqZWN0J3MgZGVmYXVsdCBhY3Rpb25zIHdoZW4gc29tZSwKLS8vIGJ1dCBub3QgYWxsIG9mIGl0cyBtZXRob2RzIGhhdmUgZGVmYXVsdCBhY3Rpb25zLgotVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsIFNvbWVNZXRob2RzSGF2ZURlZmF1bHRBY3Rpb25zKSB7Ci0gIE1vY2tCIGI7Ci0gIE9OX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbiBvZiBpbnQgRG9CKCkgd2FzIHJlbW92ZWQuCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY2xlYXIgYSBtb2NrIG9iamVjdCdzIGRlZmF1bHQgYWN0aW9ucyB3aGVuIGFsbCBvZgotLy8gaXRzIG1ldGhvZHMgaGF2ZSBkZWZhdWx0IGFjdGlvbnMuCi1URVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgQWxsTWV0aG9kc0hhdmVEZWZhdWx0QWN0aW9ucykgewotICBNb2NrQiBiOwotICBPTl9DQUxMKGIsIERvQigpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKLSAgT05fQ0FMTChiLCBEb0IoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMikpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbiBvZiBpbnQgRG9CKCkgd2FzIHJlbW92ZWQuCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbiBvZiBpbnQgRG9CKGludCkgd2FzIHJlbW92ZWQuCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigwKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2UgY2FuIGNsZWFyIGEgbW9jayBvYmplY3QncyBkZWZhdWx0IGFjdGlvbnMgd2hlbiBhCi0vLyBtZXRob2QgaGFzIG1vcmUgdGhhbiBvbmUgT05fQ0FMTCgpIHNldCBvbiBpdC4KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBBTWV0aG9kSGFzTWFueURlZmF1bHRBY3Rpb25zKSB7Ci0gIE1vY2tCIGI7Ci0gIE9OX0NBTEwoYiwgRG9CKDApKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKLSAgT05fQ0FMTChiLCBEb0IoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMikpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbnMgKHRoZXJlIGFyZSB0d28pIG9mIGludCBEb0IoaW50KQotICAvLyB3ZXJlIHJlbW92ZWQuCi0gIEVYUEVDVF9FUSgwLCBiLkRvQigwKSk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2UgY2FuIGNhbGwgVmVyaWZ5QW5kQ2xlYXIoKSBvbiBhIG1vY2sgb2JqZWN0IG11bHRpcGxlCi0vLyB0aW1lcy4KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBDYW5DYWxsTWFueVRpbWVzKSB7Ci0gIE1vY2tCIGI7Ci0gIE9OX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhcigmYik7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKLQotICBPTl9DQUxMKGIsIERvQihfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKLQotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVmVyaWZ5QW5kQ2xlYXIoKSB3b3JrcyB3aGVuIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZHMuCi1URVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgU3VjY2VzcykgewotICBNb2NrQiBiOwotICBPTl9DQUxMKGIsIERvQigpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKLSAgRVhQRUNUX0NBTEwoYiwgRG9CKDEpKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0KLSAgYi5Eb0IoKTsKLSAgYi5Eb0IoMSk7Ci0gIEFTU0VSVF9UUlVFKE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKSk7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgotICAvLyBmcmVlbHkgY2FsbCB0aGVtLgotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVmVyaWZ5QW5kQ2xlYXIoKSB3b3JrcyB3aGVuIHRoZSB2ZXJpZmljYXRpb24gZmFpbHMuCi1URVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgRmFpbHVyZSkgewotICBNb2NrQiBiOwotICBPTl9DQUxMKGIsIERvQihfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7Ci0gIEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0KLSAgYi5Eb0IoMSk7Ci0gIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUocmVzdWx0ID0gTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsOiBuZXZlciBjYWxsZWQiKTsKLSAgQVNTRVJUX0ZBTFNFKHJlc3VsdCk7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgotICAvLyBmcmVlbHkgY2FsbCB0aGVtLgotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVmVyaWZ5QW5kQ2xlYXIoKSB3b3JrcyB3aGVuIHRoZSBkZWZhdWx0IGFjdGlvbnMgYW5kCi0vLyBleHBlY3RhdGlvbnMgYXJlIHNldCBvbiBhIGNvbnN0IG1vY2sgb2JqZWN0LgotVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsIENvbnN0KSB7Ci0gIE1vY2tCIGI7Ci0gIE9OX0NBTEwoQ29uc3QoYiksIERvQigpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKLQotICBFWFBFQ1RfQ0FMTChDb25zdChiKSwgRG9CKCkpCi0gICAgICAuV2lsbE9uY2UoRG9EZWZhdWx0KCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKLQotICBiLkRvQigpOwotICBiLkRvQigpOwotICBBU1NFUlRfVFJVRShNb2NrOjpWZXJpZnlBbmRDbGVhcigmYikpOwotCi0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBleHBlY3RhdGlvbnMgb24gdGhlIG1ldGhvZHMgbm93LCBzbyB3ZSBjYW4KLSAgLy8gZnJlZWx5IGNhbGwgdGhlbS4KLSAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOwotICBFWFBFQ1RfRVEoMCwgYi5Eb0IoMSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiBzZXQgZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMgb24gYSBtb2NrCi0vLyBvYmplY3QgYWZ0ZXIgVmVyaWZ5QW5kQ2xlYXIoKSBoYXMgYmVlbiBjYWxsZWQgb24gaXQuCi1URVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgQ2FuU2V0RGVmYXVsdEFjdGlvbnNBbmRFeHBlY3RhdGlvbnNBZnRlcndhcmRzKSB7Ci0gIE1vY2tCIGI7Ci0gIE9OX0NBTEwoYiwgRG9CKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKLSAgYi5Eb0IoMSk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOwotCi0gIEVYUEVDVF9DQUxMKGIsIERvQigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigzKSk7Ci0gIE9OX0NBTEwoYiwgRG9CKF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDQpKTsKLQotICBFWFBFQ1RfRVEoMywgYi5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSg0LCBiLkRvQigxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgY2FsbGluZyBWZXJpZnlBbmRDbGVhcigpIG9uIG9uZSBtb2NrIG9iamVjdCBkb2VzIG5vdAotLy8gYWZmZWN0IG90aGVyIG1vY2sgb2JqZWN0cyAoZWl0aGVyIG9mIHRoZSBzYW1lIHR5cGUgb3Igbm90KS4KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBEb2VzTm90QWZmZWN0T3RoZXJNb2NrT2JqZWN0cykgewotICBNb2NrQSBhOwotICBNb2NrQiBiMTsKLSAgTW9ja0IgYjI7Ci0KLSAgT05fQ0FMTChhLCBCaW5hcnkoXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChhLCBCaW5hcnkoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9EZWZhdWx0KCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0KLSAgT05fQ0FMTChiMSwgRG9CKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBFWFBFQ1RfQ0FMTChiMSwgRG9CKF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7Ci0KLSAgT05fQ0FMTChiMiwgRG9CKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMykpOwotICBFWFBFQ1RfQ0FMTChiMiwgRG9CKF8pKTsKLQotICBiMi5Eb0IoMCk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiMik7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMgb2YgYSBhbmQgYjEKLSAgLy8gYXJlIHN0aWxsIGluIGVmZmVjdC4KLSAgRVhQRUNUX1RSVUUoYS5CaW5hcnkoMCwgMCkpOwotICBFWFBFQ1RfRkFMU0UoYS5CaW5hcnkoMCwgMCkpOwotCi0gIEVYUEVDVF9FUSgxLCBiMS5Eb0IoKSk7Ci0gIEVYUEVDVF9FUSgyLCBiMS5Eb0IoMCkpOwotfQotCi1URVNUKFZlcmlmeUFuZENsZWFyVGVzdCwKLSAgICAgRGVzdHJveWluZ0NoYWluZWRNb2Nrc0RvZXNOb3REZWFkbG9ja1Rocm91Z2hFeHBlY3RhdGlvbnMpIHsKLSAgbGlua2VkX3B0cjxNb2NrQT4gYShuZXcgTW9ja0EpOwotICBSZWZlcmVuY2VIb2xkaW5nTW9jayB0ZXN0X21vY2s7Ci0KLSAgLy8gRVhQRUNUX0NBTEwgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIGEgaW5zaWRlIHRlc3RfbW9jay4KLSAgRVhQRUNUX0NBTEwodGVzdF9tb2NrLCBBY2NlcHRSZWZlcmVuY2UoXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoU2V0QXJnUG9pbnRlZTwwPihhKSk7Ci0KLSAgLy8gVGhyb3cgYXdheSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBtb2NrIHRoYXQgd2UgaGF2ZSBpbiBhLiBBZnRlciB0aGlzLCB0aGUKLSAgLy8gb25seSByZWZlcmVuY2UgdG8gaXQgaXMgc3RvcmVkIGJ5IHRlc3RfbW9jay4KLSAgYS5yZXNldCgpOwotCi0gIC8vIFdoZW4gdGVzdF9tb2NrIGdvZXMgb3V0IG9mIHNjb3BlLCBpdCBkZXN0cm95cyB0aGUgbGFzdCByZW1haW5pbmcgcmVmZXJlbmNlCi0gIC8vIHRvIHRoZSBtb2NrIG9iamVjdCBvcmlnaW5hbGx5IHBvaW50ZWQgdG8gYnkgYS4gVGhpcyB3aWxsIGNhdXNlIHRoZSBNb2NrQQotICAvLyBkZXN0cnVjdG9yIHRvIGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUgUmVmZXJlbmNlSG9sZGluZ01vY2sgZGVzdHJ1Y3Rvci4KLSAgLy8gVGhlIHN0YXRlIG9mIGFsbCBtb2NrcyBpcyBwcm90ZWN0ZWQgYnkgYSBzaW5nbGUgZ2xvYmFsIGxvY2ssIGJ1dCB0aGVyZQotICAvLyBzaG91bGQgYmUgbm8gZGVhZGxvY2suCi19Ci0KLVRFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LAotICAgICBEZXN0cm95aW5nQ2hhaW5lZE1vY2tzRG9lc05vdERlYWRsb2NrVGhyb3VnaERlZmF1bHRBY3Rpb24pIHsKLSAgbGlua2VkX3B0cjxNb2NrQT4gYShuZXcgTW9ja0EpOwotICBSZWZlcmVuY2VIb2xkaW5nTW9jayB0ZXN0X21vY2s7Ci0KLSAgLy8gT05fQ0FMTCBzdG9yZXMgYSByZWZlcmVuY2UgdG8gYSBpbnNpZGUgdGVzdF9tb2NrLgotICBPTl9DQUxMKHRlc3RfbW9jaywgQWNjZXB0UmVmZXJlbmNlKF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoU2V0QXJnUG9pbnRlZTwwPihhKSk7Ci0KLSAgLy8gVGhyb3cgYXdheSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBtb2NrIHRoYXQgd2UgaGF2ZSBpbiBhLiBBZnRlciB0aGlzLCB0aGUKLSAgLy8gb25seSByZWZlcmVuY2UgdG8gaXQgaXMgc3RvcmVkIGJ5IHRlc3RfbW9jay4KLSAgYS5yZXNldCgpOwotCi0gIC8vIFdoZW4gdGVzdF9tb2NrIGdvZXMgb3V0IG9mIHNjb3BlLCBpdCBkZXN0cm95cyB0aGUgbGFzdCByZW1haW5pbmcgcmVmZXJlbmNlCi0gIC8vIHRvIHRoZSBtb2NrIG9iamVjdCBvcmlnaW5hbGx5IHBvaW50ZWQgdG8gYnkgYS4gVGhpcyB3aWxsIGNhdXNlIHRoZSBNb2NrQQotICAvLyBkZXN0cnVjdG9yIHRvIGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUgUmVmZXJlbmNlSG9sZGluZ01vY2sgZGVzdHJ1Y3Rvci4KLSAgLy8gVGhlIHN0YXRlIG9mIGFsbCBtb2NrcyBpcyBwcm90ZWN0ZWQgYnkgYSBzaW5nbGUgZ2xvYmFsIGxvY2ssIGJ1dCB0aGVyZQotICAvLyBzaG91bGQgYmUgbm8gZGVhZGxvY2suCi19Ci0KLS8vIFRlc3RzIHRoYXQgYSBtb2NrIGZ1bmN0aW9uJ3MgYWN0aW9uIGNhbiBjYWxsIGEgbW9jayBmdW5jdGlvbgotLy8gKGVpdGhlciB0aGUgc2FtZSBmdW5jdGlvbiBvciBhIGRpZmZlcmVudCBvbmUpIGVpdGhlciBhcyBhbiBleHBsaWNpdAotLy8gYWN0aW9uIG9yIGFzIGEgZGVmYXVsdCBhY3Rpb24gd2l0aG91dCBjYXVzaW5nIGEgZGVhZCBsb2NrLiAgSXQKLS8vIHZlcmlmaWVzIHRoYXQgdGhlIGFjdGlvbiBpcyBub3QgcGVyZm9ybWVkIGluc2lkZSB0aGUgY3JpdGljYWwKLS8vIHNlY3Rpb24uCi1URVNUKFN5bmNocm9uaXphdGlvblRlc3QsIENhbkNhbGxNb2NrTWV0aG9kSW5BY3Rpb24pIHsKLSAgTW9ja0EgYTsKLSAgTW9ja0MgYzsKLSAgT05fQ0FMTChhLCBEb0EoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChJZ25vcmVSZXN1bHQoSW52b2tlV2l0aG91dEFyZ3MoJmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1vY2tDOjpOb25Wb2lkTWV0aG9kKSkpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOwotICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlKCZhLCAmTW9ja0E6OkRvQSkpCi0gICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICBFWFBFQ1RfQ0FMTChjLCBOb25Wb2lkTWV0aG9kKCkpOwotCi0gIGEuRG9BKDEpOwotICAvLyBUaGlzIHdpbGwgbWF0Y2ggdGhlIHNlY29uZCBFWFBFQ1RfQ0FMTCgpIGFuZCB0cmlnZ2VyIGFub3RoZXIgYS5Eb0EoMSksCi0gIC8vIHdoaWNoIHdpbGwgaW4gdHVybiBtYXRjaCB0aGUgZmlyc3QgRVhQRUNUX0NBTEwoKSBhbmQgdHJpZ2dlciBhIGNhbGwgdG8KLSAgLy8gYy5Ob25Wb2lkTWV0aG9kKCkgdGhhdCB3YXMgc3BlY2lmaWVkIGJ5IHRoZSBPTl9DQUxMKCkgc2luY2UgdGhlIGZpcnN0Ci0gIC8vIEVYUEVDVF9DQUxMKCkgZGlkIG5vdCBzcGVjaWZ5IGFuIGFjdGlvbi4KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIEFsbG93cyB0aGUgdXNlciB0byBkZWZpbmUgaGlzIG93biBtYWluIGFuZCB0aGVuIGludm9rZSBnbW9ja19tYWluCi0vLyBmcm9tIGl0LiBUaGlzIG1pZ2h0IGJlIG5lY2Vzc2FyeSBvbiBzb21lIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlCi0vLyBzcGVjaWZpYyBzZXR1cCBhbmQgdGVhcmRvd24uCi0jaWYgR01PQ0tfUkVOQU1FX01BSU4KLWludCBnbW9ja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotI2Vsc2UKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotI2VuZGlmICAvLyBHTU9DS19SRU5BTUVfTUFJTgotICB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7Ci0KLSAgLy8gRW5zdXJlcyB0aGF0IHRoZSB0ZXN0cyBwYXNzIG5vIG1hdHRlciB3aGF0IHZhbHVlIG9mCi0gIC8vIC0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzIGFuZCAtLWdtb2NrX3ZlcmJvc2UgdGhlIHVzZXIgc3BlY2lmaWVzLgotICB0ZXN0aW5nOjpHTU9DS19GTEFHKGNhdGNoX2xlYWtlZF9tb2NrcykgPSB0cnVlOwotICB0ZXN0aW5nOjpHTU9DS19GTEFHKHZlcmJvc2UpID0gdGVzdGluZzo6aW50ZXJuYWw6OmtXYXJuaW5nVmVyYm9zaXR5OwotCi0gIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfYWxsX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfYWxsX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDZjNDkuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2FsbF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUZXN0cyBmb3IgR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yayAoR29vZ2xlIE1vY2spCi0vLwotLy8gU29tZSB1c2VycyB1c2UgYSBidWlsZCBzeXN0ZW0gdGhhdCBHb29nbGUgTW9jayBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHksCi0vLyB5ZXQgdGhleSBzdGlsbCB3YW50IHRvIGJ1aWxkIGFuZCBydW4gR29vZ2xlIE1vY2sncyBvd24gdGVzdHMuICBUaGlzIGZpbGUKLS8vIGluY2x1ZGVzIG1vc3Qgc3VjaCB0ZXN0cywgbWFraW5nIGl0IGVhc2llciBmb3IgdGhlc2UgdXNlcnMgdG8gbWFpbnRhaW4KLS8vIHRoZWlyIGJ1aWxkIHNjcmlwdHMgKHRoZXkganVzdCBuZWVkIHRvIGJ1aWxkIHRoaXMgZmlsZSwgZXZlbiB0aG91Z2ggdGhlCi0vLyBiZWxvdyBsaXN0IG9mIGFjdHVhbCAqX3Rlc3QuY2MgZmlsZXMgbWlnaHQgY2hhbmdlKS4KLSNpbmNsdWRlICJ0ZXN0L2dtb2NrLWFjdGlvbnNfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2dtb2NrLWNhcmRpbmFsaXRpZXNfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zX3Rlc3QuY2MiCi0jaW5jbHVkZSAidGVzdC9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vyc190ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzX3Rlc3QuY2MiCi0jaW5jbHVkZSAidGVzdC9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnNfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2dtb2NrLWludGVybmFsLXV0aWxzX3Rlc3QuY2MiCi0jaW5jbHVkZSAidGVzdC9nbW9jay1tYXRjaGVyc190ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ21vY2stbW9yZS1hY3Rpb25zX3Rlc3QuY2MiCi0jaW5jbHVkZSAidGVzdC9nbW9jay1uaWNlLXN0cmljdF90ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ21vY2stcG9ydF90ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ21vY2stc3BlYy1idWlsZGVyc190ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ21vY2tfdGVzdC5jYyIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19leF90ZXN0LmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2V4X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmVkODYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2V4X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUZXN0cyBHb29nbGUgTW9jaydzIGZ1bmN0aW9uYWxpdHkgdGhhdCBkZXBlbmRzIG9uIGV4Y2VwdGlvbnMuCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHRlc3Rpbmc6Okhhc1N1YnN0cjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbjsKLQotLy8gQSB0eXBlIHRoYXQgY2Fubm90IGJlIGRlZmF1bHQgY29uc3RydWN0ZWQuCi1jbGFzcyBOb25EZWZhdWx0Q29uc3RydWN0aWJsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOb25EZWZhdWx0Q29uc3RydWN0aWJsZShpbnQgLyogZHVtbXkgKi8pIHt9Ci19OwotCi1jbGFzcyBNb2NrRm9vIHsKLSBwdWJsaWM6Ci0gIC8vIEEgbW9jayBtZXRob2QgdGhhdCByZXR1cm5zIGEgdXNlci1kZWZpbmVkIHR5cGUuICBHb29nbGUgTW9jawotICAvLyBkb2Vzbid0IGtub3cgd2hhdCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB0eXBlIGlzLgotICBNT0NLX01FVEhPRDAoR2V0Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUsIE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCkpOwotfTsKLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLVRFU1QoRGVmYXVsdFZhbHVlVGVzdCwgVGhyb3dzUnVudGltZUVycm9yV2hlbk5vRGVmYXVsdFZhbHVlKSB7Ci0gIE1vY2tGb28gbW9jazsKLSAgdHJ5IHsKLSAgICAvLyBObyBleHBlY3RhdGlvbiBpcyBzZXQgb24gdGhpcyBtZXRob2QsIHNvIEdvb2dsZSBNb2NrIG11c3QKLSAgICAvLyByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuICBIb3dldmVyLCBzaW5jZSBHb29nbGUgTW9jayBrbm93cwotICAgIC8vIG5vdGhpbmcgYWJvdXQgdGhlIHJldHVybiB0eXBlLCBpdCBkb2Vzbid0IGtub3cgd2hhdCB0byByZXR1cm4sCi0gICAgLy8gYW5kIGhhcyB0byB0aHJvdyAod2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkKSBvciBhYm9ydAotICAgIC8vIChvdGhlcndpc2UpLgotICAgIG1vY2suR2V0Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoKTsKLSAgICBGQUlMKCkgPDwgIkdldE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCkncyByZXR1cm4gdHlwZSBoYXMgbm8gZGVmYXVsdCAiCi0gICAgICAgICAgIDw8ICJ2YWx1ZSwgc28gR29vZ2xlIE1vY2sgc2hvdWxkIGhhdmUgdGhyb3duLiI7Ci0gIH0gY2F0Y2ggKGNvbnN0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uJiAvKiB1bnVzZWQgKi8pIHsKLSAgICBGQUlMKCkgPDwgIkdvb2dsZSBUZXN0IGRvZXMgbm90IHRyeSB0byBjYXRjaCBhbiBleGNlcHRpb24gb2YgdHlwZSAiCi0gICAgICAgICAgIDw8ICJHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiwgd2hpY2ggaXMgdXNlZCBmb3IgcmVwb3J0aW5nICIKLSAgICAgICAgICAgPDwgImEgZmFpbHVyZSB0byBvdGhlciB0ZXN0aW5nIGZyYW1ld29ya3MuICBHb29nbGUgTW9jayBzaG91bGQgIgotICAgICAgICAgICA8PCAibm90IHRocm93IGEgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24gYXMgaXQgd2lsbCBraWxsIHRoZSAiCi0gICAgICAgICAgIDw8ICJlbnRpcmUgdGVzdCBwcm9ncmFtIGluc3RlYWQgb2YganVzdCB0aGUgY3VycmVudCBURVNULiI7Ci0gIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgewotICAgIEVYUEVDVF9USEFUKGV4LndoYXQoKSwgSGFzU3Vic3RyKCJoYXMgbm8gZGVmYXVsdCB2YWx1ZSIpKTsKLSAgfQotfQotCi0jZW5kaWYKLQotfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19sZWFrX3Rlc3QucHkgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfbGVha190ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OTc2ODBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19sZWFrX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVGVzdHMgdGhhdCBsZWFrZWQgbW9jayBvYmplY3RzIGNhbiBiZSBjYXVnaHQgYmUgR29vZ2xlIE1vY2suIiIiCi0KLV9fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCi0KLQotaW1wb3J0IGdtb2NrX3Rlc3RfdXRpbHMKLQotCi1QUk9HUkFNX1BBVEggPSBnbW9ja190ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ21vY2tfbGVha190ZXN0XycpCi1URVNUX1dJVEhfRVhQRUNUX0NBTEwgPSBbUFJPR1JBTV9QQVRILCAnLS1ndGVzdF9maWx0ZXI9KkV4cGVjdENhbGwqJ10KLVRFU1RfV0lUSF9PTl9DQUxMID0gW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3RfZmlsdGVyPSpPbkNhbGwqJ10KLVRFU1RfTVVMVElQTEVfTEVBS1MgPSBbUFJPR1JBTV9QQVRILCAnLS1ndGVzdF9maWx0ZXI9Kk11bHRpcGxlTGVha2VkKiddCi0KLWVudmlyb24gPSBnbW9ja190ZXN0X3V0aWxzLmVudmlyb24KLVNldEVudlZhciA9IGdtb2NrX3Rlc3RfdXRpbHMuU2V0RW52VmFyCi0KLSMgVGVzdHMgaW4gdGhpcyBmaWxlIHJ1biBhIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QgcHJvZ3JhbSBhbmQgZXhwZWN0IGl0Ci0jIHRvIHRlcm1pbmF0ZSBwcmVtYXR1cmVseS4gIFRoZXJlZm9yZSB0aGV5IGFyZSBpbmNvbXBhdGlibGUgd2l0aAotIyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCBieSBkZXNpZ24uICBVbnNldCB0aGUKLSMgcHJlbWF0dXJlLWV4aXQgZmlsZXBhdGggdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIGNyZWF0aW5nCi0jIHRoZSBmaWxlLgotU2V0RW52VmFyKGdtb2NrX3Rlc3RfdXRpbHMuUFJFTUFUVVJFX0VYSVRfRklMRV9FTlZfVkFSLCBOb25lKQotCi0KLWNsYXNzIEdNb2NrTGVha1Rlc3QoZ21vY2tfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RDYXRjaGVzTGVha2VkTW9ja0J5RGVmYXVsdChzZWxmKToKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAotICAgICAgICAwLAotICAgICAgICBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoVEVTVF9XSVRIX0VYUEVDVF9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAotICAgICAgICAwLAotICAgICAgICBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoVEVTVF9XSVRIX09OX0NBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikuZXhpdF9jb2RlKQotCi0gIGRlZiB0ZXN0RG9lc05vdENhdGNoTGVha2VkTW9ja1doZW5EaXNhYmxlZChzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgMCwKLSAgICAgICAgZ21vY2tfdGVzdF91dGlscy5TdWJwcm9jZXNzKFRFU1RfV0lUSF9FWFBFQ1RfQ0FMTCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzPTAnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnZpcm9uKS5leGl0X2NvZGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoCi0gICAgICAgIDAsCi0gICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX1dJVEhfT05fQ0FMTCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzPTAnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnZpcm9uKS5leGl0X2NvZGUpCi0KLSAgZGVmIHRlc3RDYXRjaGVzTGVha2VkTW9ja1doZW5FbmFibGVkKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCi0gICAgICAgIDAsCi0gICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX1dJVEhfRVhQRUNUX0NBTEwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLWdtb2NrX2NhdGNoX2xlYWtlZF9tb2NrcyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAotICAgICAgICAwLAotICAgICAgICBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoVEVTVF9XSVRIX09OX0NBTEwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLWdtb2NrX2NhdGNoX2xlYWtlZF9tb2NrcyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKLQotICBkZWYgdGVzdENhdGNoZXNMZWFrZWRNb2NrV2hlbkVuYWJsZWRXaXRoRXhwbGljdEZsYWdWYWx1ZShzZWxmKToKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAotICAgICAgICAwLAotICAgICAgICBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoVEVTVF9XSVRIX0VYUEVDVF9DQUxMICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3M9MSddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKLQotICBkZWYgdGVzdENhdGNoZXNNdWx0aXBsZUxlYWtlZE1vY2tzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCi0gICAgICAgIDAsCi0gICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX01VTFRJUExFX0xFQUtTICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3MnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnZpcm9uKS5leGl0X2NvZGUpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgZ21vY2tfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19sZWFrX3Rlc3RfLmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2xlYWtfdGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjdkMjIuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2xlYWtfdGVzdF8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgcHJvZ3JhbSBpcyBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBsZWFrZWQgbW9jayBvYmplY3QgY2FuIGJlCi0vLyBjYXVnaHQgYnkgR29vZ2xlIE1vY2sncyBsZWFrIGRldGVjdG9yLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLWNsYXNzIEZvb0ludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Gb29JbnRlcmZhY2UoKSB7fQotICB2aXJ0dWFsIHZvaWQgRG9UaGlzKCkgPSAwOwotfTsKLQotY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb29JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTW9ja0ZvbygpIHt9Ci0KLSAgTU9DS19NRVRIT0QwKERvVGhpcywgdm9pZCgpKTsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Zvbyk7Ci19OwotCi1URVNUKExlYWtUZXN0LCBMZWFrZWRNb2NrV2l0aEV4cGVjdENhbGxDYXVzZXNGYWlsdXJlV2hlbkxlYWtDaGVja2luZ0lzRW5hYmxlZCkgewotICBNb2NrRm9vKiBmb28gPSBuZXcgTW9ja0ZvbzsKLQotICBFWFBFQ1RfQ0FMTCgqZm9vLCBEb1RoaXMoKSk7Ci0gIGZvby0+RG9UaGlzKCk7Ci0KLSAgLy8gSW4gb3JkZXIgdG8gdGVzdCB0aGUgbGVhayBkZXRlY3Rvciwgd2UgZGVsaWJlcmF0ZWx5IGxlYWsgZm9vLgotCi0gIC8vIE1ha2VzIHN1cmUgR29vZ2xlIE1vY2sncyBsZWFrIGRldGVjdG9yIGNhbiBjaGFuZ2UgdGhlIGV4aXQgY29kZQotICAvLyB0byAxIGV2ZW4gd2hlbiB0aGUgY29kZSBpcyBhbHJlYWR5IGV4aXRpbmcgd2l0aCAwLgotICBleGl0KDApOwotfQotCi1URVNUKExlYWtUZXN0LCBMZWFrZWRNb2NrV2l0aE9uQ2FsbENhdXNlc0ZhaWx1cmVXaGVuTGVha0NoZWNraW5nSXNFbmFibGVkKSB7Ci0gIE1vY2tGb28qIGZvbyA9IG5ldyBNb2NrRm9vOwotCi0gIE9OX0NBTEwoKmZvbywgRG9UaGlzKCkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotCi0gIC8vIEluIG9yZGVyIHRvIHRlc3QgdGhlIGxlYWsgZGV0ZWN0b3IsIHdlIGRlbGliZXJhdGVseSBsZWFrIGZvby4KLQotICAvLyBNYWtlcyBzdXJlIEdvb2dsZSBNb2NrJ3MgbGVhayBkZXRlY3RvciBjYW4gY2hhbmdlIHRoZSBleGl0IGNvZGUKLSAgLy8gdG8gMSBldmVuIHdoZW4gdGhlIGNvZGUgaXMgYWxyZWFkeSBleGl0aW5nIHdpdGggMC4KLSAgZXhpdCgwKTsKLX0KLQotVEVTVChMZWFrVGVzdCwgQ2F0Y2hlc011bHRpcGxlTGVha2VkTW9ja09iamVjdHMpIHsKLSAgTW9ja0ZvbyogZm9vMSA9IG5ldyBNb2NrRm9vOwotICBNb2NrRm9vKiBmb28yID0gbmV3IE1vY2tGb287Ci0KLSAgT05fQ0FMTCgqZm9vMSwgRG9UaGlzKCkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotICBFWFBFQ1RfQ0FMTCgqZm9vMiwgRG9UaGlzKCkpOwotICBmb28yLT5Eb1RoaXMoKTsKLQotICAvLyBJbiBvcmRlciB0byB0ZXN0IHRoZSBsZWFrIGRldGVjdG9yLCB3ZSBkZWxpYmVyYXRlbHkgbGVhayBmb28xIGFuZAotICAvLyBmb28yLgotCi0gIC8vIE1ha2VzIHN1cmUgR29vZ2xlIE1vY2sncyBsZWFrIGRldGVjdG9yIGNhbiBjaGFuZ2UgdGhlIGV4aXQgY29kZQotICAvLyB0byAxIGV2ZW4gd2hlbiB0aGUgY29kZSBpcyBhbHJlYWR5IGV4aXRpbmcgd2l0aCAwLgotICBleGl0KDApOwotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19saW5rMl90ZXN0LmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2xpbmsyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzEwYzMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX2xpbmsyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpcyBmb3IgdmVyaWZ5aW5nIHRoYXQgdmFyaW91cyBHb29nbGUgTW9jayBjb25zdHJ1Y3RzIGRvIG5vdAotLy8gcHJvZHVjZSBsaW5rZXIgZXJyb3JzIHdoZW4gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cy4KLS8vIFBsZWFzZSBzZWUgZ21vY2tfbGlua190ZXN0LmggZm9yIGRldGFpbHMuCi0KLSNkZWZpbmUgTGlua1Rlc3QgTGlua1Rlc3QyCi0KLSNpbmNsdWRlICAidGVzdC9nbW9ja19saW5rX3Rlc3QuaCIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19saW5rX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfbGlua190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU5N2QxLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19saW5rX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpcyBmb3IgdmVyaWZ5aW5nIHRoYXQgdmFyaW91cyBHb29nbGUgTW9jayBjb25zdHJ1Y3RzIGRvIG5vdAotLy8gcHJvZHVjZSBsaW5rZXIgZXJyb3JzIHdoZW4gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cy4KLS8vIFBsZWFzZSBzZWUgZ21vY2tfbGlua190ZXN0LmggZm9yIGRldGFpbHMuCi0KLSNkZWZpbmUgTGlua1Rlc3QgTGlua1Rlc3QxCi0KLSNpbmNsdWRlICAidGVzdC9nbW9ja19saW5rX3Rlc3QuaCIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19saW5rX3Rlc3QuaCBiL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19saW5rX3Rlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1NWY1Yi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfbGlua190ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSB0ZXN0cyB0aGF0OgotLy8gYS4gQSBoZWFkZXIgZmlsZSBkZWZpbmluZyBhIG1vY2sgY2xhc3MgY2FuIGJlIGluY2x1ZGVkIGluIG11bHRpcGxlCi0vLyAgICB0cmFuc2xhdGlvbiB1bml0cyB3aXRob3V0IGNhdXNpbmcgYSBsaW5rIGVycm9yLgotLy8gYi4gQWN0aW9ucyBhbmQgbWF0Y2hlcnMgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIGlkZW50aWNhbCB0ZW1wbGF0ZQotLy8gICAgYXJndW1lbnRzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyB3aXRob3V0IGNhdXNpbmcgbGluawotLy8gICAgZXJyb3JzLgotLy8gICAgVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGFyZSBjdXJyZW50bHkgdGVzdGVkOgotLy8gICAgQWN0aW9uczoKLS8vICAgICAgUmV0dXJuKCkKLS8vICAgICAgUmV0dXJuKHZhbHVlKQotLy8gICAgICBSZXR1cm5OdWxsCi0vLyAgICAgIFJldHVyblJlZgotLy8gICAgICBBc3NpZ24KLS8vICAgICAgU2V0QXJnUG9pbnRlZQotLy8gICAgICBTZXRBcnJheUFyZ3VtZW50Ci0vLyAgICAgIFNldEVycm5vQW5kUmV0dXJuCi0vLyAgICAgIEludm9rZShmdW5jdGlvbikKLS8vICAgICAgSW52b2tlKG9iamVjdCwgbWV0aG9kKQotLy8gICAgICBJbnZva2VXaXRob3V0QXJncyhmdW5jdGlvbikKLS8vICAgICAgSW52b2tlV2l0aG91dEFyZ3Mob2JqZWN0LCBtZXRob2QpCi0vLyAgICAgIEludm9rZUFyZ3VtZW50Ci0vLyAgICAgIFdpdGhBcmcKLS8vICAgICAgV2l0aEFyZ3MKLS8vICAgICAgV2l0aG91dEFyZ3MKLS8vICAgICAgRG9BbGwKLS8vICAgICAgRG9EZWZhdWx0Ci0vLyAgICAgIElnbm9yZVJlc3VsdAotLy8gICAgICBUaHJvdwotLy8gICAgICBBQ1RJT04oKS1nZW5lcmF0ZWQKLS8vICAgICAgQUNUSU9OX1AoKS1nZW5lcmF0ZWQKLS8vICAgICAgQUNUSU9OX1AyKCktZ2VuZXJhdGVkCi0vLyAgICBNYXRjaGVyczoKLS8vICAgICAgXwotLy8gICAgICBBCi0vLyAgICAgIEFuCi0vLyAgICAgIEVxCi0vLyAgICAgIEd0LCBMdCwgR2UsIExlLCBOZQotLy8gICAgICBOb3ROdWxsCi0vLyAgICAgIFJlZgotLy8gICAgICBUeXBlZEVxCi0vLyAgICAgIERvdWJsZUVxCi0vLyAgICAgIEZsb2F0RXEKLS8vICAgICAgTmFuU2Vuc2l0aXZlRG91YmxlRXEKLS8vICAgICAgTmFuU2Vuc2l0aXZlRmxvYXRFcQotLy8gICAgICBDb250YWluc1JlZ2V4Ci0vLyAgICAgIE1hdGNoZXNSZWdleAotLy8gICAgICBFbmRzV2l0aAotLy8gICAgICBIYXNTdWJzdHIKLS8vICAgICAgU3RhcnRzV2l0aAotLy8gICAgICBTdHJDYXNlRXEKLS8vICAgICAgU3RyQ2FzZU5lCi0vLyAgICAgIFN0ckVxCi0vLyAgICAgIFN0ck5lCi0vLyAgICAgIEVsZW1lbnRzQXJlCi0vLyAgICAgIEVsZW1lbnRzQXJlQXJyYXkKLS8vICAgICAgQ29udGFpbmVyRXEKLS8vICAgICAgRmllbGQKLS8vICAgICAgUHJvcGVydHkKLS8vICAgICAgUmVzdWx0T2YoZnVuY3Rpb24pCi0vLyAgICAgIFBvaW50ZWUKLS8vICAgICAgVHJ1bHkocHJlZGljYXRlKQotLy8gICAgICBBbGxPZgotLy8gICAgICBBbnlPZgotLy8gICAgICBOb3QKLS8vICAgICAgTWF0Y2hlckNhc3Q8VD4KLS8vCi0vLyAgUGxlYXNlIG5vdGU6IHRoaXMgdGVzdCBkb2VzIG5vdCB2ZXJpZnkgdGhlIGZ1bmN0aW9uaW5nIG9mIHRoZXNlCi0vLyAgY29uc3RydWN0cywgb25seSB0aGF0IHRoZSBwcm9ncmFtcyB1c2luZyB0aGVtIHdpbGwgbGluayBzdWNjZXNzZnVsbHkuCi0vLwotLy8gSW1wbGVtZW50YXRpb24gbm90ZToKLS8vIFRoaXMgdGVzdCByZXF1aXJlcyBpZGVudGljYWwgZGVmaW5pdGlvbnMgb2YgSW50ZXJmYWNlIGFuZCBNb2NrIHRvIGJlCi0vLyBpbmNsdWRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMuICBXZSBhY2hpZXZlIHRoaXMgYnkgd3JpdGluZwotLy8gdGhlbSBpbiB0aGlzIGhlYWRlciBhbmQgI2luY2x1ZGluZyBpdCBpbiBnbW9ja19saW5rX3Rlc3QuY2MgYW5kCi0vLyBnbW9ja19saW5rMl90ZXN0LmNjLiAgQmVjYXVzZSB0aGUgc3ltYm9scyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvcgotLy8gdGhvc2UgY29uc3RydWN0cyBtdXN0IGJlIGlkZW50aWNhbCBpbiBib3RoIHRyYW5zbGF0aW9uIHVuaXRzLAotLy8gZGVmaW5pdGlvbnMgb2YgSW50ZXJmYWNlIGFuZCBNb2NrIHRlc3RzIE1VU1QgYmUga2VwdCBpbiB0aGUgU0FNRQotLy8gTk9OLUFOT05ZTU9VUyBuYW1lc3BhY2UgaW4gdGhpcyBmaWxlLiAgVGhlIHRlc3QgZml4dHVyZSBjbGFzcyBMaW5rVGVzdAotLy8gaXMgZGVmaW5lZCBhcyBMaW5rVGVzdDEgaW4gZ21vY2tfbGlua190ZXN0LmNjIGFuZCBhcyBMaW5rVGVzdDIgaW4KLS8vIGdtb2NrX2xpbmsyX3Rlc3QuY2MgdG8gYXZvaWQgcHJvZHVjaW5nIGxpbmtlciBlcnJvcnMuCi0KLSNpZm5kZWYgR01PQ0tfVEVTVF9HTU9DS19MSU5LX1RFU1RfSF8KLSNkZWZpbmUgR01PQ0tfVEVTVF9HTU9DS19MSU5LX1RFU1RfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSMgaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6QTsKLXVzaW5nIHRlc3Rpbmc6OkFsbE9mOwotdXNpbmcgdGVzdGluZzo6QW55T2Y7Ci11c2luZyB0ZXN0aW5nOjpBc3NpZ247Ci11c2luZyB0ZXN0aW5nOjpDb250YWluZXJFcTsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6RG9EZWZhdWx0OwotdXNpbmcgdGVzdGluZzo6RG91YmxlRXE7Ci11c2luZyB0ZXN0aW5nOjpFbGVtZW50c0FyZTsKLXVzaW5nIHRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7Ci11c2luZyB0ZXN0aW5nOjpFbmRzV2l0aDsKLXVzaW5nIHRlc3Rpbmc6OkVxOwotdXNpbmcgdGVzdGluZzo6RmllbGQ7Ci11c2luZyB0ZXN0aW5nOjpGbG9hdEVxOwotdXNpbmcgdGVzdGluZzo6R2U7Ci11c2luZyB0ZXN0aW5nOjpHdDsKLXVzaW5nIHRlc3Rpbmc6Okhhc1N1YnN0cjsKLXVzaW5nIHRlc3Rpbmc6Oklnbm9yZVJlc3VsdDsKLXVzaW5nIHRlc3Rpbmc6Okludm9rZTsKLXVzaW5nIHRlc3Rpbmc6Okludm9rZUFyZ3VtZW50OwotdXNpbmcgdGVzdGluZzo6SW52b2tlV2l0aG91dEFyZ3M7Ci11c2luZyB0ZXN0aW5nOjpJc051bGw7Ci11c2luZyB0ZXN0aW5nOjpMZTsKLXVzaW5nIHRlc3Rpbmc6Okx0OwotdXNpbmcgdGVzdGluZzo6TWF0Y2hlcjsKLXVzaW5nIHRlc3Rpbmc6Ok1hdGNoZXJDYXN0OwotdXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRG91YmxlRXE7Ci11c2luZyB0ZXN0aW5nOjpOYW5TZW5zaXRpdmVGbG9hdEVxOwotdXNpbmcgdGVzdGluZzo6TmU7Ci11c2luZyB0ZXN0aW5nOjpOb3Q7Ci11c2luZyB0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgdGVzdGluZzo6UG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlByb3BlcnR5OwotdXNpbmcgdGVzdGluZzo6UmVmOwotdXNpbmcgdGVzdGluZzo6UmVzdWx0T2Y7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm5OdWxsOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuUmVmOwotdXNpbmcgdGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlNldEFycmF5QXJndW1lbnQ7Ci11c2luZyB0ZXN0aW5nOjpTdGFydHNXaXRoOwotdXNpbmcgdGVzdGluZzo6U3RyQ2FzZUVxOwotdXNpbmcgdGVzdGluZzo6U3RyQ2FzZU5lOwotdXNpbmcgdGVzdGluZzo6U3RyRXE7Ci11c2luZyB0ZXN0aW5nOjpTdHJOZTsKLXVzaW5nIHRlc3Rpbmc6OlRydWx5OwotdXNpbmcgdGVzdGluZzo6VHlwZWRFcTsKLXVzaW5nIHRlc3Rpbmc6OldpdGhBcmc7Ci11c2luZyB0ZXN0aW5nOjpXaXRoQXJnczsKLXVzaW5nIHRlc3Rpbmc6OldpdGhvdXRBcmdzOwotCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi11c2luZyB0ZXN0aW5nOjpTZXRFcnJub0FuZFJldHVybjsKLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLXVzaW5nIHRlc3Rpbmc6OlRocm93OwotI2VuZGlmCi0KLXVzaW5nIHRlc3Rpbmc6OkNvbnRhaW5zUmVnZXg7Ci11c2luZyB0ZXN0aW5nOjpNYXRjaGVzUmVnZXg7Ci0KLWNsYXNzIEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JbnRlcmZhY2UoKSB7fQotICB2aXJ0dWFsIHZvaWQgVm9pZEZyb21TdHJpbmcoY2hhciogc3RyKSA9IDA7Ci0gIHZpcnR1YWwgY2hhciogU3RyaW5nRnJvbVN0cmluZyhjaGFyKiBzdHIpID0gMDsKLSAgdmlydHVhbCBpbnQgSW50RnJvbVN0cmluZyhjaGFyKiBzdHIpID0gMDsKLSAgdmlydHVhbCBpbnQmIEludFJlZkZyb21TdHJpbmcoY2hhciogc3RyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBWb2lkRnJvbUZ1bmModm9pZCgqZnVuYykoY2hhciogc3RyKSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgVm9pZEZyb21JbnRSZWYoaW50JiBuKSA9IDA7ICAvLyBOT0xJTlQKLSAgdmlydHVhbCB2b2lkIFZvaWRGcm9tRmxvYXQoZmxvYXQgbikgPSAwOwotICB2aXJ0dWFsIHZvaWQgVm9pZEZyb21Eb3VibGUoZG91YmxlIG4pID0gMDsKLSAgdmlydHVhbCB2b2lkIFZvaWRGcm9tVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHYpID0gMDsKLX07Ci0KLWNsYXNzIE1vY2s6IHB1YmxpYyBJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTW9jaygpIHt9Ci0KLSAgTU9DS19NRVRIT0QxKFZvaWRGcm9tU3RyaW5nLCB2b2lkKGNoYXIqIHN0cikpOwotICBNT0NLX01FVEhPRDEoU3RyaW5nRnJvbVN0cmluZywgY2hhciooY2hhciogc3RyKSk7Ci0gIE1PQ0tfTUVUSE9EMShJbnRGcm9tU3RyaW5nLCBpbnQoY2hhciogc3RyKSk7Ci0gIE1PQ0tfTUVUSE9EMShJbnRSZWZGcm9tU3RyaW5nLCBpbnQmKGNoYXIqIHN0cikpOwotICBNT0NLX01FVEhPRDEoVm9pZEZyb21GdW5jLCB2b2lkKHZvaWQoKmZ1bmMpKGNoYXIqIHN0cikpKTsKLSAgTU9DS19NRVRIT0QxKFZvaWRGcm9tSW50UmVmLCB2b2lkKGludCYgbikpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfTUVUSE9EMShWb2lkRnJvbUZsb2F0LCB2b2lkKGZsb2F0IG4pKTsKLSAgTU9DS19NRVRIT0QxKFZvaWRGcm9tRG91YmxlLCB2b2lkKGRvdWJsZSBuKSk7Ci0gIE1PQ0tfTUVUSE9EMShWb2lkRnJvbVZlY3Rvciwgdm9pZChjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiB2KSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2spOwotfTsKLQotY2xhc3MgSW52b2tlSGVscGVyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFN0YXRpY1ZvaWRGcm9tVm9pZCgpIHt9Ci0gIHZvaWQgVm9pZEZyb21Wb2lkKCkge30KLSAgc3RhdGljIHZvaWQgU3RhdGljVm9pZEZyb21TdHJpbmcoY2hhciogLyogc3RyICovKSB7fQotICB2b2lkIFZvaWRGcm9tU3RyaW5nKGNoYXIqIC8qIHN0ciAqLykge30KLSAgc3RhdGljIGludCBTdGF0aWNJbnRGcm9tU3RyaW5nKGNoYXIqIC8qIHN0ciAqLykgeyByZXR1cm4gMTsgfQotICBzdGF0aWMgYm9vbCBTdGF0aWNCb29sRnJvbVN0cmluZyhjb25zdCBjaGFyKiAvKiBzdHIgKi8pIHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLWNsYXNzIEZpZWxkSGVscGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEZpZWxkSGVscGVyKGludCBhX2ZpZWxkKSA6IGZpZWxkXyhhX2ZpZWxkKSB7fQotICBpbnQgZmllbGQoKSBjb25zdCB7IHJldHVybiBmaWVsZF87IH0KLSAgaW50IGZpZWxkXzsgIC8vIE5PTElOVCAtLSBuZWVkIGV4dGVybmFsIGFjY2VzcyB0byBmaWVsZF8gdG8gdGVzdAotICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHRoZSBGaWVsZCBtYXRjaGVyLgotfTsKLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFJldHVyblZvaWQgYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdFJldHVyblZvaWQpIHsKLSAgTW9jayBtb2NrOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShSZXR1cm4oKSk7Ci0gIG1vY2suVm9pZEZyb21TdHJpbmcoTlVMTCk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBSZXR1cm4gYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdFJldHVybikgewotICBNb2NrIG1vY2s7Ci0gIGNoYXIgY2ggPSAneCc7Ci0KLSAgRVhQRUNUX0NBTEwobW9jaywgU3RyaW5nRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoUmV0dXJuKCZjaCkpOwotICBtb2NrLlN0cmluZ0Zyb21TdHJpbmcoTlVMTCk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBSZXR1cm5OdWxsIGFjdGlvbi4KLVRFU1QoTGlua1Rlc3QsIFRlc3RSZXR1cm5OdWxsKSB7Ci0gIE1vY2sgbW9jazsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoUmV0dXJuKCkpOwotICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgUmV0dXJuUmVmIGFjdGlvbi4KLVRFU1QoTGlua1Rlc3QsIFRlc3RSZXR1cm5SZWYpIHsKLSAgTW9jayBtb2NrOwotICBpbnQgbiA9IDQyOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIEludFJlZkZyb21TdHJpbmcoXykpLldpbGxPbmNlKFJldHVyblJlZihuKSk7Ci0gIG1vY2suSW50UmVmRnJvbVN0cmluZyhOVUxMKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEFzc2lnbiBhY3Rpb24uCi1URVNUKExpbmtUZXN0LCBUZXN0QXNzaWduKSB7Ci0gIE1vY2sgbW9jazsKLSAgY2hhciBjaCA9ICd4JzsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoQXNzaWduKCZjaCwgJ3knKSk7Ci0gIG1vY2suVm9pZEZyb21TdHJpbmcoTlVMTCk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBTZXRBcmdQb2ludGVlIGFjdGlvbi4KLVRFU1QoTGlua1Rlc3QsIFRlc3RTZXRBcmdQb2ludGVlKSB7Ci0gIE1vY2sgbW9jazsKLSAgY2hhciBjaCA9ICd4JzsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoU2V0QXJnUG9pbnRlZTwwPigneScpKTsKLSAgbW9jay5Wb2lkRnJvbVN0cmluZygmY2gpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgU2V0QXJyYXlBcmd1bWVudCBhY3Rpb24uCi1URVNUKExpbmtUZXN0LCBUZXN0U2V0QXJyYXlBcmd1bWVudCkgewotICBNb2NrIG1vY2s7Ci0gIGNoYXIgY2ggPSAneCc7Ci0gIGNoYXIgY2gyID0gJ3knOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShTZXRBcnJheUFyZ3VtZW50PDA+KCZjaDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaDIgKyAxKSk7Ci0gIG1vY2suVm9pZEZyb21TdHJpbmcoJmNoKTsKLX0KLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgU2V0RXJybm9BbmRSZXR1cm4gYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdFNldEVycm5vQW5kUmV0dXJuKSB7Ci0gIE1vY2sgbW9jazsKLQotICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLSAgRVhQRUNUX0NBTEwobW9jaywgSW50RnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoU2V0RXJybm9BbmRSZXR1cm4oMSwgLTEpKTsKLSAgbW9jay5JbnRGcm9tU3RyaW5nKE5VTEwpOwotICBlcnJubyA9IHNhdmVkX2Vycm5vOwotfQotCi0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgSW52b2tlKGZ1bmN0aW9uKSBhbmQgSW52b2tlKG9iamVjdCwgbWV0aG9kKSBhY3Rpb25zLgotVEVTVChMaW5rVGVzdCwgVGVzdEludm9rZSkgewotICBNb2NrIG1vY2s7Ci0gIEludm9rZUhlbHBlciB0ZXN0X2ludm9rZV9oZWxwZXI7Ci0KLSAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlKCZJbnZva2VIZWxwZXI6OlN0YXRpY1ZvaWRGcm9tU3RyaW5nKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2UoJnRlc3RfaW52b2tlX2hlbHBlciwgJkludm9rZUhlbHBlcjo6Vm9pZEZyb21TdHJpbmcpKTsKLSAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKLSAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEludm9rZVdpdGhvdXRBcmdzIGFjdGlvbi4KLVRFU1QoTGlua1Rlc3QsIFRlc3RJbnZva2VXaXRob3V0QXJncykgewotICBNb2NrIG1vY2s7Ci0gIEludm9rZUhlbHBlciB0ZXN0X2ludm9rZV9oZWxwZXI7Ci0KLSAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlV2l0aG91dEFyZ3MoJkludm9rZUhlbHBlcjo6U3RhdGljVm9pZEZyb21Wb2lkKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VXaXRob3V0QXJncygmdGVzdF9pbnZva2VfaGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnZva2VIZWxwZXI6OlZvaWRGcm9tVm9pZCkpOwotICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOwotICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgSW52b2tlQXJndW1lbnQgYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdEludm9rZUFyZ3VtZW50KSB7Ci0gIE1vY2sgbW9jazsKLSAgY2hhciBjaCA9ICd4JzsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbUZ1bmMoXykpLldpbGxPbmNlKEludm9rZUFyZ3VtZW50PDA+KCZjaCkpOwotICBtb2NrLlZvaWRGcm9tRnVuYyhJbnZva2VIZWxwZXI6OlN0YXRpY1ZvaWRGcm9tU3RyaW5nKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFdpdGhBcmcgYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdFdpdGhBcmcpIHsKLSAgTW9jayBtb2NrOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKQotICAgICAgLldpbGxPbmNlKFdpdGhBcmc8MD4oSW52b2tlKCZJbnZva2VIZWxwZXI6OlN0YXRpY1ZvaWRGcm9tU3RyaW5nKSkpOwotICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgV2l0aEFyZ3MgYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdFdpdGhBcmdzKSB7Ci0gIE1vY2sgbW9jazsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkKLSAgICAgIC5XaWxsT25jZShXaXRoQXJnczwwPihJbnZva2UoJkludm9rZUhlbHBlcjo6U3RhdGljVm9pZEZyb21TdHJpbmcpKSk7Ci0gIG1vY2suVm9pZEZyb21TdHJpbmcoTlVMTCk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBXaXRob3V0QXJncyBhY3Rpb24uCi1URVNUKExpbmtUZXN0LCBUZXN0V2l0aG91dEFyZ3MpIHsKLSAgTW9jayBtb2NrOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShXaXRob3V0QXJncyhSZXR1cm4oKSkpOwotICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgRG9BbGwgYWN0aW9uLgotVEVTVChMaW5rVGVzdCwgVGVzdERvQWxsKSB7Ci0gIE1vY2sgbW9jazsKLSAgY2hhciBjaCA9ICd4JzsKLQotICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmdQb2ludGVlPDA+KCd5JyksIFJldHVybigpKSk7Ci0gIG1vY2suVm9pZEZyb21TdHJpbmcoJmNoKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIERvRGVmYXVsdCBhY3Rpb24uCi1URVNUKExpbmtUZXN0LCBUZXN0RG9EZWZhdWx0KSB7Ci0gIE1vY2sgbW9jazsKLSAgY2hhciBjaCA9ICd4JzsKLQotICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKLSAgbW9jay5Wb2lkRnJvbVN0cmluZygmY2gpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgSWdub3JlUmVzdWx0IGFjdGlvbi4KLVRFU1QoTGlua1Rlc3QsIFRlc3RJZ25vcmVSZXN1bHQpIHsKLSAgTW9jayBtb2NrOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShJZ25vcmVSZXN1bHQoUmV0dXJuKDQyKSkpOwotICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOwotfQotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBUaHJvdyBhY3Rpb24uCi1URVNUKExpbmtUZXN0LCBUZXN0VGhyb3cpIHsKLSAgTW9jayBtb2NrOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShUaHJvdyg0MikpOwotICBFWFBFQ1RfVEhST1cobW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKSwgaW50KTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gVGhlIEFDVElPTiooKSBtYWNyb3MgdHJpZ2dlciB3YXJuaW5nIEM0MTAwICh1bnJlZmVyZW5jZWQgZm9ybWFsCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluCi0vLyB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgYXMgdGhlIHdhcm5pbmdzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgbWFjcm8KLS8vIGlzIGV4cGFuZGVkIGFuZCBtYWNybyBleHBhbnNpb24gY2Fubm90IGNvbnRhaW4gI3ByYWdtYS4gIFRoZXJlZm9yZQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKLSNlbmRpZgotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiBhY3Rpb25zIGNyZWF0ZWQgdXNpbmcgQUNUSU9OIG1hY3JvLgotbmFtZXNwYWNlIHsKLUFDVElPTihSZXR1cm4xKSB7IHJldHVybiAxOyB9Ci19Ci0KLVRFU1QoTGlua1Rlc3QsIFRlc3RBY3Rpb25NYWNybykgewotICBNb2NrIG1vY2s7Ci0KLSAgRVhQRUNUX0NBTEwobW9jaywgSW50RnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoUmV0dXJuMSgpKTsKLSAgbW9jay5JbnRGcm9tU3RyaW5nKE5VTEwpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiBhY3Rpb25zIGNyZWF0ZWQgdXNpbmcgQUNUSU9OX1AgbWFjcm8uCi1uYW1lc3BhY2UgewotQUNUSU9OX1AoUmV0dXJuQXJndW1lbnQsIHJldF92YWx1ZSkgeyByZXR1cm4gcmV0X3ZhbHVlOyB9Ci19Ci0KLVRFU1QoTGlua1Rlc3QsIFRlc3RBY3Rpb25QTWFjcm8pIHsKLSAgTW9jayBtb2NrOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIEludEZyb21TdHJpbmcoXykpLldpbGxPbmNlKFJldHVybkFyZ3VtZW50KDQyKSk7Ci0gIG1vY2suSW50RnJvbVN0cmluZyhOVUxMKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgYWN0aW9ucyBjcmVhdGVkIHVzaW5nIEFDVElPTl9QMiBtYWNyby4KLW5hbWVzcGFjZSB7Ci1BQ1RJT05fUDIoUmV0dXJuRXF1YWxzRWl0aGVyT2YsIGZpcnN0LCBzZWNvbmQpIHsKLSAgcmV0dXJuIGFyZzAgPT0gZmlyc3QgfHwgYXJnMCA9PSBzZWNvbmQ7Ci19Ci19Ci0KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQotVEVTVChMaW5rVGVzdCwgVGVzdEFjdGlvblAyTWFjcm8pIHsKLSAgTW9jayBtb2NrOwotICBjaGFyIGNoID0gJ3gnOwotCi0gIEVYUEVDVF9DQUxMKG1vY2ssIEludEZyb21TdHJpbmcoXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuRXF1YWxzRWl0aGVyT2YoIm9uZSIsICJ0d28iKSk7Ci0gIG1vY2suSW50RnJvbVN0cmluZygmY2gpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgIl8iIG1hdGNoZXIuCi1URVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckFueXRoaW5nKSB7Ci0gIE1vY2sgbW9jazsKLQotICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEEgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyQSkgewotICBNb2NrIG1vY2s7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhBPGNoYXIqPigpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBFcSBhbmQgdGhlICJiYXJlIHZhbHVlIiBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJzRXEpIHsKLSAgTW9jayBtb2NrOwotICBjb25zdCBjaGFyKiBwID0gIngiOwotCi0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoRXEocCkpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhjb25zdF9jYXN0PGNoYXIqPigieSIpKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEx0LCBHdCwgTGUsIEdlLCBhbmQgTmUgbWF0Y2hlcnMuCi1URVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlcnNSZWxhdGlvbnMpIHsKLSAgTW9jayBtb2NrOwotCi0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21GbG9hdChMdCgxLjBmKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tRmxvYXQoR3QoMS4wZikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbUZsb2F0KExlKDEuMGYpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21GbG9hdChHZSgxLjBmKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tRmxvYXQoTmUoMS4wZikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIE5vdE51bGwgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyTm90TnVsbCkgewotICBNb2NrIG1vY2s7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhOb3ROdWxsKCkpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIElzTnVsbCBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJJc051bGwpIHsKLSAgTW9jayBtb2NrOwotCi0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoSXNOdWxsKCkpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFJlZiBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJSZWYpIHsKLSAgTW9jayBtb2NrOwotICBpbnQgYSA9IDA7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbUludFJlZihSZWYoYSkpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFR5cGVkRXEgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyVHlwZWRFcSkgewotICBNb2NrIG1vY2s7Ci0gIGxvbmcgYSA9IDA7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbUludFJlZihUeXBlZEVxPGludCY+KGEpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBGbG9hdEVxLCBEb3VibGVFcSwgTmFuU2Vuc2l0aXZlRmxvYXRFcSBhbmQKLS8vIE5hblNlbnNpdGl2ZURvdWJsZUVxIG1hdGNoZXJzLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJzRmxvYXRpbmdQb2ludCkgewotICBNb2NrIG1vY2s7Ci0gIGZsb2F0IGEgPSAwOwotCi0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21GbG9hdChGbG9hdEVxKGEpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21Eb3VibGUoRG91YmxlRXEoYSkpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbUZsb2F0KE5hblNlbnNpdGl2ZUZsb2F0RXEoYSkpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbURvdWJsZShOYW5TZW5zaXRpdmVEb3VibGVFcShhKSkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBDb250YWluc1JlZ2V4IG1hdGNoZXIuCi1URVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckNvbnRhaW5zUmVnZXgpIHsKLSAgTW9jayBtb2NrOwotCi0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoQ29udGFpbnNSZWdleCgiLioiKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgTWF0Y2hlc1JlZ2V4IG1hdGNoZXIuCi1URVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlck1hdGNoZXNSZWdleCkgewotICBNb2NrIG1vY2s7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhNYXRjaGVzUmVnZXgoIi4qIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFN0YXJ0c1dpdGgsIEVuZHNXaXRoLCBhbmQgSGFzU3Vic3RyIG1hdGNoZXJzLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJzU3Vic3RyaW5ncykgewotICBNb2NrIG1vY2s7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhTdGFydHNXaXRoKCJhIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhFbmRzV2l0aCgiYyIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoSGFzU3Vic3RyKCJiIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFN0ckVxLCBTdHJOZSwgU3RyQ2FzZUVxLCBhbmQgU3RyQ2FzZU5lIG1hdGNoZXJzLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJzU3RyaW5nRXF1YWxpdHkpIHsKLSAgTW9jayBtb2NrOwotICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKFN0ckVxKCJhIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhTdHJOZSgiYSIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Ci0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoU3RyQ2FzZUVxKCJhIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhTdHJDYXNlTmUoImEiKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgRWxlbWVudHNBcmUgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyRWxlbWVudHNBcmUpIHsKLSAgTW9jayBtb2NrOwotCi0gIE9OX0NBTEwobW9jaywgVm9pZEZyb21WZWN0b3IoRWxlbWVudHNBcmUoJ2EnLCBfKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgRWxlbWVudHNBcmVBcnJheSBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJFbGVtZW50c0FyZUFycmF5KSB7Ci0gIE1vY2sgbW9jazsKLSAgY2hhciBhcnJbXSA9IHsgJ2EnLCAnYicgfTsKLQotICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tVmVjdG9yKEVsZW1lbnRzQXJlQXJyYXkoYXJyKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgQ29udGFpbmVyRXEgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyQ29udGFpbmVyRXEpIHsKLSAgTW9jayBtb2NrOwotICBzdGQ6OnZlY3RvcjxpbnQ+IHY7Ci0KLSAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVZlY3RvcihDb250YWluZXJFcSh2KSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgRmllbGQgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyRmllbGQpIHsKLSAgRmllbGRIZWxwZXIgaGVscGVyKDApOwotCi0gIE1hdGNoZXI8Y29uc3QgRmllbGRIZWxwZXImPiBtID0gRmllbGQoJkZpZWxkSGVscGVyOjpmaWVsZF8sIEVxKDApKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGhlbHBlcikpOwotCi0gIE1hdGNoZXI8Y29uc3QgRmllbGRIZWxwZXIqPiBtMiA9IEZpZWxkKCZGaWVsZEhlbHBlcjo6ZmllbGRfLCBFcSgwKSk7Ci0gIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoJmhlbHBlcikpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgUHJvcGVydHkgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyUHJvcGVydHkpIHsKLSAgRmllbGRIZWxwZXIgaGVscGVyKDApOwotCi0gIE1hdGNoZXI8Y29uc3QgRmllbGRIZWxwZXImPiBtID0gUHJvcGVydHkoJkZpZWxkSGVscGVyOjpmaWVsZCwgRXEoMCkpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoaGVscGVyKSk7Ci0KLSAgTWF0Y2hlcjxjb25zdCBGaWVsZEhlbHBlcio+IG0yID0gUHJvcGVydHkoJkZpZWxkSGVscGVyOjpmaWVsZCwgRXEoMCkpOwotICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCZoZWxwZXIpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFJlc3VsdE9mIG1hdGNoZXIuCi1URVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlclJlc3VsdE9mKSB7Ci0gIE1hdGNoZXI8Y2hhcio+IG0gPSBSZXN1bHRPZigmSW52b2tlSGVscGVyOjpTdGF0aWNJbnRGcm9tU3RyaW5nLCBFcSgxKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBSZXN1bHRPZiBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJQb2ludGVlKSB7Ci0gIGludCBuID0gMTsKLQotICBNYXRjaGVyPGludCo+IG0gPSBQb2ludGVlKEVxKDEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZuKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBUcnVseSBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJUcnVseSkgewotICBNYXRjaGVyPGNvbnN0IGNoYXIqPiBtID0gVHJ1bHkoJkludm9rZUhlbHBlcjo6U3RhdGljQm9vbEZyb21TdHJpbmcpOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTlVMTCkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgQWxsT2YgbWF0Y2hlci4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyQWxsT2YpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBBbGxPZihfLCBFcSgxKSk7Ci0gIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygxKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBBbnlPZiBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJBbnlPZikgewotICBNYXRjaGVyPGludD4gbSA9IEFueU9mKF8sIEVxKDEpKTsKLSAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIE5vdCBtYXRjaGVyLgotVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJOb3QpIHsKLSAgTWF0Y2hlcjxpbnQ+IG0gPSBOb3QoXyk7Ci0gIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMSkpOwotfQotCi0vLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgTWF0Y2hlckNhc3Q8VD4oKSBmdW5jdGlvbi4KLVRFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyQ2FzdCkgewotICBNYXRjaGVyPGNvbnN0IGNoYXIqPiBtID0gTWF0Y2hlckNhc3Q8Y29uc3QgY2hhcio+KF8pOwotICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTlVMTCkpOwotfQotCi0jZW5kaWYgIC8vIEdNT0NLX1RFU1RfR01PQ0tfTElOS19URVNUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3QucHkgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjZWQ4YTguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3RzIHRoZSB0ZXh0IG91dHB1dCBvZiBHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrLgotCi1TWU5PUFNJUwotICAgICAgIGdtb2NrX291dHB1dF90ZXN0LnB5IC0tYnVpbGRfZGlyPUJVSUxEL0RJUiAtLWdlbmdvbGRlbgotICAgICAgICAgIyB3aGVyZSBCVUlMRC9ESVIgY29udGFpbnMgdGhlIGJ1aWx0IGdtb2NrX291dHB1dF90ZXN0XyBmaWxlLgotICAgICAgIGdtb2NrX291dHB1dF90ZXN0LnB5IC0tZ2VuZ29sZGVuCi0gICAgICAgZ21vY2tfb3V0cHV0X3Rlc3QucHkKLSIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHN5cwotCi1pbXBvcnQgZ21vY2tfdGVzdF91dGlscwotCi0KLSMgVGhlIGZsYWcgZm9yIGdlbmVyYXRpbmcgdGhlIGdvbGRlbiBmaWxlCi1HRU5HT0xERU5fRkxBRyA9ICctLWdlbmdvbGRlbicKLQotUFJPR1JBTV9QQVRIID0gZ21vY2tfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2dtb2NrX291dHB1dF90ZXN0XycpCi1DT01NQU5EID0gW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGg9MCcsICctLWd0ZXN0X3ByaW50X3RpbWU9MCddCi1HT0xERU5fTkFNRSA9ICdnbW9ja19vdXRwdXRfdGVzdF9nb2xkZW4udHh0JwotR09MREVOX1BBVEggPSBvcy5wYXRoLmpvaW4oZ21vY2tfdGVzdF91dGlscy5HZXRTb3VyY2VEaXIoKSwgR09MREVOX05BTUUpCi0KLQotZGVmIFRvVW5peExpbmVFbmRpbmcocyk6Ci0gICIiIkNoYW5nZXMgYWxsIFdpbmRvd3MvTWFjIGxpbmUgZW5kaW5ncyBpbiBzIHRvIFVOSVggbGluZSBlbmRpbmdzLiIiIgotCi0gIHJldHVybiBzLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKS5yZXBsYWNlKCdccicsICdcbicpCi0KLQotZGVmIFJlbW92ZVJlcG9ydEhlYWRlckFuZEZvb3RlcihvdXRwdXQpOgotICAiIiJSZW1vdmVzIEdvb2dsZSBUZXN0IHJlc3VsdCByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBmcm9tIHRoZSBvdXRwdXQuIiIiCi0KLSAgb3V0cHV0ID0gcmUuc3ViKHInLipndGVzdF9tYWluLipcbicsICcnLCBvdXRwdXQpCi0gIG91dHB1dCA9IHJlLnN1YihyJ1xbLipcZCsgdGVzdHMuKlxuJywgJycsIG91dHB1dCkKLSAgb3V0cHV0ID0gcmUuc3ViKHInXFsuKiB0ZXN0IGVudmlyb25tZW50IC4qXG4nLCAnJywgb3V0cHV0KQotICBvdXRwdXQgPSByZS5zdWIocidcWz0rXF0gXGQrIHRlc3RzIC4qIHJhbi4qJywgJycsIG91dHB1dCkKLSAgb3V0cHV0ID0gcmUuc3ViKHInLiogRkFJTEVEIFRFU1RTXG4nLCAnJywgb3V0cHV0KQotICByZXR1cm4gb3V0cHV0Ci0KLQotZGVmIFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpOgotICAiIiJSZW1vdmVzIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuCi0KLSAgQXJnczoKLSAgICAgICBvdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KLQotICBSZXR1cm5zOgotICAgICAgIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gKGluIHRoZSBmb3JtIG9mCi0gICAgICAgJ0RJUkVDVE9SWS9GSUxFX05BTUU6TElORV9OVU1CRVI6ICdvcgotICAgICAgICdESVJFQ1RPUllcXEZJTEVfTkFNRShMSU5FX05VTUJFUik6ICcpIHJlcGxhY2VkIGJ5Ci0gICAgICAgJ0ZJTEU6IzogJy4KLSAgIiIiCi0KLSAgcmV0dXJuIHJlLnN1YihyJy4qWy9cXF0oLispKFw6XGQrfFwoXGQrXCkpXDonLCAnRklMRTojOicsIG91dHB1dCkKLQotCi1kZWYgTm9ybWFsaXplRXJyb3JNYXJrZXIob3V0cHV0KToKLSAgIiIiTm9ybWFsaXplcyB0aGUgZXJyb3IgbWFya2VyLCB3aGljaCBpcyBkaWZmZXJlbnQgb24gV2luZG93cyB2cyBvbiBMaW51eC4iIiIKLQotICByZXR1cm4gcmUuc3ViKHInIGVycm9yOiAnLCAnIEZhaWx1cmVcbicsIG91dHB1dCkKLQotCi1kZWYgUmVtb3ZlTWVtb3J5QWRkcmVzc2VzKG91dHB1dCk6Ci0gICIiIlJlbW92ZXMgbWVtb3J5IGFkZHJlc3NlcyBmcm9tIHRoZSB0ZXN0IG91dHB1dC4iIiIKLQotICByZXR1cm4gcmUuc3ViKHInQFx3KycsICdAMHgjJywgb3V0cHV0KQotCi0KLWRlZiBSZW1vdmVUZXN0TmFtZXNPZkxlYWtlZE1vY2tzKG91dHB1dCk6Ci0gICIiIlJlbW92ZXMgdGhlIHRlc3QgbmFtZXMgb2YgbGVha2VkIG1vY2sgb2JqZWN0cyBmcm9tIHRoZSB0ZXN0IG91dHB1dC4iIiIKLQotICByZXR1cm4gcmUuc3ViKHInXCh1c2VkIGluIHRlc3QgLitcKSAnLCAnJywgb3V0cHV0KQotCi0KLWRlZiBHZXRMZWFreVRlc3RzKG91dHB1dCk6Ci0gICIiIlJldHVybnMgYSBsaXN0IG9mIHRlc3QgbmFtZXMgdGhhdCBsZWFrIG1vY2sgb2JqZWN0cy4iIiIKLQotICAjIGZpbmRhbGwoKSByZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWF0Y2hlcyBvZiB0aGUgcmVnZXggaW4gb3V0cHV0LgotICAjIEZvciBleGFtcGxlLCBpZiAnKHVzZWQgaW4gdGVzdCBGb29UZXN0LkJhciknIGlzIGluIG91dHB1dCwgdGhlCi0gICMgbGlzdCB3aWxsIGNvbnRhaW4gJ0Zvb1Rlc3QuQmFyJy4KLSAgcmV0dXJuIHJlLmZpbmRhbGwocidcKHVzZWQgaW4gdGVzdCAoLispXCknLCBvdXRwdXQpCi0KLQotZGVmIEdldE5vcm1hbGl6ZWRPdXRwdXRBbmRMZWFreVRlc3RzKG91dHB1dCk6Ci0gICIiIk5vcm1hbGl6ZXMgdGhlIG91dHB1dCBvZiBnbW9ja19vdXRwdXRfdGVzdF8uCi0KLSAgQXJnczoKLSAgICBvdXRwdXQ6IFRoZSB0ZXN0IG91dHB1dC4KLQotICBSZXR1cm5zOgotICAgIEEgdHVwbGUgKHRoZSBub3JtYWxpemVkIHRlc3Qgb3V0cHV0LCB0aGUgbGlzdCBvZiB0ZXN0IG5hbWVzIHRoYXQgaGF2ZQotICAgIGxlYWtlZCBtb2NrcykuCi0gICIiIgotCi0gIG91dHB1dCA9IFRvVW5peExpbmVFbmRpbmcob3V0cHV0KQotICBvdXRwdXQgPSBSZW1vdmVSZXBvcnRIZWFkZXJBbmRGb290ZXIob3V0cHV0KQotICBvdXRwdXQgPSBOb3JtYWxpemVFcnJvck1hcmtlcihvdXRwdXQpCi0gIG91dHB1dCA9IFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpCi0gIG91dHB1dCA9IFJlbW92ZU1lbW9yeUFkZHJlc3NlcyhvdXRwdXQpCi0gIHJldHVybiAoUmVtb3ZlVGVzdE5hbWVzT2ZMZWFrZWRNb2NrcyhvdXRwdXQpLCBHZXRMZWFreVRlc3RzKG91dHB1dCkpCi0KLQotZGVmIEdldFNoZWxsQ29tbWFuZE91dHB1dChjbWQpOgotICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgcmV0dXJucyBpdHMgU1RET1VUIGluIGEgc3RyaW5nLiIiIgotCi0gIHJldHVybiBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY21kLCBjYXB0dXJlX3N0ZGVycj1GYWxzZSkub3V0cHV0Ci0KLQotZGVmIEdldE5vcm1hbGl6ZWRDb21tYW5kT3V0cHV0QW5kTGVha3lUZXN0cyhjbWQpOgotICAiIiJSdW5zIGEgY29tbWFuZCBhbmQgcmV0dXJucyBpdHMgbm9ybWFsaXplZCBvdXRwdXQgYW5kIGEgbGlzdCBvZiBsZWFreSB0ZXN0cy4KLQotICBBcmdzOgotICAgIGNtZDogIHRoZSBzaGVsbCBjb21tYW5kLgotICAiIiIKLQotICAjIERpc2FibGVzIGV4Y2VwdGlvbiBwb3AtdXBzIG9uIFdpbmRvd3MuCi0gIG9zLmVudmlyb25bJ0dURVNUX0NBVENIX0VYQ0VQVElPTlMnXSA9ICcxJwotICByZXR1cm4gR2V0Tm9ybWFsaXplZE91dHB1dEFuZExlYWt5VGVzdHMoR2V0U2hlbGxDb21tYW5kT3V0cHV0KGNtZCkpCi0KLQotY2xhc3MgR01vY2tPdXRwdXRUZXN0KGdtb2NrX3Rlc3RfdXRpbHMuVGVzdENhc2UpOgotICBkZWYgdGVzdE91dHB1dChzZWxmKToKLSAgICAob3V0cHV0LCBsZWFreV90ZXN0cykgPSBHZXROb3JtYWxpemVkQ29tbWFuZE91dHB1dEFuZExlYWt5VGVzdHMoQ09NTUFORCkKLSAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICdyYicpCi0gICAgZ29sZGVuID0gZ29sZGVuX2ZpbGUucmVhZCgpCi0gICAgZ29sZGVuX2ZpbGUuY2xvc2UoKQotCi0gICAgIyBUaGUgbm9ybWFsaXplZCBvdXRwdXQgc2hvdWxkIG1hdGNoIHRoZSBnb2xkZW4gZmlsZS4KLSAgICBzZWxmLmFzc2VydEVxdWFscyhnb2xkZW4sIG91dHB1dCkKLQotICAgICMgVGhlIHJhdyBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gMiBsZWFrZWQgbW9jayBvYmplY3QgZXJyb3JzIGZvcgotICAgICMgdGVzdCBHTW9ja091dHB1dFRlc3QuQ2F0Y2hlc0xlYWtlZE1vY2tzLgotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsnR01vY2tPdXRwdXRUZXN0LkNhdGNoZXNMZWFrZWRNb2NrcycsCi0gICAgICAgICAgICAgICAgICAgICAgICdHTW9ja091dHB1dFRlc3QuQ2F0Y2hlc0xlYWtlZE1vY2tzJ10sCi0gICAgICAgICAgICAgICAgICAgICAgbGVha3lfdGVzdHMpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgaWYgc3lzLmFyZ3ZbMTpdID09IFtHRU5HT0xERU5fRkxBR106Ci0gICAgKG91dHB1dCwgXykgPSBHZXROb3JtYWxpemVkQ29tbWFuZE91dHB1dEFuZExlYWt5VGVzdHMoQ09NTUFORCkKLSAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICd3YicpCi0gICAgZ29sZGVuX2ZpbGUud3JpdGUob3V0cHV0KQotICAgIGdvbGRlbl9maWxlLmNsb3NlKCkKLSAgZWxzZToKLSAgICBnbW9ja190ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0Xy5jYyBiL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19vdXRwdXRfdGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Y2JhMzQuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0Xy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUZXN0cyBHb29nbGUgTW9jaydzIG91dHB1dCBpbiB2YXJpb3VzIHNjZW5hcmlvcy4gIFRoaXMgZW5zdXJlcyB0aGF0Ci0vLyBHb29nbGUgTW9jaydzIG1lc3NhZ2VzIGFyZSByZWFkYWJsZSBhbmQgdXNlZnVsLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkFueU51bWJlcjsKLXVzaW5nIHRlc3Rpbmc6OkdlOwotdXNpbmcgdGVzdGluZzo6SW5TZXF1ZW5jZTsKLXVzaW5nIHRlc3Rpbmc6Ok5hZ2d5TW9jazsKLXVzaW5nIHRlc3Rpbmc6OlJlZjsKLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIHRlc3Rpbmc6OlNlcXVlbmNlOwotCi1jbGFzcyBNb2NrRm9vIHsKLSBwdWJsaWM6Ci0gIE1vY2tGb28oKSB7fQotCi0gIE1PQ0tfTUVUSE9EMyhCYXIsIGNoYXIoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGludCBpLCBkb3VibGUgeCkpOwotICBNT0NLX01FVEhPRDIoQmFyMiwgYm9vbChpbnQgeCwgaW50IHkpKTsKLSAgTU9DS19NRVRIT0QyKEJhcjMsIHZvaWQoaW50IHgsIGludCB5KSk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGb28pOwotfTsKLQotY2xhc3MgR01vY2tPdXRwdXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgTmFnZ3lNb2NrPE1vY2tGb28+IGZvb187Ci19OwotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBFeHBlY3RlZENhbGwpIHsKLSAgdGVzdGluZzo6R01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJpbmZvIjsKLQotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKTsKLSAgZm9vXy5CYXIyKDAsIDApOyAgLy8gRXhwZWN0ZWQgY2FsbAotCi0gIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSkgPSAid2FybmluZyI7Ci19Ci0KLVRFU1RfRihHTW9ja091dHB1dFRlc3QsIEV4cGVjdGVkQ2FsbFRvVm9pZEZ1bmN0aW9uKSB7Ci0gIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSkgPSAiaW5mbyI7Ci0KLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMygwLCBfKSk7Ci0gIGZvb18uQmFyMygwLCAwKTsgIC8vIEV4cGVjdGVkIGNhbGwKLQotICB0ZXN0aW5nOjpHTU9DS19GTEFHKHZlcmJvc2UpID0gIndhcm5pbmciOwotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBFeHBsaWNpdEFjdGlvbnNSdW5PdXQpIHsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMihfLCBfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKFJldHVybihmYWxzZSkpOwotICBmb29fLkJhcjIoMiwgMik7Ci0gIGZvb18uQmFyMigxLCAxKTsgIC8vIEV4cGxpY2l0IGFjdGlvbnMgaW4gRVhQRUNUX0NBTEwgcnVuIG91dC4KLX0KLQotVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgVW5leHBlY3RlZENhbGwpIHsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCBfKSk7Ci0KLSAgZm9vXy5CYXIyKDEsIDApOyAgLy8gVW5leHBlY3RlZCBjYWxsCi0gIGZvb18uQmFyMigwLCAwKTsgIC8vIEV4cGVjdGVkIGNhbGwKLX0KLQotVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgVW5leHBlY3RlZENhbGxUb1ZvaWRGdW5jdGlvbikgewotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIzKDAsIF8pKTsKLQotICBmb29fLkJhcjMoMSwgMCk7ICAvLyBVbmV4cGVjdGVkIGNhbGwKLSAgZm9vXy5CYXIzKDAsIDApOyAgLy8gRXhwZWN0ZWQgY2FsbAotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBFeGNlc3NpdmVDYWxsKSB7Ci0gIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMCwgXykpOwotCi0gIGZvb18uQmFyMigwLCAwKTsgIC8vIEV4cGVjdGVkIGNhbGwKLSAgZm9vXy5CYXIyKDAsIDEpOyAgLy8gRXhjZXNzaXZlIGNhbGwKLX0KLQotVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgRXhjZXNzaXZlQ2FsbFRvVm9pZEZ1bmN0aW9uKSB7Ci0gIEVYUEVDVF9DQUxMKGZvb18sIEJhcjMoMCwgXykpOwotCi0gIGZvb18uQmFyMygwLCAwKTsgIC8vIEV4cGVjdGVkIGNhbGwKLSAgZm9vXy5CYXIzKDAsIDEpOyAgLy8gRXhjZXNzaXZlIGNhbGwKLX0KLQotVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgVW5pbnRlcmVzdGluZ0NhbGwpIHsKLSAgZm9vXy5CYXIyKDAsIDEpOyAgLy8gVW5pbnRlcmVzdGluZyBjYWxsCi19Ci0KLVRFU1RfRihHTW9ja091dHB1dFRlc3QsIFVuaW50ZXJlc3RpbmdDYWxsVG9Wb2lkRnVuY3Rpb24pIHsKLSAgZm9vXy5CYXIzKDAsIDEpOyAgLy8gVW5pbnRlcmVzdGluZyBjYWxsCi19Ci0KLVRFU1RfRihHTW9ja091dHB1dFRlc3QsIFJldGlyZWRFeHBlY3RhdGlvbikgewotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKQotICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCAwKSk7Ci0KLSAgZm9vXy5CYXIyKDEsIDEpOwotICBmb29fLkJhcjIoMSwgMSk7ICAvLyBNYXRjaGVzIGEgcmV0aXJlZCBleHBlY3RhdGlvbgotICBmb29fLkJhcjIoMCwgMCk7Ci19Ci0KLVRFU1RfRihHTW9ja091dHB1dFRlc3QsIFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlKSB7Ci0gIHsKLSAgICBJblNlcXVlbmNlIHM7Ci0gICAgRVhQRUNUX0NBTEwoZm9vXywgQmFyKF8sIDAsIF8pKTsKLSAgICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIDApKTsKLSAgICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDEsIF8pKTsKLSAgfQotCi0gIGZvb18uQmFyMigxLCAwKTsgIC8vIEhhcyBvbmUgaW1tZWRpYXRlIHVuc2F0aXNmaWVkIHByZS1yZXF1aXNpdGUKLSAgZm9vXy5CYXIoIkhpIiwgMCwgMCk7Ci0gIGZvb18uQmFyMigwLCAwKTsKLSAgZm9vXy5CYXIyKDEsIDApOwotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMpIHsKLSAgU2VxdWVuY2UgczEsIHMyOwotCi0gIEVYUEVDVF9DQUxMKGZvb18sIEJhcihfLCAwLCBfKSkKLSAgICAgIC5JblNlcXVlbmNlKHMxKTsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCAwKSkKLSAgICAgIC5JblNlcXVlbmNlKHMyKTsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigxLCBfKSkKLSAgICAgIC5JblNlcXVlbmNlKHMxLCBzMik7Ci0KLSAgZm9vXy5CYXIyKDEsIDApOyAgLy8gSGFzIHR3byBpbW1lZGlhdGUgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMKLSAgZm9vXy5CYXIoIkhpIiwgMCwgMCk7Ci0gIGZvb18uQmFyMigwLCAwKTsKLSAgZm9vXy5CYXIyKDEsIDApOwotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbnNhdGlzZmllZFdpdGgpIHsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMihfLCBfKSkuV2l0aChHZSgpKTsKLX0KLQotVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgVW5zYXRpc2ZpZWRFeHBlY3RhdGlvbikgewotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIoXywgXywgXykpOwotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKQotICAgICAgLlRpbWVzKDIpOwotCi0gIGZvb18uQmFyMigwLCAxKTsKLX0KLQotVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgTWlzbWF0Y2hBcmd1bWVudHMpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcyA9ICJIaSI7Ci0gIEVYUEVDVF9DQUxMKGZvb18sIEJhcihSZWYocyksIF8sIEdlKDApKSk7Ci0KLSAgZm9vXy5CYXIoIkhvIiwgMCwgLTAuMSk7ICAvLyBNaXNtYXRjaCBhcmd1bWVudHMKLSAgZm9vXy5CYXIocywgMCwgMCk7Ci19Ci0KLVRFU1RfRihHTW9ja091dHB1dFRlc3QsIE1pc21hdGNoV2l0aCkgewotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKEdlKDIpLCBHZSgxKSkpCi0gICAgICAuV2l0aChHZSgpKTsKLQotICBmb29fLkJhcjIoMiwgMyk7ICAvLyBNaXNtYXRjaCBXaXRoKCkKLSAgZm9vXy5CYXIyKDIsIDEpOwotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBNaXNtYXRjaEFyZ3VtZW50c0FuZFdpdGgpIHsKLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMihHZSgyKSwgR2UoMSkpKQotICAgICAgLldpdGgoR2UoKSk7Ci0KLSAgZm9vXy5CYXIyKDEsIDMpOyAgLy8gTWlzbWF0Y2ggYXJndW1lbnRzIGFuZCBtaXNtYXRjaCBXaXRoKCkKLSAgZm9vXy5CYXIyKDIsIDEpOwotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbmV4cGVjdGVkQ2FsbFdpdGhEZWZhdWx0QWN0aW9uKSB7Ci0gIE9OX0NBTEwoZm9vXywgQmFyMihfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7ICAgLy8gRGVmYXVsdCBhY3Rpb24gIzEKLSAgT05fQ0FMTChmb29fLCBCYXIyKDEsIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKGZhbHNlKSk7ICAvLyBEZWZhdWx0IGFjdGlvbiAjMgotCi0gIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMiwgMikpOwotICBmb29fLkJhcjIoMSwgMCk7ICAvLyBVbmV4cGVjdGVkIGNhbGwsIHRha2VzIGRlZmF1bHQgYWN0aW9uICMyLgotICBmb29fLkJhcjIoMCwgMCk7ICAvLyBVbmV4cGVjdGVkIGNhbGwsIHRha2VzIGRlZmF1bHQgYWN0aW9uICMxLgotICBmb29fLkJhcjIoMiwgMik7ICAvLyBFeHBlY3RlZCBjYWxsLgotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBFeGNlc3NpdmVDYWxsV2l0aERlZmF1bHRBY3Rpb24pIHsKLSAgT05fQ0FMTChmb29fLCBCYXIyKF8sIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsgICAvLyBEZWZhdWx0IGFjdGlvbiAjMQotICBPTl9DQUxMKGZvb18sIEJhcjIoMSwgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oZmFsc2UpKTsgIC8vIERlZmF1bHQgYWN0aW9uICMyCi0KLSAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigyLCAyKSk7Ci0gIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMSwgMSkpOwotCi0gIGZvb18uQmFyMigyLCAyKTsgIC8vIEV4cGVjdGVkIGNhbGwuCi0gIGZvb18uQmFyMigyLCAyKTsgIC8vIEV4Y2Vzc2l2ZSBjYWxsLCB0YWtlcyBkZWZhdWx0IGFjdGlvbiAjMS4KLSAgZm9vXy5CYXIyKDEsIDEpOyAgLy8gRXhwZWN0ZWQgY2FsbC4KLSAgZm9vXy5CYXIyKDEsIDEpOyAgLy8gRXhjZXNzaXZlIGNhbGwsIHRha2VzIGRlZmF1bHQgYWN0aW9uICMyLgotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbmludGVyZXN0aW5nQ2FsbFdpdGhEZWZhdWx0QWN0aW9uKSB7Ci0gIE9OX0NBTEwoZm9vXywgQmFyMihfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7ICAgLy8gRGVmYXVsdCBhY3Rpb24gIzEKLSAgT05fQ0FMTChmb29fLCBCYXIyKDEsIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKGZhbHNlKSk7ICAvLyBEZWZhdWx0IGFjdGlvbiAjMgotCi0gIGZvb18uQmFyMigyLCAyKTsgIC8vIFVuaW50ZXJlc3RpbmcgY2FsbCwgdGFrZXMgZGVmYXVsdCBhY3Rpb24gIzEuCi0gIGZvb18uQmFyMigxLCAxKTsgIC8vIFVuaW50ZXJlc3RpbmcgY2FsbCwgdGFrZXMgZGVmYXVsdCBhY3Rpb24gIzIuCi19Ci0KLVRFU1RfRihHTW9ja091dHB1dFRlc3QsIEV4cGxpY2l0QWN0aW9uc1J1bk91dFdpdGhEZWZhdWx0QWN0aW9uKSB7Ci0gIE9OX0NBTEwoZm9vXywgQmFyMihfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7ICAgLy8gRGVmYXVsdCBhY3Rpb24gIzEKLQotICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7Ci0gIGZvb18uQmFyMigyLCAyKTsKLSAgZm9vXy5CYXIyKDEsIDEpOyAgLy8gRXhwbGljaXQgYWN0aW9ucyBpbiBFWFBFQ1RfQ0FMTCBydW4gb3V0LgotfQotCi1URVNUX0YoR01vY2tPdXRwdXRUZXN0LCBDYXRjaGVzTGVha2VkTW9ja3MpIHsKLSAgTW9ja0ZvbyogZm9vMSA9IG5ldyBNb2NrRm9vOwotICBNb2NrRm9vKiBmb28yID0gbmV3IE1vY2tGb287Ci0KLSAgLy8gSW52b2tlcyBPTl9DQUxMIG9uIGZvbzEuCi0gIE9OX0NBTEwoKmZvbzEsIEJhcihfLCBfLCBfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oJ2EnKSk7Ci0KLSAgLy8gSW52b2tlcyBFWFBFQ1RfQ0FMTCBvbiBmb28yLgotICBFWFBFQ1RfQ0FMTCgqZm9vMiwgQmFyMihfLCBfKSk7Ci0gIEVYUEVDVF9DQUxMKCpmb28yLCBCYXIyKDEsIF8pKTsKLSAgRVhQRUNUX0NBTEwoKmZvbzIsIEJhcjMoXywgXykpLlRpbWVzKEFueU51bWJlcigpKTsKLSAgZm9vMi0+QmFyMigyLCAxKTsKLSAgZm9vMi0+QmFyMigxLCAxKTsKLQotICAvLyBCb3RoIGZvbzEgYW5kIGZvbzIgYXJlIGRlbGliZXJhdGVseSBsZWFrZWQuCi19Ci0KLXZvaWQgVGVzdENhdGNoZXNMZWFrZWRNb2Nrc0luQWRIb2NUZXN0cygpIHsKLSAgTW9ja0ZvbyogZm9vID0gbmV3IE1vY2tGb287Ci0KLSAgLy8gSW52b2tlcyBFWFBFQ1RfQ0FMTCBvbiBmb28uCi0gIEVYUEVDVF9DQUxMKCpmb28sIEJhcjIoXywgXykpOwotICBmb28tPkJhcjIoMiwgMSk7Ci0KLSAgLy8gZm9vIGlzIGRlbGliZXJhdGVseSBsZWFrZWQuCi19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7Ci0KLSAgLy8gRW5zdXJlcyB0aGF0IHRoZSB0ZXN0cyBwYXNzIG5vIG1hdHRlciB3aGF0IHZhbHVlIG9mCi0gIC8vIC0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzIGFuZCAtLWdtb2NrX3ZlcmJvc2UgdGhlIHVzZXIgc3BlY2lmaWVzLgotICB0ZXN0aW5nOjpHTU9DS19GTEFHKGNhdGNoX2xlYWtlZF9tb2NrcykgPSB0cnVlOwotICB0ZXN0aW5nOjpHTU9DS19GTEFHKHZlcmJvc2UpID0gIndhcm5pbmciOwotCi0gIFRlc3RDYXRjaGVzTGVha2VkTW9ja3NJbkFkSG9jVGVzdHMoKTsKLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19vdXRwdXRfdGVzdF9nb2xkZW4udHh0IGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0X2dvbGRlbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MGE4ZjAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0X2dvbGRlbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5FeHBlY3RlZENhbGwKLQotRklMRTojOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKSBpbnZva2VkCi1TdGFjayB0cmFjZToKLQotRklMRTojOiBNb2NrIGZ1bmN0aW9uIGNhbGwgbWF0Y2hlcyBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKS4uLgotICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMCwgMCkKLSAgICAgICAgICBSZXR1cm5zOiBmYWxzZQotU3RhY2sgdHJhY2U6Ci1bICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LkV4cGVjdGVkQ2FsbAotWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5FeHBlY3RlZENhbGxUb1ZvaWRGdW5jdGlvbgotCi1GSUxFOiM6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjMoMCwgXykpIGludm9rZWQKLVN0YWNrIHRyYWNlOgotCi1GSUxFOiM6IE1vY2sgZnVuY3Rpb24gY2FsbCBtYXRjaGVzIEVYUEVDVF9DQUxMKGZvb18sIEJhcjMoMCwgXykpLi4uCi0gICAgRnVuY3Rpb24gY2FsbDogQmFyMygwLCAwKQotU3RhY2sgdHJhY2U6Ci1bICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LkV4cGVjdGVkQ2FsbFRvVm9pZEZ1bmN0aW9uCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LkV4cGxpY2l0QWN0aW9uc1J1bk91dAotCi1HTU9DSyBXQVJOSU5HOgotRklMRTojOiBUb28gZmV3IGFjdGlvbnMgc3BlY2lmaWVkIGluIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoXywgXykpLi4uCi1FeHBlY3RlZCB0byBiZSBjYWxsZWQgdHdpY2UsIGJ1dCBoYXMgb25seSAxIFdpbGxPbmNlKCkuCi1HTU9DSyBXQVJOSU5HOgotRklMRTojOiBBY3Rpb25zIHJhbiBvdXQgaW4gRVhQRUNUX0NBTEwoZm9vXywgQmFyMihfLCBfKSkuLi4KLUNhbGxlZCAyIHRpbWVzLCBidXQgb25seSAxIFdpbGxPbmNlKCkgaXMgc3BlY2lmaWVkIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCi1TdGFjayB0cmFjZToKLVsgICAgICAgT0sgXSBHTW9ja091dHB1dFRlc3QuRXhwbGljaXRBY3Rpb25zUnVuT3V0Ci1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuZXhwZWN0ZWRDYWxsCi11bmtub3duIGZpbGU6IEZhaWx1cmUKLQotVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDEsIDApCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLUdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgMSBleHBlY3RhdGlvbiwgYnV0IGl0IGRpZG4ndCBtYXRjaDoKLQotRklMRTojOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKS4uLgotICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDAKLSAgICAgICAgICAgQWN0dWFsOiAxCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuZXhwZWN0ZWRDYWxsCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuZXhwZWN0ZWRDYWxsVG9Wb2lkRnVuY3Rpb24KLXVua25vd24gZmlsZTogRmFpbHVyZQotCi1VbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkaXJlY3RseS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIzKDEsIDApCi1Hb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Ci0KLUZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMygwLCBfKSkuLi4KLSAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAwCi0gICAgICAgICAgIEFjdHVhbDogMQotICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbFRvVm9pZEZ1bmN0aW9uCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGwKLUZJTEU6IzogRmFpbHVyZQotTW9jayBmdW5jdGlvbiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCi0gICAgRnVuY3Rpb24gY2FsbDogQmFyMigwLCAxKQotICAgICAgICAgIFJldHVybnM6IGZhbHNlCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgdHdpY2UgLSBvdmVyLXNhdHVyYXRlZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGwKLVsgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuRXhjZXNzaXZlQ2FsbFRvVm9pZEZ1bmN0aW9uCi1GSUxFOiM6IEZhaWx1cmUKLU1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtIHJldHVybmluZyBkaXJlY3RseS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIzKDAsIDEpCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgdHdpY2UgLSBvdmVyLXNhdHVyYXRlZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGxUb1ZvaWRGdW5jdGlvbgotWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbmludGVyZXN0aW5nQ2FsbAotCi1HTU9DSyBXQVJOSU5HOgotVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDAsIDEpCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLU5PVEU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgYWJvdmUgd2FybmluZyB1bmxlc3MgdGhpcyBjYWxsIHNob3VsZCBub3QgaGFwcGVuLiAgRG8gbm90IHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nIGFuIEVYUEVDVF9DQUxMKCkgaWYgeW91IGRvbid0IG1lYW4gdG8gZW5mb3JjZSB0aGUgY2FsbC4gIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI0tub3dpbmdfV2hlbl90b19FeHBlY3QgZm9yIGRldGFpbHMuCi1bICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LlVuaW50ZXJlc3RpbmdDYWxsCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuaW50ZXJlc3RpbmdDYWxsVG9Wb2lkRnVuY3Rpb24KLQotR01PQ0sgV0FSTklORzoKLVVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRpcmVjdGx5LgotICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjMoMCwgMSkKLU5PVEU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgYWJvdmUgd2FybmluZyB1bmxlc3MgdGhpcyBjYWxsIHNob3VsZCBub3QgaGFwcGVuLiAgRG8gbm90IHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nIGFuIEVYUEVDVF9DQUxMKCkgaWYgeW91IGRvbid0IG1lYW4gdG8gZW5mb3JjZSB0aGUgY2FsbC4gIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI0tub3dpbmdfV2hlbl90b19FeHBlY3QgZm9yIGRldGFpbHMuCi1bICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LlVuaW50ZXJlc3RpbmdDYWxsVG9Wb2lkRnVuY3Rpb24KLVsgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuUmV0aXJlZEV4cGVjdGF0aW9uCi11bmtub3duIGZpbGU6IEZhaWx1cmUKLQotVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDEsIDEpCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLUdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgMiBleHBlY3RhdGlvbnMsIGJ1dCBub25lIG1hdGNoZWQ6Ci0KLUZJTEU6IzogdHJpZWQgZXhwZWN0YXRpb24gIzA6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoXywgXykpLi4uCi0gICAgICAgICBFeHBlY3RlZDogdGhlIGV4cGVjdGF0aW9uIGlzIGFjdGl2ZQotICAgICAgICAgICBBY3R1YWw6IGl0IGlzIHJldGlyZWQKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCBvbmNlIC0gc2F0dXJhdGVkIGFuZCByZXRpcmVkCi1GSUxFOiM6IHRyaWVkIGV4cGVjdGF0aW9uICMxOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIDApKS4uLgotICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDAKLSAgICAgICAgICAgQWN0dWFsOiAxCi0gIEV4cGVjdGVkIGFyZyAjMTogaXMgZXF1YWwgdG8gMAotICAgICAgICAgICBBY3R1YWw6IDEKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuUmV0aXJlZEV4cGVjdGF0aW9uCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlCi11bmtub3duIGZpbGU6IEZhaWx1cmUKLQotVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDEsIDApCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLUdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgMiBleHBlY3RhdGlvbnMsIGJ1dCBub25lIG1hdGNoZWQ6Ci0KLUZJTEU6IzogdHJpZWQgZXhwZWN0YXRpb24gIzA6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMCwgMCkpLi4uCi0gIEV4cGVjdGVkIGFyZyAjMDogaXMgZXF1YWwgdG8gMAotICAgICAgICAgICBBY3R1YWw6IDEKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKLUZJTEU6IzogdHJpZWQgZXhwZWN0YXRpb24gIzE6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMSwgXykpLi4uCi0gICAgICAgICBFeHBlY3RlZDogYWxsIHByZS1yZXF1aXNpdGVzIGFyZSBzYXRpc2ZpZWQKLSAgICAgICAgICAgQWN0dWFsOiB0aGUgZm9sbG93aW5nIGltbWVkaWF0ZSBwcmUtcmVxdWlzaXRlcyBhcmUgbm90IHNhdGlzZmllZDoKLUZJTEU6IzogcHJlLXJlcXVpc2l0ZSAjMAotICAgICAgICAgICAgICAgICAgIChlbmQgb2YgcHJlLXJlcXVpc2l0ZXMpCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcwotdW5rbm93biBmaWxlOiBGYWlsdXJlCi0KLVVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCi0gICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAwKQotICAgICAgICAgIFJldHVybnM6IGZhbHNlCi1Hb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDIgZXhwZWN0YXRpb25zLCBidXQgbm9uZSBtYXRjaGVkOgotCi1GSUxFOiM6IHRyaWVkIGV4cGVjdGF0aW9uICMwOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIDApKS4uLgotICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDAKLSAgICAgICAgICAgQWN0dWFsOiAxCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi1GSUxFOiM6IHRyaWVkIGV4cGVjdGF0aW9uICMxOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDEsIF8pKS4uLgotICAgICAgICAgRXhwZWN0ZWQ6IGFsbCBwcmUtcmVxdWlzaXRlcyBhcmUgc2F0aXNmaWVkCi0gICAgICAgICAgIEFjdHVhbDogdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgYXJlIG5vdCBzYXRpc2ZpZWQ6Ci1GSUxFOiM6IHByZS1yZXF1aXNpdGUgIzAKLUZJTEU6IzogcHJlLXJlcXVpc2l0ZSAjMQotICAgICAgICAgICAgICAgICAgIChlbmQgb2YgcHJlLXJlcXVpc2l0ZXMpCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcwotWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFdpdGgKLUZJTEU6IzogRmFpbHVyZQotQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKS4uLgotICAgIEV4cGVjdGVkIGFyZ3M6IGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0ID49IHRoZSBzZWNvbmQKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5zYXRpc2ZpZWRXaXRoCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkRXhwZWN0YXRpb24KLUZJTEU6IzogRmFpbHVyZQotQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKS4uLgotICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCB0d2ljZQotICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCBvbmNlIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQotRklMRTojOiBGYWlsdXJlCi1BY3R1YWwgZnVuY3Rpb24gY2FsbCBjb3VudCBkb2Vzbid0IG1hdGNoIEVYUEVDVF9DQUxMKGZvb18sIEJhcihfLCBfLCBfKSkuLi4KLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5zYXRpc2ZpZWRFeHBlY3RhdGlvbgotWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5NaXNtYXRjaEFyZ3VtZW50cwotdW5rbm93biBmaWxlOiBGYWlsdXJlCi0KLVVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCi0gICAgRnVuY3Rpb24gY2FsbDogQmFyKEAweCMgIkhvIiwgMCwgLTAuMSkKLSAgICAgICAgICBSZXR1cm5zOiAnXDAnCi1Hb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Ci0KLUZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyKFJlZihzKSwgXywgR2UoMCkpKS4uLgotICBFeHBlY3RlZCBhcmcgIzA6IHJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlIEAweCMgIkhpIgotICAgICAgICAgICBBY3R1YWw6ICJIbyIsIHdoaWNoIGlzIGxvY2F0ZWQgQDB4IwotICBFeHBlY3RlZCBhcmcgIzI6IGlzID49IDAKLSAgICAgICAgICAgQWN0dWFsOiAtMC4xCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoQXJndW1lbnRzCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoV2l0aAotdW5rbm93biBmaWxlOiBGYWlsdXJlCi0KLVVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCi0gICAgRnVuY3Rpb24gY2FsbDogQmFyMigyLCAzKQotICAgICAgICAgIFJldHVybnM6IGZhbHNlCi1Hb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Ci0KLUZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMihHZSgyKSwgR2UoMSkpKS4uLgotICAgIEV4cGVjdGVkIGFyZ3M6IGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0ID49IHRoZSBzZWNvbmQKLSAgICAgICAgICAgQWN0dWFsOiBkb24ndCBtYXRjaAotICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5NaXNtYXRjaFdpdGgKLVsgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuTWlzbWF0Y2hBcmd1bWVudHNBbmRXaXRoCi11bmtub3duIGZpbGU6IEZhaWx1cmUKLQotVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS4KLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDEsIDMpCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLUdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgMSBleHBlY3RhdGlvbiwgYnV0IGl0IGRpZG4ndCBtYXRjaDoKLQotRklMRTojOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKEdlKDIpLCBHZSgxKSkpLi4uCi0gIEV4cGVjdGVkIGFyZyAjMDogaXMgPj0gMgotICAgICAgICAgICBBY3R1YWw6IDEKLSAgICBFeHBlY3RlZCBhcmdzOiBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kCi0gICAgICAgICAgIEFjdHVhbDogZG9uJ3QgbWF0Y2gKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuTWlzbWF0Y2hBcmd1bWVudHNBbmRXaXRoCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuZXhwZWN0ZWRDYWxsV2l0aERlZmF1bHRBY3Rpb24KLXVua25vd24gZmlsZTogRmFpbHVyZQotCi1VbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6Ci1GSUxFOiM6Ci0gICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAwKQotICAgICAgICAgIFJldHVybnM6IGZhbHNlCi1Hb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Ci0KLUZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigyLCAyKSkuLi4KLSAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAyCi0gICAgICAgICAgIEFjdHVhbDogMQotICBFeHBlY3RlZCBhcmcgIzE6IGlzIGVxdWFsIHRvIDIKLSAgICAgICAgICAgQWN0dWFsOiAwCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi11bmtub3duIGZpbGU6IEZhaWx1cmUKLQotVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSB0YWtpbmcgZGVmYXVsdCBhY3Rpb24gc3BlY2lmaWVkIGF0OgotRklMRTojOgotICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMCwgMCkKLSAgICAgICAgICBSZXR1cm5zOiB0cnVlCi1Hb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6Ci0KLUZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigyLCAyKSkuLi4KLSAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAyCi0gICAgICAgICAgIEFjdHVhbDogMAotICBFeHBlY3RlZCBhcmcgIzE6IGlzIGVxdWFsIHRvIDIKLSAgICAgICAgICAgQWN0dWFsOiAwCi0gICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuZXhwZWN0ZWRDYWxsV2l0aERlZmF1bHRBY3Rpb24KLVsgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuRXhjZXNzaXZlQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCi1GSUxFOiM6IEZhaWx1cmUKLU1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtIHRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6Ci1GSUxFOiM6Ci0gICAgRnVuY3Rpb24gY2FsbDogQmFyMigyLCAyKQotICAgICAgICAgIFJldHVybnM6IHRydWUKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCB0d2ljZSAtIG92ZXItc2F0dXJhdGVkIGFuZCBhY3RpdmUKLUZJTEU6IzogRmFpbHVyZQotTW9jayBmdW5jdGlvbiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIC0gdGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDoKLUZJTEU6IzoKLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDEsIDEpCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLSAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQotICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCB0d2ljZSAtIG92ZXItc2F0dXJhdGVkIGFuZCBhY3RpdmUKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuRXhjZXNzaXZlQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCi1bIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlVuaW50ZXJlc3RpbmdDYWxsV2l0aERlZmF1bHRBY3Rpb24KLQotR01PQ0sgV0FSTklORzoKLVVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gdGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDoKLUZJTEU6IzoKLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDIsIDIpCi0gICAgICAgICAgUmV0dXJuczogdHJ1ZQotTk9URTogWW91IGNhbiBzYWZlbHkgaWdub3JlIHRoZSBhYm92ZSB3YXJuaW5nIHVubGVzcyB0aGlzIGNhbGwgc2hvdWxkIG5vdCBoYXBwZW4uICBEbyBub3Qgc3VwcHJlc3MgaXQgYnkgYmxpbmRseSBhZGRpbmcgYW4gRVhQRUNUX0NBTEwoKSBpZiB5b3UgZG9uJ3QgbWVhbiB0byBlbmZvcmNlIHRoZSBjYWxsLiAgU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjS25vd2luZ19XaGVuX3RvX0V4cGVjdCBmb3IgZGV0YWlscy4KLQotR01PQ0sgV0FSTklORzoKLVVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gdGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDoKLUZJTEU6IzoKLSAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDEsIDEpCi0gICAgICAgICAgUmV0dXJuczogZmFsc2UKLU5PVEU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgYWJvdmUgd2FybmluZyB1bmxlc3MgdGhpcyBjYWxsIHNob3VsZCBub3QgaGFwcGVuLiAgRG8gbm90IHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nIGFuIEVYUEVDVF9DQUxMKCkgaWYgeW91IGRvbid0IG1lYW4gdG8gZW5mb3JjZSB0aGUgY2FsbC4gIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI0tub3dpbmdfV2hlbl90b19FeHBlY3QgZm9yIGRldGFpbHMuCi1bICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LlVuaW50ZXJlc3RpbmdDYWxsV2l0aERlZmF1bHRBY3Rpb24KLVsgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuRXhwbGljaXRBY3Rpb25zUnVuT3V0V2l0aERlZmF1bHRBY3Rpb24KLQotR01PQ0sgV0FSTklORzoKLUZJTEU6IzogVG9vIGZldyBhY3Rpb25zIHNwZWNpZmllZCBpbiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKS4uLgotRXhwZWN0ZWQgdG8gYmUgY2FsbGVkIHR3aWNlLCBidXQgaGFzIG9ubHkgMSBXaWxsT25jZSgpLgotR01PQ0sgV0FSTklORzoKLUZJTEU6IzogQWN0aW9ucyByYW4gb3V0IGluIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoXywgXykpLi4uCi1DYWxsZWQgMiB0aW1lcywgYnV0IG9ubHkgMSBXaWxsT25jZSgpIGlzIHNwZWNpZmllZCAtIHRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6Ci1GSUxFOiM6Ci1TdGFjayB0cmFjZToKLVsgICAgICAgT0sgXSBHTW9ja091dHB1dFRlc3QuRXhwbGljaXRBY3Rpb25zUnVuT3V0V2l0aERlZmF1bHRBY3Rpb24KLVsgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuQ2F0Y2hlc0xlYWtlZE1vY2tzCi1bICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LkNhdGNoZXNMZWFrZWRNb2NrcwotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbAotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbFRvVm9pZEZ1bmN0aW9uCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGwKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuRXhjZXNzaXZlQ2FsbFRvVm9pZEZ1bmN0aW9uCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlJldGlyZWRFeHBlY3RhdGlvbgotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFByZXJlcXVpc2l0ZQotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5zYXRpc2ZpZWRXaXRoCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkRXhwZWN0YXRpb24KLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuTWlzbWF0Y2hBcmd1bWVudHMKLVsgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuTWlzbWF0Y2hXaXRoCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoQXJndW1lbnRzQW5kV2l0aAotWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCi1bICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGxXaXRoRGVmYXVsdEFjdGlvbgotCi0KLUZJTEU6IzogRVJST1I6IHRoaXMgbW9jayBvYmplY3Qgc2hvdWxkIGJlIGRlbGV0ZWQgYnV0IG5ldmVyIGlzLiBJdHMgYWRkcmVzcyBpcyBAMHgjLgotRklMRTojOiBFUlJPUjogdGhpcyBtb2NrIG9iamVjdCBzaG91bGQgYmUgZGVsZXRlZCBidXQgbmV2ZXIgaXMuIEl0cyBhZGRyZXNzIGlzIEAweCMuCi1GSUxFOiM6IEVSUk9SOiB0aGlzIG1vY2sgb2JqZWN0IHNob3VsZCBiZSBkZWxldGVkIGJ1dCBuZXZlciBpcy4gSXRzIGFkZHJlc3MgaXMgQDB4Iy4KLUVSUk9SOiAzIGxlYWtlZCBtb2NrIG9iamVjdHMgZm91bmQgYXQgcHJvZ3JhbSBleGl0LgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX3N0cmVzc190ZXN0LmNjIGIvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX3N0cmVzc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk3YWVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ21vY2svdGVzdC9nbW9ja19zdHJlc3NfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIGNvbnN0cnVjdHMgY2FuIGJlIHVzZWQgaW4gYSBsYXJnZSBudW1iZXIgb2YKLS8vIHRocmVhZHMgY29uY3VycmVudGx5LgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgewotCi0vLyBGcm9tIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+LgotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGhyZWFkV2l0aFBhcmFtOwotCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCB0aHJlYWRzIChub3QgaW5jbHVkaW5nIGhlbHBlciB0aHJlYWRzKQotLy8gdG8gY3JlYXRlLgotY29uc3QgaW50IGtNYXhUZXN0VGhyZWFkcyA9IDUwOwotCi0vLyBIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgYSB0YXNrIGluIGEgdGVzdCB0aHJlYWQuCi1jb25zdCBpbnQga1JlcGVhdCA9IDUwOwotCi1jbGFzcyBNb2NrRm9vIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMShCYXIsIGludChpbnQgbikpOyAgLy8gTk9MSU5UCi0gIE1PQ0tfTUVUSE9EMihCYXosIGNoYXIoY29uc3QgY2hhciogczEsIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMyKSk7ICAvLyBOT0xJTlQKLX07Ci0KLS8vIEhlbHBlciBmb3Igd2FpdGluZyBmb3IgdGhlIGdpdmVuIHRocmVhZCB0byBmaW5pc2ggYW5kIHRoZW4gZGVsZXRpbmcgaXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgSm9pbkFuZERlbGV0ZShUaHJlYWRXaXRoUGFyYW08VD4qIHQpIHsKLSAgdC0+Sm9pbigpOwotICBkZWxldGUgdDsKLX0KLQotdXNpbmcgaW50ZXJuYWw6OmxpbmtlZF9wdHI7Ci0KLS8vIEhlbHBlciBjbGFzc2VzIGZvciB0ZXN0aW5nIHVzaW5nIGxpbmtlZF9wdHIgY29uY3VycmVudGx5LgotCi1jbGFzcyBCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJhc2UoaW50IGFfeCkgOiB4XyhhX3gpIHt9Ci0gIHZpcnR1YWwgfkJhc2UoKSB7fQotICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9Ci0gcHJpdmF0ZToKLSAgaW50IHhfOwotfTsKLQotY2xhc3MgRGVyaXZlZDEgOiBwdWJsaWMgQmFzZSB7Ci0gcHVibGljOgotICBEZXJpdmVkMShpbnQgYV94LCBpbnQgYV95KSA6IEJhc2UoYV94KSwgeV8oYV95KSB7fQotICBpbnQgeSgpIGNvbnN0IHsgcmV0dXJuIHlfOyB9Ci0gcHJpdmF0ZToKLSAgaW50IHlfOwotfTsKLQotY2xhc3MgRGVyaXZlZDIgOiBwdWJsaWMgQmFzZSB7Ci0gcHVibGljOgotICBEZXJpdmVkMihpbnQgYV94LCBpbnQgYV96KSA6IEJhc2UoYV94KSwgel8oYV96KSB7fQotICBpbnQgeigpIGNvbnN0IHsgcmV0dXJuIHpfOyB9Ci0gcHJpdmF0ZToKLSAgaW50IHpfOwotfTsKLQotbGlua2VkX3B0cjxEZXJpdmVkMT4gcG9pbnRlcjEobmV3IERlcml2ZWQxKDEsIDIpKTsKLWxpbmtlZF9wdHI8RGVyaXZlZDI+IHBvaW50ZXIyKG5ldyBEZXJpdmVkMigzLCA0KSk7Ci0KLXN0cnVjdCBEdW1teSB7fTsKLQotLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY29weSBmcm9tIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdCBjb25jdXJyZW50bHkuCi12b2lkIFRlc3RDb25jdXJyZW50Q29weUFuZFJlYWRMaW5rZWRQdHIoRHVtbXkgLyogZHVtbXkgKi8pIHsKLSAgLy8gUmVhZHMgcG9pbnRlcjEgYW5kIHBvaW50ZXIyIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGNvcGllZCBmcm9tIGluCi0gIC8vIGFub3RoZXIgdGhyZWFkLgotICBFWFBFQ1RfRVEoMSwgcG9pbnRlcjEtPngoKSk7Ci0gIEVYUEVDVF9FUSgyLCBwb2ludGVyMS0+eSgpKTsKLSAgRVhQRUNUX0VRKDMsIHBvaW50ZXIyLT54KCkpOwotICBFWFBFQ1RfRVEoNCwgcG9pbnRlcjItPnooKSk7Ci0KLSAgLy8gQ29waWVzIGZyb20gcG9pbnRlcjEuCi0gIGxpbmtlZF9wdHI8RGVyaXZlZDE+IHAxKHBvaW50ZXIxKTsKLSAgRVhQRUNUX0VRKDEsIHAxLT54KCkpOwotICBFWFBFQ1RfRVEoMiwgcDEtPnkoKSk7Ci0KLSAgLy8gQXNzaWducyBmcm9tIHBvaW50ZXIyIHdoZXJlIHRoZSBMSFMgd2FzIGVtcHR5LgotICBsaW5rZWRfcHRyPEJhc2U+IHAyOwotICBwMiA9IHBvaW50ZXIxOwotICBFWFBFQ1RfRVEoMSwgcDItPngoKSk7Ci0KLSAgLy8gQXNzaWducyBmcm9tIHBvaW50ZXIyIHdoZXJlIHRoZSBMSFMgd2FzIG5vdCBlbXB0eS4KLSAgcDIgPSBwb2ludGVyMjsKLSAgRVhQRUNUX0VRKDMsIHAyLT54KCkpOwotfQotCi1jb25zdCBsaW5rZWRfcHRyPERlcml2ZWQxPiBwMChuZXcgRGVyaXZlZDEoMSwgMikpOwotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiBjb25jdXJyZW50bHkgbW9kaWZ5IHR3byBsaW5rZWRfcHRycyB0aGF0IHBvaW50IHRvCi0vLyB0aGUgc2FtZSBvYmplY3QuCi12b2lkIFRlc3RDb25jdXJyZW50V3JpdGVUb0VxdWFsTGlua2VkUHRyKER1bW15IC8qIGR1bW15ICovKSB7Ci0gIC8vIHAxIGFuZCBwMiBwb2ludCB0byB0aGUgc2FtZSwgc2hhcmVkIHRoaW5nLiAgT25lIHRocmVhZCByZXNldHMgcDEuCi0gIC8vIEFub3RoZXIgdGhyZWFkIGFzc2lnbnMgdG8gcDIuICBUaGlzIHdpbGwgY2F1c2UgdGhlIHNhbWUKLSAgLy8gdW5kZXJseWluZyAicmluZyIgdG8gYmUgdXBkYXRlZCBjb25jdXJyZW50bHkuCi0gIGxpbmtlZF9wdHI8RGVyaXZlZDE+IHAxKHAwKTsKLSAgbGlua2VkX3B0cjxEZXJpdmVkMT4gcDIocDApOwotCi0gIEVYUEVDVF9FUSgxLCBwMS0+eCgpKTsKLSAgRVhQRUNUX0VRKDIsIHAxLT55KCkpOwotCi0gIEVYUEVDVF9FUSgxLCBwMi0+eCgpKTsKLSAgRVhQRUNUX0VRKDIsIHAyLT55KCkpOwotCi0gIHAxLnJlc2V0KCk7Ci0gIHAyID0gcDA7Ci0KLSAgRVhQRUNUX0VRKDEsIHAyLT54KCkpOwotICBFWFBFQ1RfRVEoMiwgcDItPnkoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgZGlmZmVyZW50IG1vY2sgb2JqZWN0cyBjYW4gYmUgdXNlZCBpbiB0aGVpciByZXNwZWN0aXZlCi0vLyB0aHJlYWRzLiAgVGhpcyBzaG91bGQgZ2VuZXJhdGUgbm8gR29vZ2xlIFRlc3QgZmFpbHVyZS4KLXZvaWQgVGVzdENvbmN1cnJlbnRNb2NrT2JqZWN0cyhEdW1teSAvKiBkdW1teSAqLykgewotICAvLyBDcmVhdGVzIGEgbW9jayBhbmQgZG9lcyBzb21lIHR5cGljYWwgb3BlcmF0aW9ucyBvbiBpdC4KLSAgTW9ja0ZvbyBmb287Ci0gIE9OX0NBTEwoZm9vLCBCYXIoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBPTl9DQUxMKGZvbywgQmF6KF8sIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKCdiJykpOwotICBPTl9DQUxMKGZvbywgQmF6KF8sICJ5b3UiKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybignYScpKTsKLQotICBFWFBFQ1RfQ0FMTChmb28sIEJhcigwKSkKLSAgICAgIC5UaW1lcyhBdE1vc3QoMykpOwotICBFWFBFQ1RfQ0FMTChmb28sIEJheihfLCBfKSk7Ci0gIEVYUEVDVF9DQUxMKGZvbywgQmF6KCJoaSIsICJ5b3UiKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oJ3onKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShEb0RlZmF1bHQoKSk7Ci0KLSAgRVhQRUNUX0VRKDEsIGZvby5CYXIoMCkpOwotICBFWFBFQ1RfRVEoMSwgZm9vLkJhcigwKSk7Ci0gIEVYUEVDVF9FUSgneicsIGZvby5CYXooImhpIiwgInlvdSIpKTsKLSAgRVhQRUNUX0VRKCdhJywgZm9vLkJheigiaGkiLCAieW91IikpOwotICBFWFBFQ1RfRVEoJ2InLCBmb28uQmF6KCJoaSIsICJtZSIpKTsKLX0KLQotLy8gVGVzdHMgaW52b2tpbmcgbWV0aG9kcyBvZiB0aGUgc2FtZSBtb2NrIG9iamVjdCBpbiBtdWx0aXBsZSB0aHJlYWRzLgotCi1zdHJ1Y3QgSGVscGVyMVBhcmFtIHsKLSAgTW9ja0ZvbyogbW9ja19mb287Ci0gIGludCogY291bnQ7Ci19OwotCi12b2lkIEhlbHBlcjEoSGVscGVyMVBhcmFtIHBhcmFtKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga1JlcGVhdDsgaSsrKSB7Ci0gICAgY29uc3QgY2hhciBjaCA9IHBhcmFtLm1vY2tfZm9vLT5CYXooImEiLCAiYiIpOwotICAgIGlmIChjaCA9PSAnYScpIHsKLSAgICAgIC8vIEl0IHdhcyBhbiBleHBlY3RlZCBjYWxsLgotICAgICAgKCpwYXJhbS5jb3VudCkrKzsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSXQgd2FzIGFuIGV4Y2Vzc2l2ZSBjYWxsLgotICAgICAgRVhQRUNUX0VRKCdcMCcsIGNoKTsKLSAgICB9Ci0KLSAgICAvLyBBbiB1bmV4cGVjdGVkIGNhbGwuCi0gICAgRVhQRUNUX0VRKCdcMCcsIHBhcmFtLm1vY2tfZm9vLT5CYXooIngiLCAieSIpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOwotCi0gICAgLy8gQW4gdW5pbnRlcmVzdGluZyBjYWxsLgotICAgIEVYUEVDVF9FUSgxLCBwYXJhbS5tb2NrX2Zvby0+QmFyKDUpKTsKLSAgfQotfQotCi0vLyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAzKmtSZXBlYXQgKyAxIGZhaWx1cmVzIGluIHRvdGFsLgotdm9pZCBUZXN0Q29uY3VycmVudENhbGxzT25TYW1lT2JqZWN0KER1bW15IC8qIGR1bW15ICovKSB7Ci0gIE1vY2tGb28gZm9vOwotCi0gIE9OX0NBTEwoZm9vLCBCYXIoXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOwotICBFWFBFQ1RfQ0FMTChmb28sIEJheihfLCAiYiIpKQotICAgICAgLlRpbWVzKGtSZXBlYXQpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCdhJykpOwotICBFWFBFQ1RfQ0FMTChmb28sIEJheihfLCAiYyIpKTsgIC8vIEV4cGVjdGVkIHRvIGJlIHVuc2F0aXNmaWVkLgotCi0gIC8vIFRoaXMgY2h1bmsgb2YgY29kZSBzaG91bGQgZ2VuZXJhdGUga1JlcGVhdCBmYWlsdXJlcyBhYm91dAotICAvLyBleGNlc3NpdmUgY2FsbHMsIGFuZCAyKmtSZXBlYXQgZmFpbHVyZXMgYWJvdXQgdW5leHBlY3RlZCBjYWxscy4KLSAgaW50IGNvdW50MSA9IDA7Ci0gIGNvbnN0IEhlbHBlcjFQYXJhbSBwYXJhbSA9IHsgJmZvbywgJmNvdW50MSB9OwotICBUaHJlYWRXaXRoUGFyYW08SGVscGVyMVBhcmFtPiogY29uc3QgdCA9Ci0gICAgICBuZXcgVGhyZWFkV2l0aFBhcmFtPEhlbHBlcjFQYXJhbT4oSGVscGVyMSwgcGFyYW0sIE5VTEwpOwotCi0gIGludCBjb3VudDIgPSAwOwotICBjb25zdCBIZWxwZXIxUGFyYW0gcGFyYW0yID0geyAmZm9vLCAmY291bnQyIH07Ci0gIEhlbHBlcjEocGFyYW0yKTsKLSAgSm9pbkFuZERlbGV0ZSh0KTsKLQotICBFWFBFQ1RfRVEoa1JlcGVhdCwgY291bnQxICsgY291bnQyKTsKLQotICAvLyBmb28ncyBkZXN0cnVjdG9yIHNob3VsZCBnZW5lcmF0ZSBvbmUgZmFpbHVyZSBhYm91dCB1bnNhdGlzZmllZAotICAvLyBleHBlY3RhdGlvbi4KLX0KLQotLy8gVGVzdHMgdXNpbmcgdGhlIHNhbWUgbW9jayBvYmplY3QgaW4gbXVsdGlwbGUgdGhyZWFkcyB3aGVuIHRoZQotLy8gZXhwZWN0YXRpb25zIGFyZSBwYXJ0aWFsbHkgb3JkZXJlZC4KLQotdm9pZCBIZWxwZXIyKE1vY2tGb28qIGZvbykgewotICBmb3IgKGludCBpID0gMDsgaSA8IGtSZXBlYXQ7IGkrKykgewotICAgIGZvby0+QmFyKDIpOwotICAgIGZvby0+QmFyKDMpOwotICB9Ci19Ci0KLS8vIFRoaXMgc2hvdWxkIGdlbmVyYXRlIG5vIEdvb2dsZSBUZXN0IGZhaWx1cmVzLgotdm9pZCBUZXN0UGFydGlhbGx5T3JkZXJlZEV4cGVjdGF0aW9uc1dpdGhUaHJlYWRzKER1bW15IC8qIGR1bW15ICovKSB7Ci0gIE1vY2tGb28gZm9vOwotICBTZXF1ZW5jZSBzMSwgczI7Ci0KLSAgewotICAgIEluU2VxdWVuY2UgZHVtbXk7Ci0gICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMCkpOwotICAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKDEpKQotICAgICAgICAuSW5TZXF1ZW5jZShzMSwgczIpOwotICB9Ci0KLSAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMikpCi0gICAgICAuVGltZXMoMiprUmVwZWF0KQotICAgICAgLkluU2VxdWVuY2UoczEpCi0gICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICBFWFBFQ1RfQ0FMTChmb28sIEJhcigzKSkKLSAgICAgIC5UaW1lcygyKmtSZXBlYXQpCi0gICAgICAuSW5TZXF1ZW5jZShzMik7Ci0KLSAgewotICAgIEluU2VxdWVuY2UgZHVtbXk7Ci0gICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMikpCi0gICAgICAgIC5JblNlcXVlbmNlKHMxLCBzMik7Ci0gICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoNCkpOwotICB9Ci0KLSAgZm9vLkJhcigwKTsKLSAgZm9vLkJhcigxKTsKLQotICBUaHJlYWRXaXRoUGFyYW08TW9ja0Zvbyo+KiBjb25zdCB0ID0KLSAgICAgIG5ldyBUaHJlYWRXaXRoUGFyYW08TW9ja0Zvbyo+KEhlbHBlcjIsICZmb28sIE5VTEwpOwotICBIZWxwZXIyKCZmb28pOwotICBKb2luQW5kRGVsZXRlKHQpOwotCi0gIGZvby5CYXIoMik7Ci0gIGZvby5CYXIoNCk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIEdvb2dsZSBNb2NrIGNvbnN0cnVjdHMgaW4gbWFueSB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLVRFU1QoU3RyZXNzVGVzdCwgQ2FuVXNlR01vY2tXaXRoVGhyZWFkcykgewotICB2b2lkICgqdGVzdF9yb3V0aW5lc1tdKShEdW1teSBkdW1teSkgPSB7Ci0gICAgJlRlc3RDb25jdXJyZW50Q29weUFuZFJlYWRMaW5rZWRQdHIsCi0gICAgJlRlc3RDb25jdXJyZW50V3JpdGVUb0VxdWFsTGlua2VkUHRyLAotICAgICZUZXN0Q29uY3VycmVudE1vY2tPYmplY3RzLAotICAgICZUZXN0Q29uY3VycmVudENhbGxzT25TYW1lT2JqZWN0LAotICAgICZUZXN0UGFydGlhbGx5T3JkZXJlZEV4cGVjdGF0aW9uc1dpdGhUaHJlYWRzLAotICB9OwotCi0gIGNvbnN0IGludCBrUm91dGluZXMgPSBzaXplb2YodGVzdF9yb3V0aW5lcykvc2l6ZW9mKHRlc3Rfcm91dGluZXNbMF0pOwotICBjb25zdCBpbnQga0NvcGllc09mRWFjaFJvdXRpbmUgPSBrTWF4VGVzdFRocmVhZHMgLyBrUm91dGluZXM7Ci0gIGNvbnN0IGludCBrVGVzdFRocmVhZHMgPSBrQ29waWVzT2ZFYWNoUm91dGluZSAqIGtSb3V0aW5lczsKLSAgVGhyZWFkV2l0aFBhcmFtPER1bW15PiogdGhyZWFkc1trVGVzdFRocmVhZHNdID0ge307Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RUaHJlYWRzOyBpKyspIHsKLSAgICAvLyBDcmVhdGVzIGEgdGhyZWFkIHRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbi4KLSAgICB0aHJlYWRzW2ldID0KLSAgICAgICAgbmV3IFRocmVhZFdpdGhQYXJhbTxEdW1teT4odGVzdF9yb3V0aW5lc1tpICUga1JvdXRpbmVzXSwgRHVtbXkoKSwgTlVMTCk7Ci0gICAgR1RFU1RfTE9HXyhJTkZPKSA8PCAiVGhyZWFkICMiIDw8IGkgPDwgIiBydW5uaW5nIC4gLiAuIjsKLSAgfQotCi0gIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbWFueSB0aHJlYWRzIHJ1bm5pbmcuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RUaHJlYWRzOyBpKyspIHsKLSAgICBKb2luQW5kRGVsZXRlKHRocmVhZHNbaV0pOwotICB9Ci0KLSAgLy8gRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBmYWlsdXJlcyBoYXZlIGJlZW4gcmVwb3J0ZWQuCi0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCA9ICppbmZvLT5yZXN1bHQoKTsKLSAgY29uc3QgaW50IGtFeHBlY3RlZEZhaWx1cmVzID0gKDMqa1JlcGVhdCArIDEpKmtDb3BpZXNPZkVhY2hSb3V0aW5lOwotICBHVEVTVF9DSEVDS18oa0V4cGVjdGVkRmFpbHVyZXMgPT0gcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKSkKLSAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IGtFeHBlY3RlZEZhaWx1cmVzIDw8ICIgZmFpbHVyZXMsIGJ1dCBnb3QgIgotICAgICAgPDwgcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgdGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOwotCi0gIGNvbnN0IGludCBleGl0X2NvZGUgPSBSVU5fQUxMX1RFU1RTKCk7ICAvLyBFeHBlY3RlZCB0byBmYWlsLgotICBHVEVTVF9DSEVDS18oZXhpdF9jb2RlICE9IDApIDw8ICJSVU5fQUxMX1RFU1RTKCkgZGlkIG5vdCBmYWlsIGFzIGV4cGVjdGVkIjsKLQotICBwcmludGYoIlxuUEFTU1xuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX3Rlc3QuY2MgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ZTIyYy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIHRlc3RzIGNvZGUgaW4gZ21vY2suY2MuCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgiCi0KLSNpZiAhZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi0KLXVzaW5nIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSk7Ci11c2luZyB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jazsKLQotLy8gVmVyaWZpZXMgdGhhdCBjYWxsaW5nIEluaXRHb29nbGVNb2NrKCkgb24gYXJndiByZXN1bHRzIGluIG5ld19hcmd2LAotLy8gYW5kIHRoZSBnbW9ja192ZXJib3NlIGZsYWcncyB2YWx1ZSBpcyBzZXQgdG8gZXhwZWN0ZWRfZ21vY2tfdmVyYm9zZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCBpbnQgTSwgaW50IE4+Ci12b2lkIFRlc3RJbml0R29vZ2xlTW9jayhjb25zdCBDaGFyKiAoJmFyZ3YpW01dLCBjb25zdCBDaGFyKiAoJm5ld19hcmd2KVtOXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGV4cGVjdGVkX2dtb2NrX3ZlcmJvc2UpIHsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyBvbGRfdmVyYm9zZSA9IEdNT0NLX0ZMQUcodmVyYm9zZSk7Ci0KLSAgaW50IGFyZ2MgPSBNOwotICBJbml0R29vZ2xlTW9jaygmYXJnYywgY29uc3RfY2FzdDxDaGFyKio+KGFyZ3YpKTsKLSAgQVNTRVJUX0VRKE4sIGFyZ2MpIDw8ICJUaGUgbmV3IGFyZ3YgaGFzIHdyb25nIG51bWJlciBvZiBlbGVtZW50cy4iOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgRVhQRUNUX1NUUkVRKG5ld19hcmd2W2ldLCBhcmd2W2ldKTsKLSAgfQotCi0gIEVYUEVDVF9FUShleHBlY3RlZF9nbW9ja192ZXJib3NlLCBHTU9DS19GTEFHKHZlcmJvc2UpLmNfc3RyKCkpOwotICBHTU9DS19GTEFHKHZlcmJvc2UpID0gb2xkX3ZlcmJvc2U7ICAvLyBSZXN0b3JlcyB0aGUgZ21vY2tfdmVyYm9zZSBmbGFnLgotfQotCi1URVNUKEluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzSW52YWxpZENvbW1hbmRMaW5lKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogbmV3X2FyZ3ZbXSA9IHsKLSAgICBOVUxMCi0gIH07Ci0KLSAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCBHTU9DS19GTEFHKHZlcmJvc2UpKTsKLX0KLQotVEVTVChJbml0R29vZ2xlTW9ja1Rlc3QsIFBhcnNlc0VtcHR5Q29tbWFuZExpbmUpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogbmV3X2FyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgR01PQ0tfRkxBRyh2ZXJib3NlKSk7Ci19Ci0KLVRFU1QoSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNTaW5nbGVGbGFnKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ21vY2tfdmVyYm9zZT1pbmZvIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogbmV3X2FyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgImluZm8iKTsKLX0KLQotVEVTVChJbml0R29vZ2xlTW9ja1Rlc3QsIFBhcnNlc1VucmVjb2duaXplZEZsYWcpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogbmV3X2FyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tbm9uX2dtb2NrX2ZsYWc9YmxhaCIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgR01PQ0tfRkxBRyh2ZXJib3NlKSk7Ci19Ci0KLVRFU1QoSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNHb29nbGVNb2NrRmxhZ0FuZFVucmVjb2duaXplZEZsYWcpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKLSAgICAiLS1nbW9ja192ZXJib3NlPWVycm9yIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogbmV3X2FyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tbm9uX2dtb2NrX2ZsYWc9YmxhaCIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgImVycm9yIik7Ci19Ci0KLVRFU1QoV2lkZUluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzSW52YWxpZENvbW1hbmRMaW5lKSB7Ci0gIGNvbnN0IHdjaGFyX3QqIGFyZ3ZbXSA9IHsKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3Qgd2NoYXJfdCogbmV3X2FyZ3ZbXSA9IHsKLSAgICBOVUxMCi0gIH07Ci0KLSAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCBHTU9DS19GTEFHKHZlcmJvc2UpKTsKLX0KLQotVEVTVChXaWRlSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNFbXB0eUNvbW1hbmRMaW5lKSB7Ci0gIGNvbnN0IHdjaGFyX3QqIGFyZ3ZbXSA9IHsKLSAgICBMImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCB3Y2hhcl90KiBuZXdfYXJndltdID0gewotICAgIEwiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgR01PQ0tfRkxBRyh2ZXJib3NlKSk7Ci19Ci0KLVRFU1QoV2lkZUluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzU2luZ2xlRmxhZykgewotICBjb25zdCB3Y2hhcl90KiBhcmd2W10gPSB7Ci0gICAgTCJmb28uZXhlIiwKLSAgICBMIi0tZ21vY2tfdmVyYm9zZT1pbmZvIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3Qgd2NoYXJfdCogbmV3X2FyZ3ZbXSA9IHsKLSAgICBMImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBUZXN0SW5pdEdvb2dsZU1vY2soYXJndiwgbmV3X2FyZ3YsICJpbmZvIik7Ci19Ci0KLVRFU1QoV2lkZUluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzVW5yZWNvZ25pemVkRmxhZykgewotICBjb25zdCB3Y2hhcl90KiBhcmd2W10gPSB7Ci0gICAgTCJmb28uZXhlIiwKLSAgICBMIi0tbm9uX2dtb2NrX2ZsYWc9YmxhaCIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IHdjaGFyX3QqIG5ld19hcmd2W10gPSB7Ci0gICAgTCJmb28uZXhlIiwKLSAgICBMIi0tbm9uX2dtb2NrX2ZsYWc9YmxhaCIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgR01PQ0tfRkxBRyh2ZXJib3NlKSk7Ci19Ci0KLVRFU1QoV2lkZUluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzR29vZ2xlTW9ja0ZsYWdBbmRVbnJlY29nbml6ZWRGbGFnKSB7Ci0gIGNvbnN0IHdjaGFyX3QqIGFyZ3ZbXSA9IHsKLSAgICBMImZvby5leGUiLAotICAgIEwiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKLSAgICBMIi0tZ21vY2tfdmVyYm9zZT1lcnJvciIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IHdjaGFyX3QqIG5ld19hcmd2W10gPSB7Ci0gICAgTCJmb28uZXhlIiwKLSAgICBMIi0tbm9uX2dtb2NrX2ZsYWc9YmxhaCIsCi0gICAgTlVMTAotICB9OwotCi0gIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgImVycm9yIik7Ci19Ci0KLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQotCi0vLyBNYWtlcyBzdXJlIEdvb2dsZSBNb2NrIGZsYWdzIGNhbiBiZSBhY2Nlc3NlZCBpbiBjb2RlLgotVEVTVChGbGFnVGVzdCwgSXNBY2Nlc3NpYmxlSW5Db2RlKSB7Ci0gIGJvb2wgZHVtbXkgPSB0ZXN0aW5nOjpHTU9DS19GTEFHKGNhdGNoX2xlYWtlZF9tb2NrcykgJiYKLSAgICAgIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSkgPT0gIiI7Ci0gICh2b2lkKWR1bW15OyAgLy8gQXZvaWRzIHRoZSAidW51c2VkIGxvY2FsIHZhcmlhYmxlIiB3YXJuaW5nLgotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9nbW9jay90ZXN0L2dtb2NrX3Rlc3RfdXRpbHMucHkgYi90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfdGVzdF91dGlscy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjBlM2QzZC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2dtb2NrL3Rlc3QvZ21vY2tfdGVzdF91dGlscy5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJVbml0IHRlc3QgdXRpbGl0aWVzIGZvciBHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrLiIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotCi0jIERldGVybWluZXMgcGF0aCB0byBndGVzdF90ZXN0X3V0aWxzIGFuZCBpbXBvcnRzIGl0LgotU0NSSVBUX0RJUiA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3IgJy4nCi0KLSMgaXNkaXIgcmVzb2x2ZXMgc3ltYm9saWMgbGlua3MuCi1ndGVzdF90ZXN0c191dGlsX2RpciA9IG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCAnLi4vZ3Rlc3QvdGVzdCcpCi1pZiBvcy5wYXRoLmlzZGlyKGd0ZXN0X3Rlc3RzX3V0aWxfZGlyKToKLSAgR1RFU1RfVEVTVFNfVVRJTF9ESVIgPSBndGVzdF90ZXN0c191dGlsX2RpcgotZWxzZToKLSAgR1RFU1RfVEVTVFNfVVRJTF9ESVIgPSBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgJy4uLy4uL2d0ZXN0L3Rlc3QnKQotCi1zeXMucGF0aC5hcHBlbmQoR1RFU1RfVEVTVFNfVVRJTF9ESVIpCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscyAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2MjA0Ci0KLQotZGVmIEdldFNvdXJjZURpcigpOgotICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIC5weSBmaWxlcyBhcmUuIiIiCi0KLSAgcmV0dXJuIGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCkKLQotCi1kZWYgR2V0VGVzdEV4ZWN1dGFibGVQYXRoKGV4ZWN1dGFibGVfbmFtZSk6Ci0gICIiIlJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRlc3QgYmluYXJ5IGdpdmVuIGl0cyBuYW1lLgotCi0gIFRoZSBmdW5jdGlvbiB3aWxsIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQgdGhlIHByb2dyYW0gaWYgdGhlIHJlc3VsdGluZyBmaWxlCi0gIGRvZXNuJ3QgZXhpc3QuCi0KLSAgQXJnczoKLSAgICBleGVjdXRhYmxlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgYmluYXJ5IHRoYXQgdGhlIHRlc3Qgc2NyaXB0IHJ1bnMuCi0KLSAgUmV0dXJuczoKLSAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBiaW5hcnkuCi0gICIiIgotCi0gIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChleGVjdXRhYmxlX25hbWUpCi0KLQotZGVmIEdldEV4aXRTdGF0dXMoZXhpdF9jb2RlKToKLSAgIiIiUmV0dXJucyB0aGUgYXJndW1lbnQgdG8gZXhpdCgpLCBvciAtMSBpZiBleGl0KCkgd2Fzbid0IGNhbGxlZC4KLQotICBBcmdzOgotICAgIGV4aXRfY29kZTogdGhlIHJlc3VsdCB2YWx1ZSBvZiBvcy5zeXN0ZW0oY29tbWFuZCkuCi0gICIiIgotCi0gIGlmIG9zLm5hbWUgPT0gJ250JzoKLSAgICAjIE9uIFdpbmRvd3MsIG9zLldFWElUU1RBVFVTKCkgZG9lc24ndCB3b3JrIGFuZCBvcy5zeXN0ZW0oKSByZXR1cm5zCi0gICAgIyB0aGUgYXJndW1lbnQgdG8gZXhpdCgpIGRpcmVjdGx5LgotICAgIHJldHVybiBleGl0X2NvZGUKLSAgZWxzZToKLSAgICAjIE9uIFVuaXgsIG9zLldFWElUU1RBVFVTKCkgbXVzdCBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIGV4aXQgc3RhdHVzCi0gICAgIyBmcm9tIHRoZSByZXN1bHQgb2Ygb3Muc3lzdGVtKCkuCi0gICAgaWYgb3MuV0lGRVhJVEVEKGV4aXRfY29kZSk6Ci0gICAgICByZXR1cm4gb3MuV0VYSVRTVEFUVVMoZXhpdF9jb2RlKQotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gLTEKLQotCi0jIFN1cHByZXNzZXMgdGhlICJJbnZhbGlkIGNvbnN0IG5hbWUiIGxpbnQgY29tcGxhaW50Ci0jIHB5bGludDogZGlzYWJsZS1tc2c9QzY0MDkKLQotIyBFeHBvc2VzIHV0aWxpdGllcyBmcm9tIGd0ZXN0X3Rlc3RfdXRpbHMuCi1TdWJwcm9jZXNzID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzCi1UZXN0Q2FzZSA9IGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UKLWVudmlyb24gPSBndGVzdF90ZXN0X3V0aWxzLmVudmlyb24KLVNldEVudlZhciA9IGd0ZXN0X3Rlc3RfdXRpbHMuU2V0RW52VmFyCi1QUkVNQVRVUkVfRVhJVF9GSUxFX0VOVl9WQVIgPSBndGVzdF90ZXN0X3V0aWxzLlBSRU1BVFVSRV9FWElUX0ZJTEVfRU5WX1ZBUgotCi0jIHB5bGludDogZW5hYmxlLW1zZz1DNjQwOQotCi0KLWRlZiBNYWluKCk6Ci0gICIiIlJ1bnMgdGhlIHVuaXQgdGVzdC4iIiIKLQotICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9CVUlMRC5nbiBiL3Rlc3RpbmcvZ3Rlc3QvQlVJTEQuZ24KaW5kZXggODc1OGQ3Ny4uZjhiYjZjNyAxMDA2NDQKLS0tIGEvdGVzdGluZy9ndGVzdC9CVUlMRC5nbgorKysgYi90ZXN0aW5nL2d0ZXN0L0JVSUxELmduCkBAIC0xLDgxICsxLDk2IEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycwogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSMgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1jb25maWcoImd0ZXN0X2RpcmVjdF9jb25maWciKSB7Ci0gIGluY2x1ZGVfZGlycyA9IFsgImluY2x1ZGUiIF0KLQotICBkZWZpbmVzID0gWwotICAgICJVTklUX1RFU1QiLAotICAgICJHVEVTVF9IQVNfUE9TSVhfUkU9MCIsCi0gICAgIl9TSUxFTkNFX1RSMV9OQU1FU1BBQ0VfREVQUkVDQVRJT05fV0FSTklORyIsCi0gIF0KLSAgaWYgKCFpc193aW4pIHsKLSAgICBkZWZpbmVzICs9IFsgIkdURVNUX1VTRV9PV05fVFIxX1RVUExFPTEiIF0KLSAgfQoraW1wb3J0KCIvL2J1aWxkX292ZXJyaWRlcy9ndGVzdC5nbmkiKQoraWYgKGlzX2lvcykgeworICBpbXBvcnQoIi8vYnVpbGQvYnVpbGRmbGFnX2hlYWRlci5nbmkiKQorICBpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2NvdmVyYWdlL2NvdmVyYWdlLmduaSIpCisgIGltcG9ydCgiLy9idWlsZC9jb25maWcvaW9zL2lvc19zZGsuZ25pIikKIH0KIAorY29uZmlnKCJndGVzdF9kaXJlY3RfY29uZmlnIikgeworICB2aXNpYmlsaXR5ID0gWyAiOioiIF0KKyAgZGVmaW5lcyA9IFsgIlVOSVRfVEVTVCIgXQorfQorCisjIFRoZSBmaWxlL2RpcmVjdG9yeSBsYXlvdXQgb2YgR29vZ2xlIFRlc3QgaXMgbm90IHlldCBjb25zaWRlcmVkIHN0YWJsZS4gVW50aWwKKyMgaXQgc3RhYmlsaXplcywgQ2hyb21pdW0gY29kZSBNVVNUIHVzZSB0aGlzIHRhcmdldCBpbnN0ZWFkIG9mIHJlYWNoaW5nIGRpcmVjdGx5CisjIGludG8gLy90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0Lgogc3RhdGljX2xpYnJhcnkoImd0ZXN0IikgewogICB0ZXN0b25seSA9IHRydWUKKwogICBzb3VyY2VzID0gWwotICAgICIuLi9tdWx0aXByb2Nlc3NfZnVuY19saXN0LmNjIiwKLSAgICAiLi4vbXVsdGlwcm9jZXNzX2Z1bmNfbGlzdC5oIiwKLSAgICAiLi4vcGxhdGZvcm1fdGVzdC5oIiwKICAgICAiaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiLAogICAgICJpbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIsCiAgICAgImluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIiwKLSAgICAiaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oIiwKICAgICAiaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaCIsCi0gICAgImluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiLAotICAgICJpbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCIsCiAgICAgImluY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIsCi0gICAgImluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgiLAotICAgICJpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCIsCi0gICAgImluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIsCi0gICAgImluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIsCi0gICAgImluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIiwKLSAgICAiaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIiwKLSAgICAiaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiLAotICAgICJpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIsCi0gICAgImluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiLAotICAgICJpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgiLAotICAgICJpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIiwKLSAgICAic3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MiLAotICAgICJzcmMvZ3Rlc3QtZmlsZXBhdGguY2MiLAotICAgICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiLAotICAgICJzcmMvZ3Rlc3QtcG9ydC5jYyIsCi0gICAgInNyYy9ndGVzdC1wcmludGVycy5jYyIsCi0gICAgInNyYy9ndGVzdC10ZXN0LXBhcnQuY2MiLAotICAgICJzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyIsCi0gICAgInNyYy9ndGVzdC5jYyIsCi0gIF0KKyAgICAiaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgiLAogCi0gIGluY2x1ZGVfZGlycyA9IFsgIi4iIF0KKyAgICAjIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgaXNzdWVzIGJlbG93LgorICAgICMKKyAgICAjIDEpIFRoaXMgdGFyZ2V0IG5lZWRzIHRvIGJlIGEgc3RhdGljX2xpYnJhcnkgKG5vdCBhIHNvdXJjZSBzZXQpIG9uIE1hYyB0bworICAgICMgICAgYXZvaWQgdGhlIGJ1aWxkIGVycm9ycyBpbgorICAgICMgICAgaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8yNzc5MTkzMDAyI21zZzgyLgorICAgICMgMikgQSBzdGF0aWNfbGlicmFyeSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNvdXJjZSBmaWxlLCB0byBhdm9pZCBidWlsZAorICAgICMgICAgZXJyb3JzIG9uIE1hYyBhbmQgV2luZG93cy4gaHR0cHM6Ly9jcmJ1Zy5jb20vNzEwMzM0CisgICAgIyAzKSBBIHN0YXRpY19saWJyYXJ5IHdpdGggY29tcGxldGVfc3RhdGljX2xpYiA9IHRydWUsIHdoaWNoIHdvdWxkIG5vdAorICAgICMgICAgcmVxdWlyZSBhZGRpbmcgdGhlIGVtcHR5IGZpbGUsIHdpbGwgcmVzdWx0IGluIGR1cGxpY2F0ZSBzeW1ib2xzIG9uCisgICAgIyAgICBBbmRyb2lkLiBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzI4NTI2MTMwMDIvI3BzMjAwMDEKKyAgICAiZW1wdHkuY2MiLAorICBdCisgIHB1YmxpY19kZXBzID0gWyAiLy90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0Omd0ZXN0IiBdCiAKICAgcHVibGljX2NvbmZpZ3MgPSBbICI6Z3Rlc3RfZGlyZWN0X2NvbmZpZyIgXQogCi0gICMgSWRlYWxseSB3ZSB3b3VsZCB3YW50IHRvIHJlbW92ZQotICAjIC8vc3RhcmJvYXJkL2J1aWxkL2NvbmZpZzpkZWZhdWx0X3J0dGkgZnJvbSB0aGUgbGlzdCBvZiBjb25maWdzIHRvby4KLSAgIyBVbmZvcnR1bmF0ZWx5IEdOIGRvZXNuJ3QgcHJvdmlkZSB1cyBhIHdheSB0byByZW1vdmUgdGhpbmdzIGZyb20KLSAgIyBkZXBlbmRlbnRzJyBjb25maWdzIGxpc3QuCi0gICMgSXQgaGFwcGVucyB0byBiZSB0aGF0IGFsbF9kZXBlbmRlbnRfY29uZmlncyBnZXQgcHJvY2Vzc2VkIGFmdGVyIGRlZmF1bHQKLSAgIyBjb25maWdzLCBzbyB0aGUgLWZydHRpIGZsYWcgY29tZXMgYWZ0ZXIgdGhlIC1mbm8tcnR0aSBmbGFnIG9uIHRoZSBjb21tYW5kCi0gICMgbGluZSwgc28gaXQgaGFwcGVucyB0byB3b3JrIGluIHRoaXMgY2FzZS4KLSAgYWxsX2RlcGVuZGVudF9jb25maWdzID0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6cnR0aSIgXQorICBpZiAoZ3Rlc3RfaW5jbHVkZV9tdWx0aXByb2Nlc3MpIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICIuLi9tdWx0aXByb2Nlc3NfZnVuY19saXN0LmNjIiwKKyAgICAgICIuLi9tdWx0aXByb2Nlc3NfZnVuY19saXN0LmgiLAorICAgIF0KKyAgfQogCi0gIHB1YmxpY19kZXBzID0gWyAiLy9zdGFyYm9hcmQiIF0KKyAgaWYgKGd0ZXN0X2luY2x1ZGVfcGxhdGZvcm1fdGVzdCkgeworICAgIHNvdXJjZXMgKz0gWyAiLi4vcGxhdGZvcm1fdGVzdC5oIiBdCisgIH0KKworICBpZiAoaXNfYXBwbGUgJiYgZ3Rlc3RfaW5jbHVkZV9vYmpjX3N1cHBvcnQpIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICIuLi9ndGVzdF9tYWMuaCIsCisgICAgICAiLi4vZ3Rlc3RfbWFjLm1tIiwKKyAgICBdCisgICAgaWYgKGd0ZXN0X2luY2x1ZGVfcGxhdGZvcm1fdGVzdCkgeworICAgICAgc291cmNlcyArPSBbICIuLi9wbGF0Zm9ybV90ZXN0X21hYy5tbSIgXQorICAgIH0KKyAgfQorCisgIGlmIChpc19pb3MgJiYgZ3Rlc3RfaW5jbHVkZV9pb3NfY292ZXJhZ2UpIHsKKyAgICBwdWJsaWNfZGVwcyArPSBbICI6aW9zX2NvdmVyYWdlX3V0aWxzIiBdCisgIH0KK30KKworIyBUaGUgZmlsZS9kaXJlY3RvcnkgbGF5b3V0IG9mIEdvb2dsZSBUZXN0IGlzIG5vdCB5ZXQgY29uc2lkZXJlZCBzdGFibGUuIFVudGlsCisjIGl0IHN0YWJpbGl6ZXMsIENocm9taXVtIGNvZGUgTVVTVCB1c2UgdGhpcyB0YXJnZXQgaW5zdGVhZCBvZiByZWFjaGluZyBkaXJlY3RseQorIyBpbnRvIC8vdGhpcmRfcGFydHkvZ29vZ2xldGVzdC4KK3NvdXJjZV9zZXQoImd0ZXN0X21haW4iKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBkZXBzID0gWyAiLy90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0Omd0ZXN0X21haW4iIF0KK30KKworaWYgKGlzX2lvcykgeworICAjIFRoZXNlIGhlYWRlcnMgYXJlIG5lZWRlZCBpbiBzb21lIG5vbiB0ZXN0IHRhcmdldHMgZm9yIGlPUyBjb2RlIGNvdmVyYWdlLiBTbworICAjIGNhbiBub3QgYmUgdGVzdG9ubHkuCisgIHNvdXJjZV9zZXQoImlvc19jb3ZlcmFnZV91dGlscyIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgIi4uL2NvdmVyYWdlX3V0aWxfaW9zLmgiLAorICAgICAgIi4uL2NvdmVyYWdlX3V0aWxfaW9zLm1tIiwKKyAgICBdCisgICAgZGVwcyA9IFsgIjppb3NfZW5hYmxlX2NvdmVyYWdlIiBdCisgIH0KKworICBidWlsZGZsYWdfaGVhZGVyKCJpb3NfZW5hYmxlX2NvdmVyYWdlIikgeworICAgIGhlYWRlciA9ICJpb3NfZW5hYmxlX2NvdmVyYWdlLmgiCisgICAgZmxhZ3MgPSBbICJJT1NfRU5BQkxFX0NPVkVSQUdFPSR1c2VfY2xhbmdfY292ZXJhZ2UiIF0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9DSEFOR0VTIGIvdGVzdGluZy9ndGVzdC9DSEFOR0VTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyMTMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvQ0hBTkdFUworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi1DaGFuZ2VzIGZvciAxLjcuMDoKLQotKiBOZXcgZmVhdHVyZTogZGVhdGggdGVzdHMgYXJlIHN1cHBvcnRlZCBvbiBPcGVuQlNEIGFuZCBpbiBpT1MKLSAgc2ltdWxhdG9yIG5vdy4KLSogTmV3IGZlYXR1cmU6IEdvb2dsZSBUZXN0IG5vdyBpbXBsZW1lbnRzIGEgcHJvdG9jb2wgdG8gYWxsb3cKLSAgYSB0ZXN0IHJ1bm5lciB0byBkZXRlY3QgdGhhdCBhIHRlc3QgcHJvZ3JhbSBoYXMgZXhpdGVkCi0gIHByZW1hdHVyZWx5IGFuZCByZXBvcnQgaXQgYXMgYSBmYWlsdXJlIChiZWZvcmUgaXQgd291bGQgYmUKLSAgZmFsc2VseSByZXBvcnRlZCBhcyBhIHN1Y2Nlc3MgaWYgdGhlIGV4aXQgY29kZSBpcyAwKS4KLSogTmV3IGZlYXR1cmU6IFRlc3Q6OlJlY29yZFByb3BlcnR5KCkgY2FuIG5vdyBiZSB1c2VkIG91dHNpZGUgb2YgdGhlCi0gIGxpZmVzcGFuIG9mIGEgdGVzdCBtZXRob2QsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBhdHRyaWJ1dGVkIHRvCi0gIHRoZSBjdXJyZW50IHRlc3QgY2FzZSBvciB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBYTUwgcmVwb3J0LgotKiBOZXcgZmVhdHVyZSAocG90ZW50aWFsbHkgYnJlYWtpbmcpOiAtLWd0ZXN0X2xpc3RfdGVzdHMgbm93IHByaW50cwotICB0aGUgdHlwZSBwYXJhbWV0ZXJzIGFuZCB2YWx1ZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHRlc3QuCi0qIEltcHJvdmVtZW50OiBjaGFyIHBvaW50ZXJzIGFuZCBjaGFyIGFycmF5cyBhcmUgbm93IGVzY2FwZWQgcHJvcGVybHkKLSAgaW4gZmFpbHVyZSBtZXNzYWdlcy4KLSogSW1wcm92ZW1lbnQ6IGZhaWx1cmUgc3VtbWFyeSBpbiBYTUwgcmVwb3J0cyBub3cgaW5jbHVkZXMgZmlsZSBhbmQKLSAgbGluZSBpbmZvcm1hdGlvbi4KLSogSW1wcm92ZW1lbnQ6IHRoZSA8dGVzdHN1aXRlcz4gWE1MIGVsZW1lbnQgbm93IGhhcyBhIHRpbWVzdGFtcCBhdHRyaWJ1dGUuCi0qIEltcHJvdmVtZW50OiBXaGVuIC0tZ3Rlc3RfZmlsdGVyIGlzIHNwZWNpZmllZCwgWE1MIHJlcG9ydCBub3cgZG9lc24ndAotICBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzIHRoYXQgYXJlIGZpbHRlcmVkIG91dC4KLSogRml4ZWQgdGhlIGJ1ZyB3aGVyZSBsb25nIC0tZ3Rlc3RfZmlsdGVyIGZsYWcgdmFsdWVzIGFyZSB0cnVuY2F0ZWQgaW4KLSAgZGVhdGggdGVzdHMuCi0qIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZTogUlVOX0FMTF9URVNUUygpIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhCi0gIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBtYWNybyBpbiBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIENsYW5nLgotKiBDb21wYXRpYmlsaXR5IGZpeGVzIHdpdGggQysrIDExIGFuZCB2YXJpb3VzIHBsYXRmb3Jtcy4KLSogQnVnL3dhcm5pbmcgZml4ZXMuCi0KLUNoYW5nZXMgZm9yIDEuNi4wOgotCi0qIE5ldyBmZWF0dXJlOiBBRERfRkFJTFVSRV9BVCgpIGZvciByZXBvcnRpbmcgYSB0ZXN0IGZhaWx1cmUgYXQgdGhlCi0gIGdpdmVuIHNvdXJjZSBsb2NhdGlvbiAtLSB1c2VmdWwgZm9yIHdyaXRpbmcgdGVzdGluZyB1dGlsaXRpZXMuCi0qIE5ldyBmZWF0dXJlOiB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgaXMgbW92ZWQgZnJvbSBHb29nbGUgTW9jawotICB0byBHb29nbGUgVGVzdC4KLSogTmV3IGZlYXR1cmU6IHR5cGUgcGFyYW1ldGVycyBhbmQgdmFsdWUgcGFyYW1ldGVycyBhcmUgcmVwb3J0ZWQgaW4KLSAgdGhlIFhNTCByZXBvcnQgbm93LgotKiBBIGd0ZXN0X2Rpc2FibGVfcHRocmVhZHMgQ01ha2Ugb3B0aW9uLgotKiBDb2xvcmVkIG91dHB1dCB3b3JrcyBpbiBHTlUgU2NyZWVuIHNlc3Npb25zIG5vdy4KLSogUGFyYW1ldGVycyBvZiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBub3cgcHJpbnRlZCBpbiB0aGUKLSAgdGV4dHVhbCBvdXRwdXQuCi0qIEZhaWx1cmVzIGZyb20gYWQgaG9jIHRlc3QgYXNzZXJ0aW9ucyBydW4gYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBhcmUKLSAgbm93IGNvcnJlY3RseSByZXBvcnRlZC4KLSogQXJndW1lbnRzIG9mIEFTU0VSVF9YWSBhbmQgRVhQRUNUX1hZIG5vIGxvbmdlciBuZWVkIHRvIHN1cHBvcnQgPDwgdG8KLSAgb3N0cmVhbS4KLSogTW9yZSBjb21wbGV0ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zLgotKiBHVEVTVF9BU1NFUlRfWFkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBBU1NFUlRfWFkgaW4gY2FzZSB0aGUgbGF0dGVyCi0gIG5hbWUgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgbGlicmFyeS4KLSogLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGlzIG5vdyB0cnVlIGJ5IGRlZmF1bHQsIGFsbG93aW5nIGEgdGVzdAotICBwcm9ncmFtIHRvIGNvbnRpbnVlIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0qIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlcyBjYW4gbm93IGRlcml2ZSBmcm9tIFRlc3QgYW5kCi0gIFdpdGhQYXJhbUludGVyZmFjZTxUPiBzZXBhcmF0ZWx5LCBlYXNpbmcgY29udmVyc2lvbiBvZiBsZWdhY3kgdGVzdHMuCi0qIERlYXRoIHRlc3QgbWVzc2FnZXMgYXJlIGNsZWFybHkgbWFya2VkIHRvIG1ha2UgdGhlbSBtb3JlCi0gIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIG90aGVyIG1lc3NhZ2VzLgotKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBBbmRyb2lkLCBHb29nbGUgTmF0aXZlIENsaWVudCwgTWluR1csIEhQIFVYLAotICBQb3dlclBDLCBMdWNpZCBhdXRvdG9vbHMsIGxpYkNTdGQsIFN1biBDKyssIEJvcmxhbmQgQysrIEJ1aWxkZXIgKENvZGUgR2VhciksCi0gIElCTSBYTCBDKysgKFZpc3VhbCBBZ2UgQysrKSwgYW5kIEMrKzB4LgotKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KLSogUG90ZW50aWFsbHkgaW5jb21wYXRpYmxlIGNoYW5nZXM6IGRpc2FibGVzIHRoZSBoYXJtZnVsICdtYWtlIGluc3RhbGwnCi0gIGNvbW1hbmQgaW4gYXV0b3Rvb2xzLgotCi1DaGFuZ2VzIGZvciAxLjUuMDoKLQotICogTmV3IGZlYXR1cmU6IGFzc2VydGlvbnMgY2FuIGJlIHNhZmVseSBjYWxsZWQgaW4gbXVsdGlwbGUgdGhyZWFkcwotICAgd2hlcmUgdGhlIHB0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlLgotICogTmV3IGZlYXR1cmU6IHByZWRpY2F0ZXMgdXNlZCBpbnNpZGUgRVhQRUNUX1RSVUUoKSBhbmQgZnJpZW5kcwotICAgY2FuIG5vdyBnZW5lcmF0ZSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlcy4KLSAqIE5ldyBmZWF0dXJlOiBHb29nbGUgVGVzdCBjYW4gbm93IGJlIGNvbXBpbGVkIGFzIGEgRExMLgotICogTmV3IGZlYXR1cmU6IGZ1c2VkIHNvdXJjZSBmaWxlcyBhcmUgaW5jbHVkZWQuCi0gKiBOZXcgZmVhdHVyZTogcHJpbnRzIGhlbHAgd2hlbiBlbmNvdW50ZXJpbmcgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzLgotICogRXhwZXJpbWVudGFsIGZlYXR1cmU6IENNYWtlIGJ1aWxkIHNjcmlwdCAocmVxdWlyZXMgQ01ha2UgMi42LjQrKS4KLSAqIEV4cGVyaW1lbnRhbCBmZWF0dXJlOiB0aGUgUHVtcCBzY3JpcHQgZm9yIG1ldGEgcHJvZ3JhbW1pbmcuCi0gKiBkb3VibGUgdmFsdWVzIHN0cmVhbWVkIHRvIGFuIGFzc2VydGlvbiBhcmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24KLSAgIHRvIGRpZmZlcmVudGlhdGUgYW55IHR3byBkaWZmZXJlbnQgdmFsdWVzLgotICogR29vZ2xlIFRlc3Qgbm93IHdvcmtzIG9uIFNvbGFyaXMgYW5kIEFJWC4KLSAqIEJ1aWxkIGFuZCB0ZXN0IHNjcmlwdCBpbXByb3ZlbWVudHMuCi0gKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KLQotIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZXM6Ci0KLSAqIFN0b3BwZWQgc3VwcG9ydGluZyBWQysrIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCi0gKiBEcm9wcGVkIHN1cHBvcnQgZm9yICdtYWtlIGluc3RhbGwnLgotCi1DaGFuZ2VzIGZvciAxLjQuMDoKLQotICogTmV3IGZlYXR1cmU6IHRoZSBldmVudCBsaXN0ZW5lciBBUEkKLSAqIE5ldyBmZWF0dXJlOiB0ZXN0IHNodWZmbGluZwotICogTmV3IGZlYXR1cmU6IHRoZSBYTUwgcmVwb3J0IGZvcm1hdCBpcyBjbG9zZXIgdG8ganVuaXRyZXBvcnQgYW5kIGNhbgotICAgYmUgcGFyc2VkIGJ5IEh1ZHNvbiBub3cuCi0gKiBOZXcgZmVhdHVyZTogd2hlbiBhIHRlc3QgcnVucyB1bmRlciBWaXN1YWwgU3R1ZGlvLCBpdHMgZmFpbHVyZXMgYXJlCi0gICBpbnRlZ3JhdGVkIGluIHRoZSBJREUuCi0gKiBOZXcgZmVhdHVyZTogL01EKGQpIHZlcnNpb25zIG9mIFZDKysgcHJvamVjdHMuCi0gKiBOZXcgZmVhdHVyZTogZWxhcHNlZCB0aW1lIGZvciB0aGUgdGVzdHMgaXMgcHJpbnRlZCBieSBkZWZhdWx0LgotICogTmV3IGZlYXR1cmU6IGNvbWVzIHdpdGggYSBUUjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc3VjaCB0aGF0IEJvb3N0Ci0gICBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBDb21iaW5lKCkuCi0gKiBOZXcgZmVhdHVyZTogRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBtYWNybyBhbmQgZnJpZW5kcy4KLSAqIE5ldyBmZWF0dXJlOiB0aGUgWGNvZGUgcHJvamVjdCBjYW4gbm93IHByb2R1Y2Ugc3RhdGljIGd0ZXN0Ci0gICBsaWJyYXJpZXMgaW4gYWRkaXRpb24gdG8gYSBmcmFtZXdvcmsuCi0gKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBTb2xhcmlzLCBDeWd3aW4sIG1pbkdXLCBXaW5kb3dzIE1vYmlsZSwKLSAgIFN5bWJpYW4sIGdjYywgYW5kIEMrK0J1aWxkZXIuCi0gKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KLQotQ2hhbmdlcyBmb3IgMS4zLjA6Ci0KLSAqIE5ldyBmZWF0dXJlOiBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLCBDeWd3aW4sIGFuZCBNYWMuCi0gKiBOZXcgZmVhdHVyZTogYWJpbGl0eSB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbiBvdGhlciB0ZXN0aW5nCi0gICBmcmFtZXdvcmtzLgotICogTmV3IGZlYXR1cmU6IGFiaWxpdHkgdG8gcnVuIGRpc2FibGVkIHRlc3QgdmlhCi0gICAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLgotICogTmV3IGZlYXR1cmU6IHRoZSAtLWhlbHAgZmxhZyBmb3IgcHJpbnRpbmcgdGhlIHVzYWdlLgotICogTmV3IGZlYXR1cmU6IGFjY2VzcyB0byBHb29nbGUgVGVzdCBmbGFnIHZhbHVlcyBpbiB1c2VyIGNvZGUuCi0gKiBOZXcgZmVhdHVyZTogYSBzY3JpcHQgdGhhdCBwYWNrcyBHb29nbGUgVGVzdCBpbnRvIG9uZSAuaCBhbmQgb25lCi0gICAuY2MgZmlsZSBmb3IgZWFzeSBkZXBsb3ltZW50LgotICogTmV3IGZlYXR1cmU6IHN1cHBvcnQgZm9yIGRpc3RyaWJ1dGluZyB0ZXN0IGZ1bmN0aW9ucyB0byBtdWx0aXBsZQotICAgbWFjaGluZXMgKHJlcXVpcmVzIHN1cHBvcnQgZnJvbSB0aGUgdGVzdCBydW5uZXIpLgotICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCi0KLUNoYW5nZXMgZm9yIDEuMi4xOgotCi0gKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBMaW51eCBJQS02NCBhbmQgSUJNIHovT1MuCi0gKiBBZGRlZCBzdXBwb3J0IGZvciB1c2luZyBCb29zdCBhbmQgb3RoZXIgVFIxIGltcGxlbWVudGF0aW9ucy4KLSAqIENoYW5nZXMgdG8gdGhlIGJ1aWxkIHNjcmlwdHMgdG8gc3VwcG9ydCB1cGNvbWluZyByZWxlYXNlIG9mIEdvb2dsZSBDKysKLSAgIE1vY2tpbmcgRnJhbWV3b3JrLgotICogQWRkZWQgTWFrZWZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBwYWNrYWdlLgotICogSW1wcm92ZWQgYnVpbGQgaW5zdHJ1Y3Rpb25zIGluIFJFQURNRS4KLQotQ2hhbmdlcyBmb3IgMS4yLjA6Ci0KLSAqIE5ldyBmZWF0dXJlOiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotICogTmV3IGZlYXR1cmU6IHRoZSBBU1NFUlQvRVhQRUNUXyhOT04pRkFUQUxfRkFJTFVSRShfT05fQUxMX1RIUkVBRFMpCi0gICBtYWNyb3MuCi0gKiBDaGFuZ2VkIHRoZSBYTUwgcmVwb3J0IGZvcm1hdCB0byBtYXRjaCBKVW5pdC9BbnQncy4KLSAqIEFkZGVkIHRlc3RzIHRvIHRoZSBYY29kZSBwcm9qZWN0LgotICogQWRkZWQgc2NvbnMvU0NvbnNjcmlwdCBmb3IgYnVpbGRpbmcgd2l0aCBTQ29ucy4KLSAqIEFkZGVkIHNyYy9ndGVzdC1hbGwuY2MgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0IGZyb20gYSBzaW5nbGUgZmlsZS4KLSAqIEZpeGVkIGNvbXBhdGliaWxpdHkgd2l0aCBTb2xhcmlzIGFuZCB6L09TLgotICogRW5hYmxlZCBydW5uaW5nIFB5dGhvbiB0ZXN0cyBvbiBzeXN0ZW1zIHdpdGggcHl0aG9uIDIuMyBpbnN0YWxsZWQsCi0gICBlLmcuIE1hYyBPUyBYIDEwLjQuCi0gKiBCdWcgZml4ZXMuCi0KLUNoYW5nZXMgZm9yIDEuMS4wOgotCi0gKiBOZXcgZmVhdHVyZTogdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotICogTmV3IGZlYXR1cmU6IGV4Y2VwdGlvbiBhc3NlcnRpb25zLgotICogTmV3IGZlYXR1cmU6IHByaW50aW5nIGVsYXBzZWQgdGltZSBvZiB0ZXN0cy4KLSAqIEltcHJvdmVkIHRoZSByb2J1c3RuZXNzIG9mIGRlYXRoIHRlc3RzLgotICogQWRkZWQgYW4gWGNvZGUgcHJvamVjdCBhbmQgc2FtcGxlcy4KLSAqIEFkanVzdGVkIHRoZSBvdXRwdXQgZm9ybWF0IG9uIFdpbmRvd3MgdG8gYmUgdW5kZXJzdGFuZGFibGUgYnkgVmlzdWFsIFN0dWRpby4KLSAqIE1pbm9yIGJ1ZyBmaXhlcy4KLQotQ2hhbmdlcyBmb3IgMS4wLjE6Ci0KLSAqIEFkZGVkIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gNy4xLgotICogRml4ZWQgaXNzdWVzIHdpdGggY29tcGlsaW5nIG9uIE1hYyBPUyBYLgotICogRml4ZWQgaXNzdWVzIHdpdGggY29tcGlsaW5nIG9uIEN5Z3dpbi4KLQotQ2hhbmdlcyBmb3IgMS4wLjA6Ci0KLSAqIEluaXRpYWwgT3BlbiBTb3VyY2UgcmVsZWFzZSBvZiBHb29nbGUgVGVzdApkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3RpbmcvZ3Rlc3QvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzhjZmUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9DTWFrZUxpc3RzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ01ha2UgYnVpbGQgc2NyaXB0IGZvciBHb29nbGUgVGVzdC4KLSMKLSMgVG8gcnVuIHRoZSB0ZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmIG9uIExpbnV4LCB1c2UgJ21ha2UgdGVzdCcgb3IKLSMgY3Rlc3QuICBZb3UgY2FuIHNlbGVjdCB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgJ2N0ZXN0IC1SIHJlZ2V4Jy4KLSMgRm9yIG1vcmUgb3B0aW9ucywgcnVuICdjdGVzdCAtLWhlbHAnLgotCi0jIEJVSUxEX1NIQVJFRF9MSUJTIGlzIGEgc3RhbmRhcmQgQ01ha2UgdmFyaWFibGUsIGJ1dCB3ZSBkZWNsYXJlIGl0IGhlcmUgdG8KLSMgbWFrZSBpdCBwcm9taW5lbnQgaW4gdGhlIEdVSS4KLW9wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyAoRExMcykuIiBPRkYpCi0KLSMgV2hlbiBvdGhlciBsaWJyYXJpZXMgYXJlIHVzaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgcnVudGltZSBsaWJyYXJpZXMsCi0jIEdvb2dsZSBUZXN0IGFsc28gaGFzIHRvIHVzZSBvbmUuCi1vcHRpb24oCi0gIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQKLSAgIlVzZSBzaGFyZWQgKERMTCkgcnVuLXRpbWUgbGliIGV2ZW4gd2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBzdGF0aWMgbGliLiIKLSAgT0ZGKQotCi1vcHRpb24oZ3Rlc3RfYnVpbGRfdGVzdHMgIkJ1aWxkIGFsbCBvZiBndGVzdCdzIG93biB0ZXN0cy4iIE9GRikKLQotb3B0aW9uKGd0ZXN0X2J1aWxkX3NhbXBsZXMgIkJ1aWxkIGd0ZXN0J3Mgc2FtcGxlIHByb2dyYW1zLiIgT0ZGKQotCi1vcHRpb24oZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcyAiRGlzYWJsZSB1c2VzIG9mIHB0aHJlYWRzIGluIGd0ZXN0LiIgT0ZGKQotCi0jIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLgotaW5jbHVkZShjbWFrZS9oZXJtZXRpY19idWlsZC5jbWFrZSBPUFRJT05BTCkKLQotaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQotICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQotZW5kaWYoKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUHJvamVjdC13aWRlIHNldHRpbmdzCi0KLSMgTmFtZSBvZiB0aGUgcHJvamVjdC4KLSMKLSMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5Ci0jIGFzICR7Z3Rlc3RfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMKLSMgJHtndGVzdF9CSU5BUllfRElSfS4KLSMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuCi1wcm9qZWN0KGd0ZXN0IENYWCBDKQotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4yKQotCi1pZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpCi0gIHNldF91cF9oZXJtZXRpY19idWlsZCgpCi1lbmRpZigpCi0KLSMgRGVmaW5lIGhlbHBlciBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIGJ5IEdvb2dsZSBUZXN0LgotaW5jbHVkZShjbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSkKLQotY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBEZWZpbmVkIGluIGludGVybmFsX3V0aWxzLmNtYWtlLgotCi0jIFdoZXJlIEdvb2dsZSBUZXN0J3MgLmggZmlsZXMgY2FuIGJlIGZvdW5kLgotaW5jbHVkZV9kaXJlY3RvcmllcygKLSAgJHtndGVzdF9TT1VSQ0VfRElSfS9pbmNsdWRlCi0gICR7Z3Rlc3RfU09VUkNFX0RJUn0pCi0KLSMgV2hlcmUgR29vZ2xlIFRlc3QncyBsaWJyYXJpZXMgY2FuIGJlIGZvdW5kLgotbGlua19kaXJlY3Rvcmllcygke2d0ZXN0X0JJTkFSWV9ESVJ9L3NyYykKLQotIyBTdW1tYXJ5IG9mIHR1cGxlIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvOgotIyBDb21waWxlciAgICB2ZXJzaW9uKE1TKSAgdmVyc2lvbihjbWFrZSkgIFN1cHBvcnQKLSMgLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyA8PSBWUyAyMDEwICA8PSAxMCAgICAgICAgPD0gMTYwMCAgICAgICAgIFVzZSBHb29nbGUgVGVzdHMncyBvd24gdHVwbGUuCi0jIFZTIDIwMTIgICAgIDExICAgICAgICAgICAxNzAwICAgICAgICAgICAgc3RkOjp0cjE6OnR1cGxlICsgX1ZBUklBRElDX01BWD0xMAotIyBWUyAyMDEzICAgICAxMiAgICAgICAgICAgMTgwMCAgICAgICAgICAgIHN0ZDo6dHIxOjp0dXBsZQotaWYgKE1TVkMgQU5EIE1TVkNfVkVSU0lPTiBFUVVBTCAxNzAwKQotICBhZGRfZGVmaW5pdGlvbnMoL0QgX1ZBUklBRElDX01BWD0xMCkKLWVuZGlmKCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIERlZmluZXMgdGhlIGd0ZXN0ICYgZ3Rlc3RfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCi0jIHdpdGggb25lIG9mIHRoZW0uCi0KLSMgR29vZ2xlIFRlc3QgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQKLSMgYXJlIHVzZWQgZm9yIG90aGVyIHRhcmdldHMsIHRvIGVuc3VyZSB0aGF0IGd0ZXN0IGNhbiBiZSBjb21waWxlZCBieSBhIHVzZXIKLSMgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4KLWN4eF9saWJyYXJ5KGd0ZXN0ICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3QtYWxsLmNjKQotY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbiAiJHtjeHhfc3RyaWN0fSIgc3JjL2d0ZXN0X21haW4uY2MpCi10YXJnZXRfbGlua19saWJyYXJpZXMoZ3Rlc3RfbWFpbiBndGVzdCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFNhbXBsZXMgb24gaG93IHRvIGxpbmsgdXNlciB0ZXN0cyB3aXRoIGd0ZXN0IG9yIGd0ZXN0X21haW4uCi0jCi0jIFRoZXkgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQotIyBndGVzdF9idWlsZF9zYW1wbGVzIG9wdGlvbiB0byBPTi4gIFlvdSBjYW4gZG8gaXQgYnkgcnVubmluZyBjY21ha2UKLSMgb3Igc3BlY2lmeWluZyB0aGUgLURndGVzdF9idWlsZF9zYW1wbGVzPU9OIGZsYWcgd2hlbiBydW5uaW5nIGNtYWtlLgotCi1pZiAoZ3Rlc3RfYnVpbGRfc2FtcGxlcykKLSAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlMV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4gc2FtcGxlcy9zYW1wbGUxLmNjKQotICBjeHhfZXhlY3V0YWJsZShzYW1wbGUyX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTIuY2MpCi0gIGN4eF9leGVjdXRhYmxlKHNhbXBsZTNfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQotICBjeHhfZXhlY3V0YWJsZShzYW1wbGU0X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTQuY2MpCi0gIGN4eF9leGVjdXRhYmxlKHNhbXBsZTVfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlMS5jYykKLSAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlNl91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCi0gIGN4eF9leGVjdXRhYmxlKHNhbXBsZTdfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQotICBjeHhfZXhlY3V0YWJsZShzYW1wbGU4X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbikKLSAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlOV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0KQotICBjeHhfZXhlY3V0YWJsZShzYW1wbGUxMF91bml0dGVzdCBzYW1wbGVzIGd0ZXN0KQotZW5kaWYoKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgR29vZ2xlIFRlc3QncyBvd24gdGVzdHMuCi0jCi0jIFlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRlc3RpbmcKLSMgR29vZ2xlIFRlc3QgaXRzZWxmLgotIwotIyBUaGUgdGVzdHMgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LiAgVG8gYnVpbGQgdGhlbSwgc2V0IHRoZQotIyBndGVzdF9idWlsZF90ZXN0cyBvcHRpb24gdG8gT04uICBZb3UgY2FuIGRvIGl0IGJ5IHJ1bm5pbmcgY2NtYWtlCi0jIG9yIHNwZWNpZnlpbmcgdGhlIC1EZ3Rlc3RfYnVpbGRfdGVzdHM9T04gZmxhZyB3aGVuIHJ1bm5pbmcgY21ha2UuCi0KLWlmIChndGVzdF9idWlsZF90ZXN0cykKLSAgIyBUaGlzIG11c3QgYmUgc2V0IGluIHRoZSByb290IGRpcmVjdG9yeSBmb3IgdGhlIHRlc3RzIHRvIGJlIHJ1biBieQotICAjICdtYWtlIHRlc3QnIG9yIGN0ZXN0LgotICBlbmFibGVfdGVzdGluZygpCi0KLSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCi0KLSAgY3h4X3Rlc3QoZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0IGd0ZXN0X21haW4pCi0gIGN4eF90ZXN0KGd0ZXN0X2Vudmlyb25tZW50X3Rlc3QgZ3Rlc3QpCi0gIGN4eF90ZXN0KGd0ZXN0LWZpbGVwYXRoX3Rlc3QgZ3Rlc3RfbWFpbikKLSAgY3h4X3Rlc3QoZ3Rlc3QtbGlua2VkX3B0cl90ZXN0IGd0ZXN0X21haW4pCi0gIGN4eF90ZXN0KGd0ZXN0LWxpc3RlbmVyX3Rlc3QgZ3Rlc3RfbWFpbikKLSAgY3h4X3Rlc3QoZ3Rlc3RfbWFpbl91bml0dGVzdCBndGVzdF9tYWluKQotICBjeHhfdGVzdChndGVzdC1tZXNzYWdlX3Rlc3QgZ3Rlc3RfbWFpbikKLSAgY3h4X3Rlc3QoZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdCBndGVzdCkKLSAgY3h4X3Rlc3QoZ3Rlc3Qtb3B0aW9uc190ZXN0IGd0ZXN0X21haW4pCi0gIGN4eF90ZXN0KGd0ZXN0LXBhcmFtLXRlc3RfdGVzdCBndGVzdAotICAgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYykKLSAgY3h4X3Rlc3QoZ3Rlc3QtcG9ydF90ZXN0IGd0ZXN0X21haW4pCi0gIGN4eF90ZXN0KGd0ZXN0X3ByZWRfaW1wbF91bml0dGVzdCBndGVzdF9tYWluKQotICBjeHhfdGVzdChndGVzdF9wcmVtYXR1cmVfZXhpdF90ZXN0IGd0ZXN0Ci0gICAgdGVzdC9ndGVzdF9wcmVtYXR1cmVfZXhpdF90ZXN0LmNjKQotICBjeHhfdGVzdChndGVzdC1wcmludGVyc190ZXN0IGd0ZXN0X21haW4pCi0gIGN4eF90ZXN0KGd0ZXN0X3Byb2RfdGVzdCBndGVzdF9tYWluCi0gICAgdGVzdC9wcm9kdWN0aW9uLmNjKQotICBjeHhfdGVzdChndGVzdF9yZXBlYXRfdGVzdCBndGVzdCkKLSAgY3h4X3Rlc3QoZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdCBndGVzdF9tYWluKQotICBjeHhfdGVzdChndGVzdF9zdHJlc3NfdGVzdCBndGVzdCkKLSAgY3h4X3Rlc3QoZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QgZ3Rlc3RfbWFpbikKLSAgY3h4X3Rlc3QoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0IGd0ZXN0KQotICBjeHhfdGVzdChndGVzdC10eXBlZC10ZXN0X3Rlc3QgZ3Rlc3RfbWFpbgotICAgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYykKLSAgY3h4X3Rlc3QoZ3Rlc3RfdW5pdHRlc3QgZ3Rlc3RfbWFpbikKLSAgY3h4X3Rlc3QoZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QgZ3Rlc3QpCi0KLSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICMgQysrIHRlc3RzIGJ1aWx0IHdpdGggbm9uLXN0YW5kYXJkIGNvbXBpbGVyIGZsYWdzLgotCi0gICMgTVNWQyA3LjEgZG9lcyBub3Qgc3VwcG9ydCBTVEwgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgotICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIEdSRUFURVIgMTMxMCkKLSAgICBjeHhfbGlicmFyeShndGVzdF9ub19leGNlcHRpb24gIiR7Y3h4X25vX2V4Y2VwdGlvbn0iCi0gICAgICBzcmMvZ3Rlc3QtYWxsLmNjKQotICAgIGN4eF9saWJyYXJ5KGd0ZXN0X21haW5fbm9fZXhjZXB0aW9uICIke2N4eF9ub19leGNlcHRpb259IgotICAgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKLSAgZW5kaWYoKQotICBjeHhfbGlicmFyeShndGVzdF9tYWluX25vX3J0dGkgIiR7Y3h4X25vX3J0dGl9IgotICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCi0KLSAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdC1kZWF0aC10ZXN0X2V4X25vY2F0Y2hfdGVzdAotICAgICIke2N4eF9leGNlcHRpb259IC1ER1RFU1RfRU5BQkxFX0NBVENIX0VYQ0VQVElPTlNfPTAiCi0gICAgZ3Rlc3QgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MpCi0gIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3QtZGVhdGgtdGVzdF9leF9jYXRjaF90ZXN0Ci0gICAgIiR7Y3h4X2V4Y2VwdGlvbn0gLURHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU189MSIKLSAgICBndGVzdCB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYykKLQotICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0X25vX3J0dGlfdW5pdHRlc3QgIiR7Y3h4X25vX3J0dGl9IgotICAgIGd0ZXN0X21haW5fbm9fcnR0aSB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjKQotCi0gIGN4eF9zaGFyZWRfbGlicmFyeShndGVzdF9kbGwgIiR7Y3h4X2RlZmF1bHR9IgotICAgIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MpCi0KLSAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhndGVzdF9kbGxfdGVzdF8gIiR7Y3h4X2RlZmF1bHR9IgotICAgIGd0ZXN0X2RsbCB0ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjKQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3RfZGxsX3Rlc3RfCi0gICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTCi0gICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCi0KLSAgaWYgKE5PVCBNU1ZDIE9SIE1TVkNfVkVSU0lPTiBMRVNTIDE2MDApICAjIDE2MDAgaXMgVmlzdWFsIFN0dWRpbyAyMDEwLgotICAgICMgVmlzdWFsIFN0dWRpbyAyMDEwLCAyMDEyLCBhbmQgMjAxMyBkZWZpbmUgc3ltYm9scyBpbiBzdGQ6OnRyMSB0aGF0Ci0gICAgIyBjb25mbGljdCB3aXRoIG91ciBvd24gZGVmaW5pdGlvbnMuIFRoZXJlZm9yZSB1c2luZyBvdXIgb3duIHR1cGxlIGRvZXMgbm90Ci0gICAgIyB3b3JrIG9uIHRob3NlIGNvbXBpbGVycy4KLSAgICBjeHhfbGlicmFyeShndGVzdF9tYWluX3VzZV9vd25fdHVwbGUgIiR7Y3h4X3VzZV9vd25fdHVwbGV9IgotICAgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKLQotICAgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3QtdHVwbGVfdGVzdCAiJHtjeHhfdXNlX293bl90dXBsZX0iCi0gICAgICBndGVzdF9tYWluX3VzZV9vd25fdHVwbGUgdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjKQotCi0gICAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdF91c2Vfb3duX3R1cGxlX3Rlc3QgIiR7Y3h4X3VzZV9vd25fdHVwbGV9IgotICAgICAgZ3Rlc3RfbWFpbl91c2Vfb3duX3R1cGxlCi0gICAgICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MpCi0gIGVuZGlmKCkKLQotICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgIyBQeXRob24gdGVzdHMuCi0KLSAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gdGVzdCBndGVzdCkKLSAgcHlfdGVzdChndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0KQotCi0gICMgVmlzdWFsIFN0dWRpbyAuTkVUIDIwMDMgZG9lcyBub3Qgc3VwcG9ydCBTVEwgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgotICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIEdSRUFURVIgMTMxMCkgICMgMTMxMCBpcyBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwMwotICAgIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoCi0gICAgICBndGVzdF9jYXRjaF9leGNlcHRpb25zX25vX2V4X3Rlc3RfCi0gICAgICAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKLSAgICAgIGd0ZXN0X21haW5fbm9fZXhjZXB0aW9uCi0gICAgICB0ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MpCi0gIGVuZGlmKCkKLQotICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKAotICAgIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfZXhfdGVzdF8KLSAgICAiJHtjeHhfZXhjZXB0aW9ufSIKLSAgICBndGVzdF9tYWluCi0gICAgdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjKQotICBweV90ZXN0KGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdCkKLQotICBjeHhfZXhlY3V0YWJsZShndGVzdF9jb2xvcl90ZXN0XyB0ZXN0IGd0ZXN0KQotICBweV90ZXN0KGd0ZXN0X2NvbG9yX3Rlc3QpCi0KLSAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfZW52X3Zhcl90ZXN0XyB0ZXN0IGd0ZXN0KQotICBweV90ZXN0KGd0ZXN0X2Vudl92YXJfdGVzdCkKLQotICBjeHhfZXhlY3V0YWJsZShndGVzdF9maWx0ZXJfdW5pdHRlc3RfIHRlc3QgZ3Rlc3QpCi0gIHB5X3Rlc3QoZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0KQotCi0gIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2hlbHBfdGVzdF8gdGVzdCBndGVzdF9tYWluKQotICBweV90ZXN0KGd0ZXN0X2hlbHBfdGVzdCkKLQotICBjeHhfZXhlY3V0YWJsZShndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQotICBweV90ZXN0KGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3QpCi0KLSAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3Rfb3V0cHV0X3Rlc3RfIHRlc3QgZ3Rlc3QpCi0gIHB5X3Rlc3QoZ3Rlc3Rfb3V0cHV0X3Rlc3QpCi0KLSAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3Rfc2h1ZmZsZV90ZXN0XyB0ZXN0IGd0ZXN0KQotICBweV90ZXN0KGd0ZXN0X3NodWZmbGVfdGVzdCkKLQotICAjIE1TVkMgNy4xIGRvZXMgbm90IHN1cHBvcnQgU1RMIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4KLSAgaWYgKE5PVCBNU1ZDIE9SIE1TVkNfVkVSU0lPTiBHUkVBVEVSIDEzMTApCi0gICAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XyB0ZXN0IGd0ZXN0X25vX2V4Y2VwdGlvbikKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XwotICAgICAgUFJPUEVSVElFUwotICAgICAgQ09NUElMRV9GTEFHUyAiJHtjeHhfbm9fZXhjZXB0aW9ufSIpCi0gICAgcHlfdGVzdChndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3QpCi0gIGVuZGlmKCkKLQotICBjeHhfZXhlY3V0YWJsZShndGVzdF91bmluaXRpYWxpemVkX3Rlc3RfIHRlc3QgZ3Rlc3QpCi0gIHB5X3Rlc3QoZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0KQotCi0gIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3htbF9vdXRmaWxlMV90ZXN0XyB0ZXN0IGd0ZXN0X21haW4pCi0gIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyB0ZXN0IGd0ZXN0X21haW4pCi0gIHB5X3Rlc3QoZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QpCi0KLSAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8gdGVzdCBndGVzdCkKLSAgcHlfdGVzdChndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0KQotZW5kaWYoKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9DT05UUklCVVRPUlMgYi90ZXN0aW5nL2d0ZXN0L0NPTlRSSUJVVE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZTJmYy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L0NPTlRSSUJVVE9SUworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBwZW9wbGUgd2hvJ3ZlIG1hZGUgbm9uLXRyaXZpYWwKLSMgY29udHJpYnV0aW9uIHRvIHRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIHByb2plY3QuICBQZW9wbGUKLSMgd2hvIGNvbW1pdCBjb2RlIHRvIHRoZSBwcm9qZWN0IGFyZSBlbmNvdXJhZ2VkIHRvIGFkZCB0aGVpciBuYW1lcwotIyBoZXJlLiAgUGxlYXNlIGtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IGZpcnN0IG5hbWVzLgotCi1BamF5IEpvc2hpIDxqYWpAZ29vZ2xlLmNvbT4KLUJhbMOhenMgRMOhbiA8YmFsYXpzLmRhbkBnbWFpbC5jb20+Ci1CaGFyYXQgTWVkaXJhdHRhIDxiaGFyYXRAbWVuYWx0by5jb20+Ci1DaGFuZGxlciBDYXJydXRoIDxjaGFuZGxlcmNAZ29vZ2xlLmNvbT4KLUNocmlzIFByaW5jZSA8Y3ByaW5jZUBnb29nbGUuY29tPgotQ2hyaXMgVGF5bG9yIDx0YXlsb3JjQGdvb2dsZS5jb20+Ci1EYW4gRWdub3IgPGVnbm9yQGdvb2dsZS5jb20+Ci1FcmljIFJvbWFuIDxlcm9tYW5AY2hyb21pdW0ub3JnPgotSGFkeSBaYWxlayA8aGFkeS56YWxla0BnbWFpbC5jb20+Ci1KZWZmcmV5IFlhc3NraW4gPGp5YXNza2luQGdvb2dsZS5jb20+Ci1Kw7NpIFNpZ3Vyw7Bzc29uIDxqb2lAZ29vZ2xlLmNvbT4KLUtlaXIgTWllcmxlIDxtaWVybGVAZ21haWwuY29tPgotS2VpdGggUmF5IDxrZWl0aC5yYXlAZ21haWwuY29tPgotS2VudG9uIFZhcmRhIDxrZW50b25AZ29vZ2xlLmNvbT4KLU1hbnVlbCBLbGltZWsgPGtsaW1la0Bnb29nbGUuY29tPgotTWFya3VzIEhldWxlIDxtYXJrdXMuaGV1bGVAZ21haWwuY29tPgotTWlrYSBSYWVudG8gPG1pa2llQGlraS5maT4KLU1pa2zDs3MgRmF6ZWthcyA8bWZhemVrYXNAc3plbWFmb3IuY29tPgotUGFzaSBWYWxtaW5lbiA8cGFzaS52YWxtaW5lbkBnbWFpbC5jb20+Ci1QYXRyaWNrIEhhbm5hIDxwaGFubmFAZ29vZ2xlLmNvbT4KLVBhdHJpY2sgUmlsZXkgPHBmckBnb29nbGUuY29tPgotUGV0ZXIgS2FtaW5za2kgPHBpb3Rya0Bnb29nbGUuY29tPgotUHJlc3RvbiBKYWNrc29uIDxwcmVzdG9uLmEuamFja3NvbkBnbWFpbC5jb20+Ci1SYWluZXIgS2xhZmZlbmJvZWNrIDxyYWluZXIua2xhZmZlbmJvZWNrQGR5bmF0cmFjZS5jb20+Ci1SdXNzIENveCA8cnNjQGdvb2dsZS5jb20+Ci1SdXNzIFJ1ZmVyIDxydXNzQHBlbnRhZC5jb20+Ci1TZWFuIE1jYWZlZSA8ZWVmYWNtQGdtYWlsLmNvbT4KLVNpZ3Vyw7B1ciDDgXNnZWlyc3NvbiA8c2lnZ2lAZ29vZ2xlLmNvbT4KLVRyYWN5IEJpYWxpayA8dHJhY3lAcGVudGFkLmNvbT4KLVZhZGltIEJlcm1hbiA8dmFkaW1iQGdvb2dsZS5jb20+Ci1WbGFkIExvc2V2IDx2bGFkbEBnb29nbGUuY29tPgotWmhhbnlvbmcgV2FuIDx3YW5AZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvTElDRU5TRSBiL3Rlc3RpbmcvZ3Rlc3QvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0MWExMS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1Db3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLXRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L01FVEFEQVRBIGIvdGVzdGluZy9ndGVzdC9NRVRBREFUQQppbmRleCBmYmI4ZDU5Li5lYjZiYzA1IDEwMDY0NAotLS0gYS90ZXN0aW5nL2d0ZXN0L01FVEFEQVRBCisrKyBiL3Rlc3RpbmcvZ3Rlc3QvTUVUQURBVEEKQEAgLTEsMTYgKzEsMTYgQEAKLW5hbWU6ICJndGVzdCIKK25hbWU6ICJ0ZXN0aW5nL2d0ZXN0IgogZGVzY3JpcHRpb246Ci0gICJTdWJ0cmVlIGF0IHRlc3RpbmcvZ3Rlc3QuIgorICAiQ29weSBvZiB0ZXN0aW5nL2d0ZXN0IGZyb20gQ2hyb21pdW0gYnJhbmNoLWhlYWRzLzU3MzUiCiAKIHRoaXJkX3BhcnR5IHsKICAgdXJsIHsKICAgICB0eXBlOiBHSVQKLSAgICB2YWx1ZTogImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvdGhpcmRfcGFydHkvZ29vZ2xldGVzdCIKKyAgICB2YWx1ZTogImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiCiAgIH0KLSAgdmVyc2lvbjogImExYzRiNDZiYzJjMTJlYTdjNjExMDhmMDAxYTViNWViNGE4Y2NhZDAiCisgIHZlcnNpb246ICI1Y2Q2YTM0ZDA1OTQ2M2QyYmY3YzIwOTBkMTkwNGU1MjdjMzQyOGIyIgogICBsYXN0X3VwZ3JhZGVfZGF0ZSB7Ci0gICAgeWVhcjogMjAxMgotICAgIG1vbnRoOiA3Ci0gICAgZGF5OiA5CisgICAgeWVhcjogMjAyMworICAgIG1vbnRoOiA2CisgICAgZGF5OiAxNgogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L01ha2VmaWxlLmFtIGIvdGVzdGluZy9ndGVzdC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5NmI0Mi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLSMgQXV0b21ha2UgZmlsZQotCi1BQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAotCi0jIE5vbnN0YW5kYXJkIHBhY2thZ2UgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbgotRVhUUkFfRElTVCA9IFwKLSAgQ0hBTkdFUyBcCi0gIENPTlRSSUJVVE9SUyBcCi0gIExJQ0VOU0UgXAotICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wIFwKLSAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAgXAotICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcCBcCi0gIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBcCi0gIG1ha2UvTWFrZWZpbGUgXAotICBzY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkgXAotICBzY3JpcHRzL2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgXAotICBzY3JpcHRzL3B1bXAucHkgXAotICBzY3JpcHRzL3Rlc3QvTWFrZWZpbGUKLQotIyBndGVzdCBzb3VyY2UgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlIGRpcmVjdGx5LiAgVGhleSBhcmUKLSMgI2luY2x1ZGVkIGJ5IGd0ZXN0LWFsbC5jYy4KLUdURVNUX1NSQyA9IFwKLSAgc3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MgXAotICBzcmMvZ3Rlc3QtZmlsZXBhdGguY2MgXAotICBzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmggXAotICBzcmMvZ3Rlc3QtcG9ydC5jYyBcCi0gIHNyYy9ndGVzdC1wcmludGVycy5jYyBcCi0gIHNyYy9ndGVzdC10ZXN0LXBhcnQuY2MgXAotICBzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyBcCi0gIHNyYy9ndGVzdC5jYwotCi1FWFRSQV9ESVNUICs9ICQoR1RFU1RfU1JDKQotCi0jIFNhbXBsZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUuCi1FWFRSQV9ESVNUICs9IFwKLSAgc2FtcGxlcy9wcmltZV90YWJsZXMuaCBcCi0gIHNhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYwotCi0jIEMrKyB0ZXN0IGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZSBkaXJlY3RseS4KLUVYVFJBX0RJU1QgKz0gXAotICB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmggXAotICB0ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3RfcHJlbWF0dXJlX2V4aXRfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmggXAotICB0ZXN0L2d0ZXN0LXVuaXR0ZXN0LWFwaV90ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYyBcCi0gIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYyBcCi0gIHRlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MgXAotICB0ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdF8uY2MgXAotICB0ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MgXAotICB0ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MgXAotICB0ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfLmNjIFwKLSAgdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdF9ub190ZXN0X3VuaXR0ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgXAotICB0ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3RfcHJvZF90ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdF9yZXBlYXRfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0Xy5jYyBcCi0gIHRlc3QvZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MgXAotICB0ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYyBcCi0gIHRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0Xy5jYyBcCi0gIHRlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYyBcCi0gIHRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MgXAotICB0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIFwKLSAgdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8uY2MgXAotICB0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBcCi0gIHRlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2MgXAotICB0ZXN0L3Byb2R1Y3Rpb24uY2MgXAotICB0ZXN0L3Byb2R1Y3Rpb24uaAotCi0jIFB5dGhvbiB0ZXN0cyB0aGF0IHdlIGRvbid0IHJ1bi4KLUVYVFJBX0RJU1QgKz0gXAotICB0ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkgXAotICB0ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3RfY29sb3JfdGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0LnB5IFwKLSAgdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkgXAotICB0ZXN0L2d0ZXN0X2hlbHBfdGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgXAotICB0ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0IFwKLSAgdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkgXAotICB0ZXN0L2d0ZXN0X3Rlc3RfdXRpbHMucHkgXAotICB0ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5IFwKLSAgdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdC5weSBcCi0gIHRlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkKLQotIyBDTWFrZSBzY3JpcHQKLUVYVFJBX0RJU1QgKz0gXAotICBDTWFrZUxpc3RzLnR4dCBcCi0gIGNtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlCi0KLSMgTVNWQyBwcm9qZWN0IGZpbGVzCi1FWFRSQV9ESVNUICs9IFwKLSAgbXN2Yy9ndGVzdC1tZC5zbG4gXAotICBtc3ZjL2d0ZXN0LW1kLnZjcHJvaiBcCi0gIG1zdmMvZ3Rlc3Quc2xuIFwKLSAgbXN2Yy9ndGVzdC52Y3Byb2ogXAotICBtc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qIFwKLSAgbXN2Yy9ndGVzdF9tYWluLnZjcHJvaiBcCi0gIG1zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvaiBcCi0gIG1zdmMvZ3Rlc3RfcHJvZF90ZXN0LnZjcHJvaiBcCi0gIG1zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIFwKLSAgbXN2Yy9ndGVzdF91bml0dGVzdC52Y3Byb2oKLQotIyB4Y29kZSBwcm9qZWN0IGZpbGVzCi1FWFRSQV9ESVNUICs9IFwKLSAgeGNvZGUvQ29uZmlnL0RlYnVnUHJvamVjdC54Y2NvbmZpZyBcCi0gIHhjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcgXAotICB4Y29kZS9Db25maWcvR2VuZXJhbC54Y2NvbmZpZyBcCi0gIHhjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZyBcCi0gIHhjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnIFwKLSAgeGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcgXAotICB4Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdCBcCi0gIHhjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2ggXAotICB4Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weSBcCi0gIHhjb2RlL2d0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKLQotIyB4Y29kZSBzYW1wbGUgZmlsZXMKLUVYVFJBX0RJU1QgKz0gXAotICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0IFwKLSAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvV2lkZ2V0RnJhbWV3b3JrLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogXAotICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaCBcCi0gIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYyBcCi0gIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5oIFwKLSAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0X3Rlc3QuY2MKLQotIyBDKytCdWlsZGVyIHByb2plY3QgZmlsZXMKLUVYVFJBX0RJU1QgKz0gXAotICBjb2RlZ2Vhci9ndGVzdC5jYnByb2ogXAotICBjb2RlZ2Vhci9ndGVzdC5ncm91cHByb2ogXAotICBjb2RlZ2Vhci9ndGVzdF9hbGwuY2MgXAotICBjb2RlZ2Vhci9ndGVzdF9saW5rLmNjIFwKLSAgY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2ogXAotICBjb2RlZ2Vhci9ndGVzdF91bml0dGVzdC5jYnByb2oKLQotIyBEaXN0cmlidXRlIGFuZCBpbnN0YWxsIE00IG1hY3JvCi1tNGRhdGFkaXIgPSAkKGRhdGFkaXIpL2FjbG9jYWwKLW00ZGF0YV9EQVRBID0gbTQvZ3Rlc3QubTQKLUVYVFJBX0RJU1QgKz0gJChtNGRhdGFfREFUQSkKLQotIyBXZSBkZWZpbmUgdGhlIGdsb2JhbCBBTV9DUFBGTEFHUyBhcyBldmVyeXRoaW5nIHdlIGNvbXBpbGUgaW5jbHVkZXMgZnJvbSB0aGVzZQotIyBkaXJlY3Rvcmllcy4KLUFNX0NQUEZMQUdTID0gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvaW5jbHVkZQotCi0jIE1vZGlmaWVzIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgZm9yIHB0aHJlYWRzIGNvbXBhdGliaWxpdHkuCi1pZiBIQVZFX1BUSFJFQURTCi0gIEFNX0NYWEZMQUdTID0gQFBUSFJFQURfQ0ZMQUdTQCAtREdURVNUX0hBU19QVEhSRUFEPTEKLSAgQU1fTElCUyA9IEBQVEhSRUFEX0xJQlNACi1lbHNlCi0gIEFNX0NYWEZMQUdTID0gLURHVEVTVF9IQVNfUFRIUkVBRD0wCi1lbmRpZgotCi0jIEJ1aWxkIHJ1bGVzIGZvciBsaWJyYXJpZXMuCi1saWJfTFRMSUJSQVJJRVMgPSBsaWIvbGliZ3Rlc3QubGEgbGliL2xpYmd0ZXN0X21haW4ubGEKLQotbGliX2xpYmd0ZXN0X2xhX1NPVVJDRVMgPSBzcmMvZ3Rlc3QtYWxsLmNjCi0KLXBrZ2luY2x1ZGVfSEVBREVSUyA9IFwKLSAgaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmggXAotICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIFwKLSAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oIFwKLSAgaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmggXAotICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmggXAotICBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaAotCi1wa2dpbmNsdWRlX2ludGVybmFsZGlyID0gJChwa2dpbmNsdWRlZGlyKS9pbnRlcm5hbAotcGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTID0gXAotICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIFwKLSAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIFwKLSAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmggXAotICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCBcCi0gIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmggXAotICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmggXAotICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oCi0KLWxpYl9saWJndGVzdF9tYWluX2xhX1NPVVJDRVMgPSBzcmMvZ3Rlc3RfbWFpbi5jYwotbGliX2xpYmd0ZXN0X21haW5fbGFfTElCQUREID0gbGliL2xpYmd0ZXN0LmxhCi0KLSMgQnVsaWQgcnVsZXMgZm9yIHNhbXBsZXMgYW5kIHRlc3RzLiBBdXRvbWFrZSdzIG5hbWluZyBmb3Igc29tZSBvZgotIyB0aGVzZSB2YXJpYWJsZXMgaXNuJ3QgdGVycmlibHkgb2J2aW91cywgc28gdGhpcyBpcyBhIGJyaWVmCi0jIHJlZmVyZW5jZToKLSMKLSMgVEVTVFMgLS0gUHJvZ3JhbXMgcnVuIGF1dG9tYXRpY2FsbHkgYnkgIm1ha2UgY2hlY2siCi0jIGNoZWNrX1BST0dSQU1TIC0tIFByb2dyYW1zIGJ1aWx0IGJ5ICJtYWtlIGNoZWNrIiBidXQgbm90IG5lY2Vzc2FyaWx5IHJ1bgotCi1ub2luc3RfTFRMSUJSQVJJRVMgPSBzYW1wbGVzL2xpYnNhbXBsZXMubGEKLQotc2FtcGxlc19saWJzYW1wbGVzX2xhX1NPVVJDRVMgPSBcCi0gIHNhbXBsZXMvc2FtcGxlMS5jYyBcCi0gIHNhbXBsZXMvc2FtcGxlMS5oIFwKLSAgc2FtcGxlcy9zYW1wbGUyLmNjIFwKLSAgc2FtcGxlcy9zYW1wbGUyLmggXAotICBzYW1wbGVzL3NhbXBsZTMtaW5sLmggXAotICBzYW1wbGVzL3NhbXBsZTQuY2MgXAotICBzYW1wbGVzL3NhbXBsZTQuaAotCi1URVNUUz0KLVRFU1RTX0VOVklST05NRU5UID0gR1RFU1RfU09VUkNFX0RJUj0iJChzcmNkaXIpL3Rlc3QiIFwKLSAgICAgICAgICAgICAgICAgICAgR1RFU1RfQlVJTERfRElSPSIkKHRvcF9idWlsZGRpcikvdGVzdCIKLWNoZWNrX1BST0dSQU1TPQotCi0jIEEgc2ltcGxlIHNhbXBsZSBvbiB1c2luZyBndGVzdC4KLVRFU1RTICs9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdAotY2hlY2tfUFJPR1JBTVMgKz0gc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0Ci1zYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfU09VUkNFUyA9IHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwotc2FtcGxlc19zYW1wbGUxX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliL2xpYmd0ZXN0LmxhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvbGlic2FtcGxlcy5sYQotCi0jIEFub3RoZXIgc2FtcGxlLiAgSXQgYWxzbyB2ZXJpZmllcyB0aGF0IGxpYmd0ZXN0IHdvcmtzLgotVEVTVFMgKz0gc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdAotY2hlY2tfUFJPR1JBTVMgKz0gc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdAotc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9TT1VSQ0VTID0gc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYwotc2FtcGxlc19zYW1wbGUxMF91bml0dGVzdF9MREFERCA9IGxpYi9saWJndGVzdC5sYQotCi0jIFRoaXMgdGVzdHMgbW9zdCBjb25zdHJ1Y3RzIG9mIGd0ZXN0IGFuZCB2ZXJpZmllcyB0aGF0IGxpYmd0ZXN0X21haW4KLSMgYW5kIGxpYmd0ZXN0IHdvcmsuCi1URVNUUyArPSB0ZXN0L2d0ZXN0X2FsbF90ZXN0Ci1jaGVja19QUk9HUkFNUyArPSB0ZXN0L2d0ZXN0X2FsbF90ZXN0Ci10ZXN0X2d0ZXN0X2FsbF90ZXN0X1NPVVJDRVMgPSB0ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCi10ZXN0X2d0ZXN0X2FsbF90ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0X21haW4ubGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYi9saWJndGVzdC5sYQotCi0jIFRlc3RzIHRoYXQgZnVzZWQgZ3Rlc3QgZmlsZXMgY29tcGlsZSBhbmQgd29yay4KLUZVU0VEX0dURVNUX1NSQyA9IFwKLSAgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyBcCi0gIGZ1c2VkLXNyYy9ndGVzdC9ndGVzdC5oIFwKLSAgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0X21haW4uY2MKLQotaWYgSEFWRV9QWVRIT04KLVRFU1RTICs9IHRlc3QvZnVzZWRfZ3Rlc3RfdGVzdAotY2hlY2tfUFJPR1JBTVMgKz0gdGVzdC9mdXNlZF9ndGVzdF90ZXN0Ci10ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUyA9ICQoRlVTRURfR1RFU1RfU1JDKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvc2FtcGxlMS5jYyBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKLXRlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9DUFBGTEFHUyA9IC1JIiQoc3JjZGlyKS9mdXNlZC1zcmMiCi0KLSMgQnVpbGQgcnVsZXMgZm9yIHB1dHRpbmcgZnVzZWQgR29vZ2xlIFRlc3QgZmlsZXMgaW50byB0aGUgZGlzdHJpYnV0aW9uCi0jIHBhY2thZ2UuIFRoZSB1c2VyIGNhbiBhbHNvIGNyZWF0ZSB0aG9zZSBmaWxlcyBieSBtYW51YWxseSBydW5uaW5nCi0jIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weS4KLSQodGVzdF9mdXNlZF9ndGVzdF90ZXN0X1NPVVJDRVMpOiBmdXNlZC1ndGVzdAotCi1mdXNlZC1ndGVzdDogJChwa2dpbmNsdWRlX0hFQURFUlMpICQocGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTKSBcCi0gICAgICAgICAgICAgJChHVEVTVF9TUkMpIHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MgXAotICAgICAgICAgICAgIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weQotCW1rZGlyIC1wICIkKHNyY2RpcikvZnVzZWQtc3JjIgotCWNobW9kIC1SIHUrdyAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKLQlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC1hbGwuY2MiCi0Jcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCIKLQkiJChzcmNkaXIpL3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSIgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCi0JY3AgLWYgIiQoc3JjZGlyKS9zcmMvZ3Rlc3RfbWFpbi5jYyIgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ3Rlc3QvIgotCi1tYWludGFpbmVyLWNsZWFuLWxvY2FsOgotCXJtIC1yZiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKLWVuZGlmCi0KLSMgRGVhdGggdGVzdHMgbWF5IHByb2R1Y2UgY29yZSBkdW1wcyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LiBJbiBjYXNlCi0jIHRoaXMgaGFwcGVucywgY2xlYW4gdGhlbSB0byBrZWVwIGRpc3RjbGVhbmNoZWNrIGhhcHB5LgotQ0xFQU5GSUxFUyA9IGNvcmUKLQotIyBEaXNhYmxlcyAnbWFrZSBpbnN0YWxsJyBhcyBpbnN0YWxsaW5nIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBHb29nbGUKLSMgVGVzdCBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IgZHVlIHRvIHZpb2xhdGlvbiBvZiB0aGUKLSMgT25lLURlZmluaXRpb24gUnVsZS4KLQotaW5zdGFsbC1leGVjLWxvY2FsOgotCWVjaG8gIidtYWtlIGluc3RhbGwnIGlzIGRhbmdlcm91cyBhbmQgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgc2VlIFJFQURNRSBmb3IgaG93IHRvIGludGVncmF0ZSBHb29nbGUgVGVzdCBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiIKLQlmYWxzZQotCi1pbnN0YWxsLWRhdGEtbG9jYWw6Ci0JZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0IGludG8geW91ciBidWlsZCBzeXN0ZW0uIgotCWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L09XTkVSUyBiL3Rlc3RpbmcvZ3Rlc3QvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhN2JlYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2d0ZXN0L09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK3RoYWtpc0BjaHJvbWl1bS5vcmcKK2FzdWxseUBjaHJvbWl1bS5vcmcKK2F5dWlAY2hyb21pdW0ub3JnCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L1JFQURNRSBiL3Rlc3RpbmcvZ3Rlc3QvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRiZjNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLUdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvCi0KLU92ZXJ2aWV3Ci0tLS0tLS0tLQotCi1Hb29nbGUncyBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIHRlc3RzIG9uIGEgdmFyaWV0eSBvZiBwbGF0Zm9ybXMKLShMaW51eCwgTWFjIE9TIFgsIFdpbmRvd3MsIFdpbmRvd3MgQ0UsIFN5bWJpYW4sIGV0YykuICBCYXNlZCBvbiB0aGUKLXhVbml0IGFyY2hpdGVjdHVyZS4gIFN1cHBvcnRzIGF1dG9tYXRpYyB0ZXN0IGRpc2NvdmVyeSwgYSByaWNoIHNldCBvZgotYXNzZXJ0aW9ucywgdXNlci1kZWZpbmVkIGFzc2VydGlvbnMsIGRlYXRoIHRlc3RzLCBmYXRhbCBhbmQgbm9uLWZhdGFsCi1mYWlsdXJlcywgdmFyaW91cyBvcHRpb25zIGZvciBydW5uaW5nIHRoZSB0ZXN0cywgYW5kIFhNTCB0ZXN0IHJlcG9ydAotZ2VuZXJhdGlvbi4KLQotUGxlYXNlIHNlZSB0aGUgcHJvamVjdCBwYWdlIGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgdGhlCi1tYWlsaW5nIGxpc3QgZm9yIHF1ZXN0aW9ucywgZGlzY3Vzc2lvbnMsIGFuZCBkZXZlbG9wbWVudC4gIFRoZXJlIGlzCi1hbHNvIGFuIElSQyBjaGFubmVsIG9uIE9GVEMgKGlyYy5vZnRjLm5ldCkgI2d0ZXN0IGF2YWlsYWJsZS4gIFBsZWFzZQotam9pbiB1cyEKLQotUmVxdWlyZW1lbnRzIGZvciBFbmQgVXNlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdvb2dsZSBUZXN0IGlzIGRlc2lnbmVkIHRvIGhhdmUgZmFpcmx5IG1pbmltYWwgcmVxdWlyZW1lbnRzIHRvIGJ1aWxkCi1hbmQgdXNlIHdpdGggeW91ciBwcm9qZWN0cywgYnV0IHRoZXJlIGFyZSBzb21lLiAgQ3VycmVudGx5LCB3ZSBzdXBwb3J0Ci1MaW51eCwgV2luZG93cywgTWFjIE9TIFgsIGFuZCBDeWd3aW4uICBXZSB3aWxsIGFsc28gbWFrZSBvdXIgYmVzdAotZWZmb3J0IHRvIHN1cHBvcnQgb3RoZXIgcGxhdGZvcm1zIChlLmcuIFNvbGFyaXMsIEFJWCwgYW5kIHovT1MpLgotSG93ZXZlciwgc2luY2UgY29yZSBtZW1iZXJzIG9mIHRoZSBHb29nbGUgVGVzdCBwcm9qZWN0IGhhdmUgbm8gYWNjZXNzCi10byB0aGVzZSBwbGF0Zm9ybXMsIEdvb2dsZSBUZXN0IG1heSBoYXZlIG91dHN0YW5kaW5nIGlzc3VlcyB0aGVyZS4gIElmCi15b3Ugbm90aWNlIGFueSBwcm9ibGVtcyBvbiB5b3VyIHBsYXRmb3JtLCBwbGVhc2Ugbm90aWZ5Ci1nb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20uICBQYXRjaGVzIGZvciBmaXhpbmcgdGhlbSBhcmUKLWV2ZW4gbW9yZSB3ZWxjb21lIQotCi0jIyMgTGludXggUmVxdWlyZW1lbnRzICMjIwotCi1UaGVzZSBhcmUgdGhlIGJhc2UgcmVxdWlyZW1lbnRzIHRvIGJ1aWxkIGFuZCB1c2UgR29vZ2xlIFRlc3QgZnJvbSBhIHNvdXJjZQotcGFja2FnZSAoYXMgZGVzY3JpYmVkIGJlbG93KToKLSAgKiBHTlUtY29tcGF0aWJsZSBNYWtlIG9yIGdtYWtlCi0gICogUE9TSVgtc3RhbmRhcmQgc2hlbGwKLSAgKiBQT1NJWCgtMikgUmVndWxhciBFeHByZXNzaW9ucyAocmVnZXguaCkKLSAgKiBBIEMrKzk4LXN0YW5kYXJkLWNvbXBsaWFudCBjb21waWxlcgotCi0jIyMgV2luZG93cyBSZXF1aXJlbWVudHMgIyMjCi0KLSAgKiBNaWNyb3NvZnQgVmlzdWFsIEMrKyA3LjEgb3IgbmV3ZXIKLQotIyMjIEN5Z3dpbiBSZXF1aXJlbWVudHMgIyMjCi0KLSAgKiBDeWd3aW4gMS41LjI1LTE0IG9yIG5ld2VyCi0KLSMjIyBNYWMgT1MgWCBSZXF1aXJlbWVudHMgIyMjCi0KLSAgKiBNYWMgT1MgWCAxMC40IFRpZ2VyIG9yIG5ld2VyCi0gICogRGV2ZWxvcGVyIFRvb2xzIEluc3RhbGxlZAotCi1BbHNvLCB5b3UnbGwgbmVlZCBDTWFrZSAyLjYuNCBvciBoaWdoZXIgaWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlCi1zYW1wbGVzIHVzaW5nIHRoZSBwcm92aWRlZCBDTWFrZSBzY3JpcHQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtLgotCi1SZXF1aXJlbWVudHMgZm9yIENvbnRyaWJ1dG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2Ugd2VsY29tZSBwYXRjaGVzLiAgSWYgeW91IHBsYW4gdG8gY29udHJpYnV0ZSBhIHBhdGNoLCB5b3UgbmVlZCB0bwotYnVpbGQgR29vZ2xlIFRlc3QgYW5kIGl0cyBvd24gdGVzdHMgZnJvbSBhbiBTVk4gY2hlY2tvdXQgKGRlc2NyaWJlZAotYmVsb3cpLCB3aGljaCBoYXMgZnVydGhlciByZXF1aXJlbWVudHM6Ci0KLSAgKiBQeXRob24gdmVyc2lvbiAyLjMgb3IgbmV3ZXIgKGZvciBydW5uaW5nIHNvbWUgb2YgdGhlIHRlc3RzIGFuZAotICAgIHJlLWdlbmVyYXRpbmcgY2VydGFpbiBzb3VyY2UgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMpCi0gICogQ01ha2UgMi42LjQgb3IgbmV3ZXIKLQotR2V0dGluZyB0aGUgU291cmNlCi0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlcmUgYXJlIHR3byBwcmltYXJ5IHdheXMgb2YgZ2V0dGluZyBHb29nbGUgVGVzdCdzIHNvdXJjZSBjb2RlOiB5b3UKLWNhbiBkb3dubG9hZCBhIHN0YWJsZSBzb3VyY2UgcmVsZWFzZSBpbiB5b3VyIHByZWZlcnJlZCBhcmNoaXZlIGZvcm1hdCwKLW9yIGRpcmVjdGx5IGNoZWNrIG91dCB0aGUgc291cmNlIGZyb20gb3VyIFN1YnZlcnNpb24gKFNWTikgcmVwb3NpdG9yeS4KLVRoZSBTVk4gY2hlY2tvdXQgcmVxdWlyZXMgYSBmZXcgZXh0cmEgc3RlcHMgYW5kIHNvbWUgZXh0cmEgc29mdHdhcmUKLXBhY2thZ2VzIG9uIHlvdXIgc3lzdGVtLCBidXQgbGV0cyB5b3UgdHJhY2sgdGhlIGxhdGVzdCBkZXZlbG9wbWVudCBhbmQKLW1ha2UgcGF0Y2hlcyBtdWNoIG1vcmUgZWFzaWx5LCBzbyB3ZSBoaWdobHkgZW5jb3VyYWdlIGl0LgotCi0jIyMgU291cmNlIFBhY2thZ2UgIyMjCi0KLUdvb2dsZSBUZXN0IGlzIHJlbGVhc2VkIGluIHZlcnNpb25lZCBzb3VyY2UgcGFja2FnZXMgd2hpY2ggY2FuIGJlCi1kb3dubG9hZGVkIGZyb20gdGhlIGRvd25sb2FkIHBhZ2UgWzFdLiAgU2V2ZXJhbCBkaWZmZXJlbnQgYXJjaGl2ZQotZm9ybWF0cyBhcmUgcHJvdmlkZWQsIGJ1dCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSB0b29scyB1c2VkIHRvCi1tYW5pcHVsYXRlIHRoZW0sIGFuZCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGZpbGUuICBEb3dubG9hZAotd2hpY2hldmVyIHlvdSBhcmUgbW9zdCBjb21mb3J0YWJsZSB3aXRoLgotCi0gIFsxXSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9kb3dubG9hZHMvbGlzdAotCi1PbmNlIHRoZSBwYWNrYWdlIGlzIGRvd25sb2FkZWQsIGV4cGFuZCBpdCB1c2luZyB3aGljaGV2ZXIgdG9vbHMgeW91Ci1wcmVmZXIgZm9yIHRoYXQgdHlwZS4gIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBuZXcgZGlyZWN0b3J5IHdpdGggdGhlCi1uYW1lICJndGVzdC1YLlkuWiIgd2hpY2ggY29udGFpbnMgYWxsIG9mIHRoZSBzb3VyY2UgY29kZS4gIEhlcmUgYXJlCi1zb21lIGV4YW1wbGVzIG9uIExpbnV4OgotCi0gIHRhciAteHZ6ZiBndGVzdC1YLlkuWi50YXIuZ3oKLSAgdGFyIC14dmpmIGd0ZXN0LVguWS5aLnRhci5iejIKLSAgdW56aXAgZ3Rlc3QtWC5ZLlouemlwCi0KLSMjIyBTVk4gQ2hlY2tvdXQgIyMjCi0KLVRvIGNoZWNrIG91dCB0aGUgbWFpbiBicmFuY2ggKGFsc28ga25vd24gYXMgdGhlICJ0cnVuayIpIG9mIEdvb2dsZQotVGVzdCwgcnVuIHRoZSBmb2xsb3dpbmcgU3VidmVyc2lvbiBjb21tYW5kOgotCi0gIHN2biBjaGVja291dCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvIGd0ZXN0LXN2bgotCi1TZXR0aW5nIHVwIHRoZSBCdWlsZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gYnVpbGQgR29vZ2xlIFRlc3QgYW5kIHlvdXIgdGVzdHMgdGhhdCB1c2UgaXQsIHlvdSBuZWVkIHRvIHRlbGwgeW91cgotYnVpbGQgc3lzdGVtIHdoZXJlIHRvIGZpbmQgaXRzIGhlYWRlcnMgYW5kIHNvdXJjZSBmaWxlcy4gIFRoZSBleGFjdAotd2F5IHRvIGRvIGl0IGRlcGVuZHMgb24gd2hpY2ggYnVpbGQgc3lzdGVtIHlvdSB1c2UsIGFuZCBpcyB1c3VhbGx5Ci1zdHJhaWdodGZvcndhcmQuCi0KLSMjIyBHZW5lcmljIEJ1aWxkIEluc3RydWN0aW9ucyAjIyMKLQotU3VwcG9zZSB5b3UgcHV0IEdvb2dsZSBUZXN0IGluIGRpcmVjdG9yeSAke0dURVNUX0RJUn0uICBUbyBidWlsZCBpdCwKLWNyZWF0ZSBhIGxpYnJhcnkgYnVpbGQgdGFyZ2V0IChvciBhIHByb2plY3QgYXMgY2FsbGVkIGJ5IFZpc3VhbCBTdHVkaW8KLWFuZCBYY29kZSkgdG8gY29tcGlsZQotCi0gICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCi0KLXdpdGggJHtHVEVTVF9ESVJ9L2luY2x1ZGUgaW4gdGhlIHN5c3RlbSBoZWFkZXIgc2VhcmNoIHBhdGggYW5kICR7R1RFU1RfRElSfQotaW4gdGhlIG5vcm1hbCBoZWFkZXIgc2VhcmNoIHBhdGguICBBc3N1bWluZyBhIExpbnV4LWxpa2Ugc3lzdGVtIGFuZCBnY2MsCi1zb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHdpbGwgZG86Ci0KLSAgZysrIC1pc3lzdGVtICR7R1RFU1RfRElSfS9pbmNsdWRlIC1JJHtHVEVTVF9ESVJ9IFwKLSAgICAgIC1wdGhyZWFkIC1jICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCi0gIGFyIC1ydiBsaWJndGVzdC5hIGd0ZXN0LWFsbC5vCi0KLShXZSBuZWVkIC1wdGhyZWFkIGFzIEdvb2dsZSBUZXN0IHVzZXMgdGhyZWFkcy4pCi0KLU5leHQsIHlvdSBzaG91bGQgY29tcGlsZSB5b3VyIHRlc3Qgc291cmNlIGZpbGUgd2l0aAotJHtHVEVTVF9ESVJ9L2luY2x1ZGUgaW4gdGhlIHN5c3RlbSBoZWFkZXIgc2VhcmNoIHBhdGgsIGFuZCBsaW5rIGl0Ci13aXRoIGd0ZXN0IGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5IGxpYnJhcmllczoKLQotICBnKysgLWlzeXN0ZW0gJHtHVEVTVF9ESVJ9L2luY2x1ZGUgLXB0aHJlYWQgcGF0aC90by95b3VyX3Rlc3QuY2MgbGliZ3Rlc3QuYSBcCi0gICAgICAtbyB5b3VyX3Rlc3QKLQotQXMgYW4gZXhhbXBsZSwgdGhlIG1ha2UvIGRpcmVjdG9yeSBjb250YWlucyBhIE1ha2VmaWxlIHRoYXQgeW91IGNhbgotdXNlIHRvIGJ1aWxkIEdvb2dsZSBUZXN0IG9uIHN5c3RlbXMgd2hlcmUgR05VIG1ha2UgaXMgYXZhaWxhYmxlCi0oZS5nLiBMaW51eCwgTWFjIE9TIFgsIGFuZCBDeWd3aW4pLiAgSXQgZG9lc24ndCB0cnkgdG8gYnVpbGQgR29vZ2xlCi1UZXN0J3Mgb3duIHRlc3RzLiAgSW5zdGVhZCwgaXQganVzdCBidWlsZHMgdGhlIEdvb2dsZSBUZXN0IGxpYnJhcnkgYW5kCi1hIHNhbXBsZSB0ZXN0LiAgWW91IGNhbiB1c2UgaXQgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBvd24gYnVpbGQKLXNjcmlwdC4KLQotSWYgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlIGNvcnJlY3QgZm9yIHlvdXIgZW52aXJvbm1lbnQsIHRoZQotZm9sbG93aW5nIGNvbW1hbmRzIHNob3VsZCBzdWNjZWVkOgotCi0gIGNkICR7R1RFU1RfRElSfS9tYWtlCi0gIG1ha2UKLSAgLi9zYW1wbGUxX3VuaXR0ZXN0Ci0KLUlmIHlvdSBzZWUgZXJyb3JzLCB0cnkgdG8gdHdlYWsgdGhlIGNvbnRlbnRzIG9mIG1ha2UvTWFrZWZpbGUgdG8gbWFrZQotdGhlbSBnbyBhd2F5LiAgVGhlcmUgYXJlIGluc3RydWN0aW9ucyBpbiBtYWtlL01ha2VmaWxlIG9uIGhvdyB0byBkbwotaXQuCi0KLSMjIyBVc2luZyBDTWFrZSAjIyMKLQotR29vZ2xlIFRlc3QgY29tZXMgd2l0aCBhIENNYWtlIGJ1aWxkIHNjcmlwdCAoQ01ha2VMaXN0cy50eHQpIHRoYXQgY2FuCi1iZSB1c2VkIG9uIGEgd2lkZSByYW5nZSBvZiBwbGF0Zm9ybXMgKCJDIiBzdGFuZHMgZm9yIGNyb3NzLXBsYXRmb3JtLikuCi1JZiB5b3UgZG9uJ3QgaGF2ZSBDTWFrZSBpbnN0YWxsZWQgYWxyZWFkeSwgeW91IGNhbiBkb3dubG9hZCBpdCBmb3IKLWZyZWUgZnJvbSBodHRwOi8vd3d3LmNtYWtlLm9yZy8uCi0KLUNNYWtlIHdvcmtzIGJ5IGdlbmVyYXRpbmcgbmF0aXZlIG1ha2VmaWxlcyBvciBidWlsZCBwcm9qZWN0cyB0aGF0IGNhbgotYmUgdXNlZCBpbiB0aGUgY29tcGlsZXIgZW52aXJvbm1lbnQgb2YgeW91ciBjaG9pY2UuICBUaGUgdHlwaWNhbAotd29ya2Zsb3cgc3RhcnRzIHdpdGg6Ci0KLSAgbWtkaXIgbXlidWlsZCAgICAgICAjIENyZWF0ZSBhIGRpcmVjdG9yeSB0byBob2xkIHRoZSBidWlsZCBvdXRwdXQuCi0gIGNkIG15YnVpbGQKLSAgY21ha2UgJHtHVEVTVF9ESVJ9ICAjIEdlbmVyYXRlIG5hdGl2ZSBidWlsZCBzY3JpcHRzLgotCi1JZiB5b3Ugd2FudCB0byBidWlsZCBHb29nbGUgVGVzdCdzIHNhbXBsZXMsIHlvdSBzaG91bGQgcmVwbGFjZSB0aGUKLWxhc3QgY29tbWFuZCB3aXRoCi0KLSAgY21ha2UgLURndGVzdF9idWlsZF9zYW1wbGVzPU9OICR7R1RFU1RfRElSfQotCi1JZiB5b3UgYXJlIG9uIGEgKm5peCBzeXN0ZW0sIHlvdSBzaG91bGQgbm93IHNlZSBhIE1ha2VmaWxlIGluIHRoZQotY3VycmVudCBkaXJlY3RvcnkuICBKdXN0IHR5cGUgJ21ha2UnIHRvIGJ1aWxkIGd0ZXN0LgotCi1JZiB5b3UgdXNlIFdpbmRvd3MgYW5kIGhhdmUgVmlzdWFsIFN0dWRpbyBpbnN0YWxsZWQsIGEgZ3Rlc3Quc2xuIGZpbGUKLWFuZCBzZXZlcmFsIC52Y3Byb2ogZmlsZXMgd2lsbCBiZSBjcmVhdGVkLiAgWW91IGNhbiB0aGVuIGJ1aWxkIHRoZW0KLXVzaW5nIFZpc3VhbCBTdHVkaW8uCi0KLU9uIE1hYyBPUyBYIHdpdGggWGNvZGUgaW5zdGFsbGVkLCBhIC54Y29kZXByb2ogZmlsZSB3aWxsIGJlIGdlbmVyYXRlZC4KLQotIyMjIExlZ2FjeSBCdWlsZCBTY3JpcHRzICMjIwotCi1CZWZvcmUgc2V0dGxpbmcgb24gQ01ha2UsIHdlIGhhdmUgYmVlbiBwcm92aWRpbmcgaGFuZC1tYWludGFpbmVkIGJ1aWxkCi1wcm9qZWN0cy9zY3JpcHRzIGZvciBWaXN1YWwgU3R1ZGlvLCBYY29kZSwgYW5kIEF1dG90b29scy4gIFdoaWxlIHdlCi1jb250aW51ZSB0byBwcm92aWRlIHRoZW0gZm9yIGNvbnZlbmllbmNlLCB0aGV5IGFyZSBub3QgYWN0aXZlbHkKLW1haW50YWluZWQgYW55IG1vcmUuICBXZSBoaWdobHkgcmVjb21tZW5kIHRoYXQgeW91IGZvbGxvdyB0aGUKLWluc3RydWN0aW9ucyBpbiB0aGUgcHJldmlvdXMgdHdvIHNlY3Rpb25zIHRvIGludGVncmF0ZSBHb29nbGUgVGVzdAotd2l0aCB5b3VyIGV4aXN0aW5nIGJ1aWxkIHN5c3RlbS4KLQotSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIHRoZSBsZWdhY3kgYnVpbGQgc2NyaXB0cywgaGVyZSdzIGhvdzoKLQotVGhlIG1zdmNcIGZvbGRlciBjb250YWlucyB0d28gc29sdXRpb25zIHdpdGggVmlzdWFsIEMrKyBwcm9qZWN0cy4KLU9wZW4gdGhlIGd0ZXN0LnNsbiBvciBndGVzdC1tZC5zbG4gZmlsZSB1c2luZyBWaXN1YWwgU3R1ZGlvLCBhbmQgeW91Ci1hcmUgcmVhZHkgdG8gYnVpbGQgR29vZ2xlIFRlc3QgdGhlIHNhbWUgd2F5IHlvdSBidWlsZCBhbnkgVmlzdWFsCi1TdHVkaW8gcHJvamVjdC4gIEZpbGVzIHRoYXQgaGF2ZSBuYW1lcyBlbmRpbmcgd2l0aCAtbWQgdXNlIERMTAotdmVyc2lvbnMgb2YgTWljcm9zb2Z0IHJ1bnRpbWUgbGlicmFyaWVzICh0aGUgL01EIG9yIHRoZSAvTURkIGNvbXBpbGVyCi1vcHRpb24pLiAgRmlsZXMgd2l0aG91dCB0aGF0IHN1ZmZpeCB1c2Ugc3RhdGljIHZlcnNpb25zIG9mIHRoZSBydW50aW1lCi1saWJyYXJpZXMgKHRoZSAvTVQgb3IgdGhlIC9NVGQgb3B0aW9uKS4gIFBsZWFzZSBub3RlIHRoYXQgb25lIG11c3QgdXNlCi10aGUgc2FtZSBvcHRpb24gdG8gY29tcGlsZSBib3RoIGd0ZXN0IGFuZCB0aGUgdGVzdCBjb2RlLiAgSWYgeW91IHVzZQotVmlzdWFsIFN0dWRpbyAyMDA1IG9yIGFib3ZlLCB3ZSByZWNvbW1lbmQgdGhlIC1tZCB2ZXJzaW9uIGFzIC9NRCBpcwotdGhlIGRlZmF1bHQgZm9yIG5ldyBwcm9qZWN0cyBpbiB0aGVzZSB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvLgotCi1PbiBNYWMgT1MgWCwgb3BlbiB0aGUgZ3Rlc3QueGNvZGVwcm9qIGluIHRoZSB4Y29kZS8gZm9sZGVyIHVzaW5nCi1YY29kZS4gIEJ1aWxkIHRoZSAiZ3Rlc3QiIHRhcmdldC4gIFRoZSB1bml2ZXJzYWwgYmluYXJ5IGZyYW1ld29yayB3aWxsCi1lbmQgdXAgaW4geW91ciBzZWxlY3RlZCBidWlsZCBkaXJlY3RvcnkgKHNlbGVjdGVkIGluIHRoZSBYY29kZQotIlByZWZlcmVuY2VzLi4uIiAtPiAiQnVpbGRpbmciIHBhbmUgYW5kIGRlZmF1bHRzIHRvIHhjb2RlL2J1aWxkKS4KLUFsdGVybmF0aXZlbHksIGF0IHRoZSBjb21tYW5kIGxpbmUsIGVudGVyOgotCi0gIHhjb2RlYnVpbGQKLQotVGhpcyB3aWxsIGJ1aWxkIHRoZSAiUmVsZWFzZSIgY29uZmlndXJhdGlvbiBvZiBndGVzdC5mcmFtZXdvcmsgaW4geW91cgotZGVmYXVsdCBidWlsZCBsb2NhdGlvbi4gIFNlZSB0aGUgInhjb2RlYnVpbGQiIG1hbiBwYWdlIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCBidWlsZGluZyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgYW5kIGJ1aWxkaW5nIGluCi1kaWZmZXJlbnQgbG9jYXRpb25zLgotCi1JZiB5b3Ugd2lzaCB0byB1c2UgdGhlIEdvb2dsZSBUZXN0IFhjb2RlIHByb2plY3Qgd2l0aCBYY29kZSA0LnggYW5kCi1hYm92ZSwgeW91IG5lZWQgdG8gZWl0aGVyOgotICogdXBkYXRlIHRoZSBTREsgY29uZmlndXJhdGlvbiBvcHRpb25zIGluIHhjb2RlL0NvbmZpZy9HZW5lcmFsLnhjb25maWcuCi0gICBDb21tZW50IG9wdGlvbnMgU0RLUk9PVCwgTUFDT1NfREVQTE9ZTUVOVF9UQVJHRVQsIGFuZCBHQ0NfVkVSU0lPTi4gSWYKLSAgIHlvdSBjaG9vc2UgdGhpcyByb3V0ZSB5b3UgbG9zZSB0aGUgYWJpbGl0eSB0byB0YXJnZXQgZWFybGllciB2ZXJzaW9ucwotICAgb2YgTWFjT1MgWC4KLSAqIEluc3RhbGwgYW4gU0RLIGZvciBhbiBlYXJsaWVyIHZlcnNpb24uIFRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUKLSAgIHN1cHBvcnRlZCBieSBBcHBsZSwgYnV0IGhhcyBiZWVuIHJlcG9ydGVkIHRvIHdvcmsKLSAgIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUzNzg1MTgpLgotCi1Ud2Vha2luZyBHb29nbGUgVGVzdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotR29vZ2xlIFRlc3QgY2FuIGJlIHVzZWQgaW4gZGl2ZXJzZSBlbnZpcm9ubWVudHMuICBUaGUgZGVmYXVsdAotY29uZmlndXJhdGlvbiBtYXkgbm90IHdvcmsgKG9yIG1heSBub3Qgd29yayB3ZWxsKSBvdXQgb2YgdGhlIGJveCBpbgotc29tZSBlbnZpcm9ubWVudHMuICBIb3dldmVyLCB5b3UgY2FuIGVhc2lseSB0d2VhayBHb29nbGUgVGVzdCBieQotZGVmaW5pbmcgY29udHJvbCBtYWNyb3Mgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4gIEdlbmVyYWxseSwKLXRoZXNlIG1hY3JvcyBhcmUgbmFtZWQgbGlrZSBHVEVTVF9YWVogYW5kIHlvdSBkZWZpbmUgdGhlbSB0byBlaXRoZXIgMQotb3IgMCB0byBlbmFibGUgb3IgZGlzYWJsZSBhIGNlcnRhaW4gZmVhdHVyZS4KLQotV2UgbGlzdCB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgbWFjcm9zIGJlbG93LiAgRm9yIGEgY29tcGxldGUgbGlzdCwKLXNlZSBmaWxlIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oLgotCi0jIyMgQ2hvb3NpbmcgYSBUUjEgVHVwbGUgTGlicmFyeSAjIyMKLQotU29tZSBHb29nbGUgVGVzdCBmZWF0dXJlcyByZXF1aXJlIHRoZSBDKysgVGVjaG5pY2FsIFJlcG9ydCAxIChUUjEpCi10dXBsZSBsaWJyYXJ5LCB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSB3aXRoIGFsbCBjb21waWxlcnMuICBUaGUKLWdvb2QgbmV3cyBpcyB0aGF0IEdvb2dsZSBUZXN0IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgVFIxIHR1cGxlIHRoYXQncwotZW5vdWdoIGZvciBpdHMgb3duIG5lZWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoaXMgd2hlbiB0aGUKLWNvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSBUUjEgdHVwbGUuCi0KLVVzdWFsbHkgeW91IGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB3aGljaCB0dXBsZSBsaWJyYXJ5IEdvb2dsZSBUZXN0Ci11c2VzLiAgSG93ZXZlciwgaWYgeW91ciBwcm9qZWN0IGFscmVhZHkgdXNlcyBUUjEgdHVwbGUsIHlvdSBuZWVkIHRvCi10ZWxsIEdvb2dsZSBUZXN0IHRvIHVzZSB0aGUgc2FtZSBUUjEgdHVwbGUgbGlicmFyeSB0aGUgcmVzdCBvZiB5b3VyCi1wcm9qZWN0IHVzZXMsIG9yIHRoZSB0d28gdHVwbGUgaW1wbGVtZW50YXRpb25zIHdpbGwgY2xhc2guICBUbyBkbwotdGhhdCwgYWRkCi0KLSAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0wCi0KLXRvIHRoZSBjb21waWxlciBmbGFncyB3aGlsZSBjb21waWxpbmcgR29vZ2xlIFRlc3QgYW5kIHlvdXIgdGVzdHMuICBJZgoteW91IHdhbnQgdG8gZm9yY2UgR29vZ2xlIFRlc3QgdG8gdXNlIGl0cyBvd24gdHVwbGUgbGlicmFyeSwganVzdCBhZGQKLQotICAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTEKLQotdG8gdGhlIGNvbXBpbGVyIGZsYWdzIGluc3RlYWQuCi0KLUlmIHlvdSBkb24ndCB3YW50IEdvb2dsZSBUZXN0IHRvIHVzZSB0dXBsZSBhdCBhbGwsIGFkZAotCi0gIC1ER1RFU1RfSEFTX1RSMV9UVVBMRT0wCi0KLWFuZCBhbGwgZmVhdHVyZXMgdXNpbmcgdHVwbGUgd2lsbCBiZSBkaXNhYmxlZC4KLQotIyMjIE11bHRpLXRocmVhZGVkIFRlc3RzICMjIwotCi1Hb29nbGUgVGVzdCBpcyB0aHJlYWQtc2FmZSB3aGVyZSB0aGUgcHRocmVhZCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4KLUFmdGVyICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIiwgeW91IGNhbiBjaGVjayB0aGUgR1RFU1RfSVNfVEhSRUFEU0FGRQotbWFjcm8gdG8gc2VlIHdoZXRoZXIgdGhpcyBpcyB0aGUgY2FzZSAoeWVzIGlmIHRoZSBtYWNybyBpcyAjZGVmaW5lZCB0bwotMSwgbm8gaWYgaXQncyB1bmRlZmluZWQuKS4KLQotSWYgR29vZ2xlIFRlc3QgZG9lc24ndCBjb3JyZWN0bHkgZGV0ZWN0IHdoZXRoZXIgcHRocmVhZCBpcyBhdmFpbGFibGUKLWluIHlvdXIgZW52aXJvbm1lbnQsIHlvdSBjYW4gZm9yY2UgaXQgd2l0aAotCi0gIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MQotCi1vcgotCi0gIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAotCi1XaGVuIEdvb2dsZSBUZXN0IHVzZXMgcHRocmVhZCwgeW91IG1heSBuZWVkIHRvIGFkZCBmbGFncyB0byB5b3VyCi1jb21waWxlciBhbmQvb3IgbGlua2VyIHRvIHNlbGVjdCB0aGUgcHRocmVhZCBsaWJyYXJ5LCBvciB5b3UnbGwgZ2V0Ci1saW5rIGVycm9ycy4gIElmIHlvdSB1c2UgdGhlIENNYWtlIHNjcmlwdCBvciB0aGUgZGVwcmVjYXRlZCBBdXRvdG9vbHMKLXNjcmlwdCwgdGhpcyBpcyB0YWtlbiBjYXJlIG9mIGZvciB5b3UuICBJZiB5b3UgdXNlIHlvdXIgb3duIGJ1aWxkCi1zY3JpcHQsIHlvdSdsbCBuZWVkIHRvIHJlYWQgeW91ciBjb21waWxlciBhbmQgbGlua2VyJ3MgbWFudWFsIHRvCi1maWd1cmUgb3V0IHdoYXQgZmxhZ3MgdG8gYWRkLgotCi0jIyMgQXMgYSBTaGFyZWQgTGlicmFyeSAoRExMKSAjIyMKLQotR29vZ2xlIFRlc3QgaXMgY29tcGFjdCwgc28gbW9zdCB1c2VycyBjYW4gYnVpbGQgYW5kIGxpbmsgaXQgYXMgYQotc3RhdGljIGxpYnJhcnkgZm9yIHRoZSBzaW1wbGljaXR5LiAgWW91IGNhbiBjaG9vc2UgdG8gdXNlIEdvb2dsZSBUZXN0Ci1hcyBhIHNoYXJlZCBsaWJyYXJ5IChrbm93biBhcyBhIERMTCBvbiBXaW5kb3dzKSBpZiB5b3UgcHJlZmVyLgotCi1UbyBjb21waWxlICpndGVzdCogYXMgYSBzaGFyZWQgbGlicmFyeSwgYWRkCi0KLSAgLURHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlk9MQotCi10byB0aGUgY29tcGlsZXIgZmxhZ3MuICBZb3UnbGwgYWxzbyBuZWVkIHRvIHRlbGwgdGhlIGxpbmtlciB0byBwcm9kdWNlCi1hIHNoYXJlZCBsaWJyYXJ5IGluc3RlYWQgLSBjb25zdWx0IHlvdXIgbGlua2VyJ3MgbWFudWFsIGZvciBob3cgdG8gZG8KLWl0LgotCi1UbyBjb21waWxlIHlvdXIgKnRlc3RzKiB0aGF0IHVzZSB0aGUgZ3Rlc3Qgc2hhcmVkIGxpYnJhcnksIGFkZAotCi0gIC1ER1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZPTEKLQotdG8gdGhlIGNvbXBpbGVyIGZsYWdzLgotCi1Ob3RlOiB3aGlsZSB0aGUgYWJvdmUgc3RlcHMgYXJlbid0IHRlY2huaWNhbGx5IG5lY2Vzc2FyeSB0b2RheSB3aGVuCi11c2luZyBzb21lIGNvbXBpbGVycyAoZS5nLiBHQ0MpLCB0aGV5IG1heSBiZWNvbWUgbmVjZXNzYXJ5IGluIHRoZQotZnV0dXJlLCBpZiB3ZSBkZWNpZGUgdG8gaW1wcm92ZSB0aGUgc3BlZWQgb2YgbG9hZGluZyB0aGUgbGlicmFyeSAoc2VlCi1odHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBkZXRhaWxzKS4gIFRoZXJlZm9yZSB5b3UgYXJlCi1yZWNvbW1lbmRlZCB0byBhbHdheXMgYWRkIHRoZSBhYm92ZSBmbGFncyB3aGVuIHVzaW5nIEdvb2dsZSBUZXN0IGFzIGEKLXNoYXJlZCBsaWJyYXJ5LiAgT3RoZXJ3aXNlIGEgZnV0dXJlIHJlbGVhc2Ugb2YgR29vZ2xlIFRlc3QgbWF5IGJyZWFrCi15b3VyIGJ1aWxkIHNjcmlwdC4KLQotIyMjIEF2b2lkaW5nIE1hY3JvIE5hbWUgQ2xhc2hlcyAjIyMKLQotSW4gQysrLCBtYWNyb3MgZG9uJ3Qgb2JleSBuYW1lc3BhY2VzLiAgVGhlcmVmb3JlIHR3byBsaWJyYXJpZXMgdGhhdAotYm90aCBkZWZpbmUgYSBtYWNybyBvZiB0aGUgc2FtZSBuYW1lIHdpbGwgY2xhc2ggaWYgeW91ICNpbmNsdWRlIGJvdGgKLWRlZmluaXRpb25zLiAgSW4gY2FzZSBhIEdvb2dsZSBUZXN0IG1hY3JvIGNsYXNoZXMgd2l0aCBhbm90aGVyCi1saWJyYXJ5LCB5b3UgY2FuIGZvcmNlIEdvb2dsZSBUZXN0IHRvIHJlbmFtZSBpdHMgbWFjcm8gdG8gYXZvaWQgdGhlCi1jb25mbGljdC4KLQotU3BlY2lmaWNhbGx5LCBpZiBib3RoIEdvb2dsZSBUZXN0IGFuZCBzb21lIG90aGVyIGNvZGUgZGVmaW5lIG1hY3JvCi1GT08sIHlvdSBjYW4gYWRkCi0KLSAgLURHVEVTVF9ET05UX0RFRklORV9GT089MQotCi10byB0aGUgY29tcGlsZXIgZmxhZ3MgdG8gdGVsbCBHb29nbGUgVGVzdCB0byBjaGFuZ2UgdGhlIG1hY3JvJ3MgbmFtZQotZnJvbSBGT08gdG8gR1RFU1RfRk9PLiAgQ3VycmVudGx5IEZPTyBjYW4gYmUgRkFJTCwgU1VDQ0VFRCwgb3IgVEVTVC4KLUZvciBleGFtcGxlLCB3aXRoIC1ER1RFU1RfRE9OVF9ERUZJTkVfVEVTVD0xLCB5b3UnbGwgbmVlZCB0byB3cml0ZQotCi0gIEdURVNUX1RFU1QoU29tZVRlc3QsIERvZXNUaGlzKSB7IC4uLiB9Ci0KLWluc3RlYWQgb2YKLQotICBURVNUKFNvbWVUZXN0LCBEb2VzVGhpcykgeyAuLi4gfQotCi1pbiBvcmRlciB0byBkZWZpbmUgYSB0ZXN0LgotCi1VcGdyYXRpbmcgZnJvbSBhbiBFYXJsaWVyIFZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XZSBzdHJpdmUgdG8ga2VlcCBHb29nbGUgVGVzdCByZWxlYXNlcyBiYWNrd2FyZCBjb21wYXRpYmxlLgotU29tZXRpbWVzLCB0aG91Z2gsIHdlIGhhdmUgdG8gbWFrZSBzb21lIGJyZWFraW5nIGNoYW5nZXMgZm9yIHRoZQotdXNlcnMnIGxvbmctdGVybSBiZW5lZml0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgd2hhdCB5b3UnbGwgbmVlZCB0bwotZG8gaWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QuCi0KLSMjIyBVcGdyYWRpbmcgZnJvbSAxLjMuMCBvciBFYXJsaWVyICMjIwotCi1Zb3UgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBlbmFibGUgb3IgZGlzYWJsZSBHb29nbGUgVGVzdCdzIG93biBUUjEKLXR1cGxlIGxpYnJhcnkuICBTZWUgdGhlIGluc3RydWN0aW9ucyBpbiBzZWN0aW9uICJDaG9vc2luZyBhIFRSMSBUdXBsZQotTGlicmFyeSIuCi0KLSMjIyBVcGdyYWRpbmcgZnJvbSAxLjQuMCBvciBFYXJsaWVyICMjIwotCi1UaGUgQXV0b3Rvb2xzIGJ1aWxkIHNjcmlwdCAoY29uZmlndXJlICsgbWFrZSkgaXMgbm8gbG9uZ2VyIG9mZmljaWFsbHkKLXN1cHBvcnR0ZWQuICBZb3UgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB5b3VyIG93biBidWlsZCBzeXN0ZW0gb3IKLXVzZSBDTWFrZS4gIElmIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSBBdXRvdG9vbHMsIHlvdSBjYW4gZmluZAotaW5zdHJ1Y3Rpb25zIGluIHRoZSBSRUFETUUgZmlsZSBmcm9tIEdvb2dsZSBUZXN0IDEuNC4wLgotCi1PbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIHB0aHJlYWQgbGlicmFyeSBpcyBhdmFpbGFibGUsIEdvb2dsZSBUZXN0IHVzZXMKLWl0IGluIG9yZGVyIHRvIGJlIHRocmVhZC1zYWZlLiAgU2VlIHRoZSAiTXVsdGktdGhyZWFkZWQgVGVzdHMiIHNlY3Rpb24KLWZvciB3aGF0IHRoaXMgbWVhbnMgdG8geW91ciBidWlsZCBzY3JpcHQuCi0KLUlmIHlvdSB1c2UgTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4xIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZCwgR29vZ2xlCi1UZXN0IHdpbGwgbm8gbG9uZ2VyIGNvbXBpbGUuICBUaGlzIHNob3VsZCBhZmZlY3QgdmVyeSBmZXcgcGVvcGxlLCBhcyBhCi1sYXJnZSBwb3J0aW9uIG9mIFNUTCAoaW5jbHVkaW5nIDxzdHJpbmc+KSBkb2Vzbid0IGNvbXBpbGUgaW4gdGhpcyBtb2RlCi1hbnl3YXkuICBXZSBkZWNpZGVkIHRvIHN0b3Agc3VwcG9ydGluZyBpdCBpbiBvcmRlciB0byBncmVhdGx5IHNpbXBsaWZ5Ci1Hb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uLgotCi1EZXZlbG9waW5nIEdvb2dsZSBUZXN0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgc2VjdGlvbiBkaXNjdXNzZXMgaG93IHRvIG1ha2UgeW91ciBvd24gY2hhbmdlcyB0byBHb29nbGUgVGVzdC4KLQotIyMjIFRlc3RpbmcgR29vZ2xlIFRlc3QgSXRzZWxmICMjIwotCi1UbyBtYWtlIHN1cmUgeW91ciBjaGFuZ2VzIHdvcmsgYXMgaW50ZW5kZWQgYW5kIGRvbid0IGJyZWFrIGV4aXN0aW5nCi1mdW5jdGlvbmFsaXR5LCB5b3UnbGwgd2FudCB0byBjb21waWxlIGFuZCBydW4gR29vZ2xlIFRlc3QncyBvd24gdGVzdHMuCi1Gb3IgdGhhdCB5b3UgY2FuIHVzZSBDTWFrZToKLQotICBta2RpciBteWJ1aWxkCi0gIGNkIG15YnVpbGQKLSAgY21ha2UgLURndGVzdF9idWlsZF90ZXN0cz1PTiAke0dURVNUX0RJUn0KLQotTWFrZSBzdXJlIHlvdSBoYXZlIFB5dGhvbiBpbnN0YWxsZWQsIGFzIHNvbWUgb2YgR29vZ2xlIFRlc3QncyB0ZXN0cwotYXJlIHdyaXR0ZW4gaW4gUHl0aG9uLiAgSWYgdGhlIGNtYWtlIGNvbW1hbmQgY29tcGxhaW5zIGFib3V0IG5vdCBiZWluZwotYWJsZSB0byBmaW5kIFB5dGhvbiAoIkNvdWxkIE5PVCBmaW5kIFB5dGhvbkludGVycCAobWlzc2luZzoKLVBZVEhPTl9FWEVDVVRBQkxFKSIpLCB0cnkgdGVsbGluZyBpdCBleHBsaWNpdGx5IHdoZXJlIHlvdXIgUHl0aG9uCi1leGVjdXRhYmxlIGNhbiBiZSBmb3VuZDoKLQotICBjbWFrZSAtRFBZVEhPTl9FWEVDVVRBQkxFPXBhdGgvdG8vcHl0aG9uIC1EZ3Rlc3RfYnVpbGRfdGVzdHM9T04gJHtHVEVTVF9ESVJ9Ci0KLU5leHQsIHlvdSBjYW4gYnVpbGQgR29vZ2xlIFRlc3QgYW5kIGFsbCBvZiBpdHMgb3duIHRlc3RzLiAgT24gKm5peCwKLXRoaXMgaXMgdXN1YWxseSBkb25lIGJ5ICdtYWtlJy4gIFRvIHJ1biB0aGUgdGVzdHMsIGRvCi0KLSAgbWFrZSB0ZXN0Ci0KLUFsbCB0ZXN0cyBzaG91bGQgcGFzcy4KLQotIyMjIFJlZ2VuZXJhdGluZyBTb3VyY2UgRmlsZXMgIyMjCi0KLVNvbWUgb2YgR29vZ2xlIFRlc3QncyBzb3VyY2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlcyAobm90Ci1pbiB0aGUgQysrIHNlbnNlKSB1c2luZyBhIHNjcmlwdC4gIEEgdGVtcGxhdGUgZmlsZSBpcyBuYW1lZCBGT08ucHVtcCwKLXdoZXJlIEZPTyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpdCB3aWxsIGdlbmVyYXRlLiAgRm9yIGV4YW1wbGUsIHRoZQotZmlsZSBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgaXMgdXNlZCB0byBnZW5lcmF0ZQotZ3Rlc3QtdHlwZS11dGlsLmggaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgotCi1Ob3JtYWxseSB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCByZWdlbmVyYXRpbmcgdGhlIHNvdXJjZSBmaWxlcywKLXVubGVzcyB5b3UgbmVlZCB0byBtb2RpZnkgdGhlbS4gIEluIHRoYXQgY2FzZSwgeW91IHNob3VsZCBtb2RpZnkgdGhlCi1jb3JyZXNwb25kaW5nIC5wdW1wIGZpbGVzIGluc3RlYWQgYW5kIHJ1biB0aGUgcHVtcC5weSBQeXRob24gc2NyaXB0IHRvCi1yZWdlbmVyYXRlIHRoZW0uICBZb3UgY2FuIGZpbmQgcHVtcC5weSBpbiB0aGUgc2NyaXB0cy8gZGlyZWN0b3J5LgotUmVhZCB0aGUgUHVtcCBtYW51YWwgWzJdIGZvciBob3cgdG8gdXNlIGl0LgotCi0gIFsyXSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1B1bXBNYW51YWwKLQotIyMjIENvbnRyaWJ1dGluZyBhIFBhdGNoICMjIwotCi1XZSB3ZWxjb21lIHBhdGNoZXMuICBQbGVhc2UgcmVhZCB0aGUgR29vZ2xlIFRlc3QgZGV2ZWxvcGVyJ3MgZ3VpZGUgWzNdCi1mb3IgaG93IHlvdSBjYW4gY29udHJpYnV0ZS4gIEluIHBhcnRpY3VsYXIsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBzaWduZWQKLXRoZSBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCwgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBhY2NlcHQgdGhlCi1wYXRjaC4KLQotICBbM10gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9Hb29nbGVUZXN0RGV2R3VpZGUKLQotSGFwcHkgdGVzdGluZyEKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvYnVpbGQtYXV4Ly5rZWVwIGIvdGVzdGluZy9ndGVzdC9idWlsZC1hdXgvLmtlZXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9idWlsZC1hdXgvLmtlZXAKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSBiL3Rlc3RpbmcvZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTZkYmIuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0jIERlZmluZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZnVsIGZvciBidWlsZGluZyBHb29nbGUgVGVzdCBhbmQKLSMgR29vZ2xlIE1vY2suCi0jCi0jIE5vdGU6Ci0jCi0jIC0gVGhpcyBmaWxlIHdpbGwgYmUgcnVuIHR3aWNlIHdoZW4gYnVpbGRpbmcgR29vZ2xlIE1vY2sgKG9uY2UgdmlhCi0jICAgR29vZ2xlIFRlc3QncyBDTWFrZUxpc3RzLnR4dCwgYW5kIG9uY2UgdmlhIEdvb2dsZSBNb2NrJ3MpLgotIyAgIFRoZXJlZm9yZSBpdCBzaG91bGRuJ3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gZGVmaW5pbmcKLSMgICB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCi0jCi0jIC0gVGhlIGZ1bmN0aW9ucy9tYWNyb3MgZGVmaW5lZCBpbiB0aGlzIGZpbGUgbWF5IGRlcGVuZCBvbiBHb29nbGUKLSMgICBUZXN0IGFuZCBHb29nbGUgTW9jaydzIG9wdGlvbigpIGRlZmluaXRpb25zLCBhbmQgdGh1cyBtdXN0IGJlCi0jICAgY2FsbGVkICphZnRlciogdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQuCi0KLSMgVHdlYWtzIENNYWtlJ3MgZGVmYXVsdCBjb21waWxlci9saW5rZXIgc2V0dGluZ3MgdG8gc3VpdCBHb29nbGUgVGVzdCdzIG5lZWRzLgotIwotIyBUaGlzIG11c3QgYmUgYSBtYWNybygpLCBhcyBpbnNpZGUgYSBmdW5jdGlvbiBzdHJpbmcoKSBjYW4gb25seQotIyB1cGRhdGUgdmFyaWFibGVzIGluIHRoZSBmdW5jdGlvbiBzY29wZS4KLW1hY3JvKGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXykKLSAgaWYgKE1TVkMpCi0gICAgIyBGb3IgTVNWQywgQ01ha2Ugc2V0cyBjZXJ0YWluIGZsYWdzIHRvIGRlZmF1bHRzIHdlIHdhbnQgdG8gb3ZlcnJpZGUuCi0gICAgIyBUaGlzIHJlcGxhY2VtZW50IGNvZGUgaXMgdGFrZW4gZnJvbSBzYW1wbGUgaW4gdGhlIENNYWtlIFdpa2kgYXQKLSAgICAjIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2VfRkFRI0R5bmFtaWNfUmVwbGFjZS4KLSAgICBmb3JlYWNoIChmbGFnX3ZhcgotICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHUyBDTUFLRV9DWFhfRkxBR1NfREVCVUcgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKLSAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8pCi0gICAgICBpZiAoTk9UIEJVSUxEX1NIQVJFRF9MSUJTIEFORCBOT1QgZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCkKLSAgICAgICAgIyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnksIGl0IHNob3VsZCBhbHNvIHVzZQotICAgICAgICAjIHNoYXJlZCBydW50aW1lIGxpYnJhcmllcy4gIE90aGVyd2lzZSwgaXQgbWF5IGVuZCB1cCB3aXRoIG11bHRpcGxlCi0gICAgICAgICMgY29waWVzIG9mIHJ1bnRpbWUgbGlicmFyeSBkYXRhIGluIGRpZmZlcmVudCBtb2R1bGVzLCByZXN1bHRpbmcgaW4KLSAgICAgICAgIyBoYXJkLXRvLWZpbmQgY3Jhc2hlcy4gV2hlbiBpdCBpcyBidWlsdCBhcyBhIHN0YXRpYyBsaWJyYXJ5LCBpdCBpcwotICAgICAgICAjIHByZWZlcmFibGUgdG8gdXNlIENSVCBhcyBzdGF0aWMgbGlicmFyaWVzLCBhcyB3ZSBkb24ndCBoYXZlIHRvIHJlbHkKLSAgICAgICAgIyBvbiBDUlQgRExMcyBiZWluZyBhdmFpbGFibGUuIENNYWtlIGFsd2F5cyBkZWZhdWx0cyB0byB1c2luZyBzaGFyZWQKLSAgICAgICAgIyBDUlQgbGlicmFyaWVzLCBzbyB3ZSBvdmVycmlkZSB0aGF0IGRlZmF1bHQgaGVyZS4KLSAgICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi1NVCIgJHtmbGFnX3Zhcn0gIiR7JHtmbGFnX3Zhcn19IikKLSAgICAgIGVuZGlmKCkKLQotICAgICAgIyBXZSBwcmVmZXIgbW9yZSBzdHJpY3Qgd2FybmluZyBjaGVja2luZyBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QuCi0gICAgICAjIFJlcGxhY2VzIC9XMyB3aXRoIC9XNCBpbiBkZWZhdWx0cy4KLSAgICAgIHN0cmluZyhSRVBMQUNFICIvVzMiICIvVzQiICR7ZmxhZ192YXJ9ICIkeyR7ZmxhZ192YXJ9fSIpCi0gICAgZW5kZm9yZWFjaCgpCi0gIGVuZGlmKCkKLWVuZG1hY3JvKCkKLQotIyBEZWZpbmVzIHRoZSBjb21waWxlci9saW5rZXIgZmxhZ3MgdXNlZCB0byBidWlsZCBHb29nbGUgVGVzdCBhbmQKLSMgR29vZ2xlIE1vY2suICBZb3UgY2FuIHR3ZWFrIHRoZXNlIGRlZmluaXRpb25zIHRvIHN1aXQgeW91ciBuZWVkLiAgQQotIyB2YXJpYWJsZSdzIHZhbHVlIGlzIGVtcHR5IGJlZm9yZSBpdCdzIGV4cGxpY2l0bHkgYXNzaWduZWQgdG8uCi1tYWNybyhjb25maWdfY29tcGlsZXJfYW5kX2xpbmtlcikKLSAgaWYgKE5PVCBndGVzdF9kaXNhYmxlX3B0aHJlYWRzKQotICAgICMgRGVmaW5lcyBDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCBhbmQgQ01BS0VfVEhSRUFEX0xJQlNfSU5JVC4KLSAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKLSAgZW5kaWYoKQotCi0gIGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXygpCi0gIGlmIChNU1ZDKQotICAgICMgTmV3bGluZXMgaW5zaWRlIGZsYWdzIHZhcmlhYmxlcyBicmVhayBDTWFrZSdzIE5NYWtlIGdlbmVyYXRvci4KLSAgICAjIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEFkZCAtUlRDcyBhbmQgLVJUQ3UgdG8gZGVidWcgYnVpbGRzLgotICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUdTIC1XNCAtV1ggLXdkNDI1MSAtd2Q0Mjc1IC1ub2xvZ28gLUogLVppIikKLSAgICBpZiAoTVNWQ19WRVJTSU9OIExFU1MgMTQwMCkgICMgMTQwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMDUKLSAgICAgICMgU3VwcHJlc3Mgc3B1cmlvdXMgd2FybmluZ3MgTVNWQyA3LjEgc29tZXRpbWVzIGlzc3Vlcy4KLSAgICAgICMgRm9yY2luZyB2YWx1ZSB0byBib29sLgotICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0ODAwIikKLSAgICAgICMgQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLgotICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0NTExIC13ZDQ1MTIiKQotICAgICAgIyBDb21wYXRpYmlsaXR5IHdhcm5pbmdzIG5vdCBhcHBsaWNhYmxlIHRvIEdvb2dsZSBUZXN0LgotICAgICAgIyBSZXNvbHZlZCBvdmVybG9hZCB3YXMgZm91bmQgYnkgYXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cC4KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDY3NSIpCi0gICAgZW5kaWYoKQotICAgIGlmIChNU1ZDX1ZFUlNJT04gTEVTUyAxNTAwKSAgIyAxNTAwIGlzIFZpc3VhbCBTdHVkaW8gMjAwOAotICAgICAgIyBDb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50LgotICAgICAgIyBXaGVuIGNvbXBpbGluZyB3aXRoIC9XNCwgd2UgZ2V0IHNldmVyYWwgaW5zdGFuY2VzIG9mIEM0MTI3Ci0gICAgICAjIChDb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50KS4gSW4gb3VyIGNvZGUsIHdlIGRpc2FibGUgdGhhdAotICAgICAgIyB3YXJuaW5nIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzLiBIb3dldmVyLCBvbiBWaXN1YWwgU3R1ZGlvIDIwMDUsCi0gICAgICAjIHRoZSB3YXJuaW5nIGZpcmVzIG9uIHN0ZDo6bGlzdC4gVGhlcmVmb3JlIG9uIHRoYXQgY29tcGlsZXIgYW5kIGVhcmxpZXIsCi0gICAgICAjIHdlIGRpc2FibGUgdGhlIHdhcm5pbmcgcHJvamVjdC13aWRlLgotICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0MTI3IikKLSAgICBlbmRpZigpCi0gICAgaWYgKE5PVCAoTVNWQ19WRVJTSU9OIExFU1MgMTcwMCkpICAjIDE3MDAgaXMgVmlzdWFsIFN0dWRpbyAyMDEyLgotICAgICAgIyBTdXBwcmVzcyAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBvbiBWUyAyMDEyIGFuZCBsYXRlci4KLSAgICAgICMgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMjMyNjY5IGV4cGxhaW5zIHRoZSBpc3N1ZS4KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDcwMiIpCi0gICAgZW5kaWYoKQotCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRF9VTklDT0RFIC1EVU5JQ09ERSAtRFdJTjMyIC1EX1dJTjMyIikKLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1EU1RSSUNUIC1EV0lOMzJfTEVBTl9BTkRfTUVBTiIpCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1FSHNjIC1EX0hBU19FWENFUFRJT05TPTEiKQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItRF9IQVNfRVhDRVBUSU9OUz0wIikKLSAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1HUi0iKQotICBlbHNlaWYgKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCkKLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1XYWxsIC1Xc2hhZG93IikKLSAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLWZleGNlcHRpb25zIikKLSAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLWZuby1leGNlcHRpb25zIikKLSAgICAjIFVudGlsIHZlcnNpb24gNC4zLjIsIEdDQyBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIHRvIGluZGljYXRlCi0gICAgIyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZC4gIFRoZXJlZm9yZSB3ZSBkZWZpbmUgR1RFU1RfSEFTX1JUVEkKLSAgICAjIGV4cGxpY2l0bHkuCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItZm5vLXJ0dGkgLURHVEVTVF9IQVNfUlRUST0wIikKLSAgICBzZXQoY3h4X3N0cmljdF9mbGFncwotICAgICAgIi1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiKQotICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiU3VuUHJvIikKLSAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLWZlYXR1cmVzPWV4Y2VwdCIpCi0gICAgIyBTdW4gUHJvIGRvZXNuJ3QgcHJvdmlkZSBtYWNyb3MgdG8gaW5kaWNhdGUgd2hldGhlciBleGNlcHRpb25zIGFuZAotICAgICMgUlRUSSBhcmUgZW5hYmxlZCwgc28gd2UgZGVmaW5lIEdURVNUX0hBU18qIGV4cGxpY2l0bHkuCi0gICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1ubyVleGNlcHQgLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikKLSAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1mZWF0dXJlcz1ubyVydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCi0gIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJWaXN1YWxBZ2UiIE9SCi0gICAgICBDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlhMIikKLSAgICAjIENNYWtlIDIuOCBjaGFuZ2VzIFZpc3VhbCBBZ2UncyBjb21waWxlciBJRCB0byAiWEwiLgotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItcWVoIikKLSAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLXFub2VoIikKLSAgICAjIFVudGlsIHZlcnNpb24gOS4wLCBWaXN1YWwgQWdlIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8gdG8gaW5kaWNhdGUKLSAgICAjIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLiAgVGhlcmVmb3JlIHdlIGRlZmluZSBHVEVTVF9IQVNfUlRUSQotICAgICMgZXhwbGljaXRseS4KLSAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1xbm9ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCi0gIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJIUCIpCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItQUEgLW10IikKLSAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0xIikKLSAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiK25vZWggLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikKLSAgICAjIFJUVEkgY2FuIG5vdCBiZSBkaXNhYmxlZCBpbiBIUCBhQ0MgY29tcGlsZXIuCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICIiKQotICBlbmRpZigpCi0KLSAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKSAgIyBUaGUgcHRocmVhZHMgbGlicmFyeSBpcyBhdmFpbGFibGUgYW5kIGFsbG93ZWQuCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTEiKQotICBlbHNlKCkKLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1ER1RFU1RfSEFTX1BUSFJFQUQ9MCIpCi0gIGVuZGlmKCkKLQotICAjIEZvciBidWlsZGluZyBndGVzdCdzIG93biB0ZXN0cyBhbmQgc2FtcGxlcy4KLSAgc2V0KGN4eF9leGNlcHRpb24gIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9leGNlcHRpb25fZmxhZ3N9IikKLSAgc2V0KGN4eF9ub19leGNlcHRpb24KLSAgICAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7Y3h4X2Jhc2VfZmxhZ3N9ICR7Y3h4X25vX2V4Y2VwdGlvbl9mbGFnc30iKQotICBzZXQoY3h4X2RlZmF1bHQgIiR7Y3h4X2V4Y2VwdGlvbn0iKQotICBzZXQoY3h4X25vX3J0dGkgIiR7Y3h4X2RlZmF1bHR9ICR7Y3h4X25vX3J0dGlfZmxhZ3N9IikKLSAgc2V0KGN4eF91c2Vfb3duX3R1cGxlICIke2N4eF9kZWZhdWx0fSAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTEiKQotCi0gICMgRm9yIGJ1aWxkaW5nIHRoZSBndGVzdCBsaWJyYXJpZXMuCi0gIHNldChjeHhfc3RyaWN0ICIke2N4eF9kZWZhdWx0fSAke2N4eF9zdHJpY3RfZmxhZ3N9IikKLWVuZG1hY3JvKCkKLQotIyBEZWZpbmVzIHRoZSBndGVzdCAmIGd0ZXN0X21haW4gbGlicmFyaWVzLiAgVXNlciB0ZXN0cyBzaG91bGQgbGluawotIyB3aXRoIG9uZSBvZiB0aGVtLgotZnVuY3Rpb24oY3h4X2xpYnJhcnlfd2l0aF90eXBlIG5hbWUgdHlwZSBjeHhfZmxhZ3MpCi0gICMgdHlwZSBjYW4gYmUgZWl0aGVyIFNUQVRJQyBvciBTSEFSRUQgdG8gZGVub3RlIGEgc3RhdGljIG9yIHNoYXJlZCBsaWJyYXJ5LgotICAjIEFSR04gcmVmZXJzIHRvIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyICdjeHhfZmxhZ3MnLgotICBhZGRfbGlicmFyeSgke25hbWV9ICR7dHlwZX0gJHtBUkdOfSkKLSAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KLSAgICBQUk9QRVJUSUVTCi0gICAgQ09NUElMRV9GTEFHUyAiJHtjeHhfZmxhZ3N9IikKLSAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTIE9SIHR5cGUgU1RSRVFVQUwgIlNIQVJFRCIpCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KLSAgICAgIFBST1BFUlRJRVMKLSAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWT0xIikKLSAgZW5kaWYoKQotICBpZiAoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKLSAgZW5kaWYoKQotZW5kZnVuY3Rpb24oKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgSGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYnVpbGQgdGFyZ2V0cy4KLQotZnVuY3Rpb24oY3h4X3NoYXJlZF9saWJyYXJ5IG5hbWUgY3h4X2ZsYWdzKQotICBjeHhfbGlicmFyeV93aXRoX3R5cGUoJHtuYW1lfSBTSEFSRUQgIiR7Y3h4X2ZsYWdzfSIgJHtBUkdOfSkKLWVuZGZ1bmN0aW9uKCkKLQotZnVuY3Rpb24oY3h4X2xpYnJhcnkgbmFtZSBjeHhfZmxhZ3MpCi0gIGN4eF9saWJyYXJ5X3dpdGhfdHlwZSgke25hbWV9ICIiICIke2N4eF9mbGFnc30iICR7QVJHTn0pCi1lbmRmdW5jdGlvbigpCi0KLSMgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pCi0jCi0jIGNyZWF0ZXMgYSBuYW1lZCBDKysgZXhlY3V0YWJsZSB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnJhcmllcyBhbmQKLSMgaXMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgotZnVuY3Rpb24oY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQotICBhZGRfZXhlY3V0YWJsZSgke25hbWV9ICR7QVJHTn0pCi0gIGlmIChjeHhfZmxhZ3MpCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KLSAgICAgIFBST1BFUlRJRVMKLSAgICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpCi0gIGVuZGlmKCkKLSAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTKQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9Ci0gICAgICBQUk9QRVJUSUVTCi0gICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCi0gIGVuZGlmKCkKLSAgIyBUbyBzdXBwb3J0IG1peGluZyBsaW5raW5nIGluIHN0YXRpYyBhbmQgZHluYW1pYyBsaWJyYXJpZXMsIGxpbmsgZWFjaAotICAjIGxpYnJhcnkgaW4gd2l0aCBhbiBleHRyYSBjYWxsIHRvIHRhcmdldF9saW5rX2xpYnJhcmllcy4KLSAgZm9yZWFjaCAobGliICIke2xpYnN9IikKLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke2xpYn0pCi0gIGVuZGZvcmVhY2goKQotZW5kZnVuY3Rpb24oKQotCi0jIGN4eF9leGVjdXRhYmxlKG5hbWUgZGlyIGxpYiBzcmNzLi4uKQotIwotIyBjcmVhdGVzIGEgbmFtZWQgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKLSMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgZGlyL25hbWUuY2MgaXMgaW1wbGljaXRseSBpbmNsdWRlZCBpbgotIyB0aGUgc291cmNlIGZpbGUgbGlzdC4KLWZ1bmN0aW9uKGN4eF9leGVjdXRhYmxlIG5hbWUgZGlyIGxpYnMpCi0gIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoCi0gICAgJHtuYW1lfSAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9IiAiJHtkaXJ9LyR7bmFtZX0uY2MiICR7QVJHTn0pCi1lbmRmdW5jdGlvbigpCi0KLSMgU2V0cyBQWVRIT05JTlRFUlBfRk9VTkQgYW5kIFBZVEhPTl9FWEVDVVRBQkxFLgotZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCkKLQotIyBjeHhfdGVzdF93aXRoX2ZsYWdzKG5hbWUgY3h4X2ZsYWdzIGxpYnMgc3Jjcy4uLikKLSMKLSMgY3JlYXRlcyBhIG5hbWVkIEMrKyB0ZXN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKLSMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgotZnVuY3Rpb24oY3h4X3Rlc3Rfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQotICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKCR7bmFtZX0gIiR7Y3h4X2ZsYWdzfSIgIiR7bGlic30iICR7QVJHTn0pCi0gIGFkZF90ZXN0KCR7bmFtZX0gJHtuYW1lfSkKLWVuZGZ1bmN0aW9uKCkKLQotIyBjeHhfdGVzdChuYW1lIGxpYnMgc3Jjcy4uLikKLSMKLSMgY3JlYXRlcyBhIG5hbWVkIHRlc3QgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMKLSMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgVW5saWtlIGN4eF90ZXN0X3dpdGhfZmxhZ3MsCi0jIHRlc3QvbmFtZS5jYyBpcyBhbHJlYWR5IGltcGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSBmaWxlIGxpc3QuCi1mdW5jdGlvbihjeHhfdGVzdCBuYW1lIGxpYnMpCi0gIGN4eF90ZXN0X3dpdGhfZmxhZ3MoIiR7bmFtZX0iICIke2N4eF9kZWZhdWx0fSIgIiR7bGlic30iCi0gICAgInRlc3QvJHtuYW1lfS5jYyIgJHtBUkdOfSkKLWVuZGZ1bmN0aW9uKCkKLQotIyBweV90ZXN0KG5hbWUpCi0jCi0jIGNyZWF0ZXMgYSBQeXRob24gdGVzdCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdob3NlIG1haW4gbW9kdWxlIGlzIGluCi0jIHRlc3QvbmFtZS5weS4gIEl0IGRvZXMgbm90aGluZyBpZiBQeXRob24gaXMgbm90IGluc3RhbGxlZC4KLWZ1bmN0aW9uKHB5X3Rlc3QgbmFtZSkKLSAgIyBXZSBhcmUgbm90IHN1cHBvcnRpbmcgUHl0aG9uIHRlc3RzIG9uIExpbnV4IHlldCBhcyB0aGV5IGNvbnNpZGVyCi0gICMgYWxsIExpbnV4IGVudmlyb25tZW50cyB0byBiZSBnb29nbGUzIGFuZCB0cnkgdG8gdXNlIGdvb2dsZTMgZmVhdHVyZXMuCi0gIGlmIChQWVRIT05JTlRFUlBfRk9VTkQpCi0gICAgIyAke0NNQUtFX0JJTkFSWV9ESVJ9IGlzIGtub3duIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgc28gd2UgY2FuCi0gICAgIyBkaXJlY3RseSBiaW5kIGl0IGZyb20gY21ha2UuICR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSBpcyBrbm93bgotICAgICMgb25seSBhdCBjdGVzdCBydW50aW1lIChieSBjYWxsaW5nIGN0ZXN0IC1jIDxDb25maWd1cmF0aW9uPiksIHNvCi0gICAgIyB3ZSBoYXZlIHRvIGVzY2FwZSAkIHRvIGRlbGF5IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBoZXJlLgotICAgIGFkZF90ZXN0KCR7bmFtZX0KLSAgICAgICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0LyR7bmFtZX0ucHkKLSAgICAgICAgICAtLWJ1aWxkX2Rpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vXCR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSkKLSAgZW5kaWYoKQotZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdC5jYnByb2ogYi90ZXN0aW5nL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0LmNicHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMzA1NC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0LmNicHJvagorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxQcm9qZWN0R3VpZD57YmNhMzdhNzItNWIwNy00NmNmLWI0NGUtODlmOGUwNjQ1MWEyfTwvUHJvamVjdEd1aWQ+DQotICAgIDxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPlJlbGVhc2U8L0NvbmZpZz4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4NCi0gICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPg0KLSAgICA8QmFzZT50cnVlPC9CYXNlPg0KLSAgICA8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+DQotICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4NCi0gICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCi0gICAgPENmZ18yPnRydWU8L0NmZ18yPg0KLSAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+DQotICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD50cnVlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCi0gICAgPE91dHB1dEV4dD5saWI8L091dHB1dEV4dD4NCi0gICAgPERDQ19DQnVpbGRlck91dHB1dD5KUEhORTwvRENDX0NCdWlsZGVyT3V0cHV0Pg0KLSAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQotICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+DQotICAgIDxVc2VQYWNrYWdlcz50cnVlPC9Vc2VQYWNrYWdlcz4NCi0gICAgPFByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L1Byb2plY3RUeXBlPg0KLSAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQotICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO2RjbFppcEZvcmdlZDExLmJwaTt2Y2xaaXBGb3JnZWQxMS5icGk7R1IzMl9CRFMyMDA2LmJwaTtHUjMyX0RTR05fQkRTMjAwNi5icGk7SmNsLmJwaTtKY2xWY2wuYnBpO0p2Q29yZUQxMVIuYnBpO0p2U3lzdGVtRDExUi5icGk7SnZTdGRDdHJsc0QxMVIuYnBpO0p2QXBwRnJtRDExUi5icGk7SnZCYW5kc0QxMVIuYnBpO0p2REJEMTFSLmJwaTtKdkRsZ3NEMTFSLmJwaTtKdkJERUQxMVIuYnBpO0p2Q21wRDExUi5icGk7SnZDcnlwdEQxMVIuYnBpO0p2Q3RybHNEMTFSLmJwaTtKdkN1c3RvbUQxMVIuYnBpO0p2RG9ja2luZ0QxMVIuYnBpO0p2RG90TmV0Q3RybHNEMTFSLmJwaTtKdkVESUQxMVIuYnBpO0p2R2xvYnVzRDExUi5icGk7SnZITUlEMTFSLmJwaTtKdkludGVycHJldGVyRDExUi5icGk7SnZKYW5zRDExUi5icGk7SnZNYW5hZ2VkVGhyZWFkc0QxMVIuYnBpO0p2TU1EMTFSLmJwaTtKdk5ldEQxMVIuYnBpO0p2UGFnZUNvbXBzRDExUi5icGk7SnZQbHVnaW5EMTFSLmJwaTtKdlByaW50UHJldmlld0QxMVIuYnBpO0p2UnVudGltZURlc2lnbkQxMVIuYnBpO0p2VGltZUZyYW1ld29ya0QxMVIuYnBpO0p2VmFsaWRhdG9yc0QxMVIuYnBpO0p2V2l6YXJkRDExUi5icGk7SnZYUEN0cmxzRDExUi5icGk7VmNsU21wLmJwaTtDRXhjZXB0aW9uRXhwZXJ0MTEuYnBpPC9QYWNrYWdlSW1wb3J0cz4NCi0gICAgPEJDQ193cGFyPmZhbHNlPC9CQ0Nfd3Bhcj4NCi0gICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9JbmNsdWRlUGF0aD4NCi0gICAgPEFsbFBhY2thZ2VMaWJzPnJ0bC5saWI7dmNsLmxpYjwvQWxsUGFja2FnZUxpYnM+DQotICAgIDxUTElCX1BhZ2VTaXplPjMyPC9UTElCX1BhZ2VTaXplPg0KLSAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0lMSU5LX0xpYnJhcnlQYXRoPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQotICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQotICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCi0gICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQotICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KLSAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KLSAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQotICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQotICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KLSAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCi0gICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQotICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCi0gICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQotICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KLSAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQotICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCi0gICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCi0gICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQotICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KLSAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCi0gICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb2plY3RFeHRlbnNpb25zPg0KLSAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KLSAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Cb3JsYW5kLlByb2plY3RUeXBlPg0KLSAgICA8Qm9ybGFuZFByb2plY3Q+DQotPEJvcmxhbmRQcm9qZWN0PjxDUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjxWZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPjwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyI+PC9WZXJzaW9uSW5mb0tleXM+PC9WZXJzaW9uSW5mb0tleXM+PERlYnVnZ2luZz48RGVidWdnaW5nIE5hbWU9IkRlYnVnU291cmNlRGlycyI+PC9EZWJ1Z2dpbmc+PC9EZWJ1Z2dpbmc+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUnVuUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iRGVidWdDV0QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJIb3N0QXBwbGljYXRpb24iPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVIb3N0Ij48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGF0aCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZVBhcmFtcyI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUxhdW5jaGVyIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iVXNlUmVtb3RlTGF1bmNoZXIiPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUNXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZURlYnVnIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1ZyBTeW1ib2xzIFNlYXJjaCBQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZEFsbFN5bWJvbHMiPlRydWU8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZFVuc3BlY2lmaWVkU3ltYm9scyI+RmFsc2U8L1BhcmFtZXRlcnM+PC9QYXJhbWV0ZXJzPjxFeGNsdWRlZF9QYWNrYWdlcz4NCi0gICAgICANCi0gICAgICANCi0gICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2UyazEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIDIwMDAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCi0gICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2V4cDEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIFhQIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+DQotICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxzcmM7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0wIj4zMjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJJdGVtMSI+MTY8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQotICA8L1Byb2plY3RFeHRlbnNpb25zPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkNwcC5UYXJnZXRzIiAvPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1kZWF0aC10ZXN0LmgiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjM8L0J1aWxkT3JkZXI+DQotICAgIDwvTm9uZT4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1tZXNzYWdlLmgiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjQ8L0J1aWxkT3JkZXI+DQotICAgIDwvTm9uZT4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1wYXJhbS10ZXN0LmgiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjU8L0J1aWxkT3JkZXI+DQotICAgIDwvTm9uZT4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC1zcGkuaCI+DQotICAgICAgPEJ1aWxkT3JkZXI+NjwvQnVpbGRPcmRlcj4NCi0gICAgPC9Ob25lPg0KLSAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXRlc3QtcGFydC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj43PC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QtdHlwZWQtdGVzdC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj44PC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QuaCI+DQotICAgICAgPEJ1aWxkT3JkZXI+MDwvQnVpbGRPcmRlcj4NCi0gICAgPC9Ob25lPg0KLSAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0X3ByZWRfaW1wbC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj4xPC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3RfcHJvZC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj4yPC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj45PC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtZmlsZXBhdGguaCI+DQotICAgICAgPEJ1aWxkT3JkZXI+MTA8L0J1aWxkT3JkZXI+DQotICAgIDwvTm9uZT4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1pbnRlcm5hbC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj4xMTwvQnVpbGRPcmRlcj4NCi0gICAgPC9Ob25lPg0KLSAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LWxpbmtlZF9wdHIuaCI+DQotICAgICAgPEJ1aWxkT3JkZXI+MTI8L0J1aWxkT3JkZXI+DQotICAgIDwvTm9uZT4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIj4NCi0gICAgICA8QnVpbGRPcmRlcj4xNDwvQnVpbGRPcmRlcj4NCi0gICAgPC9Ob25lPg0KLSAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBhcmFtLXV0aWwuaCI+DQotICAgICAgPEJ1aWxkT3JkZXI+MTM8L0J1aWxkT3JkZXI+DQotICAgIDwvTm9uZT4NCi0gICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1wb3J0LmgiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjE1PC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3Qtc3RyaW5nLmgiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjE2PC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtdHlwZS11dGlsLmgiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjE3PC9CdWlsZE9yZGVyPg0KLSAgICA8L05vbmU+DQotICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Imd0ZXN0X2FsbC5jYyI+DQotICAgICAgPEJ1aWxkT3JkZXI+MTg8L0J1aWxkT3JkZXI+DQotICAgIDwvQ3BwQ29tcGlsZT4NCi0gICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQotICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KLSAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCi0gICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCi0gICAgICA8S2V5PkNmZ18yPC9LZXk+DQotICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KLSAgPC9JdGVtR3JvdXA+DQotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3QuZ3JvdXBwcm9qIGIvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjMxY2EuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi3vu788UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8UHJvamVjdEd1aWQ+e2MxZDkyM2UwLTZjYmEtNDMzMi05YjZmLTM0MjBhY2JmNTA5MX08L1Byb2plY3RHdWlkPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPEl0ZW1Hcm91cCAvPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPFByb2plY3RzIEluY2x1ZGU9Imd0ZXN0LmNicHJvaiIgLz4NCi0gICAgPFByb2plY3RzIEluY2x1ZGU9Imd0ZXN0X21haW4uY2Jwcm9qIiAvPg0KLSAgICA8UHJvamVjdHMgSW5jbHVkZT0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8UHJvamVjdEV4dGVuc2lvbnM+DQotICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlZmF1bHQuUGVyc29uYWxpdHk8L0JvcmxhbmQuUGVyc29uYWxpdHk+DQotICAgIDxCb3JsYW5kLlByb2plY3RUeXBlIC8+DQotICAgIDxCb3JsYW5kUHJvamVjdD4NCi08Qm9ybGFuZFByb2plY3QgeG1sbnM9IiI+PERlZmF1bHQuUGVyc29uYWxpdHk+PC9EZWZhdWx0LlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCi0gIDwvUHJvamVjdEV4dGVuc2lvbnM+DQotICA8VGFyZ2V0IE5hbWU9Imd0ZXN0Ij4NCi0gICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iIiAvPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9Imd0ZXN0OkNsZWFuIj4NCi0gICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iQ2xlYW4iIC8+DQotICA8L1RhcmdldD4NCi0gIDxUYXJnZXQgTmFtZT0iZ3Rlc3Q6TWFrZSI+DQotICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9Ik1ha2UiIC8+DQotICA8L1RhcmdldD4NCi0gIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfbWFpbiI+DQotICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdF9tYWluLmNicHJvaiIgVGFyZ2V0cz0iIiAvPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X21haW46Q2xlYW4iPg0KLSAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9IkNsZWFuIiAvPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X21haW46TWFrZSI+DQotICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdF9tYWluLmNicHJvaiIgVGFyZ2V0cz0iTWFrZSIgLz4NCi0gIDwvVGFyZ2V0Pg0KLSAgPFRhcmdldCBOYW1lPSJndGVzdF91bml0dGVzdCI+DQotICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdF91bml0dGVzdC5jYnByb2oiIFRhcmdldHM9IiIgLz4NCi0gIDwvVGFyZ2V0Pg0KLSAgPFRhcmdldCBOYW1lPSJndGVzdF91bml0dGVzdDpDbGVhbiI+DQotICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdF91bml0dGVzdC5jYnByb2oiIFRhcmdldHM9IkNsZWFuIiAvPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X3VuaXR0ZXN0Ok1ha2UiPg0KLSAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSJNYWtlIiAvPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4NCi0gICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iZ3Rlc3Q7Z3Rlc3RfbWFpbjtndGVzdF91bml0dGVzdCIgLz4NCi0gIDwvVGFyZ2V0Pg0KLSAgPFRhcmdldCBOYW1lPSJDbGVhbiI+DQotICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9Imd0ZXN0OkNsZWFuO2d0ZXN0X21haW46Q2xlYW47Z3Rlc3RfdW5pdHRlc3Q6Q2xlYW4iIC8+DQotICA8L1RhcmdldD4NCi0gIDxUYXJnZXQgTmFtZT0iTWFrZSI+DQotICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9Imd0ZXN0Ok1ha2U7Z3Rlc3RfbWFpbjpNYWtlO2d0ZXN0X3VuaXR0ZXN0Ok1ha2UiIC8+DQotICA8L1RhcmdldD4NCi0gIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuR3JvdXAuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkdyb3VwLlRhcmdldHMiIC8+DQotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3RfYWxsLmNjIGIvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMWIyZDguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9hbGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IEpvc2ggS2VsbGV5IChqb3Noa2VsQGdtYWlsLmNvbSkNCi0vLw0KLS8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KLS8vDQotLy8gQysrQnVpbGRlcidzIElERSBjYW5ub3QgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSBmcm9tIGZpbGVzIHdpdGggaHlwaGVucw0KLS8vIGluIHRoZWlyIG5hbWUuICBTZWUgaHR0cDovL3FjLmNvZGVnZWFyLmNvbS93Yy9xY21haW4uYXNweD9kPTcwOTc3IC4NCi0vLyBUaGlzIGZpbGUgc2VydmVzIGFzIGEgd29ya2Fyb3VuZC4NCi0NCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWFsbC5jYyINCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X2xpbmsuY2MgYi90ZXN0aW5nL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X2xpbmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGVjY2QuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiBKb3NoIEtlbGxleSAoam9zaGtlbEBnbWFpbC5jb20pDQotLy8NCi0vLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkNCi0vLw0KLS8vIExpbmtzIGd0ZXN0LmxpYiBhbmQgZ3Rlc3RfbWFpbi5saWIgaW50byB0aGUgY3VycmVudCBwcm9qZWN0IGluIEMrK0J1aWxkZXIuDQotLy8gVGhpcyBtZWFucyB0aGF0IHRoZXNlIGxpYnJhcmllcyBjYW4ndCBiZSByZW5hbWVkLCBidXQgaXQncyB0aGUgb25seSB3YXkgdG8NCi0vLyBlbnN1cmUgdGhhdCBEZWJ1ZyB2ZXJzdXMgUmVsZWFzZSB0ZXN0IGJ1aWxkcyBhcmUgbGlua2VkIGFnYWluc3QgdGhlDQotLy8gYXBwcm9wcmlhdGUgRGVidWcgb3IgUmVsZWFzZSBidWlsZCBvZiB0aGUgbGlicmFyaWVzLg0KLQ0KLSNwcmFnbWEgbGluayAiZ3Rlc3QubGliIg0KLSNwcmFnbWEgbGluayAiZ3Rlc3RfbWFpbi5saWIiDQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvaiBiL3Rlc3RpbmcvZ3Rlc3QvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NmNlMTMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvagorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQotICA8UHJvcGVydHlHcm91cD4NCi0gICAgPFByb2plY3RHdWlkPntiY2EzN2E3Mi01YjA3LTQ2Y2YtYjQ0ZS04OWY4ZTA2NDUxYTJ9PC9Qcm9qZWN0R3VpZD4NCi0gICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2UnIG9yICckKEJhc2UpJyE9JyciPg0KLSAgICA8QmFzZT50cnVlPC9CYXNlPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+DQotICAgIDxCYXNlPnRydWU8L0Jhc2U+DQotICAgIDxDZmdfMT50cnVlPC9DZmdfMT4NCi0gICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPg0KLSAgICA8QmFzZT50cnVlPC9CYXNlPg0KLSAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+DQotICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4NCi0gICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPnRydWU8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KLSAgICA8T3V0cHV0RXh0PmxpYjwvT3V0cHV0RXh0Pg0KLSAgICA8RENDX0NCdWlsZGVyT3V0cHV0PkpQSE5FPC9EQ0NfQ0J1aWxkZXJPdXRwdXQ+DQotICAgIDxEZWZpbmVzPk5PX1NUUklDVDwvRGVmaW5lcz4NCi0gICAgPER5bmFtaWNSVEw+dHJ1ZTwvRHluYW1pY1JUTD4NCi0gICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPg0KLSAgICA8UHJvamVjdFR5cGU+Q3BwU3RhdGljTGlicmFyeTwvUHJvamVjdFR5cGU+DQotICAgIDxCQ0NfQ1BQQ29tcGlsZUFsd2F5cz50cnVlPC9CQ0NfQ1BQQ29tcGlsZUFsd2F5cz4NCi0gICAgPFBhY2thZ2VJbXBvcnRzPnJ0bC5icGk7dmNsLmJwaTtiY2JpZS5icGk7dmNseC5icGk7dmNsYWN0bmJhbmQuYnBpO3htbHJ0bC5icGk7YmNic21wLmJwaTtkYnJ0bC5icGk7dmNsZGIuYnBpO2JkZXJ0bC5icGk7dmNsZGJ4LmJwaTtkc25hcC5icGk7ZHNuYXBjb24uYnBpO3ZjbGliLmJwaTtpYnhwcmVzcy5icGk7YWRvcnRsLmJwaTtkYnhjZHMuYnBpO2RiZXhwcmVzcy5icGk7RGJ4Q29tbW9uRHJpdmVyLmJwaTt3ZWJzbmFwLmJwaTt2Y2xpZS5icGk7d2ViZHNuYXAuYnBpO2luZXQuYnBpO2luZXRkYmJkZS5icGk7aW5ldGRieHByZXNzLmJwaTtzb2FwcnRsLmJwaTtSYXZlNzVWQ0wuYnBpO3RlZVVJLmJwaTt0ZWUuYnBpO3RlZWRiLmJwaTtJbmR5Q29yZS5icGk7SW5keVN5c3RlbS5icGk7SW5keVByb3RvY29scy5icGk7SW50cmF3ZWJEQl85MF8xMDAuYnBpO0ludHJhd2ViXzkwXzEwMC5icGk7ZGNsWmlwRm9yZ2VkMTEuYnBpO3ZjbFppcEZvcmdlZDExLmJwaTtHUjMyX0JEUzIwMDYuYnBpO0dSMzJfRFNHTl9CRFMyMDA2LmJwaTtKY2wuYnBpO0pjbFZjbC5icGk7SnZDb3JlRDExUi5icGk7SnZTeXN0ZW1EMTFSLmJwaTtKdlN0ZEN0cmxzRDExUi5icGk7SnZBcHBGcm1EMTFSLmJwaTtKdkJhbmRzRDExUi5icGk7SnZEQkQxMVIuYnBpO0p2RGxnc0QxMVIuYnBpO0p2QkRFRDExUi5icGk7SnZDbXBEMTFSLmJwaTtKdkNyeXB0RDExUi5icGk7SnZDdHJsc0QxMVIuYnBpO0p2Q3VzdG9tRDExUi5icGk7SnZEb2NraW5nRDExUi5icGk7SnZEb3ROZXRDdHJsc0QxMVIuYnBpO0p2RURJRDExUi5icGk7SnZHbG9idXNEMTFSLmJwaTtKdkhNSUQxMVIuYnBpO0p2SW50ZXJwcmV0ZXJEMTFSLmJwaTtKdkphbnNEMTFSLmJwaTtKdk1hbmFnZWRUaHJlYWRzRDExUi5icGk7SnZNTUQxMVIuYnBpO0p2TmV0RDExUi5icGk7SnZQYWdlQ29tcHNEMTFSLmJwaTtKdlBsdWdpbkQxMVIuYnBpO0p2UHJpbnRQcmV2aWV3RDExUi5icGk7SnZSdW50aW1lRGVzaWduRDExUi5icGk7SnZUaW1lRnJhbWV3b3JrRDExUi5icGk7SnZWYWxpZGF0b3JzRDExUi5icGk7SnZXaXphcmREMTFSLmJwaTtKdlhQQ3RybHNEMTFSLmJwaTtWY2xTbXAuYnBpO0NFeGNlcHRpb25FeHBlcnQxMS5icGk8L1BhY2thZ2VJbXBvcnRzPg0KLSAgICA8QkNDX3dwYXI+ZmFsc2U8L0JDQ193cGFyPg0KLSAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0luY2x1ZGVQYXRoPg0KLSAgICA8QWxsUGFja2FnZUxpYnM+cnRsLmxpYjt2Y2wubGliPC9BbGxQYWNrYWdlTGlicz4NCi0gICAgPFRMSUJfUGFnZVNpemU+MzI8L1RMSUJfUGFnZVNpemU+DQotICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazwvSUxJTktfTGlicmFyeVBhdGg+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4NCi0gICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPmZhbHNlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCi0gICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPg0KLSAgICA8RENDX0RlYnVnSW5mb0luRXhlPnRydWU8L0RDQ19EZWJ1Z0luZm9JbkV4ZT4NCi0gICAgPERlZmluZXM+X0RFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQotICAgIDxJTElOS19GdWxsRGVidWdJbmZvPnRydWU8L0lMSU5LX0Z1bGxEZWJ1Z0luZm8+DQotICAgIDxCQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+ZmFsc2U8L0JDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCi0gICAgPElMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+dHJ1ZTwvSUxJTktfRGlzYWJsZUluY3JlbWVudGFsTGlua2luZz4NCi0gICAgPEJDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz5Ob25lPC9CQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+DQotICAgIDxEQ0NfRGVmaW5lPkRFQlVHPC9EQ0NfRGVmaW5lPg0KLSAgICA8QkNDX0RlYnVnTGluZU51bWJlcnM+dHJ1ZTwvQkNDX0RlYnVnTGluZU51bWJlcnM+DQotICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+RGVidWc8L0ludGVybWVkaWF0ZU91dHB1dERpcj4NCi0gICAgPFRBU01fRGlzcGxheVNvdXJjZUxpbmVzPnRydWU8L1RBU01fRGlzcGxheVNvdXJjZUxpbmVzPg0KLSAgICA8QkNDX1N0YWNrRnJhbWVzPnRydWU8L0JDQ19TdGFja0ZyYW1lcz4NCi0gICAgPEJDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz50cnVlPC9CQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+DQotICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXGRlYnVnOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCi0gICAgPFRBU01fRGVidWdnaW5nPkZ1bGw8L1RBU01fRGVidWdnaW5nPg0KLSAgICA8QkNDX1NvdXJjZURlYnVnZ2luZ09uPnRydWU8L0JDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPg0KLSAgICA8RGVmaW5lcz5OREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4NCi0gICAgPEludGVybWVkaWF0ZU91dHB1dERpcj5SZWxlYXNlPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQotICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXHJlbGVhc2U7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPg0KLSAgICA8VEFTTV9EZWJ1Z2dpbmc+Tm9uZTwvVEFTTV9EZWJ1Z2dpbmc+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvamVjdEV4dGVuc2lvbnM+DQotICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkNQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk8L0JvcmxhbmQuUGVyc29uYWxpdHk+DQotICAgIDxCb3JsYW5kLlByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L0JvcmxhbmQuUHJvamVjdFR5cGU+DQotICAgIDxCb3JsYW5kUHJvamVjdD4NCi08Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPg0KLSAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KLSAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZXhwMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgWFAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCi0gICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMSI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMiI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXHNyYzsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTAiPk5PX1NUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iSXRlbTAiPjMyPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0xIj4xNjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCi0gIDwvUHJvamVjdEV4dGVuc2lvbnM+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuQ3BwLlRhcmdldHMiIC8+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q3BwQ29tcGlsZSBJbmNsdWRlPSIuLlxzcmNcZ3Rlc3RfbWFpbi5jYyI+DQotICAgICAgPEJ1aWxkT3JkZXI+MDwvQnVpbGRPcmRlcj4NCi0gICAgPC9DcHBDb21waWxlPg0KLSAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4NCi0gICAgICA8S2V5PkNmZ18xPC9LZXk+DQotICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KLSAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPg0KLSAgICAgIDxLZXk+Q2ZnXzI8L0tleT4NCi0gICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+DQotICA8L0l0ZW1Hcm91cD4NCi08L1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9jb2RlZ2Vhci9ndGVzdF91bml0dGVzdC5jYnByb2ogYi90ZXN0aW5nL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1ZGI4ZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2NvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvagorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQotICA8UHJvcGVydHlHcm91cD4NCi0gICAgPFByb2plY3RHdWlkPntlZWE2MzM5My01YWM1LTRiOWMtODkwOS1kNzVmZWYyZGFhNDF9PC9Qcm9qZWN0R3VpZD4NCi0gICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2UnIG9yICckKEJhc2UpJyE9JyciPg0KLSAgICA8QmFzZT50cnVlPC9CYXNlPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+DQotICAgIDxCYXNlPnRydWU8L0Jhc2U+DQotICAgIDxDZmdfMT50cnVlPC9DZmdfMT4NCi0gICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPg0KLSAgICA8QmFzZT50cnVlPC9CYXNlPg0KLSAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+DQotICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4NCi0gICAgPE91dHB1dEV4dD5leGU8L091dHB1dEV4dD4NCi0gICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPnRydWU8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KLSAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQotICAgIDxEQ0NfQ0J1aWxkZXJPdXRwdXQ+SlBITkU8L0RDQ19DQnVpbGRlck91dHB1dD4NCi0gICAgPER5bmFtaWNSVEw+dHJ1ZTwvRHluYW1pY1JUTD4NCi0gICAgPElMSU5LX09iamVjdFNlYXJjaFBhdGg+Li5cdGVzdDwvSUxJTktfT2JqZWN0U2VhcmNoUGF0aD4NCi0gICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPg0KLSAgICA8UHJvamVjdFR5cGU+Q3BwQ29uc29sZUFwcGxpY2F0aW9uPC9Qcm9qZWN0VHlwZT4NCi0gICAgPE5vVkNMPnRydWU8L05vVkNMPg0KLSAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQotICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO0pjbC5icGk7SmNsVmNsLmJwaTtKdkNvcmVEMTFSLmJwaTtKdlN5c3RlbUQxMVIuYnBpO0p2U3RkQ3RybHNEMTFSLmJwaTtKdkFwcEZybUQxMVIuYnBpO0p2QmFuZHNEMTFSLmJwaTtKdkRCRDExUi5icGk7SnZEbGdzRDExUi5icGk7SnZCREVEMTFSLmJwaTtKdkNtcEQxMVIuYnBpO0p2Q3J5cHREMTFSLmJwaTtKdkN0cmxzRDExUi5icGk7SnZDdXN0b21EMTFSLmJwaTtKdkRvY2tpbmdEMTFSLmJwaTtKdkRvdE5ldEN0cmxzRDExUi5icGk7SnZFRElEMTFSLmJwaTtKdkdsb2J1c0QxMVIuYnBpO0p2SE1JRDExUi5icGk7SnZJbnRlcnByZXRlckQxMVIuYnBpO0p2SmFuc0QxMVIuYnBpO0p2TWFuYWdlZFRocmVhZHNEMTFSLmJwaTtKdk1NRDExUi5icGk7SnZOZXREMTFSLmJwaTtKdlBhZ2VDb21wc0QxMVIuYnBpO0p2UGx1Z2luRDExUi5icGk7SnZQcmludFByZXZpZXdEMTFSLmJwaTtKdlJ1bnRpbWVEZXNpZ25EMTFSLmJwaTtKdlRpbWVGcmFtZXdvcmtEMTFSLmJwaTtKdlZhbGlkYXRvcnNEMTFSLmJwaTtKdldpemFyZEQxMVIuYnBpO0p2WFBDdHJsc0QxMVIuYnBpO1ZjbFNtcC5icGk8L1BhY2thZ2VJbXBvcnRzPg0KLSAgICA8QkNDX3dwYXI+ZmFsc2U8L0JDQ193cGFyPg0KLSAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9JbmNsdWRlUGF0aD4NCi0gICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOy4uXHRlc3Q8L0lMSU5LX0xpYnJhcnlQYXRoPg0KLSAgICA8TXVsdGl0aHJlYWRlZD50cnVlPC9NdWx0aXRocmVhZGVkPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQotICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQotICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCi0gICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQotICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KLSAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KLSAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQotICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQotICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KLSAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCi0gICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQotICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCi0gICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQotICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KLSAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQotICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCi0gICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCi0gICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQotICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KLSAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCi0gICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb2plY3RFeHRlbnNpb25zPg0KLSAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KLSAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBDb25zb2xlQXBwbGljYXRpb248L0JvcmxhbmQuUHJvamVjdFR5cGU+DQotICAgIDxCb3JsYW5kUHJvamVjdD4NCi08Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPg0KLSAgICAgIA0KLSAgICAgIA0KLSAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KLSAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZXhwMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgWFAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCi0gICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXGluY2x1ZGU7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0yIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9Ikl0ZW0xIj4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazsuLlx0ZXN0PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOyQoT1VUUFVURElSKTsuLlx0ZXN0PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4yPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTEiPlNUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCi0gIDwvUHJvamVjdEV4dGVuc2lvbnM+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuQ3BwLlRhcmdldHMiIC8+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q3BwQ29tcGlsZSBJbmNsdWRlPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCi0gICAgICA8QnVpbGRPcmRlcj4wPC9CdWlsZE9yZGVyPg0KLSAgICA8L0NwcENvbXBpbGU+DQotICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Imd0ZXN0X2xpbmsuY2MiPg0KLSAgICAgIDxCdWlsZE9yZGVyPjE8L0J1aWxkT3JkZXI+DQotICAgIDwvQ3BwQ29tcGlsZT4NCi0gICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQotICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KLSAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCi0gICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCi0gICAgICA8S2V5PkNmZ18yPC9LZXk+DQotICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KLSAgPC9JdGVtR3JvdXA+DQotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvY29uZmlndXJlLmFjIGIvdGVzdGluZy9ndGVzdC9jb25maWd1cmUuYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNTkyZTEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9jb25maWd1cmUuYWMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1tNF9pbmNsdWRlKG00L2FjeF9wdGhyZWFkLm00KQotCi0jIEF0IHRoaXMgcG9pbnQsIHRoZSBYY29kZSBwcm9qZWN0IGFzc3VtZXMgdGhlIHZlcnNpb24gc3RyaW5nIHdpbGwgYmUgdGhyZWUKLSMgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgYW5kIHN1cnJvdW5kZWQgYnkgc3F1YXJlIGJyYWNrZXRzIChlLmcuCi0jICJbMS4wLjFdIikuIEl0IGFsc28gYXN1bWVzIHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55IGNsb3NpbmcgcGFyZW50aGVzaXMKLSMgYmV0d2VlbiAiQUNfSU5JVCgiIGFuZCB0aGUgY2xvc2luZyAiKSIgaW5jbHVkaW5nIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgotQUNfSU5JVChbR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29ya10sCi0gICAgICAgIFsxLjcuMF0sCi0gICAgICAgIFtnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb21dLAotICAgICAgICBbZ3Rlc3RdKQotCi0jIFByb3ZpZGUgdmFyaW91cyBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIEF1dG9jb25mIGFuZCBjb25maWd1cmUgcHJvY2Vzc2VzLgotQUNfUFJFUkVRKFsyLjU5XSkKLUFDX0NPTkZJR19TUkNESVIoWy4vTElDRU5TRV0pCi1BQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCi1BQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtYXV4XSkKLUFDX0NPTkZJR19IRUFERVJTKFtidWlsZC1hdXgvY29uZmlnLmhdKQotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCi1BQ19DT05GSUdfRklMRVMoW3NjcmlwdHMvZ3Rlc3QtY29uZmlnXSwgW2NobW9kICt4IHNjcmlwdHMvZ3Rlc3QtY29uZmlnXSkKLQotIyBJbml0aWFsaXplIEF1dG9tYWtlIHdpdGggdmFyaW91cyBvcHRpb25zLiBXZSByZXF1aXJlIGF0IGxlYXN0IHYxLjksIHByZXZlbnQKLSMgcGVkYW50aWMgY29tcGxhaW50cyBhYm91dCBwYWNrYWdlIGZpbGVzLCBhbmQgZW5hYmxlIHZhcmlvdXMgZGlzdHJpYnV0aW9uCi0jIHRhcmdldHMuCi1BTV9JTklUX0FVVE9NQUtFKFsxLjkgZGlzdC1iemlwMiBkaXN0LXppcCBmb3JlaWduIHN1YmRpci1vYmplY3RzXSkKLQotIyBDaGVjayBmb3IgcHJvZ3JhbXMgdXNlZCBpbiBidWlsZGluZyBHb29nbGUgVGVzdC4KLUFDX1BST0dfQ0MKLUFDX1BST0dfQ1hYCi1BQ19MQU5HKFtDKytdKQotQUNfUFJPR19MSUJUT09MCi0KLSMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IEN1cnJlbnRseSB3ZSBhcmVuJ3QgcnVubmluZyB0aGUgUHl0aG9uIHRlc3RzCi0jIGFnYWluc3QgdGhlIGludGVycHJldGVyIGRldGVjdGVkIGJ5IEFNX1BBVEhfUFlUSE9OLCBhbmQgc28gd2UgY29uZGl0aW9uCi0jIEhBVkVfUFlUSE9OIGJ5IHJlcXVpcmluZyAicHl0aG9uIiB0byBiZSBpbiB0aGUgUEFUSCwgYW5kIHRoYXQgaW50ZXJwcmV0ZXIncwotIyB2ZXJzaW9uIHRvIGJlID49IDIuMy4gVGhpcyB3aWxsIGFsbG93IHRoZSBzY3JpcHRzIHRvIHVzZSBhICIvdXNyL2Jpbi9lbnYiCi0jIGhhc2hiYW5nLgotUFlUSE9OPSAgIyBXZSAqZG8gbm90KiBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcHl0aG9uIGludGVycHJldGVyCi1BQ19QQVRIX1BST0coW1BZVEhPTl0sW3B5dGhvbl0sWzpdKQotQVNfSUYoW3Rlc3QgIiRQWVRIT04iICE9ICI6Il0sCi0gICAgICBbQU1fUFlUSE9OX0NIRUNLX1ZFUlNJT04oWyRQWVRIT05dLFsyLjNdLFs6XSxbUFlUSE9OPSI6Il0pXSkKLUFNX0NPTkRJVElPTkFMKFtIQVZFX1BZVEhPTl0sW3Rlc3QgIiRQWVRIT04iICE9ICI6Il0pCi0KLSMgQ29uZmlndXJlIHB0aHJlYWRzLgotQUNfQVJHX1dJVEgoW3B0aHJlYWRzXSwKLSAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXB0aHJlYWRzXSwKLSAgICAgICAgICAgICAgIFt1c2UgcHRocmVhZHMgKGRlZmF1bHQgaXMgeWVzKV0pXSwKLSAgICAgICAgICAgIFt3aXRoX3B0aHJlYWRzPSR3aXRodmFsXSwKLSAgICAgICAgICAgIFt3aXRoX3B0aHJlYWRzPWNoZWNrXSkKLQotaGF2ZV9wdGhyZWFkcz1ubwotQVNfSUYoW3Rlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhubyJdLAotICAgICAgW0FDWF9QVEhSRUFEKAotICAgICAgICBbXSwKLSAgICAgICAgW0FTX0lGKFt0ZXN0ICJ4JHdpdGhfcHRocmVhZHMiICE9ICJ4Y2hlY2siXSwKLSAgICAgICAgICAgICAgIFtBQ19NU0dfRkFJTFVSRSgKLSAgICAgICAgICAgICAgICAgWy0td2l0aC1wdGhyZWFkcyB3YXMgc3BlY2lmaWVkLCBidXQgdW5hYmxlIHRvIGJlIHVzZWRdKV0pXSkKLSAgICAgICBoYXZlX3B0aHJlYWRzPSIkYWN4X3B0aHJlYWRfb2siXSkKLUFNX0NPTkRJVElPTkFMKFtIQVZFX1BUSFJFQURTXSxbdGVzdCAieCRoYXZlX3B0aHJlYWRzIiA9ICJ4eWVzIl0pCi1BQ19TVUJTVChQVEhSRUFEX0NGTEFHUykKLUFDX1NVQlNUKFBUSFJFQURfTElCUykKLQotIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayBmb3IgdGhlIG5lY2Vzc2FyeSBzeXN0ZW0gaGVhZGVycy4KLQotIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKSBDaGVjayB0aGUgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBvdGhlciBjb21waWxlcgotIyBhbmQgYXJjaGl0ZWN0dXJlIGNoYXJhY3RlcmlzdGljcy4KLQotIyBPdXRwdXQgdGhlIGdlbmVyYXRlZCBmaWxlcy4gTm8gZnVydGhlciBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIHVzZWQuCi1BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvZW1wdHkuY2MgYi90ZXN0aW5nL2d0ZXN0L2VtcHR5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTQyMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2d0ZXN0L2VtcHR5LmNjCkBAIC0wLDAgKzEsMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMKKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaAppbmRleCA5NTdhNjljLi5lNTE1OGIyIDEwMDY0NAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oCisrKyBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgKQEAgLTEsMjk0ICsxLDE1IEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIGRlYXRoIHRlc3RzLiAgSXQgaXMKLS8vICNpbmNsdWRlZCBieSBndGVzdC5oIHNvIGEgdXNlciBkb2Vzbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzCi0vLyBkaXJlY3RseS4KKy8vIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KKyNpZm5kZWYgVEVTVElOR19HVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KKyNkZWZpbmUgVEVTVElOR19HVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KIAotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCIKKy8vIFRoZSBmaWxlL2RpcmVjdG9yeSBsYXlvdXQgb2YgR29vZ2xlIFRlc3QgaXMgbm90IHlldCBjb25zaWRlcmVkIHN0YWJsZS4gVW50aWwKKy8vIGl0IHN0YWJpbGl6ZXMsIENocm9taXVtIGNvZGUgd2lsbCB1c2UgZm9yd2FyZGluZyBoZWFkZXJzIGluIHRlc3RpbmcvZ3Rlc3QKKy8vIGFuZCB0ZXN0aW5nL2dtb2NrLCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGluY2x1ZGluZyBmaWxlcyBpbgorLy8gdGhpcmRfcGFydHkvZ29vZ2xldGVzdC4KIAotbmFtZXNwYWNlIHRlc3RpbmcgeworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLS8vIFRoaXMgZmxhZyBjb250cm9scyB0aGUgc3R5bGUgb2YgZGVhdGggdGVzdHMuICBWYWxpZCB2YWx1ZXMgYXJlICJ0aHJlYWRzYWZlIiwKLS8vIG1lYW5pbmcgdGhhdCB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHdpbGwgcmUtZXhlY3V0ZSB0aGUgdGVzdCBiaW5hcnkKLS8vIGZyb20gdGhlIHN0YXJ0LCBydW5uaW5nIG9ubHkgYSBzaW5nbGUgZGVhdGggdGVzdCwgb3IgImZhc3QiLAotLy8gbWVhbmluZyB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZXhlY3V0ZSB0aGUgdGVzdCBsb2dpYyBpbW1lZGlhdGVseQotLy8gYWZ0ZXIgZm9ya2luZy4KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FsbGVyIGlzIGN1cnJlbnRseQotLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzCi0vLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoCi0vLyB0ZXN0cy4gIElNUE9SVEFOVDogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5LiAgVXNpbmcgaXQgbWF5IGJyZWFrIHRoZQotLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0LgotR1RFU1RfQVBJXyBib29sIEluRGVhdGhUZXN0Q2hpbGQoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVhdGggdGVzdHMuCi0KLS8vIEhlcmUncyB3aGF0IGhhcHBlbnMgd2hlbiBhbiBBU1NFUlRfREVBVEgqIG9yIEVYUEVDVF9ERUFUSCogaXMKLS8vIGV4ZWN1dGVkOgotLy8KLS8vICAgMS4gSXQgZ2VuZXJhdGVzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFjdGl2ZQotLy8gICB0aHJlYWQuICBUaGlzIGlzIGJlY2F1c2UgaXQncyBzYWZlIHRvIGZvcmsoKSBvciBjbG9uZSgpIG9ubHkKLS8vICAgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0aHJlYWQuCi0vLwotLy8gICAyLiBUaGUgcGFyZW50IHByb2Nlc3MgY2xvbmUoKXMgYSBzdWItcHJvY2VzcyBhbmQgcnVucyB0aGUgZGVhdGgKLS8vICAgdGVzdCBpbiBpdDsgdGhlIHN1Yi1wcm9jZXNzIGV4aXRzIHdpdGggY29kZSAwIGF0IHRoZSBlbmQgb2YgdGhlCi0vLyAgIGRlYXRoIHRlc3QsIGlmIGl0IGhhc24ndCBleGl0ZWQgYWxyZWFkeS4KLS8vCi0vLyAgIDMuIFRoZSBwYXJlbnQgcHJvY2VzcyB3YWl0cyBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4KLS8vCi0vLyAgIDQuIFRoZSBwYXJlbnQgcHJvY2VzcyBjaGVja3MgdGhlIGV4aXQgY29kZSBhbmQgZXJyb3IgbWVzc2FnZSBvZgotLy8gICB0aGUgc3ViLXByb2Nlc3MuCi0vLwotLy8gRXhhbXBsZXM6Ci0vLwotLy8gICBBU1NFUlRfREVBVEgoc2VydmVyLlNlbmRNZXNzYWdlKDU2LCAiSGVsbG8iKSwgIkludmFsaWQgcG9ydCBudW1iZXIiKTsKLS8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLS8vICAgICBFWFBFQ1RfREVBVEgoc2VydmVyLlByb2Nlc3NSZXF1ZXN0KGkpLAotLy8gICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1ZXN0IC4qIGluIFByb2Nlc3NSZXF1ZXN0KCkiKQotLy8gICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpZSBvbiByZXF1ZXN0ICIgPDwgaTsKLS8vICAgfQotLy8KLS8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKLS8vCi0vLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgewotLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOwotLy8gICB9Ci0vLwotLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKLS8vCi0vLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgotLy8KLS8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAotLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCi0vLwotLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAotLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAotLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCi0vLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQotLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAotLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAotLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KLS8vCi0vLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQotLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCi0vLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCi0vLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7Ci0vLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCi0vLyAgIG5hdHVyYWwgbnVtYmVycy4KLS8vCi0vLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYwotLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKLS8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKLS8vICAgICBcXGYgICBtYXRjaGVzIFxmCi0vLyAgICAgXFxuICAgbWF0Y2hlcyBcbgotLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKLS8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KLS8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKLS8vICAgICBcXHQgICBtYXRjaGVzIFx0Ci0vLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgotLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAotLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCi0vLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCi0vLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KLS8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCi0vLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQotLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKLS8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKLS8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKLS8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQotLy8KLS8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcwotLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0Ci0vLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCi0vLyAgIGFib3ZlIHN5bnRheC4KLS8vCi0vLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAotLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQotLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKLS8vICAgYSBjaGlsZCBwcm9jZXNzLgotLy8KLS8vIEtub3duIGNhdmVhdHM6Ci0vLwotLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKLS8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgotLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAotLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAotLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCi0vLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCi0vLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKLS8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5Ci0vLyAgIGRpcmVjdG9yeSBpbiBQQVRILgotLy8KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KLQotLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCi0vLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAotLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgotIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCi0gICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQotLy8gdGVzdCBjYXNlLCBpZiBhbnk6Ci0jIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKLSAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotCi0vLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQotLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQotLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KLSMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCi0KLS8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCi0vLyB0ZXN0IGNhc2UsIGlmIGFueToKLSMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCi0KLS8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKLQotLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KLWNsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7Ci0gIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OwotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKLQotICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKLX07Ci0KLSMgaWYgIUdURVNUX09TX1dJTkRPV1MKLS8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCi0vLyBnaXZlbiBzaWduYWwuCi1jbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOwotICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKLSBwcml2YXRlOgotICBjb25zdCBpbnQgc2lnbnVtXzsKLX07Ci0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUwotCi0vLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgotLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAotLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKLS8vIGluIGRlYnVnIG1vZGUuCi0vLwotLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQotLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKLS8vCi0vLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7Ci0vLyAgIGlmIChzaWRlZWZmZWN0KSB7Ci0vLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKLS8vICAgfQotLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOwotLy8gICByZXR1cm4gMTI7Ci0vLyB9Ci0vLwotLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7Ci0vLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKLS8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KLS8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7Ci0vLwotLy8gI2lmZGVmIE5ERUJVRwotLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgotLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOwotLy8gI2Vsc2UKLS8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgotLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7Ci0vLyAjZW5kaWYKLS8vIH0KLS8vCi0vLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCi0vLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCi0vLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91Ci0vLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0Ci0vLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCi0vLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgotLy8KLS8vIEVYUEVDVF9ERUJVR19ERUFUSCh7Ci0vLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KLS8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCi0vLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKLS8vIH0sICJkZWF0aCIpOwotLy8KLSMgaWZkZWYgTkRFQlVHCi0KLSMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAotICBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkKLQotIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQotCi0jIGVsc2UKLQotIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQotCi0jICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCi0KLSMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCi0vLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCi0vLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKLS8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0Ci0vLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0jIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKLSMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQotI2Vsc2UKLSMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKLSMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworI2VuZGlmICAvLyBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKaW5kZXggODU5OGI4ZS4uNTFlMTA2ZSAxMDA2NDQKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaAorKysgYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oCkBAIC0xLDI5OSArMSwxNSBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBNZXNzYWdlIGNsYXNzLgotLy8KLS8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvCi0vLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4KLS8vIFRoZXkgYXJlIGNsZWFybHkgbWFya2VkIGJ5IGNvbW1lbnRzIGxpa2UgdGhpczoKLS8vCi0vLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLS8vCi0vLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdAotLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyCi0vLyBwcm9ncmFtIQorLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMKKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXworI2lmbmRlZiBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXworI2RlZmluZSBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXwogCi0jaW5jbHVkZSA8bGltaXRzPgorLy8gVGhlIGZpbGUvZGlyZWN0b3J5IGxheW91dCBvZiBHb29nbGUgVGVzdCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgc3RhYmxlLiBVbnRpbAorLy8gaXQgc3RhYmlsaXplcywgQ2hyb21pdW0gY29kZSB3aWxsIHVzZSBmb3J3YXJkaW5nIGhlYWRlcnMgaW4gdGVzdGluZy9ndGVzdAorLy8gYW5kIHRlc3RpbmcvZ21vY2ssIGluc3RlYWQgb2YgZGlyZWN0bHkgaW5jbHVkaW5nIGZpbGVzIGluCisvLyB0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0LgogCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLS8vIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3BlcmF0b3I8PCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLS8vIFNlZSBNZXNzYWdlJiBvcGVyYXRvcjw8KC4uLikgYmVsb3cgZm9yIHdoeS4KLXZvaWQgb3BlcmF0b3I8PChjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6U2VjcmV0JiwgaW50KTsKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBUT0RPOiBSZW1vdmUgY2xhbmcgdmVyc2lvbiBjaGVjayB3b3JrYXJvdW5kLgotI2lmIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPT0gMyAmJiBfX2NsYW5nX21pbm9yX18gPD0gNgotI2RlZmluZSBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgotI2VuZGlmICAvLyBfX2NsYW5nX18gJiYgX19jbGFuZ19tYWpvcl9fID09IDMgJiYgX19jbGFuZ19taW5vcl9fIDw9IDYKLQotLy8gVGhlIE1lc3NhZ2UgY2xhc3Mgd29ya3MgbGlrZSBhbiBvc3RyZWFtIHJlcGVhdGVyLgotLy8KLS8vIFR5cGljYWwgdXNhZ2U6Ci0vLwotLy8gICAxLiBZb3Ugc3RyZWFtIGEgYnVuY2ggb2YgdmFsdWVzIHRvIGEgTWVzc2FnZSBvYmplY3QuCi0vLyAgICAgIEl0IHdpbGwgcmVtZW1iZXIgdGhlIHRleHQgaW4gYSBzdHJpbmdzdHJlYW0uCi0vLyAgIDIuIFRoZW4geW91IHN0cmVhbSB0aGUgTWVzc2FnZSBvYmplY3QgdG8gYW4gb3N0cmVhbS4KLS8vICAgICAgVGhpcyBjYXVzZXMgdGhlIHRleHQgaW4gdGhlIE1lc3NhZ2UgdG8gYmUgc3RyZWFtZWQKLS8vICAgICAgdG8gdGhlIG9zdHJlYW0uCi0vLwotLy8gRm9yIGV4YW1wbGU7Ci0vLwotLy8gICB0ZXN0aW5nOjpNZXNzYWdlIGZvbzsKLS8vICAgZm9vIDw8IDEgPDwgIiAhPSAiIDw8IDI7Ci0vLyAgIHN0ZDo6Y291dCA8PCBmb287Ci0vLwotLy8gd2lsbCBwcmludCAiMSAhPSAyIi4KLS8vCi0vLyBNZXNzYWdlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbmhlcml0ZWQgZnJvbS4gIEluIHBhcnRpY3VsYXIsIGl0cwotLy8gZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4KLS8vCi0vLyBOb3RlIHRoYXQgc3RyaW5nc3RyZWFtIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gZ2NjIGFuZCBpbiBNU1ZDLiAgWW91Ci0vLyBjYW4gc3RyZWFtIGEgTlVMTCBjaGFyIHBvaW50ZXIgdG8gaXQgaW4gdGhlIGZvcm1lciwgYnV0IG5vdCBpbiB0aGUKLS8vIGxhdHRlciAoaXQgY2F1c2VzIGFuIGFjY2VzcyB2aW9sYXRpb24gaWYgeW91IGRvKS4gIFRoZSBNZXNzYWdlCi0vLyBjbGFzcyBoaWRlcyB0aGlzIGRpZmZlcmVuY2UgYnkgdHJlYXRpbmcgYSBOVUxMIGNoYXIgcG9pbnRlciBhcwotLy8gIihudWxsKSIuCi1jbGFzcyBHVEVTVF9BUElfIE1lc3NhZ2UgewotIHByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIGJhc2ljIElPIG1hbmlwdWxhdG9ycyAoZW5kbCwgZW5kcywgYW5kIGZsdXNoKSBmb3IKLSAgLy8gbmFycm93IHN0cmVhbXMuCi0gIHR5cGVkZWYgc3RkOjpvc3RyZWFtJiAoKkJhc2ljTmFycm93SW9NYW5pcCkoc3RkOjpvc3RyZWFtJik7Ci0KLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gZW1wdHkgTWVzc2FnZS4KLSAgTWVzc2FnZSgpOwotCi0jaWYgZGVmaW5lZChDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNikKLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtc2cpIHsgIC8vIE5PTElOVAotICAgIHNzXyA8PCBtc2cuR2V0U3RyaW5nKCk7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RzIGEgTWVzc2FnZSBmcm9tIGEgQy1zdHJpbmcuCi0gIGV4cGxpY2l0IE1lc3NhZ2UoY29uc3QgY2hhciogc3RyKSB7Ci0gICAgc3NfIDw8IHN0cjsKLSAgfQotI2Vsc2UKLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtc2cpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7ICAvLyBOT0xJTlQKLSAgICAqc3NfIDw8IG1zZy5HZXRTdHJpbmcoKTsKLSAgfQotCi0gIC8vIENvbnN0cnVjdHMgYSBNZXNzYWdlIGZyb20gYSBDLXN0cmluZy4KLSAgZXhwbGljaXQgTWVzc2FnZShjb25zdCBjaGFyKiBzdHIpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7Ci0gICAgKnNzXyA8PCBzdHI7Ci0gIH0KLSNlbmRpZiAgLy8gQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYKLQotI2lmIEdURVNUX09TX1NZTUJJQU4KLSAgLy8gU3RyZWFtcyBhIHZhbHVlIChlaXRoZXIgYSBwb2ludGVyIG9yIG5vdCkgdG8gdGhpcyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsdWUpIHsKLSAgICBTdHJlYW1IZWxwZXIodHlwZW5hbWUgaW50ZXJuYWw6OmlzX3BvaW50ZXI8VD46OnR5cGUoKSwgdmFsdWUpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2Vsc2UKLSAgLy8gU3RyZWFtcyBhIG5vbi1wb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmIHZhbCkgewotICAgIC8vIFNvbWUgbGlicmFyaWVzIG92ZXJsb2FkIDw8IGZvciBTVEwgY29udGFpbmVycy4gIFRoZXNlCi0gICAgLy8gb3ZlcmxvYWRzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGluc3RlYWQgb2YgOjpzdGQuCi0gICAgLy8KLSAgICAvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlCi0gICAgLy8gb3ZlcmxvYWRzIGFyZSB2aXNpYmxlIGluIGVpdGhlciB0aGUgc3RkIG5hbWVzcGFjZSBvciB0aGUgZ2xvYmFsCi0gICAgLy8gbmFtZXNwYWNlLCBidXQgbm90IG90aGVyIG5hbWVzcGFjZXMsIGluY2x1ZGluZyB0aGUgdGVzdGluZwotICAgIC8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uCi0gICAgLy8KLSAgICAvLyBUbyBhbGxvdyBTVEwgY29udGFpbmVycyAoYW5kIG90aGVyIHR5cGVzIHRoYXQgaGFzIGEgPDwgb3BlcmF0b3IKLSAgICAvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0Ci0gICAgLy8gYXNzZXJ0aW9ucywgdGVzdGluZzo6TWVzc2FnZSBtdXN0IGFjY2VzcyB0aGUgY3VzdG9tIDw8IG9wZXJhdG9yCi0gICAgLy8gZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFdpdGggdGhpcyB1c2luZyBkZWNsYXJhdGlvbiwKLSAgICAvLyBvdmVybG9hZHMgb2YgPDwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBhbmQgdGhvc2UKLSAgICAvLyB2aXNpYmxlIHZpYSBLb2VuaWcgbG9va3VwIGFyZSBib3RoIGV4cG9zZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAgICB1c2luZyA6Om9wZXJhdG9yIDw8OwotI2lmIGRlZmluZWQoQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYpCi0gICAgc3NfIDw8IHZhbDsKLSNlbHNlCi0gICAgKnNzXyA8PCB2YWw7Ci0jZW5kaWYgIC8vIENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gU3RyZWFtcyBhIHBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCi0gIC8vCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gb3ZlcmxvYWQgb2YgdGhlIHByZXZpb3VzIG9uZS4gIFdoZW4geW91Ci0gIC8vIHN0cmVhbSBhIHBvaW50ZXIgdG8gYSBNZXNzYWdlLCB0aGlzIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkIGFzIGl0Ci0gIC8vIGlzIG1vcmUgc3BlY2lhbGl6ZWQuICAoVGhlIEMrKyBTdGFuZGFyZCwgc2VjdGlvbgotICAvLyBbdGVtcC5mdW5jLm9yZGVyXS4pICBJZiB5b3Ugc3RyZWFtIGEgbm9uLXBvaW50ZXIsIHRoZW4gdGhlCi0gIC8vIHByZXZpb3VzIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkLgotICAvLwotICAvLyBUaGUgcmVhc29uIGZvciB0aGlzIG92ZXJsb2FkIGlzIHRoYXQgc3RyZWFtaW5nIGEgTlVMTCBwb2ludGVyIHRvCi0gIC8vIG9zdHJlYW0gaXMgdW5kZWZpbmVkIGJlaGF2aW9yLiAgRGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciwgeW91Ci0gIC8vIG1heSBnZXQgIjAiLCAiKG5pbCkiLCAiKG51bGwpIiwgb3IgYW4gYWNjZXNzIHZpb2xhdGlvbi4gIFRvCi0gIC8vIGVuc3VyZSBjb25zaXN0ZW50IHJlc3VsdCBhY3Jvc3MgY29tcGlsZXJzLCB3ZSBhbHdheXMgdHJlYXQgTlVMTAotICAvLyBhcyAiKG51bGwpIi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChUKiBjb25zdCYgcG9pbnRlcikgeyAgLy8gTk9MSU5UCi0jaWYgZGVmaW5lZChDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNikKLSAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICBzc18gPDwgIihudWxsKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNzXyA8PCBwb2ludGVyOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgKnNzXyA8PCAiKG51bGwpIjsKLSAgICB9IGVsc2UgewotICAgICAgKnNzXyA8PCBwb2ludGVyOwotICAgIH0KLSNlbmRpZiAgLy8gQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgotCi0gIC8vIFNpbmNlIHRoZSBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgYXJlIG92ZXJsb2FkZWQgZm9yIGJvdGggbmFycm93Ci0gIC8vIGFuZCB3aWRlIHN0cmVhbXMsIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGlzIHNwZWNpYWxpemVkIGRlZmluaXRpb24KLSAgLy8gb2Ygb3BlcmF0b3IgPDwsIGV2ZW4gdGhvdWdoIGl0cyBib2R5IGlzIHRoZSBzYW1lIGFzIHRoZQotICAvLyB0ZW1wbGF0aXplZCB2ZXJzaW9uIGFib3ZlLiAgV2l0aG91dCB0aGlzIGRlZmluaXRpb24sIHN0cmVhbWluZwotICAvLyBlbmRsIG9yIG90aGVyIGJhc2ljIElPIG1hbmlwdWxhdG9ycyB0byBNZXNzYWdlIHdpbGwgY29uZnVzZSB0aGUKLSAgLy8gY29tcGlsZXIuCi0gIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KEJhc2ljTmFycm93SW9NYW5pcCB2YWwpIHsKLSNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQotICAgIHNzXyA8PCB2YWw7Ci0jZWxzZQotICAgICpzc18gPDwgdmFsOwotI2VuZGlmICAvLyBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEluc3RlYWQgb2YgMS8wLCB3ZSB3YW50IHRvIHNlZSB0cnVlL2ZhbHNlIGZvciBib29sIHZhbHVlcy4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoYm9vbCBiKSB7Ci0gICAgcmV0dXJuICp0aGlzIDw8IChiID8gInRydWUiIDogImZhbHNlIik7Ci0gIH0KLQotICAvLyBUaGVzZSB0d28gb3ZlcmxvYWRzIGFsbG93IHN0cmVhbWluZyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBNZXNzYWdlCi0gIC8vIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cik7Ci0gIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KHdjaGFyX3QqIHdpZGVfY19zdHIpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0gIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04Ci0gIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCi0gIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLSAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKLSAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLSAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYW4gc3RkOjpzdHJpbmcuCi0gIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgotICAvLwotICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0gIHN0ZDo6c3RyaW5nIEdldFN0cmluZygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLQotI2lmIEdURVNUX09TX1NZTUJJQU4KLSAgLy8gVGhlc2UgYXJlIG5lZWRlZCBhcyB0aGUgTm9raWEgU3ltYmlhbiBDb21waWxlciBjYW5ub3QgZGVjaWRlIGJldHdlZW4KLSAgLy8gY29uc3QgVCYgYW5kIGNvbnN0IFQqIGluIGEgZnVuY3Rpb24gdGVtcGxhdGUuIFRoZSBOb2tpYSBjb21waWxlciBfY2FuXwotICAvLyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLCBzbyBhCi0gIC8vIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLCBhbmQgd2UgY2FuIG92ZXJsb2FkIG9uIHRoYXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OnRydWVfdHlwZSAvKmlzX3BvaW50ZXIqLywgVCogcG9pbnRlcikgewotI2lmIGRlZmluZWQoQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYpCi0gICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgc3NfIDw8ICIobnVsbCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICBzc18gPDwgcG9pbnRlcjsKLSAgICB9Ci0jZWxzZQotICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKLSAgICAgICpzc18gPDwgIihudWxsKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpzc18gPDwgcG9pbnRlcjsKLSAgICB9Ci0jZW5kaWYgIC8vIENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82Ci0gIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6ZmFsc2VfdHlwZSAvKmlzX3BvaW50ZXIqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlKSB7Ci0gICAgLy8gU2VlIHRoZSBjb21tZW50cyBpbiBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJikgYWJvdmUgZm9yIHdoeQotICAgIC8vIHdlIG5lZWQgdGhpcyB1c2luZyBzdGF0ZW1lbnQuCi0gICAgdXNpbmcgOjpvcGVyYXRvciA8PDsKLSNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQotICAgIHNzXyA8PCB2YWx1ZTsKLSNlbHNlCi0gICAgKnNzXyA8PCB2YWx1ZTsKLSNlbmRpZiAgLy8gQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCi0KLSAgLy8gV2UnbGwgaG9sZCB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBoZXJlLgotI2lmIGRlZmluZWQoQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYpCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3NfOwotI2Vsc2UKLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmdzdHJlYW0+IHNzXzsKLSNlbmRpZiAgLy8gQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYKLQotICAvLyBXZSBkZWNsYXJlIChidXQgZG9uJ3QgaW1wbGVtZW50KSB0aGlzIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCi0gIC8vIGZyb20gaW1wbGVtZW50aW5nIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJik7Ci19OwotCi0vLyBTdHJlYW1zIGEgTWVzc2FnZSB0byBhbiBvc3RyZWFtLgotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTWVzc2FnZSYgc2IpIHsKLSAgcmV0dXJuIG9zIDw8IHNiLkdldFN0cmluZygpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYW4gc3RkOjpzdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcwotLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKLS8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAotLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIFN0cmVhbWFibGVUb1N0cmluZyhjb25zdCBUJiBzdHJlYW1hYmxlKSB7Ci0gIHJldHVybiAoTWVzc2FnZSgpIDw8IHN0cmVhbWFibGUpLkdldFN0cmluZygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisjZW5kaWYgIC8vIFRFU1RJTkdfR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaAppbmRleCBmNTAwOWVjLi5mMjM3M2FiIDEwMDY0NAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCisrKyBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgKQEAgLTEsMTQ1MCArMSwxNSBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisvLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0vLwotLy8gTWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBpbiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KKyNpZm5kZWYgVEVTVElOR19HVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KKyNkZWZpbmUgVEVTVElOR19HVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KIAorLy8gVGhlIGZpbGUvZGlyZWN0b3J5IGxheW91dCBvZiBHb29nbGUgVGVzdCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgc3RhYmxlLiBVbnRpbAorLy8gaXQgc3RhYmlsaXplcywgQ2hyb21pdW0gY29kZSB3aWxsIHVzZSBmb3J3YXJkaW5nIGhlYWRlcnMgaW4gdGVzdGluZy9ndGVzdAorLy8gYW5kIHRlc3RpbmcvZ21vY2ssIGluc3RlYWQgb2YgZGlyZWN0bHkgaW5jbHVkaW5nIGZpbGVzIGluCisvLyB0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0LgogCi0vLyBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAotLy8gcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCi0vLwotLy8gSGVyZSBpcyBob3cgeW91IHVzZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzOgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLSNpZiAwCi0KLS8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQotLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKLS8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKLS8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgotLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQotLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKLS8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KLQotY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKLSAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KLX07Ci0KLS8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgotLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KLQotVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKLSAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6Ci0gIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKLSAgLi4uCi19Ci0KLVRFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgewotICAuLi4KLX0KLQotLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKLS8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKLS8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAotLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAotLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6Ci0vLwotLy8KLS8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KLS8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCi0vLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKLS8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgotLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCi0vLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgotLy8KLS8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93Ci0vLyBpbiB0aGlzIGZpbGUuCi0vLwotLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQotLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCi0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7Ci0KLS8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQotLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0vLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKLS8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKLS8vIHRoZXNlIG5hbWVzOgotLy8KLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKLS8vCi0vLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KLS8vCi0vLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKLS8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6Ci0KLWNvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OwotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7Ci0KLS8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKLS8vCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCi0vLwotLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cwotLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgotLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KLS8vCi0vLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKLS8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgotLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgotLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCi0vLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0Ci0vLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgotLy8KLS8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCi0vLyBmb3IgbW9yZSBleGFtcGxlcy4KLS8vCi0vLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgotLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAotLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgotLy8KLS8vCi0vLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KLS8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCi0vLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKLS8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQotLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAotLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6Ci0KLWNsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAotICAvLyBmaXh0dXJlIGhlcmUuCi19OwotCi1jbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4gewotICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCi19OwotCi1URVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgewotICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCi19Ci0KLVRFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKLSAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KLSAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOwotfQotCi0jZW5kaWYgIC8vIDAKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmICFHVEVTVF9PU19TWU1CSUFOCi0jIGluY2x1ZGUgPHV0aWxpdHk+Ci0jZW5kaWYKLQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAotLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAotLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgotLy8KLS8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQotLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAotLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCi0vLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgotLy8KLS8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKLS8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgotLy8KLS8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07Ci0vLwotLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7Ci0vLyB9Ci0vLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKLS8vCi0KLS8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBSYW5nZShzdGFydCwgZW5kKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKLS8vICAgICBzdGFydCsyLCAuLi4sIH0uCi0vLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKLS8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KLS8vIE5vdGVzOgotLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKLS8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKLS8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCi0vLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKLS8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgotLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgotLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCi0vLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KLS8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgotLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KLS8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKLS8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCi0gICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKLSAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOwotfQotCi0vLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQotLy8gYSBjb250YWluZXIuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KLS8vICAgICBhIEMtc3R5bGUgYXJyYXkuCi0vLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCi0vLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KLS8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQotLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCi0vLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCi0vLwotLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCi0vLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgotLy8KLS8vIEV4YW1wbGVzOgotLy8KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKLS8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6Ci0vLwotLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKLS8vCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0Ci0vLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6Ci0vLwotLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKLS8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKLS8vICAgdi5wdXNoX2JhY2soImEiKTsKLS8vICAgdi5wdXNoX2JhY2soImIiKTsKLS8vICAgcmV0dXJuIHY7Ci0vLyB9Ci0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOwotLy8KLS8vCi0vLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0Ci0vLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKLS8vCi0vLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKLS8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKLS8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKLS8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKLS8vICAgcmV0dXJuIGxpc3Q7Ci0vLyB9Ci0vLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOwotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ci0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+Ci1WYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ci0gICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOwotICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCi0gICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKLSAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCi0gICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOwotfQotCi0vLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKLS8vIHBhcmFtZXRlcnMuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCi0vLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7Ci0vLwotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KLS8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKLS8vCi0vLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byA1MCBwYXJhbWV0ZXJzLgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLWludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4gVmFsdWVzKFQxIHYxKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE8VDE+KHYxKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+IFZhbHVlcyhUMSB2MSwgVDIgdjIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+KHYxLCB2Mik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzPFQxLCBUMiwgVDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4odjEsIHYyLCB2Myk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLWludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ8VDEsIFQyLCBUMywgVDQ+KHYxLCB2MiwgdjMsIHY0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLWludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKLSAgICBUNSB2NSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4odjEsIHYyLCB2MywgdjQsIHY1KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNj4KLWludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKLSAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKLSAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsCi0gICAgICB2NiwgdjcpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAotICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KHYxLCB2MiwgdjMsIHY0LAotICAgICAgdjUsIHY2LCB2NywgdjgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjkpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5Pih2MSwgdjIsIHYzLAotICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KLWludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBWYWx1ZXMoVDEgdjEsCi0gICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4odjEsCi0gICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTE+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwKLSAgICBUMTE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAotICAgICAgVDExPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KLWludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgVDEyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgVDEzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCi0gICAgICB2MTQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKLSAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKLSAgICAgIHYxMywgdjE0LCB2MTUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAotICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKLSAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAotICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKLSAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKLSAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKLSAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKLSAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCi0gICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAotICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjE+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAotICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAotICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KLWludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAotICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKLSAgICBUMjEgdjIxLCBUMjIgdjIyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+KHYxLCB2MiwgdjMsIHY0LAotICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCi0gICAgICB2MjAsIHYyMSwgdjIyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKLSAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4odjEsIHYyLCB2MywKLSAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKLSAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+KHYxLCB2MiwKLSAgICAgIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LAotICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KLWludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFZhbHVlcyhUMSB2MSwKLSAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsCi0gICAgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwKLSAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+KHYxLAotICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywKLSAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNj4KLWludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgVDI2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAotICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgVDI3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LAotICAgICAgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICBUMjg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCi0gICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywKLSAgICAgIHYyOCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKLSAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LAotICAgICAgdjI3LCB2MjgsIHYyOSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KLWludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCi0gICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCi0gICAgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKLSAgICBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCi0gICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwKLSAgICAgIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMT4KLWludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKLSAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAotICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAotICAgIFQzMiB2MzIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKLSAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAotICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCi0gICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCi0gICAgVDMyIHYzMiwgVDMzIHYzMykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKLSAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCi0gICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCi0gICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwKLSAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLAotICAgIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAotICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsCi0gICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCi0gICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKLSAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAotICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKLSAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsCi0gICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzY+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCi0gICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKLSAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4odjEsIHYyLCB2MywgdjQsCi0gICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKLSAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAotICAgICAgdjM0LCB2MzUsIHYzNik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KLWludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCi0gICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCi0gICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKLSAgICBUMzcgdjM3KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3Pih2MSwgdjIsIHYzLAotICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAotICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCi0gICAgICB2MzQsIHYzNSwgdjM2LCB2MzcpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KLWludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAotICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKLSAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAotICAgIFQzNyB2MzcsIFQzOCB2MzgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4odjEsIHYyLAotICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCi0gICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwKLSAgICAgIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCi0gICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKLSAgICBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4odjEsCi0gICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAotICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsCi0gICAgICB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KLWludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVmFsdWVzKFQxIHYxLAotICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKLSAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAotICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsCi0gICAgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwKLSAgICBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwKLSAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LAotICAgICAgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDApOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxPgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgIFQ0MT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCi0gICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwKLSAgICAgIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KLWludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgIFQ0Mj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICBUNDIgdjQyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKLSAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAotICAgICAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsCi0gICAgICB2NDIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLWludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgVDQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAotICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCi0gICAgICB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwKLSAgICAgIHY0MSwgdjQyLCB2NDMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0ND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKLSAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAotICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksCi0gICAgICB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KLWludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKLSAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKLSAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAotICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCi0gICAgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKLSAgICBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKLSAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAotICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsCi0gICAgICB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAotICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCi0gICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCi0gICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LAotICAgICAgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0Nik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KLWludGVybmFsOjpWYWx1ZUFycmF5NDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAotICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCi0gICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAotICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAotICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCi0gICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KLWludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCi0gICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCi0gICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKLSAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LAotICAgIFQ0OCB2NDgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCi0gICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKLSAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LAotICAgICAgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsIHY0OCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKLSAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKLSAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAotICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCi0gICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwKLSAgICBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LAotICAgIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDkpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAotICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKLSAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LAotICAgICAgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCi0gICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKLSAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LAotICAgIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsCi0gICAgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwgVDUwIHY1MCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4odjEsIHYyLCB2MywgdjQsCi0gICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKLSAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAotICAgICAgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsCi0gICAgICB2NDgsIHY0OSwgdjUwKTsKLX0KLQotLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gQm9vbCgpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KLS8vCi0vLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucwotLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCi0vLyBDb21iaW5lKCkgZnVuY3Rpb24uCi0vLwotLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0Ci0vLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCi0vLwotLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7Ci0vLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLS8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKLS8vICAgfQotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKLS8vCi1pbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7Ci0gIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOwotfQotCi0jIGlmIEdURVNUX0hBU19DT01CSU5FCi0vLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKLS8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQotLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5Ci0vLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgotLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKLS8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCi0vLwotLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAxMCBhcmd1bWVudHMuIFRoaXMgbnVtYmVyIGlzIGN1cnJlbnRseSBsaW1pdGVkCi0vLyBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHR1cGxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgR29vZ2xlCi0vLyBUZXN0LgotLy8KLS8vIEV4YW1wbGU6Ci0vLwotLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIHRlc3QgY2FzZSBBbmltYWxUZXN0IGVhY2ggb25lIHdpdGgKLS8vIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHR1cGxlKCJjYXQiLCBCTEFDSyksIHR1cGxlKCJjYXQiLCBXSElURSksCi0vLyB0dXBsZSgiZG9nIiwgQkxBQ0spLCBhbmQgdHVwbGUoImRvZyIsIFdISVRFKToKLS8vCi0vLyBlbnVtIENvbG9yIHsgQkxBQ0ssIEdSQVksIFdISVRFIH07Ci0vLyBjbGFzcyBBbmltYWxUZXN0Ci0vLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxjb25zdCBjaGFyKiwgQ29sb3I+ID4gey4uLn07Ci0vLwotLy8gVEVTVF9QKEFuaW1hbFRlc3QsIEFuaW1hbExvb2tzTmljZSkgey4uLn0KLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbmltYWxWYXJpYXRpb25zLCBBbmltYWxUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXMoImNhdCIsICJkb2ciKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEJMQUNLLCBXSElURSkpKTsKLS8vCi0vLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gRmxhZ0RlcGVuZGVudFRlc3Qgd2l0aCBhbGwgdmFyaWF0aW9ucyBvZiB0d28KLS8vIEJvb2xlYW4gZmxhZ3M6Ci0vLwotLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QKLS8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGJvb2wsIGJvb2w+ID4gewotLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0vLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCi0vLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7Ci0vLyAgIH0KLS8vIH07Ci0vLwotLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKLS8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7Ci0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKLSAgICAgIGcxLCBnMik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAotICAgICAgZzEsIGcyLCBnMyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQ+KAotICAgICAgZzEsIGcyLCBnMywgZzQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKLSAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCi0gICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKLSAgICAgIEdlbmVyYXRvcjEwPigKLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Ci19Ci0jIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQotCi0KLQotIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKLSAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCi0gICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKLSAgIHB1YmxpYzogXAotICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCi0gICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKLSAgIHByaXZhdGU6IFwKLSAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKLSAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCi0gICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCi0gICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAotICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RQYXR0ZXJuKFwKLSAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPigpKTsgXAotICAgICAgcmV0dXJuIDA7IFwKLSAgICB9IFwKLSAgICBzdGF0aWMgaW50IGd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgXAotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAotICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTsgXAotICB9OyBcCi0gIGludCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk6Omd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyA9IFwKLSAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OkFkZFRvUmVnaXN0cnkoKTsgXAotICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKLQotLy8gVGhlIG9wdGlvbmFsIGxhc3QgYXJndW1lbnQgdG8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgYWxsb3dzIHRoZSB1c2VyCi0vLyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IGdlbmVyYXRlcyBjdXN0b20gdGVzdCBuYW1lIHN1ZmZpeGVzCi0vLyBiYXNlZCBvbiB0aGUgdGVzdCBwYXJhbWV0ZXJzLiBUaGUgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBvbmUgYXJndW1lbnQgb2YKLS8vIHR5cGUgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxjbGFzcyBQYXJhbVR5cGU+LCBhbmQgcmV0dXJuIHN0ZDo6c3RyaW5nLgotLy8KLS8vIHRlc3Rpbmc6OlByaW50VG9TdHJpbmdQYXJhbU5hbWUgaXMgYSBidWlsdGluIHRlc3Qgc3VmZml4IGdlbmVyYXRvciB0aGF0Ci0vLyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLiBJdCBkb2VzIG5vdCB3b3JrCi0vLyBmb3Igc3RkOjpzdHJpbmcgb3IgQyBzdHJpbmdzLgotLy8KLS8vIE5vdGU6IHRlc3QgbmFtZXMgbXVzdCBiZSBub24tZW1wdHksIHVuaXF1ZSwgYW5kIG1heSBvbmx5IGNvbnRhaW4gQVNDSUkKLS8vIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIHVuZGVyc2NvcmUuCi0KLSMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvciwgLi4uKSBcCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKLSAgICAgIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfKCkgeyByZXR1cm4gZ2VuZXJhdG9yOyB9IFwKLSAgOjpzdGQ6OnN0cmluZyBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXyggXAotICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+JiBpbmZvKSB7IFwKLSAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0UGFyYW1OYW1lR2VuPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKLSAgICAgICAgKF9fVkFfQVJHU19fKShpbmZvKTsgXAotICB9IFwKLSAgaW50IGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKLSAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCi0gICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCi0gICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAotICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCi0gICAgICAgICAgICAgICAgICAgICAgI3ByZWZpeCwgXAotICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXywgXAotICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXywgXAotICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgaGFzIGJlZW4gcmVwbGFjZWQgYnkgSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QIGluIHRoZQotLy8gbmV3IGdvb2dsZXRlc3QgbGlicmFyeS4KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNkZWZpbmUgSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QCi0jZW5kaWYKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworI2VuZGlmICAvLyBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc4ZDZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSR2YXIgbiA9IDUwICAkJCBNYXhpbXVtIGxlbmd0aCBvZiBWYWx1ZXMgYXJndW1lbnRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KLSR2YXIgbWF4dHVwbGUgPSAxMCAgJCQgTWF4aW11bSBudW1iZXIgb2YgQ29tYmluZSBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0vLwotLy8gTWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBpbiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KLQotCi0vLyBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAotLy8gcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCi0vLwotLy8gSGVyZSBpcyBob3cgeW91IHVzZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzOgotCi0jaWYgMAotCi0vLyBUbyB3cml0ZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCBmaXJzdCB5b3Ugc2hvdWxkIGRlZmluZSBhIGZpeHR1cmUKLS8vIGNsYXNzLiBJdCBpcyB1c3VhbGx5IGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFQ+IChzZWUgYmVsb3cgZm9yCi0vLyBhbm90aGVyIGluaGVyaXRhbmNlIHNjaGVtZSB0aGF0J3Mgc29tZXRpbWVzIHVzZWZ1bCBpbiBtb3JlIGNvbXBsaWNhdGVkCi0vLyBjbGFzcyBoaWVyYXJjaGllcyksIHdoZXJlIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4KLS8vIFRlc3RXaXRoUGFyYW08VD4gaXMgaXRzZWxmIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0LiBUIGNhbiBiZSBhbnkKLS8vIGNvcHlhYmxlIHR5cGUuIElmIGl0J3MgYSByYXcgcG9pbnRlciwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCi0vLyBsaWZlc3BhbiBvZiB0aGUgcG9pbnRlZCB2YWx1ZXMuCi0KLWNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7Ci0gIC8vIFlvdSBjYW4gaW1wbGVtZW50IGFsbCB0aGUgdXN1YWwgY2xhc3MgZml4dHVyZSBtZW1iZXJzIGhlcmUuCi19OwotCi0vLyBUaGVuLCB1c2UgdGhlIFRFU1RfUCBtYWNybyB0byBkZWZpbmUgYXMgbWFueSBwYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBmb3IgdGhpcyBmaXh0dXJlIGFzIHlvdSB3YW50LiBUaGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIKLS8vIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdSBwcmVmZXIgdG8gdGhpbmsuCi0KLVRFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgewotICAvLyBJbnNpZGUgYSB0ZXN0LCBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyIHdpdGggdGhlIEdldFBhcmFtKCkgbWV0aG9kCi0gIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOgotICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7Ci0gIC4uLgotfQotCi1URVNUX1AoRm9vVGVzdCwgSGFzQmxhaEJsYWgpIHsKLSAgLi4uCi19Ci0KLS8vIEZpbmFsbHksIHlvdSBjYW4gdXNlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0Ci0vLyBjYXNlIHdpdGggYW55IHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3YW50LiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbnVtYmVyCi0vLyBvZiBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGVzdCBwYXJhbWV0ZXJzLiBUaGV5IHJldHVybiB3aGF0IHdlIGNhbGwKLS8vIChzdXJwcmlzZSEpIHBhcmFtZXRlciBnZW5lcmF0b3JzLiBIZXJlIGlzIGEgIHN1bW1hcnkgb2YgdGhlbSwgd2hpY2gKLS8vIGFyZSBhbGwgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlOgotLy8KLS8vCi0vLyAgUmFuZ2UoYmVnaW4sIGVuZCBbLCBzdGVwXSkgLSBZaWVsZHMgdmFsdWVzIHtiZWdpbiwgYmVnaW4rc3RlcCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luK3N0ZXArc3RlcCwgLi4ufS4gVGhlIHZhbHVlcyBkbyBub3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZW5kLiBzdGVwIGRlZmF1bHRzIHRvIDEuCi0vLyAgVmFsdWVzKHYxLCB2MiwgLi4uLCB2TikgICAgLSBZaWVsZHMgdmFsdWVzIHt2MSwgdjIsIC4uLiwgdk59LgotLy8gIFZhbHVlc0luKGNvbnRhaW5lcikgICAgICAgIC0gWWllbGRzIHZhbHVlcyBmcm9tIGEgQy1zdHlsZSBhcnJheSwgYW4gU1RMCi0vLyAgVmFsdWVzSW4oYmVnaW4sZW5kKSAgICAgICAgICBjb250YWluZXIsIG9yIGFuIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKS4KLS8vICBCb29sKCkgICAgICAgICAgICAgICAgICAgICAtIFlpZWxkcyBzZXF1ZW5jZSB7ZmFsc2UsIHRydWV9LgotLy8gIENvbWJpbmUoZzEsIGcyLCAuLi4sIGdOKSAgIC0gWWllbGRzIGFsbCBjb21iaW5hdGlvbnMgKHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtYXRoIHNhdnZ5KSBvZiB0aGUgdmFsdWVzIGdlbmVyYXRlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIE4gZ2VuZXJhdG9ycy4KLS8vCi0vLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWxvdwotLy8gaW4gdGhpcyBmaWxlLgotLy8KLS8vIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgRm9vVGVzdCB0ZXN0IGNhc2UKLS8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJtZWVueSIsICJtaW55IiwgYW5kICJtb2UiLgotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvb1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoIm1lZW55IiwgIm1pbnkiLCAibW9lIikpOwotCi0vLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCAoeWVzLCB5b3UKLS8vIGNhbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoZW4gb25jZSkgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQotLy8gYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50Ci0vLyBpbnN0YW50aWF0aW9ucy4gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlCi0vLyB0aGVzZSBuYW1lczoKLS8vCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgIm1lZW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJtaW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzIgZm9yICJtb2UiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgIm1lZW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJtaW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzIgZm9yICJtb2UiCi0vLwotLy8gWW91IGNhbiB1c2UgdGhlc2UgbmFtZXMgaW4gLS1ndGVzdF9maWx0ZXIuCi0vLwotLy8gVGhpcyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMgZnJvbSBGb29UZXN0IGFnYWluLCBlYWNoCi0vLyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgImNhdCIgYW5kICJkb2ciOgotCi1jb25zdCBjaGFyKiBwZXRzW10gPSB7ImNhdCIsICJkb2cifTsKLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZSwgRm9vVGVzdCwgVmFsdWVzSW4ocGV0cykpOwotCi0vLyBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UgbmFtZXM6Ci0vLwotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAiY2F0IgotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAiZG9nIgotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAiY2F0IgotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAiZG9nIgotLy8KLS8vIFBsZWFzZSBub3RlIHRoYXQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMKLS8vIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3IKLS8vIEFGVEVSIHRoZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBzdGF0ZW1lbnQuCi0vLwotLy8gUGxlYXNlIGFsc28gbm90ZSB0aGF0IGdlbmVyYXRvciBleHByZXNzaW9ucyAoaW5jbHVkaW5nIHBhcmFtZXRlcnMgdG8gdGhlCi0vLyBnZW5lcmF0b3JzKSBhcmUgZXZhbHVhdGVkIGluIEluaXRHb29nbGVUZXN0KCksIGFmdGVyIG1haW4oKSBoYXMgc3RhcnRlZC4KLS8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIG9uIG9uZSBoYW5kLCB0byBhZGp1c3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgaW4gb3JkZXIKLS8vIHRvIGR5bmFtaWNhbGx5IGRldGVybWluZSBhIHNldCBvZiB0ZXN0cyB0byBydW4gYW5kIG9uIHRoZSBvdGhlciBoYW5kLAotLy8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBpbnNwZWN0IHRoZSBnZW5lcmF0ZWQgdGVzdHMgd2l0aCBHb29nbGUgVGVzdAotLy8gcmVmbGVjdGlvbiBBUEkgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBleGVjdXRlZC4KLS8vCi0vLyBZb3UgY2FuIHNlZSBzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYW5kIHNhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYwotLy8gZm9yIG1vcmUgZXhhbXBsZXMuCi0vLwotLy8gSW4gdGhlIGZ1dHVyZSwgd2UgcGxhbiB0byBwdWJsaXNoIHRoZSBBUEkgZm9yIGRlZmluaW5nIG5ldyBwYXJhbWV0ZXIKLS8vIGdlbmVyYXRvcnMuIEJ1dCBmb3Igbm93IHRoaXMgaW50ZXJmYWNlIHJlbWFpbnMgcGFydCBvZiB0aGUgaW50ZXJuYWwKLS8vIGltcGxlbWVudGF0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLS8vCi0vLwotLy8gQSBwYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0IGFuZCBmcm9tCi0vLyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8VD4sIHdoZXJlIFQgaXMgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgotLy8gdmFsdWVzLiBJbmhlcml0aW5nIGZyb20gVGVzdFdpdGhQYXJhbTxUPiBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCBiZWNhdXNlCi0vLyBUZXN0V2l0aFBhcmFtPFQ+IGluaGVyaXRzIGZyb20gYm90aCBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vcmUKLS8vIGNvbXBsaWNhdGVkIGhpZXJhcmNoaWVzLCBob3dldmVyLCBpdCBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIHRvIGluaGVyaXQKLS8vIHNlcGFyYXRlbHkgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEZvciBleGFtcGxlOgotCi1jbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotICAvLyBZb3UgY2FuIGluaGVyaXQgYWxsIHRoZSB1c3VhbCBtZW1iZXJzIGZvciBhIG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QKLSAgLy8gZml4dHVyZSBoZXJlLgotfTsKLQotY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQmFzZVRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQ+IHsKLSAgLy8gVGhlIHVzdWFsIHRlc3QgZml4dHVyZSBtZW1iZXJzIGdvIGhlcmUgdG9vLgotfTsKLQotVEVTVF9GKEJhc2VUZXN0LCBIYXNGb28pIHsKLSAgLy8gVGhpcyBpcyBhbiBvcmRpbmFyeSBub24tcGFyYW1ldGVyaXplZCB0ZXN0LgotfQotCi1URVNUX1AoRGVyaXZlZFRlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEdldFBhcmFtIHdvcmtzIGp1c3QgdGhlIHNhbWUgaGVyZSBhcyBpZiB5b3UgaW5oZXJpdCBmcm9tIFRlc3RXaXRoUGFyYW0uCi0gIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKLX0KLQotI2VuZGlmICAvLyAwCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTgotIyBpbmNsdWRlIDx1dGlsaXR5PgotI2VuZGlmCi0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRnVuY3Rpb25zIHByb2R1Y2luZyBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4KLS8vCi0vLyBHb29nbGUgVGVzdCB1c2VzIHRoZXNlIGdlbmVyYXRvcnMgdG8gcHJvZHVjZSBwYXJhbWV0ZXJzIGZvciB2YWx1ZS0KLS8vIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFdoZW4gYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBpcyBpbnN0YW50aWF0ZWQKLS8vIHdpdGggYSBwYXJ0aWN1bGFyIGdlbmVyYXRvciwgR29vZ2xlIFRlc3QgY3JlYXRlcyBhbmQgcnVucyB0ZXN0cwotLy8gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci4KLS8vCi0vLyBJbiB0aGUgZm9sbG93aW5nIHNhbXBsZSwgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgRm9vVGVzdCBhcmUgaW5zdGFudGlhdGVkCi0vLyBlYWNoIHRocmVlIHRpbWVzIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAzLCA1LCBhbmQgODoKLS8vCi0vLyBjbGFzcyBGb29UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7IC4uLiB9OwotLy8KLS8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhpcykgewotLy8gfQotLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGF0KSB7Ci0vLyB9Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0U2VxdWVuY2UsIEZvb1Rlc3QsIFZhbHVlcygzLCA1LCA4KSk7Ci0vLwotCi0vLyBSYW5nZSgpIHJldHVybnMgZ2VuZXJhdG9ycyBwcm92aWRpbmcgc2VxdWVuY2VzIG9mIHZhbHVlcyBpbiBhIHJhbmdlLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gUmFuZ2Uoc3RhcnQsIGVuZCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB7c3RhcnQsIHN0YXJ0KzEsCi0vLyAgICAgc3RhcnQrMiwgLi4uLCB9LgotLy8gUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB7c3RhcnQsIHN0YXJ0K3N0ZXAsCi0vLyAgICAgc3RhcnQrc3RlcCtzdGVwLCAuLi4sIH0uCi0vLyBOb3RlczoKLS8vICAgKiBUaGUgZ2VuZXJhdGVkIHNlcXVlbmNlcyBuZXZlciBpbmNsdWRlIGVuZC4gRm9yIGV4YW1wbGUsIFJhbmdlKDEsIDUpCi0vLyAgICAgcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSB7MSwgMiwgMywgNH0uIFJhbmdlKDEsIDksIDIpCi0vLyAgICAgcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgezEsIDMsIDUsIDd9LgotLy8gICAqIHN0YXJ0IGFuZCBlbmQgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuIFRoYXQgdHlwZSBtYXkgYmUgYW55IGludGVncmFsIG9yCi0vLyAgICAgZmxvYXRpbmctcG9pbnQgdHlwZSBvciBhIHVzZXIgZGVmaW5lZCB0eXBlIHNhdGlzZnlpbmcgdGhlc2UgY29uZGl0aW9uczoKLS8vICAgICAqIEl0IG11c3QgYmUgYXNzaWduYWJsZSAoaGF2ZSBvcGVyYXRvcj0oKSBkZWZpbmVkKS4KLS8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcisoKSAob3BlcmF0b3IrKGludC1jb21wYXRpYmxlIHR5cGUpIGZvcgotLy8gICAgICAgdHdvLW9wZXJhbmQgdmVyc2lvbikuCi0vLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3I8KCkgZGVmaW5lZC4KLS8vICAgICBFbGVtZW50cyBpbiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlcyB3aWxsIGFsc28gaGF2ZSB0aGF0IHR5cGUuCi0vLyAgICogQ29uZGl0aW9uIHN0YXJ0IDwgZW5kIG11c3QgYmUgc2F0aXNmaWVkIGluIG9yZGVyIGZvciByZXN1bHRpbmcgc2VxdWVuY2VzCi0vLyAgICAgdG8gY29udGFpbiBhbnkgZWxlbWVudHMuCi0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkgewotICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+KAotICAgICAgbmV3IGludGVybmFsOjpSYW5nZUdlbmVyYXRvcjxULCBJbmNyZW1lbnRUPihzdGFydCwgZW5kLCBzdGVwKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kKSB7Ci0gIHJldHVybiBSYW5nZShzdGFydCwgZW5kLCAxKTsKLX0KLQotLy8gVmFsdWVzSW4oKSBmdW5jdGlvbiBhbGxvd3MgZ2VuZXJhdGlvbiBvZiB0ZXN0cyB3aXRoIHBhcmFtZXRlcnMgY29taW5nIGZyb20KLS8vIGEgY29udGFpbmVyLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCi0vLyAgICAgYSBDLXN0eWxlIGFycmF5LgotLy8gVmFsdWVzSW4oY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQotLy8gICAgIGFuIFNUTC1zdHlsZSBjb250YWluZXIuCi0vLyBWYWx1ZXNJbihJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KLS8vICAgICBhIHJhbmdlIFtiZWdpbiwgZW5kKSBkZWZpbmVkIGJ5IGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBUaGVzZQotLy8gICAgIGl0ZXJhdG9ycyBjYW4gYWxzbyBiZSBwbGFpbiBDIHBvaW50ZXJzLgotLy8KLS8vIFBsZWFzZSBub3RlIHRoYXQgVmFsdWVzSW4gY29waWVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY29udGFpbmVycwotLy8gcGFzc2VkIGluIGFuZCBrZWVwcyB0aGVtIHRvIGdlbmVyYXRlIHRlc3RzIGluIFJVTl9BTExfVEVTVFMoKS4KLS8vCi0vLyBFeGFtcGxlczoKLS8vCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdHJpbmdUZXN0Ci0vLyBlYWNoIHdpdGggQy1zdHJpbmcgdmFsdWVzIG9mICJmb28iLCAiYmFyIiwgYW5kICJiYXoiOgotLy8KLS8vIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsiZm9vIiwgImJhciIsICJiYXoifTsKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0cmluZ1NlcXVlbmNlLCBTcnRpbmdUZXN0LCBWYWx1ZXNJbihzdHJpbmdzKSk7Ci0vLwotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RsU3RyaW5nVGVzdAotLy8gZWFjaCB3aXRoIFNUTCBzdHJpbmdzIHdpdGggdmFsdWVzICJhIiBhbmQgImIiOgotLy8KLS8vIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IEdldFBhcmFtZXRlclN0cmluZ3MoKSB7Ci0vLyAgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHY7Ci0vLyAgIHYucHVzaF9iYWNrKCJhIik7Ci0vLyAgIHYucHVzaF9iYWNrKCJiIik7Ci0vLyAgIHJldHVybiB2OwotLy8gfQotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFN0bFN0cmluZ1Rlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihHZXRQYXJhbWV0ZXJTdHJpbmdzKCkpKTsKLS8vCi0vLwotLy8gVGhpcyB3aWxsIGFsc28gaW5zdGFudGlhdGUgdGVzdHMgZnJvbSBDaGFyVGVzdAotLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgJ2EnIGFuZCAnYic6Ci0vLwotLy8gOjpzdGQ6Omxpc3Q8Y2hhcj4gR2V0UGFyYW1ldGVyQ2hhcnMoKSB7Ci0vLyAgIDo6c3RkOjpsaXN0PGNoYXI+IGxpc3Q7Ci0vLyAgIGxpc3QucHVzaF9iYWNrKCdhJyk7Ci0vLyAgIGxpc3QucHVzaF9iYWNrKCdiJyk7Ci0vLyAgIHJldHVybiBsaXN0OwotLy8gfQotLy8gOjpzdGQ6Omxpc3Q8Y2hhcj4gbCA9IEdldFBhcmFtZXRlckNoYXJzKCk7Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UyLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclRlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihsLmJlZ2luKCksIGwuZW5kKCkpKTsKLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPgotICAgICAgOjp2YWx1ZV90eXBlIFBhcmFtVHlwZTsKLSAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KAotICAgICAgbmV3IGludGVybmFsOjpWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I8UGFyYW1UeXBlPihiZWdpbiwgZW5kKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKSB7Ci0gIHJldHVybiBWYWx1ZXNJbihhcnJheSwgYXJyYXkgKyBOKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7Ci0gIHJldHVybiBWYWx1ZXNJbihjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKLX0KLQotLy8gVmFsdWVzKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgZnJvbSBleHBsaWNpdGx5IHNwZWNpZmllZCBsaXN0IG9mCi0vLyBwYXJhbWV0ZXJzLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gVmFsdWVzKFQgdjEsIFQgdjIsIC4uLiwgVCB2TikKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB2MSwgdjIsIC4uLiwgdk4uCi0vLwotLy8gRm9yIGV4YW1wbGUsIHRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIEJhclRlc3QgZWFjaAotLy8gd2l0aCB2YWx1ZXMgIm9uZSIsICJ0d28iLCBhbmQgInRocmVlIjoKLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChOdW1TZXF1ZW5jZSwgQmFyVGVzdCwgVmFsdWVzKCJvbmUiLCAidHdvIiwgInRocmVlIikpOwotLy8KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIEJhelRlc3QgZWFjaCB3aXRoIHZhbHVlcyAxLCAyLCAzLjUuCi0vLyBUaGUgZXhhY3QgdHlwZSBvZiB2YWx1ZXMgd2lsbCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgcGFyYW1ldGVyIGluIEJhelRlc3QuCi0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRmxvYXRpbmdOdW1iZXJzLCBCYXpUZXN0LCBWYWx1ZXMoMSwgMiwgMy41KSk7Ci0vLwotLy8gQ3VycmVudGx5LCBWYWx1ZXMoKSBzdXBwb3J0cyBmcm9tIDEgdG8gJG4gcGFyYW1ldGVycy4KLS8vCi0kcmFuZ2UgaSAxLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLWludGVybmFsOjpWYWx1ZUFycmF5JGk8JGZvciBqLCBbW1Qkal1dPiBWYWx1ZXMoJGZvciBqLCBbW1QkaiB2JGpdXSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+KCRmb3IgaiwgW1t2JGpdXSk7Ci19Ci0KLV1dCi0KLS8vIEJvb2woKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyB3aXRoIHBhcmFtZXRlcnMgaW4gYSBzZXQgb2YgKGZhbHNlLCB0cnVlKS4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIEJvb2woKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHtmYWxzZSwgdHJ1ZX0uCi0vLwotLy8gSXQgaXMgdXNlZnVsIHdoZW4gdGVzdGluZyBjb2RlIHRoYXQgZGVwZW5kcyBvbiBCb29sZWFuIGZsYWdzLiBDb21iaW5hdGlvbnMKLS8vIG9mIG11bHRpcGxlIGZsYWdzIGNhbiBiZSB0ZXN0ZWQgd2hlbiBzZXZlcmFsIEJvb2woKSdzIGFyZSBjb21iaW5lZCB1c2luZwotLy8gQ29tYmluZSgpIGZ1bmN0aW9uLgotLy8KLS8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhbGwgdGVzdHMgaW4gdGhlIHRlc3QgY2FzZSBGbGFnRGVwZW5kZW50VGVzdAotLy8gd2lsbCBiZSBpbnN0YW50aWF0ZWQgdHdpY2Ugd2l0aCBwYXJhbWV0ZXJzIGZhbHNlIGFuZCB0cnVlLgotLy8KLS8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4gewotLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0vLyAgICAgZXh0ZXJuYWxfZmxhZyA9IEdldFBhcmFtKCk7Ci0vLyAgIH0KLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEJvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsIEJvb2woKSk7Ci0vLwotaW5saW5lIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxib29sPiBCb29sKCkgewotICByZXR1cm4gVmFsdWVzKGZhbHNlLCB0cnVlKTsKLX0KLQotIyBpZiBHVEVTVF9IQVNfQ09NQklORQotLy8gQ29tYmluZSgpIGFsbG93cyB0aGUgdXNlciB0byBjb21iaW5lIHR3byBvciBtb3JlIHNlcXVlbmNlcyB0byBwcm9kdWNlCi0vLyB2YWx1ZXMgb2YgYSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB0aG9zZSBzZXF1ZW5jZXMnIGVsZW1lbnRzLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gQ29tYmluZShnZW4xLCBnZW4yLCAuLi4sIGdlbk4pCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgY29taW5nIGZyb20KLS8vICAgICB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2VzIGdlbmVyYXRlZCBieQotLy8gICAgIGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4gVGhlIHNlcXVlbmNlIGVsZW1lbnRzIHdpbGwgaGF2ZSBhIHR5cGUgb2YKLS8vICAgICB0dXBsZTxUMSwgVDIsIC4uLiwgVE4+IHdoZXJlIFQxLCBUMiwgLi4uLCBUTiBhcmUgdGhlIHR5cGVzCi0vLyAgICAgb2YgZWxlbWVudHMgZnJvbSBzZXF1ZW5jZXMgcHJvZHVjZXMgYnkgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLgotLy8KLS8vIENvbWJpbmUgY2FuIGhhdmUgdXAgdG8gJG1heHR1cGxlIGFyZ3VtZW50cy4gVGhpcyBudW1iZXIgaXMgY3VycmVudGx5IGxpbWl0ZWQKLS8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUKLS8vIFRlc3QuCi0vLwotLy8gRXhhbXBsZToKLS8vCi0vLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gdGVzdCBjYXNlIEFuaW1hbFRlc3QgZWFjaCBvbmUgd2l0aAotLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwKLS8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOgotLy8KLS8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsKLS8vIGNsYXNzIEFuaW1hbFRlc3QKLS8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGNvbnN0IGNoYXIqLCBDb2xvcj4gPiB7Li4ufTsKLS8vCi0vLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQkxBQ0ssIFdISVRFKSkpOwotLy8KLS8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bwotLy8gQm9vbGVhbiBmbGFnczoKLS8vCi0vLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdAotLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Ym9vbCwgYm9vbD4gPiB7Ci0vLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLS8vICAgICAvLyBBc3NpZ25zIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIHZhbHVlcyBmcm9tIHRoZSB0dXBsZS4KLS8vICAgICB0aWUoZXh0ZXJuYWxfZmxhZ18xLCBleHRlcm5hbF9mbGFnXzIpID0gR2V0UGFyYW0oKTsKLS8vICAgfQotLy8gfTsKLS8vCi0vLyBURVNUX1AoRmxhZ0RlcGVuZGVudFRlc3QsIFRlc3RGZWF0dXJlMSkgewotLy8gICAvLyBUZXN0IHlvdXIgY29kZSB1c2luZyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiBoZXJlLgotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVHdvQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoQm9vbCgpLCBCb29sKCkpKTsKLS8vCi0kcmFuZ2UgaSAyLi5tYXh0dXBsZQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgR2VuZXJhdG9yJGpdXT4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGk8JGZvciBqLCBbW0dlbmVyYXRvciRqXV0+IENvbWJpbmUoCi0gICAgJGZvciBqLCBbW2NvbnN0IEdlbmVyYXRvciRqJiBnJGpdXSkgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaTwkZm9yIGosIFtbR2VuZXJhdG9yJGpdXT4oCi0gICAgICAkZm9yIGosIFtbZyRqXV0pOwotfQotCi1dXQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKLQotCi0KLSMgZGVmaW5lIFRFU1RfUCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCi0gIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAotICAgICAgOiBwdWJsaWMgdGVzdF9jYXNlX25hbWUgeyBcCi0gICBwdWJsaWM6IFwKLSAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge30gXAotICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCi0gICBwcml2YXRlOiBcCi0gICAgc3RhdGljIGludCBBZGRUb1JlZ2lzdHJ5KCkgeyBcCi0gICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAotICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAotICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKFwKLSAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykpLT5BZGRUZXN0UGF0dGVybihcCi0gICAgICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgI3Rlc3RfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgIG5ldyA6OnRlc3Rpbmc6OmludGVybmFsOjpUZXN0TWV0YUZhY3Rvcnk8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKLSAgICAgIHJldHVybiAwOyBcCi0gICAgfSBcCi0gICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87IFwKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKLSAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKLSAgfTsgXAotICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCi0gICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKLSAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCi0KLS8vIFRoZSBvcHRpb25hbCBsYXN0IGFyZ3VtZW50IHRvIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIGFsbG93cyB0aGUgdXNlcgotLy8gdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCBnZW5lcmF0ZXMgY3VzdG9tIHRlc3QgbmFtZSBzdWZmaXhlcwotLy8gYmFzZWQgb24gdGhlIHRlc3QgcGFyYW1ldGVycy4gVGhlIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgb25lIGFyZ3VtZW50IG9mCi0vLyB0eXBlIHRlc3Rpbmc6OlRlc3RQYXJhbUluZm88Y2xhc3MgUGFyYW1UeXBlPiwgYW5kIHJldHVybiBzdGQ6OnN0cmluZy4KLS8vCi0vLyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nUGFyYW1OYW1lIGlzIGEgYnVpbHRpbiB0ZXN0IHN1ZmZpeCBnZW5lcmF0b3IgdGhhdAotLy8gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGVzdGluZzo6UHJpbnRUb1N0cmluZyhHZXRQYXJhbSgpKS4KLS8vCi0vLyBOb3RlOiB0ZXN0IG5hbWVzIG11c3QgYmUgbm9uLWVtcHR5LCB1bmlxdWUsIGFuZCBtYXkgb25seSBjb250YWluIEFTQ0lJCi0vLyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciB1bmRlcnNjb3JlLiBCZWNhdXNlIFByaW50VG9TdHJpbmcgYWRkcyBxdW90ZXMKLS8vIHRvIHN0ZDo6c3RyaW5nIGFuZCBDIHN0cmluZ3MsIGl0IHdvbid0IHdvcmsgZm9yIHRoZXNlIHR5cGVzLgotCi0jIGRlZmluZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUChwcmVmaXgsIHRlc3RfY2FzZV9uYW1lLCBnZW5lcmF0b3IsIC4uLikgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCi0gICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCi0gIDo6c3RkOjpzdHJpbmcgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRlTmFtZV8oIFwKLSAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiYgaW5mbykgeyBcCi0gICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFBhcmFtTmFtZUdlbjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCi0gICAgICAgIChfX1ZBX0FSR1NfXykoaW5mbyk7IFwKLSAgfSBcCi0gIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCi0gICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAotICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAotICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKFwKLSAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykpLT5BZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oXAotICAgICAgICAgICAgICAgICAgICAgICNwcmVmaXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKLSAgICAgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRlTmFtZV8sIFwKLSAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTM4OTMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKLS8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6Ci0vLwotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7Ci0vLwotLy8gQSB1c2VyIGNhbiB0ZWFjaCB0aGlzIGZ1bmN0aW9uIGhvdyB0byBwcmludCBhIGNsYXNzIHR5cGUgVCBieQotLy8gZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoKSBvciBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB0aGF0Ci0vLyBkZWZpbmVzIFQuICBNb3JlIHNwZWNpZmljYWxseSwgdGhlIEZJUlNUIGRlZmluZWQgZnVuY3Rpb24gaW4gdGhlCi0vLyBmb2xsb3dpbmcgbGlzdCB3aWxsIGJlIHVzZWQgKGFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UKLS8vIGZvbyk6Ci0vLwotLy8gICAxLiBmb286OlByaW50VG8oY29uc3QgVCYsIG9zdHJlYW0qKQotLy8gICAyLiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBUJikgZGVmaW5lZCBpbiBlaXRoZXIgZm9vIG9yIHRoZQotLy8gICAgICBnbG9iYWwgbmFtZXNwYWNlLgotLy8KLS8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGRlZmluZWQsIGl0IHdpbGwgcHJpbnQgdGhlIGRlYnVnIHN0cmluZyBvZgotLy8gdGhlIHZhbHVlIGlmIGl0IGlzIGEgcHJvdG9jb2wgYnVmZmVyLCBvciBwcmludCB0aGUgcmF3IGJ5dGVzIGluIHRoZQotLy8gdmFsdWUgb3RoZXJ3aXNlLgotLy8KLS8vIFRvIGFpZCBkZWJ1Z2dpbmc6IHdoZW4gVCBpcyBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgYWRkcmVzcyBvZiB0aGUKLS8vIHZhbHVlIGlzIGFsc28gcHJpbnRlZDsgd2hlbiBUIGlzIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIGJvdGggdGhlCi0vLyBwb2ludGVyIHZhbHVlIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGl0IHBvaW50cyB0byBhcmUKLS8vIHByaW50ZWQuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIHNvbWUgY29udmVuaWVudCB3cmFwcGVyczoKLS8vCi0vLyAgIC8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nLiAgRm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhcgotLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcwotLy8gICAvLyBwcmludGVkLgotLy8gICBzdGQ6OnN0cmluZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOwotLy8KLS8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkCi0vLyAgIC8vIHZhbHVlIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCi0vLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCi0vLyAgIC8vIHByaW50ZWQuCi0vLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOwotLy8KLS8vICAgLy8gUHJpbnRzIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZSBkaWZmZXJlbmNlCi0vLyAgIC8vIGZyb20gVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBwcmludHMgYm90aCB0aGUKLS8vICAgLy8gcG9pbnRlciBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyIHBvaW50ZXIuCi0vLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIG9zdHJlYW0qKTsKLS8vCi0vLyAgIC8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQotLy8gICAvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiBUdXBsZSBzdXBwb3J0IG11c3QgYmUgZW5hYmxlZCBpbgotLy8gICAvLyBndGVzdC1wb3J0LmguCi0vLyAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAotLy8gICAgICAgY29uc3QgVHVwbGUmIHZhbHVlKTsKLS8vCi0vLyBLbm93biBsaW1pdGF0aW9uOgotLy8KLS8vIFRoZSBwcmludCBwcmltaXRpdmVzIHByaW50IHRoZSBlbGVtZW50cyBvZiBhbiBTVEwtc3R5bGUgY29udGFpbmVyCi0vLyB1c2luZyB0aGUgY29tcGlsZXItaW5mZXJyZWQgdHlwZSBvZiAqaXRlciB3aGVyZSBpdGVyIGlzIGEKLS8vIGNvbnN0X2l0ZXJhdG9yIG9mIHRoZSBjb250YWluZXIuICBXaGVuIGNvbnN0X2l0ZXJhdG9yIGlzIGFuIGlucHV0Ci0vLyBpdGVyYXRvciBidXQgbm90IGEgZm9yd2FyZCBpdGVyYXRvciwgdGhpcyBpbmZlcnJlZCB0eXBlIG1heSBub3QKLS8vIG1hdGNoIHZhbHVlX3R5cGUsIGFuZCB0aGUgcHJpbnQgb3V0cHV0IG1heSBiZSBpbmNvcnJlY3QuICBJbgotLy8gcHJhY3RpY2UsIHRoaXMgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBmb3IgbW9zdCBjb250YWluZXJzCi0vLyBjb25zdF9pdGVyYXRvciBpcyBhIGZvcndhcmQgaXRlcmF0b3IuICBXZSdsbCBmaXggdGhpcyBpZiB0aGVyZSdzIGFuCi0vLyBhY3R1YWwgbmVlZCBmb3IgaXQuICBOb3RlIHRoYXQgdGhpcyBmaXggY2Fubm90IHJlbHkgb24gdmFsdWVfdHlwZQotLy8gYmVpbmcgZGVmaW5lZCBhcyBtYW55IHVzZXItZGVmaW5lZCBjb250YWluZXIgdHlwZXMgZG9uJ3QgaGF2ZQotLy8gdmFsdWVfdHlwZS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KLQotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLSMgaW5jbHVkZSA8dHVwbGU+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWZpbml0aW9ucyBpbiB0aGUgJ2ludGVybmFsJyBhbmQgJ2ludGVybmFsMicgbmFtZSBzcGFjZXMgYXJlCi0vLyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UgVEhFTSBJTiBVU0VSIENPREUhCi1uYW1lc3BhY2UgaW50ZXJuYWwyIHsKLQotLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4KLS8vIG9zdHJlYW0uCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBGb3Igc2VsZWN0aW5nIHdoaWNoIHByaW50ZXIgdG8gdXNlIHdoZW4gYSBnaXZlbiB0eXBlIGhhcyBuZWl0aGVyIDw8Ci0vLyBub3IgUHJpbnRUbygpLgotZW51bSBUeXBlS2luZCB7Ci0gIGtQcm90b2J1ZiwgICAgICAgICAgICAgIC8vIGEgcHJvdG9idWYgdHlwZQotICBrQ29udmVydGlibGVUb0ludGVnZXIsICAvLyBhIHR5cGUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGEgbmFtZWQgb3IgdW5uYW1lZCBlbnVtIHR5cGUpCi0gIGtPdGhlclR5cGUgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGVsc2UKLX07Ci0KLS8vIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtUeXBlS2luZD46OlByaW50VmFsdWUodmFsdWUsIG9zKSBpcyBjYWxsZWQKLS8vIGJ5IHRoZSB1bml2ZXJzYWwgcHJpbnRlciB0byBwcmludCBhIHZhbHVlIG9mIHR5cGUgVCB3aGVuIG5laXRoZXIKLS8vIG9wZXJhdG9yPDwgbm9yIFByaW50VG8oKSBpcyBkZWZpbmVkIGZvciBULCB3aGVyZSBrVHlwZUtpbmQgaXMgdGhlCi0vLyAia2luZCIgb2YgVCBhcyBkZWZpbmVkIGJ5IGVudW0gVHlwZUtpbmQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgVHlwZUtpbmQga1R5cGVLaW5kPgotY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXIgewotIHB1YmxpYzoKLSAgLy8gVGhpcyBkZWZhdWx0IHZlcnNpb24gaXMgY2FsbGVkIHdoZW4ga1R5cGVLaW5kIGlzIGtPdGhlclR5cGUuCi0gIHN0YXRpYyB2b2lkIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFByaW50Qnl0ZXNJbk9iamVjdFRvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZ2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZhbHVlKSwgb3MpOwotICB9Ci19OwotCi0vLyBXZSBwcmludCBhIHByb3RvYnVmIHVzaW5nIGl0cyBTaG9ydERlYnVnU3RyaW5nKCkgd2hlbiB0aGUgc3RyaW5nCi0vLyBkb2Vzbid0IGV4Y2VlZCB0aGlzIG1hbnkgY2hhcmFjdGVyczsgb3RoZXJ3aXNlIHdlIHByaW50IGl0IHVzaW5nCi0vLyBEZWJ1Z1N0cmluZygpIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkuCi1jb25zdCBzaXplX3Qga1Byb3RvYnVmT25lTGluZXJNYXhMZW5ndGggPSA1MDsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrUHJvdG9idWY+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBzaG9ydF9zdHIgPSB2YWx1ZS5TaG9ydERlYnVnU3RyaW5nKCk7Ci0gICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHByZXR0eV9zdHIgPQotICAgICAgICBzaG9ydF9zdHIubGVuZ3RoKCkgPD0ga1Byb3RvYnVmT25lTGluZXJNYXhMZW5ndGggPwotICAgICAgICBzaG9ydF9zdHIgOiAoIlxuIiArIHZhbHVlLkRlYnVnU3RyaW5nKCkpOwotICAgICpvcyA8PCAoIjwiICsgcHJldHR5X3N0ciArICI+Iik7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga0NvbnZlcnRpYmxlVG9JbnRlZ2VyPiB7Ci0gcHVibGljOgotICAvLyBTaW5jZSBUIGhhcyBubyA8PCBvcGVyYXRvciBvciBQcmludFRvKCkgYnV0IGNhbiBiZSBpbXBsaWNpdGx5Ci0gIC8vIGNvbnZlcnRlZCB0byBCaWdnZXN0SW50LCB3ZSBwcmludCBpdCBhcyBhIEJpZ2dlc3RJbnQuCi0gIC8vCi0gIC8vIE1vc3QgbGlrZWx5IFQgaXMgYW4gZW51bSB0eXBlIChlaXRoZXIgbmFtZWQgb3IgdW5uYW1lZCksIGluIHdoaWNoCi0gIC8vIGNhc2UgcHJpbnRpbmcgaXQgYXMgYW4gaW50ZWdlciBpcyB0aGUgZGVzaXJlZCBiZWhhdmlvci4gIEluIGNhc2UKLSAgLy8gVCBpcyBub3QgYW4gZW51bSwgcHJpbnRpbmcgaXQgYXMgYW4gaW50ZWdlciBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8KLSAgLy8gZ2l2ZW4gdGhhdCBpdCBoYXMgbm8gdXNlci1kZWZpbmVkIHByaW50ZXIuCi0gIHN0YXRpYyB2b2lkIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGNvbnN0IGludGVybmFsOjpCaWdnZXN0SW50IGtCaWdJbnQgPSB2YWx1ZTsKLSAgICAqb3MgPDwga0JpZ0ludDsKLSAgfQotfTsKLQotLy8gUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4gIElmIHRoZSB2YWx1ZSBpcyBhCi0vLyBwcm90b2NvbCBtZXNzYWdlLCBpdHMgZGVidWcgc3RyaW5nIGlzIHByaW50ZWQ7IGlmIGl0J3MgYW4gZW51bSBvcgotLy8gb2YgYSB0eXBlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludCwgaXQncyBwcmludGVkIGFzIGFuCi0vLyBpbnRlZ2VyOyBvdGhlcndpc2UgdGhlIGJ5dGVzIGluIHRoZSB2YWx1ZSBhcmUgcHJpbnRlZC4gIFRoaXMgaXMKLS8vIHdoYXQgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBkb2VzIHdoZW4gaXQga25vd3Mgbm90aGluZyBhYm91dAotLy8gdHlwZSBUIGFuZCBUIGhhcyBuZWl0aGVyIDw8IG9wZXJhdG9yIG5vciBQcmludFRvKCkuCi0vLwotLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nCi0vLyBhIDw8IG9wZXJhdG9yIGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgRm9vIGlzIGRlZmluZWQuCi0vLwotLy8gV2UgcHV0IHRoaXMgb3BlcmF0b3IgaW4gbmFtZXNwYWNlICdpbnRlcm5hbDInIGluc3RlYWQgb2YgJ2ludGVybmFsJwotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCBhcyBtdWNoIGNvZGUgaW4gJ2ludGVybmFsJyBuZWVkcyB0bwotLy8gdXNlIDw8IGluIFNUTCwgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCBvdXIgb3duIDw8IHdlcmUgaXQgZGVmaW5lZAotLy8gaW4gJ2ludGVybmFsJy4KLS8vCi0vLyBOb3RlIHRoYXQgdGhpcyBvcGVyYXRvcjw8IHRha2VzIGEgZ2VuZXJpYyBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwKLS8vIENoYXJUcmFpdHM+IHR5cGUgaW5zdGVhZCBvZiB0aGUgbW9yZSByZXN0cmljdGVkIHN0ZDo6b3N0cmVhbS4gIElmCi0vLyB3ZSBkZWZpbmUgaXQgdG8gdGFrZSBhbiBzdGQ6Om9zdHJlYW0gaW5zdGVhZCwgd2UnbGwgZ2V0IGFuCi0vLyAiYW1iaWd1b3VzIG92ZXJsb2FkcyIgY29tcGlsZXIgZXJyb3Igd2hlbiB0cnlpbmcgdG8gcHJpbnQgYSB0eXBlCi0vLyBGb28gdGhhdCBzdXBwb3J0cyBzdHJlYW1pbmcgdG8gc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsCi0vLyBDaGFyVHJhaXRzPiwgYXMgdGhlIGNvbXBpbGVyIGNhbm5vdCB0ZWxsIHdoZXRoZXIKLS8vIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgVCYpIG9yCi0vLyBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+LCBjb25zdCBGb28mKSBpcyBtb3JlCi0vLyBzcGVjaWZpYy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzLCB0eXBlbmFtZSBUPgotOjpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoCi0gICAgOjpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLCBjb25zdCBUJiB4KSB7Ci0gIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsCi0gICAgICAoaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgPyBrUHJvdG9idWYgOgotICAgICAgIGludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCYsIGludGVybmFsOjpCaWdnZXN0SW50Pjo6dmFsdWUgPwotICAgICAgIGtDb252ZXJ0aWJsZVRvSW50ZWdlciA6IGtPdGhlclR5cGUpPjo6UHJpbnRWYWx1ZSh4LCAmb3MpOwotICByZXR1cm4gb3M7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbDIKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIFRoaXMgbmFtZXNwYWNlIE1VU1QgTk9UIEJFIE5FU1RFRCBJTiA6OnRlc3RpbmcsIG9yIHRoZSBuYW1lIGxvb2stdXAKLS8vIG1hZ2ljIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIFVuaXZlcnNhbFByaW50ZXIgd29uJ3Qgd29yay4KLW5hbWVzcGFjZSB0ZXN0aW5nX2ludGVybmFsIHsKLQotLy8gVXNlZCB0byBwcmludCBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2hlbiB0aGUKLS8vIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyhjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIC8vIFdpdGggdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQsIGR1cmluZyB1bnF1YWxpZmllZCBuYW1lIGxvb2t1cCwKLSAgLy8gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8IGFwcGVhcnMgYXMgaWYgaXQgd2FzIGRlY2xhcmVkIGluCi0gIC8vIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UgdGhhdCBjb250YWlucyBib3RoCi0gIC8vIDo6dGVzdGluZ19pbnRlcm5hbCBhbmQgOjp0ZXN0aW5nOjppbnRlcm5hbDIsIGkuZS4gdGhlIGdsb2JhbAotICAvLyBuYW1lc3BhY2UuICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byB0aGUgQysrIFN0YW5kYXJkIHNlY3Rpb24KLSAgLy8gNy4zLjQtMSBbbmFtZXNwYWNlLnVkaXJdLiAgVGhpcyBhbGxvd3MgdXMgdG8gZmFsbCBiYWNrIG9udG8KLSAgLy8gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8IGluIGNhc2UgVCBkb2Vzbid0IGNvbWUgd2l0aCBhIDw8Ci0gIC8vIG9wZXJhdG9yLgotICAvLwotICAvLyBXZSBjYW5ub3Qgd3JpdGUgJ3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8OycsIHdoaWNoCi0gIC8vIGdjYyAzLjMgZmFpbHMgdG8gY29tcGlsZSBkdWUgdG8gYSBjb21waWxlciBidWcuCi0gIHVzaW5nIG5hbWVzcGFjZSA6OnRlc3Rpbmc6OmludGVybmFsMjsgIC8vIE5PTElOVAotCi0gIC8vIEFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgZm9vLCBpbiB0aGUgbmV4dCBzdGF0ZW1lbnQsCi0gIC8vIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIGFsbCBvZjoKLSAgLy8KLSAgLy8gICAxLiBmb286Om9wZXJhdG9yPDwgKHRoYW5rcyB0byBLb2VuaWcgbG9vay11cCksCi0gIC8vICAgMi4gOjpvcGVyYXRvcjw8IChhcyB0aGUgY3VycmVudCBuYW1lc3BhY2UgaXMgZW5jbG9zZWQgaW4gOjopLAotICAvLyAgIDMuIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCAodGhhbmtzIHRvIHRoZSB1c2luZyBzdGF0ZW1lbnQgYWJvdmUpLgotICAvLwotICAvLyBUaGUgb3BlcmF0b3I8PCB3aG9zZSB0eXBlIG1hdGNoZXMgVCBiZXN0IHdpbGwgYmUgcGlja2VkLgotICAvLwotICAvLyBXZSBkZWxpYmVyYXRlbHkgYWxsb3cgIzIgdG8gYmUgYSBjYW5kaWRhdGUsIGFzIHNvbWV0aW1lcyBpdCdzCi0gIC8vIGltcG9zc2libGUgdG8gZGVmaW5lICMxIChlLmcuIHdoZW4gZm9vIGlzIDo6c3RkLCBkZWZpbmluZwotICAvLyBhbnl0aGluZyBpbiBpdCBpcyB1bmRlZmluZWQgYmVoYXZpb3IgdW5sZXNzIHlvdSBhcmUgYSBjb21waWxlcgotICAvLyB2ZW5kb3IuKS4KLSAgKm9zIDw8IHZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZ19pbnRlcm5hbAotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBGb3JtYXRGb3JDb21wYXJpc29uPFRvUHJpbnQsIE90aGVyT3BlcmFuZD46OkZvcm1hdCh2YWx1ZSkgZm9ybWF0cyBhCi0vLyB2YWx1ZSBvZiB0eXBlIFRvUHJpbnQgdGhhdCBpcyBhbiBvcGVyYW5kIG9mIGEgY29tcGFyaXNvbiBhc3NlcnRpb24KLS8vIChlLmcuIEFTU0VSVF9FUSkuICBPdGhlck9wZXJhbmQgaXMgdGhlIHR5cGUgb2YgdGhlIG90aGVyIG9wZXJhbmQgaW4KLS8vIHRoZSBjb21wYXJpc29uLCBhbmQgaXMgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYmVzdCB3YXkgdG8KLS8vIGZvcm1hdCB0aGUgdmFsdWUuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHRoZSB2YWx1ZSBpcyBhIEMgc3RyaW5nCi0vLyAoY2hhciBwb2ludGVyKSBhbmQgdGhlIG90aGVyIG9wZXJhbmQgaXMgYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlCi0vLyB3YW50IHRvIGZvcm1hdCB0aGUgQyBzdHJpbmcgYXMgYSBzdHJpbmcsIHNpbmNlIHdlIGtub3cgaXQgaXMKLS8vIGNvbXBhcmVkIGJ5IHZhbHVlIHdpdGggdGhlIHN0cmluZyBvYmplY3QuICBJZiB0aGUgdmFsdWUgaXMgYSBjaGFyCi0vLyBwb2ludGVyIGJ1dCB0aGUgb3RoZXIgb3BlcmFuZCBpcyBub3QgYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlIGRvbid0Ci0vLyBrbm93IHdoZXRoZXIgdGhlIHBvaW50ZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZAotLy8gc3RyaW5nLCBhbmQgdGh1cyB3YW50IHRvIHByaW50IGl0IGFzIGEgcG9pbnRlciB0byBiZSBzYWZlLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLQotLy8gVGhlIGRlZmF1bHQgY2FzZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUb1ByaW50LCB0eXBlbmFtZSBPdGhlck9wZXJhbmQ+Ci1jbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBUb1ByaW50JiB2YWx1ZSkgewotICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOwotICB9Ci19OwotCi0vLyBBcnJheS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUb1ByaW50LCBzaXplX3QgTiwgdHlwZW5hbWUgT3RoZXJPcGVyYW5kPgotY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxUb1ByaW50W05dLCBPdGhlck9wZXJhbmQ+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBUb1ByaW50KiB2YWx1ZSkgewotICAgIHJldHVybiBGb3JtYXRGb3JDb21wYXJpc29uPGNvbnN0IFRvUHJpbnQqLCBPdGhlck9wZXJhbmQ+OjpGb3JtYXQodmFsdWUpOwotICB9Ci19OwotCi0vLyBCeSBkZWZhdWx0LCBwcmludCBDIHN0cmluZyBhcyBwb2ludGVycyB0byBiZSBzYWZlLCBhcyB3ZSBkb24ndCBrbm93Ci0vLyB3aGV0aGVyIHRoZXkgYWN0dWFsbHkgcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcuCi0KLSNkZWZpbmUgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oQ2hhclR5cGUpICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyT3BlcmFuZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxDaGFyVHlwZSosIE90aGVyT3BlcmFuZD4geyAgICAgICAgICAgICAgICAgIFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHZhbHVlKSk7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjaGFyKTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNvbnN0IGNoYXIpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8od2NoYXJfdCk7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjb25zdCB3Y2hhcl90KTsKLQotI3VuZGVmIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfCi0KLS8vIElmIGEgQyBzdHJpbmcgaXMgY29tcGFyZWQgd2l0aCBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2Uga25vdyBpdCdzIG1lYW50Ci0vLyB0byBwb2ludCB0byBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgYW5kIHRodXMgY2FuIHByaW50IGl0IGFzIGEgc3RyaW5nLgotCi0jZGVmaW5lIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oQ2hhclR5cGUsIE90aGVyU3RyaW5nVHlwZSkgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uPENoYXJUeXBlKiwgT3RoZXJTdHJpbmdUeXBlPiB7ICAgICAgICAgICAgICAgXAotICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChDaGFyVHlwZSogdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY2hhciwgOjpzdGQ6OnN0cmluZyk7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IGNoYXIsIDo6c3RkOjpzdHJpbmcpOwotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY2hhciwgOjpzdHJpbmcpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCBjaGFyLCA6OnN0cmluZyk7Ci0jZW5kaWYKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyh3Y2hhcl90LCA6OndzdHJpbmcpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCB3Y2hhcl90LCA6OndzdHJpbmcpOwotI2VuZGlmCi0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18od2NoYXJfdCwgOjpzdGQ6OndzdHJpbmcpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCB3Y2hhcl90LCA6OnN0ZDo6d3N0cmluZyk7Ci0jZW5kaWYKLQotI3VuZGVmIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18KLQotLy8gRm9ybWF0cyBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX0xULCBhbmQgZXRjKQotLy8gb3BlcmFuZCB0byBiZSB1c2VkIGluIGEgZmFpbHVyZSBtZXNzYWdlLiAgVGhlIHR5cGUgKGJ1dCBub3QgdmFsdWUpCi0vLyBvZiB0aGUgb3RoZXIgb3BlcmFuZCBtYXkgYWZmZWN0IHRoZSBmb3JtYXQuICBUaGlzIGFsbG93cyB1cyB0bwotLy8gcHJpbnQgYSBjaGFyKiBhcyBhIHJhdyBwb2ludGVyIHdoZW4gaXQgaXMgY29tcGFyZWQgYWdhaW5zdCBhbm90aGVyCi0vLyBjaGFyKiBvciB2b2lkKiwgYW5kIHByaW50IGl0IGFzIGEgQyBzdHJpbmcgd2hlbiBpdCBpcyBjb21wYXJlZAotLy8gYWdhaW5zdCBhbiBzdGQ6OnN0cmluZyBvYmplY3QsIGZvciBleGFtcGxlLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdGQ6OnN0cmluZyBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoCi0gICAgY29uc3QgVDEmIHZhbHVlLCBjb25zdCBUMiYgLyogb3RoZXJfb3BlcmFuZCAqLykgewotICByZXR1cm4gRm9ybWF0Rm9yQ29tcGFyaXNvbjxUMSwgVDI+OjpGb3JtYXQodmFsdWUpOwotfQotCi0vLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpIHByaW50cyB0aGUgZ2l2ZW4KLS8vIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0Ci0vLyAnb3N0cmVhbV9wdHInIGlzIG5vdCBOVUxMLCBvciB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgotLy8KLS8vIFdlIGRlZmluZSBVbml2ZXJzYWxQcmludGVyIGFzIGEgY2xhc3MgdGVtcGxhdGUgKGFzIG9wcG9zZWQgdG8gYQotLy8gZnVuY3Rpb24gdGVtcGxhdGUpLCBhcyB3ZSBuZWVkIHRvIHBhcnRpYWxseSBzcGVjaWFsaXplIGl0IGZvcgotLy8gcmVmZXJlbmNlIHR5cGVzLCB3aGljaCBjYW5ub3QgYmUgZG9uZSB3aXRoIGZ1bmN0aW9uIHRlbXBsYXRlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5pdmVyc2FsUHJpbnRlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIFVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBVc2VkIHRvIHByaW50IGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2hlbiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZQotLy8gYSBQcmludFRvKCkgZm9yIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIEM+Ci12b2lkIERlZmF1bHRQcmludFRvKElzQ29udGFpbmVyIC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlIC8qIGlzIG5vdCBhIHBvaW50ZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEMmIGNvbnRhaW5lciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIGNvbnN0IHNpemVfdCBrTWF4Q291bnQgPSAzMjsgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byBwcmludC4KLSAgKm9zIDw8ICd7JzsKLSAgc2l6ZV90IGNvdW50ID0gMDsKLSAgZm9yICh0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOwotICAgICAgIGl0ICE9IGNvbnRhaW5lci5lbmQoKTsgKytpdCwgKytjb3VudCkgewotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICpvcyA8PCAnLCc7Ci0gICAgICBpZiAoY291bnQgPT0ga01heENvdW50KSB7ICAvLyBFbm91Z2ggaGFzIGJlZW4gcHJpbnRlZC4KLSAgICAgICAgKm9zIDw8ICIgLi4uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgICpvcyA8PCAnICc7Ci0gICAgLy8gV2UgY2Fubm90IGNhbGwgUHJpbnRUbygqaXQsIG9zKSBoZXJlIGFzIFByaW50VG8oKSBkb2Vzbid0Ci0gICAgLy8gaGFuZGxlICppdCBiZWluZyBhIG5hdGl2ZSBhcnJheS4KLSAgICBpbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQoKml0LCBvcyk7Ci0gIH0KLQotICBpZiAoY291bnQgPiAwKSB7Ci0gICAgKm9zIDw8ICcgJzsKLSAgfQotICAqb3MgPDwgJ30nOwotfQotCi0vLyBVc2VkIHRvIHByaW50IGEgcG9pbnRlciB0aGF0IGlzIG5laXRoZXIgYSBjaGFyIHBvaW50ZXIgbm9yIGEgbWVtYmVyCi0vLyBwb2ludGVyLCB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIFByaW50VG8oKSBmb3IgaXQuICAoQSBtZW1iZXIKLS8vIHZhcmlhYmxlIHBvaW50ZXIgb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgZG9lc24ndCByZWFsbHkgcG9pbnQgdG8KLS8vIGEgbG9jYXRpb24gaW4gdGhlIGFkZHJlc3Mgc3BhY2UuICBUaGVpciByZXByZXNlbnRhdGlvbiBpcwotLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIFRoZXJlZm9yZSB0aGV5IHdpbGwgYmUgcHJpbnRlZCBhcyByYXcKLS8vIGJ5dGVzLikKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBEZWZhdWx0UHJpbnRUbyhJc05vdENvbnRhaW5lciAvKiBkdW1teSAqLywKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZV90eXBlIC8qIGlzIGEgcG9pbnRlciAqLywKLSAgICAgICAgICAgICAgICAgICAgVCogcCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIGlmIChwID09IE5VTEwpIHsKLSAgICAqb3MgPDwgIk5VTEwiOwotICB9IGVsc2UgewotICAgIC8vIEMrKyBkb2Vzbid0IGFsbG93IGNhc3RpbmcgZnJvbSBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYW55IG9iamVjdAotICAgIC8vIHBvaW50ZXIuCi0gICAgLy8KLSAgICAvLyBJc1RydWUoKSBzaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsCi0gICAgLy8gInVucmVhY2hhYmxlIGNvZGUiLgotICAgIGlmIChJc1RydWUoSW1wbGljaXRseUNvbnZlcnRpYmxlPFQqLCBjb25zdCB2b2lkKj46OnZhbHVlKSkgewotICAgICAgLy8gVCBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLiAgV2UganVzdCBjYWxsIDw8IHRvIHByaW50IHAsCi0gICAgICAvLyByZWx5aW5nIG9uIEFETCB0byBwaWNrIHVwIHVzZXItZGVmaW5lZCA8PCBmb3IgdGhlaXIgcG9pbnRlcgotICAgICAgLy8gdHlwZXMsIGlmIGFueS4KLSAgICAgICpvcyA8PCBwOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUIGlzIGEgZnVuY3Rpb24gdHlwZSwgc28gJypvcyA8PCBwJyBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudAotICAgICAgLy8gKGl0IGp1c3QgcHJpbnRzIHAgYXMgYm9vbCkuICBXZSB3YW50IHRvIHByaW50IHAgYXMgYSBjb25zdAotICAgICAgLy8gdm9pZCouICBIb3dldmVyLCB3ZSBjYW5ub3QgY2FzdCBpdCB0byBjb25zdCB2b2lkKiBkaXJlY3RseSwKLSAgICAgIC8vIGV2ZW4gdXNpbmcgcmVpbnRlcnByZXRfY2FzdCwgYXMgZWFybGllciB2ZXJzaW9ucyBvZiBnY2MKLSAgICAgIC8vIChlLmcuIDMuNC41KSBjYW5ub3QgY29tcGlsZSB0aGUgY2FzdCB3aGVuIHAgaXMgYSBmdW5jdGlvbgotICAgICAgLy8gcG9pbnRlci4gIENhc3RpbmcgdG8gVUludDY0IGZpcnN0IHNvbHZlcyB0aGUgcHJvYmxlbS4KLSNpZiBkZWZpbmVkKF9fU05DX18pCi0jcHJhZ21hIGRpYWdfcHVzaAotI3ByYWdtYSBkaWFnX3N1cHByZXNzPTEwNjcKLSNlbGlmIGRlZmluZWQoX19naHNfXykKLSNwcmFnbWEgZGlhZ19wdXNoCi0jcHJhZ21hIGRpYWdfc3VwcHJlc3M9MTA1MwotI2VuZGlmCi0gICAgICAqb3MgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6VUludDY0PihwKSk7Ci0jaWYgZGVmaW5lZChfX1NOQ19fKSB8fCBkZWZpbmVkIChfX2doc19fKQotI3ByYWdtYSBkaWFnX3BvcCAgLy8gUmVuYWJsZSB3YXJuaW5ncwotI2VuZGlmCi0gICAgfQotICB9Ci19Ci0KLS8vIFVzZWQgdG8gcHJpbnQgYSBub24tY29udGFpbmVyLCBub24tcG9pbnRlciB2YWx1ZSB3aGVuIHRoZSB1c2VyCi0vLyBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlIC8qIGlzIG5vdCBhIHBvaW50ZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgOjp0ZXN0aW5nX2ludGVybmFsOjpEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyh2YWx1ZSwgb3MpOwotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHRoZSA8PCBvcGVyYXRvciBpZiBpdCBoYXMgb25lOwotLy8gb3RoZXJ3aXNlIHByaW50cyB0aGUgYnl0ZXMgaW4gaXQuICBUaGlzIGlzIHdoYXQKLS8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIFByaW50VG8oKSBpcyBub3Qgc3BlY2lhbGl6ZWQKLS8vIG9yIG92ZXJsb2FkZWQgZm9yIHR5cGUgVC4KLS8vCi0vLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKLS8vIGFuIG92ZXJsb2FkIG9mIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLiAgV2UKLS8vIGdpdmUgdGhlIHVzZXIgdGhpcyBvcHRpb24gYXMgc29tZXRpbWVzIGRlZmluaW5nIGEgPDwgb3BlcmF0b3IgZm9yCi0vLyBGb28gaXMgbm90IGRlc2lyYWJsZSAoZS5nLiB0aGUgY29kaW5nIHN0eWxlIG1heSBwcmV2ZW50IGRvaW5nIGl0LAotLy8gb3IgdGhlcmUgaXMgYWxyZWFkeSBhIDw8IG9wZXJhdG9yIGJ1dCBpdCBkb2Vzbid0IGRvIHdoYXQgdGhlIHVzZXIKLS8vIHdhbnRzKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBQcmludFRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgLy8gRGVmYXVsdFByaW50VG8oKSBpcyBvdmVybG9hZGVkLiAgVGhlIHR5cGUgb2YgaXRzIGZpcnN0IHR3bwotICAvLyBhcmd1bWVudHMgZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQuICBJZiBUIGlzIGFuCi0gIC8vIFNUTC1zdHlsZSBjb250YWluZXIsIHRoZSB2ZXJzaW9uIGZvciBjb250YWluZXIgd2lsbCBiZSBjYWxsZWQ7IGlmCi0gIC8vIFQgaXMgYSBwb2ludGVyLCB0aGUgcG9pbnRlciB2ZXJzaW9uIHdpbGwgYmUgY2FsbGVkOyBvdGhlcndpc2UgdGhlCi0gIC8vIGdlbmVyaWMgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZC4KLSAgLy8KLSAgLy8gTm90ZSB0aGF0IHdlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgaGVyZSwgcHJpb3IgdG8gd2UgY2hlY2sKLSAgLy8gZm9yIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMgaW4gb3VyIG9wZXJhdG9yPDwuICBUaGUgcmF0aW9uYWxlIGlzOgotICAvLwotICAvLyBGb3IgcHJvdG9jb2wgbWVzc2FnZXMsIHdlIHdhbnQgdG8gZ2l2ZSBwZW9wbGUgYSBjaGFuY2UgdG8KLSAgLy8gb3ZlcnJpZGUgR29vZ2xlIE1vY2sncyBmb3JtYXQgYnkgZGVmaW5pbmcgYSBQcmludFRvKCkgb3IKLSAgLy8gb3BlcmF0b3I8PC4gIEZvciBTVEwgY29udGFpbmVycywgb3RoZXIgZm9ybWF0cyBjYW4gYmUKLSAgLy8gaW5jb21wYXRpYmxlIHdpdGggR29vZ2xlIE1vY2sncyBmb3JtYXQgZm9yIHRoZSBjb250YWluZXIKLSAgLy8gZWxlbWVudHM7IHRoZXJlZm9yZSB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUgdG8gZW5zdXJlCi0gIC8vIHRoYXQgb3VyIGZvcm1hdCBpcyB1c2VkLgotICAvLwotICAvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIERlZmF1bHRQcmludFRvKCkgaXMgbmVlZGVkIHRvIGJ5cGFzcyBhIGJ1ZwotICAvLyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIHRoYXQgcHJldmVudHMgaXQgZnJvbSBwaWNraW5nIHRoZSByaWdodAotICAvLyBvdmVybG9hZCBiZXR3ZWVuOgotICAvLwotICAvLyAgIFByaW50VG8oY29uc3QgVCYgeCwgLi4uKTsKLSAgLy8gICBQcmludFRvKFQqIHgsIC4uLik7Ci0gIERlZmF1bHRQcmludFRvKElzQ29udGFpbmVyVGVzdDxUPigwKSwgaXNfcG9pbnRlcjxUPigpLCB2YWx1ZSwgb3MpOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgUHJpbnRUbygpIG92ZXJsb2FkcyB0ZWxscwotLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBob3cgdG8gcHJpbnQgc3RhbmRhcmQgdHlwZXMgKGJ1aWx0LWluCi0vLyB0eXBlcywgc3RyaW5ncywgcGxhaW4gYXJyYXlzLCBhbmQgcG9pbnRlcnMpLgotCi0vLyBPdmVybG9hZHMgZm9yIHZhcmlvdXMgY2hhciB0eXBlcy4KLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIC8vIFdoZW4gcHJpbnRpbmcgYSBwbGFpbiBjaGFyLCB3ZSBhbHdheXMgdHJlYXQgaXQgYXMgdW5zaWduZWQuICBUaGlzCi0gIC8vIHdheSwgdGhlIG91dHB1dCB3b24ndCBiZSBhZmZlY3RlZCBieSB3aGV0aGVyIHRoZSBjb21waWxlciB0aGlua3MKLSAgLy8gY2hhciBpcyBzaWduZWQgb3Igbm90LgotICBQcmludFRvKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpLCBvcyk7Ci19Ci0KLS8vIE92ZXJsb2FkcyBmb3Igb3RoZXIgc2ltcGxlIGJ1aWx0LWluIHR5cGVzLgotaW5saW5lIHZvaWQgUHJpbnRUbyhib29sIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgKHggPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLX0KLQotLy8gT3ZlcmxvYWQgZm9yIHdjaGFyX3QgdHlwZS4KLS8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAotLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGRlY2ltYWwgY29kZSAoZXhjZXB0IGZvciBMJ1wwJykuCi0vLyBUaGUgTCdcMCcgY2hhciBpcyBwcmludGVkIGFzICJMJ1xcMCciLiBUaGUgZGVjaW1hbCBjb2RlIGlzIHByaW50ZWQKLS8vIGFzIHNpZ25lZCBpbnRlZ2VyIHdoZW4gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgY29tcGlsZXIKLS8vIGFzIGEgc2lnbmVkIHR5cGUgYW5kIGlzIHByaW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QKLS8vIGlzIGltcGxlbWVudGVkIGFzIGFuIHVuc2lnbmVkIHR5cGUuCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBPdmVybG9hZHMgZm9yIEMgc3RyaW5ncy4KLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3QgY2hhcio+KHMpLCBvcyk7Ci19Ci0KLS8vIHNpZ25lZC91bnNpZ25lZCBjaGFyIGlzIG9mdGVuIHVzZWQgZm9yIHJlcHJlc2VudGluZyBiaW5hcnkgZGF0YSwgc28KLS8vIHdlIHByaW50IHBvaW50ZXJzIHRvIGl0IGFzIHZvaWQqIHRvIGJlIHNhZmUuCi1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOwotfQotaW5saW5lIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgdW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLWlubGluZSB2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLQotLy8gTVNWQyBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2NoYXJfdCBhcyBhIHR5cGVkZWYgb2YgdW5zaWduZWQKLS8vIHNob3J0LiAgSXQgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCB3aGVuIHdjaGFyX3QgaXMgYSBuYXRpdmUKLS8vIHR5cGUuICBXaGVuIHdjaGFyX3QgaXMgYSB0eXBlZGVmLCBkZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3QKLS8vIHdjaGFyX3QqIHdvdWxkIGNhdXNlIHVuc2lnbmVkIHNob3J0KiBiZSBwcmludGVkIGFzIGEgd2lkZSBzdHJpbmcsCi0vLyBwb3NzaWJseSBjYXVzaW5nIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzLgotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQotLy8gT3ZlcmxvYWRzIGZvciB3aWRlIEMgc3RyaW5ncwotR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oY29uc3Qgd2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLWlubGluZSB2b2lkIFByaW50VG8od2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB3Y2hhcl90Kj4ocyksIG9zKTsKLX0KLSNlbmRpZgotCi0vLyBPdmVybG9hZCBmb3IgQyBhcnJheXMuICBNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHByaW50ZWQKLS8vIHByb3Blcmx5LgotCi0vLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSwgd2l0aG91dCBwcmludGluZwotLy8gdGhlIGN1cmx5IGJyYWNlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBQcmludFJhd0FycmF5VG8oY29uc3QgVCBhW10sIHNpemVfdCBjb3VudCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFVuaXZlcnNhbFByaW50KGFbMF0sIG9zKTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgIT0gY291bnQ7IGkrKykgewotICAgICpvcyA8PCAiLCAiOwotICAgIFVuaXZlcnNhbFByaW50KGFbaV0sIG9zKTsKLSAgfQotfQotCi0vLyBPdmVybG9hZHMgZm9yIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLgotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50U3RyaW5nVG8ocywgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFN0cmluZ1RvKHMsIG9zKTsKLX0KLQotLy8gT3ZlcmxvYWRzIGZvciA6OndzdHJpbmcgYW5kIDo6c3RkOjp3c3RyaW5nLgotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXwotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCi0vLyBhIHR1cGxlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUgfHwgR1RFU1RfSEFTX1NURF9UVVBMRV8KLQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKLS8vIE92ZXJsb2FkIGZvciA6OnN0ZDo6dHIxOjp0dXBsZS4gIE5lZWRlZCBmb3IgcHJpbnRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAotLy8gd2hpY2ggYXJlIHBhY2tlZCBhcyB0dXBsZXMuCi0KLS8vIE92ZXJsb2FkZWQgUHJpbnRUbygpIGZvciB0dXBsZXMgb2YgdmFyaW91cyBhcml0aWVzLiAgV2Ugc3VwcG9ydAotLy8gdHVwbGVzIG9mIHVwLXRvIDEwIGZpZWxkcy4gIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gd29ya3MKLS8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0cjE6OnR1cGxlIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZQotLy8gbm9uLXN0YW5kYXJkIHZhcmlhZGljIHRlbXBsYXRlIGZlYXR1cmUgb3Igbm90LgotCi1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPD4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDE+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2Pgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4mIHQsCi0gICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci12b2lkIFByaW50VG8oCi0gICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiYgdCwKLSAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQotCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9UVVBMRV8KLQotLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnBhaXI8VDEsIFQyPiYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgJygnOwotICAvLyBXZSBjYW5ub3QgdXNlIFVuaXZlcnNhbFByaW50KHZhbHVlLmZpcnN0LCBvcykgaGVyZSwgYXMgVDEgbWF5IGJlCi0gIC8vIGEgcmVmZXJlbmNlIHR5cGUuICBUaGUgc2FtZSBmb3IgcHJpbnRpbmcgdmFsdWUuc2Vjb25kLgotICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsKLSAgKm9zIDw8ICIsICI7Ci0gIFVuaXZlcnNhbFByaW50ZXI8VDI+OjpQcmludCh2YWx1ZS5zZWNvbmQsIG9zKTsKLSAgKm9zIDw8ICcpJzsKLX0KLQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyCi0vLyBwaWNrIHRoZSByaWdodCBvdmVybG9hZCBvZiBQcmludFRvKCkgZm9yIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXIgewotIHB1YmxpYzoKLSAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCi0gIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQxODApCi0KLSAgLy8gTm90ZTogd2UgZGVsaWJlcmF0ZWx5IGRvbid0IGNhbGwgdGhpcyBQcmludFRvKCksIGFzIHRoYXQgbmFtZQotICAvLyBjb25mbGljdHMgd2l0aCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvIGluIHRoZSBib2R5IG9mIHRoZQotICAvLyBmdW5jdGlvbi4KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIC8vIEJ5IGRlZmF1bHQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OlByaW50VG8oKSBpcyB1c2VkIGZvciBwcmludGluZwotICAgIC8vIHRoZSB2YWx1ZS4KLSAgICAvLwotICAgIC8vIFRoYW5rcyB0byBLb2VuaWcgbG9vay11cCwgaWYgVCBpcyBhIGNsYXNzIGFuZCBoYXMgaXRzIG93bgotICAgIC8vIFByaW50VG8oKSBmdW5jdGlvbiBkZWZpbmVkIGluIGl0cyBuYW1lc3BhY2UsIHRoYXQgZnVuY3Rpb24gd2lsbAotICAgIC8vIGJlIHZpc2libGUgaGVyZS4gIFNpbmNlIGl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZ2VuZXJpYyBvbmVzCi0gICAgLy8gaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCwgaXQgd2lsbCBiZSBwaWNrZWQgYnkgdGhlIGNvbXBpbGVyIGluIHRoZQotICAgIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnQgLSBleGFjdGx5IHdoYXQgd2Ugd2FudC4KLSAgICBQcmludFRvKHZhbHVlLCBvcyk7Ci0gIH0KLQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLX07Ci0KLS8vIFVuaXZlcnNhbFByaW50QXJyYXkoYmVnaW4sIGxlbiwgb3MpIHByaW50cyBhbiBhcnJheSBvZiAnbGVuJwotLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IFQqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgKm9zIDw8ICJ7fSI7Ci0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8ICJ7ICI7Ci0gICAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxODsKLSAgICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDg7Ci0gICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bwotICAgIC8vIG9taXQgc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdAotICAgIC8vIGtDaHVua1NpemUgZWxlbWVudHMuCi0gICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgotICAgIGlmIChsZW4gPD0ga1RocmVzaG9sZCkgewotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBsZW4sIG9zKTsKLSAgICB9IGVsc2UgewotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBrQ2h1bmtTaXplLCBvcyk7Ci0gICAgICAqb3MgPDwgIiwgLi4uLCAiOwotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOwotICAgIH0KLSAgICAqb3MgPDwgIiB9IjsKLSAgfQotfQotLy8gVGhpcyBvdmVybG9hZCBwcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgY29tcGFjdGx5LgotR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoCi0gICAgY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci0KLS8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IGNvbXBhY3RseS4KLUdURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAotICAgIGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBJbXBsZW1lbnRzIHByaW50aW5nIGFuIGFycmF5IHR5cGUgVFtOXS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4gewotIHB1YmxpYzoKLSAgLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSwgb21pdHRpbmcgc29tZSBlbGVtZW50cyB3aGVuIHRoZXJlIGFyZSB0b28KLSAgLy8gbWFueS4KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCAoJmEpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludEFycmF5KGEsIE4sIG9zKTsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbml2ZXJzYWxQcmludGVyPFQmPiB7Ci0gcHVibGljOgotICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KLSAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDE4MCkKLQotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgLy8gUHJpbnRzIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZS4gIFdlIHVzZSByZWludGVycHJldF9jYXN0IGhlcmUKLSAgICAvLyBhcyBzdGF0aWNfY2FzdCBkb2Vzbid0IGNvbXBpbGUgd2hlbiBUIGlzIGEgZnVuY3Rpb24gdHlwZS4KLSAgICAqb3MgPDwgIkAiIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZ2YWx1ZSkgPDwgIiAiOwotCi0gICAgLy8gVGhlbiBwcmludHMgdGhlIHZhbHVlIGl0c2VsZi4KLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOwotICB9Ci0KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi19OwotCi0vLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQgdmFsdWUKLS8vIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhlCi0vLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOwotICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VCY+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOwotICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFRbTl0+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZ2YWx1ZSlbTl0sIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFVuaXZlcnNhbFByaW50ZXI8VFtOXT46OlByaW50KHZhbHVlLCBvcyk7Ci0gIH0KLX07Ci10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgKm9zIDw8ICJOVUxMIjsKLSAgICB9IGVsc2UgewotICAgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsKLSAgICB9Ci0gIH0KLX07Ci10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNoYXIqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj46OlByaW50KHN0ciwgb3MpOwotICB9Ci19OwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IHdjaGFyX3QqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCB3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgKm9zIDw8ICJOVUxMIjsKLSAgICB9IGVsc2UgewotICAgICAgVW5pdmVyc2FsUHJpbnQoOjpzdGQ6OndzdHJpbmcoc3RyKSwgb3MpOwotICAgIH0KLSAgfQotfTsKLSNlbmRpZgotCi10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPHdjaGFyX3QqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludCh3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj46OlByaW50KHN0ciwgb3MpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlCi0vLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgZm9yIGEKLS8vIChjb25zdCkgY2hhciBwb2ludGVyLCB0aGlzIHByaW50cyBib3RoIHRoZSBwb2ludGVyIGFuZCB0aGUKLS8vIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIC8vIEEgd29ya2Fyb25kIGZvciB0aGUgYnVnIGluIFZDKysgNy4xIHRoYXQgcHJldmVudHMgdXMgZnJvbSBpbnN0YW50aWF0aW5nCi0gIC8vIFVuaXZlcnNhbFByaW50ZXIgd2l0aCBUIGRpcmVjdGx5LgotICB0eXBlZGVmIFQgVDE7Ci0gIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZSwgb3MpOwotfQotCi10eXBlZGVmIDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiBTdHJpbmdzOwotCi0vLyBUdXBsZVBvbGljeTxUdXBsZVQ+IG11c3QgcHJvdmlkZToKLS8vIC0gdHVwbGVfc2l6ZQotLy8gICAgIHNpemUgb2YgdHVwbGUgVHVwbGVULgotLy8gLSBnZXQ8c2l6ZV90IEk+KGNvbnN0IFR1cGxlVCYgdCkKLS8vICAgICBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdGluZyBlbGVtZW50IEkgb2YgdHVwbGUgVHVwbGVULgotLy8gLSB0dXBsZV9lbGVtZW50PHNpemVfdCBJPjo6dHlwZQotLy8gICAgIHR5cGUgb2YgZWxlbWVudCBJIG9mIHR1cGxlIFR1cGxlVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZVQ+Ci1zdHJ1Y3QgVHVwbGVQb2xpY3k7Ci0KLSNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVUPgotc3RydWN0IFR1cGxlUG9saWN5IHsKLSAgdHlwZWRlZiBUdXBsZVQgVHVwbGU7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgdHVwbGVfc2l6ZSA9IDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZTsKLQotICB0ZW1wbGF0ZSA8c2l6ZV90IEk+Ci0gIHN0cnVjdCB0dXBsZV9lbGVtZW50IDogOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT4ge307Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBJPgotICBzdGF0aWMgdHlwZW5hbWUgQWRkUmVmZXJlbmNlPAotICAgICAgY29uc3QgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGU+Ojp0eXBlIGdldCgKLSAgICAgIGNvbnN0IFR1cGxlJiB0dXBsZSkgewotICAgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8ST4odHVwbGUpOwotICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlVD4KLWNvbnN0IHNpemVfdCBUdXBsZVBvbGljeTxUdXBsZVQ+Ojp0dXBsZV9zaXplOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCi0KLSNpZiBHVEVTVF9IQVNfU1REX1RVUExFXwotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFR5cGVzPgotc3RydWN0IFR1cGxlUG9saWN5PCA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+ID4gewotICB0eXBlZGVmIDo6c3RkOjp0dXBsZTxUeXBlcy4uLj4gVHVwbGU7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgdHVwbGVfc2l6ZSA9IDo6c3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU7Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBJPgotICBzdHJ1Y3QgdHVwbGVfZWxlbWVudCA6IDo6c3RkOjp0dXBsZV9lbGVtZW50PEksIFR1cGxlPiB7fTsKLQotICB0ZW1wbGF0ZSA8c2l6ZV90IEk+Ci0gIHN0YXRpYyBjb25zdCB0eXBlbmFtZSA6OnN0ZDo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGUmIGdldCgKLSAgICAgIGNvbnN0IFR1cGxlJiB0dXBsZSkgewotICAgIHJldHVybiA6OnN0ZDo6Z2V0PEk+KHR1cGxlKTsKLSAgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KLWNvbnN0IHNpemVfdCBUdXBsZVBvbGljeTwgOjpzdGQ6OnR1cGxlPFR5cGVzLi4uPiA+Ojp0dXBsZV9zaXplOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1RVUExFXwotCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXwotLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZAotLy8gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKCkgdG8gYmUgZGVmaW5lZCBieQotLy8gaW5kdWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdHVwbGUgZmllbGRzLiAgVGhlIGlkZWEgaXMgdGhhdAotLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4KLS8vIGZpZWxkcyBpbiB0dXBsZSB0LCBhbmQgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKLS8vIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT4uCi0vLwotLy8gVGhlIGluZHVjdGl2ZSBjYXNlLgotdGVtcGxhdGUgPHNpemVfdCBOPgotc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlciB7Ci0gIC8vIFByaW50cyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgYSB0dXBsZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpQcmludFByZWZpeFRvKHQsIG9zKTsKLSAgICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkKLSAgICBpZiAoTiA+IDEpIHsKLSAgICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQotICAgICAgKm9zIDw8ICIsICI7Ci0gICAgfQotICAgIFVuaXZlcnNhbFByaW50ZXI8Ci0gICAgICAgIHR5cGVuYW1lIFR1cGxlUG9saWN5PFR1cGxlPjo6dGVtcGxhdGUgdHVwbGVfZWxlbWVudDxOIC0gMT46OnR5cGU+Ci0gICAgICAgIDo6UHJpbnQoVHVwbGVQb2xpY3k8VHVwbGU+Ojp0ZW1wbGF0ZSBnZXQ8TiAtIDE+KHQpLCBvcyk7Ci0gIH0KLQotICAvLyBUZXJzZWx5IHByaW50cyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgYSB0dXBsZSB0byBhIHN0cmluZyB2ZWN0b3IsCi0gIC8vIG9uZSBlbGVtZW50IGZvciBlYWNoIGZpZWxkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci0gIHN0YXRpYyB2b2lkIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHQsIFN0cmluZ3MqIHN0cmluZ3MpIHsKLSAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHQsIHN0cmluZ3MpOwotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgVW5pdmVyc2FsVGVyc2VQcmludChUdXBsZVBvbGljeTxUdXBsZT46OnRlbXBsYXRlIGdldDxOIC0gMT4odCksICZzcyk7Ci0gICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKLSAgfQotfTsKLQotLy8gQmFzZSBjYXNlLgotdGVtcGxhdGUgPD4KLXN0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MD4gewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci0gIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmLCA6OnN0ZDo6b3N0cmVhbSopIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiwgU3RyaW5ncyopIHt9Ci19OwotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHByaW50aW5nIGEgdHVwbGUuCi0vLyBUdXBsZSBtdXN0IGJlIGVpdGhlciBzdGQ6OnRyMTo6dHVwbGUgb3Igc3RkOjp0dXBsZSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotdm9pZCBQcmludFR1cGxlVG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgIigiOwotICBUdXBsZVByZWZpeFByaW50ZXI8VHVwbGVQb2xpY3k8VHVwbGU+Ojp0dXBsZV9zaXplPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7Ci0gICpvcyA8PCAiKSI7Ci19Ci0KLS8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQotLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKLS8vIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBmb3IgaG93IHdlIGRlZmluZSAidGVyc2VseSIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci1TdHJpbmdzIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhjb25zdCBUdXBsZSYgdmFsdWUpIHsKLSAgU3RyaW5ncyByZXN1bHQ7Ci0gIFR1cGxlUHJlZml4UHJpbnRlcjxUdXBsZVBvbGljeTxUdXBsZT46OnR1cGxlX3NpemU+OjoKLSAgICAgIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModmFsdWUsICZyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFIHx8IEdURVNUX0hBU19TVERfVFVQTEVfCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLTo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSkgewotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBJbmNsdWRlIGFueSBjdXN0b20gcHJpbnRlciBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmgiCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oCmluZGV4IGY2M2ZhOWEuLmRmZmFlZTEgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaAorKysgYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKQEAgLTEsMjMyICsxLDE1IEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFV0aWxpdGllcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBpdHNlbGYgYW5kIGNvZGUgdGhhdCB1c2VzIEdvb2dsZSBUZXN0Ci0vLyAoZS5nLiBmcmFtZXdvcmtzIGJ1aWx0IG9uIHRvcCBvZiBHb29nbGUgVGVzdCkuCisvLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworI2lmbmRlZiBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisjZGVmaW5lIFRFU1RJTkdfR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KIAotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisvLyBUaGUgZmlsZS9kaXJlY3RvcnkgbGF5b3V0IG9mIEdvb2dsZSBUZXN0IGlzIG5vdCB5ZXQgY29uc2lkZXJlZCBzdGFibGUuIFVudGlsCisvLyBpdCBzdGFiaWxpemVzLCBDaHJvbWl1bSBjb2RlIHdpbGwgdXNlIGZvcndhcmRpbmcgaGVhZGVycyBpbiB0ZXN0aW5nL2d0ZXN0CisvLyBhbmQgdGVzdGluZy9nbW9jaywgaW5zdGVhZCBvZiBkaXJlY3RseSBpbmNsdWRpbmcgZmlsZXMgaW4KKy8vIHRoaXJkX3BhcnR5L2dvb2dsZXRlc3QuCiAKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLS8vIFRoaXMgaGVscGVyIGNsYXNzIGNhbiBiZSB1c2VkIHRvIG1vY2sgb3V0IEdvb2dsZSBUZXN0IGZhaWx1cmUgcmVwb3J0aW5nCi0vLyBzbyB0aGF0IHdlIGNhbiB0ZXN0IEdvb2dsZSBUZXN0IG9yIGNvZGUgdGhhdCBidWlsZHMgb24gR29vZ2xlIFRlc3QuCi0vLwotLy8gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgYXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUKLS8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgb2JqZWN0IGdpdmVuIGluIHRoZSBjb25zdHJ1Y3RvciB3aGVuZXZlciBhIEdvb2dsZSBUZXN0Ci0vLyBmYWlsdXJlIGlzIHJlcG9ydGVkLiBJdCBjYW4gZWl0aGVyIGludGVyY2VwdCBvbmx5IGZhaWx1cmVzIHRoYXQgYXJlCi0vLyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGlzIG9iamVjdCBvciBpdCBjYW4gaW50ZXJjZXB0Ci0vLyBhbGwgZ2VuZXJhdGVkIGZhaWx1cmVzLiBUaGUgc2NvcGUgb2YgdGhpcyBtb2NrIG9iamVjdCBjYW4gYmUgY29udHJvbGxlZCB3aXRoCi0vLyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSB0d28gYXJndW1lbnRzIGNvbnN0cnVjdG9yLgotY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgotICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgLy8gVGhlIHR3byBwb3NzaWJsZSBtb2NraW5nIG1vZGVzIG9mIHRoaXMgb2JqZWN0LgotICBlbnVtIEludGVyY2VwdE1vZGUgewotICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAgLy8gSW50ZXJjZXB0cyBvbmx5IHRocmVhZCBsb2NhbCBmYWlsdXJlcy4KLSAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMgICAgICAgICAgIC8vIEludGVyY2VwdHMgYWxsIGZhaWx1cmVzLgotICB9OwotCi0gIC8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQKLSAgLy8gYnkgR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCi0gIC8vIHJlc3VsdHMuIFRoaXMgcmVwb3J0ZXIgd2lsbCBvbmx5IGNhdGNoIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudAotICAvLyB0aHJlYWQuIERFUFJFQ0FURUQKLSAgZXhwbGljaXQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KTsKLQotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgeW91IGNhbiBjaG9vc2UgdGhlIGludGVyY2VwdGlvbiBzY29wZSBvZiB0aGlzIG9iamVjdC4KLSAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KTsKLQotICAvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCi0gIHZpcnR1YWwgflNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7Ci0KLSAgLy8gQXBwZW5kcyB0aGUgVGVzdFBhcnRSZXN1bHQgb2JqZWN0IHRvIHRoZSBUZXN0UGFydFJlc3VsdEFycmF5Ci0gIC8vIHJlY2VpdmVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgLy8KLSAgLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZQotICAvLyBpbnRlcmZhY2UuCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLSBwcml2YXRlOgotICB2b2lkIEluaXQoKTsKLQotICBjb25zdCBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlXzsKLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb2xkX3JlcG9ydGVyXzsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKLX07Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEEgaGVscGVyIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBhbmQKLS8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkuICBJdHMgZGVzdHJ1Y3RvciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgotLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgotLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKLS8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgotY2xhc3MgR1RFU1RfQVBJXyBTaW5nbGVGYWlsdXJlQ2hlY2tlciB7Ci0gcHVibGljOgotICAvLyBUaGUgY29uc3RydWN0b3IgcmVtZW1iZXJzIHRoZSBhcmd1bWVudHMuCi0gIFNpbmdsZUZhaWx1cmVDaGVja2VyKGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKTsKLSAgflNpbmdsZUZhaWx1cmVDaGVja2VyKCk7Ci0gcHJpdmF0ZToKLSAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0c187Ci0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGVfOwotICBjb25zdCBzdHJpbmcgc3Vic3RyXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNpbmdsZUZhaWx1cmVDaGVja2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBBIHNldCBvZiBtYWNyb3MgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZAotLy8gdG8gZ2VuZXJhdGUgR29vZ2xlIFRlc3QgZmF0YWwgZmFpbHVyZXMuICBJdCB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgotLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInCi0vLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCi0vLwotLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUgb25seQotLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kCi0vLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyBkb2VzIHRoZSBzYW1lIGJ1dCBmb3IgYWxsIHRocmVhZHMuCi0vLwotLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50Ci0vLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9yIGFib3J0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KLS8vCi0vLyBLbm93biByZXN0cmljdGlvbnM6Ci0vLyAgIC0gJ3N0YXRlbWVudCcgY2Fubm90IHJlZmVyZW5jZSBsb2NhbCBub24tc3RhdGljIHZhcmlhYmxlcyBvcgotLy8gICAgIG5vbi1zdGF0aWMgbWVtYmVycyBvZiB0aGUgY3VycmVudCBvYmplY3QuCi0vLyAgIC0gJ3N0YXRlbWVudCcgY2Fubm90IHJldHVybiBhIHZhbHVlLgotLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCi0vLwotLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KLS8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCi0vLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCi0vLyB3b3Jrcy4gIFRoZSBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSB0ZXN0IGluCi0vLyBndGVzdF91bml0dGVzdC5jYyB3aWxsIGZhaWwgdG8gY29tcGlsZSBpZiB3ZSBkbyB0aGF0LgotI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXAotICBkbyB7IFwKLSAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XAotICAgICBwdWJsaWM6XAotICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZSgpIHsgc3RhdGVtZW50OyB9XAotICAgIH07XAotICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCi0gICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wKLSAgICB7XAotICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCi0gICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKLSAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcCi0gICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wKLSAgICB9XAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0jZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHN0YXRlbWVudCwgc3Vic3RyKSBcCi0gIGRvIHsgXAotICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCi0gICAgfTtcCi0gICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKLSAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAotICAgIHtcCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAotICAgICAgICAgIElOVEVSQ0VQVF9BTExfVEhSRUFEUywgJmd0ZXN0X2ZhaWx1cmVzKTtcCi0gICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wKLSAgICB9XAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0vLyBBIG1hY3JvIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQgdG8KLS8vIGdlbmVyYXRlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcy4gIEl0IGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4KLS8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIG5vbi1mYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKLS8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KLS8vCi0vLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSBvbmx5Ci0vLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKLS8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KLS8vCi0vLyAnc3RhdGVtZW50JyBpcyBhbGxvd2VkIHRvIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMgYW5kIG1lbWJlcnMgb2YKLS8vIHRoZSBjdXJyZW50IG9iamVjdC4KLS8vCi0vLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKLS8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotLy8KLS8vIEtub3duIHJlc3RyaWN0aW9uczoKLS8vICAgLSBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byB0aGlzIG1hY3JvLgotLy8KLS8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvCi0vLyBtYWNyb3MgYXJlIG11Y2ggYWxpa2UsIHdlIGNhbm5vdCByZWZhY3RvciB0aGVtIHRvIHVzZSBhIGNvbW1vbgotLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3NvcgotLy8gd29ya3MuICBJZiB3ZSBkbyB0aGF0LCB0aGUgY29kZSB3b24ndCBjb21waWxlIHdoZW4gdGhlIHVzZXIgZ2l2ZXMKLS8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYSBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHRoYXQKLS8vIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuIHVucHJvdGVjdGVkIGNvbW1hLiAgVGhlCi0vLyBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSB0ZXN0IGluIGd0ZXN0X3VuaXR0ZXN0LmNjCi0vLyBjYXRjaGVzIHRoYXQuCi0vLwotLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgaGF2ZSB0byB3cml0ZQotLy8gICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQotLy8gaW5zdGVhZCBvZgotLy8gICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkKLS8vIHRvIGF2b2lkIGFuIE1TVkMgd2FybmluZyBvbiB1bnJlYWNoYWJsZSBjb2RlLgotI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXAotICBkbyB7XAotICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCi0gICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAotICAgICAgICAoc3Vic3RyKSk7XAotICAgIHtcCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAotICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKLSAgICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9XAotICAgIH1cCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLSNkZWZpbmUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKLSAgZG8ge1wKLSAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAotICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwKLSAgICAgICAgKHN1YnN0cikpO1wKLSAgICB7XAotICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCi0gICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX0FMTF9USFJFQURTLCBcCi0gICAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzKTtcCi0gICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKLSAgICB9XAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisjZW5kaWYgIC8vIFRFU1RJTkdfR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlYjg0NC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKLS8vCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KLQotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbgotLy8gYXNzZXJ0aW9uIG9yIGFuIGV4cGxpY2l0IEZBSUwoKSwgQUREX0ZBSUxVUkUoKSwgb3IgU1VDQ0VTUygpKS4KLS8vCi0vLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFBhcnRSZXN1bHQgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RQYXJ0UmVzdWx0IHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbiBhc3NlcnRpb24gb3IgYW4KLSAgLy8gZXhwbGljaXQgU1VDQ0VFRCgpLCBGQUlMKCksIG9yIEFERF9GQUlMVVJFKCkpLgotICBlbnVtIFR5cGUgewotICAgIGtTdWNjZXNzLCAgICAgICAgICAvLyBTdWNjZWVkZWQuCi0gICAga05vbkZhdGFsRmFpbHVyZSwgIC8vIEZhaWxlZCBidXQgdGhlIHRlc3QgY2FuIGNvbnRpbnVlLgotICAgIGtGYXRhbEZhaWx1cmUgICAgICAvLyBGYWlsZWQgYW5kIHRoZSB0ZXN0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgotICB9OwotCi0gIC8vIEMndG9yLiAgVGVzdFBhcnRSZXN1bHQgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQotICAvLyBUZXN0UGFydFJlc3VsdCBvYmplY3QuCi0gIFRlc3RQYXJ0UmVzdWx0KFR5cGUgYV90eXBlLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgaW50IGFfbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbWVzc2FnZSkKLSAgICAgIDogdHlwZV8oYV90eXBlKSwKLSAgICAgICAgZmlsZV9uYW1lXyhhX2ZpbGVfbmFtZSA9PSBOVUxMID8gIiIgOiBhX2ZpbGVfbmFtZSksCi0gICAgICAgIGxpbmVfbnVtYmVyXyhhX2xpbmVfbnVtYmVyKSwKLSAgICAgICAgc3VtbWFyeV8oRXh0cmFjdFN1bW1hcnkoYV9tZXNzYWdlKSksCi0gICAgICAgIG1lc3NhZ2VfKGFfbWVzc2FnZSkgewotICB9Ci0KLSAgLy8gR2V0cyB0aGUgb3V0Y29tZSBvZiB0aGUgdGVzdCBwYXJ0LgotICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQotCi0gIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKLSAgLy8gTlVMTCBpZiBpdCdzIHVua25vd24uCi0gIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmlsZV9uYW1lXy5lbXB0eSgpID8gTlVMTCA6IGZpbGVfbmFtZV8uY19zdHIoKTsKLSAgfQotCi0gIC8vIEdldHMgdGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwKLSAgLy8gb3IgLTEgaWYgaXQncyB1bmtub3duLgotICBpbnQgbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBsaW5lX251bWJlcl87IH0KLQotICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCi0gIGNvbnN0IGNoYXIqIHN1bW1hcnkoKSBjb25zdCB7IHJldHVybiBzdW1tYXJ5Xy5jX3N0cigpOyB9Ci0KLSAgLy8gR2V0cyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRlc3QgcGFydC4KLSAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgcGFzc2VkLgotICBib29sIHBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtTdWNjZXNzOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhaWxlZC4KLSAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyAhPSBrU3VjY2VzczsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuCi0gIGJvb2wgbm9uZmF0YWxseV9mYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrTm9uRmF0YWxGYWlsdXJlOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhdGFsbHkgZmFpbGVkLgotICBib29sIGZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga0ZhdGFsRmFpbHVyZTsgfQotCi0gcHJpdmF0ZToKLSAgVHlwZSB0eXBlXzsKLQotICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrCi0gIC8vIHRyYWNlIGluIGl0LgotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSk7Ci0KLSAgLy8gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKLSAgLy8gIiIgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCi0gIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZV87Ci0gIC8vIFRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yIC0xCi0gIC8vIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLgotICBpbnQgbGluZV9udW1iZXJfOwotICBzdGQ6OnN0cmluZyBzdW1tYXJ5XzsgIC8vIFRoZSB0ZXN0IGZhaWx1cmUgc3VtbWFyeS4KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCi19OwotCi0vLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0KLS8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCi0vLwotLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90Ci0vLyB2aXJ0dWFsLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKLSBwdWJsaWM6Ci0gIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQotCi0gIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KLSAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgotICBpbnQgc2l6ZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOwotfTsKLQotLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCi1jbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Ci19OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKLS8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQotLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKLS8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgotLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLWNsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCi0gICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKLSAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7Ci0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLSAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9Ci0gcHJpdmF0ZToKLSAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOwotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY5ZDU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KLQotLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyB0eXBlZCB0ZXN0cyBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotCi0vLyBUeXBlZCAoYWthIHR5cGUtZHJpdmVuKSB0ZXN0cyByZXBlYXQgdGhlIHNhbWUgdGVzdCBmb3IgdHlwZXMgaW4gYQotLy8gbGlzdC4gIFlvdSBtdXN0IGtub3cgd2hpY2ggdHlwZXMgeW91IHdhbnQgdG8gdGVzdCB3aXRoIHdoZW4gd3JpdGluZwotLy8gdHlwZWQgdGVzdHMuIEhlcmUncyBob3cgeW91IGRvIGl0OgotCi0jaWYgMAotCi0vLyBGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCi0vLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgLi4uCi0gIHR5cGVkZWYgc3RkOjpsaXN0PFQ+IExpc3Q7Ci0gIHN0YXRpYyBUIHNoYXJlZF87Ci0gIFQgdmFsdWVfOwotfTsKLQotLy8gTmV4dCwgYXNzb2NpYXRlIGEgbGlzdCBvZiB0eXBlcyB3aXRoIHRoZSB0ZXN0IGNhc2UsIHdoaWNoIHdpbGwgYmUKLS8vIHJlcGVhdGVkIGZvciBlYWNoIHR5cGUgaW4gdGhlIGxpc3QuICBUaGUgdHlwZWRlZiBpcyBuZWNlc3NhcnkgZm9yCi0vLyB0aGUgbWFjcm8gdG8gcGFyc2UgY29ycmVjdGx5LgotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKLVRZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBNeVR5cGVzKTsKLQotLy8gSWYgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UgY2FuIHdyaXRlIHRoYXQgdHlwZQotLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+OgotLy8gICBUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgaW50KTsKLQotLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1QoKSBpbnN0ZWFkIG9mIFRFU1RfRigpIHRvIGRlZmluZSBhcyBtYW55IHR5cGVkCi0vLyB0ZXN0cyBmb3IgdGhpcyB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuCi1UWVBFRF9URVNUKEZvb1Rlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgotICAvLyBTaW5jZSB3ZSBhcmUgaW5zaWRlIGEgZGVyaXZlZCBjbGFzcyB0ZW1wbGF0ZSwgQysrIHJlcXVpcmVzIHVzZSB0bwotICAvLyB2aXNpdCB0aGUgbWVtYmVycyBvZiBGb29UZXN0IHZpYSAndGhpcycuCi0gIFR5cGVQYXJhbSBuID0gdGhpcy0+dmFsdWVfOwotCi0gIC8vIFRvIHZpc2l0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlLCBhZGQgdGhlIFRlc3RGaXh0dXJlOjoKLSAgLy8gcHJlZml4LgotICBuICs9IFRlc3RGaXh0dXJlOjpzaGFyZWRfOwotCi0gIC8vIFRvIHJlZmVyIHRvIHR5cGVkZWZzIGluIHRoZSBmaXh0dXJlLCBhZGQgdGhlICJ0eXBlbmFtZQotICAvLyBUZXN0Rml4dHVyZTo6IiBwcmVmaXguCi0gIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpMaXN0IHZhbHVlczsKLSAgdmFsdWVzLnB1c2hfYmFjayhuKTsKLSAgLi4uCi19Ci0KLVRZUEVEX1RFU1QoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9Ci0KLSNlbmRpZiAgLy8gMAotCi0vLyBUeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGFic3RyYWN0IHRlc3QgcGF0dGVybnMgcGFyYW1ldGVyaXplZAotLy8gYnkgYSB0eXBlLiAgQ29tcGFyZWQgd2l0aCB0eXBlZCB0ZXN0cywgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBhbGxvdyB5b3UgdG8gZGVmaW5lIHRoZSB0ZXN0IHBhdHRlcm4gd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIHR5cGUKLS8vIHBhcmFtZXRlcnMgYXJlLiAgVGhlIGRlZmluZWQgcGF0dGVybiBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGgKLS8vIGRpZmZlcmVudCB0eXBlcyBhbnkgbnVtYmVyIG9mIHRpbWVzLCBpbiBhbnkgbnVtYmVyIG9mIHRyYW5zbGF0aW9uCi0vLyB1bml0cy4KLS8vCi0vLyBJZiB5b3UgYXJlIGRlc2lnbmluZyBhbiBpbnRlcmZhY2Ugb3IgY29uY2VwdCwgeW91IGNhbiBkZWZpbmUgYQotLy8gc3VpdGUgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHRvIHZlcmlmeSBwcm9wZXJ0aWVzIHRoYXQgYW55Ci0vLyB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlL2NvbmNlcHQgc2hvdWxkIGhhdmUuICBUaGVuLAotLy8gZWFjaCBpbXBsZW1lbnRhdGlvbiBjYW4gZWFzaWx5IGluc3RhbnRpYXRlIHRoZSB0ZXN0IHN1aXRlIHRvIHZlcmlmeQotLy8gdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcmVxdWlyZW1lbnRzLCB3aXRob3V0IGhhdmluZyB0byB3cml0ZQotLy8gc2ltaWxhciB0ZXN0cyByZXBlYXRlZGx5LiAgSGVyZSdzIGFuIGV4YW1wbGU6Ci0KLSNpZiAwCi0KLS8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKLS8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gIC4uLgotfTsKLQotLy8gTmV4dCwgZGVjbGFyZSB0aGF0IHlvdSB3aWxsIGRlZmluZSBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UKLS8vICh0aGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91Ci0vLyBwcmVmZXIpOgotVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCk7Ci0KLS8vIFRoZW4sIHVzZSBUWVBFRF9URVNUX1AoKSB0byBkZWZpbmUgYXMgbWFueSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vIGZvciB0aGlzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuCi1UWVBFRF9URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKLSAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCi0gIFR5cGVQYXJhbSBuID0gMDsKLSAgLi4uCi19Ci0KLVRZUEVEX1RFU1RfUChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KLQotLy8gTm93IHRoZSB0cmlja3kgcGFydDogeW91IG5lZWQgdG8gcmVnaXN0ZXIgYWxsIHRlc3QgcGF0dGVybnMgYmVmb3JlCi0vLyB5b3UgY2FuIGluc3RhbnRpYXRlIHRoZW0uICBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIG1hY3JvIGlzIHRoZQotLy8gdGVzdCBjYXNlIG5hbWU7IHRoZSByZXN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIGluIHRoaXMgdGVzdAotLy8gY2FzZS4KLVJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEb2VzQmxhaCwgSGFzUHJvcGVydHlBKTsKLQotLy8gRmluYWxseSwgeW91IGFyZSBmcmVlIHRvIGluc3RhbnRpYXRlIHRoZSBwYXR0ZXJuIHdpdGggdGhlIHR5cGVzIHlvdQotLy8gd2FudC4gIElmIHlvdSBwdXQgdGhlIGFib3ZlIGNvZGUgaW4gYSBoZWFkZXIgZmlsZSwgeW91IGNhbiAjaW5jbHVkZQotLy8gaXQgaW4gbXVsdGlwbGUgQysrIHNvdXJjZSBmaWxlcyBhbmQgaW5zdGFudGlhdGUgaXQgbXVsdGlwbGUgdGltZXMuCi0vLwotLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgdGhlIGZpcnN0Ci0vLyBhcmd1bWVudCB0byB0aGUgSU5TVEFOVElBVEVfKiBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQKLS8vIHRvIHRoZSBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuICBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IKLS8vIGRpZmZlcmVudCBpbnN0YW5jZXMuCi10eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIE15VHlwZXMpOwotCi0vLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCi0vLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46Ci0vLyAgIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBpbnQpOwotCi0jZW5kaWYgIC8vIDAKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaCIKLQotLy8gSW1wbGVtZW50cyB0eXBlZCB0ZXN0cy4KLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUKLS8vIGdpdmVuIHRlc3QgY2FzZS4KLSMgZGVmaW5lIEdURVNUX1RZUEVfUEFSQU1TXyhUZXN0Q2FzZU5hbWUpIGd0ZXN0X3R5cGVfcGFyYW1zXyMjVGVzdENhc2VOYW1lIyNfCi0KLS8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0Ci0vLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQotLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKLSMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRShDYXNlTmFtZSwgVHlwZXMpIFwKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZSBcCi0gICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpCi0KLSMgZGVmaW5lIFRZUEVEX1RFU1QoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCi0gIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCi0gICAgICA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKLSAgIHByaXZhdGU6IFwKLSAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCi0gICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAotICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCi0gIH07IFwKLSAgYm9vbCBndGVzdF8jI0Nhc2VOYW1lIyNfIyNUZXN0TmFtZSMjX3JlZ2lzdGVyZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0PCBcCi0gICAgICAgICAgQ2FzZU5hbWUsIFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZVNlbDwgXAotICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk+LCBcCi0gICAgICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKT46OlJlZ2lzdGVyKFwKLSAgICAgICAgICAgICAgIiIsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCBcCi0gICAgICAgICAgICAgICNDYXNlTmFtZSwgI1Rlc3ROYW1lLCAwKTsgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAotICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLS8vIEltcGxlbWVudHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEV4cGFuZHMgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIHRoYXQgdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBmb3IKLS8vIHRoZSBnaXZlbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFyZSBkZWZpbmVkIGluLiAgVGhlIGV4YWN0Ci0vLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UgaXMgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0jIGRlZmluZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oVGVzdENhc2VOYW1lKSBcCi0gIGd0ZXN0X2Nhc2VfIyNUZXN0Q2FzZU5hbWUjI18KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgotLy8gdGhlIGRlZmluZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KLSMgZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwKLSAgZ3Rlc3RfdHlwZWRfdGVzdF9jYXNlX3Bfc3RhdGVfIyNUZXN0Q2FzZU5hbWUjI18KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4KLS8vCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgotLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KLSMgZGVmaW5lIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oVGVzdENhc2VOYW1lKSBcCi0gIGd0ZXN0X3JlZ2lzdGVyZWRfdGVzdF9uYW1lc18jI1Rlc3RDYXNlTmFtZSMjXwotCi0vLyBUaGUgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IG1hY3JvcyBhcmUKLS8vIHN0YXRpYyBhcyB0eXBpY2FsbHkgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIGEgLmggZmlsZSB0aGF0IGNhbiBiZQotLy8gI2luY2x1ZGVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KLSMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lKSBcCi0gIHN0YXRpYyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZFRlc3RDYXNlUFN0YXRlIFwKLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkKLQotIyBkZWZpbmUgVFlQRURfVEVTVF9QKENhc2VOYW1lLCBUZXN0TmFtZSkgXAotICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKLSAgY2xhc3MgVGVzdE5hbWUgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCi0gICBwcml2YXRlOiBcCi0gICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAotICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAotICB9OyBcCi0gIHN0YXRpYyBib29sIGd0ZXN0XyMjVGVzdE5hbWUjI19kZWZpbmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXAotICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0Nhc2VOYW1lLCAjVGVzdE5hbWUpOyBcCi0gIH0gXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAotICB2b2lkIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6OlRlc3ROYW1lPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCi0KLSMgZGVmaW5lIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lLCAuLi4pIFwKLSAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCi0gIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVzPF9fVkFfQVJHU19fPjo6dHlwZSBndGVzdF9BbGxUZXN0c187IFwKLSAgfSBcCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSA9IFwKLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcyhcCi0gICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjX19WQV9BUkdTX18pCi0KLS8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0Ci0vLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQotLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKLSMgZGVmaW5lIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgQ2FzZU5hbWUsIFR5cGVzKSBcCi0gIGJvb2wgZ3Rlc3RfIyNQcmVmaXgjI18jI0Nhc2VOYW1lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxDYXNlTmFtZSwgXAotICAgICAgICAgIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6Omd0ZXN0X0FsbFRlc3RzXywgXAotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlPjo6UmVnaXN0ZXIoXAotICAgICAgICAgICAgICAjUHJlZml4LCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCBcCi0gICAgICAgICAgICAgICZHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLCBcCi0gICAgICAgICAgICAgICNDYXNlTmFtZSwgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaAppbmRleCAyYzQ0OGUyLi5lZGUxZTQyIDEwMDY0NAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaAorKysgYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaApAQCAtMSwyMjY0ICsxLDE1IEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIEdvb2dsZSBUZXN0LiAgSXQgc2hvdWxkIGJlCi0vLyBpbmNsdWRlZCBieSBhbnkgdGVzdCBwcm9ncmFtIHRoYXQgdXNlcyBHb29nbGUgVGVzdC4KLS8vCi0vLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bwotLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCi0vLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6Ci0vLwotLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0vLwotLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKLS8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgotLy8gcHJvZ3JhbSEKLS8vCi0vLyBBY2tub3dsZWRnbWVudDogR29vZ2xlIFRlc3QgYm9ycm93ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIHRlc3QKLS8vIHJlZ2lzdHJhdGlvbiBmcm9tIEJhcnRoZWxlbXkgRGFnZW5haXMnIChiYXJ0aGVsZW15QHByb2xvZ2lxdWUuY29tKQotLy8gZWFzeVVuaXQgZnJhbWV3b3JrLgorLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMKKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisjaWZuZGVmIFRFU1RJTkdfR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworI2RlZmluZSBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KIAotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisvLyBUaGUgZmlsZS9kaXJlY3RvcnkgbGF5b3V0IG9mIEdvb2dsZSBUZXN0IGlzIG5vdCB5ZXQgY29uc2lkZXJlZCBzdGFibGUuIFVudGlsCisvLyBpdCBzdGFiaWxpemVzLCBDaHJvbWl1bSBjb2RlIHdpbGwgdXNlIGZvcndhcmRpbmcgaGVhZGVycyBpbiB0ZXN0aW5nL2d0ZXN0CisvLyBhbmQgdGVzdGluZy9nbW9jaywgaW5zdGVhZCBvZiBkaXJlY3RseSBpbmNsdWRpbmcgZmlsZXMgaW4KKy8vIHRoaXJkX3BhcnR5L2dvb2dsZXRlc3QuCiAKLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3Byb2QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiCi0KLSNpZiBkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX1FBKQotI2Vycm9yIFlvdSBjYW5ub3QgYnVpbGQgdW5pdCB0ZXN0cyBpbiBxYSBidWlsZHMuCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKLSNlcnJvciBZb3UgY2Fubm90IGJ1aWxkIHVuaXQgdGVzdHMgaW4gZ29sZCBidWlsZHMuCi0jZW5kaWYKLQotLy8gRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGlmZmVyZW50IHN0cmluZyBjbGFzc2VzIGFyZSBhdmFpbGFibGUuCi0vLyBPbiBMaW51eCwgaW4gYWRkaXRpb24gdG8gOjpzdGQ6OnN0cmluZywgR29vZ2xlIGFsc28gbWFrZXMgdXNlIG9mCi0vLyBjbGFzcyA6OnN0cmluZywgd2hpY2ggaGFzIHRoZSBzYW1lIGludGVyZmFjZSBhcyA6OnN0ZDo6c3RyaW5nLCBidXQKLS8vIGhhcyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLS8vCi0vLyBZb3UgY2FuIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAxIHRvIGluZGljYXRlIHRoYXQKLS8vIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSBBTkQgaXMgYSBkaXN0aW5jdCB0eXBlIHRvIDo6c3RkOjpzdHJpbmcsIG9yCi0vLyBkZWZpbmUgaXQgdG8gMCB0byBpbmRpY2F0ZSBvdGhlcndpc2UuCi0vLwotLy8gSWYgOjpzdGQ6OnN0cmluZyBhbmQgOjpzdHJpbmcgYXJlIHRoZSBzYW1lIGNsYXNzIG9uIHlvdXIgcGxhdGZvcm0KLS8vIGR1ZSB0byBhbGlhc2luZywgeW91IHNob3VsZCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMC4KLS8vCi0vLyBJZiB5b3UgZG8gbm90IGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORywgaXQgaXMgZGVmaW5lZAotLy8gaGV1cmlzdGljYWxseS4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCi0KLS8vIFRoaXMgZmxhZyB0ZW1wb3JhcnkgZW5hYmxlcyB0aGUgZGlzYWJsZWQgdGVzdHMuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKLQotLy8gVGhpcyBmbGFnIGJyaW5ncyB0aGUgZGVidWdnZXIgb24gYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGJyZWFrX29uX2ZhaWx1cmUpOwotCi0vLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBjYXRjaGVzIGFsbCB0ZXN0LXRocm93biBleGNlcHRpb25zCi0vLyBhbmQgbG9ncyB0aGVtIGFzIGZhaWx1cmVzLgotR1RFU1RfREVDTEFSRV9ib29sXyhjYXRjaF9leGNlcHRpb25zKTsKLQotLy8gVGhpcyBmbGFnIGVuYWJsZXMgdXNpbmcgY29sb3JzIGluIHRlcm1pbmFsIG91dHB1dC4gQXZhaWxhYmxlIHZhbHVlcyBhcmUKLS8vICJ5ZXMiIHRvIGVuYWJsZSBjb2xvcnMsICJubyIgKGRpc2FibGUgY29sb3JzKSwgb3IgImF1dG8iICh0aGUgZGVmYXVsdCkKLS8vIHRvIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18oY29sb3IpOwotCi0vLyBUaGlzIGZsYWcgc2V0cyB1cCB0aGUgZmlsdGVyIHRvIHNlbGVjdCBieSBuYW1lIHVzaW5nIGEgZ2xvYiBwYXR0ZXJuCi0vLyB0aGUgdGVzdHMgdG8gcnVuLiBJZiB0aGUgZmlsdGVyIGlzIG5vdCBnaXZlbiBhbGwgdGVzdHMgYXJlIGV4ZWN1dGVkLgotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGZpbHRlcik7Ci0KLS8vIFRoaXMgZmxhZyBjYXVzZXMgdGhlIEdvb2dsZSBUZXN0IHRvIGxpc3QgdGVzdHMuIE5vbmUgb2YgdGhlIHRlc3RzIGxpc3RlZAotLy8gYXJlIGFjdHVhbGx5IHJ1biBpZiB0aGUgZmxhZyBpcyBwcm92aWRlZC4KLUdURVNUX0RFQ0xBUkVfYm9vbF8obGlzdF90ZXN0cyk7Ci0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGVtaXRzIGEgZGV0YWlsZWQgWE1MIHJlcG9ydCB0byBhIGZpbGUKLS8vIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwgdGV4dHVhbCBvdXRwdXQuCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18ob3V0cHV0KTsKLQotLy8gVGhpcyBmbGFncyBjb250cm9sIHdoZXRoZXIgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBlbGFwc2VkIHRpbWUgZm9yIGVhY2gKLS8vIHRlc3QuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHByaW50X3RpbWUpOwotCi0vLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSByYW5kb20gbnVtYmVyIHNlZWQuCi1HVEVTVF9ERUNMQVJFX2ludDMyXyhyYW5kb21fc2VlZCk7Ci0KLS8vIFRoaXMgZmxhZyBzZXRzIGhvdyBtYW55IHRpbWVzIHRoZSB0ZXN0cyBhcmUgcmVwZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0vLyBpcyAxLiBJZiB0aGUgdmFsdWUgaXMgLTEgdGhlIHRlc3RzIGFyZSByZXBlYXRpbmcgZm9yZXZlci4KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7Ci0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGluY2x1ZGVzIEdvb2dsZSBUZXN0IGludGVybmFsCi0vLyBzdGFjayBmcmFtZXMgaW4gZmFpbHVyZSBzdGFjayB0cmFjZXMuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKTsKLQotLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0ZXN0cycgb3JkZXIgaXMgcmFuZG9taXplZCBvbiBldmVyeSBpdGVyYXRpb24uCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHNodWZmbGUpOwotCi0vLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUKLS8vIHByaW50ZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuCi1HVEVTVF9ERUNMQVJFX2ludDMyXyhzdGFja190cmFjZV9kZXB0aCk7Ci0KLS8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4KLS8vIGV4Y2VwdGlvbiBpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYQotLy8gbm9uLXplcm8gY29kZSBvdGhlcndpc2UuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHRocm93X29uX2ZhaWx1cmUpOwotCi0vLyBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgd2l0aCBhICJob3N0OnBvcnQiIHN0cmluZywgb24gc3VwcG9ydGVkCi0vLyBwbGF0Zm9ybXMgdGVzdCByZXN1bHRzIGFyZSBzdHJlYW1lZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgb24KLS8vIHRoZSBzcGVjaWZpZWQgaG9zdCBtYWNoaW5lLgotR1RFU1RfREVDTEFSRV9zdHJpbmdfKHN0cmVhbV9yZXN1bHRfdG8pOwotCi0vLyBUaGUgdXBwZXIgbGltaXQgZm9yIHZhbGlkIHN0YWNrIHRyYWNlIGRlcHRocy4KLWNvbnN0IGludCBrTWF4U3RhY2tUcmFjZURlcHRoID0gMTAwOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBBc3NlcnRIZWxwZXI7Ci1jbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKLWNsYXNzIEV4ZWNEZWF0aFRlc3Q7Ci1jbGFzcyBOb0V4ZWNEZWF0aFRlc3Q7Ci1jbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyOwotY2xhc3MgR1Rlc3RGbGFnU2F2ZXI7Ci1jbGFzcyBTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7Ci1jbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3I7Ci1jbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKLWNsYXNzIFRlc3RFdmVudFJlcGVhdGVyOwotY2xhc3MgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXI7Ci1jbGFzcyBXaW5kb3dzRGVhdGhUZXN0OwotY2xhc3MgVW5pdFRlc3RJbXBsKiBHZXRVbml0VGVzdEltcGwoKTsKLXZvaWQgUmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIGZyaWVuZCByZWxhdGlvbnNoaXAgb2Ygc29tZSBvZiB0aGVzZSBjbGFzc2VzIGlzIGN5Y2xpYy4KLS8vIElmIHdlIGRvbid0IGZvcndhcmQgZGVjbGFyZSB0aGVtIHRoZSBjb21waWxlciBtaWdodCBjb25mdXNlIHRoZSBjbGFzc2VzCi0vLyBpbiBmcmllbmRzaGlwIGNsYXVzZXMgd2l0aCBzYW1lIG5hbWVkIGNsYXNzZXMgb24gdGhlIHNjb3BlLgotY2xhc3MgVGVzdDsKLWNsYXNzIFRlc3RDYXNlOwotY2xhc3MgVGVzdEluZm87Ci1jbGFzcyBVbml0VGVzdDsKLQotLy8gQSBjbGFzcyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGFzc2VydGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIFdoZW4KLS8vIHRoZSBhc3NlcnRpb24gd2Fzbid0IHN1Y2Nlc3NmdWwsIHRoZSBBc3NlcnRpb25SZXN1bHQgb2JqZWN0Ci0vLyByZW1lbWJlcnMgYSBub24tZW1wdHkgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyBob3cgaXQgZmFpbGVkLgotLy8KLS8vIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCB1c2Ugb25lIG9mIHRoZSBmYWN0b3J5IGZ1bmN0aW9ucwotLy8gKEFzc2VydGlvblN1Y2Nlc3MoKSBhbmQgQXNzZXJ0aW9uRmFpbHVyZSgpKS4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWZ1bCBmb3IgdHdvIHB1cnBvc2VzOgotLy8gICAxLiBEZWZpbmluZyBwcmVkaWNhdGUgZnVuY3Rpb25zIHRvIGJlIHVzZWQgd2l0aCBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucwotLy8gICAgICBFWFBFQ1RfVFJVRS9FWFBFQ1RfRkFMU0UgYW5kIHRoZWlyIEFTU0VSVF8gY291bnRlcnBhcnRzCi0vLyAgIDIuIERlZmluaW5nIHByZWRpY2F0ZS1mb3JtYXQgZnVuY3Rpb25zIHRvIGJlCi0vLyAgICAgIHVzZWQgd2l0aCBwcmVkaWNhdGUgYXNzZXJ0aW9ucyAoQVNTRVJUX1BSRURfRk9STUFUKiwgZXRjKS4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZSBJc0V2ZW4gcHJlZGljYXRlOgotLy8KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgewotLy8gICAgIGlmICgobiAlIDIpID09IDApCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotLy8gICAgIGVsc2UKLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Ci0vLyAgIH0KLS8vCi0vLyBUaGVuIHRoZSBmYWlsZWQgZXhwZWN0YXRpb24gRVhQRUNUX1RSVUUoSXNFdmVuKEZpYig1KSkpCi0vLyB3aWxsIHByaW50IHRoZSBtZXNzYWdlCi0vLwotLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKLS8vICAgICBBY3R1YWw6IGZhbHNlICg1IGlzIG9kZCkKLS8vICAgRXhwZWN0ZWQ6IHRydWUKLS8vCi0vLyBpbnN0ZWFkIG9mIGEgbW9yZSBvcGFxdWUKLS8vCi0vLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDUpKQotLy8gICAgIEFjdHVhbDogZmFsc2UKLS8vICAgRXhwZWN0ZWQ6IHRydWUKLS8vCi0vLyBpbiBjYXNlIElzRXZlbiBpcyBhIHNpbXBsZSBCb29sZWFuIHByZWRpY2F0ZS4KLS8vCi0vLyBJZiB5b3UgZXhwZWN0IHlvdXIgcHJlZGljYXRlIHRvIGJlIHJldXNlZCBhbmQgd2FudCB0byBzdXBwb3J0IGluZm9ybWF0aXZlCi0vLyBtZXNzYWdlcyBpbiBFWFBFQ1RfRkFMU0UgYW5kIEFTU0VSVF9GQUxTRSAobmVnYXRpdmUgYXNzZXJ0aW9ucyBzaG93IHVwCi0vLyBhYm91dCBoYWxmIGFzIG9mdGVuIGFzIHBvc2l0aXZlIG9uZXMgaW4gb3VyIHRlc3RzKSwgc3VwcGx5IG1lc3NhZ2VzIGZvcgotLy8gYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIGNhc2VzOgotLy8KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgewotLy8gICAgIGlmICgobiAlIDIpID09IDApCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpIDw8IG4gPDwgIiBpcyBldmVuIjsKLS8vICAgICBlbHNlCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOwotLy8gICB9Ci0vLwotLy8gVGhlbiBhIHN0YXRlbWVudCBFWFBFQ1RfRkFMU0UoSXNFdmVuKEZpYig2KSkpIHdpbGwgcHJpbnQKLS8vCi0vLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDYpKQotLy8gICAgIEFjdHVhbDogdHJ1ZSAoOCBpcyBldmVuKQotLy8gICBFeHBlY3RlZDogZmFsc2UKLS8vCi0vLyBOQjogUHJlZGljYXRlcyB0aGF0IHN1cHBvcnQgbmVnYXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zIGhhdmUgcmVkdWNlZAotLy8gcGVyZm9ybWFuY2UgaW4gcG9zaXRpdmUgb25lcyBzbyBiZSBjYXJlZnVsIG5vdCB0byB1c2UgdGhlbSBpbiB0ZXN0cwotLy8gdGhhdCBoYXZlIGxvdHMgKHRlbnMgb2YgdGhvdXNhbmRzKSBvZiBwb3NpdGl2ZSBCb29sZWFuIGFzc2VydGlvbnMuCi0vLwotLy8gVG8gdXNlIHRoaXMgY2xhc3Mgd2l0aCBFWFBFQ1RfUFJFRF9GT1JNQVQgYXNzZXJ0aW9ucyBzdWNoIGFzOgotLy8KLS8vICAgLy8gVmVyaWZpZXMgdGhhdCBGb28oKSByZXR1cm5zIGFuIGV2ZW4gbnVtYmVyLgotLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQxKElzRXZlbiwgRm9vKCkpOwotLy8KLS8vIHlvdSBuZWVkIHRvIGRlZmluZToKLS8vCi0vLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsKLS8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQotLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKLS8vICAgICBlbHNlCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCi0vLyAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHByIDw8ICIgaXMgZXZlblxuICBBY3R1YWw6IGl0J3MgIiA8PCBuOwotLy8gICB9Ci0vLwotLy8gSWYgRm9vKCkgcmV0dXJucyA1LCB5b3Ugd2lsbCBzZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlOgotLy8KLS8vICAgRXhwZWN0ZWQ6IEZvbygpIGlzIGV2ZW4KLS8vICAgICBBY3R1YWw6IGl0J3MgNQotLy8KLWNsYXNzIEdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IHsKLSBwdWJsaWM6Ci0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIC8vIFVzZWQgaW4gRVhQRUNUX1RSVUUvRkFMU0UoYXNzZXJ0aW9uX3Jlc3VsdCkuCi0gIEFzc2VydGlvblJlc3VsdChjb25zdCBBc3NlcnRpb25SZXN1bHQmIG90aGVyKTsKLQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0ODAwIC8qIGZvcmNpbmcgdmFsdWUgdG8gYm9vbCAqLykKLQotICAvLyBVc2VkIGluIHRoZSBFWFBFQ1RfVFJVRS9GQUxTRShib29sX2V4cHJlc3Npb24pLgotICAvLwotICAvLyBUIG11c3QgYmUgY29udGV4dHVhbGx5IGNvbnZlcnRpYmxlIHRvIGJvb2wuCi0gIC8vCi0gIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHByZXZlbnRzIHRoaXMgb3ZlcmxvYWQgZnJvbSBiZWluZyBjb25zaWRlcmVkIGlmCi0gIC8vIHRoZSBhcmd1bWVudCBpcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEFzc2VydGlvblJlc3VsdC4gSW4gdGhhdCBjYXNlCi0gIC8vIHdlIHdhbnQgQXNzZXJ0aW9uUmVzdWx0J3MgY29weSBjb25zdHJ1Y3RvciB0byBiZSB1c2VkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgZXhwbGljaXQgQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgY29uc3QgVCYgc3VjY2VzcywKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpFbmFibGVJZjwKLSAgICAgICAgICAhaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxULCBBc3NlcnRpb25SZXN1bHQ+Ojp2YWx1ZT46OnR5cGUqCi0gICAgICAgICAgLyplbmFibGVyKi8gPSBOVUxMKQotICAgICAgOiBzdWNjZXNzXyhzdWNjZXNzKSB7fQotCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotCi0gIC8vIEFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I9KEFzc2VydGlvblJlc3VsdCBvdGhlcikgewotICAgIHN3YXAob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBzdWNjZWVkZWQuCi0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBzdWNjZXNzXzsgfSAgLy8gTk9MSU5UCi0KLSAgLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLgotICBBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IhKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCBzdHJlYW1lZCBpbnRvIHRoaXMgQXNzZXJ0aW9uUmVzdWx0LiBUZXN0IGFzc2VydGlvbnMKLSAgLy8gdXNlIGl0IHdoZW4gdGhleSBmYWlsIChpLmUuLCB0aGUgcHJlZGljYXRlJ3Mgb3V0Y29tZSBkb2Vzbid0IG1hdGNoIHRoZQotICAvLyBhc3NlcnRpb24ncyBleHBlY3RhdGlvbikuIFdoZW4gbm90aGluZyBoYXMgYmVlbiBzdHJlYW1lZCBpbnRvIHRoZQotICAvLyBvYmplY3QsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgotICBjb25zdCBjaGFyKiBtZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtZXNzYWdlXy5nZXQoKSAhPSBOVUxMID8gIG1lc3NhZ2VfLT5jX3N0cigpIDogIiI7Ci0gIH0KLSAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVtb3ZlIHRoaXMgYWZ0ZXIgbWFraW5nIHN1cmUgbm8gY2xpZW50cyB1c2UgaXQuCi0gIC8vIERlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgbWVzc2FnZSgpIGluc3RlYWQuCi0gIGNvbnN0IGNoYXIqIGZhaWx1cmVfbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2UoKTsgfQotCi0gIC8vIFN0cmVhbXMgYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlIGludG8gdGhpcyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yPDwoY29uc3QgVCYgdmFsdWUpIHsKLSAgICBBcHBlbmRNZXNzYWdlKE1lc3NhZ2UoKSA8PCB2YWx1ZSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gQWxsb3dzIHN0cmVhbWluZyBiYXNpYyBvdXRwdXQgbWFuaXB1bGF0b3JzIHN1Y2ggYXMgZW5kbCBvciBmbHVzaCBpbnRvCi0gIC8vIHRoaXMgb2JqZWN0LgotICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yPDwoCi0gICAgICA6OnN0ZDo6b3N0cmVhbSYgKCpiYXNpY19tYW5pcHVsYXRvcikoOjpzdGQ6Om9zdHJlYW0mIHN0cmVhbSkpIHsKLSAgICBBcHBlbmRNZXNzYWdlKE1lc3NhZ2UoKSA8PCBiYXNpY19tYW5pcHVsYXRvcik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiBtZXNzYWdlIHRvIG1lc3NhZ2VfLgotICB2b2lkIEFwcGVuZE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgYV9tZXNzYWdlKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmdldCgpID09IE5VTEwpCi0gICAgICBtZXNzYWdlXy5yZXNldChuZXcgOjpzdGQ6OnN0cmluZyk7Ci0gICAgbWVzc2FnZV8tPmFwcGVuZChhX21lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBTd2FwIHRoZSBjb250ZW50cyBvZiB0aGlzIEFzc2VydGlvblJlc3VsdCB3aXRoIG90aGVyLgotICB2b2lkIHN3YXAoQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7Ci0KLSAgLy8gU3RvcmVzIHJlc3VsdCBvZiB0aGUgYXNzZXJ0aW9uIHByZWRpY2F0ZS4KLSAgYm9vbCBzdWNjZXNzXzsKLSAgLy8gU3RvcmVzIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHRoZSBleHBlY3RhdGlvbgotICAvLyBjb25zdHJ1Y3QgaXMgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lLgotICAvLyBSZWZlcmVuY2VkIHZpYSBhIHBvaW50ZXIgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIHN0YWNrIGZyYW1lIHNwYWNlCi0gIC8vIHdpdGggdGVzdCBhc3NlcnRpb25zLgotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZz4gbWVzc2FnZV87Ci19OwotCi0vLyBNYWtlcyBhIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHJlc3VsdC4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKTsKLQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UuCi0vLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZy4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbXNnKTsKLQotLy8gVGhlIGFic3RyYWN0IGNsYXNzIHRoYXQgYWxsIHRlc3RzIGluaGVyaXQgZnJvbS4KLS8vCi0vLyBJbiBHb29nbGUgVGVzdCwgYSB1bml0IHRlc3QgcHJvZ3JhbSBjb250YWlucyBvbmUgb3IgbWFueSBUZXN0Q2FzZXMsIGFuZAotLy8gZWFjaCBUZXN0Q2FzZSBjb250YWlucyBvbmUgb3IgbWFueSBUZXN0cy4KLS8vCi0vLyBXaGVuIHlvdSBkZWZpbmUgYSB0ZXN0IHVzaW5nIHRoZSBURVNUIG1hY3JvLCB5b3UgZG9uJ3QgbmVlZCB0bwotLy8gZXhwbGljaXRseSBkZXJpdmUgZnJvbSBUZXN0IC0gdGhlIFRFU1QgbWFjcm8gYXV0b21hdGljYWxseSBkb2VzCi0vLyB0aGlzIGZvciB5b3UuCi0vLwotLy8gVGhlIG9ubHkgdGltZSB5b3UgZGVyaXZlIGZyb20gVGVzdCBpcyB3aGVuIGRlZmluaW5nIGEgdGVzdCBmaXh0dXJlCi0vLyB0byBiZSB1c2VkIGEgVEVTVF9GLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotLy8gICAgcHJvdGVjdGVkOgotLy8gICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IC4uLiB9Ci0vLyAgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgLi4uIH0KLS8vICAgICAuLi4KLS8vICAgfTsKLS8vCi0vLyAgIFRFU1RfRihGb29UZXN0LCBCYXIpIHsgLi4uIH0KLS8vICAgVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQotLy8KLS8vIFRlc3QgaXMgbm90IGNvcHlhYmxlLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0IHsKLSBwdWJsaWM6Ci0gIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKLQotICAvLyBEZWZpbmVzIHR5cGVzIGZvciBwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBzZXQgdXAgYW5kIHRlYXIgZG93bgotICAvLyBhIHRlc3QgY2FzZS4KLSAgdHlwZWRlZiBpbnRlcm5hbDo6U2V0VXBUZXN0Q2FzZUZ1bmMgU2V0VXBUZXN0Q2FzZUZ1bmM7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlRlYXJEb3duVGVzdENhc2VGdW5jIFRlYXJEb3duVGVzdENhc2VGdW5jOwotCi0gIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIGludGVuZCB0byBpbmhlcml0IGZyb20gVGVzdC4KLSAgdmlydHVhbCB+VGVzdCgpOwotCi0gIC8vIFNldHMgdXAgdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIC8vCi0gIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlNldFVwVGVzdENhc2UoKSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QKLSAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCi0gIC8vIFNldFVwVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKLSAgLy8gY2xhc3MuCi0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7fQotCi0gIC8vIFRlYXJzIGRvd24gdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIC8vCi0gIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlRlYXJEb3duVGVzdENhc2UoKSBhZnRlciBydW5uaW5nIHRoZSBsYXN0Ci0gIC8vIHRlc3QgaW4gdGVzdCBjYXNlIEZvby4gIEhlbmNlIGEgc3ViLWNsYXNzIGNhbiBkZWZpbmUgaXRzIG93bgotICAvLyBUZWFyRG93blRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyCi0gIC8vIGNsYXNzLgotICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkge30KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4KLSAgc3RhdGljIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgotICBzdGF0aWMgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgKGVpdGhlciBmYXRhbCBvcgotICAvLyBub24tZmF0YWwpIGZhaWx1cmUuCi0gIHN0YXRpYyBib29sIEhhc0ZhaWx1cmUoKSB7IHJldHVybiBIYXNGYXRhbEZhaWx1cmUoKSB8fCBIYXNOb25mYXRhbEZhaWx1cmUoKTsgfQotCi0gIC8vIExvZ3MgYSBwcm9wZXJ0eSBmb3IgdGhlIGN1cnJlbnQgdGVzdCwgdGVzdCBjYXNlLCBvciBmb3IgdGhlIGVudGlyZQotICAvLyBpbnZvY2F0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW0gd2hlbiB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgYQotICAvLyB0ZXN0IGNhc2UuICBPbmx5IHRoZSBsYXN0IHZhbHVlIGZvciBhIGdpdmVuIGtleSBpcyByZW1lbWJlcmVkLiAgVGhlc2UKLSAgLy8gYXJlIHB1YmxpYyBzdGF0aWMgc28gdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUKLSAgLy8gbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgZHVyaW5nCi0gIC8vIGxpZmVzcGFuIG9mIHRoZSB0ZXN0IChmcm9tIHRoZSBtb21lbnQgaXRzIGNvbnN0cnVjdG9yIHN0YXJ0cyB0byB0aGUKLSAgLy8gbW9tZW50IGl0cyBkZXN0cnVjdG9yIGZpbmlzaGVzKSB3aWxsIGJlIG91dHB1dCBpbiBYTUwgYXMgYXR0cmlidXRlcyBvZgotICAvLyB0aGUgPHRlc3RjYXNlPiBlbGVtZW50LiAgUHJvcGVydGllcyByZWNvcmRlZCBmcm9tIGZpeHR1cmUncwotICAvLyBTZXRVcFRlc3RDYXNlIG9yIFRlYXJEb3duVGVzdENhc2UgYXJlIGxvZ2dlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZQotICAvLyBjb3JyZXNwb25kaW5nIDx0ZXN0c3VpdGU+IGVsZW1lbnQuICBDYWxscyB0byBSZWNvcmRQcm9wZXJ0eSBtYWRlIGluIHRoZQotICAvLyBnbG9iYWwgY29udGV4dCAoYmVmb3JlIG9yIGFmdGVyIGludm9jYXRpb24gb2YgUlVOX0FMTF9URVNUUyBhbmQgZnJvbQotICAvLyBTZXRVcC9UZWFyRG93biBtZXRob2Qgb2YgRW52aXJvbm1lbnQgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggR29vZ2xlCi0gIC8vIFRlc3QpIHdpbGwgYmUgb3V0cHV0IGFzIGF0dHJpYnV0ZXMgb2YgdGhlIDx0ZXN0c3VpdGVzPiBlbGVtZW50LgotICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpOwotCi0gcHJvdGVjdGVkOgotICAvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCi0gIFRlc3QoKTsKLQotICAvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotCi0gIC8vIFRlYXJzIGRvd24gdGhlIHRlc3QgZml4dHVyZS4KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7Ci0KLSBwcml2YXRlOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZSBzYW1lIGZpeHR1cmUgY2xhc3MgYXMKLSAgLy8gdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgotICBzdGF0aWMgYm9vbCBIYXNTYW1lRml4dHVyZUNsYXNzKCk7Ci0KLSAgLy8gUnVucyB0aGUgdGVzdCBhZnRlciB0aGUgdGVzdCBmaXh0dXJlIGhhcyBiZWVuIHNldCB1cC4KLSAgLy8KLSAgLy8gQSBzdWItY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyB0byBkZWZpbmUgdGhlIHRlc3QgbG9naWMuCi0gIC8vCi0gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OIERJUkVDVExZIElOIEEgVVNFUiBQUk9HUkFNLgotICAvLyBJbnN0ZWFkLCB1c2UgdGhlIFRFU1Qgb3IgVEVTVF9GIG1hY3JvLgotICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKSA9IDA7Ci0KLSAgLy8gU2V0cyB1cCwgZXhlY3V0ZXMsIGFuZCB0ZWFycyBkb3duIHRoZSB0ZXN0LgotICB2b2lkIFJ1bigpOwotCi0gIC8vIERlbGV0ZXMgc2VsZi4gIFdlIGRlbGliZXJhdGVseSBwaWNrIGFuIHVudXN1YWwgbmFtZSBmb3IgdGhpcwotICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBuYW1lcyB1c2VkIGluIHVzZXIgVEVTVHMuCi0gIHZvaWQgRGVsZXRlU2VsZl8oKSB7IGRlbGV0ZSB0aGlzOyB9Ci0KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IEdURVNUX0ZMQUdfU0FWRVJfID4gZ3Rlc3RfZmxhZ19zYXZlcl87Ci0KLSAgLy8gT2Z0ZW4gYSB1c2VyIG1pc3NwZWxscyBTZXRVcCgpIGFzIFNldHVwKCkgYW5kIHNwZW5kcyBhIGxvbmcgdGltZQotICAvLyB3b25kZXJpbmcgd2h5IGl0IGlzIG5ldmVyIGNhbGxlZCBieSBHb29nbGUgVGVzdC4gIFRoZSBkZWNsYXJhdGlvbiBvZgotICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZCBpcyBzb2xlbHkgZm9yIGNhdGNoaW5nIHN1Y2ggYW4gZXJyb3IgYXQKLSAgLy8gY29tcGlsZSB0aW1lOgotICAvLwotICAvLyAgIC0gVGhlIHJldHVybiB0eXBlIGlzIGRlbGliZXJhdGVseSBjaG9zZW4gdG8gYmUgbm90IHZvaWQsIHNvIGl0Ci0gIC8vICAgd2lsbCBiZSBhIGNvbmZsaWN0IGlmIHZvaWQgU2V0dXAoKSBpcyBkZWNsYXJlZCBpbiB0aGUgdXNlcidzCi0gIC8vICAgdGVzdCBmaXh0dXJlLgotICAvLwotICAvLyAgIC0gVGhpcyBtZXRob2QgaXMgcHJpdmF0ZSwgc28gaXQgd2lsbCBiZSBhbm90aGVyIGNvbXBpbGVyIGVycm9yCi0gIC8vICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgdXNlcidzIHRlc3QgZml4dHVyZS4KLSAgLy8KLSAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04uCi0gIC8vCi0gIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCi0gIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KLSAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OwotICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RzLgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3QpOwotfTsKLQotdHlwZWRlZiBpbnRlcm5hbDo6VGltZUluTWlsbGlzIFRpbWVJbk1pbGxpczsKLQotLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgdXNlciBzcGVjaWZpZWQgdGVzdCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUKLS8vIG91dHB1dCBhcyBhIGtleS92YWx1ZSBzdHJpbmcgcGFpci4KLS8vCi0vLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFByb3BlcnR5IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgotY2xhc3MgVGVzdFByb3BlcnR5IHsKLSBwdWJsaWM6Ci0gIC8vIEMndG9yLiAgVGVzdFByb3BlcnR5IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKLSAgLy8gVGVzdFByb3BlcnR5IG9iamVjdC4KLSAgVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2tleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFfdmFsdWUpIDoKLSAgICBrZXlfKGFfa2V5KSwgdmFsdWVfKGFfdmFsdWUpIHsKLSAgfQotCi0gIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQga2V5LgotICBjb25zdCBjaGFyKiBrZXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV8uY19zdHIoKTsKLSAgfQotCi0gIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQgdmFsdWUuCi0gIGNvbnN0IGNoYXIqIHZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV8uY19zdHIoKTsKLSAgfQotCi0gIC8vIFNldHMgYSBuZXcgdmFsdWUsIG92ZXJyaWRpbmcgdGhlIG9uZSBzdXBwbGllZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gIHZvaWQgU2V0VmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld192YWx1ZSkgewotICAgIHZhbHVlXyA9IG5ld192YWx1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGtleSBzdXBwbGllZCBieSB0aGUgdXNlci4KLSAgc3RkOjpzdHJpbmcga2V5XzsKLSAgLy8gVGhlIHZhbHVlIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgotICBzdGQ6OnN0cmluZyB2YWx1ZV87Ci19OwotCi0vLyBUaGUgcmVzdWx0IG9mIGEgc2luZ2xlIFRlc3QuICBUaGlzIGluY2x1ZGVzIGEgbGlzdCBvZgotLy8gVGVzdFBhcnRSZXN1bHRzLCBhIGxpc3Qgb2YgVGVzdFByb3BlcnRpZXMsIGEgY291bnQgb2YgaG93IG1hbnkKLS8vIGRlYXRoIHRlc3RzIHRoZXJlIGFyZSBpbiB0aGUgVGVzdCwgYW5kIGhvdyBtdWNoIHRpbWUgaXQgdG9vayB0byBydW4KLS8vIHRoZSBUZXN0LgotLy8KLS8vIFRlc3RSZXN1bHQgaXMgbm90IGNvcHlhYmxlLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0UmVzdWx0IHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KLSAgVGVzdFJlc3VsdCgpOwotCi0gIC8vIEQndG9yLiAgRG8gbm90IGluaGVyaXQgZnJvbSBUZXN0UmVzdWx0LgotICB+VGVzdFJlc3VsdCgpOwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCi0gIC8vIG9mIHN1Y2Nlc3NmdWwgdGVzdCBwYXJ0cyBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBwYXJ0cy4KLSAgaW50IHRvdGFsX3BhcnRfY291bnQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KLSAgaW50IHRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhc3NlZCAoaS5lLiBubyB0ZXN0IHBhcnQgZmFpbGVkKS4KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KLSAgYm9vbCBGYWlsZWQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhdGFsbHkgZmFpbGVkLgotICBib29sIEhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCi0gIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHBhcnQgcmVzdWx0IGFtb25nIGFsbCB0aGUgcmVzdWx0cy4gaSBjYW4gcmFuZ2UKLSAgLy8gZnJvbSAwIHRvIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cwotICAvLyB0aGUgcHJvZ3JhbS4KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMgdGhlCi0gIC8vIHByb2dyYW0uCi0gIGNvbnN0IFRlc3RQcm9wZXJ0eSYgR2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKLSAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOwotICBmcmllbmQgY2xhc3MgVW5pdFRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RXhlY0RlYXRoVGVzdDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0UmVzdWx0QWNjZXNzb3I7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OldpbmRvd3NEZWF0aFRlc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQYXJ0UmVzdWx0cy4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzLgotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+JiB0ZXN0X3Byb3BlcnRpZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRlc3RfcHJvcGVydGllc187Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBlbGFwc2VkIHRpbWUuCi0gIHZvaWQgc2V0X2VsYXBzZWRfdGltZShUaW1lSW5NaWxsaXMgZWxhcHNlZCkgeyBlbGFwc2VkX3RpbWVfID0gZWxhcHNlZDsgfQotCi0gIC8vIEFkZHMgYSB0ZXN0IHByb3BlcnR5IHRvIHRoZSBsaXN0LiBUaGUgcHJvcGVydHkgaXMgdmFsaWRhdGVkIGFuZCBtYXkgYWRkCi0gIC8vIGEgbm9uLWZhdGFsIGZhaWx1cmUgaWYgaW52YWxpZCAoZS5nLiwgaWYgaXQgY29uZmxpY3RzIHdpdGggcmVzZXJ2ZWQKLSAgLy8ga2V5IG5hbWVzKS4gSWYgYSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlY29yZGVkIGZvciB0aGUgc2FtZSBrZXksIHRoZQotICAvLyB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQsIHJhdGhlciB0aGFuIHN0b3JpbmcgbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgc2FtZQotICAvLyBrZXkuICB4bWxfZWxlbWVudCBzcGVjaWZpZXMgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZwotICAvLyByZWNvcmRlZCBhbmQgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbi4KLSAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKLQotICAvLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIEdvb2dsZSBUZXN0Ci0gIC8vIHRlc3RjYXNlIHRhZ3MuICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkLgotICAvLyBUT0RPKHJ1c3NyKTogVmFsaWRhdGUgYXR0cmlidXRlIG5hbWVzIGFyZSBsZWdhbCBhbmQgaHVtYW4gcmVhZGFibGUuCi0gIHN0YXRpYyBib29sIFZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKLQotICAvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KLSAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVhdGggdGVzdCBjb3VudC4KLSAgaW50IGRlYXRoX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWF0aF90ZXN0X2NvdW50XzsgfQotCi0gIC8vIEluY3JlbWVudHMgdGhlIGRlYXRoIHRlc3QgY291bnQsIHJldHVybmluZyB0aGUgbmV3IGNvdW50LgotICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7IHJldHVybiArK2RlYXRoX3Rlc3RfY291bnRfOyB9Ci0KLSAgLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KLSAgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cygpOwotCi0gIC8vIENsZWFycyB0aGUgb2JqZWN0LgotICB2b2lkIENsZWFyKCk7Ci0KLSAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBvZiB0aGUgcHJvcGVydHkgdmVjdG9yIGFuZCBvZiBvd25lZAotICAvLyBwcm9wZXJ0aWVzLCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHVwZGF0ZWQuCi0gIGludGVybmFsOjpNdXRleCB0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfOwotCi0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzCi0gIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiB0ZXN0X3BhcnRfcmVzdWx0c187Ci0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMKLSAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiB0ZXN0X3Byb3BlcnRpZXNfOwotICAvLyBSdW5uaW5nIGNvdW50IG9mIGRlYXRoIHRlc3RzLgotICBpbnQgZGVhdGhfdGVzdF9jb3VudF87Ci0gIC8vIFRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLSAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87Ci0KLSAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0UmVzdWx0LgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RSZXN1bHQpOwotfTsgIC8vIGNsYXNzIFRlc3RSZXN1bHQKLQotLy8gQSBUZXN0SW5mbyBvYmplY3Qgc3RvcmVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0OgotLy8KLS8vICAgVGVzdCBjYXNlIG5hbWUKLS8vICAgVGVzdCBuYW1lCi0vLyAgIFdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1bgotLy8gICBBIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCB3aGVuIGludm9rZWQKLS8vICAgVGVzdCByZXN1bHQKLS8vCi0vLyBUaGUgY29uc3RydWN0b3Igb2YgVGVzdEluZm8gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSBVbml0VGVzdAotLy8gc2luZ2xldG9uIHN1Y2ggdGhhdCB0aGUgUlVOX0FMTF9URVNUUygpIG1hY3JvIGtub3dzIHdoaWNoIHRlc3RzIHRvCi0vLyBydW4uCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RJbmZvIHsKLSBwdWJsaWM6Ci0gIC8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZpcnR1YWwsIHNvCi0gIC8vIGRvbid0IGluaGVyaXQgZnJvbSBUZXN0SW5mby4KLSAgflRlc3RJbmZvKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuCi0gIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IG5hbWUuCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZAotICAvLyBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3QgewotICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQotICAgICAgcmV0dXJuIHR5cGVfcGFyYW1fLT5jX3N0cigpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLCBvciBOVUxMIGlmIHRoaXMKLSAgLy8gaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSgpIGNvbnN0IHsKLSAgICBpZiAodmFsdWVfcGFyYW1fLmdldCgpICE9IE5VTEwpCi0gICAgICByZXR1cm4gdmFsdWVfcGFyYW1fLT5jX3N0cigpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZmlsZSBuYW1lIHdoZXJlIHRoaXMgdGVzdCBpcyBkZWZpbmVkLgotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gbG9jYXRpb25fLmZpbGUuY19zdHIoKTsgfQotCi0gIC8vIFJldHVybnMgdGhlIGxpbmUgd2hlcmUgdGhpcyB0ZXN0IGlzIGRlZmluZWQuCi0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbG9jYXRpb25fLmxpbmU7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZXN0IHNob3VsZCBydW4sIHRoYXQgaXMgaWYgdGhlIHRlc3QgaXMgbm90Ci0gIC8vIGRpc2FibGVkIChvciBpdCBpcyBkaXNhYmxlZCBidXQgdGhlIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzCi0gIC8vIGJlZW4gc3BlY2lmaWVkKSBhbmQgaXRzIGZ1bGwgbmFtZSBtYXRjaGVzIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCi0gIC8vCi0gIC8vIEdvb2dsZSBUZXN0IGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIHRlc3RzIGJ5IHRoZWlyIGZ1bGwgbmFtZXMuCi0gIC8vIFRoZSBmdWxsIG5hbWUgb2YgYSB0ZXN0IEJhciBpbiB0ZXN0IGNhc2UgRm9vIGlzIGRlZmluZWQgYXMKLSAgLy8gIkZvby5CYXIiLiAgT25seSB0aGUgdGVzdHMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIHdpbGwgcnVuLgotICAvLwotICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMsCi0gIC8vIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAnLScgYW5kIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YKLSAgLy8gbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvIGV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdAotICAvLyBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZgotICAvLyB0aGUgbmVnYXRpdmUgcGF0dGVybnMuCi0gIC8vCi0gIC8vIEZvciBleGFtcGxlLCAqQSo6Rm9vLiogaXMgYSBmaWx0ZXIgdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcgdGhhdAotICAvLyBjb250YWlucyB0aGUgY2hhcmFjdGVyICdBJyBvciBzdGFydHMgd2l0aCAiRm9vLiIuCi0gIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHRlc3Qgd2lsbCBhcHBlYXIgaW4gdGhlIFhNTCByZXBvcnQuCi0gIGJvb2wgaXNfcmVwb3J0YWJsZSgpIGNvbnN0IHsKLSAgICAvLyBGb3Igbm93LCB0aGUgWE1MIHJlcG9ydCBpbmNsdWRlcyBhbGwgdGVzdHMgbWF0Y2hpbmcgdGhlIGZpbHRlci4KLSAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgdHJpbSB0ZXN0cyB0aGF0IGFyZSBleGNsdWRlZCBiZWNhdXNlIG9mCi0gICAgLy8gc2hhcmRpbmcuCi0gICAgcmV0dXJuIG1hdGNoZXNfZmlsdGVyXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4KLSAgY29uc3QgVGVzdFJlc3VsdCogcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJnJlc3VsdF87IH0KLQotIHByaXZhdGU6Ci0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSAgZnJpZW5kIGNsYXNzIFRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U3RyZWFtaW5nTGlzdGVuZXJUZXN0OwotICBmcmllbmQgVGVzdEluZm8qIGludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKLSAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCi0gICAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKLSAgICAgIGludGVybmFsOjpDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbiwKLSAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKLSAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKLSAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOwotCi0gIC8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBpbnN0YW5jZSBhc3N1bWVzCi0gIC8vIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCi0gIFRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwgICAvLyBOVUxMIGlmIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0Ci0gICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sICAvLyBOVUxMIGlmIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdAotICAgICAgICAgICBpbnRlcm5hbDo6Q29kZUxvY2F0aW9uIGFfY29kZV9sb2NhdGlvbiwKLSAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKLQotICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgZGVhdGggdGVzdHMgZW5jb3VudGVyZWQgaW4gdGhpcyB0ZXN0IHNvCi0gIC8vIGZhci4KLSAgaW50IGluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCkgewotICAgIHJldHVybiByZXN1bHRfLmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7Ci0gIH0KLQotICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgotICAvLyBkZWxldGVzIGl0LgotICB2b2lkIFJ1bigpOwotCi0gIHN0YXRpYyB2b2lkIENsZWFyVGVzdFJlc3VsdChUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgdGVzdF9pbmZvLT5yZXN1bHRfLkNsZWFyKCk7Ci0gIH0KLQotICAvLyBUaGVzZSBmaWVsZHMgYXJlIGltbXV0YWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSB0ZXN0LgotICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87ICAgICAvLyBUZXN0IGNhc2UgbmFtZQotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsgICAgICAgICAgICAgICAvLyBUZXN0IG5hbWUKLSAgLy8gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhCi0gIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtXzsKLSAgLy8gVGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKLSAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB2YWx1ZV9wYXJhbV87Ci0gIGludGVybmFsOjpDb2RlTG9jYXRpb24gbG9jYXRpb25fOwotICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWRfOyAgIC8vIElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKLSAgYm9vbCBzaG91bGRfcnVuXzsgICAgICAgICAgICAgICAgIC8vIFRydWUgaWZmIHRoaXMgdGVzdCBzaG91bGQgcnVuCi0gIGJvb2wgaXNfZGlzYWJsZWRfOyAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQKLSAgYm9vbCBtYXRjaGVzX2ZpbHRlcl87ICAgICAgICAgICAgIC8vIFRydWUgaWYgdGhpcyB0ZXN0IG1hdGNoZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCi0gIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGNvbnN0IGZhY3RvcnlfOyAgLy8gVGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlc3Qgb2JqZWN0Ci0KLSAgLy8gVGhpcyBmaWVsZCBpcyBtdXRhYmxlIGFuZCBuZWVkcyB0byBiZSByZXNldCBiZWZvcmUgcnVubmluZyB0aGUKLSAgLy8gdGVzdCBmb3IgdGhlIHNlY29uZCB0aW1lLgotICBUZXN0UmVzdWx0IHJlc3VsdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0SW5mbyk7Ci19OwotCi0vLyBBIHRlc3QgY2FzZSwgd2hpY2ggY29uc2lzdHMgb2YgYSB2ZWN0b3Igb2YgVGVzdEluZm9zLgotLy8KLS8vIFRlc3RDYXNlIGlzIG5vdCBjb3B5YWJsZS4KLWNsYXNzIEdURVNUX0FQSV8gVGVzdENhc2UgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gIC8vCi0gIC8vIFRlc3RDYXNlIGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQWx3YXlzIHVzZSB0aGlzCi0gIC8vIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIFRlc3RDYXNlIG9iamVjdC4KLSAgLy8KLSAgLy8gQXJndW1lbnRzOgotICAvLwotICAvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gIC8vICAgYV90eXBlX3BhcmFtOiB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCi0gIC8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLSAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0gIFRlc3RDYXNlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKLSAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpOwotCi0gIC8vIERlc3RydWN0b3Igb2YgVGVzdENhc2UuCi0gIHZpcnR1YWwgflRlc3RDYXNlKCk7Ci0KLSAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVGVzdENhc2UuCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQotICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3QgewotICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQotICAgICAgcmV0dXJuIHR5cGVfcGFyYW1fLT5jX3N0cigpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIHNob3VsZCBydW4uCi0gIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCi0gIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIGZhaWxlZC4KLSAgYm9vbCBGYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfdGVzdF9jb3VudCgpID4gMDsgfQotCi0gIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotICBjb25zdCBUZXN0SW5mbyogR2V0VGVzdEluZm8oaW50IGkpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgdGhhdCBob2xkcyB0ZXN0IHByb3BlcnRpZXMgcmVjb3JkZWQgZHVyaW5nCi0gIC8vIGV4ZWN1dGlvbiBvZiBTZXRVcFRlc3RDYXNlIGFuZCBUZWFyRG93blRlc3RDYXNlLgotICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiBhZF9ob2NfdGVzdF9yZXN1bHRfOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgVGVzdDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7Ci0KLSAgLy8gR2V0cyB0aGUgKG11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KLSAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSB7IHJldHVybiB0ZXN0X2luZm9fbGlzdF87IH0KLQotICAvLyBHZXRzIHRoZSAoaW1tdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X2luZm9fbGlzdF87Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0gIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLSAgVGVzdEluZm8qIEdldE11dGFibGVUZXN0SW5mbyhpbnQgaSk7Ci0KLSAgLy8gU2V0cyB0aGUgc2hvdWxkX3J1biBtZW1iZXIuCi0gIHZvaWQgc2V0X3Nob3VsZF9ydW4oYm9vbCBzaG91bGQpIHsgc2hvdWxkX3J1bl8gPSBzaG91bGQ7IH0KLQotICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgVGVzdEluZm8gdXBvbgotICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0LgotICB2b2lkIEFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKTsKLQotICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICB2b2lkIENsZWFyUmVzdWx0KCk7Ci0KLSAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgotICBzdGF0aWMgdm9pZCBDbGVhclRlc3RDYXNlUmVzdWx0KFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKLSAgICB0ZXN0X2Nhc2UtPkNsZWFyUmVzdWx0KCk7Ci0gIH0KLQotICAvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KLSAgdm9pZCBSdW4oKTsKLQotICAvLyBSdW5zIFNldFVwVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcyBuZWVkZWQKLSAgLy8gZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gU2V0VXBUZXN0Q2FzZSgpLgotICB2b2lkIFJ1blNldFVwVGVzdENhc2UoKSB7ICgqc2V0X3VwX3RjXykoKTsgfQotCi0gIC8vIFJ1bnMgVGVhckRvd25UZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzCi0gIC8vIG5lZWRlZCBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBUZWFyRG93blRlc3RDYXNlKCkuCi0gIHZvaWQgUnVuVGVhckRvd25UZXN0Q2FzZSgpIHsgKCp0ZWFyX2Rvd25fdGNfKSgpOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IHBhc3NlZC4KLSAgc3RhdGljIGJvb2wgVGVzdFBhc3NlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPlBhc3NlZCgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGZhaWxlZC4KLSAgc3RhdGljIGJvb2wgVGVzdEZhaWxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPkZhaWxlZCgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBpcyBkaXNhYmxlZCBhbmQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MCi0gIC8vIHJlcG9ydC4KLSAgc3RhdGljIGJvb2wgVGVzdFJlcG9ydGFibGVEaXNhYmxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpICYmIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGlzIGRpc2FibGVkLgotICBzdGF0aWMgYm9vbCBUZXN0RGlzYWJsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyB0ZXN0IHdpbGwgYXBwZWFyIGluIHRoZSBYTUwgcmVwb3J0LgotICBzdGF0aWMgYm9vbCBUZXN0UmVwb3J0YWJsZShjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCi0gIHN0YXRpYyBib29sIFNob3VsZFJ1blRlc3QoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKTsKLSAgfQotCi0gIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLSAgdm9pZCBTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKTsKLQotICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCi0gIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKLQotICAvLyBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCi0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKLSAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOwotICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCi0gIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCi0gIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4gdGVzdF9pbmZvX2xpc3RfOwotICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBsaXN0IHRvIGFsbG93IGVhc3kKLSAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMKLSAgLy8gdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGluIHRoZSBzaHVmZmxlZCB0ZXN0IGxpc3QuCi0gIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9pbmRpY2VzXzsKLSAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuCi0gIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90Y187Ci0gIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlLgotICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOwotICAvLyBUcnVlIGlmZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgotICBib29sIHNob3VsZF9ydW5fOwotICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLSAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87Ci0gIC8vIEhvbGRzIHRlc3QgcHJvcGVydGllcyByZWNvcmRlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIFNldFVwVGVzdENhc2UgYW5kCi0gIC8vIFRlYXJEb3duVGVzdENhc2UuCi0gIFRlc3RSZXN1bHQgYWRfaG9jX3Rlc3RfcmVzdWx0XzsKLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RDYXNlcy4KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0Q2FzZSk7Ci19OwotCi0vLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgaXMgY2FwYWJsZSBvZiBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gYW4KLS8vIGVudmlyb25tZW50LiAgWW91IHNob3VsZCBzdWJjbGFzcyB0aGlzIHRvIGRlZmluZSB5b3VyIG93bgotLy8gZW52aXJvbm1lbnQocykuCi0vLwotLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGRvZXMgdGhlIHNldC11cCBhbmQgdGVhci1kb3duIGluIHZpcnR1YWwKLS8vIG1ldGhvZHMgU2V0VXAoKSBhbmQgVGVhckRvd24oKSBpbnN0ZWFkIG9mIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhlCi0vLyBkZXN0cnVjdG9yLCBhczoKLS8vCi0vLyAgIDEuIFlvdSBjYW5ub3Qgc2FmZWx5IHRocm93IGZyb20gYSBkZXN0cnVjdG9yLiAgVGhpcyBpcyBhIHByb2JsZW0KLS8vICAgICAgYXMgaW4gc29tZSBjYXNlcyBHb29nbGUgVGVzdCBpcyB1c2VkIHdoZXJlIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIGFuZAotLy8gICAgICB3ZSBtYXkgd2FudCB0byBpbXBsZW1lbnQgQVNTRVJUXyogdXNpbmcgZXhjZXB0aW9ucyB3aGVyZSB0aGV5IGFyZQotLy8gICAgICBhdmFpbGFibGUuCi0vLyAgIDIuIFlvdSBjYW5ub3QgdXNlIEFTU0VSVF8qIGRpcmVjdGx5IGluIGEgY29uc3RydWN0b3Igb3IKLS8vICAgICAgZGVzdHJ1Y3Rvci4KLWNsYXNzIEVudmlyb25tZW50IHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIG5lZWQgdG8gc3ViY2xhc3MgRW52aXJvbm1lbnQuCi0gIHZpcnR1YWwgfkVudmlyb25tZW50KCkge30KLQotICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC4KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkge30KLQotICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gdGVhciBkb3duIHRoZSBlbnZpcm9ubWVudC4KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KLSBwcml2YXRlOgotICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcgotICAvLyBhYm91dCBpdCBiZWluZyBwcml2YXRlLCB5b3UgaGF2ZSBtaXMtc3BlbGxlZCBTZXRVcCgpIGFzIFNldHVwKCkuCi0gIHN0cnVjdCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCB7fTsKLSAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9Ci19OwotCi0vLyBUaGUgaW50ZXJmYWNlIGZvciB0cmFjaW5nIGV4ZWN1dGlvbiBvZiB0ZXN0cy4gVGhlIG1ldGhvZHMgYXJlIG9yZ2FuaXplZCBpbgotLy8gdGhlIG9yZGVyIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBhcmUgZmlyZWQuCi1jbGFzcyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UZXN0RXZlbnRMaXN0ZW5lcigpIHt9Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIGFueSB0ZXN0IGFjdGl2aXR5IHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4gIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4KLSAgLy8gb25lIGl0ZXJhdGlvbiBpZiBHVEVTVF9GTEFHKHJlcGVhdCkgaXMgc2V0LiBpdGVyYXRpb24gaXMgdGhlIGl0ZXJhdGlvbgotICAvLyBpbmRleCwgc3RhcnRpbmcgZnJvbSAwLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pID0gMDsKLQotICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHNldC11cCBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSA9IDA7Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pID0gMDsKLQotICAvLyBGaXJlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpID0gMDsKLQotICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBlbmRzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pID0gMDsKLQotICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBjYXNlIGVuZHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKLQotICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGZpbmlzaGVzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGFsbCB0ZXN0IGFjdGl2aXRpZXMgaGF2ZSBlbmRlZC4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotfTsKLQotLy8gVGhlIGNvbnZlbmllbmNlIGNsYXNzIGZvciB1c2VycyB3aG8gbmVlZCB0byBvdmVycmlkZSBqdXN0IG9uZSBvciB0d28KLS8vIG1ldGhvZHMgYW5kIGFyZSBub3QgY29uY2VybmVkIHRoYXQgYSBwb3NzaWJsZSBjaGFuZ2UgdG8gYSBzaWduYXR1cmUgb2YKLS8vIHRoZSBtZXRob2RzIHRoZXkgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2F1Z2h0IGR1cmluZyB0aGUgYnVpbGQuICBGb3IKLS8vIGNvbW1lbnRzIGFib3V0IGVhY2ggbWV0aG9kIHBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb24gb2YgVGVzdEV2ZW50TGlzdGVuZXIKLS8vIGFib3ZlLgotY2xhc3MgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIC8qdGVzdF9wYXJ0X3Jlc3VsdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotfTsKLQotLy8gVGVzdEV2ZW50TGlzdGVuZXJzIGxldHMgdXNlcnMgYWRkIGxpc3RlbmVycyB0byB0cmFjayBldmVudHMgaW4gR29vZ2xlIFRlc3QuCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RFdmVudExpc3RlbmVycyB7Ci0gcHVibGljOgotICBUZXN0RXZlbnRMaXN0ZW5lcnMoKTsKLSAgflRlc3RFdmVudExpc3RlbmVycygpOwotCi0gIC8vIEFwcGVuZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gR29vZ2xlIFRlc3QgYXNzdW1lcwotICAvLyB0aGUgb3duZXJzaGlwIG9mIHRoZSBsaXN0ZW5lciAoaS5lLiBpdCB3aWxsIGRlbGV0ZSB0aGUgbGlzdGVuZXIgd2hlbgotICAvLyB0aGUgdGVzdCBwcm9ncmFtIGZpbmlzaGVzKS4KLSAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgotICAvLyBiZWNvbWVzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBkZWxldGUgdGhlIGxpc3RlbmVyLiBSZXR1cm5zCi0gIC8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIFJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQotICAvLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAotICAvLyBjb25zb2xlIG91dHB1dC4gIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0Ci0gIC8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzCi0gIC8vIGZ1bmN0aW9uIHJldHVybiBOVUxMIHRoZSBuZXh0IHRpbWUuCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgY29uc3QgewotICAgIHJldHVybiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0Ci0gIC8vIGNvbnRyb2xsZWQgYnkgdGhlIC0tZ3Rlc3Rfb3V0cHV0PXhtbCBmbGFnLiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgLy8gbGlzdGVuZXJzIGxpc3QgYnkgdXNlcnMgd2hvIHdhbnQgdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKLSAgLy8gY29udHJvbGxlZCBieSB0aGlzIGZsYWcgYW5kIHN1YnN0aXR1dGUgaXQgd2l0aCBjdXN0b20gb25lLiAgTm90ZSB0aGF0Ci0gIC8vIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3Qgd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMKLSAgLy8gb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMgZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQKLSAgLy8gdGltZS4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfeG1sX2dlbmVyYXRvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOwotICBmcmllbmQgY2xhc3MgVGVzdEluZm87Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6Tm9FeGVjRGVhdGhUZXN0OwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKLQotICAvLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbAotICAvLyBzdWJzY3JpYmVycy4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyKCk7Ci0KLSAgLy8gU2V0cyB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLgotICAvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKLSAgLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KLSAgLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKLSAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgotICB2b2lkIFNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKLSAgLy8gbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKLSAgLy8gZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgotICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcwotICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi0gIHZvaWQgU2V0RGVmYXVsdFhtbEdlbmVyYXRvcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOwotCi0gIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUKLSAgLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgotICBib29sIEV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdDsKLSAgdm9pZCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOwotCi0gIC8vIFRoZSBhY3R1YWwgbGlzdCBvZiBsaXN0ZW5lcnMuCi0gIGludGVybmFsOjpUZXN0RXZlbnRSZXBlYXRlciogcmVwZWF0ZXJfOwotICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIHN0YW5kYXJkIHJlc3VsdCBvdXRwdXQuCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsKLSAgLy8gTGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgWE1MIG91dHB1dCBmaWxlLgotICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF94bWxfZ2VuZXJhdG9yXzsKLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RFdmVudExpc3RlbmVycy4KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0RXZlbnRMaXN0ZW5lcnMpOwotfTsKLQotLy8gQSBVbml0VGVzdCBjb25zaXN0cyBvZiBhIHZlY3RvciBvZiBUZXN0Q2FzZXMuCi0vLwotLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcy4gIFRoZSBvbmx5IGluc3RhbmNlIG9mIFVuaXRUZXN0IGlzCi0vLyBjcmVhdGVkIHdoZW4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkgaXMgZmlyc3QgY2FsbGVkLiAgVGhpcwotLy8gaW5zdGFuY2UgaXMgbmV2ZXIgZGVsZXRlZC4KLS8vCi0vLyBVbml0VGVzdCBpcyBub3QgY29weWFibGUuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZSBhcyBsb25nIGFzIHRoZSBtZXRob2RzIGFyZSBjYWxsZWQKLS8vIGFjY29yZGluZyB0byB0aGVpciBzcGVjaWZpY2F0aW9uLgotY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdCB7Ci0gcHVibGljOgotICAvLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QKLSAgLy8gaXMgY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuCi0gIC8vIENvbnNlY3V0aXZlIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG9iamVjdC4KLSAgc3RhdGljIFVuaXRUZXN0KiBHZXRJbnN0YW5jZSgpOwotCi0gIC8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0IGFuZCBwcmludHMgdGhlIHJlc3VsdC4KLSAgLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgotICAvLwotICAvLyBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCi0gIC8vCi0gIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLSAgaW50IFJ1bigpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87Ci0KLSAgLy8gUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpCi0gIC8vIHdhcyBleGVjdXRlZC4gIFRoZSBVbml0VGVzdCBvYmplY3Qgb3ducyB0aGUgc3RyaW5nLgotICBjb25zdCBjaGFyKiBvcmlnaW5hbF93b3JraW5nX2RpcigpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAotICAvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLSAgY29uc3QgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCi0gIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotICBjb25zdCBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSBjb25zdAotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKLQotICAvLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KLSAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3Q7Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAvLyBSZXR1cm5zIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0gIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgotICAvLwotICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0gIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgotICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KLSAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKLSAgLy8gdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgotICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KLSAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLSAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KLSAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLSAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCi0gIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLSAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLSAgLy8gVU5JWCBlcG9jaC4KLSAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgotICBib29sIFBhc3NlZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCi0gIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgotICBib29sIEZhaWxlZCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0gIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiB0ZXN0IGZhaWx1cmVzIGFuZAotICAvLyBwcm9wZXJ0aWVzIGxvZ2dlZCBvdXRzaWRlIG9mIGluZGl2aWR1YWwgdGVzdCBjYXNlcy4KLSAgY29uc3QgVGVzdFJlc3VsdCYgYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMKLSAgLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgotICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycygpOwotCi0gcHJpdmF0ZToKLSAgLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAotICAvLyBwcm9ncmFtIGlzIHJ1biwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHNldC11cCBpbgotICAvLyB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0KLSAgLy8gaGF2ZSBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbgotICAvLyB0aGUgKnJldmVyc2UqIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgotICAvLwotICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCi0gIC8vCi0gIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KLSAgRW52aXJvbm1lbnQqIEFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOwotCi0gIC8vIEFkZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdC4gIEFsbAotICAvLyBHb29nbGUgVGVzdCBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykKLSAgLy8gZXZlbnR1YWxseSBjYWxsIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlCi0gIC8vIHNob3VsZCB1c2UgdGhlIGFzc2VydGlvbiBtYWNyb3MgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuCi0gIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGZyb20KLSAgLy8gaW5zaWRlIGEgdGVzdCwgdG8gY3VycmVudCBUZXN0Q2FzZSdzIGFkX2hvY190ZXN0X3Jlc3VsdF8gd2hlbiBpbnZva2VkCi0gIC8vIGZyb20gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAotICAvLyB3aGVuIGludm9rZWQgZWxzZXdoZXJlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aAotICAvLyB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCi0gIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLQotICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLSAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSk7Ci0KLSAgLy8gQWNjZXNzb3JzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsKCkgeyByZXR1cm4gaW1wbF87IH0KLSAgY29uc3QgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfOyB9Ci0KLSAgLy8gVGhlc2UgY2xhc3NlcyBhbmQgZnVuY2lvbnMgYXJlIGZyaWVuZHMgYXMgdGhleSBuZWVkIHRvIGFjY2VzcyBwcml2YXRlCi0gIC8vIG1lbWJlcnMgb2YgVW5pdFRlc3QuCi0gIGZyaWVuZCBjbGFzcyBUZXN0OwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkFzc2VydEhlbHBlcjsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTY29wZWRUcmFjZTsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXI7Ci0gIGZyaWVuZCBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOwotICBmcmllbmQgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBmcmllbmQgdm9pZCBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAotICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7Ci0KLSAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBVbml0VGVzdC4KLSAgVW5pdFRlc3QoKTsKLQotICAvLyBEJ3RvcgotICB2aXJ0dWFsIH5Vbml0VGVzdCgpOwotCi0gIC8vIFB1c2hlcyBhIHRyYWNlIGRlZmluZWQgYnkgU0NPUEVEX1RSQUNFKCkgb24gdG8gdGhlIHBlci10aHJlYWQKLSAgLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCi0gIHZvaWQgUHVzaEdUZXN0VHJhY2UoY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIC8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgotICB2b2lkIFBvcEdUZXN0VHJhY2UoKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKLQotICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIGluICppbXBsXy4gIFRoaXMgaXMgbXV0YWJsZSBhcyBzb21lIGNvbnN0Ci0gIC8vIG1ldGhvZHMgbmVlZCB0byBsb2NrIGl0IHRvby4KLSAgbXV0YWJsZSBpbnRlcm5hbDo6TXV0ZXggbXV0ZXhfOwotCi0gIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICBUaGlzIGZpZWxkIGlzIG5ldmVyIGNoYW5nZWQgb25jZQotICAvLyB0aGUgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLiAgV2UgZG9uJ3QgbWFyayBpdCBhcyBjb25zdCBoZXJlLCBhcwotICAvLyBkb2luZyBzbyB3aWxsIGNhdXNlIGEgd2FybmluZyBpbiB0aGUgY29uc3RydWN0b3Igb2YgVW5pdFRlc3QuCi0gIC8vIE11dGFibGUgc3RhdGUgaW4gKmltcGxfIGlzIHByb3RlY3RlZCBieSBtdXRleF8uCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGxfOwotCi0gIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVW5pdFRlc3QuCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVW5pdFRlc3QpOwotfTsKLQotLy8gQSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIGFkZGluZyBhbiBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QKLS8vIHByb2dyYW0uCi0vLwotLy8gWW91IHNob3VsZCBjYWxsIHRoaXMgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQsIHByb2JhYmx5IGluCi0vLyBtYWluKCkuICBJZiB5b3UgdXNlIGd0ZXN0X21haW4sIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpCi0vLyBzdGFydHMgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIGEgZ2xvYmFsCi0vLyB2YXJpYWJsZSBsaWtlIHRoaXM6Ci0vLwotLy8gICB0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgZm9vX2VudiA9Ci0vLyAgICAgICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEZvb0Vudmlyb25tZW50KTsKLS8vCi0vLyBIb3dldmVyLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgeW91IHRvIHdyaXRlIHlvdXIgb3duIG1haW4oKSBhbmQKLS8vIGNhbGwgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KCkgdGhlcmUsIGFzIHJlbHlpbmcgb24gaW5pdGlhbGl6YXRpb24KLS8vIG9mIGdsb2JhbCB2YXJpYWJsZXMgbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIG1heSBjYXVzZQotLy8gcHJvYmxlbXMgd2hlbiB5b3UgcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGZyb20gZGlmZmVyZW50Ci0vLyB0cmFuc2xhdGlvbiB1bml0cyBhbmQgdGhlIGVudmlyb25tZW50cyBoYXZlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVtCi0vLyAocmVtZW1iZXIgdGhhdCB0aGUgY29tcGlsZXIgZG9lc24ndCBndWFyYW50ZWUgdGhlIG9yZGVyIGluIHdoaWNoCi0vLyBnbG9iYWwgdmFyaWFibGVzIGZyb20gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGFyZSBpbml0aWFsaXplZCkuCi1pbmxpbmUgRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7Ci0gIHJldHVybiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkRW52aXJvbm1lbnQoZW52KTsKLX0KLQotLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCi0vLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQotLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCi0vLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgotLy8KLS8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQotLy8gdXBkYXRlZC4KLS8vCi0vLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0LgotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpOwotCi0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCi0vLyBVTklDT0RFIG1vZGUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFNlcGFyYXRlIHRoZSBlcnJvciBnZW5lcmF0aW5nIGNvZGUgZnJvbSB0aGUgY29kZSBwYXRoIHRvIHJlZHVjZSB0aGUgc3RhY2sKLS8vIGZyYW1lIHNpemUgb2YgQ21wSGVscGVyRVEuIFRoaXMgaGVscHMgcmVkdWNlIHRoZSBvdmVyaGVhZCBvZiBzb21lIHNhbml0aXplcnMKLS8vIHdoZW4gY2FsbGluZyBFWFBFQ1RfKiBpbiBhIHRpZ2h0IGxvb3AuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRRmFpbHVyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLCBjb25zdCBUMiYgYWN0dWFsKSB7Ci0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksCi0gICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQpLAotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLUdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQzODkgLyogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoICovKQotI2VsaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xc2lnbi1jb21wYXJlIgotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xc2hvcnRlbi02NC10by0zMiIKLSNlbHNlCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzaWduLWNvbXBhcmUiCi0jZW5kaWYKLSAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0jZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLSNlbHNlCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0KLSAgcmV0dXJuIENtcEhlbHBlckVRRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKLX0KLQotLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQKLS8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cyBlbnVtcwotLy8gY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKTsKLQotLy8gVGhlIGhlbHBlciBjbGFzcyBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50Ci0vLyBsaHNfaXNfbnVsbF9saXRlcmFsIGlzIHRydWUgaWZmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQotLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcwotLy8gZm9yIGxoc19pc19udWxsX2xpdGVyYWwgYmVpbmcgZmFsc2UuCi10ZW1wbGF0ZSA8Ym9vbCBsaHNfaXNfbnVsbF9saXRlcmFsPgotY2xhc3MgRXFIZWxwZXIgewotIHB1YmxpYzoKLSAgLy8gVGhpcyB0ZW1wbGF0aXplZCB2ZXJzaW9uIGlzIGZvciB0aGUgZ2VuZXJhbCBjYXNlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgewotICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7Ci0gIH0KLQotICAvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAotICAvLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMKLSAgLy8gZW51bXMgY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgotICAvLwotICAvLyBFdmVuIHRob3VnaCBpdHMgYm9keSBsb29rcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgdmVyc2lvbiwgd2UKLSAgLy8gY2Fubm90IG1lcmdlIHRoZSB0d28sIGFzIGl0IHdpbGwgbWFrZSBhbm9ueW1vdXMgZW51bXMgdW5oYXBweS4KLSAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCkgewotICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQotLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCwgbGlrZSBOVUxMLCBmYWxzZSwgb3IgMC4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBFcUhlbHBlcjx0cnVlPiB7Ci0gcHVibGljOgotICAvLyBXZSBkZWZpbmUgdHdvIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgQ29tcGFyZSgpLiAgVGhlIGZpcnN0Ci0gIC8vIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzCi0gIC8vIE5PVCBhIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKDAsIEFuSW50RnVuY3Rpb24oKSkgb3IKLSAgLy8gRVhQRUNUX0VRKGZhbHNlLCBhX2Jvb2wpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoCi0gICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAotICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCi0gICAgICBjb25zdCBUMiYgYWN0dWFsLAotICAgICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIHByZXZlbnRzIHRoaXMgb3ZlcmxvYWQgZnJvbSBiZWluZyBjb25zaWRlcmVkIGlmIFQyCi0gICAgICAvLyBpcyBub3QgYSBwb2ludGVyIHR5cGUuICBXZSBuZWVkIHRoaXMgYmVjYXVzZSBBU1NFUlRfRVEoTlVMTCwgbXlfcHRyKQotICAgICAgLy8gZXhwYW5kcyB0byBDb21wYXJlKCIiLCAiIiwgTlVMTCwgbXlfcHRyKSwgd2hpY2ggcmVxdWlyZXMgYSBjb252ZXJzaW9uCi0gICAgICAvLyB0byBtYXRjaCB0aGUgU2VjcmV0KiBpbiB0aGUgb3RoZXIgb3ZlcmxvYWQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBtYWtlCi0gICAgICAvLyB0aGlzIHRlbXBsYXRlIG1hdGNoIGJldHRlci4KLSAgICAgIHR5cGVuYW1lIEVuYWJsZUlmPCFpc19wb2ludGVyPFQyPjo6dmFsdWU+Ojp0eXBlKiA9IDApIHsKLSAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOwotICB9Ci0KLSAgLy8gVGhpcyB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKSBpcyBhCi0gIC8vIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKE5VTEwsIGFfcG9pbnRlcikuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoCi0gICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAotICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICAvLyBXZSB1c2VkIHRvIGhhdmUgYSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGluc3RlYWQgb2YgU2VjcmV0Ki4gIFRoYXQKLSAgICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciB3b3VsZCBkZWR1Y2UgdG8gJ2xvbmcnLCBtYWtpbmcgdGhpcyBhIGJldHRlciBtYXRjaAotICAgICAgLy8gdGhhbiB0aGUgZmlyc3Qgb3ZlcmxvYWQgZXZlbiB3aXRob3V0IHRoZSBmaXJzdCBvdmVybG9hZCdzIEVuYWJsZUlmLgotICAgICAgLy8gVW5mb3J0dW5hdGVseSwgZ2NjIHdpdGggLVdjb252ZXJzaW9uLW51bGwgd2FybnMgd2hlbiAicGFzc2luZyBOVUxMIHRvCi0gICAgICAvLyBub24tcG9pbnRlciBhcmd1bWVudCIgKGV2ZW4gYSBkZWR1Y2VkIGludGVncmFsIGFyZ3VtZW50KSwgc28gdGhlIG9sZAotICAgICAgLy8gaW1wbGVtZW50YXRpb24gY2F1c2VkIHdhcm5pbmdzIGluIHVzZXIgY29kZS4KLSAgICAgIFNlY3JldCogLyogZXhwZWN0ZWQgKE5VTEwpICovLAotICAgICAgVCogYWN0dWFsKSB7Ci0gICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoYXQgJ2V4cGVjdGVkJyBpcyBhIG51bGwgcG9pbnRlci4KLSAgICByZXR1cm4gQ21wSGVscGVyRVEoZXhwZWN0ZWRfZXhwcmVzc2lvbiwgYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFQqPihOVUxMKSwgYWN0dWFsKTsKLSAgfQotfTsKLQotLy8gU2VwYXJhdGUgdGhlIGVycm9yIGdlbmVyYXRpbmcgY29kZSBmcm9tIHRoZSBjb2RlIHBhdGggdG8gcmVkdWNlIHRoZSBzdGFjawotLy8gZnJhbWUgc2l6ZSBvZiBDbXBIZWxwZXJPUC4gVGhpcyBoZWxwcyByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIHNvbWUgc2FuaXRpemVycwotLy8gd2hlbiBjYWxsaW5nIEVYUEVDVF9PUCBpbiBhIHRpZ2h0IGxvb3AuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlck9wRmFpbHVyZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2YWwxLCBjb25zdCBUMiYgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ApIHsKLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiIDw8IG9wIDw8ICIgKCIgPDwgZXhwcjIKLSAgICAgICAgIDw8ICIpLCBhY3R1YWw6ICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDEsIHZhbDIpCi0gICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpOwotfQotCi0vLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8uICBJdCBpcyBoZXJlIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUKLS8vIG9mIHNpbWlsYXIgY29kZS4KLS8vCi0vLyBGb3IgZWFjaCB0ZW1wbGF0aXplZCBoZWxwZXIgZnVuY3Rpb24sIHdlIGFsc28gZGVmaW5lIGFuIG92ZXJsb2FkZWQKLS8vIHZlcnNpb24gZm9yIEJpZ2dlc3RJbnQgaW4gb3JkZXIgdG8gcmVkdWNlIGNvZGUgYmxvYXQgYW5kIGFsbG93Ci0vLyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZCB3aXRoIHtBU1NFUlR8RVhQRUNUfV8/PyB3aGVuIGNvbXBpbGVkCi0vLyB3aXRoIGdjYyA0LgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLQotI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+XAotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHZhbDEsIGNvbnN0IFQyJiB2YWwyKSB7XAotICBpZiAodmFsMSBvcCB2YWwyKSB7XAotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAotICB9IGVsc2Uge1wKLSAgICByZXR1cm4gQ21wSGVscGVyT3BGYWlsdXJlKGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMiwgI29wKTtcCi0gIH1cCi19XAotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKFwKLSAgICBjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSk7Ci0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pOwotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQKLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwpOwotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR0UKLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KTsKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+KTsKLQotI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKTsKLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOwotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORS4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKLQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSRVEgb24gd2lkZSBzdHJpbmdzLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogYWN0dWFsKTsKLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUKLS8vIGZpcnN0IGFyZ3VtZW50IHRvIHtFWFBFQ1QsQVNTRVJUfV9QUkVEX0ZPUk1BVDIoKSwgbm90IGJ5Ci0vLyB0aGVtc2VsdmVzLiAgVGhleSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhIHN1YnN0cmluZyBvZiBoYXlzdGFjawotLy8gKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYgb25seSksIGFuZCByZXR1cm4gYW4KLS8vIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCi0vLwotLy8gVGhlIHtuZWVkbGUsaGF5c3RhY2t9X2V4cHIgYXJndW1lbnRzIGFyZSB0aGUgc3RyaW5naWZpZWQKLS8vIGV4cHJlc3Npb25zIHRoYXQgZ2VuZXJhdGVkIHRoZSB0d28gcmVhbCBhcmd1bWVudHMuCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjayk7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spOwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnRzLgotLy8KLS8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKLS8vCi0vLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgYWN0dWFsKSB7Ci0gIGNvbnN0IEZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gbGhzKGV4cGVjdGVkKSwgcmhzKGFjdHVhbCk7Ci0KLSAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkX3NzOwotICBleHBlY3RlZF9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCi0gICAgICAgICAgICAgIDw8IGV4cGVjdGVkOwotCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gYWN0dWFsX3NzOwotICBhY3R1YWxfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQotICAgICAgICAgICAgPDwgYWN0dWFsOwotCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmdTdHJlYW1Ub1N0cmluZygmZXhwZWN0ZWRfc3MpLAotICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZhY3R1YWxfc3MpLAotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpOwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8gQSBjbGFzcyB0aGF0IGVuYWJsZXMgb25lIHRvIHN0cmVhbSBtZXNzYWdlcyB0byBhc3NlcnRpb24gbWFjcm9zCi1jbGFzcyBHVEVTVF9BUElfIEFzc2VydEhlbHBlciB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgaW50IGxpbmUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKTsKLSAgfkFzc2VydEhlbHBlcigpOwotCi0gIC8vIE1lc3NhZ2UgYXNzaWdubWVudCBpcyBhIHNlbWFudGljIHRyaWNrIHRvIGVuYWJsZSBhc3NlcnRpb24KLSAgLy8gc3RyZWFtaW5nOyBzZWUgdGhlIEdURVNUX01FU1NBR0VfIG1hY3JvIGJlbG93LgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFdlIHB1dCBvdXIgZGF0YSBpbiBhIHN0cnVjdCBzbyB0aGF0IHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MgY2FuCi0gIC8vIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBnY2MgaXMgaW5jYXBhYmxlIG9mCi0gIC8vIHJlLXVzaW5nIHN0YWNrIHNwYWNlIGV2ZW4gZm9yIHRlbXBvcmFyeSB2YXJpYWJsZXMsIHNvIGV2ZXJ5IEVYUEVDVF9FUQotICAvLyByZXNlcnZlcyBzdGFjayBzcGFjZSBmb3IgYW5vdGhlciBBc3NlcnRIZWxwZXIuCi0gIHN0cnVjdCBBc3NlcnRIZWxwZXJEYXRhIHsKLSAgICBBc3NlcnRIZWxwZXJEYXRhKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNmaWxlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnKQotICAgICAgICA6IHR5cGUodCksIGZpbGUoc3JjZmlsZSksIGxpbmUobGluZV9udW0pLCBtZXNzYWdlKG1zZykgeyB9Ci0KLSAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSBjb25zdCB0eXBlOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGU7Ci0gICAgaW50IGNvbnN0IGxpbmU7Ci0gICAgc3RkOjpzdHJpbmcgY29uc3QgbWVzc2FnZTsKLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFzc2VydEhlbHBlckRhdGEpOwotICB9OwotCi0gIEFzc2VydEhlbHBlckRhdGEqIGNvbnN0IGRhdGFfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLS8vIFRoZSBwdXJlIGludGVyZmFjZSBjbGFzcyB0aGF0IGFsbCB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluaGVyaXQgZnJvbS4KLS8vIEEgdmFsdWUtcGFyYW1ldGVyaXplZCBjbGFzcyBtdXN0IGluaGVyaXQgZnJvbSBib3RoIDo6dGVzdGluZzo6VGVzdCBhbmQKLS8vIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3N0IGNhc2VzIHRoYXQganVzdCBtZWFucyBpbmhlcml0aW5nCi0vLyBmcm9tIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbSwgYnV0IG1vcmUgY29tcGxpY2F0ZWQgdGVzdCBoaWVyYXJjaGllcwotLy8gbWF5IG5lZWQgdG8gaW5oZXJpdCBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZSBhdCBkaWZmZXJlbnQgbGV2ZWxzLgotLy8KLS8vIFRoaXMgaW50ZXJmYWNlIGhhcyBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIHRlc3QgcGFyYW1ldGVyIHZhbHVlIHZpYQotLy8gdGhlIEdldFBhcmFtKCkgbWV0aG9kLgotLy8KLS8vIFVzZSBpdCB3aXRoIG9uZSBvZiB0aGUgcGFyYW1ldGVyIGdlbmVyYXRvciBkZWZpbmluZyBmdW5jdGlvbnMsIGxpa2UgUmFuZ2UoKSwKLS8vIFZhbHVlcygpLCBWYWx1ZXNJbigpLCBCb29sKCksIGFuZCBDb21iaW5lKCkuCi0vLwotLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Ci0vLyAgcHJvdGVjdGVkOgotLy8gICBGb29UZXN0KCkgewotLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgotLy8gICB9Ci0vLyAgIHZpcnR1YWwgfkZvb1Rlc3QoKSB7Ci0vLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCi0vLyAgIH0KLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgotLy8gICB9Ci0vLyAgIHZpcnR1YWwgdm9pZCBUZWFyRG93biB7Ci0vLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCi0vLyAgIH0KLS8vIH07Ci0vLyBURVNUX1AoRm9vVGVzdCwgRG9lc0JhcikgewotLy8gICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgbWV0aG9kIGhlcmUuCi0vLyAgIEZvbyBmb287Ci0vLyAgIEFTU0VSVF9UUlVFKGZvby5Eb2VzQmFyKEdldFBhcmFtKCkpKTsKLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE9uZVRvVGVuUmFuZ2UsIEZvb1Rlc3QsIDo6dGVzdGluZzo6UmFuZ2UoMSwgMTApKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBXaXRoUGFyYW1JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKLSAgdmlydHVhbCB+V2l0aFBhcmFtSW50ZXJmYWNlKCkge30KLQotICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWUuIElzIGFsc28gYXZhaWxhYmxlIGluIHRoZSB0ZXN0IGZpeHR1cmUncwotICAvLyBjb25zdHJ1Y3Rvci4gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgbm9uLXN0YXRpYywgZXZlbiB0aG91Z2ggaXQgb25seQotICAvLyByZWZlcmVuY2VzIHN0YXRpYyBkYXRhLCB0byByZWR1Y2UgdGhlIG9wcG9ydHVuaXR5IGZvciBpbmNvcnJlY3QgdXNlcwotICAvLyBsaWtlIHdyaXRpbmcgJ1dpdGhQYXJhbUludGVyZmFjZTxib29sPjo6R2V0UGFyYW0oKScgZm9yIGEgdGVzdCB0aGF0Ci0gIC8vIHVzZXMgYSBmaXh0dXJlIHdob3NlIHBhcmFtZXRlciB0eXBlIGlzIGludC4KLSAgY29uc3QgUGFyYW1UeXBlJiBHZXRQYXJhbSgpIGNvbnN0IHsKLSAgICBHVEVTVF9DSEVDS18ocGFyYW1ldGVyXyAhPSBOVUxMKQotICAgICAgICA8PCAiR2V0UGFyYW0oKSBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0ICIKLSAgICAgICAgPDwgIi0tIGRpZCB5b3UgaW50ZW5kIHRvIHdyaXRlIFRFU1RfUCBpbnN0ZWFkIG9mIFRFU1RfRj8iOwotICAgIHJldHVybiAqcGFyYW1ldGVyXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gU2V0cyBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIHRoZSB2YWx1ZQotICAvLyByZW1haW5zIGFsaXZlIGFuZCB1bmNoYW5nZWQgdGhyb3VnaG91dCB0aGUgY3VycmVudCB0ZXN0LgotICBzdGF0aWMgdm9pZCBTZXRQYXJhbShjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcikgewotICAgIHBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7Ci0gIH0KLQotICAvLyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgYWNjZXNzaW5nIHBhcmFtZXRlciBkdXJpbmcgYSB0ZXN0IGxpZmV0aW1lLgotICBzdGF0aWMgY29uc3QgUGFyYW1UeXBlKiBwYXJhbWV0ZXJfOwotCi0gIC8vIFRlc3RDbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IGFuZCBUZXN0LgotICB0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPiBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY29uc3QgVCogV2l0aFBhcmFtSW50ZXJmYWNlPFQ+OjpwYXJhbWV0ZXJfID0gTlVMTDsKLQotLy8gTW9zdCB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzZXMgY2FuIGlnbm9yZSB0aGUgZXhpc3RlbmNlIG9mCi0vLyBXaXRoUGFyYW1JbnRlcmZhY2UsIGFuZCBjYW4ganVzdCBpbmhlcml0IGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRlc3RXaXRoUGFyYW0gOiBwdWJsaWMgVGVzdCwgcHVibGljIFdpdGhQYXJhbUludGVyZmFjZTxUPiB7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLS8vIE1hY3JvcyBmb3IgaW5kaWNhdGluZyBzdWNjZXNzL2ZhaWx1cmUgaW4gdGVzdCBjb2RlLgotCi0vLyBBRERfRkFJTFVSRSB1bmNvbmRpdGlvbmFsbHkgYWRkcyBhIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4KLS8vIFNVQ0NFRUQgZ2VuZXJhdGVzIGEgc3VjY2VzcyAtIGl0IGRvZXNuJ3QgYXV0b21hdGljYWxseSBtYWtlIHRoZQotLy8gY3VycmVudCB0ZXN0IHN1Y2Nlc3NmdWwsIGFzIGEgdGVzdCBpcyBvbmx5IHN1Y2Nlc3NmdWwgd2hlbiBpdCBoYXMKLS8vIG5vIGZhaWx1cmUuCi0vLwotLy8gRVhQRUNUXyogdmVyaWZpZXMgdGhhdCBhIGNlcnRhaW4gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4gIElmIG5vdCwKLS8vIGl0IGJlaGF2ZXMgbGlrZSBBRERfRkFJTFVSRS4gIEluIHBhcnRpY3VsYXI6Ci0vLwotLy8gICBFWFBFQ1RfVFJVRSAgdmVyaWZpZXMgdGhhdCBhIEJvb2xlYW4gY29uZGl0aW9uIGlzIHRydWUuCi0vLyAgIEVYUEVDVF9GQUxTRSB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgZmFsc2UuCi0vLwotLy8gRkFJTCBhbmQgQVNTRVJUXyogYXJlIHNpbWlsYXIgdG8gQUREX0ZBSUxVUkUgYW5kIEVYUEVDVF8qLCBleGNlcHQKLS8vIHRoYXQgdGhleSB3aWxsIGFsc28gYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb24gZmFpbHVyZS4gIFBlb3BsZQotLy8gdXN1YWxseSB3YW50IHRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgRkFJTCBhbmQgQVNTRVJUXyosIGJ1dCB0aG9zZQotLy8gd3JpdGluZyBkYXRhLWRyaXZlbiB0ZXN0cyBvZnRlbiBmaW5kIHRoZW1zZWx2ZXMgdXNpbmcgQUREX0ZBSUxVUkUKLS8vIGFuZCBFWFBFQ1RfKiBtb3JlLgotCi0vLyBHZW5lcmF0ZXMgYSBub25mYXRhbCBmYWlsdXJlIHdpdGggYSBnZW5lcmljIG1lc3NhZ2UuCi0jZGVmaW5lIEFERF9GQUlMVVJFKCkgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCi0KLS8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgYXQgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIHdpdGgKLS8vIGEgZ2VuZXJpYyBtZXNzYWdlLgotI2RlZmluZSBBRERfRkFJTFVSRV9BVChmaWxlLCBsaW5lKSBcCi0gIEdURVNUX01FU1NBR0VfQVRfKGZpbGUsIGxpbmUsICJGYWlsZWQiLCBcCi0gICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpCi0KLS8vIEdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KLSNkZWZpbmUgR1RFU1RfRkFJTCgpIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKCJGYWlsZWQiKQotCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgRkFJTCgpLCB3aGljaCBpcyBhCi0vLyBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfRkFJTAotIyBkZWZpbmUgRkFJTCgpIEdURVNUX0ZBSUwoKQotI2VuZGlmCi0KLS8vIEdlbmVyYXRlcyBhIHN1Y2Nlc3Mgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KLSNkZWZpbmUgR1RFU1RfU1VDQ0VFRCgpIEdURVNUX1NVQ0NFU1NfKCJTdWNjZWVkZWQiKQotCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgU1VDQ0VFRCgpLCB3aGljaAotLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfU1VDQ0VFRAotIyBkZWZpbmUgU1VDQ0VFRCgpIEdURVNUX1NVQ0NFRUQoKQotI2VuZGlmCi0KLS8vIE1hY3JvcyBmb3IgdGVzdGluZyBleGNlcHRpb25zLgotLy8KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IHRocm93cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fVEhST1coc3RhdGVtZW50KToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IGRvZXNuJ3QgdGhyb3cgYW55IGV4Y2VwdGlvbi4KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0FOWV9USFJPVyhzdGF0ZW1lbnQpOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLQotI2RlZmluZSBFWFBFQ1RfVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pIFwKLSAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfTk9fVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9BTllfVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pIFwKLSAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfTk9fVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9BTllfVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0vLyBCb29sZWFuIGFzc2VydGlvbnMuIENvbmRpdGlvbiBjYW4gYmUgZWl0aGVyIGEgQm9vbGVhbiBleHByZXNzaW9uIG9yIGFuCi0vLyBBc3NlcnRpb25SZXN1bHQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgQXNzZXJ0aW9uUmVzdWx0IHdpdGgKLS8vIHRoZXNlIG1hY3JvcyBzZWUgY29tbWVudHMgb24gdGhhdCBjbGFzcy4KLSNkZWZpbmUgRVhQRUNUX1RSVUUoY29uZGl0aW9uKSBcCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oY29uZGl0aW9uLCAjY29uZGl0aW9uLCBmYWxzZSwgdHJ1ZSwgXAotICAgICAgICAgICAgICAgICAgICAgIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfRkFMU0UoY29uZGl0aW9uKSBcCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oIShjb25kaXRpb24pLCAjY29uZGl0aW9uLCB0cnVlLCBmYWxzZSwgXAotICAgICAgICAgICAgICAgICAgICAgIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfVFJVRShjb25kaXRpb24pIFwKLSAgR1RFU1RfVEVTVF9CT09MRUFOXyhjb25kaXRpb24sICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9GQUxTRShjb25kaXRpb24pIFwKLSAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLS8vIEluY2x1ZGVzIHRoZSBhdXRvLWdlbmVyYXRlZCBoZWFkZXIgdGhhdCBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mCi0vLyBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIgotCi0vLyBNYWNyb3MgZm9yIHRlc3RpbmcgZXF1YWxpdGllcyBhbmQgaW5lcXVhbGl0aWVzLgotLy8KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0VRKGV4cGVjdGVkLCBhY3R1YWwpOiBUZXN0cyB0aGF0IGV4cGVjdGVkID09IGFjdHVhbAotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTkUodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgIT0gdjIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDwgdjIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xFKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDw9IHYyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HVCh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+IHYyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+PSB2MgotLy8KLS8vIFdoZW4gdGhleSBhcmUgbm90LCBHb29nbGUgVGVzdCBwcmludHMgYm90aCB0aGUgdGVzdGVkIGV4cHJlc3Npb25zIGFuZAotLy8gdGhlaXIgYWN0dWFsIHZhbHVlcy4gIFRoZSB2YWx1ZXMgbXVzdCBiZSBjb21wYXRpYmxlIGJ1aWx0LWluIHR5cGVzLAotLy8gb3IgeW91IHdpbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IuICBCeSAiY29tcGF0aWJsZSIgd2UgbWVhbiB0aGF0IHRoZQotLy8gdmFsdWVzIGNhbiBiZSBjb21wYXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBvcGVyYXRvci4KLS8vCi0vLyBOb3RlOgotLy8KLS8vICAgMS4gSXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHVzZXItZGVmaW5lZCB0eXBlIHdvcmsgd2l0aAotLy8gICB7QVNTRVJUfEVYUEVDVH1fPz8oKSwgYnV0IHRoYXQgcmVxdWlyZXMgb3ZlcmxvYWRpbmcgdGhlCi0vLyAgIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZCBpcyB0aHVzIGRpc2NvdXJhZ2VkIGJ5IHRoZSBHb29nbGUgQysrCi0vLyAgIFVzYWdlIEd1aWRlLiAgVGhlcmVmb3JlLCB5b3UgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZQotLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRSgpIG1hY3JvIHRvIGFzc2VydCB0aGF0IHR3byBvYmplY3RzIGFyZQotLy8gICBlcXVhbC4KLS8vCi0vLyAgIDIuIFRoZSB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MgZG8gcG9pbnRlciBjb21wYXJpc29ucyBvbgotLy8gICBwb2ludGVycyAoaW4gcGFydGljdWxhciwgQyBzdHJpbmdzKS4gIFRoZXJlZm9yZSwgaWYgeW91IHVzZSBpdAotLy8gICB3aXRoIHR3byBDIHN0cmluZ3MsIHlvdSBhcmUgdGVzdGluZyBob3cgdGhlaXIgbG9jYXRpb25zIGluIG1lbW9yeQotLy8gICBhcmUgcmVsYXRlZCwgbm90IGhvdyB0aGVpciBjb250ZW50IGlzIHJlbGF0ZWQuICBUbyBjb21wYXJlIHR3byBDCi0vLyAgIHN0cmluZ3MgYnkgY29udGVudCwgdXNlIHtBU1NFUlR8RVhQRUNUfV9TVFIqKCkuCi0vLwotLy8gICAzLiB7QVNTRVJUfEVYUEVDVH1fRVEoZXhwZWN0ZWQsIGFjdHVhbCkgaXMgcHJlZmVycmVkIHRvCi0vLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKGV4cGVjdGVkID09IGFjdHVhbCksIGFzIHRoZSBmb3JtZXIgdGVsbHMgeW91Ci0vLyAgIHdoYXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyB3aGVuIGl0IGZhaWxzLCBhbmQgc2ltaWxhcmx5IGZvciB0aGUKLS8vICAgb3RoZXIgY29tcGFyaXNvbnMuCi0vLwotLy8gICA0LiBEbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB7QVNTRVJUfEVYUEVDVH1fPz8oKQotLy8gICBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMsIHdoaWNoIGlzIHVuZGVmaW5lZC4KLS8vCi0vLyAgIDUuIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgotLy8KLS8vIEV4YW1wbGVzOgotLy8KLS8vICAgRVhQRUNUX05FKDUsIEZvbygpKTsKLS8vICAgRVhQRUNUX0VRKE5VTEwsIGFfcG9pbnRlcik7Ci0vLyAgIEFTU0VSVF9MVChpLCBhcnJheV9zaXplKTsKLS8vICAgQVNTRVJUX0dUKHJlY29yZHMuc2l6ZSgpLCAwKSA8PCAiVGhlcmUgaXMgbm8gcmVjb3JkIGxlZnQuIjsKLQotI2RlZmluZSBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCi0gICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhleHBlY3RlZCk+OjpDb21wYXJlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKLSNkZWZpbmUgRVhQRUNUX05FKGV4cGVjdGVkLCBhY3R1YWwpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgZXhwZWN0ZWQsIGFjdHVhbCkKLSNkZWZpbmUgRVhQRUNUX0xFKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0xUKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0dFKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0dUKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKLQotI2RlZmluZSBHVEVTVF9BU1NFUlRfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCi0gICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhleHBlY3RlZCk+OjpDb21wYXJlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKLSNkZWZpbmUgR1RFU1RfQVNTRVJUX05FKHZhbDEsIHZhbDIpIFwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpIFwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgR1RFU1RfQVNTRVJUX0xUKHZhbDEsIHZhbDIpIFwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKLSNkZWZpbmUgR1RFU1RfQVNTRVJUX0dFKHZhbDEsIHZhbDIpIFwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpIFwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKLQotLy8gRGVmaW5lIG1hY3JvIEdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9YWSB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YKLS8vIEFTU0VSVF9YWSgpLCB3aGljaCBjbGFzaGVzIHdpdGggc29tZSB1c2Vycycgb3duIGNvZGUuCi0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0VRCi0jIGRlZmluZSBBU1NFUlRfRVEodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0VRKHZhbDEsIHZhbDIpCi0jZW5kaWYKLQotI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTkUKLSMgZGVmaW5lIEFTU0VSVF9ORSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikKLSNlbmRpZgotCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9MRQotIyBkZWZpbmUgQVNTRVJUX0xFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MRSh2YWwxLCB2YWwyKQotI2VuZGlmCi0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xUCi0jIGRlZmluZSBBU1NFUlRfTFQodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xUKHZhbDEsIHZhbDIpCi0jZW5kaWYKLQotI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfR0UKLSMgZGVmaW5lIEFTU0VSVF9HRSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikKLSNlbmRpZgotCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HVAotIyBkZWZpbmUgQVNTRVJUX0dUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HVCh2YWwxLCB2YWwyKQotI2VuZGlmCi0KLS8vIEMtc3RyaW5nIENvbXBhcmlzb25zLiAgQWxsIHRlc3RzIHRyZWF0IE5VTEwgYW5kIGFueSBub24tTlVMTCBzdHJpbmcKLS8vIGFzIGRpZmZlcmVudC4gIFR3byBOVUxMcyBhcmUgZXF1YWwuCi0vLwotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSRVEoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgPT0gczIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUk5FKHMxLCBzMik6ICAgICBUZXN0cyB0aGF0IHMxICE9IHMyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEoczEsIHMyKTogVGVzdHMgdGhhdCBzMSA9PSBzMiwgaWdub3JpbmcgY2FzZQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgIT0gczIsIGlnbm9yaW5nIGNhc2UKLS8vCi0vLyBGb3Igd2lkZSBvciBuYXJyb3cgc3RyaW5nIG9iamVjdHMsIHlvdSBjYW4gdXNlIHRoZQotLy8ge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zLgotLy8KLS8vIERvbid0IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkLAotLy8gd2hpY2ggaXMgdW5kZWZpbmVkLgotLy8KLS8vIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgotCi0jZGVmaW5lIEVYUEVDVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCi0jZGVmaW5lIEVYUEVDVF9TVFJORShzMSwgczIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQotI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCi0jZGVmaW5lIEVYUEVDVF9TVFJDQVNFTkUoczEsIHMyKVwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKLQotI2RlZmluZSBBU1NFUlRfU1RSRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBleHBlY3RlZCwgYWN0dWFsKQotI2RlZmluZSBBU1NFUlRfU1RSTkUoczEsIHMyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSTkUsIHMxLCBzMikKLSNkZWZpbmUgQVNTRVJUX1NUUkNBU0VFUShleHBlY3RlZCwgYWN0dWFsKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBleHBlY3RlZCwgYWN0dWFsKQotI2RlZmluZSBBU1NFUlRfU1RSQ0FTRU5FKHMxLCBzMilcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCi0KLS8vIE1hY3JvcyBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0vLwotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6Ci0vLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGZsb2F0IHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsLgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBkb3VibGUgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORUFSKHYxLCB2MiwgYWJzX2Vycm9yKToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB2MSBhbmQgdjIgYXJlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlzdGFuY2UgdG8gZWFjaCBvdGhlci4KLS8vCi0vLyBHb29nbGUgVGVzdCB1c2VzIFVMUC1iYXNlZCBjb21wYXJpc29uIHRvIGF1dG9tYXRpY2FsbHkgcGljayBhIGRlZmF1bHQKLS8vIGVycm9yIGJvdW5kIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBvcGVyYW5kcy4gIFNlZSB0aGUKLS8vIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgaW4gZ3Rlc3QtaW50ZXJuYWwuaCBpZiB5b3UgYXJlCi0vLyBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgotCi0jZGVmaW5lIEVYUEVDVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKLQotI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKLQotI2RlZmluZSBBU1NFUlRfRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCi0KLSNkZWZpbmUgQVNTRVJUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZG91YmxlPiwgXAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCi0KLSNkZWZpbmUgRVhQRUNUX05FQVIodmFsMSwgdmFsMiwgYWJzX2Vycm9yKVwKLSAgRVhQRUNUX1BSRURfRk9STUFUMyg6OnRlc3Rpbmc6OmludGVybmFsOjpEb3VibGVOZWFyUHJlZEZvcm1hdCwgXAotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikKLQotI2RlZmluZSBBU1NFUlRfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAotICBBU1NFUlRfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQotCi0vLyBUaGVzZSBwcmVkaWNhdGUgZm9ybWF0IGZ1bmN0aW9ucyB3b3JrIG9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcywgYW5kCi0vLyBjYW4gYmUgdXNlZCBpbiB7QVNTRVJUfEVYUEVDVH1fUFJFRF9GT1JNQVQyKigpLCBlLmcuCi0vLwotLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OkRvdWJsZUxFLCBGb28oKSwgNS4wKTsKLQotLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscwotLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMik7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpOwotCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIE1hY3JvcyB0aGF0IHRlc3QgZm9yIEhSRVNVTFQgZmFpbHVyZSBhbmQgc3VjY2VzcywgdGhlc2UgYXJlIG9ubHkgdXNlZnVsCi0vLyBvbiBXaW5kb3dzLCBhbmQgcmVseSBvbiBXaW5kb3dzIFNESyBtYWNyb3MgYW5kIEFQSXMgdG8gY29tcGlsZS4KLS8vCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfShleHByKQotLy8KLS8vIFdoZW4gZXhwciB1bmV4cGVjdGVkbHkgZmFpbHMgb3Igc3VjY2VlZHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUKLS8vIGV4cGVjdGVkIHJlc3VsdCBhbmQgdGhlIGFjdHVhbCByZXN1bHQgd2l0aCBib3RoIGEgaHVtYW4tcmVhZGFibGUKLS8vIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUKLS8vIGhleCByZXN1bHQgY29kZS4KLSMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCi0KLSMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCi0KLSMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCi0KLSMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCi0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0vLyBNYWNyb3MgdGhhdCBleGVjdXRlIHN0YXRlbWVudCBhbmQgY2hlY2sgdGhhdCBpdCBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbAotLy8gZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgotLy8KLS8vICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpOwotLy8KLS8vIEV4YW1wbGVzOgotLy8KLS8vICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKTsKLS8vICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKSA8PCAiUHJvY2VzcygpIGZhaWxlZCI7Ci0vLwotI2RlZmluZSBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpIFwKLSAgICBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAotICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLQotLy8gQ2F1c2VzIGEgdHJhY2UgKGluY2x1ZGluZyB0aGUgc291cmNlIGZpbGUgcGF0aCwgdGhlIGN1cnJlbnQgbGluZQotLy8gbnVtYmVyLCBhbmQgdGhlIGdpdmVuIG1lc3NhZ2UpIHRvIGJlIGluY2x1ZGVkIGluIGV2ZXJ5IHRlc3QgZmFpbHVyZQotLy8gbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29kZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIFRoZSBlZmZlY3QgaXMKLS8vIHVuZG9uZSB3aGVuIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgY3VycmVudCBzY29wZS4KLS8vCi0vLyBUaGUgbWVzc2FnZSBhcmd1bWVudCBjYW4gYmUgYW55dGhpbmcgc3RyZWFtYWJsZSB0byBzdGQ6Om9zdHJlYW0uCi0vLwotLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBpbmNsdWRlIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFzIHBhcnQKLS8vIG9mIHRoZSBkdW1teSB2YXJpYWJsZSBuYW1lLCB0aHVzIGFsbG93aW5nIG11bHRpcGxlIFNDT1BFRF9UUkFDRSgpcwotLy8gdG8gYXBwZWFyIGluIHRoZSBzYW1lIGJsb2NrIC0gYXMgbG9uZyBhcyB0aGV5IGFyZSBvbiBkaWZmZXJlbnQKLS8vIGxpbmVzLgotI2RlZmluZSBTQ09QRURfVFJBQ0UobWVzc2FnZSkgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpTY29wZWRUcmFjZSBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X3RyYWNlXywgX19MSU5FX18pKFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8IChtZXNzYWdlKSkKLQotLy8gQ29tcGlsZS10aW1lIGFzc2VydGlvbiBmb3IgdHlwZSBlcXVhbGl0eS4KLS8vIFN0YXRpY0Fzc2VydFR5cGVFcTx0eXBlMSwgdHlwZTI+KCkgY29tcGlsZXMgaWZmIHR5cGUxIGFuZCB0eXBlMiBhcmUKLS8vIHRoZSBzYW1lIHR5cGUuICBUaGUgdmFsdWUgaXQgcmV0dXJucyBpcyBub3QgaW50ZXJlc3RpbmcuCi0vLwotLy8gSW5zdGVhZCBvZiBtYWtpbmcgU3RhdGljQXNzZXJ0VHlwZUVxIGEgY2xhc3MgdGVtcGxhdGUsIHdlIG1ha2UgaXQgYQotLy8gZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCBpbnZva2VzIGEgaGVscGVyIGNsYXNzIHRlbXBsYXRlLiAgVGhpcwotLy8gcHJldmVudHMgYSB1c2VyIGZyb20gbWlzdXNpbmcgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4gYnkKLS8vIGRlZmluaW5nIG9iamVjdHMgb2YgdGhhdCB0eXBlLgotLy8KLS8vIENBVkVBVDoKLS8vCi0vLyBXaGVuIHVzZWQgaW5zaWRlIGEgbWV0aG9kIG9mIGEgY2xhc3MgdGVtcGxhdGUsCi0vLyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpIGlzIGVmZmVjdGl2ZSBPTkxZIElGIHRoZSBtZXRob2QgaXMKLS8vIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKLS8vCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGb28gewotLy8gICAgcHVibGljOgotLy8gICAgIHZvaWQgQmFyKCkgeyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9Ci0vLyAgIH07Ci0vLwotLy8gdGhlIGNvZGU6Ci0vLwotLy8gICB2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9Ci0vLwotLy8gd2lsbCBOT1QgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciwgYXMgRm9vPGJvb2w+OjpCYXIoKSBpcyBuZXZlcgotLy8gYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6Ci0vLwotLy8gICB2b2lkIFRlc3QyKCkgeyBGb288Ym9vbD4gZm9vOyBmb28uQmFyKCk7IH0KLS8vCi0vLyB0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWJvb2wgU3RhdGljQXNzZXJ0VHlwZUVxKCkgewotICAodm9pZClpbnRlcm5hbDo6U3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQxLCBUMj4oKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIERlZmluZXMgYSB0ZXN0LgotLy8KLS8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSwgYW5kIHRoZSBzZWNvbmQKLS8vIHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KLS8vCi0vLyBUaGUgY29udmVudGlvbiBpcyB0byBlbmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdpdGggIlRlc3QiLiAgRm9yCi0vLyBleGFtcGxlLCBhIHRlc3QgY2FzZSBmb3IgdGhlIEZvbyBjbGFzcyBjYW4gYmUgbmFtZWQgRm9vVGVzdC4KLS8vCi0vLyBUZXN0IGNvZGUgc2hvdWxkIGFwcGVhciBiZXR3ZWVuIGJyYWNlcyBhZnRlciBhbiBpbnZvY2F0aW9uIG9mCi0vLyB0aGlzIG1hY3JvLiAgRXhhbXBsZToKLS8vCi0vLyAgIFRFU1QoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsKLS8vICAgICBGb28gZm9vOwotLy8gICAgIEVYUEVDVF9UUlVFKGZvby5TdGF0dXNJc09LKCkpOwotLy8gICB9Ci0KLS8vIE5vdGUgdGhhdCB3ZSBjYWxsIEdldFRlc3RUeXBlSWQoKSBpbnN0ZWFkIG9mIEdldFR5cGVJZDwKLS8vIDo6dGVzdGluZzo6VGVzdD4oKSBoZXJlIHRvIGdldCB0aGUgdHlwZSBJRCBvZiB0ZXN0aW5nOjpUZXN0LiAgVGhpcwotLy8gaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIHVzaW5nIEdvb2dsZSBUZXN0IGFzCi0vLyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzIEdldFR5cGVJZDwKLS8vIDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcgb24gd2hldGhlcgotLy8gdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvciBmcm9tIHVzZXIgdGVzdAotLy8gY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUKLS8vIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZSBHb29nbGUgVGVzdAotLy8gZnJhbWV3b3JrLgotI2RlZmluZSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAotICBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpKQotCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgVEVTVCgpLCB3aGljaAotLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfVEVTVAotIyBkZWZpbmUgVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpCi0jZW5kaWYKLQotLy8gRGVmaW5lcyBhIHRlc3QgdGhhdCB1c2VzIGEgdGVzdCBmaXh0dXJlLgotLy8KLS8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcywgd2hpY2gKLS8vIGFsc28gZG91YmxlcyBhcyB0aGUgdGVzdCBjYXNlIG5hbWUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUKLS8vIG5hbWUgb2YgdGhlIHRlc3Qgd2l0aGluIHRoZSB0ZXN0IGNhc2UuCi0vLwotLy8gQSB0ZXN0IGZpeHR1cmUgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBlYXJsaWVyLiAgVGhlIHVzZXIgc2hvdWxkIHB1dAotLy8gaGlzIHRlc3QgY29kZSBiZXR3ZWVuIGJyYWNlcyBhZnRlciB1c2luZyB0aGlzIG1hY3JvLiAgRXhhbXBsZToKLS8vCi0vLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0vLyAgICBwcm90ZWN0ZWQ6Ci0vLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBiXy5BZGRFbGVtZW50KDMpOyB9Ci0vLwotLy8gICAgIEZvbyBhXzsKLS8vICAgICBGb28gYl87Ci0vLyAgIH07Ci0vLwotLy8gICBURVNUX0YoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsKLS8vICAgICBFWFBFQ1RfVFJVRShhXy5TdGF0dXNJc09LKCkpOwotLy8gICB9Ci0vLwotLy8gICBURVNUX0YoRm9vVGVzdCwgUmV0dXJuc0VsZW1lbnRDb3VudENvcnJlY3RseSkgewotLy8gICAgIEVYUEVDVF9FUSgwLCBhXy5zaXplKCkpOwotLy8gICAgIEVYUEVDVF9FUSgxLCBiXy5zaXplKCkpOwotLy8gICB9Ci0KLSNkZWZpbmUgVEVTVF9GKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lKVwKLSAgR1RFU1RfVEVTVF8odGVzdF9maXh0dXJlLCB0ZXN0X25hbWUsIHRlc3RfZml4dHVyZSwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUeXBlSWQ8dGVzdF9maXh0dXJlPigpKQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBVc2UgdGhpcyBmdW5jdGlvbiBpbiBtYWluKCkgdG8gcnVuIGFsbCB0ZXN0cy4gIEl0IHJldHVybnMgMCBpZiBhbGwKLS8vIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KLS8vCi0vLyBSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGNvbW1hbmQgbGluZSBoYXMgYmVlbgotLy8gcGFyc2VkIGJ5IEluaXRHb29nbGVUZXN0KCkuCi0vLwotLy8gVGhpcyBmdW5jdGlvbiB3YXMgZm9ybWVybHkgYSBtYWNybzsgdGh1cywgaXQgaXMgaW4gdGhlIGdsb2JhbAotLy8gbmFtZXNwYWNlIGFuZCBoYXMgYW4gYWxsLWNhcHMgbmFtZS4KLWludCBSVU5fQUxMX1RFU1RTKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKLQotaW5saW5lIGludCBSVU5fQUxMX1RFU1RTKCkgewotICByZXR1cm4gOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworI2VuZGlmICAvLyBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhZTcxMi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gMTAvMzEvMjAxMSBieSBjb21tYW5kCi0vLyAnZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSA1Jy4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0vLwotLy8gSW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCi0KLS8vIE1ha2VzIHN1cmUgdGhpcyBoZWFkZXIgaXMgbm90IGluY2x1ZGVkIGJlZm9yZSBndGVzdC5oLgotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCi0jIGVycm9yIERvIG5vdCBpbmNsdWRlIGd0ZXN0X3ByZWRfaW1wbC5oIGRpcmVjdGx5LiAgSW5jbHVkZSBndGVzdC5oIGluc3RlYWQuCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KLQotLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24KLS8vIG1hY3JvczoKLS8vCi0vLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKQotLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpCi0vLyAgIC4uLgotLy8KLS8vIHdoZXJlIHByZWRfZm9ybWF0IGlzIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHRha2VzIG4gKGluIHRoZQotLy8gY2FzZSBvZiBBU1NFUlRfUFJFRF9GT1JNQVRuKSB2YWx1ZXMgYW5kIHRoZWlyIHNvdXJjZSBleHByZXNzaW9uCi0vLyB0ZXh0LCBhbmQgcmV0dXJucyBhIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4gIFNlZSB0aGUgZGVmaW5pdGlvbgotLy8gb2YgQVNTRVJUX0VRIGluIGd0ZXN0LmggZm9yIGFuIGV4YW1wbGUuCi0vLwotLy8gSWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZm9ybWF0dGluZywgeW91IGNhbiB1c2UgdGhlIG1vcmUKLS8vIHJlc3RyaWN0aXZlIHZlcnNpb246Ci0vLwotLy8gICBBU1NFUlRfUFJFRDEocHJlZCwgdjEpCi0vLyAgIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpCi0vLyAgIC4uLgotLy8KLS8vIHdoZXJlIHByZWQgaXMgYW4gbi1hcnkgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHJldHVybnMgYm9vbCwKLS8vIGFuZCB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uLCBtdXN0IHN1cHBvcnQgdGhlIDw8IG9wZXJhdG9yIGZvcgotLy8gc3RyZWFtaW5nIHRvIHN0ZDo6b3N0cmVhbS4KLS8vCi0vLyBXZSBhbHNvIGRlZmluZSB0aGUgRVhQRUNUXyogdmFyaWF0aW9ucy4KLS8vCi0vLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBwcmVkaWNhdGVzIHdob3NlIGFyaXR5IGlzIGF0IG1vc3QgNS4KLS8vIFBsZWFzZSBlbWFpbCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKLS8vIHN1cHBvcnQgZm9yIGhpZ2hlciBhcml0aWVzLgotCi0vLyBHVEVTVF9BU1NFUlRfIGlzIHRoZSBiYXNpYyBzdGF0ZW1lbnQgdG8gd2hpY2ggYWxsIG9mIHRoZSBhc3NlcnRpb25zCi0vLyBpbiB0aGlzIGZpbGUgcmVkdWNlLiAgRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgotCi0jZGVmaW5lIEdURVNUX0FTU0VSVF8oZXhwcmVzc2lvbiwgb25fZmFpbHVyZSkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hciA9IChleHByZXNzaW9uKSkgXAotICAgIDsgXAotICBlbHNlIFwKLSAgICBvbl9mYWlsdXJlKGd0ZXN0X2FyLmZhaWx1cmVfbWVzc2FnZSgpKQotCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKLSAgICAgICAgICB0eXBlbmFtZSBUMT4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSkgewotICBpZiAocHJlZCh2MSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjE7Ci19Ci0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMS4KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgdjEpLCBcCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDEuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDFIZWxwZXIoI3ByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEpLCBvbl9mYWlsdXJlKQotCi0vLyBVbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLSNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfUFJFRDEocHJlZCwgdjEpIFwKLSAgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRDEocHJlZCwgdjEpIFwKLSAgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMi4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKLSAgICAgICAgICB0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMj4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMkhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIHsKLSAgaWYgKHByZWQodjEsIHYyKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjI7Ci19Ci0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMi4KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgdjEsIHYyKSwgXAotICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCi0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2Miwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMkhlbHBlcigjcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiksIG9uX2ZhaWx1cmUpCi0KLS8vIEJpbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLSNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCi0gIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKLSAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKSBcCi0gIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQzLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAotICAgICAgICAgIHR5cGVuYW1lIFQxLAotICAgICAgICAgIHR5cGVuYW1lIFQyLAotICAgICAgICAgIHR5cGVuYW1lIFQzPgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQzSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIHsKLSAgaWYgKHByZWQodjEsIHYyLCB2MykpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MzsKLX0KLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQzLgotLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCB2MSwgdjIsIHYzKSwgXAotICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCi0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQzLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDNIZWxwZXIoI3ByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMpLCBvbl9mYWlsdXJlKQotCi0vLyBUZXJuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcCi0gIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfUFJFRDMocHJlZCwgdjEsIHYyLCB2MykgXAotICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCi0gIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKLSAgICAgICAgICB0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMiwKLSAgICAgICAgICB0eXBlbmFtZSBUMywKLSAgICAgICAgICB0eXBlbmFtZSBUND4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNEhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgewotICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTQgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU0IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjQ7Ci19Ci0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNC4KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgdjEsIHYyLCB2MywgdjQpLCBcCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDQuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDRIZWxwZXIoI3ByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjQpLCBvbl9mYWlsdXJlKQotCi0vLyA0LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLSNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUNChwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfUFJFRDQocHJlZCwgdjEsIHYyLCB2MywgdjQpIFwKLSAgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNChwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRDQocHJlZCwgdjEsIHYyLCB2MywgdjQpIFwKLSAgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENS4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKLSAgICAgICAgICB0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMiwKLSAgICAgICAgICB0eXBlbmFtZSBUMywKLSAgICAgICAgICB0eXBlbmFtZSBUNCwKLSAgICAgICAgICB0eXBlbmFtZSBUNT4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIHsKLSAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQsIHY1KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTUgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU0IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU1IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjU7Ci19Ci0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNS4KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCAjdjQsICN2NSwgdjEsIHYyLCB2MywgdjQsIHY1KSwgXAotICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCi0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNUhlbHBlcigjcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NSksIG9uX2ZhaWx1cmUpCi0KLS8vIDUtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAotICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCi0gIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKLSAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLQotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaAppbmRleCBkYTgwZGRjLi4zMTNjMTZkIDEwMDY0NAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCisrKyBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKQEAgLTEsNTggKzEsMTUgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkZWZpbml0aW9ucyB1c2VmdWwgaW4gcHJvZHVjdGlvbiBjb2RlLgorLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMKKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworI2lmbmRlZiBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworI2RlZmluZSBURVNUSU5HX0dURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXwogCi0vLyBXaGVuIHlvdSBuZWVkIHRvIHRlc3QgdGhlIHByaXZhdGUgb3IgcHJvdGVjdGVkIG1lbWJlcnMgb2YgYSBjbGFzcywKLS8vIHVzZSB0aGUgRlJJRU5EX1RFU1QgbWFjcm8gdG8gZGVjbGFyZSB5b3VyIHRlc3RzIGFzIGZyaWVuZHMgb2YgdGhlCi0vLyBjbGFzcy4gIEZvciBleGFtcGxlOgotLy8KLS8vIGNsYXNzIE15Q2xhc3MgewotLy8gIHByaXZhdGU6Ci0vLyAgIHZvaWQgTXlNZXRob2QoKTsKLS8vICAgRlJJRU5EX1RFU1QoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKTsKLS8vIH07Ci0vLwotLy8gY2xhc3MgTXlDbGFzc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0vLyAgIC8vIC4uLgotLy8gfTsKLS8vCi0vLyBURVNUX0YoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKSB7Ci0vLyAgIC8vIENhbiBjYWxsIE15Q2xhc3M6Ok15TWV0aG9kKCkgaGVyZS4KLS8vIH0KKy8vIFRoZSBmaWxlL2RpcmVjdG9yeSBsYXlvdXQgb2YgR29vZ2xlIFRlc3QgaXMgbm90IHlldCBjb25zaWRlcmVkIHN0YWJsZS4gVW50aWwKKy8vIGl0IHN0YWJpbGl6ZXMsIENocm9taXVtIGNvZGUgd2lsbCB1c2UgZm9yd2FyZGluZyBoZWFkZXJzIGluIHRlc3RpbmcvZ3Rlc3QKKy8vIGFuZCB0ZXN0aW5nL2dtb2NrLCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGluY2x1ZGluZyBmaWxlcyBpbgorLy8gdGhpcmRfcGFydHkvZ29vZ2xldGVzdC4KIAotI2RlZmluZSBGUklFTkRfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKLWZyaWVuZCBjbGFzcyB0ZXN0X2Nhc2VfbmFtZSMjXyMjdGVzdF9uYW1lIyNfVGVzdAorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CiAKLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisjZW5kaWYgIC8vIFRFU1RJTkdfR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaCBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc0NGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCi0vLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKLS8vCi0vLyAgIEZsYWcgcmVsYXRlZCBtYWNyb3M6Ci0vLyAgICAgR1RFU1RfRkxBRyhmbGFnX25hbWUpCi0vLyAgICAgR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXyAgLSBEZWZpbmUgdG8gMCB3aGVuIHRoZSBzeXN0ZW0gcHJvdmlkZXMgaXRzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gZmxhZ2ZpbGUgZmxhZyBwYXJzaW5nLgotLy8gICAgIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkKLS8vICAgICBHVEVTVF9ERUNMQVJFX2ludDMyXyhuYW1lKQotLy8gICAgIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKQotLy8gICAgIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8gICAgIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykKLS8vICAgICBHVEVTVF9ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8KLS8vICAgVGVzdCBmaWx0ZXJpbmc6Ci0vLyAgICAgR1RFU1RfVEVTVF9GSUxURVJfRU5WX1ZBUl8gLSBUaGUgbmFtZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaWYgLS1HVEVTVF9GTEFHKHRlc3RfZmlsdGVyKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHByb3ZpZGVkLgotLy8KLS8vICAgTG9nZ2luZzoKLS8vICAgICBHVEVTVF9MT0dfKHNldmVyaXR5KQotLy8gICAgIEdURVNUX0NIRUNLXyhjb25kaXRpb24pCi0vLyAgICAgRnVuY3Rpb25zIExvZ1RvU3RkZXJyKCkgYW5kIEZsdXNoSW5mb0xvZygpIGhhdmUgdG8gYmUgcHJvdmlkZWQgdG9vLgotLy8KLS8vICAgVGhyZWFkaW5nOgotLy8gICAgIEdURVNUX0hBU19OT1RJRklDQVRJT05fIC0gRW5hYmxlZCBpZiBOb3RpZmljYXRpb24gaXMgYWxyZWFkeSBwcm92aWRlZC4KLS8vICAgICBHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8gLSBFbmFibGVkIGlmIE11dGV4IGFuZCBUaHJlYWRMb2NhbCBhcmUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHByb3ZpZGVkLgotLy8gICAgIE11c3QgYWxzbyBwcm92aWRlIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgYW5kCi0vLyAgICAgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpCi0vLwotLy8gICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhsb2NrcykKLS8vICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhsb2NrcykKLS8vCi0vLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QT1JUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BPUlRfSF8KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QT1JUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzFlYTAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBpbmplY3Rpb24gcG9pbnQgZm9yIGN1c3RvbSBwcmludGVycyBpbiBhIGxvY2FsCi0vLyBpbnN0YWxsYXRpb24gb2YgZ1Rlc3QuCi0vLyBJdCB3aWxsIGJlIGluY2x1ZGVkIGZyb20gZ3Rlc3QtcHJpbnRlcnMuaCBhbmQgdGhlIG92ZXJyaWRlcyBpbiB0aGlzIGZpbGUKLS8vIHdpbGwgYmUgdmlzaWJsZSB0byBldmVyeW9uZS4KLS8vIFNlZSBkb2N1bWVudGF0aW9uIGF0IGd0ZXN0L2d0ZXN0LXByaW50ZXJzLmggZm9yIGRldGFpbHMgb24gaG93IHRvIGRlZmluZSBhCi0vLyBjdXN0b20gcHJpbnRlci4KLS8vCi0vLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QUklOVEVSU19IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QUklOVEVSU19IXwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BSSU5URVJTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzQxMmEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCi0vLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKLS8vCi0vLyBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfICAtIFRoZSBuYW1lIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZS4KLS8vCi0vLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9IXwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4ZDcwOC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBpbnRlcm5hbCB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcKLS8vIGRlYXRoIHRlc3RzLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLQotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1RBUkJPQVJECi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCk7Ci0KLS8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KLWNvbnN0IGNoYXIga0RlYXRoVGVzdFN0eWxlRmxhZ1tdID0gImRlYXRoX3Rlc3Rfc3R5bGUiOwotY29uc3QgY2hhciBrRGVhdGhUZXN0VXNlRm9ya1tdID0gImRlYXRoX3Rlc3RfdXNlX2ZvcmsiOwotY29uc3QgY2hhciBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnW10gPSAiaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QiOwotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gRGVhdGhUZXN0IGlzIGEgY2xhc3MgdGhhdCBoaWRlcyBtdWNoIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZQotLy8gR1RFU1RfREVBVEhfVEVTVF8gbWFjcm8uICBJdCBpcyBhYnN0cmFjdDsgaXRzIHN0YXRpYyBDcmVhdGUgbWV0aG9kCi0vLyByZXR1cm5zIGEgY29uY3JldGUgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZSBwcmV2YWlsaW5nIGRlYXRoIHRlc3QKLS8vIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IHRoZSAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgYW5kL29yCi0vLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzLgotCi0vLyBJbiBkZXNjcmliaW5nIHRoZSByZXN1bHRzIG9mIGRlYXRoIHRlc3RzLCB0aGVzZSB0ZXJtcyBhcmUgdXNlZCB3aXRoCi0vLyB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uczoKLS8vCi0vLyBleGl0IHN0YXR1czogIFRoZSBpbnRlZ2VyIGV4aXQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQKLS8vICAgICAgICAgICAgICAgYnkgd2FpdCgyKQotLy8gZXhpdCBjb2RlOiAgICBUaGUgaW50ZWdlciBjb2RlIHBhc3NlZCB0byBleGl0KDMpLCBfZXhpdCgyKSwgb3IKLS8vICAgICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSBtYWluKCkKLWNsYXNzIEdURVNUX0FQSV8gRGVhdGhUZXN0IHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkZXRlcm1pbmluZyB0aGUKLSAgLy8gYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UgZm9yIHRoZSBjdXJyZW50IGRlYXRoIHRlc3Q7IGZvciBleGFtcGxlLAotICAvLyBpZiB0aGUgZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgotICAvLyBUaGUgTGFzdE1lc3NhZ2UgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbW9yZSBkZXRhaWxlZCBtZXNzYWdlIGluIHRoYXQKLSAgLy8gY2FzZS4gIE90aGVyd2lzZSwgdGhlIERlYXRoVGVzdCBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlICJ0ZXN0IgotICAvLyBhcmd1bWVudCBpcyBzZXQuICBJZiB0aGUgZGVhdGggdGVzdCBzaG91bGQgYmUgc2tpcHBlZCwgdGhlIHBvaW50ZXIKLSAgLy8gaXMgc2V0IHRvIE5VTEw7IG90aGVyd2lzZSwgaXQgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3IGNvbmNyZXRlCi0gIC8vIERlYXRoVGVzdCBvYmplY3QgdGhhdCBjb250cm9scyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRlc3QuCi0gIHN0YXRpYyBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKLSAgRGVhdGhUZXN0KCk7Ci0gIHZpcnR1YWwgfkRlYXRoVGVzdCgpIHsgfQotCi0gIC8vIEEgaGVscGVyIGNsYXNzIHRoYXQgYWJvcnRzIGEgZGVhdGggdGVzdCB3aGVuIGl0J3MgZGVsZXRlZC4KLSAgY2xhc3MgUmV0dXJuU2VudGluZWwgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IFJldHVyblNlbnRpbmVsKERlYXRoVGVzdCogdGVzdCkgOiB0ZXN0Xyh0ZXN0KSB7IH0KLSAgICB+UmV0dXJuU2VudGluZWwoKSB7IHRlc3RfLT5BYm9ydChURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQpOyB9Ci0gICBwcml2YXRlOgotICAgIERlYXRoVGVzdCogY29uc3QgdGVzdF87Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSZXR1cm5TZW50aW5lbCk7Ci0gIH0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87Ci0KLSAgLy8gQW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgcm9sZXMgdGhhdCBtYXkgYmUgdGFrZW4gd2hlbiBhIGRlYXRoCi0gIC8vIHRlc3QgaXMgZW5jb3VudGVyZWQuICBFWEVDVVRFIG1lYW5zIHRoYXQgdGhlIGRlYXRoIHRlc3QgbG9naWMgc2hvdWxkCi0gIC8vIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiAgT1ZFUlNFRSBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIHNob3VsZCBwcmVwYXJlCi0gIC8vIHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCBmb3IgYSBjaGlsZCBwcm9jZXNzIHRvIGV4ZWN1dGUgdGhlIGRlYXRoCi0gIC8vIHRlc3QsIHRoZW4gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCi0gIGVudW0gVGVzdFJvbGUgeyBPVkVSU0VFX1RFU1QsIEVYRUNVVEVfVEVTVCB9OwotCi0gIC8vIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB0aHJlZSByZWFzb25zIHRoYXQgYSB0ZXN0IG1pZ2h0IGJlIGFib3J0ZWQuCi0gIGVudW0gQWJvcnRSZWFzb24gewotICAgIFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCwKLSAgICBURVNUX1RIUkVXX0VYQ0VQVElPTiwKLSAgICBURVNUX0RJRF9OT1RfRElFCi0gIH07Ci0KLSAgLy8gQXNzdW1lcyBvbmUgb2YgdGhlIGFib3ZlIHJvbGVzLgotICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKSA9IDA7Ci0KLSAgLy8gV2FpdHMgZm9yIHRoZSBkZWF0aCB0ZXN0IHRvIGZpbmlzaCBhbmQgcmV0dXJucyBpdHMgc3RhdHVzLgotICB2aXJ0dWFsIGludCBXYWl0KCkgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBwYXNzZWQ7IHRoYXQgaXMsIHRoZSB0ZXN0IHByb2Nlc3MKLSAgLy8gZXhpdGVkIGR1cmluZyB0aGUgdGVzdCwgaXRzIGV4aXQgc3RhdHVzIG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkCi0gIC8vIHByZWRpY2F0ZSwgYW5kIGl0cyBzdGRlcnIgb3V0cHV0IG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkIHJlZ3VsYXIKLSAgLy8gZXhwcmVzc2lvbi4KLSAgLy8gVGhlIHVzZXItc3VwcGxpZWQgcHJlZGljYXRlIG1heSBiZSBhIG1hY3JvIGV4cHJlc3Npb24gcmF0aGVyCi0gIC8vIHRoYW4gYSBmdW5jdGlvbiBwb2ludGVyIG9yIGZ1bmN0b3IsIG9yIGVsc2UgV2FpdCBhbmQgUGFzc2VkIGNvdWxkCi0gIC8vIGJlIGNvbWJpbmVkLgotICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgZXhpdF9zdGF0dXNfb2spID0gMDsKLQotICAvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgZGlkIG5vdCBkaWUgYXMgZXhwZWN0ZWQuCi0gIHZpcnR1YWwgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pID0gMDsKLQotICAvLyBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgb3V0Y29tZSBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgb3V0Y29tZSBvZgotICAvLyB0aGUgbGFzdCBkZWF0aCB0ZXN0LgotICBzdGF0aWMgY29uc3QgY2hhciogTGFzdE1lc3NhZ2UoKTsKLQotICBzdGF0aWMgdm9pZCBzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwotCi0gcHJpdmF0ZToKLSAgLy8gQSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvdXRjb21lIG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWF0aFRlc3QpOwotfTsKLQotLy8gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGRlYXRoIHRlc3RzLiAgTWF5IGJlIG1vY2tlZCBvdXQgZm9yIHRlc3RpbmcuCi1jbGFzcyBEZWF0aFRlc3RGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkRlYXRoVGVzdEZhY3RvcnkoKSB7IH0KLSAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgPSAwOwotfTsKLQotLy8gQSBjb25jcmV0ZSBEZWF0aFRlc3RGYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciBub3JtYWwgdXNlLgotY2xhc3MgRGVmYXVsdERlYXRoVGVzdEZhY3RvcnkgOiBwdWJsaWMgRGVhdGhUZXN0RmFjdG9yeSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBleGl0X3N0YXR1cyBkZXNjcmliZXMgYSBwcm9jZXNzIHRoYXQgd2FzIHRlcm1pbmF0ZWQKLS8vIGJ5IGEgc2lnbmFsLCBvciBleGl0ZWQgbm9ybWFsbHkgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlLgotR1RFU1RfQVBJXyBib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cyk7Ci0KLS8vIFRyYXBzIEMrKyBleGNlcHRpb25zIGVzY2FwaW5nIHN0YXRlbWVudCBhbmQgcmVwb3J0cyB0aGVtIGFzIHRlc3QKLS8vIGZhaWx1cmVzLiBOb3RlIHRoYXQgdHJhcHBpbmcgU0VIIGV4Y2VwdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmUuCi0jIGlmIEdURVNUX0hBU19FWENFUFRJT05TCi0jICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCi0gIHRyeSB7IFwKLSAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgfSBjYXRjaCAoY29uc3QgOjpzdGQ6OmV4Y2VwdGlvbiYgZ3Rlc3RfZXhjZXB0aW9uKSB7IFwKLSAgICBmcHJpbnRmKFwKLSAgICAgICAgc3RkZXJyLCBcCi0gICAgICAgICJcbiVzOiBDYXVnaHQgc3RkOjpleGNlcHRpb24tZGVyaXZlZCBleGNlcHRpb24gZXNjYXBpbmcgdGhlICIgXAotICAgICAgICAiZGVhdGggdGVzdCBzdGF0ZW1lbnQuIEV4Y2VwdGlvbiBtZXNzYWdlOiAlc1xuIiwgXAotICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKS5jX3N0cigpLCBcCi0gICAgICAgIGd0ZXN0X2V4Y2VwdGlvbi53aGF0KCkpOyBcCi0gICAgZmZsdXNoKHN0ZGVycik7IFwKLSAgICBkZWF0aF90ZXN0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfVEhSRVdfRVhDRVBUSU9OKTsgXAotICB9IGNhdGNoICguLi4pIHsgXAotICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCi0gIH0KLQotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCi0gIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQotCi0jIGVuZGlmCi0KLS8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlRfREVBVEgqLCBFWFBFQ1RfREVBVEgqLAotLy8gQVNTRVJUX0VYSVQqLCBhbmQgRVhQRUNUX0VYSVQqLgotIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUmIGd0ZXN0X3JlZ2V4ID0gKHJlZ2V4KTsgXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdCogZ3Rlc3RfZHQ7IFwKLSAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6Q3JlYXRlKCNzdGF0ZW1lbnQsICZndGVzdF9yZWdleCwgXAotICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICZndGVzdF9kdCkpIHsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCi0gICAgfSBcCi0gICAgaWYgKGd0ZXN0X2R0ICE9IE5VTEwpIHsgXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0PiBcCi0gICAgICAgICAgZ3Rlc3RfZHRfcHRyKGd0ZXN0X2R0KTsgXAotICAgICAgc3dpdGNoIChndGVzdF9kdC0+QXNzdW1lUm9sZSgpKSB7IFwKLSAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVDogXAotICAgICAgICAgIGlmICghZ3Rlc3RfZHQtPlBhc3NlZChwcmVkaWNhdGUoZ3Rlc3RfZHQtPldhaXQoKSkpKSB7IFwKLSAgICAgICAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAotICAgICAgICAgIH0gXAotICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpFWEVDVVRFX1RFU1Q6IHsgXAotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6UmV0dXJuU2VudGluZWwgXAotICAgICAgICAgICAgICBndGVzdF9zZW50aW5lbChndGVzdF9kdCk7IFwKLSAgICAgICAgICBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGd0ZXN0X2R0KTsgXAotICAgICAgICAgIGd0ZXN0X2R0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfRElEX05PVF9ESUUpOyBcCi0gICAgICAgICAgYnJlYWs7IFwKLSAgICAgICAgfSBcCi0gICAgICAgIGRlZmF1bHQ6IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgfSBcCi0gICAgfSBcCi0gIH0gZWxzZSBcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTogXAotICAgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkpCi0vLyBUaGUgc3ltYm9sICJmYWlsIiBoZXJlIGV4cGFuZHMgdG8gc29tZXRoaW5nIGludG8gd2hpY2ggYSBtZXNzYWdlCi0vLyBjYW4gYmUgc3RyZWFtZWQuCi0KLS8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlQvRVhQRUNUX0RFQlVHX0RFQVRIIHdoZW4gY29tcGlsZWQgaW4KLS8vIE5ERUJVRyBtb2RlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0aGUgc3RhdGVtZW50cyB0byBiZSBleGVjdXRlZCwgdGhlIHJlZ2V4IGlzCi0vLyBpZ25vcmVkLCBhbmQgdGhlIG1hY3JvIG11c3QgYWNjZXB0IGEgc3RyZWFtZWQgbWVzc2FnZSBldmVuIHRob3VnaCB0aGUgbWVzc2FnZQotLy8gaXMgbmV2ZXIgcHJpbnRlZC4KLSMgZGVmaW5lIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAotICB9IGVsc2UgXAotICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCi0KLS8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgY29udGVudHMgb2YgdGhlCi0vLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsIGFzIGl0IGV4aXN0ZWQgd2hlbgotLy8gUlVOX0FMTF9URVNUUyB3YXMgY2FsbGVkLgotY2xhc3MgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIHsKLSBwdWJsaWM6Ci0gIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhjb25zdCBzdGQ6OnN0cmluZyYgYV9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX3dyaXRlX2ZkKQotICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBpbmRleF8oYW5faW5kZXgpLAotICAgICAgICB3cml0ZV9mZF8oYV93cml0ZV9mZCkge30KLQotICB+SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgewotICAgIGlmICh3cml0ZV9mZF8gPj0gMCkKLSAgICAgIHBvc2l4OjpDbG9zZSh3cml0ZV9mZF8pOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQotICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVfOyB9Ci0gIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4XzsgfQotICBpbnQgd3JpdGVfZmQoKSBjb25zdCB7IHJldHVybiB3cml0ZV9mZF87IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGZpbGVfOwotICBpbnQgbGluZV87Ci0gIGludCBpbmRleF87Ci0gIGludCB3cml0ZV9mZF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcpOwotfTsKLQotLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcwotLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgotLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgotSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpOwotCi0jZWxzZSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgbWFjcm9zIHN1Y2ggYXMKLS8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgYW5kIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgb24gc3lzdGVtcyB3aGVyZQotLy8gZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRob3NlIG1hY3JvcyBtdXN0IGNvbXBpbGUgb24gc3VjaCBzeXN0ZW1zCi0vLyBpZmYgRVhQRUNUX0RFQVRIIGFuZCBBU1NFUlRfREVBVEggY29tcGlsZSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb24KLS8vIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRlYXRoIHRlc3RzLiBUaGlzIGFsbG93cyBvbmUgdG8gd3JpdGUgc3VjaCBhIG1hY3JvCi0vLyBvbiBhIHN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgYW5kIGJlIHN1cmUgdGhhdCBpdCB3aWxsCi0vLyBjb21waWxlIG9uIGEgZGVhdGgtdGVzdCBzdXBwb3J0aW5nIHN5c3RlbS4KLS8vCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBzdGF0ZW1lbnQgLSAgQSBzdGF0ZW1lbnQgdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHRlc3QKLS8vICAgICAgICAgICAgICAgIGZvciBwcm9ncmFtIHRlcm1pbmF0aW9uLiBUaGlzIG1hY3JvIGhhcyB0byBtYWtlIHN1cmUgdGhpcwotLy8gICAgICAgICAgICAgICAgc3RhdGVtZW50IGlzIGNvbXBpbGVkIGJ1dCBub3QgZXhlY3V0ZWQsIHRvIGVuc3VyZSB0aGF0Ci0vLyAgICAgICAgICAgICAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEIGNvbXBpbGVzIHdpdGggYSBjZXJ0YWluCi0vLyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaWZmIEVYUEVDVF9ERUFUSCBjb21waWxlcyB3aXRoIGl0LgotLy8gICByZWdleCAgICAgLSAgQSByZWdleCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdXNlIHRvIHRlc3QKLS8vICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2Ygc3RhdGVtZW50LiAgVGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlCi0vLyAgICAgICAgICAgICAgICBjb21waWxlZCBidXQgbm90IGV2YWx1YXRlZCBieSB0aGlzIG1hY3JvLCB0byBlbnN1cmUgdGhhdAotLy8gICAgICAgICAgICAgICAgdGhpcyBtYWNybyBvbmx5IGFjY2VwdHMgZXhwcmVzc2lvbnMgdGhhdCBhIG1hY3JvIHN1Y2ggYXMKLS8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSCB3b3VsZCBhY2NlcHQuCi0vLyAgIHRlcm1pbmF0b3IgLSBNdXN0IGJlIGFuIGVtcHR5IHN0YXRlbWVudCBmb3IgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRAotLy8gICAgICAgICAgICAgICAgYW5kIGEgcmV0dXJuIHN0YXRlbWVudCBmb3IgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRC4KLS8vICAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgd2lsbCBub3QKLS8vICAgICAgICAgICAgICAgIGNvbXBpbGUgaW5zaWRlIGZ1bmN0aW9ucyB3aGVyZSBBU1NFUlRfREVBVEggZG9lc24ndAotLy8gICAgICAgICAgICAgICAgY29tcGlsZS4KLS8vCi0vLyAgVGhlIGJyYW5jaCB0aGF0IGhhcyBhbiBhbHdheXMgZmFsc2UgY29uZGl0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLS8vICBzdGF0ZW1lbnQgYW5kIHJlZ2V4IGFyZSBjb21waWxlZCAoYW5kIHRodXMgc3ludGFjdGljYWxseSBjb3JyZWN0KSBidXQKLS8vICBuZXZlciBleGVjdXRlZC4gVGhlIHVucmVhY2hhYmxlIGNvZGUgbWFjcm8gcHJvdGVjdHMgdGhlIHRlcm1pbmF0b3IKLS8vICBzdGF0ZW1lbnQgZnJvbSBnZW5lcmF0aW5nIGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGluIGNhc2UKLS8vICBzdGF0ZW1lbnQgdW5jb25kaXRpb25hbGx5IHJldHVybnMgb3IgdGhyb3dzLiBUaGUgTWVzc2FnZSBjb25zdHJ1Y3RvciBhdAotLy8gIHRoZSBlbmQgYWxsb3dzIHRoZSBzeW50YXggb2Ygc3RyZWFtaW5nIGFkZGl0aW9uYWwgbWVzc2FnZXMgaW50byB0aGUKLS8vICBtYWNybywgZm9yIGNvbXBpbGF0aW9uYWwgY29tcGF0aWJpbGl0eSB3aXRoIEVYUEVDVF9ERUFUSC9BU1NFUlRfREVBVEguCi0jIGRlZmluZSBHVEVTVF9VTlNVUFBPUlRFRF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHJlZ2V4LCB0ZXJtaW5hdG9yKSBcCi0gICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAotICAgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSBcCi0gICAgICAgICAgPDwgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uXG4iIFwKLSAgICAgICAgICA8PCAiU3RhdGVtZW50ICciICNzdGF0ZW1lbnQgIicgY2Fubm90IGJlIHZlcmlmaWVkLiI7IFwKLSAgICB9IGVsc2UgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpIHsgXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkU6OlBhcnRpYWxNYXRjaCgiLioiLCAocmVnZXgpKTsgXAotICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCi0gICAgICB0ZXJtaW5hdG9yOyBcCi0gICAgfSBlbHNlIFwKLSAgICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExM2I0Yi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCi0vLwotLy8gR29vZ2xlIFRlc3QgZmlsZXBhdGggdXRpbGl0aWVzCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotLy8KLS8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgaW4gPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgotLy8gRG8gbm90IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBzZXBhcmF0ZWx5IQotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEZpbGVQYXRoIC0gYSBjbGFzcyBmb3IgZmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhuYW1lIG1hbmlwdWxhdGlvbiB3aGljaAotLy8gaGFuZGxlcyBwbGF0Zm9ybS1zcGVjaWZpYyBjb252ZW50aW9ucyAobGlrZSB0aGUgcGF0aG5hbWUgc2VwYXJhdG9yKS4KLS8vIFVzZWQgZm9yIGhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KLS8vIEV4Y2VwdCBmb3IgU2V0IG1ldGhvZHMsIGFsbCBtZXRob2RzIGFyZSBjb25zdCBvciBzdGF0aWMsIHdoaWNoIHByb3ZpZGVzIGFuCi0vLyAiaW1tdXRhYmxlIHZhbHVlIG9iamVjdCIgLS0gdXNlZnVsIGZvciBwZWFjZSBvZiBtaW5kLgotLy8gQSBGaWxlUGF0aCB3aXRoIGEgdmFsdWUgZW5kaW5nIGluIGEgcGF0aCBzZXBhcmF0b3IgKCJsaWtlL3RoaXMvIikgcmVwcmVzZW50cwotLy8gYSBkaXJlY3RvcnksIG90aGVyd2lzZSBpdCBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhIGZpbGUuIEluIGVpdGhlciBjYXNlLAotLy8gaXQgbWF5IG9yIG1heSBub3QgcmVwcmVzZW50IGFuIGFjdHVhbCBmaWxlIG9yIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0vLyBOYW1lcyBhcmUgTk9UIGNoZWNrZWQgZm9yIHN5bnRheCBjb3JyZWN0bmVzcyAtLSBubyBjaGVja2luZyBmb3IgaWxsZWdhbAotLy8gY2hhcmFjdGVycywgbWFsZm9ybWVkIHBhdGhzLCBldGMuCi0KLWNsYXNzIEdURVNUX0FQSV8gRmlsZVBhdGggewotIHB1YmxpYzoKLSAgRmlsZVBhdGgoKSA6IHBhdGhuYW1lXygiIikgeyB9Ci0gIEZpbGVQYXRoKGNvbnN0IEZpbGVQYXRoJiByaHMpIDogcGF0aG5hbWVfKHJocy5wYXRobmFtZV8pIHsgfQotCi0gIGV4cGxpY2l0IEZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRobmFtZSkgOiBwYXRobmFtZV8ocGF0aG5hbWUpIHsKLSAgICBOb3JtYWxpemUoKTsKLSAgfQotCi0gIEZpbGVQYXRoJiBvcGVyYXRvcj0oY29uc3QgRmlsZVBhdGgmIHJocykgewotICAgIFNldChyaHMpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgU2V0KGNvbnN0IEZpbGVQYXRoJiByaHMpIHsKLSAgICBwYXRobmFtZV8gPSByaHMucGF0aG5hbWVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXzsgfQotICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgotICBzdGF0aWMgRmlsZVBhdGggR2V0Q3VycmVudERpcigpOwotCi0gIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCi0gIC8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgotICAvLyB0aGFuIHplcm8gKGUuZy4sIDEyKSwgcmV0dXJucyAiZGlyL3Rlc3RfMTIueG1sIi4KLSAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KLSAgc3RhdGljIEZpbGVQYXRoIE1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOwotCi0gIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwKLSAgLy8gcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KLSAgLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KLSAgc3RhdGljIEZpbGVQYXRoIENvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCk7Ci0KLSAgLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQotICAvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCi0gIC8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uCi0gIC8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAotICAvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0gIC8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuCi0gIC8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKLSAgLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KLSAgc3RhdGljIEZpbGVQYXRoIEdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBwYXRoIGlzICIiLgotICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uZW1wdHkoKTsgfQotCi0gIC8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlcyBpdCBhbmQgcmV0dXJucwotICAvLyB0aGUgbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KLSAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KLSAgRmlsZVBhdGggUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCi0gIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucwotICAvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKLSAgLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKLSAgLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotICBGaWxlUGF0aCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3Q7Ci0KLSAgLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KLSAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgotICAvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCi0gIC8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCi0gIC8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotICBGaWxlUGF0aCBSZW1vdmVGaWxlTmFtZSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgotICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zCi0gIC8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAotICAvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgotICBGaWxlUGF0aCBSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdDsKLQotICAvLyBDcmVhdGVzIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCi0gIC8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUKLSAgLy8gZGlyZWN0b3JpZXMgZm9yIGFueSByZWFzb24uIFdpbGwgYWxzbyByZXR1cm4gZmFsc2UgaWYgdGhlIEZpbGVQYXRoIGRvZXMKLSAgLy8gbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeSAodGhhdCBpcywgaXQgZG9lc24ndCBlbmQgd2l0aCBhIHBhdGggc2VwYXJhdG9yKS4KLSAgYm9vbCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3Q7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKLSAgLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQotICAvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAotICAvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KLSAgYm9vbCBDcmVhdGVGb2xkZXIoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZGVzY3JpYmVzIHNvbWV0aGluZyBpbiB0aGUgZmlsZS1zeXN0ZW0sCi0gIC8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIsIGFuZCB0aGF0IHNvbWV0aGluZyBleGlzdHMuCi0gIGJvb2wgRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KLSAgLy8gdGhhdCBleGlzdHMuCi0gIGJvb2wgRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAotICAvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgotICAvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KLSAgYm9vbCBJc0RpcmVjdG9yeSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQotICAvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCi0gIGJvb2wgSXNSb290RGlyZWN0b3J5KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgotICBib29sIElzQWJzb2x1dGVQYXRoKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAvLyBSZXBsYWNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIHdpdGggYSBzaW5nbGUgc2VwYXJhdG9yLgotICAvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgotICAvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KLSAgLy8KLSAgLy8gQSBwYXRobmFtZSB3aXRoIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgbWF5IG9jY3VyIGVpdGhlciB0aHJvdWdoCi0gIC8vIHVzZXIgZXJyb3Igb3IgYXMgYSByZXN1bHQgb2Ygc29tZSBzY3JpcHRzIG9yIEFQSXMgdGhhdCBnZW5lcmF0ZSBhIHBhdGhuYW1lCi0gIC8vIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IuIE9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc2FtZSBBUEkgb3Igc2NyaXB0Ci0gIC8vIG1heSBOT1QgZ2VuZXJhdGUgYSBwYXRobmFtZSB3aXRoIGEgdHJhaWxpbmcgIi8iLiBUaGVuIGVsc2V3aGVyZSB0aGF0Ci0gIC8vIHBhdGhuYW1lIG1heSBoYXZlIGFub3RoZXIgIi8iIGFuZCBwYXRobmFtZSBjb21wb25lbnRzIGFkZGVkIHRvIGl0LAotICAvLyB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2VwYXJhdG9yIGFscmVhZHkgYmVpbmcgdGhlcmUuCi0gIC8vIFRoZSBzY3JpcHQgbGFuZ3VhZ2UgYW5kIG9wZXJhdGluZyBzeXN0ZW0gbWF5IGFsbG93IHBhdGhzIGxpa2UgImZvby8vYmFyIgotICAvLyBidXQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGluIEZpbGVQYXRoIHdpbGwgbm90IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4gSW4KLSAgLy8gcGFydGljdWxhciwgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgb25seSByZW1vdmVzIG9uZSBzZXBhcmF0b3IsIGFuZAotICAvLyBpdCBpcyBjYWxsZWQgaW4gQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBjaGFuZ2UKLSAgLy8gYSBwYXRobmFtZSBmcm9tIGRpcmVjdG9yeSBzeW50YXggKHRyYWlsaW5nIHNlcGFyYXRvcikgdG8gZmlsZW5hbWUgc3ludGF4LgotICAvLwotICAvLyBPbiBXaW5kb3dzIHRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvciAnLycgd2l0aAotICAvLyB0aGUgcHJpbWFyeSBwYXRoIHNlcGFyYXRvciAnXFwnLCBzbyB0aGF0IGZvciBleGFtcGxlICJiYXJcXC9cXGZvbyIgYmVjb21lcwotICAvLyAiYmFyXFxmb28iLgotCi0gIHZvaWQgTm9ybWFsaXplKCk7Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KLSAgLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAotICAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgotICBjb25zdCBjaGFyKiBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdDsKLQotICBzdGQ6OnN0cmluZyBwYXRobmFtZV87Ci19OyAgLy8gY2xhc3MgRmlsZVBhdGgKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDU3OGMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgR1RFU1RfT1NfTElOVVgKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0jIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNlbmRpZgotCi0jaWYgIUdURVNUX09TX1NUQVJCT0FSRAotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZiAgLy8gIUdURVNUX09TX1NUQVJCT0FSRAotCi0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgiCi0KLS8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8KLS8vIGNvbmNhdGVuYXRlIHR3byB0b2tlbnMgd2hlbiBvbmUgb2YgdGhlbSBpcyBfX0xJTkVfXy4gIFdyaXRpbmcKLS8vCi0vLyAgIGZvbyAjIyBfX0xJTkVfXwotLy8KLS8vIHdpbGwgcmVzdWx0IGluIHRoZSB0b2tlbiBmb29fX0xJTkVfXywgaW5zdGVhZCBvZiBmb28gZm9sbG93ZWQgYnkKLS8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlCi0vLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL21pc2MtdGVjaG5pY2FsLWlzc3Vlcy5odG1sI2ZhcS0zOS42Ci0jZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl8oZm9vLCBiYXIpIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikKLSNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyCi0KLWNsYXNzIFByb3RvY29sTWVzc2FnZTsKLW5hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0KLWNsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uCi1jbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmFpbHVyZSBtZXNzYWdlLgotY2xhc3MgVGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIHRlc3QuCi1jbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuCi1jbGFzcyBUZXN0UGFydFJlc3VsdDsgICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYSB0ZXN0IHBhcnQuCi1jbGFzcyBVbml0VGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci06OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgotY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCi1jbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KLWNsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAotCi0vLyBUaGUgdGV4dCB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIHRoZQotLy8gc3RhY2sgdHJhY2UuCi1HVEVTVF9BUElfIGV4dGVybiBjb25zdCBjaGFyIGtTdGFja1RyYWNlTWFya2VyW107Ci0KLS8vIFR3byBvdmVybG9hZGVkIGhlbHBlcnMgZm9yIGNoZWNraW5nIGF0IGNvbXBpbGUgdGltZSB3aGV0aGVyIGFuCi0vLyBleHByZXNzaW9uIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQKLS8vIGNvbXBpbGUtdGltZSBpbnRlZ3JhbCBjb25zdGFudCkuICBUaGVpciByZXR1cm4gdmFsdWVzIGhhdmUKLS8vIGRpZmZlcmVudCBzaXplcywgc28gd2UgY2FuIHVzZSBzaXplb2YoKSB0byB0ZXN0IHdoaWNoIHZlcnNpb24gaXMKLS8vIHBpY2tlZCBieSB0aGUgY29tcGlsZXIuICBUaGVzZSBoZWxwZXJzIGhhdmUgbm8gaW1wbGVtZW50YXRpb25zLCBhcwotLy8gd2Ugb25seSBuZWVkIHRoZWlyIHNpZ25hdHVyZXMuCi0vLwotLy8gR2l2ZW4gSXNOdWxsTGl0ZXJhbEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QKLS8vIHZlcnNpb24gaWYgeCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gU2VjcmV0KiwgYW5kIHBpY2sgdGhlCi0vLyBzZWNvbmQgdmVyc2lvbiBvdGhlcndpc2UuICBTaW5jZSBTZWNyZXQgaXMgYSBzZWNyZXQgYW5kIGluY29tcGxldGUKLS8vIHR5cGUsIHRoZSBvbmx5IGV4cHJlc3Npb24gYSB1c2VyIGNhbiB3cml0ZSB0aGF0IGhhcyB0eXBlIFNlY3JldCogaXMKLS8vIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGVyZWZvcmUsIHdlIGtub3cgdGhhdCB4IGlzIGEgbnVsbAotLy8gcG9pbnRlciBsaXRlcmFsIGlmIGFuZCBvbmx5IGlmIHRoZSBmaXJzdCB2ZXJzaW9uIGlzIHBpY2tlZCBieSB0aGUKLS8vIGNvbXBpbGVyLgotY2hhciBJc051bGxMaXRlcmFsSGVscGVyKFNlY3JldCogcCk7Ci1jaGFyICgmSXNOdWxsTGl0ZXJhbEhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAotCi0vLyBBIGNvbXBpbGUtdGltZSBib29sIGNvbnN0YW50IHRoYXQgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB4IGlzIGEKLS8vIG51bGwgcG9pbnRlciBsaXRlcmFsIChpLmUuIE5VTEwgb3IgYW55IDAtdmFsdWVkIGNvbXBpbGUtdGltZQotLy8gaW50ZWdyYWwgY29uc3RhbnQpLgotI2lmZGVmIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KLS8vIFdlIGxvc2Ugc3VwcG9ydCBmb3IgTlVMTCBkZXRlY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZQotLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4KLSMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgZmFsc2UKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIFwKLSAgICAoc2l6ZW9mKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzTnVsbExpdGVyYWxIZWxwZXIoeCkpID09IDEpCi0jZW5kaWYgIC8vIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KLQotLy8gQXBwZW5kcyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlIHRvIHRoZSBHb29nbGUtVGVzdC1nZW5lcmF0ZWQgbWVzc2FnZS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGd0ZXN0X21zZywgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpOwotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGJ5IChhbmQgb25seSBieSkgYSBmYWlsZWQgR29vZ2xlIFRlc3QKLS8vIGFzc2VydGlvbiB3aGVuIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgaXMgdHJ1ZSAoaWYgZXhjZXB0aW9ucwotLy8gYXJlIGVuYWJsZWQpLiAgV2UgZGVyaXZlIGl0IGZyb20gc3RkOjpydW50aW1lX2Vycm9yLCB3aGljaCBpcyBmb3IKLS8vIGVycm9ycyBwcmVzdW1hYmx5IGRldGVjdGFibGUgb25seSBhdCBydW4gdGltZS4gIFNpbmNlCi0vLyBzdGQ6OnJ1bnRpbWVfZXJyb3IgaW5oZXJpdHMgZnJvbSBzdGQ6OmV4Y2VwdGlvbiwgbWFueSB0ZXN0aW5nCi0vLyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZSBtZXNzYWdlIGluc2lkZSBpdC4KLWNsYXNzIEdURVNUX0FQSV8gR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24gOiBwdWJsaWMgOjpzdGQ6OnJ1bnRpbWVfZXJyb3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24oY29uc3QgVGVzdFBhcnRSZXN1bHQmIGZhaWx1cmUpOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBBIGhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgc2NvcGVkIHRyYWNlcyBpbiB1c2VyIHByb2dyYW1zLgotY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRUcmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgYyd0b3IgcHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvCi0gIC8vIGEgdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KLSAgU2NvcGVkVHJhY2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi0gIC8vIFRoZSBkJ3RvciBwb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB0aGUgZCd0b3IgaXMgbm90IHZpcnR1YWwgaW4gb3JkZXIgdG8gYmUgZWZmaWNpZW50LgotICAvLyBEb24ndCBpbmhlcml0IGZyb20gU2NvcGVkVHJhY2UhCi0gIH5TY29wZWRUcmFjZSgpOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRUcmFjZSk7Ci19IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOyAgLy8gQSBTY29wZWRUcmFjZSBvYmplY3QgZG9lcyBpdHMgam9iIGluIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMndG9yIGFuZCBkJ3Rvci4gIFRoZXJlZm9yZSBpdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBiZSB1c2VkIG90aGVyd2lzZS4KLQotbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2UgewotLy8gUmV0dXJucyB0aGUgb3B0aW1hbCBlZGl0cyB0byBnbyBmcm9tICdsZWZ0JyB0byAncmlnaHQnLgotLy8gQWxsIGVkaXRzIGNvc3QgdGhlIHNhbWUsIHdpdGggcmVwbGFjZSBoYXZpbmcgbG93ZXIgcHJpb3JpdHkgdGhhbgotLy8gYWRkL3JlbW92ZS4KLS8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV2FnbmVy4oCTRmlzY2hlciBhbGdvcml0aG0uCi0vLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XYWduZXItRmlzY2hlcl9hbGdvcml0aG0KLWVudW0gRWRpdFR5cGUgeyBrTWF0Y2gsIGtBZGQsIGtSZW1vdmUsIGtSZXBsYWNlIH07Ci1HVEVTVF9BUElfIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgbGVmdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgcmlnaHQpOwotCi0vLyBTYW1lIGFzIGFib3ZlLCBidXQgdGhlIGlucHV0IGlzIHJlcHJlc2VudGVkIGFzIHN0cmluZ3MuCi1HVEVTVF9BUElfIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsZWZ0LAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmlnaHQpOwotCi0vLyBDcmVhdGUgYSBkaWZmIG9mIHRoZSBpbnB1dCBzdHJpbmdzIGluIFVuaWZpZWQgZGlmZiBmb3JtYXQuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIENyZWF0ZVVuaWZpZWREaWZmKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnRleHQgPSAyKTsKLQotfSAgLy8gbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2UKLQotLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gJ2xlZnQnIGFuZCAncmlnaHQnIGFuZCByZXR1cm4gaXQgaW4gdW5pZmllZCBkaWZmCi0vLyBmb3JtYXQuCi0vLyBJZiBub3QgbnVsbCwgc3RvcmVzIGluICd0b3RhbF9saW5lX2NvdW50JyB0aGUgdG90YWwgbnVtYmVyIG9mIGxpbmVzIGZvdW5kCi0vLyBpbiBsZWZ0ICsgcmlnaHQuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIERpZmZTdHJpbmdzKGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogdG90YWxfbGluZV9jb3VudCk7Ci0KLS8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgotLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KLS8vCi0vLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCi0vLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCi0vLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6Ci0vLwotLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgotLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgotLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKLS8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCi0vLwotLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQotLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKLS8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFjdHVhbF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpOwotCi0vLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAotICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKLSAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCi0gICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKLSAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpOwotCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHJlcHJlc2VudHMgYW4gSUVFRSBmbG9hdGluZy1wb2ludCBudW1iZXIKLS8vIChlaXRoZXIgc2luZ2xlLXByZWNpc2lvbiBvciBkb3VibGUtcHJlY2lzaW9uLCBkZXBlbmRpbmcgb24gdGhlCi0vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGRvIG1vcmUgc29waGlzdGljYXRlZCBudW1iZXIKLS8vIGNvbXBhcmlzb24uICAoRHVlIHRvIHJvdW5kLW9mZiBlcnJvciwgZXRjLCBpdCdzIHZlcnkgdW5saWtlbHkgdGhhdAotLy8gdHdvIGZsb2F0aW5nLXBvaW50cyB3aWxsIGJlIGVxdWFsIGV4YWN0bHkuICBIZW5jZSBhIG5haXZlCi0vLyBjb21wYXJpc29uIGJ5IHRoZSA9PSBvcGVyYXRpb24gb2Z0ZW4gZG9lc24ndCB3b3JrLikKLS8vCi0vLyBGb3JtYXQgb2YgSUVFRSBmbG9hdGluZy1wb2ludDoKLS8vCi0vLyAgIFRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBiZWluZyB0aGUgbGVmdG1vc3QsIGFuIElFRUUKLS8vICAgZmxvYXRpbmctcG9pbnQgbG9va3MgbGlrZQotLy8KLS8vICAgICBzaWduX2JpdCBleHBvbmVudF9iaXRzIGZyYWN0aW9uX2JpdHMKLS8vCi0vLyAgIEhlcmUsIHNpZ25fYml0IGlzIGEgc2luZ2xlIGJpdCB0aGF0IGRlc2lnbmF0ZXMgdGhlIHNpZ24gb2YgdGhlCi0vLyAgIG51bWJlci4KLS8vCi0vLyAgIEZvciBmbG9hdCwgdGhlcmUgYXJlIDggZXhwb25lbnQgYml0cyBhbmQgMjMgZnJhY3Rpb24gYml0cy4KLS8vCi0vLyAgIEZvciBkb3VibGUsIHRoZXJlIGFyZSAxMSBleHBvbmVudCBiaXRzIGFuZCA1MiBmcmFjdGlvbiBiaXRzLgotLy8KLS8vICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBhdAotLy8gICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lFRUVfZmxvYXRpbmctcG9pbnRfc3RhbmRhcmQuCi0vLwotLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgotLy8KLS8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Ci1jbGFzcyBGbG9hdGluZ1BvaW50IHsKLSBwdWJsaWM6Ci0gIC8vIERlZmluZXMgdGhlIHVuc2lnbmVkIGludGVnZXIgdHlwZSB0aGF0IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZQotICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZVdpdGhTaXplPHNpemVvZihSYXdUeXBlKT46OlVJbnQgQml0czsKLQotICAvLyBDb25zdGFudHMuCi0KLSAgLy8gIyBvZiBiaXRzIGluIGEgbnVtYmVyLgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRDb3VudCA9IDgqc2l6ZW9mKFJhd1R5cGUpOwotCi0gIC8vICMgb2YgZnJhY3Rpb24gYml0cyBpbiBhIG51bWJlci4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhY3Rpb25CaXRDb3VudCA9Ci0gICAgc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzIC0gMTsKLQotICAvLyAjIG9mIGV4cG9uZW50IGJpdHMgaW4gYSBudW1iZXIuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0V4cG9uZW50Qml0Q291bnQgPSBrQml0Q291bnQgLSAxIC0ga0ZyYWN0aW9uQml0Q291bnQ7Ci0KLSAgLy8gVGhlIG1hc2sgZm9yIHRoZSBzaWduIGJpdC4KLSAgc3RhdGljIGNvbnN0IEJpdHMga1NpZ25CaXRNYXNrID0gc3RhdGljX2Nhc3Q8Qml0cz4oMSkgPDwgKGtCaXRDb3VudCAtIDEpOwotCi0gIC8vIFRoZSBtYXNrIGZvciB0aGUgZnJhY3Rpb24gYml0cy4KLSAgc3RhdGljIGNvbnN0IEJpdHMga0ZyYWN0aW9uQml0TWFzayA9Ci0gICAgfnN0YXRpY19jYXN0PEJpdHM+KDApID4+IChrRXhwb25lbnRCaXRDb3VudCArIDEpOwotCi0gIC8vIFRoZSBtYXNrIGZvciB0aGUgZXhwb25lbnQgYml0cy4KLSAgc3RhdGljIGNvbnN0IEJpdHMga0V4cG9uZW50Qml0TWFzayA9IH4oa1NpZ25CaXRNYXNrIHwga0ZyYWN0aW9uQml0TWFzayk7Ci0KLSAgLy8gSG93IG1hbnkgVUxQJ3MgKFVuaXRzIGluIHRoZSBMYXN0IFBsYWNlKSB3ZSB3YW50IHRvIHRvbGVyYXRlIHdoZW4KLSAgLy8gY29tcGFyaW5nIHR3byBudW1iZXJzLiAgVGhlIGxhcmdlciB0aGUgdmFsdWUsIHRoZSBtb3JlIGVycm9yIHdlCi0gIC8vIGFsbG93LiAgQSAwIHZhbHVlIG1lYW5zIHRoYXQgdHdvIG51bWJlcnMgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lCi0gIC8vIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwuCi0gIC8vCi0gIC8vIFRoZSBtYXhpbXVtIGVycm9yIG9mIGEgc2luZ2xlIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbiBpcyAwLjUKLSAgLy8gdW5pdHMgaW4gdGhlIGxhc3QgcGxhY2UuICBPbiBJbnRlbCBDUFUncywgYWxsIGZsb2F0aW5nLXBvaW50Ci0gIC8vIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSB3aXRoIDgwLWJpdCBwcmVjaXNpb24sIHdoaWxlIGRvdWJsZSBoYXMgNjQKLSAgLy8gYml0cy4gIFRoZXJlZm9yZSwgNCBzaG91bGQgYmUgZW5vdWdoIGZvciBvcmRpbmFyeSB1c2UuCi0gIC8vCi0gIC8vIFNlZSB0aGUgZm9sbG93aW5nIGFydGljbGUgZm9yIG1vcmUgZGV0YWlscyBvbiBVTFA6Ci0gIC8vIGh0dHA6Ly9yYW5kb21hc2NpaS53b3JkcHJlc3MuY29tLzIwMTIvMDIvMjUvY29tcGFyaW5nLWZsb2F0aW5nLXBvaW50LW51bWJlcnMtMjAxMi1lZGl0aW9uLwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVbHBzID0gNDsKLQotICAvLyBDb25zdHJ1Y3RzIGEgRmxvYXRpbmdQb2ludCBmcm9tIGEgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgLy8KLSAgLy8gT24gYW4gSW50ZWwgQ1BVLCBwYXNzaW5nIGEgbm9uLW5vcm1hbGl6ZWQgTkFOIChOb3QgYSBOdW1iZXIpCi0gIC8vIGFyb3VuZCBtYXkgY2hhbmdlIGl0cyBiaXRzLCBhbHRob3VnaCB0aGUgbmV3IHZhbHVlIGlzIGd1YXJhbnRlZWQKLSAgLy8gdG8gYmUgYWxzbyBhIE5BTi4gIFRoZXJlZm9yZSwgZG9uJ3QgZXhwZWN0IHRoaXMgY29uc3RydWN0b3IgdG8KLSAgLy8gcHJlc2VydmUgdGhlIGJpdHMgaW4geCB3aGVuIHggaXMgYSBOQU4uCi0gIGV4cGxpY2l0IEZsb2F0aW5nUG9pbnQoY29uc3QgUmF3VHlwZSYgeCkgeyB1Xy52YWx1ZV8gPSB4OyB9Ci0KLSAgLy8gU3RhdGljIG1ldGhvZHMKLQotICAvLyBSZWludGVycHJldHMgYSBiaXQgcGF0dGVybiBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgLy8KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gdGVzdCB0aGUgQWxtb3N0RXF1YWxzKCkgbWV0aG9kLgotICBzdGF0aWMgUmF3VHlwZSBSZWludGVycHJldEJpdHMoY29uc3QgQml0cyBiaXRzKSB7Ci0gICAgRmxvYXRpbmdQb2ludCBmcCgwKTsKLSAgICBmcC51Xy5iaXRzXyA9IGJpdHM7Ci0gICAgcmV0dXJuIGZwLnVfLnZhbHVlXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGZsb2F0aW5nLXBvaW50IG51bWJlciB0aGF0IHJlcHJlc2VudCBwb3NpdGl2ZSBpbmZpbml0eS4KLSAgc3RhdGljIFJhd1R5cGUgSW5maW5pdHkoKSB7Ci0gICAgcmV0dXJuIFJlaW50ZXJwcmV0Qml0cyhrRXhwb25lbnRCaXRNYXNrKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICBzdGF0aWMgUmF3VHlwZSBNYXgoKTsKLQotICAvLyBOb24tc3RhdGljIG1ldGhvZHMKLQotICAvLyBSZXR1cm5zIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50cyB0aGlzIG51bWJlci4KLSAgY29uc3QgQml0cyAmYml0cygpIGNvbnN0IHsgcmV0dXJuIHVfLmJpdHNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGlzIG51bWJlci4KLSAgQml0cyBleHBvbmVudF9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0V4cG9uZW50Qml0TWFzayAmIHVfLmJpdHNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGlzIG51bWJlci4KLSAgQml0cyBmcmFjdGlvbl9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0ZyYWN0aW9uQml0TWFzayAmIHVfLmJpdHNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2lnbiBiaXQgb2YgdGhpcyBudW1iZXIuCi0gIEJpdHMgc2lnbl9iaXQoKSBjb25zdCB7IHJldHVybiBrU2lnbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBOQU4gKG5vdCBhIG51bWJlcikuCi0gIGJvb2wgaXNfbmFuKCkgY29uc3QgewotICAgIC8vIEl0J3MgYSBOQU4gaWYgdGhlIGV4cG9uZW50IGJpdHMgYXJlIGFsbCBvbmVzIGFuZCB0aGUgZnJhY3Rpb24KLSAgICAvLyBiaXRzIGFyZSBub3QgZW50aXJlbHkgemVyb3MuCi0gICAgcmV0dXJuIChleHBvbmVudF9iaXRzKCkgPT0ga0V4cG9uZW50Qml0TWFzaykgJiYgKGZyYWN0aW9uX2JpdHMoKSAhPSAwKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBudW1iZXIgaXMgYXQgbW9zdCBrTWF4VWxwcyBVTFAncyBhd2F5IGZyb20KLSAgLy8gcmhzLiAgSW4gcGFydGljdWxhciwgdGhpcyBmdW5jdGlvbjoKLSAgLy8KLSAgLy8gICAtIHJldHVybnMgZmFsc2UgaWYgZWl0aGVyIG51bWJlciBpcyAob3IgYm90aCBhcmUpIE5BTi4KLSAgLy8gICAtIHRyZWF0cyByZWFsbHkgbGFyZ2UgbnVtYmVycyBhcyBhbG1vc3QgZXF1YWwgdG8gaW5maW5pdHkuCi0gIC8vICAgLSB0aGlua3MgKzAuMCBhbmQgLTAuMCBhcmUgMCBETFAncyBhcGFydC4KLSAgYm9vbCBBbG1vc3RFcXVhbHMoY29uc3QgRmxvYXRpbmdQb2ludCYgcmhzKSBjb25zdCB7Ci0gICAgLy8gVGhlIElFRUUgc3RhbmRhcmQgc2F5cyB0aGF0IGFueSBjb21wYXJpc29uIG9wZXJhdGlvbiBpbnZvbHZpbmcKLSAgICAvLyBhIE5BTiBtdXN0IHJldHVybiBmYWxzZS4KLSAgICBpZiAoaXNfbmFuKCkgfHwgcmhzLmlzX25hbigpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gRGlzdGFuY2VCZXR3ZWVuU2lnbkFuZE1hZ25pdHVkZU51bWJlcnModV8uYml0c18sIHJocy51Xy5iaXRzXykKLSAgICAgICAgPD0ga01heFVscHM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgYWN0dWFsIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgdW5pb24gRmxvYXRpbmdQb2ludFVuaW9uIHsKLSAgICBSYXdUeXBlIHZhbHVlXzsgIC8vIFRoZSByYXcgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICAgIEJpdHMgYml0c187ICAgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIG51bWJlci4KLSAgfTsKLQotICAvLyBDb252ZXJ0cyBhbiBpbnRlZ2VyIGZyb20gdGhlIHNpZ24tYW5kLW1hZ25pdHVkZSByZXByZXNlbnRhdGlvbiB0bwotICAvLyB0aGUgYmlhc2VkIHJlcHJlc2VudGF0aW9uLiAgTW9yZSBwcmVjaXNlbHksIGxldCBOIGJlIDIgdG8gdGhlCi0gIC8vIHBvd2VyIG9mIChrQml0Q291bnQgLSAxKSwgYW4gaW50ZWdlciB4IGlzIHJlcHJlc2VudGVkIGJ5IHRoZQotICAvLyB1bnNpZ25lZCBudW1iZXIgeCArIE4uCi0gIC8vCi0gIC8vIEZvciBpbnN0YW5jZSwKLSAgLy8KLSAgLy8gICAtTiArIDEgKHRoZSBtb3N0IG5lZ2F0aXZlIG51bWJlciByZXByZXNlbnRhYmxlIHVzaW5nCi0gIC8vICAgICAgICAgIHNpZ24tYW5kLW1hZ25pdHVkZSkgaXMgcmVwcmVzZW50ZWQgYnkgMTsKLSAgLy8gICAwICAgICAgaXMgcmVwcmVzZW50ZWQgYnkgTjsgYW5kCi0gIC8vICAgTiAtIDEgICh0aGUgYmlnZ2VzdCBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZwotICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDJOIC0gMS4KLSAgLy8KLSAgLy8gUmVhZCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NpZ25lZF9udW1iZXJfcmVwcmVzZW50YXRpb25zCi0gIC8vIGZvciBtb3JlIGRldGFpbHMgb24gc2lnbmVkIG51bWJlciByZXByZXNlbnRhdGlvbnMuCi0gIHN0YXRpYyBCaXRzIFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChjb25zdCBCaXRzICZzYW0pIHsKLSAgICBpZiAoa1NpZ25CaXRNYXNrICYgc2FtKSB7Ci0gICAgICAvLyBzYW0gcmVwcmVzZW50cyBhIG5lZ2F0aXZlIG51bWJlci4KLSAgICAgIHJldHVybiB+c2FtICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBwb3NpdGl2ZSBudW1iZXIuCi0gICAgICByZXR1cm4ga1NpZ25CaXRNYXNrIHwgc2FtOwotICAgIH0KLSAgfQotCi0gIC8vIEdpdmVuIHR3byBudW1iZXJzIGluIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24sCi0gIC8vIHJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBhcyBhbiB1bnNpZ25lZCBudW1iZXIuCi0gIHN0YXRpYyBCaXRzIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKGNvbnN0IEJpdHMgJnNhbTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpdHMgJnNhbTIpIHsKLSAgICBjb25zdCBCaXRzIGJpYXNlZDEgPSBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoc2FtMSk7Ci0gICAgY29uc3QgQml0cyBiaWFzZWQyID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTIpOwotICAgIHJldHVybiAoYmlhc2VkMSA+PSBiaWFzZWQyKSA/IChiaWFzZWQxIC0gYmlhc2VkMikgOiAoYmlhc2VkMiAtIGJpYXNlZDEpOwotICB9Ci0KLSAgRmxvYXRpbmdQb2ludFVuaW9uIHVfOwotfTsKLQotLy8gV2UgY2Fubm90IHVzZSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSBhcyBpdCBjbGFzaGVzIHdpdGggdGhlIG1heCgpCi0vLyBtYWNybyBkZWZpbmVkIGJ5IDx3aW5kb3dzLmg+LgotdGVtcGxhdGUgPD4KLWlubGluZSBmbG9hdCBGbG9hdGluZ1BvaW50PGZsb2F0Pjo6TWF4KCkgeyByZXR1cm4gRkxUX01BWDsgfQotdGVtcGxhdGUgPD4KLWlubGluZSBkb3VibGUgRmxvYXRpbmdQb2ludDxkb3VibGU+OjpNYXgoKSB7IHJldHVybiBEQkxfTUFYOyB9Ci0KLS8vIFR5cGVkZWZzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgdGhhdCB3ZQotLy8gY2FyZSB0byB1c2UuCi10eXBlZGVmIEZsb2F0aW5nUG9pbnQ8ZmxvYXQ+IEZsb2F0OwotdHlwZWRlZiBGbG9hdGluZ1BvaW50PGRvdWJsZT4gRG91YmxlOwotCi0vLyBJbiBvcmRlciB0byBjYXRjaCB0aGUgbWlzdGFrZSBvZiBwdXR0aW5nIHRlc3RzIHRoYXQgdXNlIGRpZmZlcmVudAotLy8gdGVzdCBmaXh0dXJlIGNsYXNzZXMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlLCB3ZSBuZWVkIHRvIGFzc2lnbgotLy8gdW5pcXVlIElEcyB0byBmaXh0dXJlIGNsYXNzZXMgYW5kIGNvbXBhcmUgdGhlbS4gIFRoZSBUeXBlSWQgdHlwZSBpcwotLy8gdXNlZCB0byBob2xkIHN1Y2ggSURzLiAgVGhlIHVzZXIgc2hvdWxkIHRyZWF0IFR5cGVJZCBhcyBhbiBvcGFxdWUKLS8vIHR5cGU6IHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkIG9uIFR5cGVJZCB2YWx1ZXMgaXMgdG8gY29tcGFyZQotLy8gdGhlbSBmb3IgZXF1YWxpdHkgdXNpbmcgdGhlID09IG9wZXJhdG9yLgotdHlwZWRlZiBjb25zdCB2b2lkKiBUeXBlSWQ7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVHlwZUlkSGVscGVyIHsKLSBwdWJsaWM6Ci0gIC8vIGR1bW15XyBtdXN0IG5vdCBoYXZlIGEgY29uc3QgdHlwZS4gIE90aGVyd2lzZSBhbiBvdmVybHkgZWFnZXIKLSAgLy8gY29tcGlsZXIgKGUuZy4gTVNWQyA3LjEgJiA4LjApIG1heSB0cnkgdG8gbWVyZ2UKLSAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gZm9yIGRpZmZlcmVudCBUcyBhcyBhbiAib3B0aW1pemF0aW9uIi4KLSAgc3RhdGljIGJvb2wgZHVtbXlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfID0gZmFsc2U7Ci0KLS8vIEdldFR5cGVJZDxUPigpIHJldHVybnMgdGhlIElEIG9mIHR5cGUgVC4gIERpZmZlcmVudCB2YWx1ZXMgd2lsbCBiZQotLy8gcmV0dXJuZWQgZm9yIGRpZmZlcmVudCB0eXBlcy4gIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHR3aWNlIHdpdGggdGhlCi0vLyBzYW1lIHR5cGUgYXJndW1lbnQgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgSUQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVR5cGVJZCBHZXRUeXBlSWQoKSB7Ci0gIC8vIFRoZSBjb21waWxlciBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBhIGRpZmZlcmVudAotICAvLyBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyB2YXJpYWJsZSBmb3IgZWFjaCBUIHVzZWQgdG8gaW5zdGFudGlhdGUKLSAgLy8gdGhlIHRlbXBsYXRlLiAgVGhlcmVmb3JlLCB0aGUgYWRkcmVzcyBvZiBkdW1teV8gaXMgZ3VhcmFudGVlZCB0bwotICAvLyBiZSB1bmlxdWUuCi0gIHJldHVybiAmKFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBBbHdheXMgY2FsbCB0aGlzIGluc3RlYWQKLS8vIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgotLy8gOjp0ZXN0aW5nOjpUZXN0LCBhcyB0aGUgbGF0dGVyIG1heSBnaXZlIHRoZSB3cm9uZyByZXN1bHQgZHVlIHRvIGEKLS8vIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGFzIGEgTWFjIE9TIFgKLS8vIGZyYW1ld29yay4KLUdURVNUX0FQSV8gVHlwZUlkIEdldFRlc3RUeXBlSWQoKTsKLQotLy8gRGVmaW5lcyB0aGUgYWJzdHJhY3QgZmFjdG9yeSBpbnRlcmZhY2UgdGhhdCBjcmVhdGVzIGluc3RhbmNlcwotLy8gb2YgYSBUZXN0IG9iamVjdC4KLWNsYXNzIFRlc3RGYWN0b3J5QmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UZXN0RmFjdG9yeUJhc2UoKSB7fQotCi0gIC8vIENyZWF0ZXMgYSB0ZXN0IGluc3RhbmNlIHRvIHJ1bi4gVGhlIGluc3RhbmNlIGlzIGJvdGggY3JlYXRlZCBhbmQgZGVzdHJveWVkCi0gIC8vIHdpdGhpbiBUZXN0SW5mb0ltcGw6OlJ1bigpCi0gIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgVGVzdEZhY3RvcnlCYXNlKCkge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEZhY3RvcnlCYXNlKTsKLX07Ci0KLS8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgVGVhc3RGYWN0b3J5QmFzZSBpbnRlcmZhY2UuCi0vLyBJdCBpcyB1c2VkIGluIFRFU1QgYW5kIFRFU1RfRiBtYWNyb3MuCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgotY2xhc3MgVGVzdEZhY3RvcnlJbXBsIDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7IHJldHVybiBuZXcgVGVzdENsYXNzOyB9Ci19OwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotCi0vLyBQcmVkaWNhdGUtZm9ybWF0dGVycyBmb3IgaW1wbGVtZW50aW5nIHRoZSBIUkVTVUxUIGNoZWNraW5nIG1hY3JvcwotLy8ge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9Ci0vLyBXZSBwYXNzIGEgbG9uZyBpbnN0ZWFkIG9mIEhSRVNVTFQgdG8gYXZvaWQgY2F1c2luZyBhbgotLy8gaW5jbHVkZSBkZXBlbmRlbmN5IGZvciB0aGUgSFJFU1VMVCB0eXBlLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxUU3VjY2Vzcyhjb25zdCBjaGFyKiBleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAotCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVHlwZXMgb2YgU2V0VXBUZXN0Q2FzZSgpIGFuZCBUZWFyRG93blRlc3RDYXNlKCkgZnVuY3Rpb25zLgotdHlwZWRlZiB2b2lkICgqU2V0VXBUZXN0Q2FzZUZ1bmMpKCk7Ci10eXBlZGVmIHZvaWQgKCpUZWFyRG93blRlc3RDYXNlRnVuYykoKTsKLQotc3RydWN0IENvZGVMb2NhdGlvbiB7Ci0gIENvZGVMb2NhdGlvbihjb25zdCBzdHJpbmcmIGFfZmlsZSwgaW50IGFfbGluZSkgOiBmaWxlKGFfZmlsZSksIGxpbmUoYV9saW5lKSB7fQotCi0gIHN0cmluZyBmaWxlOwotICBpbnQgbGluZTsKLX07Ci0KLS8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKLS8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgotLy8KLS8vIEFyZ3VtZW50czoKLS8vCi0vLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0Ci0vLyAgIHR5cGVfcGFyYW0gICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLS8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotLy8gICB2YWx1ZV9wYXJhbSAgICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAotLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0vLyAgIGNvZGVfbG9jYXRpb246ICAgIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRlc3QgaXMgZGVmaW5lZAotLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCi0vLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0vLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0vLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCi0vLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCi1HVEVTVF9BUElfIFRlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKLSAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCi0gICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCi0gICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCi0gICAgVHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCi0gICAgU2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgIFRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKLSAgICBUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOwotCi0vLyBJZiAqcHN0ciBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBtb2RpZmllcyAqcHN0ciB0byBiZSByaWdodAotLy8gcGFzdCB0aGUgcHJlZml4IGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnBzdHIgdW5jaGFuZ2VkCi0vLyBhbmQgcmV0dXJucyBmYWxzZS4gIE5vbmUgb2YgcHN0ciwgKnBzdHIsIGFuZCBwcmVmaXggY2FuIGJlIE5VTEwuCi1HVEVTVF9BUElfIGJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKTsKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gU3RhdGUgb2YgdGhlIGRlZmluaXRpb24gb2YgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotY2xhc3MgR1RFU1RfQVBJXyBUeXBlZFRlc3RDYXNlUFN0YXRlIHsKLSBwdWJsaWM6Ci0gIFR5cGVkVGVzdENhc2VQU3RhdGUoKSA6IHJlZ2lzdGVyZWRfKGZhbHNlKSB7fQotCi0gIC8vIEFkZHMgdGhlIGdpdmVuIHRlc3QgbmFtZSB0byBkZWZpbmVkX3Rlc3RfbmFtZXNfIGFuZCByZXR1cm4gdHJ1ZQotICAvLyBpZiB0aGUgdGVzdCBjYXNlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQ7IG90aGVyd2lzZSBhYm9ydHMgdGhlCi0gIC8vIHByb2dyYW0uCi0gIGJvb2wgQWRkVGVzdE5hbWUoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWUpIHsKLSAgICBpZiAocmVnaXN0ZXJlZF8pIHsKLSAgICAgIHBvc2l4OjpQcmludEYoIiVzIFRlc3QgJXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSAiCi0gICAgICAgICAgICAgICJSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCglcywgLi4uKS5cbiIsCi0gICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLCB0ZXN0X25hbWUsIGNhc2VfbmFtZSk7Ci0gICAgICBwb3NpeDo6Rmx1c2goKTsKLSAgICAgIHBvc2l4OjpBYm9ydCgpOwotICAgIH0KLSAgICByZWdpc3RlcmVkX3Rlc3RzXy5pbnNlcnQoCi0gICAgICAgIDo6c3RkOjptYWtlX3BhaXIodGVzdF9uYW1lLCBDb2RlTG9jYXRpb24oZmlsZSwgbGluZSkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgVGVzdEV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlZ2lzdGVyZWRfdGVzdHNfLmNvdW50KHRlc3RfbmFtZSkgPiAwOwotICB9Ci0KLSAgY29uc3QgQ29kZUxvY2F0aW9uJiBHZXRDb2RlTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfbmFtZSkgY29uc3QgewotICAgIFJlZ2lzdGVyZWRUZXN0c01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWdpc3RlcmVkX3Rlc3RzXy5maW5kKHRlc3RfbmFtZSk7Ci0gICAgR1RFU1RfQ0hFQ0tfKGl0ICE9IHJlZ2lzdGVyZWRfdGVzdHNfLmVuZCgpKTsKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotCi0gIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgotICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKLSAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KLSAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgOjpzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29kZUxvY2F0aW9uPiBSZWdpc3RlcmVkVGVzdHNNYXA7Ci0KLSAgYm9vbCByZWdpc3RlcmVkXzsKLSAgUmVnaXN0ZXJlZFRlc3RzTWFwIHJlZ2lzdGVyZWRfdGVzdHNfOwotfTsKLQotLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiAnc3RyJzsKLS8vIHJldHVybnMgTlVMTCBpZiBubyBjb21tYSBpcyBmb3VuZCBpbiAnc3RyJy4KLWlubGluZSBjb25zdCBjaGFyKiBTa2lwQ29tbWEoY29uc3QgY2hhciogc3RyKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbW1hID0gcG9zaXg6OlN0ckNocihzdHIsICcsJyk7Ci0gIGlmIChjb21tYSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgd2hpbGUgKElzU3BhY2UoKigrK2NvbW1hKSkpIHt9Ci0gIHJldHVybiBjb21tYTsKLX0KLQotLy8gUmV0dXJucyB0aGUgcHJlZml4IG9mICdzdHInIGJlZm9yZSB0aGUgZmlyc3QgY29tbWEgaW4gaXQ7IHJldHVybnMKLS8vIHRoZSBlbnRpcmUgc3RyaW5nIGlmIGl0IGNvbnRhaW5zIG5vIGNvbW1hLgotaW5saW5lIHN0ZDo6c3RyaW5nIEdldFByZWZpeFVudGlsQ29tbWEoY29uc3QgY2hhciogc3RyKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbW1hID0gcG9zaXg6OlN0ckNocihzdHIsICcsJyk7Ci0gIHJldHVybiBjb21tYSA9PSBOVUxMID8gc3RyIDogc3RkOjpzdHJpbmcoc3RyLCBjb21tYSk7Ci19Ci0KLS8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuCi0vLyB2ZWN0b3Igd2l0aCB0aGUgZmllbGRzLgotdm9pZCBTcGxpdFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNoYXIgZGVsaW1pdGVyLAotICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiogZGVzdCk7Ci0KLS8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlcz46OlJlZ2lzdGVyKCkKLS8vIHJlZ2lzdGVycyBhIGxpc3Qgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuICBUaGUKLS8vIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcKLS8vIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBHVEVTVF9URU1QTEFURV8gbWFjcm8gZGVjbGFyZXMgYSB0ZW1wbGF0ZQotLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgSXQncyBkZWZpbmVkIGluIGd0ZXN0LXR5cGUtdXRpbC5oLgotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlcz4KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdCB7Ci0gcHVibGljOgotICAvLyAnaW5kZXgnIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVzdCBpbiB0aGUgdHlwZSBsaXN0ICdUeXBlcycKLSAgLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgVGVzdENhc2UsCi0gIC8vIFR5cGVzKS4gIFZhbGlkIHZhbHVlcyBmb3IgJ2luZGV4JyBhcmUgWzAsIE4gLSAxXSB3aGVyZSBOIGlzIHRoZQotICAvLyBsZW5ndGggb2YgVHlwZXMuCi0gIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwgY29uc3QgY2hhciogdGVzdF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczo6SGVhZCBUeXBlOwotICAgIHR5cGVkZWYgRml4dHVyZTxUeXBlPiBGaXh0dXJlQ2xhc3M7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBHVEVTVF9CSU5EXyhUZXN0U2VsLCBUeXBlKSBUZXN0Q2xhc3M7Ci0KLSAgICAvLyBGaXJzdCwgcmVnaXN0ZXJzIHRoZSBmaXJzdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBpbiB0aGUgdHlwZQotICAgIC8vIGxpc3QuCi0gICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCi0gICAgICAgIChzdGQ6OnN0cmluZyhwcmVmaXgpICsgKHByZWZpeFswXSA9PSAnXDAnID8gIiIgOiAiLyIpICsgY2FzZV9uYW1lICsgIi8iCi0gICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhpbmRleCkpLmNfc3RyKCksCi0gICAgICAgIFN0cmlwVHJhaWxpbmdTcGFjZXMoR2V0UHJlZml4VW50aWxDb21tYSh0ZXN0X25hbWVzKSkuY19zdHIoKSwKLSAgICAgICAgR2V0VHlwZU5hbWU8VHlwZT4oKS5jX3N0cigpLAotICAgICAgICBOVUxMLCAgLy8gTm8gdmFsdWUgcGFyYW1ldGVyLgotICAgICAgICBjb2RlX2xvY2F0aW9uLAotICAgICAgICBHZXRUeXBlSWQ8Rml4dHVyZUNsYXNzPigpLAotICAgICAgICBUZXN0Q2xhc3M6OlNldFVwVGVzdENhc2UsCi0gICAgICAgIFRlc3RDbGFzczo6VGVhckRvd25UZXN0Q2FzZSwKLSAgICAgICAgbmV3IFRlc3RGYWN0b3J5SW1wbDxUZXN0Q2xhc3M+KTsKLQotICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHR5cGUgbGlzdC4KLSAgICByZXR1cm4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIHR5cGVuYW1lIFR5cGVzOjpUYWlsPgotICAgICAgICA6OlJlZ2lzdGVyKHByZWZpeCwgY29kZV9sb2NhdGlvbiwgY2FzZV9uYW1lLCB0ZXN0X25hbWVzLCBpbmRleCArIDEpOwotICB9Ci19OwotCi0vLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbD4KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlczA+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIC8qcHJlZml4Ki8sIENvZGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAvKmluZGV4Ki8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotLy8gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZXN0cywgVHlwZXM+OjpSZWdpc3RlcigpCi0vLyByZWdpc3RlcnMgKmFsbCBjb21iaW5hdGlvbnMqIG9mICdUZXN0cycgYW5kICdUeXBlcycgd2l0aCBHb29nbGUKLS8vIFRlc3QuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluc2lnbmlmaWNhbnQgLSB3ZSBqdXN0IG5lZWQgdG8gcmV0dXJuCi0vLyBzb21ldGhpbmcgc3VjaCB0aGF0IHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2NvcGUuCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzLCB0eXBlbmFtZSBUeXBlcz4KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogcHJlZml4LCBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZWRUZXN0Q2FzZVBTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwgY29uc3QgY2hhciogdGVzdF9uYW1lcykgewotICAgIHN0ZDo6c3RyaW5nIHRlc3RfbmFtZSA9IFN0cmlwVHJhaWxpbmdTcGFjZXMoCi0gICAgICAgIEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykpOwotICAgIGlmICghc3RhdGUtPlRlc3RFeGlzdHModGVzdF9uYW1lKSkgewotICAgICAgcG9zaXg6OlByaW50RigiRmFpbGVkIHRvIGdldCBjb2RlIGxvY2F0aW9uIGZvciB0ZXN0ICVzLiVzIGF0ICVzLiIsCi0gICAgICAgICAgICAgIGNhc2VfbmFtZSwgdGVzdF9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihjb2RlX2xvY2F0aW9uLmZpbGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbG9jYXRpb24ubGluZSkuY19zdHIoKSk7Ci0gICAgICBwb3NpeDo6Rmx1c2goKTsKLSAgICAgIHBvc2l4OjpBYm9ydCgpOwotICAgIH0KLSAgICBjb25zdCBDb2RlTG9jYXRpb24mIHRlc3RfbG9jYXRpb24gPSBzdGF0ZS0+R2V0Q29kZUxvY2F0aW9uKHRlc3RfbmFtZSk7Ci0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RzOjpIZWFkIEhlYWQ7Ci0KLSAgICAvLyBGaXJzdCwgcmVnaXN0ZXIgdGhlIGZpcnN0IHRlc3QgaW4gJ1Rlc3QnIGZvciBlYWNoIHR5cGUgaW4gJ1R5cGVzJy4KLSAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgSGVhZCwgVHlwZXM+OjpSZWdpc3RlcigKLSAgICAgICAgcHJlZml4LCB0ZXN0X2xvY2F0aW9uLCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOwotCi0gICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdGVzdCBsaXN0LgotICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4KLSAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNvZGVfbG9jYXRpb24sIHN0YXRlLAotICAgICAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgU2tpcENvbW1hKHRlc3RfbmFtZXMpKTsKLSAgfQotfTsKLQotLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPgotY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZW1wbGF0ZXMwLCBUeXBlcz4gewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgQ29kZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlZFRlc3RDYXNlUFN0YXRlKiAvKnN0YXRlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgotLy8KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5Ci0vLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgotLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0Ci0vLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgotLy8KLS8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscwotLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCi0vLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoCi0gICAgVW5pdFRlc3QqIHVuaXRfdGVzdCwgaW50IHNraXBfY291bnQpOwotCi0vLyBIZWxwZXJzIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiB1bnJlYWNoYWJsZSBjb2RlIG9yIGNvbnN0YW50Ci0vLyBjb25kaXRpb24uCi0KLS8vIEFsd2F5cyByZXR1cm5zIHRydWUuCi1HVEVTVF9BUElfIGJvb2wgQWx3YXlzVHJ1ZSgpOwotCi0vLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KLWlubGluZSBib29sIEFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gIUFsd2F5c1RydWUoKTsgfQotCi0vLyBIZWxwZXIgZm9yIHN1cHByZXNzaW5nIGZhbHNlIHdhcm5pbmcgZnJvbSBDbGFuZyBvbiBhIGNvbnN0IGNoYXIqCi0vLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx3YXlzIGJlaW5nIE5VTEwgaW4KLS8vIHRoZSBlbHNlIGJyYW5jaC4KLXN0cnVjdCBHVEVTVF9BUElfIENvbnN0Q2hhclB0ciB7Ci0gIENvbnN0Q2hhclB0cihjb25zdCBjaGFyKiBzdHIpIDogdmFsdWUoc3RyKSB7fQotICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICBjb25zdCBjaGFyKiB2YWx1ZTsKLX07Ci0KLS8vIEEgc2ltcGxlIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHJhbmRvbQotLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdAotLy8gZG9lc24ndCB1c2UgZ2xvYmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlIGNhbid0IGludGVyZmVyZSB3aXRoIHVzZXIKLS8vIGNvZGUpLiAgVW5saWtlIHJhbmRfcigpLCBpdCdzIHBvcnRhYmxlLiAgQW4gTENHIGlzbid0IHZlcnkgcmFuZG9tLAotLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KLWNsYXNzIEdURVNUX0FQSV8gUmFuZG9tIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7Ci0KLSAgZXhwbGljaXQgUmFuZG9tKFVJbnQzMiBzZWVkKSA6IHN0YXRlXyhzZWVkKSB7fQotCi0gIHZvaWQgUmVzZWVkKFVJbnQzMiBzZWVkKSB7IHN0YXRlXyA9IHNlZWQ7IH0KLQotICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcwotICAvLyAwIG9yIGdyZWF0ZXIgdGhhbiBrTWF4UmFuZ2UuCi0gIFVJbnQzMiBHZW5lcmF0ZShVSW50MzIgcmFuZ2UpOwotCi0gcHJpdmF0ZToKLSAgVUludDMyIHN0YXRlXzsKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOwotfTsKLQotLy8gRGVmaW5pbmcgYSB2YXJpYWJsZSBvZiB0eXBlIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBUMj4gd2lsbCBjYXVzZSBhCi0vLyBjb21waWxlciBlcnJvciBpZmYgVDEgYW5kIFQyIGFyZSBkaWZmZXJlbnQgdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxULCBUPiB7Ci19OwotCi0vLyBSZW1vdmVzIHRoZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwKLS8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotLy8gdHIxOjpyZW1vdmVfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBSZW1vdmVSZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi0KLS8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgUmVtb3ZlUmVmZXJlbmNlIHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKLS8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlPFQ+Ojp0eXBlCi0KLS8vIFJlbW92ZXMgY29uc3QgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSBjb25zdCB0eXBlLCBvdGhlcndpc2UgbGVhdmVzCi0vLyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRyMTo6cmVtb3ZlX2NvbnN0LCB3aGljaCBpcyBub3QKLS8vIHdpZGVseSBhdmFpbGFibGUgeWV0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3QgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVD4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBNU1ZDIDguMCwgU3VuIEMrKywgYW5kIElCTSBYTCBDKysgaGF2ZSBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGFib3ZlCi0vLyBkZWZpbml0aW9uIHRvIGZhaWwgdG8gcmVtb3ZlIHRoZSBjb25zdCBpbiAnY29uc3QgaW50WzNdJyBhbmQgJ2NvbnN0Ci0vLyBjaGFyWzNdWzRdJy4gIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gd29ya3MgYXJvdW5kIHRoZSBidWcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVFtOXT4gewotICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0PFQ+Ojp0eXBlIHR5cGVbTl07Ci19OwotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNDAwCi0vLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWxsb3dzIFZDKysgNy4xIHRvIHJlbW92ZSBjb25zdCBpbgotLy8gJ2NvbnN0IGludFszXSBhbmQgJ2NvbnN0IGludFszXVs0XScuICBIb3dldmVyLCBpdCBjYXVzZXMgdHJvdWJsZSB3aXRoIEdDQwotLy8gYW5kIHRodXMgbmVlZHMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLXN0cnVjdCBSZW1vdmVDb25zdDxUW05dPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKLX07Ci0jZW5kaWYKLQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVDb25zdCB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50Ci0vLyBUIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR1RFU1RfUkVNT1ZFX0NPTlNUXyhUKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q8VD46OnR5cGUKLQotLy8gVHVybnMgY29uc3QgVSYsIFUmLCBjb25zdCBVLCBhbmQgVSBhbGwgaW50byBVLgotI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgXAotICAgIEdURVNUX1JFTU9WRV9DT05TVF8oR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCi0KLS8vIEFkZHMgcmVmZXJlbmNlIHRvIGEgdHlwZSBpZiBpdCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSwKLS8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotLy8gdHIxOjphZGRfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBZGRSZWZlcmVuY2UgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBBZGRSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBUCi0vLyBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdURVNUX0FERF9SRUZFUkVOQ0VfKFQpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpBZGRSZWZlcmVuY2U8VD46OnR5cGUKLQotLy8gQWRkcyBhIHJlZmVyZW5jZSB0byBjb25zdCBvbiB0b3Agb2YgVCBhcyBuZWNlc3NhcnkuICBGb3IgZXhhbXBsZSwKLS8vIGl0IHRyYW5zZm9ybXMKLS8vCi0vLyAgIGNoYXIgICAgICAgICA9PT4gY29uc3QgY2hhciYKLS8vICAgY29uc3QgY2hhciAgID09PiBjb25zdCBjaGFyJgotLy8gICBjaGFyJiAgICAgICAgPT0+IGNvbnN0IGNoYXImCi0vLyAgIGNvbnN0IGNoYXImICA9PT4gY29uc3QgY2hhciYKLS8vCi0vLyBUaGUgYXJndW1lbnQgVCBtdXN0IGRlcGVuZCBvbiBzb21lIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oVCkgXAotICAgIEdURVNUX0FERF9SRUZFUkVOQ0VfKGNvbnN0IEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpKQotCi0vLyBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBib29sCi0vLyBjb25zdGFudCB0aGF0J3MgdHJ1ZSBpZmYgdHlwZSBGcm9tIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gdHlwZSBUby4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KLWNsYXNzIEltcGxpY2l0bHlDb252ZXJ0aWJsZSB7Ci0gcHJpdmF0ZToKLSAgLy8gV2UgbmVlZCB0aGUgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbnMgb25seSBmb3IgdGhlaXIgdHlwZXMuCi0gIC8vIFRoZXkgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMuCi0KLSAgLy8gTWFrZUZyb20oKSBpcyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgRnJvbS4gIFdlIGNhbm5vdCBzaW1wbHkKLSAgLy8gdXNlIEZyb20oKSwgYXMgdGhlIHR5cGUgRnJvbSBtYXkgbm90IGhhdmUgYSBwdWJsaWMgZGVmYXVsdAotICAvLyBjb25zdHJ1Y3Rvci4KLSAgc3RhdGljIHR5cGVuYW1lIEFkZFJlZmVyZW5jZTxGcm9tPjo6dHlwZSBNYWtlRnJvbSgpOwotCi0gIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIG92ZXJsb2FkZWQuICBHaXZlbiBhbiBleHByZXNzaW9uCi0gIC8vIEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QgdmVyc2lvbiBpZiB4IGNhbiBiZQotICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQotICAvLyBzZWNvbmQgdmVyc2lvbi4KLSAgLy8KLSAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQKLSAgLy8gdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAyLiAgVGhlcmVmb3JlLCBieSBjaGVja2luZyB0aGUKLSAgLy8gc2l6ZSBvZiBIZWxwZXIoeCksIHdoaWNoIGNhbiBiZSBkb25lIGF0IGNvbXBpbGUgdGltZSwgd2UgY2FuIHRlbGwKLSAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQotICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvLgotICBzdGF0aWMgY2hhciBIZWxwZXIoVG8pOwotICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAotCi0gIC8vIFdlIGhhdmUgdG8gcHV0IHRoZSAncHVibGljJyBzZWN0aW9uIGFmdGVyIHRoZSAncHJpdmF0ZScgc2VjdGlvbiwKLSAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuCi0gcHVibGljOgotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBDKytCdWlsZGVyIGNhbm5vdCB1c2UgbWVtYmVyIG92ZXJsb2FkIHJlc29sdXRpb24gZHVyaW5nIHRlbXBsYXRlCi0gIC8vIGluc3RhbnRpYXRpb24uICBUaGUgc2ltcGxlc3Qgd29ya2Fyb3VuZCBpcyB0byB1c2UgaXRzIEMrKzB4IHR5cGUgdHJhaXRzCi0gIC8vIGZ1bmN0aW9ucyAoQysrQnVpbGRlciAyMDA5IGFuZCBhYm92ZSBvbmx5KS4KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2lzX2NvbnZlcnRpYmxlKEZyb20sIFRvKTsKLSNlbHNlCi0gIC8vIE1TVkMgd2FybnMgYWJvdXQgaW1wbGljaXRseSBjb252ZXJ0aW5nIGZyb20gZG91YmxlIHRvIGludCBmb3IKLSAgLy8gcG9zc2libGUgbG9zcyBvZiBkYXRhLCBzbyB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlCi0gIC8vIHdhcm5pbmcuCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQyNDQpCi0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KLSAgICAgIHNpemVvZihIZWxwZXIoSW1wbGljaXRseUNvbnZlcnRpYmxlOjpNYWtlRnJvbSgpKSkgPT0gMTsKLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0jZW5kaWYgIC8vIF9fQk9STEFORENfXwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KLWNvbnN0IGJvb2wgSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7Ci0KLS8vIElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0J3MKLS8vIHRydWUgaWZmIFQgaXMgdHlwZSBQcm90b2NvbE1lc3NhZ2UsIHByb3RvMjo6TWVzc2FnZSwgb3IgYSBzdWJjbGFzcwotLy8gb2YgdGhvc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBJc0FQcm90b2NvbE1lc3NhZ2UKLSAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PAotICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6UHJvdG9jb2xNZXNzYWdlKj46OnZhbHVlIHx8Ci0gIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpwcm90bzI6Ok1lc3NhZ2UqPjo6dmFsdWU+IHsKLX07Ci0KLS8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KLS8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKLS8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQotLy8gdmFsaWQgdHlwZXMgYW5kIE5VTEwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZW0pLiAgSXQgd2lsbAotLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yCi0vLyB0aGUgdHlwZSBvZiBhcmd1bWVudCAwLiAgSWYgQzo6aXRlcmF0b3Igb3IgQzo6Y29uc3RfaXRlcmF0b3IgaXMgbm90Ci0vLyBhIHZhbGlkIHR5cGUsIHRoZSBmaXJzdCBvdmVybG9hZCBpcyBub3QgdmlhYmxlLCBhbmQgdGhlIHNlY29uZAotLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzCi0vLyBhIGNvbnRhaW5lciBjbGFzcyBieSBjaGVja2luZyB0aGUgdHlwZSBvZiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCkuCi0vLyBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgaW5zaWduaWZpY2FudC4KLS8vCi0vLyBOb3RlIHRoYXQgd2UgbG9vayBmb3IgYm90aCBDOjppdGVyYXRvciBhbmQgQzo6Y29uc3RfaXRlcmF0b3IuICBUaGUKLS8vIHJlYXNvbiBpcyB0aGF0IEMrKyBpbmplY3RzIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgYSBtZW1iZXIgb2YgdGhlCi0vLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXIKLS8vICdpdGVyYXRvcicgb3IgJ2l0ZXJhdG9yOjppdGVyYXRvcicpLiAgSWYgd2UgbG9vayBmb3IgQzo6aXRlcmF0b3IKLS8vIG9ubHksIGZvciBleGFtcGxlLCB3ZSB3b3VsZCBtaXN0YWtlbmx5IHRoaW5rIHRoYXQgYSBjbGFzcyBuYW1lZAotLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4KLS8vCi0vLyBBbHNvIG5vdGUgdGhhdCB0aGUgc2ltcGxlciBhcHByb2FjaCBvZiBvdmVybG9hZGluZwotLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kCi0vLyBJc0NvbnRhaW5lclRlc3QoLi4uKSBkb2Vzbid0IHdvcmsgd2l0aCBWaXN1YWwgQWdlIEMrKyBhbmQgU3VuIEMrKy4KLXR5cGVkZWYgaW50IElzQ29udGFpbmVyOwotdGVtcGxhdGUgPGNsYXNzIEM+Ci1Jc0NvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QoaW50IC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yKiAvKiBpdCAqLyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgewotICByZXR1cm4gMDsKLX0KLQotdHlwZWRlZiBjaGFyIElzTm90Q29udGFpbmVyOwotdGVtcGxhdGUgPGNsYXNzIEM+Ci1Jc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQotCi0vLyBFbmFibGVJZjxjb25kaXRpb24+Ojp0eXBlIGlzIHZvaWQgd2hlbiAnQ29uZCcgaXMgdHJ1ZSwgYW5kCi0vLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbgotLy8gb3ZlcmxvYWQgb25seSBhcHBseSB3aGVuIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUsIGFkZAotLy8gInR5cGVuYW1lIEVuYWJsZUlmPGV4cHJlc3Npb24+Ojp0eXBlKiA9IDAiIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KLXRlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsKLXRlbXBsYXRlPD4gc3RydWN0IEVuYWJsZUlmPHRydWU+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLgotCi0vLyBBcnJheUVxKCkgY29tcGFyZXMgdHdvIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5cyB1c2luZyB0aGUKLS8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzCi0vLyAwLCBBcnJheUVxKCkgZGVnZW5lcmF0ZXMgaW50byBjb21wYXJpbmcgYSBzaW5nbGUgcGFpciBvZiB2YWx1ZXMuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocyk7Ci0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWlubGluZSBib29sIEFycmF5RXEoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIHsgcmV0dXJuIGxocyA9PSByaHM7IH0KLQotLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgotaW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJyYXlFcShsaHMsIE4sIHJocyk7Ci19Ci0KLS8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKLS8vIHRoZSBwcmV2aW91cyBBcnJheUVxKCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcyB3b3VsZAotLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1ib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgewotICAgIGlmICghaW50ZXJuYWw6OkFycmF5RXEobGhzW2ldLCByaHNbaV0pKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpIHRoYXQKLS8vIGVxdWFscyBlbGVtLiAgRWxlbWVudCBtYXkgYmUgYSBuYXRpdmUgYXJyYXkgdHlwZSBpdHNlbGYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4KLUl0ZXIgQXJyYXlBd2FyZUZpbmQoSXRlciBiZWdpbiwgSXRlciBlbmQsIGNvbnN0IEVsZW1lbnQmIGVsZW0pIHsKLSAgZm9yIChJdGVyIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgewotICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQotICAgICAgcmV0dXJuIGl0OwotICB9Ci0gIHJldHVybiBlbmQ7Ci19Ci0KLS8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycKLS8vIG9wZXJhdG9yPSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcyAwLAotLy8gQ29weUFycmF5KCkgZGVnZW5lcmF0ZXMgaW50byBjb3B5aW5nIGEgc2luZ2xlIHZhbHVlLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0byk7Ci0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWlubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9Ci0KLS8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KLWlubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUKCZmcm9tKVtOXSwgVSgqdG8pW05dKSB7Ci0gIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbSwgTiwgKnRvKTsKLX0KLQotLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQotLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMKLS8vIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotdm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgewotICAgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbVtpXSwgdG8gKyBpKTsKLSAgfQotfQotCi0vLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQotLy8gbmF0aXZlIGFycmF5IGl0IHJlcHJlc2VudHMuCi0vLyBXZSB1c2UgMiBkaWZmZXJlbnQgc3RydWN0cyB0byBhbGxvdyBub24tY29weWFibGUgdHlwZXMgdG8gYmUgdXNlZCwgYXMgbG9uZwotLy8gYXMgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpIGlzIHBhc3NlZC4KLXN0cnVjdCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlIHt9Owotc3RydWN0IFJlbGF0aW9uVG9Tb3VyY2VDb3B5IHt9OwotCi0vLyBBZGFwdHMgYSBuYXRpdmUgYXJyYXkgdG8gYSByZWFkLW9ubHkgU1RMLXN0eWxlIGNvbnRhaW5lci4gIEluc3RlYWQKLS8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMKLS8vIG1lbWJlcnMgdXNlZnVsIGZvciBHb29nbGUgTW9jaydzIGNvbnRhaW5lciBtYXRjaGVycy4gIE5ldyBtZW1iZXJzCi0vLyBzaG91bGQgYmUgYWRkZWQgYXMgbmVlZGVkLiAgVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5Ci0vLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yCi0vLyByZWZlcmVuY2UgbW9kaWZpZXIpLiAgSXQncyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gc2F0aXNmeQotLy8gdGhpcyByZXF1aXJlbWVudC4gIEVsZW1lbnQgY2FuIGJlIGFuIGFycmF5IHR5cGUgaXRzZWxmIChoZW5jZQotLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1jbGFzcyBOYXRpdmVBcnJheSB7Ci0gcHVibGljOgotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIHR5cGVkZWZzLgotICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKLQotICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuIFJlZmVyZW5jZXMgdGhlIHNvdXJjZS4KLSAgTmF0aXZlQXJyYXkoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBjb3VudCwgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSkgewotICAgIEluaXRSZWYoYXJyYXksIGNvdW50KTsKLSAgfQotCi0gIC8vIENvbnN0cnVjdHMgZnJvbSBhIG5hdGl2ZSBhcnJheS4gQ29waWVzIHRoZSBzb3VyY2UuCi0gIE5hdGl2ZUFycmF5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgY291bnQsIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KSB7Ci0gICAgSW5pdENvcHkoYXJyYXksIGNvdW50KTsKLSAgfQotCi0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIE5hdGl2ZUFycmF5KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIHsKLSAgICAodGhpcy0+KnJocy5jbG9uZV8pKHJocy5hcnJheV8sIHJocy5zaXplXyk7Ci0gIH0KLQotICB+TmF0aXZlQXJyYXkoKSB7Ci0gICAgaWYgKGNsb25lXyAhPSAmTmF0aXZlQXJyYXk6OkluaXRSZWYpCi0gICAgICBkZWxldGVbXSBhcnJheV87Ci0gIH0KLQotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIG1ldGhvZHMuCi0gIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfICsgc2l6ZV87IH0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYKLSAgICAgICAgQXJyYXlFcShiZWdpbigpLCBzaXplKCksIHJocy5iZWdpbigpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZW51bSB7Ci0gICAga0NoZWNrVHlwZUlzTm90Q29uc3RPckFSZWZlcmVuY2UgPSBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8Ci0gICAgICAgIEVsZW1lbnQsIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhFbGVtZW50KT46OnZhbHVlLAotICB9OwotCi0gIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggYSBjb3B5IG9mIHRoZSBpbnB1dC4KLSAgdm9pZCBJbml0Q29weShjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGFfc2l6ZSkgewotICAgIEVsZW1lbnQqIGNvbnN0IGNvcHkgPSBuZXcgRWxlbWVudFthX3NpemVdOwotICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsKLSAgICBhcnJheV8gPSBjb3B5OwotICAgIHNpemVfID0gYV9zaXplOwotICAgIGNsb25lXyA9ICZOYXRpdmVBcnJheTo6SW5pdENvcHk7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplcyB0aGlzIG9iamVjdCB3aXRoIGEgcmVmZXJlbmNlIG9mIHRoZSBpbnB1dC4KLSAgdm9pZCBJbml0UmVmKGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplKSB7Ci0gICAgYXJyYXlfID0gYXJyYXk7Ci0gICAgc2l6ZV8gPSBhX3NpemU7Ci0gICAgY2xvbmVfID0gJk5hdGl2ZUFycmF5OjpJbml0UmVmOwotICB9Ci0KLSAgY29uc3QgRWxlbWVudCogYXJyYXlfOwotICBzaXplX3Qgc2l6ZV87Ci0gIHZvaWQgKE5hdGl2ZUFycmF5OjoqY2xvbmVfKShjb25zdCBFbGVtZW50Kiwgc2l6ZV90KTsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5hdGl2ZUFycmF5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2RlZmluZSBHVEVTVF9NRVNTQUdFX0FUXyhmaWxlLCBsaW5lLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpBc3NlcnRIZWxwZXIocmVzdWx0X3R5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpIFwKLSAgICA9IDo6dGVzdGluZzo6TWVzc2FnZSgpCi0KLSNkZWZpbmUgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKLSAgR1RFU1RfTUVTU0FHRV9BVF8oX19GSUxFX18sIF9fTElORV9fLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkKLQotI2RlZmluZSBHVEVTVF9GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCi0gIHJldHVybiBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlKQotCi0jZGVmaW5lIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKLSAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKLQotI2RlZmluZSBHVEVTVF9TVUNDRVNTXyhtZXNzYWdlKSBcCi0gIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKQotCi0vLyBTdXBwcmVzc2VzIE1TVkMgd2FybmluZ3MgNDA3MiAodW5yZWFjaGFibGUgY29kZSkgZm9yIHRoZSBjb2RlIGZvbGxvd2luZwotLy8gc3RhdGVtZW50IGlmIGl0IHJldHVybnMgb3IgdGhyb3dzIChvciBkb2Vzbid0IHJldHVybiBvciB0aHJvdyBpbiBzb21lCi0vLyBzaXR1YXRpb25zKS4KLSNkZWZpbmUgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KLQotI2RlZmluZSBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgZmFpbCkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpDb25zdENoYXJQdHIgZ3Rlc3RfbXNnID0gIiIpIHsgXAotICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gZmFsc2U7IFwKLSAgICB0cnkgeyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoZXhwZWN0ZWRfZXhjZXB0aW9uIGNvbnN0JikgeyBcCi0gICAgICBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSB0cnVlOyBcCi0gICAgfSBcCi0gICAgY2F0Y2ggKC4uLikgeyBcCi0gICAgICBndGVzdF9tc2cudmFsdWUgPSBcCi0gICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCi0gICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiI7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgICBpZiAoIWd0ZXN0X2NhdWdodF9leHBlY3RlZCkgeyBcCi0gICAgICBndGVzdF9tc2cudmFsdWUgPSBcCi0gICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCi0gICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiI7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTogXAotICAgICAgZmFpbChndGVzdF9tc2cudmFsdWUpCi0KLSNkZWZpbmUgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgdHJ5IHsgXAotICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCi0gICAgfSBcCi0gICAgY2F0Y2ggKC4uLikgeyBcCi0gICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOiBcCi0gICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24uXG4iIFwKLSAgICAgICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3MuIikKLQotI2RlZmluZSBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgYm9vbCBndGVzdF9jYXVnaHRfYW55ID0gZmFsc2U7IFwKLSAgICB0cnkgeyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoLi4uKSB7IFwKLSAgICAgIGd0ZXN0X2NhdWdodF9hbnkgPSB0cnVlOyBcCi0gICAgfSBcCi0gICAgaWYgKCFndGVzdF9jYXVnaHRfYW55KSB7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rhbnl0aHJvd18sIF9fTElORV9fKTogXAotICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24uXG4iIFwKLSAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpCi0KLQotLy8gSGVscCBNaWNyb3NvZnQgY29kZSBhbmFseXNpcyB0b29sIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgZXhwcmVzc2lvbgotLy8gYmVpbmcgYXNzZXJ0ZWQgbXVzdCBiZSB0cnVlLgotLy8gTm90ZSB0aGF0IHRoZSBjb2RlIHVuZGVyIF9QUkVGQVNUXyBtYWNybyBpcyBub3QgYWN0dWFsbHkgZXhlY3V0ZWQsIG9ubHkKLS8vIGFuYWx5emVkLgotI2lmIGRlZmluZWQoQ09CQUxUKSAmJiBkZWZpbmVkKF9QUkVGQVNUXykKLSNkZWZpbmUgR1RFU1RfVEVTVF9CT09MRUFOXyhleHByZXNzaW9uLCB0ZXh0LCBhY3R1YWwsIGV4cGVjdGVkLCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgX19hbmFseXNpc19hc3N1bWUoISEoZXhwcmVzc2lvbikpCi0jZWxzZQotLy8gSW1wbGVtZW50cyBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLiBleHByZXNzaW9uIGNhbiBiZQotLy8gZWl0aGVyIGEgYm9vbGVhbiBleHByZXNzaW9uIG9yIGFuIEFzc2VydGlvblJlc3VsdC4gdGV4dCBpcyBhIHRleHR1YWwKLS8vIHJlcHJlc2VuYXRpb24gb2YgZXhwcmVzc2lvbiBhcyBpdCB3YXMgcGFzc2VkIGludG8gdGhlIEVYUEVDVF9UUlVFLgotI2RlZmluZSBHVEVTVF9URVNUX0JPT0xFQU5fKGV4cHJlc3Npb24sIHRleHQsIGFjdHVhbCwgZXhwZWN0ZWQsIGZhaWwpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXJfID0gXAotICAgICAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQoISEoZXhwcmVzc2lvbikpKSBcCi0gICAgOyBcCi0gIGVsc2UgXAotICAgIGZhaWwoOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKFwKLSAgICAgICAgZ3Rlc3RfYXJfLCB0ZXh0LCAjYWN0dWFsLCAjZXhwZWN0ZWQpLmNfc3RyKCkpCi0jZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUKSAmJiBkZWZpbmVkKF9QUkVGQVNUXykKLQotI2RlZmluZSBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgZmFpbCkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlciBndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXI7IFwKLSAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICBpZiAoZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyLmhhc19uZXdfZmF0YWxfZmFpbHVyZSgpKSB7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTsgXAotICAgIH0gXAotICB9IGVsc2UgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk6IFwKLSAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbCAiIFwKLSAgICAgICAgICAgImZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC5cbiIgXAotICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXMuIikKLQotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnaXZlbiB0ZXN0LgotI2RlZmluZSBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKLSAgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKLQotLy8gSGVscGVyIG1hY3JvIGZvciBkZWZpbmluZyB0ZXN0cy4KLSNkZWZpbmUgR1RFU1RfVEVTVF8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgcGFyZW50X2NsYXNzLCBwYXJlbnRfaWQpXAotY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSA6IHB1YmxpYyBwYXJlbnRfY2xhc3Mge1wKLSBwdWJsaWM6XAotICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge31cCi0gcHJpdmF0ZTpcCi0gIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpO1wKLSAgc3RhdGljIDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mb18gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87XAotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKLSAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpO1wKLX07XAotXAotOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKLSAgOjp0ZXN0X2luZm9fID1cCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oXAotICAgICAgICAjdGVzdF9jYXNlX25hbWUsICN0ZXN0X25hbWUsIE5VTEwsIE5VTEwsIFwKLSAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXyksIFwKLSAgICAgICAgKHBhcmVudF9pZCksIFwKLSAgICAgICAgcGFyZW50X2NsYXNzOjpTZXRVcFRlc3RDYXNlLCBcCi0gICAgICAgIHBhcmVudF9jbGFzczo6VGVhckRvd25UZXN0Q2FzZSwgXAotICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdEZhY3RvcnlJbXBsPFwKLSAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KTtcCi12b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCi0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRiZjhiLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDMgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQotLy8KLS8vIEEgInNtYXJ0IiBwb2ludGVyIHR5cGUgd2l0aCByZWZlcmVuY2UgdHJhY2tpbmcuICBFdmVyeSBwb2ludGVyIHRvIGEKLS8vIHBhcnRpY3VsYXIgb2JqZWN0IGlzIGtlcHQgb24gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gIFdoZW4gdGhlIGxhc3QgcG9pbnRlcgotLy8gdG8gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZCBvciByZWFzc2lnbmVkLCB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCi0vLwotLy8gVXNlZCBwcm9wZXJseSwgdGhpcyBkZWxldGVzIHRoZSBvYmplY3Qgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5LgotLy8gVGhlcmUgYXJlIHNldmVyYWwgY2F2ZWF0czoKLS8vIC0gTGlrZSBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIHNjaGVtZXMsIGN5Y2xlcyBsZWFkIHRvIGxlYWtzLgotLy8gLSBFYWNoIHNtYXJ0IHBvaW50ZXIgaXMgYWN0dWFsbHkgdHdvIHBvaW50ZXJzICg4IGJ5dGVzIGluc3RlYWQgb2YgNCkuCi0vLyAtIEV2ZXJ5IHRpbWUgYSBwb2ludGVyIGlzIGFzc2lnbmVkLCB0aGUgZW50aXJlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gdGhhdAotLy8gICBvYmplY3QgaXMgdHJhdmVyc2VkLiAgVGhpcyBjbGFzcyBpcyB0aGVyZWZvcmUgTk9UIFNVSVRBQkxFIHdoZW4gdGhlcmUKLS8vICAgd2lsbCBvZnRlbiBiZSBtb3JlIHRoYW4gdHdvIG9yIHRocmVlIHBvaW50ZXJzIHRvIGEgcGFydGljdWxhciBvYmplY3QuCi0vLyAtIFJlZmVyZW5jZXMgYXJlIG9ubHkgdHJhY2tlZCBhcyBsb25nIGFzIGxpbmtlZF9wdHI8PiBvYmplY3RzIGFyZSBjb3BpZWQuCi0vLyAgIElmIGEgbGlua2VkX3B0cjw+IGlzIGNvbnZlcnRlZCB0byBhIHJhdyBwb2ludGVyIGFuZCBiYWNrLCBCQUQgVEhJTkdTCi0vLyAgIHdpbGwgaGFwcGVuIChkb3VibGUgZGVsZXRpb24pLgotLy8KLS8vIEEgZ29vZCB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBzdG9yaW5nIG9iamVjdCByZWZlcmVuY2VzIGluIFNUTCBjb250YWluZXJzLgotLy8gWW91IGNhbiBzYWZlbHkgcHV0IGxpbmtlZF9wdHI8PiBpbiBhIHZlY3Rvcjw+LgotLy8gT3RoZXIgdXNlcyBtYXkgbm90IGJlIGFzIGdvb2QuCi0vLwotLy8gTm90ZTogSWYgeW91IHVzZSBhbiBpbmNvbXBsZXRlIHR5cGUgd2l0aCBsaW5rZWRfcHRyPD4sIHRoZSBjbGFzcwotLy8gKmNvbnRhaW5pbmcqIGxpbmtlZF9wdHI8PiBtdXN0IGhhdmUgYSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciAoZXZlbgotLy8gaWYgdGhleSBkbyBub3RoaW5nISkuCi0vLwotLy8gQmlsbCBHaWJib25zIHN1Z2dlc3RlZCB3ZSB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KLS8vCi0vLyBUaHJlYWQgU2FmZXR5OgotLy8gICBVbmxpa2Ugb3RoZXIgbGlua2VkX3B0ciBpbXBsZW1lbnRhdGlvbnMsIGluIHRoaXMgaW1wbGVtZW50YXRpb24KLS8vICAgYSBsaW5rZWRfcHRyIG9iamVjdCBpcyB0aHJlYWQtc2FmZSBpbiB0aGUgc2Vuc2UgdGhhdDoKLS8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5IGxpbmtlZF9wdHIgb2JqZWN0cyBjb25jdXJyZW50bHksCi0vLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSAqZnJvbSogYSBsaW5rZWRfcHRyIGFuZCByZWFkIGl0cyB1bmRlcmx5aW5nCi0vLyAgICAgICByYXcgcG9pbnRlciAoZS5nLiB2aWEgZ2V0KCkpIGNvbmN1cnJlbnRseSwgYW5kCi0vLyAgICAgLSBpdCdzIHNhZmUgdG8gd3JpdGUgdG8gdHdvIGxpbmtlZF9wdHJzIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUKLS8vICAgICAgIHNoYXJlZCBvYmplY3QgY29uY3VycmVudGx5LgotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbmFtZSB0aGlzIHRvIHNhZmVfbGlua2VkX3B0ciB0byBhdm9pZAotLy8gY29uZnVzaW9uIHdpdGggbm9ybWFsIGxpbmtlZF9wdHIuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXwotCi0jaWYgIWRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1RBUkJPQVJECi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFByb3RlY3RzIGNvcHlpbmcgb2YgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4KLUdURVNUX0FQSV8gR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7Ci0KLS8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGFsbCBpbnN0YW5jZXMgb2YgbGlua2VkX3B0cjw+LiAgSXQgbmVlZHMgdG8gYmUKLS8vIGEgbm9uLXRlbXBsYXRlIGNsYXNzIGJlY2F1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHI8PiBjYW4gcmVmZXIgdG8KLS8vIHRoZSBzYW1lIG9iamVjdCAobGlua2VkX3B0cjxTdXBlcmNsYXNzPihvYmopIHZzIGxpbmtlZF9wdHI8U3ViY2xhc3M+KG9iaikpLgotLy8gU28sIGl0IG5lZWRzIHRvIGJlIHBvc3NpYmxlIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciB0byBwYXJ0aWNpcGF0ZQotLy8gaW4gdGhlIHNhbWUgY2lyY3VsYXIgbGlua2VkIGxpc3QsIHNvIHdlIG5lZWQgYSBzaW5nbGUgY2xhc3MgdHlwZSBoZXJlLgotLy8KLS8vIERPIE5PVCBVU0UgVEhJUyBDTEFTUyBESVJFQ1RMWSBZT1VSU0VMRi4gIFVzZSBsaW5rZWRfcHRyPFQ+LgotY2xhc3MgbGlua2VkX3B0cl9pbnRlcm5hbCB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgYSBuZXcgY2lyY2xlIHRoYXQgaW5jbHVkZXMgb25seSB0aGlzIGluc3RhbmNlLgotICB2b2lkIGpvaW5fbmV3KCkgewotICAgIG5leHRfID0gdGhpczsKLSAgfQotCi0gIC8vIE1hbnkgbGlua2VkX3B0ciBvcGVyYXRpb25zIG1heSBjaGFuZ2UgcC5saW5rXyBmb3Igc29tZSBsaW5rZWRfcHRyCi0gIC8vIHZhcmlhYmxlIHAgaW4gdGhlIHNhbWUgY2lyY2xlIGFzIHRoaXMgb2JqZWN0LiAgVGhlcmVmb3JlIHdlIG5lZWQKLSAgLy8gdG8gcHJldmVudCB0d28gc3VjaCBvcGVyYXRpb25zIGZyb20gb2NjdXJyaW5nIGNvbmN1cnJlbnRseS4KLSAgLy8KLSAgLy8gTm90ZSB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIG9iamVjdHMgY2FuIGNvZXhpc3QgaW4gYQotICAvLyBjaXJjbGUgKGUuZy4gbGlua2VkX3B0cjxCYXNlPiwgbGlua2VkX3B0cjxEZXJpdmVkMT4sIGFuZAotICAvLyBsaW5rZWRfcHRyPERlcml2ZWQyPikuICBUaGVyZWZvcmUgd2UgbXVzdCB1c2UgYSBzaW5nbGUgbXV0ZXggdG8KLSAgLy8gcHJvdGVjdCBhbGwgbGlua2VkX3B0ciBvYmplY3RzLiAgVGhpcyBjYW4gY3JlYXRlIHNlcmlvdXMKLSAgLy8gY29udGVudGlvbiBpbiBwcm9kdWN0aW9uIGNvZGUsIGJ1dCBpcyBhY2NlcHRhYmxlIGluIGEgdGVzdGluZwotICAvLyBmcmFtZXdvcmsuCi0KLSAgLy8gSm9pbiBhbiBleGlzdGluZyBjaXJjbGUuCi0gIHZvaWQgam9pbihsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwdHIpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2xpbmtlZF9wdHJfbXV0ZXgpIHsKLSAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKLQotICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBwdHI7Ci0gICAgd2hpbGUgKHAtPm5leHRfICE9IHB0cikgewotICAgICAgcG9zaXg6OkFzc2VydChwLT5uZXh0XyAhPSB0aGlzICYmCi0gICAgICAgICAgICAgIlRyeWluZyB0byBqb2luKCkgYSBsaW5rZWQgcmluZyB3ZSBhcmUgYWxyZWFkeSBpbi4gIgotICAgICAgICAgICAgICJJcyBHTW9jayB0aHJlYWQgc2FmZXR5IGVuYWJsZWQ/Iik7Ci0gICAgICBwID0gcC0+bmV4dF87Ci0gICAgfQotICAgIHAtPm5leHRfID0gdGhpczsKLSAgICBuZXh0XyA9IHB0cjsKLSAgfQotCi0gIC8vIExlYXZlIHdoYXRldmVyIGNpcmNsZSB3ZSdyZSBwYXJ0IG9mLiAgUmV0dXJucyB0cnVlIGlmIHdlIHdlcmUgdGhlCi0gIC8vIGxhc3QgbWVtYmVyIG9mIHRoZSBjaXJjbGUuICBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBqb2luKCkgYW5vdGhlci4KLSAgYm9vbCBkZXBhcnQoKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19saW5rZWRfcHRyX211dGV4KSB7Ci0gICAgTXV0ZXhMb2NrIGxvY2soJmdfbGlua2VkX3B0cl9tdXRleCk7Ci0KLSAgICBpZiAobmV4dF8gPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0gICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IG5leHRfOwotICAgIHdoaWxlIChwLT5uZXh0XyAhPSB0aGlzKSB7Ci0gICAgICBwb3NpeDo6QXNzZXJ0KHAtPm5leHRfICE9IG5leHRfICYmCi0gICAgICAgICAgICAgIlRyeWluZyB0byBkZXBhcnQoKSBhIGxpbmtlZCByaW5nIHdlIGFyZSBub3QgaW4uICIKLSAgICAgICAgICAgICAiSXMgR01vY2sgdGhyZWFkIHNhZmV0eSBlbmFibGVkPyIpOwotICAgICAgcCA9IHAtPm5leHRfOwotICAgIH0KLSAgICBwLT5uZXh0XyA9IG5leHRfOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBuZXh0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgbGlua2VkX3B0ciB7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOwotCi0gIC8vIFRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYSByYXcgcG9pbnRlci4gIFRoaXMgc2hvdWxkIGhhcHBlbiBhcyBzb29uIGFzCi0gIC8vIHBvc3NpYmxlIGFmdGVyIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KLSAgZXhwbGljaXQgbGlua2VkX3B0cihUKiBwdHIgPSBOVUxMKSB7IGNhcHR1cmUocHRyKTsgfQotICB+bGlua2VkX3B0cigpIHsgZGVwYXJ0KCk7IH0KLQotICAvLyBDb3B5IGFuIGV4aXN0aW5nIGxpbmtlZF9wdHI8PiwgYWRkaW5nIG91cnNlbHZlcyB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0cihsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsgY29weSgmcHRyKTsgfQotICBsaW5rZWRfcHRyKGxpbmtlZF9wdHIgY29uc3QmIHB0cikgeyAgLy8gTk9MSU5UCi0gICAgcG9zaXg6OkFzc2VydCgmcHRyICE9IHRoaXMpOwotICAgIGNvcHkoJnB0cik7Ci0gIH0KLQotICAvLyBBc3NpZ25tZW50IHJlbGVhc2VzIHRoZSBvbGQgdmFsdWUgYW5kIGFjcXVpcmVzIHRoZSBuZXcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7Ci0gICAgZGVwYXJ0KCk7Ci0gICAgY29weSgmcHRyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0ciBjb25zdCYgcHRyKSB7Ci0gICAgaWYgKCZwdHIgIT0gdGhpcykgewotICAgICAgZGVwYXJ0KCk7Ci0gICAgICBjb3B5KCZwdHIpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBTbWFydCBwb2ludGVyIG1lbWJlcnMuCi0gIHZvaWQgcmVzZXQoVCogcHRyID0gTlVMTCkgewotICAgIGRlcGFydCgpOwotICAgIGNhcHR1cmUocHRyKTsKLSAgfQotICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdmFsdWVfOyB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyA9PSBwOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gIT0gcDsgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KLSAgYm9vbCBvcGVyYXRvcj09KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV8gPT0gcHRyLmdldCgpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBib29sIG9wZXJhdG9yIT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXyAhPSBwdHIuZ2V0KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBmcmllbmQgY2xhc3MgbGlua2VkX3B0cjsKLQotICBUKiB2YWx1ZV87Ci0gIGxpbmtlZF9wdHJfaW50ZXJuYWwgbGlua187Ci0KLSAgdm9pZCBkZXBhcnQoKSB7Ci0gICAgaWYgKGxpbmtfLmRlcGFydCgpKSBkZWxldGUgdmFsdWVfOwotICB9Ci0KLSAgdm9pZCBjYXB0dXJlKFQqIHB0cikgewotICAgIHZhbHVlXyA9IHB0cjsKLSAgICBsaW5rXy5qb2luX25ldygpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHZvaWQgY29weShsaW5rZWRfcHRyPFU+IGNvbnN0KiBwdHIpIHsKLSAgICB2YWx1ZV8gPSBwdHItPmdldCgpOwotICAgIGlmICh2YWx1ZV8pCi0gICAgICBsaW5rXy5qb2luKCZwdHItPmxpbmtfKTsKLSAgICBlbHNlCi0gICAgICBsaW5rXy5qb2luX25ldygpOwotICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKLWJvb2wgb3BlcmF0b3I9PShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKLSAgcmV0dXJuIHB0ciA9PSB4LmdldCgpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKLWJvb2wgb3BlcmF0b3IhPShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKLSAgcmV0dXJuIHB0ciAhPSB4LmdldCgpOwotfQotCi0vLyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgVCogaW50byBsaW5rZWRfcHRyPFQ+Ci0vLyBEb2luZyBlLmcuIG1ha2VfbGlua2VkX3B0cihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpIGlzIGEgc2hvcnRlciBub3RhdGlvbgotLy8gZm9yIGxpbmtlZF9wdHI8Rm9vQmFyQmF6PHR5cGU+ID4obmV3IEZvb0JhckJhejx0eXBlPihhcmcpKQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1saW5rZWRfcHRyPFQ+IG1ha2VfbGlua2VkX3B0cihUKiBwdHIpIHsKLSAgcmV0dXJuIGxpbmtlZF9wdHI8VD4ocHRyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyMWUyMi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxNTAgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0KLS8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0vLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCA1MCBhcmd1bWVudHMgaW4gVmFsdWVzLAotLy8gYW5kIGF0IG1vc3QgMTAgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0Ci0vLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KLS8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCi0vLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHVwbGUgd2hpY2ggaXMKLS8vIGN1cnJlbnRseSBzZXQgYXQgMTAuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCi0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4KLS8vIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KLVZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCk7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKTsKLQotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVXNlZCBpbiB0aGUgVmFsdWVzKCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBwb2x5bW9ycGhpYyBjYXBhYmlsaXRpZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1jbGFzcyBWYWx1ZUFycmF5MSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBWYWx1ZUFycmF5MShUMSB2MSkgOiB2MV8odjEpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWNsYXNzIFZhbHVlQXJyYXkyIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyKFQxIHYxLCBUMiB2MikgOiB2MV8odjEpLCB2Ml8odjIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWNsYXNzIFZhbHVlQXJyYXkzIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1jbGFzcyBWYWx1ZUFycmF5NCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1jbGFzcyBWYWx1ZUFycmF5NSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKLSAgICAgIHY0Xyh2NCksIHY1Xyh2NSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1jbGFzcyBWYWx1ZUFycmF5NiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgotY2xhc3MgVmFsdWVBcnJheTcgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2Nykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1jbGFzcyBWYWx1ZUFycmF5OCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICAgIFQ4IHY4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotY2xhc3MgVmFsdWVBcnJheTkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAotICAgICAgVDkgdjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTkmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotY2xhc3MgVmFsdWVBcnJheTEwIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTAmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTE+Ci1jbGFzcyBWYWx1ZUFycmF5MTEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTExKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KLWNsYXNzIFZhbHVlQXJyYXkxMiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEyJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgotY2xhc3MgVmFsdWVBcnJheTEzIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEzJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0PgotY2xhc3MgVmFsdWVBcnJheTE0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1PgotY2xhc3MgVmFsdWVBcnJheTE1IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgOiB2MV8odjEpLCB2Ml8odjIpLAotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE1JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTY+Ci1jbGFzcyBWYWx1ZUFycmF5MTYgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2KSA6IHYxXyh2MSksCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKLSAgICAgIHYxNl8odjE2KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+Ci1jbGFzcyBWYWx1ZUFycmF5MTcgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAotICAgICAgVDE3IHYxNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE3JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+Ci1jbGFzcyBWYWx1ZUFycmF5MTggewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+Ci1jbGFzcyBWYWx1ZUFycmF5MTkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAotICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAotICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE5JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+Ci1jbGFzcyBWYWx1ZUFycmF5MjAgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjE+Ci1jbGFzcyBWYWx1ZUFycmF5MjEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAotICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+Ci1jbGFzcyBWYWx1ZUFycmF5MjIgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+Ci1jbGFzcyBWYWx1ZUFycmF5MjMgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgOiB2MV8odjEpLCB2Ml8odjIpLAotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjMmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0PgotY2xhc3MgVmFsdWVBcnJheTI0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKLSAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KLWNsYXNzIFZhbHVlQXJyYXkyNSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAotICAgICAgVDI1IHYyNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNj4KLWNsYXNzIFZhbHVlQXJyYXkyNiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KLWNsYXNzIFZhbHVlQXJyYXkyNyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAotICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAotICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKLSAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCi0gICAgICB2MjZfKHYyNiksIHYyN18odjI3KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1jbGFzcyBWYWx1ZUFycmF5MjggewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTI4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCi0gICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAotICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKLSAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5PgotY2xhc3MgVmFsdWVBcnJheTI5IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCi0gICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKLSAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCi0gICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAotICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyOSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KLWNsYXNzIFZhbHVlQXJyYXkzMCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMwJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzE+Ci1jbGFzcyBWYWx1ZUFycmF5MzEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTMxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIDogdjFfKHYxKSwgdjJfKHYyKSwKLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCi0gICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKLSAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgotY2xhc3MgVmFsdWVBcnJheTMyIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyKSA6IHYxXyh2MSksCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKLSAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAotICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzImIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KLWNsYXNzIFZhbHVlQXJyYXkzMyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKLSAgICAgIFQzMyB2MzMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCi0gICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAotICAgICAgdjMzXyh2MzMpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0PgotY2xhc3MgVmFsdWVBcnJheTM0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+Ci1jbGFzcyBWYWx1ZUFycmF5MzUgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAotICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKLSAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCi0gICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzUmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2PgotY2xhc3MgVmFsdWVBcnJheTM2IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAotICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKLSAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KLWNsYXNzIFZhbHVlQXJyYXkzNyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKLSAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKLSAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCi0gICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLAotICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwKLSAgICAgIHYzNl8odjM2KSwgdjM3Xyh2MzcpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgotY2xhc3MgVmFsdWVBcnJheTM4IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKLSAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+Ci1jbGFzcyBWYWx1ZUFycmF5MzkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM5JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KLWNsYXNzIFZhbHVlQXJyYXk0MCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKLSAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCi0gICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLAotICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwKLSAgICAgIHY0MF8odjQwKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQwJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxPgotY2xhc3MgVmFsdWVBcnJheTQxIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0MShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKLSAgICAgIFQ0MSB2NDEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCi0gICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAotICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKLSAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDEmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+Ci1jbGFzcyBWYWx1ZUFycmF5NDIgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgICAgVDQyIHY0MikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLWNsYXNzIFZhbHVlQXJyYXk0MyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAotICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKLSAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCi0gICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLAotICAgICAgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQzJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLSAgY29uc3QgVDQzIHY0M187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgotY2xhc3MgVmFsdWVBcnJheTQ0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCi0gICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAotICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKLSAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCi0gICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLAotICAgICAgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwKLSAgICAgIHY0M18odjQzKSwgdjQ0Xyh2NDQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLSAgY29uc3QgVDQzIHY0M187Ci0gIGNvbnN0IFQ0NCB2NDRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgotY2xhc3MgVmFsdWVBcnJheTQ1IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKLSAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKLSAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCi0gICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLAotICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwKLSAgICAgIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksCi0gICAgICB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ1JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLSAgY29uc3QgVDQzIHY0M187Ci0gIGNvbnN0IFQ0NCB2NDRfOwotICBjb25zdCBUNDUgdjQ1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDY+Ci1jbGFzcyBWYWx1ZUFycmF5NDYgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQ2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKLSAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksCi0gICAgICB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDYmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KLWNsYXNzIFZhbHVlQXJyYXk0NyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKLSAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksCi0gICAgICB2NDdfKHY0Nykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KLWNsYXNzIFZhbHVlQXJyYXk0OCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4KSA6IHYxXyh2MSksCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKLSAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAotICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKLSAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCi0gICAgICB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLAotICAgICAgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDgmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci0gIGNvbnN0IFQ0OCB2NDhfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KLWNsYXNzIFZhbHVlQXJyYXk0OSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LAotICAgICAgVDQ5IHY0OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKLSAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pLCBzdGF0aWNfY2FzdDxUPih2NDlfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDkmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci0gIGNvbnN0IFQ0OCB2NDhfOwotICBjb25zdCBUNDkgdjQ5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLWNsYXNzIFZhbHVlQXJyYXk1MCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LAotICAgICAgVDUwIHY1MCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKLSAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpLCB2NTBfKHY1MCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4XyksIHN0YXRpY19jYXN0PFQ+KHY0OV8pLCBzdGF0aWNfY2FzdDxUPih2NTBfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NTAmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci0gIGNvbnN0IFQ0OCB2NDhfOwotICBjb25zdCBUNDkgdjQ5XzsKLSAgY29uc3QgVDUwIHY1MF87Ci19OwotCi0jIGlmIEdURVNUX0hBU19DT01CSU5FCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdmFsdWVzIHByb2R1Y2VkCi0vLyBieSB0aGUgYXJndW1lbnQgZ2VuZXJhdG9ycy4KLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyKQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MikgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0gICAgICBTQl9EQ0hFQ0soIUF0RW5kKCkpOwotI2Vsc2UKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0jZW5kaWYKLSAgICAgICsrY3VycmVudDJfOwotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMjo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyJiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzPiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzPiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzKQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDNfOwotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM187Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMzo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzJiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMwotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0Ci0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDRfOwotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSgpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDVfOwotICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgewotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOwotICAgICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCi0gICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8Ci0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjU6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsCi0gICAgICAgIFQ2PiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNikKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNigpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKLSAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NikgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50Nl87Ci0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7Ci0gICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87Ci0gICAgICAgICsrY3VycmVudDVfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgewotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOwotICAgICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCi0gICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2Xyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCi0gICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKLSAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNjo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2JiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNgotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAotICAgICAgICBUNz4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCi0gICAgICAgIGc3Xy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKLSAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCi0gICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDdfOwotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgewotICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOwotICAgICAgICArK2N1cnJlbnQ2XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKLSAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKLSAgICAgICAgKytjdXJyZW50NV87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7Ci0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87Ci0gICAgICAgICsrY3VycmVudDRfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCi0gICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAotICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAotICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAotICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAotICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8Ci0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8Ci0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8Ci0gICAgICAgICAgY3VycmVudDdfID09IGVuZDdfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCi0gICAgICAgIFQ3LCBUOD4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCi0gICAgICAgICAgZzhfKGc4KSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCgpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAotICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCi0gICAgICAgIGc4Xy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKLSAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCi0gICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDhfOwotICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgewotICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOwotICAgICAgICArK2N1cnJlbnQ3XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKLSAgICAgICAgKytjdXJyZW50Nl87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7Ci0gICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87Ci0gICAgICAgICsrY3VycmVudDVfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgewotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOwotICAgICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCi0gICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCi0gICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAotICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAotICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAotICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAotICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAotICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAotICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCi0gICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8Ci0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8Ci0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8Ci0gICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8Ci0gICAgICAgICAgY3VycmVudDhfID09IGVuZDhfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAotICAgICAgICBUNywgVDgsIFQ5PiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzkpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCi0gICAgICAgICAgZzlfKGc5KSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOSgpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAotICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCi0gICAgICAgIGc4Xy5lbmQoKSwgZzlfLCBnOV8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciYgY3VycmVudDgsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciYgY3VycmVudDkpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKLSAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCi0gICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAotICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSwKLSAgICAgICAgICBiZWdpbjlfKGc5LmJlZ2luKCkpLCBlbmQ5XyhnOS5lbmQoKSksIGN1cnJlbnQ5XyhjdXJyZW50OSkgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50OV87Ci0gICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7Ci0gICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87Ci0gICAgICAgICsrY3VycmVudDhfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgewotICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOwotICAgICAgICArK2N1cnJlbnQ3XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKLSAgICAgICAgKytjdXJyZW50Nl87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7Ci0gICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87Ci0gICAgICAgICsrY3VycmVudDVfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgewotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOwotICAgICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCi0gICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCi0gICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKLSAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5Xyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCi0gICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKLSAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCi0gICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKLSAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCi0gICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCi0gICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKLSAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XyksCi0gICAgICAgIGJlZ2luOV8ob3RoZXIuYmVnaW45XyksCi0gICAgICAgIGVuZDlfKG90aGVyLmVuZDlfKSwKLSAgICAgICAgY3VycmVudDlfKG90aGVyLmN1cnJlbnQ5XykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8sCi0gICAgICAgICAgICAqY3VycmVudDlfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8Ci0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8Ci0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8Ci0gICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8Ci0gICAgICAgICAgY3VycmVudDhfID09IGVuZDhfIHx8Ci0gICAgICAgICAgY3VycmVudDlfID09IGVuZDlfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBiZWdpbjlfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgZW5kOV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBjdXJyZW50OV87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjk6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOSYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAotICAgICAgICBUNywgVDgsIFQ5LCBUMTA+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKLSAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCi0gICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpLCBnMTBfLCBnMTBfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAotICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpLCBnMTBfLCBnMTBfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3ImIGN1cnJlbnQxMCkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKLSAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCi0gICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAotICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSwKLSAgICAgICAgICBiZWdpbjEwXyhnMTAuYmVnaW4oKSksIGVuZDEwXyhnMTAuZW5kKCkpLCBjdXJyZW50MTBfKGN1cnJlbnQxMCkgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50MTBfOwotICAgICAgaWYgKGN1cnJlbnQxMF8gPT0gZW5kMTBfKSB7Ci0gICAgICAgIGN1cnJlbnQxMF8gPSBiZWdpbjEwXzsKLSAgICAgICAgKytjdXJyZW50OV87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7Ci0gICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87Ci0gICAgICAgICsrY3VycmVudDhfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgewotICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOwotICAgICAgICArK2N1cnJlbnQ3XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKLSAgICAgICAgKytjdXJyZW50Nl87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7Ci0gICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87Ci0gICAgICAgICsrY3VycmVudDVfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgewotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOwotICAgICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCi0gICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCi0gICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKLSAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5XyAmJgotICAgICAgICAgIGN1cnJlbnQxMF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxMF8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAotICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAotICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAotICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAotICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAotICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAotICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCi0gICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAotICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAotICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCi0gICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pLAotICAgICAgICBiZWdpbjEwXyhvdGhlci5iZWdpbjEwXyksCi0gICAgICAgIGVuZDEwXyhvdGhlci5lbmQxMF8pLAotICAgICAgICBjdXJyZW50MTBfKG90aGVyLmN1cnJlbnQxMF8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAotICAgICAgICAgICAgKmN1cnJlbnQ5XywgKmN1cnJlbnQxMF8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKLSAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKLSAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKLSAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV8gfHwKLSAgICAgICAgICBjdXJyZW50MTBfID09IGVuZDEwXzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGJlZ2luMTBfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGVuZDEwXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBjdXJyZW50MTBfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMDo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4gZzEwXzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKLQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdwotLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCi0vLyBjb252ZXJ0aWJsZSB0byBVLgotLy8KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXIyKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyPFQxLCBUMj4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMiYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMgotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMz4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzIHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDM+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDM+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMzxUMSwgVDIsIFQzPigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIzJiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMwotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI0KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDxUMSwgVDIsIFQzLCBUND4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0Ci0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjU+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTxUMSwgVDIsIFQzLCBUNCwgVDU+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNj4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2IHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNikKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgdHlwZW5hbWUgVDY+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI2JiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOwotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNgotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI3KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAotICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNykKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAotICAgICAgVDc+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87Ci0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOwotICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNwotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAotICAgIGNsYXNzIEdlbmVyYXRvcjg+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKLSAgICAgICAgICBnOF8oZzgpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywKLSAgICAgIFQ4PiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87Ci0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOwotICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKLSAgY29uc3QgR2VuZXJhdG9yOCBnOF87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKLSAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI5KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAotICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCi0gICAgY29uc3QgR2VuZXJhdG9yOSYgZzkpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCi0gICAgICAgICAgZzlfKGc5KSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKLSAgICAgIFQ5PiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCi0gICAgICAgIFQ5PiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOSYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKLSAgY29uc3QgR2VuZXJhdG9yNiBnNl87Ci0gIGNvbnN0IEdlbmVyYXRvcjcgZzdfOwotICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKLSAgY29uc3QgR2VuZXJhdG9yOSBnOV87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKLSAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5LCBjbGFzcyBHZW5lcmF0b3IxMD4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAotICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCi0gICAgY29uc3QgR2VuZXJhdG9yOSYgZzksIGNvbnN0IEdlbmVyYXRvcjEwJiBnMTApCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCi0gICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LAotICAgICAgVDEwPiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LAotICAgICAgICBUMTA+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKLSAgICAgICAgICAgIFQxMD4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxMD4gPihnMTBfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKLSAgY29uc3QgR2VuZXJhdG9yNiBnNl87Ci0gIGNvbnN0IEdlbmVyYXRvcjcgZzdfOwotICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKLSAgY29uc3QgR2VuZXJhdG9yOSBnOV87Ci0gIGNvbnN0IEdlbmVyYXRvcjEwIGcxMF87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwCi0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3YzQ3YS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgotJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0KLS8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0vLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCAkbiBhcmd1bWVudHMgaW4gVmFsdWVzLAotLy8gYW5kIGF0IG1vc3QgJG1heHR1cGxlIGFyZ3VtZW50cyBpbiBDb21iaW5lLiBQbGVhc2UgY29udGFjdAotLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkIG1vcmUuCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIENvbWJpbmUgaXMgbGltaXRlZAotLy8gYnkgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlIHdoaWNoIGlzCi0vLyBjdXJyZW50bHkgc2V0IGF0ICRtYXh0dXBsZS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KLQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAotLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAotLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBWYWx1ZXNJbigpLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBpbgotLy8gaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOwotCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCi0gICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBVc2VkIGluIHRoZSBWYWx1ZXMoKSBmdW5jdGlvbiB0byBwcm92aWRlIHBvbHltb3JwaGljIGNhcGFiaWxpdGllcy4KLSRyYW5nZSBpIDEuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotY2xhc3MgVmFsdWVBcnJheSRpIHsKLSBwdWJsaWM6Ci0gICRpZiBpPT0xIFtbZXhwbGljaXQgXV1WYWx1ZUFycmF5JGkoJGZvciBqLCBbW1QkaiB2JGpdXSkgOiAkZm9yIGosIFtbdiQoailfKHYkaildXSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7JGZvciBqLCBbW3N0YXRpY19jYXN0PFQ+KHYkKGopXyldXX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5JGkmIG90aGVyKTsKLQotJGZvciBqIFtbCi0KLSAgY29uc3QgVCRqIHYkKGopXzsKLV1dCi0KLX07Ci0KLV1dCi0KLSMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB2YWx1ZXMgcHJvZHVjZWQKLS8vIGJ5IHRoZSBhcmd1bWVudCBnZW5lcmF0b3JzLgotLy8KLSRyYW5nZSBpIDIuLm1heHR1cGxlCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSRyYW5nZSBrIDIuLmkKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaQotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpKCRmb3IgaiwgW1tjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+JiBnJGpdXSkKLSAgICAgIDogJGZvciBqLCBbW2ckKGopXyhnJGopXV0ge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCAkZm9yIGosIFtbZyQoailfLCBnJChqKV8uYmVnaW4oKV1dKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgJGZvciBqLCBbW2ckKGopXywgZyQoailfLmVuZCgpXV0pOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsICRmb3IgaiwgW1sKLQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiYgZyRqLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3ImIGN1cnJlbnQkKGopXV0pCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0kZm9yIGosIFtbCi0KLSAgICAgICAgICBiZWdpbiQoailfKGckai5iZWdpbigpKSwgZW5kJChqKV8oZyRqLmVuZCgpKSwgY3VycmVudCQoailfKGN1cnJlbnQkaikKLV1dICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudCQoaSlfOwotCi0kZm9yIGsgW1sKLSAgICAgIGlmIChjdXJyZW50JChpKzItaylfID09IGVuZCQoaSsyLWspXykgewotICAgICAgICBjdXJyZW50JChpKzItaylfID0gYmVnaW4kKGkrMi1rKV87Ci0gICAgICAgICsrY3VycmVudCQoaSsyLWstMSlfOwotICAgICAgfQotCi1dXQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoJGZvciBqICAmJiBbWwotCi0gICAgICAgICAgY3VycmVudCQoailfID09IHR5cGVkX290aGVyLT5jdXJyZW50JChqKV8KLV1dKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwgJGZvciBqLCBbWwotCi0gICAgICAgIGJlZ2luJChqKV8ob3RoZXIuYmVnaW4kKGopXyksCi0gICAgICAgIGVuZCQoailfKG90aGVyLmVuZCQoailfKSwKLSAgICAgICAgY3VycmVudCQoailfKG90aGVyLmN1cnJlbnQkKGopXykKLV1dIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCRmb3IgaiwgW1sqY3VycmVudCQoailfXV0pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSRmb3IgaiAgfHwgW1sKLQotICAgICAgICAgIGN1cnJlbnQkKGopXyA9PSBlbmQkKGopXwotXV07Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSRmb3IgaiBbWwotCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgYmVnaW4kKGopXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciBlbmQkKGopXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciBjdXJyZW50JChqKV87Ci1dXQotCi0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpOjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpJiBvdGhlcik7Ci0KLQotJGZvciBqIFtbCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4gZyQoailfOwotCi1dXQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaQotCi0KLV1dCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gSGVscGVyIGNsYXNzZXMgcHJvdmlkaW5nIENvbWJpbmUoKSB3aXRoIHBvbHltb3JwaGljIGZlYXR1cmVzLiBUaGV5IGFsbG93Ci0vLyBjYXN0aW5nIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3JOPFQ+IHRvIFBhcmFtR2VuZXJhdG9yPFU+IGlmIFQgaXMKLS8vIGNvbnZlcnRpYmxlIHRvIFUuCi0vLwotJHJhbmdlIGkgMi4ubWF4dHVwbGUKLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW2NsYXNzIEdlbmVyYXRvciRqXV0+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSgkZm9yIGosIFtbY29uc3QgR2VuZXJhdG9yJGomIGckal1dKQotICAgICAgOiAkZm9yIGosIFtbZyQoailfKGckaildXSB7fQotICB0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaTwkZm9yIGosIFtbVCRqXV0+KAotJGZvciBqLFtbCi0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VCRqPiA+KGckKGopXykKLV1dKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpJiBvdGhlcik7Ci0KLQotJGZvciBqIFtbCi0gIGNvbnN0IEdlbmVyYXRvciRqIGckKGopXzsKLQotXV0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkKLQotXV0KLQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNhYjliLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotCi0vLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIElucHV0IHRvIGEgcGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgZ2VuZXJhdG9yLCBkZXNjcmliaW5nIGEgdGVzdCBwYXJhbWV0ZXIuCi0vLyBDb25zaXN0cyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlIGFuZCB0aGUgaW50ZWdlciBwYXJhbWV0ZXIgaW5kZXguCi10ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgotc3RydWN0IFRlc3RQYXJhbUluZm8gewotICBUZXN0UGFyYW1JbmZvKGNvbnN0IFBhcmFtVHlwZSYgYV9wYXJhbSwgc2l6ZV90IGFuX2luZGV4KSA6Ci0gICAgcGFyYW0oYV9wYXJhbSksCi0gICAgaW5kZXgoYW5faW5kZXgpIHt9Ci0gIFBhcmFtVHlwZSBwYXJhbTsKLSAgc2l6ZV90IGluZGV4OwotfTsKLQotLy8gQSBidWlsdGluIHBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lIGdlbmVyYXRvciB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2YKLS8vIHRlc3Rpbmc6OlByaW50VG9TdHJpbmcuCi1zdHJ1Y3QgUHJpbnRUb1N0cmluZ1BhcmFtTmFtZSB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Ci0gIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKCkoY29uc3QgVGVzdFBhcmFtSW5mbzxQYXJhbVR5cGU+JiBpbmZvKSBjb25zdCB7Ci0gICAgcmV0dXJuIFByaW50VG9TdHJpbmcoaW5mby5wYXJhbSk7Ci0gIH0KLX07Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gT3V0cHV0cyBhIG1lc3NhZ2UgZXhwbGFpbmluZyBpbnZhbGlkIHJlZ2lzdHJhdGlvbiBvZiBkaWZmZXJlbnQKLS8vIGZpeHR1cmUgY2xhc3MgZm9yIHRoZSBzYW1lIHRlc3QgY2FzZS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4KLS8vIFRFU1RfUCBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSB0d28gdGVzdHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0vLyBidXQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCi1HVEVTVF9BUElfIHZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTsKLXRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3I7Ci0KLS8vIEludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgZWxlbWVudHMgcHJvdmlkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24KLS8vIG9mIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflBhcmFtSXRlcmF0b3JJbnRlcmZhY2UoKSB7fQotICAvLyBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgZ2VuZXJhdG9yIGluc3RhbmNlLgotICAvLyBVc2VkIG9ubHkgZm9yIHRoZSBwdXJwb3NlcyBvZiBpdGVyYXRvciBjb21wYXJpc29uCi0gIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHR3byBpdGVyYXRvcnMgYmVsb25nIHRvIHRoZSBzYW1lIGdlbmVyYXRvci4KLSAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0ID0gMDsKLSAgLy8gQWR2YW5jZXMgaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudAotICAvLyBwcm92aWRlZCBieSB0aGUgZ2VuZXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCi0gIC8vIGZvciBub3QgY2FsbGluZyBBZHZhbmNlKCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8KLSAgLy8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KLSAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSA9IDA7Ci0gIC8vIENsb25lcyB0aGUgaXRlcmF0b3Igb2JqZWN0LiBVc2VkIGZvciBpbXBsZW1lbnRpbmcgY29weSBzZW1hbnRpY3MKLSAgLy8gb2YgUGFyYW1JdGVyYXRvcjxUPi4KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKiBDbG9uZSgpIGNvbnN0ID0gMDsKLSAgLy8gRGVyZWZlcmVuY2VzIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGFuZCBwcm92aWRlcyAocmVhZC1vbmx5KSBhY2Nlc3MKLSAgLy8gdG8gdGhlIHBvaW50ZWQgdmFsdWUuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSBub3QgdG8gY2FsbAotICAvLyBDdXJyZW50KCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4KLSAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvciooKS4KLSAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgPSAwOwotICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCBvdGhlciBwb2ludCB0byB0aGUgc2FtZQotICAvLyBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvci4KLSAgLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFBhcmFtR2VuZXJhdG9yPFQ+OjpvcGVyYXRvcj09KCkuCi0gIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZSYgb3RoZXIpIGNvbnN0ID0gMDsKLX07Ci0KLS8vIENsYXNzIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mCi0vLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4gSXQgd3JhcHMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPgotLy8gYW5kIGltcGxlbWVudHMgdGhlIGNvbnN0IGZvcndhcmQgaXRlcmF0b3IgY29uY2VwdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUGFyYW1JdGVyYXRvciB7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBjb25zdCBUJiByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLQotICAvLyBQYXJhbUl0ZXJhdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBpbXBsXyBwb2ludGVyLgotICBQYXJhbUl0ZXJhdG9yKGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSA6IGltcGxfKG90aGVyLmltcGxfLT5DbG9uZSgpKSB7fQotICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIHsKLSAgICBpZiAodGhpcyAhPSAmb3RoZXIpCi0gICAgICBpbXBsXy5yZXNldChvdGhlci5pbXBsXy0+Q2xvbmUoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmltcGxfLT5DdXJyZW50KCk7IH0KLSAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5DdXJyZW50KCk7IH0KLSAgLy8gUHJlZml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KLSAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKLSAgICBpbXBsXy0+QWR2YW5jZSgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAvLyBQb3N0Zml4IHZlcnNpb24gb2Ygb3BlcmF0b3IrKy4KLSAgUGFyYW1JdGVyYXRvciBvcGVyYXRvcisrKGludCAvKnVudXNlZCovKSB7Ci0gICAgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogY2xvbmUgPSBpbXBsXy0+Q2xvbmUoKTsKLSAgICBpbXBsXy0+QWR2YW5jZSgpOwotICAgIHJldHVybiBQYXJhbUl0ZXJhdG9yKGNsb25lKTsKLSAgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gaW1wbF8uZ2V0KCkgPT0gb3RoZXIuaW1wbF8uZ2V0KCkgfHwgaW1wbF8tPkVxdWFscygqb3RoZXIuaW1wbF8pOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIFBhcmFtR2VuZXJhdG9yPFQ+OwotICBleHBsaWNpdCBQYXJhbUl0ZXJhdG9yKFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30KLSAgc2NvcGVkX3B0cjxQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87Ci19OwotCi0vLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpcyB0aGUgYmluYXJ5IGludGVyZmFjZSB0byBhY2Nlc3MgZ2VuZXJhdG9ycwotLy8gZGVmaW5lZCBpbiBvdGhlciB0cmFuc2xhdGlvbiB1bml0cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKLQotICB2aXJ0dWFsIH5QYXJhbUdlbmVyYXRvckludGVyZmFjZSgpIHt9Ci0KLSAgLy8gR2VuZXJhdG9yIGludGVyZmFjZSBkZWZpbml0aW9uCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgPSAwOwotfTsKLQotLy8gV3JhcHMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gYW5kIHByb3ZpZGVzIGdlbmVyYWwgZ2VuZXJhdG9yIHN5bnRheAotLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBTVEwgQ29udGFpbmVyIGNvbmNlcHQuCi0vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgY29weSBpbml0aWFsaXphdGlvbiBzZW1hbnRpY3MgYW5kIHRoZSBjb250YWluZWQKLS8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGluc3RhbmNlIGlzIHNoYXJlZCBhbW9uZyBhbGwgY29waWVzCi0vLyBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhhdCBpbnN0YW5jZSBpcyBpbW11dGFibGUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgUGFyYW1HZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBQYXJhbUl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCi0gIGV4cGxpY2l0IFBhcmFtR2VuZXJhdG9yKFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0gIFBhcmFtR2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXykge30KLQotICBQYXJhbUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgewotICAgIGltcGxfID0gb3RoZXIuaW1wbF87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+QmVnaW4oKSk7IH0KLSAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkVuZCgpKTsgfQotCi0gcHJpdmF0ZToKLSAgbGlua2VkX3B0cjxjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOwotfTsKLQotLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcmFuZ2Ugb2YgdHdvIGNvbXBhcmFibGUgdmFsdWVzLiBDYW4gYmUgdXNlZCB0bwotLy8gZ2VuZXJhdGUgc2VxdWVuY2VzIG9mIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGltcGxlbWVudCBvcGVyYXRvcisoKSBhbmQKLS8vIG9wZXJhdG9yPCgpLgotLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSBSYW5nZSgpIGZ1bmN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+Ci1jbGFzcyBSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7Ci0gcHVibGljOgotICBSYW5nZUdlbmVyYXRvcihUIGJlZ2luLCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKQotICAgICAgOiBiZWdpbl8oYmVnaW4pLCBlbmRfKGVuZCksCi0gICAgICAgIHN0ZXBfKHN0ZXApLCBlbmRfaW5kZXhfKENhbGN1bGF0ZUVuZEluZGV4KGJlZ2luLCBlbmQsIHN0ZXApKSB7fQotICB2aXJ0dWFsIH5SYW5nZUdlbmVyYXRvcigpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGJlZ2luXywgMCwgc3RlcF8pOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZW5kXywgZW5kX2luZGV4Xywgc3RlcF8pOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwgVCB2YWx1ZSwgaW50IGluZGV4LAotICAgICAgICAgICAgIEluY3JlbWVudFQgc3RlcCkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwgdmFsdWVfKHZhbHVlKSwgaW5kZXhfKGluZGV4KSwgc3RlcF8oc3RlcCkge30KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIHZhbHVlXyA9IHN0YXRpY19jYXN0PFQ+KHZhbHVlXyArIHN0ZXBfKTsKLSAgICAgIGluZGV4XysrOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZ2YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBpbnQgb3RoZXJfaW5kZXggPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aW5kZXhfOwotICAgICAgcmV0dXJuIGluZGV4XyA9PSBvdGhlcl9pbmRleDsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKLSAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksIHZhbHVlXyhvdGhlci52YWx1ZV8pLCBpbmRleF8ob3RoZXIuaW5kZXhfKSwKLSAgICAgICAgICBzdGVwXyhvdGhlci5zdGVwXykge30KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOwotICAgIFQgdmFsdWVfOwotICAgIGludCBpbmRleF87Ci0gICAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKLSAgfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgotCi0gIHN0YXRpYyBpbnQgQ2FsY3VsYXRlRW5kSW5kZXgoY29uc3QgVCYgYmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluY3JlbWVudFQmIHN0ZXApIHsKLSAgICBpbnQgZW5kX2luZGV4ID0gMDsKLSAgICBmb3IgKFQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpID0gc3RhdGljX2Nhc3Q8VD4oaSArIHN0ZXApKQotICAgICAgZW5kX2luZGV4Kys7Ci0gICAgcmV0dXJuIGVuZF9pbmRleDsKLSAgfQotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUmFuZ2VHZW5lcmF0b3ImIG90aGVyKTsKLQotICBjb25zdCBUIGJlZ2luXzsKLSAgY29uc3QgVCBlbmRfOwotICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOwotICAvLyBUaGUgaW5kZXggZm9yIHRoZSBlbmQoKSBpdGVyYXRvci4gQWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkCi0gIC8vIHNlcXVlbmNlIGFyZSBpbmRleGVkICgwLWJhc2VkKSB0byBhaWQgaXRlcmF0b3IgY29tcGFyaXNvbi4KLSAgY29uc3QgaW50IGVuZF9pbmRleF87Ci19OyAgLy8gY2xhc3MgUmFuZ2VHZW5lcmF0b3IKLQotCi0vLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFVzZWQgaW4gdGhlCi0vLyBWYWx1ZXNJbigpIGZ1bmN0aW9uLiBUaGUgZWxlbWVudHMgYXJlIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UgcmFuZ2UKLS8vIHNpbmNlIHRoZSBzb3VyY2UgY2FuIGJlIGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBhbmQgdGhlIGdlbmVyYXRvcgotLy8gaXMgbGlrZWx5IHRvIHBlcnNpc3QgYmV5b25kIHRoYXQgc3RhY2sgZnJhbWUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgotICBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKQotICAgICAgOiBjb250YWluZXJfKGJlZ2luLCBlbmQpIHt9Ci0gIHZpcnR1YWwgflZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcigpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGNvbnRhaW5lcl8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6dmVjdG9yPFQ+IENvbnRhaW5lclR5cGU7Ci0KLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGJhc2UsCi0gICAgICAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3IpCi0gICAgICAgIDogYmFzZV8oYmFzZSksIGl0ZXJhdG9yXyhpdGVyYXRvcikge30KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgICsraXRlcmF0b3JfOwotICAgICAgdmFsdWVfLnJlc2V0KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgLy8gV2UgbmVlZCB0byB1c2UgY2FjaGVkIHZhbHVlIHJlZmVyZW5jZWQgYnkgaXRlcmF0b3JfIGJlY2F1c2UgKml0ZXJhdG9yXwotICAgIC8vIGNhbiByZXR1cm4gYSB0ZW1wb3Jhcnkgb2JqZWN0IChhbmQgb2YgdHlwZSBvdGhlciB0aGVuIFQpLCBzbyBqdXN0Ci0gICAgLy8gaGF2aW5nICJyZXR1cm4gJippdGVyYXRvcl87IiBkb2Vzbid0IHdvcmsuCi0gICAgLy8gdmFsdWVfIGlzIHVwZGF0ZWQgaGVyZSBhbmQgbm90IGluIEFkdmFuY2UoKSBiZWNhdXNlIEFkdmFuY2UoKQotICAgIC8vIGNhbiBhZHZhbmNlIGl0ZXJhdG9yXyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIGFuZCB3ZSBjYW5ub3QKLSAgICAvLyBkZXRlY3QgdGhhdCBmYWN0LiBUaGUgY2xpZW50IGNvZGUsIG9uIHRoZSBvdGhlciBoYW5kLCBpcwotICAgIC8vIHJlc3BvbnNpYmxlIGZvciBub3QgY2FsbGluZyBDdXJyZW50KCkgb24gYW4gb3V0LW9mLXJhbmdlIGl0ZXJhdG9yLgotICAgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0IHsKLSAgICAgIGlmICh2YWx1ZV8uZ2V0KCkgPT0gTlVMTCkKLSAgICAgICAgdmFsdWVfLnJlc2V0KG5ldyBUKCppdGVyYXRvcl8pKTsKLSAgICAgIHJldHVybiB2YWx1ZV8uZ2V0KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBpdGVyYXRvcl8gPT0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlciktPml0ZXJhdG9yXzsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICAgIC8vIFRoZSBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIHN1cHByZXNzZXMgYSBmYWxzZSB3YXJuaW5nCi0gICAgICAgICAgLy8gZW1pdHRlZCBieSBnY2Mgd2hlbiBzdXBwbGllZCB3aXRoIHRoZSAtV2V4dHJhIG9wdGlvbi4KLSAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksCi0gICAgICAgICAgYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICAgIGl0ZXJhdG9yXyhvdGhlci5pdGVyYXRvcl8pIHt9Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87Ci0gICAgdHlwZW5hbWUgQ29udGFpbmVyVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3JfOwotICAgIC8vIEEgY2FjaGVkIHZhbHVlIG9mICppdGVyYXRvcl8uIFdlIGtlZXAgaXQgaGVyZSB0byBhbGxvdyBhY2Nlc3MgYnkKLSAgICAvLyBwb2ludGVyIGluIHRoZSB3cmFwcGluZyBpdGVyYXRvcidzIG9wZXJhdG9yLT4oKS4KLSAgICAvLyB2YWx1ZV8gbmVlZHMgdG8gYmUgbXV0YWJsZSB0byBiZSBhY2Nlc3NlZCBpbiBDdXJyZW50KCkuCi0gICAgLy8gVXNlIG9mIHNjb3BlZF9wdHIgaGVscHMgbWFuYWdlIGNhY2hlZCB2YWx1ZSdzIGxpZmV0aW1lLAotICAgIC8vIHdoaWNoIGlzIGJvdW5kIGJ5IHRoZSBsaWZlc3BhbiBvZiB0aGUgaXRlcmF0b3IgaXRzZWxmLgotICAgIG11dGFibGUgc2NvcGVkX3B0cjxjb25zdCBUPiB2YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3ImIG90aGVyKTsKLQotICBjb25zdCBDb250YWluZXJUeXBlIGNvbnRhaW5lcl87Ci19OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gRGVmYXVsdCBwYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSBnZW5lcmF0b3IsIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUKLS8vIGludGVnZXIgdGVzdCBwYXJhbWV0ZXIgaW5kZXguCi10ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgotc3RkOjpzdHJpbmcgRGVmYXVsdFBhcmFtTmFtZShjb25zdCBUZXN0UGFyYW1JbmZvPFBhcmFtVHlwZT4mIGluZm8pIHsKLSAgTWVzc2FnZSBuYW1lX3N0cmVhbTsKLSAgbmFtZV9zdHJlYW0gPDwgaW5mby5pbmRleDsKLSAgcmV0dXJuIG5hbWVfc3RyZWFtLkdldFN0cmluZygpOwotfQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lIG92ZXJsb2FkIGhlbHBlcnMsIHdoaWNoIGhlbHAgdGhlCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBjaG9vc2UgYmV0d2VlbiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJpemVkCi0vLyB0ZXN0IG5hbWUgZ2VuZXJhdG9yIGFuZCB1c2VyIHBhcmFtIG5hbWUgZ2VuZXJhdG9yLgotdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZSwgY2xhc3MgUGFyYW1OYW1lR2VuRnVuY3Rvcj4KLVBhcmFtTmFtZUdlbkZ1bmN0b3IgR2V0UGFyYW1OYW1lR2VuKFBhcmFtTmFtZUdlbkZ1bmN0b3IgZnVuYykgewotICByZXR1cm4gZnVuYzsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KLXN0cnVjdCBQYXJhbU5hbWVHZW5GdW5jIHsKLSAgdHlwZWRlZiBzdGQ6OnN0cmluZyBUeXBlKGNvbnN0IFRlc3RQYXJhbUluZm88UGFyYW1UeXBlPiYpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KLXR5cGVuYW1lIFBhcmFtTmFtZUdlbkZ1bmM8UGFyYW1UeXBlPjo6VHlwZSAqR2V0UGFyYW1OYW1lR2VuKCkgewotICByZXR1cm4gRGVmYXVsdFBhcmFtTmFtZTsKLX0KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBTdG9yZXMgYSBwYXJhbWV0ZXIgdmFsdWUgYW5kIGxhdGVyIGNyZWF0ZXMgdGVzdHMgcGFyYW1ldGVyaXplZCB3aXRoIHRoYXQKLS8vIHZhbHVlLgotdGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KLWNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2xhc3M6OlBhcmFtVHlwZSBQYXJhbVR5cGU7Ci0gIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA6Ci0gICAgICBwYXJhbWV0ZXJfKHBhcmFtZXRlcikge30KLSAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgewotICAgIFRlc3RDbGFzczo6U2V0UGFyYW0oJnBhcmFtZXRlcl8pOwotICAgIHJldHVybiBuZXcgVGVzdENsYXNzKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IFBhcmFtVHlwZSBwYXJhbWV0ZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KTsKLX07Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gVGVzdE1ldGFGYWN0b3J5QmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9yIG1ldGEtZmFjdG9yaWVzIHRoYXQgY3JlYXRlCi0vLyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLgotdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KLWNsYXNzIFRlc3RNZXRhRmFjdG9yeUJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VGVzdE1ldGFGYWN0b3J5QmFzZSgpIHt9Ci0KLSAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpID0gMDsKLX07Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gVGVzdE1ldGFGYWN0b3J5IGNyZWF0ZXMgdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50bwotLy8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uIFNpbmNlIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIHJlY2VpdmVzCi0vLyBvd25lcnNoaXAgb2YgdGVzdCBmYWN0b3J5IHBvaW50ZXIsIHNhbWUgZmFjdG9yeSBvYmplY3QgY2Fubm90IGJlIHBhc3NlZAotLy8gaW50byB0aGF0IG1ldGhvZCB0d2ljZS4gQnV0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gaXMgZ29pbmcgdG8gY2FsbAotLy8gaXQgZm9yIGVhY2ggVGVzdC9QYXJhbWV0ZXIgdmFsdWUgY29tYmluYXRpb24uIFRodXMgaXQgbmVlZHMgbWV0YSBmYWN0b3J5Ci0vLyBjcmVhdG9yIGNsYXNzLgotdGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgotY2xhc3MgVGVzdE1ldGFGYWN0b3J5Ci0gICAgOiBwdWJsaWMgVGVzdE1ldGFGYWN0b3J5QmFzZTx0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOwotCi0gIFRlc3RNZXRhRmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIHsKLSAgICByZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTxUZXN0Q2FzZT4ocGFyYW1ldGVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0TWV0YUZhY3RvcnkpOwotfTsKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlCi0vLyB0byBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGNsYXNzZXMuIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCi0vLyBhY2N1bXVsYXRlcyB0ZXN0IGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IFRFU1RfUCBtYWNybyBpbnZvY2F0aW9ucwotLy8gYW5kIGdlbmVyYXRvcnMgcHJvdmlkZWQgYnkgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMKLS8vIGFuZCB1c2VzIHRoYXQgaW5mb3JtYXRpb24gdG8gcmVnaXN0ZXIgYWxsIHJlc3VsdGluZyB0ZXN0IGluc3RhbmNlcwotLy8gaW4gUmVnaXN0ZXJUZXN0cyBtZXRob2QuIFRoZSBQYXJhbWV0ZXJpemVUZXN0Q2FzZVJlZ2lzdHJ5IGNsYXNzIGhvbGRzCi0vLyBhIGNvbGxlY3Rpb24gb2YgcG9pbnRlcnMgdG8gdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gb2JqZWN0cwotLy8gYW5kIGNhbGxzIFJlZ2lzdGVyVGVzdHMoKSBvbiBlYWNoIG9mIHRoZW0gd2hlbiBhc2tlZC4KLWNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KLQotICAvLyBCYXNlIHBhcnQgb2YgdGVzdCBjYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCi0gIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCA9IDA7Ci0gIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCi0gIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgPSAwOwotICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMKLSAgLy8gdGVzdCBjYXNlIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRoZW0gaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KLSAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQotICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKTsKLX07Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBhY2N1bXVsYXRlcyB0ZXN0cyBvYnRhaW5lZCBmcm9tIFRFU1RfUAotLy8gbWFjcm8gaW52b2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciB0ZXN0IGNhc2UgYW5kIGdlbmVyYXRvcnMKLS8vIG9idGFpbmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMgZm9yIHRoYXQKLS8vIHRlc3QgY2FzZS4gSXQgcmVnaXN0ZXJzIHRlc3RzIHdpdGggYWxsIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWxsCi0vLyBnZW5lcmF0b3JzIHdoZW4gYXNrZWQuCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+Ci1jbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIDogcHVibGljIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIFBhcmFtVHlwZSBhbmQgR2VuZXJhdG9yQ3JlYXRpb25GdW5jIGFyZSBwcml2YXRlIHR5cGVzIGJ1dCBhcmUgcmVxdWlyZWQKLSAgLy8gZm9yIGRlY2xhcmF0aW9ucyBvZiBwdWJsaWMgbWV0aG9kcyBBZGRUZXN0UGF0dGVybigpIGFuZAotICAvLyBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oKS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKLSAgLy8gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYXBwcm9wcmlhdGUgZ2VuZXJhdG9yIHR5cGUuCi0gIHR5cGVkZWYgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPihHZW5lcmF0b3JDcmVhdGlvbkZ1bmMpKCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgUGFyYW1OYW1lR2VuRnVuYzxQYXJhbVR5cGU+OjpUeXBlIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmM7Ci0KLSAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbygKLSAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uKQotICAgICAgOiB0ZXN0X2Nhc2VfbmFtZV8obmFtZSksIGNvZGVfbG9jYXRpb25fKGNvZGVfbG9jYXRpb24pIHt9Ci0KLSAgLy8gVGVzdCBjYXNlIGJhc2UgbmFtZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KLSAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEdldFRlc3RDYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXzsgfQotICAvLyBUZXN0IGNhc2UgaWQgdG8gdmVyaWZ5IGlkZW50aXR5LgotICB2aXJ0dWFsIFR5cGVJZCBHZXRUZXN0Q2FzZVR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuIEdldFR5cGVJZDxUZXN0Q2FzZT4oKTsgfQotICAvLyBURVNUX1AgbWFjcm8gdXNlcyBBZGRUZXN0UGF0dGVybigpIHRvIHJlY29yZCBpbmZvcm1hdGlvbgotICAvLyBhYm91dCBhIHNpbmdsZSB0ZXN0IGluIGEgTG9jYWxUZXN0SW5mbyBzdHJ1Y3R1cmUuCi0gIC8vIHRlc3RfY2FzZV9uYW1lIGlzIHRoZSBiYXNlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSAod2l0aG91dCBpbnZvY2F0aW9uCi0gIC8vIHByZWZpeCkuIHRlc3RfYmFzZV9uYW1lIGlzIHRoZSBuYW1lIG9mIGFuIGluZGl2aWR1YWwgdGVzdCB3aXRob3V0Ci0gIC8vIHBhcmFtZXRlciBpbmRleC4gRm9yIHRoZSB0ZXN0IFNlcXVlbmNlQS9Gb29UZXN0LkRvQmFyLzEgRm9vVGVzdCBpcwotICAvLyB0ZXN0IGNhc2UgYmFzZSBuYW1lIGFuZCBEb0JhciBpcyB0ZXN0IGJhc2UgbmFtZS4KLSAgdm9pZCBBZGRUZXN0UGF0dGVybihjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Jhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIG1ldGFfZmFjdG9yeSkgewotICAgIHRlc3RzXy5wdXNoX2JhY2sobGlua2VkX3B0cjxUZXN0SW5mbz4obmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZmFjdG9yeSkpKTsKLSAgfQotICAvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyB1c2VzIEFkZEdlbmVyYXRvcigpIHRvIHJlY29yZCBpbmZvcm1hdGlvbgotICAvLyBhYm91dCBhIGdlbmVyYXRvci4KLSAgaW50IEFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihjb25zdCBzdHJpbmcmIGluc3RhbnRpYXRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqIGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1OYW1lR2VuZXJhdG9yRnVuYyogbmFtZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKLSAgICBpbnN0YW50aWF0aW9uc18ucHVzaF9iYWNrKAotICAgICAgICBJbnN0YW50aWF0aW9uSW5mbyhpbnN0YW50aWF0aW9uX25hbWUsIGZ1bmMsIG5hbWVfZnVuYywgZmlsZSwgbGluZSkpOwotICAgIHJldHVybiAwOyAgLy8gUmV0dXJuIHZhbHVlIHVzZWQgb25seSB0byBydW4gdGhpcyBtZXRob2QgaW4gbmFtZXNwYWNlIHNjb3BlLgotICB9Ci0gIC8vIFVuaXRUZXN0IGNsYXNzIGludm9rZXMgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UKLSAgLy8gdGVzdCBjYXNlcyByaWdodCBiZWZvcmUgcnVubmluZyB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLgotICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlCi0gIC8vIGluc3RhbmNlIG9mIGEgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgZGVyaXZlZCBjbGFzcy4KLSAgLy8gVW5pdFRlc3QgaGFzIGEgZ3VhcmQgdG8gcHJldmVudCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QgbW9yZSB0aGVuIG9uY2UuCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgewotICAgIGZvciAodHlwZW5hbWUgVGVzdEluZm9Db250YWluZXI6Oml0ZXJhdG9yIHRlc3RfaXQgPSB0ZXN0c18uYmVnaW4oKTsKLSAgICAgICAgIHRlc3RfaXQgIT0gdGVzdHNfLmVuZCgpOyArK3Rlc3RfaXQpIHsKLSAgICAgIGxpbmtlZF9wdHI8VGVzdEluZm8+IHRlc3RfaW5mbyA9ICp0ZXN0X2l0OwotICAgICAgZm9yICh0eXBlbmFtZSBJbnN0YW50aWF0aW9uQ29udGFpbmVyOjppdGVyYXRvciBnZW5faXQgPQotICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvbnNfLmJlZ2luKCk7IGdlbl9pdCAhPSBpbnN0YW50aWF0aW9uc18uZW5kKCk7Ci0gICAgICAgICAgICAgICArK2dlbl9pdCkgewotICAgICAgICBjb25zdCBzdHJpbmcmIGluc3RhbnRpYXRpb25fbmFtZSA9IGdlbl9pdC0+bmFtZTsKLSAgICAgICAgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPiBnZW5lcmF0b3IoKCpnZW5faXQtPmdlbmVyYXRvcikoKSk7Ci0gICAgICAgIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmMqIG5hbWVfZnVuYyA9IGdlbl9pdC0+bmFtZV9mdW5jOwotICAgICAgICBjb25zdCBjaGFyKiBmaWxlID0gZ2VuX2l0LT5maWxlOwotICAgICAgICBpbnQgbGluZSA9IGdlbl9pdC0+bGluZTsKLQotICAgICAgICBzdHJpbmcgdGVzdF9jYXNlX25hbWU7Ci0gICAgICAgIGlmICggIWluc3RhbnRpYXRpb25fbmFtZS5lbXB0eSgpICkKLSAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZSA9IGluc3RhbnRpYXRpb25fbmFtZSArICIvIjsKLSAgICAgICAgdGVzdF9jYXNlX25hbWUgKz0gdGVzdF9pbmZvLT50ZXN0X2Nhc2VfYmFzZV9uYW1lOwotCi0gICAgICAgIHNpemVfdCBpID0gMDsKLSAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRlc3RfcGFyYW1fbmFtZXM7Ci0gICAgICAgIGZvciAodHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPjo6aXRlcmF0b3IgcGFyYW1faXQgPQotICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuYmVnaW4oKTsKLSAgICAgICAgICAgICBwYXJhbV9pdCAhPSBnZW5lcmF0b3IuZW5kKCk7ICsrcGFyYW1faXQsICsraSkgewotICAgICAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKLQotICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcmFtX25hbWUgPSBuYW1lX2Z1bmMoCi0gICAgICAgICAgICAgIFRlc3RQYXJhbUluZm88UGFyYW1UeXBlPigqcGFyYW1faXQsIGkpKTsKLQotICAgICAgICAgIEdURVNUX0NIRUNLXyhJc1ZhbGlkUGFyYW1OYW1lKHBhcmFtX25hbWUpKQotICAgICAgICAgICAgICA8PCAiUGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgJyIgPDwgcGFyYW1fbmFtZQotICAgICAgICAgICAgICA8PCAiJyBpcyBpbnZhbGlkLCBpbiAiIDw8IGZpbGUKLSAgICAgICAgICAgICAgPDwgIiBsaW5lICIgPDwgbGluZSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgICBHVEVTVF9DSEVDS18odGVzdF9wYXJhbV9uYW1lcy5jb3VudChwYXJhbV9uYW1lKSA9PSAwKQotICAgICAgICAgICAgICA8PCAiRHVwbGljYXRlIHBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lICciIDw8IHBhcmFtX25hbWUKLSAgICAgICAgICAgICAgPDwgIicsIGluICIgPDwgZmlsZSA8PCAiIGxpbmUgIiA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICAgIHRlc3RfcGFyYW1fbmFtZXMuaW5zZXJ0KHBhcmFtX25hbWUpOwotCi0gICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbSA8PCB0ZXN0X2luZm8tPnRlc3RfYmFzZV9uYW1lIDw8ICIvIiA8PCBwYXJhbV9uYW1lOwotICAgICAgICAgIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAotICAgICAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgIE5VTEwsICAvLyBObyB0eXBlIHBhcmFtZXRlci4KLSAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZygqcGFyYW1faXQpLmNfc3RyKCksCi0gICAgICAgICAgICAgIGNvZGVfbG9jYXRpb25fLAotICAgICAgICAgICAgICBHZXRUZXN0Q2FzZVR5cGVJZCgpLAotICAgICAgICAgICAgICBUZXN0Q2FzZTo6U2V0VXBUZXN0Q2FzZSwKLSAgICAgICAgICAgICAgVGVzdENhc2U6OlRlYXJEb3duVGVzdENhc2UsCi0gICAgICAgICAgICAgIHRlc3RfaW5mby0+dGVzdF9tZXRhX2ZhY3RvcnktPkNyZWF0ZVRlc3RGYWN0b3J5KCpwYXJhbV9pdCkpOwotICAgICAgICB9ICAvLyBmb3IgcGFyYW1faXQKLSAgICAgIH0gIC8vIGZvciBnZW5faXQKLSAgICB9ICAvLyBmb3IgdGVzdF9pdAotICB9ICAvLyBSZWdpc3RlclRlc3RzCi0KLSBwcml2YXRlOgotICAvLyBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZSBrZWVwcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSB0ZXN0IHJlZ2lzdGVyZWQKLSAgLy8gd2l0aCBURVNUX1AgbWFjcm8uCi0gIHN0cnVjdCBUZXN0SW5mbyB7Ci0gICAgVGVzdEluZm8oY29uc3QgY2hhciogYV90ZXN0X2Nhc2VfYmFzZV9uYW1lLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdGVzdF9iYXNlX25hbWUsCi0gICAgICAgICAgICAgVGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+KiBhX3Rlc3RfbWV0YV9mYWN0b3J5KSA6Ci0gICAgICAgIHRlc3RfY2FzZV9iYXNlX25hbWUoYV90ZXN0X2Nhc2VfYmFzZV9uYW1lKSwKLSAgICAgICAgdGVzdF9iYXNlX25hbWUoYV90ZXN0X2Jhc2VfbmFtZSksCi0gICAgICAgIHRlc3RfbWV0YV9mYWN0b3J5KGFfdGVzdF9tZXRhX2ZhY3RvcnkpIHt9Ci0KLSAgICBjb25zdCBzdHJpbmcgdGVzdF9jYXNlX2Jhc2VfbmFtZTsKLSAgICBjb25zdCBzdHJpbmcgdGVzdF9iYXNlX25hbWU7Ci0gICAgY29uc3Qgc2NvcGVkX3B0cjxUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4gPiB0ZXN0X21ldGFfZmFjdG9yeTsKLSAgfTsKLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGxpbmtlZF9wdHI8VGVzdEluZm8+ID4gVGVzdEluZm9Db250YWluZXI7Ci0gIC8vIFJlY29yZHMgZGF0YSByZWNlaXZlZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvczoKLSAgLy8gIDxJbnN0YW50aWF0aW9uIG5hbWUsIFNlcXVlbmNlIGdlbmVyYXRvciBjcmVhdGlvbiBmdW5jdGlvbiwKLSAgLy8gICAgIE5hbWUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBTb3VyY2UgZmlsZSwgU291cmNlIGxpbmU+Ci0gIHN0cnVjdCBJbnN0YW50aWF0aW9uSW5mbyB7Ci0gICAgICBJbnN0YW50aWF0aW9uSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNyZWF0aW9uRnVuYyogZ2VuZXJhdG9yX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1OYW1lR2VuZXJhdG9yRnVuYyogbmFtZV9mdW5jX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX2luKQotICAgICAgICAgIDogbmFtZShuYW1lX2luKSwKLSAgICAgICAgICAgIGdlbmVyYXRvcihnZW5lcmF0b3JfaW4pLAotICAgICAgICAgICAgbmFtZV9mdW5jKG5hbWVfZnVuY19pbiksCi0gICAgICAgICAgICBmaWxlKGZpbGVfaW4pLAotICAgICAgICAgICAgbGluZShsaW5lX2luKSB7fQotCi0gICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBnZW5lcmF0b3I7Ci0gICAgICBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jKiBuYW1lX2Z1bmM7Ci0gICAgICBjb25zdCBjaGFyKiBmaWxlOwotICAgICAgaW50IGxpbmU7Ci0gIH07Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxJbnN0YW50aWF0aW9uSW5mbz4gSW5zdGFudGlhdGlvbkNvbnRhaW5lcjsKLQotICBzdGF0aWMgYm9vbCBJc1ZhbGlkUGFyYW1OYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgLy8gQ2hlY2sgZm9yIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lLmVtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzCi0gICAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGluZGV4ID0gMDsgaW5kZXggPCBuYW1lLnNpemUoKTsgKytpbmRleCkgewotICAgICAgaWYgKCFpc2FsbnVtKG5hbWVbaW5kZXhdKSAmJiBuYW1lW2luZGV4XSAhPSAnXycpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IHN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87Ci0gIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uXzsKLSAgVGVzdEluZm9Db250YWluZXIgdGVzdHNfOwotICBJbnN0YW50aWF0aW9uQ29udGFpbmVyIGluc3RhbnRpYXRpb25zXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8pOwotfTsgIC8vIGNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBjb250YWlucyBhIG1hcCBvZiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQotLy8gY2xhc3NlcyBhY2Nlc3NlZCBieSB0ZXN0IGNhc2UgbmFtZXMuIFRFU1RfUCBhbmQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AKLS8vIG1hY3JvcyB1c2UgaXQgdG8gbG9jYXRlIHRoZWlyIGNvcnJlc3BvbmRpbmcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbwotLy8gZGVzY3JpcHRvcnMuCi1jbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSB7Ci0gcHVibGljOgotICBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHt9Ci0gIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHsKLSAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7Ci0gICAgICBkZWxldGUgKml0OwotICAgIH0KLSAgfQotCi0gIC8vIExvb2tzIHVwIG9yIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dAotICAvLyB0ZXN0cyBhbmQgaW5zdGFudGlhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZS4KLSAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgotICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyKAotICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbikgewotICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiB0eXBlZF90ZXN0X2luZm8gPSBOVUxMOwotICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VOYW1lKCkgPT0gdGVzdF9jYXNlX25hbWUpIHsKLSAgICAgICAgaWYgKCgqaXQpLT5HZXRUZXN0Q2FzZVR5cGVJZCgpICE9IEdldFR5cGVJZDxUZXN0Q2FzZT4oKSkgewotICAgICAgICAgIC8vIENvbXBsYWluIGFib3V0IGluY29ycmVjdCB1c2FnZSBvZiBHb29nbGUgVGVzdCBmYWNpbGl0aWVzCi0gICAgICAgICAgLy8gYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSBzaW5jZSB3ZSBjYW5ub3QgZ3VhcmFudHkgY29ycmVjdAotICAgICAgICAgIC8vIHRlc3QgY2FzZSBzZXR1cCBhbmQgdGVhci1kb3duIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKHRlc3RfY2FzZV9uYW1lLCBjb2RlX2xvY2F0aW9uKTsKLSAgICAgICAgICBwb3NpeDo6QWJvcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgdGhlIG9iamVjdCB3ZSBmb3VuZCBpcyBvZiB0aGUgc2FtZQotICAgICAgICAgIC8vIHR5cGUgd2UgYXJlIGxvb2tpbmcgZm9yLCBzbyB3ZSBkb3duY2FzdCBpdCB0byB0aGF0IHR5cGUKLSAgICAgICAgICAvLyB3aXRob3V0IGZ1cnRoZXIgY2hlY2tzLgotICAgICAgICAgIHR5cGVkX3Rlc3RfaW5mbyA9IENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTwKLSAgICAgICAgICAgICAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4gPigqaXQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHlwZWRfdGVzdF9pbmZvID09IE5VTEwpIHsKLSAgICAgIHR5cGVkX3Rlc3RfaW5mbyA9IG5ldyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPigKLSAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZSwgY29kZV9sb2NhdGlvbik7Ci0gICAgICB0ZXN0X2Nhc2VfaW5mb3NfLnB1c2hfYmFjayh0eXBlZF90ZXN0X2luZm8pOwotICAgIH0KLSAgICByZXR1cm4gdHlwZWRfdGVzdF9pbmZvOwotICB9Ci0gIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsKLSAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7Ci0gICAgICAoKml0KS0+UmVnaXN0ZXJUZXN0cygpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKj4gVGVzdENhc2VJbmZvQ29udGFpbmVyOwotCi0gIFRlc3RDYXNlSW5mb0NvbnRhaW5lciB0ZXN0X2Nhc2VfaW5mb3NfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTcyYjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBHVEVTVF9PU18qIG1hY3JvLgotLy8gSXQgaXMgc2VwYXJhdGUgZnJvbSBndGVzdC1wb3J0Lmggc28gdGhhdCBjdXN0b20vZ3Rlc3QtcG9ydC5oIGNhbiBpbmNsdWRlIGl0LgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9BUkNIX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9BUkNIX0hfCi0KLS8vIERldGVybWluZXMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIEdvb2dsZSBUZXN0IGlzIGNvbXBpbGVkLgotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotIyBkZWZpbmUgR1RFU1RfT1NfU1RBUkJPQVJEIDEKLSNlbGlmIF9fQ1lHV0lOX18KLSMgZGVmaW5lIEdURVNUX09TX0NZR1dJTiAxCi0jZWxpZiBkZWZpbmVkIF9fU1lNQklBTjMyX18KLSMgZGVmaW5lIEdURVNUX09TX1NZTUJJQU4gMQotI2VsaWYgZGVmaW5lZCBfV0lOMzIKLSMgZGVmaW5lIEdURVNUX09TX1dJTkRPV1MgMQotIyBpZmRlZiBfV0lOMzJfV0NFCi0jICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgMQotIyBlbGlmIGRlZmluZWQoX19NSU5HV19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQotIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgMQotIyBlbGlmIGRlZmluZWQoV0lOQVBJX0ZBTUlMWSkKLSMgIGluY2x1ZGUgPHdpbmFwaWZhbWlseS5oPgotIyAgaWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKQotIyAgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQotIyAgZWxpZiBXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX1BIT05FX0FQUCkKLSMgICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19QSE9ORSAxCi0jICBlbGlmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fQVBQKQotIyAgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX1JUIDEKLSMgIGVsc2UKLSAgICAvLyBXSU5BUElfRkFNSUxZIGRlZmluZWQgYnV0IG5vIGtub3duIHBhcnRpdGlvbiBtYXRjaGVkLgotICAgIC8vIERlZmF1bHQgdG8gZGVza3RvcC4KLSMgICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QIDEKLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQotIyBlbmRpZiAgLy8gX1dJTjMyX1dDRQotI2VsaWYgZGVmaW5lZCBfX0FQUExFX18KLSMgZGVmaW5lIEdURVNUX09TX01BQyAxCi0jIGlmIFRBUkdFVF9PU19JUEhPTkUKLSMgIGRlZmluZSBHVEVTVF9PU19JT1MgMQotIyBlbmRpZgotI2VsaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXwotIyBkZWZpbmUgR1RFU1RfT1NfRlJFRUJTRCAxCi0jZWxpZiBkZWZpbmVkIF9fbGludXhfXwotIyBkZWZpbmUgR1RFU1RfT1NfTElOVVggMQotIyBpZiBkZWZpbmVkIF9fQU5EUk9JRF9fCi0jICBkZWZpbmUgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAxCi0jIGVuZGlmCi0jZWxpZiBkZWZpbmVkIF9fTVZTX18KLSMgZGVmaW5lIEdURVNUX09TX1pPUyAxCi0jZWxpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKLSMgZGVmaW5lIEdURVNUX09TX1NPTEFSSVMgMQotI2VsaWYgZGVmaW5lZChfQUlYKQotIyBkZWZpbmUgR1RFU1RfT1NfQUlYIDEKLSNlbGlmIGRlZmluZWQoX19ocHV4KQotIyBkZWZpbmUgR1RFU1RfT1NfSFBVWCAxCi0jZWxpZiBkZWZpbmVkIF9fbmF0aXZlX2NsaWVudF9fCi0jIGRlZmluZSBHVEVTVF9PU19OQUNMIDEKLSNlbGlmIGRlZmluZWQgX19PcGVuQlNEX18KLSMgZGVmaW5lIEdURVNUX09TX09QRU5CU0QgMQotI2VsaWYgZGVmaW5lZCBfX1FOWF9fCi0jIGRlZmluZSBHVEVTVF9PU19RTlggMQotI2VuZGlmICAvLyBfX0NZR1dJTl9fCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0FSQ0hfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWI5MDA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIExvdy1sZXZlbCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBwb3J0aW5nIEdvb2dsZSBUZXN0IHRvIHZhcmlvdXMKLS8vIHBsYXRmb3Jtcy4gIEFsbCBtYWNyb3MgZW5kaW5nIHdpdGggXyBhbmQgc3ltYm9scyBkZWZpbmVkIGluIGFuCi0vLyBpbnRlcm5hbCBuYW1lc3BhY2UgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgQ29kZQotLy8gb3V0c2lkZSBHb29nbGUgVGVzdCBNVVNUIE5PVCBVU0UgVEhFTSBESVJFQ1RMWS4gIE1hY3JvcyB0aGF0IGRvbid0Ci0vLyBlbmQgd2l0aCBfIGFyZSBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgcHVibGljIEFQSSBhbmQgY2FuIGJlIHVzZWQgYnkKLS8vIGNvZGUgb3V0c2lkZSBHb29nbGUgVGVzdC4KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZnVuZGFtZW50YWwgdG8gR29vZ2xlIFRlc3QuICBBbGwgb3RoZXIgR29vZ2xlIFRlc3Qgc291cmNlCi0vLyBmaWxlcyBhcmUgZXhwZWN0ZWQgdG8gI2luY2x1ZGUgdGhpcy4gIFRoZXJlZm9yZSwgaXQgY2Fubm90ICNpbmNsdWRlCi0vLyBhbnkgb3RoZXIgR29vZ2xlIFRlc3QgaGVhZGVyLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KLQotLy8gRW52aXJvbm1lbnQtZGVzY3JpYmluZyBtYWNyb3MKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gR29vZ2xlIFRlc3QgY2FuIGJlIHVzZWQgaW4gbWFueSBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLiAgTWFjcm9zIGluCi0vLyB0aGlzIHNlY3Rpb24gdGVsbCBHb29nbGUgVGVzdCB3aGF0IGtpbmQgb2YgZW52aXJvbm1lbnQgaXQgaXMgYmVpbmcKLS8vIHVzZWQgaW4sIHN1Y2ggdGhhdCBHb29nbGUgVGVzdCBjYW4gcHJvdmlkZSBlbnZpcm9ubWVudC1zcGVjaWZpYwotLy8gZmVhdHVyZXMgYW5kIGltcGxlbWVudGF0aW9ucy4KLS8vCi0vLyBHb29nbGUgVGVzdCB0cmllcyB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgcHJvcGVydGllcyBvZiBpdHMKLS8vIGVudmlyb25tZW50LCBzbyB1c2VycyB1c3VhbGx5IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlc2UKLS8vIG1hY3Jvcy4gIEhvd2V2ZXIsIHRoZSBhdXRvbWF0aWMgZGV0ZWN0aW9uIGlzIG5vdCBwZXJmZWN0LgotLy8gU29tZXRpbWVzIGl0J3MgbmVjZXNzYXJ5IGZvciBhIHVzZXIgdG8gZGVmaW5lIHNvbWUgb2YgdGhlIGZvbGxvd2luZwotLy8gbWFjcm9zIGluIHRoZSBidWlsZCBzY3JpcHQgdG8gb3ZlcnJpZGUgR29vZ2xlIFRlc3QncyBkZWNpc2lvbnMuCi0vLwotLy8gSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgYSBtYWNybyBpbiB0aGUgbGlzdCwgR29vZ2xlIFRlc3Qgd2lsbAotLy8gcHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbi4gIEFmdGVyIHRoaXMgaGVhZGVyIGlzICNpbmNsdWRlZCwgYWxsCi0vLyBtYWNyb3MgaW4gdGhpcyBsaXN0IHdpbGwgYmUgZGVmaW5lZCB0byBlaXRoZXIgMSBvciAwLgotLy8KLS8vIE5vdGVzIHRvIG1haW50YWluZXJzOgotLy8gICAtIEVhY2ggbWFjcm8gaGVyZSBpcyBhIHVzZXItdHdlYWthYmxlIGtub2I7IGRvIG5vdCBncm93IHRoZSBsaXN0Ci0vLyAgICAgbGlnaHRseS4KLS8vICAgLSBVc2UgI2lmIHRvIGtleSBvZmYgdGhlc2UgbWFjcm9zLiAgRG9uJ3QgdXNlICNpZmRlZiBvciAiI2lmCi0vLyAgICAgZGVmaW5lZCguLi4pIiwgd2hpY2ggd2lsbCBub3Qgd29yayBhcyB0aGVzZSBtYWNyb3MgYXJlIEFMV0FZUwotLy8gICAgIGRlZmluZWQuCi0vLwotLy8gICBHVEVTVF9IQVNfQ0xPTkUgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgY2xvbmUoMikKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgotLy8gICBHVEVTVF9IQVNfRVhDRVBUSU9OUyAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgZXhjZXB0aW9ucwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4KLS8vICAgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDo6c3RyaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZSAoc29tZSBzeXN0ZW1zIGRlZmluZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6c3RyaW5nKS4KLS8vICAgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDo6c3RyaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZSAoc29tZSBzeXN0ZW1zIGRlZmluZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OndzdHJpbmcsIHdoaWNoIGlzIGRpZmZlcmVudCB0byBzdGQ6OndzdHJpbmcpLgotLy8gICBHVEVTVF9IQVNfUE9TSVhfUkUgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUE9TSVggcmVndWxhcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyBhcmUvYXJlbid0IGF2YWlsYWJsZS4KLS8vICAgR1RFU1RfSEFTX1BUSFJFQUQgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDxwdGhyZWFkLmg+Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4KLS8vICAgR1RFU1RfSEFTX1JUVEkgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IFJUVEkgaXMvaXNuJ3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4KLS8vICAgR1RFU1RfSEFTX1NURF9XU1RSSU5HICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyBkb2VzL2RvZXNuJ3Qgd29yayAoR29vZ2xlIFRlc3QgY2FuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgd2hlcmUgc3RkOjp3c3RyaW5nIGlzIHVuYXZhaWxhYmxlKS4KLS8vICAgR1RFU1RfSEFTX1RSMV9UVVBMRSAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0cjE6OnR1cGxlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4KLS8vICAgR1RFU1RfSEFTX1NFSCAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyAiU3RydWN0dXJlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gSGFuZGxpbmciLgotLy8gICBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gc3VwcG9ydHMgSS9PIHN0cmVhbSByZWRpcmVjdGlvbiB1c2luZwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXAoKSBhbmQgZHVwMigpLgotLy8gICBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgR29vZ2xlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3QncyBvd24gdHIxIHR1cGxlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLiAgVW51c2VkIHdoZW4gdGhlIHVzZXIgc2V0cwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfVFIxX1RVUExFIHRvIDAuCi0vLyAgIEdURVNUX0xBTkdfQ1hYMTEgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBHb29nbGUgVGVzdAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBidWlsZGluZyBpbiBDKysxMS9DKys5OCBtb2RlLgotLy8gICBHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgdGVzdHMgdGhhdCB1c2UKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlIFRlc3QgYXMgYSBzaGFyZWQgbGlicmFyeSAoa25vd24gYXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExMIG9uIFdpbmRvd3MpLgotLy8gICBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QgaXRzZWxmCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkuCi0KLS8vIFBsYXRmb3JtLWluZGljYXRpbmcgbWFjcm9zCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE1hY3JvcyBpbmRpY2F0aW5nIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBHb29nbGUgVGVzdCBpcyBiZWluZyB1c2VkCi0vLyAoYSBtYWNybyBpcyBkZWZpbmVkIHRvIDEgaWYgY29tcGlsZWQgb24gdGhlIGdpdmVuIHBsYXRmb3JtOwotLy8gb3RoZXJ3aXNlIFVOREVGSU5FRCAtLSBpdCdzIG5ldmVyIGRlZmluZWQgdG8gMC4pLiAgR29vZ2xlIFRlc3QKLS8vIGRlZmluZXMgdGhlc2UgbWFjcm9zIGF1dG9tYXRpY2FsbHkuICBDb2RlIG91dHNpZGUgR29vZ2xlIFRlc3QgTVVTVAotLy8gTk9UIGRlZmluZSB0aGVtLgotLy8KLS8vICAgR1RFU1RfT1NfQUlYICAgICAgLSBJQk0gQUlYCi0vLyAgIEdURVNUX09TX0NZR1dJTiAgIC0gQ3lnd2luCi0vLyAgIEdURVNUX09TX0ZSRUVCU0QgIC0gRnJlZUJTRAotLy8gICBHVEVTVF9PU19IUFVYICAgICAtIEhQLVVYCi0vLyAgIEdURVNUX09TX0xJTlVYICAgIC0gTGludXgKLS8vICAgICBHVEVTVF9PU19MSU5VWF9BTkRST0lEIC0gR29vZ2xlIEFuZHJvaWQKLS8vICAgR1RFU1RfT1NfTUFDICAgICAgLSBNYWMgT1MgWAotLy8gICAgIEdURVNUX09TX0lPUyAgICAtIGlPUwotLy8gICBHVEVTVF9PU19OQUNMICAgICAtIEdvb2dsZSBOYXRpdmUgQ2xpZW50IChOYUNsKQotLy8gICBHVEVTVF9PU19PUEVOQlNEICAtIE9wZW5CU0QKLS8vICAgR1RFU1RfT1NfUU5YICAgICAgLSBRTlgKLS8vICAgR1RFU1RfT1NfU09MQVJJUyAgLSBTdW4gU29sYXJpcwotLy8gICBHVEVTVF9PU19TWU1CSUFOICAtIFN5bWJpYW4KLS8vICAgR1RFU1RfT1NfV0lORE9XUyAgLSBXaW5kb3dzIChEZXNrdG9wLCBNaW5HVywgb3IgTW9iaWxlKQotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAgLSBXaW5kb3dzIERlc2t0b3AKLS8vICAgICBHVEVTVF9PU19XSU5ET1dTX01JTkdXICAgIC0gTWluR1cKLS8vICAgICBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgIC0gV2luZG93cyBNb2JpbGUKLS8vICAgICBHVEVTVF9PU19XSU5ET1dTX1BIT05FICAgIC0gV2luZG93cyBQaG9uZQotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfUlQgICAgICAgLSBXaW5kb3dzIFN0b3JlIEFwcC9XaW5SVAotLy8gICBHVEVTVF9PU19aT1MgICAgICAtIHovT1MKLS8vCi0vLyBBbW9uZyB0aGUgcGxhdGZvcm1zLCBDeWd3aW4sIExpbnV4LCBNYXggT1MgWCwgYW5kIFdpbmRvd3MgaGF2ZSB0aGUKLS8vIG1vc3Qgc3RhYmxlIHN1cHBvcnQuICBTaW5jZSBjb3JlIG1lbWJlcnMgb2YgdGhlIEdvb2dsZSBUZXN0IHByb2plY3QKLS8vIGRvbid0IGhhdmUgYWNjZXNzIHRvIG90aGVyIHBsYXRmb3Jtcywgc3VwcG9ydCBmb3IgdGhlbSBtYXkgYmUgbGVzcwotLy8gc3RhYmxlLiAgSWYgeW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQotLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIChwYXRjaGVzIGZvciBmaXhpbmcgdGhlbSBhcmUKLS8vIGV2ZW4gbW9yZSB3ZWxjb21lISkuCi0vLwotLy8gSXQgaXMgcG9zc2libGUgdGhhdCBub25lIG9mIHRoZSBHVEVTVF9PU18qIG1hY3JvcyBhcmUgZGVmaW5lZC4KLQotLy8gRmVhdHVyZS1pbmRpY2F0aW5nIG1hY3JvcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE1hY3JvcyBpbmRpY2F0aW5nIHdoaWNoIEdvb2dsZSBUZXN0IGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgKGEgbWFjcm8KLS8vIGlzIGRlZmluZWQgdG8gMSBpZiB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHN1cHBvcnRlZDsKLS8vIG90aGVyd2lzZSBVTkRFRklORUQgLS0gaXQncyBuZXZlciBkZWZpbmVkIHRvIDAuKS4gIEdvb2dsZSBUZXN0Ci0vLyBkZWZpbmVzIHRoZXNlIG1hY3JvcyBhdXRvbWF0aWNhbGx5LiAgQ29kZSBvdXRzaWRlIEdvb2dsZSBUZXN0IE1VU1QKLS8vIE5PVCBkZWZpbmUgdGhlbS4KLS8vCi0vLyBUaGVzZSBtYWNyb3MgYXJlIHB1YmxpYyBzbyB0aGF0IHBvcnRhYmxlIHRlc3RzIGNhbiBiZSB3cml0dGVuLgotLy8gU3VjaCB0ZXN0cyB0eXBpY2FsbHkgc3Vycm91bmQgY29kZSB1c2luZyBhIGZlYXR1cmUgd2l0aCBhbiAjaWYKLS8vIHdoaWNoIGNvbnRyb2xzIHRoYXQgY29kZS4gIEZvciBleGFtcGxlOgotLy8KLS8vICNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotLy8gICBFWFBFQ1RfREVBVEgoRG9Tb21ldGhpbmdEZWFkbHkoKSk7Ci0vLyAjZW5kaWYKLS8vCi0vLyAgIEdURVNUX0hBU19DT01CSU5FICAgICAgLSB0aGUgQ29tYmluZSgpIGZ1bmN0aW9uIChmb3IgdmFsdWUtcGFyYW1ldGVyaXplZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMpCi0vLyAgIEdURVNUX0hBU19ERUFUSF9URVNUICAgLSBkZWF0aCB0ZXN0cwotLy8gICBHVEVTVF9IQVNfUEFSQU1fVEVTVCAgIC0gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVCAgIC0gdHlwZWQgdGVzdHMKLS8vICAgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAtIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gICBHVEVTVF9JU19USFJFQURTQUZFICAgIC0gR29vZ2xlIFRlc3QgaXMgdGhyZWFkLXNhZmUuCi0vLyAgIEdURVNUX1VTRVNfUE9TSVhfUkUgICAgLSBlbmhhbmNlZCBQT1NJWCByZWdleCBpcyB1c2VkLiBEbyBub3QgY29uZnVzZSB3aXRoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfUE9TSVhfUkUgKHNlZSBhYm92ZSkgd2hpY2ggdXNlcnMgY2FuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgdGhlbXNlbHZlcy4KLS8vICAgR1RFU1RfVVNFU19TSU1QTEVfUkUgICAtIG91ciBvd24gc2ltcGxlIHJlZ2V4IGlzIHVzZWQ7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdHdvIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCi0vLyAgIEdURVNUX0NBTl9DT01QQVJFX05VTEwgLSBhY2NlcHRzIHVudHlwZWQgTlVMTCBpbiBFWFBFQ1RfRVEoKS4KLQotLy8gTWlzYyBwdWJsaWMgbWFjcm9zCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgIEdURVNUX0ZMQUcoZmxhZ19uYW1lKSAgLSByZWZlcmVuY2VzIHRoZSB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gR29vZ2xlIFRlc3QgZmxhZy4KLQotLy8gSW50ZXJuYWwgdXRpbGl0aWVzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBhbmQgdXRpbGl0aWVzIGFyZSBmb3IgR29vZ2xlIFRlc3QncyBJTlRFUk5BTAotLy8gdXNlIG9ubHkuICBDb2RlIG91dHNpZGUgR29vZ2xlIFRlc3QgTVVTVCBOT1QgVVNFIFRIRU0gRElSRUNUTFkuCi0vLwotLy8gTWFjcm9zIGZvciBiYXNpYyBDKysgY29kaW5nOgotLy8gICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyAtIGZvciBkaXNhYmxpbmcgYSBnY2Mgd2FybmluZy4KLS8vICAgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gIC0gZGVjbGFyZXMgdGhhdCBhIGNsYXNzJyBpbnN0YW5jZXMgb3IgYQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBkb24ndCBoYXZlIHRvIGJlIHVzZWQuCi0vLyAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8gICAtIGRpc2FibGVzIG9wZXJhdG9yPS4KLS8vICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyAtIGRpc2FibGVzIGNvcHkgY3RvciBhbmQgb3BlcmF0b3I9LgotLy8gICBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfICAgLSBkZWNsYXJlcyB0aGF0IGEgZnVuY3Rpb24ncyByZXN1bHQgbXVzdCBiZSB1c2VkLgotLy8gICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfIC0gc3RhcnQgY29kZSBzZWN0aW9uIHdoZXJlIE1TVkMgQzQxMjcgaXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzZWQgKGNvbnN0YW50IGNvbmRpdGlvbmFsKS4KLS8vICAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfICAtIGZpbmlzaCBjb2RlIHNlY3Rpb24gd2hlcmUgTVNWQyBDNDEyNwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3VwcHJlc3NlZC4KLS8vCi0vLyBDKysxMSBmZWF0dXJlIHdyYXBwZXJzOgotLy8KLS8vICAgdGVzdGluZzo6aW50ZXJuYWw6Om1vdmUgIC0gcG9ydGFiaWxpdHkgd3JhcHBlciBmb3Igc3RkOjptb3ZlLgotLy8KLS8vIFN5bmNocm9uaXphdGlvbjoKLS8vICAgTXV0ZXgsIE11dGV4TG9jaywgVGhyZWFkTG9jYWwsIEdldFRocmVhZENvdW50KCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCi0vLwotLy8gVGVtcGxhdGUgbWV0YSBwcm9ncmFtbWluZzoKLS8vICAgaXNfcG9pbnRlciAgICAgLSBhcyBpbiBUUjE7IG5lZWRlZCBvbiBTeW1iaWFuIGFuZCBJQk0gWEwgQy9DKysgb25seS4KLS8vICAgSXRlcmF0b3JUcmFpdHMgLSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6aXRlcmF0b3JfdHJhaXRzLCB3aGljaAotLy8gICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUgaW4gbGliQ3N0ZCB3aGVuIGNvbXBpbGVkIHdpdGggU3VuIEMrKy4KLS8vCi0vLyBTbWFydCBwb2ludGVyczoKLS8vICAgc2NvcGVkX3B0ciAgICAgLSBhcyBpbiBUUjIuCi0vLwotLy8gUmVndWxhciBleHByZXNzaW9uczoKLS8vICAgUkUgICAgICAgICAgICAgLSBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gY2xhc3MgdXNpbmcgdGhlIFBPU0lYCi0vLyAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWQgUmVndWxhciBFeHByZXNzaW9uIHN5bnRheCBvbiBVTklYLWxpa2UKLS8vICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybXMsIG9yIGEgcmVkdWNlZCByZWd1bGFyIGV4Y2VwdGlvbiBzeW50YXggb24KLS8vICAgICAgICAgICAgICAgICAgICBvdGhlciBwbGF0Zm9ybXMsIGluY2x1ZGluZyBXaW5kb3dzLgotLy8KLS8vIExvZ2dpbmc6Ci0vLyAgIEdURVNUX0xPR18oKSAgIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLgotLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuCi0vLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4KLS8vCi0vLyBTdGRvdXQgYW5kIHN0ZGVyciBjYXB0dXJpbmc6Ci0vLyAgIENhcHR1cmVTdGRvdXQoKSAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KLS8vICAgR2V0Q2FwdHVyZWRTdGRvdXQoKSAtIHN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuCi0vLyAgIENhcHR1cmVTdGRlcnIoKSAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KLS8vICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSAtIHN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuCi0vLwotLy8gSW50ZWdlciB0eXBlczoKLS8vICAgVHlwZVdpdGhTaXplICAgLSBtYXBzIGFuIGludGVnZXIgdG8gYSBpbnQgdHlwZS4KLS8vICAgSW50MzIsIFVJbnQzMiwgSW50NjQsIFVJbnQ2NCwgVGltZUluTWlsbGlzCi0vLyAgICAgICAgICAgICAgICAgIC0gaW50ZWdlcnMgb2Yga25vd24gc2l6ZXMuCi0vLyAgIEJpZ2dlc3RJbnQgICAgIC0gdGhlIGJpZ2dlc3Qgc2lnbmVkIGludGVnZXIgdHlwZS4KLS8vCi0vLyBDb21tYW5kLWxpbmUgdXRpbGl0aWVzOgotLy8gICBHVEVTVF9ERUNMQVJFXyooKSAgLSBkZWNsYXJlcyBhIGZsYWcuCi0vLyAgIEdURVNUX0RFRklORV8qKCkgICAtIGRlZmluZXMgYSBmbGFnLgotLy8gICBHZXRJbmplY3RhYmxlQXJndnMoKSAtIHJldHVybnMgdGhlIGNvbW1hbmQgbGluZSBhcyBhIHZlY3RvciBvZiBzdHJpbmdzLgotLy8KLS8vIEVudmlyb25tZW50IHZhcmlhYmxlIHV0aWxpdGllczoKLS8vICAgR2V0RW52KCkgICAgICAgICAgICAgLSBnZXRzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLS8vICAgQm9vbEZyb21HVGVzdEVudigpICAgLSBwYXJzZXMgYSBib29sIGVudmlyb25tZW50IHZhcmlhYmxlLgotLy8gICBJbnQzMkZyb21HVGVzdEVudigpICAtIHBhcnNlcyBhbiBJbnQzMiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLS8vICAgU3RyaW5nRnJvbUdUZXN0RW52KCkgLSBwYXJzZXMgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0KLSNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4gICAvLyBmb3IgaXNzcGFjZSwgZXRjCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBmb3IgcHRyZGlmZl90Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZm5kZWYgX1dJTjMyX1dDRQotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKLSNlbHNlICAvLyAhZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3NwaW5fbG9jay5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc3RyaW5nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgotI2VuZGlmICAvLyAhZGVmaW5lZChTVEFSQk9BUkQpCi0KLSNpZiBkZWZpbmVkIF9fQVBQTEVfXwotIyBpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KLSMgaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPGlvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHN0cmluZz4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oIgotCi0jaWYgIWRlZmluZWQoR1RFU1RfREVWX0VNQUlMXykKLSMgZGVmaW5lIEdURVNUX0RFVl9FTUFJTF8gImdvb2dsZXRlc3RmcmFtZXdvcmtAQGdvb2dsZWdyb3Vwcy5jb20iCi0jIGRlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF8gImd0ZXN0XyIKLSMgZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfICJndGVzdC0iCi0jIGRlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkdURVNUXyIKLSMgZGVmaW5lIEdURVNUX05BTUVfICJHb29nbGUgVGVzdCIKLSMgZGVmaW5lIEdURVNUX1BST0pFQ1RfVVJMXyAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvIgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9ERVZfRU1BSUxfKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfSU5JVF9HT09HTEVfVEVTVF9OQU1FXykKLSMgZGVmaW5lIEdURVNUX0lOSVRfR09PR0xFX1RFU1RfTkFNRV8gInRlc3Rpbmc6OkluaXRHb29nbGVUZXN0IgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9JTklUX0dPT0dMRV9URVNUX05BTUVfKQotCi0vLyBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIGdjYyB0aGF0IGlzIHVzZWQgdG8gY29tcGlsZSB0aGlzLgotI2lmZGVmIF9fR05VQ19fCi0vLyA0MDMwMiBtZWFucyB2ZXJzaW9uIDQuMy4yLgotIyBkZWZpbmUgR1RFU1RfR0NDX1ZFUl8gXAotICAgIChfX0dOVUNfXyoxMDAwMCArIF9fR05VQ19NSU5PUl9fKjEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCi0jZW5kaWYgIC8vIF9fR05VQ19fCi0KLS8vIE1hY3JvcyBmb3IgZGlzYWJsaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrIHdhcm5pbmdzLgotLy8KLS8vICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDgwMCA0Mzg1KQotLy8gICAvKiBjb2RlIHRoYXQgdHJpZ2dlcnMgd2FybmluZ3MgQzQ4MDAgYW5kIEM0Mzg1ICovCi0vLyAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotI2lmIF9NU0NfVkVSID49IDE1MDAKLSMgZGVmaW5lIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKHdhcm5pbmdzKSBcCi0gICAgX19wcmFnbWEod2FybmluZyhwdXNoKSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19wcmFnbWEod2FybmluZyhkaXNhYmxlOiB3YXJuaW5ncykpCi0jIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkgICAgICAgICAgXAotICAgIF9fcHJhZ21hKHdhcm5pbmcocG9wKSkKLSNlbHNlCi0vLyBPbGRlciB2ZXJzaW9ucyBvZiBNU1ZDIGRvbid0IGhhdmUgX19wcmFnbWEuCi0jIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyh3YXJuaW5ncykKLSMgZGVmaW5lIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotI2VuZGlmCi0KLSNpZm5kZWYgR1RFU1RfTEFOR19DWFgxMQotLy8gZ2NjIGFuZCBjbGFuZyBkZWZpbmUgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gd2hlbgotLy8gLXN0ZD17YyxnbnV9Kyt7MHgsMTF9IGlzIHBhc3NlZC4gIFRoZSBDKysxMSBzdGFuZGFyZCBzcGVjaWZpZXMgYQotLy8gdmFsdWUgZm9yIF9fY3BsdXNwbHVzLCBhbmQgcmVjZW50IHZlcnNpb25zIG9mIGNsYW5nLCBnY2MsIGFuZAotLy8gcHJvYmFibHkgb3RoZXIgY29tcGlsZXJzIHNldCB0aGF0IHRvbyBpbiBDKysxMSBtb2RlLgotIyBpZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCi0vLyBDb21waWxpbmcgaW4gYXQgbGVhc3QgQysrMTEgbW9kZS4KLSMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDEKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0xBTkdfQ1hYMTEgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8vIERpc3RpbmN0IGZyb20gQysrMTEgbGFuZ3VhZ2Ugc3VwcG9ydCwgc29tZSBlbnZpcm9ubWVudHMgZG9uJ3QgcHJvdmlkZQotLy8gcHJvcGVyIEMrKzExIGxpYnJhcnkgc3VwcG9ydC4gTm90YWJseSwgaXQncyBwb3NzaWJsZSB0byBidWlsZCBpbgotLy8gQysrMTEgbW9kZSB3aGVuIHRhcmdldGluZyBNYWMgT1MgWCAxMC42LCB3aGljaCBoYXMgYW4gb2xkIGxpYnN0ZGMrKwotLy8gd2l0aCBubyBDKysxMSBzdXBwb3J0LgotLy8KLS8vIGxpYnN0ZGMrKyBoYXMgc3VmZmljaWVudCBDKysxMSBzdXBwb3J0IGFzIG9mIEdDQyA0LjYuMCwgX19HTElCQ1hYX18KLS8vIDIwMTEwMzI1LCBidXQgbWFpbnRlbmFuY2UgcmVsZWFzZXMgaW4gdGhlIDQuNCBhbmQgNC41IHNlcmllcyBmb2xsb3dlZAotLy8gdGhpcyBkYXRlLCBzbyBjaGVjayBmb3IgdGhvc2UgdmVyc2lvbnMgYnkgdGhlaXIgZGF0ZSBzdGFtcHMuCi0vLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9hYmkuaHRtbCNhYmkudmVyc2lvbmluZwotI2lmIEdURVNUX0xBTkdfQ1hYMTEgJiYgXAotICAgICghZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgKCBcCi0gICAgICAgIF9fR0xJQkNYWF9fID49IDIwMTEwMzI1dWwgJiYgIC8qIEdDQyA+PSA0LjYuMCAqLyBcCi0gICAgICAgIC8qIEJsYWNrbGlzdCBvZiBwYXRjaCByZWxlYXNlcyBvZiBvbGRlciBicmFuY2hlczogKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDExMDQxNnVsICYmICAvKiBHQ0MgNC40LjYgKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDEyMDMxM3VsICYmICAvKiBHQ0MgNC40LjcgKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDExMDQyOHVsICYmICAvKiBHQ0MgNC41LjMgKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDEyMDcwMnVsKSkgICAvKiBHQ0MgNC41LjQgKi8KLSMgZGVmaW5lIEdURVNUX1NURExJQl9DWFgxMSAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotLy8gQWxsIENvYmFsdCBwbGF0Zm9ybXMgc2hvdWxkIGJlIGFibGUgdG8gdXNlIEMrKzExIGZlYXR1cmVzLgotI2RlZmluZSBHVEVTVF9TVERMSUJfQ1hYMTEgMQotI2VuZGlmCi0vLyBPbmx5IHVzZSBDKysxMSBsaWJyYXJ5IGZlYXR1cmVzIGlmIHRoZSBsaWJyYXJ5IHByb3ZpZGVzIHRoZW0uCi0jaWYgR1RFU1RfU1RETElCX0NYWDExCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX0JFR0lOX0FORF9FTkRfIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXyAxCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXyAxCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfTU9WRV8gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXyAxCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX1NIQVJFRF9QVFJfIDEKLSNlbmRpZgotCi0vLyBDKysxMSBzcGVjaWZpZXMgdGhhdCA8dHVwbGU+IHByb3ZpZGVzIHN0ZDo6dHVwbGUuCi0vLyBTb21lIHBsYXRmb3JtcyBzdGlsbCBtaWdodCBub3QgaGF2ZSBpdCwgaG93ZXZlci4KLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX1RVUExFXyAxCi0jIGlmIGRlZmluZWQoX19jbGFuZ19fKQotLy8gSW5zcGlyZWQgYnkgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLmh0bWwjX19oYXNfaW5jbHVkZQotIyAgaWYgZGVmaW5lZChfX2hhc19pbmNsdWRlKSAmJiAhX19oYXNfaW5jbHVkZSg8dHVwbGU+KQotIyAgIHVuZGVmIEdURVNUX0hBU19TVERfVFVQTEVfCi0jICBlbmRpZgotIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0vLyBJbnNwaXJlZCBieSBib29zdC9jb25maWcvc3RkbGliL2Rpbmt1bXdhcmUuaHBwCi0jICBpZiBkZWZpbmVkKF9DUFBMSUJfVkVSKSAmJiBfQ1BQTElCX1ZFUiA8IDUyMAotIyAgIHVuZGVmIEdURVNUX0hBU19TVERfVFVQTEVfCi0jICBlbmRpZgotIyBlbGlmIGRlZmluZWQoX19HTElCQ1hYX18pCi0vLyBJbnNwaXJlZCBieSBib29zdC9jb25maWcvc3RkbGliL2xpYnN0ZGNwcDMuaHBwLAotLy8gaHR0cDovL2djYy5nbnUub3JnL2djYy00LjIvY2hhbmdlcy5odG1sIGFuZAotLy8gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwMWNoMDEuaHRtbCNtYW51YWwuaW50cm8uc3RhdHVzLnN0YW5kYXJkLjIwMHgKLSMgIGlmIF9fR05VQ19fIDwgNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDIpCi0jICAgdW5kZWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotIyBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAotIyBkZWZpbmUgR1RFU1RfSEFTX1BPU0lYX1JFIDAKLSMgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKLSMgZGVmaW5lIEdURVNUX0hBU19TRUggMAotIyBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAwCi0jZWxzZSAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECi0KLS8vIEJyaW5ncyBpbiBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeAotLy8gbmFtZXNwYWNlIChyZWFkLCB3cml0ZSwgY2xvc2UsIGNoZGlyLCBpc2F0dHksIHN0YXQpLiBXZSBkbyBub3QgY3VycmVudGx5Ci0vLyB1c2UgdGhlbSBvbiBXaW5kb3dzIE1vYmlsZS4KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jICBpbmNsdWRlIDxpby5oPgotIyBlbmRpZgotLy8gSW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGluY2x1ZGUgPHdpbmRvd3MuaD4sIHVzZSBmb3J3YXJkIGRlY2xhcmF0aW9uCi0vLyBhc3N1bWluZyBDUklUSUNBTF9TRUNUSU9OIGlzIGEgdHlwZWRlZiBvZiBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04uCi0vLyBUaGlzIGFzc3VtcHRpb24gaXMgdmVyaWZpZWQgYnkKLS8vIFdpbmRvd3NUeXBlc1Rlc3QuQ1JJVElDQUxfU0VDVElPTklzX1JUTF9DUklUSUNBTF9TRUNUSU9OLgotc3RydWN0IF9SVExfQ1JJVElDQUxfU0VDVElPTjsKLSNlbHNlCi0vLyBUaGlzIGFzc3VtZXMgdGhhdCBub24tV2luZG93cyBPU2VzIHByb3ZpZGUgdW5pc3RkLmguIEZvciBPU2VzIHdoZXJlIHRoaXMKLS8vIGlzIG5vdCB0aGUgY2FzZSwgd2UgbmVlZCB0byBpbmNsdWRlIGhlYWRlcnMgdGhhdCBwcm92aWRlIHRoZSBmdW5jdGlvbnMKLS8vIG1lbnRpb25lZCBhYm92ZS4KLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLQotI2lmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLS8vIFVzZWQgdG8gZGVmaW5lIF9fQU5EUk9JRF9BUElfXyBtYXRjaGluZyB0aGUgdGFyZ2V0IE5ESyBBUEkgbGV2ZWwuCi0jICBpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotLy8gRGVmaW5lcyB0aGlzIHRvIHRydWUgaWZmIEdvb2dsZSBUZXN0IGNhbiB1c2UgUE9TSVggcmVndWxhciBleHByZXNzaW9ucy4KLSNpZm5kZWYgR1RFU1RfSEFTX1BPU0lYX1JFCi0jIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLS8vIE9uIEFuZHJvaWQsIDxyZWdleC5oPiBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLgotIyAgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoX19BTkRST0lEX0FQSV9fID49IDkpCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKCFHVEVTVF9PU19XSU5ET1dTKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBHVEVTVF9VU0VTX1BDUkUKLS8vIFRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIGhhdmUgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLgotCi0jZWxpZiBHVEVTVF9IQVNfUE9TSVhfUkUKLQotLy8gT24gc29tZSBwbGF0Zm9ybXMsIDxyZWdleC5oPiBuZWVkcyBzb21lb25lIHRvIGRlZmluZSBzaXplX3QsIGFuZAotLy8gd29uJ3QgY29tcGlsZSBvdGhlcndpc2UuICBXZSBjYW4gI2luY2x1ZGUgaXQgaGVyZSBhcyB3ZSBhbHJlYWR5Ci0vLyBpbmNsdWRlZCA8c3RkbGliLmg+LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGRlZmluZSBzaXplX3QgdGhyb3VnaAotLy8gPHN0ZGRlZi5oPi4KLSMgaW5jbHVkZSA8cmVnZXguaD4gIC8vIE5PTElOVAotCi0jIGRlZmluZSBHVEVTVF9VU0VTX1BPU0lYX1JFIDEKLQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUwotCi0vLyA8cmVnZXguaD4gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLiAgVXNlIG91ciBvd24gc2ltcGxlIHJlZ2V4Ci0vLyBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgotIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQotCi0jZWxzZQotCi0vLyA8cmVnZXguaD4gbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gIFVzZSBvdXIgb3duCi0vLyBzaW1wbGUgcmVnZXggaW1wbGVtZW50YXRpb24gaW5zdGVhZC4KLSMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDEKLQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BDUkUKLQotI2lmbmRlZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBzbyB3ZSBuZWVkCi0vLyB0byBmaWd1cmUgaXQgb3V0LgotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLS8vIE1TVkMncyBhbmQgQysrQnVpbGRlcidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU1RMIHVzZSB0aGUgX0hBU19FWENFUFRJT05TCi0vLyBtYWNybyB0byBlbmFibGUgZXhjZXB0aW9ucywgc28gd2UnbGwgZG8gdGhlIHNhbWUuCi0vLyBBc3N1bWVzIHRoYXQgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgotIyAgaWZuZGVmIF9IQVNfRVhDRVBUSU9OUwotIyAgIGRlZmluZSBfSEFTX0VYQ0VQVElPTlMgMQotIyAgZW5kaWYgIC8vIF9IQVNfRVhDRVBUSU9OUwotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIF9IQVNfRVhDRVBUSU9OUwotIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotLy8gY2xhbmcgZGVmaW5lcyBfX0VYQ0VQVElPTlMgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgYmVmb3JlIGNsYW5nIDIyMDcxNCwKLS8vIGJ1dCBpZmYgY2xlYW51cHMgYXJlIGVuYWJsZWQgYWZ0ZXIgdGhhdC4gSW4gT2JqLUMrKyBmaWxlcywgdGhlcmUgY2FuIGJlCi0vLyBjbGVhbnVwcyBmb3IgT2JqQyBleGNlcHRpb25zIHdoaWNoIGFsc28gbmVlZCBjbGVhbnVwcywgZXZlbiBpZiBDKysgZXhjZXB0aW9ucwotLy8gYXJlIGRpc2FibGVkLiBjbGFuZyBoYXMgX19oYXNfZmVhdHVyZShjeHhfZXhjZXB0aW9ucykgd2hpY2ggY2hlY2tzIGZvciBDKysKLS8vIGV4Y2VwdGlvbnMgc3RhcnRpbmcgYXQgY2xhbmcgcjIwNjM1MiwgYnV0IHdoaWNoIGNoZWNrZWQgZm9yIGNsZWFudXBzIHByaW9yIHRvCi0vLyB0aGF0LiBUbyByZWxpYWJseSBjaGVjayBmb3IgQysrIGV4Y2VwdGlvbiBhdmFpbGFiaWxpdHkgd2l0aCBjbGFuZywgY2hlY2sgZm9yCi0vLyBfX0VYQ0VQVElPTlMgJiYgX19oYXNfZmVhdHVyZShjeHhfZXhjZXB0aW9ucykuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgKF9fRVhDRVBUSU9OUyAmJiBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKSkKLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0VYQ0VQVElPTlMKLS8vIGdjYyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKLSMgZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQotLy8gU3VuIFBybyBDQyBzdXBwb3J0cyBleGNlcHRpb25zLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY29tcGlsZS10aW1lIHdheSBvZgotLy8gZGV0ZWN0aW5nIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBub3QuICBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0Ci0vLyB0aGV5IGFyZSBlbmFibGVkIHVubGVzcyB0aGUgdXNlciB0ZWxscyB1cyBvdGhlcndpc2UuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQotIyBlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgX19FWENFUFRJT05TCi0vLyB4bEMgZGVmaW5lcyBfX0VYQ0VQVElPTlMgdG8gMSBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCi0jIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKLS8vIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBpbiBlZmZlY3QgYnkgZGVmYXVsdCBpbiBIUCBhQ0MgY29tcGlsZXIuIEl0IGhhcyB0bwotLy8gYmUgdHVybmVkIG9mIGJ5ICtub2VoIGNvbXBpbGVyIG9wdGlvbiBpZiBkZXNpcmVkLgotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKLSMgZWxzZQotLy8gRm9yIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIGV4Y2VwdGlvbnMgYXJlIGRpc2FibGVkIHRvIGJlCi0vLyBjb25zZXJ2YXRpdmUuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAotIyBlbmRpZiAgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLSNpZiAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKLS8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIG1hY3JvIGFueSBsb25nZXIsIHdlIGtlZXAgaXQgaW4gY2FzZQotLy8gc29tZSBjbGllbnRzIHN0aWxsIGRlcGVuZCBvbiBpdC4KLSMgZGVmaW5lIEdURVNUX0hBU19TVERfU1RSSU5HIDEKLSNlbGlmICFHVEVTVF9IQVNfU1REX1NUUklORwotLy8gVGhlIHVzZXIgdG9sZCB1cyB0aGF0IDo6c3RkOjpzdHJpbmcgaXNuJ3QgYXZhaWxhYmxlLgotIyBlcnJvciAiR29vZ2xlIFRlc3QgY2Fubm90IGJlIHVzZWQgd2hlcmUgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuIgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKLQotI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0KLSMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIDAKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0jaWZuZGVmIEdURVNUX0hBU19TVERfV1NUUklORwotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0ZDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogdXNlcyBhdXRvY29uZiB0byBkZXRlY3Qgd2hldGhlciA6OnN0ZDo6d3N0cmluZwotLy8gICBpcyBhdmFpbGFibGUuCi0KLS8vIEN5Z3dpbiAxLjcgYW5kIGJlbG93IGRvZXNuJ3Qgc3VwcG9ydCA6OnN0ZDo6d3N0cmluZy4KLS8vIFNvbGFyaXMnIGxpYmMrKyBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLiAgQW5kcm9pZCBoYXMKLS8vIG5vIHN1cHBvcnQgZm9yIGl0IGF0IGxlYXN0IGFzIHJlY2VudCBhcyBGcm95byAoMi4yKS4KLSMgZGVmaW5lIEdURVNUX0hBU19TVERfV1NUUklORyBcCi0gICAgKCEoR1RFU1RfT1NfTElOVVhfQU5EUk9JRCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUykpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLSNpZm5kZWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0jIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgXAotICAgIChHVEVTVF9IQVNfU1REX1dTVFJJTkcgJiYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcpCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgUlRUSSBpcyBhdmFpbGFibGUuCi0jaWZuZGVmIEdURVNUX0hBU19SVFRJCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZCwgc28gd2UgbmVlZCB0bwotLy8gZmlndXJlIGl0IG91dC4KLQotIyBpZmRlZiBfTVNDX1ZFUgotCi0jICBpZmRlZiBfQ1BQUlRUSSAgLy8gTVNWQyBkZWZpbmVzIHRoaXMgbWFjcm8gaWZmIFJUVEkgaXMgZW5hYmxlZC4KLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQotIyAgZWxzZQotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCi0jICBlbmRpZgotCi0vLyBTdGFydGluZyB3aXRoIHZlcnNpb24gNC4zLjIsIGdjYyBkZWZpbmVzIF9fR1hYX1JUVEkgaWZmIFJUVEkgaXMgZW5hYmxlZC4KLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAzMDIpCi0KLSMgIGlmZGVmIF9fR1hYX1JUVEkKLS8vIFdoZW4gYnVpbGRpbmcgYWdhaW5zdCBTVExwb3J0IHdpdGggdGhlIEFuZHJvaWQgTkRLIGFuZCB3aXRoCi0vLyAtZnJ0dGkgLWZuby1leGNlcHRpb25zLCB0aGUgYnVpbGQgZmFpbHMgYXQgbGluayB0aW1lIHdpdGggdW5kZWZpbmVkCi0vLyByZWZlcmVuY2VzIHRvIF9fY3hhX2JhZF90eXBlaWQuIE5vdGUgc3VyZSBpZiBTVEwgb3IgdG9vbGNoYWluIGJ1ZywKLS8vIHNvIGRpc2FibGUgUlRUSSB3aGVuIGRldGVjdGVkLgotIyAgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgZGVmaW5lZChfU1RMUE9SVF9NQUpPUikgJiYgXAotICAgICAgICFkZWZpbmVkKF9fRVhDRVBUSU9OUykKLSMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKLSMgICBlbHNlCi0jICAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0jICAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgX19TVExQT1JUX01BSk9SICYmICFfX0VYQ0VQVElPTlMKLSMgIGVsc2UKLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAotIyAgZW5kaWYgIC8vIF9fR1hYX1JUVEkKLQotLy8gQ2xhbmcgZGVmaW5lcyBfX0dYWF9SVFRJIHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAzLjAsIGJ1dCBpdHMgbWFudWFsIHJlY29tbWVuZHMKLS8vIHVzaW5nIGhhc19mZWF0dXJlIGluc3RlYWQuIGhhc19mZWF0dXJlKGN4eF9ydHRpKSBpcyBzdXBwb3J0ZWQgc2luY2UgMi43LCB0aGUKLS8vIGZpcnN0IHZlcnNpb24gd2l0aCBDKysgc3VwcG9ydC4KLSMgZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLQotIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIF9faGFzX2ZlYXR1cmUoY3h4X3J0dGkpCi0KLS8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA5LjAgSUJNIFZpc3VhbCBBZ2UgZGVmaW5lcyBfX1JUVElfQUxMX18gdG8gMSBpZgotLy8gYm90aCB0aGUgdHlwZWlkIGFuZCBkeW5hbWljX2Nhc3QgZmVhdHVyZXMgYXJlIHByZXNlbnQuCi0jIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA+PSA5MDApCi0KLSMgIGlmZGVmIF9fUlRUSV9BTExfXwotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0jICBlbHNlCi0jICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKLSMgIGVuZGlmCi0KLSMgZWxzZQotCi0vLyBGb3IgYWxsIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIFJUVEkgaXMgZW5hYmxlZC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0KLSMgZW5kaWYgIC8vIF9NU0NfVkVSCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLQotLy8gSXQncyB0aGlzIGhlYWRlcidzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIDx0eXBlaW5mbz4gd2hlbiBSVFRJCi0vLyBpcyBlbmFibGVkLgotI2lmIEdURVNUX0hBU19SVFRJCi0jIGluY2x1ZGUgPHR5cGVpbmZvPgotI2VuZGlmCi0KLS8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRoZSBwdGhyZWFkcyBsaWJyYXJ5LgotI2lmbmRlZiBHVEVTVF9IQVNfUFRIUkVBRAotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgZXhwbGljaXRseSwgc28gd2UgbWFrZSByZWFzb25hYmxlIGFzc3VtcHRpb25zIGFib3V0Ci0vLyB3aGljaCBwbGF0Zm9ybXMgaGF2ZSBwdGhyZWFkcyBzdXBwb3J0LgotLy8KLS8vIFRvIGRpc2FibGUgdGhyZWFkaW5nIHN1cHBvcnQgaW4gR29vZ2xlIFRlc3QsIGFkZCAtREdURVNUX0hBU19QVEhSRUFEPTAKLS8vIHRvIHlvdXIgY29tcGlsZXIgZmxhZ3MuCi0jIGRlZmluZSBHVEVTVF9IQVNfUFRIUkVBRCAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0hQVVggXAotICAgIHx8IEdURVNUX09TX1FOWCB8fCBHVEVTVF9PU19GUkVFQlNEIHx8IEdURVNUX09TX05BQ0wpCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECi0KLSNpZiBHVEVTVF9IQVNfUFRIUkVBRAotLy8gZ3Rlc3QtcG9ydC5oIGd1YXJhbnRlZXMgdG8gI2luY2x1ZGUgPHB0aHJlYWQuaD4gd2hlbiBHVEVTVF9IQVNfUFRIUkVBRCBpcwotLy8gdHJ1ZS4KLSMgaW5jbHVkZSA8cHRocmVhZC5oPiAgLy8gTk9MSU5UCi0KLS8vIEZvciB0aW1lc3BlYyBhbmQgbmFub3NsZWVwLCB1c2VkIGJlbG93LgotIyBpbmNsdWRlIDx0aW1lLmg+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0vLyBEZXRlcm1pbmVzIGlmIGhhc2hfbWFwL2hhc2hfc2V0IGFyZSBhdmFpbGFibGUuCi0vLyBPbmx5IHVzZWQgZm9yIHRlc3RpbmcgYWdhaW5zdCB0aG9zZSBjb250YWluZXJzLgotI2lmICFkZWZpbmVkKEdURVNUX0hBU19IQVNIX01BUF8pCi0jIGlmIF9NU0NfVkVSCi0jICBkZWZpbmUgR1RFU1RfSEFTX0hBU0hfTUFQXyAxICAvLyBJbmRpY2F0ZXMgdGhhdCBoYXNoX21hcCBpcyBhdmFpbGFibGUuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0hBU0hfU0VUXyAxICAvLyBJbmRpY2F0ZXMgdGhhdCBoYXNoX3NldCBpcyBhdmFpbGFibGUuCi0jIGVuZGlmICAvLyBfTVNDX1ZFUgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfSEFTSF9NQVBfKQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2FuIHVzZSB0cjEvdHVwbGUuICBZb3UgY2FuIGRlZmluZQotLy8gdGhpcyBtYWNybyB0byAwIHRvIHByZXZlbnQgR29vZ2xlIFRlc3QgZnJvbSB1c2luZyB0dXBsZSAoYW55Ci0vLyBmZWF0dXJlIGRlcGVuZGluZyBvbiB0dXBsZSB3aXRoIGJlIGRpc2FibGVkIGluIHRoaXMgbW9kZSkuCi0jaWZuZGVmIEdURVNUX0hBU19UUjFfVFVQTEUKLSMgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKQotLy8gU1RMcG9ydCwgcHJvdmlkZWQgd2l0aCB0aGUgQW5kcm9pZCBOREssIGhhcyBuZWl0aGVyIDx0cjEvdHVwbGU+IG9yIDx0dXBsZT4uCi0jICBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAwCi0jIGVsc2UKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIG5vdCB0byBkbyBpdCwgc28gd2UgYXNzdW1lIGl0J3MgT0suCi0jICBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAxCi0jIGVuZGlmCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbgotLy8gc2hvdWxkIGJlIHVzZWQuCi0jaWZuZGVmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgotCi0vLyBXZSB1c2Ugb3VyIG93biBUUjEgdHVwbGUgaWYgd2UgYXJlbid0IHN1cmUgdGhlIHVzZXIgaGFzIGFuCi0vLyBpbXBsZW1lbnRhdGlvbiBvZiBpdCBhbHJlYWR5LiAgQXQgdGhpcyB0aW1lLCBsaWJzdGRjKysgNC4wLjArIGFuZAotLy8gTVNWQyAyMDEwIGFyZSB0aGUgb25seSBtYWluc3RyZWFtIHN0YW5kYXJkIGxpYnJhcmllcyB0aGF0IGNvbWUKLS8vIHdpdGggYSBUUjEgdHVwbGUgaW1wbGVtZW50YXRpb24uICBOVklESUEncyBDVURBIE5WQ0MgY29tcGlsZXIKLS8vIHByZXRlbmRzIHRvIGJlIEdDQyBieSBkZWZpbmluZyBfX0dOVUNfXyBhbmQgZnJpZW5kcywgYnV0IGNhbm5vdAotLy8gY29tcGlsZSBHQ0MncyB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gIE1TVkMgMjAwOCAoOS4wKSBwcm92aWRlcyBUUjEKLS8vIHR1cGxlIGluIGEgMzIzIE1CIEZlYXR1cmUgUGFjayBkb3dubG9hZCwgd2hpY2ggd2UgY2Fubm90IGFzc3VtZSB0aGUKLS8vIHVzZXIgaGFzLiAgUU5YJ3MgUUNDIGNvbXBpbGVyIGlzIGEgbW9kaWZpZWQgR0NDIGJ1dCBpdCBkb2Vzbid0Ci0vLyBzdXBwb3J0IFRSMSB0dXBsZS4gIGxpYmMrKyBvbmx5IHByb3ZpZGVzIHN0ZDo6dHVwbGUsIGluIEMrKzExIG1vZGUsCi0vLyBhbmQgaXQgY2FuIGJlIHVzZWQgd2l0aCBzb21lIGNvbXBpbGVycyB0aGF0IGRlZmluZSBfX0dOVUNfXy4KLSMgaWYgKGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fQ1VEQUNDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDAwMCkgXAotICAgICAgJiYgIUdURVNUX09TX1FOWCAmJiAhZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pKSB8fCBfTVNDX1ZFUiA+PSAxNjAwCi0jICBkZWZpbmUgR1RFU1RfRU5WX0hBU19UUjFfVFVQTEVfIDEKLSMgZW5kaWYKLQotLy8gQysrMTEgc3BlY2lmaWVzIHRoYXQgPHR1cGxlPiBwcm92aWRlcyBzdGQ6OnR1cGxlLiBVc2UgdGhhdCBpZiBndGVzdCBpcyB1c2VkCi0vLyBpbiBDKysxMSBtb2RlIGFuZCBsaWJzdGRjKysgaXNuJ3QgdmVyeSBvbGQgKGJpbmFyaWVzIHRhcmdldGluZyBPUyBYIDEwLjYKLS8vIGNhbiBidWlsZCB3aXRoIGNsYW5nIGJ1dCBuZWVkIHRvIHVzZSBnY2M0LjIncyBsaWJzdGRjKyspLgotIyBpZiBHVEVTVF9MQU5HX0NYWDExICYmICghZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgX19HTElCQ1hYX18gPiAyMDExMDMyNSkKLSMgIGRlZmluZSBHVEVTVF9FTlZfSEFTX1NURF9UVVBMRV8gMQotIyBlbmRpZgotCi0jIGlmIEdURVNUX0VOVl9IQVNfVFIxX1RVUExFXyB8fCBHVEVTVF9FTlZfSEFTX1NURF9UVVBMRV8KLSMgIGRlZmluZSBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAwCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAxCi0jIGVuZGlmCi0KLSNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKLQotLy8gVG8gYXZvaWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZXZlcnl3aGVyZSwgd2UgbWFrZSBpdAotLy8gZ3Rlc3QtcG9ydC5oJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgdGhlIGhlYWRlciBpbXBsZW1lbnRpbmcKLS8vIHR1cGxlLgotI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCi0jIGluY2x1ZGUgPHR1cGxlPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAotIyBkZWZpbmUgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXyA6OnN0ZAotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1RVUExFXwotCi0vLyBXZSBpbmNsdWRlIHRyMTo6dHVwbGUgZXZlbiBpZiBzdGQ6OnR1cGxlIGlzIGF2YWlsYWJsZSB0byBkZWZpbmUgcHJpbnRlcnMgZm9yCi0vLyB0aGVtLgotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKLSMgaWZuZGVmIEdURVNUX1RVUExFX05BTUVTUEFDRV8KLSMgIGRlZmluZSBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfIDo6c3RkOjp0cjEKLSMgZW5kaWYgIC8vIEdURVNUX1RVUExFX05BTUVTUEFDRV8KLQotIyBpZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQotIyAgaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnQgIC8vIE5PTElOVAotIyBlbGlmIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXwotIyAgaW5jbHVkZSA8dHVwbGU+Ci0vLyBDKysxMSBwdXRzIGl0cyB0dXBsZSBpbnRvIHRoZSA6OnN0ZCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4KLS8vIDo6c3RkOjp0cjEuICBndGVzdCBleHBlY3RzIHR1cGxlIHRvIGxpdmUgaW4gOjpzdGQ6OnRyMSwgc28gcHV0IGl0IHRoZXJlLgotLy8gVGhpcyBjYXVzZXMgdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgc3VwcG9ydGVkIGNvbXBpbGVycyByZWFjdCBpbgotLy8gdGhlIHdheSB3ZSBpbnRlbmQuCi1uYW1lc3BhY2Ugc3RkIHsKLW5hbWVzcGFjZSB0cjEgewotdXNpbmcgOjpzdGQ6OmdldDsKLXVzaW5nIDo6c3RkOjptYWtlX3R1cGxlOwotdXNpbmcgOjpzdGQ6OnR1cGxlOwotdXNpbmcgOjpzdGQ6OnR1cGxlX2VsZW1lbnQ7Ci11c2luZyA6OnN0ZDo6dHVwbGVfc2l6ZTsKLX0KLX0KLQotIyBlbGlmIEdURVNUX09TX1NZTUJJQU4KLQotLy8gT24gU3ltYmlhbiwgQk9PU1RfSEFTX1RSMV9UVVBMRSBjYXVzZXMgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB0bwotLy8gdXNlIFNUTHBvcnQncyB0dXBsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBkb2Vzbid0Ci0vLyB3b3JrIGFzIHRoZSBjb3B5IG9mIFNUTHBvcnQgZGlzdHJpYnV0ZWQgd2l0aCBTeW1iaWFuIGlzIGluY29tcGxldGUuCi0vLyBCeSBtYWtpbmcgc3VyZSBCT09TVF9IQVNfVFIxX1RVUExFIGlzIHVuZGVmaW5lZCwgd2UgZm9yY2UgQm9vc3QgdG8KLS8vIHVzZSBpdHMgb3duIHR1cGxlIGltcGxlbWVudGF0aW9uLgotIyAgaWZkZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQotIyAgIHVuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUKLSMgIGVuZGlmICAvLyBCT09TVF9IQVNfVFIxX1RVUExFCi0KLS8vIFRoaXMgcHJldmVudHMgPGJvb3N0L3RyMS9kZXRhaWwvY29uZmlnLmhwcD4sIHdoaWNoIGRlZmluZXMKLS8vIEJPT1NUX0hBU19UUjFfVFVQTEUsIGZyb20gYmVpbmcgI2luY2x1ZGVkIGJ5IEJvb3N0J3MgPHR1cGxlPi4KLSMgIGRlZmluZSBCT09TVF9UUjFfREVUQUlMX0NPTkZJR19IUFBfSU5DTFVERUQKLSMgIGluY2x1ZGUgPHR1cGxlPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCAgLy8gTk9MSU5UCi0KLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApCi0vLyBHQ0MgNC4wKyBpbXBsZW1lbnRzIHRyMS90dXBsZSBpbiB0aGUgPHRyMS90dXBsZT4gaGVhZGVyLiAgVGhpcyBkb2VzCi0vLyBub3QgY29uZm9ybSB0byB0aGUgVFIxIHNwZWMsIHdoaWNoIHJlcXVpcmVzIHRoZSBoZWFkZXIgdG8gYmUgPHR1cGxlPi4KLQotIyAgaWYgIUdURVNUX0hBU19SVFRJICYmIEdURVNUX0dDQ19WRVJfIDwgNDAzMDIKLS8vIFVudGlsIHZlcnNpb24gNC4zLjIsIGdjYyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgPHRyMS9mdW5jdGlvbmFsPiwKLS8vIHdoaWNoIGlzICNpbmNsdWRlZCBieSA8dHIxL3R1cGxlPiwgdG8gbm90IGNvbXBpbGUgd2hlbiBSVFRJIGlzCi0vLyBkaXNhYmxlZC4gIF9UUjFfRlVOQ1RJT05BTCBpcyB0aGUgaGVhZGVyIGd1YXJkIGZvcgotLy8gPHRyMS9mdW5jdGlvbmFsPi4gIEhlbmNlIHRoZSBmb2xsb3dpbmcgI2RlZmluZSBpcyBhIGhhY2sgdG8gcHJldmVudAotLy8gPHRyMS9mdW5jdGlvbmFsPiBmcm9tIGJlaW5nIGluY2x1ZGVkLgotIyAgIGRlZmluZSBfVFIxX0ZVTkNUSU9OQUwgMQotIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4KLSMgICB1bmRlZiBfVFIxX0ZVTkNUSU9OQUwgIC8vIEFsbG93cyB0aGUgdXNlciB0byAjaW5jbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHRyMS9mdW5jdGlvbmFsPiBpZiBoZSBjaG9vc2VzIHRvLgotIyAgZWxzZQotIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4gIC8vIE5PTElOVAotIyAgZW5kaWYgIC8vICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCi0KLSMgZWxzZQotLy8gSWYgdGhlIGNvbXBpbGVyIGlzIG5vdCBHQ0MgNC4wKywgd2UgYXNzdW1lIHRoZSB1c2VyIGlzIHVzaW5nIGEKLS8vIHNwZWMtY29uZm9ybWluZyBUUjEgaW1wbGVtZW50YXRpb24uCi0jICBpbmNsdWRlIDx0dXBsZT4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQgIC8vIE5PTElOVAotIyBlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCi0KLS8vIERldGVybWluZXMgd2hldGhlciBjbG9uZSgyKSBpcyBzdXBwb3J0ZWQuCi0vLyBVc3VhbGx5IGl0IHdpbGwgb25seSBiZSBhdmFpbGFibGUgb24gTGludXgsIGV4Y2x1ZGluZwotLy8gTGludXggb24gdGhlIEl0YW5pdW0gYXJjaGl0ZWN0dXJlLgotLy8gQWxzbyBzZWUgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzIvY2xvbmUuCi0jaWZuZGVmIEdURVNUX0hBU19DTE9ORQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KLQotIyBpZiBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKLSMgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLS8vIE9uIEFuZHJvaWQsIGNsb25lKCkgaXMgb25seSBhdmFpbGFibGUgb24gQVJNIHN0YXJ0aW5nIHdpdGggR2luZ2VyYnJlYWQuCi0jICAgIGlmIGRlZmluZWQoX19hcm1fXykgJiYgX19BTkRST0lEX0FQSV9fID49IDkKLSMgICAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMQotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDAKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDEKLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMAotIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCi0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IHN0cmVhbSByZWRpcmVjdGlvbi4gVGhpcyBpcyB1c2VkIHRvIHRlc3QKLS8vIG91dHB1dCBjb3JyZWN0bmVzcyBhbmQgdG8gaW1wbGVtZW50IGRlYXRoIHRlc3RzLgotI2lmbmRlZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0vLyBCeSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhhdCBzdHJlYW0gcmVkaXJlY3Rpb24gaXMgc3VwcG9ydGVkIG9uIGFsbAotLy8gcGxhdGZvcm1zIGV4Y2VwdCBrbm93biBtb2JpbGUgb25lcy4KLSMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBcCi0gICAgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8fCBHVEVTVF9PU19XSU5ET1dTX1JUCi0jICBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAwCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDEKLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfU1lNQklBTgotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IGRlYXRoIHRlc3RzLgotLy8gR29vZ2xlIFRlc3QgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBmb3IgVkMgNy4xIGFuZCBlYXJsaWVyIGFzCi0vLyBhYm9ydCgpIGluIGEgVkMgNy4xIGFwcGxpY2F0aW9uIGNvbXBpbGVkIGFzIEdVSSBpbiBkZWJ1ZyBjb25maWcKLS8vIHBvcHMgdXAgYSBkaWFsb2cgd2luZG93IHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4KLSNpZiAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NPTEFSSVMgfHwgXAotICAgICAoR1RFU1RfT1NfTUFDICYmICFHVEVTVF9PU19JT1MpIHx8IFwKLSAgICAgKEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAmJiBfTVNDX1ZFUiA+PSAxNDAwKSB8fCBcCi0gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgfHwgR1RFU1RfT1NfQUlYIHx8IEdURVNUX09TX0hQVVggfHwgXAotICAgICBHVEVTVF9PU19PUEVOQlNEIHx8IEdURVNUX09TX1FOWCB8fCBHVEVTVF9PU19GUkVFQlNEKQotIyBkZWZpbmUgR1RFU1RfSEFTX0RFQVRIX1RFU1QgMQotI2VuZGlmCi0KLS8vIFdlIGRvbid0IHN1cHBvcnQgTVNWQyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkIG5vdy4gIFRoZXJlZm9yZQotLy8gYWxsIHRoZSBjb21waWxlcnMgd2UgY2FyZSBhYm91dCBhcmUgYWRlcXVhdGUgZm9yIHN1cHBvcnRpbmcKLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCi0jZGVmaW5lIEdURVNUX0hBU19QQVJBTV9URVNUIDEKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgdHlwZS1kcml2ZW4gdGVzdHMuCi0KLS8vIFR5cGVkIHRlc3RzIG5lZWQgPHR5cGVpbmZvPiBhbmQgdmFyaWFkaWMgbWFjcm9zLCB3aGljaCBHQ0MsIFZDKysgOC4wLAotLy8gU3VuIFBybyBDQywgSUJNIFZpc3VhbCBBZ2UsIGFuZCBIUCBhQ0Mgc3VwcG9ydC4KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoX01TQ19WRVIgPj0gMTQwMCkgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgXAotICAgIGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKLSMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUIDEKLSMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUX1AgMQotI2VuZGlmCi0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IENvbWJpbmUoKS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4KLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gZG9lc24ndAotLy8gd29yayBvbiBTdW4gU3R1ZGlvIHNpbmNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0ZW1wbGF0ZWQgY29udmVyc2lvbgotLy8gb3BlcmF0b3JzLgotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUICYmIEdURVNUX0hBU19UUjFfVFVQTEUgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCi0jIGRlZmluZSBHVEVTVF9IQVNfQ09NQklORSAxCi0jZW5kaWYKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzeXN0ZW0gY29tcGlsZXIgdXNlcyBVVEYtMTYgZm9yIGVuY29kaW5nIHdpZGUgc3RyaW5ncy4KLSNkZWZpbmUgR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8gXAotICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRlc3QgcmVzdWx0cyBjYW4gYmUgc3RyZWFtZWQgdG8gYSBzb2NrZXQuCi0jaWYgR1RFU1RfT1NfTElOVVgKLSMgZGVmaW5lIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18gMQotI2VuZGlmCi0KLS8vIERlZmluZXMgc29tZSB1dGlsaXR5IG1hY3Jvcy4KLQotLy8gVGhlIEdOVSBjb21waWxlciBlbWl0cyBhIHdhcm5pbmcgaWYgbmVzdGVkICJpZiIgc3RhdGVtZW50cyBhcmUgZm9sbG93ZWQgYnkKLS8vIGFuICJlbHNlIiBzdGF0ZW1lbnQgYW5kIGJyYWNlcyBhcmUgbm90IHVzZWQgdG8gZXhwbGljaXRseSBkaXNhbWJpZ3VhdGUgdGhlCi0vLyAiZWxzZSIgYmluZGluZy4gIFRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6Ci0vLwotLy8gICBpZiAoZ2F0ZSkKLS8vICAgICBBU1NFUlRfKihjb25kaXRpb24pIDw8ICJTb21lIG1lc3NhZ2UiOwotLy8KLS8vIFRoZSAic3dpdGNoICgwKSBjYXNlIDA6IiBpZGlvbSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoaXMuCi0jaWZkZWYgX19JTlRFTF9DT01QSUxFUgotIyBkZWZpbmUgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8KLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBzd2l0Y2ggKDApIGNhc2UgMDogZGVmYXVsdDogIC8vIE5PTElOVAotI2VuZGlmCi0KLS8vIFVzZSB0aGlzIGFubm90YXRpb24gYXQgdGhlIGVuZCBvZiBhIHN0cnVjdC9jbGFzcyBkZWZpbml0aW9uIHRvCi0vLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXIKLS8vIHVzZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFsbCBpbnRlcmVzdGluZyBsb2dpYyBoYXBwZW5zIGluc2lkZSB0aGUKLS8vIGMndG9yIGFuZCAvIG9yIGQndG9yLiAgRXhhbXBsZToKLS8vCi0vLyAgIHN0cnVjdCBGb28gewotLy8gICAgIEZvbygpIHsgLi4uIH0KLS8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKLS8vCi0vLyBBbHNvIHVzZSBpdCBhZnRlciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZQotLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQotIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi0jZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgaWYgX19oYXNfYXR0cmlidXRlKHVudXNlZCkKLSMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8KLSNlbmRpZgotCi0vLyBBIG1hY3JvIHRvIGRpc2FsbG93IG9wZXJhdG9yPQotLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgotI2RlZmluZSBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpXAotICB2b2lkIG9wZXJhdG9yPSh0eXBlIGNvbnN0ICYpCi0KLS8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9Ci0vLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCi0jZGVmaW5lIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8odHlwZSlcCi0gIHR5cGUodHlwZSBjb25zdCAmKTtcCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSkKLQotLy8gVGVsbCB0aGUgY29tcGlsZXIgdG8gd2FybiBhYm91dCB1bnVzZWQgcmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlY2xhcmVkCi0vLyB3aXRoIHRoaXMgbWFjcm8uICBUaGUgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0vLyBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50IGxpc3Q6Ci0vLwotLy8gICBTcHJvY2tldCogQWxsb2NhdGVTcHJvY2tldCgpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCi0jIGRlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8KLSNlbmRpZiAgLy8gX19HTlVDX18gJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhQ09NUElMRVJfSUNDCi0KLS8vIE1TIEMrKyBjb21waWxlciBlbWl0cyB3YXJuaW5nIHdoZW4gYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbXBpbGUgdGltZQotLy8gY29uc3RhbnQuIEluIHNvbWUgY29udGV4dHMgdGhpcyB3YXJuaW5nIGlzIGZhbHNlIHBvc2l0aXZlIGFuZCBuZWVkcyB0byBiZQotLy8gc3VwcHJlc3NlZC4gVXNlIHRoZSBmb2xsb3dpbmcgdHdvIG1hY3JvcyBpbiBzdWNoIGNhc2VzOgotLy8KLS8vIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8oKQotLy8gd2hpbGUgKHRydWUpIHsKLS8vIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUE9QXygpCi0vLyB9Ci0jIGRlZmluZSBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkgXAotICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQxMjcpCi0jIGRlZmluZSBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKSBcCi0gICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLS8vIERldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbgotLy8gSGFuZGxpbmcuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBzZXZlcmFsIFdpbmRvd3MgY29tcGlsZXJzIGJ1dCBnZW5lcmFsbHkKLS8vIGRvZXMgbm90IGV4aXN0IG9uIGFueSBvdGhlciBzeXN0ZW0uCi0jaWZuZGVmIEdURVNUX0hBU19TRUgKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCi0KLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0vLyBUaGVzZSB0d28gY29tcGlsZXJzIGFyZSBrbm93biB0byBzdXBwb3J0IFNFSC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDEKLSMgZWxzZQotLy8gQXNzdW1lIG5vIFNFSC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDAKLSMgZW5kaWYKLQotI2RlZmluZSBHVEVTVF9JU19USFJFQURTQUZFIFwKLSAgICAoR1RFU1RfSEFTX01VVEVYX0FORF9USFJFQURfTE9DQUxfIFwKLSAgICAgfHwgKEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQpIFwKLSAgICAgfHwgR1RFU1RfSEFTX1BUSFJFQUQpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAotCi0jaWZkZWYgX01TQ19WRVIKLQotIyBpZiBHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlkKLSMgIGRlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyBlbGlmIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQotIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jIGVuZGlmCi0KLSNlbmRpZiAgLy8gX01TQ19WRVIKLQotI2lmbmRlZiBHVEVTVF9BUElfCi0jIGRlZmluZSBHVEVTVF9BUElfCi0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi0vLyBBc2sgdGhlIGNvbXBpbGVyIHRvIG5ldmVyIGlubGluZSBhIGdpdmVuIGZ1bmN0aW9uLgotIyBkZWZpbmUgR1RFU1RfTk9fSU5MSU5FXyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfTk9fSU5MSU5FXwotI2VuZGlmCi0KLS8vIF9MSUJDUFBfVkVSU0lPTiBpcyBkZWZpbmVkIGJ5IHRoZSBsaWJjKysgbGlicmFyeSBmcm9tIHRoZSBMTFZNIHByb2plY3QuCi0jaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pCi0jIGRlZmluZSBHVEVTVF9IQVNfQ1hYQUJJX0hfIDEKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9IQVNfQ1hYQUJJX0hfIDAKLSNlbmRpZgotCi0vLyBBIGZ1bmN0aW9uIGxldmVsIGF0dHJpYnV0ZSB0byBkaXNhYmxlIGNoZWNraW5nIGZvciB1c2Ugb2YgdW5pbml0aWFsaXplZAotLy8gbWVtb3J5IHdoZW4gYnVpbHQgd2l0aCBNZW1vcnlTYW5pdGl6ZXIuCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jIGlmIF9faGFzX2ZlYXR1cmUobWVtb3J5X3Nhbml0aXplcikKLSMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXyBcCi0gICAgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfbWVtb3J5KSkKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfCi0jIGVuZGlmICAvLyBfX2hhc19mZWF0dXJlKG1lbW9yeV9zYW5pdGl6ZXIpCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KLSNlbmRpZiAgLy8gX19jbGFuZ19fCi0KLS8vIEEgZnVuY3Rpb24gbGV2ZWwgYXR0cmlidXRlIHRvIGRpc2FibGUgQWRkcmVzc1Nhbml0aXplciBpbnN0cnVtZW50YXRpb24uCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jIGlmIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfIFwKLSAgICAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV9hZGRyZXNzKSkKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotIyBlbmRpZiAgLy8gX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KLSNlbmRpZiAgLy8gX19jbGFuZ19fCi0KLS8vIEEgZnVuY3Rpb24gbGV2ZWwgYXR0cmlidXRlIHRvIGRpc2FibGUgVGhyZWFkU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgaWYgX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfIFwKLSAgICAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV90aHJlYWQpKQotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8KLSMgZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUodGhyZWFkX3Nhbml0aXplcikKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXwotI2VuZGlmICAvLyBfX2NsYW5nX18KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNZXNzYWdlOwotCi0jaWYgZGVmaW5lZChHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfKQotLy8gSW1wb3J0IHR1cGxlIGFuZCBmcmllbmRzIGludG8gdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UuCi0vLyBJdCBpcyBwYXJ0IG9mIG91ciBpbnRlcmZhY2UsIGhhdmluZyB0aGVtIGluIDo6dGVzdGluZyBhbGxvd3MgdXMgdG8gY2hhbmdlCi0vLyB0aGVpciB0eXBlcyBhcyBuZWVkZWQuCi11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjpnZXQ7Ci11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjptYWtlX3R1cGxlOwotdXNpbmcgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXzo6dHVwbGU7Ci11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjp0dXBsZV9zaXplOwotdXNpbmcgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXzo6dHVwbGVfZWxlbWVudDsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfKQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBIHNlY3JldCB0eXBlIHRoYXQgR29vZ2xlIFRlc3QgdXNlcnMgZG9uJ3Qga25vdyBhYm91dC4gIEl0IGhhcyBubwotLy8gZGVmaW5pdGlvbiBvbiBwdXJwb3NlLiAgVGhlcmVmb3JlIGl0J3MgaW1wb3NzaWJsZSB0byBjcmVhdGUgYQotLy8gU2VjcmV0IG9iamVjdCwgd2hpY2ggaXMgd2hhdCB3ZSB3YW50LgotY2xhc3MgU2VjcmV0OwotCi0vLyBUaGUgR1RFU1RfQ09NUElMRV9BU1NFUlRfIG1hY3JvIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY29tcGlsZSB0aW1lCi0vLyBleHByZXNzaW9uIGlzIHRydWUuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIGl0IHRvIHZlcmlmeSB0aGUKLS8vIHNpemUgb2YgYSBzdGF0aWMgYXJyYXk6Ci0vLwotLy8gICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oR1RFU1RfQVJSQVlfU0laRV8obmFtZXMpID09IE5VTV9OQU1FUywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2luY29ycmVjdF9zaXplKTsKLS8vCi0vLyBvciB0byBtYWtlIHN1cmUgYSBzdHJ1Y3QgaXMgc21hbGxlciB0aGFuIGEgY2VydGFpbiBzaXplOgotLy8KLS8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKLS8vCi0vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCi0vLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKLS8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgotCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotIyBkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgc3RhdGljX2Fzc2VydChleHByLCAjbXNnKQotI2Vsc2UgIC8vICFHVEVTVF9MQU5HX0NYWDExCi10ZW1wbGF0ZSA8Ym9vbD4KLSAgc3RydWN0IENvbXBpbGVBc3NlcnQgewotfTsKLQotIyBkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgXAotICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnQ8KHN0YXRpY19jYXN0PGJvb2w+KGV4cHIpKT4gXAotICAgICAgbXNnW3N0YXRpY19jYXN0PGJvb2w+KGV4cHIpID8gMSA6IC0xXSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotI2VuZGlmICAvLyAhR1RFU1RfTEFOR19DWFgxMQotCi0vLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIEdURVNUX0NPTVBJTEVfQVNTRVJUXzoKLS8vCi0vLyAoSW4gQysrMTEsIHdlIHNpbXBseSB1c2Ugc3RhdGljX2Fzc2VydCBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcpCi0vLwotLy8gLSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gd29ya3MgYnkgZGVmaW5pbmcgYW4gYXJyYXkgdHlwZSB0aGF0IGhhcyAtMQotLy8gICBlbGVtZW50cyAoYW5kIHRodXMgaXMgaW52YWxpZCkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZS4KLS8vCi0vLyAtIFRoZSBzaW1wbGVyIGRlZmluaXRpb24KLS8vCi0vLyAgICAjZGVmaW5lIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhleHByLCBtc2cpIHR5cGVkZWYgY2hhciBtc2dbKGV4cHIpID8gMSA6IC0xXQotLy8KLS8vICAgZG9lcyBub3Qgd29yaywgYXMgZ2NjIHN1cHBvcnRzIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgd2hvc2Ugc2l6ZXMKLS8vICAgYXJlIGRldGVybWluZWQgYXQgcnVuLXRpbWUgKHRoaXMgaXMgZ2NjJ3MgZXh0ZW5zaW9uIGFuZCBub3QgcGFydAotLy8gICBvZiB0aGUgQysrIHN0YW5kYXJkKS4gIEFzIGEgcmVzdWx0LCBnY2MgZmFpbHMgdG8gcmVqZWN0IHRoZQotLy8gICBmb2xsb3dpbmcgY29kZSB3aXRoIHRoZSBzaW1wbGUgZGVmaW5pdGlvbjoKLS8vCi0vLyAgICAgaW50IGZvbzsKLS8vICAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZm9vLCBtc2cpOyAvLyBub3Qgc3VwcG9zZWQgdG8gY29tcGlsZSBhcyBmb28gaXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi0vLwotLy8gLSBCeSB1c2luZyB0aGUgdHlwZSBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4sIHdlIGVuc3VyZXMgdGhhdAotLy8gICBleHByIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgKFRlbXBsYXRlIGFyZ3VtZW50cyBtdXN0IGJlCi0vLyAgIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLikKLS8vCi0vLyAtIFRoZSBvdXR0ZXIgcGFyZW50aGVzZXMgaW4gQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IGFyZSBuZWNlc3NhcnkKLS8vICAgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDMuNC40IGFuZCA0LjAuMS4gIElmIHdlIGhhZCB3cml0dGVuCi0vLwotLy8gICAgIENvbXBpbGVBc3NlcnQ8Ym9vbChleHByKT4KLS8vCi0vLyAgIGluc3RlYWQsIHRoZXNlIGNvbXBpbGVycyB3aWxsIHJlZnVzZSB0byBjb21waWxlCi0vLwotLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyg1ID4gMCwgc29tZV9tZXNzYWdlKTsKLS8vCi0vLyAgIChUaGV5IHNlZW0gdG8gdGhpbmsgdGhlICI+IiBpbiAiNSA+IDAiIG1hcmtzIHRoZSBlbmQgb2YgdGhlCi0vLyAgIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuKQotLy8KLS8vIC0gVGhlIGFycmF5IHNpemUgaXMgKGJvb2woZXhwcikgPyAxIDogLTEpLCBpbnN0ZWFkIG9mIHNpbXBseQotLy8KLS8vICAgICAoKGV4cHIpID8gMSA6IC0xKS4KLS8vCi0vLyAgIFRoaXMgaXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGEgYnVnIGluIE1TIFZDIDcuMSwgd2hpY2gKLS8vICAgY2F1c2VzICgoMC4wKSA/IDEgOiAtMSkgdG8gaW5jb3JyZWN0bHkgZXZhbHVhdGUgdG8gMS4KLQotLy8gU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyIGlzIHVzZWQgYnkgU3RhdGljQXNzZXJ0VHlwZUVxIGRlZmluZWQgaW4gZ3Rlc3QuaC4KLS8vCi0vLyBUaGlzIHRlbXBsYXRlIGlzIGRlY2xhcmVkLCBidXQgaW50ZW50aW9uYWxseSB1bmRlZmluZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQsIFQ+IHsKLSAgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OwotfTsKLQotLy8gRXZhbHVhdGVzIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gJ2FycmF5Jy4KLSNkZWZpbmUgR1RFU1RfQVJSQVlfU0laRV8oYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi10eXBlZGVmIDo6c3RyaW5nIHN0cmluZzsKLSNlbHNlCi10eXBlZGVmIDo6c3RkOjpzdHJpbmcgc3RyaW5nOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi10eXBlZGVmIDo6d3N0cmluZyB3c3RyaW5nOwotI2VsaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi10eXBlZGVmIDo6c3RkOjp3c3RyaW5nIHdzdHJpbmc7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0vLyBBIGhlbHBlciBmb3Igc3VwcHJlc3Npbmcgd2FybmluZ3Mgb24gY29uc3RhbnQgY29uZGl0aW9uLiAgSXQganVzdAotLy8gcmV0dXJucyAnY29uZGl0aW9uJy4KLUdURVNUX0FQSV8gYm9vbCBJc1RydWUoYm9vbCBjb25kaXRpb24pOwotCi0vLyBEZWZpbmVzIHNjb3BlZF9wdHIuCi0KLS8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2Ygc2NvcGVkX3B0ciBpcyBQQVJUSUFMIC0gaXQgb25seSBjb250YWlucwotLy8gZW5vdWdoIHN0dWZmIHRvIHNhdGlzZnkgR29vZ2xlIFRlc3QncyBuZWVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBzY29wZWRfcHRyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7Ci0KLSAgZXhwbGljaXQgc2NvcGVkX3B0cihUKiBwID0gTlVMTCkgOiBwdHJfKHApIHt9Ci0gIH5zY29wZWRfcHRyKCkgeyByZXNldCgpOyB9Ci0KLSAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnB0cl87IH0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KLSAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotCi0gIFQqIHJlbGVhc2UoKSB7Ci0gICAgVCogY29uc3QgcHRyID0gcHRyXzsKLSAgICBwdHJfID0gTlVMTDsKLSAgICByZXR1cm4gcHRyOwotICB9Ci0KLSAgdm9pZCByZXNldChUKiBwID0gTlVMTCkgewotICAgIGlmIChwICE9IHB0cl8pIHsKLSAgICAgIGlmIChJc1RydWUoc2l6ZW9mKFQpID4gMCkpIHsgIC8vIE1ha2VzIHN1cmUgVCBpcyBhIGNvbXBsZXRlIHR5cGUuCi0gICAgICAgIGRlbGV0ZSBwdHJfOwotICAgICAgfQotICAgICAgcHRyXyA9IHA7Ci0gICAgfQotICB9Ci0KLSAgZnJpZW5kIHZvaWQgc3dhcChzY29wZWRfcHRyJiBhLCBzY29wZWRfcHRyJiBiKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoYS5wdHJfLCBiLnB0cl8pOwotICB9Ci0KLSBwcml2YXRlOgotICBUKiBwdHJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oc2NvcGVkX3B0cik7Ci19OwotCi0vLyBEZWZpbmVzIFJFLgotCi0vLyBBIHNpbXBsZSBDKysgd3JhcHBlciBmb3IgPHJlZ2V4Lmg+LiAgSXQgdXNlcyB0aGUgUE9TSVggRXh0ZW5kZWQKLS8vIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXguCi1jbGFzcyBHVEVTVF9BUElfIFJFIHsKLSBwdWJsaWM6Ci0gIC8vIEEgY29weSBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCBieSB0aGUgU3RhbmRhcmQgdG8gaW5pdGlhbGl6ZSBvYmplY3QKLSAgLy8gcmVmZXJlbmNlcyBmcm9tIHItdmFsdWVzLgotICBSRShjb25zdCBSRSYgb3RoZXIpIHsgSW5pdChvdGhlci5wYXR0ZXJuKCkpOyB9Ci0KLSAgLy8gQ29uc3RydWN0cyBhbiBSRSBmcm9tIGEgc3RyaW5nLgotICBSRShjb25zdCA6OnN0ZDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgUkUoY29uc3QgOjpzdHJpbmcmIHJlZ2V4KSB7IEluaXQocmVnZXguY19zdHIoKSk7IH0gIC8vIE5PTElOVAotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgUkUoY29uc3QgY2hhciogcmVnZXgpIHsgSW5pdChyZWdleCk7IH0gIC8vIE5PTElOVAotICB+UkUoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4LgotICBjb25zdCBjaGFyKiBwYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gcGF0dGVybl87IH0KLQotICAvLyBGdWxsTWF0Y2goc3RyLCByZSkgcmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcwotICAvLyB0aGUgZW50aXJlIHN0ci4KLSAgLy8gUGFydGlhbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlCi0gIC8vIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCi0gIC8vCi0gIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIEZ1bGxNYXRjaCgpIGFuZCBQYXJ0aWFsTWF0Y2goKSB3b3JrCi0gIC8vIHdoZW4gc3RyIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzLgotICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gICAgcmV0dXJuIFBhcnRpYWxNYXRjaChzdHIuY19zdHIoKSwgcmUpOwotICB9Ci0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0gIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgewotICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKLSAgfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsKLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdChjb25zdCBjaGFyKiByZWdleCk7Ci0KLSAgLy8gV2UgdXNlIGEgY29uc3QgY2hhciogaW5zdGVhZCBvZiBhbiBzdGQ6OnN0cmluZywgYXMgR29vZ2xlIFRlc3QgdXNlZCB0byBiZQotICAvLyB1c2VkIHdoZXJlIHN0ZDo6c3RyaW5nIGlzIG5vdCBhdmFpbGFibGUuICBUT0RPKHdhbkBnb29nbGUuY29tKTogY2hhbmdlIHRvCi0gIC8vIHN0ZDo6c3RyaW5nLgotICBjb25zdCBjaGFyKiBwYXR0ZXJuXzsKLSAgYm9vbCBpc192YWxpZF87Ci0KLSNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLSAgcmVnZXhfdCBmdWxsX3JlZ2V4XzsgICAgIC8vIEZvciBGdWxsTWF0Y2goKS4KLSAgcmVnZXhfdCBwYXJ0aWFsX3JlZ2V4XzsgIC8vIEZvciBQYXJ0aWFsTWF0Y2goKS4KLQotI2Vsc2UgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCi0KLSAgY29uc3QgY2hhciogZnVsbF9wYXR0ZXJuXzsgIC8vIEZvciBGdWxsTWF0Y2goKTsKLQotI2VuZGlmCi0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSRSk7Ci19OwotCi0vLyBGb3JtYXRzIGEgc291cmNlIGZpbGUgcGF0aCBhbmQgYSBsaW5lIG51bWJlciBhcyB0aGV5IHdvdWxkIGFwcGVhcgotLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLgotR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7Ci0KLS8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgotLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bwotLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgotR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKLQotLy8gRGVmaW5lcyBsb2dnaW5nIHV0aWxpdGllczoKLS8vICAgR1RFU1RfTE9HXyhzZXZlcml0eSkgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuIFRoZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaXRzZWxmIGlzIHN0cmVhbWVkIGludG8gdGhlIG1hY3JvLgotLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuCi0vLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4KLQotZW51bSBHVGVzdExvZ1NldmVyaXR5IHsKLSAgR1RFU1RfSU5GTywKLSAgR1RFU1RfV0FSTklORywKLSAgR1RFU1RfRVJST1IsCi0gIEdURVNUX0ZBVEFMCi19OwotCi0vLyBGb3JtYXRzIGxvZyBlbnRyeSBzZXZlcml0eSwgcHJvdmlkZXMgYSBzdHJlYW0gb2JqZWN0IGZvciBzdHJlYW1pbmcgdGhlCi0vLyBsb2cgbWVzc2FnZSwgYW5kIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2Ugd2l0aCBhIG5ld2xpbmUgd2hlbiBnb2luZyBvdXQgb2YKLS8vIHNjb3BlLgotY2xhc3MgR1RFU1RfQVBJXyBHVGVzdExvZyB7Ci0gcHVibGljOgotICBHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7Ci0KLSAgLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCi0gIH5HVGVzdExvZygpOwotCi0gIDo6c3RkOjpvc3RyZWFtJiBHZXRTdHJlYW0oKSB7IHJldHVybiA6OnN0ZDo6Y2VycjsgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdExvZyk7Ci19OwotCi0jaWYgIWRlZmluZWQoR1RFU1RfTE9HXykKLSNpZiBHVEVTVF9PU19TVEFSQk9BUkQKLSNkZWZpbmUgR1RFU1RfTE9HXyBTQl9MT0cKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKLSNlbmRpZgotCi1pbmxpbmUgdm9pZCBMb2dUb1N0ZGVycigpIHt9Ci0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi1pbmxpbmUgdm9pZCBGbHVzaEluZm9Mb2coKSB7fQotI2Vsc2UKLWlubGluZSB2b2lkIEZsdXNoSW5mb0xvZygpIHsgZmZsdXNoKE5VTEwpOyB9Ci0jZW5kaWYKLQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9MT0dfKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfQ0hFQ0tfKQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgotLy8KLS8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCi0vLyBpcyBub3Qgc2F0aXNmaWVkLgotLy8gIFN5bm9wc3lzOgotLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKLS8vICAgICBvcgotLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKLS8vCi0vLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLS8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCi0vLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCi0vLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKLS8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgotIyBkZWZpbmUgR1RFU1RfQ0hFQ0tfKGNvbmRpdGlvbikgXAotICAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGNvbmRpdGlvbikpIFwKLSAgICAgIDsgXAotICAgIGVsc2UgXAotICAgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkNvbmRpdGlvbiAiICNjb25kaXRpb24gIiBmYWlsZWQuICIKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfQ0hFQ0tfKQotCi0vLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCi0vLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKLS8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCi0vLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKLS8vIGJyYW5jaC4KLSNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAotICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCi0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAotICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCi0KLSNpZiBHVEVTVF9IQVNfU1REX01PVkVfCi11c2luZyBzdGQ6Om1vdmU7Ci0jZWxzZSAgLy8gR1RFU1RfSEFTX1NURF9NT1ZFXwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jb25zdCBUJiBtb3ZlKGNvbnN0IFQmIHQpIHsKLSAgcmV0dXJuIHQ7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfTU9WRV8KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBVc2UgSW1wbGljaXRDYXN0XyBhcyBhIHNhZmUgdmVyc2lvbiBvZiBzdGF0aWNfY2FzdCBmb3IgdXBjYXN0aW5nIGluCi0vLyB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4gY2FzdGluZyBhIEZvbyogdG8gYSBTdXBlcmNsYXNzT2ZGb28qIG9yIGEKLS8vIGNvbnN0IEZvbyopLiAgV2hlbiB5b3UgdXNlIEltcGxpY2l0Q2FzdF8sIHRoZSBjb21waWxlciBjaGVja3MgdGhhdAotLy8gdGhlIGNhc3QgaXMgc2FmZS4gIFN1Y2ggZXhwbGljaXQgSW1wbGljaXRDYXN0X3MgYXJlIG5lY2Vzc2FyeSBpbgotLy8gc3VycHJpc2luZ2x5IG1hbnkgc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoCi0vLyBpbnN0ZWFkIG9mIGFuIGFyZ3VtZW50IHR5cGUgY29udmVydGFibGUgdG8gYSB0YXJnZXQgdHlwZS4KLS8vCi0vLyBUaGUgc3ludGF4IGZvciB1c2luZyBJbXBsaWNpdENhc3RfIGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdDoKLS8vCi0vLyAgIEltcGxpY2l0Q2FzdF88VG9UeXBlPihleHByKQotLy8KLS8vIEltcGxpY2l0Q2FzdF8gd291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LAotLy8gYnV0IHRoZSBwcm9wb3NhbCB3YXMgc3VibWl0dGVkIHRvbyBsYXRlLiAgSXQgd2lsbCBwcm9iYWJseSBtYWtlCi0vLyBpdHMgd2F5IGludG8gdGhlIGxhbmd1YWdlIGluIHRoZSBmdXR1cmUuCi0vLwotLy8gVGhpcyByZWxhdGl2ZWx5IHVnbHkgbmFtZSBpcyBpbnRlbnRpb25hbC4gSXQgcHJldmVudHMgY2xhc2hlcyB3aXRoCi0vLyBzaW1pbGFyIGZ1bmN0aW9ucyB1c2VycyBtYXkgaGF2ZSAoZS5nLiwgaW1wbGljaXRfY2FzdCkuIFRoZSBpbnRlcm5hbAotLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KLXRlbXBsYXRlPHR5cGVuYW1lIFRvPgotaW5saW5lIFRvIEltcGxpY2l0Q2FzdF8oVG8geCkgeyByZXR1cm4geDsgfQotCi0vLyBXaGVuIHlvdSB1cGNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20gdHlwZSBGb28gdG8gdHlwZQotLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBJbXBsaWNpdENhc3RfPD4sIHNpbmNlIHVwY2FzdHMKLS8vIGFsd2F5cyBzdWNjZWVkLiAgV2hlbiB5b3UgZG93bmNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20KLS8vIHR5cGUgRm9vIHRvIHR5cGUgU3ViY2xhc3NPZkZvbyksIHN0YXRpY19jYXN0PD4gaXNuJ3Qgc2FmZSwgYmVjYXVzZQotLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdAotLy8gY291bGQgYmUgYSBiYXJlIEZvbywgb3Igb2YgdHlwZSBEaWZmZXJlbnRTdWJjbGFzc09mRm9vLiAgVGh1cywKLS8vIHdoZW4geW91IGRvd25jYXN0LCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG1hY3JvLiAgSW4gZGVidWcgbW9kZSwgd2UKLS8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUKLS8vIGlmIGl0J3Mgbm90KS4gIEluIG5vcm1hbCBtb2RlLCB3ZSBkbyB0aGUgZWZmaWNpZW50IHN0YXRpY19jYXN0PD4KLS8vIGluc3RlYWQuICBUaHVzLCBpdCdzIGltcG9ydGFudCB0byB0ZXN0IGluIGRlYnVnIG1vZGUgdG8gbWFrZSBzdXJlCi0vLyB0aGUgY2FzdCBpcyBsZWdhbCEKLS8vICAgIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gdGhlIGNvZGUgd2Ugc2hvdWxkIHVzZSBkeW5hbWljX2Nhc3Q8Pi4KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBTSE9VTEROJ1QgYmUgdXNpbmcgZHluYW1pY19jYXN0PD4gaW4gb3JkZXIgdG8KLS8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOgotLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczE+KGZvbykpIEhhbmRsZUFTdWJjbGFzczFPYmplY3QoZm9vKTsKLS8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MyPihmb28pKSBIYW5kbGVBU3ViY2xhc3MyT2JqZWN0KGZvbyk7Ci0vLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLgotLy8KLS8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAotLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGRvd25fY2FzdCkuIFRoZSBpbnRlcm5hbAotLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KLXRlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiAgLy8gdXNlIGxpa2UgdGhpczogRG93bkNhc3RfPFQqPihmb28pOwotaW5saW5lIFRvIERvd25DYXN0XyhGcm9tKiBmKSB7ICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycwotICAvLyBFbnN1cmVzIHRoYXQgVG8gaXMgYSBzdWItdHlwZSBvZiBGcm9tICouICBUaGlzIHRlc3QgaXMgaGVyZSBvbmx5Ci0gIC8vIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZywgYW5kIGhhcyBubyBvdmVyaGVhZCBpbiBhbgotICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkKLSAgLy8gY29tcGxldGVseS4KLSAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCi0gIGlmIChmYWxzZSkgewotICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQotICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7Ci0gIH0KLQotI2lmIEdURVNUX0hBU19SVFRJCi0gIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKLSAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOwotI2VuZGlmCi0gIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Ci19Ci0KLS8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KLS8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAotLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCi0vLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCi0vLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCi10ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KLURlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7Ci0jaWYgR1RFU1RfSEFTX1JUVEkKLSAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX0RPV05DQVNUXwotICByZXR1cm4gOjpkb3duX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOwotI2VsaWYgR1RFU1RfSEFTX1JUVEkKLSAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKLSNlbHNlCi0gIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgotI2VuZGlmCi19Ci0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKLS8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KLS8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCi0vLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCi0vLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgotLy8KLUdURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7Ci1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7Ci1HVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOwotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotLy8gUmV0dXJucyBhIHBhdGggdG8gdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgVGVtcERpcigpOwotCi0vLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgotR1RFU1RfQVBJXyBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSk7Ci0KLS8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYSBzdHJpbmcuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpOwotCi0vLyBBbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLUdURVNUX0FQSV8gY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0QXJndnMoKTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLWNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpOwotdm9pZCBTZXRJbmplY3RhYmxlQXJndnMoY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FyZ3ZzKTsKLQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIERlZmluZXMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCi0jaWYgZGVmaW5lZChHVEVTVF9PU19TVEFSQk9BUkQpCi0KLWNsYXNzIE11dGV4IHsKLSBwdWJsaWM6Ci0gIGVudW0gTXV0ZXhUeXBlIHsga1N0YXRpYyA9IDAsIGtEeW5hbWljID0gMSB9OwotCi0gIC8vIFdlIHJlbHkgb24ga1N0YXRpY011dGV4IGJlaW5nIDAgYXMgaXQgaXMgdG8gd2hhdCB0aGUgbGlua2VyIGluaXRpYWxpemVzCi0gIC8vIHR5cGVfIGluIHN0YXRpYyBtdXRleGVzLiAgY3JpdGljYWxfc2VjdGlvbl8gd2lsbCBiZSBpbml0aWFsaXplZCBsYXppbHkKLSAgLy8gaW4gVGhyZWFkU2FmZUxhenlJbml0KCkuCi0gIGVudW0gU3RhdGljQ29uc3RydWN0b3JTZWxlY3RvciB7IGtTdGF0aWNNdXRleCA9IDAgfTsKLQotICAvLyBUaGlzIGNvbnN0cnVjdG9yIGludGVudGlvbmFsbHkgZG9lcyBub3RoaW5nLiAgSXQgcmVsaWVzIG9uIHR5cGVfIGJlaW5nCi0gIC8vIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgdG8gMCAoZWZmZWN0aXZlbHkgc2V0dGluZyBpdCB0byBrU3RhdGljKSBhbmQgb24KLSAgLy8gVGhyZWFkU2FmZUxhenlJbml0KCkgdG8gbGF6aWx5IGluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIG1lbWJlcnMuCi0gIGV4cGxpY2l0IE11dGV4KFN0YXRpY0NvbnN0cnVjdG9yU2VsZWN0b3IgLypkdW1teSovKSB7fQotCi0gIE11dGV4KCkgOiB0eXBlXyhrRHluYW1pYykgeyBTYk11dGV4Q3JlYXRlKCZtdXRleF8pOyB9Ci0gIH5NdXRleCgpIHsKLSAgICBpZiAodHlwZV8gIT0ga1N0YXRpYykgewotICAgICAgU2JNdXRleERlc3Ryb3koJm11dGV4Xyk7Ci0gICAgfQotICB9Ci0gIHZvaWQgTG9jaygpIHsKLSAgICBMYXp5SW5pdCgpOwotICAgIFNiTXV0ZXhBY3F1aXJlKCZtdXRleF8pOwotICB9Ci0gIHZvaWQgVW5sb2NrKCkgeyBTYk11dGV4UmVsZWFzZSgmbXV0ZXhfKTsgfQotICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7fQotCi0gcHJpdmF0ZToKLSAgdm9pZCBMYXp5SW5pdCgpIHsKLSAgICBpZiAodHlwZV8gPT0ga1N0YXRpYyAmJiAhaW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBzdGF0aWMgc3RhcmJvYXJkOjpTcGluTG9jayBzX2xvY2s7Ci0gICAgICBzX2xvY2suQWNxdWlyZSgpOwotICAgICAgaWYgKCFpbml0aWFsaXplZF8pIHsKLSAgICAgICAgU2JNdXRleENyZWF0ZSgmbXV0ZXhfKTsKLSAgICAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHNfbG9jay5SZWxlYXNlKCk7Ci0gICAgfQotICB9Ci0gIFNiTXV0ZXggbXV0ZXhfOwotICBmcmllbmQgY2xhc3MgR1Rlc3RNdXRleExvY2s7Ci0gIGJvb2wgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gIC8vIEZvciBzdGF0aWMgbXV0ZXhlcywgd2UgcmVseSBvbiB0eXBlXyBtZW1iZXIgYmVpbmcgaW5pdGlhbGl6ZWQgdG8gemVybwotICAvLyBieSB0aGUgbGlua2VyLgotICBNdXRleFR5cGUgdHlwZV87Ci19OwotCi0jZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgKLQotI2RlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleCg6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleDo6a1N0YXRpY011dGV4KQotCi0vLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBiZWNhdXNlIHRoZSBjdG9yIGRlY2xhcmF0aW9uIHdvdWxkCi0vLyBjb25mbGljdCB3aXRoIGEgbWFjcm8gbmFtZWQgTXV0ZXhMb2NrLCB3aGljaCBpcyBkZWZpbmVkIG9uIHNvbWUKLS8vIHBsYXRmb3Jtcy4gVGhhdCBtYWNybyBpcyB1c2VkIGFzIGEgZGVmZW5zaXZlIG1lYXN1cmUgdG8gcHJldmVudCBhZ2FpbnN0Ci0vLyBpbmFkdmVydGVudCBtaXN1c2VzIG9mIE11dGV4TG9jayBsaWtlICJNdXRleExvY2soJm11KSIgcmF0aGVyIHRoYW4KLS8vICJNdXRleExvY2sgbCgmbXUpIi4gIEhlbmNlIHRoZSB0eXBlZGVmIHRyaWNrIGJlbG93LgotY2xhc3MgR1Rlc3RNdXRleExvY2sgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXgqIG11dGV4KSA6IG11dGV4XyhtdXRleCkgewotICAgIG11dGV4Xy0+TG9jaygpOwotICB9ICAvLyBOT0xJTlQKLSAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9Ci0KLSBwcml2YXRlOgotICBNdXRleCogbXV0ZXhfOwotfTsKLQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVGhyZWFkTG9jYWwgewotIHB1YmxpYzoKLSAgVGhyZWFkTG9jYWwoKSB7Ci0gICAga2V5XyA9IFNiVGhyZWFkQ3JlYXRlTG9jYWxLZXkoCi0gICAgICAgIFtdKHZvaWQqIHZhbHVlKSB7IGRlbGV0ZSBzdGF0aWNfY2FzdDxUKj4odmFsdWUpOyB9KTsKLSAgICBTQl9EQ0hFQ0soa2V5XyAhPSBrU2JUaHJlYWRMb2NhbEtleUludmFsaWQpOwotICB9Ci0gIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKSA6IFRocmVhZExvY2FsKCkgewotICAgIGRlZmF1bHRfdmFsdWVfID0gdmFsdWU7Ci0gICAgc2V0KHZhbHVlKTsKLSAgfQotICB+VGhyZWFkTG9jYWwoKSB7Ci0gICAgU2JUaHJlYWREZXN0cm95TG9jYWxLZXkoa2V5Xyk7Ci0gIH0KLSAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQotICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9Ci0gIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KLSAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKkdldE9yQ3JlYXRlVmFsdWUoKSA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgewotICAgIFQqIHB0ciA9IHN0YXRpY19jYXN0PFQqPihTYlRocmVhZEdldExvY2FsVmFsdWUoa2V5XykpOwotICAgIGlmIChwdHIpIHsKLSAgICAgIHJldHVybiBwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFQqIG5ld192YWx1ZSA9IG5ldyBUKGRlZmF1bHRfdmFsdWVfKTsKLSAgICAgIGJvb2wgaXNfc2V0ID0gU2JUaHJlYWRTZXRMb2NhbFZhbHVlKGtleV8sIG5ld192YWx1ZSk7Ci0gICAgICBTQl9DSEVDSyhpc19zZXQpOwotICAgICAgcmV0dXJuIG5ld192YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBUIGRlZmF1bHRfdmFsdWVfOwotICBTYlRocmVhZExvY2FsS2V5IGtleV87Ci19OwotCi0jZWxzZSAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECi0jaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQotIyBpZiBHVEVTVF9IQVNfUFRIUkVBRAotLy8gU2xlZXBzIGZvciAocm91Z2hseSkgbiBtaWxsaXNlY29uZHMuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHRlc3RpbmcKLS8vIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuICBEb24ndCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyCi0vLyBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotaW5saW5lIHZvaWQgU2xlZXBNaWxsaXNlY29uZHMoaW50IG4pIHsKLSAgY29uc3QgdGltZXNwZWMgdGltZSA9IHsKLSAgICAwLCAgICAgICAgICAgICAgICAgIC8vIDAgc2Vjb25kcy4KLSAgICBuICogMTAwMEwgKiAxMDAwTCwgIC8vIEFuZCBuIG1zLgotICB9OwotICBuYW5vc2xlZXAoJnRpbWUsIE5VTEwpOwotfQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKLQotIyBpZiBHVEVTVF9IQVNfTk9USUZJQ0FUSU9OXwotLy8gTm90aWZpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgbmFtZXNwYWNlLgotLy8gTm90aGluZyB0byBkbyBoZXJlLgotCi0jIGVsaWYgR1RFU1RfSEFTX1BUSFJFQUQKLS8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCi0vLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCi0vLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90Ci0vLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi1jbGFzcyBOb3RpZmljYXRpb24gewotIHB1YmxpYzoKLSAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOwotICB9Ci0gIH5Ob3RpZmljYXRpb24oKSB7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOwotICB9Ci0KLSAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0Ci0gIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KLSAgdm9pZCBOb3RpZnkoKSB7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotICAgIG5vdGlmaWVkXyA9IHRydWU7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gIH0KLQotICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAotICAvLyB0aHJlYWQuCi0gIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0gICAgICBjb25zdCBib29sIG5vdGlmaWVkID0gbm90aWZpZWRfOwotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgICBpZiAobm90aWZpZWQpCi0gICAgICAgIGJyZWFrOwotICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKLSAgYm9vbCBub3RpZmllZF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOwotfTsKLQotIyBlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLQotR1RFU1RfQVBJXyB2b2lkIFNsZWVwTWlsbGlzZWNvbmRzKGludCBuKTsKLQotLy8gUHJvdmlkZXMgbGVhay1zYWZlIFdpbmRvd3Mga2VybmVsIGhhbmRsZSBvd25lcnNoaXAuCi0vLyBVc2VkIGluIGRlYXRoIHRlc3RzIGFuZCBpbiB0aHJlYWRpbmcgc3VwcG9ydC4KLWNsYXNzIEdURVNUX0FQSV8gQXV0b0hhbmRsZSB7Ci0gcHVibGljOgotICAvLyBBc3N1bWUgdGhhdCBXaW4zMiBIQU5ETEUgdHlwZSBpcyBlcXVpdmFsZW50IHRvIHZvaWQqLiBEb2luZyBzbyBhbGxvd3MgdXMgdG8KLSAgLy8gYXZvaWQgaW5jbHVkaW5nIDx3aW5kb3dzLmg+IGluIHRoaXMgaGVhZGVyIGZpbGUuIEluY2x1ZGluZyA8d2luZG93cy5oPiBpcwotICAvLyB1bmRlc2lyYWJsZSBiZWNhdXNlIGl0IGRlZmluZXMgYSBsb3Qgb2Ygc3ltYm9scyBhbmQgbWFjcm9zIHRoYXQgdGVuZCB0bwotICAvLyBjb25mbGljdCB3aXRoIGNsaWVudCBjb2RlLiBUaGlzIGFzc3VtcHRpb24gaXMgdmVyaWZpZWQgYnkKLSAgLy8gV2luZG93c1R5cGVzVGVzdC5IQU5ETEVJc1ZvaWRTdGFyLgotICB0eXBlZGVmIHZvaWQqIEhhbmRsZTsKLSAgQXV0b0hhbmRsZSgpOwotICBleHBsaWNpdCBBdXRvSGFuZGxlKEhhbmRsZSBoYW5kbGUpOwotCi0gIH5BdXRvSGFuZGxlKCk7Ci0KLSAgSGFuZGxlIEdldCgpIGNvbnN0OwotICB2b2lkIFJlc2V0KCk7Ci0gIHZvaWQgUmVzZXQoSGFuZGxlIGhhbmRsZSk7Ci0KLSBwcml2YXRlOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBoYW5kbGUgaXMgYSB2YWxpZCBoYW5kbGUgb2JqZWN0IHRoYXQgY2FuIGJlIGNsb3NlZC4KLSAgYm9vbCBJc0Nsb3NlYWJsZSgpIGNvbnN0OwotCi0gIEhhbmRsZSBoYW5kbGVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXV0b0hhbmRsZSk7Ci19OwotCi0vLyBBbGxvd3MgYSBjb250cm9sbGVyIHRocmVhZCB0byBwYXVzZSBleGVjdXRpb24gb2YgbmV3bHkgY3JlYXRlZAotLy8gdGhyZWFkcyB1bnRpbCBub3RpZmllZC4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUgY3JlYXRlZAotLy8gYW5kIGRlc3Ryb3llZCBpbiB0aGUgY29udHJvbGxlciB0aHJlYWQuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvIG5vdAotLy8gdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotY2xhc3MgR1RFU1RfQVBJXyBOb3RpZmljYXRpb24gewotIHB1YmxpYzoKLSAgTm90aWZpY2F0aW9uKCk7Ci0gIHZvaWQgTm90aWZ5KCk7Ci0gIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpOwotCi0gcHJpdmF0ZToKLSAgQXV0b0hhbmRsZSBldmVudF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOwotfTsKLSMgZW5kaWYgIC8vIEdURVNUX0hBU19OT1RJRklDQVRJT05fCi0KLS8vIE9uIE1pbkdXLCB3ZSBjYW4gaGF2ZSBib3RoIEdURVNUX09TX1dJTkRPV1MgYW5kIEdURVNUX0hBU19QVEhSRUFECi0vLyBkZWZpbmVkLCBidXQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgTWluR1cncyBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKLS8vIGhhcyBjb25mb3JtYW5jZSBwcm9ibGVtcyB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgdGhlIFBPU0lYIHN0YW5kYXJkLgotIyBpZiBHVEVTVF9IQVNfUFRIUkVBRCAmJiAhR1RFU1RfT1NfV0lORE9XU19NSU5HVwotCi0vLyBBcyBhIEMtZnVuY3Rpb24sIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UgY2Fubm90IGJlIHRlbXBsYXRlZCBpdHNlbGYuCi0vLyBDb25zZXF1ZW50bHksIGl0IGNhbm5vdCBzZWxlY3QgYSBjb3JyZWN0IGluc3RhbnRpYXRpb24gb2YgVGhyZWFkV2l0aFBhcmFtCi0vLyBpbiBvcmRlciB0byBjYWxsIGl0cyBSdW4oKS4gSW50cm9kdWNpbmcgVGhyZWFkV2l0aFBhcmFtQmFzZSBhcyBhCi0vLyBub24tdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFRocmVhZFdpdGhQYXJhbSBhbGxvd3MgdXMgdG8gYnlwYXNzIHRoaXMKLS8vIHByb2JsZW0uCi1jbGFzcyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbUJhc2UoKSB7fQotICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOwotfTsKLQotLy8gcHRocmVhZF9jcmVhdGUoKSBhY2NlcHRzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHR5cGUgd2l0aCB0aGUgQyBsaW5rYWdlLgotLy8gQWNjb3JkaW5nIHRvIHRoZSBTdGFuZGFyZCAoNy41LzEpLCBmdW5jdGlvbiB0eXBlcyB3aXRoIGRpZmZlcmVudCBsaW5rYWdlcwotLy8gYXJlIGRpZmZlcmVudCBldmVuIGlmIHRoZXkgYXJlIG90aGVyd2lzZSBpZGVudGljYWwuICBTb21lIGNvbXBpbGVycyAoZm9yCi0vLyBleGFtcGxlLCBTdW5TdHVkaW8pIHRyZWF0IHRoZW0gYXMgZGlmZmVyZW50IHR5cGVzLiAgU2luY2UgY2xhc3MgbWV0aG9kcwotLy8gY2Fubm90IGJlIGRlZmluZWQgd2l0aCBDLWxpbmthZ2Ugd2UgbmVlZCB0byBkZWZpbmUgYSBmcmVlIEMtZnVuY3Rpb24gdG8KLS8vIHBhc3MgaW50byBwdGhyZWFkX2NyZWF0ZSgpLgotZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCogVGhyZWFkRnVuY1dpdGhDTGlua2FnZSh2b2lkKiB0aHJlYWQpIHsKLSAgc3RhdGljX2Nhc3Q8VGhyZWFkV2l0aFBhcmFtQmFzZSo+KHRocmVhZCktPlJ1bigpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCi0vLyBUbyB1c2UgaXQsIHdyaXRlOgotLy8KLS8vICAgdm9pZCBUaHJlYWRGdW5jKGludCBwYXJhbSkgeyAvKiBEbyB0aGluZ3Mgd2l0aCBwYXJhbSAqLyB9Ci0vLyAgIE5vdGlmaWNhdGlvbiB0aHJlYWRfY2FuX3N0YXJ0OwotLy8gICAuLi4KLS8vICAgLy8gVGhlIHRocmVhZF9jYW5fc3RhcnQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyB5b3UgY2FuIHN1cHBseSBOVUxMLgotLy8gICBUaHJlYWRXaXRoUGFyYW08aW50PiB0aHJlYWQoJlRocmVhZEZ1bmMsIDUsICZ0aHJlYWRfY2FuX3N0YXJ0KTsKLS8vICAgdGhyZWFkX2Nhbl9zdGFydC5Ob3RpZnkoKTsKLS8vCi0vLyBUaGVzZSBjbGFzc2VzIGFyZSBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvCi0vLyBub3QgdXNlIHRoZW0gaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCBVc2VyVGhyZWFkRnVuYyhUKTsKLQotICBUaHJlYWRXaXRoUGFyYW0oVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKLSAgICAgIDogZnVuY18oZnVuYyksCi0gICAgICAgIHBhcmFtXyhwYXJhbSksCi0gICAgICAgIHRocmVhZF9jYW5fc3RhcnRfKHRocmVhZF9jYW5fc3RhcnQpLAotICAgICAgICBmaW5pc2hlZF8oZmFsc2UpIHsKLSAgICBUaHJlYWRXaXRoUGFyYW1CYXNlKiBjb25zdCBiYXNlID0gdGhpczsKLSAgICAvLyBUaGUgdGhyZWFkIGNhbiBiZSBjcmVhdGVkIG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBleGNlcHQgdGhyZWFkXwotICAgIC8vIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF8sIDAsICZUaHJlYWRGdW5jV2l0aENMaW5rYWdlLCBiYXNlKSk7Ci0gIH0KLSAgflRocmVhZFdpdGhQYXJhbSgpIHsgSm9pbigpOyB9Ci0KLSAgdm9pZCBKb2luKCkgewotICAgIGlmICghZmluaXNoZWRfKSB7Ci0gICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2pvaW4odGhyZWFkXywgMCkpOwotICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgUnVuKCkgewotICAgIGlmICh0aHJlYWRfY2FuX3N0YXJ0XyAhPSBOVUxMKQotICAgICAgdGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsKLSAgICBmdW5jXyhwYXJhbV8pOwotICB9Ci0KLSBwcml2YXRlOgotICBVc2VyVGhyZWFkRnVuYyogY29uc3QgZnVuY187ICAvLyBVc2VyLXN1cHBsaWVkIHRocmVhZCBmdW5jdGlvbi4KLSAgY29uc3QgVCBwYXJhbV87ICAvLyBVc2VyLXN1cHBsaWVkIHBhcmFtZXRlciB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uLgotICAvLyBXaGVuIG5vbi1OVUxMLCB1c2VkIHRvIGJsb2NrIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQKLSAgLy8gbm90aWZpZXMuCi0gIE5vdGlmaWNhdGlvbiogY29uc3QgdGhyZWFkX2Nhbl9zdGFydF87Ci0gIGJvb2wgZmluaXNoZWRfOyAgLy8gdHJ1ZSBpZmYgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQgZnVuY3Rpb24gaGFzIGZpbmlzaGVkLgotICBwdGhyZWFkX3QgdGhyZWFkXzsgIC8vIFRoZSBuYXRpdmUgdGhyZWFkIG9iamVjdC4KLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7Ci19OwotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MgJiYgR1RFU1RfSEFTX1BUSFJFQUQgfHwKLSAgICAgICAgIC8vIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXwotCi0jIGlmIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXwotLy8gTXV0ZXggYW5kIFRocmVhZExvY2FsIGhhdmUgYWxyZWFkeSBiZWVuIGltcG9ydGVkIGludG8gdGhlIG5hbWVzcGFjZS4KLS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KLQotIyBlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLQotLy8gTXV0ZXggaW1wbGVtZW50cyBtdXRleCBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4gIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KLS8vIHdpdGggY2xhc3MgTXV0ZXhMb2NrOgotLy8KLS8vICAgTXV0ZXggbXV0ZXg7Ci0vLyAgIC4uLgotLy8gICBNdXRleExvY2sgbG9jaygmbXV0ZXgpOyAgLy8gQWNxdWlyZXMgdGhlIG11dGV4IGFuZCByZWxlYXNlcyBpdCBhdCB0aGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBzY29wZS4KLS8vCi0vLyBBIHN0YXRpYyBNdXRleCAqbXVzdCogYmUgZGVmaW5lZCBvciBkZWNsYXJlZCB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZwotLy8gbWFjcm9zOgotLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOwotLy8gICBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19zb21lX211dGV4KTsKLS8vCi0vLyAoQSBub24tc3RhdGljIE11dGV4IGlzIGRlZmluZWQvZGVjbGFyZWQgaW4gdGhlIHVzdWFsIHdheSkuCi1jbGFzcyBHVEVTVF9BUElfIE11dGV4IHsKLSBwdWJsaWM6Ci0gIGVudW0gTXV0ZXhUeXBlIHsga1N0YXRpYyA9IDAsIGtEeW5hbWljID0gMSB9OwotICAvLyBXZSByZWx5IG9uIGtTdGF0aWNNdXRleCBiZWluZyAwIGFzIGl0IGlzIHRvIHdoYXQgdGhlIGxpbmtlciBpbml0aWFsaXplcwotICAvLyB0eXBlXyBpbiBzdGF0aWMgbXV0ZXhlcy4gIGNyaXRpY2FsX3NlY3Rpb25fIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF6aWx5Ci0gIC8vIGluIFRocmVhZFNhZmVMYXp5SW5pdCgpLgotICBlbnVtIFN0YXRpY0NvbnN0cnVjdG9yU2VsZWN0b3IgeyBrU3RhdGljTXV0ZXggPSAwIH07Ci0KLSAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpbnRlbnRpb25hbGx5IGRvZXMgbm90aGluZy4gIEl0IHJlbGllcyBvbiB0eXBlXyBiZWluZwotICAvLyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIDAgKGVmZmVjdGl2ZWx5IHNldHRpbmcgaXQgdG8ga1N0YXRpYykgYW5kIG9uCi0gIC8vIFRocmVhZFNhZmVMYXp5SW5pdCgpIHRvIGxhemlseSBpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBtZW1iZXJzLgotICBleHBsaWNpdCBNdXRleChTdGF0aWNDb25zdHJ1Y3RvclNlbGVjdG9yIC8qZHVtbXkqLykge30KLQotICBNdXRleCgpOwotICB+TXV0ZXgoKTsKLQotICB2b2lkIExvY2soKTsKLQotICB2b2lkIFVubG9jaygpOwotCi0gIC8vIERvZXMgbm90aGluZyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIG11dGV4LiBPdGhlcndpc2UsIGNyYXNoZXMKLSAgLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5LgotICB2b2lkIEFzc2VydEhlbGQoKTsKLQotIHByaXZhdGU6Ci0gIC8vIEluaXRpYWxpemVzIG93bmVyX3RocmVhZF9pZF8gYW5kIGNyaXRpY2FsX3NlY3Rpb25fIGluIHN0YXRpYyBtdXRleGVzLgotICB2b2lkIFRocmVhZFNhZmVMYXp5SW5pdCgpOwotCi0gIC8vIFBlciBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDIvMjMvNzgzOTUuYXNweCwKLSAgLy8gd2UgYXNzdW1lIHRoYXQgMCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aHJlYWQgSURzLgotICB1bnNpZ25lZCBpbnQgb3duZXJfdGhyZWFkX2lkXzsKLQotICAvLyBGb3Igc3RhdGljIG11dGV4ZXMsIHdlIHJlbHkgb24gdGhlc2UgbWVtYmVycyBiZWluZyBpbml0aWFsaXplZCB0byB6ZXJvcwotICAvLyBieSB0aGUgbGlua2VyLgotICBNdXRleFR5cGUgdHlwZV87Ci0gIGxvbmcgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXzsgIC8vIE5PTElOVAotICBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04qIGNyaXRpY2FsX3NlY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTXV0ZXgpOwotfTsKLQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4Ci0KLSMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgoOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXg6OmtTdGF0aWNNdXRleCkKLQotLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAotLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCi0vLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAotLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCi0vLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KLWNsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4KiBtdXRleCkKLSAgICAgIDogbXV0ZXhfKG11dGV4KSB7IG11dGV4Xy0+TG9jaygpOyB9Ci0KLSAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9Ci0KLSBwcml2YXRlOgotICBNdXRleCogY29uc3QgbXV0ZXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RNdXRleExvY2spOwotfTsKLQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIFZhbHVlSG9sZGVyPFQ+LiAgQWxsb3dzIGEgY2FsbGVyIHRvIGhvbGQgYW5kIGRlbGV0ZSBhIHZhbHVlCi0vLyB3aXRob3V0IGtub3dpbmcgaXRzIHR5cGUuCi1jbGFzcyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9Ci19OwotCi0vLyBQcm92aWRlcyBhIHdheSBmb3IgYSB0aHJlYWQgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvIGEgVGhyZWFkTG9jYWwKLS8vIHJlZ2FyZGxlc3Mgb2YgaXRzIHBhcmFtZXRlciB0eXBlLgotY2xhc3MgVGhyZWFkTG9jYWxCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBuZXcgVmFsdWVIb2xkZXI8VD4gb2JqZWN0IGhvbGRpbmcgYSBkZWZhdWx0IHZhbHVlIHBhc3NlZCB0bwotICAvLyB0aGlzIFRocmVhZExvY2FsPFQ+J3MgY29uc3RydWN0b3IgYW5kIHJldHVybnMgaXQuICBJdCBpcyB0aGUgY2FsbGVyJ3MKLSAgLy8gcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwgdGhpcyB3aGVuIHRoZSBUaHJlYWRMb2NhbDxUPiBpbnN0YW5jZSBhbHJlYWR5Ci0gIC8vIGhhcyBhIHZhbHVlIG9uIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgdmlydHVhbCBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogTmV3VmFsdWVGb3JDdXJyZW50VGhyZWFkKCkgY29uc3QgPSAwOwotCi0gcHJvdGVjdGVkOgotICBUaHJlYWRMb2NhbEJhc2UoKSB7fQotICB2aXJ0dWFsIH5UaHJlYWRMb2NhbEJhc2UoKSB7fQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbEJhc2UpOwotfTsKLQotLy8gTWFwcyBhIHRocmVhZCB0byBhIHNldCBvZiBUaHJlYWRMb2NhbHMgdGhhdCBoYXZlIHZhbHVlcyBpbnN0YW50aWF0ZWQgb24gdGhhdAotLy8gdGhyZWFkIGFuZCBub3RpZmllcyB0aGVtIHdoZW4gdGhlIHRocmVhZCBleGl0cy4gIEEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMKLS8vIGV4cGVjdGVkIHRvIHBlcnNpc3QgdW50aWwgYWxsIHRocmVhZHMgaXQgaGFzIHZhbHVlcyBvbiBoYXZlIHRlcm1pbmF0ZWQuCi1jbGFzcyBHVEVTVF9BUElfIFRocmVhZExvY2FsUmVnaXN0cnkgewotIHB1YmxpYzoKLSAgLy8gUmVnaXN0ZXJzIHRocmVhZF9sb2NhbF9pbnN0YW5jZSBhcyBoYXZpbmcgdmFsdWUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgotICAvLyBSZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgdGhyZWFkIGZyb20gb3RoZXIgdGhyZWFkcy4KLSAgc3RhdGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKLSAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKTsKLQotICAvLyBJbnZva2VkIHdoZW4gYSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuCi0gIHN0YXRpYyB2b2lkIE9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCi0gICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci19OwotCi1jbGFzcyBHVEVTVF9BUElfIFRocmVhZFdpdGhQYXJhbUJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBKb2luKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNsYXNzIFJ1bm5hYmxlIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5SdW5uYWJsZSgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKLSAgfTsKLQotICBUaHJlYWRXaXRoUGFyYW1CYXNlKFJ1bm5hYmxlICpydW5uYWJsZSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KTsKLSAgdmlydHVhbCB+VGhyZWFkV2l0aFBhcmFtQmFzZSgpOwotCi0gcHJpdmF0ZToKLSAgQXV0b0hhbmRsZSB0aHJlYWRfOwotfTsKLQotLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCBVc2VyVGhyZWFkRnVuYyhUKTsKLQotICBUaHJlYWRXaXRoUGFyYW0oVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKLSAgICAgIDogVGhyZWFkV2l0aFBhcmFtQmFzZShuZXcgUnVubmFibGVJbXBsKGZ1bmMsIHBhcmFtKSwgdGhyZWFkX2Nhbl9zdGFydCkgewotICB9Ci0gIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbSgpIHt9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBSdW5uYWJsZUltcGwgOiBwdWJsaWMgUnVubmFibGUgewotICAgcHVibGljOgotICAgIFJ1bm5hYmxlSW1wbChVc2VyVGhyZWFkRnVuYyogZnVuYywgVCBwYXJhbSkKLSAgICAgICAgOiBmdW5jXyhmdW5jKSwKLSAgICAgICAgICBwYXJhbV8ocGFyYW0pIHsKLSAgICB9Ci0gICAgdmlydHVhbCB+UnVubmFibGVJbXBsKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgUnVuKCkgewotICAgICAgZnVuY18ocGFyYW1fKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVXNlclRocmVhZEZ1bmMqIGNvbnN0IGZ1bmNfOwotICAgIGNvbnN0IFQgcGFyYW1fOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSdW5uYWJsZUltcGwpOwotICB9OwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkV2l0aFBhcmFtKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gV2luZG93cyBzeXN0ZW1zLgotLy8KLS8vICAgLy8gVGhyZWFkIDEKLS8vICAgVGhyZWFkTG9jYWw8aW50PiB0bCgxMDApOyAgLy8gMTAwIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KLS8vCi0vLyAgIC8vIFRocmVhZCAyCi0vLyAgIHRsLnNldCgxNTApOyAgLy8gQ2hhbmdlcyB0aGUgdmFsdWUgZm9yIHRocmVhZCAyIG9ubHkuCi0vLyAgIEVYUEVDVF9FUSgxNTAsIHRsLmdldCgpKTsKLS8vCi0vLyAgIC8vIFRocmVhZCAxCi0vLyAgIEVYUEVDVF9FUSgxMDAsIHRsLmdldCgpKTsgIC8vIEluIHRocmVhZCAxLCB0bCBoYXMgdGhlIG9yaWdpbmFsIHZhbHVlLgotLy8gICB0bC5zZXQoMjAwKTsKLS8vICAgRVhQRUNUX0VRKDIwMCwgdGwuZ2V0KCkpOwotLy8KLS8vIFRoZSB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50IFQgbXVzdCBoYXZlIGEgcHVibGljIGNvcHkgY29uc3RydWN0b3IuCi0vLyBJbiBhZGRpdGlvbiwgdGhlIGRlZmF1bHQgVGhyZWFkTG9jYWwgY29uc3RydWN0b3IgcmVxdWlyZXMgVCB0byBoYXZlCi0vLyBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotLy8KLS8vIFRoZSB1c2VycyBvZiBhIFRoZWFkTG9jYWwgaW5zdGFuY2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgYnV0IG9uZQotLy8gdGhyZWFkcyAoaW5jbHVkaW5nIHRoZSBtYWluIG9uZSkgdXNpbmcgdGhhdCBpbnN0YW5jZSBoYXZlIGV4aXRlZCBiZWZvcmUKLS8vIGRlc3Ryb3lpbmcgaXQuIE90aGVyd2lzZSwgdGhlIHBlci10aHJlYWQgb2JqZWN0cyBtYW5hZ2VkIGZvciB0aGVtIGJ5IHRoZQotLy8gVGhyZWFkTG9jYWwgaW5zdGFuY2UgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGRlc3Ryb3llZCBvbiBhbGwgcGxhdGZvcm1zLgotLy8KLS8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQotLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAotLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcwotLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVGhyZWFkTG9jYWwgOiBwdWJsaWMgVGhyZWFkTG9jYWxCYXNlIHsKLSBwdWJsaWM6Ci0gIFRocmVhZExvY2FsKCkgOiBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KCkpIHt9Ci0gIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKQotICAgICAgOiBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSh2YWx1ZSkpIHt9Ci0KLSAgflRocmVhZExvY2FsKCkgeyBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpPblRocmVhZExvY2FsRGVzdHJveWVkKHRoaXMpOyB9Ci0KLSAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQotICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9Ci0gIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KLSAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKnBvaW50ZXIoKSA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICAvLyBIb2xkcyBhIHZhbHVlIG9mIFQuICBDYW4gYmUgZGVsZXRlZCB2aWEgaXRzIGJhc2UgY2xhc3Mgd2l0aG91dCB0aGUgY2FsbGVyCi0gIC8vIGtub3dpbmcgdGhlIHR5cGUgb2YgVC4KLSAgY2xhc3MgVmFsdWVIb2xkZXIgOiBwdWJsaWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgewotICAgcHVibGljOgotICAgIFZhbHVlSG9sZGVyKCkgOiB2YWx1ZV8oKSB7fQotICAgIGV4cGxpY2l0IFZhbHVlSG9sZGVyKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLQotICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVCB2YWx1ZV87Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlcik7Ci0gIH07Ci0KLQotICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxWYWx1ZUhvbGRlcio+KAotICAgICAgICBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCh0aGlzKSktPnBvaW50ZXIoKTsKLSAgfQotCi0gIHZpcnR1YWwgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIE5ld1ZhbHVlRm9yQ3VycmVudFRocmVhZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZGVmYXVsdF9mYWN0b3J5Xy0+TWFrZU5ld0hvbGRlcigpOwotICB9Ci0KLSAgY2xhc3MgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgflZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0ID0gMDsKLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgY2xhc3MgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSA6IHB1YmxpYyBWYWx1ZUhvbGRlckZhY3RvcnkgewotICAgcHVibGljOgotICAgIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7IHJldHVybiBuZXcgVmFsdWVIb2xkZXIoKTsgfQotCi0gICBwcml2YXRlOgotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgY2xhc3MgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeShjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgVmFsdWVIb2xkZXIodmFsdWVfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgVCB2YWx1ZV87ICAvLyBUaGUgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgotCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgc2NvcGVkX3B0cjxWYWx1ZUhvbGRlckZhY3Rvcnk+IGRlZmF1bHRfZmFjdG9yeV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbCk7Ci19OwotCi0jIGVsaWYgR1RFU1RfSEFTX1BUSFJFQUQKLQotLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLgotY2xhc3MgTXV0ZXhCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCi0gIHZvaWQgTG9jaygpIHsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOwotICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOwotICAgIGhhc19vd25lcl8gPSB0cnVlOwotICB9Ci0KLSAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KLSAgdm9pZCBVbmxvY2soKSB7Ci0gICAgLy8gU2luY2UgdGhlIGxvY2sgaXMgYmVpbmcgcmVsZWFzZWQgdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgbm8gbG9uZ2VyIGJlCi0gICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncwotICAgIC8vIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCi0gICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KLSAgICBoYXNfb3duZXJfID0gZmFsc2U7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOwotICB9Ci0KLSAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcwotICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCi0gIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKLSAgICBHVEVTVF9DSEVDS18oaGFzX293bmVyXyAmJiBwdGhyZWFkX2VxdWFsKG93bmVyXywgcHRocmVhZF9zZWxmKCkpKQotICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOwotICB9Ci0KLSAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KLSAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKLSAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KLSAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcwotICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KLSBwdWJsaWM6Ci0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgotICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQKLSAgLy8gSUQgYW5kIGlzIHRoZXJlZm9yZSBzYWZlIHRvIGluc3BlY3QgKGUuZy4sIHRvIHVzZSBpbiBwdGhyZWFkX2VxdWFsKCkpLiBBbGwKLSAgLy8gYWNjZXNzZXMgdG8gdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IGEgY2hlY2sgb2YgdGhpcyBmaWVsZC4KLSAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8KLSAgLy8gZ3VhcmFudGVlIHRoYXQgYSB6ZXJvJ2QgcHRocmVhZF90IGlzIG5lY2Vzc2FyaWx5IGludmFsaWQgb3IgZXZlbiBkaWZmZXJlbnQKLSAgLy8gZnJvbSBwdGhyZWFkX3NlbGYoKS4KLSAgYm9vbCBoYXNfb3duZXJfOwotICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleC4KLX07Ci0KLS8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCi0jICBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXgKLQotLy8gRGVmaW5lcyBhbmQgc3RhdGljYWxseSAoaS5lLiBhdCBsaW5rIHRpbWUpIGluaXRpYWxpemVzIGEgc3RhdGljIG11dGV4LgotLy8gVGhlIGluaXRpYWxpemF0aW9uIGxpc3QgaGVyZSBkb2VzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemUgZWFjaCBmaWVsZCwKLS8vIGluc3RlYWQgcmVseWluZyBvbiBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZvciB0aGUgdW5zcGVjaWZpZWQgZmllbGRzLiBJbgotLy8gcGFydGljdWxhciwgdGhlIG93bmVyXyBmaWVsZCAoYSBwdGhyZWFkX3QpIGlzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemVkLgotLy8gVGhpcyBhbGxvd3MgaW5pdGlhbGl6YXRpb24gdG8gd29yayB3aGV0aGVyIHB0aHJlYWRfdCBpcyBhIHNjYWxhciBvciBzdHJ1Y3QuCi0vLyBUaGUgZmxhZyAtV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIG11c3Qgbm90IGJlIHNwZWNpZmllZCBmb3IgdGhpcyB0byB3b3JrLgotIyAgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4QmFzZSBtdXRleCA9IHsgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiwgZmFsc2UgfQotCi0vLyBUaGUgTXV0ZXggY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBmb3IgbXV0ZXhlcyBjcmVhdGVkIGF0IHJ1bnRpbWUuIEl0Ci0vLyBzaGFyZXMgaXRzIEFQSSB3aXRoIE11dGV4QmFzZSBvdGhlcndpc2UuCi1jbGFzcyBNdXRleCA6IHB1YmxpYyBNdXRleEJhc2UgewotIHB1YmxpYzoKLSAgTXV0ZXgoKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsKLSAgICBoYXNfb3duZXJfID0gZmFsc2U7Ci0gIH0KLSAgfk11dGV4KCkgewotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXhfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTXV0ZXgpOwotfTsKLQotLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAotLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCi0vLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAotLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCi0vLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KLWNsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4QmFzZSogbXV0ZXgpCi0gICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQotCi0gIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQotCi0gcHJpdmF0ZToKLSAgTXV0ZXhCYXNlKiBjb25zdCBtdXRleF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdE11dGV4TG9jayk7Ci19OwotCi10eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKLQotLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuCi0KLS8vIHB0aHJlYWRfa2V5X2NyZWF0ZSgpIHJlcXVpcmVzIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB0byBoYXZlCi0vLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2VzcwotLy8gVGhyZWFkTG9jYWw8VD4uICBIZW5jZSB0aGUgbmVlZCBmb3IgY2xhc3MKLS8vIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlLgotY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQotfTsKLQotLy8gQ2FsbGVkIGJ5IHB0aHJlYWQgdG8gZGVsZXRlIHRocmVhZC1sb2NhbCBkYXRhIHN0b3JlZCBieQotLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLgotZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHZvaWQqIHZhbHVlX2hvbGRlcikgewotICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPih2YWx1ZV9ob2xkZXIpOwotfQotCi0vLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIHB0aHJlYWRzLWJhc2VkIHN5c3RlbXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZExvY2FsIHsKLSBwdWJsaWM6Ci0gIFRocmVhZExvY2FsKCkKLSAgICAgIDoga2V5XyhDcmVhdGVLZXkoKSksIGRlZmF1bHRfZmFjdG9yeV8obmV3IERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSkge30KLSAgZXhwbGljaXQgVGhyZWFkTG9jYWwoY29uc3QgVCYgdmFsdWUpCi0gICAgICA6IGtleV8oQ3JlYXRlS2V5KCkpLAotICAgICAgICBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSh2YWx1ZSkpIHt9Ci0KLSAgflRocmVhZExvY2FsKCkgewotICAgIC8vIERlc3Ryb3lzIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBpZiBhbnkuCi0gICAgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZShwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKLQotICAgIC8vIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gIFRoaXMgd2lsbCAqbm90KgotICAgIC8vIGRlbGV0ZSBtYW5hZ2VkIG9iamVjdHMgZm9yIG90aGVyIHRocmVhZHMuCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsKLSAgfQotCi0gIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KLSAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQotICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9Ci0gIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQotCi0gcHJpdmF0ZToKLSAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuCi0gIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKLSAgIHB1YmxpYzoKLSAgICBWYWx1ZUhvbGRlcigpIDogdmFsdWVfKCkge30KLSAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQotCi0gICBwcml2YXRlOgotICAgIFQgdmFsdWVfOwotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOwotICB9OwotCi0gIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsKLSAgICBwdGhyZWFkX2tleV90IGtleTsKLSAgICAvLyBXaGVuIGEgdGhyZWFkIGV4aXRzLCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgd2lsbCBiZSBjYWxsZWQgb24KLSAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLgotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAotICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgJkRlbGV0ZVRocmVhZExvY2FsVmFsdWUpKTsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKLSAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKLSAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8VmFsdWVIb2xkZXI+KGhvbGRlciktPnBvaW50ZXIoKTsKLSAgICB9Ci0KLSAgICBWYWx1ZUhvbGRlciogY29uc3QgbmV3X2hvbGRlciA9IGRlZmF1bHRfZmFjdG9yeV8tPk1ha2VOZXdIb2xkZXIoKTsKLSAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyX2Jhc2UgPSBuZXdfaG9sZGVyOwotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5XywgaG9sZGVyX2Jhc2UpKTsKLSAgICByZXR1cm4gbmV3X2hvbGRlci0+cG9pbnRlcigpOwotICB9Ci0KLSAgY2xhc3MgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgflZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0ID0gMDsKLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgY2xhc3MgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSA6IHB1YmxpYyBWYWx1ZUhvbGRlckZhY3RvcnkgewotICAgcHVibGljOgotICAgIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7IHJldHVybiBuZXcgVmFsdWVIb2xkZXIoKTsgfQotCi0gICBwcml2YXRlOgotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgY2xhc3MgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeShjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgVmFsdWVIb2xkZXIodmFsdWVfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgVCB2YWx1ZV87ICAvLyBUaGUgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgotCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgLy8gQSBrZXkgcHRocmVhZHMgdXNlcyBmb3IgbG9va2luZyB1cCBwZXItdGhyZWFkIHZhbHVlcy4KLSAgY29uc3QgcHRocmVhZF9rZXlfdCBrZXlfOwotICBzY29wZWRfcHRyPFZhbHVlSG9sZGVyRmFjdG9yeT4gZGVmYXVsdF9mYWN0b3J5XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZExvY2FsKTsKLX07Ci0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXwotCi0jZWxzZSAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQotCi0vLyBBIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChtdXRleCwgbG9jaywKLS8vIGFuZCB0aHJlYWQtbG9jYWwgdmFyaWFibGUpLiAgTmVjZXNzYXJ5IGZvciBjb21waWxpbmcgR29vZ2xlIFRlc3Qgd2hlcmUKLS8vIG11dGV4IGlzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBHb29nbGUgVGVzdCBpbiBtdWx0aXBsZSB0aHJlYWRzIGlzIG5vdAotLy8gc3VwcG9ydGVkIG9uIHN1Y2ggcGxhdGZvcm1zLgotCi1jbGFzcyBNdXRleCB7Ci0gcHVibGljOgotICBNdXRleCgpIHt9Ci0gIHZvaWQgTG9jaygpIHt9Ci0gIHZvaWQgVW5sb2NrKCkge30KLSAgdm9pZCBBc3NlcnRIZWxkKCkgY29uc3Qge30KLX07Ci0KLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgKLQotIyBkZWZpbmUgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4Ci0KLS8vIFdlIGNhbm5vdCBuYW1lIHRoaXMgY2xhc3MgTXV0ZXhMb2NrIGJlY2F1c2UgdGhlIGN0b3IgZGVjbGFyYXRpb24gd291bGQKLS8vIGNvbmZsaWN0IHdpdGggYSBtYWNybyBuYW1lZCBNdXRleExvY2ssIHdoaWNoIGlzIGRlZmluZWQgb24gc29tZQotLy8gcGxhdGZvcm1zLiBUaGF0IG1hY3JvIGlzIHVzZWQgYXMgYSBkZWZlbnNpdmUgbWVhc3VyZSB0byBwcmV2ZW50IGFnYWluc3QKLS8vIGluYWR2ZXJ0ZW50IG1pc3VzZXMgb2YgTXV0ZXhMb2NrIGxpa2UgIk11dGV4TG9jaygmbXUpIiByYXRoZXIgdGhhbgotLy8gIk11dGV4TG9jayBsKCZtdSkiLiAgSGVuY2UgdGhlIHR5cGVkZWYgdHJpY2sgYmVsb3cuCi1jbGFzcyBHVGVzdE11dGV4TG9jayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKLX07Ci0KLXR5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZExvY2FsIHsKLSBwdWJsaWM6Ci0gIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQotICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9Ci0gIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9Ci0gIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQotIHByaXZhdGU6Ci0gIFQgdmFsdWVfOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCi0jZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKLS8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCi1HVEVTVF9BUElfIHNpemVfdCBHZXRUaHJlYWRDb3VudCgpOwotCi0vLyBQYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pIGNyYXNoZXMgdGhlIEFSTQotLy8gY29tcGlsZXIgYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgaW4gU3VuIFN0dWRpby4gIFRoZSBOb2tpYSBTeW1iaWFuCi0vLyBhbmQgdGhlIElCTSBYTCBDL0MrKyBjb21waWxlciB0cnkgdG8gaW5zdGFudGlhdGUgYSBjb3B5IGNvbnN0cnVjdG9yCi0vLyBmb3Igb2JqZWN0cyBwYXNzZWQgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKSwgZmFpbGluZyBmb3IgdW5jb3B5YWJsZQotLy8gb2JqZWN0cy4gIFdlIGRlZmluZSB0aGlzIHRvIGVuc3VyZSB0aGF0IG9ubHkgUE9EIGlzIHBhc3NlZCB0aHJvdWdoCi0vLyBlbGxpcHNpcyBvbiB0aGVzZSBzeXN0ZW1zLgotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQotLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCi0vLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgotIyBkZWZpbmUgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXyAxCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTCAxCi0jZW5kaWYKLQotLy8gVGhlIE5va2lhIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBjb21waWxlcnMgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCi0vLyBjb25zdCBUJiBhbmQgY29uc3QgVCogaW4gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gIFRoZXNlIGNvbXBpbGVycwotLy8gX2Nhbl8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwKLS8vIHNvIGEgdHIxOjp0eXBlX3RyYWl0cy1saWtlIGlzX3BvaW50ZXIgd29ya3MuCi0jaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pCi0jIGRlZmluZSBHVEVTVF9ORUVEU19JU19QT0lOVEVSXyAxCi0jZW5kaWYKLQotdGVtcGxhdGUgPGJvb2wgYm9vbF92YWx1ZT4KLXN0cnVjdCBib29sX2NvbnN0YW50IHsKLSAgdHlwZWRlZiBib29sX2NvbnN0YW50PGJvb2xfdmFsdWU+IHR5cGU7Ci0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYm9vbF92YWx1ZTsKLX07Ci10ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPiBjb25zdCBib29sIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT46OnZhbHVlOwotCi10eXBlZGVmIGJvb2xfY29uc3RhbnQ8ZmFsc2U+IGZhbHNlX3R5cGU7Ci10eXBlZGVmIGJvb2xfY29uc3RhbnQ8dHJ1ZT4gdHJ1ZV90eXBlOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBpc19wb2ludGVyIDogcHVibGljIGZhbHNlX3R5cGUge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IGlzX3BvaW50ZXI8VCo+IDogcHVibGljIHRydWVfdHlwZSB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotc3RydWN0IEl0ZXJhdG9yVHJhaXRzIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgSXRlcmF0b3JUcmFpdHM8VCo+IHsKLSAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBJdGVyYXRvclRyYWl0czxjb25zdCBUKj4gewotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLX07Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGRlZmluZSBHVEVTVF9QQVRIX1NFUF8gIlxcIgotIyBkZWZpbmUgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8gMQotLy8gVGhlIGJpZ2dlc3Qgc2lnbmVkIGludGVnZXIgdHlwZSB0aGUgY29tcGlsZXIgc3VwcG9ydHMuCi10eXBlZGVmIF9faW50NjQgQmlnZ2VzdEludDsKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9QQVRIX1NFUF8gIi8iCi0jIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAwCi10eXBlZGVmIGxvbmcgbG9uZyBCaWdnZXN0SW50OyAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVXRpbGl0aWVzIGZvciBjaGFyLgotCi0vLyBpc3NwYWNlKGludCBjaCkgYW5kIGZyaWVuZHMgYWNjZXB0IGFuIHVuc2lnbmVkIGNoYXIgb3IgRU9GLiAgY2hhcgotLy8gbWF5IGJlIHNpZ25lZCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciAob3IgY29tcGlsZXIgZmxhZ3MpLgotLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2FzdCBhIGNoYXIgdG8gdW5zaWduZWQgY2hhciBiZWZvcmUgY2FsbGluZwotLy8gaXNzcGFjZSgpLCBldGMuCi0KLWlubGluZSBib29sIElzQWxwaGEoY2hhciBjaCkgewotICByZXR1cm4gaXNhbHBoYShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc0FsTnVtKGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzYWxudW0oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOwotfQotaW5saW5lIGJvb2wgSXNEaWdpdChjaGFyIGNoKSB7Ci0gIHJldHVybiBpc2RpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzTG93ZXIoY2hhciBjaCkgewotICByZXR1cm4gaXNsb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc1NwYWNlKGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzc3BhY2Uoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOwotfQotaW5saW5lIGJvb2wgSXNVcHBlcihjaGFyIGNoKSB7Ci0gIHJldHVybiBpc3VwcGVyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzWERpZ2l0KGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzeGRpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzWERpZ2l0KHdjaGFyX3QgY2gpIHsKLSAgY29uc3QgdW5zaWduZWQgY2hhciBsb3dfYnl0ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKTsKLSAgcmV0dXJuIGNoID09IGxvd19ieXRlICYmIGlzeGRpZ2l0KGxvd19ieXRlKSAhPSAwOwotfQotCi1pbmxpbmUgY2hhciBUb0xvd2VyKGNoYXIgY2gpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KHRvbG93ZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Ci19Ci1pbmxpbmUgY2hhciBUb1VwcGVyKGNoYXIgY2gpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KHRvdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBTdHJpcFRyYWlsaW5nU3BhY2VzKHN0ZDo6c3RyaW5nIHN0cikgewotICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBzdHIuZW5kKCk7Ci0gIHdoaWxlIChpdCAhPSBzdHIuYmVnaW4oKSAmJiBJc1NwYWNlKCotLWl0KSkKLSAgICBpdCA9IHN0ci5lcmFzZShpdCk7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8vIFRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXggbmFtZXNwYWNlIGhvbGRzIHdyYXBwZXJzIGZvciBjb21tb24KLS8vIFBPU0lYIGZ1bmN0aW9ucy4gIFRoZXNlIHdyYXBwZXJzIGhpZGUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KLS8vIFdpbmRvd3MvTVNWQyBhbmQgUE9TSVggc3lzdGVtcy4gIFNpbmNlIHNvbWUgY29tcGlsZXJzIGRlZmluZSB0aGVzZQotLy8gc3RhbmRhcmQgZnVuY3Rpb25zIGFzIG1hY3JvcywgdGhlIHdyYXBwZXIgY2Fubm90IGhhdmUgdGhlIHNhbWUgbmFtZQotLy8gYXMgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCi0KLSNpZiBHVEVTVF9PU19TVEFSQk9BUkQKLXR5cGVkZWYgaW50IEZJTEU7Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHBvc2l4IHsKLQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotCi10eXBlZGVmIFNiRmlsZUluZm8gU3RhdFN0cnVjdDsKLQotaW5saW5lIGludCBGaWxlTm8oRklMRSogLypmaWxlKi8pIHsgcmV0dXJuIDA7IH0KLWlubGluZSBpbnQgSXNBVFRZKEZJTEUqIC8qZmlsZSovKSB7IHJldHVybiBTYkxvZ0lzVHR5KCkgPyAxIDogMDsgfQotaW5saW5lIGludCBTdGF0KGNvbnN0IGNoYXIqIHBhdGgsIFN0YXRTdHJ1Y3QqIGJ1ZikgewotICByZXR1cm4gU2JGaWxlR2V0UGF0aEluZm8ocGF0aCwgYnVmKSA/IDAgOiAtMTsKLX0KLWlubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKLSAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZU5vQ2FzZShzMSwgczIpOwotfQotaW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIFNiU3RyaW5nRHVwbGljYXRlKHNyYyk7IH0KLWlubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBTYkZpbGVEZWxldGUoZGlyKTsgfQotaW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsgcmV0dXJuIHN0LmlzX2RpcmVjdG9yeTsgfQotCi1pbmxpbmUgY29uc3QgY2hhciogU3RyTkNweShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBuKSB7Ci0gIHN0cm5jcHkoZGVzdCwgc3JjLCBzdGF0aWNfY2FzdDxpbnQ+KG4pKTsKLSAgcmV0dXJuIGRlc3Q7Ci19Ci0KLWlubGluZSBGSUxFKiBGT3Blbihjb25zdCBjaGFyKiAvKnBhdGgqLywgY29uc3QgY2hhciogLyptb2RlKi8pIHsgcmV0dXJuIE5VTEw7IH0KLWlubGluZSBpbnQgRkNsb3NlKEZJTEUqIC8qZnAqLykgeyByZXR1cm4gLTE7IH0KLWlubGluZSBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgLyplcnJudW0qLykgeyByZXR1cm4gIk4vQSI7IH0KLQotaW5saW5lIGNvbnN0IGNoYXIqIEdldEVudihjb25zdCBjaGFyKiAvKm5hbWUqLykgeyByZXR1cm4gTlVMTDsgfQotaW5saW5lIHZvaWQgQWJvcnQoKSB7IFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKTsgfQotCi1pbmxpbmUgaW50IFZTTlByaW50RihjaGFyKiBvdXRfYnVmZmVyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICByZXR1cm4gU2JTdHJpbmdGb3JtYXQob3V0X2J1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKLX0KLQotaW5saW5lIHNpemVfdCBTdHJMZW4oY29uc3QgY2hhciAqc3RyKSB7Ci0gIHJldHVybiBzdHJsZW4oc3RyKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIgKlN0ckNocihjb25zdCBjaGFyICpzdHIsIGNoYXIgYykgewotICByZXR1cm4gc3RyY2hyKHN0ciwgYyk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyICpTdHJSQ2hyKGNvbnN0IGNoYXIgKnN0ciwgY2hhciBjKSB7Ci0gIHJldHVybiBzdHJyY2hyKHN0ciwgYyk7Ci19Ci0KLWlubGluZSBpbnQgU3RyTkNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKSB7Ci0gIHJldHVybiBzdHJuY21wKHMxLCBzMiwgbik7Ci19Ci0KLWlubGluZSB2b2lkICpNZW1TZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKSB7Ci0gIHJldHVybiBtZW1zZXQocywgYywgbik7Ci19Ci0KLWlubGluZSB2b2lkIEFzc2VydChib29sIGIpIHsgU0JfQ0hFQ0soYik7IH0KLQotaW5saW5lIGludCBNa0Rpcihjb25zdCBjaGFyKiBwYXRoLCBpbnQgLyptb2RlKi8pIHsKLSAgcmV0dXJuIFNiRGlyZWN0b3J5Q3JlYXRlKHBhdGgpID8gMCA6IC0xOwotfQotCi1pbmxpbmUgdm9pZCBWUHJpbnRGKGNvbnN0IGNoYXIqIGZvcm1hdCwgdmFfbGlzdCBhcmdzKSB7Ci0gIFNiTG9nRm9ybWF0KGZvcm1hdCwgYXJncyk7Ci19Ci0KLWlubGluZSB2b2lkIFByaW50Rihjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIFZQcmludEYoZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotfQotCi1pbmxpbmUgdm9pZCBGbHVzaCgpIHsgU2JMb2dGbHVzaCgpOyB9Ci0KLWlubGluZSB2b2lkICpNYWxsb2Moc2l6ZV90IG4pIHsgcmV0dXJuIFNiTWVtb3J5QWxsb2NhdGUobik7IH0KLWlubGluZSB2b2lkIEZyZWUodm9pZCAqcCkgeyByZXR1cm4gU2JNZW1vcnlEZWFsbG9jYXRlKHApOyB9Ci0KLSNlbHNlIC8vIEdURVNUX09TX1NUQVJCT0FSRAotCi0vLyBGdW5jdGlvbnMgd2l0aCBhIGRpZmZlcmVudCBuYW1lIG9uIFdpbmRvd3MuCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0KLXR5cGVkZWYgc3RydWN0IF9zdGF0IFN0YXRTdHJ1Y3Q7Ci0KLSMgaWZkZWYgX19CT1JMQU5EQ19fCi1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KLWlubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKLSAgcmV0dXJuIHN0cmljbXAoczEsIHMyKTsKLX0KLWlubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQotIyBlbHNlICAvLyAhX19CT1JMQU5EQ19fCi0jICBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIGludCBJc0FUVFkoaW50IC8qIGZkICovKSB7IHJldHVybiAwOyB9Ci0jICBlbHNlCi1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIF9pc2F0dHkoZmQpOyB9Ci0jICBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLWlubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKLSAgcmV0dXJuIF9zdHJpY21wKHMxLCBzMik7Ci19Ci1pbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gX3N0cmR1cChzcmMpOyB9Ci0jIGVuZGlmICAvLyBfX0JPUkxBTkRDX18KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KF9maWxlbm8oZmlsZSkpOyB9Ci0vLyBTdGF0KCksIFJtRGlyKCksIGFuZCBJc0RpcigpIGFyZSBub3QgbmVlZGVkIG9uIFdpbmRvd3MgQ0UgYXQgdGhpcwotLy8gdGltZSBhbmQgdGh1cyBub3QgZGVmaW5lZCB0aGVyZS4KLSMgZWxzZQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gX2ZpbGVubyhmaWxlKTsgfQotaW5saW5lIGludCBTdGF0KGNvbnN0IGNoYXIqIHBhdGgsIFN0YXRTdHJ1Y3QqIGJ1ZikgeyByZXR1cm4gX3N0YXQocGF0aCwgYnVmKTsgfQotaW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIF9ybWRpcihkaXIpOyB9Ci1pbmxpbmUgYm9vbCBJc0Rpcihjb25zdCBTdGF0U3RydWN0JiBzdCkgewotICByZXR1cm4gKF9TX0lGRElSICYgc3Quc3RfbW9kZSkgIT0gMDsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSNlbHNlCi0KLXR5cGVkZWYgc3RydWN0IHN0YXQgU3RhdFN0cnVjdDsKLQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gZmlsZW5vKGZpbGUpOyB9Ci1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KLWlubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIHN0YXQocGF0aCwgYnVmKTsgfQotaW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgewotICByZXR1cm4gc3RyY2FzZWNtcChzMSwgczIpOwotfQotaW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9Ci1pbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gcm1kaXIoZGlyKTsgfQotaW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsgcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7IH0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIEZ1bmN0aW9ucyBkZXByZWNhdGVkIGJ5IE1TVkMgOC4wLgotCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2IC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gKi8pCi0KLWlubGluZSBjb25zdCBjaGFyKiBTdHJOQ3B5KGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IG4pIHsKLSAgcmV0dXJuIHN0cm5jcHkoZGVzdCwgc3JjLCBuKTsKLX0KLQotLy8gQ2hEaXIoKSwgRlJlb3BlbigpLCBGRE9wZW4oKSwgUmVhZCgpLCBXcml0ZSgpLCBDbG9zZSgpLCBhbmQKLS8vIFN0ckVycm9yKCkgYXJlbid0IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMgdGltZSBhbmQgdGh1cyBub3QKLS8vIGRlZmluZWQgdGhlcmUuCi0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLWlubGluZSBpbnQgQ2hEaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBjaGRpcihkaXIpOyB9Ci0jZW5kaWYKLWlubGluZSBGSUxFKiBGT3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSB7Ci0gIHJldHVybiBmb3BlbihwYXRoLCBtb2RlKTsKLX0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLWlubGluZSBGSUxFICpGUmVvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUsIEZJTEUqIHN0cmVhbSkgewotICByZXR1cm4gZnJlb3BlbihwYXRoLCBtb2RlLCBzdHJlYW0pOwotfQotaW5saW5lIEZJTEUqIEZET3BlbihpbnQgZmQsIGNvbnN0IGNoYXIqIG1vZGUpIHsgcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7IH0KLSNlbmRpZgotaW5saW5lIGludCBGQ2xvc2UoRklMRSogZnApIHsgcmV0dXJuIGZjbG9zZShmcCk7IH0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLWlubGluZSBpbnQgUmVhZChpbnQgZmQsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHJlYWQoZmQsIGJ1ZiwgY291bnQpKTsKLX0KLWlubGluZSBpbnQgV3JpdGUoaW50IGZkLCBjb25zdCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih3cml0ZShmZCwgYnVmLCBjb3VudCkpOwotfQotaW5saW5lIGludCBDbG9zZShpbnQgZmQpIHsgcmV0dXJuIGNsb3NlKGZkKTsgfQotaW5saW5lIGNvbnN0IGNoYXIqIFN0ckVycm9yKGludCBlcnJudW0pIHsgcmV0dXJuIHN0cmVycm9yKGVycm51bSk7IH0KLSNlbmRpZgotaW5saW5lIGNvbnN0IGNoYXIqIEdldEVudihjb25zdCBjaGFyKiBuYW1lKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8IEdURVNUX09TX1dJTkRPV1NfUlQKLSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UsIHdoaWNoIGhhcyBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0gIHN0YXRpY19jYXN0PHZvaWQ+KG5hbWUpOyAgLy8gVG8gcHJldmVudCAndW51c2VkIGFyZ3VtZW50JyB3YXJuaW5nLgotICByZXR1cm4gTlVMTDsKLSNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQotICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggd2UgcHJvZ3JhbW1hdGljYWxseSBjbGVhciB3aWxsIGJlIHNldCB0byB0aGUKLSAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGVudiA9IGdldGVudihuYW1lKTsKLSAgcmV0dXJuIChlbnYgIT0gTlVMTCAmJiBlbnZbMF0gIT0gJ1wwJykgPyBlbnYgOiBOVUxMOwotI2Vsc2UKLSAgcmV0dXJuIGdldGVudihuYW1lKTsKLSNlbmRpZgotfQotCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLQotI2lmICFkZWZpbmVkKEdURVNUX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIpCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgR1RFU1RfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih4KSAoeCkKLSNlbHNlICAvLyBfTVNDX1ZFUgotI2RlZmluZSBHVEVTVF9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlKDApCi0jZW5kaWYgIC8vIF9NU0NfVkVSCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIpCi0KLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBXaW5kb3dzIENFIGhhcyBubyBDIGxpYnJhcnkuIFRoZSBhYm9ydCgpIGZ1bmN0aW9uIGlzIHVzZWQgaW4KLS8vIHNldmVyYWwgcGxhY2VzIGluIEdvb2dsZSBUZXN0LiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgcmVhc29uYWJsZQotLy8gaW1pdGF0aW9uIG9mIHN0YW5kYXJkIGJlaGF2aW91ci4KLXZvaWQgQWJvcnQoKTsKLSNlbHNlCi1pbmxpbmUgdm9pZCBBYm9ydCgpIHsgYWJvcnQoKTsgfQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi1pbmxpbmUgaW50IFZTTlByaW50RihjaGFyKiBvdXRfYnVmZmVyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIHJldHVybiB2c25wcmludGYob3V0X2J1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKLX0KLQotaW5saW5lIHNpemVfdCBTdHJMZW4oY29uc3QgY2hhciAqc3RyKSB7IHJldHVybiBzdHJsZW4oc3RyKTsgfQotaW5saW5lIGNvbnN0IGNoYXIgKlN0ckNocihjb25zdCBjaGFyICpzdHIsIGNoYXIgYykgeyByZXR1cm4gc3RyY2hyKHN0ciwgYyk7IH0KLWlubGluZSBjb25zdCBjaGFyICpTdHJSQ2hyKGNvbnN0IGNoYXIgKnN0ciwgY2hhciBjKSB7IHJldHVybiBzdHJyY2hyKHN0ciwgYyk7IH0KLWlubGluZSBpbnQgU3RyTkNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKSB7Ci0gIHJldHVybiBzdHJuY21wKHMxLCBzMiwgbik7Ci19Ci1pbmxpbmUgdm9pZCAqTWVtU2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikgeyByZXR1cm4gbWVtc2V0KHMsIGMsIG4pOyB9Ci0KLWlubGluZSB2b2lkIEFzc2VydChib29sIGIpIHsKLSAgR1RFU1RfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihiKTsKLSAgYXNzZXJ0KGIpOwotfQotCi1pbmxpbmUgaW50IE1rRGlyKGNvbnN0IGNoYXIqIHBhdGgsIG1vZGVfdCBtb2RlKSB7Ci0gIEdURVNUX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIobW9kZSk7Ci0gIHJldHVybiBta2RpcihwYXRoLCBtb2RlKTsKLX0KLWlubGluZSB2b2lkIFZQcmludEYoY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFyZ3MpIHsKLSAgdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOwotfQotCi1pbmxpbmUgdm9pZCBQcmludEYoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICBWUHJpbnRGKGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLQotaW5saW5lIHZvaWQgRmx1c2goKSB7IGZmbHVzaChzdGRvdXQpOyB9Ci0KLWlubGluZSB2b2lkICpNYWxsb2Moc2l6ZV90IG4pIHsgcmV0dXJuIG1hbGxvYyhuKTsgfQotaW5saW5lIHZvaWQgRnJlZSh2b2lkICpwKSB7IHJldHVybiBmcmVlKHApOyB9Ci0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECi0KLWlubGluZSB2b2lkIFNOUHJpbnRGKGNoYXIqIG91dF9idWZmZXIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmb3JtYXQsLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgVlNOUHJpbnRGKG91dF9idWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHBvc2l4Ci0KLQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIGludGVybmFsOjpwb3NpeDo6U05QcmludEYKLSNlbHNlICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLS8vIE1TVkMgImRlcHJlY2F0ZXMiIHNucHJpbnRmIGFuZCBpc3N1ZXMgd2FybmluZ3Mgd2hlcmV2ZXIgaXQgaXMgdXNlZC4gIEluCi0vLyBvcmRlciB0byBhdm9pZCB0aGVzZSB3YXJuaW5ncywgd2UgbmVlZCB0byB1c2UgX3NucHJpbnRmIG9yIF9zbnByaW50Zl9zIG9uCi0vLyBNU1ZDLWJhc2VkIHBsYXRmb3Jtcy4gIFdlIG1hcCB0aGUgR1RFU1RfU05QUklOVEZfIG1hY3JvIHRvIHRoZSBhcHByb3ByaWF0ZQotLy8gZnVuY3Rpb24gaW4gb3JkZXIgdG8gYWNoaWV2ZSB0aGF0LiAgV2UgdXNlIG1hY3JvIGRlZmluaXRpb24gaGVyZSBiZWNhdXNlCi0vLyBzbnByaW50ZiBpcyBhIHZhcmlhZGljIGZ1bmN0aW9uLgotI2lmIF9NU0NfVkVSID49IDE0MDAgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBNU1ZDIDIwMDUgYW5kIGFib3ZlIHN1cHBvcnQgdmFyaWFkaWMgbWFjcm9zLgotIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfKGJ1ZmZlciwgc2l6ZSwgZm9ybWF0LCAuLi4pIFwKLSAgICAgX3NucHJpbnRmX3MoYnVmZmVyLCBzaXplLCBzaXplLCBmb3JtYXQsIF9fVkFfQVJHU19fKQotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLS8vIFdpbmRvd3MgQ0UgZG9lcyBub3QgZGVmaW5lIF9zbnByaW50Zl9zIGFuZCBNU1ZDIHByaW9yIHRvIDIwMDUgZG9lc24ndAotLy8gY29tcGxhaW4gYWJvdXQgX3NucHJpbnRmLgotIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIF9zbnByaW50ZgotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX1NOUFJJTlRGXyBzbnByaW50ZgotI2VuZGlmCi0jZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAotCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgYSBCaWdnZXN0SW50IGNhbiByZXByZXNlbnQuICBUaGlzIGRlZmluaXRpb24KLS8vIHdvcmtzIG5vIG1hdHRlciBCaWdnZXN0SW50IGlzIHJlcHJlc2VudGVkIGluIG9uZSdzIGNvbXBsZW1lbnQgb3IKLS8vIHR3bydzIGNvbXBsZW1lbnQuCi0vLwotLy8gV2UgY2Fubm90IHJlbHkgb24gbnVtZXJpY19saW1pdHMgaW4gU1RMLCBhcyBfX2ludDY0IGFuZCBsb25nIGxvbmcKLS8vIGFyZSBub3QgcGFydCBvZiBzdGFuZGFyZCBDKysgYW5kIG51bWVyaWNfbGltaXRzIGRvZXNuJ3QgbmVlZCB0byBiZQotLy8gZGVmaW5lZCBmb3IgdGhlbS4KLWNvbnN0IEJpZ2dlc3RJbnQga01heEJpZ2dlc3RJbnQgPQotICAgIH4oc3RhdGljX2Nhc3Q8QmlnZ2VzdEludD4oMSkgPDwgKDgqc2l6ZW9mKEJpZ2dlc3RJbnQpIC0gMSkpOwotCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHNlcnZlcyBhcyBhIGNvbXBpbGUtdGltZSBmdW5jdGlvbiBmcm9tIHNpemUgdG8KLS8vIHR5cGUuICBJdCBtYXBzIGEgc2l6ZSBpbiBieXRlcyB0byBhIHByaW1pdGl2ZSB0eXBlIHdpdGggdGhhdAotLy8gc2l6ZS4gZS5nLgotLy8KLS8vICAgVHlwZVdpdGhTaXplPDQ+OjpVSW50Ci0vLwotLy8gaXMgdHlwZWRlZi1lZCB0byBiZSB1bnNpZ25lZCBpbnQgKHVuc2lnbmVkIGludGVnZXIgbWFkZSB1cCBvZiA0Ci0vLyBieXRlcykuCi0vLwotLy8gU3VjaCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZWxvbmcgdG8gU1RMLCBidXQgSSBjYW5ub3QgZmluZCBpdAotLy8gdGhlcmUuCi0vLwotLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGlzIGNsYXNzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmbG9hdGluZy1wb2ludAotLy8gY29tcGFyaXNvbi4KLS8vCi0vLyBGb3Igbm93IGl0IG9ubHkgaGFuZGxlcyBVSW50ICh1bnNpZ25lZCBpbnQpIGFzIHRoYXQncyBhbGwgR29vZ2xlIFRlc3QKLS8vIG5lZWRzLiAgT3RoZXIgdHlwZXMgY2FuIGJlIGVhc2lseSBhZGRlZCBpbiB0aGUgZnV0dXJlIGlmIG5lZWQKLS8vIGFyaXNlcy4KLXRlbXBsYXRlIDxzaXplX3Qgc2l6ZT4KLWNsYXNzIFR5cGVXaXRoU2l6ZSB7Ci0gcHVibGljOgotICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gdXNpbmcgVHlwZVdpdGhTaXplPE4+IHdpdGggaW5jb3JyZWN0Ci0gIC8vIHZhbHVlcyBvZiBOLgotICB0eXBlZGVmIHZvaWQgVUludDsKLX07Ci0KLS8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA0LgotdGVtcGxhdGUgPD4KLWNsYXNzIFR5cGVXaXRoU2l6ZTw0PiB7Ci0gcHVibGljOgotICAvLyB1bnNpZ25lZCBpbnQgaGFzIHNpemUgNCBpbiBib3RoIGdjYyBhbmQgTVNWQy4KLSAgLy8KLSAgLy8gQXMgYmFzZS9iYXNpY3R5cGVzLmggZG9lc24ndCBjb21waWxlIG9uIFdpbmRvd3MsIHdlIGNhbm5vdCB1c2UKLSAgLy8gdWludDMyLCB1aW50NjQsIGFuZCBldGMgaGVyZS4KLSAgdHlwZWRlZiBpbnQgSW50OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50OwotfTsKLQotLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDguCi10ZW1wbGF0ZSA8PgotY2xhc3MgVHlwZVdpdGhTaXplPDg+IHsKLSBwdWJsaWM6Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICB0eXBlZGVmIF9faW50NjQgSW50OwotICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVUludDsKLSNlbHNlCi0gIHR5cGVkZWYgbG9uZyBsb25nIEludDsgIC8vIE5PTElOVAotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSW50OyAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLX07Ci0KLS8vIEludGVnZXIgdHlwZXMgb2Yga25vd24gc2l6ZXMuCi10eXBlZGVmIFR5cGVXaXRoU2l6ZTw0Pjo6SW50IEludDMyOwotdHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OlVJbnQgVUludDMyOwotdHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBJbnQ2NDsKLXR5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpVSW50IFVJbnQ2NDsKLXR5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgVGltZUluTWlsbGlzOyAgLy8gUmVwcmVzZW50cyB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLQotLy8gVXRpbGl0aWVzIGZvciBjb21tYW5kIGxpbmUgZmxhZ3MgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLgotI2lmICFkZWZpbmVkKEdURVNUX0ZMQUcpCi0jIGRlZmluZSBHVEVTVF9GTEFHKG5hbWUpIEZMQUdTX2d0ZXN0XyMjbmFtZQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9GTEFHKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXykKLSNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCi0jIGRlZmluZSBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfIDEKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfIDAKLSNlbmRpZgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfREVDTEFSRV9ib29sXykKLSMgZGVmaW5lIEdURVNUX0ZMQUdfU0FWRVJfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdUZXN0RmxhZ1NhdmVyCi0KLS8vIE1hY3JvcyBmb3IgZGVjbGFyaW5nIGZsYWdzLgotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9ib29sXyhuYW1lKSBHVEVTVF9BUElfIGV4dGVybiBib29sIEdURVNUX0ZMQUcobmFtZSkKLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKLSAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpCi0jZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCi0gICAgR1RFU1RfQVBJXyBleHRlcm4gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpCi0KLS8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCi0jZGVmaW5lIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCi0gICAgR1RFU1RfQVBJXyBib29sIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCi0jZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKLSNkZWZpbmUgR1RFU1RfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQotCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0RFQ0xBUkVfYm9vbF8pCi0KLS8vIFRocmVhZCBhbm5vdGF0aW9ucwotI2lmICFkZWZpbmVkKEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXykKLSMgZGVmaW5lIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhsb2NrcykKLSMgZGVmaW5lIEdURVNUX0xPQ0tfRVhDTFVERURfKGxvY2tzKQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8pCi0KLS8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMgdGhlIHJlc3VsdAotLy8gdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlIHVuY2hhbmdlZCBhbmQgcmV0dXJucwotLy8gZmFsc2UuCi0vLyBUT0RPKGNoYW5kbGVyYyk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZmFjdG9yIGZsYWcgYW5kIGVudmlyb25tZW50IHBhcnNpbmcKLS8vIG91dCBvZiBib3RoIGd0ZXN0LXBvcnQuY2MgYW5kIGd0ZXN0LmNjIHRvIGF2b2lkIGV4cG9ydGluZyB0aGlzIHV0aWxpdHkKLS8vIGZ1bmN0aW9uLgotYm9vbCBQYXJzZUludDMyKGNvbnN0IE1lc3NhZ2UmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIEludDMyKiB2YWx1ZSk7Ci0KLS8vIFBhcnNlcyBhIGJvb2wvSW50MzIvc3RyaW5nIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBHb29nbGUgVGVzdCBmbGFnLgotYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWwpOwotR1RFU1RfQVBJXyBJbnQzMiBJbnQzMkZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiBkZWZhdWx0X3ZhbCk7Ci1jb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWwpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNTQyNzEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIFN0cmluZyBjbGFzcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQotLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gVGhleSBzaG91bGQgbm90IHVzZWQKLS8vIGJ5IGNvZGUgZXh0ZXJuYWwgdG8gR29vZ2xlIFRlc3QuCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBpcyAjaW5jbHVkZWQgYnkgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgotLy8gSXQgc2hvdWxkIG5vdCBiZSAjaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KLQotI2lmZGVmIF9fQk9STEFORENfXwotLy8gc3RyaW5nLmggaXMgbm90IGd1YXJhbnRlZWQgdG8gcHJvdmlkZSBzdHJjcHkgb24gQysrIEJ1aWxkZXIuCi0jIGluY2x1ZGUgPG1lbS5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFN0cmluZyAtIGFuIGFic3RyYWN0IGNsYXNzIGhvbGRpbmcgc3RhdGljIHN0cmluZyB1dGlsaXRpZXMuCi1jbGFzcyBHVEVTVF9BUElfIFN0cmluZyB7Ci0gcHVibGljOgotICAvLyBTdGF0aWMgdXRpbGl0eSBtZXRob2RzCi0KLSAgLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUKLSAgLy8gY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuIHZhbHVlIHVzaW5nCi0gIC8vIGRlbGV0ZVtdLiAgUmV0dXJucyB0aGUgY2xvbmVkIHN0cmluZywgb3IgTlVMTCBpZiB0aGUgaW5wdXQgaXMKLSAgLy8gTlVMTC4KLSAgLy8KLSAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBzdHJkdXAoKSBpbiBzdHJpbmcuaCwgd2hpY2ggYWxsb2NhdGVzCi0gIC8vIG1lbW9yeSB1c2luZyBtYWxsb2MoKS4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBjX3N0cik7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICAvLyBXaW5kb3dzIENFIGRvZXMgbm90IGhhdmUgdGhlICdBTlNJJyB2ZXJzaW9ucyBvZiBXaW4zMiBBUElzLiBUbyBiZQotICAvLyBhYmxlIHRvIHBhc3Mgc3RyaW5ncyB0byBXaW4zMiBBUElzIG9uIENFIHdlIG5lZWQgdG8gY29udmVydCB0aGVtCi0gIC8vIHRvICdVbmljb2RlJywgVVRGLTE2LgotCi0gIC8vIENyZWF0ZXMgYSBVVEYtMTYgd2lkZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gQU5TSSBzdHJpbmcsIGFsbG9jYXRpbmcKLSAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgotICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCi0gIC8vIGlucHV0IGlzIE5VTEwuCi0gIC8vCi0gIC8vIFRoZSB3aWRlIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCi0gIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQotICAvLyBDIHJ1bnRpbWUuCi0gIHN0YXRpYyBMUENXU1RSIEFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGNfc3RyKTsKLQotICAvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nCi0gIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KLSAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQotICAvLyBpbnB1dCBpcyBOVUxMLgotICAvLwotICAvLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEFOU0kgY29kZXBhZ2UgKENQX0FDUCkgdG8KLSAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlCi0gIC8vIEMgcnVudGltZS4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIFV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKTsKLSNlbmRpZgotCi0gIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgotICAvLwotICAvLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQotICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIHN0YXRpYyBib29sIENTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLCBjb25zdCBjaGFyKiByaHMpOwotCi0gIC8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhIFN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCi0gIC8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcKLSAgLy8gdGhlIGNvbnZlcnNpb24sICIoZmFpbGVkIHRvIGNvbnZlcnQgZnJvbSB3aWRlIHN0cmluZykiIGlzCi0gIC8vIHJldHVybmVkLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgU2hvd1dpZGVDU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpOwotCi0gIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCi0gIC8vIGNvbnRlbnQuCi0gIC8vCi0gIC8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCi0gIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAotICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KLSAgc3RhdGljIGJvb2wgV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCB3Y2hhcl90KiByaHMpOwotCi0gIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKLSAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgotICAvLwotICAvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KLSAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJocyk7Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5Ci0gIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KLSAgLy8KLSAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCi0gIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgotICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQotICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAotICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgotICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCi0gIC8vIGN1cnJlbnQgbG9jYWxlLgotICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocyk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZwotICAvLyBjYXNlLiBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4LgotICBzdGF0aWMgYm9vbCBFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOwotCi0gIC8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlMDJkIi4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEludFdpZHRoMihpbnQgdmFsdWUpOyAgLy8gIiUwMmQiIGZvciB3aWR0aCA9PSAyCi0KLSAgLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiVYIi4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEhleEludChpbnQgdmFsdWUpOwotCi0gIC8vIEZvcm1hdHMgYSBieXRlIGFzICIlMDJYIi4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEJ5dGUodW5zaWduZWQgY2hhciB2YWx1ZSk7Ci0KLSBwcml2YXRlOgotICBTdHJpbmcoKTsgIC8vIE5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQuCi19OyAgLy8gY2xhc3MgU3RyaW5nCi0KLS8vIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZ3N0cmVhbSdzIGJ1ZmZlciBhcyBhbiBzdGQ6OnN0cmluZy4gIEVhY2ggJ1wwJwotLy8gY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3RyZWFtKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWI0MDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMCArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHVwbGUuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KLQotI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCi0KLS8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCi0vLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKLS8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCi0vLyBwcml2YXRlIGFzIHB1YmxpYy4KLS8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAotICAgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPiBmcmllbmQgY2xhc3MgdHVwbGU7IFwKLSAgIHByaXZhdGU6Ci0jZW5kaWYKLQotLy8gVmlzdWFsIFN0dWRpbyAyMDEwLCAyMDEyLCBhbmQgMjAxMyBkZWZpbmUgc3ltYm9scyBpbiBzdGQ6OnRyMSB0aGF0IGNvbmZsaWN0Ci0vLyB3aXRoIG91ciBvd24gZGVmaW5pdGlvbnMuIFRoZXJlZm9yZSB1c2luZyBvdXIgb3duIHR1cGxlIGRvZXMgbm90IHdvcmsgb24KLS8vIHRob3NlIGNvbXBpbGVycy4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNjAwICAvKiAxNjAwIGlzIFZpc3VhbCBTdHVkaW8gMjAxMCAqLwotIyBlcnJvciAiZ3Rlc3QncyB0dXBsZSBkb2Vzbid0IGNvbXBpbGUgb24gVmlzdWFsIFN0dWRpbyAyMDEwIG9yIGxhdGVyLiBcCi1HVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSBtdXN0IGJlIHNldCB0byAwIG9uIHRob3NlIGNvbXBpbGVycy4iCi0jZW5kaWYKLQotLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KLSNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgotI2RlZmluZSBHVEVTVF8xX1RVUExFXyhUKSB0dXBsZTxUIyMwLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfMl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzNfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKLSAgICB2b2lkLCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF80X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCB2b2lkLCB2b2lkLCB2b2lkLCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfNV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgdm9pZCwgdm9pZCwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzZfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIHZvaWQsIFwKLSAgICB2b2lkLCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF83X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfOF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAotICAgIFQjIzcsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzlfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKLSAgICBUIyM3LCBUIyM4LCB2b2lkPgotI2RlZmluZSBHVEVTVF8xMF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAotICAgIFQjIzcsIFQjIzgsIFQjIzk+Ci0KLS8vIEdURVNUX25fVFlQRU5BTUVTXyhUKSBkZWNsYXJlcyBhIGxpc3Qgb2YgbiB0eXBlbmFtZXMuCi0jZGVmaW5lIEdURVNUXzBfVFlQRU5BTUVTXyhUKQotI2RlZmluZSBHVEVTVF8xX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMAotI2RlZmluZSBHVEVTVF8yX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMQotI2RlZmluZSBHVEVTVF8zX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMgotI2RlZmluZSBHVEVTVF80X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMKLSNkZWZpbmUgR1RFU1RfNV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0Ci0jZGVmaW5lIEdURVNUXzZfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNQotI2RlZmluZSBHVEVTVF83X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYKLSNkZWZpbmUgR1RFU1RfOF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCB0eXBlbmFtZSBUIyM3Ci0jZGVmaW5lIEdURVNUXzlfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAotICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgKLSNkZWZpbmUgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAotICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgsIHR5cGVuYW1lIFQjIzkKLQotLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAotLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCi0vLyBsaWJyYXJ5IHZlbmRvci4KLW5hbWVzcGFjZSBzdGQgewotbmFtZXNwYWNlIHRyMSB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMCA9IHZvaWQsIHR5cGVuYW1lIFQxID0gdm9pZCwgdHlwZW5hbWUgVDIgPSB2b2lkLAotICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsCi0gICAgdHlwZW5hbWUgVDYgPSB2b2lkLCB0eXBlbmFtZSBUNyA9IHZvaWQsIHR5cGVuYW1lIFQ4ID0gdm9pZCwKLSAgICB0eXBlbmFtZSBUOSA9IHZvaWQ+Ci1jbGFzcyB0dXBsZTsKLQotLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKLS8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0vLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgotI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQotCi0vLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKLS8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KLSNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQotCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgotdGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7Ci0KLS8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKLS8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgotc3RydWN0IFR1cGxlRWxlbWVudDsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDAsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMCB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDEsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMSB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDIsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDMsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMyB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDQsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNCB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDUsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNSB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDYsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDcsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNyB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDgsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUOCB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDksIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUOSB0eXBlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCi0KLXRlbXBsYXRlIDw+Ci1jbGFzcyB0dXBsZTw+IHsKLSBwdWJsaWM6Ci0gIHR1cGxlKCkge30KLSAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzFfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjApIDogZjBfKGYwKSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzJfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSkgOiBmMF8oZjApLAotICAgICAgZjFfKGYxKSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgewotICAgIGYwXyA9IHAuZmlyc3Q7Ci0gICAgZjFfID0gcC5zZWNvbmQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfM19UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMikge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfNF9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKLSAgICAgIGYzXyhmMykge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfNV9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLAotICAgICAgR1RFU1RfQllfUkVGXyhUNCkgZjQpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCi0gICAgICBmNF8odC5mNF8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0Xykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICBmNF8gPSB0LmY0XzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci0gIFQ0IGY0XzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+Ci1jbGFzcyBHVEVTVF82X1RVUExFXyhUKSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCi0gICAgICBmNV8oZjUpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfN19UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAotICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCi0gICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIGY2XyA9IHQuZjZfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci0gIFQ2IGY2XzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+Ci1jbGFzcyBHVEVTVF84X1RVUExFXyhUKSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAotICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LAotICAgICAgR1RFU1RfQllfUkVGXyhUNykgZjcpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKLSAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNykge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgZjJfID0gdC5mMl87Ci0gICAgZjNfID0gdC5mM187Ci0gICAgZjRfID0gdC5mNF87Ci0gICAgZjVfID0gdC5mNV87Ci0gICAgZjZfID0gdC5mNl87Ci0gICAgZjdfID0gdC5mN187Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci0gIFQyIGYyXzsKLSAgVDMgZjNfOwotICBUNCBmNF87Ci0gIFQ1IGY1XzsKLSAgVDYgZjZfOwotICBUNyBmN187Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfOV9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAotICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKLSAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgZjJfID0gdC5mMl87Ci0gICAgZjNfID0gdC5mM187Ci0gICAgZjRfID0gdC5mNF87Ci0gICAgZjVfID0gdC5mNV87Ci0gICAgZjZfID0gdC5mNl87Ci0gICAgZjdfID0gdC5mN187Ci0gICAgZjhfID0gdC5mOF87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci0gIFQyIGYyXzsKLSAgVDMgZjNfOwotICBUNCBmNF87Ci0gIFQ1IGY1XzsKLSAgVDYgZjZfOwotICBUNyBmN187Ci0gIFQ4IGY4XzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotY2xhc3MgdHVwbGUgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSwKLSAgICAgIGY5XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCwgR1RFU1RfQllfUkVGXyhUOSkgZjkpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKLSAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCksIGY5XyhmOSkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwgZjlfKHQuZjlfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksCi0gICAgICBmOV8odC5mOV8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIGY2XyA9IHQuZjZfOwotICAgIGY3XyA9IHQuZjdfOwotICAgIGY4XyA9IHQuZjhfOwotICAgIGY5XyA9IHQuZjlfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci0gIFQ2IGY2XzsKLSAgVDcgZjdfOwotICBUOCBmOF87Ci0gIFQ5IGY5XzsKLX07Ci0KLS8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgotCi0vLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCi0vLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0Ci0vLyBpbXBsZW1lbnQgdGllKCkuCi0KLWlubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KLQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF8xX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCkgewotICByZXR1cm4gR1RFU1RfMV9UVVBMRV8oVCkoZjApOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzJfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEpIHsKLSAgcmV0dXJuIEdURVNUXzJfVFVQTEVfKFQpKGYwLCBmMSk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfM19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyKSB7Ci0gIHJldHVybiBHVEVTVF8zX1RVUExFXyhUKShmMCwgZjEsIGYyKTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF80X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCi0gICAgY29uc3QgVDMmIGYzKSB7Ci0gIHJldHVybiBHVEVTVF80X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMyk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfNV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0KSB7Ci0gIHJldHVybiBHVEVTVF81X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzZfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1KSB7Ci0gIHJldHVybiBHVEVTVF82X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF83X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCi0gICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2KSB7Ci0gIHJldHVybiBHVEVTVF83X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNik7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfOF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3KSB7Ci0gIHJldHVybiBHVEVTVF84X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzlfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKLSAgICBjb25zdCBUOCYgZjgpIHsKLSAgcmV0dXJuIEdURVNUXzlfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF8xMF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAotICAgIGNvbnN0IFQ4JiBmOCwgY29uc3QgVDkmIGY5KSB7Ci0gIHJldHVybiBHVEVTVF8xMF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjkpOwotfQotCi0vLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOwotCi10ZW1wbGF0ZSA8R1RFU1RfMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMF9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzFfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8yX1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfM19UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAzOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzRfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF81X1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDU7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNl9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA2OwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzdfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF84X1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDg7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOV9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA5OwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxMDsKLX07Ci0KLXRlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+Ci1zdHJ1Y3QgdHVwbGVfZWxlbWVudCB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKLSAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Ci19OwotCi0jZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKLQotLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KLQotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwwPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDE+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8Mj4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwzPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDQ+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8NT4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDw2PiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDc+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8OD4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDw5PiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfMTBfVFVQTEVfKFQpKSkKLWdldChHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOwotfQotCi10ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1HVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8xMF9UVVBMRV8oVCkpKQotZ2V0KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCkgewotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKLX0KLQotLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycwotCi0vLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCi0KLW5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7Ci0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKLS8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCi0vLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKLS8vIGsxICE9IGsyLgotdGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4gewotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+Ci0gIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGludCBrPgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7Ci0gICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKLSAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID46OnZhbHVlLAotICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVSkgPjo6dmFsdWU+OjpFcSh0LCB1KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KLQotLy8gNi4xLjQgUGFpcnMuCi0vLyBVbmltcGxlbWVudGVkLgotCi19ICAvLyBuYW1lc3BhY2UgdHIxCi19ICAvLyBuYW1lc3BhY2Ugc3RkCi0KLSN1bmRlZiBHVEVTVF8wX1RVUExFXwotI3VuZGVmIEdURVNUXzFfVFVQTEVfCi0jdW5kZWYgR1RFU1RfMl9UVVBMRV8KLSN1bmRlZiBHVEVTVF8zX1RVUExFXwotI3VuZGVmIEdURVNUXzRfVFVQTEVfCi0jdW5kZWYgR1RFU1RfNV9UVVBMRV8KLSN1bmRlZiBHVEVTVF82X1RVUExFXwotI3VuZGVmIEdURVNUXzdfVFVQTEVfCi0jdW5kZWYgR1RFU1RfOF9UVVBMRV8KLSN1bmRlZiBHVEVTVF85X1RVUExFXwotI3VuZGVmIEdURVNUXzEwX1RVUExFXwotCi0jdW5kZWYgR1RFU1RfMF9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfMV9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfMl9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfM19UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfNF9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfNV9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfNl9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfN19UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfOF9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfOV9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfMTBfVFlQRU5BTUVTXwotCi0jdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0jdW5kZWYgR1RFU1RfQllfUkVGXwotI3VuZGVmIEdURVNUX0FERF9SRUZfCi0jdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIGIvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5ZGRmZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJHZhciBuID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIHR1cGxlIGZpZWxkcyB3ZSB3YW50IHRvIHN1cHBvcnQuCi0kJCBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIEVtYWNzLiB9fQotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBJbXBsZW1lbnRzIGEgc3Vic2V0IG9mIFRSMSB0dXBsZSBuZWVkZWQgYnkgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwotCi0jaW5jbHVkZSA8dXRpbGl0eT4gIC8vIEZvciA6OnN0ZDo6cGFpci4KLQotLy8gVGhlIGNvbXBpbGVyIHVzZWQgaW4gU3ltYmlhbiBoYXMgYSBidWcgdGhhdCBwcmV2ZW50cyB1cyBmcm9tIGRlY2xhcmluZyB0aGUKLS8vIHR1cGxlIHRlbXBsYXRlIGFzIGEgZnJpZW5kIChpdCBjb21wbGFpbnMgdGhhdCB0dXBsZSBpcyByZWRlZmluZWQpLiAgVGhpcwotLy8gaGFjayBieXBhc3NlcyB0aGUgYnVnIGJ5IGRlY2xhcmluZyB0aGUgbWVtYmVycyB0aGF0IHNob3VsZCBvdGhlcndpc2UgYmUKLS8vIHByaXZhdGUgYXMgcHVibGljLgotLy8gU3VuIFN0dWRpbyB2ZXJzaW9ucyA8IDEyIGFsc28gaGF2ZSB0aGUgYWJvdmUgYnVnLgotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgKGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIF9fU1VOUFJPX0NDIDwgMHg1OTApCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gcHVibGljOgotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBcCi0gICAgdGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4gZnJpZW5kIGNsYXNzIHR1cGxlOyBcCi0gICBwcml2YXRlOgotI2VuZGlmCi0KLS8vIFZpc3VhbCBTdHVkaW8gMjAxMCwgMjAxMiwgYW5kIDIwMTMgZGVmaW5lIHN5bWJvbHMgaW4gc3RkOjp0cjEgdGhhdCBjb25mbGljdAotLy8gd2l0aCBvdXIgb3duIGRlZmluaXRpb25zLiBUaGVyZWZvcmUgdXNpbmcgb3VyIG93biB0dXBsZSBkb2VzIG5vdCB3b3JrIG9uCi0vLyB0aG9zZSBjb21waWxlcnMuCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTYwMCAgLyogMTYwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMTAgKi8KLSMgZXJyb3IgImd0ZXN0J3MgdHVwbGUgZG9lc24ndCBjb21waWxlIG9uIFZpc3VhbCBTdHVkaW8gMjAxMCBvciBsYXRlci4gXAotR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgbXVzdCBiZSBzZXQgdG8gMCBvbiB0aG9zZSBjb21waWxlcnMuIgotI2VuZGlmCi0KLQotJHJhbmdlIGkgMC4ubi0xCi0kcmFuZ2UgaiAwLi5uCi0kcmFuZ2UgayAxLi5uCi0vLyBHVEVTVF9uX1RVUExFXyhUKSBpcyB0aGUgdHlwZSBvZiBhbiBuLXR1cGxlLgotI2RlZmluZSBHVEVTVF8wX1RVUExFXyhUKSB0dXBsZTw+Ci0KLSRmb3IgayBbWwotJHJhbmdlIG0gMC4uay0xCi0kcmFuZ2UgbTIgay4ubi0xCi0jZGVmaW5lIEdURVNUXyQoaylfVFVQTEVfKFQpIHR1cGxlPCRmb3IgbSwgW1tUIyMkbV1dJGZvciBtMiBbWywgdm9pZF1dPgotCi1dXQotCi0vLyBHVEVTVF9uX1RZUEVOQU1FU18oVCkgZGVjbGFyZXMgYSBsaXN0IG9mIG4gdHlwZW5hbWVzLgotCi0kZm9yIGogW1sKLSRyYW5nZSBtIDAuLmotMQotI2RlZmluZSBHVEVTVF8kKGopX1RZUEVOQU1FU18oVCkgJGZvciBtLCBbW3R5cGVuYW1lIFQjIyRtXV0KLQotCi1dXQotCi0vLyBJbiB0aGVvcnksIGRlZmluaW5nIHN0dWZmIGluIHRoZSA6OnN0ZCBuYW1lc3BhY2UgaXMgdW5kZWZpbmVkCi0vLyBiZWhhdmlvci4gIFdlIGNhbiBkbyB0aGlzIGFzIHdlIGFyZSBwbGF5aW5nIHRoZSByb2xlIG9mIGEgc3RhbmRhcmQKLS8vIGxpYnJhcnkgdmVuZG9yLgotbmFtZXNwYWNlIHN0ZCB7Ci1uYW1lc3BhY2UgdHIxIHsKLQotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGkgPSB2b2lkXV0+Ci1jbGFzcyB0dXBsZTsKLQotLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKLS8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0vLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgotI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQotCi0vLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKLS8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KLSNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQotCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgotdGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7Ci0KLS8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKLS8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgotc3RydWN0IFR1cGxlRWxlbWVudDsKLQotCi0kZm9yIGkgW1sKLXRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsICRpLCBHVEVTVF8kKG4pX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUJGkgdHlwZTsKLX07Ci0KLQotXV0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8PgotY2xhc3MgdHVwbGU8PiB7Ci0gcHVibGljOgotICB0dXBsZSgpIHt9Ci0gIHR1cGxlKGNvbnN0IHR1cGxlJiAvKiB0ICovKSAge30KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgLyogdCAqLykgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLQotJGZvciBrIFtbCi0kcmFuZ2UgbSAwLi5rLTEKLXRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVCk+Ci1jbGFzcyAkaWYgayA8IG4gW1tHVEVTVF8kKGspX1RVUExFXyhUKV1dICRlbHNlIFtbdHVwbGVdXSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiAkZm9yIG0sIFtbZiQobSlfKCldXSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKCRmb3IgbSwgW1tHVEVTVF9CWV9SRUZfKFQkbSkgZiRtXV0pIDogW1tdXQotJGZvciBtLCBbW2YkKG0pXyhmJG0pXV0ge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiAkZm9yIG0sIFtbZiQobSlfKHQuZiQobSlfKV1dIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfJChrKV9UVVBMRV8oVSkmIHQpIDogJGZvciBtLCBbW2YkKG0pXyh0LmYkKG0pXyldXSB7fQotCi0kaWYgayA9PSAyIFtbCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9Ci0KLV1dCi0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSRpZiBrID09IDIgW1sKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSB7Ci0gICAgZjBfID0gcC5maXJzdDsKLSAgICBmMV8gPSBwLnNlY29uZDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotXV0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfJChrKV9UVVBMRV8oVSkmIHQpIHsKLQotJGZvciBtIFtbCi0gICAgZiQobSlfID0gdC5mJChtKV87Ci0KLV1dCi0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLQotJGZvciBtIFtbCi0gIFQkbSBmJChtKV87Ci0KLV1dCi19OwotCi0KLV1dCi0vLyA2LjEuMy4yIFR1cGxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KLQotLy8gS25vd24gbGltaXRhdGlvbnM6IHdlIGRvbid0IHN1cHBvcnQgcGFzc2luZyBhbgotLy8gc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPFQ+IHRvIG1ha2VfdHVwbGUoKS4gIEFuZCB3ZSBkb24ndAotLy8gaW1wbGVtZW50IHRpZSgpLgotCi1pbmxpbmUgdHVwbGU8PiBtYWtlX3R1cGxlKCkgeyByZXR1cm4gdHVwbGU8PigpOyB9Ci0KLSRmb3IgayBbWwotJHJhbmdlIG0gMC4uay0xCi0KLXRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfJChrKV9UVVBMRV8oVCkgbWFrZV90dXBsZSgkZm9yIG0sIFtbY29uc3QgVCRtJiBmJG1dXSkgewotICByZXR1cm4gR1RFU1RfJChrKV9UVVBMRV8oVCkoJGZvciBtLCBbW2YkbV1dKTsKLX0KLQotXV0KLQotLy8gNi4xLjMuMyBUdXBsZSBoZWxwZXIgY2xhc3Nlcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgdHVwbGVfc2l6ZTsKLQotCi0kZm9yIGogW1sKLXRlbXBsYXRlIDxHVEVTVF8kKGopX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8kKGopX1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9ICRqOwotfTsKLQotCi1dXQotdGVtcGxhdGUgPGludCBrLCBjbGFzcyBUdXBsZT4KLXN0cnVjdCB0dXBsZV9lbGVtZW50IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBndGVzdF9pbnRlcm5hbDo6VHVwbGVFbGVtZW50PAotICAgICAgayA8ICh0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLCBrLCBUdXBsZT46OnR5cGUgdHlwZTsKLX07Ci0KLSNkZWZpbmUgR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgVHVwbGUpIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aywgVHVwbGUgPjo6dHlwZQotCi0vLyA2LjEuMy40IEVsZW1lbnQgYWNjZXNzLgotCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0KLSRmb3IgaSBbWwotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwkaT4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oJGksIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZiQoaSlfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKCRpLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZiQoaSlfOyB9Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+Ci1HVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBHVEVTVF8kKG4pX1RVUExFXyhUKSkpCi1nZXQoR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOwotfQotCi10ZW1wbGF0ZSA8aW50IGssIEdURVNUXyQobilfVFlQRU5BTUVTXyhUKT4KLUdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgIEdURVNUXyQobilfVFVQTEVfKFQpKSkKLWdldChjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCkgewotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKLX0KLQotLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycwotCi0vLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCi0KLW5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7Ci0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKLS8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCi0vLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKLS8vIGsxICE9IGsyLgotdGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4gewotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+Ci0gIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGludCBrPgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7Ci0gICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKLSAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhVKSYgdSkgewotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OlNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPAotICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8kKG4pX1RVUExFXyhUKSA+Ojp2YWx1ZSwKLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfJChuKV9UVVBMRV8oVSkgPjo6dmFsdWU+OjpFcSh0LCB1KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhUKSwgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFUpPgotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVSkmIHUpIHsgcmV0dXJuICEodCA9PSB1KTsgfQotCi0vLyA2LjEuNCBQYWlycy4KLS8vIFVuaW1wbGVtZW50ZWQuCi0KLX0gIC8vIG5hbWVzcGFjZSB0cjEKLX0gIC8vIG5hbWVzcGFjZSBzdGQKLQotCi0kZm9yIGogW1sKLSN1bmRlZiBHVEVTVF8kKGopX1RVUExFXwotCi1dXQotCi0KLSRmb3IgaiBbWwotI3VuZGVmIEdURVNUXyQoailfVFlQRU5BTUVTXwotCi1dXQotCi0jdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0jdW5kZWYgR1RFU1RfQllfUkVGXwotI3VuZGVmIEdURVNUX0FERF9SRUZfCi0jdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmggYi90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NmY3Y2YuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMzMSArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHlwZS11dGlsLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFR5cGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHR5cGVkIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQKLS8vIHRlc3RzLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0vLwotLy8gQ3VycmVudGx5IHdlIHN1cHBvcnQgYXQgbW9zdCA1MCB0eXBlcyBpbiBhIGxpc3QsIGFuZCBhdCBtb3N0IDUwCi0vLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gb25lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCi0vLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKLS8vIG1vcmUuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKLS8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCi0jIGlmIEdURVNUX0hBU19DWFhBQklfSF8KLSMgIGluY2x1ZGUgPGN4eGFiaS5oPgotIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCi0jICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+Ci0jIGVuZGlmICAvLyBHVEVTVF9IQVNIX0NYWEFCSV9IXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KLS8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKLS8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSB7Ci0jIGlmIEdURVNUX0hBU19SVFRJCi0KLSAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7Ci0jICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpCi0gIGludCBzdGF0dXMgPSAwOwotICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKLSAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KLSMgICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0gIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7Ci0jICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8KLSAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOwotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lX3N0cihzdGF0dXMgPT0gMCA/IHJlYWRhYmxlX25hbWUgOiBuYW1lKTsKLSAgZnJlZShyZWFkYWJsZV9uYW1lKTsKLSAgcmV0dXJuIG5hbWVfc3RyOwotIyAgZWxzZQotICByZXR1cm4gbmFtZTsKLSMgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IF9fSFBfYUNDCi0KLSMgZWxzZQotCi0gIHJldHVybiAiPHR5cGU+IjsKLQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLX0KLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKLS8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAotLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXN0cnVjdCBBc3NlcnRUeXBlRXE7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7Ci0gIHR5cGVkZWYgYm9vbCB0eXBlOwotfTsKLQotLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCi0vLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcwotLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAotLy8gc3VwcG9ydCBkaXJlY3RseS4KLXN0cnVjdCBOb25lIHt9OwotCi0vLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KLS8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KLS8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KLS8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKLS8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCi0vLyBsaXN0LgotCi0vLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgotc3RydWN0IFR5cGVzMCB7fTsKLQotLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1zdHJ1Y3QgVHlwZXMxIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMCBUYWlsOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgVHlwZXMyIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTxUMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotc3RydWN0IFR5cGVzMyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI8VDIsIFQzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgotc3RydWN0IFR5cGVzNCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczM8VDIsIFQzLCBUND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1zdHJ1Y3QgVHlwZXM1IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1zdHJ1Y3QgVHlwZXM2IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLXN0cnVjdCBUeXBlczcgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1zdHJ1Y3QgVHlwZXM4IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1zdHJ1Y3QgVHlwZXM5IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1zdHJ1Y3QgVHlwZXMxMCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExPgotc3RydWN0IFR5cGVzMTEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgotc3RydWN0IFR5cGVzMTIgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KLXN0cnVjdCBUeXBlczEzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgotc3RydWN0IFR5cGVzMTQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgotc3RydWN0IFR5cGVzMTUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNj4KLXN0cnVjdCBUeXBlczE2IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgotc3RydWN0IFR5cGVzMTcgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgotc3RydWN0IFR5cGVzMTggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KLXN0cnVjdCBUeXBlczE5IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgotc3RydWN0IFR5cGVzMjAgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjE+Ci1zdHJ1Y3QgVHlwZXMyMSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+Ci1zdHJ1Y3QgVHlwZXMyMiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgotc3RydWN0IFR5cGVzMjMgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+Ci1zdHJ1Y3QgVHlwZXMyNCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+Ci1zdHJ1Y3QgVHlwZXMyNSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjY+Ci1zdHJ1Y3QgVHlwZXMyNiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgotc3RydWN0IFR5cGVzMjcgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1zdHJ1Y3QgVHlwZXMyOCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+Ci1zdHJ1Y3QgVHlwZXMyOSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KLXN0cnVjdCBUeXBlczMwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxPgotc3RydWN0IFR5cGVzMzEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgotc3RydWN0IFR5cGVzMzIgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KLXN0cnVjdCBUeXBlczMzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgotc3RydWN0IFR5cGVzMzQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgotc3RydWN0IFR5cGVzMzUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2Pgotc3RydWN0IFR5cGVzMzYgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KLXN0cnVjdCBUeXBlczM3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgotc3RydWN0IFR5cGVzMzggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgotc3RydWN0IFR5cGVzMzkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KLXN0cnVjdCBUeXBlczQwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDE+Ci1zdHJ1Y3QgVHlwZXM0MSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KLXN0cnVjdCBUeXBlczQyIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLXN0cnVjdCBUeXBlczQzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgotc3RydWN0IFR5cGVzNDQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgotc3RydWN0IFR5cGVzNDUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2Pgotc3RydWN0IFR5cGVzNDYgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KLXN0cnVjdCBUeXBlczQ3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgotc3RydWN0IFR5cGVzNDggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgotc3RydWN0IFR5cGVzNDkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLXN0cnVjdCBUeXBlczUwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKLX07Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCi0vLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCi0vLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKLS8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+Ci0vLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCi0vLyBlcnJvcnMpLgotLy8KLS8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCi0vLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCi0vLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCi0vLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQotLy8gVHlwZXMgdGVtcGxhdGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ2ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTAgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMTEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEyID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQxNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTYgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMTcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE4ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQyMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjIgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMjMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI0ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQyNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjggPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMjkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMwID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQzMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzQgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMzUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM2ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQzOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDAgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUNDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQyID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ0NSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDYgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUNDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ4ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPgotc3RydWN0IFR5cGVzIHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLXN0cnVjdCBUeXBlczxUMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxPFQxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTY+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzE+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzY+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0Mj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgVDQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCi0gICAgVDQ2LCBUNDcsIFQ0OCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Ci19OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCi0KLS8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCi0vLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKLS8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAotLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQotLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KLS8vCi0vLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCi0vLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgotc3RydWN0IFRlbXBsYXRlU2VsIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0cnVjdCBCaW5kIHsKLSAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKLSAgfTsKLX07Ci0KLSMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKLSAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQotCi0vLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0vLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKLS8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKLS8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgTm9uZVQge307Ci0KLS8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bwotLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKLS8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKLS8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKLS8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCi0vLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCi0KLS8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgotc3RydWN0IFRlbXBsYXRlczAge307Ci0KLS8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCi0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+Ci1zdHJ1Y3QgVGVtcGxhdGVzMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KLXN0cnVjdCBUZW1wbGF0ZXMyIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzNCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+Ci1zdHJ1Y3QgVGVtcGxhdGVzNSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+Ci1zdHJ1Y3QgVGVtcGxhdGVzNiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KLXN0cnVjdCBUZW1wbGF0ZXM3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgotc3RydWN0IFRlbXBsYXRlczggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzOSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KLXN0cnVjdCBUZW1wbGF0ZXMxMCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgotc3RydWN0IFRlbXBsYXRlczExIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KLXN0cnVjdCBUZW1wbGF0ZXMxNCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgotc3RydWN0IFRlbXBsYXRlczE1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgotc3RydWN0IFRlbXBsYXRlczE2IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTcgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgotc3RydWN0IFRlbXBsYXRlczE4IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgotc3RydWN0IFRlbXBsYXRlczIwIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgotc3RydWN0IFRlbXBsYXRlczIxIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KLXN0cnVjdCBUZW1wbGF0ZXMyMiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KLXN0cnVjdCBUZW1wbGF0ZXMyMyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgotc3RydWN0IFRlbXBsYXRlczI0IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgotc3RydWN0IFRlbXBsYXRlczI1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjYgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgotc3RydWN0IFRlbXBsYXRlczI3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KLXN0cnVjdCBUZW1wbGF0ZXMyOSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzAgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KLXN0cnVjdCBUZW1wbGF0ZXMzMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgotc3RydWN0IFRlbXBsYXRlczM0IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgotc3RydWN0IFRlbXBsYXRlczM1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzYgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzcgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KLXN0cnVjdCBUZW1wbGF0ZXMzOCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KLXN0cnVjdCBUZW1wbGF0ZXM0MCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDEgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0Mj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KLXN0cnVjdCBUZW1wbGF0ZXM0MyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDQgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDUgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgotc3RydWN0IFRlbXBsYXRlczQ2IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgotc3RydWN0IFRlbXBsYXRlczQ3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KLXN0cnVjdCBUZW1wbGF0ZXM1MCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKLX07Ci0KLQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAotLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQotLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCi0vLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+Ci0vLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKLS8vIGVycm9ycykuCi0vLwotLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKLS8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCi0vLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcwotLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKLS8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAotICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KLXN0cnVjdCBUZW1wbGF0ZXMgewotICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgotc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDc+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0Mz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKLSAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Ci19OwotCi0vLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCi0vLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKLS8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFR5cGVMaXN0IHsKLSAgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLXN0cnVjdCBUeXBlTGlzdDxUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+Ojp0eXBlIHR5cGU7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBiL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFmZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIHR5cGUgbGlzdHMgd2Ugd2FudCB0byBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCi0vLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgJG4gdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCAkbgotLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCi0vLyBtb3JlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLS8vICNpZmRlZiBfX0dOVUNfXyBpcyB0b28gZ2VuZXJhbCBoZXJlLiAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGdjYyB3aXRob3V0IHVzaW5nCi0vLyBsaWJzdGRjKysgKHdoaWNoIGlzIHdoZXJlIGN4eGFiaS5oIGNvbWVzIGZyb20pLgotIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0jICBpbmNsdWRlIDxjeHhhYmkuaD4KLSMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQotIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPgotIyBlbmRpZiAgLy8gR1RFU1RfSEFTSF9DWFhBQklfSF8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuCi0vLyBOQjogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW4gR29vZ2xlIE1vY2ssIHNvIGRvbid0IG1vdmUgaXQgaW5zaWRlIG9mCi0vLyB0aGUgdHlwZWQtdGVzdC1vbmx5IHNlY3Rpb24gYmVsb3cuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgewotIyBpZiBHVEVTVF9IQVNfUlRUSQotCi0gIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOwotIyAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBkZWZpbmVkKF9fSFBfYUNDKQotICBpbnQgc3RhdHVzID0gMDsKLSAgLy8gZ2NjJ3MgaW1wbGVtZW50YXRpb24gb2YgdHlwZWlkKFQpLm5hbWUoKSBtYW5nbGVzIHRoZSB0eXBlIG5hbWUsCi0gIC8vIHNvIHdlIGhhdmUgdG8gZGVtYW5nbGUgaXQuCi0jICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXwotICB1c2luZyBhYmk6Ol9fY3hhX2RlbWFuZ2xlOwotIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0gIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7Ci0gIGZyZWUocmVhZGFibGVfbmFtZSk7Ci0gIHJldHVybiBuYW1lX3N0cjsKLSMgIGVsc2UKLSAgcmV0dXJuIG5hbWU7Ci0jICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQwotCi0jIGVsc2UKLQotICByZXR1cm4gIjx0eXBlPiI7Ci0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCi19Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLS8vIEFzc2VydHlUeXBlRXE8VDEsIFQyPjo6dHlwZSBpcyBkZWZpbmVkIGlmZiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lCi0vLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQKLS8vIHR3byB0eXBlcyBhcmUgZXF1YWwuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgQXNzZXJ0VHlwZUVxOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBc3NlcnRUeXBlRXE8VCwgVD4gewotICB0eXBlZGVmIGJvb2wgdHlwZTsKLX07Ci0KLS8vIEEgdW5pcXVlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50cyBvZiBjbGFzcwotLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMKLS8vIChlLmcuIFR5cGVzPGludD4sIFR5cGU8aW50LCBkb3VibGU+LCBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3QKLS8vIHN1cHBvcnQgZGlyZWN0bHkuCi1zdHJ1Y3QgTm9uZSB7fTsKLQotLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCi0vLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+Ci0vLyByZXByZXNlbnRzIGEgdHlwZSBsaXN0IHdpdGggTiB0eXBlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikgaW4gaXQuCi0vLyBFeGNlcHQgZm9yIFR5cGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6Ci0vLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQotLy8gbGlzdC4KLQotLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4KLXN0cnVjdCBUeXBlczAge307Ci0KLS8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotc3RydWN0IFR5cGVzMSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczAgVGFpbDsKLX07Ci0KLSRyYW5nZSBpIDIuLm4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kcmFuZ2UgayAyLi5pCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotc3RydWN0IFR5cGVzJGkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMkKGktMSk8JGZvciBrLCBbW1Qka11dPiBUYWlsOwotfTsKLQotCi1dXQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwKLS8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUeXBlczwuLi4+IGlzIG11Y2gKLS8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFR5cGVzPGludD4KLS8vIHdpbGwgYXBwZWFyIGFzIFR5cGVzPGludCwgTm9uZSwgTm9uZSwgLi4uLCBOb25lPiBpbiB0aGUgY29tcGlsZXIKLS8vIGVycm9ycykuCi0vLwotLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKLS8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKLS8vIHRoYXQgdG8gVHlwZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKLS8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCi0vLyBUeXBlcyB0ZW1wbGF0ZS4KLQotJHJhbmdlIGkgMS4ubgotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGkgPSBpbnRlcm5hbDo6Tm9uZV1dPgotc3RydWN0IFR5cGVzIHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMkbjwkZm9yIGksIFtbVCRpXV0+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFR5cGVzPCRmb3IgaSwgW1tpbnRlcm5hbDo6Tm9uZV1dPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOwotfTsKLQotJHJhbmdlIGkgMS4ubi0xCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSRyYW5nZSBrIGkrMS4ubgotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLXN0cnVjdCBUeXBlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgaW50ZXJuYWw6Ok5vbmVdXT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsKLX07Ci0KLV1dCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSMgZGVmaW5lIEdURVNUX1RFTVBMQVRFXyB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MKLQotLy8gVGhlIHRlbXBsYXRlICJzZWxlY3RvciIgc3RydWN0IFRlbXBsYXRlU2VsPFRtcGw+IGlzIHVzZWQgdG8KLS8vIHJlcHJlc2VudCBUbXBsLCB3aGljaCBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUgd2l0aCBvbmUgdHlwZQotLy8gcGFyYW1ldGVyLCBhcyBhIHR5cGUuICBUZW1wbGF0ZVNlbDxUbXBsPjo6QmluZDxUPjo6dHlwZSBpcyBkZWZpbmVkCi0vLyBhcyB0aGUgdHlwZSBUbXBsPFQ+LiAgVGhpcyBhbGxvd3MgdXMgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgdGhlCi0vLyB0ZW1wbGF0ZSAic2VsZWN0ZWQiIGJ5IFRlbXBsYXRlU2VsPFRtcGw+LgotLy8KLS8vIFRoaXMgdHJpY2sgaXMgbmVjZXNzYXJ5IGZvciBzaW11bGF0aW5nIHR5cGVkZWYgZm9yIGNsYXNzIHRlbXBsYXRlcywKLS8vIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFRtcGw+Ci1zdHJ1Y3QgVGVtcGxhdGVTZWwgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RydWN0IEJpbmQgewotICAgIHR5cGVkZWYgVG1wbDxUPiB0eXBlOwotICB9OwotfTsKLQotIyBkZWZpbmUgR1RFU1RfQklORF8oVG1wbFNlbCwgVCkgXAotICBUbXBsU2VsOjp0ZW1wbGF0ZSBCaW5kPFQ+Ojp0eXBlCi0KLS8vIEEgdW5pcXVlIHN0cnVjdCB0ZW1wbGF0ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKLS8vIGFyZ3VtZW50cyBvZiBjbGFzcyB0ZW1wbGF0ZSBUZW1wbGF0ZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZQotLy8gdmFyaWFkaWMgdGVtcGxhdGVzIChlLmcuIFRlbXBsYXRlczxpbnQ+LCBUZW1wbGF0ZXM8aW50LCBkb3VibGU+LAotLy8gYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBOb25lVCB7fTsKLQotLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCi0vLyByZXByZXNlbnQgdGVtcGxhdGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUZW1wbGF0ZXNOPFQxLCBUMiwgLi4uLAotLy8gVE4+IHJlcHJlc2VudHMgYSBsaXN0IG9mIE4gdGVtcGxhdGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKS4gIEV4Y2VwdAotLy8gZm9yIFRlbXBsYXRlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgotLy8gSGVhZCBmb3IgdGhlIHNlbGVjdG9yIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwKLS8vIGZvciB0aGUgcmVzdCBvZiB0aGUgbGlzdC4KLQotLy8gVGhlIGVtcHR5IHRlbXBsYXRlIGxpc3QuCi1zdHJ1Y3QgVGVtcGxhdGVzMCB7fTsKLQotLy8gVGVtcGxhdGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4KLXN0cnVjdCBUZW1wbGF0ZXMxIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMwIFRhaWw7Ci19OwotCi0kcmFuZ2UgaSAyLi5uCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHJhbmdlIGsgMi4uaQotdGVtcGxhdGUgPCRmb3IgaiwgW1tHVEVTVF9URU1QTEFURV8gVCRqXV0+Ci1zdHJ1Y3QgVGVtcGxhdGVzJGkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlcyQoaS0xKTwkZm9yIGssIFtbVCRrXV0+IFRhaWw7Ci19OwotCi0KLV1dCi0KLS8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVGVtcGxhdGVzTjwuLi4+IGRpcmVjdGx5LAotLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gKLS8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0PgotLy8gd2lsbCBhcHBlYXIgYXMgVGVtcGxhdGVzPGxpc3QsIE5vbmVULCBOb25lVCwgLi4uLCBOb25lVD4gaW4gdGhlIGNvbXBpbGVyCi0vLyBlcnJvcnMpLgotLy8KLS8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCi0vLyB1c2VyIHdvdWxkIHdyaXRlIFRlbXBsYXRlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQotLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKLS8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCi0vLyBUZW1wbGF0ZXMgdGVtcGxhdGUuCi0KLSRyYW5nZSBpIDEuLm4KLXRlbXBsYXRlIDwkZm9yIGksIFtbR1RFU1RfVEVNUExBVEVfIFQkaSA9IE5vbmVUXV0+Ci1zdHJ1Y3QgVGVtcGxhdGVzIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMkbjwkZm9yIGksIFtbVCRpXV0+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFRlbXBsYXRlczwkZm9yIGksIFtbTm9uZVRdXT4gewotICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKLX07Ci0KLSRyYW5nZSBpIDEuLm4tMQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kcmFuZ2UgayBpKzEuLm4KLXRlbXBsYXRlIDwkZm9yIGosIFtbR1RFU1RfVEVNUExBVEVfIFQkal1dPgotc3RydWN0IFRlbXBsYXRlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgTm9uZVRdXT4gewotICB0eXBlZGVmIFRlbXBsYXRlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsKLX07Ci0KLV1dCi0KLS8vIFRoZSBUeXBlTGlzdCB0ZW1wbGF0ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIGEgc2luZ2xlIHR5cGUKLS8vIG9yIGEgVHlwZXM8Li4uPiBsaXN0IGluIFRZUEVEX1RFU1RfQ0FTRSgpIGFuZAotLy8gSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKS4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgVHlwZUxpc3QgewotICB0eXBlZGVmIFR5cGVzMTxUPiB0eXBlOwotfTsKLQotCi0kcmFuZ2UgaSAxLi5uCi10ZW1wbGF0ZSA8JGZvciBpLCBbW3R5cGVuYW1lIFQkaV1dPgotc3RydWN0IFR5cGVMaXN0PFR5cGVzPCRmb3IgaSwgW1tUJGldXT4gPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8JGZvciBpLCBbW1QkaV1dPjo6dHlwZSB0eXBlOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9tNC9hY3hfcHRocmVhZC5tNCBiL3Rlc3RpbmcvZ3Rlc3QvbTQvYWN4X3B0aHJlYWQubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjIwZGUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9tNC9hY3hfcHRocmVhZC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0jIFRoaXMgd2FzIHJldHJpZXZlZCBmcm9tCi0jICAgIGh0dHA6Ly9zdm4uMHBvaW50ZXIuZGUvdmlld3ZjL3RydW5rL2NvbW1vbi9hY3hfcHRocmVhZC5tND9yZXZpc2lvbj0xMjc3JnJvb3Q9YXZhaGkKLSMgU2VlIGFsc28gKHBlcmhhcHMgZm9yIG5ldyB2ZXJzaW9ucz8pCi0jICAgIGh0dHA6Ly9zdm4uMHBvaW50ZXIuZGUvdmlld3ZjL3RydW5rL2NvbW1vbi9hY3hfcHRocmVhZC5tND9yb290PWF2YWhpCi0jCi0jIFdlJ3ZlIHJld3JpdHRlbiB0aGUgaW5jb25zaXN0ZW5jeSBjaGVjayBjb2RlIChmcm9tIGF2YWhpKSwgdG8gd29yawotIyBtb3JlIGJyb2FkbHkuICBJbiBwYXJ0aWN1bGFyLCBpdCBubyBsb25nZXIgYXNzdW1lcyBsZCBhY2NlcHRzIC16ZGVmcy4KLSMgVGhpcyBjYXVzZWQgYSByZXN0cnVjdGluZyBvZiB0aGUgY29kZSwgYnV0IHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBvbmx5Ci0jIGNoYW5nZWQgYSBsaXR0bGUuCi0KLWRubCBAc3lub3BzaXMgQUNYX1BUSFJFQUQoW0FDVElPTi1JRi1GT1VORFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXSkKLWRubAotZG5sIEBzdW1tYXJ5IGZpZ3VyZSBvdXQgaG93IHRvIGJ1aWxkIEMgcHJvZ3JhbXMgdXNpbmcgUE9TSVggdGhyZWFkcwotZG5sCi1kbmwgVGhpcyBtYWNybyBmaWd1cmVzIG91dCBob3cgdG8gYnVpbGQgQyBwcm9ncmFtcyB1c2luZyBQT1NJWCB0aHJlYWRzLgotZG5sIEl0IHNldHMgdGhlIFBUSFJFQURfTElCUyBvdXRwdXQgdmFyaWFibGUgdG8gdGhlIHRocmVhZHMgbGlicmFyeSBhbmQKLWRubCBsaW5rZXIgZmxhZ3MsIGFuZCB0aGUgUFRIUkVBRF9DRkxBR1Mgb3V0cHV0IHZhcmlhYmxlIHRvIGFueSBzcGVjaWFsCi1kbmwgQyBjb21waWxlciBmbGFncyB0aGF0IGFyZSBuZWVkZWQuIChUaGUgdXNlciBjYW4gYWxzbyBmb3JjZSBjZXJ0YWluCi1kbmwgY29tcGlsZXIgZmxhZ3MvbGlicyB0byBiZSB0ZXN0ZWQgYnkgc2V0dGluZyB0aGVzZSBlbnZpcm9ubWVudAotZG5sIHZhcmlhYmxlcy4pCi1kbmwKLWRubCBBbHNvIHNldHMgUFRIUkVBRF9DQyB0byBhbnkgc3BlY2lhbCBDIGNvbXBpbGVyIHRoYXQgaXMgbmVlZGVkIGZvcgotZG5sIG11bHRpLXRocmVhZGVkIHByb2dyYW1zIChkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgQ0Mgb3RoZXJ3aXNlKS4KLWRubCAoVGhpcyBpcyBuZWNlc3Nhcnkgb24gQUlYIHRvIHVzZSB0aGUgc3BlY2lhbCBjY19yIGNvbXBpbGVyIGFsaWFzLikKLWRubAotZG5sIE5PVEU6IFlvdSBhcmUgYXNzdW1lZCB0byBub3Qgb25seSBjb21waWxlIHlvdXIgcHJvZ3JhbSB3aXRoIHRoZXNlCi1kbmwgZmxhZ3MsIGJ1dCBhbHNvIGxpbmsgaXQgd2l0aCB0aGVtIGFzIHdlbGwuIGUuZy4geW91IHNob3VsZCBsaW5rCi1kbmwgd2l0aCAkUFRIUkVBRF9DQyAkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyAkTERGTEFHUyAuLi4gJFBUSFJFQURfTElCUwotZG5sICRMSUJTCi1kbmwKLWRubCBJZiB5b3UgYXJlIG9ubHkgYnVpbGRpbmcgdGhyZWFkcyBwcm9ncmFtcywgeW91IG1heSB3aXNoIHRvIHVzZQotZG5sIHRoZXNlIHZhcmlhYmxlcyBpbiB5b3VyIGRlZmF1bHQgTElCUywgQ0ZMQUdTLCBhbmQgQ0M6Ci1kbmwKLWRubCAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKLWRubCAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKLWRubCAgICAgICAgQ0M9IiRQVEhSRUFEX0NDIgotZG5sCi1kbmwgSW4gYWRkaXRpb24sIGlmIHRoZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0aHJlYWQtYXR0cmlidXRlCi1kbmwgY29uc3RhbnQgaGFzIGEgbm9uc3RhbmRhcmQgbmFtZSwgZGVmaW5lcyBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0bwotZG5sIHRoYXQgbmFtZSAoZS5nLiBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEIG9uIEFJWCkuCi1kbmwKLWRubCBBQ1RJT04tSUYtRk9VTkQgaXMgYSBsaXN0IG9mIHNoZWxsIGNvbW1hbmRzIHRvIHJ1biBpZiBhIHRocmVhZHMKLWRubCBsaWJyYXJ5IGlzIGZvdW5kLCBhbmQgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBhIGxpc3Qgb2YgY29tbWFuZHMgdG8KLWRubCBydW4gaXQgaWYgaXQgaXMgbm90IGZvdW5kLiBJZiBBQ1RJT04tSUYtRk9VTkQgaXMgbm90IHNwZWNpZmllZCwgdGhlCi1kbmwgZGVmYXVsdCBhY3Rpb24gd2lsbCBkZWZpbmUgSEFWRV9QVEhSRUFELgotZG5sCi1kbmwgUGxlYXNlIGxldCB0aGUgYXV0aG9ycyBrbm93IGlmIHRoaXMgbWFjcm8gZmFpbHMgb24gYW55IHBsYXRmb3JtLCBvcgotZG5sIGlmIHlvdSBoYXZlIGFueSBvdGhlciBzdWdnZXN0aW9ucyBvciBjb21tZW50cy4gVGhpcyBtYWNybyB3YXMgYmFzZWQKLWRubCBvbiB3b3JrIGJ5IFNHSiBvbiBhdXRvY29uZiBzY3JpcHRzIGZvciBGRlRXICh3d3cuZmZ0dy5vcmcpICh3aXRoCi1kbmwgaGVscCBmcm9tIE0uIEZyaWdvKSwgYXMgd2VsbCBhcyBhY19wdGhyZWFkIGFuZCBoYl9wdGhyZWFkIG1hY3JvcwotZG5sIHBvc3RlZCBieSBBbGVqYW5kcm8gRm9yZXJvIEN1ZXJ2byB0byB0aGUgYXV0b2NvbmYgbWFjcm8gcmVwb3NpdG9yeS4KLWRubCBXZSBhcmUgYWxzbyBncmF0ZWZ1bCBmb3IgdGhlIGhlbHBmdWwgZmVlZGJhY2sgb2YgbnVtZXJvdXMgdXNlcnMuCi1kbmwKLWRubCBAY2F0ZWdvcnkgSW5zdGFsbGVkUGFja2FnZXMKLWRubCBAYXV0aG9yIFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KLWRubCBAdmVyc2lvbiAyMDA2LTA1LTI5Ci1kbmwgQGxpY2Vuc2UgR1BMV2l0aEFDRXhjZXB0aW9uCi1kbmwgCi1kbmwgQ2hlY2tzIGZvciBHQ0Mgc2hhcmVkL3B0aHJlYWQgaW5jb25zaXN0ZW5jeSBiYXNlZCBvbiB3b3JrIGJ5Ci1kbmwgTWFyY2luIE93c2lhbnkgPG1hcmNpbkBvd3NpYW55LnBsPgotCi0KLUFDX0RFRlVOKFtBQ1hfUFRIUkVBRF0sIFsKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKLUFDX0xBTkdfU0FWRQotQUNfTEFOR19DCi1hY3hfcHRocmVhZF9vaz1ubwotCi0jIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCi0jIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgotIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgotCi0jIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKLSMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCi0jIHRoZW06Ci1pZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgotICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKLSAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKLSAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKLSAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1NdKQotICAgICAgICBBQ19UUllfTElOS19GVU5DKHB0aHJlYWRfam9pbiwgYWN4X3B0aHJlYWRfb2s9eWVzKQotICAgICAgICBBQ19NU0dfUkVTVUxUKCRhY3hfcHRocmVhZF9vaykKLSAgICAgICAgaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KLSAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKLSAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgotICAgICAgICBmaQotICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgotICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLWZpCi0KLSMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKLSMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcwotIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKLSMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KLQotIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQotIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCi0jIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCi0jIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgotCi1hY3hfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKLQotIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQotIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKLQotIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKLSMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAotIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncwotIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCi0jIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCi0jIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQotIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCi0jIC1wdGhyZWFkczogU29sYXJpcy9nY2MKLSMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKLSMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAotIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKLSMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQotIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCi0jIHB0aHJlYWQ6IExpbnV4LCBldGNldGVyYQotIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCi0jIHB0aHJlYWQtY29uZmlnOiB1c2UgcHRocmVhZC1jb25maWcgcHJvZ3JhbSAoZm9yIEdOVSBQdGggbGlicmFyeSkKLQotY2FzZSAiJHtob3N0X2NwdX0tJHtob3N0X29zfSIgaW4KLSAgICAgICAgKnNvbGFyaXMqKQotCi0gICAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCi0gICAgICAgICMgKG5vbi1mdW5jdGlvbmFsKSB2ZXJzaW9ucyBvZiB0aGUgcHRocmVhZHMgcm91dGluZXMsIHNvIGxpbmstYmFzZWQKLSAgICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KLSAgICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCi0gICAgICAgICMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhpcyBtYWNybywgc28gd2UgY291bGQgY2hlY2sgZm9yIHRoYXQsIGJ1dAotICAgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAotICAgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6Ci0KLSAgICAgICAgYWN4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkcyBwdGhyZWFkIC1tdCAtcHRocmVhZCAkYWN4X3B0aHJlYWRfZmxhZ3MiCi0gICAgICAgIDs7Ci1lc2FjCi0KLWlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCi1mb3IgZmxhZyBpbiAkYWN4X3B0aHJlYWRfZmxhZ3M7IGRvCi0KLSAgICAgICAgY2FzZSAkZmxhZyBpbgotICAgICAgICAgICAgICAgIG5vbmUpCi0gICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3NdKQotICAgICAgICAgICAgICAgIDs7Ci0KLSAgICAgICAgICAgICAgICAtKikKLSAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnXSkKLSAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWciCi0gICAgICAgICAgICAgICAgOzsKLQotCQlwdGhyZWFkLWNvbmZpZykKLQkJQUNfQ0hFQ0tfUFJPRyhhY3hfcHRocmVhZF9jb25maWcsIHB0aHJlYWQtY29uZmlnLCB5ZXMsIG5vKQotCQlpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX2NvbmZpZyIgPSB4bm87IHRoZW4gY29udGludWU7IGZpCi0JCVBUSFJFQURfQ0ZMQUdTPSJgcHRocmVhZC1jb25maWcgLS1jZmxhZ3NgIgotCQlQVEhSRUFEX0xJQlM9ImBwdGhyZWFkLWNvbmZpZyAtLWxkZmxhZ3NgIGBwdGhyZWFkLWNvbmZpZyAtLWxpYnNgIgotCQk7OwotCi0gICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnXSkKLSAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9Ii1sJGZsYWciCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIHNhdmVfTElCUz0iJExJQlMiCi0gICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgotCi0gICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgZnVuY3Rpb25zLiAgV2UgbXVzdCBpbmNsdWRlIHB0aHJlYWQuaCwKLSAgICAgICAgIyBzaW5jZSBzb21lIGZ1bmN0aW9ucyBtYXkgYmUgbWFjcm9zLiAgKE9uIHRoZSBTZXF1ZW50LCB3ZQotICAgICAgICAjIG5lZWQgYSBzcGVjaWFsIGZsYWcgLUt0aHJlYWQgdG8gbWFrZSB0aGlzIGhlYWRlciBjb21waWxlLikKLSAgICAgICAgIyBXZSBjaGVjayBmb3IgcHRocmVhZF9qb2luIGJlY2F1c2UgaXQgaXMgaW4gLWxwdGhyZWFkIG9uIElSSVgKLSAgICAgICAgIyB3aGlsZSBwdGhyZWFkX2NyZWF0ZSBpcyBpbiBsaWJjLiAgV2UgY2hlY2sgZm9yIHB0aHJlYWRfYXR0cl9pbml0Ci0gICAgICAgICMgZHVlIHRvIERFQyBjcmF6aW5lc3Mgd2l0aCAtbHB0aHJlYWRzLiAgV2UgY2hlY2sgZm9yCi0gICAgICAgICMgcHRocmVhZF9jbGVhbnVwX3B1c2ggYmVjYXVzZSBpdCBpcyBvbmUgb2YgdGhlIGZldyBwdGhyZWFkCi0gICAgICAgICMgZnVuY3Rpb25zIG9uIFNvbGFyaXMgdGhhdCBkb2Vzbid0IGhhdmUgYSBub24tZnVuY3Rpb25hbCBsaWJjIHN0dWIuCi0gICAgICAgICMgV2UgdHJ5IHB0aHJlYWRfY3JlYXRlIG9uIGdlbmVyYWwgcHJpbmNpcGxlcy4KLSAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKLSAgICAgICAgICAgICAgICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAotICAgICAgICAgICAgICAgICAgICBbYWN4X3B0aHJlYWRfb2s9eWVzXSkKLQotICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgotICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLQotICAgICAgICBBQ19NU0dfUkVTVUxUKCRhY3hfcHRocmVhZF9vaykKLSAgICAgICAgaWYgdGVzdCAieCRhY3hfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZpCi0KLSAgICAgICAgUFRIUkVBRF9MSUJTPSIiCi0gICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCi1kb25lCi1maQotCi0jIFZhcmlvdXMgb3RoZXIgY2hlY2tzOgotaWYgdGVzdCAieCRhY3hfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCi0gICAgICAgIHNhdmVfTElCUz0iJExJQlMiCi0gICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCi0gICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgotCi0gICAgICAgICMgRGV0ZWN0IEFJWCBsb3NzYWdlOiBKT0lOQUJMRSBhdHRyaWJ1dGUgaXMgY2FsbGVkIFVOREVUQUNIRUQuCi0JQUNfTVNHX0NIRUNLSU5HKFtmb3Igam9pbmFibGUgcHRocmVhZCBhdHRyaWJ1dGVdKQotCWF0dHJfbmFtZT11bmtub3duCi0JZm9yIGF0dHIgaW4gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDsgZG8KLQkgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwgW2ludCBhdHRyPSRhdHRyOyByZXR1cm4gYXR0cjtdLAotICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJfbmFtZT0kYXR0cjsgYnJlYWtdKQotCWRvbmUKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgkYXR0cl9uYW1lKQotICAgICAgICBpZiB0ZXN0ICIkYXR0cl9uYW1lIiAhPSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgotICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFLCAkYXR0cl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbiB5b3VyIHN5c3RlbS5dKQotICAgICAgICBmaQotCi0gICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHNdKQotICAgICAgICBmbGFnPW5vCi0gICAgICAgIGNhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCi0gICAgICAgICAgICAqLWFpeCogfCAqLWZyZWVic2QqIHwgKi1kYXJ3aW4qKSBmbGFnPSItRF9USFJFQURfU0FGRSI7OwotICAgICAgICAgICAgKnNvbGFyaXMqIHwgKi1vc2YqIHwgKi1ocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2ZsYWd9KQotICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgotICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnICRQVEhSRUFEX0NGTEFHUyIKLSAgICAgICAgZmkKLQotICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgotICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBtdXN0IGNvbXBpbGUgd2l0aCB4bGNfciBvciBjY19yCi0JaWYgdGVzdCB4IiRHQ0MiICE9IHh5ZXM7IHRoZW4KLSAgICAgICAgICBBQ19DSEVDS19QUk9HUyhQVEhSRUFEX0NDLCB4bGNfciBjY19yLCAke0NDfSkKLSAgICAgICAgZWxzZQotICAgICAgICAgIFBUSFJFQURfQ0M9JENDCi0JZmkKLQotCSMgVGhlIG5leHQgcGFydCB0cmllcyB0byBkZXRlY3QgR0NDIGluY29uc2lzdGVuY3kgd2l0aCAtc2hhcmVkIG9uIHNvbWUKLQkjIGFyY2hpdGVjdHVyZXMgYW5kIHN5c3RlbXMuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaW4gY2VydGFpbgotCSMgY29uZmlndXJhdGlvbnMsIHdoZW4gLXNoYXJlZCBpcyBzcGVjaWZpZWQsIEdDQyAiZm9yZ2V0cyIgdG8KLQkjIGludGVybmFsbHkgdXNlIHZhcmlvdXMgZmxhZ3Mgd2hpY2ggYXJlIHN0aWxsIG5lY2Vzc2FyeS4KLQkKLQkjCi0JIyBQcmVwYXJlIHRoZSBmbGFncwotCSMKLQlzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQlzYXZlX0xJQlM9IiRMSUJTIgotCXNhdmVfQ0M9IiRDQyIKLQkKLQkjIFRyeSB3aXRoIHRoZSBmbGFncyBkZXRlcm1pbmVkIGJ5IHRoZSBlYXJsaWVyIGNoZWNrcy4KLQkjCi0JIyAtV2wsLXosZGVmcyBmb3JjZXMgbGluay10aW1lIHN5bWJvbCByZXNvbHV0aW9uLCBzbyB0aGF0IHRoZQotCSMgbGlua2luZyBjaGVja3Mgd2l0aCAtc2hhcmVkIGFjdHVhbGx5IGhhdmUgYW55IHZhbHVlCi0JIwotCSMgRklYTUU6IC1mUElDIGlzIHJlcXVpcmVkIGZvciAtc2hhcmVkIG9uIG1hbnkgYXJjaGl0ZWN0dXJlcywKLQkjIHNvIHdlIHNwZWNpZnkgaXQgaGVyZSwgYnV0IHRoZSByaWdodCB3YXkgd291bGQgcHJvYmFibHkgYmUgdG8KLQkjIHByb3Blcmx5IGRldGVjdCB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IHJlcXVpcmVkLgotCUNGTEFHUz0iLXNoYXJlZCAtZlBJQyAtV2wsLXosZGVmcyAkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKLQlMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgotCUNDPSIkUFRIUkVBRF9DQyIKLQkKLQkjIEluIG9yZGVyIG5vdCB0byBjcmVhdGUgc2V2ZXJhbCBsZXZlbHMgb2YgaW5kZW50YXRpb24sIHdlIHRlc3QKLQkjIHRoZSB2YWx1ZSBvZiAiJGRvbmUiIHVudGlsIHdlIGZpbmQgdGhlIGN1cmUgb3IgcnVuIG91dCBvZiBpZGVhcy4KLQlkb25lPSJubyIKLQkKLQkjIEZpcnN0LCBtYWtlIHN1cmUgdGhlIENGTEFHUyB3ZSBhZGRlZCBhcmUgYWN0dWFsbHkgYWNjZXB0ZWQgYnkgb3VyCi0JIyBjb21waWxlci4gIElmIG5vdCAoYW5kIE9TIFgncyBsZCwgZm9yIGluc3RhbmNlLCBkb2VzIG5vdCBhY2NlcHQgLXopLAotCSMgdGhlbiB3ZSBjYW4ndCBkbyB0aGlzIHRlc3QuCi0JaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgotCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBjaGVjayBmb3IgR0NDIHB0aHJlYWQvc2hhcmVkIGluY29uc2lzdGVuY2llc10pCi0JICAgQUNfVFJZX0xJTksoLCwgLCBbZG9uZT15ZXNdKQotCQotCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzIDsgdGhlbgotCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKLQkgICBlbHNlCi0JICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkgICBmaQotCWZpCi0JCi0JaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgotCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtcHRocmVhZCBpcyBzdWZmaWNpZW50IHdpdGggLXNoYXJlZF0pCi0JICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKLQkgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOwotCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKLQkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKLQkgICAgICBbZG9uZT15ZXNdKQotCSAgIAotCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCi0JICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkgICBlbHNlCi0JICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotCSAgIGZpCi0JZmkKLQkKLQkjCi0JIyBMaW51eCBnY2Mgb24gc29tZSBhcmNoaXRlY3R1cmVzIHN1Y2ggYXMgbWlwcy9taXBzZWwgZm9yZ2V0cwotCSMgYWJvdXQgLWxwdGhyZWFkCi0JIwotCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KLQkgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxwdGhyZWFkIGZpeGVzIHRoYXRdKQotCSAgIExJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTICRzYXZlX0xJQlMiCi0JICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKLQkgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOwotCSAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKLQkgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKLQkgICAgICBbZG9uZT15ZXNdKQotCQotCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCi0JICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkgICAgICBQVEhSRUFEX0xJQlM9Ii1scHRocmVhZCAkUFRIUkVBRF9MSUJTIgotCSAgIGVsc2UKLQkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCi0JICAgZmkKLQlmaQotCSMKLQkjIEZyZWVCU0QgNC4xMCBnY2MgZm9yZ2V0cyB0byB1c2UgLWxjX3IgaW5zdGVhZCBvZiAtbGMKLQkjCi0JaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgotCSAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGNfciBmaXhlcyB0aGF0XSkKLQkgICBMSUJTPSItbGNfciAkUFRIUkVBRF9MSUJTICRzYXZlX0xJQlMiCi0JICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKLQkgICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKLQkgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKLQkgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyBdLAotCSAgICAgICBbZG9uZT15ZXNdKQotCQotCSAgIGlmIHRlc3QgIngkZG9uZSIgPSB4eWVzOyB0aGVuCi0JICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkgICAgICBQVEhSRUFEX0xJQlM9Ii1sY19yICRQVEhSRUFEX0xJQlMiCi0JICAgZWxzZQotCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKLQkgICBmaQotCWZpCi0JaWYgdGVzdCB4IiRkb25lIiA9IHhubzsgdGhlbgotCSAgICMgT0ssIHdlIGhhdmUgcnVuIG91dCBvZiBpZGVhcwotCSAgIEFDX01TR19XQVJOKFtJbXBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgdG8gdXNlIHB0aHJlYWRzIHdpdGggc2hhcmVkIGxpYnJhcmllc10pCi0JCi0JICAgIyBzbyBpdCdzIG5vdCBzYWZlIHRvIGFzc3VtZSB0aGF0IHdlIG1heSB1c2UgcHRocmVhZHMKLQkgICBhY3hfcHRocmVhZF9vaz1ubwotCWZpCi0JCi0JQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0JTElCUz0iJHNhdmVfTElCUyIKLQlDQz0iJHNhdmVfQ0MiCi1lbHNlCi0gICAgICAgIFBUSFJFQURfQ0M9IiRDQyIKLWZpCi0KLUFDX1NVQlNUKFBUSFJFQURfTElCUykKLUFDX1NVQlNUKFBUSFJFQURfQ0ZMQUdTKQotQUNfU1VCU1QoUFRIUkVBRF9DQykKLQotIyBGaW5hbGx5LCBleGVjdXRlIEFDVElPTi1JRi1GT1VORC9BQ1RJT04tSUYtTk9ULUZPVU5EOgotaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCi0gICAgICAgIGlmZWxzZShbJDFdLCxBQ19ERUZJTkUoSEFWRV9QVEhSRUFELDEsW0RlZmluZSBpZiB5b3UgaGF2ZSBQT1NJWCB0aHJlYWRzIGxpYnJhcmllcyBhbmQgaGVhZGVyIGZpbGVzLl0pLFskMV0pCi0gICAgICAgIDoKLWVsc2UKLSAgICAgICAgYWN4X3B0aHJlYWRfb2s9bm8KLSAgICAgICAgJDIKLWZpCi1BQ19MQU5HX1JFU1RPUkUKLV0pZG5sIEFDWF9QVEhSRUFECmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L200L2d0ZXN0Lm00IGIvdGVzdGluZy9ndGVzdC9tNC9ndGVzdC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5OGJhNy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L200L2d0ZXN0Lm00CisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotZG5sIEdURVNUX0xJQl9DSEVDSyhbbWluaW11bSB2ZXJzaW9uIFssCi1kbmwgICAgICAgICAgICAgICAgICBhY3Rpb24gaWYgZm91bmQgWyxhY3Rpb24gaWYgbm90IGZvdW5kXV1dKQotZG5sCi1kbmwgQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSwgb3B0aW9uYWxseSBhdCBhIG1pbmltdW0KLWRubCB2ZXJzaW9uLCBhbmQgaW5kaWNhdGUgYSB2aWFibGUgdmVyc2lvbiB3aXRoIHRoZSBIQVZFX0dURVNUIGZsYWcuIEl0IGRlZmluZXMKLWRubCBzdGFuZGFyZCB2YXJpYWJsZXMgZm9yIHN1YnN0aXR1dGlvbiBpbmNsdWRpbmcgR1RFU1RfQ1BQRkxBR1MsCi1kbmwgR1RFU1RfQ1hYRkxBR1MsIEdURVNUX0xERkxBR1MsIGFuZCBHVEVTVF9MSUJTLiBJdCBhbHNvIGRlZmluZXMKLWRubCBHVEVTVF9WRVJTSU9OIGFzIHRoZSB2ZXJzaW9uIG9mIEdvb2dsZSBUZXN0IGZvdW5kLiBGaW5hbGx5LCBpdCBwcm92aWRlcwotZG5sIG9wdGlvbmFsIGN1c3RvbSBhY3Rpb24gc2xvdHMgaW4gdGhlIGV2ZW50IEdURVNUIGlzIGZvdW5kIG9yIG5vdC4KLUFDX0RFRlVOKFtHVEVTVF9MSUJfQ0hFQ0tdLAotWwotZG5sIFByb3ZpZGUgYSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0IHVzYWdlLgotQUNfQVJHX0VOQUJMRShbZ3Rlc3RdLAotICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWd0ZXN0XSwKLSAgICAgICAgICAgICAgICAgIFtFbmFibGUgdGVzdHMgdXNpbmcgdGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsuCi0gICAgICAgICAgICAgICAgICAoRGVmYXVsdCBpcyBlbmFibGVkLildKV0sCi0gIFtdLAotICBbZW5hYmxlX2d0ZXN0PV0pCi1BQ19BUkdfVkFSKFtHVEVTVF9DT05GSUddLAotICAgICAgICAgICBbVGhlIGV4YWN0IHBhdGggb2YgR29vZ2xlIFRlc3QncyAnZ3Rlc3QtY29uZmlnJyBzY3JpcHQuXSkKLUFDX0FSR19WQVIoW0dURVNUX0NQUEZMQUdTXSwKLSAgICAgICAgICAgW0MtbGlrZSBwcmVwcm9jZXNzb3IgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCi1BQ19BUkdfVkFSKFtHVEVTVF9DWFhGTEFHU10sCi0gICAgICAgICAgIFtDKysgY29tcGlsZSBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKLUFDX0FSR19WQVIoW0dURVNUX0xERkxBR1NdLAotICAgICAgICAgICBbTGlua2VyIHBhdGggYW5kIG9wdGlvbiBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKLUFDX0FSR19WQVIoW0dURVNUX0xJQlNdLAotICAgICAgICAgICBbTGlicmFyeSBsaW5raW5nIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQotQUNfQVJHX1ZBUihbR1RFU1RfVkVSU0lPTl0sCi0gICAgICAgICAgIFtUaGUgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCBhdmFpbGFibGUuXSkKLUhBVkVfR1RFU1Q9Im5vIgotQVNfSUYoW3Rlc3QgIngke2VuYWJsZV9ndGVzdH0iICE9ICJ4bm8iXSwKLSAgW0FDX01TR19DSEVDS0lORyhbZm9yICdndGVzdC1jb25maWcnXSkKLSAgIEFTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiAhPSAieHllcyJdLAotICAgICBbQVNfSUYoW3Rlc3QgLXggIiR7ZW5hYmxlX2d0ZXN0fS9zY3JpcHRzL2d0ZXN0LWNvbmZpZyJdLAotICAgICAgICBbR1RFU1RfQ09ORklHPSIke2VuYWJsZV9ndGVzdH0vc2NyaXB0cy9ndGVzdC1jb25maWciXSwKLSAgICAgICAgW0dURVNUX0NPTkZJRz0iJHtlbmFibGVfZ3Rlc3R9L2Jpbi9ndGVzdC1jb25maWciXSkKLSAgICAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwgW10sCi0gICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgICBBQ19NU0dfRVJST1IoW2RubAotVW5hYmxlIHRvIGxvY2F0ZSBlaXRoZXIgYSBidWlsdCBvciBpbnN0YWxsZWQgR29vZ2xlIFRlc3QuCi1UaGUgc3BlY2lmaWMgbG9jYXRpb24gJyR7ZW5hYmxlX2d0ZXN0fScgd2FzIHByb3ZpZGVkIGZvciBhIGJ1aWx0IG9yIGluc3RhbGxlZAotR29vZ2xlIFRlc3QsIGJ1dCBubyAnZ3Rlc3QtY29uZmlnJyBzY3JpcHQgY291bGQgYmUgZm91bmQgYXQgdGhpcyBsb2NhdGlvbi5dKQotICAgICAgICAgXSldLAotICAgICBbQUNfUEFUSF9QUk9HKFtHVEVTVF9DT05GSUddLCBbZ3Rlc3QtY29uZmlnXSldKQotICAgQVNfSUYoW3Rlc3QgLXggIiR7R1RFU1RfQ09ORklHfSJdLAotICAgICBbQUNfTVNHX1JFU1VMVChbJHtHVEVTVF9DT05GSUd9XSkKLSAgICAgIG00X2lmdmFsKFskMV0sCi0gICAgICAgIFtfZ3Rlc3RfbWluX3ZlcnNpb249Ii0tbWluLXZlcnNpb249JDEiCi0gICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHb29nbGUgVGVzdCBhdCBsZWFzdCB2ZXJzaW9uID49ICQxXSldLAotICAgICAgICBbX2d0ZXN0X21pbl92ZXJzaW9uPSItLW1pbi12ZXJzaW9uPTAiCi0gICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHb29nbGUgVGVzdF0pXSkKLSAgICAgIEFTX0lGKFske0dURVNUX0NPTkZJR30gJHtfZ3Rlc3RfbWluX3ZlcnNpb259XSwKLSAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pCi0gICAgICAgICBIQVZFX0dURVNUPSd5ZXMnXSwKLSAgICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKV0sCi0gICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKLSAgIEFTX0lGKFt0ZXN0ICJ4JHtIQVZFX0dURVNUfSIgPSAieHllcyJdLAotICAgICBbR1RFU1RfQ1BQRkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWNwcGZsYWdzYAotICAgICAgR1RFU1RfQ1hYRkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWN4eGZsYWdzYAotICAgICAgR1RFU1RfTERGTEFHUz1gJHtHVEVTVF9DT05GSUd9IC0tbGRmbGFnc2AKLSAgICAgIEdURVNUX0xJQlM9YCR7R1RFU1RfQ09ORklHfSAtLWxpYnNgCi0gICAgICBHVEVTVF9WRVJTSU9OPWAke0dURVNUX0NPTkZJR30gLS12ZXJzaW9uYAotICAgICAgQUNfREVGSU5FKFtIQVZFX0dURVNUXSxbMV0sW0RlZmluZWQgd2hlbiBHb29nbGUgVGVzdCBpcyBhdmFpbGFibGUuXSldLAotICAgICBbQVNfSUYoW3Rlc3QgIngke2VuYWJsZV9ndGVzdH0iID0gInh5ZXMiXSwKLSAgICAgICAgW0FDX01TR19FUlJPUihbZG5sCi1Hb29nbGUgVGVzdCB3YXMgZW5hYmxlZCwgYnV0IG5vIHZpYWJsZSB2ZXJzaW9uIGNvdWxkIGJlIGZvdW5kLl0pCi0gICAgICAgICBdKV0pXSkKLUFDX1NVQlNUKFtIQVZFX0dURVNUXSkKLUFNX0NPTkRJVElPTkFMKFtIQVZFX0dURVNUXSxbdGVzdCAieCRIQVZFX0dURVNUIiA9ICJ4eWVzIl0pCi1BU19JRihbdGVzdCAieCRIQVZFX0dURVNUIiA9ICJ4eWVzIl0sCi0gIFttNF9pZnZhbChbJDJdLCBbJDJdKV0sCi0gIFttNF9pZnZhbChbJDNdLCBbJDNdKV0pCi1dKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9tYWtlL01ha2VmaWxlIGIvdGVzdGluZy9ndGVzdC9tYWtlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWM3NDQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvbWFrZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSMgQSBzYW1wbGUgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0IGFuZCB1c2luZyBpdCBpbiB1c2VyCi0jIHRlc3RzLiAgUGxlYXNlIHR3ZWFrIGl0IHRvIHN1aXQgeW91ciBlbnZpcm9ubWVudCBhbmQgcHJvamVjdC4gIFlvdQotIyBtYXkgd2FudCB0byBtb3ZlIGl0IHRvIHlvdXIgcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5LgotIwotIyBTWU5PUFNJUzoKLSMKLSMgICBtYWtlIFthbGxdICAtIG1ha2VzIGV2ZXJ5dGhpbmcuCi0jICAgbWFrZSBUQVJHRVQgLSBtYWtlcyB0aGUgZ2l2ZW4gdGFyZ2V0LgotIyAgIG1ha2UgY2xlYW4gIC0gcmVtb3ZlcyBhbGwgZmlsZXMgZ2VuZXJhdGVkIGJ5IG1ha2UuCi0KLSMgUGxlYXNlIHR3ZWFrIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMgYXMgbmVlZGVkIGJ5IHlvdXIKLSMgcHJvamVjdCwgZXhjZXB0IEdURVNUX0hFQURFUlMsIHdoaWNoIHlvdSBjYW4gdXNlIGluIHlvdXIgb3duIHRhcmdldHMKLSMgYnV0IHNob3VsZG4ndCBtb2RpZnkuCi0KLSMgUG9pbnRzIHRvIHRoZSByb290IG9mIEdvb2dsZSBUZXN0LCByZWxhdGl2ZSB0byB3aGVyZSB0aGlzIGZpbGUgaXMuCi0jIFJlbWVtYmVyIHRvIHR3ZWFrIHRoaXMgaWYgeW91IG1vdmUgdGhpcyBmaWxlLgotR1RFU1RfRElSID0gLi4KLQotIyBXaGVyZSB0byBmaW5kIHVzZXIgY29kZS4KLVVTRVJfRElSID0gLi4vc2FtcGxlcwotCi0jIEZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yLgotIyBTZXQgR29vZ2xlIFRlc3QncyBoZWFkZXIgZGlyZWN0b3J5IGFzIGEgc3lzdGVtIGRpcmVjdG9yeSwgc3VjaCB0aGF0Ci0jIHRoZSBjb21waWxlciBkb2Vzbid0IGdlbmVyYXRlIHdhcm5pbmdzIGluIEdvb2dsZSBUZXN0IGhlYWRlcnMuCi1DUFBGTEFHUyArPSAtaXN5c3RlbSAkKEdURVNUX0RJUikvaW5jbHVkZQotCi0jIEZsYWdzIHBhc3NlZCB0byB0aGUgQysrIGNvbXBpbGVyLgotQ1hYRkxBR1MgKz0gLWcgLVdhbGwgLVdleHRyYSAtcHRocmVhZAotCi0jIEFsbCB0ZXN0cyBwcm9kdWNlZCBieSB0aGlzIE1ha2VmaWxlLiAgUmVtZW1iZXIgdG8gYWRkIG5ldyB0ZXN0cyB5b3UKLSMgY3JlYXRlZCB0byB0aGUgbGlzdC4KLVRFU1RTID0gc2FtcGxlMV91bml0dGVzdAotCi0jIEFsbCBHb29nbGUgVGVzdCBoZWFkZXJzLiAgVXN1YWxseSB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzCi0jIGRlZmluaXRpb24uCi1HVEVTVF9IRUFERVJTID0gJChHVEVTVF9ESVIpL2luY2x1ZGUvZ3Rlc3QvKi5oIFwKLSAgICAgICAgICAgICAgICAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC8qLmgKLQotIyBIb3VzZS1rZWVwaW5nIGJ1aWxkIHRhcmdldHMuCi0KLWFsbCA6ICQoVEVTVFMpCi0KLWNsZWFuIDoKLQlybSAtZiAkKFRFU1RTKSBndGVzdC5hIGd0ZXN0X21haW4uYSAqLm8KLQotIyBCdWlsZHMgZ3Rlc3QuYSBhbmQgZ3Rlc3RfbWFpbi5hLgotCi0jIFVzdWFsbHkgeW91IHNob3VsZG4ndCB0d2VhayBzdWNoIGludGVybmFsIHZhcmlhYmxlcywgaW5kaWNhdGVkIGJ5IGEKLSMgdHJhaWxpbmcgXy4KLUdURVNUX1NSQ1NfID0gJChHVEVTVF9ESVIpL3NyYy8qLmNjICQoR1RFU1RfRElSKS9zcmMvKi5oICQoR1RFU1RfSEVBREVSUykKLQotIyBGb3Igc2ltcGxpY2l0eSBhbmQgdG8gYXZvaWQgZGVwZW5kaW5nIG9uIEdvb2dsZSBUZXN0J3MKLSMgaW1wbGVtZW50YXRpb24gZGV0YWlscywgdGhlIGRlcGVuZGVuY2llcyBzcGVjaWZpZWQgYmVsb3cgYXJlCi0jIGNvbnNlcnZhdGl2ZSBhbmQgbm90IG9wdGltaXplZC4gIFRoaXMgaXMgZmluZSBhcyBHb29nbGUgVGVzdAotIyBjb21waWxlcyBmYXN0IGFuZCBmb3Igb3JkaW5hcnkgdXNlcnMgaXRzIHNvdXJjZSByYXJlbHkgY2hhbmdlcy4KLWd0ZXN0LWFsbC5vIDogJChHVEVTVF9TUkNTXykKLQkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgJChDWFhGTEFHUykgLWMgXAotICAgICAgICAgICAgJChHVEVTVF9ESVIpL3NyYy9ndGVzdC1hbGwuY2MKLQotZ3Rlc3RfbWFpbi5vIDogJChHVEVTVF9TUkNTXykKLQkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgJChDWFhGTEFHUykgLWMgXAotICAgICAgICAgICAgJChHVEVTVF9ESVIpL3NyYy9ndGVzdF9tYWluLmNjCi0KLWd0ZXN0LmEgOiBndGVzdC1hbGwubwotCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KLQotZ3Rlc3RfbWFpbi5hIDogZ3Rlc3QtYWxsLm8gZ3Rlc3RfbWFpbi5vCi0JJChBUikgJChBUkZMQUdTKSAkQCAkXgotCi0jIEJ1aWxkcyBhIHNhbXBsZSB0ZXN0LiAgQSB0ZXN0IHNob3VsZCBsaW5rIHdpdGggZWl0aGVyIGd0ZXN0LmEgb3IKLSMgZ3Rlc3RfbWFpbi5hLCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBkZWZpbmVzIGl0cyBvd24gbWFpbigpCi0jIGZ1bmN0aW9uLgotCi1zYW1wbGUxLm8gOiAkKFVTRVJfRElSKS9zYW1wbGUxLmNjICQoVVNFUl9ESVIpL3NhbXBsZTEuaCAkKEdURVNUX0hFQURFUlMpCi0JJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoVVNFUl9ESVIpL3NhbXBsZTEuY2MKLQotc2FtcGxlMV91bml0dGVzdC5vIDogJChVU0VSX0RJUikvc2FtcGxlMV91bml0dGVzdC5jYyBcCi0gICAgICAgICAgICAgICAgICAgICAkKFVTRVJfRElSKS9zYW1wbGUxLmggJChHVEVTVF9IRUFERVJTKQotCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFVTRVJfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjCi0KLXNhbXBsZTFfdW5pdHRlc3QgOiBzYW1wbGUxLm8gc2FtcGxlMV91bml0dGVzdC5vIGd0ZXN0X21haW4uYQotCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtbHB0aHJlYWQgJF4gLW8gJEAKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdC1tZC5zbG4gYi90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3QtbWQuc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzkwOGRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdC1tZC5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwDQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdC1tZCIsICJndGVzdC1tZC52Y3Byb2oiLCAie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCi0JRW5kUHJvamVjdFNlY3Rpb24NCi1FbmRQcm9qZWN0DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdF9tYWluLW1kIiwgImd0ZXN0X21haW4tbWQudmNwcm9qIiwgInszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9Ig0KLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQotCUVuZFByb2plY3RTZWN0aW9uDQotRW5kUHJvamVjdA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfcHJvZF90ZXN0LW1kIiwgImd0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2oiLCAiezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0iDQotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCi0JRW5kUHJvamVjdFNlY3Rpb24NCi1FbmRQcm9qZWN0DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdF91bml0dGVzdC1tZCIsICJndGVzdF91bml0dGVzdC1tZC52Y3Byb2oiLCAiezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0iDQotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCi0JRW5kUHJvamVjdFNlY3Rpb24NCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1ZyA9IERlYnVnDQotCQlSZWxlYXNlID0gUmVsZWFzZQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQotCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQotCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KLQkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KLQkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUFkZElucykgPSBwb3N0U29sdXRpb24NCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdC1tZC52Y3Byb2ogYi90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3QtbWQudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM1YzNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdC1tZC52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQotPFZpc3VhbFN0dWRpb1Byb2plY3QNCi0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQotCVZlcnNpb249IjcuMTAiDQotCU5hbWU9Imd0ZXN0LW1kIg0KLQlQcm9qZWN0R1VJRD0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQotCUtleXdvcmQ9IldpbjMyUHJvaiI+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiIvPg0KLQk8L1BsYXRmb3Jtcz4NCi0JPENvbmZpZ3VyYXRpb25zPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdGQubGliIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQlSZWZlcmVuY2VzUGF0aD0iJnF1b3Q7Li5caW5jbHVkZSZxdW90OzsmcXVvdDsuLiZxdW90OyI+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMiINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3QubGliIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQk8L0NvbmZpZ3VyYXRpb25zPg0KLQk8UmVmZXJlbmNlcz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0LWFsbC5jYyI+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3Quc2xuIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0LnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0YjA1Ny4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3Quc2xuCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3QiLCAiZ3Rlc3QudmNwcm9qIiwgIntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9Ig0KLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQotCUVuZFByb2plY3RTZWN0aW9uDQotRW5kUHJvamVjdA0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbiIsICJndGVzdF9tYWluLnZjcHJvaiIsICJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfSINCi0JUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KLQlFbmRQcm9qZWN0U2VjdGlvbg0KLUVuZFByb2plY3QNCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3VuaXR0ZXN0IiwgImd0ZXN0X3VuaXR0ZXN0LnZjcHJvaiIsICJ7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfSINCi0JUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KLQlFbmRQcm9qZWN0U2VjdGlvbg0KLUVuZFByb2plY3QNCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3Byb2RfdGVzdCIsICJndGVzdF9wcm9kX3Rlc3QudmNwcm9qIiwgInsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9Ig0KLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQotCUVuZFByb2plY3RTZWN0aW9uDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KLQkJRGVidWcgPSBEZWJ1Zw0KLQkJUmVsZWFzZSA9IFJlbGVhc2UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KLQkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQotCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KLQkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KLQkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3QudmNwcm9qIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0LnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzNzNjZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3QudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI3LjEwIg0KLQlOYW1lPSJndGVzdCINCi0JUHJvamVjdEdVSUQ9IntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iNSINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RkLmxpYiIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCi0JCQkJUnVudGltZUxpYnJhcnk9IjQiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0LmxpYiIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCTwvUmVmZXJlbmNlcz4NCi0JPEZpbGVzPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCi0JCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xndGVzdC1hbGwuY2MiPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQotCQk8L0ZpbHRlcj4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM3OWZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdF9tYWluLW1kLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iNy4xMCINCi0JTmFtZT0iZ3Rlc3RfbWFpbi1tZCINCi0JUHJvamVjdEdVSUQ9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSlkLmxpYiIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQotCQkJTmFtZT0iZ3Rlc3QtbWQiLz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQotCQk8L0ZpbHRlcj4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X21haW4udmNwcm9qIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X21haW4udmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGI3NjNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdF9tYWluLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iNy4xMCINCi0JTmFtZT0iZ3Rlc3RfbWFpbiINCi0JUHJvamVjdEdVSUQ9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iNSINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSlkLmxpYiIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCi0JCQkJUnVudGltZUxpYnJhcnk9IjQiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQotCQkJTmFtZT0iZ3Rlc3QiLz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQotCQk8L0ZpbHRlcj4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC1tZC52Y3Byb2ogYi90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViMDVkOS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iNy4xMCINCi0JTmFtZT0iZ3Rlc3RfcHJvZF90ZXN0LW1kIg0KLQlQcm9qZWN0R1VJRD0iezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0iDQotCUtleXdvcmQ9IldpbjMyUHJvaiI+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiIvPg0KLQk8L1BsYXRmb3Jtcz4NCi0JPENvbmZpZ3VyYXRpb25zPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSINCi0JCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5leGUiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KLQkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LnBkYiINCi0JCQkJU3ViU3lzdGVtPSIxIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KLQkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQotCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCi0JCQkJU3ViU3lzdGVtPSIxIg0KLQkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQotCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQk8L0NvbmZpZ3VyYXRpb25zPg0KLQk8UmVmZXJlbmNlcz4NCi0JCTxQcm9qZWN0UmVmZXJlbmNlDQotCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCi0JCQlOYW1lPSJndGVzdF9tYWluLW1kIi8+DQotCTwvUmVmZXJlbmNlcz4NCi0JPEZpbGVzPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCi0JCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RcZ3Rlc3RfcHJvZF90ZXN0LmNjIj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XHByb2R1Y3Rpb24uY2MiPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XHByb2R1Y3Rpb24uaCI+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCTwvRmlsZXM+DQotCTxHbG9iYWxzPg0KLQk8L0dsb2JhbHM+DQotPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2EyZjAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X3Byb2RfdGVzdC52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQotPFZpc3VhbFN0dWRpb1Byb2plY3QNCi0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQotCVZlcnNpb249IjcuMTAiDQotCU5hbWU9Imd0ZXN0X3Byb2RfdGVzdCINCi0JUHJvamVjdEdVSUQ9InsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KLQkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQotCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCi0JCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5wZGIiDQotCQkJCVN1YlN5c3RlbT0iMSINCi0JCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iNCINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIg0KLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQotCQkJCVN1YlN5c3RlbT0iMSINCi0JCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KLQkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQotCQkJTmFtZT0iZ3Rlc3RfbWFpbiIvPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3Byb2RfdGVzdC5jYyI+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmNjIj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQotCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmgiPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhNWU1Ni4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI3LjEwIg0KLQlOYW1lPSJndGVzdF91bml0dGVzdC1tZCINCi0JUHJvamVjdEdVSUQ9Ins0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5leGUiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KLQkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QucGRiIg0KLQkJCQlTdWJTeXN0ZW09IjEiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KLQkJCUNoYXJhY3RlclNldD0iMiI+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIg0KLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQotCQkJCVN1YlN5c3RlbT0iMSINCi0JCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KLQkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQotCQkJTmFtZT0iZ3Rlc3RfbWFpbi1tZCIvPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIxIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qIGIvdGVzdGluZy9ndGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxZjUyYi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI3LjEwIg0KLQlOYW1lPSJndGVzdF91bml0dGVzdCINCi0JUHJvamVjdEdVSUQ9Ins0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiPg0KLQk8UGxhdGZvcm1zPg0KLQkJPFBsYXRmb3JtDQotCQkJTmFtZT0iV2luMzIiLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxDb25maWd1cmF0aW9ucz4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5leGUiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KLQkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QucGRiIg0KLQkJCQlTdWJTeXN0ZW09IjEiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KLQkJCUNoYXJhY3RlclNldD0iMiI+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjQiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIg0KLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQotCQkJCVN1YlN5c3RlbT0iMSINCi0JCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KLQkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCQk8UHJvamVjdFJlZmVyZW5jZQ0KLQkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQotCQkJTmFtZT0iZ3Rlc3RfbWFpbiIvPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJT3B0aW1pemF0aW9uPSIxIg0KLQkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQotCQkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KLQkJCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCi0JCTwvRmlsdGVyPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvcHJpbWVfdGFibGVzLmggYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvcHJpbWVfdGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2UxNmEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3ByaW1lX3RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gVGhpcyBwcm92aWRlcyBpbnRlcmZhY2UgUHJpbWVUYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIG51bWJlciBpcyBhCi0vLyBwcmltZSBhbmQgZGV0ZXJtaW5lcyBhIG5leHQgcHJpbWUgbnVtYmVyLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkCi0vLyBpbiBHb29nbGUgVGVzdCBzYW1wbGVzIGRlbW9uc3RyYXRpbmcgdXNlIG9mIHBhcmFtZXRlcml6ZWQgdGVzdHMuCi0KLSNpZm5kZWYgR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KLSNkZWZpbmUgR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotLy8gVGhlIHByaW1lIHRhYmxlIGludGVyZmFjZS4KLWNsYXNzIFByaW1lVGFibGUgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UHJpbWVUYWJsZSgpIHt9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBuIGlzIGEgcHJpbWUgbnVtYmVyLgotICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IHByaW1lIG51bWJlciBncmVhdGVyIHRoYW4gcDsgb3IgcmV0dXJucyAtMQotICAvLyBpZiB0aGUgbmV4dCBwcmltZSBpcyBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mIHRoZSB0YWJsZS4KLSAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCA9IDA7Ci19OwotCi0vLyBJbXBsZW1lbnRhdGlvbiAjMSBjYWxjdWxhdGVzIHRoZSBwcmltZXMgb24tdGhlLWZseS4KLWNsYXNzIE9uVGhlRmx5UHJpbWVUYWJsZSA6IHB1YmxpYyBQcmltZVRhYmxlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7Ci0gICAgaWYgKG4gPD0gMSkgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDI7IGkqaSA8PSBuOyBpKyspIHsKLSAgICAgIC8vIG4gaXMgZGl2aXNpYmxlIGJ5IGFuIGludGVnZXIgb3RoZXIgdGhhbiAxIGFuZCBpdHNlbGYuCi0gICAgICBpZiAoKG4gJSBpKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIGludCBHZXROZXh0UHJpbWUoaW50IHApIGNvbnN0IHsKLSAgICBmb3IgKGludCBuID0gcCArIDE7IG4gPiAwOyBuKyspIHsKLSAgICAgIGlmIChJc1ByaW1lKG4pKSByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudGF0aW9uICMyIHByZS1jYWxjdWxhdGVzIHRoZSBwcmltZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0Ci0vLyBpbiBhbiBhcnJheS4KLWNsYXNzIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlIDogcHVibGljIFByaW1lVGFibGUgewotIHB1YmxpYzoKLSAgLy8gJ21heCcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciB0aGUgcHJpbWUgdGFibGUgaG9sZHMuCi0gIGV4cGxpY2l0IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKGludCBtYXgpCi0gICAgICA6IGlzX3ByaW1lX3NpemVfKG1heCArIDEpLCBpc19wcmltZV8obmV3IGJvb2xbbWF4ICsgMV0pIHsKLSAgICBDYWxjdWxhdGVQcmltZXNVcFRvKG1heCk7Ci0gIH0KLSAgdmlydHVhbCB+UHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoKSB7IGRlbGV0ZVtdIGlzX3ByaW1lXzsgfQotCi0gIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7Ci0gICAgcmV0dXJuIDAgPD0gbiAmJiBuIDwgaXNfcHJpbWVfc2l6ZV8gJiYgaXNfcHJpbWVfW25dOwotICB9Ci0KLSAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCB7Ci0gICAgZm9yIChpbnQgbiA9IHAgKyAxOyBuIDwgaXNfcHJpbWVfc2l6ZV87IG4rKykgewotICAgICAgaWYgKGlzX3ByaW1lX1tuXSkgcmV0dXJuIG47Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIENhbGN1bGF0ZVByaW1lc1VwVG8oaW50IG1heCkgewotICAgIDo6c3RkOjpmaWxsKGlzX3ByaW1lXywgaXNfcHJpbWVfICsgaXNfcHJpbWVfc2l6ZV8sIHRydWUpOwotICAgIGlzX3ByaW1lX1swXSA9IGlzX3ByaW1lX1sxXSA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbWF4OyBpKyspIHsKLSAgICAgIGlmICghaXNfcHJpbWVfW2ldKSBjb250aW51ZTsKLQotICAgICAgLy8gTWFya3MgYWxsIG11bHRpcGxlcyBvZiBpIChleGNlcHQgaSBpdHNlbGYpIGFzIG5vbi1wcmltZS4KLSAgICAgIGZvciAoaW50IGogPSAyKmk7IGogPD0gbWF4OyBqICs9IGkpIHsKLSAgICAgICAgaXNfcHJpbWVfW2pdID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgaW50IGlzX3ByaW1lX3NpemVfOwotICBib29sKiBjb25zdCBpc19wcmltZV87Ci0KLSAgLy8gRGlzYWJsZXMgY29tcGlsZXIgd2FybmluZyAiYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLiIKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUmIHJocyk7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfUFJJTUVfVEFCTEVTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMS5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTcxZTI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJzYW1wbGUxLmgiCi0KLS8vIFJldHVybnMgbiEgKHRoZSBmYWN0b3JpYWwgb2YgbikuICBGb3IgbmVnYXRpdmUgbiwgbiEgaXMgZGVmaW5lZCB0byBiZSAxLgotaW50IEZhY3RvcmlhbChpbnQgbikgewotICBpbnQgcmVzdWx0ID0gMTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7Ci0gICAgcmVzdWx0ICo9IGk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIG4gaXMgYSBwcmltZSBudW1iZXIuCi1ib29sIElzUHJpbWUoaW50IG4pIHsKLSAgLy8gVHJpdmlhbCBjYXNlIDE6IHNtYWxsIG51bWJlcnMKLSAgaWYgKG4gPD0gMSkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFRyaXZpYWwgY2FzZSAyOiBldmVuIG51bWJlcnMKLSAgaWYgKG4gJSAyID09IDApIHJldHVybiBuID09IDI7Ci0KLSAgLy8gTm93LCB3ZSBoYXZlIHRoYXQgbiBpcyBvZGQgYW5kIG4gPj0gMy4KLQotICAvLyBUcnkgdG8gZGl2aWRlIG4gYnkgZXZlcnkgb2RkIG51bWJlciBpLCBzdGFydGluZyBmcm9tIDMKLSAgZm9yIChpbnQgaSA9IDM7IDsgaSArPSAyKSB7Ci0gICAgLy8gV2Ugb25seSBoYXZlIHRvIHRyeSBpIHVwIHRvIHRoZSBzcXVyZSByb290IG9mIG4KLSAgICBpZiAoaSA+IG4vaSkgYnJlYWs7Ci0KLSAgICAvLyBOb3csIHdlIGhhdmUgaSA8PSBuL2kgPCBuLgotICAgIC8vIElmIG4gaXMgZGl2aXNpYmxlIGJ5IGksIG4gaXMgbm90IHByaW1lLgotICAgIGlmIChuICUgaSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBuIGhhcyBubyBpbnRlZ2VyIGZhY3RvciBpbiB0aGUgcmFuZ2UgKDEsIG4pLCBhbmQgdGh1cyBpcyBwcmltZS4KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMS5oIGIvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmZWI5OC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpZm5kZWYgR1RFU1RfU0FNUExFU19TQU1QTEUxX0hfCi0jZGVmaW5lIEdURVNUX1NBTVBMRVNfU0FNUExFMV9IXwotCi0vLyBSZXR1cm5zIG4hICh0aGUgZmFjdG9yaWFsIG9mIG4pLiAgRm9yIG5lZ2F0aXZlIG4sIG4hIGlzIGRlZmluZWQgdG8gYmUgMS4KLWludCBGYWN0b3JpYWwoaW50IG4pOwotCi0vLyBSZXR1cm5zIHRydWUgaWZmIG4gaXMgYSBwcmltZSBudW1iZXIuCi1ib29sIElzUHJpbWUoaW50IG4pOwotCi0jZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFMV9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUxY2Q1Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHVzZSBHb29nbGUgVGVzdCBsaXN0ZW5lciBBUEkgdG8gaW1wbGVtZW50Ci0vLyBhIHByaW1pdGl2ZSBsZWFrIGNoZWNrZXIuCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwotdXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdENhc2U7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwotdXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKLQotbmFtZXNwYWNlIHsKLQotLy8gV2Ugd2lsbCB0cmFjayBtZW1vcnkgdXNlZCBieSB0aGlzIGNsYXNzLgotY2xhc3MgV2F0ZXIgewotIHB1YmxpYzoKLSAgLy8gTm9ybWFsIFdhdGVyIGRlY2xhcmF0aW9ucyBnbyBoZXJlLgotCi0gIC8vIG9wZXJhdG9yIG5ldyBhbmQgb3BlcmF0b3IgZGVsZXRlIGhlbHAgdXMgY29udHJvbCB3YXRlciBhbGxvY2F0aW9uLgotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IGFsbG9jYXRpb25fc2l6ZSkgewotICAgIGFsbG9jYXRlZF8rKzsKLSAgICByZXR1cm4gbWFsbG9jKGFsbG9jYXRpb25fc2l6ZSk7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBibG9jaywgc2l6ZV90IC8qIGFsbG9jYXRpb25fc2l6ZSAqLykgewotICAgIGFsbG9jYXRlZF8tLTsKLSAgICBmcmVlKGJsb2NrKTsKLSAgfQotCi0gIHN0YXRpYyBpbnQgYWxsb2NhdGVkKCkgeyByZXR1cm4gYWxsb2NhdGVkXzsgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGludCBhbGxvY2F0ZWRfOwotfTsKLQotaW50IFdhdGVyOjphbGxvY2F0ZWRfID0gMDsKLQotLy8gVGhpcyBldmVudCBsaXN0ZW5lciBtb25pdG9ycyBob3cgbWFueSBXYXRlciBvYmplY3RzIGFyZSBjcmVhdGVkIGFuZAotLy8gZGVzdHJveWVkIGJ5IGVhY2ggdGVzdCwgYW5kIHJlcG9ydHMgYSBmYWlsdXJlIGlmIGEgdGVzdCBsZWFrcyBzb21lIFdhdGVyCi0vLyBvYmplY3RzLiBJdCBkb2VzIHRoaXMgYnkgY29tcGFyaW5nIHRoZSBudW1iZXIgb2YgbGl2ZSBXYXRlciBvYmplY3RzIGF0Ci0vLyB0aGUgYmVnaW5uaW5nIG9mIGEgdGVzdCBhbmQgYXQgdGhlIGVuZCBvZiBhIHRlc3QuCi1jbGFzcyBMZWFrQ2hlY2tlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKLSBwcml2YXRlOgotICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyogdGVzdF9pbmZvICovKSB7Ci0gICAgaW5pdGlhbGx5X2FsbG9jYXRlZF8gPSBXYXRlcjo6YWxsb2NhdGVkKCk7Ci0gIH0KLQotICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qIHRlc3RfaW5mbyAqLykgewotICAgIGludCBkaWZmZXJlbmNlID0gV2F0ZXI6OmFsbG9jYXRlZCgpIC0gaW5pdGlhbGx5X2FsbG9jYXRlZF87Ci0KLSAgICAvLyBZb3UgY2FuIGdlbmVyYXRlIGEgZmFpbHVyZSBpbiBhbnkgZXZlbnQgaGFuZGxlciBleGNlcHQKLSAgICAvLyBPblRlc3RQYXJ0UmVzdWx0LiBKdXN0IHVzZSBhbiBhcHByb3ByaWF0ZSBHb29nbGUgVGVzdCBhc3NlcnRpb24gdG8gZG8KLSAgICAvLyBpdC4KLSAgICBFWFBFQ1RfTEUoZGlmZmVyZW5jZSwgMCkgPDwgIkxlYWtlZCAiIDw8IGRpZmZlcmVuY2UgPDwgIiB1bml0KHMpIG9mIFdhdGVyISI7Ci0gIH0KLQotICBpbnQgaW5pdGlhbGx5X2FsbG9jYXRlZF87Ci19OwotCi1URVNUKExpc3RlbmVyc1Rlc3QsIERvZXNOb3RMZWFrKSB7Ci0gIFdhdGVyKiB3YXRlciA9IG5ldyBXYXRlcjsKLSAgZGVsZXRlIHdhdGVyOwotfQotCi0vLyBUaGlzIHNob3VsZCBmYWlsIHdoZW4gdGhlIC0tY2hlY2tfZm9yX2xlYWtzIGNvbW1hbmQgbGluZSBmbGFnIGlzCi0vLyBzcGVjaWZpZWQuCi1URVNUKExpc3RlbmVyc1Rlc3QsIExlYWtzV2F0ZXIpIHsKLSAgV2F0ZXIqIHdhdGVyID0gbmV3IFdhdGVyOwotICBFWFBFQ1RfVFJVRSh3YXRlciAhPSBOVUxMKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgYm9vbCBjaGVja19mb3JfbGVha3MgPSBmYWxzZTsKLSAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS1jaGVja19mb3JfbGVha3MiKSA9PSAwICkKLSAgICBjaGVja19mb3JfbGVha3MgPSB0cnVlOwotICBlbHNlCi0gICAgcHJpbnRmKCIlc1xuIiwgIlJ1biB0aGlzIHByb2dyYW0gd2l0aCAtLWNoZWNrX2Zvcl9sZWFrcyB0byBlbmFibGUgIgotICAgICAgICAgICAiY3VzdG9tIGxlYWsgY2hlY2tpbmcgaW4gdGhlIHRlc3RzLiIpOwotCi0gIC8vIElmIHdlIGFyZSBnaXZlbiB0aGUgLS1jaGVja19mb3JfbGVha3MgY29tbWFuZCBsaW5lIGZsYWcsIGluc3RhbGxzIHRoZQotICAvLyBsZWFrIGNoZWNrZXIuCi0gIGlmIChjaGVja19mb3JfbGVha3MpIHsKLSAgICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKLQotICAgIC8vIEFkZHMgdGhlIGxlYWsgY2hlY2tlciB0byB0aGUgZW5kIG9mIHRoZSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGxpc3QsCi0gICAgLy8gYWZ0ZXIgdGhlIGRlZmF1bHQgdGV4dCBvdXRwdXQgcHJpbnRlciBhbmQgdGhlIGRlZmF1bHQgWE1MIHJlcG9ydAotICAgIC8vIGdlbmVyYXRvci4KLSAgICAvLwotICAgIC8vIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQgLSBpdCBlbnN1cmVzIHRoYXQgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZQotICAgIC8vIGxlYWsgY2hlY2tlcidzIE9uVGVzdEVuZCgpIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSB0ZXh0IGFuZCBYTUwKLSAgICAvLyBwcmludGVycyAqYmVmb3JlKiB0aGVpciBPblRlc3RFbmQoKSBtZXRob2RzIGFyZSBjYWxsZWQsIHN1Y2ggdGhhdAotICAgIC8vIHRoZXkgYXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHJpZ2h0IHRlc3QuIFJlbWVtYmVyIHRoYXQgYSBsaXN0ZW5lcgotICAgIC8vIHJlY2VpdmVzIGFuIE9uWHl6U3RhcnQgZXZlbnQgKmFmdGVyKiBsaXN0ZW5lcnMgcHJlY2VkaW5nIGl0IGluIHRoZQotICAgIC8vIGxpc3QgcmVjZWl2ZWQgdGhhdCBldmVudCwgYW5kIHJlY2VpdmVzIGFuIE9uWHl6RW5kIGV2ZW50ICpiZWZvcmUqCi0gICAgLy8gbGlzdGVuZXJzIHByZWNlZGluZyBpdC4KLSAgICAvLwotICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZGVsZXRpbmcgdGhlIG5ldyBsaXN0ZW5lciBsYXRlciwgYXMKLSAgICAvLyBHb29nbGUgVGVzdCB3aWxsIGRvIGl0LgotICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IExlYWtDaGVja2VyKTsKLSAgfQotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmYzRmMS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotCi0vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gd3JpdGUgYSBzaW1wbGUgdW5pdCB0ZXN0IGZvciBhIGZ1bmN0aW9uLAotLy8gdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBXcml0aW5nIGEgdW5pdCB0ZXN0IHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsgaXMgZWFzeSBhcyAxLTItMzoKLQotCi0vLyBTdGVwIDEuIEluY2x1ZGUgbmVjZXNzYXJ5IGhlYWRlciBmaWxlcyBzdWNoIHRoYXQgdGhlIHN0dWZmIHlvdXIKLS8vIHRlc3QgbG9naWMgbmVlZHMgaXMgZGVjbGFyZWQuCi0vLwotLy8gRG9uJ3QgZm9yZ2V0IGd0ZXN0LmgsIHdoaWNoIGRlY2xhcmVzIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgInNhbXBsZTEuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0KLS8vIFN0ZXAgMi4gVXNlIHRoZSBURVNUIG1hY3JvIHRvIGRlZmluZSB5b3VyIHRlc3RzLgotLy8KLS8vIFRFU1QgaGFzIHR3byBwYXJhbWV0ZXJzOiB0aGUgdGVzdCBjYXNlIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCi0vLyBBZnRlciB1c2luZyB0aGUgbWFjcm8sIHlvdSBzaG91bGQgZGVmaW5lIHlvdXIgdGVzdCBsb2dpYyBiZXR3ZWVuIGEKLS8vIHBhaXIgb2YgYnJhY2VzLiAgWW91IGNhbiB1c2UgYSBidW5jaCBvZiBtYWNyb3MgdG8gaW5kaWNhdGUgdGhlCi0vLyBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgYSB0ZXN0LiAgRVhQRUNUX1RSVUUgYW5kIEVYUEVDVF9FUSBhcmUKLS8vIGV4YW1wbGVzIG9mIHN1Y2ggbWFjcm9zLiAgRm9yIGEgY29tcGxldGUgbGlzdCwgc2VlIGd0ZXN0LmguCi0vLwotLy8gPFRlY2huaWNhbERldGFpbHM+Ci0vLwotLy8gSW4gR29vZ2xlIFRlc3QsIHRlc3RzIGFyZSBncm91cGVkIGludG8gdGVzdCBjYXNlcy4gIFRoaXMgaXMgaG93IHdlCi0vLyBrZWVwIHRlc3QgY29kZSBvcmdhbml6ZWQuICBZb3Ugc2hvdWxkIHB1dCBsb2dpY2FsbHkgcmVsYXRlZCB0ZXN0cwotLy8gaW50byB0aGUgc2FtZSB0ZXN0IGNhc2UuCi0vLwotLy8gVGhlIHRlc3QgY2FzZSBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lIHNob3VsZCBib3RoIGJlIHZhbGlkIEMrKwotLy8gaWRlbnRpZmllcnMuICBBbmQgeW91IHNob3VsZCBub3QgdXNlIHVuZGVyc2NvcmUgKF8pIGluIHRoZSBuYW1lcy4KLS8vCi0vLyBHb29nbGUgVGVzdCBndWFyYW50ZWVzIHRoYXQgZWFjaCB0ZXN0IHlvdSBkZWZpbmUgaXMgcnVuIGV4YWN0bHkKLS8vIG9uY2UsIGJ1dCBpdCBtYWtlcyBubyBndWFyYW50ZWUgb24gdGhlIG9yZGVyIHRoZSB0ZXN0cyBhcmUKLS8vIGV4ZWN1dGVkLiAgVGhlcmVmb3JlLCB5b3Ugc2hvdWxkIHdyaXRlIHlvdXIgdGVzdHMgaW4gc3VjaCBhIHdheQotLy8gdGhhdCB0aGVpciByZXN1bHRzIGRvbid0IGRlcGVuZCBvbiB0aGVpciBvcmRlci4KLS8vCi0vLyA8L1RlY2huaWNhbERldGFpbHM+Ci0KLQotLy8gVGVzdHMgRmFjdG9yaWFsKCkuCi0KLS8vIFRlc3RzIGZhY3RvcmlhbCBvZiBuZWdhdGl2ZSBudW1iZXJzLgotVEVTVChGYWN0b3JpYWxUZXN0LCBOZWdhdGl2ZSkgewotICAvLyBUaGlzIHRlc3QgaXMgbmFtZWQgIk5lZ2F0aXZlIiwgYW5kIGJlbG9uZ3MgdG8gdGhlICJGYWN0b3JpYWxUZXN0IgotICAvLyB0ZXN0IGNhc2UuCi0gIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTUpKTsKLSAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgtMSkpOwotICBFWFBFQ1RfR1QoRmFjdG9yaWFsKC0xMCksIDApOwotCi0gIC8vIDxUZWNobmljYWxEZXRhaWxzPgotICAvLwotICAvLyBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgaXMgdGhlIHNhbWUgYXMKLSAgLy8KLSAgLy8gICBFWFBFQ1RfVFJVRSgoZXhwZWN0ZWQpID09IChhY3R1YWwpKQotICAvLwotICAvLyBleGNlcHQgdGhhdCBpdCB3aWxsIHByaW50IGJvdGggdGhlIGV4cGVjdGVkIHZhbHVlIGFuZCB0aGUgYWN0dWFsCi0gIC8vIHZhbHVlIHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvcgotICAvLyBkZWJ1Z2dpbmcuICBUaGVyZWZvcmUgaW4gdGhpcyBjYXNlIEVYUEVDVF9FUSBpcyBwcmVmZXJyZWQuCi0gIC8vCi0gIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBFWFBFQ1RfVFJVRSBhY2NlcHRzIGFueSBCb29sZWFuIGV4cHJlc3Npb24sCi0gIC8vIGFuZCBpcyB0aHVzIG1vcmUgZ2VuZXJhbC4KLSAgLy8KLSAgLy8gPC9UZWNobmljYWxEZXRhaWxzPgotfQotCi0vLyBUZXN0cyBmYWN0b3JpYWwgb2YgMC4KLVRFU1QoRmFjdG9yaWFsVGVzdCwgWmVybykgewotICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDApKTsKLX0KLQotLy8gVGVzdHMgZmFjdG9yaWFsIG9mIHBvc2l0aXZlIG51bWJlcnMuCi1URVNUKEZhY3RvcmlhbFRlc3QsIFBvc2l0aXZlKSB7Ci0gIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMSkpOwotICBFWFBFQ1RfRVEoMiwgRmFjdG9yaWFsKDIpKTsKLSAgRVhQRUNUX0VRKDYsIEZhY3RvcmlhbCgzKSk7Ci0gIEVYUEVDVF9FUSg0MDMyMCwgRmFjdG9yaWFsKDgpKTsKLX0KLQotCi0vLyBUZXN0cyBJc1ByaW1lKCkKLQotLy8gVGVzdHMgbmVnYXRpdmUgaW5wdXQuCi1URVNUKElzUHJpbWVUZXN0LCBOZWdhdGl2ZSkgewotICAvLyBUaGlzIHRlc3QgYmVsb25ncyB0byB0aGUgSXNQcmltZVRlc3QgdGVzdCBjYXNlLgotCi0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKC0xKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKC0yKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKElOVF9NSU4pKTsKLX0KLQotLy8gVGVzdHMgc29tZSB0cml2aWFsIGNhc2VzLgotVEVTVChJc1ByaW1lVGVzdCwgVHJpdmlhbCkgewotICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgwKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKDEpKTsKLSAgRVhQRUNUX1RSVUUoSXNQcmltZSgyKSk7Ci0gIEVYUEVDVF9UUlVFKElzUHJpbWUoMykpOwotfQotCi0vLyBUZXN0cyBwb3NpdGl2ZSBpbnB1dC4KLVRFU1QoSXNQcmltZVRlc3QsIFBvc2l0aXZlKSB7Ci0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKDQpKTsKLSAgRVhQRUNUX1RSVUUoSXNQcmltZSg1KSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKDYpKTsKLSAgRVhQRUNUX1RSVUUoSXNQcmltZSgyMykpOwotfQotCi0vLyBTdGVwIDMuIENhbGwgUlVOX0FMTF9URVNUUygpIGluIG1haW4oKS4KLS8vCi0vLyBXZSBkbyB0aGlzIGJ5IGxpbmtpbmcgaW4gc3JjL2d0ZXN0X21haW4uY2MgZmlsZSwgd2hpY2ggY29uc2lzdHMgb2YKLS8vIGEgbWFpbigpIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIFJVTl9BTExfVEVTVFMoKSBmb3IgdXMuCi0vLwotLy8gVGhpcyBydW5zIGFsbCB0aGUgdGVzdHMgeW91J3ZlIGRlZmluZWQsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKLS8vIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KLS8vCi0vLyBEaWQgeW91IG5vdGljZSB0aGF0IHdlIGRpZG4ndCByZWdpc3RlciB0aGUgdGVzdHM/ICBUaGUKLS8vIFJVTl9BTExfVEVTVFMoKSBtYWNybyBtYWdpY2FsbHkga25vd3MgYWJvdXQgYWxsIHRoZSB0ZXN0cyB3ZQotLy8gZGVmaW5lZC4gIElzbid0IHRoaXMgY29udmVuaWVudD8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUyLmNjIGIvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzYzYjkuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgInNhbXBsZTIuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4KLWNvbnN0IGNoYXIqIE15U3RyaW5nOjpDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogYV9jX3N0cmluZykgewotICBpZiAoYV9jX3N0cmluZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKGFfY19zdHJpbmcpOwotICBjaGFyKiBjb25zdCBjbG9uZSA9IG5ldyBjaGFyWyBsZW4gKyAxIF07Ci0gIG1lbWNweShjbG9uZSwgYV9jX3N0cmluZywgbGVuICsgMSk7Ci0KLSAgcmV0dXJuIGNsb25lOwotfQotCi0vLyBTZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QKLS8vIHJlcHJlc2VudHMuCi12b2lkIE15U3RyaW5nOjpTZXQoY29uc3QgY2hhciogYV9jX3N0cmluZykgewotICAvLyBNYWtlcyBzdXJlIHRoaXMgd29ya3Mgd2hlbiBjX3N0cmluZyA9PSBjX3N0cmluZ18KLSAgY29uc3QgY2hhciogY29uc3QgdGVtcCA9IE15U3RyaW5nOjpDbG9uZUNTdHJpbmcoYV9jX3N0cmluZyk7Ci0gIGRlbGV0ZVtdIGNfc3RyaW5nXzsKLSAgY19zdHJpbmdfID0gdGVtcDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUyLmggYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQ4NWM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTJfSF8KLSNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUyX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi0vLyBBIHNpbXBsZSBzdHJpbmcgY2xhc3MuCi1jbGFzcyBNeVN0cmluZyB7Ci0gcHJpdmF0ZToKLSAgY29uc3QgY2hhciogY19zdHJpbmdfOwotICBjb25zdCBNeVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IE15U3RyaW5nJiByaHMpOwotCi0gcHVibGljOgotICAvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBhX2Nfc3RyaW5nKTsKLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8KLSAgLy8gQyd0b3JzCi0KLSAgLy8gVGhlIGRlZmF1bHQgYyd0b3IgY29uc3RydWN0cyBhIE5VTEwgc3RyaW5nLgotICBNeVN0cmluZygpIDogY19zdHJpbmdfKE5VTEwpIHt9Ci0KLSAgLy8gQ29uc3RydWN0cyBhIE15U3RyaW5nIGJ5IGNsb25pbmcgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcuCi0gIGV4cGxpY2l0IE15U3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIDogY19zdHJpbmdfKE5VTEwpIHsKLSAgICBTZXQoYV9jX3N0cmluZyk7Ci0gIH0KLQotICAvLyBDb3B5IGMndG9yCi0gIE15U3RyaW5nKGNvbnN0IE15U3RyaW5nJiBzdHJpbmcpIDogY19zdHJpbmdfKE5VTEwpIHsKLSAgICBTZXQoc3RyaW5nLmNfc3RyaW5nXyk7Ci0gIH0KLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8KLSAgLy8gRCd0b3IuICBNeVN0cmluZyBpcyBpbnRlbmRlZCB0byBiZSBhIGZpbmFsIGNsYXNzLCBzbyB0aGUgZCd0b3IKLSAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHZpcnR1YWwuCi0gIH5NeVN0cmluZygpIHsgZGVsZXRlW10gY19zdHJpbmdfOyB9Ci0KLSAgLy8gR2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgTXlTdHJpbmcgb2JqZWN0IHJlcHJlc2VudHMuCi0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gY19zdHJpbmdfOyB9Ci0KLSAgc2l6ZV90IExlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY19zdHJpbmdfID09IE5VTEwgPyAwIDogc3RybGVuKGNfc3RyaW5nXyk7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QgcmVwcmVzZW50cy4KLSAgdm9pZCBTZXQoY29uc3QgY2hhciogY19zdHJpbmcpOwotfTsKLQotCi0jZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFMl9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhMTliNy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotCi0vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gd3JpdGUgYSBtb3JlIGNvbXBsZXggdW5pdCB0ZXN0IGZvciBhIGNsYXNzCi0vLyB0aGF0IGhhcyBtdWx0aXBsZSBtZW1iZXIgZnVuY3Rpb25zLgotLy8KLS8vIFVzdWFsbHksIGl0J3MgYSBnb29kIGlkZWEgdG8gaGF2ZSBvbmUgdGVzdCBmb3IgZWFjaCBtZXRob2QgaW4geW91cgotLy8gY2xhc3MuICBZb3UgZG9uJ3QgaGF2ZSB0byBkbyB0aGF0IGV4YWN0bHksIGJ1dCBpdCBoZWxwcyB0byBrZWVwCi0vLyB5b3VyIHRlc3RzIG9yZ2FuaXplZC4gIFlvdSBtYXkgYWxzbyB0aHJvdyBpbiBhZGRpdGlvbmFsIHRlc3RzIGFzCi0vLyBuZWVkZWQuCi0KLSNpbmNsdWRlICJzYW1wbGUyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gSW4gdGhpcyBleGFtcGxlLCB3ZSB0ZXN0IHRoZSBNeVN0cmluZyBjbGFzcyAoYSBzaW1wbGUgc3RyaW5nKS4KLQotLy8gVGVzdHMgdGhlIGRlZmF1bHQgYyd0b3IuCi1URVNUKE15U3RyaW5nLCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgY29uc3QgTXlTdHJpbmcgczsKLQotICAvLyBBc3NlcnRzIHRoYXQgcy5jX3N0cmluZygpIHJldHVybnMgTlVMTC4KLSAgLy8KLSAgLy8gPFRlY2huaWNhbERldGFpbHM+Ci0gIC8vCi0gIC8vIElmIHdlIHdyaXRlIE5VTEwgaW5zdGVhZCBvZgotICAvLwotICAvLyAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oTlVMTCkKLSAgLy8KLSAgLy8gaW4gdGhpcyBhc3NlcnRpb24sIGl0IHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIG9uIGdjYyAzLjQuICBUaGUKLSAgLy8gcmVhc29uIGlzIHRoYXQgRVhQRUNUX0VRIG5lZWRzIHRvIGtub3cgdGhlIHR5cGVzIG9mIGl0cwotICAvLyBhcmd1bWVudHMgaW4gb3JkZXIgdG8gcHJpbnQgdGhlbSB3aGVuIGl0IGZhaWxzLiAgU2luY2UgTlVMTCBpcwotICAvLyAjZGVmaW5lZCBhcyAwLCB0aGUgY29tcGlsZXIgd2lsbCB1c2UgdGhlIGZvcm1hdHRlciBmdW5jdGlvbiBmb3IKLSAgLy8gaW50IHRvIHByaW50IGl0LiAgSG93ZXZlciwgZ2NjIHRoaW5rcyB0aGF0IE5VTEwgc2hvdWxkIGJlIHVzZWQgYXMKLSAgLy8gYSBwb2ludGVyLCBub3QgYW4gaW50LCBhbmQgdGhlcmVmb3JlIGNvbXBsYWlucy4KLSAgLy8KLSAgLy8gVGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgQysrJ3MgbGFjayBvZiBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZQotICAvLyBpbnRlZ2VyIG51bWJlciAwIGFuZCB0aGUgbnVsbCBwb2ludGVyIGNvbnN0YW50LiAgVW5mb3J0dW5hdGVseSwKLSAgLy8gd2UgaGF2ZSB0byBsaXZlIHdpdGggdGhpcyBmYWN0LgotICAvLwotICAvLyA8L1RlY2huaWNhbERldGFpbHM+Ci0gIEVYUEVDVF9TVFJFUShOVUxMLCBzLmNfc3RyaW5nKCkpOwotCi0gIEVYUEVDVF9FUSgwdSwgcy5MZW5ndGgoKSk7Ci19Ci0KLWNvbnN0IGNoYXIga0hlbGxvU3RyaW5nW10gPSAiSGVsbG8sIHdvcmxkISI7Ci0KLS8vIFRlc3RzIHRoZSBjJ3RvciB0aGF0IGFjY2VwdHMgYSBDIHN0cmluZy4KLVRFU1QoTXlTdHJpbmcsIENvbnN0cnVjdG9yRnJvbUNTdHJpbmcpIHsKLSAgY29uc3QgTXlTdHJpbmcgcyhrSGVsbG9TdHJpbmcpOwotICBFWFBFQ1RfRVEoMCwgc3RyY21wKHMuY19zdHJpbmcoKSwga0hlbGxvU3RyaW5nKSk7Ci0gIEVYUEVDVF9FUShzaXplb2Yoa0hlbGxvU3RyaW5nKS9zaXplb2Yoa0hlbGxvU3RyaW5nWzBdKSAtIDEsCi0gICAgICAgICAgICBzLkxlbmd0aCgpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGNvcHkgYyd0b3IuCi1URVNUKE15U3RyaW5nLCBDb3B5Q29uc3RydWN0b3IpIHsKLSAgY29uc3QgTXlTdHJpbmcgczEoa0hlbGxvU3RyaW5nKTsKLSAgY29uc3QgTXlTdHJpbmcgczIgPSBzMTsKLSAgRVhQRUNUX0VRKDAsIHN0cmNtcChzMi5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpKTsKLX0KLQotLy8gVGVzdHMgdGhlIFNldCBtZXRob2QuCi1URVNUKE15U3RyaW5nLCBTZXQpIHsKLSAgTXlTdHJpbmcgczsKLQotICBzLlNldChrSGVsbG9TdHJpbmcpOwotICBFWFBFQ1RfRVEoMCwgc3RyY21wKHMuY19zdHJpbmcoKSwga0hlbGxvU3RyaW5nKSk7Ci0KLSAgLy8gU2V0IHNob3VsZCB3b3JrIHdoZW4gdGhlIGlucHV0IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZQotICAvLyBhbHJlYWR5IGluIHRoZSBNeVN0cmluZyBvYmplY3QuCi0gIHMuU2V0KHMuY19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgwLCBzdHJjbXAocy5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpKTsKLQotICAvLyBDYW4gd2Ugc2V0IHRoZSBNeVN0cmluZyB0byBOVUxMPwotICBzLlNldChOVUxMKTsKLSAgRVhQRUNUX1NUUkVRKE5VTEwsIHMuY19zdHJpbmcoKSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlMy1pbmwuaCBiL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUzLWlubC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTMwODRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGUzLWlubC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KLSNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUzX0lOTF9IXwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLQotLy8gUXVldWUgaXMgYSBzaW1wbGUgcXVldWUgaW1wbGVtZW50ZWQgYXMgYSBzaW5nbGVkLWxpbmtlZCBsaXN0LgotLy8KLS8vIFRoZSBlbGVtZW50IHR5cGUgbXVzdCBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gIC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZQotY2xhc3MgUXVldWU7Ci0KLS8vIFF1ZXVlTm9kZSBpcyBhIG5vZGUgaW4gYSBRdWV1ZSwgd2hpY2ggY29uc2lzdHMgb2YgYW4gZWxlbWVudCBvZgotLy8gdHlwZSBFIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFPiAgLy8gRSBpcyB0aGUgZWxlbWVudCB0eXBlCi1jbGFzcyBRdWV1ZU5vZGUgewotICBmcmllbmQgY2xhc3MgUXVldWU8RT47Ci0KLSBwdWJsaWM6Ci0gIC8vIEdldHMgdGhlIGVsZW1lbnQgaW4gdGhpcyBub2RlLgotICBjb25zdCBFJiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZWxlbWVudF87IH0KLQotICAvLyBHZXRzIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHF1ZXVlLgotICBRdWV1ZU5vZGUqIG5leHQoKSB7IHJldHVybiBuZXh0XzsgfQotICBjb25zdCBRdWV1ZU5vZGUqIG5leHQoKSBjb25zdCB7IHJldHVybiBuZXh0XzsgfQotCi0gcHJpdmF0ZToKLSAgLy8gQ3JlYXRlcyBhIG5vZGUgd2l0aCBhIGdpdmVuIGVsZW1lbnQgdmFsdWUuICBUaGUgbmV4dCBwb2ludGVyIGlzCi0gIC8vIHNldCB0byBOVUxMLgotICBleHBsaWNpdCBRdWV1ZU5vZGUoY29uc3QgRSYgYW5fZWxlbWVudCkgOiBlbGVtZW50Xyhhbl9lbGVtZW50KSwgbmV4dF8oTlVMTCkge30KLQotICAvLyBXZSBkaXNhYmxlIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgb3BlcmF0b3IgYW5kIGNvcHkgYyd0b3IuCi0gIGNvbnN0IFF1ZXVlTm9kZSYgb3BlcmF0b3IgPSAoY29uc3QgUXVldWVOb2RlJik7Ci0gIFF1ZXVlTm9kZShjb25zdCBRdWV1ZU5vZGUmKTsKLQotICBFIGVsZW1lbnRfOwotICBRdWV1ZU5vZGUqIG5leHRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEU+ICAvLyBFIGlzIHRoZSBlbGVtZW50IHR5cGUuCi1jbGFzcyBRdWV1ZSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGVzIGFuIGVtcHR5IHF1ZXVlLgotICBRdWV1ZSgpIDogaGVhZF8oTlVMTCksIGxhc3RfKE5VTEwpLCBzaXplXygwKSB7fQotCi0gIC8vIEQndG9yLiAgQ2xlYXJzIHRoZSBxdWV1ZS4KLSAgflF1ZXVlKCkgeyBDbGVhcigpOyB9Ci0KLSAgLy8gQ2xlYXJzIHRoZSBxdWV1ZS4KLSAgdm9pZCBDbGVhcigpIHsKLSAgICBpZiAoc2l6ZV8gPiAwKSB7Ci0gICAgICAvLyAxLiBEZWxldGVzIGV2ZXJ5IG5vZGUuCi0gICAgICBRdWV1ZU5vZGU8RT4qIG5vZGUgPSBoZWFkXzsKLSAgICAgIFF1ZXVlTm9kZTxFPiogbmV4dCA9IG5vZGUtPm5leHQoKTsKLSAgICAgIGZvciAoOyA7KSB7Ci0gICAgICAgIGRlbGV0ZSBub2RlOwotICAgICAgICBub2RlID0gbmV4dDsKLSAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBub2RlLT5uZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDIuIFJlc2V0cyB0aGUgbWVtYmVyIHZhcmlhYmxlcy4KLSAgICAgIGhlYWRfID0gbGFzdF8gPSBOVUxMOwotICAgICAgc2l6ZV8gPSAwOwotICAgIH0KLSAgfQotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KLSAgc2l6ZV90IFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotCi0gIC8vIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlLCBvciBOVUxMIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLSAgUXVldWVOb2RlPEU+KiBIZWFkKCkgeyByZXR1cm4gaGVhZF87IH0KLSAgY29uc3QgUXVldWVOb2RlPEU+KiBIZWFkKCkgY29uc3QgeyByZXR1cm4gaGVhZF87IH0KLQotICAvLyBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlLCBvciBOVUxMIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLSAgUXVldWVOb2RlPEU+KiBMYXN0KCkgeyByZXR1cm4gbGFzdF87IH0KLSAgY29uc3QgUXVldWVOb2RlPEU+KiBMYXN0KCkgY29uc3QgeyByZXR1cm4gbGFzdF87IH0KLQotICAvLyBBZGRzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuICBBIGNvcHkgb2YgdGhlIGVsZW1lbnQgaXMKLSAgLy8gY3JlYXRlZCB1c2luZyB0aGUgY29weSBjb25zdHJ1Y3RvciwgYW5kIHRoZW4gc3RvcmVkIGluIHRoZSBxdWV1ZS4KLSAgLy8gQ2hhbmdlcyBtYWRlIHRvIHRoZSBlbGVtZW50IGluIHRoZSBxdWV1ZSBkb2Vzbid0IGFmZmVjdCB0aGUgc291cmNlCi0gIC8vIG9iamVjdCwgYW5kIHZpY2UgdmVyc2EuCi0gIHZvaWQgRW5xdWV1ZShjb25zdCBFJiBlbGVtZW50KSB7Ci0gICAgUXVldWVOb2RlPEU+KiBuZXdfbm9kZSA9IG5ldyBRdWV1ZU5vZGU8RT4oZWxlbWVudCk7Ci0KLSAgICBpZiAoc2l6ZV8gPT0gMCkgewotICAgICAgaGVhZF8gPSBsYXN0XyA9IG5ld19ub2RlOwotICAgICAgc2l6ZV8gPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBsYXN0Xy0+bmV4dF8gPSBuZXdfbm9kZTsKLSAgICAgIGxhc3RfID0gbmV3X25vZGU7Ci0gICAgICBzaXplXysrOwotICAgIH0KLSAgfQotCi0gIC8vIFJlbW92ZXMgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCByZXR1cm5zIGl0LiAgUmV0dXJucyBOVUxMIGlmCi0gIC8vIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLSAgRSogRGVxdWV1ZSgpIHsKLSAgICBpZiAoc2l6ZV8gPT0gMCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgUXVldWVOb2RlPEU+KiBjb25zdCBvbGRfaGVhZCA9IGhlYWRfOwotICAgIGhlYWRfID0gaGVhZF8tPm5leHRfOwotICAgIHNpemVfLS07Ci0gICAgaWYgKHNpemVfID09IDApIHsKLSAgICAgIGxhc3RfID0gTlVMTDsKLSAgICB9Ci0KLSAgICBFKiBlbGVtZW50ID0gbmV3IEUob2xkX2hlYWQtPmVsZW1lbnQoKSk7Ci0gICAgZGVsZXRlIG9sZF9oZWFkOwotCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLQotICAvLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciBvbiBlYWNoIGVsZW1lbnQgb2YgdGhlIHF1ZXVlLCBhbmQKLSAgLy8gcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgbmV3IHF1ZXVlLiAgVGhlIG9yaWdpbmFsIHF1ZXVlIGlzIG5vdAotICAvLyBhZmZlY3RlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIFF1ZXVlKiBNYXAoRiBmdW5jdGlvbikgY29uc3QgewotICAgIFF1ZXVlKiBuZXdfcXVldWUgPSBuZXcgUXVldWUoKTsKLSAgICBmb3IgKGNvbnN0IFF1ZXVlTm9kZTxFPiogbm9kZSA9IGhlYWRfOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0XykgewotICAgICAgbmV3X3F1ZXVlLT5FbnF1ZXVlKGZ1bmN0aW9uKG5vZGUtPmVsZW1lbnQoKSkpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdfcXVldWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFF1ZXVlTm9kZTxFPiogaGVhZF87ICAvLyBUaGUgZmlyc3Qgbm9kZSBvZiB0aGUgcXVldWUuCi0gIFF1ZXVlTm9kZTxFPiogbGFzdF87ICAvLyBUaGUgbGFzdCBub2RlIG9mIHRoZSBxdWV1ZS4KLSAgc2l6ZV90IHNpemVfOyAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUuCi0KLSAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBhIHF1ZXVlLgotICBRdWV1ZShjb25zdCBRdWV1ZSYpOwotICBjb25zdCBRdWV1ZSYgb3BlcmF0b3IgPSAoY29uc3QgUXVldWUmKTsKLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfU0FNUExFU19TQU1QTEUzX0lOTF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzODc3ZC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotCi0vLyBJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSBhIG1vcmUgYWR2YW5jZWQgZmVhdHVyZSBvZiBHb29nbGUgVGVzdCBjYWxsZWQKLS8vIHRlc3QgZml4dHVyZS4KLS8vCi0vLyBBIHRlc3QgZml4dHVyZSBpcyBhIHBsYWNlIHRvIGhvbGQgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIHNoYXJlZCBieQotLy8gYWxsIHRlc3RzIGluIGEgdGVzdCBjYXNlLiAgVXNpbmcgYSB0ZXN0IGZpeHR1cmUgYXZvaWRzIGR1cGxpY2F0aW5nCi0vLyB0aGUgdGVzdCBjb2RlIG5lY2Vzc2FyeSB0byBpbml0aWFsaXplIGFuZCBjbGVhbnVwIHRob3NlIGNvbW1vbgotLy8gb2JqZWN0cyBmb3IgZWFjaCB0ZXN0LiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGRlZmluaW5nIHN1Yi1yb3V0aW5lcwotLy8gdGhhdCB5b3VyIHRlc3RzIG5lZWQgdG8gaW52b2tlIGEgbG90LgotLy8KLS8vIDxUZWNobmljYWxEZXRhaWxzPgotLy8KLS8vIFRoZSB0ZXN0cyBzaGFyZSB0aGUgdGVzdCBmaXh0dXJlIGluIHRoZSBzZW5zZSBvZiBjb2RlIHNoYXJpbmcsIG5vdAotLy8gZGF0YSBzaGFyaW5nLiAgRWFjaCB0ZXN0IGlzIGdpdmVuIGl0cyBvd24gZnJlc2ggY29weSBvZiB0aGUKLS8vIGZpeHR1cmUuICBZb3UgY2Fubm90IGV4cGVjdCB0aGUgZGF0YSBtb2RpZmllZCBieSBvbmUgdGVzdCB0byBiZQotLy8gcGFzc2VkIG9uIHRvIGFub3RoZXIgdGVzdCwgd2hpY2ggaXMgYSBiYWQgaWRlYS4KLS8vCi0vLyBUaGUgcmVhc29uIGZvciB0aGlzIGRlc2lnbiBpcyB0aGF0IHRlc3RzIHNob3VsZCBiZSBpbmRlcGVuZGVudCBhbmQKLS8vIHJlcGVhdGFibGUuICBJbiBwYXJ0aWN1bGFyLCBhIHRlc3Qgc2hvdWxkIG5vdCBmYWlsIGFzIHRoZSByZXN1bHQgb2YKLS8vIGFub3RoZXIgdGVzdCdzIGZhaWx1cmUuICBJZiBvbmUgdGVzdCBkZXBlbmRzIG9uIGluZm8gcHJvZHVjZWQgYnkKLS8vIGFub3RoZXIgdGVzdCwgdGhlbiB0aGUgdHdvIHRlc3RzIHNob3VsZCByZWFsbHkgYmUgb25lIGJpZyB0ZXN0LgotLy8KLS8vIFRoZSBtYWNyb3MgZm9yIGluZGljYXRpbmcgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBvZiBhIHRlc3QKLS8vIChFWFBFQ1RfVFJVRSwgRkFJTCwgZXRjKSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgY3VycmVudCB0ZXN0IGlzCi0vLyAod2hlbiBHb29nbGUgVGVzdCBwcmludHMgdGhlIHRlc3QgcmVzdWx0LCBpdCB0ZWxscyB5b3Ugd2hpY2ggdGVzdAotLy8gZWFjaCBmYWlsdXJlIGJlbG9uZ3MgdG8pLiAgVGVjaG5pY2FsbHksIHRoZXNlIG1hY3JvcyBpbnZva2UgYQotLy8gbWVtYmVyIGZ1bmN0aW9uIG9mIHRoZSBUZXN0IGNsYXNzLiAgVGhlcmVmb3JlLCB5b3UgY2Fubm90IHVzZSB0aGVtCi0vLyBpbiBhIGdsb2JhbCBmdW5jdGlvbi4gIFRoYXQncyB3aHkgeW91IHNob3VsZCBwdXQgdGVzdCBzdWItcm91dGluZXMKLS8vIGluIGEgdGVzdCBmaXh0dXJlLgotLy8KLS8vIDwvVGVjaG5pY2FsRGV0YWlscz4KLQotI2luY2x1ZGUgInNhbXBsZTMtaW5sLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVG8gdXNlIGEgdGVzdCBmaXh0dXJlLCBkZXJpdmUgYSBjbGFzcyBmcm9tIHRlc3Rpbmc6OlRlc3QuCi1jbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOiAgLy8gWW91IHNob3VsZCBtYWtlIHRoZSBtZW1iZXJzIHByb3RlY3RlZCBzLnQuIHRoZXkgY2FuIGJlCi0gICAgICAgICAgICAgLy8gYWNjZXNzZWQgZnJvbSBzdWItY2xhc3Nlcy4KLQotICAvLyB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IGlzIHJ1bi4gIFlvdQotICAvLyBzaG91bGQgZGVmaW5lIGl0IGlmIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIHZhcmFpYmxlcy4KLSAgLy8gT3RoZXJ3aXNlLCB0aGlzIGNhbiBiZSBza2lwcGVkLgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgcTFfLkVucXVldWUoMSk7Ci0gICAgcTJfLkVucXVldWUoMik7Ci0gICAgcTJfLkVucXVldWUoMyk7Ci0gIH0KLQotICAvLyB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB3aWxsIGJlIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QgaXMgcnVuLgotICAvLyBZb3Ugc2hvdWxkIGRlZmluZSBpdCBpZiB0aGVyZSBpcyBjbGVhbnVwIHdvcmsgdG8gZG8uICBPdGhlcndpc2UsCi0gIC8vIHlvdSBkb24ndCBoYXZlIHRvIHByb3ZpZGUgaXQuCi0gIC8vCi0gIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgLy8gfQotCi0gIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgc29tZSB0ZXN0IHVzZXMuCi0gIHN0YXRpYyBpbnQgRG91YmxlKGludCBuKSB7Ci0gICAgcmV0dXJuIDIqbjsKLSAgfQotCi0gIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIFF1ZXVlOjpNYXAoKS4KLSAgdm9pZCBNYXBUZXN0ZXIoY29uc3QgUXVldWU8aW50PiAqIHEpIHsKLSAgICAvLyBDcmVhdGVzIGEgbmV3IHF1ZXVlLCB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgdHdpY2UgYXMgYmlnIGFzIHRoZQotICAgIC8vIGNvcnJlc3BvbmRpbmcgb25lIGluIHEuCi0gICAgY29uc3QgUXVldWU8aW50PiAqIGNvbnN0IG5ld19xID0gcS0+TWFwKERvdWJsZSk7Ci0KLSAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBuZXcgcXVldWUgaGFzIHRoZSBzYW1lIHNpemUgYXMgcS4KLSAgICBBU1NFUlRfRVEocS0+U2l6ZSgpLCBuZXdfcS0+U2l6ZSgpKTsKLQotICAgIC8vIFZlcmlmaWVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZWxlbWVudHMgb2YgdGhlIHR3byBxdWV1ZXMuCi0gICAgZm9yICggY29uc3QgUXVldWVOb2RlPGludD4gKiBuMSA9IHEtPkhlYWQoKSwgKiBuMiA9IG5ld19xLT5IZWFkKCk7Ci0gICAgICAgICAgbjEgIT0gTlVMTDsgbjEgPSBuMS0+bmV4dCgpLCBuMiA9IG4yLT5uZXh0KCkgKSB7Ci0gICAgICBFWFBFQ1RfRVEoMiAqIG4xLT5lbGVtZW50KCksIG4yLT5lbGVtZW50KCkpOwotICAgIH0KLQotICAgIGRlbGV0ZSBuZXdfcTsKLSAgfQotCi0gIC8vIERlY2xhcmVzIHRoZSB2YXJpYWJsZXMgeW91ciB0ZXN0cyB3YW50IHRvIHVzZS4KLSAgUXVldWU8aW50PiBxMF87Ci0gIFF1ZXVlPGludD4gcTFfOwotICBRdWV1ZTxpbnQ+IHEyXzsKLX07Ci0KLS8vIFdoZW4geW91IGhhdmUgYSB0ZXN0IGZpeHR1cmUsIHlvdSBkZWZpbmUgYSB0ZXN0IHVzaW5nIFRFU1RfRgotLy8gaW5zdGVhZCBvZiBURVNULgotCi0vLyBUZXN0cyB0aGUgZGVmYXVsdCBjJ3Rvci4KLVRFU1RfRihRdWV1ZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgewotICAvLyBZb3UgY2FuIGFjY2VzcyBkYXRhIGluIHRoZSB0ZXN0IGZpeHR1cmUgaGVyZS4KLSAgRVhQRUNUX0VRKDB1LCBxMF8uU2l6ZSgpKTsKLX0KLQotLy8gVGVzdHMgRGVxdWV1ZSgpLgotVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZSkgewotICBpbnQgKiBuID0gcTBfLkRlcXVldWUoKTsKLSAgRVhQRUNUX1RSVUUobiA9PSBOVUxMKTsKLQotICBuID0gcTFfLkRlcXVldWUoKTsKLSAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKDEsICpuKTsKLSAgRVhQRUNUX0VRKDB1LCBxMV8uU2l6ZSgpKTsKLSAgZGVsZXRlIG47Ci0KLSAgbiA9IHEyXy5EZXF1ZXVlKCk7Ci0gIEFTU0VSVF9UUlVFKG4gIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgyLCAqbik7Ci0gIEVYUEVDVF9FUSgxdSwgcTJfLlNpemUoKSk7Ci0gIGRlbGV0ZSBuOwotfQotCi0vLyBUZXN0cyB0aGUgUXVldWU6Ok1hcCgpIGZ1bmN0aW9uLgotVEVTVF9GKFF1ZXVlVGVzdCwgTWFwKSB7Ci0gIE1hcFRlc3RlcigmcTBfKTsKLSAgTWFwVGVzdGVyKCZxMV8pOwotICBNYXBUZXN0ZXIoJnEyXyk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNC5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQ0YmRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAic2FtcGxlNC5oIgotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUsIGFuZCBpbmNyZW1lbnRzIGl0LgotaW50IENvdW50ZXI6OkluY3JlbWVudCgpIHsKLSAgcmV0dXJuIGNvdW50ZXJfKys7Ci19Ci0KLS8vIFByaW50cyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlIHRvIFNURE9VVC4KLXZvaWQgQ291bnRlcjo6UHJpbnQoKSBjb25zdCB7Ci0gIHByaW50ZigiJWQiLCBjb3VudGVyXyk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNC5oIGIvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2MGYwZC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpZm5kZWYgR1RFU1RfU0FNUExFU19TQU1QTEU0X0hfCi0jZGVmaW5lIEdURVNUX1NBTVBMRVNfU0FNUExFNF9IXwotCi0vLyBBIHNpbXBsZSBtb25vdG9uaWMgY291bnRlci4KLWNsYXNzIENvdW50ZXIgewotIHByaXZhdGU6Ci0gIGludCBjb3VudGVyXzsKLQotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIGNvdW50ZXIgdGhhdCBzdGFydHMgYXQgMC4KLSAgQ291bnRlcigpIDogY291bnRlcl8oMCkge30KLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUsIGFuZCBpbmNyZW1lbnRzIGl0LgotICBpbnQgSW5jcmVtZW50KCk7Ci0KLSAgLy8gUHJpbnRzIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgdG8gU1RET1VULgotICB2b2lkIFByaW50KCkgY29uc3Q7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFNF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1YWZjNy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInNhbXBsZTQuaCIKLQotLy8gVGVzdHMgdGhlIEluY3JlbWVudCgpIG1ldGhvZC4KLVRFU1QoQ291bnRlciwgSW5jcmVtZW50KSB7Ci0gIENvdW50ZXIgYzsKLQotICAvLyBFWFBFQ1RfRVEoKSBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UsIHNvIHRoZXkKLSAgLy8gY2FuIGhhdmUgc2lkZSBlZmZlY3RzLgotCi0gIEVYUEVDVF9FUSgwLCBjLkluY3JlbWVudCgpKTsKLSAgRVhQRUNUX0VRKDEsIGMuSW5jcmVtZW50KCkpOwotICBFWFBFQ1RfRVEoMiwgYy5JbmNyZW1lbnQoKSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q4ZTU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFRoaXMgc2FtcGxlIHRlYWNoZXMgaG93IHRvIHJldXNlIGEgdGVzdCBmaXh0dXJlIGluIG11bHRpcGxlIHRlc3QKLS8vIGNhc2VzIGJ5IGRlcml2aW5nIHN1Yi1maXh0dXJlcyBmcm9tIGl0LgotLy8KLS8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgZml4dHVyZSwgeW91IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHRlc3QKLS8vIGNhc2UgdGhhdCB3aWxsIHVzZSB0aGlzIGZpeHR1cmUuICBUaGVyZWZvcmUsIGEgdGVzdCBmaXh0dXJlIGNhbgotLy8gYmUgdXNlZCBieSBvbmx5IG9uZSB0ZXN0IGNhc2UuCi0vLwotLy8gU29tZXRpbWVzLCBtb3JlIHRoYW4gb25lIHRlc3QgY2FzZXMgbWF5IHdhbnQgdG8gdXNlIHRoZSBzYW1lIG9yCi0vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlcy4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQgdG8KLS8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0ZXN0cyBmb3IgYSBHVUkgbGlicmFyeSBkb24ndCBsZWFrIGltcG9ydGFudAotLy8gc3lzdGVtIHJlc291cmNlcyBsaWtlIGZvbnRzIGFuZCBicnVzaGVzLiAgSW4gR29vZ2xlIFRlc3QsIHlvdSBkbwotLy8gdGhpcyBieSBwdXR0aW5nIHRoZSBzaGFyZWQgbG9naWMgaW4gYSBzdXBlciAoYXMgaW4gInN1cGVyIGNsYXNzIikKLS8vIHRlc3QgZml4dHVyZSwgYW5kIHRoZW4gaGF2ZSBlYWNoIHRlc3QgY2FzZSB1c2UgYSBmaXh0dXJlIGRlcml2ZWQKLS8vIGZyb20gdGhpcyBzdXBlciBmaXh0dXJlLgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgInNhbXBsZTMtaW5sLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJzYW1wbGUxLmgiCi0KLS8vIEluIHRoaXMgc2FtcGxlLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IHRlc3QgZmluaXNoZXMgd2l0aGluCi0vLyB+NSBzZWNvbmRzLiAgSWYgYSB0ZXN0IHRha2VzIGxvbmdlciB0byBydW4sIHdlIGNvbnNpZGVyIGl0IGEKLS8vIGZhaWx1cmUuCi0vLwotLy8gV2UgcHV0IHRoZSBjb2RlIGZvciB0aW1pbmcgYSB0ZXN0IGluIGEgdGVzdCBmaXh0dXJlIGNhbGxlZAotLy8gIlF1aWNrVGVzdCIuICBRdWlja1Rlc3QgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIHN1cGVyIGZpeHR1cmUgdGhhdAotLy8gb3RoZXIgZml4dHVyZXMgZGVyaXZlIGZyb20sIHRoZXJlZm9yZSB0aGVyZSBpcyBubyB0ZXN0IGNhc2Ugd2l0aAotLy8gdGhlIG5hbWUgIlF1aWNrVGVzdCIuICBUaGlzIGlzIE9LLgotLy8KLS8vIExhdGVyLCB3ZSB3aWxsIGRlcml2ZSBtdWx0aXBsZSB0ZXN0IGZpeHR1cmVzIGZyb20gUXVpY2tUZXN0LgotY2xhc3MgUXVpY2tUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gUmVtZW1iZXIgdGhhdCBTZXRVcCgpIGlzIHJ1biBpbW1lZGlhdGVseSBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KLSAgLy8gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gcmVjb3JkIHRoZSBzdGFydCB0aW1lLgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgc3RhcnRfdGltZV8gPSB0aW1lKE5VTEwpOwotICB9Ci0KLSAgLy8gVGVhckRvd24oKSBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIGEgdGVzdCBmaW5pc2hlcy4gIEhlcmUgd2UKLSAgLy8gY2hlY2sgaWYgdGhlIHRlc3Qgd2FzIHRvbyBzbG93LgotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgLy8gR2V0cyB0aGUgdGltZSB3aGVuIHRoZSB0ZXN0IGZpbmlzaGVzCi0gICAgY29uc3QgdGltZV90IGVuZF90aW1lID0gdGltZShOVUxMKTsKLQotICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgdGVzdCB0b29rIG5vIG1vcmUgdGhhbiB+NSBzZWNvbmRzLiAgRGlkIHlvdQotICAgIC8vIGtub3cgdGhhdCB5b3UgY2FuIHVzZSBhc3NlcnRpb25zIGluIFNldFVwKCkgYW5kIFRlYXJEb3duKCkgYXMKLSAgICAvLyB3ZWxsPwotICAgIEVYUEVDVF9UUlVFKGVuZF90aW1lIC0gc3RhcnRfdGltZV8gPD0gNSkgPDwgIlRoZSB0ZXN0IHRvb2sgdG9vIGxvbmcuIjsKLSAgfQotCi0gIC8vIFRoZSBVVEMgdGltZSAoaW4gc2Vjb25kcykgd2hlbiB0aGUgdGVzdCBzdGFydHMKLSAgdGltZV90IHN0YXJ0X3RpbWVfOwotfTsKLQotCi0vLyBXZSBkZXJpdmUgYSBmaXh0dXJlIG5hbWVkIEludGVnZXJGdW5jdGlvblRlc3QgZnJvbSB0aGUgUXVpY2tUZXN0Ci0vLyBmaXh0dXJlLiAgQWxsIHRlc3RzIHVzaW5nIHRoaXMgZml4dHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLS8vIHJlcXVpcmVkIHRvIGJlIHF1aWNrLgotY2xhc3MgSW50ZWdlckZ1bmN0aW9uVGVzdCA6IHB1YmxpYyBRdWlja1Rlc3QgewotICAvLyBXZSBkb24ndCBuZWVkIGFueSBtb3JlIGxvZ2ljIHRoYW4gYWxyZWFkeSBpbiB0aGUgUXVpY2tUZXN0IGZpeHR1cmUuCi0gIC8vIFRoZXJlZm9yZSB0aGUgYm9keSBpcyBlbXB0eS4KLX07Ci0KLQotLy8gTm93IHdlIGNhbiB3cml0ZSB0ZXN0cyBpbiB0aGUgSW50ZWdlckZ1bmN0aW9uVGVzdCB0ZXN0IGNhc2UuCi0KLS8vIFRlc3RzIEZhY3RvcmlhbCgpCi1URVNUX0YoSW50ZWdlckZ1bmN0aW9uVGVzdCwgRmFjdG9yaWFsKSB7Ci0gIC8vIFRlc3RzIGZhY3RvcmlhbCBvZiBuZWdhdGl2ZSBudW1iZXJzLgotICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC01KSk7Ci0gIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTEpKTsKLSAgRVhQRUNUX0dUKEZhY3RvcmlhbCgtMTApLCAwKTsKLQotICAvLyBUZXN0cyBmYWN0b3JpYWwgb2YgMC4KLSAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgwKSk7Ci0KLSAgLy8gVGVzdHMgZmFjdG9yaWFsIG9mIHBvc2l0aXZlIG51bWJlcnMuCi0gIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMSkpOwotICBFWFBFQ1RfRVEoMiwgRmFjdG9yaWFsKDIpKTsKLSAgRVhQRUNUX0VRKDYsIEZhY3RvcmlhbCgzKSk7Ci0gIEVYUEVDVF9FUSg0MDMyMCwgRmFjdG9yaWFsKDgpKTsKLX0KLQotCi0vLyBUZXN0cyBJc1ByaW1lKCkKLVRFU1RfRihJbnRlZ2VyRnVuY3Rpb25UZXN0LCBJc1ByaW1lKSB7Ci0gIC8vIFRlc3RzIG5lZ2F0aXZlIGlucHV0LgotICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgtMSkpOwotICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgtMikpOwotICBFWFBFQ1RfRkFMU0UoSXNQcmltZShJTlRfTUlOKSk7Ci0KLSAgLy8gVGVzdHMgc29tZSB0cml2aWFsIGNhc2VzLgotICBFWFBFQ1RfRkFMU0UoSXNQcmltZSgwKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ByaW1lKDEpKTsKLSAgRVhQRUNUX1RSVUUoSXNQcmltZSgyKSk7Ci0gIEVYUEVDVF9UUlVFKElzUHJpbWUoMykpOwotCi0gIC8vIFRlc3RzIHBvc2l0aXZlIGlucHV0LgotICBFWFBFQ1RfRkFMU0UoSXNQcmltZSg0KSk7Ci0gIEVYUEVDVF9UUlVFKElzUHJpbWUoNSkpOwotICBFWFBFQ1RfRkFMU0UoSXNQcmltZSg2KSk7Ci0gIEVYUEVDVF9UUlVFKElzUHJpbWUoMjMpKTsKLX0KLQotCi0vLyBUaGUgbmV4dCB0ZXN0IGNhc2UgKG5hbWVkICJRdWV1ZVRlc3QiKSBhbHNvIG5lZWRzIHRvIGJlIHF1aWNrLCBzbwotLy8gd2UgZGVyaXZlIGFub3RoZXIgZml4dHVyZSBmcm9tIFF1aWNrVGVzdC4KLS8vCi0vLyBUaGUgUXVldWVUZXN0IHRlc3QgZml4dHVyZSBoYXMgc29tZSBsb2dpYyBhbmQgc2hhcmVkIG9iamVjdHMgaW4KLS8vIGFkZGl0aW9uIHRvIHdoYXQncyBpbiBRdWlja1Rlc3QgYWxyZWFkeS4gIFdlIGRlZmluZSB0aGUgYWRkaXRpb25hbAotLy8gc3R1ZmYgaW5zaWRlIHRoZSBib2R5IG9mIHRoZSB0ZXN0IGZpeHR1cmUsIGFzIHVzdWFsLgotY2xhc3MgUXVldWVUZXN0IDogcHVibGljIFF1aWNrVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBzdXBlciBmaXh0dXJlIChRdWlja1Rlc3QpLgotICAgIFF1aWNrVGVzdDo6U2V0VXAoKTsKLQotICAgIC8vIFNlY29uZCwgc29tZSBhZGRpdGlvbmFsIHNldHVwIGZvciB0aGlzIGZpeHR1cmUuCi0gICAgcTFfLkVucXVldWUoMSk7Ci0gICAgcTJfLkVucXVldWUoMik7Ci0gICAgcTJfLkVucXVldWUoMyk7Ci0gIH0KLQotICAvLyBCeSBkZWZhdWx0LCBUZWFyRG93bigpIGluaGVyaXRzIHRoZSBiZWhhdmlvciBvZgotICAvLyBRdWlja1Rlc3Q6OlRlYXJEb3duKCkuICBBcyB3ZSBoYXZlIG5vIGFkZGl0aW9uYWwgY2xlYW5pbmcgd29yawotICAvLyBmb3IgUXVldWVUZXN0LCB3ZSBvbWl0IGl0IGhlcmUuCi0gIC8vCi0gIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgLy8gICBRdWlja1Rlc3Q6OlRlYXJEb3duKCk7Ci0gIC8vIH0KLQotICBRdWV1ZTxpbnQ+IHEwXzsKLSAgUXVldWU8aW50PiBxMV87Ci0gIFF1ZXVlPGludD4gcTJfOwotfTsKLQotCi0vLyBOb3csIGxldCdzIHdyaXRlIHRlc3RzIHVzaW5nIHRoZSBRdWV1ZVRlc3QgZml4dHVyZS4KLQotLy8gVGVzdHMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi1URVNUX0YoUXVldWVUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgRVhQRUNUX0VRKDB1LCBxMF8uU2l6ZSgpKTsKLX0KLQotLy8gVGVzdHMgRGVxdWV1ZSgpLgotVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZSkgewotICBpbnQqIG4gPSBxMF8uRGVxdWV1ZSgpOwotICBFWFBFQ1RfVFJVRShuID09IE5VTEwpOwotCi0gIG4gPSBxMV8uRGVxdWV1ZSgpOwotICBFWFBFQ1RfVFJVRShuICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoMSwgKm4pOwotICBFWFBFQ1RfRVEoMHUsIHExXy5TaXplKCkpOwotICBkZWxldGUgbjsKLQotICBuID0gcTJfLkRlcXVldWUoKTsKLSAgRVhQRUNUX1RSVUUobiAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKDIsICpuKTsKLSAgRVhQRUNUX0VRKDF1LCBxMl8uU2l6ZSgpKTsKLSAgZGVsZXRlIG47Ci19Ci0KLS8vIElmIG5lY2Vzc2FyeSwgeW91IGNhbiBkZXJpdmUgZnVydGhlciB0ZXN0IGZpeHR1cmVzIGZyb20gYSBkZXJpdmVkCi0vLyBmaXh0dXJlIGl0c2VsZi4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRlcml2ZSBhbm90aGVyIGZpeHR1cmUgZnJvbQotLy8gUXVldWVUZXN0LiAgR29vZ2xlIFRlc3QgaW1wb3NlcyBubyBsaW1pdCBvbiBob3cgZGVlcCB0aGUgaGllcmFyY2h5Ci0vLyBjYW4gYmUuICBJbiBwcmFjdGljZSwgaG93ZXZlciwgeW91IHByb2JhYmx5IGRvbid0IHdhbnQgaXQgdG8gYmUgdG9vCi0vLyBkZWVwIGFzIHRvIGJlIGNvbmZ1c2luZy4KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjAzNmEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdGVzdCBjb21tb24gcHJvcGVydGllcyBvZiBtdWx0aXBsZQotLy8gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIGludGVyZmFjZSAoYWthIGludGVyZmFjZSB0ZXN0cykuCi0KLS8vIFRoZSBpbnRlcmZhY2UgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoaXMgaGVhZGVyLgotI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gRmlyc3QsIHdlIGRlZmluZSBzb21lIGZhY3RvcnkgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YKLS8vIHRoZSBpbXBsZW1lbnRhdGlvbnMuICBZb3UgbWF5IGJlIGFibGUgdG8gc2tpcCB0aGlzIHN0ZXAgaWYgYWxsIHlvdXIKLS8vIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgY29uc3RydWN0ZWQgdGhlIHNhbWUgd2F5LgotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLVByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGUoKTsKLQotdGVtcGxhdGUgPD4KLVByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGU8T25UaGVGbHlQcmltZVRhYmxlPigpIHsKLSAgcmV0dXJuIG5ldyBPblRoZUZseVByaW1lVGFibGU7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1QcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlPFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlPigpIHsKLSAgcmV0dXJuIG5ldyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSgxMDAwMCk7Ci19Ci0KLS8vIFRoZW4gd2UgZGVmaW5lIGEgdGVzdCBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLgotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIFRoZSBjdG9yIGNhbGxzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHByaW1lIHRhYmxlCi0gIC8vIGltcGxlbWVudGVkIGJ5IFQuCi0gIFByaW1lVGFibGVUZXN0KCkgOiB0YWJsZV8oQ3JlYXRlUHJpbWVUYWJsZTxUPigpKSB7fQotCi0gIHZpcnR1YWwgflByaW1lVGFibGVUZXN0KCkgeyBkZWxldGUgdGFibGVfOyB9Ci0KLSAgLy8gTm90ZSB0aGF0IHdlIHRlc3QgYW4gaW1wbGVtZW50YXRpb24gdmlhIHRoZSBiYXNlIGludGVyZmFjZQotICAvLyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gY2xhc3MuICBUaGlzIGlzIGltcG9ydGFudAotICAvLyBmb3Iga2VlcGluZyB0aGUgdGVzdHMgY2xvc2UgdG8gdGhlIHJlYWwgd29ybGQgc2NlbmFyaW8sIHdoZXJlIHRoZQotICAvLyBpbXBsZW1lbnRhdGlvbiBpcyBpbnZva2VkIHZpYSB0aGUgYmFzZSBpbnRlcmZhY2UuICBJdCBhdm9pZHMKLSAgLy8gZ290LXlhcyB3aGVyZSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaGFzIGEgbWV0aG9kIHRoYXQgc2hhZG93cwotICAvLyBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgKGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQgYXJndW1lbnQKLSAgLy8gdHlwZXMpIGluIHRoZSBiYXNlIGludGVyZmFjZSwgZm9yIGV4YW1wbGUuCi0gIFByaW1lVGFibGUqIGNvbnN0IHRhYmxlXzsKLX07Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi11c2luZyB0ZXN0aW5nOjpUeXBlczsKLQotLy8gR29vZ2xlIFRlc3Qgb2ZmZXJzIHR3byB3YXlzIGZvciByZXVzaW5nIHRlc3RzIGZvciBkaWZmZXJlbnQgdHlwZXMuCi0vLyBUaGUgZmlyc3QgaXMgY2FsbGVkICJ0eXBlZCB0ZXN0cyIuICBZb3Ugc2hvdWxkIHVzZSBpdCBpZiB5b3UKLS8vIGFscmVhZHkga25vdyAqYWxsKiB0aGUgdHlwZXMgeW91IGFyZSBnb25uYSBleGVyY2lzZSB3aGVuIHlvdSB3cml0ZQotLy8gdGhlIHRlc3RzLgotCi0vLyBUbyB3cml0ZSBhIHR5cGVkIHRlc3QgY2FzZSwgZmlyc3QgdXNlCi0vLwotLy8gICBUWVBFRF9URVNUX0NBU0UoVGVzdENhc2VOYW1lLCBUeXBlTGlzdCk7Ci0vLwotLy8gdG8gZGVjbGFyZSBpdCBhbmQgc3BlY2lmeSB0aGUgdHlwZSBwYXJhbWV0ZXJzLiAgQXMgd2l0aCBURVNUX0YsCi0vLyBUZXN0Q2FzZU5hbWUgbXVzdCBtYXRjaCB0aGUgdGVzdCBmaXh0dXJlIG5hbWUuCi0KLS8vIFRoZSBsaXN0IG9mIHR5cGVzIHdlIHdhbnQgdG8gdGVzdC4KLXR5cGVkZWYgVHlwZXM8T25UaGVGbHlQcmltZVRhYmxlLCBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZT4gSW1wbGVtZW50YXRpb25zOwotCi1UWVBFRF9URVNUX0NBU0UoUHJpbWVUYWJsZVRlc3QsIEltcGxlbWVudGF0aW9ucyk7Ci0KLS8vIFRoZW4gdXNlIFRZUEVEX1RFU1QoVGVzdENhc2VOYW1lLCBUZXN0TmFtZSkgdG8gZGVmaW5lIGEgdHlwZWQgdGVzdCwKLS8vIHNpbWlsYXIgdG8gVEVTVF9GLgotVFlQRURfVEVTVChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7Ci0gIC8vIEluc2lkZSB0aGUgdGVzdCBib2R5LCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB0eXBlIHBhcmFtZXRlciBieQotICAvLyBUeXBlUGFyYW0sIGFuZCByZWZlciB0byB0aGUgZml4dHVyZSBjbGFzcyBieSBUZXN0Rml4dHVyZS4gIFdlCi0gIC8vIGRvbid0IG5lZWQgdGhlbSBpbiB0aGlzIGV4YW1wbGUuCi0KLSAgLy8gU2luY2Ugd2UgYXJlIGluIHRoZSB0ZW1wbGF0ZSB3b3JsZCwgQysrIHJlcXVpcmVzIGV4cGxpY2l0bHkKLSAgLy8gd3JpdGluZyAndGhpcy0+JyB3aGVuIHJlZmVycmluZyB0byBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzLgotICAvLyBUaGlzIGlzIHNvbWV0aGluZyB5b3UgaGF2ZSB0byBsZWFybiB0byBsaXZlIHdpdGguCi0gIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoLTUpKTsKLSAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgwKSk7Ci0gIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMSkpOwotICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDQpKTsKLSAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg2KSk7Ci0gIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTAwKSk7Ci19Ci0KLVRZUEVEX1RFU1QoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgyKSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgzKSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg1KSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg3KSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMSkpOwotICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTMxKSk7Ci19Ci0KLVRZUEVEX1RFU1QoUHJpbWVUYWJsZVRlc3QsIENhbkdldE5leHRQcmltZSkgewotICBFWFBFQ1RfRVEoMiwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOwotICBFWFBFQ1RfRVEoMywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMikpOwotICBFWFBFQ1RfRVEoNSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMykpOwotICBFWFBFQ1RfRVEoNywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOwotICBFWFBFQ1RfRVEoMTEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKLSAgRVhQRUNUX0VRKDEzMSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Ci19Ci0KLS8vIFRoYXQncyBpdCEgIEdvb2dsZSBUZXN0IHdpbGwgcmVwZWF0IGVhY2ggVFlQRURfVEVTVCBmb3IgZWFjaCB0eXBlCi0vLyBpbiB0aGUgdHlwZSBsaXN0IHNwZWNpZmllZCBpbiBUWVBFRF9URVNUX0NBU0UuICBTaXQgYmFjayBhbmQgYmUKLS8vIGhhcHB5IHRoYXQgeW91IGRvbid0IGhhdmUgdG8gZGVmaW5lIHRoZW0gbXVsdGlwbGUgdGltZXMuCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotdXNpbmcgdGVzdGluZzo6VHlwZXM7Ci0KLS8vIFNvbWV0aW1lcywgaG93ZXZlciwgeW91IGRvbid0IHlldCBrbm93IGFsbCB0aGUgdHlwZXMgdGhhdCB5b3Ugd2FudAotLy8gdG8gdGVzdCB3aGVuIHlvdSB3cml0ZSB0aGUgdGVzdHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB0aGUKLS8vIGF1dGhvciBvZiBhbiBpbnRlcmZhY2UgYW5kIGV4cGVjdCBvdGhlciBwZW9wbGUgdG8gaW1wbGVtZW50IGl0LCB5b3UKLS8vIG1pZ2h0IHdhbnQgdG8gd3JpdGUgYSBzZXQgb2YgdGVzdHMgdG8gbWFrZSBzdXJlIGVhY2ggaW1wbGVtZW50YXRpb24KLS8vIGNvbmZvcm1zIHRvIHNvbWUgYmFzaWMgcmVxdWlyZW1lbnRzLCBidXQgeW91IGRvbid0IGtub3cgd2hhdAotLy8gaW1wbGVtZW50YXRpb25zIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgZnV0dXJlLgotLy8KLS8vIEhvdyBjYW4geW91IHdyaXRlIHRoZSB0ZXN0cyB3aXRob3V0IGNvbW1pdHRpbmcgdG8gdGhlIHR5cGUKLS8vIHBhcmFtZXRlcnM/ICBUaGF0J3Mgd2hhdCAidHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIiBjYW4gZG8gZm9yIHlvdS4KLS8vIEl0IGlzIGEgYml0IG1vcmUgaW52b2x2ZWQgdGhhbiB0eXBlZCB0ZXN0cywgYnV0IGluIHJldHVybiB5b3UgZ2V0IGEKLS8vIHRlc3QgcGF0dGVybiB0aGF0IGNhbiBiZSByZXVzZWQgaW4gbWFueSBjb250ZXh0cywgd2hpY2ggaXMgYSBiaWcKLS8vIHdpbi4gIEhlcmUncyBob3cgeW91IGRvIGl0OgotCi0vLyBGaXJzdCwgZGVmaW5lIGEgdGVzdCBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSGVyZSB3ZSBqdXN0IHJldXNlCi0vLyB0aGUgUHJpbWVUYWJsZVRlc3QgZml4dHVyZSBkZWZpbmVkIGVhcmxpZXI6Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgUHJpbWVUYWJsZVRlc3QyIDogcHVibGljIFByaW1lVGFibGVUZXN0PFQ+IHsKLX07Ci0KLS8vIFRoZW4sIGRlY2xhcmUgdGhlIHRlc3QgY2FzZS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdAotLy8gZml4dHVyZSwgYW5kIGFsc28gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSAoYXMgdXN1YWwpLiAgVGhlIF9QCi0vLyBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIuCi1UWVBFRF9URVNUX0NBU0VfUChQcmltZVRhYmxlVGVzdDIpOwotCi0vLyBOZXh0LCB1c2UgVFlQRURfVEVTVF9QKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIHRvIGRlZmluZSBhIHRlc3QsCi0vLyBzaW1pbGFyIHRvIHdoYXQgeW91IGRvIHdpdGggVEVTVF9GLgotVFlQRURfVEVTVF9QKFByaW1lVGFibGVUZXN0MiwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7Ci0gIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoLTUpKTsKLSAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgwKSk7Ci0gIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMSkpOwotICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDQpKTsKLSAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg2KSk7Ci0gIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTAwKSk7Ci19Ci0KLVRZUEVEX1RFU1RfUChQcmltZVRhYmxlVGVzdDIsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgyKSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgzKSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg1KSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg3KSk7Ci0gIEVYUEVDVF9UUlVFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSgxMSkpOwotICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTMxKSk7Ci19Ci0KLVRZUEVEX1RFU1RfUChQcmltZVRhYmxlVGVzdDIsIENhbkdldE5leHRQcmltZSkgewotICBFWFBFQ1RfRVEoMiwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOwotICBFWFBFQ1RfRVEoMywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMikpOwotICBFWFBFQ1RfRVEoNSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMykpOwotICBFWFBFQ1RfRVEoNywgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOwotICBFWFBFQ1RfRVEoMTEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKLSAgRVhQRUNUX0VRKDEzMSwgdGhpcy0+dGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Ci19Ci0KLS8vIFR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbnZvbHZlIG9uZSBleHRyYSBzdGVwOiB5b3UgaGF2ZSB0bwotLy8gZW51bWVyYXRlIHRoZSB0ZXN0cyB5b3UgZGVmaW5lZDoKLVJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKAotICAgIFByaW1lVGFibGVUZXN0MiwgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGVzdCBjYXNlIG5hbWUuCi0gICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgdGhlIHRlc3QgbmFtZXMuCi0gICAgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzLCBSZXR1cm5zVHJ1ZUZvclByaW1lcywgQ2FuR2V0TmV4dFByaW1lKTsKLQotLy8gQXQgdGhpcyBwb2ludCB0aGUgdGVzdCBwYXR0ZXJuIGlzIGRvbmUuICBIb3dldmVyLCB5b3UgZG9uJ3QgaGF2ZQotLy8gYW55IHJlYWwgdGVzdCB5ZXQgYXMgeW91IGhhdmVuJ3Qgc2FpZCB3aGljaCB0eXBlcyB5b3Ugd2FudCB0byBydW4KLS8vIHRoZSB0ZXN0cyB3aXRoLgotCi0vLyBUbyB0dXJuIHRoZSBhYnN0cmFjdCB0ZXN0IHBhdHRlcm4gaW50byByZWFsIHRlc3RzLCB5b3UgaW5zdGFudGlhdGUKLS8vIGl0IHdpdGggYSBsaXN0IG9mIHR5cGVzLiAgVXN1YWxseSB0aGUgdGVzdCBwYXR0ZXJuIHdpbGwgYmUgZGVmaW5lZAotLy8gaW4gYSAuaCBmaWxlLCBhbmQgYW55b25lIGNhbiAjaW5jbHVkZSBhbmQgaW5zdGFudGlhdGUgaXQuICBZb3UgY2FuCi0vLyBldmVuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHByb2dyYW0uICBUbyB0ZWxsCi0vLyBkaWZmZXJlbnQgaW5zdGFuY2VzIGFwYXJ0LCB5b3UgZ2l2ZSBlYWNoIG9mIHRoZW0gYSBuYW1lLCB3aGljaCB3aWxsCi0vLyBiZWNvbWUgcGFydCBvZiB0aGUgdGVzdCBjYXNlIG5hbWUgYW5kIGNhbiBiZSB1c2VkIGluIHRlc3QgZmlsdGVycy4KLQotLy8gVGhlIGxpc3Qgb2YgdHlwZXMgd2Ugd2FudCB0byB0ZXN0LiAgTm90ZSB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZQotLy8gZGVmaW5lZCBhdCB0aGUgdGltZSB3ZSB3cml0ZSB0aGUgVFlQRURfVEVTVF9QKClzLgotdHlwZWRlZiBUeXBlczxPblRoZUZseVByaW1lVGFibGUsIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlPgotICAgIFByaW1lVGFibGVJbXBsZW1lbnRhdGlvbnM7Ci1JTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChPblRoZUZseUFuZFByZUNhbGN1bGF0ZWQsICAgIC8vIEluc3RhbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lVGFibGVUZXN0MiwgICAgICAgICAgICAgLy8gVGVzdCBjYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lVGFibGVJbXBsZW1lbnRhdGlvbnMpOyAgLy8gVHlwZSBsaXN0Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUApkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2NTFhMi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0KLS8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB0ZXN0IGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlCi0vLyBpbXBsZW1lbnRhdGlvbnMgb2YgYW4gaW50ZXJmYWNlIChha2EgaW50ZXJmYWNlIHRlc3RzKSB1c2luZwotLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4gRWFjaCB0ZXN0IGluIHRoZSB0ZXN0IGNhc2UgaGFzCi0vLyBhIHBhcmFtZXRlciB0aGF0IGlzIGFuIGludGVyZmFjZSBwb2ludGVyIHRvIGFuIGltcGxlbWVudGF0aW9uCi0vLyB0ZXN0ZWQuCi0KLS8vIFRoZSBpbnRlcmZhY2UgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoaXMgaGVhZGVyLgotI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLXVzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKLXVzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwotCi0vLyBBcyBhIGdlbmVyYWwgcnVsZSwgdG8gcHJldmVudCBhIHRlc3QgZnJvbSBhZmZlY3RpbmcgdGhlIHRlc3RzIHRoYXQgY29tZQotLy8gYWZ0ZXIgaXQsIHlvdSBzaG91bGQgY3JlYXRlIGFuZCBkZXN0cm95IHRoZSB0ZXN0ZWQgb2JqZWN0cyBmb3IgZWFjaCB0ZXN0Ci0vLyBpbnN0ZWFkIG9mIHJldXNpbmcgdGhlbS4gIEluIHRoaXMgc2FtcGxlIHdlIHdpbGwgZGVmaW5lIGEgc2ltcGxlIGZhY3RvcnkKLS8vIGZ1bmN0aW9uIGZvciBQcmltZVRhYmxlIG9iamVjdHMuICBXZSB3aWxsIGluc3RhbnRpYXRlIG9iamVjdHMgaW4gdGVzdCdzCi0vLyBTZXRVcCgpIG1ldGhvZCBhbmQgZGVsZXRlIHRoZW0gaW4gVGVhckRvd24oKSBtZXRob2QuCi10eXBlZGVmIFByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGVGdW5jKCk7Ci0KLVByaW1lVGFibGUqIENyZWF0ZU9uVGhlRmx5UHJpbWVUYWJsZSgpIHsKLSAgcmV0dXJuIG5ldyBPblRoZUZseVByaW1lVGFibGUoKTsKLX0KLQotdGVtcGxhdGUgPHNpemVfdCBtYXhfcHJlY2FsY3VsYXRlZD4KLVByaW1lVGFibGUqIENyZWF0ZVByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKCkgewotICByZXR1cm4gbmV3IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKG1heF9wcmVjYWxjdWxhdGVkKTsKLX0KLQotLy8gSW5zaWRlIHRoZSB0ZXN0IGJvZHksIGZpeHR1cmUgY29uc3RydWN0b3IsIFNldFVwKCksIGFuZCBUZWFyRG93bigpIHlvdQotLy8gY2FuIHJlZmVyIHRvIHRoZSB0ZXN0IHBhcmFtZXRlciBieSBHZXRQYXJhbSgpLiAgSW4gdGhpcyBjYXNlLCB0aGUgdGVzdAotLy8gcGFyYW1ldGVyIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCB3ZSBjYWxsIGluIGZpeHR1cmUncyBTZXRVcCgpIHRvCi0vLyBjcmVhdGUgYW5kIHN0b3JlIGFuIGluc3RhbmNlIG9mIFByaW1lVGFibGUuCi1jbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPENyZWF0ZVByaW1lVGFibGVGdW5jKj4gewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UHJpbWVUYWJsZVRlc3QoKSB7IGRlbGV0ZSB0YWJsZV87IH0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyB0YWJsZV8gPSAoKkdldFBhcmFtKCkpKCk7IH0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIGRlbGV0ZSB0YWJsZV87Ci0gICAgdGFibGVfID0gTlVMTDsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBQcmltZVRhYmxlKiB0YWJsZV87Ci19OwotCi1URVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgewotICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKC01KSk7Ci0gIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMCkpOwotICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg0KSk7Ci0gIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNikpOwotICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEwMCkpOwotfQotCi1URVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7Ci0gIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgyKSk7Ci0gIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgzKSk7Ci0gIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg1KSk7Ci0gIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg3KSk7Ci0gIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMSkpOwotICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTMxKSk7Ci19Ci0KLVRFU1RfUChQcmltZVRhYmxlVGVzdCwgQ2FuR2V0TmV4dFByaW1lKSB7Ci0gIEVYUEVDVF9FUSgyLCB0YWJsZV8tPkdldE5leHRQcmltZSgwKSk7Ci0gIEVYUEVDVF9FUSgzLCB0YWJsZV8tPkdldE5leHRQcmltZSgyKSk7Ci0gIEVYUEVDVF9FUSg1LCB0YWJsZV8tPkdldE5leHRQcmltZSgzKSk7Ci0gIEVYUEVDVF9FUSg3LCB0YWJsZV8tPkdldE5leHRQcmltZSg1KSk7Ci0gIEVYUEVDVF9FUSgxMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoNykpOwotICBFWFBFQ1RfRVEoMTMxLCB0YWJsZV8tPkdldE5leHRQcmltZSgxMjgpKTsKLX0KLQotLy8gSW4gb3JkZXIgdG8gcnVuIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHlvdSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZW0sCi0vLyBvciBiaW5kIHRoZW0gdG8gYSBsaXN0IG9mIHZhbHVlcyB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGVzdCBwYXJhbWV0ZXJzLgotLy8gWW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtIGluIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIG1vZHVsZSwgb3IgZXZlbgotLy8gaW5zdGFudGlhdGUgdGhlbSBzZXZlcmFsIHRpbWVzLgotLy8KLS8vIEhlcmUsIHdlIGluc3RhbnRpYXRlIG91ciB0ZXN0cyB3aXRoIGEgbGlzdCBvZiB0d28gUHJpbWVUYWJsZSBvYmplY3QKLS8vIGZhY3RvcnkgZnVuY3Rpb25zOgotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCi0gICAgT25UaGVGbHlBbmRQcmVDYWxjdWxhdGVkLAotICAgIFByaW1lVGFibGVUZXN0LAotICAgIFZhbHVlcygmQ3JlYXRlT25UaGVGbHlQcmltZVRhYmxlLCAmQ3JlYXRlUHJlQ2FsY3VsYXRlZFByaW1lVGFibGU8MTAwMD4pKTsKLQotI2Vsc2UKLQotLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgd2l0aCBzb21lCi0vLyBjb21waWxlcnMuIElmIHdlIHVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBjb21waWxlIG91dCBhbGwKLS8vIGNvZGUgcmVmZXJyaW5nIHRvIHRoZSBndGVzdF9tYWluIGxpYnJhcnksIE1TVkMgbGlua2VyIHdpbGwgbm90IGxpbmsKLS8vIHRoYXQgbGlicmFyeSBhdCBhbGwgYW5kIGNvbnNlcXVlbnRseSBjb21wbGFpbiBhYm91dCBtaXNzaW5nIGVudHJ5Ci0vLyBwb2ludCBkZWZpbmVkIGluIHRoYXQgbGlicmFyeSAoZmF0YWwgZXJyb3IgTE5LMTU2MTogZW50cnkgcG9pbnQKLS8vIG11c3QgYmUgZGVmaW5lZCkuIFRoaXMgZHVtbXkgdGVzdCBrZWVwcyBndGVzdF9tYWluIGxpbmtlZCBpbi4KLVRFU1QoRHVtbXlUZXN0LCBWYWx1ZVBhcmFtZXRlcml6ZWRUZXN0c0FyZU5vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjc0MzM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHRlc3QgY29kZSByZWx5aW5nIG9uIHNvbWUgZ2xvYmFsIGZsYWcgdmFyaWFibGVzLgotLy8gQ29tYmluZSgpIGhlbHBzIHdpdGggZ2VuZXJhdGluZyBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHN1Y2ggZmxhZ3MsCi0vLyBhbmQgZWFjaCB0ZXN0IGlzIGdpdmVuIG9uZSBjb21iaW5hdGlvbiBhcyBhIHBhcmFtZXRlci4KLQotLy8gVXNlIGNsYXNzIGRlZmluaXRpb25zIHRvIHRlc3QgZnJvbSB0aGlzIGhlYWRlci4KLSNpbmNsdWRlICJwcmltZV90YWJsZXMuaCIKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9IQVNfQ09NQklORQotCi0vLyBTdXBwb3NlIHdlIHdhbnQgdG8gaW50cm9kdWNlIGEgbmV3LCBpbXByb3ZlZCBpbXBsZW1lbnRhdGlvbiBvZiBQcmltZVRhYmxlCi0vLyB3aGljaCBjb21iaW5lcyBzcGVlZCBvZiBQcmVjYWxjUHJpbWVUYWJsZSBhbmQgdmVyc2F0aWxpdHkgb2YKLS8vIE9uVGhlRmx5UHJpbWVUYWJsZSAoc2VlIHByaW1lX3RhYmxlcy5oKS4gSW5zaWRlIGl0IGluc3RhbnRpYXRlcyBib3RoCi0vLyBQcmVjYWxjUHJpbWVUYWJsZSBhbmQgT25UaGVGbHlQcmltZVRhYmxlIGFuZCB1c2VzIHRoZSBvbmUgdGhhdCBpcyBtb3JlCi0vLyBhcHByb3ByaWF0ZSB1bmRlciB0aGUgY2lyY3Vtc3RhbmNlcy4gQnV0IGluIGxvdyBtZW1vcnkgY29uZGl0aW9ucywgaXQgY2FuIGJlCi0vLyB0b2xkIHRvIGluc3RhbnRpYXRlIHdpdGhvdXQgUHJlY2FsY1ByaW1lVGFibGUgaW5zdGFuY2UgYXQgYWxsIGFuZCB1c2Ugb25seQotLy8gT25UaGVGbHlQcmltZVRhYmxlLgotY2xhc3MgSHlicmlkUHJpbWVUYWJsZSA6IHB1YmxpYyBQcmltZVRhYmxlIHsKLSBwdWJsaWM6Ci0gIEh5YnJpZFByaW1lVGFibGUoYm9vbCBmb3JjZV9vbl90aGVfZmx5LCBpbnQgbWF4X3ByZWNhbGN1bGF0ZWQpCi0gICAgICA6IG9uX3RoZV9mbHlfaW1wbF8obmV3IE9uVGhlRmx5UHJpbWVUYWJsZSksCi0gICAgICAgIHByZWNhbGNfaW1wbF8oZm9yY2Vfb25fdGhlX2ZseSA/IE5VTEwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUobWF4X3ByZWNhbGN1bGF0ZWQpKSwKLSAgICAgICAgbWF4X3ByZWNhbGN1bGF0ZWRfKG1heF9wcmVjYWxjdWxhdGVkKSB7fQotICB2aXJ0dWFsIH5IeWJyaWRQcmltZVRhYmxlKCkgewotICAgIGRlbGV0ZSBvbl90aGVfZmx5X2ltcGxfOwotICAgIGRlbGV0ZSBwcmVjYWxjX2ltcGxfOwotICB9Ci0KLSAgdmlydHVhbCBib29sIElzUHJpbWUoaW50IG4pIGNvbnN0IHsKLSAgICBpZiAocHJlY2FsY19pbXBsXyAhPSBOVUxMICYmIG4gPCBtYXhfcHJlY2FsY3VsYXRlZF8pCi0gICAgICByZXR1cm4gcHJlY2FsY19pbXBsXy0+SXNQcmltZShuKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gb25fdGhlX2ZseV9pbXBsXy0+SXNQcmltZShuKTsKLSAgfQotCi0gIHZpcnR1YWwgaW50IEdldE5leHRQcmltZShpbnQgcCkgY29uc3QgewotICAgIGludCBuZXh0X3ByaW1lID0gLTE7Ci0gICAgaWYgKHByZWNhbGNfaW1wbF8gIT0gTlVMTCAmJiBwIDwgbWF4X3ByZWNhbGN1bGF0ZWRfKQotICAgICAgbmV4dF9wcmltZSA9IHByZWNhbGNfaW1wbF8tPkdldE5leHRQcmltZShwKTsKLQotICAgIHJldHVybiBuZXh0X3ByaW1lICE9IC0xID8gbmV4dF9wcmltZSA6IG9uX3RoZV9mbHlfaW1wbF8tPkdldE5leHRQcmltZShwKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgT25UaGVGbHlQcmltZVRhYmxlKiBvbl90aGVfZmx5X2ltcGxfOwotICBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSogcHJlY2FsY19pbXBsXzsKLSAgaW50IG1heF9wcmVjYWxjdWxhdGVkXzsKLX07Ci0KLXVzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKLXVzaW5nIDo6dGVzdGluZzo6Qm9vbDsKLXVzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwotdXNpbmcgOjp0ZXN0aW5nOjpDb21iaW5lOwotCi0vLyBUbyB0ZXN0IGFsbCBjb2RlIHBhdGhzIGZvciBIeWJyaWRQcmltZVRhYmxlIHdlIG11c3QgdGVzdCBpdCB3aXRoIG51bWJlcnMKLS8vIGJvdGggd2l0aGluIGFuZCBvdXRzaWRlIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlJ3MgY2FwYWNpdHkgYW5kIGFsc28gd2l0aAotLy8gUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUgZGlzYWJsZWQuIFdlIGRvIHRoaXMgYnkgZGVmaW5pbmcgZml4dHVyZSB3aGljaCB3aWxsCi0vLyBhY2NlcHQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBwYXJhbWV0ZXJzIGZvciBpbnN0YW50aWF0aW5nIGEKLS8vIEh5YnJpZFByaW1lVGFibGUgaW5zdGFuY2UuCi1jbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPCA6OnRlc3Rpbmc6OnR1cGxlPGJvb2wsIGludD4gPiB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgLy8gVGhpcyBjYW4gYmUgd3JpdHRlbiBhcwotICAgIC8vCi0gICAgLy8gYm9vbCBmb3JjZV9vbl90aGVfZmx5OwotICAgIC8vIGludCBtYXhfcHJlY2FsY3VsYXRlZDsKLSAgICAvLyB0aWUoZm9yY2Vfb25fdGhlX2ZseSwgbWF4X3ByZWNhbGN1bGF0ZWQpID0gR2V0UGFyYW0oKTsKLSAgICAvLwotICAgIC8vIG9uY2UgdGhlIEdvb2dsZSBDKysgU3R5bGUgR3VpZGUgYWxsb3dzIHVzZSBvZiA6OnN0ZDo6dHIxOjp0aWUuCi0gICAgLy8KLSAgICBib29sIGZvcmNlX29uX3RoZV9mbHkgPSA6OnRlc3Rpbmc6OmdldDwwPihHZXRQYXJhbSgpKTsKLSAgICBpbnQgbWF4X3ByZWNhbGN1bGF0ZWQgPSA6OnRlc3Rpbmc6OmdldDwxPihHZXRQYXJhbSgpKTsKLSAgICB0YWJsZV8gPSBuZXcgSHlicmlkUHJpbWVUYWJsZShmb3JjZV9vbl90aGVfZmx5LCBtYXhfcHJlY2FsY3VsYXRlZCk7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIGRlbGV0ZSB0YWJsZV87Ci0gICAgdGFibGVfID0gTlVMTDsKLSAgfQotICBIeWJyaWRQcmltZVRhYmxlKiB0YWJsZV87Ci19OwotCi1URVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgewotICAvLyBJbnNpZGUgdGhlIHRlc3QgYm9keSwgeW91IGNhbiByZWZlciB0byB0aGUgdGVzdCBwYXJhbWV0ZXIgYnkgR2V0UGFyYW0oKS4KLSAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgdGVzdCBwYXJhbWV0ZXIgaXMgYSBQcmltZVRhYmxlIGludGVyZmFjZSBwb2ludGVyIHdoaWNoCi0gIC8vIHdlIGNhbiB1c2UgZGlyZWN0bHkuCi0gIC8vIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbiBhbHNvIHNhdmUgaXQgaW4gdGhlIGZpeHR1cmUncyBTZXRVcCgpIG1ldGhvZAotICAvLyBvciBjb25zdHJ1Y3RvciBhbmQgdXNlIHNhdmVkIGNvcHkgaW4gdGhlIHRlc3RzLgotCi0gIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoLTUpKTsKLSAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgwKSk7Ci0gIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMSkpOwotICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDQpKTsKLSAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg2KSk7Ci0gIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMTAwKSk7Ci19Ci0KLVRFU1RfUChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc1RydWVGb3JQcmltZXMpIHsKLSAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDIpKTsKLSAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDMpKTsKLSAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDUpKTsKLSAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDcpKTsKLSAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDExKSk7Ci0gIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMzEpKTsKLX0KLQotVEVTVF9QKFByaW1lVGFibGVUZXN0LCBDYW5HZXROZXh0UHJpbWUpIHsKLSAgRVhQRUNUX0VRKDIsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKLSAgRVhQRUNUX0VRKDMsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKLSAgRVhQRUNUX0VRKDUsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKLSAgRVhQRUNUX0VRKDcsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKLSAgRVhQRUNUX0VRKDExLCB0YWJsZV8tPkdldE5leHRQcmltZSg3KSk7Ci0gIEVYUEVDVF9FUSgxMzEsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOwotfQotCi0vLyBJbiBvcmRlciB0byBydW4gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgeW91IG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlbSwKLS8vIG9yIGJpbmQgdGhlbSB0byBhIGxpc3Qgb2YgdmFsdWVzIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0ZXN0IHBhcmFtZXRlcnMuCi0vLyBZb3UgY2FuIGluc3RhbnRpYXRlIHRoZW0gaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gbW9kdWxlLCBvciBldmVuCi0vLyBpbnN0YW50aWF0ZSB0aGVtIHNldmVyYWwgdGltZXMuCi0vLwotLy8gSGVyZSwgd2UgaW5zdGFudGlhdGUgb3VyIHRlc3RzIHdpdGggYSBsaXN0IG9mIHBhcmFtZXRlcnMuIFdlIG11c3QgY29tYmluZQotLy8gYWxsIHZhcmlhdGlvbnMgb2YgdGhlIGJvb2xlYW4gZmxhZyBzdXBwcmVzc2luZyBQcmVjYWxjUHJpbWVUYWJsZSBhbmQgc29tZQotLy8gbWVhbmluZ2Z1bCB2YWx1ZXMgZm9yIHRlc3RzLiBXZSBjaG9vc2UgYSBzbWFsbCB2YWx1ZSAoMSksIGFuZCBhIHZhbHVlIHRoYXQKLS8vIHdpbGwgcHV0IHNvbWUgb2YgdGhlIHRlc3RlZCBudW1iZXJzIGJleW9uZCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUKLS8vIFByZWNhbGNQcmltZVRhYmxlIGluc3RhbmNlIGFuZCBzb21lIGluc2lkZSBpdCAoMTApLiBDb21iaW5lIHdpbGwgcHJvZHVjZSBhbGwKLS8vIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lYW5pbmdmdWxUZXN0UGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lVGFibGVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShCb29sKCksIFZhbHVlcygxLCAxMCkpKTsKLQotI2Vsc2UKLQotLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IENvbWJpbmUoKSB3aXRoIHNvbWUgY29tcGlsZXJzLiBJZiB3ZQotLy8gdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGNvbXBpbGUgb3V0IGFsbCBjb2RlIHJlZmVycmluZyB0bwotLy8gdGhlIGd0ZXN0X21haW4gbGlicmFyeSwgTVNWQyBsaW5rZXIgd2lsbCBub3QgbGluayB0aGF0IGxpYnJhcnkgYXQKLS8vIGFsbCBhbmQgY29uc2VxdWVudGx5IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZW50cnkgcG9pbnQgZGVmaW5lZCBpbgotLy8gdGhhdCBsaWJyYXJ5IChmYXRhbCBlcnJvciBMTksxNTYxOiBlbnRyeSBwb2ludCBtdXN0IGJlCi0vLyBkZWZpbmVkKS4gVGhpcyBkdW1teSB0ZXN0IGtlZXBzIGd0ZXN0X21haW4gbGlua2VkIGluLgotVEVTVChEdW1teVRlc3QsIENvbWJpbmVJc05vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUyMDc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotCi0vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdXNlIEdvb2dsZSBUZXN0IGxpc3RlbmVyIEFQSSB0byBpbXBsZW1lbnQKLS8vIGFuIGFsdGVybmF0aXZlIGNvbnNvbGUgb3V0cHV0IGFuZCBob3cgdG8gdXNlIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSQotLy8gdG8gZW51bWVyYXRlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGFuZCB0byBpbnNwZWN0IHRoZWlyIHJlc3VsdHMuCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwotdXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdENhc2U7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwotdXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKLQotbmFtZXNwYWNlIHsKLQotLy8gUHJvdmlkZXMgYWx0ZXJuYXRpdmUgb3V0cHV0IG1vZGUgd2hpY2ggcHJvZHVjZXMgbWluaW1hbCBhbW91bnQgb2YKLS8vIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzLgotY2xhc3MgVGVyc2VQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotIHByaXZhdGU6Ci0gIC8vIENhbGxlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8pIHt9Ci0KLSAgLy8gQ2FsbGVkIGFmdGVyIGFsbCB0ZXN0IGFjdGl2aXRpZXMgaGF2ZSBlbmRlZC4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgewotICAgIGZwcmludGYoc3Rkb3V0LCAiVEVTVCAlc1xuIiwgdW5pdF90ZXN0LlBhc3NlZCgpID8gIlBBU1NFRCIgOiAiRkFJTEVEIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gIH0KLQotICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsCi0gICAgICAgICAgICAiKioqIFRlc3QgJXMuJXMgc3RhcnRpbmcuXG4iLAotICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksCi0gICAgICAgICAgICB0ZXN0X2luZm8ubmFtZSgpKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgfQotCi0gIC8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKLSAgICBmcHJpbnRmKHN0ZG91dCwKLSAgICAgICAgICAgICIlcyBpbiAlczolZFxuJXNcbiIsCi0gICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmZhaWxlZCgpID8gIioqKiBGYWlsdXJlIiA6ICJTdWNjZXNzIiwKLSAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCi0gICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCksCi0gICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LnN1bW1hcnkoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gIH0KLQotICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICAgIGZwcmludGYoc3Rkb3V0LAotICAgICAgICAgICAgIioqKiBUZXN0ICVzLiVzIGVuZGluZy5cbiIsCi0gICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwKLSAgICAgICAgICAgIHRlc3RfaW5mby5uYW1lKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICB9Ci19OyAgLy8gY2xhc3MgVGVyc2VQcmludGVyCi0KLVRFU1QoQ3VzdG9tT3V0cHV0VGVzdCwgUHJpbnRzTWVzc2FnZSkgewotICBwcmludGYoIlByaW50aW5nIHNvbWV0aGluZyBmcm9tIHRoZSB0ZXN0IGJvZHkuLi5cbiIpOwotfQotCi1URVNUKEN1c3RvbU91dHB1dFRlc3QsIFN1Y2NlZWRzKSB7Ci0gIFNVQ0NFRUQoKSA8PCAiU1VDQ0VFRCgpIGhhcyBiZWVuIGludm9rZWQgZnJvbSBoZXJlIjsKLX0KLQotVEVTVChDdXN0b21PdXRwdXRUZXN0LCBGYWlscykgewotICBFWFBFQ1RfRVEoMSwgMikKLSAgICAgIDw8ICJUaGlzIHRlc3QgZmFpbHMgaW4gb3JkZXIgdG8gZGVtb25zdHJhdGUgYWx0ZXJuYXRpdmUgZmFpbHVyZSBtZXNzYWdlcyI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotCi0gIGJvb2wgdGVyc2Vfb3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi0tdGVyc2Vfb3V0cHV0IikgPT0gMCApCi0gICAgdGVyc2Vfb3V0cHV0ID0gdHJ1ZTsKLSAgZWxzZQotICAgIHByaW50ZigiJXNcbiIsICJSdW4gdGhpcyBwcm9ncmFtIHdpdGggLS10ZXJzZV9vdXRwdXQgdG8gY2hhbmdlIHRoZSB3YXkgIgotICAgICAgICAgICAiaXQgcHJpbnRzIGl0cyBvdXRwdXQuIik7Ci0KLSAgVW5pdFRlc3QmIHVuaXRfdGVzdCA9ICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKLQotICAvLyBJZiB3ZSBhcmUgZ2l2ZW4gdGhlIC0tdGVyc2Vfb3V0cHV0IGNvbW1hbmQgbGluZSBmbGFnLCBzdXBwcmVzc2VzIHRoZQotICAvLyBzdGFuZGFyZCBvdXRwdXQgYW5kIGF0dGFjaGVzIG93biByZXN1bHQgcHJpbnRlci4KLSAgaWYgKHRlcnNlX291dHB1dCkgewotICAgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gdW5pdF90ZXN0Lmxpc3RlbmVycygpOwotCi0gICAgLy8gUmVtb3ZlcyB0aGUgZGVmYXVsdCBjb25zb2xlIG91dHB1dCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IHNvIGl0IHdpbGwKLSAgICAvLyBub3QgcmVjZWl2ZSBldmVudHMgZnJvbSBHb29nbGUgVGVzdCBhbmQgd29uJ3QgcHJpbnQgYW55IG91dHB1dC4gU2luY2UKLSAgICAvLyB0aGlzIG9wZXJhdGlvbiB0cmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoZSBsaXN0ZW5lciB0byB0aGUgY2FsbGVyIHdlCi0gICAgLy8gaGF2ZSB0byBkZWxldGUgaXQgYXMgd2VsbC4KLSAgICBkZWxldGUgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSk7Ci0KLSAgICAvLyBBZGRzIHRoZSBjdXN0b20gb3V0cHV0IGxpc3RlbmVyIHRvIHRoZSBsaXN0LiBJdCB3aWxsIG5vdyByZWNlaXZlCi0gICAgLy8gZXZlbnRzIGZyb20gR29vZ2xlIFRlc3QgYW5kIHByaW50IHRoZSBhbHRlcm5hdGl2ZSBvdXRwdXQuIFdlIGRvbid0Ci0gICAgLy8gaGF2ZSB0byB3b3JyeSBhYm91dCBkZWxldGluZyBpdCBzaW5jZSBHb29nbGUgVGVzdCBhc3N1bWVzIG93bmVyc2hpcAotICAgIC8vIG92ZXIgaXQgYWZ0ZXIgYWRkaW5nIGl0IHRvIHRoZSBsaXN0LgotICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IFRlcnNlUHJpbnRlcik7Ci0gIH0KLSAgaW50IHJldF92YWwgPSBSVU5fQUxMX1RFU1RTKCk7Ci0KLSAgLy8gVGhpcyBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSSB0byBpbnNwZWN0IHRlc3QKLSAgLy8gcmVzdWx0cy4gSGVyZSB3ZSBkaXNjb3VudCBmYWlsdXJlcyBmcm9tIHRoZSB0ZXN0cyB3ZSBleHBlY3RlZCB0byBmYWlsLgotICBpbnQgdW5leHBlY3RlZGx5X2ZhaWxlZF90ZXN0cyA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlID0gKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgewotICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7Ci0gICAgICAvLyBDb3VudHMgZmFpbGVkIHRlc3RzIHRoYXQgd2VyZSBub3QgbWVhbnQgdG8gZmFpbCAodGhvc2Ugd2l0aG91dAotICAgICAgLy8gJ0ZhaWxzJyBpbiB0aGUgbmFtZSkuCi0gICAgICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSAmJgotICAgICAgICAgIHN0cmNtcCh0ZXN0X2luZm8ubmFtZSgpLCAiRmFpbHMiKSAhPSAwKSB7Ci0gICAgICAgIHVuZXhwZWN0ZWRseV9mYWlsZWRfdGVzdHMrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBUZXN0IHRoYXQgd2VyZSBtZWFudCB0byBmYWlsIHNob3VsZCBub3QgYWZmZWN0IHRoZSB0ZXN0IHByb2dyYW0gb3V0Y29tZS4KLSAgaWYgKHVuZXhwZWN0ZWRseV9mYWlsZWRfdGVzdHMgPT0gMCkKLSAgICByZXRfdmFsID0gMDsKLQotICByZXR1cm4gcmV0X3ZhbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc2NyaXB0cy9jb21tb24ucHkgYi90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvY29tbW9uLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzAzNDdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc2NyaXB0cy9jb21tb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJTaGFyZWQgdXRpbGl0aWVzIGZvciB3cml0aW5nIHNjcmlwdHMgZm9yIEdvb2dsZSBUZXN0L01vY2suIiIiCi0KLV9fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCi0KLQotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLQotCi0jIE1hdGNoZXMgdGhlIGxpbmUgZnJvbSAnc3ZuIGluZm8gLicgb3V0cHV0IHRoYXQgZGVzY3JpYmVzIHdoYXQgU1ZOCi0jIHBhdGggdGhlIGN1cnJlbnQgbG9jYWwgZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvLiAgRm9yIGV4YW1wbGUsIGluCi0jIGEgZ29vZ2xldGVzdCBTVk4gd29ya3NwYWNlJ3MgdHJ1bmsvdGVzdCBkaXJlY3RvcnksIHRoZSBvdXRwdXQgd2lsbCBiZToKLSMKLSMgVVJMOiBodHRwczovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL3Rlc3QKLV9TVk5fSU5GT19VUkxfUkUgPSByZS5jb21waWxlKHInXlVSTDogaHR0cHM6Ly8oXHcrKVwuZ29vZ2xlY29kZVwuY29tL3N2biguKiknKQotCi0KLWRlZiBHZXRDb21tYW5kT3V0cHV0KGNvbW1hbmQpOgotICAiIiJSdW5zIHRoZSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm5zIGl0cyBzdGRvdXQgYXMgYSBsaXN0IG9mIGxpbmVzLiIiIgotCi0gIGYgPSBvcy5wb3Blbihjb21tYW5kLCAncicpCi0gIGxpbmVzID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBmLnJlYWRsaW5lcygpXQotICBmLmNsb3NlKCkKLSAgcmV0dXJuIGxpbmVzCi0KLQotZGVmIEdldFN2bkluZm8oKToKLSAgIiIiUmV0dXJucyB0aGUgcHJvamVjdCBuYW1lIGFuZCB0aGUgY3VycmVudCBTVk4gd29ya3NwYWNlJ3Mgcm9vdCBwYXRoLiIiIgotCi0gIGZvciBsaW5lIGluIEdldENvbW1hbmRPdXRwdXQoJ3N2biBpbmZvIC4nKToKLSAgICBtID0gX1NWTl9JTkZPX1VSTF9SRS5tYXRjaChsaW5lKQotICAgIGlmIG06Ci0gICAgICBwcm9qZWN0ID0gbS5ncm91cCgxKSAgIyBnb29nbGV0ZXN0IG9yIGdvb2dsZW1vY2sKLSAgICAgIHJlbF9wYXRoID0gbS5ncm91cCgyKQotICAgICAgcm9vdCA9IG9zLnBhdGgucmVhbHBhdGgocmVsX3BhdGguY291bnQoJy8nKSAqICcuLi8nKQotICAgICAgcmV0dXJuIHByb2plY3QsIHJvb3QKLQotICByZXR1cm4gTm9uZSwgTm9uZQotCi0KLWRlZiBHZXRTdm5UcnVuaygpOgotICAiIiJSZXR1cm5zIHRoZSBjdXJyZW50IFNWTiB3b3Jrc3BhY2UncyB0cnVuayByb290IHBhdGguIiIiCi0KLSAgXywgcm9vdCA9IEdldFN2bkluZm8oKQotICByZXR1cm4gcm9vdCArICcvdHJ1bmsnIGlmIHJvb3QgZWxzZSBOb25lCi0KLQotZGVmIElzSW5HVGVzdFN2bigpOgotICBwcm9qZWN0LCBfID0gR2V0U3ZuSW5mbygpCi0gIHJldHVybiBwcm9qZWN0ID09ICdnb29nbGV0ZXN0JwotCi0KLWRlZiBJc0luR01vY2tTdm4oKToKLSAgcHJvamVjdCwgXyA9IEdldFN2bkluZm8oKQotICByZXR1cm4gcHJvamVjdCA9PSAnZ29vZ2xlbW9jaycKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IGIvdGVzdGluZy9ndGVzdC9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3ZWY3MmYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiZnVzZV9ndGVzdF9maWxlcy5weSB2MC4yLjAKLUZ1c2VzIEdvb2dsZSBUZXN0IHNvdXJjZSBjb2RlIGludG8gYSAuaCBmaWxlIGFuZCBhIC5jYyBmaWxlLgotCi1TWU5PUFNJUwotICAgICAgIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgW0dURVNUX1JPT1RfRElSXSBPVVRQVVRfRElSCi0KLSAgICAgICBTY2FucyBHVEVTVF9ST09UX0RJUiBmb3IgR29vZ2xlIFRlc3Qgc291cmNlIGNvZGUsIGFuZCBnZW5lcmF0ZXMKLSAgICAgICB0d28gZmlsZXM6IE9VVFBVVF9ESVIvZ3Rlc3QvZ3Rlc3QuaCBhbmQgT1VUUFVUX0RJUi9ndGVzdC9ndGVzdC1hbGwuY2MuCi0gICAgICAgVGhlbiB5b3UgY2FuIGJ1aWxkIHlvdXIgdGVzdHMgYnkgYWRkaW5nIE9VVFBVVF9ESVIgdG8gdGhlIGluY2x1ZGUKLSAgICAgICBzZWFyY2ggcGF0aCBhbmQgbGlua2luZyB3aXRoIE9VVFBVVF9ESVIvZ3Rlc3QvZ3Rlc3QtYWxsLmNjLiAgVGhlc2UKLSAgICAgICB0d28gZmlsZXMgY29udGFpbiBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHVzZSBHb29nbGUgVGVzdC4gIEhlbmNlCi0gICAgICAgeW91IGNhbiAiaW5zdGFsbCIgR29vZ2xlIFRlc3QgYnkgY29weWluZyB0aGVtIHRvIHdoZXJldmVyIHlvdSB3YW50LgotCi0gICAgICAgR1RFU1RfUk9PVF9ESVIgY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIHRoZSBwYXJlbnQKLSAgICAgICBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoaXMgc2NyaXB0LgotCi1FWEFNUExFUwotICAgICAgIC4vZnVzZV9ndGVzdF9maWxlcy5weSBmdXNlZF9ndGVzdAotICAgICAgIC4vZnVzZV9ndGVzdF9maWxlcy5weSBwYXRoL3RvL3VucGFja2VkL2d0ZXN0IGZ1c2VkX2d0ZXN0Ci0KLVRoaXMgdG9vbCBpcyBleHBlcmltZW50YWwuICBJbiBwYXJ0aWN1bGFyLCBpdCBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgbm8KLWNvbmRpdGlvbmFsIGluY2x1c2lvbiBvZiBHb29nbGUgVGVzdCBoZWFkZXJzLiAgUGxlYXNlIHJlcG9ydCBhbnkKLXByb2JsZW1zIHRvIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbS4gIFlvdSBjYW4gcmVhZAotaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9Hb29nbGVUZXN0QWR2YW5jZWRHdWlkZSBmb3IKLW1vcmUgaW5mb3JtYXRpb24uCi0iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzZXRzCi1pbXBvcnQgc3lzCi0KLSMgV2UgYXNzdW1lIHRoYXQgdGhpcyBmaWxlIGlzIGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkgaW4gdGhlIEdvb2dsZQotIyBUZXN0IHJvb3QgZGlyZWN0b3J5LgotREVGQVVMVF9HVEVTVF9ST09UX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nKQotCi0jIFJlZ2V4IGZvciBtYXRjaGluZyAnI2luY2x1ZGUgImd0ZXN0Ly4uLiInLgotSU5DTFVERV9HVEVTVF9GSUxFX1JFR0VYID0gcmUuY29tcGlsZShyJ15ccyojXHMqaW5jbHVkZVxzKiIoZ3Rlc3QvLispIicpCi0KLSMgUmVnZXggZm9yIG1hdGNoaW5nICcjaW5jbHVkZSAic3JjLy4uLiInLgotSU5DTFVERV9TUkNfRklMRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXHMqI1xzKmluY2x1ZGVccyoiKHNyYy8uKykiJykKLQotIyBXaGVyZSB0byBmaW5kIHRoZSBzb3VyY2Ugc2VlZCBmaWxlcy4KLUdURVNUX0hfU0VFRCA9ICdpbmNsdWRlL2d0ZXN0L2d0ZXN0LmgnCi1HVEVTVF9TUElfSF9TRUVEID0gJ2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgnCi1HVEVTVF9BTExfQ0NfU0VFRCA9ICdzcmMvZ3Rlc3QtYWxsLmNjJwotCi0jIFdoZXJlIHRvIHB1dCB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotR1RFU1RfSF9PVVRQVVQgPSAnZ3Rlc3QvZ3Rlc3QuaCcKLUdURVNUX0FMTF9DQ19PVVRQVVQgPSAnZ3Rlc3QvZ3Rlc3QtYWxsLmNjJwotCi0KLWRlZiBWZXJpZnlGaWxlRXhpc3RzKGRpcmVjdG9yeSwgcmVsYXRpdmVfcGF0aCk6Ci0gICIiIlZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGZpbGUgZXhpc3RzOyBhYm9ydHMgb24gZmFpbHVyZS4KLQotICByZWxhdGl2ZV9wYXRoIGlzIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLSAgIiIiCi0KLSAgaWYgbm90IG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihkaXJlY3RvcnksIHJlbGF0aXZlX3BhdGgpKToKLSAgICBwcmludCAnRVJST1I6IENhbm5vdCBmaW5kICVzIGluIGRpcmVjdG9yeSAlcy4nICUgKHJlbGF0aXZlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkpCi0gICAgcHJpbnQgKCdQbGVhc2UgZWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5ICcKLSAgICAgICAgICAgJ29yIG9taXQgaXQgb24gdGhlIGNvbW1hbmQgbGluZS4nKQotICAgIHN5cy5leGl0KDEpCi0KLQotZGVmIFZhbGlkYXRlR1Rlc3RSb290RGlyKGd0ZXN0X3Jvb3QpOgotICAiIiJNYWtlcyBzdXJlIGd0ZXN0X3Jvb3QgcG9pbnRzIHRvIGEgdmFsaWQgZ3Rlc3Qgcm9vdCBkaXJlY3RvcnkuCi0KLSAgVGhlIGZ1bmN0aW9uIGFib3J0cyB0aGUgcHJvZ3JhbSBvbiBmYWlsdXJlLgotICAiIiIKLQotICBWZXJpZnlGaWxlRXhpc3RzKGd0ZXN0X3Jvb3QsIEdURVNUX0hfU0VFRCkKLSAgVmVyaWZ5RmlsZUV4aXN0cyhndGVzdF9yb290LCBHVEVTVF9BTExfQ0NfU0VFRCkKLQotCi1kZWYgVmVyaWZ5T3V0cHV0RmlsZShvdXRwdXRfZGlyLCByZWxhdGl2ZV9wYXRoKToKLSAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gb3V0cHV0IGZpbGUgcGF0aCBpcyB2YWxpZC4KLQotICByZWxhdGl2ZV9wYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXRfZGlyIGRpcmVjdG9yeS4KLSAgIiIiCi0KLSAgIyBNYWtlcyBzdXJlIHRoZSBvdXRwdXQgZmlsZSBlaXRoZXIgZG9lc24ndCBleGlzdCBvciBjYW4gYmUgb3ZlcndyaXR0ZW4uCi0gIG91dHB1dF9maWxlID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIHJlbGF0aXZlX3BhdGgpCi0gIGlmIG9zLnBhdGguZXhpc3RzKG91dHB1dF9maWxlKToKLSAgICAjIFRPRE8od2FuQGdvb2dsZS5jb20pOiBUaGUgZm9sbG93aW5nIHVzZXItaW50ZXJhY3Rpb24gZG9lc24ndAotICAgICMgd29yayB3aXRoIGF1dG9tYXRlZCBwcm9jZXNzZXMuICBXZSBzaG91bGQgcHJvdmlkZSBhIHdheSBmb3IgdGhlCi0gICAgIyBNYWtlZmlsZSB0byBmb3JjZSBvdmVyd3JpdGluZyB0aGUgZmlsZXMuCi0gICAgcHJpbnQgKCclcyBhbHJlYWR5IGV4aXN0cyBpbiBkaXJlY3RvcnkgJXMgLSBvdmVyd3JpdGUgaXQ/ICh5L04pICcgJQotICAgICAgICAgICAocmVsYXRpdmVfcGF0aCwgb3V0cHV0X2RpcikpCi0gICAgYW5zd2VyID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkuc3RyaXAoKQotICAgIGlmIGFuc3dlciBub3QgaW4gWyd5JywgJ1knXToKLSAgICAgIHByaW50ICdBQk9SVEVELicKLSAgICAgIHN5cy5leGl0KDEpCi0KLSAgIyBNYWtlcyBzdXJlIHRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgb3V0cHV0IGZpbGUgZXhpc3RzOyBjcmVhdGVzCi0gICMgaXQgYW5kIGFsbCBpdHMgYW5jZXN0b3JzIGlmIG5lY2Vzc2FyeS4KLSAgcGFyZW50X2RpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZShvdXRwdXRfZmlsZSkKLSAgaWYgbm90IG9zLnBhdGguaXNkaXIocGFyZW50X2RpcmVjdG9yeSk6Ci0gICAgb3MubWFrZWRpcnMocGFyZW50X2RpcmVjdG9yeSkKLQotCi1kZWYgVmFsaWRhdGVPdXRwdXREaXIob3V0cHV0X2Rpcik6Ci0gICIiIk1ha2VzIHN1cmUgb3V0cHV0X2RpciBwb2ludHMgdG8gYSB2YWxpZCBvdXRwdXQgZGlyZWN0b3J5LgotCi0gIFRoZSBmdW5jdGlvbiBhYm9ydHMgdGhlIHByb2dyYW0gb24gZmFpbHVyZS4KLSAgIiIiCi0KLSAgVmVyaWZ5T3V0cHV0RmlsZShvdXRwdXRfZGlyLCBHVEVTVF9IX09VVFBVVCkKLSAgVmVyaWZ5T3V0cHV0RmlsZShvdXRwdXRfZGlyLCBHVEVTVF9BTExfQ0NfT1VUUFVUKQotCi0KLWRlZiBGdXNlR1Rlc3RIKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpOgotICAiIiJTY2FucyBmb2xkZXIgZ3Rlc3Rfcm9vdCB0byBnZW5lcmF0ZSBndGVzdC9ndGVzdC5oIGluIG91dHB1dF9kaXIuIiIiCi0KLSAgb3V0cHV0X2ZpbGUgPSBmaWxlKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBHVEVTVF9IX09VVFBVVCksICd3JykKLSAgcHJvY2Vzc2VkX2ZpbGVzID0gc2V0cy5TZXQoKSAgIyBIb2xkcyBhbGwgZ3Rlc3QgaGVhZGVycyB3ZSd2ZSBwcm9jZXNzZWQuCi0KLSAgZGVmIFByb2Nlc3NGaWxlKGd0ZXN0X2hlYWRlcl9wYXRoKToKLSAgICAiIiJQcm9jZXNzZXMgdGhlIGdpdmVuIGd0ZXN0IGhlYWRlciBmaWxlLiIiIgotCi0gICAgIyBXZSBkb24ndCBwcm9jZXNzIHRoZSBzYW1lIGhlYWRlciB0d2ljZS4KLSAgICBpZiBndGVzdF9oZWFkZXJfcGF0aCBpbiBwcm9jZXNzZWRfZmlsZXM6Ci0gICAgICByZXR1cm4KLQotICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoZ3Rlc3RfaGVhZGVyX3BhdGgpCi0KLSAgICAjIFJlYWRzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZ3Rlc3QgaGVhZGVyLgotICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKGd0ZXN0X3Jvb3QsIGd0ZXN0X2hlYWRlcl9wYXRoKSwgJ3InKToKLSAgICAgIG0gPSBJTkNMVURFX0dURVNUX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKLSAgICAgIGlmIG06Ci0gICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0Ly4uLiInIC0gbGV0J3MgcHJvY2VzcyBpdCByZWN1cnNpdmVseS4KLSAgICAgICAgUHJvY2Vzc0ZpbGUoJ2luY2x1ZGUvJyArIG0uZ3JvdXAoMSkpCi0gICAgICBlbHNlOgotICAgICAgICAjIE90aGVyd2lzZSB3ZSBjb3B5IHRoZSBsaW5lIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICAgIG91dHB1dF9maWxlLndyaXRlKGxpbmUpCi0KLSAgUHJvY2Vzc0ZpbGUoR1RFU1RfSF9TRUVEKQotICBvdXRwdXRfZmlsZS5jbG9zZSgpCi0KLQotZGVmIEZ1c2VHVGVzdEFsbENjVG9GaWxlKGd0ZXN0X3Jvb3QsIG91dHB1dF9maWxlKToKLSAgIiIiU2NhbnMgZm9sZGVyIGd0ZXN0X3Jvb3QgdG8gZ2VuZXJhdGUgZ3Rlc3QvZ3Rlc3QtYWxsLmNjIGluIG91dHB1dF9maWxlLiIiIgotCi0gIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkKLQotICBkZWYgUHJvY2Vzc0ZpbGUoZ3Rlc3Rfc291cmNlX2ZpbGUpOgotICAgICIiIlByb2Nlc3NlcyB0aGUgZ2l2ZW4gZ3Rlc3Qgc291cmNlIGZpbGUuIiIiCi0KLSAgICAjIFdlIGRvbid0IHByb2Nlc3MgdGhlIHNhbWUgI2luY2x1ZGVkIGZpbGUgdHdpY2UuCi0gICAgaWYgZ3Rlc3Rfc291cmNlX2ZpbGUgaW4gcHJvY2Vzc2VkX2ZpbGVzOgotICAgICAgcmV0dXJuCi0KLSAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGd0ZXN0X3NvdXJjZV9maWxlKQotCi0gICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGd0ZXN0IHNvdXJjZSBmaWxlLgotICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKGd0ZXN0X3Jvb3QsIGd0ZXN0X3NvdXJjZV9maWxlKSwgJ3InKToKLSAgICAgIG0gPSBJTkNMVURFX0dURVNUX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKLSAgICAgIGlmIG06Ci0gICAgICAgIGlmICdpbmNsdWRlLycgKyBtLmdyb3VwKDEpID09IEdURVNUX1NQSV9IX1NFRUQ6Ci0gICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiJy4gIFRoaXMgZmlsZSBpcyBub3QKLSAgICAgICAgICAjICNpbmNsdWRlZCBieSAiZ3Rlc3QvZ3Rlc3QuaCIsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyBpdC4KLSAgICAgICAgICBQcm9jZXNzRmlsZShHVEVTVF9TUElfSF9TRUVEKQotICAgICAgICBlbHNlOgotICAgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0L2Zvby5oIicgd2hlcmUgZm9vIGlzIG5vdCBndGVzdC1zcGkuCi0gICAgICAgICAgIyBXZSB0cmVhdCBpdCBhcyAnI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiJywgYXMgYWxsIG90aGVyCi0gICAgICAgICAgIyBndGVzdCBoZWFkZXJzIGFyZSBiZWluZyBmdXNlZCBpbnRvIGd0ZXN0LmggYW5kIGNhbm5vdCBiZQotICAgICAgICAgICMgI2luY2x1ZGVkIGRpcmVjdGx5LgotCi0gICAgICAgICAgIyBUaGVyZSBpcyBubyBuZWVkIHRvICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIiBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgICBpZiBub3QgR1RFU1RfSF9TRUVEIGluIHByb2Nlc3NlZF9maWxlczoKLSAgICAgICAgICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoR1RFU1RfSF9TRUVEKQotICAgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoJyNpbmNsdWRlICIlcyJcbicgJSAoR1RFU1RfSF9PVVRQVVQsKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIG0gPSBJTkNMVURFX1NSQ19GSUxFX1JFR0VYLm1hdGNoKGxpbmUpCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAic3JjL2ZvbyInIC0gbGV0J3MgcHJvY2VzcyBpdCByZWN1cnNpdmVseS4KLSAgICAgICAgICBQcm9jZXNzRmlsZShtLmdyb3VwKDEpKQotICAgICAgICBlbHNlOgotICAgICAgICAgIG91dHB1dF9maWxlLndyaXRlKGxpbmUpCi0KLSAgUHJvY2Vzc0ZpbGUoR1RFU1RfQUxMX0NDX1NFRUQpCi0KLQotZGVmIEZ1c2VHVGVzdEFsbENjKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpOgotICAiIiJTY2FucyBmb2xkZXIgZ3Rlc3Rfcm9vdCB0byBnZW5lcmF0ZSBndGVzdC9ndGVzdC1hbGwuY2MgaW4gb3V0cHV0X2Rpci4iIiIKLQotICBvdXRwdXRfZmlsZSA9IGZpbGUob3MucGF0aC5qb2luKG91dHB1dF9kaXIsIEdURVNUX0FMTF9DQ19PVVRQVVQpLCAndycpCi0gIEZ1c2VHVGVzdEFsbENjVG9GaWxlKGd0ZXN0X3Jvb3QsIG91dHB1dF9maWxlKQotICBvdXRwdXRfZmlsZS5jbG9zZSgpCi0KLQotZGVmIEZ1c2VHVGVzdChndGVzdF9yb290LCBvdXRwdXRfZGlyKToKLSAgIiIiRnVzZXMgZ3Rlc3QuaCBhbmQgZ3Rlc3QtYWxsLmNjLiIiIgotCi0gIFZhbGlkYXRlR1Rlc3RSb290RGlyKGd0ZXN0X3Jvb3QpCi0gIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpCi0KLSAgRnVzZUdUZXN0SChndGVzdF9yb290LCBvdXRwdXRfZGlyKQotICBGdXNlR1Rlc3RBbGxDYyhndGVzdF9yb290LCBvdXRwdXRfZGlyKQotCi0KLWRlZiBtYWluKCk6Ci0gIGFyZ2MgPSBsZW4oc3lzLmFyZ3YpCi0gIGlmIGFyZ2MgPT0gMjoKLSAgICAjIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgT1VUUFVUX0RJUgotICAgIEZ1c2VHVGVzdChERUZBVUxUX0dURVNUX1JPT1RfRElSLCBzeXMuYXJndlsxXSkKLSAgZWxpZiBhcmdjID09IDM6Ci0gICAgIyBmdXNlX2d0ZXN0X2ZpbGVzLnB5IEdURVNUX1JPT1RfRElSIE9VVFBVVF9ESVIKLSAgICBGdXNlR1Rlc3Qoc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQotICBlbHNlOgotICAgIHByaW50IF9fZG9jX18KLSAgICBzeXMuZXhpdCgxKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zY3JpcHRzL2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgYi90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U3YWIwNC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDczMCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IHYwLjEKLQotR2VuZXJhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHb29nbGUgVGVzdCBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBhbmQKLWFjY29tcGFueWluZyB0ZXN0cy4KLQotVXNhZ2U6Ci0KLSAgZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSBNQVhfQVJJVFkKLQotd2hlcmUgTUFYX0FSSVRZIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4KLQotVGhlIGNvbW1hbmQgZ2VuZXJhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB1cC10byBNQVhfQVJJVFktYXJ5Ci1wcmVkaWNhdGUgYXNzZXJ0aW9ucywgYW5kIHdyaXRlcyBpdCB0byBmaWxlIGd0ZXN0X3ByZWRfaW1wbC5oIGluIHRoZQotZGlyZWN0b3J5IHdoZXJlIHRoZSBzY3JpcHQgaXMuICBJdCBhbHNvIGdlbmVyYXRlcyB0aGUgYWNjb21wYW55aW5nCi11bml0IHRlc3QgaW4gZmlsZSBndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MuCi0iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGltZQotCi0jIFdoZXJlIHRoaXMgc2NyaXB0IGlzLgotU0NSSVBUX0RJUiA9IG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkKLQotIyBXaGVyZSB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIGhlYWRlci4KLUhFQURFUiA9IG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCAnLi4vaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCcpCi0KLSMgV2hlcmUgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCB1bml0IHRlc3QuCi1VTklUX1RFU1QgPSBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgJy4uL3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjJykKLQotCi1kZWYgSGVhZGVyUHJlYW1ibGUobik6Ci0gICIiIlJldHVybnMgdGhlIHByZWFtYmxlIGZvciB0aGUgaGVhZGVyIGZpbGUuCi0KLSAgQXJnczoKLSAgICBuOiAgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIHByZWRpY2F0ZSBtYWNyb3MgdG8gYmUgZ2VuZXJhdGVkLgotICAiIiIKLQotICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHByZWFtYmxlIHRlbXBsYXRlLgotICBERUZTID0gewotICAgICd0b2RheScgOiB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWScpLAotICAgICd5ZWFyJyA6IHRpbWUuc3RyZnRpbWUoJyVZJyksCi0gICAgJ2NvbW1hbmQnIDogJyVzICVzJyAlIChvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSwgbiksCi0gICAgJ24nIDogbgotICAgIH0KLQotICByZXR1cm4gKAotIiIiLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gJSh0b2RheSlzIGJ5IGNvbW1hbmQKLS8vICclKGNvbW1hbmQpcycuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXwotCi0vLyBNYWtlcyBzdXJlIHRoaXMgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBiZWZvcmUgZ3Rlc3QuaC4KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwotIyBlcnJvciBEbyBub3QgaW5jbHVkZSBndGVzdF9wcmVkX2ltcGwuaCBkaXJlY3RseS4gIEluY2x1ZGUgZ3Rlc3QuaCBpbnN0ZWFkLgotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCi0KLS8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uCi0vLyBtYWNyb3M6Ci0vLwotLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkKLS8vICAgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKQotLy8gICAuLi4KLS8vCi0vLyB3aGVyZSBwcmVkX2Zvcm1hdCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCB0YWtlcyBuIChpbiB0aGUKLS8vIGNhc2Ugb2YgQVNTRVJUX1BSRURfRk9STUFUbikgdmFsdWVzIGFuZCB0aGVpciBzb3VyY2UgZXhwcmVzc2lvbgotLy8gdGV4dCwgYW5kIHJldHVybnMgYSB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuICBTZWUgdGhlIGRlZmluaXRpb24KLS8vIG9mIEFTU0VSVF9FUSBpbiBndGVzdC5oIGZvciBhbiBleGFtcGxlLgotLy8KLS8vIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGZvcm1hdHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBtb3JlCi0vLyByZXN0cmljdGl2ZSB2ZXJzaW9uOgotLy8KLS8vICAgQVNTRVJUX1BSRUQxKHByZWQsIHYxKQotLy8gICBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKQotLy8gICAuLi4KLS8vCi0vLyB3aGVyZSBwcmVkIGlzIGFuIG4tYXJ5IGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCByZXR1cm5zIGJvb2wsCi0vLyBhbmQgdGhlIHZhbHVlcyB2MSwgdjIsIC4uLiwgbXVzdCBzdXBwb3J0IHRoZSA8PCBvcGVyYXRvciBmb3IKLS8vIHN0cmVhbWluZyB0byBzdGQ6Om9zdHJlYW0uCi0vLwotLy8gV2UgYWxzbyBkZWZpbmUgdGhlIEVYUEVDVF8qIHZhcmlhdGlvbnMuCi0vLwotLy8gRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgcHJlZGljYXRlcyB3aG9zZSBhcml0eSBpcyBhdCBtb3N0ICUobilzLgotLy8gUGxlYXNlIGVtYWlsIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAotLy8gc3VwcG9ydCBmb3IgaGlnaGVyIGFyaXRpZXMuCi0KLS8vIEdURVNUX0FTU0VSVF8gaXMgdGhlIGJhc2ljIHN0YXRlbWVudCB0byB3aGljaCBhbGwgb2YgdGhlIGFzc2VydGlvbnMKLS8vIGluIHRoaXMgZmlsZSByZWR1Y2UuICBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0KLSNkZWZpbmUgR1RFU1RfQVNTRVJUXyhleHByZXNzaW9uLCBvbl9mYWlsdXJlKSBcXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcXAotICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXIgPSAoZXhwcmVzc2lvbikpIFxcCi0gICAgOyBcXAotICBlbHNlIFxcCi0gICAgb25fZmFpbHVyZShndGVzdF9hci5mYWlsdXJlX21lc3NhZ2UoKSkKLSIiIiAlIERFRlMpCi0KLQotZGVmIEFyaXR5KG4pOgotICAiIiJSZXR1cm5zIHRoZSBFbmdsaXNoIG5hbWUgb2YgdGhlIGdpdmVuIGFyaXR5LiIiIgotCi0gIGlmIG4gPCAwOgotICAgIHJldHVybiBOb25lCi0gIGVsaWYgbiA8PSAzOgotICAgIHJldHVybiBbJ251bGxhcnknLCAndW5hcnknLCAnYmluYXJ5JywgJ3Rlcm5hcnknXVtuXQotICBlbHNlOgotICAgIHJldHVybiAnJXMtYXJ5JyAlIG4KLQotCi1kZWYgVGl0bGUod29yZCk6Ci0gICIiIlJldHVybnMgdGhlIGdpdmVuIHdvcmQgaW4gdGl0bGUgY2FzZS4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgdGhpcyBhbmQgc3RyaW5nJ3MgdGl0bGUoKSBtZXRob2QgaXMgdGhhdCBUaXRsZSgnNC1hcnknKSBpcyAnNC1hcnknCi0gIHdoaWxlICc0LWFyeScudGl0bGUoKSBpcyAnNC1BcnknLiIiIgotCi0gIHJldHVybiB3b3JkWzBdLnVwcGVyKCkgKyB3b3JkWzE6XQotCi0KLWRlZiBPbmVUbyhuKToKLSAgIiIiUmV0dXJucyB0aGUgbGlzdCBbMSwgMiwgMywgLi4uLCBuXS4iIiIKLQotICByZXR1cm4gcmFuZ2UoMSwgbiArIDEpCi0KLQotZGVmIEl0ZXIobiwgZm9ybWF0LCBzZXA9JycpOgotICAiIiJHaXZlbiBhIHBvc2l0aXZlIGludGVnZXIgbiwgYSBmb3JtYXQgc3RyaW5nIHRoYXQgY29udGFpbnMgMCBvcgotICBtb3JlICclcycgZm9ybWF0IHNwZWNzLCBhbmQgb3B0aW9uYWxseSBhIHNlcGFyYXRvciBzdHJpbmcsIHJldHVybnMKLSAgdGhlIGpvaW4gb2YgbiBzdHJpbmdzLCBlYWNoIGZvcm1hdHRlZCB3aXRoIHRoZSBmb3JtYXQgc3RyaW5nIG9uIGFuCi0gIGl0ZXJhdG9yIHJhbmdlZCBmcm9tIDEgdG8gbi4KLQotICBFeGFtcGxlOgotCi0gIEl0ZXIoMywgJ3YlcycsIHNlcD0nLCAnKSByZXR1cm5zICd2MSwgdjIsIHYzJy4KLSAgIiIiCi0KLSAgIyBIb3cgbWFueSAnJXMnIHNwZWNzIGFyZSBpbiBmb3JtYXQ/Ci0gIHNwZWNfY291bnQgPSBsZW4oZm9ybWF0LnNwbGl0KCclcycpKSAtIDEKLSAgcmV0dXJuIHNlcC5qb2luKFtmb3JtYXQgJSAoc3BlY19jb3VudCAqIChpLCkpIGZvciBpIGluIE9uZVRvKG4pXSkKLQotCi1kZWYgSW1wbGVtZW50YXRpb25Gb3JBcml0eShuKToKLSAgIiIiUmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gb2Ygbi1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuIiIiCi0KLSAgIyBBIG1hcCB0aGUgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHRlbXBsYXRlLgotICBERUZTID0gewotICAgICduJyA6IHN0cihuKSwKLSAgICAndnMnIDogSXRlcihuLCAndiVzJywgc2VwPScsICcpLAotICAgICd2dHMnIDogSXRlcihuLCAnI3YlcycsIHNlcD0nLCAnKSwKLSAgICAnYXJpdHknIDogQXJpdHkobiksCi0gICAgJ0FyaXR5JyA6IFRpdGxlKEFyaXR5KG4pKQotICAgIH0KLQotICBpbXBsID0gIiIiCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEJShuKXMuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQiIiIgJSBERUZTCi0KLSAgaW1wbCArPSBJdGVyKG4sICIiIiwKLSAgICAgICAgICB0eXBlbmFtZSBUJXMiIiIpCi0KLSAgaW1wbCArPSAiIiI+Ci1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZCUobilzSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCIiIiAlIERFRlMKLQotICBpbXBsICs9IEl0ZXIobiwgIiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUlcyIiIikKLQotICBpbXBsICs9ICIiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQiIiIKLQotICBpbXBsICs9IEl0ZXIobiwgIiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQlcyYgdiVzIiIiKQotCi0gIGltcGwgKz0gIiIiKSB7Ci0gIGlmIChwcmVkKCUodnMpcykpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSIiIiAlIERFRlMKLQotICBpbXBsICs9ICcgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIicKLQotICBpbXBsICs9IEl0ZXIobiwgIiIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZSVzIiIiLCBzZXA9JyA8PCAiLCAiJykKLQotICBpbXBsICs9ICcgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSInCi0KLSAgaW1wbCArPSBJdGVyKG4sICIiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcXG4iIDw8IGUlcyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYlcyIiIikKLQotICBpbXBsICs9ICIiIjsKLX0KLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQlKG4pcy4KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQlKG4pc18ocHJlZF9mb3JtYXQsICUodnMpcywgb25fZmFpbHVyZSlcXAotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCUodnRzKXMsICUodnMpcyksIFxcCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRCUobilzLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRCUobilzXyhwcmVkLCAlKHZzKXMsIG9uX2ZhaWx1cmUpXFwKLSAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQlKG4pc0hlbHBlcigjcHJlZCIiIiAlIERFRlMKLQotICBpbXBsICs9IEl0ZXIobiwgIiIiLCBcXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YlcyIiIikKLQotICBpbXBsICs9ICIiIiwgXFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQiIiIKLQotICBpbXBsICs9IEl0ZXIobiwgIiIiLCBcXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiVzIiIiKQotCi0gIGltcGwgKz0gIiIiKSwgb25fZmFpbHVyZSkKLQotLy8gJShBcml0eSlzIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQlKG4pcyhwcmVkX2Zvcm1hdCwgJSh2cylzKSBcXAotICBHVEVTVF9QUkVEX0ZPUk1BVCUobilzXyhwcmVkX2Zvcm1hdCwgJSh2cylzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX1BSRUQlKG4pcyhwcmVkLCAlKHZzKXMpIFxcCi0gIEdURVNUX1BSRUQlKG4pc18ocHJlZCwgJSh2cylzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUJShuKXMocHJlZF9mb3JtYXQsICUodnMpcykgXFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQlKG4pc18ocHJlZF9mb3JtYXQsICUodnMpcywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEJShuKXMocHJlZCwgJSh2cylzKSBcXAotICBHVEVTVF9QUkVEJShuKXNfKHByZWQsICUodnMpcywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLSIiIiAlIERFRlMKLQotICByZXR1cm4gaW1wbAotCi0KLWRlZiBIZWFkZXJQb3N0YW1ibGUoKToKLSAgIiIiUmV0dXJucyB0aGUgcG9zdGFtYmxlIGZvciB0aGUgaGVhZGVyIGZpbGUuIiIiCi0KLSAgcmV0dXJuICIiIgotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCi0iIiIKLQotCi1kZWYgR2VuZXJhdGVGaWxlKHBhdGgsIGNvbnRlbnQpOgotICAiIiJHaXZlbiBhIGZpbGUgcGF0aCBhbmQgYSBjb250ZW50IHN0cmluZywgb3ZlcndyaXRlcyBpdCB3aXRoIHRoZQotICBnaXZlbiBjb250ZW50LiIiIgotCi0gIHByaW50ICdVcGRhdGluZyBmaWxlICVzIC4gLiAuJyAlIHBhdGgKLQotICBmID0gZmlsZShwYXRoLCAndysnKQotICBwcmludCA+PmYsIGNvbnRlbnQsCi0gIGYuY2xvc2UoKQotCi0gIHByaW50ICdGaWxlICVzIGhhcyBiZWVuIHVwZGF0ZWQuJyAlIHBhdGgKLQotCi1kZWYgR2VuZXJhdGVIZWFkZXIobik6Ci0gICIiIkdpdmVuIHRoZSBtYXhpbXVtIGFyaXR5IG4sIHVwZGF0ZXMgdGhlIGhlYWRlciBmaWxlIHRoYXQgaW1wbGVtZW50cwotICB0aGUgcHJlZGljYXRlIGFzc2VydGlvbnMuIiIiCi0KLSAgR2VuZXJhdGVGaWxlKEhFQURFUiwKLSAgICAgICAgICAgICAgIEhlYWRlclByZWFtYmxlKG4pCi0gICAgICAgICAgICAgICArICcnLmpvaW4oW0ltcGxlbWVudGF0aW9uRm9yQXJpdHkoaSkgZm9yIGkgaW4gT25lVG8obildKQotICAgICAgICAgICAgICAgKyBIZWFkZXJQb3N0YW1ibGUoKSkKLQotCi1kZWYgVW5pdFRlc3RQcmVhbWJsZSgpOgotICAiIiJSZXR1cm5zIHRoZSBwcmVhbWJsZSBmb3IgdGhlIHVuaXQgdGVzdCBmaWxlLiIiIgotCi0gICMgQSBtYXAgdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgcHJlYW1ibGUgdGVtcGxhdGUuCi0gIERFRlMgPSB7Ci0gICAgJ3RvZGF5JyA6IHRpbWUuc3RyZnRpbWUoJyVtLyVkLyVZJyksCi0gICAgJ3llYXInIDogdGltZS5zdHJmdGltZSgnJVknKSwKLSAgICAnY29tbWFuZCcgOiAnJXMgJXMnICUgKG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pLCBzeXMuYXJndlsxXSksCi0gICAgfQotCi0gIHJldHVybiAoCi0iIiIvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAlKHRvZGF5KXMgYnkgY29tbWFuZAotLy8gJyUoY29tbWFuZClzJy4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0KLS8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgZ3Rlc3RfcHJlZF9pbXBsLmgKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgc2NyaXB0IGFuZCBxdWl0ZSBsb25nLiAgSWYgeW91IGludGVuZCB0bwotLy8gbGVhcm4gaG93IEdvb2dsZSBUZXN0IHdvcmtzIGJ5IHJlYWRpbmcgaXRzIHVuaXQgdGVzdHMsIHJlYWQKLS8vIGd0ZXN0X3VuaXR0ZXN0LmNjIGluc3RlYWQuCi0vLwotLy8gVGhpcyBpcyBpbnRlbmRlZCBhcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhlIEdvb2dsZSBUZXN0IHByZWRpY2F0ZQotLy8gYXNzZXJ0aW9ucy4gIFdlIGNvbXBpbGUgaXQgYXMgcGFydCBvZiB0aGUgZ3Rlc3RfdW5pdHRlc3QgdGFyZ2V0Ci0vLyBvbmx5IHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIHRpZHkgYW5kIGNvbXBhY3QsIGFzIGl0IGlzIHF1aXRlCi0vLyBpbnZvbHZlZCB0byBzZXQgdXAgdGhlIHN0YWdlIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IHVzaW5nIEdvb2dsZQotLy8gVGVzdCBpdHNlbGYuCi0vLwotLy8gQ3VycmVudGx5LCBndGVzdF91bml0dGVzdCB0YWtlcyB+MTEgc2Vjb25kcyB0byBydW4gaW4gdGhlIHRlc3RpbmcKLS8vIGRhZW1vbi4gIEluIHRoZSBmdXR1cmUsIGlmIGl0IGdyb3dzIHRvbyBsYXJnZSBhbmQgbmVlZHMgbXVjaCBtb3JlCi0vLyB0aW1lIHRvIGZpbmlzaCwgd2Ugc2hvdWxkIGNvbnNpZGVyIHNlcGFyYXRpbmcgdGhpcyBmaWxlIGludG8gYQotLy8gc3RhbmQtYWxvbmUgcmVncmVzc2lvbiB0ZXN0LgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgotCi0vLyBBIHVzZXItZGVmaW5lZCBkYXRhIHR5cGUuCi1zdHJ1Y3QgQm9vbCB7Ci0gIGV4cGxpY2l0IEJvb2woaW50IHZhbCkgOiB2YWx1ZSh2YWwgIT0gMCkge30KLQotICBib29sIG9wZXJhdG9yPihpbnQgbikgY29uc3QgeyByZXR1cm4gdmFsdWUgPiBCb29sKG4pLnZhbHVlOyB9Ci0KLSAgQm9vbCBvcGVyYXRvcisoY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiBCb29sKHZhbHVlICsgcmhzLnZhbHVlKTsgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCb29sJiByaHMpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IHJocy52YWx1ZTsgfQotCi0gIGJvb2wgdmFsdWU7Ci19OwotCi0vLyBFbmFibGVzIEJvb2wgdG8gYmUgdXNlZCBpbiBhc3NlcnRpb25zLgotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJvb2wmIHgpIHsKLSAgcmV0dXJuIG9zIDw8ICh4LnZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci19Ci0KLSIiIiAlIERFRlMpCi0KLQotZGVmIFRlc3RzRm9yQXJpdHkobik6Ci0gICIiIlJldHVybnMgdGhlIHRlc3RzIGZvciBuLWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4iIiIKLQotICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIGZvciB0aGUgdGVzdHMuCi0gIERFRlMgPSB7Ci0gICAgJ24nIDogbiwKLSAgICAnZXMnIDogSXRlcihuLCAnZSVzJywgc2VwPScsICcpLAotICAgICd2cycgOiBJdGVyKG4sICd2JXMnLCBzZXA9JywgJyksCi0gICAgJ3Z0cycgOiBJdGVyKG4sICcjdiVzJywgc2VwPScsICcpLAotICAgICd0dnMnIDogSXRlcihuLCAnVCVzIHYlcycsIHNlcD0nLCAnKSwKLSAgICAnaW50X3ZzJyA6IEl0ZXIobiwgJ2ludCB2JXMnLCBzZXA9JywgJyksCi0gICAgJ0Jvb2xfdnMnIDogSXRlcihuLCAnQm9vbCB2JXMnLCBzZXA9JywgJyksCi0gICAgJ3R5cGVzJyA6IEl0ZXIobiwgJ3R5cGVuYW1lIFQlcycsIHNlcD0nLCAnKSwKLSAgICAndl9zdW0nIDogSXRlcihuLCAndiVzJywgc2VwPScgKyAnKSwKLSAgICAnYXJpdHknIDogQXJpdHkobiksCi0gICAgJ0FyaXR5JyA6IFRpdGxlKEFyaXR5KG4pKSwKLSAgICB9Ci0KLSAgdGVzdHMgPSAoCi0iIiIvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nICUoYXJpdHkpcyBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KLQotLy8gQSAlKGFyaXR5KXMgcHJlZGljYXRlIGZ1bmN0aW9uLgotdGVtcGxhdGUgPCUodHlwZXMpcz4KLWJvb2wgUHJlZEZ1bmN0aW9uJShuKXMoJSh0dnMpcykgewotICByZXR1cm4gJSh2X3N1bSlzID4gMDsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgotLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCi0vLyBmdW5jdGlvbi4KLWJvb2wgUHJlZEZ1bmN0aW9uJShuKXNJbnQoJShpbnRfdnMpcykgewotICByZXR1cm4gJSh2X3N1bSlzID4gMDsKLX0KLWJvb2wgUHJlZEZ1bmN0aW9uJShuKXNCb29sKCUoQm9vbF92cylzKSB7Ci0gIHJldHVybiAlKHZfc3VtKXMgPiAwOwotfQotIiIiICUgREVGUykKLQotICB0ZXN0cyArPSAiIiIKLS8vIEEgJShhcml0eSlzIHByZWRpY2F0ZSBmdW5jdG9yLgotc3RydWN0IFByZWRGdW5jdG9yJShuKXMgewotICB0ZW1wbGF0ZSA8JSh0eXBlcylzPgotICBib29sIG9wZXJhdG9yKCkoIiIiICUgREVGUwotCi0gIHRlc3RzICs9IEl0ZXIobiwgJ2NvbnN0IFQlcyYgdiVzJywgc2VwPSIiIiwKLSAgICAgICAgICAgICAgICAgICIiIikKLQotICB0ZXN0cyArPSAiIiIpIHsKLSAgICByZXR1cm4gJSh2X3N1bSlzID4gMDsKLSAgfQotfTsKLSIiIiAlIERFRlMKLQotICB0ZXN0cyArPSAiIiIKLS8vIEEgJShhcml0eSlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8JSh0eXBlcylzPgotdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbiUobilzKCIiIiAlIERFRlMKLQotICB0ZXN0cyArPSBJdGVyKG4sICdjb25zdCBjaGFyKiBlJXMnLCBzZXA9IiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQotCi0gIHRlc3RzICs9IEl0ZXIobiwgIiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCVzJiB2JXMiIiIpCi0KLSAgdGVzdHMgKz0gIiIiKSB7Ci0gIGlmIChQcmVkRnVuY3Rpb24lKG4pcyglKHZzKXMpKQotICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgPDwgIiIiICUgREVGUwotCi0gIHRlc3RzICs9IEl0ZXIobiwgJ2UlcycsIHNlcD0nIDw8ICIgKyAiIDw8ICcpCi0KLSAgdGVzdHMgKz0gIiIiCi0gICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKLSAgICAgIDw8ICUodl9zdW0pcyA8PCAiLiI7Ci19Ci0iIiIgJSBERUZTCi0KLSAgdGVzdHMgKz0gIiIiCi0vLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCi1zdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3IlKG4pcyB7Ci0gIHRlbXBsYXRlIDwlKHR5cGVzKXM+Ci0gIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKCIiIiAlIERFRlMKLQotICB0ZXN0cyArPSBJdGVyKG4sICdjb25zdCBjaGFyKiBlJXMnLCBzZXA9IiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCi0KLSAgdGVzdHMgKz0gSXRlcihuLCAiIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQlcyYgdiVzIiIiKQotCi0gIHRlc3RzICs9ICIiIikgY29uc3QgewotICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb24lKG4pcyglKGVzKXMsICUodnMpcyk7Ci0gIH0KLX07Ci0iIiIgJSBERUZTCi0KLSAgdGVzdHMgKz0gIiIiCi0vLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUJShuKXMuCi0KLWNsYXNzIFByZWRpY2F0ZSUobilzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBleHBlY3RlZF90b19maW5pc2hfID0gdHJ1ZTsKLSAgICBmaW5pc2hlZF8gPSBmYWxzZTsiIiIgJSBERUZTCi0KLSAgdGVzdHMgKz0gIiIiCi0gICAgIiIiICsgSXRlcihuLCAnbiVzXyA9ICcpICsgIiIiMDsKLSAgfQotIiIiCi0KLSAgdGVzdHMgKz0gIiIiCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCi0gICAgLy8gZXhhY3RseSBvbmNlLiIiIgotCi0gIHRlc3RzICs9ICcnLmpvaW4oWyIiIgotICAgIEVYUEVDVF9FUSgxLCBuJXNfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50ICVzICIKLSAgICAgICAgImV4YWN0bHkgb25jZS4iOyIiIiAlIChpLCBpICsgMSkgZm9yIGkgaW4gT25lVG8obildKQotCi0gIHRlc3RzICs9ICIiIgotCi0gICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgotICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKLSAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKLSAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgewotICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKLSAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKLSAgICB9Ci0gIH0KLQotICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgotICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOwotCi0gIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgotICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87Ci0iIiIgJSBERUZTCi0KLSAgdGVzdHMgKz0gSXRlcihuLCAiIiIKLSAgc3RhdGljIGludCBuJXNfOyIiIikKLQotICB0ZXN0cyArPSAiIiIKLX07Ci0KLWJvb2wgUHJlZGljYXRlJShuKXNUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOwotYm9vbCBQcmVkaWNhdGUlKG4pc1Rlc3Q6OmZpbmlzaGVkXzsKLSIiIiAlIERFRlMKLQotICB0ZXN0cyArPSBJdGVyKG4sICIiImludCBQcmVkaWNhdGUlJShuKXNUZXN0OjpuJXNfOwotIiIiKSAlIERFRlMKLQotICB0ZXN0cyArPSAiIiIKLXR5cGVkZWYgUHJlZGljYXRlJShuKXNUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVCUobilzVGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlJShuKXNUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVCUobilzVGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlJShuKXNUZXN0IEVYUEVDVF9QUkVEJShuKXNUZXN0OwotdHlwZWRlZiBQcmVkaWNhdGUlKG4pc1Rlc3QgQVNTRVJUX1BSRUQlKG4pc1Rlc3Q7Ci0iIiIgJSBERUZTCi0KLSAgZGVmIEdlblRlc3QodXNlX2Zvcm1hdCwgdXNlX2Fzc2VydCwgZXhwZWN0X2ZhaWx1cmUsCi0gICAgICAgICAgICAgIHVzZV9mdW5jdG9yLCB1c2VfdXNlcl90eXBlKToKLSAgICAiIiJSZXR1cm5zIHRoZSB0ZXN0IGZvciBhIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm8uCi0KLSAgICBBcmdzOgotICAgICAgdXNlX2Zvcm1hdDogICAgIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYSAqX1BSRURfRk9STUFUKi4KLSAgICAgIHVzZV9hc3NlcnQ6ICAgICB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEgQVNTRVJUXyouCi0gICAgICBleHBlY3RfZmFpbHVyZTogdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBleHBlY3RlZCB0byBmYWlsLgotICAgICAgdXNlX2Z1bmN0b3I6ICAgIHRydWUgaWZmIHRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYXNzZXJ0aW9uIGlzCi0gICAgICAgICAgICAgICAgICAgICAgYSBmdW5jdG9yIChhcyBvcHBvc2VkIHRvIGEgZnVuY3Rpb24pCi0gICAgICB1c2VfdXNlcl90eXBlOiAgdHJ1ZSBpZmYgdGhlIHByZWRpY2F0ZSBmdW5jdG9yL2Z1bmN0aW9uIHRha2VzCi0gICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQocykgb2YgYSB1c2VyLWRlZmluZWQgdHlwZS4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICAgIEdlblRlc3QoMSwgMCwgMCwgMSwgMCkgcmV0dXJucyBhIHRlc3QgdGhhdCB0ZXN0cyB0aGUgYmVoYXZpb3IKLSAgICAgIG9mIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVRuKCkgdGhhdCB0YWtlcyBhIGZ1bmN0b3IKLSAgICAgIHdob3NlIGFyZ3VtZW50cyBoYXZlIGJ1aWx0LWluIHR5cGVzLiIiIgotCi0gICAgaWYgdXNlX2Fzc2VydDoKLSAgICAgIGFzc3J0ID0gJ0FTU0VSVCcgICMgJ2Fzc2VydCcgaXMgcmVzZXJ2ZWQsIHNvIHdlIGNhbm5vdCB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICMgdGhhdCBpZGVudGlmaWVyIGhlcmUuCi0gICAgZWxzZToKLSAgICAgIGFzc3J0ID0gJ0VYUEVDVCcKLQotICAgIGFzc2VydGlvbiA9IGFzc3J0ICsgJ19QUkVEJwotCi0gICAgaWYgdXNlX2Zvcm1hdDoKLSAgICAgIHByZWRfZm9ybWF0ID0gJ1ByZWRGb3JtYXQnCi0gICAgICBhc3NlcnRpb24gKz0gJ19GT1JNQVQnCi0gICAgZWxzZToKLSAgICAgIHByZWRfZm9ybWF0ID0gJ1ByZWQnCi0KLSAgICBhc3NlcnRpb24gKz0gJyUobilzJyAlIERFRlMKLQotICAgIGlmIHVzZV9mdW5jdG9yOgotICAgICAgcHJlZF9mb3JtYXRfdHlwZSA9ICdmdW5jdG9yJwotICAgICAgcHJlZF9mb3JtYXQgKz0gJ0Z1bmN0b3IlKG4pcygpJwotICAgIGVsc2U6Ci0gICAgICBwcmVkX2Zvcm1hdF90eXBlID0gJ2Z1bmN0aW9uJwotICAgICAgcHJlZF9mb3JtYXQgKz0gJ0Z1bmN0aW9uJShuKXMnCi0gICAgICBpZiBub3QgdXNlX2Zvcm1hdDoKLSAgICAgICAgaWYgdXNlX3VzZXJfdHlwZToKLSAgICAgICAgICBwcmVkX2Zvcm1hdCArPSAnQm9vbCcKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBwcmVkX2Zvcm1hdCArPSAnSW50JwotCi0gICAgdGVzdF9uYW1lID0gcHJlZF9mb3JtYXRfdHlwZS50aXRsZSgpCi0KLSAgICBpZiB1c2VfdXNlcl90eXBlOgotICAgICAgYXJnX3R5cGUgPSAndXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpJwotICAgICAgdGVzdF9uYW1lICs9ICdPblVzZXJUeXBlJwotICAgICAgaWYgZXhwZWN0X2ZhaWx1cmU6Ci0gICAgICAgIGFyZyA9ICdCb29sKG4lc18rKyknCi0gICAgICBlbHNlOgotICAgICAgICBhcmcgPSAnQm9vbCgrK24lc18pJwotICAgIGVsc2U6Ci0gICAgICBhcmdfdHlwZSA9ICdidWlsdC1pbiB0eXBlIChpbnQpJwotICAgICAgdGVzdF9uYW1lICs9ICdPbkJ1aWx0SW5UeXBlJwotICAgICAgaWYgZXhwZWN0X2ZhaWx1cmU6Ci0gICAgICAgIGFyZyA9ICduJXNfKysnCi0gICAgICBlbHNlOgotICAgICAgICBhcmcgPSAnKytuJXNfJwotCi0gICAgaWYgZXhwZWN0X2ZhaWx1cmU6Ci0gICAgICBzdWNjZXNzZnVsX29yX2ZhaWxlZCA9ICdmYWlsZWQnCi0gICAgICBleHBlY3RlZF9vcl9ub3QgPSAnZXhwZWN0ZWQuJwotICAgICAgdGVzdF9uYW1lICs9ICAnRmFpbHVyZScKLSAgICBlbHNlOgotICAgICAgc3VjY2Vzc2Z1bF9vcl9mYWlsZWQgPSAnc3VjY2Vzc2Z1bCcKLSAgICAgIGV4cGVjdGVkX29yX25vdCA9ICdVTkVYUEVDVEVEIScKLSAgICAgIHRlc3RfbmFtZSArPSAgJ1N1Y2Nlc3MnCi0KLSAgICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHRlc3QgdGVtcGxhdGUuCi0gICAgZGVmcyA9IERFRlMuY29weSgpCi0gICAgZGVmcy51cGRhdGUoewotICAgICAgJ2Fzc2VydCcgOiBhc3NydCwKLSAgICAgICdhc3NlcnRpb24nIDogYXNzZXJ0aW9uLAotICAgICAgJ3Rlc3RfbmFtZScgOiB0ZXN0X25hbWUsCi0gICAgICAncGZfdHlwZScgOiBwcmVkX2Zvcm1hdF90eXBlLAotICAgICAgJ3BmJyA6IHByZWRfZm9ybWF0LAotICAgICAgJ2FyZ190eXBlJyA6IGFyZ190eXBlLAotICAgICAgJ2FyZycgOiBhcmcsCi0gICAgICAnc3VjY2Vzc2Z1bCcgOiBzdWNjZXNzZnVsX29yX2ZhaWxlZCwKLSAgICAgICdleHBlY3RlZCcgOiBleHBlY3RlZF9vcl9ub3QsCi0gICAgICB9KQotCi0gICAgdGVzdCA9ICIiIgotLy8gVGVzdHMgYSAlKHN1Y2Nlc3NmdWwpcyAlKGFzc2VydGlvbilzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhICUocGZfdHlwZSlzIG9uIGEgJShhcmdfdHlwZSlzLgotVEVTVF9GKCUoYXNzZXJ0aW9uKXNUZXN0LCAlKHRlc3RfbmFtZSlzKSB7IiIiICUgZGVmcwotCi0gICAgaW5kZW50ID0gKGxlbihhc3NlcnRpb24pICsgMykqJyAnCi0gICAgZXh0cmFfaW5kZW50ID0gJycKLQotICAgIGlmIGV4cGVjdF9mYWlsdXJlOgotICAgICAgZXh0cmFfaW5kZW50ID0gJyAgJwotICAgICAgaWYgdXNlX2Fzc2VydDoKLSAgICAgICAgdGVzdCArPSAiIiIKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQiIiIKLSAgICAgIGVsc2U6Ci0gICAgICAgIHRlc3QgKz0gIiIiCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVCIiIgotCi0gICAgdGVzdCArPSAnXG4nICsgZXh0cmFfaW5kZW50ICsgIiIiICAlKGFzc2VydGlvbilzKCUocGYpcyIiIiAlIGRlZnMKLQotICAgIHRlc3QgPSB0ZXN0ICUgZGVmcwotICAgIHRlc3QgKz0gSXRlcihuLCAnLFxuJyArIGluZGVudCArIGV4dHJhX2luZGVudCArICclKGFyZylzJyAlIGRlZnMpCi0gICAgdGVzdCArPSAnKTtcbicgKyBleHRyYV9pbmRlbnQgKyAnICBmaW5pc2hlZF8gPSB0cnVlO1xuJwotCi0gICAgaWYgZXhwZWN0X2ZhaWx1cmU6Ci0gICAgICB0ZXN0ICs9ICcgIH0sICIiKTtcbicKLQotICAgIHRlc3QgKz0gJ31cbicKLSAgICByZXR1cm4gdGVzdAotCi0gICMgR2VuZXJhdGVzIHRlc3RzIGZvciBhbGwgMioqNiA9IDY0IGNvbWJpbmF0aW9ucy4KLSAgdGVzdHMgKz0gJycuam9pbihbR2VuVGVzdCh1c2VfZm9ybWF0LCB1c2VfYXNzZXJ0LCBleHBlY3RfZmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZnVuY3RvciwgdXNlX3VzZXJfdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIHVzZV9mb3JtYXQgaW4gWzAsIDFdCi0gICAgICAgICAgICAgICAgICAgIGZvciB1c2VfYXNzZXJ0IGluIFswLCAxXQotICAgICAgICAgICAgICAgICAgICBmb3IgZXhwZWN0X2ZhaWx1cmUgaW4gWzAsIDFdCi0gICAgICAgICAgICAgICAgICAgIGZvciB1c2VfZnVuY3RvciBpbiBbMCwgMV0KLSAgICAgICAgICAgICAgICAgICAgZm9yIHVzZV91c2VyX3R5cGUgaW4gWzAsIDFdCi0gICAgICAgICAgICAgICAgICAgIF0pCi0KLSAgcmV0dXJuIHRlc3RzCi0KLQotZGVmIFVuaXRUZXN0UG9zdGFtYmxlKCk6Ci0gICIiIlJldHVybnMgdGhlIHBvc3RhbWJsZSBmb3IgdGhlIHRlc3RzLiIiIgotCi0gIHJldHVybiAnJwotCi0KLWRlZiBHZW5lcmF0ZVVuaXRUZXN0KG4pOgotICAiIiJSZXR1cm5zIHRoZSB0ZXN0cyBmb3IgdXAtdG8gbi1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuIiIiCi0KLSAgR2VuZXJhdGVGaWxlKFVOSVRfVEVTVCwKLSAgICAgICAgICAgICAgIFVuaXRUZXN0UHJlYW1ibGUoKQotICAgICAgICAgICAgICAgKyAnJy5qb2luKFtUZXN0c0ZvckFyaXR5KGkpIGZvciBpIGluIE9uZVRvKG4pXSkKLSAgICAgICAgICAgICAgICsgVW5pdFRlc3RQb3N0YW1ibGUoKSkKLQotCi1kZWYgX01haW4oKToKLSAgIiIiVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBzY3JpcHQuICBHZW5lcmF0ZXMgdGhlIGhlYWRlciBmaWxlIGFuZCBpdHMKLSAgdW5pdCB0ZXN0LiIiIgotCi0gIGlmIGxlbihzeXMuYXJndikgIT0gMjoKLSAgICBwcmludCBfX2RvY19fCi0gICAgcHJpbnQgJ0F1dGhvcjogJyArIF9fYXV0aG9yX18KLSAgICBzeXMuZXhpdCgxKQotCi0gIG4gPSBpbnQoc3lzLmFyZ3ZbMV0pCi0gIEdlbmVyYXRlSGVhZGVyKG4pCi0gIEdlbmVyYXRlVW5pdFRlc3QobikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBfTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluIGIvdGVzdGluZy9ndGVzdC9zY3JpcHRzL2d0ZXN0LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgwZjg0My4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIFRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi1uYW1lPSJAUEFDS0FHRV9UQVJOQU1FQCIKLXZlcnNpb249IkBQQUNLQUdFX1ZFUlNJT05AIgotCi1zaG93X3VzYWdlKCkKLXsKLSAgZWNobyAiVXNhZ2U6IGd0ZXN0LWNvbmZpZyBbT1BUSU9OUy4uLl0iCi19Ci0KLXNob3dfaGVscCgpCi17Ci0gIHNob3dfdXNhZ2UKLSAgY2F0IDw8XEVPRgotCi1UaGUgYGd0ZXN0LWNvbmZpZycgc2NyaXB0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbmVjZXNzYXJ5IGNvbXBpbGUgYW5kIGxpbmtpbmcKLWZsYWdzIHRvIGNvbm5lY3Qgd2l0aCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLCBib3RoIGluIGEgYnVpbGQgcHJpb3IgdG8KLWluc3RhbGxhdGlvbiwgYW5kIG9uIHRoZSBzeXN0ZW0gcHJvcGVyIGFmdGVyIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbgotb3ZlcnJpZGVzIG1heSBiZSBpc3N1ZWQgaW4gY29tYmluYXRpb24gd2l0aCBhbnkgb3RoZXIgcXVlcmllcywgYnV0IHdpbGwgb25seQotYWZmZWN0IGluc3RhbGxhdGlvbiBxdWVyaWVzIGlmIGNhbGxlZCBvbiBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIGd0ZXN0LiBUaGUKLWluc3RhbGxhdGlvbiBxdWVyaWVzIG1heSBub3QgYmUgaXNzdWVkIHdpdGggYW55IG90aGVyIHR5cGVzIG9mIHF1ZXJpZXMsIGFuZAotb25seSBvbmUgaW5zdGFsbGF0aW9uIHF1ZXJ5IG1heSBiZSBtYWRlIGF0IGEgdGltZS4gVGhlIHZlcnNpb24gcXVlcmllcyBhbmQKLWNvbXBpbGVyIGZsYWcgcXVlcmllcyBtYXkgYmUgY29tYmluZWQgYXMgZGVzaXJlZCBidXQgbm90IG1peGVkLiBEaWZmZXJlbnQKLXZlcnNpb24gcXVlcmllcyBhcmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggbG9naWNhbCAiYW5kIiBzZW1hbnRpY3MsIGFuZCBvbmx5IHRoZQotbGFzdCBvZiBhbnkgcGFydGljdWxhciBxdWVyeSBpcyB1c2VkIHdoaWxlIGFsbCBwcmV2aW91cyBvbmVzIGlnbm9yZWQuIEFsbAotdmVyc2lvbnMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzLgotQ29tcGlsZXIgZmxhZyBxdWVyaWVzIG91dHB1dCB0aGUgdW5pb24gb2YgdGhlIHNldHMgb2YgZmxhZ3Mgd2hlbiBjb21iaW5lZC4KLQotIEV4YW1wbGVzOgotICBndGVzdC1jb25maWcgLS1taW4tdmVyc2lvbj0xLjAgfHwgZWNobyAiSW5zdWZmaWNpZW50IEdvb2dsZSBUZXN0IHZlcnNpb24uIgotCi0gIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWNwcGZsYWdzIC0tY3h4ZmxhZ3MpIC1vIGZvby5vIC1jIGZvby5jcHAKLSAgZysrICQoZ3Rlc3QtY29uZmlnIC0tbGRmbGFncyAtLWxpYnMpIC1vIGZvbyBmb28ubwotCi0gICMgV2hlbiB1c2luZyBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIEdvb2dsZSBUZXN0OgotICBnKysgJCguLi8uLi9teV9ndGVzdF9idWlsZC9zY3JpcHRzL2d0ZXN0LWNvbmZpZyAuLi4pIC4uLgotCi0gICMgV2hlbiB1c2luZyBhbiBpbnN0YWxsZWQgR29vZ2xlIFRlc3QsIGJ1dCB3aXRoIGluc3RhbGxhdGlvbiBvdmVycmlkZXM6Ci0gIGV4cG9ydCBHVEVTVF9QUkVGSVg9Ii9vcHQiCi0gIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWxpYmRpcj0iL29wdC9saWI2NCIgLi4uKSAuLi4KLQotIEhlbHA6Ci0gIC0tdXNhZ2UgICAgICAgICAgICAgICAgICAgIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uCi0gIC0taGVscCAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKLQotIEluc3RhbGxhdGlvbiBPdmVycmlkZXM6Ci0gIC0tcHJlZml4PTxkaXI+ICAgICAgICAgICAgIG92ZXJyaWRlcyB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeAotICAtLWV4ZWMtcHJlZml4PTxkaXI+ICAgICAgICBvdmVycmlkZXMgdGhlIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAotICAtLWxpYmRpcj08ZGlyPiAgICAgICAgICAgICBvdmVycmlkZXMgdGhlIGxpYnJhcnkgaW5zdGFsbGF0aW9uIHByZWZpeAotICAtLWluY2x1ZGVkaXI9PGRpcj4gICAgICAgICBvdmVycmlkZXMgdGhlIGhlYWRlciBmaWxlIGluc3RhbGxhdGlvbiBwcmVmaXgKLQotIEluc3RhbGxhdGlvbiBRdWVyaWVzOgotICAtLXByZWZpeCAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gcHJlZml4Ci0gIC0tZXhlYy1wcmVmaXggICAgICAgICAgICAgIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAotICAtLWxpYmRpciAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKLSAgLS1pbmNsdWRlZGlyICAgICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFRlc3QgaW5zdGFsbGF0aW9uCi0KLSBWZXJzaW9uIFF1ZXJpZXM6Ci0gIC0tbWluLXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IGxlYXN0IFZFUlNJT04KLSAgLS1leGFjdC12ZXJzaW9uPVZFUlNJT04gICAgcmV0dXJuIDAgaWYgdGhlIHZlcnNpb24gaXMgZXhhY3RseSBWRVJTSU9OCi0gIC0tbWF4LXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IG1vc3QgVkVSU0lPTgotCi0gQ29tcGlsYXRpb24gRmxhZyBRdWVyaWVzOgotICAtLWNwcGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIHNwZWNpZmljIHRvIHRoZSBDLWxpa2UgcHJlcHJvY2Vzc29ycwotICAtLWN4eGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIGFwcHJvcHJpYXRlIGZvciBDKysgcHJvZ3JhbXMKLSAgLS1sZGZsYWdzICAgICAgICAgICAgICAgICAgbGlua2VyIGZsYWdzCi0gIC0tbGlicyAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBmb3IgbGlua2luZwotCi1FT0YKLX0KLQotIyBUaGlzIGZ1bmN0aW9uIGJvdW5kcyBvdXIgdmVyc2lvbiB3aXRoIGEgbWluIGFuZCBhIG1heC4gSXQgdXNlcyBzb21lIGNsZXZlcgotIyBQT1NJWC1jb21wbGlhbnQgdmFyaWFibGUgZXhwYW5zaW9uIHRvIHBvcnRhYmx5IGRvIGFsbCB0aGUgd29yayBpbiB0aGUgc2hlbGwKLSMgYW5kIGF2b2lkIGFueSBkZXBlbmRlbmN5IG9uIGEgcGFydGljdWxhciAic2VkIiBvciAiYXdrIiBpbXBsZW1lbnRhdGlvbi4KLSMgTm90YWJsZSBpcyB0aGF0IGl0IHdpbGwgb25seSBldmVyIGNvbXBhcmUgdGhlIGZpcnN0IDMgY29tcG9uZW50cyBvZiB2ZXJzaW9ucy4KLSMgRnVydGhlciBjb21wb25lbnRzIHdpbGwgYmUgY2xlYW5seSBzdHJpcHBlZCBvZmYuIEFsbCB2ZXJzaW9ucyBtdXN0IGJlCi0jIHVuYWRvcm5lZCwgc28gInYxLjAiIHdpbGwgKm5vdCogd29yay4gVGhlIG1pbmltdW0gdmVyc2lvbiBtdXN0IGJlIGluICQxLCBhbmQKLSMgdGhlIG1heCBpbiAkMi4gVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IElmIHRoaXMgZXZlciBicmVha3MsIHdlIHNob3VsZAotIyBpbnZlc3RpZ2F0ZSBleHBhbmRpbmcgdGhpcyB2aWEgYXV0b200dGUgZnJvbSBBU19WRVJTSU9OX0NPTVBBUkUgcmF0aGVyIHRoYW4KLSMgY29udGludWluZyB0byBtYWludGFpbiBvdXIgb3duIHNoZWxsIHZlcnNpb24uCi1jaGVja192ZXJzaW9ucygpCi17Ci0gIG1ham9yX3ZlcnNpb249JHt2ZXJzaW9uJSUuKn0KLSAgbWlub3JfdmVyc2lvbj0iMCIKLSAgcG9pbnRfdmVyc2lvbj0iMCIKLSAgaWYgdGVzdCAiJHt2ZXJzaW9uIyoufSIgIT0gIiR7dmVyc2lvbn0iOyB0aGVuCi0gICAgbWlub3JfdmVyc2lvbj0ke3ZlcnNpb24jKi59Ci0gICAgbWlub3JfdmVyc2lvbj0ke21pbm9yX3ZlcnNpb24lJS4qfQotICBmaQotICBpZiB0ZXN0ICIke3ZlcnNpb24jKi4qLn0iICE9ICIke3ZlcnNpb259IjsgdGhlbgotICAgIHBvaW50X3ZlcnNpb249JHt2ZXJzaW9uIyouKi59Ci0gICAgcG9pbnRfdmVyc2lvbj0ke3BvaW50X3ZlcnNpb24lJS4qfQotICBmaQotCi0gIG1pbl92ZXJzaW9uPSIkMSIKLSAgbWluX21ham9yX3ZlcnNpb249JHttaW5fdmVyc2lvbiUlLip9Ci0gIG1pbl9taW5vcl92ZXJzaW9uPSIwIgotICBtaW5fcG9pbnRfdmVyc2lvbj0iMCIKLSAgaWYgdGVzdCAiJHttaW5fdmVyc2lvbiMqLn0iICE9ICIke21pbl92ZXJzaW9ufSI7IHRoZW4KLSAgICBtaW5fbWlub3JfdmVyc2lvbj0ke21pbl92ZXJzaW9uIyoufQotICAgIG1pbl9taW5vcl92ZXJzaW9uPSR7bWluX21pbm9yX3ZlcnNpb24lJS4qfQotICBmaQotICBpZiB0ZXN0ICIke21pbl92ZXJzaW9uIyouKi59IiAhPSAiJHttaW5fdmVyc2lvbn0iOyB0aGVuCi0gICAgbWluX3BvaW50X3ZlcnNpb249JHttaW5fdmVyc2lvbiMqLioufQotICAgIG1pbl9wb2ludF92ZXJzaW9uPSR7bWluX3BvaW50X3ZlcnNpb24lJS4qfQotICBmaQotCi0gIG1heF92ZXJzaW9uPSIkMiIKLSAgbWF4X21ham9yX3ZlcnNpb249JHttYXhfdmVyc2lvbiUlLip9Ci0gIG1heF9taW5vcl92ZXJzaW9uPSIwIgotICBtYXhfcG9pbnRfdmVyc2lvbj0iMCIKLSAgaWYgdGVzdCAiJHttYXhfdmVyc2lvbiMqLn0iICE9ICIke21heF92ZXJzaW9ufSI7IHRoZW4KLSAgICBtYXhfbWlub3JfdmVyc2lvbj0ke21heF92ZXJzaW9uIyoufQotICAgIG1heF9taW5vcl92ZXJzaW9uPSR7bWF4X21pbm9yX3ZlcnNpb24lJS4qfQotICBmaQotICBpZiB0ZXN0ICIke21heF92ZXJzaW9uIyouKi59IiAhPSAiJHttYXhfdmVyc2lvbn0iOyB0aGVuCi0gICAgbWF4X3BvaW50X3ZlcnNpb249JHttYXhfdmVyc2lvbiMqLioufQotICAgIG1heF9wb2ludF92ZXJzaW9uPSR7bWF4X3BvaW50X3ZlcnNpb24lJS4qfQotICBmaQotCi0gIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSkgJiYgZXhpdCAxCi0gIGlmIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSk7IHRoZW4KLSAgICB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fbWlub3JfdmVyc2lvbikpICYmIGV4aXQgMQotICAgIGlmIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9taW5vcl92ZXJzaW9uKSk7IHRoZW4KLSAgICAgIHRlc3QgJCgoJHBvaW50X3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9wb2ludF92ZXJzaW9uKSkgJiYgZXhpdCAxCi0gICAgZmkKLSAgZmkKLQotICB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpICYmIGV4aXQgMQotICBpZiB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpOyB0aGVuCi0gICAgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1ndCAkKCgkbWF4X21pbm9yX3ZlcnNpb24pKSAmJiBleGl0IDEKLSAgICBpZiB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWlub3JfdmVyc2lvbikpOyB0aGVuCi0gICAgICB0ZXN0ICQoKCRwb2ludF92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfcG9pbnRfdmVyc2lvbikpICYmIGV4aXQgMQotICAgIGZpCi0gIGZpCi0KLSAgZXhpdCAwCi19Ci0KLSMgU2hvdyB0aGUgdXNhZ2UgbGluZSB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLgotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBzaG93X3VzYWdlCi0gIGV4aXQgMQotZmkKLQotd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdXNhZ2UpICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAwOzsKLSAgICAtLWhlbHApICAgICAgICAgICBzaG93X2hlbHA7ICAgICAgICAgIGV4aXQgMDs7Ci0KLSAgICAjIEluc3RhbGxhdGlvbiBvdmVycmlkZXMKLSAgICAtLXByZWZpeD0qKSAgICAgICBHVEVTVF9QUkVGSVg9JHsxIy0tcHJlZml4PX07OwotICAgIC0tZXhlYy1wcmVmaXg9KikgIEdURVNUX0VYRUNfUFJFRklYPSR7MSMtLWV4ZWMtcHJlZml4PX07OwotICAgIC0tbGliZGlyPSopICAgICAgIEdURVNUX0xJQkRJUj0kezEjLS1saWJkaXI9fTs7Ci0gICAgLS1pbmNsdWRlZGlyPSopICAgR1RFU1RfSU5DTFVERURJUj0kezEjLS1pbmNsdWRlZGlyPX07OwotCi0gICAgIyBJbnN0YWxsYXRpb24gcXVlcmllcwotICAgIC0tcHJlZml4fC0tZXhlYy1wcmVmaXh8LS1saWJkaXJ8LS1pbmNsdWRlZGlyfC0tdmVyc2lvbikKLSAgICAgIGlmIHRlc3QgLW4gIiR7ZG9fcXVlcnl9IjsgdGhlbgotICAgICAgICBzaG93X3VzYWdlCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLSAgICAgIGRvX3F1ZXJ5PSR7MSMtLX0KLSAgICAgIDs7Ci0KLSAgICAjIFZlcnNpb24gY2hlY2tpbmcKLSAgICAtLW1pbi12ZXJzaW9uPSopCi0gICAgICBkb19jaGVja192ZXJzaW9ucz15ZXMKLSAgICAgIG1pbl92ZXJzaW9uPSR7MSMtLW1pbi12ZXJzaW9uPX0KLSAgICAgIDs7Ci0gICAgLS1tYXgtdmVyc2lvbj0qKQotICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCi0gICAgICBtYXhfdmVyc2lvbj0kezEjLS1tYXgtdmVyc2lvbj19Ci0gICAgICA7OwotICAgIC0tZXhhY3QtdmVyc2lvbj0qKQotICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCi0gICAgICBleGFjdF92ZXJzaW9uPSR7MSMtLWV4YWN0LXZlcnNpb249fQotICAgICAgOzsKLQotICAgICMgQ29tcGlsZXIgZmxhZyBvdXRwdXQKLSAgICAtLWNwcGZsYWdzKSAgICAgICBlY2hvX2NwcGZsYWdzPXllczs7Ci0gICAgLS1jeHhmbGFncykgICAgICAgZWNob19jeHhmbGFncz15ZXM7OwotICAgIC0tbGRmbGFncykgICAgICAgIGVjaG9fbGRmbGFncz15ZXM7OwotICAgIC0tbGlicykgICAgICAgICAgIGVjaG9fbGlicz15ZXM7OwotCi0gICAgIyBFdmVyeXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IKLSAgICAqKSAgICAgICAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMTs7Ci0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotIyBUaGVzZSBoYXZlIGRlZmF1bHRzIGZpbGxlZCBpbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBidXQgY2FuIGFsc28gYmUKLSMgb3ZlcnJpZGRlbiBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi1wcmVmaXg9IiR7R1RFU1RfUFJFRklYOi1AcHJlZml4QH0iCi1leGVjX3ByZWZpeD0iJHtHVEVTVF9FWEVDX1BSRUZJWDotQGV4ZWNfcHJlZml4QH0iCi1saWJkaXI9IiR7R1RFU1RfTElCRElSOi1AbGliZGlyQH0iCi1pbmNsdWRlZGlyPSIke0dURVNUX0lOQ0xVREVESVI6LUBpbmNsdWRlZGlyQH0iCi0KLSMgV2UgdHJ5IGFuZCBkZXRlY3QgaWYgb3VyIGJpbmFyeSBpcyBub3QgbG9jYXRlZCBhdCBpdHMgaW5zdGFsbGVkIGxvY2F0aW9uLiBJZgotIyBpdCdzIG5vdCwgd2UgcHJvdmlkZSB2YXJpYWJsZXMgcG9pbnRpbmcgdG8gdGhlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZSByYXRoZXIKLSMgdGhhbiB0byB0aGUgaW5zdGFsbCB0cmVlLiBUaGlzIGFsbG93cyBidWlsZGluZyBhZ2FpbnN0IGEganVzdC1idWlsdCBndGVzdAotIyByYXRoZXIgdGhhbiBhbiBpbnN0YWxsZWQgZ3Rlc3QuCi1iaW5kaXI9IkBiaW5kaXJAIgotdGhpc19yZWxhdGl2ZV9iaW5kaXI9YGRpcm5hbWUgJDBgCi10aGlzX2JpbmRpcj1gY2QgJHt0aGlzX3JlbGF0aXZlX2JpbmRpcn07IHB3ZCAtUGAKLWlmIHRlc3QgIiR7dGhpc19iaW5kaXJ9IiA9ICIke3RoaXNfYmluZGlyJSR7YmluZGlyfX0iOyB0aGVuCi0gICMgVGhlIHBhdGggdG8gdGhlIHNjcmlwdCBkb2Vzbid0IGVuZCBpbiB0aGUgYmluZGlyIHNlcXVlbmNlIGZyb20gQXV0b2NvbmYsCi0gICMgYXNzdW1lIHRoYXQgd2UgYXJlIGluIGEgYnVpbGQgdHJlZS4KLSAgYnVpbGRfZGlyPWBkaXJuYW1lICR7dGhpc19iaW5kaXJ9YAotICBzcmNfZGlyPWBjZCAke3RoaXNfYmluZGlyfTsgY2QgQHRvcF9zcmNkaXJAOyBwd2QgLVBgCi0KLSAgIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogVGhpcyBpcyBhIGRhbmdlcm91cyBkZXBlbmRlbmN5IG9uIGxpYnRvb2wsIHdlCi0gICMgc2hvdWxkIHdvcmsgdG8gcmVtb3ZlIGl0LCBhbmQvb3IgcmVtb3ZlIGxpYnRvb2wgYWx0b2dldGhlciwgcmVwbGFjaW5nIGl0Ci0gICMgd2l0aCBkaXJlY3QgcmVmZXJlbmNlcyB0byB0aGUgbGlicmFyeSBhbmQgYSBsaW5rIHBhdGguCi0gIGd0ZXN0X2xpYnM9IiR7YnVpbGRfZGlyfS9saWIvbGliZ3Rlc3QubGEgQFBUSFJFQURfQ0ZMQUdTQCBAUFRIUkVBRF9MSUJTQCIKLSAgZ3Rlc3RfbGRmbGFncz0iIgotCi0gICMgV2UgcHJvdmlkZSBob29rcyB0byBpbmNsdWRlIGZyb20gZWl0aGVyIHRoZSBzb3VyY2Ugb3IgYnVpbGQgZGlyLCB3aGVyZSB0aGUKLSAgIyBidWlsZCBkaXIgaXMgYWx3YXlzIHByZWZlcnJlZC4gVGhpcyB3aWxsIHBvdGVudGlhbGx5IGFsbG93IHVzIHRvIHdyaXRlCi0gICMgYnVpbGQgcnVsZXMgZm9yIGdlbmVyYXRlZCBoZWFkZXJzIGFuZCBoYXZlIHRoZW0gYXV0b21hdGljYWxseSBiZSBwcmVmZXJyZWQKLSAgIyBvdmVyIHByb3ZpZGVkIHZlcnNpb25zLgotICBndGVzdF9jcHBmbGFncz0iLUkke2J1aWxkX2Rpcn0vaW5jbHVkZSAtSSR7c3JjX2Rpcn0vaW5jbHVkZSIKLSAgZ3Rlc3RfY3h4ZmxhZ3M9IkBQVEhSRUFEX0NGTEFHU0AiCi1lbHNlCi0gICMgV2UncmUgdXNpbmcgYW4gaW5zdGFsbGVkIGd0ZXN0LCBhbHRob3VnaCBpdCBtYXkgYmUgc3RhZ2VkIHVuZGVyIHNvbWUKLSAgIyBwcmVmaXguIEFzc3VtZSAoYXMgb3VyIG93biBsaWJyYXJpZXMgZG8pIHRoYXQgd2UgY2FuIHJlc29sdmUgdGhlIHByZWZpeCwKLSAgIyBhbmQgYXJlIHByZXNlbnQgaW4gdGhlIGR5bmFtaWMgbGluayBwYXRocy4KLSAgZ3Rlc3RfbGRmbGFncz0iLUwke2xpYmRpcn0iCi0gIGd0ZXN0X2xpYnM9Ii1sJHtuYW1lfSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNAIgotICBndGVzdF9jcHBmbGFncz0iLUkke2luY2x1ZGVkaXJ9IgotICBndGVzdF9jeHhmbGFncz0iQFBUSFJFQURfQ0ZMQUdTQCIKLWZpCi0KLSMgRG8gYW4gaW5zdGFsbGF0aW9uIHF1ZXJ5IGlmIHJlcXVlc3RlZC4KLWlmIHRlc3QgLW4gIiRkb19xdWVyeSI7IHRoZW4KLSAgY2FzZSAkZG9fcXVlcnkgaW4KLSAgICBwcmVmaXgpICAgICAgICAgICBlY2hvICRwcmVmaXg7ICAgICAgIGV4aXQgMDs7Ci0gICAgZXhlYy1wcmVmaXgpICAgICAgZWNobyAkZXhlY19wcmVmaXg7ICBleGl0IDA7OwotICAgIGxpYmRpcikgICAgICAgICAgIGVjaG8gJGxpYmRpcjsgICAgICAgZXhpdCAwOzsKLSAgICBpbmNsdWRlZGlyKSAgICAgICBlY2hvICRpbmNsdWRlZGlyOyAgIGV4aXQgMDs7Ci0gICAgdmVyc2lvbikgICAgICAgICAgZWNobyAkdmVyc2lvbjsgICAgICBleGl0IDA7OwotICAgICopICAgICAgICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAxOzsKLSAgZXNhYwotZmkKLQotIyBEbyBhIHZlcnNpb24gY2hlY2sgaWYgcmVxdWVzdGVkLgotaWYgdGVzdCAiJGRvX2NoZWNrX3ZlcnNpb25zIiA9ICJ5ZXMiOyB0aGVuCi0gICMgTWFrZSBzdXJlIHdlIGRpZG4ndCByZWNlaXZlIGEgYmFkIGNvbWJpbmF0aW9uIG9mIHBhcmFtZXRlcnMuCi0gIHRlc3QgIiRlY2hvX2NwcGZsYWdzIiA9ICJ5ZXMiICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCi0gIHRlc3QgIiRlY2hvX2N4eGZsYWdzIiA9ICJ5ZXMiICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCi0gIHRlc3QgIiRlY2hvX2xkZmxhZ3MiID0gInllcyIgICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCi0gIHRlc3QgIiRlY2hvX2xpYnMiID0gInllcyIgICAgICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCi0KLSAgaWYgdGVzdCAiJGV4YWN0X3ZlcnNpb24iICE9ICIiOyB0aGVuCi0gICAgY2hlY2tfdmVyc2lvbnMgJGV4YWN0X3ZlcnNpb24gJGV4YWN0X3ZlcnNpb24KLSAgICAjIHVucmVhY2hhYmxlCi0gIGVsc2UKLSAgICBjaGVja192ZXJzaW9ucyAke21pbl92ZXJzaW9uOi0wLjAuMH0gJHttYXhfdmVyc2lvbjotOTk5OS45OTk5Ljk5OTl9Ci0gICAgIyB1bnJlYWNoYWJsZQotICBmaQotZmkKLQotIyBEbyB0aGUgb3V0cHV0IGluIHRoZSBjb3JyZWN0IG9yZGVyIHNvIHRoYXQgdGhlc2UgY2FuIGJlIHVzZWQgaW4tbGluZSBvZgotIyBhIGNvbXBpbGVyIGludm9jYXRpb24uCi1vdXRwdXQ9IiIKLXRlc3QgIiRlY2hvX2NwcGZsYWdzIiA9ICJ5ZXMiICYmIG91dHB1dD0iJG91dHB1dCAkZ3Rlc3RfY3BwZmxhZ3MiCi10ZXN0ICIkZWNob19jeHhmbGFncyIgPSAieWVzIiAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2N4eGZsYWdzIgotdGVzdCAiJGVjaG9fbGRmbGFncyIgPSAieWVzIiAgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9sZGZsYWdzIgotdGVzdCAiJGVjaG9fbGlicyIgPSAieWVzIiAgICAgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9saWJzIgotZWNobyAkb3V0cHV0Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zY3JpcHRzL3B1bXAucHkgYi90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvcHVtcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVmYjY1My4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvcHVtcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJwdW1wIHYwLjIuMCAtIFByZXR0eSBVc2VmdWwgZm9yIE1ldGEgUHJvZ3JhbW1pbmcuCi0KLUEgdG9vbCBmb3IgcHJlcHJvY2Vzc29yIG1ldGEgcHJvZ3JhbW1pbmcuICBVc2VmdWwgZm9yIGdlbmVyYXRpbmcKLXJlcGV0aXRpdmUgYm9pbGVycGxhdGUgY29kZS4gIEVzcGVjaWFsbHkgdXNlZnVsIGZvciB3cml0aW5nIEMrKwotY2xhc3NlcywgZnVuY3Rpb25zLCBtYWNyb3MsIGFuZCB0ZW1wbGF0ZXMgdGhhdCBuZWVkIHRvIHdvcmsgd2l0aAotdmFyaW91cyBudW1iZXIgb2YgYXJndW1lbnRzLgotCi1VU0FHRToKLSAgICAgICBwdW1wLnB5IFNPVVJDRV9GSUxFCi0KLUVYQU1QTEVTOgotICAgICAgIHB1bXAucHkgZm9vLmNjLnB1bXAKLSAgICAgICAgIENvbnZlcnRzIGZvby5jYy5wdW1wIHRvIGZvby5jYy4KLQotR1JBTU1BUjoKLSAgICAgICBDT0RFIDo6PSBBVE9NSUNfQ09ERSoKLSAgICAgICBBVE9NSUNfQ09ERSA6Oj0gJHZhciBJRCA9IEVYUFJFU1NJT04KLSAgICAgICAgICAgfCAkdmFyIElEID0gW1sgQ09ERSBdXQotICAgICAgICAgICB8ICRyYW5nZSBJRCBFWFBSRVNTSU9OLi5FWFBSRVNTSU9OCi0gICAgICAgICAgIHwgJGZvciBJRCBTRVBBUkFUT1IgW1sgQ09ERSBdXQotICAgICAgICAgICB8ICQoJCkKLSAgICAgICAgICAgfCAkSUQKLSAgICAgICAgICAgfCAkKEVYUFJFU1NJT04pCi0gICAgICAgICAgIHwgJGlmIEVYUFJFU1NJT04gW1sgQ09ERSBdXSBFTFNFX0JSQU5DSAotICAgICAgICAgICB8IFtbIENPREUgXV0KLSAgICAgICAgICAgfCBSQVdfQ09ERQotICAgICAgIFNFUEFSQVRPUiA6Oj0gUkFXX0NPREUgfCBFTVBUWQotICAgICAgIEVMU0VfQlJBTkNIIDo6PSAkZWxzZSBbWyBDT0RFIF1dCi0gICAgICAgICAgIHwgJGVsaWYgRVhQUkVTU0lPTiBbWyBDT0RFIF1dIEVMU0VfQlJBTkNICi0gICAgICAgICAgIHwgRU1QVFkKLSAgICAgICBFWFBSRVNTSU9OIGhhcyBQeXRob24gc3ludGF4LgotIiIiCi0KLV9fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCi0KLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3lzCi0KLQotVE9LRU5fVEFCTEUgPSBbCi0gICAgKHJlLmNvbXBpbGUocidcJHZhclxzKycpLCAnJHZhcicpLAotICAgIChyZS5jb21waWxlKHInXCRlbGlmXHMrJyksICckZWxpZicpLAotICAgIChyZS5jb21waWxlKHInXCRlbHNlXHMrJyksICckZWxzZScpLAotICAgIChyZS5jb21waWxlKHInXCRmb3JccysnKSwgJyRmb3InKSwKLSAgICAocmUuY29tcGlsZShyJ1wkaWZccysnKSwgJyRpZicpLAotICAgIChyZS5jb21waWxlKHInXCRyYW5nZVxzKycpLCAnJHJhbmdlJyksCi0gICAgKHJlLmNvbXBpbGUocidcJFtfQS1aYS16XVx3KicpLCAnJGlkJyksCi0gICAgKHJlLmNvbXBpbGUocidcJFwoXCRcKScpLCAnJCgkKScpLAotICAgIChyZS5jb21waWxlKHInXCQnKSwgJyQnKSwKLSAgICAocmUuY29tcGlsZShyJ1xbXFtcbj8nKSwgJ1tbJyksCi0gICAgKHJlLmNvbXBpbGUocidcXVxdXG4/JyksICddXScpLAotICAgIF0KLQotCi1jbGFzcyBDdXJzb3I6Ci0gICIiIlJlcHJlc2VudHMgYSBwb3NpdGlvbiAobGluZSBhbmQgY29sdW1uKSBpbiBhIHRleHQgZmlsZS4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgbGluZT0tMSwgY29sdW1uPS0xKToKLSAgICBzZWxmLmxpbmUgPSBsaW5lCi0gICAgc2VsZi5jb2x1bW4gPSBjb2x1bW4KLQotICBkZWYgX19lcV9fKHNlbGYsIHJocyk6Ci0gICAgcmV0dXJuIHNlbGYubGluZSA9PSByaHMubGluZSBhbmQgc2VsZi5jb2x1bW4gPT0gcmhzLmNvbHVtbgotCi0gIGRlZiBfX25lX18oc2VsZiwgcmhzKToKLSAgICByZXR1cm4gbm90IHNlbGYgPT0gcmhzCi0KLSAgZGVmIF9fbHRfXyhzZWxmLCByaHMpOgotICAgIHJldHVybiBzZWxmLmxpbmUgPCByaHMubGluZSBvciAoCi0gICAgICAgIHNlbGYubGluZSA9PSByaHMubGluZSBhbmQgc2VsZi5jb2x1bW4gPCByaHMuY29sdW1uKQotCi0gIGRlZiBfX2xlX18oc2VsZiwgcmhzKToKLSAgICByZXR1cm4gc2VsZiA8IHJocyBvciBzZWxmID09IHJocwotCi0gIGRlZiBfX2d0X18oc2VsZiwgcmhzKToKLSAgICByZXR1cm4gcmhzIDwgc2VsZgotCi0gIGRlZiBfX2dlX18oc2VsZiwgcmhzKToKLSAgICByZXR1cm4gcmhzIDw9IHNlbGYKLQotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICBpZiBzZWxmID09IEVvZigpOgotICAgICAgcmV0dXJuICdFT0YnCi0gICAgZWxzZToKLSAgICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLmxpbmUgKyAxLCBzZWxmLmNvbHVtbikKLQotICBkZWYgX19hZGRfXyhzZWxmLCBvZmZzZXQpOgotICAgIHJldHVybiBDdXJzb3Ioc2VsZi5saW5lLCBzZWxmLmNvbHVtbiArIG9mZnNldCkKLQotICBkZWYgX19zdWJfXyhzZWxmLCBvZmZzZXQpOgotICAgIHJldHVybiBDdXJzb3Ioc2VsZi5saW5lLCBzZWxmLmNvbHVtbiAtIG9mZnNldCkKLQotICBkZWYgQ2xvbmUoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhIGNvcHkgb2Ygc2VsZi4iIiIKLQotICAgIHJldHVybiBDdXJzb3Ioc2VsZi5saW5lLCBzZWxmLmNvbHVtbikKLQotCi0jIFNwZWNpYWwgY3Vyc29yIHRvIGluZGljYXRlIHRoZSBlbmQtb2YtZmlsZS4KLWRlZiBFb2YoKToKLSAgIiIiUmV0dXJucyB0aGUgc3BlY2lhbCBjdXJzb3IgdG8gZGVub3RlIHRoZSBlbmQtb2YtZmlsZS4iIiIKLSAgcmV0dXJuIEN1cnNvcigtMSwgLTEpCi0KLQotY2xhc3MgVG9rZW46Ci0gICIiIlJlcHJlc2VudHMgYSB0b2tlbiBpbiBhIFB1bXAgc291cmNlIGZpbGUuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCB2YWx1ZT1Ob25lLCB0b2tlbl90eXBlPU5vbmUpOgotICAgIGlmIHN0YXJ0IGlzIE5vbmU6Ci0gICAgICBzZWxmLnN0YXJ0ID0gRW9mKCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5zdGFydCA9IHN0YXJ0Ci0gICAgaWYgZW5kIGlzIE5vbmU6Ci0gICAgICBzZWxmLmVuZCA9IEVvZigpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuZW5kID0gZW5kCi0gICAgc2VsZi52YWx1ZSA9IHZhbHVlCi0gICAgc2VsZi50b2tlbl90eXBlID0gdG9rZW5fdHlwZQotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiAnVG9rZW4gQCVzOiBcJyVzXCcgdHlwZT0lcycgJSAoCi0gICAgICAgIHNlbGYuc3RhcnQsIHNlbGYudmFsdWUsIHNlbGYudG9rZW5fdHlwZSkKLQotICBkZWYgQ2xvbmUoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhIGNvcHkgb2Ygc2VsZi4iIiIKLQotICAgIHJldHVybiBUb2tlbihzZWxmLnN0YXJ0LkNsb25lKCksIHNlbGYuZW5kLkNsb25lKCksIHNlbGYudmFsdWUsCi0gICAgICAgICAgICAgICAgIHNlbGYudG9rZW5fdHlwZSkKLQotCi1kZWYgU3RhcnRzV2l0aChsaW5lcywgcG9zLCBzdHJpbmcpOgotICAiIiJSZXR1cm5zIFRydWUgaWZmIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBsaW5lcyBzdGFydHMgd2l0aCAnc3RyaW5nJy4iIiIKLQotICByZXR1cm4gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XS5zdGFydHN3aXRoKHN0cmluZykKLQotCi1kZWYgRmluZEZpcnN0SW5MaW5lKGxpbmUsIHRva2VuX3RhYmxlKToKLSAgYmVzdF9tYXRjaF9zdGFydCA9IC0xCi0gIGZvciAocmVnZXgsIHRva2VuX3R5cGUpIGluIHRva2VuX3RhYmxlOgotICAgIG0gPSByZWdleC5zZWFyY2gobGluZSkKLSAgICBpZiBtOgotICAgICAgIyBXZSBmb3VuZCByZWdleCBpbiBsaW5lcwotICAgICAgaWYgYmVzdF9tYXRjaF9zdGFydCA8IDAgb3IgbS5zdGFydCgpIDwgYmVzdF9tYXRjaF9zdGFydDoKLSAgICAgICAgYmVzdF9tYXRjaF9zdGFydCA9IG0uc3RhcnQoKQotICAgICAgICBiZXN0X21hdGNoX2xlbmd0aCA9IG0uZW5kKCkgLSBtLnN0YXJ0KCkKLSAgICAgICAgYmVzdF9tYXRjaF90b2tlbl90eXBlID0gdG9rZW5fdHlwZQotCi0gIGlmIGJlc3RfbWF0Y2hfc3RhcnQgPCAwOgotICAgIHJldHVybiBOb25lCi0KLSAgcmV0dXJuIChiZXN0X21hdGNoX3N0YXJ0LCBiZXN0X21hdGNoX2xlbmd0aCwgYmVzdF9tYXRjaF90b2tlbl90eXBlKQotCi0KLWRlZiBGaW5kRmlyc3QobGluZXMsIHRva2VuX3RhYmxlLCBjdXJzb3IpOgotICAiIiJGaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgc3RyaW5nIGluIHN0cmluZ3MgaW4gbGluZXMuIiIiCi0KLSAgc3RhcnQgPSBjdXJzb3IuQ2xvbmUoKQotICBjdXJfbGluZV9udW1iZXIgPSBjdXJzb3IubGluZQotICBmb3IgbGluZSBpbiBsaW5lc1tzdGFydC5saW5lOl06Ci0gICAgaWYgY3VyX2xpbmVfbnVtYmVyID09IHN0YXJ0LmxpbmU6Ci0gICAgICBsaW5lID0gbGluZVtzdGFydC5jb2x1bW46XQotICAgIG0gPSBGaW5kRmlyc3RJbkxpbmUobGluZSwgdG9rZW5fdGFibGUpCi0gICAgaWYgbToKLSAgICAgICMgV2UgZm91bmQgYSByZWdleCBpbiBsaW5lLgotICAgICAgKHN0YXJ0X2NvbHVtbiwgbGVuZ3RoLCB0b2tlbl90eXBlKSA9IG0KLSAgICAgIGlmIGN1cl9saW5lX251bWJlciA9PSBzdGFydC5saW5lOgotICAgICAgICBzdGFydF9jb2x1bW4gKz0gc3RhcnQuY29sdW1uCi0gICAgICBmb3VuZF9zdGFydCA9IEN1cnNvcihjdXJfbGluZV9udW1iZXIsIHN0YXJ0X2NvbHVtbikKLSAgICAgIGZvdW5kX2VuZCA9IGZvdW5kX3N0YXJ0ICsgbGVuZ3RoCi0gICAgICByZXR1cm4gTWFrZVRva2VuKGxpbmVzLCBmb3VuZF9zdGFydCwgZm91bmRfZW5kLCB0b2tlbl90eXBlKQotICAgIGN1cl9saW5lX251bWJlciArPSAxCi0gICMgV2UgZmFpbGVkIHRvIGZpbmQgc3RyIGluIGxpbmVzCi0gIHJldHVybiBOb25lCi0KLQotZGVmIFN1YlN0cmluZyhsaW5lcywgc3RhcnQsIGVuZCk6Ci0gICIiIlJldHVybnMgYSBzdWJzdHJpbmcgaW4gbGluZXMuIiIiCi0KLSAgaWYgZW5kID09IEVvZigpOgotICAgIGVuZCA9IEN1cnNvcihsZW4obGluZXMpIC0gMSwgbGVuKGxpbmVzWy0xXSkpCi0KLSAgaWYgc3RhcnQgPj0gZW5kOgotICAgIHJldHVybiAnJwotCi0gIGlmIHN0YXJ0LmxpbmUgPT0gZW5kLmxpbmU6Ci0gICAgcmV0dXJuIGxpbmVzW3N0YXJ0LmxpbmVdW3N0YXJ0LmNvbHVtbjplbmQuY29sdW1uXQotCi0gIHJlc3VsdF9saW5lcyA9IChbbGluZXNbc3RhcnQubGluZV1bc3RhcnQuY29sdW1uOl1dICsKLSAgICAgICAgICAgICAgICAgIGxpbmVzW3N0YXJ0LmxpbmUgKyAxOmVuZC5saW5lXSArCi0gICAgICAgICAgICAgICAgICBbbGluZXNbZW5kLmxpbmVdWzplbmQuY29sdW1uXV0pCi0gIHJldHVybiAnJy5qb2luKHJlc3VsdF9saW5lcykKLQotCi1kZWYgU3RyaXBNZXRhQ29tbWVudHMoc3RyKToKLSAgIiIiU3RyaXAgbWV0YSBjb21tZW50cyBmcm9tIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiIiIgotCi0gICMgRmlyc3QsIGNvbXBsZXRlbHkgcmVtb3ZlIGxpbmVzIGNvbnRhaW5pbmcgbm90aGluZyBidXQgYSBtZXRhCi0gICMgY29tbWVudCwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBcbi4KLSAgc3RyID0gcmUuc3ViKHInXlxzKlwkXCQuKlxuJywgJycsIHN0cikKLQotICAjIFRoZW4sIHJlbW92ZSBtZXRhIGNvbW1lbnRzIGZyb20gY29udGVudGZ1bCBsaW5lcy4KLSAgcmV0dXJuIHJlLnN1YihyJ1xzKlwkXCQuKicsICcnLCBzdHIpCi0KLQotZGVmIE1ha2VUb2tlbihsaW5lcywgc3RhcnQsIGVuZCwgdG9rZW5fdHlwZSk6Ci0gICIiIkNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVG9rZW4uIiIiCi0KLSAgcmV0dXJuIFRva2VuKHN0YXJ0LCBlbmQsIFN1YlN0cmluZyhsaW5lcywgc3RhcnQsIGVuZCksIHRva2VuX3R5cGUpCi0KLQotZGVmIFBhcnNlVG9rZW4obGluZXMsIHBvcywgcmVnZXgsIHRva2VuX3R5cGUpOgotICBsaW5lID0gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XQotICBtID0gcmVnZXguc2VhcmNoKGxpbmUpCi0gIGlmIG0gYW5kIG5vdCBtLnN0YXJ0KCk6Ci0gICAgcmV0dXJuIE1ha2VUb2tlbihsaW5lcywgcG9zLCBwb3MgKyBtLmVuZCgpLCB0b2tlbl90eXBlKQotICBlbHNlOgotICAgIHByaW50ICdFUlJPUjogJXMgZXhwZWN0ZWQgYXQgJXMuJyAlICh0b2tlbl90eXBlLCBwb3MpCi0gICAgc3lzLmV4aXQoMSkKLQotCi1JRF9SRUdFWCA9IHJlLmNvbXBpbGUocidbX0EtWmEtel1cdyonKQotRVFfUkVHRVggPSByZS5jb21waWxlKHInPScpCi1SRVNUX09GX0xJTkVfUkVHRVggPSByZS5jb21waWxlKHInLio/KD89JHxcJFwkKScpCi1PUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVggPSByZS5jb21waWxlKHInXHMqJykKLVdISVRFX1NQQUNFX1JFR0VYID0gcmUuY29tcGlsZShyJ1xzJykKLURPVF9ET1RfUkVHRVggPSByZS5jb21waWxlKHInXC5cLicpCi0KLQotZGVmIFNraXAobGluZXMsIHBvcywgcmVnZXgpOgotICBsaW5lID0gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XQotICBtID0gcmUuc2VhcmNoKHJlZ2V4LCBsaW5lKQotICBpZiBtIGFuZCBub3QgbS5zdGFydCgpOgotICAgIHJldHVybiBwb3MgKyBtLmVuZCgpCi0gIGVsc2U6Ci0gICAgcmV0dXJuIHBvcwotCi0KLWRlZiBTa2lwVW50aWwobGluZXMsIHBvcywgcmVnZXgsIHRva2VuX3R5cGUpOgotICBsaW5lID0gbGluZXNbcG9zLmxpbmVdW3Bvcy5jb2x1bW46XQotICBtID0gcmUuc2VhcmNoKHJlZ2V4LCBsaW5lKQotICBpZiBtOgotICAgIHJldHVybiBwb3MgKyBtLnN0YXJ0KCkKLSAgZWxzZToKLSAgICBwcmludCAoJ0VSUk9SOiAlcyBleHBlY3RlZCBvbiBsaW5lICVzIGFmdGVyIGNvbHVtbiAlcy4nICUKLSAgICAgICAgICAgKHRva2VuX3R5cGUsIHBvcy5saW5lICsgMSwgcG9zLmNvbHVtbikpCi0gICAgc3lzLmV4aXQoMSkKLQotCi1kZWYgUGFyc2VFeHBUb2tlbkluUGFyZW5zKGxpbmVzLCBwb3MpOgotICBkZWYgUGFyc2VJblBhcmVucyhwb3MpOgotICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYKQotICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgcidcKCcpCi0gICAgcG9zID0gUGFyc2UocG9zKQotICAgIHBvcyA9IFNraXAobGluZXMsIHBvcywgcidcKScpCi0gICAgcmV0dXJuIHBvcwotCi0gIGRlZiBQYXJzZShwb3MpOgotICAgIHBvcyA9IFNraXBVbnRpbChsaW5lcywgcG9zLCByJ1wofFwpJywgJyknKQotICAgIGlmIFN1YlN0cmluZyhsaW5lcywgcG9zLCBwb3MgKyAxKSA9PSAnKCc6Ci0gICAgICBwb3MgPSBQYXJzZShwb3MgKyAxKQotICAgICAgcG9zID0gU2tpcChsaW5lcywgcG9zLCByJ1wpJykKLSAgICAgIHJldHVybiBQYXJzZShwb3MpCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBwb3MKLQotICBzdGFydCA9IHBvcy5DbG9uZSgpCi0gIHBvcyA9IFBhcnNlSW5QYXJlbnMocG9zKQotICByZXR1cm4gTWFrZVRva2VuKGxpbmVzLCBzdGFydCwgcG9zLCAnZXhwJykKLQotCi1kZWYgUlN0cmlwTmV3TGluZUZyb21Ub2tlbih0b2tlbik6Ci0gIGlmIHRva2VuLnZhbHVlLmVuZHN3aXRoKCdcbicpOgotICAgIHJldHVybiBUb2tlbih0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCB0b2tlbi52YWx1ZVs6LTFdLCB0b2tlbi50b2tlbl90eXBlKQotICBlbHNlOgotICAgIHJldHVybiB0b2tlbgotCi0KLWRlZiBUb2tlbml6ZUxpbmVzKGxpbmVzLCBwb3MpOgotICB3aGlsZSBUcnVlOgotICAgIGZvdW5kID0gRmluZEZpcnN0KGxpbmVzLCBUT0tFTl9UQUJMRSwgcG9zKQotICAgIGlmIG5vdCBmb3VuZDoKLSAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgcG9zLCBFb2YoKSwgJ2NvZGUnKQotICAgICAgcmV0dXJuCi0KLSAgICBpZiBmb3VuZC5zdGFydCA9PSBwb3M6Ci0gICAgICBwcmV2X3Rva2VuID0gTm9uZQotICAgICAgcHJldl90b2tlbl9yc3RyaXBwZWQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHByZXZfdG9rZW4gPSBNYWtlVG9rZW4obGluZXMsIHBvcywgZm91bmQuc3RhcnQsICdjb2RlJykKLSAgICAgIHByZXZfdG9rZW5fcnN0cmlwcGVkID0gUlN0cmlwTmV3TGluZUZyb21Ub2tlbihwcmV2X3Rva2VuKQotCi0gICAgaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJHZhcic6Ci0gICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKLSAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKLSAgICAgIHlpZWxkIGZvdW5kCi0gICAgICBpZF90b2tlbiA9IFBhcnNlVG9rZW4obGluZXMsIGZvdW5kLmVuZCwgSURfUkVHRVgsICdpZCcpCi0gICAgICB5aWVsZCBpZF90b2tlbgotICAgICAgcG9zID0gU2tpcChsaW5lcywgaWRfdG9rZW4uZW5kLCBPUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVgpCi0KLSAgICAgIGVxX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgcG9zLCBFUV9SRUdFWCwgJz0nKQotICAgICAgeWllbGQgZXFfdG9rZW4KLSAgICAgIHBvcyA9IFNraXAobGluZXMsIGVxX3Rva2VuLmVuZCwgcidccyonKQotCi0gICAgICBpZiBTdWJTdHJpbmcobGluZXMsIHBvcywgcG9zICsgMikgIT0gJ1tbJzoKLSAgICAgICAgZXhwX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgcG9zLCBSRVNUX09GX0xJTkVfUkVHRVgsICdleHAnKQotICAgICAgICB5aWVsZCBleHBfdG9rZW4KLSAgICAgICAgcG9zID0gQ3Vyc29yKGV4cF90b2tlbi5lbmQubGluZSArIDEsIDApCi0gICAgZWxpZiBmb3VuZC50b2tlbl90eXBlID09ICckZm9yJzoKLSAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgotICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAotICAgICAgeWllbGQgZm91bmQKLSAgICAgIGlkX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgZm91bmQuZW5kLCBJRF9SRUdFWCwgJ2lkJykKLSAgICAgIHlpZWxkIGlkX3Rva2VuCi0gICAgICBwb3MgPSBTa2lwKGxpbmVzLCBpZF90b2tlbi5lbmQsIFdISVRFX1NQQUNFX1JFR0VYKQotICAgIGVsaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJHJhbmdlJzoKLSAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgotICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAotICAgICAgeWllbGQgZm91bmQKLSAgICAgIGlkX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgZm91bmQuZW5kLCBJRF9SRUdFWCwgJ2lkJykKLSAgICAgIHlpZWxkIGlkX3Rva2VuCi0gICAgICBwb3MgPSBTa2lwKGxpbmVzLCBpZF90b2tlbi5lbmQsIE9QVElPTkFMX1dISVRFX1NQQUNFU19SRUdFWCkKLQotICAgICAgZG90c19wb3MgPSBTa2lwVW50aWwobGluZXMsIHBvcywgRE9UX0RPVF9SRUdFWCwgJy4uJykKLSAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgcG9zLCBkb3RzX3BvcywgJ2V4cCcpCi0gICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIGRvdHNfcG9zLCBkb3RzX3BvcyArIDIsICcuLicpCi0gICAgICBwb3MgPSBkb3RzX3BvcyArIDIKLSAgICAgIG5ld19wb3MgPSBDdXJzb3IocG9zLmxpbmUgKyAxLCAwKQotICAgICAgeWllbGQgTWFrZVRva2VuKGxpbmVzLCBwb3MsIG5ld19wb3MsICdleHAnKQotICAgICAgcG9zID0gbmV3X3BvcwotICAgIGVsaWYgZm91bmQudG9rZW5fdHlwZSA9PSAnJCc6Ci0gICAgICBpZiBwcmV2X3Rva2VuOgotICAgICAgICB5aWVsZCBwcmV2X3Rva2VuCi0gICAgICB5aWVsZCBmb3VuZAotICAgICAgZXhwX3Rva2VuID0gUGFyc2VFeHBUb2tlbkluUGFyZW5zKGxpbmVzLCBmb3VuZC5lbmQpCi0gICAgICB5aWVsZCBleHBfdG9rZW4KLSAgICAgIHBvcyA9IGV4cF90b2tlbi5lbmQKLSAgICBlbGlmIChmb3VuZC50b2tlbl90eXBlID09ICddXScgb3IgZm91bmQudG9rZW5fdHlwZSA9PSAnJGlmJyBvcgotICAgICAgICAgIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRlbGlmJyBvciBmb3VuZC50b2tlbl90eXBlID09ICckZWxzZScpOgotICAgICAgaWYgcHJldl90b2tlbl9yc3RyaXBwZWQ6Ci0gICAgICAgIHlpZWxkIHByZXZfdG9rZW5fcnN0cmlwcGVkCi0gICAgICB5aWVsZCBmb3VuZAotICAgICAgcG9zID0gZm91bmQuZW5kCi0gICAgZWxzZToKLSAgICAgIGlmIHByZXZfdG9rZW46Ci0gICAgICAgIHlpZWxkIHByZXZfdG9rZW4KLSAgICAgIHlpZWxkIGZvdW5kCi0gICAgICBwb3MgPSBmb3VuZC5lbmQKLQotCi1kZWYgVG9rZW5pemUocyk6Ci0gICIiIkEgZ2VuZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB0b2tlbnMgaW4gdGhlIGdpdmVuIHN0cmluZy4iIiIKLSAgaWYgcyAhPSAnJzoKLSAgICBsaW5lcyA9IHMuc3BsaXRsaW5lcyhUcnVlKQotICAgIGZvciB0b2tlbiBpbiBUb2tlbml6ZUxpbmVzKGxpbmVzLCBDdXJzb3IoMCwgMCkpOgotICAgICAgeWllbGQgdG9rZW4KLQotCi1jbGFzcyBDb2RlTm9kZToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGF0b21pY19jb2RlX2xpc3Q9Tm9uZSk6Ci0gICAgc2VsZi5hdG9taWNfY29kZSA9IGF0b21pY19jb2RlX2xpc3QKLQotCi1jbGFzcyBWYXJOb2RlOgotICBkZWYgX19pbml0X18oc2VsZiwgaWRlbnRpZmllcj1Ob25lLCBhdG9taWNfY29kZT1Ob25lKToKLSAgICBzZWxmLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyCi0gICAgc2VsZi5hdG9taWNfY29kZSA9IGF0b21pY19jb2RlCi0KLQotY2xhc3MgUmFuZ2VOb2RlOgotICBkZWYgX19pbml0X18oc2VsZiwgaWRlbnRpZmllcj1Ob25lLCBleHAxPU5vbmUsIGV4cDI9Tm9uZSk6Ci0gICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgotICAgIHNlbGYuZXhwMSA9IGV4cDEKLSAgICBzZWxmLmV4cDIgPSBleHAyCi0KLQotY2xhc3MgRm9yTm9kZToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGlkZW50aWZpZXI9Tm9uZSwgc2VwPU5vbmUsIGNvZGU9Tm9uZSk6Ci0gICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgotICAgIHNlbGYuc2VwID0gc2VwCi0gICAgc2VsZi5jb2RlID0gY29kZQotCi0KLWNsYXNzIEVsc2VOb2RlOgotICBkZWYgX19pbml0X18oc2VsZiwgZWxzZV9icmFuY2g9Tm9uZSk6Ci0gICAgc2VsZi5lbHNlX2JyYW5jaCA9IGVsc2VfYnJhbmNoCi0KLQotY2xhc3MgSWZOb2RlOgotICBkZWYgX19pbml0X18oc2VsZiwgZXhwPU5vbmUsIHRoZW5fYnJhbmNoPU5vbmUsIGVsc2VfYnJhbmNoPU5vbmUpOgotICAgIHNlbGYuZXhwID0gZXhwCi0gICAgc2VsZi50aGVuX2JyYW5jaCA9IHRoZW5fYnJhbmNoCi0gICAgc2VsZi5lbHNlX2JyYW5jaCA9IGVsc2VfYnJhbmNoCi0KLQotY2xhc3MgUmF3Q29kZU5vZGU6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbj1Ob25lKToKLSAgICBzZWxmLnJhd19jb2RlID0gdG9rZW4KLQotCi1jbGFzcyBMaXRlcmFsRG9sbGFyTm9kZToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuKToKLSAgICBzZWxmLnRva2VuID0gdG9rZW4KLQotCi1jbGFzcyBFeHBOb2RlOgotICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW4sIHB5dGhvbl9leHApOgotICAgIHNlbGYudG9rZW4gPSB0b2tlbgotICAgIHNlbGYucHl0aG9uX2V4cCA9IHB5dGhvbl9leHAKLQotCi1kZWYgUG9wRnJvbnQoYV9saXN0KToKLSAgaGVhZCA9IGFfbGlzdFswXQotICBhX2xpc3RbOjFdID0gW10KLSAgcmV0dXJuIGhlYWQKLQotCi1kZWYgUHVzaEZyb250KGFfbGlzdCwgZWxlbSk6Ci0gIGFfbGlzdFs6MF0gPSBbZWxlbV0KLQotCi1kZWYgUG9wVG9rZW4oYV9saXN0LCB0b2tlbl90eXBlPU5vbmUpOgotICB0b2tlbiA9IFBvcEZyb250KGFfbGlzdCkKLSAgaWYgdG9rZW5fdHlwZSBpcyBub3QgTm9uZSBhbmQgdG9rZW4udG9rZW5fdHlwZSAhPSB0b2tlbl90eXBlOgotICAgIHByaW50ICdFUlJPUjogJXMgZXhwZWN0ZWQgYXQgJXMnICUgKHRva2VuX3R5cGUsIHRva2VuLnN0YXJ0KQotICAgIHByaW50ICdFUlJPUjogJXMgZm91bmQgaW5zdGVhZCcgJSAodG9rZW4sKQotICAgIHN5cy5leGl0KDEpCi0KLSAgcmV0dXJuIHRva2VuCi0KLQotZGVmIFBlZWtUb2tlbihhX2xpc3QpOgotICBpZiBub3QgYV9saXN0OgotICAgIHJldHVybiBOb25lCi0KLSAgcmV0dXJuIGFfbGlzdFswXQotCi0KLWRlZiBQYXJzZUV4cE5vZGUodG9rZW4pOgotICBweXRob25fZXhwID0gcmUuc3ViKHInKFtfQS1aYS16XVx3KiknLCByJ3NlbGYuR2V0VmFsdWUoIlwxIiknLCB0b2tlbi52YWx1ZSkKLSAgcmV0dXJuIEV4cE5vZGUodG9rZW4sIHB5dGhvbl9leHApCi0KLQotZGVmIFBhcnNlRWxzZU5vZGUodG9rZW5zKToKLSAgZGVmIFBvcCh0b2tlbl90eXBlPU5vbmUpOgotICAgIHJldHVybiBQb3BUb2tlbih0b2tlbnMsIHRva2VuX3R5cGUpCi0KLSAgbmV4dCA9IFBlZWtUb2tlbih0b2tlbnMpCi0gIGlmIG5vdCBuZXh0OgotICAgIHJldHVybiBOb25lCi0gIGlmIG5leHQudG9rZW5fdHlwZSA9PSAnJGVsc2UnOgotICAgIFBvcCgnJGVsc2UnKQotICAgIFBvcCgnW1snKQotICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQotICAgIFBvcCgnXV0nKQotICAgIHJldHVybiBjb2RlX25vZGUKLSAgZWxpZiBuZXh0LnRva2VuX3R5cGUgPT0gJyRlbGlmJzoKLSAgICBQb3AoJyRlbGlmJykKLSAgICBleHAgPSBQb3AoJ2NvZGUnKQotICAgIFBvcCgnW1snKQotICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQotICAgIFBvcCgnXV0nKQotICAgIGlubmVyX2Vsc2Vfbm9kZSA9IFBhcnNlRWxzZU5vZGUodG9rZW5zKQotICAgIHJldHVybiBDb2RlTm9kZShbSWZOb2RlKFBhcnNlRXhwTm9kZShleHApLCBjb2RlX25vZGUsIGlubmVyX2Vsc2Vfbm9kZSldKQotICBlbGlmIG5vdCBuZXh0LnZhbHVlLnN0cmlwKCk6Ci0gICAgUG9wKCdjb2RlJykKLSAgICByZXR1cm4gUGFyc2VFbHNlTm9kZSh0b2tlbnMpCi0gIGVsc2U6Ci0gICAgcmV0dXJuIE5vbmUKLQotCi1kZWYgUGFyc2VBdG9taWNDb2RlTm9kZSh0b2tlbnMpOgotICBkZWYgUG9wKHRva2VuX3R5cGU9Tm9uZSk6Ci0gICAgcmV0dXJuIFBvcFRva2VuKHRva2VucywgdG9rZW5fdHlwZSkKLQotICBoZWFkID0gUG9wRnJvbnQodG9rZW5zKQotICB0ID0gaGVhZC50b2tlbl90eXBlCi0gIGlmIHQgPT0gJ2NvZGUnOgotICAgIHJldHVybiBSYXdDb2RlTm9kZShoZWFkKQotICBlbGlmIHQgPT0gJyR2YXInOgotICAgIGlkX3Rva2VuID0gUG9wKCdpZCcpCi0gICAgUG9wKCc9JykKLSAgICBuZXh0ID0gUGVla1Rva2VuKHRva2VucykKLSAgICBpZiBuZXh0LnRva2VuX3R5cGUgPT0gJ2V4cCc6Ci0gICAgICBleHBfdG9rZW4gPSBQb3AoKQotICAgICAgcmV0dXJuIFZhck5vZGUoaWRfdG9rZW4sIFBhcnNlRXhwTm9kZShleHBfdG9rZW4pKQotICAgIFBvcCgnW1snKQotICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQotICAgIFBvcCgnXV0nKQotICAgIHJldHVybiBWYXJOb2RlKGlkX3Rva2VuLCBjb2RlX25vZGUpCi0gIGVsaWYgdCA9PSAnJGZvcic6Ci0gICAgaWRfdG9rZW4gPSBQb3AoJ2lkJykKLSAgICBuZXh0X3Rva2VuID0gUGVla1Rva2VuKHRva2VucykKLSAgICBpZiBuZXh0X3Rva2VuLnRva2VuX3R5cGUgPT0gJ2NvZGUnOgotICAgICAgc2VwX3Rva2VuID0gbmV4dF90b2tlbgotICAgICAgUG9wKCdjb2RlJykKLSAgICBlbHNlOgotICAgICAgc2VwX3Rva2VuID0gTm9uZQotICAgIFBvcCgnW1snKQotICAgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQotICAgIFBvcCgnXV0nKQotICAgIHJldHVybiBGb3JOb2RlKGlkX3Rva2VuLCBzZXBfdG9rZW4sIGNvZGVfbm9kZSkKLSAgZWxpZiB0ID09ICckaWYnOgotICAgIGV4cF90b2tlbiA9IFBvcCgnY29kZScpCi0gICAgUG9wKCdbWycpCi0gICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCi0gICAgUG9wKCddXScpCi0gICAgZWxzZV9ub2RlID0gUGFyc2VFbHNlTm9kZSh0b2tlbnMpCi0gICAgcmV0dXJuIElmTm9kZShQYXJzZUV4cE5vZGUoZXhwX3Rva2VuKSwgY29kZV9ub2RlLCBlbHNlX25vZGUpCi0gIGVsaWYgdCA9PSAnJHJhbmdlJzoKLSAgICBpZF90b2tlbiA9IFBvcCgnaWQnKQotICAgIGV4cDFfdG9rZW4gPSBQb3AoJ2V4cCcpCi0gICAgUG9wKCcuLicpCi0gICAgZXhwMl90b2tlbiA9IFBvcCgnZXhwJykKLSAgICByZXR1cm4gUmFuZ2VOb2RlKGlkX3Rva2VuLCBQYXJzZUV4cE5vZGUoZXhwMV90b2tlbiksCi0gICAgICAgICAgICAgICAgICAgICBQYXJzZUV4cE5vZGUoZXhwMl90b2tlbikpCi0gIGVsaWYgdCA9PSAnJGlkJzoKLSAgICByZXR1cm4gUGFyc2VFeHBOb2RlKFRva2VuKGhlYWQuc3RhcnQgKyAxLCBoZWFkLmVuZCwgaGVhZC52YWx1ZVsxOl0sICdpZCcpKQotICBlbGlmIHQgPT0gJyQoJCknOgotICAgIHJldHVybiBMaXRlcmFsRG9sbGFyTm9kZShoZWFkKQotICBlbGlmIHQgPT0gJyQnOgotICAgIGV4cF90b2tlbiA9IFBvcCgnZXhwJykKLSAgICByZXR1cm4gUGFyc2VFeHBOb2RlKGV4cF90b2tlbikKLSAgZWxpZiB0ID09ICdbWyc6Ci0gICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCi0gICAgUG9wKCddXScpCi0gICAgcmV0dXJuIGNvZGVfbm9kZQotICBlbHNlOgotICAgIFB1c2hGcm9udCh0b2tlbnMsIGhlYWQpCi0gICAgcmV0dXJuIE5vbmUKLQotCi1kZWYgUGFyc2VDb2RlTm9kZSh0b2tlbnMpOgotICBhdG9taWNfY29kZV9saXN0ID0gW10KLSAgd2hpbGUgVHJ1ZToKLSAgICBpZiBub3QgdG9rZW5zOgotICAgICAgYnJlYWsKLSAgICBhdG9taWNfY29kZV9ub2RlID0gUGFyc2VBdG9taWNDb2RlTm9kZSh0b2tlbnMpCi0gICAgaWYgYXRvbWljX2NvZGVfbm9kZToKLSAgICAgIGF0b21pY19jb2RlX2xpc3QuYXBwZW5kKGF0b21pY19jb2RlX25vZGUpCi0gICAgZWxzZToKLSAgICAgIGJyZWFrCi0gIHJldHVybiBDb2RlTm9kZShhdG9taWNfY29kZV9saXN0KQotCi0KLWRlZiBQYXJzZVRvQVNUKHB1bXBfc3JjX3RleHQpOgotICAiIiJDb252ZXJ0IHRoZSBnaXZlbiBQdW1wIHNvdXJjZSB0ZXh0IGludG8gYW4gQVNULiIiIgotICB0b2tlbnMgPSBsaXN0KFRva2VuaXplKHB1bXBfc3JjX3RleHQpKQotICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKLSAgcmV0dXJuIGNvZGVfbm9kZQotCi0KLWNsYXNzIEVudjoKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYudmFyaWFibGVzID0gW10KLSAgICBzZWxmLnJhbmdlcyA9IFtdCi0KLSAgZGVmIENsb25lKHNlbGYpOgotICAgIGNsb25lID0gRW52KCkKLSAgICBjbG9uZS52YXJpYWJsZXMgPSBzZWxmLnZhcmlhYmxlc1s6XQotICAgIGNsb25lLnJhbmdlcyA9IHNlbGYucmFuZ2VzWzpdCi0gICAgcmV0dXJuIGNsb25lCi0KLSAgZGVmIFB1c2hWYXJpYWJsZShzZWxmLCB2YXIsIHZhbHVlKToKLSAgICAjIElmIHZhbHVlIGxvb2tzIGxpa2UgYW4gaW50LCBzdG9yZSBpdCBhcyBhbiBpbnQuCi0gICAgdHJ5OgotICAgICAgaW50X3ZhbHVlID0gaW50KHZhbHVlKQotICAgICAgaWYgKCclcycgJSBpbnRfdmFsdWUpID09IHZhbHVlOgotICAgICAgICB2YWx1ZSA9IGludF92YWx1ZQotICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICBwYXNzCi0gICAgc2VsZi52YXJpYWJsZXNbOjBdID0gWyh2YXIsIHZhbHVlKV0KLQotICBkZWYgUG9wVmFyaWFibGUoc2VsZik6Ci0gICAgc2VsZi52YXJpYWJsZXNbOjFdID0gW10KLQotICBkZWYgUHVzaFJhbmdlKHNlbGYsIHZhciwgbG93ZXIsIHVwcGVyKToKLSAgICBzZWxmLnJhbmdlc1s6MF0gPSBbKHZhciwgbG93ZXIsIHVwcGVyKV0KLQotICBkZWYgUG9wUmFuZ2Uoc2VsZik6Ci0gICAgc2VsZi5yYW5nZXNbOjFdID0gW10KLQotICBkZWYgR2V0VmFsdWUoc2VsZiwgaWRlbnRpZmllcik6Ci0gICAgZm9yICh2YXIsIHZhbHVlKSBpbiBzZWxmLnZhcmlhYmxlczoKLSAgICAgIGlmIGlkZW50aWZpZXIgPT0gdmFyOgotICAgICAgICByZXR1cm4gdmFsdWUKLQotICAgIHByaW50ICdFUlJPUjogbWV0YSB2YXJpYWJsZSAlcyBpcyB1bmRlZmluZWQuJyAlIChpZGVudGlmaWVyLCkKLSAgICBzeXMuZXhpdCgxKQotCi0gIGRlZiBFdmFsRXhwKHNlbGYsIGV4cCk6Ci0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gZXZhbChleHAucHl0aG9uX2V4cCkKLSAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgotICAgICAgcHJpbnQgJ0VSUk9SOiBjYXVnaHQgZXhjZXB0aW9uICVzOiAlcycgJSAoZS5fX2NsYXNzX18uX19uYW1lX18sIGUpCi0gICAgICBwcmludCAoJ0VSUk9SOiBmYWlsZWQgdG8gZXZhbHVhdGUgbWV0YSBleHByZXNzaW9uICVzIGF0ICVzJyAlCi0gICAgICAgICAgICAgKGV4cC5weXRob25fZXhwLCBleHAudG9rZW4uc3RhcnQpKQotICAgICAgc3lzLmV4aXQoMSkKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIEdldFJhbmdlKHNlbGYsIGlkZW50aWZpZXIpOgotICAgIGZvciAodmFyLCBsb3dlciwgdXBwZXIpIGluIHNlbGYucmFuZ2VzOgotICAgICAgaWYgaWRlbnRpZmllciA9PSB2YXI6Ci0gICAgICAgIHJldHVybiAobG93ZXIsIHVwcGVyKQotCi0gICAgcHJpbnQgJ0VSUk9SOiByYW5nZSAlcyBpcyB1bmRlZmluZWQuJyAlIChpZGVudGlmaWVyLCkKLSAgICBzeXMuZXhpdCgxKQotCi0KLWNsYXNzIE91dHB1dDoKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYuc3RyaW5nID0gJycKLQotICBkZWYgR2V0TGFzdExpbmUoc2VsZik6Ci0gICAgaW5kZXggPSBzZWxmLnN0cmluZy5yZmluZCgnXG4nKQotICAgIGlmIGluZGV4IDwgMDoKLSAgICAgIHJldHVybiAnJwotCi0gICAgcmV0dXJuIHNlbGYuc3RyaW5nW2luZGV4ICsgMTpdCi0KLSAgZGVmIEFwcGVuZChzZWxmLCBzKToKLSAgICBzZWxmLnN0cmluZyArPSBzCi0KLQotZGVmIFJ1bkF0b21pY0NvZGUoZW52LCBub2RlLCBvdXRwdXQpOgotICBpZiBpc2luc3RhbmNlKG5vZGUsIFZhck5vZGUpOgotICAgIGlkZW50aWZpZXIgPSBub2RlLmlkZW50aWZpZXIudmFsdWUuc3RyaXAoKQotICAgIHJlc3VsdCA9IE91dHB1dCgpCi0gICAgUnVuQXRvbWljQ29kZShlbnYuQ2xvbmUoKSwgbm9kZS5hdG9taWNfY29kZSwgcmVzdWx0KQotICAgIHZhbHVlID0gcmVzdWx0LnN0cmluZwotICAgIGVudi5QdXNoVmFyaWFibGUoaWRlbnRpZmllciwgdmFsdWUpCi0gIGVsaWYgaXNpbnN0YW5jZShub2RlLCBSYW5nZU5vZGUpOgotICAgIGlkZW50aWZpZXIgPSBub2RlLmlkZW50aWZpZXIudmFsdWUuc3RyaXAoKQotICAgIGxvd2VyID0gaW50KGVudi5FdmFsRXhwKG5vZGUuZXhwMSkpCi0gICAgdXBwZXIgPSBpbnQoZW52LkV2YWxFeHAobm9kZS5leHAyKSkKLSAgICBlbnYuUHVzaFJhbmdlKGlkZW50aWZpZXIsIGxvd2VyLCB1cHBlcikKLSAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEZvck5vZGUpOgotICAgIGlkZW50aWZpZXIgPSBub2RlLmlkZW50aWZpZXIudmFsdWUuc3RyaXAoKQotICAgIGlmIG5vZGUuc2VwIGlzIE5vbmU6Ci0gICAgICBzZXAgPSAnJwotICAgIGVsc2U6Ci0gICAgICBzZXAgPSBub2RlLnNlcC52YWx1ZQotICAgIChsb3dlciwgdXBwZXIpID0gZW52LkdldFJhbmdlKGlkZW50aWZpZXIpCi0gICAgZm9yIGkgaW4gcmFuZ2UobG93ZXIsIHVwcGVyICsgMSk6Ci0gICAgICBuZXdfZW52ID0gZW52LkNsb25lKCkKLSAgICAgIG5ld19lbnYuUHVzaFZhcmlhYmxlKGlkZW50aWZpZXIsIGkpCi0gICAgICBSdW5Db2RlKG5ld19lbnYsIG5vZGUuY29kZSwgb3V0cHV0KQotICAgICAgaWYgaSAhPSB1cHBlcjoKLSAgICAgICAgb3V0cHV0LkFwcGVuZChzZXApCi0gIGVsaWYgaXNpbnN0YW5jZShub2RlLCBSYXdDb2RlTm9kZSk6Ci0gICAgb3V0cHV0LkFwcGVuZChub2RlLnJhd19jb2RlLnZhbHVlKQotICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgSWZOb2RlKToKLSAgICBjb25kID0gZW52LkV2YWxFeHAobm9kZS5leHApCi0gICAgaWYgY29uZDoKLSAgICAgIFJ1bkNvZGUoZW52LkNsb25lKCksIG5vZGUudGhlbl9icmFuY2gsIG91dHB1dCkKLSAgICBlbGlmIG5vZGUuZWxzZV9icmFuY2ggaXMgbm90IE5vbmU6Ci0gICAgICBSdW5Db2RlKGVudi5DbG9uZSgpLCBub2RlLmVsc2VfYnJhbmNoLCBvdXRwdXQpCi0gIGVsaWYgaXNpbnN0YW5jZShub2RlLCBFeHBOb2RlKToKLSAgICB2YWx1ZSA9IGVudi5FdmFsRXhwKG5vZGUpCi0gICAgb3V0cHV0LkFwcGVuZCgnJXMnICUgKHZhbHVlLCkpCi0gIGVsaWYgaXNpbnN0YW5jZShub2RlLCBMaXRlcmFsRG9sbGFyTm9kZSk6Ci0gICAgb3V0cHV0LkFwcGVuZCgnJCcpCi0gIGVsaWYgaXNpbnN0YW5jZShub2RlLCBDb2RlTm9kZSk6Ci0gICAgUnVuQ29kZShlbnYuQ2xvbmUoKSwgbm9kZSwgb3V0cHV0KQotICBlbHNlOgotICAgIHByaW50ICdCQUQnCi0gICAgcHJpbnQgbm9kZQotICAgIHN5cy5leGl0KDEpCi0KLQotZGVmIFJ1bkNvZGUoZW52LCBjb2RlX25vZGUsIG91dHB1dCk6Ci0gIGZvciBhdG9taWNfY29kZSBpbiBjb2RlX25vZGUuYXRvbWljX2NvZGU6Ci0gICAgUnVuQXRvbWljQ29kZShlbnYsIGF0b21pY19jb2RlLCBvdXRwdXQpCi0KLQotZGVmIElzU2luZ2xlTGluZUNvbW1lbnQoY3VyX2xpbmUpOgotICByZXR1cm4gJy8vJyBpbiBjdXJfbGluZQotCi0KLWRlZiBJc0luUHJlcHJvY2Vzc29yRGlyZWN0aXZlKHByZXZfbGluZXMsIGN1cl9saW5lKToKLSAgaWYgY3VyX2xpbmUubHN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgotICAgIHJldHVybiBUcnVlCi0gIHJldHVybiBwcmV2X2xpbmVzIGFuZCBwcmV2X2xpbmVzWy0xXS5lbmRzd2l0aCgnXFwnKQotCi0KLWRlZiBXcmFwQ29tbWVudChsaW5lLCBvdXRwdXQpOgotICBsb2MgPSBsaW5lLmZpbmQoJy8vJykKLSAgYmVmb3JlX2NvbW1lbnQgPSBsaW5lWzpsb2NdLnJzdHJpcCgpCi0gIGlmIGJlZm9yZV9jb21tZW50ID09ICcnOgotICAgIGluZGVudCA9IGxvYwotICBlbHNlOgotICAgIG91dHB1dC5hcHBlbmQoYmVmb3JlX2NvbW1lbnQpCi0gICAgaW5kZW50ID0gbGVuKGJlZm9yZV9jb21tZW50KSAtIGxlbihiZWZvcmVfY29tbWVudC5sc3RyaXAoKSkKLSAgcHJlZml4ID0gaW5kZW50KicgJyArICcvLyAnCi0gIG1heF9sZW4gPSA4MCAtIGxlbihwcmVmaXgpCi0gIGNvbW1lbnQgPSBsaW5lW2xvYyArIDI6XS5zdHJpcCgpCi0gIHNlZ3MgPSBbc2VnIGZvciBzZWcgaW4gcmUuc3BsaXQocicoXHcrXFcqKScsIGNvbW1lbnQpIGlmIHNlZyAhPSAnJ10KLSAgY3VyX2xpbmUgPSAnJwotICBmb3Igc2VnIGluIHNlZ3M6Ci0gICAgaWYgbGVuKChjdXJfbGluZSArIHNlZykucnN0cmlwKCkpIDwgbWF4X2xlbjoKLSAgICAgIGN1cl9saW5lICs9IHNlZwotICAgIGVsc2U6Ci0gICAgICBpZiBjdXJfbGluZS5zdHJpcCgpICE9ICcnOgotICAgICAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnJzdHJpcCgpKQotICAgICAgY3VyX2xpbmUgPSBzZWcubHN0cmlwKCkKLSAgaWYgY3VyX2xpbmUuc3RyaXAoKSAhPSAnJzoKLSAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnN0cmlwKCkpCi0KLQotZGVmIFdyYXBDb2RlKGxpbmUsIGxpbmVfY29uY2F0LCBvdXRwdXQpOgotICBpbmRlbnQgPSBsZW4obGluZSkgLSBsZW4obGluZS5sc3RyaXAoKSkKLSAgcHJlZml4ID0gaW5kZW50KicgJyAgIyBQcmVmaXggb2YgdGhlIGN1cnJlbnQgbGluZQotICBtYXhfbGVuID0gODAgLSBpbmRlbnQgLSBsZW4obGluZV9jb25jYXQpICAjIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGxpbmUKLSAgbmV3X3ByZWZpeCA9IHByZWZpeCArIDQqJyAnICAjIFByZWZpeCBvZiBhIGNvbnRpbnVhdGlvbiBsaW5lCi0gIG5ld19tYXhfbGVuID0gbWF4X2xlbiAtIDQgICMgTWF4aW11bSBsZW5ndGggb2YgYSBjb250aW51YXRpb24gbGluZQotICAjIFByZWZlcnMgdG8gd3JhcCBhIGxpbmUgYWZ0ZXIgYSAnLCcgb3IgJzsnLgotICBzZWdzID0gW3NlZyBmb3Igc2VnIGluIHJlLnNwbGl0KHInKFteLDtdK1ssO10/KScsIGxpbmUuc3RyaXAoKSkgaWYgc2VnICE9ICcnXQotICBjdXJfbGluZSA9ICcnICAjIFRoZSBjdXJyZW50IGxpbmUgd2l0aG91dCBsZWFkaW5nIHNwYWNlcy4KLSAgZm9yIHNlZyBpbiBzZWdzOgotICAgICMgSWYgdGhlIGxpbmUgaXMgc3RpbGwgdG9vIGxvbmcsIHdyYXAgYXQgYSBzcGFjZS4KLSAgICB3aGlsZSBjdXJfbGluZSA9PSAnJyBhbmQgbGVuKHNlZy5zdHJpcCgpKSA+IG1heF9sZW46Ci0gICAgICBzZWcgPSBzZWcubHN0cmlwKCkKLSAgICAgIHNwbGl0X2F0ID0gc2VnLnJmaW5kKCcgJywgMCwgbWF4X2xlbikKLSAgICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgc2VnWzpzcGxpdF9hdF0uc3RyaXAoKSArIGxpbmVfY29uY2F0KQotICAgICAgc2VnID0gc2VnW3NwbGl0X2F0ICsgMTpdCi0gICAgICBwcmVmaXggPSBuZXdfcHJlZml4Ci0gICAgICBtYXhfbGVuID0gbmV3X21heF9sZW4KLQotICAgIGlmIGxlbigoY3VyX2xpbmUgKyBzZWcpLnJzdHJpcCgpKSA8IG1heF9sZW46Ci0gICAgICBjdXJfbGluZSA9IChjdXJfbGluZSArIHNlZykubHN0cmlwKCkKLSAgICBlbHNlOgotICAgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5yc3RyaXAoKSArIGxpbmVfY29uY2F0KQotICAgICAgcHJlZml4ID0gbmV3X3ByZWZpeAotICAgICAgbWF4X2xlbiA9IG5ld19tYXhfbGVuCi0gICAgICBjdXJfbGluZSA9IHNlZy5sc3RyaXAoKQotICBpZiBjdXJfbGluZS5zdHJpcCgpICE9ICcnOgotICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgY3VyX2xpbmUuc3RyaXAoKSkKLQotCi1kZWYgV3JhcFByZXByb2Nlc3NvckRpcmVjdGl2ZShsaW5lLCBvdXRwdXQpOgotICBXcmFwQ29kZShsaW5lLCAnIFxcJywgb3V0cHV0KQotCi0KLWRlZiBXcmFwUGxhaW5Db2RlKGxpbmUsIG91dHB1dCk6Ci0gIFdyYXBDb2RlKGxpbmUsICcnLCBvdXRwdXQpCi0KLQotZGVmIElzTXVsdGlMaW5lSVdZVVByYWdtYShsaW5lKToKLSAgcmV0dXJuIHJlLnNlYXJjaChyJy9cKiBJV1lVIHByYWdtYTogJywgbGluZSkKLQotCi1kZWYgSXNIZWFkZXJHdWFyZEluY2x1ZGVPck9uZUxpbmVJV1lVUHJhZ21hKGxpbmUpOgotICByZXR1cm4gKHJlLm1hdGNoKHInXiMoaWZuZGVmfGRlZmluZXxlbmRpZlxzKi8vKVxzKltcd19dK1xzKiQnLCBsaW5lKSBvcgotICAgICAgICAgIHJlLm1hdGNoKHInXiNpbmNsdWRlXHMnLCBsaW5lKSBvcgotICAgICAgICAgICMgRG9uJ3QgYnJlYWsgSVdZVSBwcmFnbWFzLCBlaXRoZXI7IHRoYXQgY2F1c2VzIGl3eXUucHkgcHJvYmxlbXMuCi0gICAgICAgICAgcmUuc2VhcmNoKHInLy8gSVdZVSBwcmFnbWE6ICcsIGxpbmUpKQotCi0KLWRlZiBXcmFwTG9uZ0xpbmUobGluZSwgb3V0cHV0KToKLSAgbGluZSA9IGxpbmUucnN0cmlwKCkKLSAgaWYgbGVuKGxpbmUpIDw9IDgwOgotICAgIG91dHB1dC5hcHBlbmQobGluZSkKLSAgZWxpZiBJc1NpbmdsZUxpbmVDb21tZW50KGxpbmUpOgotICAgIGlmIElzSGVhZGVyR3VhcmRJbmNsdWRlT3JPbmVMaW5lSVdZVVByYWdtYShsaW5lKToKLSAgICAgICMgVGhlIHN0eWxlIGd1aWRlIG1hZGUgYW4gZXhjZXB0aW9uIHRvIGFsbG93IGxvbmcgaGVhZGVyIGd1YXJkIGxpbmVzLAotICAgICAgIyBpbmNsdWRlcyBhbmQgSVdZVSBwcmFnbWFzLgotICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKQotICAgIGVsc2U6Ci0gICAgICBXcmFwQ29tbWVudChsaW5lLCBvdXRwdXQpCi0gIGVsaWYgSXNJblByZXByb2Nlc3NvckRpcmVjdGl2ZShvdXRwdXQsIGxpbmUpOgotICAgIGlmIElzSGVhZGVyR3VhcmRJbmNsdWRlT3JPbmVMaW5lSVdZVVByYWdtYShsaW5lKToKLSAgICAgICMgVGhlIHN0eWxlIGd1aWRlIG1hZGUgYW4gZXhjZXB0aW9uIHRvIGFsbG93IGxvbmcgaGVhZGVyIGd1YXJkIGxpbmVzLAotICAgICAgIyBpbmNsdWRlcyBhbmQgSVdZVSBwcmFnbWFzLgotICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKQotICAgIGVsc2U6Ci0gICAgICBXcmFwUHJlcHJvY2Vzc29yRGlyZWN0aXZlKGxpbmUsIG91dHB1dCkKLSAgZWxpZiBJc011bHRpTGluZUlXWVVQcmFnbWEobGluZSk6Ci0gICAgb3V0cHV0LmFwcGVuZChsaW5lKQotICBlbHNlOgotICAgIFdyYXBQbGFpbkNvZGUobGluZSwgb3V0cHV0KQotCi0KLWRlZiBCZWF1dGlmeUNvZGUoc3RyaW5nKToKLSAgbGluZXMgPSBzdHJpbmcuc3BsaXRsaW5lcygpCi0gIG91dHB1dCA9IFtdCi0gIGZvciBsaW5lIGluIGxpbmVzOgotICAgIFdyYXBMb25nTGluZShsaW5lLCBvdXRwdXQpCi0gIG91dHB1dDIgPSBbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBvdXRwdXRdCi0gIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0MikgKyAnXG4nCi0KLQotZGVmIENvbnZlcnRGcm9tUHVtcFNvdXJjZShzcmNfdGV4dCk6Ci0gICIiIlJldHVybiB0aGUgdGV4dCBnZW5lcmF0ZWQgZnJvbSB0aGUgZ2l2ZW4gUHVtcCBzb3VyY2UgdGV4dC4iIiIKLSAgYXN0ID0gUGFyc2VUb0FTVChTdHJpcE1ldGFDb21tZW50cyhzcmNfdGV4dCkpCi0gIG91dHB1dCA9IE91dHB1dCgpCi0gIFJ1bkNvZGUoRW52KCksIGFzdCwgb3V0cHV0KQotICByZXR1cm4gQmVhdXRpZnlDb2RlKG91dHB1dC5zdHJpbmcpCi0KLQotZGVmIG1haW4oYXJndik6Ci0gIGlmIGxlbihhcmd2KSA9PSAxOgotICAgIHByaW50IF9fZG9jX18KLSAgICBzeXMuZXhpdCgxKQotCi0gIGZpbGVfcGF0aCA9IGFyZ3ZbLTFdCi0gIG91dHB1dF9zdHIgPSBDb252ZXJ0RnJvbVB1bXBTb3VyY2UoZmlsZShmaWxlX3BhdGgsICdyJykucmVhZCgpKQotICBpZiBmaWxlX3BhdGguZW5kc3dpdGgoJy5wdW1wJyk6Ci0gICAgb3V0cHV0X2ZpbGVfcGF0aCA9IGZpbGVfcGF0aFs6LTVdCi0gIGVsc2U6Ci0gICAgb3V0cHV0X2ZpbGVfcGF0aCA9ICctJwotICBpZiBvdXRwdXRfZmlsZV9wYXRoID09ICctJzoKLSAgICBwcmludCBvdXRwdXRfc3RyLAotICBlbHNlOgotICAgIG91dHB1dF9maWxlID0gZmlsZShvdXRwdXRfZmlsZV9wYXRoLCAndycpCi0gICAgb3V0cHV0X2ZpbGUud3JpdGUoJy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6XG4nKQotICAgIG91dHB1dF9maWxlLndyaXRlKCcvLyAgICAgJXMgJXNcbicgJQotICAgICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlX3BhdGgpKSkKLSAgICBvdXRwdXRfZmlsZS53cml0ZSgnLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIVxuXG4nKQotICAgIG91dHB1dF9maWxlLndyaXRlKG91dHB1dF9zdHIpCi0gICAgb3V0cHV0X2ZpbGUuY2xvc2UoKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvcmVsZWFzZV9kb2NzLnB5IGIvdGVzdGluZy9ndGVzdC9zY3JpcHRzL3JlbGVhc2VfZG9jcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI5MTM0Ny4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvcmVsZWFzZV9kb2NzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiU2NyaXB0IGZvciBicmFuY2hpbmcgR29vZ2xlIFRlc3QvTW9jayB3aWtpIHBhZ2VzIGZvciBhIG5ldyB2ZXJzaW9uLgotCi1TWU5PUFNJUwotICAgICAgIHJlbGVhc2VfZG9jcy5weSBORVdfUkVMRUFTRV9WRVJTSU9OCi0KLSAgICAgICBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2sncyBleHRlcm5hbCB1c2VyIGRvY3VtZW50YXRpb24gaXMgaW4KLSAgICAgICBpbnRlcmxpbmtlZCB3aWtpIGZpbGVzLiAgV2hlbiB3ZSByZWxlYXNlIGEgbmV3IHZlcnNpb24gb2YKLSAgICAgICBHb29nbGUgVGVzdCBvciBHb29nbGUgTW9jaywgd2UgbmVlZCB0byBicmFuY2ggdGhlIHdpa2kgZmlsZXMKLSAgICAgICBzdWNoIHRoYXQgdXNlcnMgb2YgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEdvb2dsZSBUZXN0L01vY2sgY2FuCi0gICAgICAgbG9vayB1cCBkb2N1bWVuYXRpb24gcmVsZXZhbnQgZm9yIHRoYXQgdmVyc2lvbi4gIFRoaXMgc2NyaXB0Ci0gICAgICAgYXV0b21hdGVzIHRoYXQgcHJvY2VzcyBieToKLQotICAgICAgICAgLSBicmFuY2hpbmcgdGhlIGN1cnJlbnQgd2lraSBwYWdlcyAod2hpY2ggZG9jdW1lbnQgdGhlCi0gICAgICAgICAgIGJlaGF2aW9yIG9mIHRoZSBTVk4gdHJ1bmsgaGVhZCkgdG8gcGFnZXMgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICAgdmVyc2lvbiAoZS5nLiBicmFuY2hpbmcgRkFRLndpa2kgdG8gVjJfNl9GQVEud2lraSB3aGVuCi0gICAgICAgICAgIE5FV19SRUxFQVNFX1ZFUlNJT04gaXMgMi42KTsKLSAgICAgICAgIC0gdXBkYXRpbmcgdGhlIGxpbmtzIGluIHRoZSBicmFuY2hlZCBmaWxlcyB0byBwb2ludCB0byB0aGUgYnJhbmNoZWQKLSAgICAgICAgICAgdmVyc2lvbiAoZS5nLiBhIGxpbmsgaW4gVjJfNl9GQVEud2lraSB0aGF0IHBvaW50ZWQgdG8KLSAgICAgICAgICAgUHJpbWVyLndpa2kjQW5jaG9yIHdpbGwgbm93IHBvaW50IHRvIFYyXzZfUHJpbWVyLndpa2kjQW5jaG9yKS4KLQotICAgICAgIE5PVEU6IE5FV19SRUxFQVNFX1ZFUlNJT04gbXVzdCBiZSBhIE5FVyB2ZXJzaW9uIG51bWJlciBmb3IKLSAgICAgICB3aGljaCB0aGUgd2lraSBwYWdlcyBkb24ndCB5ZXQgZXhpc3Q7IG90aGVyd2lzZSB5b3UnbGwgZ2V0IFNWTgotICAgICAgIGVycm9ycyBsaWtlICJzdm46IFBhdGggJ1YxXzdfUHVtcE1hbnVhbC53aWtpJyBpcyBub3QgYQotICAgICAgIGRpcmVjdG9yeSIgd2hlbiBydW5uaW5nIHRoZSBzY3JpcHQuCi0KLUVYQU1QTEUKLSAgICAgICAkIGNkIFBBVEgvVE8vR1RFU1RfU1ZOX1dPUktTUEFDRS90cnVuawotICAgICAgICQgc2NyaXB0cy9yZWxlYXNlX2RvY3MucHkgMi42ICAjIGNyZWF0ZSB3aWtpIHBhZ2VzIGZvciB2Mi42Ci0gICAgICAgJCBzdm4gc3RhdHVzICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IHRoZSBmaWxlIGxpc3QKLSAgICAgICAkIHN2biBkaWZmICAgICAgICAgICAgICAgICAgICAgIyB2ZXJpZnkgdGhlIGZpbGUgY29udGVudHMKLSAgICAgICAkIHN2biBjb21taXQgLW0gInJlbGVhc2Ugd2lraSBwYWdlcyBmb3IgdjIuNiIKLSIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHN5cwotCi1pbXBvcnQgY29tbW9uCi0KLQotIyBXaWtpIHBhZ2VzIHRoYXQgc2hvdWxkbid0IGJlIGJyYW5jaGVkIGZvciBldmVyeSBndGVzdC9nbW9jayByZWxlYXNlLgotR1RFU1RfVU5WRVJTSU9ORURfV0lLSVMgPSBbJ0Rldkd1aWRlLndpa2knXQotR01PQ0tfVU5WRVJTSU9ORURfV0lLSVMgPSBbCi0gICAgJ0Rlc2lnbkRvYy53aWtpJywKLSAgICAnRGV2R3VpZGUud2lraScsCi0gICAgJ0tub3duSXNzdWVzLndpa2knCi0gICAgXQotCi0KLWRlZiBEcm9wV2lraVN1ZmZpeCh3aWtpX2ZpbGVuYW1lKToKLSAgIiIiUmVtb3ZlcyB0aGUgLndpa2kgc3VmZml4IChpZiBhbnkpIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLiIiIgotCi0gIHJldHVybiAod2lraV9maWxlbmFtZVs6LWxlbignLndpa2knKV0gaWYgd2lraV9maWxlbmFtZS5lbmRzd2l0aCgnLndpa2knKQotICAgICAgICAgIGVsc2Ugd2lraV9maWxlbmFtZSkKLQotCi1jbGFzcyBXaWtpQnJhbmNoZXIob2JqZWN0KToKLSAgIiIiQnJhbmNoZXMgLi4uIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGRvdF92ZXJzaW9uKToKLSAgICBzZWxmLnByb2plY3QsIHN2bl9yb290X3BhdGggPSBjb21tb24uR2V0U3ZuSW5mbygpCi0gICAgaWYgc2VsZi5wcm9qZWN0IG5vdCBpbiAoJ2dvb2dsZXRlc3QnLCAnZ29vZ2xlbW9jaycpOgotICAgICAgc3lzLmV4aXQoJ1RoaXMgc2NyaXB0IG11c3QgYmUgcnVuIGluIGEgZ3Rlc3Qgb3IgZ21vY2sgU1ZOIHdvcmtzcGFjZS4nKQotICAgIHNlbGYud2lraV9kaXIgPSBzdm5fcm9vdF9wYXRoICsgJy93aWtpJwotICAgICMgVHVybiAnMi42JyB0byAnVjJfNl8nLgotICAgIHNlbGYudmVyc2lvbl9wcmVmaXggPSAnVicgKyBkb3RfdmVyc2lvbi5yZXBsYWNlKCcuJywgJ18nKSArICdfJwotICAgIHNlbGYuZmlsZXNfdG9fYnJhbmNoID0gc2VsZi5HZXRGaWxlc1RvQnJhbmNoKCkKLSAgICBwYWdlX25hbWVzID0gW0Ryb3BXaWtpU3VmZml4KGYpIGZvciBmIGluIHNlbGYuZmlsZXNfdG9fYnJhbmNoXQotICAgICMgQSBsaW5rIHRvIEZvby53aWtpIGlzIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgotICAgICMgICBbRm9vIHdvcmRzXQotICAgICMgICBbRm9vI0FuY2hvciB3b3Jkc10KLSAgICAjICAgW2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vLi4uL3dpa2kvRm9vIHdvcmRzXQotICAgICMgICBbaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS8uLi4vd2lraS9Gb28jQW5jaG9yIHdvcmRzXQotICAgICMgV2Ugd2FudCB0byByZXBsYWNlICdGb28nIHdpdGggJ1YyXzZfRm9vJyBpbiB0aGUgYWJvdmUgY2FzZXMuCi0gICAgc2VsZi5zZWFyY2hfZm9yX3JlID0gcmUuY29tcGlsZSgKLSAgICAgICAgIyBUaGlzIHJlZ2V4IG1hdGNoZXMgZWl0aGVyCi0gICAgICAgICMgICBbRm9vCi0gICAgICAgICMgb3IKLSAgICAgICAgIyAgIC93aWtpL0ZvbwotICAgICAgICAjIGZvbGxvd2VkIGJ5IGEgc3BhY2Ugb3IgYSAjLCB3aGVyZSBGb28gaXMgdGhlIG5hbWUgb2YgYW4KLSAgICAgICAgIyB1bnZlcnNpb25lZCB3aWtpIHBhZ2UuCi0gICAgICAgIHInKFxbfC93aWtpLykoJXMpKFsgI10pJyAlICd8Jy5qb2luKHBhZ2VfbmFtZXMpKQotICAgIHNlbGYucmVwbGFjZV93aXRoID0gcidcMSVzXDJcMycgJSAoc2VsZi52ZXJzaW9uX3ByZWZpeCwpCi0KLSAgZGVmIEdldEZpbGVzVG9CcmFuY2goc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgLndpa2kgZmlsZSBuYW1lcyB0aGF0IG5lZWQgdG8gYmUgYnJhbmNoZWQuIiIiCi0KLSAgICB1bnZlcnNpb25lZF93aWtpcyA9IChHVEVTVF9VTlZFUlNJT05FRF9XSUtJUyBpZiBzZWxmLnByb2plY3QgPT0gJ2dvb2dsZXRlc3QnCi0gICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBHTU9DS19VTlZFUlNJT05FRF9XSUtJUykKLSAgICByZXR1cm4gW2YgZm9yIGYgaW4gb3MubGlzdGRpcihzZWxmLndpa2lfZGlyKQotICAgICAgICAgICAgaWYgKGYuZW5kc3dpdGgoJy53aWtpJykgYW5kCi0gICAgICAgICAgICAgICAgbm90IHJlLm1hdGNoKHInXlZcZCcsIGYpIGFuZCAgIyBFeGNsdWRlZCB2ZXJzaW9uZWQgLndpa2kgZmlsZXMuCi0gICAgICAgICAgICAgICAgZiBub3QgaW4gdW52ZXJzaW9uZWRfd2lraXMpXQotCi0gIGRlZiBCcmFuY2hGaWxlcyhzZWxmKToKLSAgICAiIiJCcmFuY2hlcyB0aGUgLndpa2kgZmlsZXMgbmVlZGVkIHRvIGJlIGJyYW5jaGVkLiIiIgotCi0gICAgcHJpbnQgJ0JyYW5jaGluZyAlZCAud2lraSBmaWxlczonICUgKGxlbihzZWxmLmZpbGVzX3RvX2JyYW5jaCksKQotICAgIG9zLmNoZGlyKHNlbGYud2lraV9kaXIpCi0gICAgZm9yIGYgaW4gc2VsZi5maWxlc190b19icmFuY2g6Ci0gICAgICBjb21tYW5kID0gJ3N2biBjcCAlcyAlcyVzJyAlIChmLCBzZWxmLnZlcnNpb25fcHJlZml4LCBmKQotICAgICAgcHJpbnQgY29tbWFuZAotICAgICAgb3Muc3lzdGVtKGNvbW1hbmQpCi0KLSAgZGVmIFVwZGF0ZUxpbmtzSW5CcmFuY2hlZEZpbGVzKHNlbGYpOgotCi0gICAgZm9yIGYgaW4gc2VsZi5maWxlc190b19icmFuY2g6Ci0gICAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLndpa2lfZGlyLCBmKQotICAgICAgdmVyc2lvbmVkX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi53aWtpX2Rpciwgc2VsZi52ZXJzaW9uX3ByZWZpeCArIGYpCi0gICAgICBwcmludCAnVXBkYXRpbmcgbGlua3MgaW4gJXMuJyAlICh2ZXJzaW9uZWRfZmlsZSwpCi0gICAgICB0ZXh0ID0gZmlsZShzb3VyY2VfZmlsZSwgJ3InKS5yZWFkKCkKLSAgICAgIG5ld190ZXh0ID0gc2VsZi5zZWFyY2hfZm9yX3JlLnN1YihzZWxmLnJlcGxhY2Vfd2l0aCwgdGV4dCkKLSAgICAgIGZpbGUodmVyc2lvbmVkX2ZpbGUsICd3Jykud3JpdGUobmV3X3RleHQpCi0KLQotZGVmIG1haW4oKToKLSAgaWYgbGVuKHN5cy5hcmd2KSAhPSAyOgotICAgIHN5cy5leGl0KF9fZG9jX18pCi0KLSAgYnJhbmNoZXIgPSBXaWtpQnJhbmNoZXIoc3lzLmFyZ3ZbMV0pCi0gIGJyYW5jaGVyLkJyYW5jaEZpbGVzKCkKLSAgYnJhbmNoZXIuVXBkYXRlTGlua3NJbkJyYW5jaGVkRmlsZXMoKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUgYi90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvdGVzdC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZjU4NC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvdGVzdC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMgQSBNYWtlZmlsZSBmb3IgZnVzaW5nIEdvb2dsZSBUZXN0IGFuZCBidWlsZGluZyBhIHNhbXBsZSB0ZXN0IGFnYWluc3QgaXQuCi0jCi0jIFNZTk9QU0lTOgotIwotIyAgIG1ha2UgW2FsbF0gIC0gbWFrZXMgZXZlcnl0aGluZy4KLSMgICBtYWtlIFRBUkdFVCAtIG1ha2VzIHRoZSBnaXZlbiB0YXJnZXQuCi0jICAgbWFrZSBjaGVjayAgLSBtYWtlcyBldmVyeXRoaW5nIGFuZCBydW5zIHRoZSBidWlsdCBzYW1wbGUgdGVzdC4KLSMgICBtYWtlIGNsZWFuICAtIHJlbW92ZXMgYWxsIGZpbGVzIGdlbmVyYXRlZCBieSBtYWtlLgotCi0jIFBvaW50cyB0byB0aGUgcm9vdCBvZiBmdXNlZCBHb29nbGUgVGVzdCwgcmVsYXRpdmUgdG8gd2hlcmUgdGhpcyBmaWxlIGlzLgotRlVTRURfR1RFU1RfRElSID0gb3V0cHV0Ci0KLSMgUGF0aHMgdG8gdGhlIGZ1c2VkIGd0ZXN0IGZpbGVzLgotRlVTRURfR1RFU1RfSCA9ICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC5oCi1GVVNFRF9HVEVTVF9BTExfQ0MgPSAkKEZVU0VEX0dURVNUX0RJUikvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCi0KLSMgV2hlcmUgdG8gZmluZCB0aGUgc2FtcGxlIHRlc3QuCi1TQU1QTEVfRElSID0gLi4vLi4vc2FtcGxlcwotCi0jIFdoZXJlIHRvIGZpbmQgZ3Rlc3RfbWFpbi5jYy4KLUdURVNUX01BSU5fQ0MgPSAuLi8uLi9zcmMvZ3Rlc3RfbWFpbi5jYwotCi0jIEZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yLgotIyBXZSBoYXZlIG5vIGlkZWEgaGVyZSB3aGV0aGVyIHB0aHJlYWRzIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLCBzbwotIyBkaXNhYmxlIGl0cyB1c2UuCi1DUFBGTEFHUyArPSAtSSQoRlVTRURfR1RFU1RfRElSKSAtREdURVNUX0hBU19QVEhSRUFEPTAKLQotIyBGbGFncyBwYXNzZWQgdG8gdGhlIEMrKyBjb21waWxlci4KLUNYWEZMQUdTICs9IC1nCi0KLWFsbCA6IHNhbXBsZTFfdW5pdHRlc3QKLQotY2hlY2sgOiBhbGwKLQkuL3NhbXBsZTFfdW5pdHRlc3QKLQotY2xlYW4gOgotCXJtIC1yZiAkKEZVU0VEX0dURVNUX0RJUikgc2FtcGxlMV91bml0dGVzdCAqLm8KLQotJChGVVNFRF9HVEVTVF9IKSA6Ci0JLi4vZnVzZV9ndGVzdF9maWxlcy5weSAkKEZVU0VEX0dURVNUX0RJUikKLQotJChGVVNFRF9HVEVTVF9BTExfQ0MpIDoKLQkuLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5ICQoRlVTRURfR1RFU1RfRElSKQotCi1ndGVzdC1hbGwubyA6ICQoRlVTRURfR1RFU1RfSCkgJChGVVNFRF9HVEVTVF9BTExfQ0MpCi0JJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC1hbGwuY2MKLQotZ3Rlc3RfbWFpbi5vIDogJChGVVNFRF9HVEVTVF9IKSAkKEdURVNUX01BSU5fQ0MpCi0JJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoR1RFU1RfTUFJTl9DQykKLQotc2FtcGxlMS5vIDogJChTQU1QTEVfRElSKS9zYW1wbGUxLmNjICQoU0FNUExFX0RJUikvc2FtcGxlMS5oCi0JJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoU0FNUExFX0RJUikvc2FtcGxlMS5jYwotCi1zYW1wbGUxX3VuaXR0ZXN0Lm8gOiAkKFNBTVBMRV9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MgXAotICAgICAgICAgICAgICAgICAgICAgJChTQU1QTEVfRElSKS9zYW1wbGUxLmggJChGVVNFRF9HVEVTVF9IKQotCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFNBTVBMRV9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MKLQotc2FtcGxlMV91bml0dGVzdCA6IHNhbXBsZTEubyBzYW1wbGUxX3VuaXR0ZXN0Lm8gZ3Rlc3QtYWxsLm8gZ3Rlc3RfbWFpbi5vCi0JJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpICReIC1vICRACmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvdXBsb2FkLnB5IGIvdGVzdGluZy9ndGVzdC9zY3JpcHRzL3VwbG9hZC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU2ZjlhMS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NjcmlwdHMvdXBsb2FkLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTM4NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIiIiVG9vbCBmb3IgdXBsb2FkaW5nIGRpZmZzIGZyb20gYSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHRvIHRoZSBjb2RlcmV2aWV3IGFwcC4KLQotVXNhZ2Ugc3VtbWFyeTogdXBsb2FkLnB5IFtvcHRpb25zXSBbLS0gZGlmZl9vcHRpb25zXQotCi1EaWZmIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUgZGlmZiBjb21tYW5kIG9mIHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4KLQotU3VwcG9ydGVkIHZlcnNpb24gY29udHJvbCBzeXN0ZW1zOgotICBHaXQKLSAgTWVyY3VyaWFsCi0gIFN1YnZlcnNpb24KLQotSXQgaXMgaW1wb3J0YW50IGZvciBHaXQvTWVyY3VyaWFsIHVzZXJzIHRvIHNwZWNpZnkgYSB0cmVlL25vZGUvYnJhbmNoIHRvIGRpZmYKLWFnYWluc3QgYnkgdXNpbmcgdGhlICctLXJldicgb3B0aW9uLgotIiIiCi0jIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gYXBwY2ZnLnB5IGluIHRoZSBBcHAgRW5naW5lIFNESyAob3BlbiBzb3VyY2UpLAotIyBhbmQgZnJvbSBBU1BOIHJlY2lwZSAjMTQ2MzA2LgotCi1pbXBvcnQgY29va2llbGliCi1pbXBvcnQgZ2V0cGFzcwotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBtZDUKLWltcG9ydCBtaW1ldHlwZXMKLWltcG9ydCBvcHRwYXJzZQotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi1pbXBvcnQgdXJsbGliCi1pbXBvcnQgdXJsbGliMgotaW1wb3J0IHVybHBhcnNlCi0KLXRyeToKLSAgaW1wb3J0IHJlYWRsaW5lCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gIHBhc3MKLQotIyBUaGUgbG9nZ2luZyB2ZXJib3NpdHk6Ci0jICAwOiBFcnJvcnMgb25seS4KLSMgIDE6IFN0YXR1cyBtZXNzYWdlcy4KLSMgIDI6IEluZm8gbG9ncy4KLSMgIDM6IERlYnVnIGxvZ3MuCi12ZXJib3NpdHkgPSAxCi0KLSMgTWF4IHNpemUgb2YgcGF0Y2ggb3IgYmFzZSBmaWxlLgotTUFYX1VQTE9BRF9TSVpFID0gOTAwICogMTAyNAotCi0KLWRlZiBHZXRFbWFpbChwcm9tcHQpOgotICAiIiJQcm9tcHRzIHRoZSB1c2VyIGZvciB0aGVpciBlbWFpbCBhZGRyZXNzIGFuZCByZXR1cm5zIGl0LgotCi0gIFRoZSBsYXN0IHVzZWQgZW1haWwgYWRkcmVzcyBpcyBzYXZlZCB0byBhIGZpbGUgYW5kIG9mZmVyZWQgdXAgYXMgYSBzdWdnZXN0aW9uCi0gIHRvIHRoZSB1c2VyLiBJZiB0aGUgdXNlciBwcmVzc2VzIGVudGVyIHdpdGhvdXQgdHlwaW5nIGluIGFueXRoaW5nIHRoZSBsYXN0Ci0gIHVzZWQgZW1haWwgYWRkcmVzcyBpcyB1c2VkLiBJZiB0aGUgdXNlciBlbnRlcnMgYSBuZXcgYWRkcmVzcywgaXQgaXMgc2F2ZWQKLSAgZm9yIG5leHQgdGltZSB3ZSBwcm9tcHQuCi0KLSAgIiIiCi0gIGxhc3RfZW1haWxfZmlsZV9uYW1lID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sYXN0X2NvZGVyZXZpZXdfZW1haWxfYWRkcmVzcyIpCi0gIGxhc3RfZW1haWwgPSAiIgotICBpZiBvcy5wYXRoLmV4aXN0cyhsYXN0X2VtYWlsX2ZpbGVfbmFtZSk6Ci0gICAgdHJ5OgotICAgICAgbGFzdF9lbWFpbF9maWxlID0gb3BlbihsYXN0X2VtYWlsX2ZpbGVfbmFtZSwgInIiKQotICAgICAgbGFzdF9lbWFpbCA9IGxhc3RfZW1haWxfZmlsZS5yZWFkbGluZSgpLnN0cmlwKCJcbiIpCi0gICAgICBsYXN0X2VtYWlsX2ZpbGUuY2xvc2UoKQotICAgICAgcHJvbXB0ICs9ICIgWyVzXSIgJSBsYXN0X2VtYWlsCi0gICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICBwYXNzCi0gIGVtYWlsID0gcmF3X2lucHV0KHByb21wdCArICI6ICIpLnN0cmlwKCkKLSAgaWYgZW1haWw6Ci0gICAgdHJ5OgotICAgICAgbGFzdF9lbWFpbF9maWxlID0gb3BlbihsYXN0X2VtYWlsX2ZpbGVfbmFtZSwgInciKQotICAgICAgbGFzdF9lbWFpbF9maWxlLndyaXRlKGVtYWlsKQotICAgICAgbGFzdF9lbWFpbF9maWxlLmNsb3NlKCkKLSAgICBleGNlcHQgSU9FcnJvciwgZToKLSAgICAgIHBhc3MKLSAgZWxzZToKLSAgICBlbWFpbCA9IGxhc3RfZW1haWwKLSAgcmV0dXJuIGVtYWlsCi0KLQotZGVmIFN0YXR1c1VwZGF0ZShtc2cpOgotICAiIiJQcmludCBhIHN0YXR1cyBtZXNzYWdlIHRvIHN0ZG91dC4KLQotICBJZiAndmVyYm9zaXR5JyBpcyBncmVhdGVyIHRoYW4gMCwgcHJpbnQgdGhlIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICBtc2c6IFRoZSBzdHJpbmcgdG8gcHJpbnQuCi0gICIiIgotICBpZiB2ZXJib3NpdHkgPiAwOgotICAgIHByaW50IG1zZwotCi0KLWRlZiBFcnJvckV4aXQobXNnKToKLSAgIiIiUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB0byBzdGRlcnIgYW5kIGV4aXQuIiIiCi0gIHByaW50ID4+c3lzLnN0ZGVyciwgbXNnCi0gIHN5cy5leGl0KDEpCi0KLQotY2xhc3MgQ2xpZW50TG9naW5FcnJvcih1cmxsaWIyLkhUVFBFcnJvcik6Ci0gICIiIlJhaXNlZCB0byBpbmRpY2F0ZSB0aGVyZSB3YXMgYW4gZXJyb3IgYXV0aGVudGljYXRpbmcgd2l0aCBDbGllbnRMb2dpbi4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBjb2RlLCBtc2csIGhlYWRlcnMsIGFyZ3MpOgotICAgIHVybGxpYjIuSFRUUEVycm9yLl9faW5pdF9fKHNlbGYsIHVybCwgY29kZSwgbXNnLCBoZWFkZXJzLCBOb25lKQotICAgIHNlbGYuYXJncyA9IGFyZ3MKLSAgICBzZWxmLnJlYXNvbiA9IGFyZ3NbIkVycm9yIl0KLQotCi1jbGFzcyBBYnN0cmFjdFJwY1NlcnZlcihvYmplY3QpOgotICAiIiJQcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGEgc2ltcGxlIFJQQyBzZXJ2ZXIuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIGF1dGhfZnVuY3Rpb24sIGhvc3Rfb3ZlcnJpZGU9Tm9uZSwgZXh0cmFfaGVhZGVycz17fSwKLSAgICAgICAgICAgICAgIHNhdmVfY29va2llcz1GYWxzZSk6Ci0gICAgIiIiQ3JlYXRlcyBhIG5ldyBIdHRwUnBjU2VydmVyLgotCi0gICAgQXJnczoKLSAgICAgIGhvc3Q6IFRoZSBob3N0IHRvIHNlbmQgcmVxdWVzdHMgdG8uCi0gICAgICBhdXRoX2Z1bmN0aW9uOiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuCi0gICAgICAgIChlbWFpbCwgcGFzc3dvcmQpIHR1cGxlIHdoZW4gY2FsbGVkLiBXaWxsIGJlIGNhbGxlZCBpZiBhdXRoZW50aWNhdGlvbgotICAgICAgICBpcyByZXF1aXJlZC4KLSAgICAgIGhvc3Rfb3ZlcnJpZGU6IFRoZSBob3N0IGhlYWRlciB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIgKGRlZmF1bHRzIHRvIGhvc3QpLgotICAgICAgZXh0cmFfaGVhZGVyczogQSBkaWN0IG9mIGV4dHJhIGhlYWRlcnMgdG8gYXBwZW5kIHRvIGV2ZXJ5IHJlcXVlc3QuCi0gICAgICBzYXZlX2Nvb2tpZXM6IElmIFRydWUsIHNhdmUgdGhlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gbG9jYWwgZGlzay4KLSAgICAgICAgSWYgRmFsc2UsIHVzZSBhbiBpbi1tZW1vcnkgY29va2llamFyIGluc3RlYWQuICBTdWJjbGFzc2VzIG11c3QKLSAgICAgICAgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eS4gIERlZmF1bHRzIHRvIEZhbHNlLgotICAgICIiIgotICAgIHNlbGYuaG9zdCA9IGhvc3QKLSAgICBzZWxmLmhvc3Rfb3ZlcnJpZGUgPSBob3N0X292ZXJyaWRlCi0gICAgc2VsZi5hdXRoX2Z1bmN0aW9uID0gYXV0aF9mdW5jdGlvbgotICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IEZhbHNlCi0gICAgc2VsZi5leHRyYV9oZWFkZXJzID0gZXh0cmFfaGVhZGVycwotICAgIHNlbGYuc2F2ZV9jb29raWVzID0gc2F2ZV9jb29raWVzCi0gICAgc2VsZi5vcGVuZXIgPSBzZWxmLl9HZXRPcGVuZXIoKQotICAgIGlmIHNlbGYuaG9zdF9vdmVycmlkZToKLSAgICAgIGxvZ2dpbmcuaW5mbygiU2VydmVyOiAlczsgSG9zdDogJXMiLCBzZWxmLmhvc3QsIHNlbGYuaG9zdF9vdmVycmlkZSkKLSAgICBlbHNlOgotICAgICAgbG9nZ2luZy5pbmZvKCJTZXJ2ZXI6ICVzIiwgc2VsZi5ob3N0KQotCi0gIGRlZiBfR2V0T3BlbmVyKHNlbGYpOgotICAgICIiIlJldHVybnMgYW4gT3BlbmVyRGlyZWN0b3IgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgdXJsbGliMi5PcGVuZXJEaXJlY3RvciBvYmplY3QuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCi0KLSAgZGVmIF9DcmVhdGVSZXF1ZXN0KHNlbGYsIHVybCwgZGF0YT1Ob25lKToKLSAgICAiIiJDcmVhdGVzIGEgbmV3IHVybGxpYiByZXF1ZXN0LiIiIgotICAgIGxvZ2dpbmcuZGVidWcoIkNyZWF0aW5nIHJlcXVlc3QgZm9yOiAnJXMnIHdpdGggcGF5bG9hZDpcbiVzIiwgdXJsLCBkYXRhKQotICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmwsIGRhdGE9ZGF0YSkKLSAgICBpZiBzZWxmLmhvc3Rfb3ZlcnJpZGU6Ci0gICAgICByZXEuYWRkX2hlYWRlcigiSG9zdCIsIHNlbGYuaG9zdF9vdmVycmlkZSkKLSAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLmV4dHJhX2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICByZXEuYWRkX2hlYWRlcihrZXksIHZhbHVlKQotICAgIHJldHVybiByZXEKLQotICBkZWYgX0dldEF1dGhUb2tlbihzZWxmLCBlbWFpbCwgcGFzc3dvcmQpOgotICAgICIiIlVzZXMgQ2xpZW50TG9naW4gdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCByZXR1cm5pbmcgYW4gYXV0aCB0b2tlbi4KLQotICAgIEFyZ3M6Ci0gICAgICBlbWFpbDogICAgVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzCi0gICAgICBwYXNzd29yZDogVGhlIHVzZXIncyBwYXNzd29yZAotCi0gICAgUmFpc2VzOgotICAgICAgQ2xpZW50TG9naW5FcnJvcjogSWYgdGhlcmUgd2FzIGFuIGVycm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggQ2xpZW50TG9naW4uCi0gICAgICBIVFRQRXJyb3I6IElmIHRoZXJlIHdhcyBzb21lIG90aGVyIGZvcm0gb2YgSFRUUCBlcnJvci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gcmV0dXJuZWQgYnkgQ2xpZW50TG9naW4uCi0gICAgIiIiCi0gICAgYWNjb3VudF90eXBlID0gIkdPT0dMRSIKLSAgICBpZiBzZWxmLmhvc3QuZW5kc3dpdGgoIi5nb29nbGUuY29tIik6Ci0gICAgICAjIE5lZWRlZCBmb3IgdXNlIGluc2lkZSBHb29nbGUuCi0gICAgICBhY2NvdW50X3R5cGUgPSAiSE9TVEVEIgotICAgIHJlcSA9IHNlbGYuX0NyZWF0ZVJlcXVlc3QoCi0gICAgICAgIHVybD0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hY2NvdW50cy9DbGllbnRMb2dpbiIsCi0gICAgICAgIGRhdGE9dXJsbGliLnVybGVuY29kZSh7Ci0gICAgICAgICAgICAiRW1haWwiOiBlbWFpbCwKLSAgICAgICAgICAgICJQYXNzd2QiOiBwYXNzd29yZCwKLSAgICAgICAgICAgICJzZXJ2aWNlIjogImFoIiwKLSAgICAgICAgICAgICJzb3VyY2UiOiAicmlldHZlbGQtY29kZXJldmlldy11cGxvYWQiLAotICAgICAgICAgICAgImFjY291bnRUeXBlIjogYWNjb3VudF90eXBlLAotICAgICAgICB9KSwKLSAgICApCi0gICAgdHJ5OgotICAgICAgcmVzcG9uc2UgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKLSAgICAgIHJlc3BvbnNlX2JvZHkgPSByZXNwb25zZS5yZWFkKCkKLSAgICAgIHJlc3BvbnNlX2RpY3QgPSBkaWN0KHguc3BsaXQoIj0iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcmVzcG9uc2VfYm9keS5zcGxpdCgiXG4iKSBpZiB4KQotICAgICAgcmV0dXJuIHJlc3BvbnNlX2RpY3RbIkF1dGgiXQotICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKLSAgICAgIGlmIGUuY29kZSA9PSA0MDM6Ci0gICAgICAgIGJvZHkgPSBlLnJlYWQoKQotICAgICAgICByZXNwb25zZV9kaWN0ID0gZGljdCh4LnNwbGl0KCI9IiwgMSkgZm9yIHggaW4gYm9keS5zcGxpdCgiXG4iKSBpZiB4KQotICAgICAgICByYWlzZSBDbGllbnRMb2dpbkVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgZS5jb2RlLCBlLm1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhlYWRlcnMsIHJlc3BvbnNlX2RpY3QpCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZQotCi0gIGRlZiBfR2V0QXV0aENvb2tpZShzZWxmLCBhdXRoX3Rva2VuKToKLSAgICAiIiJGZXRjaGVzIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgZm9yIGFuIGF1dGhlbnRpY2F0aW9uIHRva2VuLgotCi0gICAgQXJnczoKLSAgICAgIGF1dGhfdG9rZW46IFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiByZXR1cm5lZCBieSBDbGllbnRMb2dpbi4KLQotICAgIFJhaXNlczoKLSAgICAgIEhUVFBFcnJvcjogSWYgdGhlcmUgd2FzIGFuIGVycm9yIGZldGNoaW5nIHRoZSBhdXRoZW50aWNhdGlvbiBjb29raWVzLgotICAgICIiIgotICAgICMgVGhpcyBpcyBhIGR1bW15IHZhbHVlIHRvIGFsbG93IHVzIHRvIGlkZW50aWZ5IHdoZW4gd2UncmUgc3VjY2Vzc2Z1bC4KLSAgICBjb250aW51ZV9sb2NhdGlvbiA9ICJodHRwOi8vbG9jYWxob3N0LyIKLSAgICBhcmdzID0geyJjb250aW51ZSI6IGNvbnRpbnVlX2xvY2F0aW9uLCAiYXV0aCI6IGF1dGhfdG9rZW59Ci0gICAgcmVxID0gc2VsZi5fQ3JlYXRlUmVxdWVzdCgiaHR0cDovLyVzL19haC9sb2dpbj8lcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgdXJsbGliLnVybGVuY29kZShhcmdzKSkpCi0gICAgdHJ5OgotICAgICAgcmVzcG9uc2UgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKLSAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6Ci0gICAgICByZXNwb25zZSA9IGUKLSAgICBpZiAocmVzcG9uc2UuY29kZSAhPSAzMDIgb3IKLSAgICAgICAgcmVzcG9uc2UuaW5mbygpWyJsb2NhdGlvbiJdICE9IGNvbnRpbnVlX2xvY2F0aW9uKToKLSAgICAgIHJhaXNlIHVybGxpYjIuSFRUUEVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgcmVzcG9uc2UuY29kZSwgcmVzcG9uc2UubXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2UuZnApCi0gICAgc2VsZi5hdXRoZW50aWNhdGVkID0gVHJ1ZQotCi0gIGRlZiBfQXV0aGVudGljYXRlKHNlbGYpOgotICAgICIiIkF1dGhlbnRpY2F0ZXMgdGhlIHVzZXIuCi0KLSAgICBUaGUgYXV0aGVudGljYXRpb24gcHJvY2VzcyB3b3JrcyBhcyBmb2xsb3dzOgotICAgICAxKSBXZSBnZXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZnJvbSB0aGUgdXNlcgotICAgICAyKSBXZSB1c2UgQ2xpZW50TG9naW4gdG8gb2J0YWluIGFuIEFVVEggdG9rZW4gZm9yIHRoZSB1c2VyCi0gICAgICAgIChzZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL2FjY291bnRzL0F1dGhGb3JJbnN0YWxsZWRBcHBzLmh0bWwpLgotICAgICAzKSBXZSBwYXNzIHRoZSBhdXRoIHRva2VuIHRvIC9fYWgvbG9naW4gb24gdGhlIHNlcnZlciB0byBvYnRhaW4gYW4KLSAgICAgICAgYXV0aGVudGljYXRpb24gY29va2llLiBJZiBsb2dpbiB3YXMgc3VjY2Vzc2Z1bCwgaXQgdHJpZXMgdG8gcmVkaXJlY3QKLSAgICAgICAgdXMgdG8gdGhlIFVSTCB3ZSBwcm92aWRlZC4KLQotICAgIElmIHdlIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSB1cGxvYWQgQVBJIHdpdGhvdXQgZmlyc3Qgb2J0YWluaW5nIGFuCi0gICAgYXV0aGVudGljYXRpb24gY29va2llLCBpdCByZXR1cm5zIGEgNDAxIHJlc3BvbnNlIGFuZCBkaXJlY3RzIHVzIHRvCi0gICAgYXV0aGVudGljYXRlIG91cnNlbHZlcyB3aXRoIENsaWVudExvZ2luLgotICAgICIiIgotICAgIGZvciBpIGluIHJhbmdlKDMpOgotICAgICAgY3JlZGVudGlhbHMgPSBzZWxmLmF1dGhfZnVuY3Rpb24oKQotICAgICAgdHJ5OgotICAgICAgICBhdXRoX3Rva2VuID0gc2VsZi5fR2V0QXV0aFRva2VuKGNyZWRlbnRpYWxzWzBdLCBjcmVkZW50aWFsc1sxXSkKLSAgICAgIGV4Y2VwdCBDbGllbnRMb2dpbkVycm9yLCBlOgotICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQmFkQXV0aGVudGljYXRpb24iOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuIgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIGUucmVhc29uID09ICJDYXB0Y2hhUmVxdWlyZWQiOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAotICAgICAgICAgICAgICAiUGxlYXNlIGdvIHRvXG4iCi0gICAgICAgICAgICAgICJodHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL0Rpc3BsYXlVbmxvY2tDYXB0Y2hhXG4iCi0gICAgICAgICAgICAgICJhbmQgdmVyaWZ5IHlvdSBhcmUgYSBodW1hbi4gIFRoZW4gdHJ5IGFnYWluLiIpCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIk5vdFZlcmlmaWVkIjoKLSAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJBY2NvdW50IG5vdCB2ZXJpZmllZC4iCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIlRlcm1zTm90QWdyZWVkIjoKLSAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJVc2VyIGhhcyBub3QgYWdyZWVkIHRvIFRPUy4iCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIkFjY291bnREZWxldGVkIjoKLSAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUaGUgdXNlciBhY2NvdW50IGhhcyBiZWVuIGRlbGV0ZWQuIgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGlmIGUucmVhc29uID09ICJBY2NvdW50RGlzYWJsZWQiOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlRoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGlzYWJsZWQuIgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGlmIGUucmVhc29uID09ICJTZXJ2aWNlRGlzYWJsZWQiOgotICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKCJUaGUgdXNlcidzIGFjY2VzcyB0byB0aGUgc2VydmljZSBoYXMgYmVlbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLiIpCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgZS5yZWFzb24gPT0gIlNlcnZpY2VVbmF2YWlsYWJsZSI6Ci0gICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVGhlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZTsgdHJ5IGFnYWluIGxhdGVyLiIKLSAgICAgICAgICBicmVhawotICAgICAgICByYWlzZQotICAgICAgc2VsZi5fR2V0QXV0aENvb2tpZShhdXRoX3Rva2VuKQotICAgICAgcmV0dXJuCi0KLSAgZGVmIFNlbmQoc2VsZiwgcmVxdWVzdF9wYXRoLCBwYXlsb2FkPU5vbmUsCi0gICAgICAgICAgIGNvbnRlbnRfdHlwZT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwKLSAgICAgICAgICAgdGltZW91dD1Ob25lLAotICAgICAgICAgICAqKmt3YXJncyk6Ci0gICAgIiIiU2VuZHMgYW4gUlBDIGFuZCByZXR1cm5zIHRoZSByZXNwb25zZS4KLQotICAgIEFyZ3M6Ci0gICAgICByZXF1ZXN0X3BhdGg6IFRoZSBwYXRoIHRvIHNlbmQgdGhlIHJlcXVlc3QgdG8sIGVnIC9hcGkvYXBwdmVyc2lvbi9jcmVhdGUuCi0gICAgICBwYXlsb2FkOiBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdCwgb3IgTm9uZSB0byBzZW5kIGFuIGVtcHR5IHJlcXVlc3QuCi0gICAgICBjb250ZW50X3R5cGU6IFRoZSBDb250ZW50LVR5cGUgaGVhZGVyIHRvIHVzZS4KLSAgICAgIHRpbWVvdXQ6IHRpbWVvdXQgaW4gc2Vjb25kczsgZGVmYXVsdCBOb25lIGkuZS4gbm8gdGltZW91dC4KLSAgICAgICAgKE5vdGU6IGZvciBsYXJnZSByZXF1ZXN0cyBvbiBPUyBYLCB0aGUgdGltZW91dCBkb2Vzbid0IHdvcmsgcmlnaHQuKQotICAgICAga3dhcmdzOiBBbnkga2V5d29yZCBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCBpbnRvIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSByZXNwb25zZSBib2R5LCBhcyBhIHN0cmluZy4KLSAgICAiIiIKLSAgICAjIFRPRE86IERvbid0IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBMZXQgdGhlIHNlcnZlciBzYXkKLSAgICAjIHdoZXRoZXIgaXQgaXMgbmVjZXNzYXJ5LgotICAgIGlmIG5vdCBzZWxmLmF1dGhlbnRpY2F0ZWQ6Ci0gICAgICBzZWxmLl9BdXRoZW50aWNhdGUoKQotCi0gICAgb2xkX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQotICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCh0aW1lb3V0KQotICAgIHRyeToKLSAgICAgIHRyaWVzID0gMAotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgdHJpZXMgKz0gMQotICAgICAgICBhcmdzID0gZGljdChrd2FyZ3MpCi0gICAgICAgIHVybCA9ICJodHRwOi8vJXMlcyIgJSAoc2VsZi5ob3N0LCByZXF1ZXN0X3BhdGgpCi0gICAgICAgIGlmIGFyZ3M6Ci0gICAgICAgICAgdXJsICs9ICI/IiArIHVybGxpYi51cmxlbmNvZGUoYXJncykKLSAgICAgICAgcmVxID0gc2VsZi5fQ3JlYXRlUmVxdWVzdCh1cmw9dXJsLCBkYXRhPXBheWxvYWQpCi0gICAgICAgIHJlcS5hZGRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCBjb250ZW50X3R5cGUpCi0gICAgICAgIHRyeToKLSAgICAgICAgICBmID0gc2VsZi5vcGVuZXIub3BlbihyZXEpCi0gICAgICAgICAgcmVzcG9uc2UgPSBmLnJlYWQoKQotICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgIHJldHVybiByZXNwb25zZQotICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6Ci0gICAgICAgICAgaWYgdHJpZXMgPiAzOgotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICBlbGlmIGUuY29kZSA9PSA0MDE6Ci0gICAgICAgICAgICBzZWxmLl9BdXRoZW50aWNhdGUoKQotIyMgICAgICAgICAgIGVsaWYgZS5jb2RlID49IDUwMCBhbmQgZS5jb2RlIDwgNjAwOgotIyMgICAgICAgICAgICAgIyBTZXJ2ZXIgRXJyb3IgLSB0cnkgYWdhaW4uCi0jIyAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZQotICAgIGZpbmFsbHk6Ci0gICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob2xkX3RpbWVvdXQpCi0KLQotY2xhc3MgSHR0cFJwY1NlcnZlcihBYnN0cmFjdFJwY1NlcnZlcik6Ci0gICIiIlByb3ZpZGVzIGEgc2ltcGxpZmllZCBSUEMtc3R5bGUgaW50ZXJmYWNlIGZvciBIVFRQIHJlcXVlc3RzLiIiIgotCi0gIGRlZiBfQXV0aGVudGljYXRlKHNlbGYpOgotICAgICIiIlNhdmUgdGhlIGNvb2tpZSBqYXIgYWZ0ZXIgYXV0aGVudGljYXRpb24uIiIiCi0gICAgc3VwZXIoSHR0cFJwY1NlcnZlciwgc2VsZikuX0F1dGhlbnRpY2F0ZSgpCi0gICAgaWYgc2VsZi5zYXZlX2Nvb2tpZXM6Ci0gICAgICBTdGF0dXNVcGRhdGUoIlNhdmluZyBhdXRoZW50aWNhdGlvbiBjb29raWVzIHRvICVzIiAlIHNlbGYuY29va2llX2ZpbGUpCi0gICAgICBzZWxmLmNvb2tpZV9qYXIuc2F2ZSgpCi0KLSAgZGVmIF9HZXRPcGVuZXIoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhbiBPcGVuZXJEaXJlY3RvciB0aGF0IHN1cHBvcnRzIGNvb2tpZXMgYW5kIGlnbm9yZXMgcmVkaXJlY3RzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgdXJsbGliMi5PcGVuZXJEaXJlY3RvciBvYmplY3QuCi0gICAgIiIiCi0gICAgb3BlbmVyID0gdXJsbGliMi5PcGVuZXJEaXJlY3RvcigpCi0gICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuUHJveHlIYW5kbGVyKCkpCi0gICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuVW5rbm93bkhhbmRsZXIoKSkKLSAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQSGFuZGxlcigpKQotICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyKCkpCi0gICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUFNIYW5kbGVyKCkpCi0gICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUEVycm9yUHJvY2Vzc29yKCkpCi0gICAgaWYgc2VsZi5zYXZlX2Nvb2tpZXM6Ci0gICAgICBzZWxmLmNvb2tpZV9maWxlID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5jb2RlcmV2aWV3X3VwbG9hZF9jb29raWVzIikKLSAgICAgIHNlbGYuY29va2llX2phciA9IGNvb2tpZWxpYi5Nb3ppbGxhQ29va2llSmFyKHNlbGYuY29va2llX2ZpbGUpCi0gICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmNvb2tpZV9maWxlKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgIHNlbGYuY29va2llX2phci5sb2FkKCkKLSAgICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCi0gICAgICAgICAgU3RhdHVzVXBkYXRlKCJMb2FkZWQgYXV0aGVudGljYXRpb24gY29va2llcyBmcm9tICVzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2llX2ZpbGUpCi0gICAgICAgIGV4Y2VwdCAoY29va2llbGliLkxvYWRFcnJvciwgSU9FcnJvcik6Ci0gICAgICAgICAgIyBGYWlsZWQgdG8gbG9hZCBjb29raWVzIC0ganVzdCBpZ25vcmUgdGhlbS4KLSAgICAgICAgICBwYXNzCi0gICAgICBlbHNlOgotICAgICAgICAjIENyZWF0ZSBhbiBlbXB0eSBjb29raWUgZmlsZSB3aXRoIG1vZGUgNjAwCi0gICAgICAgIGZkID0gb3Mub3BlbihzZWxmLmNvb2tpZV9maWxlLCBvcy5PX0NSRUFULCAwNjAwKQotICAgICAgICBvcy5jbG9zZShmZCkKLSAgICAgICMgQWx3YXlzIGNobW9kIHRoZSBjb29raWUgZmlsZQotICAgICAgb3MuY2htb2Qoc2VsZi5jb29raWVfZmlsZSwgMDYwMCkKLSAgICBlbHNlOgotICAgICAgIyBEb24ndCBzYXZlIGNvb2tpZXMgYWNyb3NzIHJ1bnMgb2YgdXBkYXRlLnB5LgotICAgICAgc2VsZi5jb29raWVfamFyID0gY29va2llbGliLkNvb2tpZUphcigpCi0gICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUENvb2tpZVByb2Nlc3NvcihzZWxmLmNvb2tpZV9qYXIpKQotICAgIHJldHVybiBvcGVuZXIKLQotCi1wYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9IiVwcm9nIFtvcHRpb25zXSBbLS0gZGlmZl9vcHRpb25zXSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLXkiLCAiLS1hc3N1bWVfeWVzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKLSAgICAgICAgICAgICAgICAgIGRlc3Q9ImFzc3VtZV95ZXMiLCBkZWZhdWx0PUZhbHNlLAotICAgICAgICAgICAgICAgICAgaGVscD0iQXNzdW1lIHRoYXQgdGhlIGFuc3dlciB0byB5ZXMvbm8gcXVlc3Rpb25zIGlzICd5ZXMnLiIpCi0jIExvZ2dpbmcKLWdyb3VwID0gcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoIkxvZ2dpbmcgb3B0aW9ucyIpCi1ncm91cC5hZGRfb3B0aW9uKCItcSIsICItLXF1aWV0IiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsIGNvbnN0PTAsCi0gICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBoZWxwPSJQcmludCBlcnJvcnMgb25seS4iKQotZ3JvdXAuYWRkX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsIGNvbnN0PTIsCi0gICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBkZWZhdWx0PTEsCi0gICAgICAgICAgICAgICAgIGhlbHA9IlByaW50IGluZm8gbGV2ZWwgbG9ncyAoZGVmYXVsdCkuIikKLWdyb3VwLmFkZF9vcHRpb24oIi0tbm9pc3kiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MywKLSAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGhlbHA9IlByaW50IGFsbCBsb2dzLiIpCi0jIFJldmlldyBzZXJ2ZXIKLWdyb3VwID0gcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoIlJldmlldyBzZXJ2ZXIgb3B0aW9ucyIpCi1ncm91cC5hZGRfb3B0aW9uKCItcyIsICItLXNlcnZlciIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJzZXJ2ZXIiLAotICAgICAgICAgICAgICAgICBkZWZhdWx0PSJjb2RlcmV2aWV3LmFwcHNwb3QuY29tIiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iU0VSVkVSIiwKLSAgICAgICAgICAgICAgICAgaGVscD0oIlRoZSBzZXJ2ZXIgdG8gdXBsb2FkIHRvLiBUaGUgZm9ybWF0IGlzIGhvc3RbOnBvcnRdLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0cyB0byAnY29kZXJldmlldy5hcHBzcG90LmNvbScuIikpCi1ncm91cC5hZGRfb3B0aW9uKCItZSIsICItLWVtYWlsIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9ImVtYWlsIiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iRU1BSUwiLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9IlRoZSB1c2VybmFtZSB0byB1c2UuIFdpbGwgcHJvbXB0IGlmIG9taXR0ZWQuIikKLWdyb3VwLmFkZF9vcHRpb24oIi1IIiwgIi0taG9zdCIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJob3N0IiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iSE9TVCIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iT3ZlcnJpZGVzIHRoZSBIb3N0IGhlYWRlciBzZW50IHdpdGggYWxsIFJQQ3MuIikKLWdyb3VwLmFkZF9vcHRpb24oIi0tbm9fY29va2llcyIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAotICAgICAgICAgICAgICAgICBkZXN0PSJzYXZlX2Nvb2tpZXMiLCBkZWZhdWx0PVRydWUsCi0gICAgICAgICAgICAgICAgIGhlbHA9IkRvIG5vdCBzYXZlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gbG9jYWwgZGlzay4iKQotIyBJc3N1ZQotZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiSXNzdWUgb3B0aW9ucyIpCi1ncm91cC5hZGRfb3B0aW9uKCItZCIsICItLWRlc2NyaXB0aW9uIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9ImRlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iREVTQ1JJUFRJT04iLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9Ik9wdGlvbmFsIGRlc2NyaXB0aW9uIHdoZW4gY3JlYXRpbmcgYW4gaXNzdWUuIikKLWdyb3VwLmFkZF9vcHRpb24oIi1mIiwgIi0tZGVzY3JpcHRpb25fZmlsZSIsIGFjdGlvbj0ic3RvcmUiLAotICAgICAgICAgICAgICAgICBkZXN0PSJkZXNjcmlwdGlvbl9maWxlIiwgbWV0YXZhcj0iREVTQ1JJUFRJT05fRklMRSIsCi0gICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgcGF0aCBvZiBhIGZpbGUgdGhhdCBjb250YWlucyAiCi0gICAgICAgICAgICAgICAgICAgICAgInRoZSBkZXNjcmlwdGlvbiB3aGVuIGNyZWF0aW5nIGFuIGlzc3VlLiIpCi1ncm91cC5hZGRfb3B0aW9uKCItciIsICItLXJldmlld2VycyIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJyZXZpZXdlcnMiLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJSRVZJRVdFUlMiLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9IkFkZCByZXZpZXdlcnMgKGNvbW1hIHNlcGFyYXRlZCBlbWFpbCBhZGRyZXNzZXMpLiIpCi1ncm91cC5hZGRfb3B0aW9uKCItLWNjIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9ImNjIiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQ0MiLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9IkFkZCBDQyAoY29tbWEgc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcykuIikKLSMgVXBsb2FkIG9wdGlvbnMKLWdyb3VwID0gcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoIlBhdGNoIG9wdGlvbnMiKQotZ3JvdXAuYWRkX29wdGlvbigiLW0iLCAiLS1tZXNzYWdlIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9Im1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICBtZXRhdmFyPSJNRVNTQUdFIiwgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgICBoZWxwPSJBIG1lc3NhZ2UgdG8gaWRlbnRpZnkgdGhlIHBhdGNoLiAiCi0gICAgICAgICAgICAgICAgICAgICAgIldpbGwgcHJvbXB0IGlmIG9taXR0ZWQuIikKLWdyb3VwLmFkZF9vcHRpb24oIi1pIiwgIi0taXNzdWUiLCB0eXBlPSJpbnQiLCBhY3Rpb249InN0b3JlIiwKLSAgICAgICAgICAgICAgICAgbWV0YXZhcj0iSVNTVUUiLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9Iklzc3VlIG51bWJlciB0byB3aGljaCB0byBhZGQuIERlZmF1bHRzIHRvIG5ldyBpc3N1ZS4iKQotZ3JvdXAuYWRkX29wdGlvbigiLS1kb3dubG9hZF9iYXNlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKLSAgICAgICAgICAgICAgICAgZGVzdD0iZG93bmxvYWRfYmFzZSIsIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgICAgICAgICAgIGhlbHA9IkJhc2UgZmlsZXMgd2lsbCBiZSBkb3dubG9hZGVkIGJ5IHRoZSBzZXJ2ZXIgIgotICAgICAgICAgICAgICAgICAiKHNpZGUtYnktc2lkZSBkaWZmcyBtYXkgbm90IHdvcmsgb24gZmlsZXMgd2l0aCBDUnMpLiIpCi1ncm91cC5hZGRfb3B0aW9uKCItLXJldiIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJyZXZpc2lvbiIsCi0gICAgICAgICAgICAgICAgIG1ldGF2YXI9IlJFViIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgaGVscD0iQnJhbmNoL3RyZWUvcmV2aXNpb24gdG8gZGlmZiBhZ2FpbnN0ICh1c2VkIGJ5IERWQ1MpLiIpCi1ncm91cC5hZGRfb3B0aW9uKCItLXNlbmRfbWFpbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCi0gICAgICAgICAgICAgICAgIGRlc3Q9InNlbmRfbWFpbCIsIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgICAgICAgICAgIGhlbHA9IlNlbmQgbm90aWZpY2F0aW9uIGVtYWlsIHRvIHJldmlld2Vycy4iKQotCi0KLWRlZiBHZXRScGNTZXJ2ZXIob3B0aW9ucyk6Ci0gICIiIlJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYW4gQWJzdHJhY3RScGNTZXJ2ZXIuCi0KLSAgUmV0dXJuczoKLSAgICBBIG5ldyBBYnN0cmFjdFJwY1NlcnZlciwgb24gd2hpY2ggUlBDIGNhbGxzIGNhbiBiZSBtYWRlLgotICAiIiIKLQotICBycGNfc2VydmVyX2NsYXNzID0gSHR0cFJwY1NlcnZlcgotCi0gIGRlZiBHZXRVc2VyQ3JlZGVudGlhbHMoKToKLSAgICAiIiJQcm9tcHRzIHRoZSB1c2VyIGZvciBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4iIiIKLSAgICBlbWFpbCA9IG9wdGlvbnMuZW1haWwKLSAgICBpZiBlbWFpbCBpcyBOb25lOgotICAgICAgZW1haWwgPSBHZXRFbWFpbCgiRW1haWwgKGxvZ2luIGZvciB1cGxvYWRpbmcgdG8gJXMpIiAlIG9wdGlvbnMuc2VydmVyKQotICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCJQYXNzd29yZCBmb3IgJXM6ICIgJSBlbWFpbCkKLSAgICByZXR1cm4gKGVtYWlsLCBwYXNzd29yZCkKLQotICAjIElmIHRoaXMgaXMgdGhlIGRldl9hcHBzZXJ2ZXIsIHVzZSBmYWtlIGF1dGhlbnRpY2F0aW9uLgotICBob3N0ID0gKG9wdGlvbnMuaG9zdCBvciBvcHRpb25zLnNlcnZlcikubG93ZXIoKQotICBpZiBob3N0ID09ICJsb2NhbGhvc3QiIG9yIGhvc3Quc3RhcnRzd2l0aCgibG9jYWxob3N0OiIpOgotICAgIGVtYWlsID0gb3B0aW9ucy5lbWFpbAotICAgIGlmIGVtYWlsIGlzIE5vbmU6Ci0gICAgICBlbWFpbCA9ICJ0ZXN0QGV4YW1wbGUuY29tIgotICAgICAgbG9nZ2luZy5pbmZvKCJVc2luZyBkZWJ1ZyB1c2VyICVzLiAgT3ZlcnJpZGUgd2l0aCAtLWVtYWlsIiAlIGVtYWlsKQotICAgIHNlcnZlciA9IHJwY19zZXJ2ZXJfY2xhc3MoCi0gICAgICAgIG9wdGlvbnMuc2VydmVyLAotICAgICAgICBsYW1iZGE6IChlbWFpbCwgInBhc3N3b3JkIiksCi0gICAgICAgIGhvc3Rfb3ZlcnJpZGU9b3B0aW9ucy5ob3N0LAotICAgICAgICBleHRyYV9oZWFkZXJzPXsiQ29va2llIjoKLSAgICAgICAgICAgICAgICAgICAgICAgJ2Rldl9hcHBzZXJ2ZXJfbG9naW49IiVzOkZhbHNlIicgJSBlbWFpbH0sCi0gICAgICAgIHNhdmVfY29va2llcz1vcHRpb25zLnNhdmVfY29va2llcykKLSAgICAjIERvbid0IHRyeSB0byB0YWxrIHRvIENsaWVudExvZ2luLgotICAgIHNlcnZlci5hdXRoZW50aWNhdGVkID0gVHJ1ZQotICAgIHJldHVybiBzZXJ2ZXIKLQotICByZXR1cm4gcnBjX3NlcnZlcl9jbGFzcyhvcHRpb25zLnNlcnZlciwgR2V0VXNlckNyZWRlbnRpYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X292ZXJyaWRlPW9wdGlvbnMuaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV9jb29raWVzPW9wdGlvbnMuc2F2ZV9jb29raWVzKQotCi0KLWRlZiBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmaWVsZHMsIGZpbGVzKToKLSAgIiIiRW5jb2RlIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQvZm9ybS1kYXRhLgotCi0gIEFyZ3M6Ci0gICAgZmllbGRzOiBBIHNlcXVlbmNlIG9mIChuYW1lLCB2YWx1ZSkgZWxlbWVudHMgZm9yIHJlZ3VsYXIgZm9ybSBmaWVsZHMuCi0gICAgZmlsZXM6IEEgc2VxdWVuY2Ugb2YgKG5hbWUsIGZpbGVuYW1lLCB2YWx1ZSkgZWxlbWVudHMgZm9yIGRhdGEgdG8gYmUKLSAgICAgICAgICAgdXBsb2FkZWQgYXMgZmlsZXMuCi0gIFJldHVybnM6Ci0gICAgKGNvbnRlbnRfdHlwZSwgYm9keSkgcmVhZHkgZm9yIGh0dHBsaWIuSFRUUCBpbnN0YW5jZS4KLQotICBTb3VyY2U6Ci0gICAgaHR0cDovL2FzcG4uYWN0aXZlc3RhdGUuY29tL0FTUE4vQ29va2Jvb2svUHl0aG9uL1JlY2lwZS8xNDYzMDYKLSAgIiIiCi0gIEJPVU5EQVJZID0gJy1NLUEtRy1JLUMtLS1CLU8tVS1OLUQtQS1SLVktJwotICBDUkxGID0gJ1xyXG4nCi0gIGxpbmVzID0gW10KLSAgZm9yIChrZXksIHZhbHVlKSBpbiBmaWVsZHM6Ci0gICAgbGluZXMuYXBwZW5kKCctLScgKyBCT1VOREFSWSkKLSAgICBsaW5lcy5hcHBlbmQoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlIGtleSkKLSAgICBsaW5lcy5hcHBlbmQoJycpCi0gICAgbGluZXMuYXBwZW5kKHZhbHVlKQotICBmb3IgKGtleSwgZmlsZW5hbWUsIHZhbHVlKSBpbiBmaWxlczoKLSAgICBsaW5lcy5hcHBlbmQoJy0tJyArIEJPVU5EQVJZKQotICAgIGxpbmVzLmFwcGVuZCgnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyI7IGZpbGVuYW1lPSIlcyInICUKLSAgICAgICAgICAgICAoa2V5LCBmaWxlbmFtZSkpCi0gICAgbGluZXMuYXBwZW5kKCdDb250ZW50LVR5cGU6ICVzJyAlIEdldENvbnRlbnRUeXBlKGZpbGVuYW1lKSkKLSAgICBsaW5lcy5hcHBlbmQoJycpCi0gICAgbGluZXMuYXBwZW5kKHZhbHVlKQotICBsaW5lcy5hcHBlbmQoJy0tJyArIEJPVU5EQVJZICsgJy0tJykKLSAgbGluZXMuYXBwZW5kKCcnKQotICBib2R5ID0gQ1JMRi5qb2luKGxpbmVzKQotICBjb250ZW50X3R5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgQk9VTkRBUlkKLSAgcmV0dXJuIGNvbnRlbnRfdHlwZSwgYm9keQotCi0KLWRlZiBHZXRDb250ZW50VHlwZShmaWxlbmFtZSk6Ci0gICIiIkhlbHBlciB0byBndWVzcyB0aGUgY29udGVudC10eXBlIGZyb20gdGhlIGZpbGVuYW1lLiIiIgotICByZXR1cm4gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZW5hbWUpWzBdIG9yICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nCi0KLQotIyBVc2UgYSBzaGVsbCBmb3Igc3ViY29tbWFuZHMgb24gV2luZG93cyB0byBnZXQgYSBQQVRIIHNlYXJjaC4KLXVzZV9zaGVsbCA9IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKQotCi1kZWYgUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjb21tYW5kLCBwcmludF9vdXRwdXQ9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSk6Ci0gICIiIkV4ZWN1dGVzIGEgY29tbWFuZCBhbmQgcmV0dXJucyB0aGUgb3V0cHV0IGZyb20gc3Rkb3V0IGFuZCB0aGUgcmV0dXJuIGNvZGUuCi0KLSAgQXJnczoKLSAgICBjb21tYW5kOiBDb21tYW5kIHRvIGV4ZWN1dGUuCi0gICAgcHJpbnRfb3V0cHV0OiBJZiBUcnVlLCB0aGUgb3V0cHV0IGlzIHByaW50ZWQgdG8gc3Rkb3V0LgotICAgICAgICAgICAgICAgICAgSWYgRmFsc2UsIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIGlnbm9yZWQuCi0gICAgdW5pdmVyc2FsX25ld2xpbmVzOiBVc2UgdW5pdmVyc2FsX25ld2xpbmVzIGZsYWcgKGRlZmF1bHQ6IFRydWUpLgotCi0gIFJldHVybnM6Ci0gICAgVHVwbGUgKG91dHB1dCwgcmV0dXJuIGNvZGUpCi0gICIiIgotICBsb2dnaW5nLmluZm8oIlJ1bm5pbmcgJXMiLCBjb21tYW5kKQotICBwID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgICAgICAgICAgICBzaGVsbD11c2Vfc2hlbGwsIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMpCi0gIGlmIHByaW50X291dHB1dDoKLSAgICBvdXRwdXRfYXJyYXkgPSBbXQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBsaW5lID0gcC5zdGRvdXQucmVhZGxpbmUoKQotICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgIGJyZWFrCi0gICAgICBwcmludCBsaW5lLnN0cmlwKCJcbiIpCi0gICAgICBvdXRwdXRfYXJyYXkuYXBwZW5kKGxpbmUpCi0gICAgb3V0cHV0ID0gIiIuam9pbihvdXRwdXRfYXJyYXkpCi0gIGVsc2U6Ci0gICAgb3V0cHV0ID0gcC5zdGRvdXQucmVhZCgpCi0gIHAud2FpdCgpCi0gIGVycm91dCA9IHAuc3RkZXJyLnJlYWQoKQotICBpZiBwcmludF9vdXRwdXQgYW5kIGVycm91dDoKLSAgICBwcmludCA+PnN5cy5zdGRlcnIsIGVycm91dAotICBwLnN0ZG91dC5jbG9zZSgpCi0gIHAuc3RkZXJyLmNsb3NlKCkKLSAgcmV0dXJuIG91dHB1dCwgcC5yZXR1cm5jb2RlCi0KLQotZGVmIFJ1blNoZWxsKGNvbW1hbmQsIHNpbGVudF9vaz1GYWxzZSwgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCi0gICAgICAgICAgICAgcHJpbnRfb3V0cHV0PUZhbHNlKToKLSAgZGF0YSwgcmV0Y29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY29tbWFuZCwgcHJpbnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXMpCi0gIGlmIHJldGNvZGU6Ci0gICAgRXJyb3JFeGl0KCJHb3QgZXJyb3Igc3RhdHVzIGZyb20gJXM6XG4lcyIgJSAoY29tbWFuZCwgZGF0YSkpCi0gIGlmIG5vdCBzaWxlbnRfb2sgYW5kIG5vdCBkYXRhOgotICAgIEVycm9yRXhpdCgiTm8gb3V0cHV0IGZyb20gJXMiICUgY29tbWFuZCkKLSAgcmV0dXJuIGRhdGEKLQotCi1jbGFzcyBWZXJzaW9uQ29udHJvbFN5c3RlbShvYmplY3QpOgotICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIHByb3ZpZGluZyBhbiBpbnRlcmZhY2UgdG8gdGhlIFZDUy4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6Ci0gICAgIiIiQ29uc3RydWN0b3IuCi0KLSAgICBBcmdzOgotICAgICAgb3B0aW9uczogQ29tbWFuZCBsaW5lIG9wdGlvbnMuCi0gICAgIiIiCi0gICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucwotCi0gIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgYXJncyk6Ci0gICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGRpZmYgYXMgYSBzdHJpbmcuCi0KLSAgICBBcmdzOgotICAgICAgYXJnczogRXh0cmEgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGRpZmYgY29tbWFuZC4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAotICAgICAgICAiYWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18pCi0KLSAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIHVua25vd24gdG8gdGhlIFZDUy4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAotICAgICAgICAiYWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18pCi0KLSAgZGVmIENoZWNrRm9yVW5rbm93bkZpbGVzKHNlbGYpOgotICAgICIiIlNob3cgYW4gImFyZSB5b3Ugc3VyZT8iIHByb21wdCBpZiB0aGVyZSBhcmUgdW5rbm93biBmaWxlcy4iIiIKLSAgICB1bmtub3duX2ZpbGVzID0gc2VsZi5HZXRVbmtub3duRmlsZXMoKQotICAgIGlmIHVua25vd25fZmlsZXM6Ci0gICAgICBwcmludCAiVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbm90IGFkZGVkIHRvIHZlcnNpb24gY29udHJvbDoiCi0gICAgICBmb3IgbGluZSBpbiB1bmtub3duX2ZpbGVzOgotICAgICAgICBwcmludCBsaW5lCi0gICAgICBwcm9tcHQgPSAiQXJlIHlvdSBzdXJlIHRvIGNvbnRpbnVlPyh5L04pICIKLSAgICAgIGFuc3dlciA9IHJhd19pbnB1dChwcm9tcHQpLnN0cmlwKCkKLSAgICAgIGlmIGFuc3dlciAhPSAieSI6Ci0gICAgICAgIEVycm9yRXhpdCgiVXNlciBhYm9ydGVkIikKLQotICBkZWYgR2V0QmFzZUZpbGUoc2VsZiwgZmlsZW5hbWUpOgotICAgICIiIkdldCB0aGUgY29udGVudCBvZiB0aGUgdXBzdHJlYW0gdmVyc2lvbiBvZiBhIGZpbGUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSB0dXBsZSAoYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMpCi0gICAgICAgIGJhc2VfY29udGVudDogVGhlIGNvbnRlbnRzIG9mIHRoZSBiYXNlIGZpbGUuCi0gICAgICAgIG5ld19jb250ZW50OiBGb3IgdGV4dCBmaWxlcywgdGhpcyBpcyBlbXB0eS4gIEZvciBiaW5hcnkgZmlsZXMsIHRoaXMgaXMKLSAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIG5ldyBmaWxlLCBzaW5jZSB0aGUgZGlmZiBvdXRwdXQgd29uJ3QgY29udGFpbgotICAgICAgICAgIGluZm9ybWF0aW9uIHRvIHJlY29uc3RydWN0IHRoZSBjdXJyZW50IGZpbGUuCi0gICAgICAgIGlzX2JpbmFyeTogVHJ1ZSBpZmYgdGhlIGZpbGUgaXMgYmluYXJ5LgotICAgICAgICBzdGF0dXM6IFRoZSBzdGF0dXMgb2YgdGhlIGZpbGUuCi0gICAgIiIiCi0KLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAotICAgICAgICAiYWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18pCi0KLQotICBkZWYgR2V0QmFzZUZpbGVzKHNlbGYsIGRpZmYpOgotICAgICIiIkhlbHBlciB0aGF0IGNhbGxzIEdldEJhc2UgZmlsZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBwYXRjaC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIGRpY3Rpb25hcnkgdGhhdCBtYXBzIGZyb20gZmlsZW5hbWUgdG8gR2V0QmFzZUZpbGUncyB0dXBsZS4gIEZpbGVuYW1lcwotICAgICAgYXJlIHJldHJpZXZlZCBiYXNlZCBvbiBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggIkluZGV4OiIgb3IKLSAgICAgICJQcm9wZXJ0eSBjaGFuZ2VzIG9uOiIuCi0gICAgIiIiCi0gICAgZmlsZXMgPSB7fQotICAgIGZvciBsaW5lIGluIGRpZmYuc3BsaXRsaW5lcyhUcnVlKToKLSAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnSW5kZXg6Jykgb3IgbGluZS5zdGFydHN3aXRoKCdQcm9wZXJ0eSBjaGFuZ2VzIG9uOicpOgotICAgICAgICB1bnVzZWQsIGZpbGVuYW1lID0gbGluZS5zcGxpdCgnOicsIDEpCi0gICAgICAgICMgT24gV2luZG93cyBpZiBhIGZpbGUgaGFzIHByb3BlcnR5IGNoYW5nZXMgaXRzIGZpbGVuYW1lIHVzZXMgJ1wnCi0gICAgICAgICMgaW5zdGVhZCBvZiAnLycuCi0gICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3RyaXAoKS5yZXBsYWNlKCdcXCcsICcvJykKLSAgICAgICAgZmlsZXNbZmlsZW5hbWVdID0gc2VsZi5HZXRCYXNlRmlsZShmaWxlbmFtZSkKLSAgICByZXR1cm4gZmlsZXMKLQotCi0gIGRlZiBVcGxvYWRCYXNlRmlsZXMoc2VsZiwgaXNzdWUsIHJwY19zZXJ2ZXIsIHBhdGNoX2xpc3QsIHBhdGNoc2V0LCBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgIGZpbGVzKToKLSAgICAiIiJVcGxvYWRzIHRoZSBiYXNlIGZpbGVzIChhbmQgaWYgbmVjZXNzYXJ5LCB0aGUgY3VycmVudCBvbmVzIGFzIHdlbGwpLiIiIgotCi0gICAgZGVmIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIGNvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzLCBpc19iYXNlKToKLSAgICAgICIiIlVwbG9hZHMgYSBmaWxlIHRvIHRoZSBzZXJ2ZXIuIiIiCi0gICAgICBmaWxlX3Rvb19sYXJnZSA9IEZhbHNlCi0gICAgICBpZiBpc19iYXNlOgotICAgICAgICB0eXBlID0gImJhc2UiCi0gICAgICBlbHNlOgotICAgICAgICB0eXBlID0gImN1cnJlbnQiCi0gICAgICBpZiBsZW4oY29udGVudCkgPiBNQVhfVVBMT0FEX1NJWkU6Ci0gICAgICAgIHByaW50ICgiTm90IHVwbG9hZGluZyB0aGUgJXMgZmlsZSBmb3IgJXMgYmVjYXVzZSBpdCdzIHRvbyBsYXJnZS4iICUKLSAgICAgICAgICAgICAgICh0eXBlLCBmaWxlbmFtZSkpCi0gICAgICAgIGZpbGVfdG9vX2xhcmdlID0gVHJ1ZQotICAgICAgICBjb250ZW50ID0gIiIKLSAgICAgIGNoZWNrc3VtID0gbWQ1Lm5ldyhjb250ZW50KS5oZXhkaWdlc3QoKQotICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMCBhbmQgbm90IGZpbGVfdG9vX2xhcmdlOgotICAgICAgICBwcmludCAiVXBsb2FkaW5nICVzIGZpbGUgZm9yICVzIiAlICh0eXBlLCBmaWxlbmFtZSkKLSAgICAgIHVybCA9ICIvJWQvdXBsb2FkX2NvbnRlbnQvJWQvJWQiICUgKGludChpc3N1ZSksIGludChwYXRjaHNldCksIGZpbGVfaWQpCi0gICAgICBmb3JtX2ZpZWxkcyA9IFsoImZpbGVuYW1lIiwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgKCJzdGF0dXMiLCBzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgKCJjaGVja3N1bSIsIGNoZWNrc3VtKSwKLSAgICAgICAgICAgICAgICAgICAgICgiaXNfYmluYXJ5Iiwgc3RyKGlzX2JpbmFyeSkpLAotICAgICAgICAgICAgICAgICAgICAgKCJpc19jdXJyZW50Iiwgc3RyKG5vdCBpc19iYXNlKSksCi0gICAgICAgICAgICAgICAgICAgIF0KLSAgICAgIGlmIGZpbGVfdG9vX2xhcmdlOgotICAgICAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJmaWxlX3Rvb19sYXJnZSIsICIxIikpCi0gICAgICBpZiBvcHRpb25zLmVtYWlsOgotICAgICAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJ1c2VyIiwgb3B0aW9ucy5lbWFpbCkpCi0gICAgICBjdHlwZSwgYm9keSA9IEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJkYXRhIiwgZmlsZW5hbWUsIGNvbnRlbnQpXSkKLSAgICAgIHJlc3BvbnNlX2JvZHkgPSBycGNfc2VydmVyLlNlbmQodXJsLCBib2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU9Y3R5cGUpCi0gICAgICBpZiBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJPSyIpOgotICAgICAgICBTdGF0dXNVcGRhdGUoIiAgLS0+ICVzIiAlIHJlc3BvbnNlX2JvZHkpCi0gICAgICAgIHN5cy5leGl0KDEpCi0KLSAgICBwYXRjaGVzID0gZGljdCgpCi0gICAgW3BhdGNoZXMuc2V0ZGVmYXVsdCh2LCBrKSBmb3IgaywgdiBpbiBwYXRjaF9saXN0XQotICAgIGZvciBmaWxlbmFtZSBpbiBwYXRjaGVzLmtleXMoKToKLSAgICAgIGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzID0gZmlsZXNbZmlsZW5hbWVdCi0gICAgICBmaWxlX2lkX3N0ciA9IHBhdGNoZXMuZ2V0KGZpbGVuYW1lKQotICAgICAgaWYgZmlsZV9pZF9zdHIuZmluZCgibm9iYXNlIikgIT0gLTE6Ci0gICAgICAgIGJhc2VfY29udGVudCA9IE5vbmUKLSAgICAgICAgZmlsZV9pZF9zdHIgPSBmaWxlX2lkX3N0cltmaWxlX2lkX3N0ci5yZmluZCgiXyIpICsgMTpdCi0gICAgICBmaWxlX2lkID0gaW50KGZpbGVfaWRfc3RyKQotICAgICAgaWYgYmFzZV9jb250ZW50ICE9IE5vbmU6Ci0gICAgICAgIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIGJhc2VfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIFRydWUpCi0gICAgICBpZiBuZXdfY29udGVudCAhPSBOb25lOgotICAgICAgICBVcGxvYWRGaWxlKGZpbGVuYW1lLCBmaWxlX2lkLCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIEZhbHNlKQotCi0gIGRlZiBJc0ltYWdlKHNlbGYsIGZpbGVuYW1lKToKLSAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGVuYW1lIGhhcyBhbiBpbWFnZSBleHRlbnNpb24uIiIiCi0gICAgbWltZXR5cGUgPSAgbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZW5hbWUpWzBdCi0gICAgaWYgbm90IG1pbWV0eXBlOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIG1pbWV0eXBlLnN0YXJ0c3dpdGgoImltYWdlLyIpCi0KLQotY2xhc3MgU3VidmVyc2lvblZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6Ci0gICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2UgZm9yIFN1YnZlcnNpb24uIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMpOgotICAgIHN1cGVyKFN1YnZlcnNpb25WQ1MsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMpCi0gICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgotICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIihcZCspKDooXGQrKSk/Iiwgc2VsZi5vcHRpb25zLnJldmlzaW9uKQotICAgICAgaWYgbm90IG1hdGNoOgotICAgICAgICBFcnJvckV4aXQoIkludmFsaWQgU3VidmVyc2lvbiByZXZpc2lvbiAlcy4iICUgc2VsZi5vcHRpb25zLnJldmlzaW9uKQotICAgICAgc2VsZi5yZXZfc3RhcnQgPSBtYXRjaC5ncm91cCgxKQotICAgICAgc2VsZi5yZXZfZW5kID0gbWF0Y2guZ3JvdXAoMykKLSAgICBlbHNlOgotICAgICAgc2VsZi5yZXZfc3RhcnQgPSBzZWxmLnJldl9lbmQgPSBOb25lCi0gICAgIyBDYWNoZSBvdXRwdXQgZnJvbSAic3ZuIGxpc3QgLXIgUkVWTk8gZGlybmFtZSIuCi0gICAgIyBLZXlzOiBkaXJuYW1lLCBWYWx1ZXM6IDItdHVwbGUgKG91cHV0IGZvciBzdGFydCByZXYgYW5kIGVuZCByZXYpLgotICAgIHNlbGYuc3ZubHNfY2FjaGUgPSB7fQotICAgICMgU1ZOIGJhc2UgVVJMIGlzIHJlcXVpcmVkIHRvIGZldGNoIGZpbGVzIGRlbGV0ZWQgaW4gYW4gb2xkZXIgcmV2aXNpb24uCi0gICAgIyBSZXN1bHQgaXMgY2FjaGVkIHRvIG5vdCBndWVzcyBpdCBvdmVyIGFuZCBvdmVyIGFnYWluIGluIEdldEJhc2VGaWxlKCkuCi0gICAgcmVxdWlyZWQgPSBzZWxmLm9wdGlvbnMuZG93bmxvYWRfYmFzZSBvciBzZWxmLm9wdGlvbnMucmV2aXNpb24gaXMgbm90IE5vbmUKLSAgICBzZWxmLnN2bl9iYXNlID0gc2VsZi5fR3Vlc3NCYXNlKHJlcXVpcmVkKQotCi0gIGRlZiBHdWVzc0Jhc2Uoc2VsZiwgcmVxdWlyZWQpOgotICAgICIiIldyYXBwZXIgZm9yIF9HdWVzc0Jhc2UuIiIiCi0gICAgcmV0dXJuIHNlbGYuc3ZuX2Jhc2UKLQotICBkZWYgX0d1ZXNzQmFzZShzZWxmLCByZXF1aXJlZCk6Ci0gICAgIiIiUmV0dXJucyB0aGUgU1ZOIGJhc2UgVVJMLgotCi0gICAgQXJnczoKLSAgICAgIHJlcXVpcmVkOiBJZiB0cnVlLCBleGl0cyBpZiB0aGUgdXJsIGNhbid0IGJlIGd1ZXNzZWQsIG90aGVyd2lzZSBOb25lIGlzCi0gICAgICAgIHJldHVybmVkLgotICAgICIiIgotICAgIGluZm8gPSBSdW5TaGVsbChbInN2biIsICJpbmZvIl0pCi0gICAgZm9yIGxpbmUgaW4gaW5mby5zcGxpdGxpbmVzKCk6Ci0gICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQotICAgICAgaWYgbGVuKHdvcmRzKSA9PSAyIGFuZCB3b3Jkc1swXSA9PSAiVVJMOiI6Ci0gICAgICAgIHVybCA9IHdvcmRzWzFdCi0gICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKLSAgICAgICAgdXNlcm5hbWUsIG5ldGxvYyA9IHVybGxpYi5zcGxpdHVzZXIobmV0bG9jKQotICAgICAgICBpZiB1c2VybmFtZToKLSAgICAgICAgICBsb2dnaW5nLmluZm8oIlJlbW92ZWQgdXNlcm5hbWUgZnJvbSBiYXNlIFVSTCIpCi0gICAgICAgIGlmIG5ldGxvYy5lbmRzd2l0aCgic3ZuLnB5dGhvbi5vcmciKToKLSAgICAgICAgICBpZiBuZXRsb2MgPT0gInN2bi5weXRob24ub3JnIjoKLSAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgiL3Byb2plY3RzLyIpOgotICAgICAgICAgICAgICBwYXRoID0gcGF0aFs5Ol0KLSAgICAgICAgICBlbGlmIG5ldGxvYyAhPSAicHl0aG9uZGV2QHN2bi5weXRob24ub3JnIjoKLSAgICAgICAgICAgIEVycm9yRXhpdCgiVW5yZWNvZ25pemVkIFB5dGhvbiBVUkw6ICVzIiAlIHVybCkKLSAgICAgICAgICBiYXNlID0gImh0dHA6Ly9zdm4ucHl0aG9uLm9yZy92aWV3LypjaGVja291dColcy8iICUgcGF0aAotICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBQeXRob24gYmFzZSA9ICVzIiwgYmFzZSkKLSAgICAgICAgZWxpZiBuZXRsb2MuZW5kc3dpdGgoInN2bi5jb2xsYWIubmV0Iik6Ci0gICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCIvcmVwb3MvIik6Ci0gICAgICAgICAgICBwYXRoID0gcGF0aFs2Ol0KLSAgICAgICAgICBiYXNlID0gImh0dHA6Ly9zdm4uY29sbGFiLm5ldC92aWV3dmMvKmNoZWNrb3V0KiVzLyIgJSBwYXRoCi0gICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIENvbGxhYk5ldCBiYXNlID0gJXMiLCBiYXNlKQotICAgICAgICBlbGlmIG5ldGxvYy5lbmRzd2l0aCgiLmdvb2dsZWNvZGUuY29tIik6Ci0gICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyIKLSAgICAgICAgICBiYXNlID0gdXJscGFyc2UudXJsdW5wYXJzZSgoImh0dHAiLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIGZyYWdtZW50KSkKLSAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgR29vZ2xlIENvZGUgYmFzZSA9ICVzIiwgYmFzZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBwYXRoID0gcGF0aCArICIvIgotICAgICAgICAgIGJhc2UgPSB1cmxwYXJzZS51cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQpKQotICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBiYXNlID0gJXMiLCBiYXNlKQotICAgICAgICByZXR1cm4gYmFzZQotICAgIGlmIHJlcXVpcmVkOgotICAgICAgRXJyb3JFeGl0KCJDYW4ndCBmaW5kIFVSTCBpbiBvdXRwdXQgZnJvbSBzdm4gaW5mbyIpCi0gICAgcmV0dXJuIE5vbmUKLQotICBkZWYgR2VuZXJhdGVEaWZmKHNlbGYsIGFyZ3MpOgotICAgIGNtZCA9IFsic3ZuIiwgImRpZmYiXQotICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKLSAgICAgIGNtZCArPSBbIi1yIiwgc2VsZi5vcHRpb25zLnJldmlzaW9uXQotICAgIGNtZC5leHRlbmQoYXJncykKLSAgICBkYXRhID0gUnVuU2hlbGwoY21kKQotICAgIGNvdW50ID0gMAotICAgIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpOgotICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJJbmRleDoiKSBvciBsaW5lLnN0YXJ0c3dpdGgoIlByb3BlcnR5IGNoYW5nZXMgb246Iik6Ci0gICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgbG9nZ2luZy5pbmZvKGxpbmUpCi0gICAgaWYgbm90IGNvdW50OgotICAgICAgRXJyb3JFeGl0KCJObyB2YWxpZCBwYXRjaGVzIGZvdW5kIGluIG91dHB1dCBmcm9tIHN2biBkaWZmIikKLSAgICByZXR1cm4gZGF0YQotCi0gIGRlZiBfQ29sbGFwc2VLZXl3b3JkcyhzZWxmLCBjb250ZW50LCBrZXl3b3JkX3N0cik6Ci0gICAgIiIiQ29sbGFwc2VzIFNWTiBrZXl3b3Jkcy4iIiIKLSAgICAjIHN2biBjYXQgdHJhbnNsYXRlcyBrZXl3b3JkcyBidXQgc3ZuIGRpZmYgZG9lc24ndC4gQXMgYSByZXN1bHQgb2YgdGhpcwotICAgICMgYmVoYXZpb3IgcGF0Y2hpbmcuUGF0Y2hDaHVua3MoKSBmYWlscyB3aXRoIGEgY2h1bmsgbWlzbWF0Y2ggZXJyb3IuCi0gICAgIyBUaGlzIHBhcnQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSB0aGUgUmV2aWV3IEJvYXJkIGRldmVsb3BtZW50IHRlYW0KLSAgICAjIHdobyBoYWQgdGhlIHNhbWUgcHJvYmxlbSAoaHR0cDovL3Jldmlld3MucmV2aWV3LWJvYXJkLm9yZy9yLzI3Ni8pLgotICAgICMgTWFwcGluZyBvZiBrZXl3b3JkcyB0byBrbm93biBhbGlhc2VzCi0gICAgc3ZuX2tleXdvcmRzID0gewotICAgICAgIyBTdGFuZGFyZCBrZXl3b3JkcwotICAgICAgJ0RhdGUnOiAgICAgICAgICAgICAgICBbJ0RhdGUnLCAnTGFzdENoYW5nZWREYXRlJ10sCi0gICAgICAnUmV2aXNpb24nOiAgICAgICAgICAgIFsnUmV2aXNpb24nLCAnTGFzdENoYW5nZWRSZXZpc2lvbicsICdSZXYnXSwKLSAgICAgICdBdXRob3InOiAgICAgICAgICAgICAgWydBdXRob3InLCAnTGFzdENoYW5nZWRCeSddLAotICAgICAgJ0hlYWRVUkwnOiAgICAgICAgICAgICBbJ0hlYWRVUkwnLCAnVVJMJ10sCi0gICAgICAnSWQnOiAgICAgICAgICAgICAgICAgIFsnSWQnXSwKLQotICAgICAgIyBBbGlhc2VzCi0gICAgICAnTGFzdENoYW5nZWREYXRlJzogICAgIFsnTGFzdENoYW5nZWREYXRlJywgJ0RhdGUnXSwKLSAgICAgICdMYXN0Q2hhbmdlZFJldmlzaW9uJzogWydMYXN0Q2hhbmdlZFJldmlzaW9uJywgJ1JldicsICdSZXZpc2lvbiddLAotICAgICAgJ0xhc3RDaGFuZ2VkQnknOiAgICAgICBbJ0xhc3RDaGFuZ2VkQnknLCAnQXV0aG9yJ10sCi0gICAgICAnVVJMJzogICAgICAgICAgICAgICAgIFsnVVJMJywgJ0hlYWRVUkwnXSwKLSAgICB9Ci0KLSAgICBkZWYgcmVwbChtKToKLSAgICAgICBpZiBtLmdyb3VwKDIpOgotICAgICAgICAgcmV0dXJuICIkJXM6OiVzJCIgJSAobS5ncm91cCgxKSwgIiAiICogbGVuKG0uZ3JvdXAoMykpKQotICAgICAgIHJldHVybiAiJCVzJCIgJSBtLmdyb3VwKDEpCi0gICAga2V5d29yZHMgPSBba2V5d29yZAotICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGtleXdvcmRfc3RyLnNwbGl0KCIgIikKLSAgICAgICAgICAgICAgICBmb3Iga2V5d29yZCBpbiBzdm5fa2V5d29yZHMuZ2V0KG5hbWUsIFtdKV0KLSAgICByZXR1cm4gcmUuc3ViKHIiXCQoJXMpOig6PykoW15cJF0rKVwkIiAlICd8Jy5qb2luKGtleXdvcmRzKSwgcmVwbCwgY29udGVudCkKLQotICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgotICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsic3ZuIiwgInN0YXR1cyIsICItLWlnbm9yZS1leHRlcm5hbHMiXSwgc2lsZW50X29rPVRydWUpCi0gICAgdW5rbm93bl9maWxlcyA9IFtdCi0gICAgZm9yIGxpbmUgaW4gc3RhdHVzLnNwbGl0KCJcbiIpOgotICAgICAgaWYgbGluZSBhbmQgbGluZVswXSA9PSAiPyI6Ci0gICAgICAgIHVua25vd25fZmlsZXMuYXBwZW5kKGxpbmUpCi0gICAgcmV0dXJuIHVua25vd25fZmlsZXMKLQotICBkZWYgUmVhZEZpbGUoc2VsZiwgZmlsZW5hbWUpOgotICAgICIiIlJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4iIiIKLSAgICBmaWxlID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKLSAgICByZXN1bHQgPSAiIgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IGZpbGUucmVhZCgpCi0gICAgZmluYWxseToKLSAgICAgIGZpbGUuY2xvc2UoKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgR2V0U3RhdHVzKHNlbGYsIGZpbGVuYW1lKToKLSAgICAiIiJSZXR1cm5zIHRoZSBzdGF0dXMgb2YgYSBmaWxlLiIiIgotICAgIGlmIG5vdCBzZWxmLm9wdGlvbnMucmV2aXNpb246Ci0gICAgICBzdGF0dXMgPSBSdW5TaGVsbChbInN2biIsICJzdGF0dXMiLCAiLS1pZ25vcmUtZXh0ZXJuYWxzIiwgZmlsZW5hbWVdKQotICAgICAgaWYgbm90IHN0YXR1czoKLSAgICAgICAgRXJyb3JFeGl0KCJzdm4gc3RhdHVzIHJldHVybmVkIG5vIG91dHB1dCBmb3IgJXMiICUgZmlsZW5hbWUpCi0gICAgICBzdGF0dXNfbGluZXMgPSBzdGF0dXMuc3BsaXRsaW5lcygpCi0gICAgICAjIElmIGZpbGUgaXMgaW4gYSBjbCwgdGhlIG91dHB1dCB3aWxsIGJlZ2luIHdpdGgKLSAgICAgICMgIlxuLS0tIENoYW5nZWxpc3QgJ2NsX25hbWUnOlxuIi4gIFNlZQotICAgICAgIyBodHRwOi8vc3ZuLmNvbGxhYi5uZXQvcmVwb3Mvc3ZuL3RydW5rL25vdGVzL2NoYW5nZWxpc3QtZGVzaWduLnR4dAotICAgICAgaWYgKGxlbihzdGF0dXNfbGluZXMpID09IDMgYW5kCi0gICAgICAgICAgbm90IHN0YXR1c19saW5lc1swXSBhbmQKLSAgICAgICAgICBzdGF0dXNfbGluZXNbMV0uc3RhcnRzd2l0aCgiLS0tIENoYW5nZWxpc3QiKSk6Ci0gICAgICAgIHN0YXR1cyA9IHN0YXR1c19saW5lc1syXQotICAgICAgZWxzZToKLSAgICAgICAgc3RhdHVzID0gc3RhdHVzX2xpbmVzWzBdCi0gICAgIyBJZiB3ZSBoYXZlIGEgcmV2aXNpb24gdG8gZGlmZiBhZ2FpbnN0IHdlIG5lZWQgdG8gcnVuICJzdm4gbGlzdCIKLSAgICAjIGZvciB0aGUgb2xkIGFuZCB0aGUgbmV3IHJldmlzaW9uIGFuZCBjb21wYXJlIHRoZSByZXN1bHRzIHRvIGdldAotICAgICMgdGhlIGNvcnJlY3Qgc3RhdHVzIGZvciBhIGZpbGUuCi0gICAgZWxzZToKLSAgICAgIGRpcm5hbWUsIHJlbGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKLSAgICAgIGlmIGRpcm5hbWUgbm90IGluIHNlbGYuc3ZubHNfY2FjaGU6Ci0gICAgICAgIGNtZCA9IFsic3ZuIiwgImxpc3QiLCAiLXIiLCBzZWxmLnJldl9zdGFydCwgZGlybmFtZSBvciAiLiJdCi0gICAgICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY21kKQotICAgICAgICBpZiByZXR1cm5jb2RlOgotICAgICAgICAgIEVycm9yRXhpdCgiRmFpbGVkIHRvIGdldCBzdGF0dXMgZm9yICVzLiIgJSBmaWxlbmFtZSkKLSAgICAgICAgb2xkX2ZpbGVzID0gb3V0LnNwbGl0bGluZXMoKQotICAgICAgICBhcmdzID0gWyJzdm4iLCAibGlzdCJdCi0gICAgICAgIGlmIHNlbGYucmV2X2VuZDoKLSAgICAgICAgICBhcmdzICs9IFsiLXIiLCBzZWxmLnJldl9lbmRdCi0gICAgICAgIGNtZCA9IGFyZ3MgKyBbZGlybmFtZSBvciAiLiJdCi0gICAgICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY21kKQotICAgICAgICBpZiByZXR1cm5jb2RlOgotICAgICAgICAgIEVycm9yRXhpdCgiRmFpbGVkIHRvIHJ1biBjb21tYW5kICVzIiAlIGNtZCkKLSAgICAgICAgc2VsZi5zdm5sc19jYWNoZVtkaXJuYW1lXSA9IChvbGRfZmlsZXMsIG91dC5zcGxpdGxpbmVzKCkpCi0gICAgICBvbGRfZmlsZXMsIG5ld19maWxlcyA9IHNlbGYuc3ZubHNfY2FjaGVbZGlybmFtZV0KLSAgICAgIGlmIHJlbGZpbGVuYW1lIGluIG9sZF9maWxlcyBhbmQgcmVsZmlsZW5hbWUgbm90IGluIG5ld19maWxlczoKLSAgICAgICAgc3RhdHVzID0gIkQgICAiCi0gICAgICBlbGlmIHJlbGZpbGVuYW1lIGluIG9sZF9maWxlcyBhbmQgcmVsZmlsZW5hbWUgaW4gbmV3X2ZpbGVzOgotICAgICAgICBzdGF0dXMgPSAiTSAgICIKLSAgICAgIGVsc2U6Ci0gICAgICAgIHN0YXR1cyA9ICJBICAgIgotICAgIHJldHVybiBzdGF0dXMKLQotICBkZWYgR2V0QmFzZUZpbGUoc2VsZiwgZmlsZW5hbWUpOgotICAgIHN0YXR1cyA9IHNlbGYuR2V0U3RhdHVzKGZpbGVuYW1lKQotICAgIGJhc2VfY29udGVudCA9IE5vbmUKLSAgICBuZXdfY29udGVudCA9IE5vbmUKLQotICAgICMgSWYgYSBmaWxlIGlzIGNvcGllZCBpdHMgc3RhdHVzIHdpbGwgYmUgIkEgICsiLCB3aGljaCBzaWduaWZpZXMKLSAgICAjICJhZGRpdGlvbi13aXRoLWhpc3RvcnkiLiAgU2VlICJzdm4gc3QiIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgV2UgbmVlZCB0bwotICAgICMgdXBsb2FkIHRoZSBvcmlnaW5hbCBmaWxlIG9yIGVsc2UgZGlmZiBwYXJzaW5nIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSB3YXMKLSAgICAjIGVkaXRlZC4KLSAgICBpZiBzdGF0dXNbMF0gPT0gIkEiIGFuZCBzdGF0dXNbM10gIT0gIisiOgotICAgICAgIyBXZSdsbCBuZWVkIHRvIHVwbG9hZCB0aGUgbmV3IGNvbnRlbnQgaWYgd2UncmUgYWRkaW5nIGEgYmluYXJ5IGZpbGUKLSAgICAgICMgc2luY2UgZGlmZidzIG91dHB1dCB3b24ndCBjb250YWluIGl0LgotICAgICAgbWltZXR5cGUgPSBSdW5TaGVsbChbInN2biIsICJwcm9wZ2V0IiwgInN2bjptaW1lLXR5cGUiLCBmaWxlbmFtZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudF9vaz1UcnVlKQotICAgICAgYmFzZV9jb250ZW50ID0gIiIKLSAgICAgIGlzX2JpbmFyeSA9IG1pbWV0eXBlIGFuZCBub3QgbWltZXR5cGUuc3RhcnRzd2l0aCgidGV4dC8iKQotICAgICAgaWYgaXNfYmluYXJ5IGFuZCBzZWxmLklzSW1hZ2UoZmlsZW5hbWUpOgotICAgICAgICBuZXdfY29udGVudCA9IHNlbGYuUmVhZEZpbGUoZmlsZW5hbWUpCi0gICAgZWxpZiAoc3RhdHVzWzBdIGluICgiTSIsICJEIiwgIlIiKSBvcgotICAgICAgICAgIChzdGF0dXNbMF0gPT0gIkEiIGFuZCBzdGF0dXNbM10gPT0gIisiKSBvciAgIyBDb3BpZWQgZmlsZS4KLSAgICAgICAgICAoc3RhdHVzWzBdID09ICIgIiBhbmQgc3RhdHVzWzFdID09ICJNIikpOiAgIyBQcm9wZXJ0eSBjaGFuZ2UuCi0gICAgICBhcmdzID0gW10KLSAgICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKLSAgICAgICAgdXJsID0gIiVzLyVzQCVzIiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfc3RhcnQpCi0gICAgICBlbHNlOgotICAgICAgICAjIERvbid0IGNoYW5nZSBmaWxlbmFtZSwgaXQncyBuZWVkZWQgbGF0ZXIuCi0gICAgICAgIHVybCA9IGZpbGVuYW1lCi0gICAgICAgIGFyZ3MgKz0gWyItciIsICJCQVNFIl0KLSAgICAgIGNtZCA9IFsic3ZuIl0gKyBhcmdzICsgWyJwcm9wZ2V0IiwgInN2bjptaW1lLXR5cGUiLCB1cmxdCi0gICAgICBtaW1ldHlwZSwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY21kKQotICAgICAgaWYgcmV0dXJuY29kZToKLSAgICAgICAgIyBGaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoZSByZXF1ZXN0ZWQgcmV2aXNpb24uCi0gICAgICAgICMgUmVzZXQgbWltZXR5cGUsIGl0IGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgIG1pbWV0eXBlID0gIiIKLSAgICAgIGdldF9iYXNlID0gRmFsc2UKLSAgICAgIGlzX2JpbmFyeSA9IG1pbWV0eXBlIGFuZCBub3QgbWltZXR5cGUuc3RhcnRzd2l0aCgidGV4dC8iKQotICAgICAgaWYgc3RhdHVzWzBdID09ICIgIjoKLSAgICAgICAgIyBFbXB0eSBiYXNlIGNvbnRlbnQganVzdCB0byBmb3JjZSBhbiB1cGxvYWQuCi0gICAgICAgIGJhc2VfY29udGVudCA9ICIiCi0gICAgICBlbGlmIGlzX2JpbmFyeToKLSAgICAgICAgaWYgc2VsZi5Jc0ltYWdlKGZpbGVuYW1lKToKLSAgICAgICAgICBnZXRfYmFzZSA9IFRydWUKLSAgICAgICAgICBpZiBzdGF0dXNbMF0gPT0gIk0iOgotICAgICAgICAgICAgaWYgbm90IHNlbGYucmV2X2VuZDoKLSAgICAgICAgICAgICAgbmV3X2NvbnRlbnQgPSBzZWxmLlJlYWRGaWxlKGZpbGVuYW1lKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgdXJsID0gIiVzLyVzQCVzIiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfZW5kKQotICAgICAgICAgICAgICBuZXdfY29udGVudCA9IFJ1blNoZWxsKFsic3ZuIiwgImNhdCIsIHVybF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsIHNpbGVudF9vaz1UcnVlKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGJhc2VfY29udGVudCA9ICIiCi0gICAgICBlbHNlOgotICAgICAgICBnZXRfYmFzZSA9IFRydWUKLQotICAgICAgaWYgZ2V0X2Jhc2U6Ci0gICAgICAgIGlmIGlzX2JpbmFyeToKLSAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXMgPSBGYWxzZQotICAgICAgICBlbHNlOgotICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcyA9IFRydWUKLSAgICAgICAgaWYgc2VsZi5yZXZfc3RhcnQ6Ci0gICAgICAgICAgIyAic3ZuIGNhdCAtciBSRVYgZGVsZXRlX2ZpbGUudHh0IiBkb2Vzbid0IHdvcmsuIGNhdCByZXF1aXJlcwotICAgICAgICAgICMgdGhlIGZ1bGwgVVJMIHdpdGggIkBSRVYiIGFwcGVuZGVkIGluc3RlYWQgb2YgdXNpbmcgIi1yIiBvcHRpb24uCi0gICAgICAgICAgdXJsID0gIiVzLyVzQCVzIiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfc3RhcnQpCi0gICAgICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgdXJsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudF9vaz1UcnVlKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsic3ZuIiwgImNhdCIsIGZpbGVuYW1lXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudF9vaz1UcnVlKQotICAgICAgICBpZiBub3QgaXNfYmluYXJ5OgotICAgICAgICAgIGFyZ3MgPSBbXQotICAgICAgICAgIGlmIHNlbGYucmV2X3N0YXJ0OgotICAgICAgICAgICAgdXJsID0gIiVzLyVzQCVzIiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfc3RhcnQpCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHVybCA9IGZpbGVuYW1lCi0gICAgICAgICAgICBhcmdzICs9IFsiLXIiLCAiQkFTRSJdCi0gICAgICAgICAgY21kID0gWyJzdm4iXSArIGFyZ3MgKyBbInByb3BnZXQiLCAic3ZuOmtleXdvcmRzIiwgdXJsXQotICAgICAgICAgIGtleXdvcmRzLCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCi0gICAgICAgICAgaWYga2V5d29yZHMgYW5kIG5vdCByZXR1cm5jb2RlOgotICAgICAgICAgICAgYmFzZV9jb250ZW50ID0gc2VsZi5fQ29sbGFwc2VLZXl3b3JkcyhiYXNlX2NvbnRlbnQsIGtleXdvcmRzKQotICAgIGVsc2U6Ci0gICAgICBTdGF0dXNVcGRhdGUoInN2biBzdGF0dXMgcmV0dXJuZWQgdW5leHBlY3RlZCBvdXRwdXQ6ICVzIiAlIHN0YXR1cykKLSAgICAgIHN5cy5leGl0KDEpCi0gICAgcmV0dXJuIGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzWzA6NV0KLQotCi1jbGFzcyBHaXRWQ1MoVmVyc2lvbkNvbnRyb2xTeXN0ZW0pOgotICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW50ZXJmYWNlIGZvciBHaXQuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMpOgotICAgIHN1cGVyKEdpdFZDUywgc2VsZikuX19pbml0X18ob3B0aW9ucykKLSAgICAjIE1hcCBvZiBmaWxlbmFtZSAtPiBoYXNoIG9mIGJhc2UgZmlsZS4KLSAgICBzZWxmLmJhc2VfaGFzaGVzID0ge30KLQotICBkZWYgR2VuZXJhdGVEaWZmKHNlbGYsIGV4dHJhX2FyZ3MpOgotICAgICMgVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gc3ZuJ3MgR2VuZXJhdGVEaWZmIGJlY2F1c2Ugd2UgbXVzdCBjb252ZXJ0Ci0gICAgIyB0aGUgZGlmZiBvdXRwdXQgdG8gaW5jbHVkZSBhbiBzdm4tc3R5bGUgIkluZGV4OiIgbGluZSBhcyB3ZWxsIGFzIHJlY29yZAotICAgICMgdGhlIGhhc2hlcyBvZiB0aGUgYmFzZSBmaWxlcywgc28gd2UgY2FuIHVwbG9hZCB0aGVtIGFsb25nIHdpdGggb3VyIGRpZmYuCi0gICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgotICAgICAgZXh0cmFfYXJncyA9IFtzZWxmLm9wdGlvbnMucmV2aXNpb25dICsgZXh0cmFfYXJncwotICAgIGdpdGRpZmYgPSBSdW5TaGVsbChbImdpdCIsICJkaWZmIiwgIi0tZnVsbC1pbmRleCJdICsgZXh0cmFfYXJncykKLSAgICBzdm5kaWZmID0gW10KLSAgICBmaWxlY291bnQgPSAwCi0gICAgZmlsZW5hbWUgPSBOb25lCi0gICAgZm9yIGxpbmUgaW4gZ2l0ZGlmZi5zcGxpdGxpbmVzKCk6Ci0gICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiZGlmZiAtLWdpdCBhLyguKikgYi8uKiQiLCBsaW5lKQotICAgICAgaWYgbWF0Y2g6Ci0gICAgICAgIGZpbGVjb3VudCArPSAxCi0gICAgICAgIGZpbGVuYW1lID0gbWF0Y2guZ3JvdXAoMSkKLSAgICAgICAgc3ZuZGlmZi5hcHBlbmQoIkluZGV4OiAlc1xuIiAlIGZpbGVuYW1lKQotICAgICAgZWxzZToKLSAgICAgICAgIyBUaGUgImluZGV4IiBsaW5lIGluIGEgZ2l0IGRpZmYgbG9va3MgbGlrZSB0aGlzIChsb25nIGhhc2hlcyBlbGlkZWQpOgotICAgICAgICAjICAgaW5kZXggODJjMGQ0NC4uYjJjZWUzZiAxMDA3NTUKLSAgICAgICAgIyBXZSB3YW50IHRvIHNhdmUgdGhlIGxlZnQgaGFzaCwgYXMgdGhhdCBpZGVudGlmaWVzIHRoZSBiYXNlIGZpbGUuCi0gICAgICAgIG1hdGNoID0gcmUubWF0Y2gociJpbmRleCAoXHcrKVwuXC4iLCBsaW5lKQotICAgICAgICBpZiBtYXRjaDoKLSAgICAgICAgICBzZWxmLmJhc2VfaGFzaGVzW2ZpbGVuYW1lXSA9IG1hdGNoLmdyb3VwKDEpCi0gICAgICBzdm5kaWZmLmFwcGVuZChsaW5lICsgIlxuIikKLSAgICBpZiBub3QgZmlsZWNvdW50OgotICAgICAgRXJyb3JFeGl0KCJObyB2YWxpZCBwYXRjaGVzIGZvdW5kIGluIG91dHB1dCBmcm9tIGdpdCBkaWZmIikKLSAgICByZXR1cm4gIiIuam9pbihzdm5kaWZmKQotCi0gIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6Ci0gICAgc3RhdHVzID0gUnVuU2hlbGwoWyJnaXQiLCAibHMtZmlsZXMiLCAiLS1leGNsdWRlLXN0YW5kYXJkIiwgIi0tb3RoZXJzIl0sCi0gICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCi0gICAgcmV0dXJuIHN0YXR1cy5zcGxpdGxpbmVzKCkKLQotICBkZWYgR2V0QmFzZUZpbGUoc2VsZiwgZmlsZW5hbWUpOgotICAgIGhhc2ggPSBzZWxmLmJhc2VfaGFzaGVzW2ZpbGVuYW1lXQotICAgIGJhc2VfY29udGVudCA9IE5vbmUKLSAgICBuZXdfY29udGVudCA9IE5vbmUKLSAgICBpc19iaW5hcnkgPSBGYWxzZQotICAgIGlmIGhhc2ggPT0gIjAiICogNDA6ICAjIEFsbC16ZXJvIGhhc2ggaW5kaWNhdGVzIG5vIGJhc2UgZmlsZS4KLSAgICAgIHN0YXR1cyA9ICJBIgotICAgICAgYmFzZV9jb250ZW50ID0gIiIKLSAgICBlbHNlOgotICAgICAgc3RhdHVzID0gIk0iCi0gICAgICBiYXNlX2NvbnRlbnQsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKFsiZ2l0IiwgInNob3ciLCBoYXNoXSkKLSAgICAgIGlmIHJldHVybmNvZGU6Ci0gICAgICAgIEVycm9yRXhpdCgiR290IGVycm9yIHN0YXR1cyBmcm9tICdnaXQgc2hvdyAlcyciICUgaGFzaCkKLSAgICByZXR1cm4gKGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzKQotCi0KLWNsYXNzIE1lcmN1cmlhbFZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6Ci0gICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2UgZm9yIE1lcmN1cmlhbC4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucywgcmVwb19kaXIpOgotICAgIHN1cGVyKE1lcmN1cmlhbFZDUywgc2VsZikuX19pbml0X18ob3B0aW9ucykKLSAgICAjIEFic29sdXRlIHBhdGggdG8gcmVwb3NpdG9yeSAod2UgY2FuIGJlIGluIGEgc3ViZGlyKQotICAgIHNlbGYucmVwb19kaXIgPSBvcy5wYXRoLm5vcm1wYXRoKHJlcG9fZGlyKQotICAgICMgQ29tcHV0ZSB0aGUgc3ViZGlyCi0gICAgY3dkID0gb3MucGF0aC5ub3JtcGF0aChvcy5nZXRjd2QoKSkKLSAgICBhc3NlcnQgY3dkLnN0YXJ0c3dpdGgoc2VsZi5yZXBvX2RpcikKLSAgICBzZWxmLnN1YmRpciA9IGN3ZFtsZW4oc2VsZi5yZXBvX2Rpcik6XS5sc3RyaXAociJcLyIpCi0gICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgotICAgICAgc2VsZi5iYXNlX3JldiA9IHNlbGYub3B0aW9ucy5yZXZpc2lvbgotICAgIGVsc2U6Ci0gICAgICBzZWxmLmJhc2VfcmV2ID0gUnVuU2hlbGwoWyJoZyIsICJwYXJlbnQiLCAiLXEiXSkuc3BsaXQoJzonKVsxXS5zdHJpcCgpCi0KLSAgZGVmIF9HZXRSZWxQYXRoKHNlbGYsIGZpbGVuYW1lKToKLSAgICAiIiJHZXQgcmVsYXRpdmUgcGF0aCBvZiBhIGZpbGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKLSAgICBnaXZlbiBpdHMgbG9naWNhbCBwYXRoIGluIHRoZSByZXBvLiIiIgotICAgIGFzc2VydCBmaWxlbmFtZS5zdGFydHN3aXRoKHNlbGYuc3ViZGlyKSwgZmlsZW5hbWUKLSAgICByZXR1cm4gZmlsZW5hbWVbbGVuKHNlbGYuc3ViZGlyKTpdLmxzdHJpcChyIlwvIikKLQotICBkZWYgR2VuZXJhdGVEaWZmKHNlbGYsIGV4dHJhX2FyZ3MpOgotICAgICMgSWYgbm8gZmlsZSBzcGVjaWZpZWQsIHJlc3RyaWN0IHRvIHRoZSBjdXJyZW50IHN1YmRpcgotICAgIGV4dHJhX2FyZ3MgPSBleHRyYV9hcmdzIG9yIFsiLiJdCi0gICAgY21kID0gWyJoZyIsICJkaWZmIiwgIi0tZ2l0IiwgIi1yIiwgc2VsZi5iYXNlX3Jldl0gKyBleHRyYV9hcmdzCi0gICAgZGF0YSA9IFJ1blNoZWxsKGNtZCwgc2lsZW50X29rPVRydWUpCi0gICAgc3ZuZGlmZiA9IFtdCi0gICAgZmlsZWNvdW50ID0gMAotICAgIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpOgotICAgICAgbSA9IHJlLm1hdGNoKCJkaWZmIC0tZ2l0IGEvKFxTKykgYi8oXFMrKSIsIGxpbmUpCi0gICAgICBpZiBtOgotICAgICAgICAjIE1vZGlmeSBsaW5lIHRvIG1ha2UgaXQgbG9vayBsaWtlIGFzIGl0IGNvbWVzIGZyb20gc3ZuIGRpZmYuCi0gICAgICAgICMgV2l0aCB0aGlzIG1vZGlmaWNhdGlvbiBubyBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBhcmUgcmVxdWlyZWQKLSAgICAgICAgIyB0byBtYWtlIHVwbG9hZC5weSB3b3JrIHdpdGggTWVyY3VyaWFsIHJlcG9zLgotICAgICAgICAjIE5PVEU6IGZvciBwcm9wZXIgaGFuZGxpbmcgb2YgbW92ZWQvY29waWVkIGZpbGVzLCB3ZSBoYXZlIHRvIHVzZQotICAgICAgICAjIHRoZSBzZWNvbmQgZmlsZW5hbWUuCi0gICAgICAgIGZpbGVuYW1lID0gbS5ncm91cCgyKQotICAgICAgICBzdm5kaWZmLmFwcGVuZCgiSW5kZXg6ICVzIiAlIGZpbGVuYW1lKQotICAgICAgICBzdm5kaWZmLmFwcGVuZCgiPSIgKiA2NykKLSAgICAgICAgZmlsZWNvdW50ICs9IDEKLSAgICAgICAgbG9nZ2luZy5pbmZvKGxpbmUpCi0gICAgICBlbHNlOgotICAgICAgICBzdm5kaWZmLmFwcGVuZChsaW5lKQotICAgIGlmIG5vdCBmaWxlY291bnQ6Ci0gICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gaGcgZGlmZiIpCi0gICAgcmV0dXJuICJcbiIuam9pbihzdm5kaWZmKSArICJcbiIKLQotICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgotICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdW5rbm93biB0byB0aGUgVkNTLiIiIgotICAgIGFyZ3MgPSBbXQotICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsiaGciLCAic3RhdHVzIiwgIi0tcmV2Iiwgc2VsZi5iYXNlX3JldiwgIi11IiwgIi4iXSwKLSAgICAgICAgc2lsZW50X29rPVRydWUpCi0gICAgdW5rbm93bl9maWxlcyA9IFtdCi0gICAgZm9yIGxpbmUgaW4gc3RhdHVzLnNwbGl0bGluZXMoKToKLSAgICAgIHN0LCBmbiA9IGxpbmUuc3BsaXQoIiAiLCAxKQotICAgICAgaWYgc3QgPT0gIj8iOgotICAgICAgICB1bmtub3duX2ZpbGVzLmFwcGVuZChmbikKLSAgICByZXR1cm4gdW5rbm93bl9maWxlcwotCi0gIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAgIyAiaGcgc3RhdHVzIiBhbmQgImhnIGNhdCIgYm90aCB0YWtlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzdWJkaXIKLSAgICAjIHJhdGhlciB0aGFuIHRvIHRoZSByZXBvIHJvb3QsIGJ1dCAiaGcgZGlmZiIgaGFzIGdpdmVuIHVzIHRoZSBmdWxsIHBhdGgKLSAgICAjIHRvIHRoZSByZXBvIHJvb3QuCi0gICAgYmFzZV9jb250ZW50ID0gIiIKLSAgICBuZXdfY29udGVudCA9IE5vbmUKLSAgICBpc19iaW5hcnkgPSBGYWxzZQotICAgIG9sZHJlbHBhdGggPSByZWxwYXRoID0gc2VsZi5fR2V0UmVsUGF0aChmaWxlbmFtZSkKLSAgICAjICJoZyBzdGF0dXMgLUMiIHJldHVybnMgdHdvIGxpbmVzIGZvciBtb3ZlZC9jb3BpZWQgZmlsZXMsIG9uZSBvdGhlcndpc2UKLSAgICBvdXQgPSBSdW5TaGVsbChbImhnIiwgInN0YXR1cyIsICItQyIsICItLXJldiIsIHNlbGYuYmFzZV9yZXYsIHJlbHBhdGhdKQotICAgIG91dCA9IG91dC5zcGxpdGxpbmVzKCkKLSAgICAjIEhBQ0s6IHN0cmlwIGVycm9yIG1lc3NhZ2UgYWJvdXQgbWlzc2luZyBmaWxlL2RpcmVjdG9yeSBpZiBpdCBpc24ndCBpbgotICAgICMgdGhlIHdvcmtpbmcgY29weQotICAgIGlmIG91dFswXS5zdGFydHN3aXRoKCclczogJyAlIHJlbHBhdGgpOgotICAgICAgb3V0ID0gb3V0WzE6XQotICAgIGlmIGxlbihvdXQpID4gMToKLSAgICAgICMgTW92ZWQvY29waWVkID0+IGNvbnNpZGVyZWQgYXMgbW9kaWZpZWQsIHVzZSBvbGQgZmlsZW5hbWUgdG8KLSAgICAgICMgcmV0cmlldmUgYmFzZSBjb250ZW50cwotICAgICAgb2xkcmVscGF0aCA9IG91dFsxXS5zdHJpcCgpCi0gICAgICBzdGF0dXMgPSAiTSIKLSAgICBlbHNlOgotICAgICAgc3RhdHVzLCBfID0gb3V0WzBdLnNwbGl0KCcgJywgMSkKLSAgICBpZiBzdGF0dXMgIT0gIkEiOgotICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJoZyIsICJjYXQiLCAiLXIiLCBzZWxmLmJhc2VfcmV2LCBvbGRyZWxwYXRoXSwKLSAgICAgICAgc2lsZW50X29rPVRydWUpCi0gICAgICBpc19iaW5hcnkgPSAiXDAiIGluIGJhc2VfY29udGVudCAgIyBNZXJjdXJpYWwncyBoZXVyaXN0aWMKLSAgICBpZiBzdGF0dXMgIT0gIlIiOgotICAgICAgbmV3X2NvbnRlbnQgPSBvcGVuKHJlbHBhdGgsICJyYiIpLnJlYWQoKQotICAgICAgaXNfYmluYXJ5ID0gaXNfYmluYXJ5IG9yICJcMCIgaW4gbmV3X2NvbnRlbnQKLSAgICBpZiBpc19iaW5hcnkgYW5kIGJhc2VfY29udGVudDoKLSAgICAgICMgRmV0Y2ggYWdhaW4gd2l0aG91dCBjb252ZXJ0aW5nIG5ld2xpbmVzCi0gICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbImhnIiwgImNhdCIsICItciIsIHNlbGYuYmFzZV9yZXYsIG9sZHJlbHBhdGhdLAotICAgICAgICBzaWxlbnRfb2s9VHJ1ZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlKQotICAgIGlmIG5vdCBpc19iaW5hcnkgb3Igbm90IHNlbGYuSXNJbWFnZShyZWxwYXRoKToKLSAgICAgIG5ld19jb250ZW50ID0gTm9uZQotICAgIHJldHVybiBiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cwotCi0KLSMgTk9URTogVGhlIFNwbGl0UGF0Y2ggZnVuY3Rpb24gaXMgZHVwbGljYXRlZCBpbiBlbmdpbmUucHksIGtlZXAgdGhlbSBpbiBzeW5jLgotZGVmIFNwbGl0UGF0Y2goZGF0YSk6Ci0gICIiIlNwbGl0cyBhIHBhdGNoIGludG8gc2VwYXJhdGUgcGllY2VzIGZvciBlYWNoIGZpbGUuCi0KLSAgQXJnczoKLSAgICBkYXRhOiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBvdXRwdXQgb2Ygc3ZuIGRpZmYuCi0KLSAgUmV0dXJuczoKLSAgICBBIGxpc3Qgb2YgMi10dXBsZSAoZmlsZW5hbWUsIHRleHQpIHdoZXJlIHRleHQgaXMgdGhlIHN2biBkaWZmIG91dHB1dAotICAgICAgcGVydGFpbmluZyB0byBmaWxlbmFtZS4KLSAgIiIiCi0gIHBhdGNoZXMgPSBbXQotICBmaWxlbmFtZSA9IE5vbmUKLSAgZGlmZiA9IFtdCi0gIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcyhUcnVlKToKLSAgICBuZXdfZmlsZW5hbWUgPSBOb25lCi0gICAgaWYgbGluZS5zdGFydHN3aXRoKCdJbmRleDonKToKLSAgICAgIHVudXNlZCwgbmV3X2ZpbGVuYW1lID0gbGluZS5zcGxpdCgnOicsIDEpCi0gICAgICBuZXdfZmlsZW5hbWUgPSBuZXdfZmlsZW5hbWUuc3RyaXAoKQotICAgIGVsaWYgbGluZS5zdGFydHN3aXRoKCdQcm9wZXJ0eSBjaGFuZ2VzIG9uOicpOgotICAgICAgdW51c2VkLCB0ZW1wX2ZpbGVuYW1lID0gbGluZS5zcGxpdCgnOicsIDEpCi0gICAgICAjIFdoZW4gYSBmaWxlIGlzIG1vZGlmaWVkLCBwYXRocyB1c2UgJy8nIGJldHdlZW4gZGlyZWN0b3JpZXMsIGhvd2V2ZXIKLSAgICAgICMgd2hlbiBhIHByb3BlcnR5IGlzIG1vZGlmaWVkICdcJyBpcyB1c2VkIG9uIFdpbmRvd3MuICBNYWtlIHRoZW0gdGhlIHNhbWUKLSAgICAgICMgb3RoZXJ3aXNlIHRoZSBmaWxlIHNob3dzIHVwIHR3aWNlLgotICAgICAgdGVtcF9maWxlbmFtZSA9IHRlbXBfZmlsZW5hbWUuc3RyaXAoKS5yZXBsYWNlKCdcXCcsICcvJykKLSAgICAgIGlmIHRlbXBfZmlsZW5hbWUgIT0gZmlsZW5hbWU6Ci0gICAgICAgICMgRmlsZSBoYXMgcHJvcGVydHkgY2hhbmdlcyBidXQgbm8gbW9kaWZpY2F0aW9ucywgY3JlYXRlIGEgbmV3IGRpZmYuCi0gICAgICAgIG5ld19maWxlbmFtZSA9IHRlbXBfZmlsZW5hbWUKLSAgICBpZiBuZXdfZmlsZW5hbWU6Ci0gICAgICBpZiBmaWxlbmFtZSBhbmQgZGlmZjoKLSAgICAgICAgcGF0Y2hlcy5hcHBlbmQoKGZpbGVuYW1lLCAnJy5qb2luKGRpZmYpKSkKLSAgICAgIGZpbGVuYW1lID0gbmV3X2ZpbGVuYW1lCi0gICAgICBkaWZmID0gW2xpbmVdCi0gICAgICBjb250aW51ZQotICAgIGlmIGRpZmYgaXMgbm90IE5vbmU6Ci0gICAgICBkaWZmLmFwcGVuZChsaW5lKQotICBpZiBmaWxlbmFtZSBhbmQgZGlmZjoKLSAgICBwYXRjaGVzLmFwcGVuZCgoZmlsZW5hbWUsICcnLmpvaW4oZGlmZikpKQotICByZXR1cm4gcGF0Y2hlcwotCi0KLWRlZiBVcGxvYWRTZXBhcmF0ZVBhdGNoZXMoaXNzdWUsIHJwY19zZXJ2ZXIsIHBhdGNoc2V0LCBkYXRhLCBvcHRpb25zKToKLSAgIiIiVXBsb2FkcyBhIHNlcGFyYXRlIHBhdGNoIGZvciBlYWNoIGZpbGUgaW4gdGhlIGRpZmYgb3V0cHV0LgotCi0gIFJldHVybnMgYSBsaXN0IG9mIFtwYXRjaF9rZXksIGZpbGVuYW1lXSBmb3IgZWFjaCBmaWxlLgotICAiIiIKLSAgcGF0Y2hlcyA9IFNwbGl0UGF0Y2goZGF0YSkKLSAgcnYgPSBbXQotICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKLSAgICBpZiBsZW4ocGF0Y2hbMV0pID4gTUFYX1VQTE9BRF9TSVpFOgotICAgICAgcHJpbnQgKCJOb3QgdXBsb2FkaW5nIHRoZSBwYXRjaCBmb3IgIiArIHBhdGNoWzBdICsKLSAgICAgICAgICAgICAiIGJlY2F1c2UgdGhlIGZpbGUgaXMgdG9vIGxhcmdlLiIpCi0gICAgICBjb250aW51ZQotICAgIGZvcm1fZmllbGRzID0gWygiZmlsZW5hbWUiLCBwYXRjaFswXSldCi0gICAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKLSAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImNvbnRlbnRfdXBsb2FkIiwgIjEiKSkKLSAgICBmaWxlcyA9IFsoImRhdGEiLCAiZGF0YS5kaWZmIiwgcGF0Y2hbMV0pXQotICAgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZm9ybV9maWVsZHMsIGZpbGVzKQotICAgIHVybCA9ICIvJWQvdXBsb2FkX3BhdGNoLyVkIiAlIChpbnQoaXNzdWUpLCBpbnQocGF0Y2hzZXQpKQotICAgIHByaW50ICJVcGxvYWRpbmcgcGF0Y2ggZm9yICIgKyBwYXRjaFswXQotICAgIHJlc3BvbnNlX2JvZHkgPSBycGNfc2VydmVyLlNlbmQodXJsLCBib2R5LCBjb250ZW50X3R5cGU9Y3R5cGUpCi0gICAgbGluZXMgPSByZXNwb25zZV9ib2R5LnNwbGl0bGluZXMoKQotICAgIGlmIG5vdCBsaW5lcyBvciBsaW5lc1swXSAhPSAiT0siOgotICAgICAgU3RhdHVzVXBkYXRlKCIgIC0tPiAlcyIgJSByZXNwb25zZV9ib2R5KQotICAgICAgc3lzLmV4aXQoMSkKLSAgICBydi5hcHBlbmQoW2xpbmVzWzFdLCBwYXRjaFswXV0pCi0gIHJldHVybiBydgotCi0KLWRlZiBHdWVzc1ZDUyhvcHRpb25zKToKLSAgIiIiSGVscGVyIHRvIGd1ZXNzIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLgotCi0gIFRoaXMgZXhhbWluZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBndWVzc2VzIHdoaWNoIFZlcnNpb25Db250cm9sU3lzdGVtCi0gIHdlJ3JlIHVzaW5nLCBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgY2xhc3MuICBFeGl0IHdpdGggYW4KLSAgZXJyb3IgaWYgd2UgY2FuJ3QgZmlndXJlIGl0IG91dC4KLQotICBSZXR1cm5zOgotICAgIEEgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW5zdGFuY2UuIEV4aXRzIGlmIHRoZSBWQ1MgY2FuJ3QgYmUgZ3Vlc3NlZC4KLSAgIiIiCi0gICMgTWVyY3VyaWFsIGhhcyBhIGNvbW1hbmQgdG8gZ2V0IHRoZSBiYXNlIGRpcmVjdG9yeSBvZiBhIHJlcG9zaXRvcnkKLSAgIyBUcnkgcnVubmluZyBpdCwgYnV0IGRvbid0IGRpZSBpZiB3ZSBkb24ndCBoYXZlIGhnIGluc3RhbGxlZC4KLSAgIyBOT1RFOiB3ZSB0cnkgTWVyY3VyaWFsIGZpcnN0IGFzIGl0IGNhbiBzaXQgb24gdG9wIG9mIGFuIFNWTiB3b3JraW5nIGNvcHkuCi0gIHRyeToKLSAgICBvdXQsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKFsiaGciLCAicm9vdCJdKQotICAgIGlmIHJldHVybmNvZGUgPT0gMDoKLSAgICAgIHJldHVybiBNZXJjdXJpYWxWQ1Mob3B0aW9ucywgb3V0LnN0cmlwKCkpCi0gIGV4Y2VwdCBPU0Vycm9yLCAoZXJybm8sIG1lc3NhZ2UpOgotICAgIGlmIGVycm5vICE9IDI6ICAjIEVOT0VOVCAtLSB0aGV5IGRvbid0IGhhdmUgaGcgaW5zdGFsbGVkLgotICAgICAgcmFpc2UKLQotICAjIFN1YnZlcnNpb24gaGFzIGEgLnN2biBpbiBhbGwgd29ya2luZyBkaXJlY3Rvcmllcy4KLSAgaWYgb3MucGF0aC5pc2RpcignLnN2bicpOgotICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBWQ1MgPSBTdWJ2ZXJzaW9uIikKLSAgICByZXR1cm4gU3VidmVyc2lvblZDUyhvcHRpb25zKQotCi0gICMgR2l0IGhhcyBhIGNvbW1hbmQgdG8gdGVzdCBpZiB5b3UncmUgaW4gYSBnaXQgdHJlZS4KLSAgIyBUcnkgcnVubmluZyBpdCwgYnV0IGRvbid0IGRpZSBpZiB3ZSBkb24ndCBoYXZlIGdpdCBpbnN0YWxsZWQuCi0gIHRyeToKLSAgICBvdXQsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKFsiZ2l0IiwgInJldi1wYXJzZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taXMtaW5zaWRlLXdvcmstdHJlZSJdKQotICAgIGlmIHJldHVybmNvZGUgPT0gMDoKLSAgICAgIHJldHVybiBHaXRWQ1Mob3B0aW9ucykKLSAgZXhjZXB0IE9TRXJyb3IsIChlcnJubywgbWVzc2FnZSk6Ci0gICAgaWYgZXJybm8gIT0gMjogICMgRU5PRU5UIC0tIHRoZXkgZG9uJ3QgaGF2ZSBnaXQgaW5zdGFsbGVkLgotICAgICAgcmFpc2UKLQotICBFcnJvckV4aXQoKCJDb3VsZCBub3QgZ3Vlc3MgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4gIgotICAgICAgICAgICAgICJBcmUgeW91IGluIGEgd29ya2luZyBjb3B5IGRpcmVjdG9yeT8iKSkKLQotCi1kZWYgUmVhbE1haW4oYXJndiwgZGF0YT1Ob25lKToKLSAgIiIiVGhlIHJlYWwgbWFpbiBmdW5jdGlvbi4KLQotICBBcmdzOgotICAgIGFyZ3Y6IENvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAgZGF0YTogRGlmZiBjb250ZW50cy4gSWYgTm9uZSAoZGVmYXVsdCkgdGhlIGRpZmYgaXMgZ2VuZXJhdGVkIGJ5Ci0gICAgICB0aGUgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYnkgR3Vlc3NWQ1MoKS4KLQotICBSZXR1cm5zOgotICAgIEEgMi10dXBsZSAoaXNzdWUgaWQsIHBhdGNoc2V0IGlkKS4KLSAgICBUaGUgcGF0Y2hzZXQgaWQgaXMgTm9uZSBpZiB0aGUgYmFzZSBmaWxlcyBhcmUgbm90IHVwbG9hZGVkIGJ5IHRoaXMKLSAgICBzY3JpcHQgKGFwcGxpZXMgb25seSB0byBTVk4gY2hlY2tvdXRzKS4KLSAgIiIiCi0gIGxvZ2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSgiJShhc2N0aW1lKS4xOXMgJShsZXZlbG5hbWUpcyAlKGZpbGVuYW1lKXM6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUobGluZW5vKXMgJShtZXNzYWdlKXMgIikpCi0gIG9zLmVudmlyb25bJ0xDX0FMTCddID0gJ0MnCi0gIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2WzE6XSkKLSAgZ2xvYmFsIHZlcmJvc2l0eQotICB2ZXJib3NpdHkgPSBvcHRpb25zLnZlcmJvc2UKLSAgaWYgdmVyYm9zaXR5ID49IDM6Ci0gICAgbG9nZ2luZy5nZXRMb2dnZXIoKS5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQotICBlbGlmIHZlcmJvc2l0eSA+PSAyOgotICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCkuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQotICB2Y3MgPSBHdWVzc1ZDUyhvcHRpb25zKQotICBpZiBpc2luc3RhbmNlKHZjcywgU3VidmVyc2lvblZDUyk6Ci0gICAgIyBiYXNlIGZpZWxkIGlzIG9ubHkgYWxsb3dlZCBmb3IgU3VidmVyc2lvbi4KLSAgICAjIE5vdGU6IEZldGNoaW5nIGJhc2UgZmlsZXMgbWF5IGJlY29tZSBkZXByZWNhdGVkIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAgICBiYXNlID0gdmNzLkd1ZXNzQmFzZShvcHRpb25zLmRvd25sb2FkX2Jhc2UpCi0gIGVsc2U6Ci0gICAgYmFzZSA9IE5vbmUKLSAgaWYgbm90IGJhc2UgYW5kIG9wdGlvbnMuZG93bmxvYWRfYmFzZToKLSAgICBvcHRpb25zLmRvd25sb2FkX2Jhc2UgPSBUcnVlCi0gICAgbG9nZ2luZy5pbmZvKCJFbmFibGVkIHVwbG9hZCBvZiBiYXNlIGZpbGUiKQotICBpZiBub3Qgb3B0aW9ucy5hc3N1bWVfeWVzOgotICAgIHZjcy5DaGVja0ZvclVua25vd25GaWxlcygpCi0gIGlmIGRhdGEgaXMgTm9uZToKLSAgICBkYXRhID0gdmNzLkdlbmVyYXRlRGlmZihhcmdzKQotICBmaWxlcyA9IHZjcy5HZXRCYXNlRmlsZXMoZGF0YSkKLSAgaWYgdmVyYm9zaXR5ID49IDE6Ci0gICAgcHJpbnQgIlVwbG9hZCBzZXJ2ZXI6Iiwgb3B0aW9ucy5zZXJ2ZXIsICIoY2hhbmdlIHdpdGggLXMvLS1zZXJ2ZXIpIgotICBpZiBvcHRpb25zLmlzc3VlOgotICAgIHByb21wdCA9ICJNZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBwYXRjaCBzZXQ6ICIKLSAgZWxzZToKLSAgICBwcm9tcHQgPSAiTmV3IGlzc3VlIHN1YmplY3Q6ICIKLSAgbWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZSBvciByYXdfaW5wdXQocHJvbXB0KS5zdHJpcCgpCi0gIGlmIG5vdCBtZXNzYWdlOgotICAgIEVycm9yRXhpdCgiQSBub24tZW1wdHkgbWVzc2FnZSBpcyByZXF1aXJlZCIpCi0gIHJwY19zZXJ2ZXIgPSBHZXRScGNTZXJ2ZXIob3B0aW9ucykKLSAgZm9ybV9maWVsZHMgPSBbKCJzdWJqZWN0IiwgbWVzc2FnZSldCi0gIGlmIGJhc2U6Ci0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiYmFzZSIsIGJhc2UpKQotICBpZiBvcHRpb25zLmlzc3VlOgotICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImlzc3VlIiwgc3RyKG9wdGlvbnMuaXNzdWUpKSkKLSAgaWYgb3B0aW9ucy5lbWFpbDoKLSAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJ1c2VyIiwgb3B0aW9ucy5lbWFpbCkpCi0gIGlmIG9wdGlvbnMucmV2aWV3ZXJzOgotICAgIGZvciByZXZpZXdlciBpbiBvcHRpb25zLnJldmlld2Vycy5zcGxpdCgnLCcpOgotICAgICAgaWYgIkAiIGluIHJldmlld2VyIGFuZCBub3QgcmV2aWV3ZXIuc3BsaXQoIkAiKVsxXS5jb3VudCgiLiIpID09IDE6Ci0gICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBlbWFpbCBhZGRyZXNzOiAlcyIgJSByZXZpZXdlcikKLSAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJyZXZpZXdlcnMiLCBvcHRpb25zLnJldmlld2VycykpCi0gIGlmIG9wdGlvbnMuY2M6Ci0gICAgZm9yIGNjIGluIG9wdGlvbnMuY2Muc3BsaXQoJywnKToKLSAgICAgIGlmICJAIiBpbiBjYyBhbmQgbm90IGNjLnNwbGl0KCJAIilbMV0uY291bnQoIi4iKSA9PSAxOgotICAgICAgICBFcnJvckV4aXQoIkludmFsaWQgZW1haWwgYWRkcmVzczogJXMiICUgY2MpCi0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY2MiLCBvcHRpb25zLmNjKSkKLSAgZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uCi0gIGlmIG9wdGlvbnMuZGVzY3JpcHRpb25fZmlsZToKLSAgICBpZiBvcHRpb25zLmRlc2NyaXB0aW9uOgotICAgICAgRXJyb3JFeGl0KCJDYW4ndCBzcGVjaWZ5IGRlc2NyaXB0aW9uIGFuZCBkZXNjcmlwdGlvbl9maWxlIikKLSAgICBmaWxlID0gb3BlbihvcHRpb25zLmRlc2NyaXB0aW9uX2ZpbGUsICdyJykKLSAgICBkZXNjcmlwdGlvbiA9IGZpbGUucmVhZCgpCi0gICAgZmlsZS5jbG9zZSgpCi0gIGlmIGRlc2NyaXB0aW9uOgotICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pKQotICAjIFNlbmQgYSBoYXNoIG9mIGFsbCB0aGUgYmFzZSBmaWxlIHNvIHRoZSBzZXJ2ZXIgY2FuIGRldGVybWluZSBpZiBhIGNvcHkKLSAgIyBhbHJlYWR5IGV4aXN0cyBpbiBhbiBlYXJsaWVyIHBhdGNoc2V0LgotICBiYXNlX2hhc2hlcyA9ICIiCi0gIGZvciBmaWxlLCBpbmZvIGluIGZpbGVzLml0ZXJpdGVtcygpOgotICAgIGlmIG5vdCBpbmZvWzBdIGlzIE5vbmU6Ci0gICAgICBjaGVja3N1bSA9IG1kNS5uZXcoaW5mb1swXSkuaGV4ZGlnZXN0KCkKLSAgICAgIGlmIGJhc2VfaGFzaGVzOgotICAgICAgICBiYXNlX2hhc2hlcyArPSAifCIKLSAgICAgIGJhc2VfaGFzaGVzICs9IGNoZWNrc3VtICsgIjoiICsgZmlsZQotICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJiYXNlX2hhc2hlcyIsIGJhc2VfaGFzaGVzKSkKLSAgIyBJZiB3ZSdyZSB1cGxvYWRpbmcgYmFzZSBmaWxlcywgZG9uJ3Qgc2VuZCB0aGUgZW1haWwgYmVmb3JlIHRoZSB1cGxvYWRzLCBzbwotICAjIHRoYXQgaXQgY29udGFpbnMgdGhlIGZpbGUgc3RhdHVzLgotICBpZiBvcHRpb25zLnNlbmRfbWFpbCBhbmQgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgotICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInNlbmRfbWFpbCIsICIxIikpCi0gIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6Ci0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY29udGVudF91cGxvYWQiLCAiMSIpKQotICBpZiBsZW4oZGF0YSkgPiBNQVhfVVBMT0FEX1NJWkU6Ci0gICAgcHJpbnQgIlBhdGNoIGlzIGxhcmdlLCBzbyB1cGxvYWRpbmcgZmlsZSBwYXRjaGVzIHNlcGFyYXRlbHkuIgotICAgIHVwbG9hZGVkX2RpZmZfZmlsZSA9IFtdCi0gICAgZm9ybV9maWVsZHMuYXBwZW5kKCgic2VwYXJhdGVfcGF0Y2hlcyIsICIxIikpCi0gIGVsc2U6Ci0gICAgdXBsb2FkZWRfZGlmZl9maWxlID0gWygiZGF0YSIsICJkYXRhLmRpZmYiLCBkYXRhKV0KLSAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmb3JtX2ZpZWxkcywgdXBsb2FkZWRfZGlmZl9maWxlKQotICByZXNwb25zZV9ib2R5ID0gcnBjX3NlcnZlci5TZW5kKCIvdXBsb2FkIiwgYm9keSwgY29udGVudF90eXBlPWN0eXBlKQotICBwYXRjaHNldCA9IE5vbmUKLSAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZSBvciBub3QgdXBsb2FkZWRfZGlmZl9maWxlOgotICAgIGxpbmVzID0gcmVzcG9uc2VfYm9keS5zcGxpdGxpbmVzKCkKLSAgICBpZiBsZW4obGluZXMpID49IDI6Ci0gICAgICBtc2cgPSBsaW5lc1swXQotICAgICAgcGF0Y2hzZXQgPSBsaW5lc1sxXS5zdHJpcCgpCi0gICAgICBwYXRjaGVzID0gW3guc3BsaXQoIiAiLCAxKSBmb3IgeCBpbiBsaW5lc1syOl1dCi0gICAgZWxzZToKLSAgICAgIG1zZyA9IHJlc3BvbnNlX2JvZHkKLSAgZWxzZToKLSAgICBtc2cgPSByZXNwb25zZV9ib2R5Ci0gIFN0YXR1c1VwZGF0ZShtc2cpCi0gIGlmIG5vdCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIklzc3VlIGNyZWF0ZWQuIikgYW5kIFwKLSAgbm90IHJlc3BvbnNlX2JvZHkuc3RhcnRzd2l0aCgiSXNzdWUgdXBkYXRlZC4iKToKLSAgICBzeXMuZXhpdCgwKQotICBpc3N1ZSA9IG1zZ1ttc2cucmZpbmQoIi8iKSsxOl0KLQotICBpZiBub3QgdXBsb2FkZWRfZGlmZl9maWxlOgotICAgIHJlc3VsdCA9IFVwbG9hZFNlcGFyYXRlUGF0Y2hlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hzZXQsIGRhdGEsIG9wdGlvbnMpCi0gICAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKLSAgICAgIHBhdGNoZXMgPSByZXN1bHQKLQotICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgotICAgIHZjcy5VcGxvYWRCYXNlRmlsZXMoaXNzdWUsIHJwY19zZXJ2ZXIsIHBhdGNoZXMsIHBhdGNoc2V0LCBvcHRpb25zLCBmaWxlcykKLSAgICBpZiBvcHRpb25zLnNlbmRfbWFpbDoKLSAgICAgIHJwY19zZXJ2ZXIuU2VuZCgiLyIgKyBpc3N1ZSArICIvbWFpbCIsIHBheWxvYWQ9IiIpCi0gIHJldHVybiBpc3N1ZSwgcGF0Y2hzZXQKLQotCi1kZWYgbWFpbigpOgotICB0cnk6Ci0gICAgUmVhbE1haW4oc3lzLmFyZ3YpCi0gIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICBwcmludAotICAgIFN0YXR1c1VwZGF0ZSgiSW50ZXJydXB0ZWQuIikKLSAgICBzeXMuZXhpdCgxKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zY3JpcHRzL3VwbG9hZF9ndGVzdC5weSBiL3Rlc3RpbmcvZ3Rlc3Qvc2NyaXB0cy91cGxvYWRfZ3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlMTlhZTguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zY3JpcHRzL3VwbG9hZF9ndGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiInVwbG9hZF9ndGVzdC5weSB2MC4xLjAgLS0gdXBsb2FkcyBhIEdvb2dsZSBUZXN0IHBhdGNoIGZvciByZXZpZXcuCi0KLVRoaXMgc2ltcGxlIHdyYXBwZXIgcGFzc2VzIGFsbCBjb21tYW5kIGxpbmUgZmxhZ3MgYW5kCi0tLWNjPWdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSB0byB1cGxvYWQucHkuCi0KLVVTQUdFOiB1cGxvYWRfZ3Rlc3QucHkgW29wdGlvbnMgZm9yIHVwbG9hZC5weV0KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotQ0NfRkxBRyA9ICctLWNjPScKLUdURVNUX0dST1VQID0gJ2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbScKLQotCi1kZWYgbWFpbigpOgotICAjIEZpbmRzIHRoZSBwYXRoIHRvIHVwbG9hZC5weSwgYXNzdW1pbmcgaXQgaXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Ci0gICMgYXMgdGhpcyBmaWxlLgotICBteV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKLSAgdXBsb2FkX3B5X3BhdGggPSBvcy5wYXRoLmpvaW4obXlfZGlyLCAndXBsb2FkLnB5JykKLQotICAjIEFkZHMgR29vZ2xlIFRlc3QgZGlzY3Vzc2lvbiBncm91cCB0byB0aGUgY2MgbGluZSBpZiBpdCdzIG5vdCB0aGVyZQotICAjIGFscmVhZHkuCi0gIHVwbG9hZF9weV9hcmd2ID0gW3VwbG9hZF9weV9wYXRoXQotICBmb3VuZF9jY19mbGFnID0gRmFsc2UKLSAgZm9yIGFyZyBpbiBzeXMuYXJndlsxOl06Ci0gICAgaWYgYXJnLnN0YXJ0c3dpdGgoQ0NfRkxBRyk6Ci0gICAgICBmb3VuZF9jY19mbGFnID0gVHJ1ZQotICAgICAgY2NfbGluZSA9IGFyZ1tsZW4oQ0NfRkxBRyk6XQotICAgICAgY2NfbGlzdCA9IFthZGRyIGZvciBhZGRyIGluIGNjX2xpbmUuc3BsaXQoJywnKSBpZiBhZGRyXQotICAgICAgaWYgR1RFU1RfR1JPVVAgbm90IGluIGNjX2xpc3Q6Ci0gICAgICAgIGNjX2xpc3QuYXBwZW5kKEdURVNUX0dST1VQKQotICAgICAgdXBsb2FkX3B5X2FyZ3YuYXBwZW5kKENDX0ZMQUcgKyAnLCcuam9pbihjY19saXN0KSkKLSAgICBlbHNlOgotICAgICAgdXBsb2FkX3B5X2FyZ3YuYXBwZW5kKGFyZykKLQotICBpZiBub3QgZm91bmRfY2NfZmxhZzoKLSAgICB1cGxvYWRfcHlfYXJndi5hcHBlbmQoQ0NfRkxBRyArIEdURVNUX0dST1VQKQotCi0gICMgSW52b2tlcyB1cGxvYWQucHkgd2l0aCB0aGUgbW9kaWZpZWQgY29tbWFuZCBsaW5lIGZsYWdzLgotICBvcy5leGVjdih1cGxvYWRfcHlfcGF0aCwgdXBsb2FkX3B5X2FyZ3YpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgbWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC1hbGwuY2MgYi90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC1hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWNlZTUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtYWxsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKLS8vCi0vLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBTb21ldGltZXMgaXQncyBkZXNpcmFibGUgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYnkgY29tcGlsaW5nIGEgc2luZ2xlIGZpbGUuCi0vLyBUaGlzIGZpbGUgc2VydmVzIHRoaXMgcHVycG9zZS4KLQotLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBndGVzdC5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCi0vLyB3aGVuIGl0J3MgZnVzZWQuCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGd0ZXN0ICouY2MgZmlsZXMuCi0jaW5jbHVkZSAic3JjL2d0ZXN0LmNjIgotI2luY2x1ZGUgInNyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIgotI2luY2x1ZGUgInNyYy9ndGVzdC1maWxlcGF0aC5jYyIKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtcG9ydC5jYyIKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtcHJpbnRlcnMuY2MiCi0jaW5jbHVkZSAic3JjL2d0ZXN0LXRlc3QtcGFydC5jYyIKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc2ZDA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaCIKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSMgaWYgR1RFU1RfT1NfTUFDCi0jICBpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgotIyBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCi0KLSMgaW5jbHVkZSA8ZXJybm8uaD4KLSMgaW5jbHVkZSA8ZmNudGwuaD4KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSMgaWYgR1RFU1RfT1NfTElOVVgKLSMgIGluY2x1ZGUgPHNpZ25hbC5oPgotIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKLQotIyBpbmNsdWRlIDxzdGRhcmcuaD4KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jIGVsc2UKLSMgIGluY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jICBpbmNsdWRlIDxzeXMvd2FpdC5oPgotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0jIGlmIEdURVNUX09TX1FOWAotIyAgaW5jbHVkZSA8c3Bhd24uaD4KLSMgZW5kaWYgIC8vIEdURVNUX09TX1FOWAotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgZXhpc3RzIHRvCi0vLyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbiB0aGUKLS8vIHVzZXIncyBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBDb25zdGFudHMuCi0KLS8vIFRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuCi1zdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdERlYXRoVGVzdFN0eWxlW10gPSAiZmFzdCI7Ci0KLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIGRlYXRoX3Rlc3Rfc3R5bGUsCi0gICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZGVhdGhfdGVzdF9zdHlsZSIsIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGUpLAotICAgICJJbmRpY2F0ZXMgaG93IHRvIHJ1biBhIGRlYXRoIHRlc3QgaW4gYSBmb3JrZWQgY2hpbGQgcHJvY2VzczogIgotICAgICJcInRocmVhZHNhZmVcIiAoY2hpbGQgcHJvY2VzcyByZS1leGVjdXRlcyB0aGUgdGVzdCBiaW5hcnkgIgotICAgICJmcm9tIHRoZSBiZWdpbm5pbmcsIHJ1bm5pbmcgb25seSB0aGUgc3BlY2lmaWMgZGVhdGggdGVzdCkgb3IgIgotICAgICJcImZhc3RcIiAoY2hpbGQgcHJvY2VzcyBydW5zIHRoZSBkZWF0aCB0ZXN0IGltbWVkaWF0ZWx5ICIKLSAgICAiYWZ0ZXIgZm9ya2luZykuIik7Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICBkZWF0aF90ZXN0X3VzZV9mb3JrLAotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3VzZV9mb3JrIiwgZmFsc2UpLAotICAgICJJbnN0cnVjdHMgdG8gdXNlIGZvcmsoKS9fZXhpdCgpIGluc3RlYWQgb2YgY2xvbmUoKSBpbiBkZWF0aCB0ZXN0cy4gIgotICAgICJJZ25vcmVkIGFuZCBhbHdheXMgdXNlcyBmb3JrKCkgb24gUE9TSVggc3lzdGVtcyB3aGVyZSBjbG9uZSgpIGlzIG5vdCAiCi0gICAgImltcGxlbWVudGVkLiBVc2VmdWwgd2hlbiBydW5uaW5nIHVuZGVyIHZhbGdyaW5kIG9yIHNpbWlsYXIgdG9vbHMgaWYgIgotICAgICJ0aG9zZSBkbyBub3Qgc3VwcG9ydCBjbG9uZSgpLiBWYWxncmluZCAzLjMuMSB3aWxsIGp1c3QgZmFpbCBpZiAiCi0gICAgIml0IHNlZXMgYW4gdW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgY2xvbmUoKSBmbGFncy4gIgotICAgICJJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmxhZyB3L28gdmFsZ3JpbmQgdGhvdWdoIGl0IHdpbGwgIgotICAgICJ3b3JrIGluIDk5JSBvZiB0aGUgY2FzZXMuIE9uY2UgdmFsZ3JpbmQgaXMgZml4ZWQsIHRoaXMgZmxhZyB3aWxsICIKLSAgICAibW9zdCBsaWtlbHkgYmUgcmVtb3ZlZC4iKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0LCAiIiwKLSAgICAiSW5kaWNhdGVzIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgdGVtcG9yYWwgaW5kZXggb2YgIgotICAgICJ0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdG8gcnVuLCBhbmQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gIgotICAgICJ3aGljaCBhIHN1Y2Nlc3MgY29kZSBtYXkgYmUgc2VudCwgYWxsIHNlcGFyYXRlZCBieSAiCi0gICAgInRoZSAnfCcgY2hhcmFjdGVycy4gIFRoaXMgZmxhZyBpcyBzcGVjaWZpZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgIgotICAgICJwcm9jZXNzIGlzIGEgc3ViLXByb2Nlc3MgbGF1bmNoZWQgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZSAiCi0gICAgImRlYXRoIHRlc3QuICBGT1IgSU5URVJOQUwgVVNFIE9OTFkuIik7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFZhbGlkIG9ubHkgZm9yIGZhc3QgZGVhdGggdGVzdHMuIEluZGljYXRlcyB0aGUgY29kZSBpcyBydW5uaW5nIGluIHRoZQotLy8gY2hpbGQgcHJvY2VzcyBvZiBhIGZhc3Qgc3R5bGUgZGVhdGggdGVzdC4KLXN0YXRpYyBib29sIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkID0gZmFsc2U7Ci0KLS8vIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FsbGVyIGlzIGN1cnJlbnRseQotLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzCi0vLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoCi0vLyB0ZXN0cy4gIElNUE9SVEFOVDogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5LiAgVXNpbmcgaXQgbWF5IGJyZWFrIHRoZQotLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0LgotYm9vbCBJbkRlYXRoVGVzdENoaWxkKCkgewotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0KLSAgLy8gT24gV2luZG93cywgZGVhdGggdGVzdHMgYXJlIHRocmVhZC1zYWZlIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoZQotICAvLyBkZWF0aF90ZXN0X3N0eWxlIGZsYWcuCi0gIHJldHVybiAhR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuZW1wdHkoKTsKLQotIyBlbHNlCi0KLSAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKQotICAgIHJldHVybiAhR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuZW1wdHkoKTsKLSAgZWxzZQotICAgIHJldHVybiBnX2luX2Zhc3RfZGVhdGhfdGVzdF9jaGlsZDsKLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gRXhpdGVkV2l0aENvZGUgY29uc3RydWN0b3IuCi1FeGl0ZWRXaXRoQ29kZTo6RXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSkgOiBleGl0X2NvZGVfKGV4aXRfY29kZSkgewotfQotCi0vLyBFeGl0ZWRXaXRoQ29kZSBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLgotYm9vbCBFeGl0ZWRXaXRoQ29kZTo6b3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0IHsKLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0gIHJldHVybiBleGl0X3N0YXR1cyA9PSBleGl0X2NvZGVfOwotCi0jIGVsc2UKLQotICByZXR1cm4gV0lGRVhJVEVEKGV4aXRfc3RhdHVzKSAmJiBXRVhJVFNUQVRVUyhleGl0X3N0YXR1cykgPT0gZXhpdF9jb2RlXzsKLQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotfQotCi0jIGlmICFHVEVTVF9PU19XSU5ET1dTCi0vLyBLaWxsZWRCeVNpZ25hbCBjb25zdHJ1Y3Rvci4KLUtpbGxlZEJ5U2lnbmFsOjpLaWxsZWRCeVNpZ25hbChpbnQgc2lnbnVtKSA6IHNpZ251bV8oc2lnbnVtKSB7Ci19Ci0KLS8vIEtpbGxlZEJ5U2lnbmFsIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCi1ib29sIEtpbGxlZEJ5U2lnbmFsOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgewotIyAgaWYgZGVmaW5lZChHVEVTVF9LSUxMRURfQllfU0lHTkFMX09WRVJSSURFXykKLSAgewotICAgIGJvb2wgcmVzdWx0OwotICAgIGlmIChHVEVTVF9LSUxMRURfQllfU0lHTkFMX09WRVJSSURFXyhzaWdudW1fLCBleGl0X3N0YXR1cywgJnJlc3VsdCkpIHsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0jICBlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9LSUxMRURfQllfU0lHTkFMX09WRVJSSURFXykKLSAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfc3RhdHVzKSAmJiBXVEVSTVNJRyhleGl0X3N0YXR1cykgPT0gc2lnbnVtXzsKLX0KLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFV0aWxpdGllcyBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgotCi0vLyBHZW5lcmF0ZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gZXhpdCBjb2RlLCBpbiB0aGUgZm9ybWF0Ci0vLyBzcGVjaWZpZWQgYnkgd2FpdCgyKS4KLXN0YXRpYyBzdGQ6OnN0cmluZyBFeGl0U3VtbWFyeShpbnQgZXhpdF9jb2RlKSB7Ci0gIE1lc3NhZ2UgbTsKLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0KLSAgbSA8PCAiRXhpdGVkIHdpdGggZXhpdCBzdGF0dXMgIiA8PCBleGl0X2NvZGU7Ci0KLSMgZWxzZQotCi0gIGlmIChXSUZFWElURUQoZXhpdF9jb2RlKSkgewotICAgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgV0VYSVRTVEFUVVMoZXhpdF9jb2RlKTsKLSAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChleGl0X2NvZGUpKSB7Ci0gICAgbSA8PCAiVGVybWluYXRlZCBieSBzaWduYWwgIiA8PCBXVEVSTVNJRyhleGl0X2NvZGUpOwotICB9Ci0jICBpZmRlZiBXQ09SRURVTVAKLSAgaWYgKFdDT1JFRFVNUChleGl0X2NvZGUpKSB7Ci0gICAgbSA8PCAiIChjb3JlIGR1bXBlZCkiOwotICB9Ci0jICBlbmRpZgotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0gIHJldHVybiBtLkdldFN0cmluZygpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkCi0vLyBieSBhIHNpZ25hbCwgb3IgZXhpdGVkIG5vcm1hbGx5IHdpdGggYSBub256ZXJvIGV4aXQgY29kZS4KLWJvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKSB7Ci0gIHJldHVybiAhRXhpdGVkV2l0aENvZGUoMCkoZXhpdF9zdGF0dXMpOwotfQotCi0jIGlmICFHVEVTVF9PU19XSU5ET1dTCi0vLyBHZW5lcmF0ZXMgYSB0ZXh0dWFsIGZhaWx1cmUgbWVzc2FnZSB3aGVuIGEgZGVhdGggdGVzdCBmaW5kcyBtb3JlIHRoYW4KLS8vIG9uZSB0aHJlYWQgcnVubmluZywgb3IgY2Fubm90IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMsIHByaW9yCi0vLyB0byBleGVjdXRpbmcgdGhlIGdpdmVuIHN0YXRlbWVudC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKLS8vIGNhbGxlciBub3QgdG8gcGFzcyBhIHRocmVhZF9jb3VudCBvZiAxLgotc3RhdGljIHN0ZDo6c3RyaW5nIERlYXRoVGVzdFRocmVhZFdhcm5pbmcoc2l6ZV90IHRocmVhZF9jb3VudCkgewotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8ICJEZWF0aCB0ZXN0cyB1c2UgZm9yaygpLCB3aGljaCBpcyB1bnNhZmUgcGFydGljdWxhcmx5IgotICAgICAgPDwgIiBpbiBhIHRocmVhZGVkIGNvbnRleHQuIEZvciB0aGlzIHRlc3QsICIgPDwgR1RFU1RfTkFNRV8gPDwgIiAiOwotICBpZiAodGhyZWFkX2NvdW50ID09IDApCi0gICAgbXNnIDw8ICJjb3VsZG4ndCBkZXRlY3QgdGhlIG51bWJlciBvZiB0aHJlYWRzLiI7Ci0gIGVsc2UKLSAgICBtc2cgPDwgImRldGVjdGVkICIgPDwgdGhyZWFkX2NvdW50IDw8ICIgdGhyZWFkcy4iOwotICByZXR1cm4gbXNnLkdldFN0cmluZygpOwotfQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKLQotLy8gRmxhZyBjaGFyYWN0ZXJzIGZvciByZXBvcnRpbmcgYSBkZWF0aCB0ZXN0IHRoYXQgZGlkIG5vdCBkaWUuCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0TGl2ZWQgPSAnTCc7Ci1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0UmV0dXJuZWQgPSAnUic7Ci1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0VGhyZXcgPSAnVCc7Ci1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciA9ICdJJzsKLQotLy8gQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyBhbGwgb2YgdGhlIHBvc3NpYmxlIHdheXMgdGhhdCBhIGRlYXRoIHRlc3QgY2FuCi0vLyBjb25jbHVkZS4gIERJRUQgbWVhbnMgdGhhdCB0aGUgcHJvY2VzcyBkaWVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdAotLy8gY29kZTsgTElWRUQgbWVhbnMgdGhhdCBwcm9jZXNzIGxpdmVkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB0ZXN0IGNvZGU7Ci0vLyBSRVRVUk5FRCBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudCBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSBhIHJldHVybgotLy8gc3RhdGVtZW50LCB3aGljaCBpcyBub3QgYWxsb3dlZDsgVEhSRVcgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQKLS8vIHJldHVybmVkIGNvbnRyb2wgYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgSU5fUFJPR1JFU1MgbWVhbnMgdGhlIHRlc3QKLS8vIGhhcyBub3QgeWV0IGNvbmNsdWRlZC4KLS8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFVuaWZ5IG5hbWVzIGFuZCBwb3NzaWJseSB2YWx1ZXMgZm9yCi0vLyBBYm9ydFJlYXNvbiwgRGVhdGhUZXN0T3V0Y29tZSwgYW5kIGZsYWcgY2hhcmFjdGVycyBhYm92ZS4KLWVudW0gRGVhdGhUZXN0T3V0Y29tZSB7IElOX1BST0dSRVNTLCBESUVELCBMSVZFRCwgUkVUVVJORUQsIFRIUkVXIH07Ci0KLS8vIFJvdXRpbmUgZm9yIGFib3J0aW5nIHRoZSBwcm9ncmFtIHdoaWNoIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGFuCi0vLyBleGVjLXN0eWxlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcywgaW4gd2hpY2ggY2FzZSB0aGUgZXJyb3IKLS8vIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgdGhlCi0vLyBtZXNzYWdlIGlzIHNpbXBseSBwcmludGVkIHRvIHN0ZGVyci4gIEluIGVpdGhlciBjYXNlLCB0aGUgcHJvZ3JhbQotLy8gdGhlbiBleGl0cyB3aXRoIHN0YXR1cyAxLgotdm9pZCBEZWF0aFRlc3RBYm9ydChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgewotICAvLyBPbiBhIFBPU0lYIHN5c3RlbSwgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWRzYWZlLXN0eWxlCi0gIC8vIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcywgd2hpY2ggb3BlcmF0ZXMgb24gYSB2ZXJ5IHNtYWxsIHN0YWNrLiAgVXNlCi0gIC8vIHRoZSBoZWFwIGZvciBhbnkgYWRkaXRpb25hbCBub24tbWludXNjdWxlIG1lbW9yeSByZXF1aXJlbWVudHMuCi0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9Ci0gICAgICBHZXRVbml0VGVzdEltcGwoKS0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOwotICBpZiAoZmxhZyAhPSBOVUxMKSB7Ci0gICAgRklMRSogcGFyZW50ID0gcG9zaXg6OkZET3BlbihmbGFnLT53cml0ZV9mZCgpLCAidyIpOwotICAgIGZwdXRjKGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yLCBwYXJlbnQpOwotICAgIGZwcmludGYocGFyZW50LCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOwotICAgIGZmbHVzaChwYXJlbnQpOwotICAgIF9leGl0KDEpOwotICB9IGVsc2UgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIHBvc2l4OjpBYm9ydCgpOwotICB9Ci19Ci0KLS8vIEEgcmVwbGFjZW1lbnQgZm9yIENIRUNLIHRoYXQgY2FsbHMgRGVhdGhUZXN0QWJvcnQgaWYgdGhlIGFzc2VydGlvbgotLy8gZmFpbHMuCi0jIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhleHByZXNzaW9uKSBcCi0gIGRvIHsgXAotICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGV4cHJlc3Npb24pKSB7IFwKLSAgICAgIERlYXRoVGVzdEFib3J0KCBcCi0gICAgICAgICAgOjpzdGQ6OnN0cmluZygiQ0hFQ0sgZmFpbGVkOiBGaWxlICIpICsgX19GSUxFX18gKyAgIiwgbGluZSAiIFwKLSAgICAgICAgICArIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhfX0xJTkVfXykgKyAiOiAiIFwKLSAgICAgICAgICArICNleHByZXNzaW9uKTsgXAotICAgIH0gXAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0vLyBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gR1RFU1RfREVBVEhfVEVTVF9DSEVDS18sIGJ1dCBpdCBpcyBtZWFudCBmb3IKLS8vIGV2YWx1YXRpbmcgYW55IHN5c3RlbSBjYWxsIHRoYXQgZnVsZmlsbHMgdHdvIGNvbmRpdGlvbnM6IGl0IG11c3QgcmV0dXJuCi0vLyAtMSBvbiBmYWlsdXJlLCBhbmQgc2V0IGVycm5vIHRvIEVJTlRSIHdoZW4gaXQgaXMgaW50ZXJydXB0ZWQgYW5kCi0vLyBzaG91bGQgYmUgdHJpZWQgYWdhaW4uICBUaGUgbWFjcm8gZXhwYW5kcyB0byBhIGxvb3AgdGhhdCByZXBlYXRlZGx5Ci0vLyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYXMgbG9uZyBhcyBpdCBldmFsdWF0ZXMgdG8gLTEgYW5kIHNldHMKLS8vIGVycm5vIHRvIEVJTlRSLiAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIC0xIGJ1dCBlcnJubyBpcwotLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gRUlOVFIsIERlYXRoVGVzdEFib3J0IGlzIGNhbGxlZC4KLSMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZXhwcmVzc2lvbikgXAotICBkbyB7IFwKLSAgICBpbnQgZ3Rlc3RfcmV0dmFsOyBcCi0gICAgZG8geyBcCi0gICAgICBndGVzdF9yZXR2YWwgPSAoZXhwcmVzc2lvbik7IFwKLSAgICB9IHdoaWxlIChndGVzdF9yZXR2YWwgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOyBcCi0gICAgaWYgKGd0ZXN0X3JldHZhbCA9PSAtMSkgeyBcCi0gICAgICBEZWF0aFRlc3RBYm9ydCggXAotICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkNIRUNLIGZhaWxlZDogRmlsZSAiKSArIF9fRklMRV9fICsgIiwgbGluZSAiIFwKLSAgICAgICAgICArIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhfX0xJTkVfXykgKyAiOiAiIFwKLSAgICAgICAgICArICNleHByZXNzaW9uICsgIiAhPSAtMSIpOyBcCi0gICAgfSBcCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLS8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaW4gZXJybm8uCi1zdGQ6OnN0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gZXJybm8gPT0gMCA/ICIiIDogcG9zaXg6OlN0ckVycm9yKGVycm5vKTsKLX0KLQotLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIGRlYXRoIHRlc3QgcGFyZW50IHByb2Nlc3MgdG8gcmVhZCBhIGZhaWx1cmUKLS8vIG1lc3NhZ2UgZnJvbSB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGFuZCBsb2cgaXQgd2l0aCB0aGUgRkFUQUwKLS8vIHNldmVyaXR5LiBPbiBXaW5kb3dzLCB0aGUgbWVzc2FnZSBpcyByZWFkIGZyb20gYSBwaXBlIGhhbmRsZS4gT24gb3RoZXIKLS8vIHBsYXRmb3JtcywgaXQgaXMgcmVhZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLgotc3RhdGljIHZvaWQgRmFpbEZyb21JbnRlcm5hbEVycm9yKGludCBmZCkgewotICBNZXNzYWdlIGVycm9yOwotICBjaGFyIGJ1ZmZlclsyNTZdOwotICBpbnQgbnVtX3JlYWQ7Ci0KLSAgZG8gewotICAgIHdoaWxlICgobnVtX3JlYWQgPSBwb3NpeDo6UmVhZChmZCwgYnVmZmVyLCAyNTUpKSA+IDApIHsKLSAgICAgIGJ1ZmZlcltudW1fcmVhZF0gPSAnXDAnOwotICAgICAgZXJyb3IgPDwgYnVmZmVyOwotICAgIH0KLSAgfSB3aGlsZSAobnVtX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gIGlmIChudW1fcmVhZCA9PSAwKSB7Ci0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgZXJyb3IuR2V0U3RyaW5nKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgaW50IGxhc3RfZXJyb3IgPSBlcnJubzsKLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWF0aCB0ZXN0IGludGVybmFsOiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSA8PCAiIFsiIDw8IGxhc3RfZXJyb3IgPDwgIl0iOwotICB9Ci19Ci0KLS8vIERlYXRoIHRlc3QgY29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBydW5uaW5nIGRlYXRoIHRlc3QgY291bnQKLS8vIGZvciB0aGUgY3VycmVudCB0ZXN0LgotRGVhdGhUZXN0OjpEZWF0aFRlc3QoKSB7Ci0gIFRlc3RJbmZvKiBjb25zdCBpbmZvID0gR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIGlmIChpbmZvID09IE5VTEwpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiQ2Fubm90IHJ1biBhIGRlYXRoIHRlc3Qgb3V0c2lkZSBvZiBhIFRFU1Qgb3IgIgotICAgICAgICAgICAgICAgICAgICJURVNUX0YgY29uc3RydWN0Iik7Ci0gIH0KLX0KLQotLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGRlYXRoIHRlc3QgYnkgZGlzcGF0Y2hpbmcgdG8gdGhlIGN1cnJlbnQKLS8vIGRlYXRoIHRlc3QgZmFjdG9yeS4KLWJvb2wgRGVhdGhUZXN0OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSB7Ci0gIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+ZGVhdGhfdGVzdF9mYWN0b3J5KCktPkNyZWF0ZSgKLSAgICAgIHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUsIHRlc3QpOwotfQotCi1jb25zdCBjaGFyKiBEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkgewotICByZXR1cm4gbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfLmNfc3RyKCk7Ci19Ci0KLXZvaWQgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfID0gbWVzc2FnZTsKLX0KLQotc3RkOjpzdHJpbmcgRGVhdGhUZXN0OjpsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87Ci0KLS8vIFByb3ZpZGVzIGNyb3NzIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uIGZvciBzb21lIGRlYXRoIGZ1bmN0aW9uYWxpdHkuCi1jbGFzcyBEZWF0aFRlc3RJbXBsIDogcHVibGljIERlYXRoVGVzdCB7Ci0gcHJvdGVjdGVkOgotICBEZWF0aFRlc3RJbXBsKGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkKLSAgICAgIDogc3RhdGVtZW50XyhhX3N0YXRlbWVudCksCi0gICAgICAgIHJlZ2V4XyhhX3JlZ2V4KSwKLSAgICAgICAgc3Bhd25lZF8oZmFsc2UpLAotICAgICAgICBzdGF0dXNfKC0xKSwKLSAgICAgICAgb3V0Y29tZV8oSU5fUFJPR1JFU1MpLAotICAgICAgICByZWFkX2ZkXygtMSksCi0gICAgICAgIHdyaXRlX2ZkXygtMSkge30KLQotICAvLyByZWFkX2ZkXyBpcyBleHBlY3RlZCB0byBiZSBjbG9zZWQgYW5kIGNsZWFyZWQgYnkgYSBkZXJpdmVkIGNsYXNzLgotICB+RGVhdGhUZXN0SW1wbCgpIHsgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocmVhZF9mZF8gPT0gLTEpOyB9Ci0KLSAgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pOwotICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgc3RhdHVzX29rKTsKLQotICBjb25zdCBjaGFyKiBzdGF0ZW1lbnQoKSBjb25zdCB7IHJldHVybiBzdGF0ZW1lbnRfOyB9Ci0gIGNvbnN0IFJFKiByZWdleCgpIGNvbnN0IHsgcmV0dXJuIHJlZ2V4XzsgfQotICBib29sIHNwYXduZWQoKSBjb25zdCB7IHJldHVybiBzcGF3bmVkXzsgfQotICB2b2lkIHNldF9zcGF3bmVkKGJvb2wgaXNfc3Bhd25lZCkgeyBzcGF3bmVkXyA9IGlzX3NwYXduZWQ7IH0KLSAgaW50IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIHN0YXR1c187IH0KLSAgdm9pZCBzZXRfc3RhdHVzKGludCBhX3N0YXR1cykgeyBzdGF0dXNfID0gYV9zdGF0dXM7IH0KLSAgRGVhdGhUZXN0T3V0Y29tZSBvdXRjb21lKCkgY29uc3QgeyByZXR1cm4gb3V0Y29tZV87IH0KLSAgdm9pZCBzZXRfb3V0Y29tZShEZWF0aFRlc3RPdXRjb21lIGFuX291dGNvbWUpIHsgb3V0Y29tZV8gPSBhbl9vdXRjb21lOyB9Ci0gIGludCByZWFkX2ZkKCkgY29uc3QgeyByZXR1cm4gcmVhZF9mZF87IH0KLSAgdm9pZCBzZXRfcmVhZF9mZChpbnQgZmQpIHsgcmVhZF9mZF8gPSBmZDsgfQotICBpbnQgd3JpdGVfZmQoKSBjb25zdCB7IHJldHVybiB3cml0ZV9mZF87IH0KLSAgdm9pZCBzZXRfd3JpdGVfZmQoaW50IGZkKSB7IHdyaXRlX2ZkXyA9IGZkOyB9Ci0KLSAgLy8gQ2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBvbmx5LiBSZWFkcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIGRlYXRoCi0gIC8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KLSAgLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbgotICAvLyBjYXNlIG9mIHVuZXhwZWN0ZWQgY29kZXMuCi0gIHZvaWQgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGNvZGUgdGhpcyBvYmplY3QgaXMgdGVzdGluZy4gIFRoaXMgY2xhc3MKLSAgLy8gZG9lc24ndCBvd24gdGhpcyBzdHJpbmcgYW5kIHNob3VsZCBub3QgYXR0ZW1wdCB0byBkZWxldGUgaXQuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXRlbWVudF87Ci0gIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggdGVzdCBvdXRwdXQgbXVzdCBtYXRjaC4gIERlYXRoVGVzdEltcGwKLSAgLy8gZG9lc24ndCBvd24gdGhpcyBvYmplY3QgYW5kIHNob3VsZCBub3QgYXR0ZW1wdCB0byBkZWxldGUgaXQuCi0gIGNvbnN0IFJFKiBjb25zdCByZWdleF87Ci0gIC8vIFRydWUgaWYgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3Bhd25lZC4KLSAgYm9vbCBzcGF3bmVkXzsKLSAgLy8gVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLgotICBpbnQgc3RhdHVzXzsKLSAgLy8gSG93IHRoZSBkZWF0aCB0ZXN0IGNvbmNsdWRlZC4KLSAgRGVhdGhUZXN0T3V0Y29tZSBvdXRjb21lXzsKLSAgLy8gRGVzY3JpcHRvciB0byB0aGUgcmVhZCBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MuICBJdCBpcwotICAvLyBhbHdheXMgLTEgaW4gdGhlIGNoaWxkIHByb2Nlc3MuICBUaGUgY2hpbGQga2VlcHMgaXRzIHdyaXRlIGVuZCBvZiB0aGUKLSAgLy8gcGlwZSBpbiB3cml0ZV9mZF8uCi0gIGludCByZWFkX2ZkXzsKLSAgLy8gRGVzY3JpcHRvciB0byB0aGUgY2hpbGQncyB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIHBhcmVudCBwcm9jZXNzLgotICAvLyBJdCBpcyBhbHdheXMgLTEgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgVGhlIHBhcmVudCBrZWVwcyBpdHMgZW5kIG9mIHRoZQotICAvLyBwaXBlIGluIHJlYWRfZmRfLgotICBpbnQgd3JpdGVfZmRfOwotfTsKLQotLy8gQ2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBvbmx5LiBSZWFkcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIGRlYXRoCi0vLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfCi0vLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCi0vLyBjYXNlIG9mIHVuZXhwZWN0ZWQgY29kZXMuCi12b2lkIERlYXRoVGVzdEltcGw6OlJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCkgewotICBjaGFyIGZsYWc7Ci0gIGludCBieXRlc19yZWFkOwotCi0gIC8vIFRoZSByZWFkKCkgaGVyZSBibG9ja3MgdW50aWwgZGF0YSBpcyBhdmFpbGFibGUgKHNpZ25pZnlpbmcgdGhlCi0gIC8vIGZhaWx1cmUgb2YgdGhlIGRlYXRoIHRlc3QpIG9yIHVudGlsIHRoZSBwaXBlIGlzIGNsb3NlZCAoc2lnbmlmeWluZwotICAvLyBpdHMgc3VjY2VzcyksIHNvIGl0J3Mgb2theSB0byBjYWxsIHRoaXMgaW4gdGhlIHBhcmVudCBiZWZvcmUKLSAgLy8gdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGV4aXRlZC4KLSAgZG8gewotICAgIGJ5dGVzX3JlYWQgPSBwb3NpeDo6UmVhZChyZWFkX2ZkKCksICZmbGFnLCAxKTsKLSAgfSB3aGlsZSAoYnl0ZXNfcmVhZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgIHNldF9vdXRjb21lKERJRUQpOwotICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMSkgewotICAgIHN3aXRjaCAoZmxhZykgewotICAgICAgY2FzZSBrRGVhdGhUZXN0UmV0dXJuZWQ6Ci0gICAgICAgIHNldF9vdXRjb21lKFJFVFVSTkVEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtEZWF0aFRlc3RUaHJldzoKLSAgICAgICAgc2V0X291dGNvbWUoVEhSRVcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0RlYXRoVGVzdExpdmVkOgotICAgICAgICBzZXRfb3V0Y29tZShMSVZFRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrRGVhdGhUZXN0SW50ZXJuYWxFcnJvcjoKLSAgICAgICAgRmFpbEZyb21JbnRlcm5hbEVycm9yKHJlYWRfZmQoKSk7ICAvLyBEb2VzIG5vdCByZXR1cm4uCi0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyByZXBvcnRlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ1bmV4cGVjdGVkIHN0YXR1cyBieXRlICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZmxhZykgPDwgIikiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiUmVhZCBmcm9tIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOwotICB9Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OkNsb3NlKHJlYWRfZmQoKSkpOwotICBzZXRfcmVhZF9mZCgtMSk7Ci19Ci0KLS8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBjb2RlIHdoaWNoIHNob3VsZCBoYXZlIGV4aXRlZCwgZGlkbid0LgotLy8gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgotLy8gV3JpdGVzIGEgc3RhdHVzIGJ5dGUgdG8gdGhlIGNoaWxkJ3Mgc3RhdHVzIGZpbGUgZGVzY3JpcHRvciwgdGhlbgotLy8gY2FsbHMgX2V4aXQoMSkuCi12b2lkIERlYXRoVGVzdEltcGw6OkFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgewotICAvLyBUaGUgcGFyZW50IHByb2Nlc3MgY29uc2lkZXJzIHRoZSBkZWF0aCB0ZXN0IHRvIGJlIGEgZmFpbHVyZSBpZgotICAvLyBpdCBmaW5kcyBhbnkgZGF0YSBpbiBvdXIgcGlwZS4gIFNvLCBoZXJlIHdlIHdyaXRlIGEgc2luZ2xlIGZsYWcgYnl0ZQotICAvLyB0byB0aGUgcGlwZSwgdGhlbiBleGl0LgotICBjb25zdCBjaGFyIHN0YXR1c19jaCA9Ci0gICAgICByZWFzb24gPT0gVEVTVF9ESURfTk9UX0RJRSA/IGtEZWF0aFRlc3RMaXZlZCA6Ci0gICAgICByZWFzb24gPT0gVEVTVF9USFJFV19FWENFUFRJT04gPyBrRGVhdGhUZXN0VGhyZXcgOiBrRGVhdGhUZXN0UmV0dXJuZWQ7Ci0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6V3JpdGUod3JpdGVfZmQoKSwgJnN0YXR1c19jaCwgMSkpOwotICAvLyBXZSBhcmUgbGVha2luZyB0aGUgZGVzY3JpcHRvciBoZXJlIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMgKGkuZS4sCi0gIC8vIHdoZW4gYnVpbHQgYXMgV2luZG93cyBETEwpLCBkZXN0cnVjdG9ycyBvZiBnbG9iYWwgb2JqZWN0cyB3aWxsIHN0aWxsCi0gIC8vIHJ1biBhZnRlciBjYWxsaW5nIF9leGl0KCkuIE9uIHN1Y2ggc3lzdGVtcywgd3JpdGVfZmRfIHdpbGwgYmUKLSAgLy8gaW5kaXJlY3RseSBjbG9zZWQgZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBVbml0VGVzdEltcGwsIGNhdXNpbmcgZG91YmxlCi0gIC8vIGNsb3NlIGlmIGl0IGlzIGFsc28gY2xvc2VkIGhlcmUuIE9uIGRlYnVnIGNvbmZpZ3VyYXRpb25zLCBkb3VibGUgY2xvc2UKLSAgLy8gbWF5IGFzc2VydC4gQXMgdGhlcmUgYXJlIG5vIGluLXByb2Nlc3MgYnVmZmVycyB0byBmbHVzaCBoZXJlLCB3ZSBhcmUKLSAgLy8gcmVseWluZyBvbiB0aGUgT1MgdG8gY2xvc2UgdGhlIGRlc2NyaXB0b3IgYWZ0ZXIgdGhlIHByb2Nlc3MgdGVybWluYXRlcwotICAvLyB3aGVuIHRoZSBkZXN0cnVjdG9ycyBhcmUgbm90IHJ1bi4KLSAgX2V4aXQoMSk7ICAvLyBFeGl0cyB3L28gYW55IG5vcm1hbCBleGl0IGhvb2tzICh3ZSB3ZXJlIHN1cHBvc2VkIHRvIGNyYXNoKQotfQotCi0vLyBSZXR1cm5zIGFuIGluZGVudGVkIGNvcHkgb2Ygc3RkZXJyIG91dHB1dCBmb3IgYSBkZWF0aCB0ZXN0LgotLy8gVGhpcyBtYWtlcyBkaXN0aW5ndWlzaGluZyBkZWF0aCB0ZXN0IG91dHB1dCBsaW5lcyBmcm9tIHJlZ3VsYXIgbG9nIGxpbmVzCi0vLyBtdWNoIGVhc2llci4KLXN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdERlYXRoVGVzdE91dHB1dChjb25zdCA6OnN0ZDo6c3RyaW5nJiBvdXRwdXQpIHsKLSAgOjpzdGQ6OnN0cmluZyByZXQ7Ci0gIGZvciAoc2l6ZV90IGF0ID0gMDsgOyApIHsKLSAgICBjb25zdCBzaXplX3QgbGluZV9lbmQgPSBvdXRwdXQuZmluZCgnXG4nLCBhdCk7Ci0gICAgcmV0ICs9ICJbICBERUFUSCAgIF0gIjsKLSAgICBpZiAobGluZV9lbmQgPT0gOjpzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldCArPSBvdXRwdXQuc3Vic3RyKGF0LCBsaW5lX2VuZCArIDEgLSBhdCk7Ci0gICAgYXQgPSBsaW5lX2VuZCArIDE7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotLy8gQXNzZXNzZXMgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBhIGRlYXRoIHRlc3QsIHVzaW5nIGJvdGggcHJpdmF0ZQotLy8gbWVtYmVycyB3aGljaCBoYXZlIHByZXZpb3VzbHkgYmVlbiBzZXQsIGFuZCBvbmUgYXJndW1lbnQ6Ci0vLwotLy8gUHJpdmF0ZSBkYXRhIG1lbWJlcnM6Ci0vLyAgIG91dGNvbWU6ICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGhvdyB0aGUgZGVhdGggdGVzdAotLy8gICAgICAgICAgICAgY29uY2x1ZGVkOiBESUVELCBMSVZFRCwgVEhSRVcsIG9yIFJFVFVSTkVELiAgVGhlIGRlYXRoIHRlc3QKLS8vICAgICAgICAgICAgIGZhaWxzIGluIHRoZSBsYXR0ZXIgdGhyZWUgY2FzZXMuCi0vLyAgIHN0YXR1czogICBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuIE9uICpuaXgsIGl0IGlzIGluIHRoZQotLy8gICAgICAgICAgICAgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgd2FpdCgyKS4gT24gV2luZG93cywgdGhpcyBpcyB0aGUKLS8vICAgICAgICAgICAgIHZhbHVlIHN1cHBsaWVkIHRvIHRoZSBFeGl0UHJvY2VzcygpIEFQSSBvciBhIG51bWVyaWMgY29kZQotLy8gICAgICAgICAgICAgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHRlcm1pbmF0ZWQgdGhlIHByb2dyYW0uCi0vLyAgIHJlZ2V4OiAgICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgdG8gYmUgYXBwbGllZCB0bwotLy8gICAgICAgICAgICAgdGhlIHRlc3QncyBjYXB0dXJlZCBzdGFuZGFyZCBlcnJvciBvdXRwdXQ7IHRoZSBkZWF0aCB0ZXN0Ci0vLyAgICAgICAgICAgICBmYWlscyBpZiBpdCBkb2VzIG5vdCBtYXRjaC4KLS8vCi0vLyBBcmd1bWVudDoKLS8vICAgc3RhdHVzX29rOiB0cnVlIGlmIGV4aXRfc3RhdHVzIGlzIGFjY2VwdGFibGUgaW4gdGhlIGNvbnRleHQgb2YKLS8vICAgICAgICAgICAgICB0aGlzIHBhcnRpY3VsYXIgZGVhdGggdGVzdCwgd2hpY2ggZmFpbHMgaWYgaXQgaXMgZmFsc2UKLS8vCi0vLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbWV0LiAgT3RoZXJ3aXNlLCB0aGUKLS8vIGZpcnN0IGZhaWxpbmcgY29uZGl0aW9uLCBpbiB0aGUgb3JkZXIgZ2l2ZW4gYWJvdmUsIGlzIHRoZSBvbmUgdGhhdCBpcwotLy8gcmVwb3J0ZWQuIEFsc28gc2V0cyB0aGUgbGFzdCBkZWF0aCB0ZXN0IG1lc3NhZ2Ugc3RyaW5nLgotYm9vbCBEZWF0aFRlc3RJbXBsOjpQYXNzZWQoYm9vbCBzdGF0dXNfb2spIHsKLSAgaWYgKCFzcGF3bmVkKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2UgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwotCi0gIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICBNZXNzYWdlIGJ1ZmZlcjsKLQotICBidWZmZXIgPDwgIkRlYXRoIHRlc3Q6ICIgPDwgc3RhdGVtZW50KCkgPDwgIlxuIjsKLSAgc3dpdGNoIChvdXRjb21lKCkpIHsKLSAgICBjYXNlIExJVkVEOgotICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBmYWlsZWQgdG8gZGllLlxuIgotICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRIUkVXOgotICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiB0aHJldyBhbiBleGNlcHRpb24uXG4iCi0gICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVUVVJORUQ6Ci0gICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgotICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERJRUQ6Ci0gICAgICBpZiAoc3RhdHVzX29rKSB7Ci0gICAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlZCA9IFJFOjpQYXJ0aWFsTWF0Y2goZXJyb3JfbWVzc2FnZS5jX3N0cigpLCAqcmVnZXgoKSk7Ci0gICAgICAgIGlmIChtYXRjaGVkKSB7Ci0gICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBlcnJvci5cbiIKLSAgICAgICAgICAgICAgICAgPDwgIiAgRXhwZWN0ZWQ6ICIgPDwgcmVnZXgoKS0+cGF0dGVybigpIDw8ICJcbiIKLSAgICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBleGl0IGNvZGU6XG4iCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBFeGl0U3VtbWFyeShzdGF0dXMoKSkgPDwgIlxuIgotICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5fUFJPR1JFU1M6Ci0gICAgZGVmYXVsdDoKLSAgICAgIEdURVNUX0xPR18oRkFUQUwpCi0gICAgICAgICAgPDwgIkRlYXRoVGVzdDo6UGFzc2VkIHNvbWVob3cgY2FsbGVkIGJlZm9yZSBjb25jbHVzaW9uIG9mIHRlc3QiOwotICB9Ci0KLSAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoYnVmZmVyLkdldFN0cmluZygpKTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotLy8gV2luZG93c0RlYXRoVGVzdCBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzIG9uIFdpbmRvd3MuIER1ZSB0byB0aGUKLS8vIHNwZWNpZmljcyBvZiBzdGFydGluZyBuZXcgcHJvY2Vzc2VzIG9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIHRoZXJlIGFyZQotLy8gYWx3YXlzIHRocmVhZHNhZmUsIGFuZCBHb29nbGUgVGVzdCBjb25zaWRlcnMgdGhlCi0vLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9ZmFzdCBzZXR0aW5nIHRvIGJlIGVxdWl2YWxlbnQgdG8KLS8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT10aHJlYWRzYWZlIHRoZXJlLgotLy8KLS8vIEEgZmV3IGltcGxlbWVudGF0aW9uIG5vdGVzOiAgTGlrZSB0aGUgTGludXggdmVyc2lvbiwgdGhlIFdpbmRvd3MKLS8vIGltcGxlbWVudGF0aW9uIHVzZXMgcGlwZXMgZm9yIGNoaWxkLXRvLXBhcmVudCBjb21tdW5pY2F0aW9uLiBCdXQgZHVlIHRvCi0vLyB0aGUgc3BlY2lmaWNzIG9mIHBpcGVzIG9uIFdpbmRvd3MsIHNvbWUgZXh0cmEgc3RlcHMgYXJlIHJlcXVpcmVkOgotLy8KLS8vIDEuIFRoZSBwYXJlbnQgY3JlYXRlcyBhIGNvbW11bmljYXRpb24gcGlwZSBhbmQgc3RvcmVzIGhhbmRsZXMgdG8gYm90aAotLy8gICAgZW5kcyBvZiBpdC4KLS8vIDIuIFRoZSBwYXJlbnQgc3RhcnRzIHRoZSBjaGlsZCBhbmQgcHJvdmlkZXMgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24KLS8vICAgIG5lY2Vzc2FyeSB0byBhY3F1aXJlIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4KLS8vIDMuIFRoZSBjaGlsZCBhY3F1aXJlcyB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIGFuZCBzaWduYWxzIHRoZSBwYXJlbnQKLS8vICAgIHVzaW5nIGEgV2luZG93cyBldmVudC4KLS8vIDQuIE5vdyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb24gaXRzIHNpZGUuIElmCi0vLyAgICB0aGlzIGlzIGRvbmUgYmVmb3JlIHN0ZXAgMywgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBnb2VzIGRvd24gdG8KLS8vICAgIDAgYW5kIGl0IGlzIGRlc3Ryb3llZCwgcHJldmVudGluZyB0aGUgY2hpbGQgZnJvbSBhY3F1aXJpbmcgaXQuIFRoZQotLy8gICAgcGFyZW50IG5vdyBoYXMgdG8gcmVsZWFzZSBpdCwgb3IgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSByZWFkIGVuZCBvZgotLy8gICAgdGhlIHBpcGUgd2lsbCBub3QgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCi0vLyA1LiBUaGUgcGFyZW50IHJlYWRzIGNoaWxkJ3Mgb3V0cHV0IHRocm91Z2ggdGhlIHBpcGUgKG91dGNvbWUgY29kZSBhbmQKLS8vICAgIGFueSBwb3NzaWJsZSBlcnJvciBtZXNzYWdlcykgZnJvbSB0aGUgcGlwZSwgYW5kIGl0cyBzdGRlcnIgYW5kIHRoZW4KLS8vICAgIGRldGVybWluZXMgd2hldGhlciB0byBmYWlsIHRoZSB0ZXN0LgotLy8KLS8vIE5vdGU6IHRvIGRpc3Rpbmd1aXNoIFdpbjMyIEFQSSBjYWxscyBmcm9tIHRoZSBsb2NhbCBtZXRob2QgYW5kIGZ1bmN0aW9uCi0vLyBjYWxscywgdGhlIGZvcm1lciBhcmUgZXhwbGljaXRseSByZXNvbHZlZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLS8vCi1jbGFzcyBXaW5kb3dzRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgewotIHB1YmxpYzoKLSAgV2luZG93c0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBSRSogYV9yZWdleCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQotICAgICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHt9Ci0KLSAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCi0gIHZpcnR1YWwgaW50IFdhaXQoKTsKLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgotICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKLSAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCi0gIGNvbnN0IGludCBsaW5lXzsKLSAgLy8gSGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MuCi0gIEF1dG9IYW5kbGUgd3JpdGVfaGFuZGxlXzsKLSAgLy8gQ2hpbGQgcHJvY2VzcyBoYW5kbGUuCi0gIEF1dG9IYW5kbGUgY2hpbGRfaGFuZGxlXzsKLSAgLy8gRXZlbnQgdGhlIGNoaWxkIHByb2Nlc3MgdXNlcyB0byBzaWduYWwgdGhlIHBhcmVudCB0aGF0IGl0IGhhcwotICAvLyBhY3F1aXJlZCB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuIEFmdGVyIHNlZWluZyB0aGlzCi0gIC8vIGV2ZW50IHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgaXRzIG93biBoYW5kbGVzIHRvIG1ha2Ugc3VyZSBpdHMKLSAgLy8gUmVhZEZpbGUoKSBjYWxscyByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4KLSAgQXV0b0hhbmRsZSBldmVudF9oYW5kbGVfOwotfTsKLQotLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0Ci0vLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQotLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KLWludCBXaW5kb3dzRGVhdGhUZXN0OjpXYWl0KCkgewotICBpZiAoIXNwYXduZWQoKSkKLSAgICByZXR1cm4gMDsKLQotICAvLyBXYWl0IHVudGlsIHRoZSBjaGlsZCBlaXRoZXIgc2lnbmFscyB0aGF0IGl0IGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kCi0gIC8vIG9mIHRoZSBwaXBlIG9yIGl0IGRpZXMuCi0gIGNvbnN0IEhBTkRMRSB3YWl0X2hhbmRsZXNbMl0gPSB7IGNoaWxkX2hhbmRsZV8uR2V0KCksIGV2ZW50X2hhbmRsZV8uR2V0KCkgfTsKLSAgc3dpdGNoICg6OldhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9oYW5kbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIFdhaXRzIGZvciBhbnkgb2YgdGhlIGhhbmRsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSkgewotICAgIGNhc2UgV0FJVF9PQkpFQ1RfMDoKLSAgICBjYXNlIFdBSVRfT0JKRUNUXzAgKyAxOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZhbHNlKTsgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmUuCi0gIH0KLQotICAvLyBUaGUgY2hpbGQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb3IgZXhpdGVkLgotICAvLyBXZSByZWxlYXNlIHRoZSBoYW5kbGUgb24gb3VyIHNpZGUgYW5kIGNvbnRpbnVlLgotICB3cml0ZV9oYW5kbGVfLlJlc2V0KCk7Ci0gIGV2ZW50X2hhbmRsZV8uUmVzZXQoKTsKLQotICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOwotCi0gIC8vIFdhaXRzIGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0IGlmIGl0IGhhdmVuJ3QgYWxyZWFkeS4gVGhpcwotICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjaGlsZCBoYXMgYWxyZWFkeSBleGl0ZWQsIHJlZ2FyZGxlc3Mgb2YKLSAgLy8gd2hldGhlciBwcmV2aW91cyBjYWxscyB0byBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHN5bmNocm9uaXplZCBvbiB0aGlzCi0gIC8vIGhhbmRsZSBvciBub3QuCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAotICAgICAgV0FJVF9PQkpFQ1RfMCA9PSA6OldhaXRGb3JTaW5nbGVPYmplY3QoY2hpbGRfaGFuZGxlXy5HZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSk7Ci0gIERXT1JEIHN0YXR1c19jb2RlOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKLSAgICAgIDo6R2V0RXhpdENvZGVQcm9jZXNzKGNoaWxkX2hhbmRsZV8uR2V0KCksICZzdGF0dXNfY29kZSkgIT0gRkFMU0UpOwotICBjaGlsZF9oYW5kbGVfLlJlc2V0KCk7Ci0gIHNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXNfY29kZSkpOwotICByZXR1cm4gc3RhdHVzKCk7Ci19Ci0KLS8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgV2luZG93cyBkZWF0aCB0ZXN0LiAgSXQgY3JlYXRlcyBhIGNoaWxkCi0vLyBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHJ1biB0aGUKLS8vIGRlYXRoIHRlc3QuICBUaGUgY2hpbGQgcHJvY2VzcyBpcyBnaXZlbiB0aGUgLS1ndGVzdF9maWx0ZXIgYW5kCi0vLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHN1Y2ggdGhhdCBpdCBrbm93cyB0byBydW4gdGhlCi0vLyBjdXJyZW50IGRlYXRoIHRlc3Qgb25seS4KLURlYXRoVGVzdDo6VGVzdFJvbGUgV2luZG93c0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKLSAgY29uc3QgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9Ci0gICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7Ci0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOwotCi0gIGlmIChmbGFnICE9IE5VTEwpIHsKLSAgICAvLyBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIGhhcyBwZXJmb3JtZWQgYWxsIHRoZSBuZWNlc3NhcnkKLSAgICAvLyBwcm9jZXNzaW5nLgotICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKLSAgICByZXR1cm4gRVhFQ1VURV9URVNUOwotICB9Ci0KLSAgLy8gV2luZG93c0RlYXRoVGVzdCB1c2VzIGFuIGFub255bW91cyBwaXBlIHRvIGNvbW11bmljYXRlIHJlc3VsdHMgb2YKLSAgLy8gYSBkZWF0aCB0ZXN0LgotICBTRUNVUklUWV9BVFRSSUJVVEVTIGhhbmRsZXNfYXJlX2luaGVyaXRhYmxlID0gewotICAgIHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwgTlVMTCwgVFJVRSB9OwotICBIQU5ETEUgcmVhZF9oYW5kbGUsIHdyaXRlX2hhbmRsZTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCi0gICAgICA6OkNyZWF0ZVBpcGUoJnJlYWRfaGFuZGxlLCAmd3JpdGVfaGFuZGxlLCAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgMCkgIC8vIERlZmF1bHQgYnVmZmVyIHNpemUuCi0gICAgICAhPSBGQUxTRSk7Ci0gIHNldF9yZWFkX2ZkKDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHJlYWRfaGFuZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFkpKTsKLSAgd3JpdGVfaGFuZGxlXy5SZXNldCh3cml0ZV9oYW5kbGUpOwotICBldmVudF9oYW5kbGVfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoCi0gICAgICAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCi0gICAgICBUUlVFLCAgICAvLyBUaGUgZXZlbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIG5vbi1zaWduYWxlZCBzdGF0ZS4KLSAgICAgIEZBTFNFLCAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIGlzIG5vbi1zaWduYWxsZWQuCi0gICAgICBOVUxMKSk7ICAvLyBUaGUgZXZlbiBpcyB1bm5hbWVkLgotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhldmVudF9oYW5kbGVfLkdldCgpICE9IE5VTEwpOwotICBjb25zdCBzdGQ6OnN0cmluZyBmaWx0ZXJfZmxhZyA9Ci0gICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtGaWx0ZXJGbGFnICsgIj0iICsKLSAgICAgIGluZm8tPnRlc3RfY2FzZV9uYW1lKCkgKyAiLiIgKyBpbmZvLT5uYW1lKCk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGludGVybmFsX2ZsYWcgPQotICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnICsKLSAgICAgICI9IiArIGZpbGVfICsgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmVfKSArICJ8IiArCi0gICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkgKyAifCIgKwotICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oOjpHZXRDdXJyZW50UHJvY2Vzc0lkKCkpKSArCi0gICAgICAvLyBzaXplX3QgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHBvaW50ZXJzIG9uIGJvdGggMzItYml0IGFuZCA2NC1iaXQKLSAgICAgIC8vIFdpbmRvd3MgcGxhdGZvcm1zLgotICAgICAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS90Y3hmMWR3Ni5hc3B4LgotICAgICAgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih3cml0ZV9oYW5kbGUpKSArCi0gICAgICAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGV2ZW50X2hhbmRsZV8uR2V0KCkpKTsKLQotICBjaGFyIGV4ZWN1dGFibGVfcGF0aFtfTUFYX1BBVEggKyAxXTsgIC8vIE5PTElOVAotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKLSAgICAgIF9NQVhfUEFUSCArIDEgIT0gOjpHZXRNb2R1bGVGaWxlTmFtZUEoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTUFYX1BBVEgpKTsKLQotICBzdGQ6OnN0cmluZyBjb21tYW5kX2xpbmUgPQotICAgICAgc3RkOjpzdHJpbmcoOjpHZXRDb21tYW5kTGluZUEoKSkgKyAiICIgKyBmaWx0ZXJfZmxhZyArICIgXCIiICsKLSAgICAgIGludGVybmFsX2ZsYWcgKyAiXCIiOwotCi0gIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKLQotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIC8vIEZsdXNoIHRoZSBsb2cgYnVmZmVycyBzaW5jZSB0aGUgbG9nIHN0cmVhbXMgYXJlIHNoYXJlZCB3aXRoIHRoZSBjaGlsZC4KLSAgRmx1c2hJbmZvTG9nKCk7Ci0KLSAgLy8gVGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBzaGFyZSB0aGUgc3RhbmRhcmQgaGFuZGxlcyB3aXRoIHRoZSBwYXJlbnQuCi0gIFNUQVJUVVBJTkZPQSBzdGFydHVwX2luZm87Ci0gIG1lbXNldCgmc3RhcnR1cF9pbmZvLCAwLCBzaXplb2YoU1RBUlRVUElORk8pKTsKLSAgc3RhcnR1cF9pbmZvLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU1RESEFORExFUzsKLSAgc3RhcnR1cF9pbmZvLmhTdGRJbnB1dCA9IDo6R2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOwotICBzdGFydHVwX2luZm8uaFN0ZE91dHB1dCA9IDo6R2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKLSAgc3RhcnR1cF9pbmZvLmhTdGRFcnJvciA9IDo6R2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOwotCi0gIFBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc19pbmZvOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyg6OkNyZWF0ZVByb2Nlc3NBKAotICAgICAgZXhlY3V0YWJsZV9wYXRoLAotICAgICAgY29uc3RfY2FzdDxjaGFyKj4oY29tbWFuZF9saW5lLmNfc3RyKCkpLAotICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHByb2Nlc3MgaGFuZGxlIGlzIG5vdCBpbmhlcml0YWJsZS4KLSAgICAgIE5VTEwsICAgLy8gUmV0dW5lZCB0aHJlYWQgaGFuZGxlIGlzIG5vdCBpbmhlcml0YWJsZS4KLSAgICAgIFRSVUUsICAgLy8gQ2hpbGQgaW5oZXJpdHMgYWxsIGluaGVyaXRhYmxlIGhhbmRsZXMgKGZvciB3cml0ZV9oYW5kbGVfKS4KLSAgICAgIDB4MCwgICAgLy8gRGVmYXVsdCBjcmVhdGlvbiBmbGFncy4KLSAgICAgIE5VTEwsICAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZW52aXJvbm1lbnQuCi0gICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSwKLSAgICAgICZzdGFydHVwX2luZm8sCi0gICAgICAmcHJvY2Vzc19pbmZvKSAhPSBGQUxTRSk7Ci0gIGNoaWxkX2hhbmRsZV8uUmVzZXQocHJvY2Vzc19pbmZvLmhQcm9jZXNzKTsKLSAgOjpDbG9zZUhhbmRsZShwcm9jZXNzX2luZm8uaFRocmVhZCk7Ci0gIHNldF9zcGF3bmVkKHRydWUpOwotICByZXR1cm4gT1ZFUlNFRV9URVNUOwotfQotIyBlbHNlICAvLyBXZSBhcmUgbm90IG9uIFdpbmRvd3MuCi0KLS8vIEZvcmtpbmdEZWF0aFRlc3QgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciBtb3N0IG9mIHRoZSBhYnN0cmFjdAotLy8gbWV0aG9kcyBvZiB0aGUgRGVhdGhUZXN0IGludGVyZmFjZS4gIE9ubHkgdGhlIEFzc3VtZVJvbGUgbWV0aG9kIGlzCi0vLyBsZWZ0IHVuZGVmaW5lZC4KLWNsYXNzIEZvcmtpbmdEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0SW1wbCB7Ci0gcHVibGljOgotICBGb3JraW5nRGVhdGhUZXN0KGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4KTsKLQotICAvLyBBbGwgb2YgdGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIERlYXRoVGVzdC4KLSAgdmlydHVhbCBpbnQgV2FpdCgpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIHNldF9jaGlsZF9waWQocGlkX3QgY2hpbGRfcGlkKSB7IGNoaWxkX3BpZF8gPSBjaGlsZF9waWQ7IH0KLQotIHByaXZhdGU6Ci0gIC8vIFBJRCBvZiBjaGlsZCBwcm9jZXNzIGR1cmluZyBkZWF0aCB0ZXN0OyAwIGluIHRoZSBjaGlsZCBwcm9jZXNzIGl0c2VsZi4KLSAgcGlkX3QgY2hpbGRfcGlkXzsKLX07Ci0KLS8vIENvbnN0cnVjdHMgYSBGb3JraW5nRGVhdGhUZXN0LgotRm9ya2luZ0RlYXRoVGVzdDo6Rm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpCi0gICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwKLSAgICAgIGNoaWxkX3BpZF8oLTEpIHt9Ci0KLS8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdAotLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUKLS8vIG91dGNvbWUgZGF0YSBtZW1iZXIuCi1pbnQgRm9ya2luZ0RlYXRoVGVzdDo6V2FpdCgpIHsKLSAgaWYgKCFzcGF3bmVkKCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKLQotICBpbnQgc3RhdHVzX3ZhbHVlOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHdhaXRwaWQoY2hpbGRfcGlkXywgJnN0YXR1c192YWx1ZSwgMCkpOwotICBzZXRfc3RhdHVzKHN0YXR1c192YWx1ZSk7Ci0gIHJldHVybiBzdGF0dXNfdmFsdWU7Ci19Ci0KLS8vIEEgY29uY3JldGUgZGVhdGggdGVzdCBjbGFzcyB0aGF0IGZvcmtzLCB0aGVuIGltbWVkaWF0ZWx5IHJ1bnMgdGhlIHRlc3QKLS8vIGluIHRoZSBjaGlsZCBwcm9jZXNzLgotY2xhc3MgTm9FeGVjRGVhdGhUZXN0IDogcHVibGljIEZvcmtpbmdEZWF0aFRlc3QgewotIHB1YmxpYzoKLSAgTm9FeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkgOgotICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCkgeyB9Ci0gIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOwotfTsKLQotLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBmb3JrLWFuZC1ydW4gZGVhdGggdGVzdC4gIEl0IGltcGxlbWVudHMgYQotLy8gc3RyYWlnaHRmb3J3YXJkIGZvcmssIHdpdGggYSBzaW1wbGUgcGlwZSB0byB0cmFuc21pdCB0aGUgc3RhdHVzIGJ5dGUuCi1EZWF0aFRlc3Q6OlRlc3RSb2xlIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKLSAgY29uc3Qgc2l6ZV90IHRocmVhZF9jb3VudCA9IEdldFRocmVhZENvdW50KCk7Ci0gIGlmICh0aHJlYWRfY291bnQgIT0gMSkgewotICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgRGVhdGhUZXN0VGhyZWFkV2FybmluZyh0aHJlYWRfY291bnQpOwotICB9Ci0KLSAgaW50IHBpcGVfZmRbMl07Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOwotCi0gIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKLSAgQ2FwdHVyZVN0ZGVycigpOwotICAvLyBXaGVuIHdlIGZvcmsgdGhlIHByb2Nlc3MgYmVsb3csIHRoZSBsb2cgZmlsZSBidWZmZXJzIGFyZSBjb3BpZWQsIGJ1dCB0aGUKLSAgLy8gZmlsZSBkZXNjcmlwdG9ycyBhcmUgc2hhcmVkLiAgV2UgZmx1c2ggYWxsIGxvZyBmaWxlcyBoZXJlIHNvIHRoYXQgY2xvc2luZwotICAvLyB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpbiB0aGUgY2hpbGQgcHJvY2VzcyBkb2Vzbid0IHRocm93IG9mZiB0aGUKLSAgLy8gc3luY2hyb25pemF0aW9uIGJldHdlZW4gZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMgaW4gdGhlIHBhcmVudCBwcm9jZXNzLgotICAvLyBUaGlzIGlzIGFzIGNsb3NlIHRvIHRoZSBmb3JrIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gY2FzZQotICAvLyB0aGVyZSBhcmUgbXVsdGlwbGUgdGhyZWFkcyBydW5uaW5nIGJlZm9yZSB0aGUgZGVhdGggdGVzdCwgYW5kIGFub3RoZXIKLSAgLy8gdGhyZWFkIHdyaXRlcyB0byB0aGUgbG9nIGZpbGUuCi0gIEZsdXNoSW5mb0xvZygpOwotCi0gIGNvbnN0IHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY2hpbGRfcGlkICE9IC0xKTsKLSAgc2V0X2NoaWxkX3BpZChjaGlsZF9waWQpOwotICBpZiAoY2hpbGRfcGlkID09IDApIHsKLSAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMF0pKTsKLSAgICBzZXRfd3JpdGVfZmQocGlwZV9mZFsxXSk7Ci0gICAgLy8gUmVkaXJlY3RzIGFsbCBsb2dnaW5nIHRvIHN0ZGVyciBpbiB0aGUgY2hpbGQgcHJvY2VzcyB0byBwcmV2ZW50Ci0gICAgLy8gY29uY3VycmVudCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlcy4gIFdlIGNhcHR1cmUgc3RkZXJyIGluIHRoZSBwYXJlbnQKLSAgICAvLyBwcm9jZXNzIGFuZCBhcHBlbmQgdGhlIGNoaWxkIHByb2Nlc3MnIG91dHB1dCB0byBhIGxvZy4KLSAgICBMb2dUb1N0ZGVycigpOwotICAgIC8vIEV2ZW50IGZvcndhcmRpbmcgdG8gdGhlIGxpc3RlbmVycyBvZiBldmVudCBsaXN0ZW5lciBBUEkgbXVzaCBiZSBzaHV0Ci0gICAgLy8gZG93biBpbiBkZWF0aCB0ZXN0IHN1YnByb2Nlc3Nlcy4KLSAgICBHZXRVbml0VGVzdEltcGwoKS0+bGlzdGVuZXJzKCktPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7Ci0gICAgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSB0cnVlOwotICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7Ci0gIH0gZWxzZSB7Ci0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzFdKSk7Ci0gICAgc2V0X3JlYWRfZmQocGlwZV9mZFswXSk7Ci0gICAgc2V0X3NwYXduZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKLSAgfQotfQotCi0vLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcyBhbmQgcmUtZXhlY3V0ZXMgdGhlIG1haW4KLS8vIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCB3aXRoIGNvbW1hbmQtbGluZSBmbGFncyBzZXQgdGhhdCBjYXVzZQotLy8gb25seSB0aGlzIHNwZWNpZmljIGRlYXRoIHRlc3QgdG8gYmUgcnVuLgotY2xhc3MgRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKLSBwdWJsaWM6Ci0gIEV4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4LAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSA6Ci0gICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHsgfQotICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKLSBwcml2YXRlOgotICBzdGF0aWMgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPgotICBHZXRBcmd2c0ZvckRlYXRoVGVzdENoaWxkUHJvY2VzcygpIHsKLSAgICA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGFyZ3MgPSBHZXRJbmplY3RhYmxlQXJndnMoKTsKLSMgIGlmIGRlZmluZWQoR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DT01NQU5EX0xJTkVfQVJHU18pCi0gICAgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBleHRyYV9hcmdzID0KLSAgICAgICAgR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DT01NQU5EX0xJTkVfQVJHU18oKTsKLSAgICBhcmdzLmluc2VydChhcmdzLmVuZCgpLCBleHRyYV9hcmdzLmJlZ2luKCksIGV4dHJhX2FyZ3MuZW5kKCkpOwotIyAgZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DT01NQU5EX0xJTkVfQVJHU18pCi0gICAgcmV0dXJuIGFyZ3M7Ci0gIH0KLSAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KLSAgY29uc3QgY2hhciogY29uc3QgZmlsZV87Ci0gIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgotICBjb25zdCBpbnQgbGluZV87Ci19OwotCi0vLyBVdGlsaXR5IGNsYXNzIGZvciBhY2N1bXVsYXRpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KLWNsYXNzIEFyZ3VtZW50cyB7Ci0gcHVibGljOgotICBBcmd1bWVudHMoKSB7Ci0gICAgYXJnc18ucHVzaF9iYWNrKE5VTEwpOwotICB9Ci0KLSAgfkFyZ3VtZW50cygpIHsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7Ci0gICAgICAgICArK2kpIHsKLSAgICAgIGZyZWUoKmkpOwotICAgIH0KLSAgfQotICB2b2lkIEFkZEFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZ3VtZW50KSB7Ci0gICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KLSAgdm9pZCBBZGRBcmd1bWVudHMoY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHI+JiBhcmd1bWVudHMpIHsKLSAgICBmb3IgKHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8U3RyPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3VtZW50cy5iZWdpbigpOwotICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7Ci0gICAgICAgICArK2kpIHsKLSAgICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoaS0+Y19zdHIoKSkpOwotICAgIH0KLSAgfQotICBjaGFyKiBjb25zdCogQXJndigpIHsKLSAgICByZXR1cm4gJmFyZ3NfWzBdOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxjaGFyKj4gYXJnc187Ci19OwotCi0vLyBBIHN0cnVjdCB0aGF0IGVuY29tcGFzc2VzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYQotLy8gdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IHByb2Nlc3MuCi1zdHJ1Y3QgRXhlY0RlYXRoVGVzdEFyZ3MgewotICBjaGFyKiBjb25zdCogYXJndjsgIC8vIENvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjaGlsZCdzIGNhbGwgdG8gZXhlYwotICBpbnQgY2xvc2VfZmQ7ICAgICAgIC8vIEZpbGUgZGVzY3JpcHRvciB0byBjbG9zZTsgdGhlIHJlYWQgZW5kIG9mIGEgcGlwZQotfTsKLQotIyAgaWYgR1RFU1RfT1NfTUFDCi1pbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7Ci0gIC8vIFdoZW4gR29vZ2xlIFRlc3QgaXMgYnVpbHQgYXMgYSBmcmFtZXdvcmsgb24gTWFjT1MgWCwgdGhlIGVudmlyb24gdmFyaWFibGUKLSAgLy8gaXMgdW5hdmFpbGFibGUuIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbiAobWFuIGVudmlyb24pIHJlY29tbWVuZHMgdXNpbmcKLSAgLy8gX05TR2V0RW52aXJvbigpIGluc3RlYWQuCi0gIHJldHVybiAqX05TR2V0RW52aXJvbigpOwotfQotIyAgZWxzZQotLy8gU29tZSBQT1NJWCBwbGF0Zm9ybXMgZXhwZWN0IHlvdSB0byBkZWNsYXJlIGVudmlyb24uIGV4dGVybiAiQyIgbWFrZXMKLS8vIGl0IHJlc2lkZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLWV4dGVybiAiQyIgY2hhcioqIGVudmlyb247Ci1pbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7IHJldHVybiBlbnZpcm9uOyB9Ci0jICBlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCi0KLSMgIGlmICFHVEVTVF9PU19RTlgKLS8vIFRoZSBtYWluIGZ1bmN0aW9uIGZvciBhIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgotLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZAotLy8gYW55IHBvdGVudGlhbGx5IHVuc2FmZSBvcGVyYXRpb25zIGxpa2UgbWFsbG9jIG9yIGxpYmMgZnVuY3Rpb25zLgotc3RhdGljIGludCBFeGVjRGVhdGhUZXN0Q2hpbGRNYWluKHZvaWQqIGNoaWxkX2FyZykgewotICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShhcmdzLT5jbG9zZV9mZCkpOwotCi0gIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlCi0gIC8vIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQuICBUaGVyZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBvcmlnaW5hbAotICAvLyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC4KLSAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0KLSAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpOwotICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgY2hkaXIoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLgotICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImNoZGlyKFwiIikgKyBvcmlnaW5hbF9kaXIgKyAiXCIpIGZhaWxlZDogIiArCi0gICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBleGVjdmUoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLiAgV2UKLSAgLy8gY2Fubm90IHVzZSBleGVjdnAoKSBhcyBpdCdzIGEgbGliYyBmdW5jdGlvbiBhbmQgdGh1cyBwb3RlbnRpYWxseQotICAvLyB1bnNhZmUuICBTaW5jZSBleGVjdmUoKSBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSCwgdGhlIHVzZXIgbXVzdAotICAvLyBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSB2YWxpZCBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3QKLSAgLy8gb25lIHBhdGggc2VwYXJhdG9yLgotICBleGVjdmUoYXJncy0+YXJndlswXSwgYXJncy0+YXJndiwgR2V0RW52aXJvbigpKTsKLSAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImV4ZWN2ZSgiKSArIGFyZ3MtPmFyZ3ZbMF0gKyAiLCAuLi4pIGluICIgKwotICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kaXIgKyAiIGZhaWxlZDogIiArCi0gICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOwotICByZXR1cm4gRVhJVF9GQUlMVVJFOwotfQotIyAgZW5kaWYgIC8vICFHVEVTVF9PU19RTlgKLQotLy8gVHdvIHV0aWxpdHkgcm91dGluZXMgdGhhdCB0b2dldGhlciBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiB0aGUgc3RhY2sKLS8vIGdyb3dzLgotLy8gVGhpcyBjb3VsZCBiZSBhY2NvbXBsaXNoZWQgbW9yZSBlbGVnYW50bHkgYnkgYSBzaW5nbGUgcmVjdXJzaXZlCi0vLyBmdW5jdGlvbiwgYnV0IHdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgdW5saWtlbHkgcG9zc2liaWxpdHkgb2YKLS8vIGEgc21hcnQgY29tcGlsZXIgb3B0aW1pemluZyB0aGUgcmVjdXJzaW9uIGF3YXkuCi0vLwotLy8gR1RFU1RfTk9fSU5MSU5FXyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IEdDQyA0LjYgZnJvbSBpbmxpbmluZwotLy8gU3RhY2tMb3dlclRoYW5BZGRyZXNzIGludG8gU3RhY2tHcm93c0Rvd24sIHdoaWNoIHRoZW4gZG9lc24ndCBnaXZlCi0vLyBjb3JyZWN0IGFuc3dlci4KLXZvaWQgU3RhY2tMb3dlclRoYW5BZGRyZXNzKGNvbnN0IHZvaWQqIHB0ciwgYm9vbCogcmVzdWx0KSBHVEVTVF9OT19JTkxJTkVfOwotdm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIHsKLSAgaW50IGR1bW15OwotICAqcmVzdWx0ID0gKCZkdW1teSA8IHB0cik7Ci19Ci0KLS8vIE1ha2Ugc3VyZSBBZGRyZXNzU2FuaXRpemVyIGRvZXMgbm90IHRhbXBlciB3aXRoIHRoZSBzdGFjayBoZXJlLgotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCi1ib29sIFN0YWNrR3Jvd3NEb3duKCkgewotICBpbnQgZHVtbXk7Ci0gIGJvb2wgcmVzdWx0OwotICBTdGFja0xvd2VyVGhhbkFkZHJlc3MoJmR1bW15LCAmcmVzdWx0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB3aXRoIHRoZSBzYW1lIGV4ZWN1dGFibGUgYXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBpbgotLy8gYSB0aHJlYWQtc2FmZSBtYW5uZXIgYW5kIGluc3RydWN0cyBpdCB0byBydW4gdGhlIGRlYXRoIHRlc3QuICBUaGUKLS8vIGltcGxlbWVudGF0aW9uIHVzZXMgZm9yaygyKSArIGV4ZWMuICBPbiBzeXN0ZW1zIHdoZXJlIGNsb25lKDIpIGlzCi0vLyBhdmFpbGFibGUsIGl0IGlzIHVzZWQgaW5zdGVhZCwgYmVpbmcgc2xpZ2h0bHkgbW9yZSB0aHJlYWQtc2FmZS4gIE9uIFFOWCwKLS8vIGZvcmsgc3VwcG9ydHMgb25seSBzaW5nbGUtdGhyZWFkZWQgZW52aXJvbm1lbnRzLCBzbyB0aGlzIGZ1bmN0aW9uIHVzZXMKLS8vIHNwYXduKDIpIHRoZXJlIGluc3RlYWQuICBUaGUgZnVuY3Rpb24gZGllcyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYKLS8vIGFueXRoaW5nIGdvZXMgd3JvbmcuCi1zdGF0aWMgcGlkX3QgRXhlY0RlYXRoVGVzdFNwYXduQ2hpbGQoY2hhciogY29uc3QqIGFyZ3YsIGludCBjbG9zZV9mZCkgewotICBFeGVjRGVhdGhUZXN0QXJncyBhcmdzID0geyBhcmd2LCBjbG9zZV9mZCB9OwotICBwaWRfdCBjaGlsZF9waWQgPSAtMTsKLQotIyAgaWYgR1RFU1RfT1NfUU5YCi0gIC8vIE9idGFpbnMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBzZXRzIGl0IHRvIGJlIGNsb3NlZCBpbiB0aGUgY2hpbGQKLSAgLy8gcHJvY2Vzcy4KLSAgY29uc3QgaW50IGN3ZF9mZCA9IG9wZW4oIi4iLCBPX1JET05MWSk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGN3ZF9mZCAhPSAtMSk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZmNudGwoY3dkX2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSk7Ci0gIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlCi0gIC8vIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQuICBUaGVyZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBvcmlnaW5hbAotICAvLyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC4KLSAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0KLSAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpOwotICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgY2hkaXIoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLgotICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImNoZGlyKFwiIikgKyBvcmlnaW5hbF9kaXIgKyAiXCIpIGZhaWxlZDogIiArCi0gICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIGludCBmZF9mbGFnczsKLSAgLy8gU2V0IGNsb3NlX2ZkIHRvIGJlIGNsb3NlZCBhZnRlciBzcGF3bi4KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmZF9mbGFncyA9IGZjbnRsKGNsb3NlX2ZkLCBGX0dFVEZEKSk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZmNudGwoY2xvc2VfZmQsIEZfU0VURkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfZmxhZ3MgfCBGRF9DTE9FWEVDKSk7Ci0gIHN0cnVjdCBpbmhlcml0YW5jZSBpbmhlcml0ID0gezB9OwotICAvLyBzcGF3biBpcyBhIHN5c3RlbSBjYWxsLgotICBjaGlsZF9waWQgPSBzcGF3bihhcmdzLmFyZ3ZbMF0sIDAsIE5VTEwsICZpbmhlcml0LCBhcmdzLmFyZ3YsIEdldEVudmlyb24oKSk7Ci0gIC8vIFJlc3RvcmVzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY2hkaXIoY3dkX2ZkKSAhPSAtMSk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UoY3dkX2ZkKSk7Ci0KLSMgIGVsc2UgICAvLyBHVEVTVF9PU19RTlgKLSMgICBpZiBHVEVTVF9PU19MSU5VWAotICAvLyBXaGVuIGEgU0lHUFJPRiBzaWduYWwgaXMgcmVjZWl2ZWQgd2hpbGUgZm9yaygpIG9yIGNsb25lKCkgYXJlIGV4ZWN1dGluZywKLSAgLy8gdGhlIHByb2Nlc3MgbWF5IGhhbmcuIFRvIGF2b2lkIHRoaXMsIHdlIGlnbm9yZSBTSUdQUk9GIGhlcmUgYW5kIHJlLWVuYWJsZQotICAvLyBpdCBhZnRlciB0aGUgY2FsbCB0byBmb3JrKCkvY2xvbmUoKSBpcyBjb21wbGV0ZS4KLSAgc3RydWN0IHNpZ2FjdGlvbiBzYXZlZF9zaWdwcm9mX2FjdGlvbjsKLSAgc3RydWN0IHNpZ2FjdGlvbiBpZ25vcmVfc2lncHJvZl9hY3Rpb247Ci0gIG1lbXNldCgmaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLCAwLCBzaXplb2YoaWdub3JlX3NpZ3Byb2ZfYWN0aW9uKSk7Ci0gIHNpZ2VtcHR5c2V0KCZpZ25vcmVfc2lncHJvZl9hY3Rpb24uc2FfbWFzayk7Ci0gIGlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9oYW5kbGVyID0gU0lHX0lHTjsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhzaWdhY3Rpb24oCi0gICAgICBTSUdQUk9GLCAmaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLCAmc2F2ZWRfc2lncHJvZl9hY3Rpb24pKTsKLSMgICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKLQotIyAgIGlmIEdURVNUX0hBU19DTE9ORQotICBjb25zdCBib29sIHVzZV9mb3JrID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKLQotICBpZiAoIXVzZV9mb3JrKSB7Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgc3RhY2tfZ3Jvd3NfZG93biA9IFN0YWNrR3Jvd3NEb3duKCk7Ci0gICAgY29uc3Qgc2l6ZV90IHN0YWNrX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwotICAgIC8vIE1NQVBfQU5PTllNT1VTIGlzIG5vdCBkZWZpbmVkIG9uIE1hYywgc28gd2UgdXNlIE1BUF9BTk9OIGluc3RlYWQuCi0gICAgdm9pZCogY29uc3Qgc3RhY2sgPSBtbWFwKE5VTEwsIHN0YWNrX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9BTk9OIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKLSAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhzdGFjayAhPSBNQVBfRkFJTEVEKTsKLQotICAgIC8vIE1heGltdW0gc3RhY2sgYWxpZ25tZW50IGluIGJ5dGVzOiAgRm9yIGEgZG93bndhcmQtZ3Jvd2luZyBzdGFjaywgdGhpcwotICAgIC8vIGFtb3VudCBpcyBzdWJ0cmFjdGVkIGZyb20gc2l6ZSBvZiB0aGUgc3RhY2sgc3BhY2UgdG8gZ2V0IGFuIGFkZHJlc3MKLSAgICAvLyB0aGF0IGlzIHdpdGhpbiB0aGUgc3RhY2sgc3BhY2UgYW5kIGlzIGFsaWduZWQgb24gYWxsIHN5c3RlbXMgd2UgY2FyZQotICAgIC8vIGFib3V0LiAgQXMgZmFyIGFzIEkga25vdyB0aGVyZSBpcyBubyBBQkkgd2l0aCBzdGFjayBhbGlnbm1lbnQgZ3JlYXRlcgotICAgIC8vIHRoYW4gNjQuICBXZSBhc3N1bWUgc3RhY2sgYW5kIHN0YWNrX3NpemUgYWxyZWFkeSBoYXZlIGFsaWdubWVudCBvZgotICAgIC8vIGtNYXhTdGFja0FsaWdubWVudC4KLSAgICBjb25zdCBzaXplX3Qga01heFN0YWNrQWxpZ25tZW50ID0gNjQ7Ci0gICAgdm9pZCogY29uc3Qgc3RhY2tfdG9wID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KHN0YWNrKSArCi0gICAgICAgICAgICAoc3RhY2tfZ3Jvd3NfZG93biA/IHN0YWNrX3NpemUgLSBrTWF4U3RhY2tBbGlnbm1lbnQgOiAwKTsKLSAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhzdGFja19zaXplID4ga01heFN0YWNrQWxpZ25tZW50ICYmCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHN0YWNrX3RvcCkgJSBrTWF4U3RhY2tBbGlnbm1lbnQgPT0gMCk7Ci0KLSAgICBjaGlsZF9waWQgPSBjbG9uZSgmRXhlY0RlYXRoVGVzdENoaWxkTWFpbiwgc3RhY2tfdG9wLCBTSUdDSExELCAmYXJncyk7Ci0KLSAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhtdW5tYXAoc3RhY2ssIHN0YWNrX3NpemUpICE9IC0xKTsKLSAgfQotIyAgIGVsc2UKLSAgY29uc3QgYm9vbCB1c2VfZm9yayA9IHRydWU7Ci0jICAgZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORQotCi0gIGlmICh1c2VfZm9yayAmJiAoY2hpbGRfcGlkID0gZm9yaygpKSA9PSAwKSB7Ci0gICAgICBFeGVjRGVhdGhUZXN0Q2hpbGRNYWluKCZhcmdzKTsKLSAgICAgIF9leGl0KDApOwotICB9Ci0jICBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCi0jICBpZiBHVEVTVF9PU19MSU5VWAotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKAotICAgICAgc2lnYWN0aW9uKFNJR1BST0YsICZzYXZlZF9zaWdwcm9mX2FjdGlvbiwgTlVMTCkpOwotIyAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY2hpbGRfcGlkICE9IC0xKTsKLSAgcmV0dXJuIGNoaWxkX3BpZDsKLX0KLQotLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBmb3JrLWFuZC1leGVjIGRlYXRoIHRlc3QuICBJdCByZS1leGVjdXRlcyB0aGUKLS8vIG1haW4gcHJvZ3JhbSBmcm9tIHRoZSBiZWdpbm5pbmcsIHNldHRpbmcgdGhlIC0tZ3Rlc3RfZmlsdGVyCi0vLyBhbmQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncyB0byBjYXVzZSBvbmx5IHRoZSBjdXJyZW50Ci0vLyBkZWF0aCB0ZXN0IHRvIGJlIHJlLXJ1bi4KLURlYXRoVGVzdDo6VGVzdFJvbGUgRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKLSAgY29uc3QgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9Ci0gICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7Ci0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOwotCi0gIGlmIChmbGFnICE9IE5VTEwpIHsKLSAgICBzZXRfd3JpdGVfZmQoZmxhZy0+d3JpdGVfZmQoKSk7Ci0gICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKLSAgfQotCi0gIGludCBwaXBlX2ZkWzJdOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhwaXBlKHBpcGVfZmQpICE9IC0xKTsKLSAgLy8gQ2xlYXIgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZyBvbiB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLCBsZXN0Ci0gIC8vIGl0IGJlIGNsb3NlZCB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzIGRvZXMgYW4gZXhlYzoKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZmNudGwocGlwZV9mZFsxXSwgRl9TRVRGRCwgMCkgIT0gLTEpOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbHRlcl9mbGFnID0KLSAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ZpbHRlckZsYWcgKyAiPSIKLSAgICAgICsgaW5mby0+dGVzdF9jYXNlX25hbWUoKSArICIuIiArIGluZm8tPm5hbWUoKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgaW50ZXJuYWxfZmxhZyA9Ci0gICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgKyAiPSIKLSAgICAgICsgZmlsZV8gKyAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZV8pICsgInwiCi0gICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhkZWF0aF90ZXN0X2luZGV4KSArICJ8IgotICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcocGlwZV9mZFsxXSk7Ci0gIEFyZ3VtZW50cyBhcmdzOwotICBhcmdzLkFkZEFyZ3VtZW50cyhHZXRBcmd2c0ZvckRlYXRoVGVzdENoaWxkUHJvY2VzcygpKTsKLSAgYXJncy5BZGRBcmd1bWVudChmaWx0ZXJfZmxhZy5jX3N0cigpKTsKLSAgYXJncy5BZGRBcmd1bWVudChpbnRlcm5hbF9mbGFnLmNfc3RyKCkpOwotCi0gIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsKLQotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIC8vIFNlZSB0aGUgY29tbWVudCBpbiBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUgZm9yIHdoeSB0aGUgbmV4dCBsaW5lCi0gIC8vIGlzIG5lY2Vzc2FyeS4KLSAgRmx1c2hJbmZvTG9nKCk7Ci0KLSAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gRXhlY0RlYXRoVGVzdFNwYXduQ2hpbGQoYXJncy5Bcmd2KCksIHBpcGVfZmRbMF0pOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMV0pKTsKLSAgc2V0X2NoaWxkX3BpZChjaGlsZF9waWQpOwotICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsKLSAgc2V0X3NwYXduZWQodHJ1ZSk7Ci0gIHJldHVybiBPVkVSU0VFX1RFU1Q7Ci19Ci0KLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCi0KLS8vIENyZWF0ZXMgYSBjb25jcmV0ZSBEZWF0aFRlc3QtZGVyaXZlZCBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlCi0vLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgZmxhZywgYW5kIHNldHMgdGhlIHBvaW50ZXIgcG9pbnRlZCB0bwotLy8gYnkgdGhlICJ0ZXN0IiBhcmd1bWVudCB0byBpdHMgYWRkcmVzcy4gIElmIHRoZSB0ZXN0IHNob3VsZCBiZQotLy8gc2tpcHBlZCwgc2V0cyB0aGF0IHBvaW50ZXIgdG8gTlVMTC4gIFJldHVybnMgdHJ1ZSwgdW5sZXNzIHRoZQotLy8gZmxhZyBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZS4KLWJvb2wgRGVmYXVsdERlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWF0aFRlc3QqKiB0ZXN0KSB7Ci0gIFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOwotICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQotICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOwotICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCkKLSAgICAgIC0+aW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKLQotICBpZiAoZmxhZyAhPSBOVUxMKSB7Ci0gICAgaWYgKGRlYXRoX3Rlc3RfaW5kZXggPiBmbGFnLT5pbmRleCgpKSB7Ci0gICAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgKLSAgICAgICAgICAiRGVhdGggdGVzdCBjb3VudCAoIiArIFN0cmVhbWFibGVUb1N0cmluZyhkZWF0aF90ZXN0X2luZGV4KQotICAgICAgICAgICsgIikgc29tZWhvdyBleGNlZWRlZCBleHBlY3RlZCBtYXhpbXVtICgiCi0gICAgICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcoZmxhZy0+aW5kZXgoKSkgKyAiKSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghKGZsYWctPmZpbGUoKSA9PSBmaWxlICYmIGZsYWctPmxpbmUoKSA9PSBsaW5lICYmCi0gICAgICAgICAgZmxhZy0+aW5kZXgoKSA9PSBkZWF0aF90ZXN0X2luZGV4KSkgewotICAgICAgKnRlc3QgPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0gIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJ0aHJlYWRzYWZlIiB8fAotICAgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAiZmFzdCIpIHsKLSAgICAqdGVzdCA9IG5ldyBXaW5kb3dzRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOwotICB9Ci0KLSMgZWxzZQotCi0gIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJ0aHJlYWRzYWZlIikgewotICAgICp0ZXN0ID0gbmV3IEV4ZWNEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7Ci0gIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAiZmFzdCIpIHsKLSAgICAqdGVzdCA9IG5ldyBOb0V4ZWNEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCk7Ci0gIH0KLQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0gIGVsc2UgeyAgLy8gTk9MSU5UIC0gdGhpcyBpcyBtb3JlIHJlYWRhYmxlIHRoYW4gdW5iYWxhbmNlZCBicmFja2V0cyBpbnNpZGUgI2lmLgotICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKAotICAgICAgICAiVW5rbm93biBkZWF0aCB0ZXN0IHN0eWxlIFwiIiArIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkKLSAgICAgICAgKyAiXCIgZW5jb3VudGVyZWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0vLyBSZWNyZWF0ZXMgdGhlIHBpcGUgYW5kIGV2ZW50IGhhbmRsZXMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycywKLS8vIHNpZ25hbHMgdGhlIGV2ZW50LCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB3cmFwcGVkIGFyb3VuZCB0aGUgcGlwZQotLy8gaGFuZGxlLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBvbmx5LgotaW50IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHVuc2lnbmVkIGludCBwYXJlbnRfcHJvY2Vzc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkgewotICBBdXRvSGFuZGxlIHBhcmVudF9wcm9jZXNzX2hhbmRsZSg6Ok9wZW5Qcm9jZXNzKFBST0NFU1NfRFVQX0hBTkRMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gTm9uLWluaGVyaXRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3Byb2Nlc3NfaWQpKTsKLSAgaWYgKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gb3BlbiBwYXJlbnQgcHJvY2VzcyAiICsKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKLSAgfQotCi0gIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlcGxhY2UgdGhlIGZvbGxvd2luZyBjaGVjayB3aXRoIGEKLSAgLy8gY29tcGlsZS10aW1lIGFzc2VydGlvbiB3aGVuIGF2YWlsYWJsZS4KLSAgR1RFU1RfQ0hFQ0tfKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsKLQotICBjb25zdCBIQU5ETEUgd3JpdGVfaGFuZGxlID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPih3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KTsKLSAgSEFORExFIGR1cF93cml0ZV9oYW5kbGU7Ci0KLSAgLy8gVGhlIG5ld2x5IGluaXRpYWxpemVkIGhhbmRsZSBpcyBhY2Nlc3NpYmxlIG9ubHkgaW4gaW4gdGhlIHBhcmVudAotICAvLyBwcm9jZXNzLiBUbyBvYnRhaW4gb25lIGFjY2Vzc2libGUgd2l0aGluIHRoZSBjaGlsZCwgd2UgbmVlZCB0byB1c2UKLSAgLy8gRHVwbGljYXRlSGFuZGxlLgotICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgd3JpdGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF93cml0ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAgICAvLyBSZXF1ZXN0ZWQgcHJpdmlsZWdlcyBpZ25vcmVkIHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIFJlcXVlc3Qgbm9uLWluaGVyaXRhYmxlIGhhbmRsZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgewotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBwaXBlIGhhbmRsZSAiICsKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcod3JpdGVfaGFuZGxlX2FzX3NpemVfdCkgKwotICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgIiArCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHBhcmVudF9wcm9jZXNzX2lkKSk7Ci0gIH0KLQotICBjb25zdCBIQU5ETEUgZXZlbnRfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOwotICBIQU5ETEUgZHVwX2V2ZW50X2hhbmRsZTsKLQotICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgZXZlbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF9ldmVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiVW5hYmxlIHRvIGR1cGxpY2F0ZSB0aGUgZXZlbnQgaGFuZGxlICIgKwotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhldmVudF9oYW5kbGVfYXNfc2l6ZV90KSArCi0gICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAiICsKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKLSAgfQotCi0gIGNvbnN0IGludCB3cml0ZV9mZCA9Ci0gICAgICA6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihkdXBfd3JpdGVfaGFuZGxlKSwgT19BUFBFTkQpOwotICBpZiAod3JpdGVfZmQgPT0gLTEpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiVW5hYmxlIHRvIGNvbnZlcnQgcGlwZSBoYW5kbGUgIiArCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHdyaXRlX2hhbmRsZV9hc19zaXplX3QpICsKLSAgICAgICAgICAgICAgICAgICAiIHRvIGEgZmlsZSBkZXNjcmlwdG9yIik7Ci0gIH0KLQotICAvLyBTaWduYWxzIHRoZSBwYXJlbnQgdGhhdCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIGhhcyBiZWVuIGFjcXVpcmVkCi0gIC8vIHNvIHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgaXRzIG93biB3cml0ZSBlbmQuCi0gIDo6U2V0RXZlbnQoZHVwX2V2ZW50X2hhbmRsZSk7Ci0KLSAgcmV0dXJuIHdyaXRlX2ZkOwotfQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0vLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCi0vLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCi0vLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCi1JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgewotICBpZiAoR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgPT0gIiIpIHJldHVybiBOVUxMOwotCi0gIC8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlCi0gIC8vIGNhbiB1c2UgaXQgaGVyZS4KLSAgaW50IGxpbmUgPSAtMTsKLSAgaW50IGluZGV4ID0gLTE7Ci0gIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IGZpZWxkczsKLSAgU3BsaXRTdHJpbmcoR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSwgJ3wnLCAmZmllbGRzKTsKLSAgaW50IHdyaXRlX2ZkID0gLTE7Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0gIHVuc2lnbmVkIGludCBwYXJlbnRfcHJvY2Vzc19pZCA9IDA7Ci0gIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90ID0gMDsKLSAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QgPSAwOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpICE9IDYKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzJdLCAmaW5kZXgpCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJnBhcmVudF9wcm9jZXNzX2lkKQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNF0sICZ3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNV0sICZldmVudF9oYW5kbGVfYXNfc2l6ZV90KSkgewotICAgIERlYXRoVGVzdEFib3J0KCJCYWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnOiAiICsKLSAgICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSk7Ci0gIH0KLSAgd3JpdGVfZmQgPSBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcihwYXJlbnRfcHJvY2Vzc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOwotIyBlbHNlCi0KLSAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNAotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmd3JpdGVfZmQpKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICIKLSAgICAgICAgKyBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSk7Ci0gIH0KLQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0gIHJldHVybiBuZXcgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGZpZWxkc1swXSwgbGluZSwgaW5kZXgsIHdyaXRlX2ZkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjIGIvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjIzNzQuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSMgaW5jbHVkZSA8d2luZG93cy5oPgotI2VsaWYgR1RFU1RfT1NfV0lORE9XUwotIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSMgaW5jbHVkZSA8aW8uaD4KLSNlbGlmIEdURVNUX09TX1NZTUJJQU4KLS8vIFN5bWJpYW4gT3BlbkMgaGFzIFBBVEhfTUFYIGluIHN5cy9zeXNsaW1pdHMuaAotIyBpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSMgaW5jbHVkZSA8Y2xpbWl0cz4gIC8vIFNvbWUgTGludXggZGlzdHJpYnV0aW9ucyBkZWZpbmUgUEFUSF9NQVggaGVyZS4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfTUFYX1BBVEgKLSNlbGlmIGRlZmluZWQoUEFUSF9NQVgpCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gUEFUSF9NQVgKLSNlbGlmIGRlZmluZWQoX1hPUEVOX1BBVEhfTUFYKQotIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9YT1BFTl9QQVRIX01BWAotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfUE9TSVhfUEFUSF9NQVgKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0vLyBPbiBXaW5kb3dzLCAnXFwnIGlzIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciwgYnV0IG1hbnkgdG9vbHMgYW5kIHRoZQotLy8gV2luZG93cyBBUEkgYWxzbyBhY2NlcHQgJy8nIGFzIGFuIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvci4gVW5sZXNzIG90aGVyd2lzZQotLy8gbm90ZWQsIGEgZmlsZSBwYXRoIGNhbiBjb250YWluIGVpdGhlciBraW5kIG9mIHBhdGggc2VwYXJhdG9ycywgb3IgYSBtaXh0dXJlCi0vLyBvZiB0aGVtLgotY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICdcXCc7Ci1jb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yID0gJy8nOwotY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOwotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeS4gWW91IHNob3VsZCBub3QgdXNlCi0vLyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gdGVzdHMgb24gV2luZG93cyBDRSwgYnV0IHRoaXMgYXQgbGVhc3QKLS8vIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBmYWxsYmFjay4KLWNvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICJcXCI7Ci0vLyBXaW5kb3dzIENFIGRvZXNuJ3QgZGVmaW5lIElOVkFMSURfRklMRV9BVFRSSUJVVEVTCi1jb25zdCBEV09SRCBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzID0gMHhmZmZmZmZmZjsKLSMgZWxzZQotY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi5cXCI7Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotI2Vsc2UKLWNvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnLyc7Ci1jb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLi8iOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IuCi1zdGF0aWMgYm9vbCBJc1BhdGhTZXBhcmF0b3IoY2hhciBjKSB7Ci0jaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KLSAgcmV0dXJuIChjID09IGtQYXRoU2VwYXJhdG9yKSB8fCAoYyA9PSBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcik7Ci0jZWxzZQotICByZXR1cm4gYyA9PSBrUGF0aFNlcGFyYXRvcjsKLSNlbmRpZgotfQotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciAiIiBpZiB1bnN1Y2Nlc3NmdWwuCi1GaWxlUGF0aCBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19XSU5ET1dTX1BIT05FIHx8IEdURVNUX09TX1dJTkRPV1NfUlQgfHwgR1RFU1RfT1NfU1RBUkJPQVJECi0gIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCi0gIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgotICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOwotI2VsaWYgR1RFU1RfT1NfV0lORE9XUwotICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OwotICByZXR1cm4gRmlsZVBhdGgoX2dldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOwotI2Vsc2UKLSAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKLSAgY2hhciogcmVzdWx0ID0gZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpOwotIyBpZiBHVEVTVF9PU19OQUNMCi0gIC8vIGdldGN3ZCB3aWxsIGxpa2VseSBmYWlsIGluIE5hQ2wgZHVlIHRvIHRoZSBzYW5kYm94LCBzbyByZXR1cm4gc29tZXRoaW5nCi0gIC8vIHJlYXNvbmFibGUuIFRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIGEgc2hpbSBpbXBsZW1lbnRhdGlvbiBmb3IgZ2V0Y3dkLAotICAvLyBob3dldmVyLCBzbyBmYWxsYmFjayBvbmx5IHdoZW4gZmFpbHVyZSBpcyBkZXRlY3RlZC4KLSAgcmV0dXJuIEZpbGVQYXRoKHJlc3VsdCA9PSBOVUxMID8ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmcgOiBjd2QpOwotIyBlbmRpZiAgLy8gR1RFU1RfT1NfTkFDTAotICByZXR1cm4gRmlsZVBhdGgocmVzdWx0ID09IE5VTEwgPyAiIiA6IGN3ZCk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi19Ci0KLS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgotLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucwotLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90Ci0vLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZG90X2V4dGVuc2lvbiA9IHN0ZDo6c3RyaW5nKCIuIikgKyBleHRlbnNpb247Ci0gIGlmIChTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKHBhdGhuYW1lXywgZG90X2V4dGVuc2lvbikpIHsKLSAgICByZXR1cm4gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigKLSAgICAgICAgMCwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gZG90X2V4dGVuc2lvbi5sZW5ndGgoKSkpOwotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KLS8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgKLS8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCi1jb25zdCBjaGFyKiBGaWxlUGF0aDo6RmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3QgewotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9Ci0gICAgICBpbnRlcm5hbDo6cG9zaXg6OlN0clJDaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOwotI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3RfYWx0X3NlcCA9Ci0gICAgICBpbnRlcm5hbDo6cG9zaXg6OlN0clJDaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOwotICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLgotICBpZiAobGFzdF9hbHRfc2VwICE9IE5VTEwgJiYKLSAgICAgIChsYXN0X3NlcCA9PSBOVUxMIHx8IGxhc3RfYWx0X3NlcCA+IGxhc3Rfc2VwKSkgewotICAgIHJldHVybiBsYXN0X2FsdF9zZXA7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gbGFzdF9zZXA7Ci19Ci0KLS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLgotLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCi0vLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKLS8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0Ci0vLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdCB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7Ci0gIHJldHVybiBsYXN0X3NlcCA/IEZpbGVQYXRoKGxhc3Rfc2VwICsgMSkgOiAqdGhpczsKLX0KLQotLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KLS8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpIHJldHVybnMgInBhdGgvdG8vIi4KLS8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKLS8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCi0vLyBub3QgaGF2ZSBhIGZpbGUsIGxpa2UgImp1c3QvYS9kaXIvIiwgaXQgcmV0dXJucyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4KLS8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCi1GaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRmlsZU5hbWUoKSBjb25zdCB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7Ci0gIHN0ZDo6c3RyaW5nIGRpcjsKLSAgaWYgKGxhc3Rfc2VwKSB7Ci0gICAgZGlyID0gc3RkOjpzdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGlyID0ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIEZpbGVQYXRoKGRpcik7Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KLQotLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKLS8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgotLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgotRmlsZVBhdGggRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKLSAgc3RkOjpzdHJpbmcgZmlsZTsKLSAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKLSAgfSBlbHNlIHsKLSAgICBmaWxlID0gYmFzZV9uYW1lLnN0cmluZygpICsgIl8iICsgU3RyZWFtYWJsZVRvU3RyaW5nKG51bWJlcikKLSAgICAgICAgKyAiLiIgKyBleHRlbnNpb247Ci0gIH0KLSAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOwotfQotCi0vLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuCi0vLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgotRmlsZVBhdGggRmlsZVBhdGg6OkNvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKLSAgaWYgKGRpcmVjdG9yeS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7Ci0gIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOwotICByZXR1cm4gRmlsZVBhdGgoZGlyLnN0cmluZygpICsga1BhdGhTZXBhcmF0b3IgKyByZWxhdGl2ZV9wYXRoLnN0cmluZygpKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBzb21ldGhpbmcgZmluZGFibGUgaW4gdGhlIGZpbGUtc3lzdGVtLAotLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlci4KLWJvb2wgRmlsZVBhdGg6OkZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGhuYW1lXy5jX3N0cigpKTsKLSAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOwotICBkZWxldGUgW10gdW5pY29kZTsKLSAgcmV0dXJuIGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlczsKLSNlbHNlCi0gIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKLSAgcmV0dXJuIHBvc2l4OjpTdGF0KHBhdGhuYW1lXy5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQotLy8gdGhhdCBleGlzdHMuCi1ib29sIEZpbGVQYXRoOjpEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7Ci0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICAvLyBEb24ndCBzdHJpcCBvZmYgdHJhaWxpbmcgc2VwYXJhdG9yIGlmIHBhdGggaXMgYSByb290IGRpcmVjdG9yeSBvbgotICAvLyBXaW5kb3dzIChsaWtlICJDOlxcIikuCi0gIGNvbnN0IEZpbGVQYXRoJiBwYXRoKElzUm9vdERpcmVjdG9yeSgpID8gKnRoaXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKLSNlbHNlCi0gIGNvbnN0IEZpbGVQYXRoJiBwYXRoKCp0aGlzKTsKLSNlbmRpZgotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoLmNfc3RyKCkpOwotICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7Ci0gIGRlbGV0ZSBbXSB1bmljb2RlOwotICBpZiAoKGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlcykgJiYKLSAgICAgIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgewotICAgIHJlc3VsdCA9IHRydWU7Ci0gIH0KLSNlbHNlCi0gIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKLSAgcmVzdWx0ID0gcG9zaXg6OlN0YXQocGF0aC5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwICYmCi0gICAgICBwb3NpeDo6SXNEaXIoZmlsZV9zdGF0KTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUKLS8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKLWJvb2wgRmlsZVBhdGg6OklzUm9vdERpcmVjdG9yeSgpIGNvbnN0IHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIGEgbmV0d29yayBzaGFyZSBsaWtlCi0gIC8vIFxcc2VydmVyXHNoYXJlIGNhbiBiZSBhIHJvb3QgZGlyZWN0b3J5LCBhbHRob3VnaCBpdCBjYW5ub3QgYmUgdGhlCi0gIC8vIGN1cnJlbnQgZGlyZWN0b3J5LiAgSGFuZGxlIHRoaXMgcHJvcGVybHkuCi0gIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMyAmJiBJc0Fic29sdXRlUGF0aCgpOwotI2Vsc2UKLSAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAxICYmIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVswXSk7Ci0jZW5kaWYKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgotYm9vbCBGaWxlUGF0aDo6SXNBYnNvbHV0ZVBhdGgoKSBjb25zdCB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSBwYXRobmFtZV8uY19zdHIoKTsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPj0gMyAmJgotICAgICAoKG5hbWVbMF0gPj0gJ2EnICYmIG5hbWVbMF0gPD0gJ3onKSB8fAotICAgICAgKG5hbWVbMF0gPj0gJ0EnICYmIG5hbWVbMF0gPD0gJ1onKSkgJiYKLSAgICAgbmFtZVsxXSA9PSAnOicgJiYKLSAgICAgSXNQYXRoU2VwYXJhdG9yKG5hbWVbMl0pOwotI2Vsc2UKLSAgcmV0dXJuIElzUGF0aFNlcGFyYXRvcihuYW1lWzBdKTsKLSNlbmRpZgotfQotCi0vLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCi0vLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCi0vLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgotLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCi0vLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0vLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgotLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcwotLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KLUZpbGVQYXRoIEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7Ci0gIEZpbGVQYXRoIGZ1bGxfcGF0aG5hbWU7Ci0gIGludCBudW1iZXIgPSAwOwotICBkbyB7Ci0gICAgZnVsbF9wYXRobmFtZS5TZXQoTWFrZUZpbGVOYW1lKGRpcmVjdG9yeSwgYmFzZV9uYW1lLCBudW1iZXIrKywgZXh0ZW5zaW9uKSk7Ci0gIH0gd2hpbGUgKGZ1bGxfcGF0aG5hbWUuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOwotICByZXR1cm4gZnVsbF9wYXRobmFtZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAotLy8gaXQgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0b3J5LiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLS8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgotYm9vbCBGaWxlUGF0aDo6SXNEaXJlY3RvcnkoKSBjb25zdCB7Ci0gIHJldHVybiAhcGF0aG5hbWVfLmVtcHR5KCkgJiYKLSAgICAgICAgIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVtwYXRobmFtZV8ubGVuZ3RoKCkgLSAxXSk7Ci19Ci0KLS8vIENyZWF0ZSBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZgotLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcmllcwotLy8gZm9yIGFueSByZWFzb24uCi1ib29sIEZpbGVQYXRoOjpDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3QgewotICBpZiAoIXRoaXMtPklzRGlyZWN0b3J5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocGF0aG5hbWVfLmxlbmd0aCgpID09IDAgfHwgdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IEZpbGVQYXRoIHBhcmVudCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5SZW1vdmVGaWxlTmFtZSgpKTsKLSAgcmV0dXJuIHBhcmVudC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgJiYgdGhpcy0+Q3JlYXRlRm9sZGVyKCk7Ci19Ci0KLS8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yCi0vLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCi0vLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAotLy8gZXhpc3QuIE5vdCBuYW1lZCAiQ3JlYXRlRGlyZWN0b3J5IiBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIG9uIFdpbmRvd3MuCi1ib29sIEZpbGVQYXRoOjpDcmVhdGVGb2xkZXIoKSBjb25zdCB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgRmlsZVBhdGggcmVtb3ZlZF9zZXAodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOwotICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHJlbW92ZWRfc2VwLmNfc3RyKCkpOwotICBpbnQgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5KHVuaWNvZGUsIE5VTEwpID8gMCA6IC0xOwotICBkZWxldGUgW10gdW5pY29kZTsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSAgaW50IHJlc3VsdCA9IF9ta2RpcihwYXRobmFtZV8uY19zdHIoKSk7Ci0jZWxzZQotICBpbnQgcmVzdWx0ID0gcG9zaXg6Ok1rRGlyKHBhdGhuYW1lXy5jX3N0cigpLCAwNzc3KTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgcmV0dXJuIHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpOyAgLy8gQW4gZXJyb3IgaXMgT0sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gIH0KLSAgcmV0dXJuIHRydWU7ICAvLyBObyBlcnJvci4KLX0KLQotLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmUgaXQgYW5kIHJldHVybiB0aGUKLS8vIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIElzRGlyZWN0b3J5KCkKLSAgICAgID8gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigwLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSAxKSkKLSAgICAgIDogKnRoaXM7Ci19Ci0KLS8vIFJlbW92ZXMgYW55IHJlZHVuZGFudCBzZXBhcmF0b3JzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIHBhdGhuYW1lLgotLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXIKLS8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGhhbmRsZSBXaW5kb3dzIG5ldHdvcmsgc2hhcmVzIChlLmcuIFxcc2VydmVyXHNoYXJlKS4KLXZvaWQgRmlsZVBhdGg6Ok5vcm1hbGl6ZSgpIHsKLSAgaWYgKHBhdGhuYW1lXy5jX3N0cigpID09IE5VTEwpIHsKLSAgICBwYXRobmFtZV8gPSAiIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgY2hhciogc3JjID0gcGF0aG5hbWVfLmNfc3RyKCk7Ci0gIGNoYXIqIGNvbnN0IGRlc3QgPSBuZXcgY2hhcltwYXRobmFtZV8ubGVuZ3RoKCkgKyAxXTsKLSAgY2hhciogZGVzdF9wdHIgPSBkZXN0OwotICBpbnRlcm5hbDo6cG9zaXg6Ok1lbVNldChkZXN0X3B0ciwgMCwgcGF0aG5hbWVfLmxlbmd0aCgpICsgMSk7Ci0KLSAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgewotICAgICpkZXN0X3B0ciA9ICpzcmM7Ci0gICAgaWYgKCFJc1BhdGhTZXBhcmF0b3IoKnNyYykpIHsKLSAgICAgIHNyYysrOwotICAgIH0gZWxzZSB7Ci0jaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KLSAgICAgIGlmICgqZGVzdF9wdHIgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpIHsKLSAgICAgICAgKmRlc3RfcHRyID0ga1BhdGhTZXBhcmF0b3I7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHdoaWxlIChJc1BhdGhTZXBhcmF0b3IoKnNyYykpCi0gICAgICAgIHNyYysrOwotICAgIH0KLSAgICBkZXN0X3B0cisrOwotICB9Ci0gICpkZXN0X3B0ciA9ICdcMCc7Ci0gIHBhdGhuYW1lXyA9IGRlc3Q7Ci0gIGRlbGV0ZVtdIGRlc3Q7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIGIvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDY4NzAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgdXNlZCBieSB0aGUgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHB1cmVseSBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiAgUGxlYXNlCi0vLyBETyBOT1QgI0lOQ0xVREUgSVQgSU4gQSBVU0VSIFBST0dSQU0uCi0KLSNpZm5kZWYgR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwotI2RlZmluZSBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCi0KLS8vIEdURVNUX0lNUExFTUVOVEFUSU9OXyBpcyBkZWZpbmVkIHRvIDEgaWZmIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQgaXMKLS8vIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbjsgb3RoZXJ3aXNlIGl0J3MgdW5kZWZpbmVkLgotI2lmICFHVEVTVF9JTVBMRU1FTlRBVElPTl8KLS8vIElmIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBmcm9tIHRoZSB1c2VyJ3MgY29kZSwganVzdCBzYXkgbm8uCi0jIGVycm9yICJndGVzdC1pbnRlcm5hbC1pbmwuaCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uIgotIyBlcnJvciAiSXQgbXVzdCBub3QgYmUgaW5jbHVkZWQgZXhjZXB0IGJ5IEdvb2dsZSBUZXN0IGl0c2VsZi4iCi0jZW5kaWYgIC8vIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLSMgaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBzdHJ0b2xsL19zdHJ0b3VsNjQvbWFsbG9jL2ZyZWUuCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBGb3IgbWVtbW92ZS4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotIyBpbmNsdWRlIDxhcnBhL2luZXQuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxuZXRkYi5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiICAvLyBOT0xJTlQKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCi0vLwotLy8gV2UgZG9uJ3Qgd2FudCB0aGUgdXNlcnMgdG8gbW9kaWZ5IHRoaXMgZmxhZyBpbiB0aGUgY29kZSwgYnV0IHdhbnQKLS8vIEdvb2dsZSBUZXN0J3Mgb3duIHVuaXQgdGVzdHMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQuIFRoZXJlZm9yZSB3ZQotLy8gZGVjbGFyZSBpdCBoZXJlIGFzIG9wcG9zZWQgdG8gaW4gZ3Rlc3QuaC4KLUdURVNUX0RFQ0xBUkVfYm9vbF8oZGVhdGhfdGVzdF91c2VfZm9yayk7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKLS8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCi1HVEVTVF9BUElfIGV4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3Q7Ci0KLS8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KLWNvbnN0IGNoYXIga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1tdID0gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIjsKLWNvbnN0IGNoYXIga0JyZWFrT25GYWlsdXJlRmxhZ1tdID0gImJyZWFrX29uX2ZhaWx1cmUiOwotY29uc3QgY2hhciBrQ2F0Y2hFeGNlcHRpb25zRmxhZ1tdID0gImNhdGNoX2V4Y2VwdGlvbnMiOwotY29uc3QgY2hhciBrQ29sb3JGbGFnW10gPSAiY29sb3IiOwotY29uc3QgY2hhciBrRmlsdGVyRmxhZ1tdID0gImZpbHRlciI7Ci1jb25zdCBjaGFyIGtMaXN0VGVzdHNGbGFnW10gPSAibGlzdF90ZXN0cyI7Ci1jb25zdCBjaGFyIGtPdXRwdXRGbGFnW10gPSAib3V0cHV0IjsKLWNvbnN0IGNoYXIga1ByaW50VGltZUZsYWdbXSA9ICJwcmludF90aW1lIjsKLWNvbnN0IGNoYXIga1JhbmRvbVNlZWRGbGFnW10gPSAicmFuZG9tX3NlZWQiOwotY29uc3QgY2hhciBrUmVwZWF0RmxhZ1tdID0gInJlcGVhdCI7Ci1jb25zdCBjaGFyIGtTaHVmZmxlRmxhZ1tdID0gInNodWZmbGUiOwotY29uc3QgY2hhciBrU3RhY2tUcmFjZURlcHRoRmxhZ1tdID0gInN0YWNrX3RyYWNlX2RlcHRoIjsKLWNvbnN0IGNoYXIga1N0cmVhbVJlc3VsdFRvRmxhZ1tdID0gInN0cmVhbV9yZXN1bHRfdG8iOwotY29uc3QgY2hhciBrVGhyb3dPbkZhaWx1cmVGbGFnW10gPSAidGhyb3dfb25fZmFpbHVyZSI7Ci1jb25zdCBjaGFyIGtGbGFnZmlsZUZsYWdbXSA9ICJmbGFnZmlsZSI7Ci0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi1jb25zdCBjaGFyIGtUb3RhbFNoYXJkc0ZsYWdbXSA9ICJ0b3RhbF9zaGFyZHMiOwotY29uc3QgY2hhciBrU2hhcmRJbmRleEZsYWdbXSA9ICJzaGFyZF9pbmRleCI7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAotCi0vLyBBIHZhbGlkIHJhbmRvbSBzZWVkIG11c3QgYmUgaW4gWzEsIGtNYXhSYW5kb21TZWVkXS4KLWNvbnN0IGludCBrTWF4UmFuZG9tU2VlZCA9IDk5OTk5OwotCi0vLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCi0vLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLUdURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7Ci0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi1HVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgotR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7Ci0KLS8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOwotCi0vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIHN0cmluZyBpbiB0aGUgSVNPIDg2MDEKLS8vIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uICBOLkIuOiBkdWUgdG8gdGhlIHVzZSB0aGUKLS8vIG5vbi1yZWVudHJhbnQgbG9jYWx0aW1lKCkgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLiAgRG8KLS8vIG5vdCB1c2UgaXQgaW4gYW55IGNvZGUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKTsKLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZiAiLS1mbGFnPXZhbHVlIi4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotR1RFU1RfQVBJXyBib29sIFBhcnNlSW50MzJGbGFnKAotICAgIGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKTsKLQotLy8gUmV0dXJucyBhIHJhbmRvbSBzZWVkIGluIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gYmFzZWQgb24gdGhlCi0vLyBnaXZlbiAtLWd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgdmFsdWUuCi1pbmxpbmUgaW50IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhJbnQzMiByYW5kb21fc2VlZF9mbGFnKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGludCByYXdfc2VlZCA9IChyYW5kb21fc2VlZF9mbGFnID09IDApID8KLSAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oR2V0VGltZUluTWlsbGlzKCkpIDoKLSAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmFuZG9tX3NlZWRfZmxhZyk7Ci0KLSAgLy8gTm9ybWFsaXplcyB0aGUgYWN0dWFsIHNlZWQgdG8gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBzdWNoIHRoYXQKLSAgLy8gaXQncyBlYXN5IHRvIHR5cGUuCi0gIGNvbnN0IGludCBub3JtYWxpemVkX3NlZWQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmF3X3NlZWQgLSAxVSkgJQotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtNYXhSYW5kb21TZWVkKSkgKyAxOwotICByZXR1cm4gbm9ybWFsaXplZF9zZWVkOwotfQotCi0vLyBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCByYW5kb20gc2VlZCBhZnRlciAnc2VlZCcuICBUaGUgYmVoYXZpb3IgaXMKLS8vIHVuZGVmaW5lZCBpZiAnc2VlZCcgaXMgaW52YWxpZC4gIFRoZSBzZWVkIGFmdGVyIGtNYXhSYW5kb21TZWVkIGlzCi0vLyBjb25zaWRlcmVkIHRvIGJlIDEuCi1pbmxpbmUgaW50IEdldE5leHRSYW5kb21TZWVkKGludCBzZWVkKSB7Ci0gIEdURVNUX0NIRUNLXygxIDw9IHNlZWQgJiYgc2VlZCA8PSBrTWF4UmFuZG9tU2VlZCkKLSAgICAgIDw8ICJJbnZhbGlkIHJhbmRvbSBzZWVkICIgPDwgc2VlZCA8PCAiIC0gbXVzdCBiZSBpbiBbMSwgIgotICAgICAgPDwga01heFJhbmRvbVNlZWQgPDwgIl0uIjsKLSAgY29uc3QgaW50IG5leHRfc2VlZCA9IHNlZWQgKyAxOwotICByZXR1cm4gKG5leHRfc2VlZCA+IGtNYXhSYW5kb21TZWVkKSA/IDEgOiBuZXh0X3NlZWQ7Ci19Ci0KLS8vIFRoaXMgY2xhc3Mgc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gaXRzIGMndG9yLCBhbmQKLS8vIHJlc3RvcmVzIHRoZW0gaW4gaXRzIGQndG9yLgotY2xhc3MgR1Rlc3RGbGFnU2F2ZXIgewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yLgotICBHVGVzdEZsYWdTYXZlcigpIHsKLSAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c18gPSBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKLSAgICBicmVha19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7Ci0gICAgY2F0Y2hfZXhjZXB0aW9uc18gPSBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOwotICAgIGNvbG9yXyA9IEdURVNUX0ZMQUcoY29sb3IpOwotICAgIGRlYXRoX3Rlc3Rfc3R5bGVfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKLSAgICBkZWF0aF90ZXN0X3VzZV9mb3JrXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7Ci0gICAgZmlsdGVyXyA9IEdURVNUX0ZMQUcoZmlsdGVyKTsKLSAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF8gPSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKLSAgICBsaXN0X3Rlc3RzXyA9IEdURVNUX0ZMQUcobGlzdF90ZXN0cyk7Ci0gICAgb3V0cHV0XyA9IEdURVNUX0ZMQUcob3V0cHV0KTsKLSAgICBwcmludF90aW1lXyA9IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7Ci0gICAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhyYW5kb21fc2VlZCk7Ci0gICAgcmVwZWF0XyA9IEdURVNUX0ZMQUcocmVwZWF0KTsKLSAgICBzaHVmZmxlXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSk7Ci0gICAgc3RhY2tfdHJhY2VfZGVwdGhfID0gR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7Ci0gICAgc3RyZWFtX3Jlc3VsdF90b18gPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOwotICAgIHRocm93X29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKLSAgfQotCi0gIC8vIFRoZSBkJ3RvciBpcyBub3QgdmlydHVhbC4gIERPIE5PVCBJTkhFUklUIEZST00gVEhJUyBDTEFTUy4KLSAgfkdUZXN0RmxhZ1NhdmVyKCkgewotICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOwotICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBicmVha19vbl9mYWlsdXJlXzsKLSAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gY2F0Y2hfZXhjZXB0aW9uc187Ci0gICAgR1RFU1RfRkxBRyhjb2xvcikgPSBjb2xvcl87Ci0gICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9IGRlYXRoX3Rlc3Rfc3R5bGVfOwotICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKLSAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSBmaWx0ZXJfOwotICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID0gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOwotICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBsaXN0X3Rlc3RzXzsKLSAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSBvdXRwdXRfOwotICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBwcmludF90aW1lXzsKLSAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IHJhbmRvbV9zZWVkXzsKLSAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXRfOwotICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBzaHVmZmxlXzsKLSAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IHN0YWNrX3RyYWNlX2RlcHRoXzsKLSAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gc3RyZWFtX3Jlc3VsdF90b187Ci0gICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBGaWVsZHMgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIGZsYWdzLgotICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKLSAgYm9vbCBicmVha19vbl9mYWlsdXJlXzsKLSAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKLSAgc3RkOjpzdHJpbmcgY29sb3JfOwotICBzdGQ6OnN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsKLSAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKLSAgc3RkOjpzdHJpbmcgZmlsdGVyXzsKLSAgc3RkOjpzdHJpbmcgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOwotICBib29sIGxpc3RfdGVzdHNfOwotICBzdGQ6OnN0cmluZyBvdXRwdXRfOwotICBib29sIHByaW50X3RpbWVfOwotICBpbnRlcm5hbDo6SW50MzIgcmFuZG9tX3NlZWRfOwotICBpbnRlcm5hbDo6SW50MzIgcmVwZWF0XzsKLSAgYm9vbCBzaHVmZmxlXzsKLSAgaW50ZXJuYWw6OkludDMyIHN0YWNrX3RyYWNlX2RlcHRoXzsKLSAgc3RkOjpzdHJpbmcgc3RyZWFtX3Jlc3VsdF90b187Ci0gIGJvb2wgdGhyb3dfb25fZmFpbHVyZV87Ci19IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOwotCi0vLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCi0vLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQotLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCi0vLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgY29udmVydGVkCi0vLyB0byAiKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKSIuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCk7Ci0KLS8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgotLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgotLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKLS8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKLS8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgotLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKLS8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZwotLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLS8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKLS8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZwotLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCi0vLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKTsKLQotLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQotLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCi0vLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90Ci0vLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgotdm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50Ci0vLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCi0vLyBidXQgaW5jb25zaXN0ZW50IChlLmcuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKLS8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKLS8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKLS8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgotR1RFU1RfQVBJXyBib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7Ci0KLS8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKLS8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yIGFuZAotLy8gYW5kIGFib3J0cy4KLUdURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogZW52X3ZhciwgSW50MzIgZGVmYXVsdF92YWwpOwotCi0vLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCi0vLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKLS8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0Ci0vLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgotR1RFU1RfQVBJXyBib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKAotICAgIGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpOwotCi0vLyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBjb250YWluZXIgdGhhdCBzYXRpc2Z5Ci0vLyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgUHJlZGljYXRlPgotaW5saW5lIGludCBDb3VudElmKGNvbnN0IENvbnRhaW5lciYgYywgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAvLyBJbXBsZW1lbnRlZCBhcyBhbiBleHBsaWNpdCBsb29wIHNpbmNlIHN0ZDo6Y291bnRfaWYoKSBpbiBsaWJDc3RkIG9uCi0gIC8vIFNvbGFyaXMgaGFzIGEgbm9uLXN0YW5kYXJkIHNpZ25hdHVyZS4KLSAgaW50IGNvdW50ID0gMDsKLSAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOyBpdCAhPSBjLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKHByZWRpY2F0ZSgqaXQpKQotICAgICAgKytjb3VudDsKLSAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8vIEFwcGxpZXMgYSBmdW5jdGlvbi9mdW5jdG9yIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgRnVuY3Rvcj4KLXZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXImIGMsIEZ1bmN0b3IgZnVuY3RvcikgewotICBzdGQ6OmZvcl9lYWNoKGMuYmVnaW4oKSwgYy5lbmQoKSwgZnVuY3Rvcik7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgdmVjdG9yLCBvciBkZWZhdWx0X3ZhbHVlIGlmIGkgaXMgbm90Ci0vLyBpbiByYW5nZSBbMCwgdi5zaXplKCkpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEU+Ci1pbmxpbmUgRSBHZXRFbGVtZW50T3IoY29uc3Qgc3RkOjp2ZWN0b3I8RT4mIHYsIGludCBpLCBFIGRlZmF1bHRfdmFsdWUpIHsKLSAgcmV0dXJuIChpIDwgMCB8fCBpID49IHN0YXRpY19jYXN0PGludD4odi5zaXplKCkpKSA/IGRlZmF1bHRfdmFsdWUgOiB2W2ldOwotfQotCi0vLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIGEgcmFuZ2Ugb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgotLy8gJ2JlZ2luJyBhbmQgJ2VuZCcgYXJlIGVsZW1lbnQgaW5kaWNlcyBhcyBhbiBTVEwtc3R5bGUgcmFuZ2U7Ci0vLyBpLmUuIFtiZWdpbiwgZW5kKSBhcmUgc2h1ZmZsZWQsIHdoZXJlICdlbmQnID09IHNpemUoKSBtZWFucyB0bwotLy8gc2h1ZmZsZSB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KLXZvaWQgU2h1ZmZsZVJhbmdlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKLSAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSk7Ci0gIEdURVNUX0NIRUNLXygwIDw9IGJlZ2luICYmIGJlZ2luIDw9IHNpemUpCi0gICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0ICIgPDwgYmVnaW4gPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbMCwgIgotICAgICAgPDwgc2l6ZSA8PCAiXS4iOwotICBHVEVTVF9DSEVDS18oYmVnaW4gPD0gZW5kICYmIGVuZCA8PSBzaXplKQotICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggIiA8PCBlbmQgPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbIgotICAgICAgPDwgYmVnaW4gPDwgIiwgIiA8PCBzaXplIDw8ICJdLiI7Ci0KLSAgLy8gRmlzaGVyLVlhdGVzIHNodWZmbGUsIGZyb20KLSAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZQotICBmb3IgKGludCByYW5nZV93aWR0aCA9IGVuZCAtIGJlZ2luOyByYW5nZV93aWR0aCA+PSAyOyByYW5nZV93aWR0aC0tKSB7Ci0gICAgY29uc3QgaW50IGxhc3RfaW5fcmFuZ2UgPSBiZWdpbiArIHJhbmdlX3dpZHRoIC0gMTsKLSAgICBjb25zdCBpbnQgc2VsZWN0ZWQgPSBiZWdpbiArIHJhbmRvbS0+R2VuZXJhdGUocmFuZ2Vfd2lkdGgpOwotICAgIHN0ZDo6c3dhcCgoKnYpW3NlbGVjdGVkXSwgKCp2KVtsYXN0X2luX3JhbmdlXSk7Ci0gIH0KLX0KLQotLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KLWlubGluZSB2b2lkIFNodWZmbGUoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBzdGQ6OnZlY3RvcjxFPiogdikgewotICBTaHVmZmxlUmFuZ2UocmFuZG9tLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSksIHYpOwotfQotCi0vLyBBIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhbiBvYmplY3QuICBIYW5keSBmb3IgYmVpbmcgdXNlZCBhcyBhCi0vLyBmdW5jdG9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgdm9pZCBEZWxldGUoVCogeCkgewotICBkZWxldGUgeDsKLX0KLQotLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIGtleSBvZiBhIFRlc3RQcm9wZXJ0eSBhZ2FpbnN0IGEga25vd24ga2V5LgotLy8KLS8vIFRlc3RQcm9wZXJ0eUtleUlzIGlzIGNvcHlhYmxlLgotY2xhc3MgVGVzdFByb3BlcnR5S2V5SXMgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIC8vCi0gIC8vIFRlc3RQcm9wZXJ0eUtleUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICBleHBsaWNpdCBUZXN0UHJvcGVydHlLZXlJcyhjb25zdCBzdGQ6OnN0cmluZyYga2V5KSA6IGtleV8oa2V5KSB7fQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0IHByb3BlcnR5IG1hdGNoZXMgb24ga2V5Xy4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X3Byb3BlcnR5LmtleSgpID09IGtleV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGtleV87Ci19OwotCi0vLyBDbGFzcyBVbml0VGVzdE9wdGlvbnMuCi0vLwotLy8gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgZm9yIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGUgdXNlcgotLy8gc3BlY2lmaWVzIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuICBJdCBoYXMgb25seSBzdGF0aWMgbWVtYmVycy4KLS8vCi0vLyBJbiBtb3N0IGNhc2VzLCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdXNpbmcgZWl0aGVyIGFuCi0vLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhIGNvbW1hbmQgbGluZSBmbGFnLiAgRS5nLiB5b3UgY2FuIHNldCB0aGUKLS8vIHRlc3QgZmlsdGVyIHVzaW5nIGVpdGhlciBHVEVTVF9GSUxURVIgb3IgLS1ndGVzdF9maWx0ZXIuICBJZiBib3RoCi0vLyB0aGUgdmFyaWFibGUgYW5kIHRoZSBmbGFnIGFyZSBwcmVzZW50LCB0aGUgbGF0dGVyIG92ZXJyaWRlcyB0aGUKLS8vIGZvcm1lci4KLWNsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RPcHRpb25zIHsKLSBwdWJsaWM6Ci0gIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCi0KLSAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldE91dHB1dEZvcm1hdCgpOwotCi0gIC8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlCi0gIC8vIGRlZmF1bHQgKHRlc3RfZGV0YWlsLnhtbCBpbiB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3RvcnkpIGlmCi0gIC8vIG5vbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7Ci0KLSAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9maWx0ZXIgZmxhZy4KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4gIFRoZQotICAvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgotICAvLwotICAvLyBUaGlzIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXNuJ3QgdmVyeSBlZmZpY2llbnQsIGJ1dCBpcyBjbGVhciBhbmQKLSAgLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KLSAgc3RhdGljIGJvb2wgUGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCi0gIC8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCi0gIHN0YXRpYyBib29sIEZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSk7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIC8vIEZ1bmN0aW9uIGZvciBzdXBwb3J0aW5nIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb24gZmxhZy4KLQotICAvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKLSAgLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KLSAgc3RhdGljIGludCBHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmICJuYW1lIiBtYXRjaGVzIHRoZSAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYi1zdHlsZQotICAvLyBmaWx0ZXJzIGluICJmaWx0ZXIiLgotICBzdGF0aWMgYm9vbCBNYXRjaGVzRmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpOwotfTsKLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKLS8vIGlzIHByZXNlbnQuICBVc2VkIGJ5IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0RmlsZS4KLUdURVNUX0FQSV8gRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCk7Ci0KLS8vIFRoZSByb2xlIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgT1Mgc3RhY2sgdHJhY2UgYXMgYSBzdHJpbmcuCi1jbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KLSAgdmlydHVhbCB+T3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLiAgUGFyYW1ldGVyczoKLSAgLy8KLSAgLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAotICAvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCi0gIC8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50Ci0gIC8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgotICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkgPSAwOwotCi0gIC8vIFVwb25MZWF2aW5nR1Rlc3QoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBHb29nbGUgVGVzdCBjYWxscwotICAvLyB1c2VyIGNvZGUuIEl0IHNhdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhY2sgdGhhdAotICAvLyBDdXJyZW50U3RhY2tUcmFjZSgpIHdpbGwgdXNlIHRvIGZpbmQgYW5kIGhpZGUgR29vZ2xlIFRlc3Qgc3RhY2sgZnJhbWVzLgotICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpID0gMDsKLQotICAvLyBUaGlzIHN0cmluZyBpcyBpbnNlcnRlZCBpbiBwbGFjZSBvZiBzdGFjayBmcmFtZXMgdGhhdCBhcmUgcGFydCBvZgotICAvLyBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uLgotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0VsaWRlZEZyYW1lc01hcmtlcjsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKTsKLX07Ci0KLS8vIEEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIGludGVyZmFjZS4KLWNsYXNzIE9zU3RhY2tUcmFjZUdldHRlciA6IHB1YmxpYyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgT3NTdGFja1RyYWNlR2V0dGVyKCkge30KLQotICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCk7Ci0gIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlcik7Ci19OwotCi0vLyBJbmZvcm1hdGlvbiBhYm91dCBhIEdvb2dsZSBUZXN0IHRyYWNlIHBvaW50Lgotc3RydWN0IFRyYWNlSW5mbyB7Ci0gIGNvbnN0IGNoYXIqIGZpbGU7Ci0gIGludCBsaW5lOwotICBzdGQ6OnN0cmluZyBtZXNzYWdlOwotfTsKLQotLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGluIFVuaXRUZXN0SW1wbC4KLS8vIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuCi1jbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgotICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKLSAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gUmVwb3J0cyB0aGUgdGVzdCBwYXJ0Ci0gIC8vIHJlc3VsdCBpbiB0aGUgY3VycmVudCB0ZXN0LgotICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0KLSBwcml2YXRlOgotICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Ci19OwotCi0vLyBUaGlzIGlzIHRoZSBkZWZhdWx0IHBlciB0aHJlYWQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGluCi0vLyBVbml0VGVzdEltcGwuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuCi1jbGFzcyBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgotICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOwotICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBUaGUgaW1wbGVtZW50YXRpb24ganVzdAotICAvLyBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgb2YgKnVuaXRfdGVzdF8uCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLQotIHByaXZhdGU6Ci0gIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKLX07Ci0KLS8vIFRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcy4gIFdlIGRvbid0IHByb3RlY3QKLS8vIHRoZSBtZXRob2RzIHVuZGVyIGEgbXV0ZXgsIGFzIHRoaXMgY2xhc3MgaXMgbm90IGFjY2Vzc2libGUgYnkgYQotLy8gdXNlciBhbmQgdGhlIFVuaXRUZXN0IGNsYXNzIHRoYXQgZGVsZWdhdGVzIHdvcmsgdG8gdGhpcyBjbGFzcyBkb2VzCi0vLyBwcm9wZXIgbG9ja2luZy4KLWNsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RJbXBsIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KTsKLSAgdmlydHVhbCB+VW5pdFRlc3RJbXBsKCk7Ci0KLSAgLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyB0byByZWdpc3RlciB5b3VyIG93biBUZXN0UGFydFJlc3VsdFJlcG9ydGVyLgotICAvLyBZb3UgY2FuIHJlZ2lzdGVyIHlvdXIgb3duIHJlcG90ZXIgdG8gbGlzdGVuIGVpdGhlciBvbmx5IGZvciB0ZXN0IHJlc3VsdHMKLSAgLy8gZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgb3IgZm9yIHJlc3VsdHMgZnJvbSBhbGwgdGhyZWFkcy4KLSAgLy8gQnkgZGVmYXVsdCwgZWFjaCBwZXItdGhyZWFkIHRlc3QgcmVzdWx0IHJlcG90ZXIganVzdCBwYXNzZXMgYSBuZXcKLSAgLy8gVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGdsb2JhbCB0ZXN0IHJlc3VsdCByZXBvcnRlciwgd2hpY2ggcmVnaXN0ZXJzIHRoZQotICAvLyB0ZXN0IHBhcnQgcmVzdWx0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4KLQotICAvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOwotCi0gIC8vIFNldHMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotICB2b2lkIFNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOwotCi0gIC8vIFNldHMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgdm9pZCBTZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKLSAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgotICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCi0gIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgotICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAotICAvLyB0aGF0IHNob3VsZCBydW4uCi0gIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCi0gIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgotICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgotICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLSAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotICAvLyBVTklYIGVwb2NoLgotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gc3RhcnRfdGltZXN0YW1wXzsgfQotCi0gIC8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAotICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KLSAgYm9vbCBGYWlsZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSA+IDAgfHwgYWRfaG9jX3Rlc3RfcmVzdWx0KCktPkZhaWxlZCgpOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi0gIGNvbnN0IFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgewotICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKLSAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2ldOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi0gIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKLSAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7Ci0gICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpbmRleF07Ci0gIH0KLQotICAvLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVyIGxpc3QuCi0gIFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKCkgeyByZXR1cm4gJmxpc3RlbmVyc187IH0KLQotICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsIG9yCi0gIC8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotICBUZXN0UmVzdWx0KiBjdXJyZW50X3Rlc3RfcmVzdWx0KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0LgotICBjb25zdCBUZXN0UmVzdWx0KiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsgfQotCi0gIC8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4KLSAgLy8KLSAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyCi0gIC8vIGFyZSB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUKLSAgLy8gaW5wdXQgdGhlIGN1cnJlbnQgZ2V0dGVyLgotICB2b2lkIHNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBnZXR0ZXIpOwotCi0gIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOwotICAvLyBvdGhlcndpc2UsIGNyZWF0ZXMgYW4gT3NTdGFja1RyYWNlR2V0dGVyLCBtYWtlcyBpdCB0aGUgY3VycmVudAotICAvLyBnZXR0ZXIsIGFuZCByZXR1cm5zIGl0LgotICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcigpOwotCi0gIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCi0gIC8vCi0gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5Ci0gIC8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCi0gIC8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAotICAvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgotICAvLwotICAvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKLSAgLy8gQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCi0gIHN0ZDo6c3RyaW5nIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIEdURVNUX05PX0lOTElORV87Ci0KLSAgLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKLSAgLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LgotICAvLwotICAvLyBBcmd1bWVudHM6Ci0gIC8vCi0gIC8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAvLyAgIHR5cGVfcGFyYW06ICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCi0gIC8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KLSAgLy8gICBzZXRfdXBfdGM6ICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLSAgLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKLSAgVGVzdENhc2UqIEdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7Ci0KLSAgLy8gQWRkcyBhIFRlc3RJbmZvIHRvIHRoZSB1bml0IHRlc3QuCi0gIC8vCi0gIC8vIEFyZ3VtZW50czoKLSAgLy8KLSAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0gIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQotICAvLyAgIHRlc3RfaW5mbzogICAgdGhlIFRlc3RJbmZvIG9iamVjdAotICB2b2lkIEFkZFRlc3RJbmZvKFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCi0gICAgICAgICAgICAgICAgICAgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMsIHdlIG5lZWQgdG8KLSAgICAvLyByZW1lbWJlciB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgdGVzdCBwcm9ncmFtCi0gICAgLy8gd2FzIGZpcnN0IGludm9rZWQuICBXZSBjYW5ub3QgZG8gdGhpcyBpbiBSVU5fQUxMX1RFU1RTKCksIGFzCi0gICAgLy8gdGhlIHVzZXIgbWF5IGhhdmUgY2hhbmdlZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGNhbGxpbmcKLSAgICAvLyBSVU5fQUxMX1RFU1RTKCkuICBUaGVyZWZvcmUgd2UgY2FwdHVyZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4KLSAgICAvLyBBZGRUZXN0SW5mbygpLCB3aGljaCBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYSBURVNUIG9yIFRFU1RfRgotICAgIC8vIGJlZm9yZSBtYWluKCkgaXMgcmVhY2hlZC4KLSAgICBpZiAob3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkgewotICAgICAgb3JpZ2luYWxfd29ya2luZ19kaXJfLlNldChGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpKTsKLSAgICAgIEdURVNUX0NIRUNLXyghb3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkKLSAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iOwotICAgIH0KLQotICAgIEdldFRlc3RDYXNlKHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSwKLSAgICAgICAgICAgICAgICB0ZXN0X2luZm8tPnR5cGVfcGFyYW0oKSwKLSAgICAgICAgICAgICAgICBzZXRfdXBfdGMsCi0gICAgICAgICAgICAgICAgdGVhcl9kb3duX3RjKS0+QWRkVGVzdEluZm8odGVzdF9pbmZvKTsKLSAgfQotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgLy8gUmV0dXJucyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0gIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgotICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpIHsKLSAgICByZXR1cm4gcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XzsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0gIC8vIFNldHMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLgotICB2b2lkIHNldF9jdXJyZW50X3Rlc3RfY2FzZShUZXN0Q2FzZSogYV9jdXJyZW50X3Rlc3RfY2FzZSkgewotICAgIGN1cnJlbnRfdGVzdF9jYXNlXyA9IGFfY3VycmVudF90ZXN0X2Nhc2U7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZy4gIElmCi0gIC8vIGN1cnJlbnRfdGVzdF9pbmZvIGlzIE5VTEwsIHRoZSBhc3NlcnRpb24gcmVzdWx0cyB3aWxsIGJlIHN0b3JlZCBpbgotICAvLyBhZF9ob2NfdGVzdF9yZXN1bHRfLgotICB2b2lkIHNldF9jdXJyZW50X3Rlc3RfaW5mbyhUZXN0SW5mbyogYV9jdXJyZW50X3Rlc3RfaW5mbykgewotICAgIGN1cnJlbnRfdGVzdF9pbmZvXyA9IGFfY3VycmVudF90ZXN0X2luZm87Ci0gIH0KLQotICAvLyBSZWdpc3RlcnMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgZGVmaW5lZCB1c2luZyBURVNUX1AgYW5kCi0gIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QLCBjcmVhdGluZyByZWd1bGFyIHRlc3RzIGZvciBlYWNoIHRlc3QvcGFyYW1ldGVyCi0gIC8vIGNvbWJpbmF0aW9uLiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlOyBpdCBoYXMgZ3VhcmRzCi0gIC8vIHByb3RlY3RpbmcgZnJvbSByZWdpc3RlcmluZyB0aGUgdGVzdHMgbW9yZSB0aGVuIG9uY2UuICBJZgotICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBkaXNhYmxlZCwgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMgaXMKLSAgLy8gcHJlc2VudCBidXQgZG9lcyBub3RoaW5nLgotICB2b2lkIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7Ci0KLSAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKLSAgLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMKLSAgLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoaXMgdGVzdCBpcyBjb25zaWRlcmVkIHRvIGJlIGZhaWxlZCwgYnV0Ci0gIC8vIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KLSAgYm9vbCBSdW5BbGxUZXN0cygpOwotCi0gIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMsIGV4Y2VwdCB0aGUgYWQgaG9jIHRlc3RzLgotICB2b2lkIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCkgewotICAgIEZvckVhY2godGVzdF9jYXNlc18sIFRlc3RDYXNlOjpDbGVhclRlc3RDYXNlUmVzdWx0KTsKLSAgfQotCi0gIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhZC1ob2MgdGVzdCBhc3NlcnRpb25zLgotICB2b2lkIENsZWFyQWRIb2NUZXN0UmVzdWx0KCkgewotICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8uQ2xlYXIoKTsKLSAgfQotCi0gIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGluIGEKLSAgLy8gY29udGV4dCBvZiBhIHRlc3Qgb3IgYSB0ZXN0IGNhc2UsIG9yIHRvIHRoZSBnbG9iYWwgcHJvcGVydHkgc2V0LiBJZiB0aGUKLSAgLy8gcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUKLSAgLy8gdXBkYXRlZC4KLSAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOwotCi0gIGVudW0gUmVhY3Rpb25Ub1NoYXJkaW5nIHsKLSAgICBIT05PUl9TSEFSRElOR19QUk9UT0NPTCwKLSAgICBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wKLSAgfTsKLQotICAvLyBNYXRjaGVzIHRoZSBmdWxsIG5hbWUgb2YgZWFjaCB0ZXN0IGFnYWluc3QgdGhlIHVzZXItc3BlY2lmaWVkCi0gIC8vIGZpbHRlciB0byBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgcnVuLCB0aGVuIHJlY29yZHMgdGhlCi0gIC8vIHJlc3VsdCBpbiBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCi0gIC8vIElmIHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMKLSAgLy8gYmFzZWQgb24gc2hhcmRpbmcgdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLSAgaW50IEZpbHRlclRlc3RzKFJlYWN0aW9uVG9TaGFyZGluZyBzaGFyZF90ZXN0cyk7Ci0KLSAgLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLgotICB2b2lkIExpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCk7Ci0KLSAgY29uc3QgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF90ZXN0X2Nhc2VfOyB9Ci0gIFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQotICBjb25zdCBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0KLQotICAvLyBSZXR1cm5zIHRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCi0gIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KLSAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiYgZW52aXJvbm1lbnRzKCkgeyByZXR1cm4gZW52aXJvbm1lbnRzXzsgfQotCi0gIC8vIEdldHRlcnMgZm9yIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgotICBzdGQ6OnZlY3RvcjxUcmFjZUluZm8+JiBndGVzdF90cmFjZV9zdGFjaygpIHsKLSAgICByZXR1cm4gKihndGVzdF90cmFjZV9zdGFja18ucG9pbnRlcigpKTsKLSAgfQotICBjb25zdCBzdGQ6OnZlY3RvcjxUcmFjZUluZm8+JiBndGVzdF90cmFjZV9zdGFjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gZ3Rlc3RfdHJhY2Vfc3RhY2tfLmdldCgpOwotICB9Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICB2b2lkIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKSB7Ci0gICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18ucmVzZXQoUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSk7Ci0gIH0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0Ci0gIC8vIGZsYWcsIG9yIE5VTEwgaWYgdGhhdCBmbGFnIHdhcyBub3Qgc3BlY2lmaWVkLgotICAvLyBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgotICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCB0byBJbml0R29vZ2xlVGVzdC4KLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCkgY29uc3QgewotICAgIHJldHVybiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlYXRoIHRlc3QgZmFjdG9yeS4KLSAgaW50ZXJuYWw6OkRlYXRoVGVzdEZhY3RvcnkqIGRlYXRoX3Rlc3RfZmFjdG9yeSgpIHsKLSAgICByZXR1cm4gZGVhdGhfdGVzdF9mYWN0b3J5Xy5nZXQoKTsKLSAgfQotCi0gIHZvaWQgU3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKTsKLQotICBmcmllbmQgY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3Rvcnk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKLSAgLy8gVW5pdFRlc3RPcHRpb25zLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0LgotICB2b2lkIENvbmZpZ3VyZVhtbE91dHB1dCgpOwotCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgdG8gYSBzb2NrZXQuCi0gIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCi0gIHZvaWQgQ29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCk7Ci0jZW5kaWYKLQotICAvLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgotICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bwotICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0Ci0gIC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCi0gIC8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCi0gIHZvaWQgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOwotCi0gIC8vIEdldHMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgaXRlcmF0aW9uLgotICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiByYW5kb21fc2VlZF87IH0KLQotICAvLyBHZXRzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLSAgaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKCkgeyByZXR1cm4gJnJhbmRvbV87IH0KLQotICAvLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCi0gIC8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KLSAgdm9pZCBTaHVmZmxlVGVzdHMoKTsKLQotICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdG8gdGhlaXIgb3JkZXIgYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgotICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50Ci0gIC8vIFVuaXRUZXN0OjpSdW4oKSBzdGFydHMuCi0gIGJvb2wgY2F0Y2hfZXhjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGNhdGNoX2V4Y2VwdGlvbnNfOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjpVbml0VGVzdDsKLQotICAvLyBVc2VkIGJ5IFVuaXRUZXN0OjpSdW4oKSB0byBjYXB0dXJlIHRoZSBzdGF0ZSBvZgotICAvLyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgaXQgc3RhcnRzLgotICB2b2lkIHNldF9jYXRjaF9leGNlcHRpb25zKGJvb2wgdmFsdWUpIHsgY2F0Y2hfZXhjZXB0aW9uc18gPSB2YWx1ZTsgfQotCi0gIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGhhdCBvd25zIHRoaXMgaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICBVbml0VGVzdCogY29uc3QgcGFyZW50XzsKLQotICAvLyBUaGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpIHdhcwotICAvLyBleGVjdXRlZC4KLSAgaW50ZXJuYWw6OkZpbGVQYXRoIG9yaWdpbmFsX3dvcmtpbmdfZGlyXzsKLQotICAvLyBUaGUgZGVmYXVsdCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVycy4KLSAgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87Ci0gIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCi0gICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87Ci0KLSAgLy8gUG9pbnRzIHRvIChidXQgZG9lc24ndCBvd24pIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl87Ci0KLSAgLy8gUHJvdGVjdHMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy4KLSAgaW50ZXJuYWw6Ok11dGV4IGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4XzsKLQotICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIHBlci10aHJlYWQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgaW50ZXJuYWw6OlRocmVhZExvY2FsPFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqPgotICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKLQotICAvLyBUaGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bgotICAvLyBiZWZvcmUvYWZ0ZXIgdGhlIHRlc3RzIGFyZSBydW4uCi0gIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4gZW52aXJvbm1lbnRzXzsKLQotICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RDYXNlcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCi0gIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCi0gIHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4gdGVzdF9jYXNlc187Ci0KLSAgLy8gUHJvdmlkZXMgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgdGhlIHRlc3QgY2FzZSBsaXN0IHRvIGFsbG93Ci0gIC8vIGVhc3kgc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3QgY2FzZSBvcmRlci4gIFRoZSBpLXRoCi0gIC8vIGVsZW1lbnQgb2YgdGhpcyB2ZWN0b3IgaXMgdGhlIGluZGV4IG9mIHRoZSBpLXRoIHRlc3QgY2FzZSBpbiB0aGUKLSAgLy8gc2h1ZmZsZWQgb3JkZXIuCi0gIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9jYXNlX2luZGljZXNfOwotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgLy8gUGFyYW1ldGVyaXplZFRlc3RSZWdpc3RyeSBvYmplY3QgdXNlZCB0byByZWdpc3RlciB2YWx1ZS1wYXJhbWV0ZXJpemVkCi0gIC8vIHRlc3RzLgotICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XzsKLQotICAvLyBJbmRpY2F0ZXMgd2hldGhlciBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIGhhcyBiZWVuIGNhbGxlZCBhbHJlYWR5LgotICBib29sIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF87Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSAgLy8gSW5kZXggb2YgdGhlIGxhc3QgZGVhdGggdGVzdCBjYXNlIHJlZ2lzdGVyZWQuICBJbml0aWFsbHkgLTEuCi0gIGludCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV87Ci0KLSAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIFRlc3RDYXNlIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gIEl0Ci0gIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGNhc2UgYWZ0ZXIgYW5vdGhlci4KLSAgLy8gV2hlbiBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0Ci0gIC8vIHN0b3JlcyBhc3NlcnRpb24gcmVzdWx0cyBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLiAgSW5pdGlhbGx5IE5VTEwuCi0gIFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZV87Ci0KLSAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIFRlc3RJbmZvIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gIEl0Ci0gIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGFmdGVyIGFub3RoZXIuICBXaGVuCi0gIC8vIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3Qgc3RvcmVzCi0gIC8vIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KLSAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvXzsKLQotICAvLyBOb3JtYWxseSwgYSB1c2VyIG9ubHkgd3JpdGVzIGFzc2VydGlvbnMgaW5zaWRlIGEgVEVTVCBvciBURVNUX0YsCi0gIC8vIG9yIGluc2lkZSBhIGZ1bmN0aW9uIGNhbGxlZCBieSBhIFRFU1Qgb3IgVEVTVF9GLiAgU2luY2UgR29vZ2xlCi0gIC8vIFRlc3Qga2VlcHMgdHJhY2sgb2Ygd2hpY2ggdGVzdCBpcyBjdXJyZW50IHJ1bm5pbmcsIGl0IGNhbgotICAvLyBhc3NvY2lhdGUgc3VjaCBhbiBhc3NlcnRpb24gd2l0aCB0aGUgdGVzdCBpdCBiZWxvbmdzIHRvLgotICAvLwotICAvLyBJZiBhbiBhc3NlcnRpb24gaXMgZW5jb3VudGVyZWQgd2hlbiBubyBURVNUIG9yIFRFU1RfRiBpcyBydW5uaW5nLAotICAvLyBHb29nbGUgVGVzdCBhdHRyaWJ1dGVzIHRoZSBhc3NlcnRpb24gcmVzdWx0IHRvIGFuIGltYWdpbmFyeSAiYWQgaG9jIgotICAvLyB0ZXN0LCBhbmQgcmVjb3JkcyB0aGUgcmVzdWx0IGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uCi0gIFRlc3RSZXN1bHQgYWRfaG9jX3Rlc3RfcmVzdWx0XzsKLQotICAvLyBUaGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMgaW5zaWRlCi0gIC8vIEdvb2dsZSBUZXN0LgotICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzXzsKLQotICAvLyBUaGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLiAgV2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIFVuaXRUZXN0Ci0gIC8vIG9iamVjdCBpcyBkZXN0cnVjdGVkLiAgQnkgZGVmYXVsdCwgYW4gT3NTdGFja1RyYWNlR2V0dGVyIGlzIHVzZWQsCi0gIC8vIGJ1dCB0aGUgdXNlciBjYW4gc2V0IHRoaXMgZmllbGQgdG8gdXNlIGEgY3VzdG9tIGdldHRlciBpZiB0aGF0IGlzCi0gIC8vIGRlc2lyZWQuCi0gIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKLQotICAvLyBUcnVlIGlmZiBQb3N0RmxhZ1BhcnNpbmdJbml0KCkgaGFzIGJlZW4gY2FsbGVkLgotICBib29sIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF87Ci0KLSAgLy8gVGhlIHJhbmRvbSBudW1iZXIgc2VlZCB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3QgcnVuLgotICBpbnQgcmFuZG9tX3NlZWRfOwotCi0gIC8vIE91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLSAgaW50ZXJuYWw6OlJhbmRvbSByYW5kb21fOwotCi0gIC8vIFRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotICAvLyBVTklYIGVwb2NoLgotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wXzsKLQotICAvLyBIb3cgbG9uZyB0aGUgdGVzdCB0b29rIHRvIHJ1biwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gIC8vIFRoZSBkZWNvbXBvc2VkIGNvbXBvbmVudHMgb2YgdGhlIGd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsCi0gIC8vIHBhcnNlZCB3aGVuIFJVTl9BTExfVEVTVFMgaXMgY2FsbGVkLgotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjxJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWc+IGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfOwotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjxpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeT4gZGVhdGhfdGVzdF9mYWN0b3J5XzsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotICAvLyBBIHBlci10aHJlYWQgc3RhY2sgb2YgdHJhY2VzIGNyZWF0ZWQgYnkgdGhlIFNDT1BFRF9UUkFDRSgpIG1hY3JvLgotICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8c3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiA+IGd0ZXN0X3RyYWNlX3N0YWNrXzsKLQotICAvLyBUaGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50IFJ1bkFsbFRlc3RzKCkKLSAgLy8gc3RhcnRzLgotICBib29sIGNhdGNoX2V4Y2VwdGlvbnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVW5pdFRlc3RJbXBsKTsKLX07ICAvLyBjbGFzcyBVbml0VGVzdEltcGwKLQotLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFjY2Vzc2luZyB0aGUgZ2xvYmFsIFVuaXRUZXN0Ci0vLyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi1pbmxpbmUgVW5pdFRlc3RJbXBsKiBHZXRVbml0VGVzdEltcGwoKSB7Ci0gIHJldHVybiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+aW1wbCgpOwotfQotCi0jaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotLy8gSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHRoZSBzaW1wbGUgcmVndWxhcgotLy8gZXhwcmVzc2lvbiBtYXRjaGVyLgotR1RFU1RfQVBJXyBib29sIElzSW5TZXQoY2hhciBjaCwgY29uc3QgY2hhciogc3RyKTsKLUdURVNUX0FQSV8gYm9vbCBJc0FzY2lpRGlnaXQoY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgSXNBc2NpaVB1bmN0KGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzUmVwZWF0KGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzQXNjaWlXaGl0ZVNwYWNlKGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzQXNjaWlXb3JkQ2hhcihjaGFyIGNoKTsKLUdURVNUX0FQSV8gYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIEF0b21NYXRjaGVzQ2hhcihib29sIGVzY2FwZWQsIGNoYXIgcGF0dGVybiwgY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgVmFsaWRhdGVSZWdleChjb25zdCBjaGFyKiByZWdleCk7Ci1HVEVTVF9BUElfIGJvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKLSAgICBib29sIGVzY2FwZWQsIGNoYXIgY2gsIGNoYXIgcmVwZWF0LCBjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7Ci0KLSNlbmRpZiAgLy8gR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZwotLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCi1HVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpOwotR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IsIHJlZ2FyZGxlc3Mgb2YgdGhlCi0vLyBwbGF0Zm9ybS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKLQotLy8gQXR0ZW1wdHMgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIHBvc2l0aXZlIGludGVnZXIgcG9pbnRlZCB0byBieSB0aGUKLS8vIG51bWJlciBwYXJhbWV0ZXIuICBSZXR1cm5zIHRydWUgaWYgdGhhdCBpcyBwb3NzaWJsZS4KLS8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UKLS8vIGl0IGhlcmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4KLWJvb2wgUGFyc2VOYXR1cmFsTnVtYmVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgSW50ZWdlciogbnVtYmVyKSB7Ci0gIC8vIEZhaWwgZmFzdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGRvZXMgbm90IGJlZ2luIHdpdGggYSBkaWdpdDsKLSAgLy8gdGhpcyBieXBhc3NlcyBzdHJ0b1hYWCdzICJvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBsdXMKLSAgLy8gb3IgbWludXMgc2lnbiIgc2VtYW50aWNzLCB3aGljaCBhcmUgdW5kZXNpcmFibGUgaGVyZS4KLSAgaWYgKHN0ci5lbXB0eSgpIHx8ICFJc0RpZ2l0KHN0clswXSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZXJybm8gPSAwOwotCi0gIGNoYXIqIGVuZDsKLSAgLy8gQmlnZ2VzdENvbnZlcnRpYmxlIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSB0aGF0IHN5c3RlbS1wcm92aWRlZAotICAvLyBzdHJpbmctdG8tbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMgY2FuIHJldHVybi4KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQotCi0gIC8vIE1TVkMgYW5kIEMrKyBCdWlsZGVyIGRlZmluZSBfX2ludDY0IGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGxvbmcgbG9uZy4KLSAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IEJpZ2dlc3RDb252ZXJ0aWJsZTsKLSAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IF9zdHJ0b3VpNjQoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKLQotIyBlbHNlCi0KLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdENvbnZlcnRpYmxlOyAgLy8gTk9MSU5UCi0gIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBzdHJ0b3VsbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOwotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQotCi0gIGNvbnN0IGJvb2wgcGFyc2Vfc3VjY2VzcyA9ICplbmQgPT0gJ1wwJyAmJiBlcnJubyA9PSAwOwotCi0gIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IENvbnZlcnQgdGhpcyB0byBjb21waWxlIHRpbWUgYXNzZXJ0aW9uIHdoZW4gaXQgaXMKLSAgLy8gYXZhaWxhYmxlLgotICBHVEVTVF9DSEVDS18oc2l6ZW9mKEludGVnZXIpIDw9IHNpemVvZihwYXJzZWQpKTsKLQotICBjb25zdCBJbnRlZ2VyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludGVnZXI+KHBhcnNlZCk7Ci0gIGlmIChwYXJzZV9zdWNjZXNzICYmIHN0YXRpY19jYXN0PEJpZ2dlc3RDb252ZXJ0aWJsZT4ocmVzdWx0KSA9PSBwYXJzZWQpIHsKLSAgICAqbnVtYmVyID0gcmVzdWx0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gVGVzdFJlc3VsdCBjb250YWlucyBzb21lIHByaXZhdGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbQotLy8gR29vZ2xlIFRlc3QgdXNlciBidXQgYXJlIHJlcXVpcmVkIGZvciB0ZXN0aW5nLiBUaGlzIGNsYXNzIGFsbG93IG91ciB0ZXN0cwotLy8gdG8gYWNjZXNzIHRoZW0uCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBzdXBwbGllZCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duCi0vLyBjb25zdHJ1Y3RzLiBEbyBub3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkpIHsKLSAgICB0ZXN0X3Jlc3VsdC0+UmVjb3JkUHJvcGVydHkoeG1sX2VsZW1lbnQsIHByb3BlcnR5KTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0KSB7Ci0gICAgdGVzdF9yZXN1bHQtPkNsZWFyVGVzdFBhcnRSZXN1bHRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygKLSAgICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0KSB7Ci0gICAgcmV0dXJuIHRlc3RfcmVzdWx0LnRlc3RfcGFydF9yZXN1bHRzKCk7Ci0gIH0KLX07Ci0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0KLS8vIFN0cmVhbXMgdGVzdCByZXN1bHRzIHRvIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBnaXZlbiBob3N0IG1hY2hpbmUuCi1jbGFzcyBTdHJlYW1pbmdMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHdyaXRpbmcgc3RyaW5ncyB0byBhIHNvY2tldC4KLSAgY2xhc3MgQWJzdHJhY3RTb2NrZXRXcml0ZXIgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgfkFic3RyYWN0U29ja2V0V3JpdGVyKCkge30KLQotICAgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCi0gICAgdmlydHVhbCB2b2lkIFNlbmQoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSA9IDA7Ci0KLSAgICAvLyBDbG9zZXMgdGhlIHNvY2tldC4KLSAgICB2aXJ0dWFsIHZvaWQgQ2xvc2VDb25uZWN0aW9uKCkge30KLQotICAgIC8vIFNlbmRzIGEgc3RyaW5nIGFuZCBhIG5ld2xpbmUgdG8gdGhlIHNvY2tldC4KLSAgICB2b2lkIFNlbmRMbihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICAgIFNlbmQobWVzc2FnZSArICJcbiIpOwotICAgIH0KLSAgfTsKLQotICAvLyBDb25jcmV0ZSBjbGFzcyBmb3IgYWN0dWFsbHkgd3JpdGluZyBzdHJpbmdzIHRvIGEgc29ja2V0LgotICBjbGFzcyBTb2NrZXRXcml0ZXIgOiBwdWJsaWMgQWJzdHJhY3RTb2NrZXRXcml0ZXIgewotICAgcHVibGljOgotICAgIFNvY2tldFdyaXRlcihjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IHN0cmluZyYgcG9ydCkKLSAgICAgICAgOiBzb2NrZmRfKC0xKSwgaG9zdF9uYW1lXyhob3N0KSwgcG9ydF9udW1fKHBvcnQpIHsKLSAgICAgIE1ha2VDb25uZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+U29ja2V0V3JpdGVyKCkgewotICAgICAgaWYgKHNvY2tmZF8gIT0gLTEpCi0gICAgICAgIENsb3NlQ29ubmVjdGlvbigpOwotICAgIH0KLQotICAgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCi0gICAgdmlydHVhbCB2b2lkIFNlbmQoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKLSAgICAgICAgICA8PCAiU2VuZCgpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOwotCi0gICAgICBjb25zdCBpbnQgbGVuID0gc3RhdGljX2Nhc3Q8aW50PihtZXNzYWdlLmxlbmd0aCgpKTsKLSAgICAgIGlmICh3cml0ZShzb2NrZmRfLCBtZXNzYWdlLmNfc3RyKCksIGxlbikgIT0gbGVuKSB7Ci0gICAgICAgIEdURVNUX0xPR18oV0FSTklORykKLSAgICAgICAgICAgIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBmYWlsZWQgdG8gc3RyZWFtIHRvICIKLSAgICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gQ3JlYXRlcyBhIGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIuCi0gICAgdm9pZCBNYWtlQ29ubmVjdGlvbigpOwotCi0gICAgLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCi0gICAgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7Ci0gICAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKLSAgICAgICAgICA8PCAiQ2xvc2VDb25uZWN0aW9uKCkgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uLiI7Ci0KLSAgICAgIGNsb3NlKHNvY2tmZF8pOwotICAgICAgc29ja2ZkXyA9IC0xOwotICAgIH0KLQotICAgIGludCBzb2NrZmRfOyAgLy8gc29ja2V0IGZpbGUgZGVzY3JpcHRvcgotICAgIGNvbnN0IHN0cmluZyBob3N0X25hbWVfOwotICAgIGNvbnN0IHN0cmluZyBwb3J0X251bV87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNvY2tldFdyaXRlcik7Ci0gIH07ICAvLyBjbGFzcyBTb2NrZXRXcml0ZXIKLQotICAvLyBFc2NhcGVzICc9JywgJyYnLCAnJScsIGFuZCAnXG4nIGNoYXJhY3RlcnMgaW4gc3RyIGFzICIleHgiLgotICBzdGF0aWMgc3RyaW5nIFVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpOwotCi0gIFN0cmVhbWluZ0xpc3RlbmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3Qgc3RyaW5nJiBwb3J0KQotICAgICAgOiBzb2NrZXRfd3JpdGVyXyhuZXcgU29ja2V0V3JpdGVyKGhvc3QsIHBvcnQpKSB7IFN0YXJ0KCk7IH0KLQotICBleHBsaWNpdCBTdHJlYW1pbmdMaXN0ZW5lcihBYnN0cmFjdFNvY2tldFdyaXRlciogc29ja2V0X3dyaXRlcikKLSAgICAgIDogc29ja2V0X3dyaXRlcl8oc29ja2V0X3dyaXRlcikgeyBTdGFydCgpOyB9Ci0KLSAgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLykgewotICAgIFNlbmRMbigiZXZlbnQ9VGVzdFByb2dyYW1TdGFydCIpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKLSAgICAvLyBOb3RlIHRoYXQgR29vZ2xlIFRlc3QgY3VycmVudCBvbmx5IHJlcG9ydCBlbGFwc2VkIHRpbWUgZm9yIGVhY2gKLSAgICAvLyB0ZXN0IGl0ZXJhdGlvbiwgbm90IGZvciB0aGUgZW50aXJlIHRlc3QgcHJvZ3JhbS4KLSAgICBTZW5kTG4oImV2ZW50PVRlc3RQcm9ncmFtRW5kJnBhc3NlZD0iICsgRm9ybWF0Qm9vbCh1bml0X3Rlc3QuUGFzc2VkKCkpKTsKLQotICAgIC8vIE5vdGlmeSB0aGUgc3RyZWFtaW5nIHNlcnZlciB0byBzdG9wLgotICAgIHNvY2tldF93cml0ZXJfLT5DbG9zZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLywgaW50IGl0ZXJhdGlvbikgewotICAgIFNlbmRMbigiZXZlbnQ9VGVzdEl0ZXJhdGlvblN0YXJ0Jml0ZXJhdGlvbj0iICsKLSAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGl0ZXJhdGlvbikpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IC8qIGl0ZXJhdGlvbiAqLykgewotICAgIFNlbmRMbigiZXZlbnQ9VGVzdEl0ZXJhdGlvbkVuZCZwYXNzZWQ9IiArCi0gICAgICAgICAgIEZvcm1hdEJvb2wodW5pdF90ZXN0LlBhc3NlZCgpKSArICImZWxhcHNlZF90aW1lPSIgKwotICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKSArICJtcyIpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgewotICAgIFNlbmRMbihzdGQ6OnN0cmluZygiZXZlbnQ9VGVzdENhc2VTdGFydCZuYW1lPSIpICsgdGVzdF9jYXNlLm5hbWUoKSk7Ci0gIH0KLQotICB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgewotICAgIFNlbmRMbigiZXZlbnQ9VGVzdENhc2VFbmQmcGFzc2VkPSIgKyBGb3JtYXRCb29sKHRlc3RfY2FzZS5QYXNzZWQoKSkKLSAgICAgICAgICAgKyAiJmVsYXBzZWRfdGltZT0iICsgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkKLSAgICAgICAgICAgKyAibXMiKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICAgIFNlbmRMbihzdGQ6OnN0cmluZygiZXZlbnQ9VGVzdFN0YXJ0Jm5hbWU9IikgKyB0ZXN0X2luZm8ubmFtZSgpKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKLSAgICBTZW5kTG4oImV2ZW50PVRlc3RFbmQmcGFzc2VkPSIgKwotICAgICAgICAgICBGb3JtYXRCb29sKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5QYXNzZWQoKSkgKwotICAgICAgICAgICAiJmVsYXBzZWRfdGltZT0iICsKLSAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5lbGFwc2VkX3RpbWUoKSkgKyAibXMiKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewotICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSA9IHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCk7Ci0gICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKQotICAgICAgZmlsZV9uYW1lID0gIiI7Ci0gICAgU2VuZExuKCJldmVudD1UZXN0UGFydFJlc3VsdCZmaWxlPSIgKyBVcmxFbmNvZGUoZmlsZV9uYW1lKSArCi0gICAgICAgICAgICImbGluZT0iICsgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSkgKwotICAgICAgICAgICAiJm1lc3NhZ2U9IiArIFVybEVuY29kZSh0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBTZW5kcyB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzb2NrZXQuCi0gIHZvaWQgU2VuZExuKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeyBzb2NrZXRfd3JpdGVyXy0+U2VuZExuKG1lc3NhZ2UpOyB9Ci0KLSAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBzdHJlYW1pbmcgdG8gbm90aWZ5IHRoZSByZWNlaXZlciB3aGF0Ci0gIC8vIHByb3RvY29sIHdlIGFyZSB1c2luZy4KLSAgdm9pZCBTdGFydCgpIHsgU2VuZExuKCJndGVzdF9zdHJlYW1pbmdfcHJvdG9jb2xfdmVyc2lvbj0xLjAiKTsgfQotCi0gIHN0cmluZyBGb3JtYXRCb29sKGJvb2wgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID8gIjEiIDogIjAiOyB9Ci0KLSAgY29uc3Qgc2NvcGVkX3B0cjxBYnN0cmFjdFNvY2tldFdyaXRlcj4gc29ja2V0X3dyaXRlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJlYW1pbmdMaXN0ZW5lcik7Ci19OyAgLy8gY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXIKLQotI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjIGIvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmMjRlYy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgIUdURVNUX09TX1NUQVJCT0FSRAotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSMgaW5jbHVkZSA8d2luZG93cy5oPgotIyBpbmNsdWRlIDxpby5oPgotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotIyBpbmNsdWRlIDxtYXA+ICAvLyBVc2VkIGluIFRocmVhZExvY2FsLgotI2Vsc2UKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCi0jZW5kaWYgIC8vICFHVEVTVF9PU19TVEFSQk9BUkQKLQotI2lmIEdURVNUX09TX01BQwotIyBpbmNsdWRlIDxtYWNoL21hY2hfaW5pdC5oPgotIyBpbmNsdWRlIDxtYWNoL3Rhc2suaD4KLSMgaW5jbHVkZSA8bWFjaC92bV9tYXAuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCi0KLSNpZiBHVEVTVF9PU19RTlgKLSMgaW5jbHVkZSA8ZGV2Y3RsLmg+Ci0jIGluY2x1ZGUgPGZjbnRsLmg+Ci0jIGluY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBleGlzdHMgdG8KLS8vIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgaW5jbHVzaW9uIG9mIGd0ZXN0LWludGVybmFsLWlubC5oIGluIHRoZQotLy8gdXNlcidzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IEdURVNUX09TX1NUQVJCT0FSRAotLy8gTVNWQyBhbmQgQysrQnVpbGRlciBkbyBub3QgcHJvdmlkZSBhIGRlZmluaXRpb24gb2YgU1RERVJSX0ZJTEVOTy4KLWNvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gMTsKLWNvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gMjsKLSNlbHNlCi1jb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IFNURE9VVF9GSUxFTk87Ci1jb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IFNUREVSUl9GSUxFTk87Ci0jZW5kaWYgIC8vIF9NU0NfVkVSCi0KLSNpZiBHVEVTVF9PU19MSU5VWAotCi1uYW1lc3BhY2UgewotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UIFJlYWRQcm9jRmlsZUZpZWxkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBmaWVsZCkgewotICBzdGQ6OnN0cmluZyBkdW1teTsKLSAgc3RkOjppZnN0cmVhbSBmaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotICB3aGlsZSAoZmllbGQtLSA+IDApIHsKLSAgICBmaWxlID4+IGR1bW15OwotICB9Ci0gIFQgb3V0cHV0ID0gMDsKLSAgZmlsZSA+PiBvdXRwdXQ7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLCBvciAwIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IuCi1zaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7Ci0gIGNvbnN0IHN0cmluZyBmaWxlbmFtZSA9Ci0gICAgICAoTWVzc2FnZSgpIDw8ICIvcHJvYy8iIDw8IGdldHBpZCgpIDw8ICIvc3RhdCIpLkdldFN0cmluZygpOwotICByZXR1cm4gUmVhZFByb2NGaWxlRmllbGQ8aW50PihmaWxlbmFtZSwgMTkpOwotfQotCi0jZWxpZiBHVEVTVF9PU19NQUMKLQotc2l6ZV90IEdldFRocmVhZENvdW50KCkgewotICBjb25zdCB0YXNrX3QgdGFzayA9IG1hY2hfdGFza19zZWxmKCk7Ci0gIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgdGhyZWFkX2NvdW50OwotICB0aHJlYWRfYWN0X2FycmF5X3QgdGhyZWFkX2xpc3Q7Ci0gIGNvbnN0IGtlcm5fcmV0dXJuX3Qgc3RhdHVzID0gdGFza190aHJlYWRzKHRhc2ssICZ0aHJlYWRfbGlzdCwgJnRocmVhZF9jb3VudCk7Ci0gIGlmIChzdGF0dXMgPT0gS0VSTl9TVUNDRVNTKSB7Ci0gICAgLy8gdGFza190aHJlYWRzIGFsbG9jYXRlcyByZXNvdXJjZXMgaW4gdGhyZWFkX2xpc3QgYW5kIHdlIG5lZWQgdG8gZnJlZSB0aGVtCi0gICAgLy8gdG8gYXZvaWQgbGVha3MuCi0gICAgdm1fZGVhbGxvY2F0ZSh0YXNrLAotICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2bV9hZGRyZXNzX3Q+KHRocmVhZF9saXN0KSwKLSAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfdCkgKiB0aHJlYWRfY291bnQpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHRocmVhZF9jb3VudCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotI2VsaWYgR1RFU1RfT1NfUU5YCi0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAotLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KLXNpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKLSAgY29uc3QgaW50IGZkID0gb3BlbigiL3Byb2Mvc2VsZi9hcyIsIE9fUkRPTkxZKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHByb2Nmc19pbmZvIHByb2Nlc3NfaW5mbzsKLSAgY29uc3QgaW50IHN0YXR1cyA9Ci0gICAgICBkZXZjdGwoZmQsIERDTURfUFJPQ19JTkZPLCAmcHJvY2Vzc19pbmZvLCBzaXplb2YocHJvY2Vzc19pbmZvKSwgTlVMTCk7Ci0gIGNsb3NlKGZkKTsKLSAgaWYgKHN0YXR1cyA9PSBFT0spIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihwcm9jZXNzX2luZm8ubnVtX3RocmVhZHMpOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNlbHNlCi0KLXNpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKLSAgLy8gVGhlcmUncyBubyBwb3J0YWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcywgc28gd2UganVzdAotICAvLyByZXR1cm4gMCB0byBpbmRpY2F0ZSB0aGF0IHdlIGNhbm5vdCBkZXRlY3QgaXQuCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSNpZiBHVEVTVF9JU19USFJFQURTQUZFICYmIEdURVNUX09TX1dJTkRPV1MKLQotdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgewotICA6OlNsZWVwKG4pOwotfQotCi1BdXRvSGFuZGxlOjpBdXRvSGFuZGxlKCkKLSAgICA6IGhhbmRsZV8oSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHt9Ci0KLUF1dG9IYW5kbGU6OkF1dG9IYW5kbGUoSGFuZGxlIGhhbmRsZSkKLSAgICA6IGhhbmRsZV8oaGFuZGxlKSB7fQotCi1BdXRvSGFuZGxlOjp+QXV0b0hhbmRsZSgpIHsKLSAgUmVzZXQoKTsKLX0KLQotQXV0b0hhbmRsZTo6SGFuZGxlIEF1dG9IYW5kbGU6OkdldCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhbmRsZV87Ci19Ci0KLXZvaWQgQXV0b0hhbmRsZTo6UmVzZXQoKSB7Ci0gIFJlc2V0KElOVkFMSURfSEFORExFX1ZBTFVFKTsKLX0KLQotdm9pZCBBdXRvSGFuZGxlOjpSZXNldChIQU5ETEUgaGFuZGxlKSB7Ci0gIC8vIFJlc2V0dGluZyB3aXRoIHRoZSBzYW1lIGhhbmRsZSB3ZSBhbHJlYWR5IG93biBpcyBpbnZhbGlkLgotICBpZiAoaGFuZGxlXyAhPSBoYW5kbGUpIHsKLSAgICBpZiAoSXNDbG9zZWFibGUoKSkgewotICAgICAgOjpDbG9zZUhhbmRsZShoYW5kbGVfKTsKLSAgICB9Ci0gICAgaGFuZGxlXyA9IGhhbmRsZTsKLSAgfSBlbHNlIHsKLSAgICBHVEVTVF9DSEVDS18oIUlzQ2xvc2VhYmxlKCkpCi0gICAgICAgIDw8ICJSZXNldHRpbmcgYSB2YWxpZCBoYW5kbGUgdG8gaXRzZWxmIGlzIGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IgIgotICAgICAgICAgICAgImFuZCB0aHVzIG5vdCBhbGxvd2VkLiI7Ci0gIH0KLX0KLQotYm9vbCBBdXRvSGFuZGxlOjpJc0Nsb3NlYWJsZSgpIGNvbnN0IHsKLSAgLy8gRGlmZmVyZW50IFdpbmRvd3MgQVBJcyBtYXkgdXNlIGVpdGhlciBvZiB0aGVzZSB2YWx1ZXMgdG8gcmVwcmVzZW50IGFuCi0gIC8vIGludmFsaWQgaGFuZGxlLgotICByZXR1cm4gaGFuZGxlXyAhPSBOVUxMICYmIGhhbmRsZV8gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci19Ci0KLU5vdGlmaWNhdGlvbjo6Tm90aWZpY2F0aW9uKCkKLSAgICA6IGV2ZW50Xyg6OkNyZWF0ZUV2ZW50KE5VTEwsICAgLy8gRGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgICAvLyBEbyBub3QgcmVzZXQgYXV0b21hdGljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gSW5pdGlhbGx5IHVuc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsgIC8vIEFub255bW91cyBldmVudC4KLSAgR1RFU1RfQ0hFQ0tfKGV2ZW50Xy5HZXQoKSAhPSBOVUxMKTsKLX0KLQotdm9pZCBOb3RpZmljYXRpb246Ok5vdGlmeSgpIHsKLSAgR1RFU1RfQ0hFQ0tfKDo6U2V0RXZlbnQoZXZlbnRfLkdldCgpKSAhPSBGQUxTRSk7Ci19Ci0KLXZvaWQgTm90aWZpY2F0aW9uOjpXYWl0Rm9yTm90aWZpY2F0aW9uKCkgewotICBHVEVTVF9DSEVDS18oCi0gICAgICA6OldhaXRGb3JTaW5nbGVPYmplY3QoZXZlbnRfLkdldCgpLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCk7Ci19Ci0KLU11dGV4OjpNdXRleCgpCi0gICAgOiBvd25lcl90aHJlYWRfaWRfKDApLAotICAgICAgdHlwZV8oa0R5bmFtaWMpLAotICAgICAgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXygwKSwKLSAgICAgIGNyaXRpY2FsX3NlY3Rpb25fKG5ldyBDUklUSUNBTF9TRUNUSU9OKSB7Ci0gIDo6SW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7Ci19Ci0KLU11dGV4Ojp+TXV0ZXgoKSB7Ci0gIC8vIFN0YXRpYyBtdXRleGVzIGFyZSBsZWFrZWQgaW50ZW50aW9uYWxseS4gSXQgaXMgbm90IHRocmVhZC1zYWZlIHRvIHRyeQotICAvLyB0byBjbGVhbiB0aGVtIHVwLgotICAvLyBUT0RPKHl1a2F3YSk6IFN3aXRjaCB0byBTbGltIFJlYWRlci9Xcml0ZXIgKFNSVykgTG9ja3MsIHdoaWNoIHJlcXVpcmVzCi0gIC8vIG5vdGhpbmcgdG8gY2xlYW4gaXQgdXAgYnV0IGlzIGF2YWlsYWJsZSBvbmx5IG9uIFZpc3RhIGFuZCBsYXRlci4KLSAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTkwNDkzNy5hc3B4Ci0gIGlmICh0eXBlXyA9PSBrRHluYW1pYykgewotICAgIDo6RGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLSAgICBkZWxldGUgY3JpdGljYWxfc2VjdGlvbl87Ci0gICAgY3JpdGljYWxfc2VjdGlvbl8gPSBOVUxMOwotICB9Ci19Ci0KLXZvaWQgTXV0ZXg6OkxvY2soKSB7Ci0gIFRocmVhZFNhZmVMYXp5SW5pdCgpOwotICA6OkVudGVyQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLSAgb3duZXJfdGhyZWFkX2lkXyA9IDo6R2V0Q3VycmVudFRocmVhZElkKCk7Ci19Ci0KLXZvaWQgTXV0ZXg6OlVubG9jaygpIHsKLSAgVGhyZWFkU2FmZUxhenlJbml0KCk7Ci0gIC8vIFdlIGRvbid0IHByb3RlY3Qgd3JpdGluZyB0byBvd25lcl90aHJlYWRfaWRfIGhlcmUsIGFzIGl0J3MgdGhlCi0gIC8vIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUKLSAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KLSAgb3duZXJfdGhyZWFkX2lkXyA9IDA7Ci0gIDo6TGVhdmVDcml0aWNhbFNlY3Rpb24oY3JpdGljYWxfc2VjdGlvbl8pOwotfQotCi0vLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZSBtdXRleC4gT3RoZXJ3aXNlLCBjcmFzaGVzCi0vLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCi12b2lkIE11dGV4OjpBc3NlcnRIZWxkKCkgewotICBUaHJlYWRTYWZlTGF6eUluaXQoKTsKLSAgR1RFU1RfQ0hFQ0tfKG93bmVyX3RocmVhZF9pZF8gPT0gOjpHZXRDdXJyZW50VGhyZWFkSWQoKSkKLSAgICAgIDw8ICJUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGhvbGRpbmcgdGhlIG11dGV4IEAiIDw8IHRoaXM7Ci19Ci0KLS8vIEluaXRpYWxpemVzIG93bmVyX3RocmVhZF9pZF8gYW5kIGNyaXRpY2FsX3NlY3Rpb25fIGluIHN0YXRpYyBtdXRleGVzLgotdm9pZCBNdXRleDo6VGhyZWFkU2FmZUxhenlJbml0KCkgewotICAvLyBEeW5hbWljIG11dGV4ZXMgYXJlIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgaWYgKHR5cGVfID09IGtTdGF0aWMpIHsKLSAgICBzd2l0Y2ggKAotICAgICAgICA6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfLCAxTCwgMEwpKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIC8vIElmIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8gd2FzIDAgYmVmb3JlIHRoZSBleGNoYW5nZSwgd2UKLSAgICAgICAgLy8gYXJlIHRoZSBmaXJzdCB0byB0ZXN0IGl0IGFuZCBuZWVkIHRvIHBlcmZvcm0gdGhlIGluaXRpYWxpemF0aW9uLgotICAgICAgICBvd25lcl90aHJlYWRfaWRfID0gMDsKLSAgICAgICAgY3JpdGljYWxfc2VjdGlvbl8gPSBuZXcgQ1JJVElDQUxfU0VDVElPTjsKLSAgICAgICAgOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLSAgICAgICAgLy8gVXBkYXRlcyB0aGUgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXyB0byAyIHRvIHNpZ25hbAotICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZS4KLSAgICAgICAgR1RFU1RfQ0hFQ0tfKDo6SW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfLCAyTCwgMUwpID09Ci0gICAgICAgICAgICAgICAgICAgICAgMUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgLy8gU29tZWJvZHkgZWxzZSBpcyBhbHJlYWR5IGluaXRpYWxpemluZyB0aGUgbXV0ZXg7IHNwaW4gdW50aWwgdGhleQotICAgICAgICAvLyBhcmUgZG9uZS4KLSAgICAgICAgd2hpbGUgKDo6SW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoJmNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyTCkgIT0gMkwpIHsKLSAgICAgICAgICAvLyBQb3NzaWJseSB5aWVsZHMgdGhlIHJlc3Qgb2YgdGhlIHRocmVhZCdzIHRpbWUgc2xpY2UgdG8gb3RoZXIKLSAgICAgICAgICAvLyB0aHJlYWRzLgotICAgICAgICAgIDo6U2xlZXAoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgYnJlYWs7ICAvLyBUaGUgbXV0ZXggaXMgYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZS4KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR1RFU1RfQ0hFQ0tfKGZhbHNlKQotICAgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXyAiCi0gICAgICAgICAgICA8PCAid2hpbGUgaW5pdGlhbGl6aW5nIGEgc3RhdGljIG11dGV4LiI7Ci0gICAgfQotICB9Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFRocmVhZFdpdGhQYXJhbVN1cHBvcnQgOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSEFORExFIENyZWF0ZVRocmVhZChSdW5uYWJsZSogcnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkgewotICAgIFRocmVhZE1haW5QYXJhbSogcGFyYW0gPSBuZXcgVGhyZWFkTWFpblBhcmFtKHJ1bm5hYmxlLCB0aHJlYWRfY2FuX3N0YXJ0KTsKLSAgICBEV09SRCB0aHJlYWRfaWQ7Ci0gICAgLy8gVE9ETyh5dWthd2EpOiBDb25zaWRlciB0byB1c2UgX2JlZ2ludGhyZWFkZXggaW5zdGVhZC4KLSAgICBIQU5ETEUgdGhyZWFkX2hhbmRsZSA9IDo6Q3JlYXRlVGhyZWFkKAotICAgICAgICBOVUxMLCAgICAvLyBEZWZhdWx0IHNlY3VyaXR5LgotICAgICAgICAwLCAgICAgICAvLyBEZWZhdWx0IHN0YWNrIHNpemUuCi0gICAgICAgICZUaHJlYWRXaXRoUGFyYW1TdXBwb3J0OjpUaHJlYWRNYWluLAotICAgICAgICBwYXJhbSwgICAvLyBQYXJhbWV0ZXIgdG8gVGhyZWFkTWFpblN0YXRpYwotICAgICAgICAweDAsICAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgotICAgICAgICAmdGhyZWFkX2lkKTsgIC8vIE5lZWQgYSB2YWxpZCBwb2ludGVyIGZvciB0aGUgY2FsbCB0byB3b3JrIHVuZGVyIFdpbjk4LgotICAgIEdURVNUX0NIRUNLXyh0aHJlYWRfaGFuZGxlICE9IE5VTEwpIDw8ICJDcmVhdGVUaHJlYWQgZmFpbGVkIHdpdGggZXJyb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDo6R2V0TGFzdEVycm9yKCkgPDwgIi4iOwotICAgIGlmICh0aHJlYWRfaGFuZGxlID09IE5VTEwpIHsKLSAgICAgIGRlbGV0ZSBwYXJhbTsKLSAgICB9Ci0gICAgcmV0dXJuIHRocmVhZF9oYW5kbGU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBUaHJlYWRNYWluUGFyYW0gewotICAgIFRocmVhZE1haW5QYXJhbShSdW5uYWJsZSogcnVubmFibGUsIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKLSAgICAgICAgOiBydW5uYWJsZV8ocnVubmFibGUpLAotICAgICAgICAgIHRocmVhZF9jYW5fc3RhcnRfKHRocmVhZF9jYW5fc3RhcnQpIHsKLSAgICB9Ci0gICAgc2NvcGVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOwotICAgIC8vIERvZXMgbm90IG93bi4KLSAgICBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnRfOwotICB9OwotCi0gIHN0YXRpYyBEV09SRCBXSU5BUEkgVGhyZWFkTWFpbih2b2lkKiBwdHIpIHsKLSAgICAvLyBUcmFuc2ZlcnMgb3duZXJzaGlwLgotICAgIHNjb3BlZF9wdHI8VGhyZWFkTWFpblBhcmFtPiBwYXJhbShzdGF0aWNfY2FzdDxUaHJlYWRNYWluUGFyYW0qPihwdHIpKTsKLSAgICBpZiAocGFyYW0tPnRocmVhZF9jYW5fc3RhcnRfICE9IE5VTEwpCi0gICAgICBwYXJhbS0+dGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsKLSAgICBwYXJhbS0+cnVubmFibGVfLT5SdW4oKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFByb2hpYml0IGluc3RhbnRpYXRpb24uCi0gIFRocmVhZFdpdGhQYXJhbVN1cHBvcnQoKTsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbVN1cHBvcnQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRocmVhZFdpdGhQYXJhbUJhc2U6OlRocmVhZFdpdGhQYXJhbUJhc2UoUnVubmFibGUgKnJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCi0gICAgICA6IHRocmVhZF8oVGhyZWFkV2l0aFBhcmFtU3VwcG9ydDo6Q3JlYXRlVGhyZWFkKHJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0KSkgewotfQotCi1UaHJlYWRXaXRoUGFyYW1CYXNlOjp+VGhyZWFkV2l0aFBhcmFtQmFzZSgpIHsKLSAgSm9pbigpOwotfQotCi12b2lkIFRocmVhZFdpdGhQYXJhbUJhc2U6OkpvaW4oKSB7Ci0gIEdURVNUX0NIRUNLXyg6OldhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkXy5HZXQoKSwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApCi0gICAgICA8PCAiRmFpbGVkIHRvIGpvaW4gdGhlIHRocmVhZCB3aXRoIGVycm9yICIgPDwgOjpHZXRMYXN0RXJyb3IoKSA8PCAiLiI7Ci19Ci0KLS8vIE1hcHMgYSB0aHJlYWQgdG8gYSBzZXQgb2YgVGhyZWFkSWRUb1RocmVhZExvY2FscyB0aGF0IGhhdmUgdmFsdWVzCi0vLyBpbnN0YW50aWF0ZWQgb24gdGhhdCB0aHJlYWQgYW5kIG5vdGlmaWVzIHRoZW0gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgQQotLy8gVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gcGVyc2lzdCB1bnRpbCBhbGwgdGhyZWFkcyBpdCBoYXMKLS8vIHZhbHVlcyBvbiBoYXZlIHRlcm1pbmF0ZWQuCi1jbGFzcyBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbCB7Ci0gcHVibGljOgotICAvLyBSZWdpc3RlcnMgdGhyZWFkX2xvY2FsX2luc3RhbmNlIGFzIGhhdmluZyB2YWx1ZSBvbiB0aGUgY3VycmVudCB0aHJlYWQuCi0gIC8vIFJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0aHJlYWQgZnJvbSBvdGhlciB0aHJlYWRzLgotICBzdGF0aWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIEdldFZhbHVlT25DdXJyZW50VGhyZWFkKAotICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpIHsKLSAgICBEV09SRCBjdXJyZW50X3RocmVhZCA9IDo6R2V0Q3VycmVudFRocmVhZElkKCk7Ci0gICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gICAgVGhyZWFkSWRUb1RocmVhZExvY2FscyogY29uc3QgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMgPQotICAgICAgICBHZXRUaHJlYWRMb2NhbHNNYXBMb2NrZWQoKTsKLSAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOjppdGVyYXRvciB0aHJlYWRfbG9jYWxfcG9zID0KLSAgICAgICAgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmZpbmQoY3VycmVudF90aHJlYWQpOwotICAgIGlmICh0aHJlYWRfbG9jYWxfcG9zID09IHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5lbmQoKSkgewotICAgICAgdGhyZWFkX2xvY2FsX3BvcyA9IHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5pbnNlcnQoCi0gICAgICAgICAgc3RkOjptYWtlX3BhaXIoY3VycmVudF90aHJlYWQsIFRocmVhZExvY2FsVmFsdWVzKCkpKS5maXJzdDsKLSAgICAgIFN0YXJ0V2F0Y2hlclRocmVhZEZvcihjdXJyZW50X3RocmVhZCk7Ci0gICAgfQotICAgIFRocmVhZExvY2FsVmFsdWVzJiB0aHJlYWRfbG9jYWxfdmFsdWVzID0gdGhyZWFkX2xvY2FsX3Bvcy0+c2Vjb25kOwotICAgIFRocmVhZExvY2FsVmFsdWVzOjppdGVyYXRvciB2YWx1ZV9wb3MgPQotICAgICAgICB0aHJlYWRfbG9jYWxfdmFsdWVzLmZpbmQodGhyZWFkX2xvY2FsX2luc3RhbmNlKTsKLSAgICBpZiAodmFsdWVfcG9zID09IHRocmVhZF9sb2NhbF92YWx1ZXMuZW5kKCkpIHsKLSAgICAgIHZhbHVlX3BvcyA9Ci0gICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcwotICAgICAgICAgICAgICAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgdGhyZWFkX2xvY2FsX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgbGlua2VkX3B0cjxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZT4oCi0gICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2xvY2FsX2luc3RhbmNlLT5OZXdWYWx1ZUZvckN1cnJlbnRUaHJlYWQoKSkpKQotICAgICAgICAgICAgICAuZmlyc3Q7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZV9wb3MtPnNlY29uZC5nZXQoKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCi0gICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSkgewotICAgIHN0ZDo6dmVjdG9yPGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+ID4gdmFsdWVfaG9sZGVyczsKLSAgICAvLyBDbGVhbiB1cCB0aGUgVGhyZWFkTG9jYWxWYWx1ZXMgZGF0YSBzdHJ1Y3R1cmUgd2hpbGUgaG9sZGluZyB0aGUgbG9jaywgYnV0Ci0gICAgLy8gZGVmZXIgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gICAgewotICAgICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gICAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzKiBjb25zdCB0aHJlYWRfdG9fdGhyZWFkX2xvY2FscyA9Ci0gICAgICAgICAgR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCk7Ci0gICAgICBmb3IgKFRocmVhZElkVG9UaHJlYWRMb2NhbHM6Oml0ZXJhdG9yIGl0ID0KLSAgICAgICAgICB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+YmVnaW4oKTsKLSAgICAgICAgICBpdCAhPSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZW5kKCk7Ci0gICAgICAgICAgKytpdCkgewotICAgICAgICBUaHJlYWRMb2NhbFZhbHVlcyYgdGhyZWFkX2xvY2FsX3ZhbHVlcyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIFRocmVhZExvY2FsVmFsdWVzOjppdGVyYXRvciB2YWx1ZV9wb3MgPQotICAgICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5maW5kKHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci0gICAgICAgIGlmICh2YWx1ZV9wb3MgIT0gdGhyZWFkX2xvY2FsX3ZhbHVlcy5lbmQoKSkgewotICAgICAgICAgIHZhbHVlX2hvbGRlcnMucHVzaF9iYWNrKHZhbHVlX3Bvcy0+c2Vjb25kKTsKLSAgICAgICAgICB0aHJlYWRfbG9jYWxfdmFsdWVzLmVyYXNlKHZhbHVlX3Bvcyk7Ci0gICAgICAgICAgLy8gVGhpcyAnaWYnIGNhbiBvbmx5IGJlIHN1Y2Nlc3NmdWwgYXQgbW9zdCBvbmNlLCBzbyB0aGVvcmV0aWNhbGx5IHdlCi0gICAgICAgICAgLy8gY291bGQgYnJlYWsgb3V0IG9mIHRoZSBsb29wIGhlcmUsIGJ1dCB3ZSBkb24ndCBib3RoZXIgZG9pbmcgc28uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gT3V0c2lkZSB0aGUgbG9jaywgbGV0IHRoZSBkZXN0cnVjdG9yIGZvciAndmFsdWVfaG9sZGVycycgZGVhbGxvY2F0ZSB0aGUKLSAgICAvLyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gIH0KLQotICBzdGF0aWMgdm9pZCBPblRocmVhZEV4aXQoRFdPUkQgdGhyZWFkX2lkKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfKHRocmVhZF9pZCAhPSAwKSA8PCA6OkdldExhc3RFcnJvcigpOwotICAgIHN0ZDo6dmVjdG9yPGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+ID4gdmFsdWVfaG9sZGVyczsKLSAgICAvLyBDbGVhbiB1cCB0aGUgVGhyZWFkSWRUb1RocmVhZExvY2FscyBkYXRhIHN0cnVjdHVyZSB3aGlsZSBob2xkaW5nIHRoZQotICAgIC8vIGxvY2ssIGJ1dCBkZWZlciB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlcy4KLSAgICB7Ci0gICAgICBNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgICAgIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIGNvbnN0IHRocmVhZF90b190aHJlYWRfbG9jYWxzID0KLSAgICAgICAgICBHZXRUaHJlYWRMb2NhbHNNYXBMb2NrZWQoKTsKLSAgICAgIFRocmVhZElkVG9UaHJlYWRMb2NhbHM6Oml0ZXJhdG9yIHRocmVhZF9sb2NhbF9wb3MgPQotICAgICAgICAgIHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5maW5kKHRocmVhZF9pZCk7Ci0gICAgICBpZiAodGhyZWFkX2xvY2FsX3BvcyAhPSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZW5kKCkpIHsKLSAgICAgICAgVGhyZWFkTG9jYWxWYWx1ZXMmIHRocmVhZF9sb2NhbF92YWx1ZXMgPSB0aHJlYWRfbG9jYWxfcG9zLT5zZWNvbmQ7Ci0gICAgICAgIGZvciAoVGhyZWFkTG9jYWxWYWx1ZXM6Oml0ZXJhdG9yIHZhbHVlX3BvcyA9Ci0gICAgICAgICAgICB0aHJlYWRfbG9jYWxfdmFsdWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICB2YWx1ZV9wb3MgIT0gdGhyZWFkX2xvY2FsX3ZhbHVlcy5lbmQoKTsKLSAgICAgICAgICAgICsrdmFsdWVfcG9zKSB7Ci0gICAgICAgICAgdmFsdWVfaG9sZGVycy5wdXNoX2JhY2sodmFsdWVfcG9zLT5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgICAgIHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5lcmFzZSh0aHJlYWRfbG9jYWxfcG9zKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gT3V0c2lkZSB0aGUgbG9jaywgbGV0IHRoZSBkZXN0cnVjdG9yIGZvciAndmFsdWVfaG9sZGVycycgZGVhbGxvY2F0ZSB0aGUKLSAgICAvLyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEluIGEgcGFydGljdWxhciB0aHJlYWQsIG1hcHMgYSBUaHJlYWRMb2NhbCBvYmplY3QgdG8gaXRzIHZhbHVlLgotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IFRocmVhZExvY2FsQmFzZSosCi0gICAgICAgICAgICAgICAgICAgbGlua2VkX3B0cjxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZT4gPiBUaHJlYWRMb2NhbFZhbHVlczsKLSAgLy8gU3RvcmVzIGFsbCBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzIGhhdmluZyB2YWx1ZXMgaW4gYSB0aHJlYWQsIGluZGV4ZWQgYnkKLSAgLy8gdGhyZWFkJ3MgSUQuCi0gIHR5cGVkZWYgc3RkOjptYXA8RFdPUkQsIFRocmVhZExvY2FsVmFsdWVzPiBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOwotCi0gIC8vIEhvbGRzIHRoZSB0aHJlYWQgaWQgYW5kIHRocmVhZCBoYW5kbGUgdGhhdCB3ZSBwYXNzIGZyb20KLSAgLy8gU3RhcnRXYXRjaGVyVGhyZWFkRm9yIHRvIFdhdGNoZXJUaHJlYWRGdW5jLgotICB0eXBlZGVmIHN0ZDo6cGFpcjxEV09SRCwgSEFORExFPiBUaHJlYWRJZEFuZEhhbmRsZTsKLQotICBzdGF0aWMgdm9pZCBTdGFydFdhdGNoZXJUaHJlYWRGb3IoRFdPUkQgdGhyZWFkX2lkKSB7Ci0gICAgLy8gVGhlIHJldHVybmVkIGhhbmRsZSB3aWxsIGJlIGtlcHQgaW4gdGhyZWFkX21hcCBhbmQgY2xvc2VkIGJ5Ci0gICAgLy8gd2F0Y2hlcl90aHJlYWQgaW4gV2F0Y2hlclRocmVhZEZ1bmMuCi0gICAgSEFORExFIHRocmVhZCA9IDo6T3BlblRocmVhZChTWU5DSFJPTklaRSB8IFRIUkVBRF9RVUVSWV9JTkZPUk1BVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2lkKTsKLSAgICBHVEVTVF9DSEVDS18odGhyZWFkICE9IE5VTEwpOwotICAgIC8vIFdlIG5lZWQgdG8gdG8gcGFzcyBhIHZhbGlkIHRocmVhZCBJRCBwb2ludGVyIGludG8gQ3JlYXRlVGhyZWFkIGZvciBpdAotICAgIC8vIHRvIHdvcmsgY29ycmVjdGx5IHVuZGVyIFdpbjk4LgotICAgIERXT1JEIHdhdGNoZXJfdGhyZWFkX2lkOwotICAgIEhBTkRMRSB3YXRjaGVyX3RocmVhZCA9IDo6Q3JlYXRlVGhyZWFkKAotICAgICAgICBOVUxMLCAgIC8vIERlZmF1bHQgc2VjdXJpdHkuCi0gICAgICAgIDAsICAgICAgLy8gRGVmYXVsdCBzdGFjayBzaXplCi0gICAgICAgICZUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6V2F0Y2hlclRocmVhZEZ1bmMsCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TFBWT0lEPihuZXcgVGhyZWFkSWRBbmRIYW5kbGUodGhyZWFkX2lkLCB0aHJlYWQpKSwKLSAgICAgICAgQ1JFQVRFX1NVU1BFTkRFRCwKLSAgICAgICAgJndhdGNoZXJfdGhyZWFkX2lkKTsKLSAgICBHVEVTVF9DSEVDS18od2F0Y2hlcl90aHJlYWQgIT0gTlVMTCk7Ci0gICAgLy8gR2l2ZSB0aGUgd2F0Y2hlciB0aHJlYWQgdGhlIHNhbWUgcHJpb3JpdHkgYXMgb3VycyB0byBhdm9pZCBiZWluZwotICAgIC8vIGJsb2NrZWQgYnkgaXQuCi0gICAgOjpTZXRUaHJlYWRQcmlvcml0eSh3YXRjaGVyX3RocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0VGhyZWFkUHJpb3JpdHkoOjpHZXRDdXJyZW50VGhyZWFkKCkpKTsKLSAgICA6OlJlc3VtZVRocmVhZCh3YXRjaGVyX3RocmVhZCk7Ci0gICAgOjpDbG9zZUhhbmRsZSh3YXRjaGVyX3RocmVhZCk7Ci0gIH0KLQotICAvLyBNb25pdG9ycyBleGl0IGZyb20gYSBnaXZlbiB0aHJlYWQgYW5kIG5vdGlmaWVzIHRob3NlCi0gIC8vIFRocmVhZElkVG9UaHJlYWRMb2NhbHMgYWJvdXQgdGhyZWFkIHRlcm1pbmF0aW9uLgotICBzdGF0aWMgRFdPUkQgV0lOQVBJIFdhdGNoZXJUaHJlYWRGdW5jKExQVk9JRCBwYXJhbSkgewotICAgIGNvbnN0IFRocmVhZElkQW5kSGFuZGxlKiB0YWggPQotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRocmVhZElkQW5kSGFuZGxlKj4ocGFyYW0pOwotICAgIEdURVNUX0NIRUNLXygKLSAgICAgICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRhaC0+c2Vjb25kLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCk7Ci0gICAgT25UaHJlYWRFeGl0KHRhaC0+Zmlyc3QpOwotICAgIDo6Q2xvc2VIYW5kbGUodGFoLT5zZWNvbmQpOwotICAgIGRlbGV0ZSB0YWg7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBSZXR1cm5zIG1hcCBvZiB0aHJlYWQgbG9jYWwgaW5zdGFuY2VzLgotICBzdGF0aWMgVGhyZWFkSWRUb1RocmVhZExvY2FscyogR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCkgewotICAgIG11dGV4Xy5Bc3NlcnRIZWxkKCk7Ci0gICAgc3RhdGljIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIG1hcCA9IG5ldyBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICAvLyBQcm90ZWN0cyBhY2Nlc3MgdG8gR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCkgYW5kIGl0cyByZXR1cm4gdmFsdWUuCi0gIHN0YXRpYyBNdXRleCBtdXRleF87Ci0gIC8vIFByb3RlY3RzIGFjY2VzcyB0byBHZXRUaHJlYWRNYXBMb2NrZWQoKSBhbmQgaXRzIHJldHVybiB2YWx1ZS4KLSAgc3RhdGljIE11dGV4IHRocmVhZF9tYXBfbXV0ZXhfOwotfTsKLQotTXV0ZXggVGhyZWFkTG9jYWxSZWdpc3RyeUltcGw6Om11dGV4XyhNdXRleDo6a1N0YXRpY011dGV4KTsKLU11dGV4IFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjp0aHJlYWRfbWFwX211dGV4XyhNdXRleDo6a1N0YXRpY011dGV4KTsKLQotVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIFRocmVhZExvY2FsUmVnaXN0cnk6OkdldFZhbHVlT25DdXJyZW50VGhyZWFkKAotICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpIHsKLSAgcmV0dXJuIFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKLSAgICAgIHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci19Ci0KLXZvaWQgVGhyZWFkTG9jYWxSZWdpc3RyeTo6T25UaHJlYWRMb2NhbERlc3Ryb3llZCgKLSAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKSB7Ci0gIFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjpPblRocmVhZExvY2FsRGVzdHJveWVkKHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRSAmJiBHVEVTVF9PU19XSU5ET1dTCi0KLSNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLS8vIEltcGxlbWVudHMgUkUuICBDdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgotCi1SRTo6flJFKCkgewotICBpZiAoaXNfdmFsaWRfKSB7Ci0gICAgLy8gcmVnZnJlZSdpbmcgYW4gaW52YWxpZCByZWdleCBtaWdodCBjcmFzaCBiZWNhdXNlIHRoZSBjb250ZW50Ci0gICAgLy8gb2YgdGhlIHJlZ2V4IGlzIHVuZGVmaW5lZC4gU2luY2UgdGhlIHJlZ2V4J3MgYXJlIGVzc2VudGlhbGx5Ci0gICAgLy8gdGhlIHNhbWUsIG9uZSBjYW5ub3QgYmUgdmFsaWQgKG9yIGludmFsaWQpIHdpdGhvdXQgdGhlIG90aGVyCi0gICAgLy8gYmVpbmcgc28gdG9vLgotICAgIHJlZ2ZyZWUoJnBhcnRpYWxfcmVnZXhfKTsKLSAgICByZWdmcmVlKCZmdWxsX3JlZ2V4Xyk7Ci0gIH0KLSAgcG9zaXg6OkZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KLWJvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgewotICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOwotCi0gIHJlZ21hdGNoX3QgbWF0Y2g7Ci0gIHJldHVybiByZWdleGVjKCZyZS5mdWxsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCi0vLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgotYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmVnbWF0Y2hfdCBtYXRjaDsKLSAgcmV0dXJuIHJlZ2V4ZWMoJnJlLnBhcnRpYWxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKLX0KLQotLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotdm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgewotICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOwotCi0gIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQotICAvLyBmdWxsIG1hdGNoLgotICBjb25zdCBzaXplX3QgZnVsbF9yZWdleF9sZW4gPSBzdHJsZW4ocmVnZXgpICsgMTA7Ci0gIGNoYXIqIGNvbnN0IGZ1bGxfcGF0dGVybiA9IG5ldyBjaGFyW2Z1bGxfcmVnZXhfbGVuXTsKLQotICBzbnByaW50ZihmdWxsX3BhdHRlcm4sIGZ1bGxfcmVnZXhfbGVuLCAiXiglcykkIiwgcmVnZXgpOwotICBpc192YWxpZF8gPSByZWdjb21wKCZmdWxsX3JlZ2V4XywgZnVsbF9wYXR0ZXJuLCBSRUdfRVhURU5ERUQpID09IDA7Ci0gIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQotICAvLyBwcmV2aW91cyBleHByZXNzaW9uIHJldHVybnMgZmFsc2UuICBPdGhlcndpc2UgcGFydGlhbF9yZWdleF8gbWF5Ci0gIC8vIG5vdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBjYW4gbWF5IGNhdXNlIHRyb3VibGUgd2hlbiBpdCdzCi0gIC8vIGZyZWVkLgotICAvLwotICAvLyBTb21lIGltcGxlbWVudGF0aW9uIG9mIFBPU0lYIHJlZ2V4IChlLmcuIG9uIGF0IGxlYXN0IHNvbWUKLSAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQKLSAgLy8gcmVnZXguICBXZSBjaGFuZ2UgaXQgdG8gYW4gZXF1aXZhbGVudCBmb3JtICIoKSIgdG8gYmUgc2FmZS4KLSAgaWYgKGlzX3ZhbGlkXykgewotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4OwotICAgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCBwYXJ0aWFsX3JlZ2V4LCBSRUdfRVhURU5ERUQpID09IDA7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQotICAgICAgPDwgIlJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXgKLSAgICAgIDw8ICJcIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIjsKLQotICBkZWxldGVbXSBmdWxsX3BhdHRlcm47Ci19Ci0KLSNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCi0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUKLS8vIHRlcm1pbmF0aW5nICdcMCcgY2hhcmFjdGVyKS4KLWJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UKLS8vIHNpbWlsYXIgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiwgdGhlc2UgYXJlbid0IGFmZmVjdGVkIGJ5IHRoZQotLy8gY3VycmVudCBsb2NhbGUuCi1ib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Ci1ib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKSB7Ci0gIHJldHVybiBJc0luU2V0KGNoLCAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiIpOwotfQotYm9vbCBJc1JlcGVhdChjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiPyorIik7IH0KLWJvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIiBcZlxuXHJcdFx2Iik7IH0KLWJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsKLSAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKLSAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgotYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgewotICByZXR1cm4gKElzQXNjaWlQdW5jdChjKSB8fCBJc0luU2V0KGMsICJkRGZucnNTdHZ3VyIpKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXRvbSAoc3BlY2lmaWVkIGJ5IGVzY2FwZWQgYW5kIHBhdHRlcm4pCi0vLyBtYXRjaGVzIGNoLiAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGF0b20gaXMgaW52YWxpZC4KLWJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsKLSAgaWYgKGVzY2FwZWQpIHsgIC8vICJcXHAiIHdoZXJlIHAgaXMgcGF0dGVybl9jaGFyLgotICAgIHN3aXRjaCAocGF0dGVybl9jaGFyKSB7Ci0gICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7Ci0gICAgICBjYXNlICdEJzogcmV0dXJuICFJc0FzY2lpRGlnaXQoY2gpOwotICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOwotICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOwotICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOwotICAgICAgY2FzZSAncyc6IHJldHVybiBJc0FzY2lpV2hpdGVTcGFjZShjaCk7Ci0gICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7Ci0gICAgICBjYXNlICd0JzogcmV0dXJuIGNoID09ICdcdCc7Ci0gICAgICBjYXNlICd2JzogcmV0dXJuIGNoID09ICdcdic7Ci0gICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7Ci0gICAgICBjYXNlICdXJzogcmV0dXJuICFJc0FzY2lpV29yZENoYXIoY2gpOwotICAgIH0KLSAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOwotICB9Ci0KLSAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4KLXN0ZDo6c3RyaW5nIEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IoY29uc3QgY2hhciogcmVnZXgsIGludCBpbmRleCkgewotICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiU3ludGF4IGVycm9yIGF0IGluZGV4ICIgPDwgaW5kZXgKLSAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsKLS8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCi1ib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpIHsKLSAgaWYgKHJlZ2V4ID09IE5VTEwpIHsKLSAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZml4IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBpbiB0aGUKLSAgICAvLyBhc3NlcnRpb24gZmFpbHVyZXMgdG8gbWF0Y2ggd2hlcmUgdGhlIHJlZ2V4IGlzIHVzZWQgaW4gdXNlcgotICAgIC8vIGNvZGUuCi0gICAgQUREX0ZBSUxVUkUoKSA8PCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBpc192YWxpZCA9IHRydWU7Ci0KLSAgLy8gVHJ1ZSBpZmYgPywgKiwgb3IgKyBjYW4gZm9sbG93IHRoZSBwcmV2aW91cyBhdG9tLgotICBib29sIHByZXZfcmVwZWF0YWJsZSA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgewotICAgIGlmIChyZWdleFtpXSA9PSAnXFwnKSB7ICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UKLSAgICAgIGkrKzsKLSAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcIiA8PCByZWdleFtpXSA8PCAiXCIuIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHByZXZfcmVwZWF0YWJsZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuCi0gICAgICBjb25zdCBjaGFyIGNoID0gcmVnZXhbaV07Ci0KLSAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcuIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyQnICYmIHJlZ2V4W2kgKyAxXSAhPSAnXDAnKSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7Ci0gICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKElzSW5TZXQoY2gsICIoKVtde318IikpIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBpcyB1bnN1cHBvcnRlZC4iOwotICAgICAgICBpc192YWxpZCA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4uIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBpc192YWxpZDsKLX0KLQotLy8gTWF0Y2hlcyBhIHJlcGVhdGVkIHJlZ2V4IGF0b20gZm9sbG93ZWQgYnkgYSB2YWxpZCBzaW1wbGUgcmVndWxhcgotLy8gZXhwcmVzc2lvbi4gIFRoZSByZWdleCBhdG9tIGlzIGRlZmluZWQgYXMgYyBpZiBlc2NhcGVkIGlzIGZhbHNlLAotLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLAotLy8gb3IgKykuICBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHN0ciBjb250YWlucyB0b28gbWFueQotLy8gY2hhcmFjdGVycyB0byBiZSBpbmRleGFibGUgYnkgc2l6ZV90LCBpbiB3aGljaCBjYXNlIHRoZSB0ZXN0IHdpbGwKLS8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzCi0vLyBzdGQ6OnN0cmluZyBoYXMgaXQgdG9vLgotYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKLSAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LAotICAgIGNvbnN0IGNoYXIqIHN0cikgewotICBjb25zdCBzaXplX3QgbWluX2NvdW50ID0gKHJlcGVhdCA9PSAnKycpID8gMSA6IDA7Ci0gIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoKLSAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLTEpIC0gMTsKLSAgLy8gV2UgY2Fubm90IGNhbGwgbnVtZXJpY19saW1pdHM6Om1heCgpIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZQotICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLgotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IG1heF9jb3VudDsgKytpKSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4KLSAgICBpZiAoaSA+PSBtaW5fY291bnQgJiYgTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyICsgaSkpIHsKLSAgICAgIC8vIFdlIGhhdmUgZW5vdWdoIG1hdGNoZXMgYXQgdGhlIGhlYWQsIGFuZCB0aGUgdGFpbCBtYXRjaGVzIHRvby4KLSAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHIKLSAgICAgIC8vIChhcyBvcHBvc2VkIHRvICpob3cqIGl0IG1hdGNoZXMpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZpbmQgYQotICAgICAgLy8gZ3JlZWR5IG1hdGNoLgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChzdHJbaV0gPT0gJ1wwJyB8fCAhQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsIGMsIHN0cltpXSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2Ygc3RyLiAgcmVnZXggbXVzdCBiZSBhCi0vLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQotLy8gcmVzdWx0IGlzIHVuZGVmaW5lZC4KLWJvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7Ci0gIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nCi0gIC8vIHZhbGlkIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSdzIG5vdGhpbmcgYWZ0ZXIgIiQiIGluIGl0LgotICBpZiAoKnJlZ2V4ID09ICckJykKLSAgICByZXR1cm4gKnN0ciA9PSAnXDAnOwotCi0gIC8vIElzIHRoZSBmaXJzdCB0aGluZyBpbiByZWdleCBhbiBlc2NhcGUgc2VxdWVuY2U/Ci0gIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOwotICBpZiAoZXNjYXBlZCkKLSAgICArK3JlZ2V4OwotICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7Ci0gICAgLy8gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoKSBjYWxscyBNYXRjaFJlZ2V4QXRIZWFkKCksIHNvCi0gICAgLy8gaGVyZSdzIGFuIGluZGlyZWN0IHJlY3Vyc2lvbi4gIEl0IHRlcm1pbmF0ZXMgYXMgdGhlIHJlZ2V4IGdldHMKLSAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLgotICAgIHJldHVybiBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKLSAgICAgICAgZXNjYXBlZCwgcmVnZXhbMF0sIHJlZ2V4WzFdLCByZWdleCArIDIsIHN0cik7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gcmVnZXggaXNuJ3QgZW1wdHksIGlzbid0ICIkIiwgYW5kIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCi0gICAgLy8gcmVwZXRpdGlvbi4gIFdlIG1hdGNoIHRoZSBmaXJzdCBhdG9tIG9mIHJlZ2V4IHdpdGggdGhlIGZpcnN0Ci0gICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4KLSAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJykgJiYgQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsICpyZWdleCwgKnN0cikgJiYKLSAgICAgICAgTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0ciArIDEpOwotICB9Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUKLS8vIGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi0vLwotLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkCi0vLyB0aGUgcmVnZXggbGVuZ3RoLCBzbyB3ZSB3b24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJ1bm5pbmcgb3V0IG9mCi0vLyBzdGFjayBzcGFjZSBub3JtYWxseS4gIEluIHJhcmUgY2FzZXMgdGhlIHRpbWUgY29tcGxleGl0eSBjYW4gYmUKLS8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsCi0vLyBidXQgdXN1YWxseSBpdCdzIG11c3QgZmFzdGVyIChvZnRlbiBjbG9zZSB0byBsaW5lYXIpLgotYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgewotICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpyZWdleCA9PSAnXicpCi0gICAgcmV0dXJuIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIpOwotCi0gIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLgotICBkbyB7Ci0gICAgaWYgKE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0cikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfSB3aGlsZSAoKnN0cisrICE9ICdcMCcpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIEltcGxlbWVudHMgdGhlIFJFIGNsYXNzLgotCi1SRTo6flJFKCkgewotICBwb3NpeDo6RnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOwotICBwb3NpeDo6RnJlZShjb25zdF9jYXN0PGNoYXIqPihmdWxsX3BhdHRlcm5fKSk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCi1ib29sIFJFOjpGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUuZnVsbF9wYXR0ZXJuXywgc3RyKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKLS8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCi1ib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUucGF0dGVybl8sIHN0cik7Ci19Ci0KLS8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLXZvaWQgUkU6OkluaXQoY29uc3QgY2hhciogcmVnZXgpIHsKLSAgcGF0dGVybl8gPSBmdWxsX3BhdHRlcm5fID0gTlVMTDsKLSAgaWYgKHJlZ2V4ICE9IE5VTEwpIHsKLSAgICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOwotICB9Ci0KLSAgaXNfdmFsaWRfID0gVmFsaWRhdGVSZWdleChyZWdleCk7Ci0gIGlmICghaXNfdmFsaWRfKSB7Ci0gICAgLy8gTm8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0dGVybiB3aGVuIHRoZSByZWdleCBpcyBpbnZhbGlkLgotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4ocmVnZXgpOwotICAvLyBSZXNlcnZlcyBlbm91Z2ggYnl0ZXMgdG8gaG9sZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGEKLSAgLy8gZnVsbCBtYXRjaDogd2UgbmVlZCBzcGFjZSB0byBwcmVwZW5kIGEgJ14nLCBhcHBlbmQgYSAnJCcsIGFuZAotICAvLyB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3aXRoICdcMCcuCi0gIGNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihwb3NpeDo6TWFsbG9jKGxlbiArIDMpKTsKLSAgZnVsbF9wYXR0ZXJuXyA9IGJ1ZmZlcjsKLQotICBpZiAoKnJlZ2V4ICE9ICdeJykKLSAgICAqYnVmZmVyKysgPSAnXic7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gc3RhcnRzIHdpdGggJ14nLgotCi0gIC8vIFdlIGRvbid0IHVzZSBzbnByaW50ZiBvciBzdHJuY3B5LCBhcyB0aGV5IHRyaWdnZXIgYSB3YXJuaW5nIHdoZW4KLSAgLy8gY29tcGlsZWQgd2l0aCBWQysrIDguMC4KLSAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7Ci0gIGJ1ZmZlciArPSBsZW47Ci0KLSAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykKLSAgICAqYnVmZmVyKysgPSAnJCc7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gZW5kcyB3aXRoICckJy4KLQotICAqYnVmZmVyID0gJ1wwJzsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLWNvbnN0IGNoYXIga1Vua25vd25GaWxlW10gPSAidW5rbm93biBmaWxlIjsKLQotLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKLS8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KLUdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGUpOwotCi0gIGlmIChsaW5lIDwgMCkgewotICAgIHJldHVybiBmaWxlX25hbWUgKyAiOiI7Ci0gIH0KLSNpZmRlZiBfTVNDX1ZFUgotICByZXR1cm4gZmlsZV9uYW1lICsgIigiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpICsgIik6IjsKLSNlbHNlCi0gIHJldHVybiBmaWxlX25hbWUgKyAiOiIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSkgKyAiOiI7Ci0jZW5kaWYgIC8vIF9NU0NfVkVSCi19Ci0KLS8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgotLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bwotLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgotLy8gTm90ZSB0aGF0IEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oKSBkb2VzIE5PVCBhcHBlbmQgY29sb24KLS8vIHRvIHRoZSBmaWxlIGxvY2F0aW9uIGl0IHByb2R1Y2VzLCB1bmxpa2UgRm9ybWF0RmlsZUxvY2F0aW9uKCkuCi1HVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKLSAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUoZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZSk7Ci0KLSAgaWYgKGxpbmUgPCAwKQotICAgIHJldHVybiBmaWxlX25hbWU7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmlsZV9uYW1lICsgIjoiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpOwotfQotCi1HVGVzdExvZzo6R1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCi0gICAgOiBzZXZlcml0eV8oc2V2ZXJpdHkpIHsKLSAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0KLSAgICAgIHNldmVyaXR5ID09IEdURVNUX0lORk8gPyAgICAiWyAgSU5GTyBdIiA6Ci0gICAgICBzZXZlcml0eSA9PSBHVEVTVF9XQVJOSU5HID8gIltXQVJOSU5HXSIgOgotICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7Ci0gIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsIDw8IG1hcmtlciA8PCAiICIKLSAgICAgICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCkgPDwgIjogIjsKLX0KLQotLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCi1HVGVzdExvZzo6fkdUZXN0TG9nKCkgewotICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbDsKLSAgaWYgKHNldmVyaXR5XyA9PSBHVEVTVF9GQVRBTCkgewotICAgIHBvc2l4OjpGbHVzaCgpOwotICAgIHBvc2l4OjpBYm9ydCgpOwotICB9Ci19Ci0vLyBEaXNhYmxlIE1pY3Jvc29mdCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgUE9TSVggZnVuY3Rpb25zIGNhbGxlZCBmcm9tCi0vLyB0aGlzIGNsYXNzIChjcmVhdCwgZHVwLCBkdXAyLCBhbmQgY2xvc2UpCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2KQotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBPYmplY3QgdGhhdCBjYXB0dXJlcyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KLWNsYXNzIENhcHR1cmVkU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHJlZGlyZWN0cyB0aGUgc3RyZWFtIHRvIGEgdGVtcG9yYXJ5IGZpbGUuCi0gIGV4cGxpY2l0IENhcHR1cmVkU3RyZWFtKGludCBmZCkgOiBmZF8oZmQpLCB1bmNhcHR1cmVkX2ZkXyhkdXAoZmQpKSB7Ci0jIGlmIEdURVNUX09TX1dJTkRPV1MKLSAgICBjaGFyIHRlbXBfZGlyX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCi0gICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKLQotICAgIDo6R2V0VGVtcFBhdGhBKHNpemVvZih0ZW1wX2Rpcl9wYXRoKSwgdGVtcF9kaXJfcGF0aCk7Ci0gICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdF9yZWRpciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBHZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7Ci0gICAgR1RFU1RfQ0hFQ0tfKHN1Y2Nlc3MgIT0gMCkKLSAgICAgICAgPDwgIlVuYWJsZSB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiAiIDw8IHRlbXBfZGlyX3BhdGg7Ci0gICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKLSAgICBHVEVTVF9DSEVDS18oY2FwdHVyZWRfZmQgIT0gLTEpIDw8ICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZW1wX2ZpbGVfcGF0aDsKLSAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsKLSMgZWxzZQotICAgIC8vIFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSB0ZXN0IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQKLSAgICAvLyBkaXJlY3RvcnksIHNvIHdlIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIC90bXAgZGlyZWN0b3J5Ci0gICAgLy8gaW5zdGVhZC4gV2UgdXNlIC90bXAgb24gbW9zdCBzeXN0ZW1zLCBhbmQgL3NkY2FyZCBvbiBBbmRyb2lkLgotICAgIC8vIFRoYXQncyBiZWNhdXNlIEFuZHJvaWQgZG9lc24ndCBoYXZlIC90bXAuCi0jICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gICAgLy8gTm90ZTogQW5kcm9pZCBhcHBsaWNhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGNhbGwgdGhlIGZyYW1ld29yaydzCi0gICAgLy8gQ29udGV4dC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSBtZXRob2QgdGhyb3VnaCBKTkkgdG8gZ2V0Ci0gICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3b3JsZC13cml0YWJsZSBTRCBDYXJkIGRpcmVjdG9yeS4gSG93ZXZlciwKLSAgICAvLyB0aGlzIHJlcXVpcmVzIGEgQ29udGV4dCBoYW5kbGUsIHdoaWNoIGNhbm5vdCBiZSByZXRyaWV2ZWQKLSAgICAvLyBnbG9iYWxseSBmcm9tIG5hdGl2ZSBjb2RlLiBEb2luZyBzbyBhbHNvIHByZWNsdWRlcyBydW5uaW5nIHRoZQotICAgIC8vIGNvZGUgYXMgcGFydCBvZiBhIHJlZ3VsYXIgc3RhbmRhbG9uZSBleGVjdXRhYmxlLCB3aGljaCBkb2Vzbid0Ci0gICAgLy8gcnVuIGluIGEgRGFsdmlrIHByb2Nlc3MgKGUuZy4gd2hlbiBydW5uaW5nIGl0IHRocm91Z2ggJ2FkYiBzaGVsbCcpLgotICAgIC8vCi0gICAgLy8gVGhlIGxvY2F0aW9uIC9zZGNhcmQgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIG5hdGl2ZSBjb2RlCi0gICAgLy8gYW5kIGlzIHRoZSBvbmx5IGxvY2F0aW9uICh1bm9mZmljaWFsbHkpIHN1cHBvcnRlZCBieSB0aGUgQW5kcm9pZAotICAgIC8vIHRlYW0uIEl0J3MgZ2VuZXJhbGx5IGEgc3ltbGluayB0byB0aGUgcmVhbCBTRCBDYXJkIG1vdW50IHBvaW50Ci0gICAgLy8gd2hpY2ggY2FuIGJlIC9tbnQvc2RjYXJkLCAvbW50L3NkY2FyZDAsIC9zeXN0ZW0vbWVkaWEvc2RjYXJkLCBvcgotICAgIC8vIG90aGVyIE9FTS1jdXN0b21pemVkIGxvY2F0aW9ucy4gTmV2ZXIgcmVseSBvbiB0aGVzZSwgYW5kIGFsd2F5cwotICAgIC8vIHVzZSAvc2RjYXJkLgotICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi9zZGNhcmQvZ3Rlc3RfY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7Ci0jICBlbHNlCi0gICAgY2hhciBuYW1lX3RlbXBsYXRlW10gPSAiL3RtcC9jYXB0dXJlZF9zdHJlYW0uWFhYWFhYIjsKLSMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gbWtzdGVtcChuYW1lX3RlbXBsYXRlKTsKLSAgICBmaWxlbmFtZV8gPSBuYW1lX3RlbXBsYXRlOwotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICAgIHBvc2l4OjpGbHVzaCgpOwotICAgIGR1cDIoY2FwdHVyZWRfZmQsIGZkXyk7Ci0gICAgY2xvc2UoY2FwdHVyZWRfZmQpOwotICB9Ci0KLSAgfkNhcHR1cmVkU3RyZWFtKCkgewotICAgIHJlbW92ZShmaWxlbmFtZV8uY19zdHIoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmluZygpIHsKLSAgICBpZiAodW5jYXB0dXJlZF9mZF8gIT0gLTEpIHsKLSAgICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCBzdHJlYW0uCi0gICAgICBwb3NpeDo6Rmx1c2goKTsKLSAgICAgIGR1cDIodW5jYXB0dXJlZF9mZF8sIGZkXyk7Ci0gICAgICBjbG9zZSh1bmNhcHR1cmVkX2ZkXyk7Ci0gICAgICB1bmNhcHR1cmVkX2ZkXyA9IC0xOwotICAgIH0KLQotICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4oZmlsZW5hbWVfLmNfc3RyKCksICJyIik7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudCA9IFJlYWRFbnRpcmVGaWxlKGZpbGUpOwotICAgIHBvc2l4OjpGQ2xvc2UoZmlsZSk7Ci0gICAgcmV0dXJuIGNvbnRlbnQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGludCBmZF87ICAvLyBBIHN0cmVhbSB0byBjYXB0dXJlLgotICBpbnQgdW5jYXB0dXJlZF9mZF87Ci0gIC8vIE5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGhvbGRpbmcgdGhlIHN0ZGVyciBvdXRwdXQuCi0gIDo6c3RkOjpzdHJpbmcgZmlsZW5hbWVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQ2FwdHVyZWRTdHJlYW0pOwotfTsKLQotR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLXN0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRlcnIgPSBOVUxMOwotc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZG91dCA9IE5VTEw7Ci0KLS8vIFN0YXJ0cyBjYXB0dXJpbmcgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCi12b2lkIENhcHR1cmVTdHJlYW0oaW50IGZkLCBjb25zdCBjaGFyKiBzdHJlYW1fbmFtZSwgQ2FwdHVyZWRTdHJlYW0qKiBzdHJlYW0pIHsKLSAgaWYgKCpzdHJlYW0gIT0gTlVMTCkgewotICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJPbmx5IG9uZSAiIDw8IHN0cmVhbV9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBjYXB0dXJlciBjYW4gZXhpc3QgYXQgYSB0aW1lLiI7Ci0gIH0KLSAgKnN0cmVhbSA9IG5ldyBDYXB0dXJlZFN0cmVhbShmZCk7Ci19Ci0KLS8vIFN0b3BzIGNhcHR1cmluZyB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgotc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJlYW0oQ2FwdHVyZWRTdHJlYW0qKiBjYXB0dXJlZF9zdHJlYW0pIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudCA9ICgqY2FwdHVyZWRfc3RyZWFtKS0+R2V0Q2FwdHVyZWRTdHJpbmcoKTsKLQotICBkZWxldGUgKmNhcHR1cmVkX3N0cmVhbTsKLSAgKmNhcHR1cmVkX3N0cmVhbSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGNvbnRlbnQ7Ci19Ci0KLS8vIFN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0Lgotdm9pZCBDYXB0dXJlU3Rkb3V0KCkgewotICBDYXB0dXJlU3RyZWFtKGtTdGRPdXRGaWxlbm8sICJzdGRvdXQiLCAmZ19jYXB0dXJlZF9zdGRvdXQpOwotfQotCi0vLyBTdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KLXZvaWQgQ2FwdHVyZVN0ZGVycigpIHsKLSAgQ2FwdHVyZVN0cmVhbShrU3RkRXJyRmlsZW5vLCAic3RkZXJyIiwgJmdfY2FwdHVyZWRfc3RkZXJyKTsKLX0KLQotLy8gU3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgotc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdGRvdXQoKSB7Ci0gIHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRvdXQpOwotfQotCi0vLyBTdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCi1zdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpIHsKLSAgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZGVycik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi1zdGQ6OnN0cmluZyBUZW1wRGlyKCkgewotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gIHJldHVybiAiXFx0ZW1wXFwiOwotI2VsaWYgR1RFU1RfT1NfV0lORE9XUwotICBjb25zdCBjaGFyKiB0ZW1wX2RpciA9IHBvc2l4OjpHZXRFbnYoIlRFTVAiKTsKLSAgaWYgKHRlbXBfZGlyID09IE5VTEwgfHwgdGVtcF9kaXJbMF0gPT0gJ1wwJykKLSAgICByZXR1cm4gIlxcdGVtcFxcIjsKLSAgZWxzZSBpZiAodGVtcF9kaXJbc3RybGVuKHRlbXBfZGlyKSAtIDFdID09ICdcXCcpCi0gICAgcmV0dXJuIHRlbXBfZGlyOwotICBlbHNlCi0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRlbXBfZGlyKSArICJcXCI7Ci0jZWxpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gIHJldHVybiAiL3NkY2FyZC8iOwotI2Vsc2UKLSAgcmV0dXJuICIvdG1wLyI7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi19Ci0KLXNpemVfdCBHZXRGaWxlU2l6ZShGSUxFKiBmaWxlKSB7Ci0jaWYgIUdURVNUX09TX1NUQVJCT0FSRAotICBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGZ0ZWxsKGZpbGUpKTsKLSNlbHNlCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLXN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpIHsKLSNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECi0gIGNvbnN0IHNpemVfdCBmaWxlX3NpemUgPSBHZXRGaWxlU2l6ZShmaWxlKTsKLSAgY2hhciogY29uc3QgYnVmZmVyID0gbmV3IGNoYXJbZmlsZV9zaXplXTsKLQotICBzaXplX3QgYnl0ZXNfbGFzdF9yZWFkID0gMDsgIC8vICMgb2YgYnl0ZXMgcmVhZCBpbiB0aGUgbGFzdCBmcmVhZCgpCi0gIHNpemVfdCBieXRlc19yZWFkID0gMDsgICAgICAgLy8gIyBvZiBieXRlcyByZWFkIHNvIGZhcgotCi0gIGZzZWVrKGZpbGUsIDAsIFNFRUtfU0VUKTsKLQotICAvLyBLZWVwcyByZWFkaW5nIHRoZSBmaWxlIHVudGlsIHdlIGNhbm5vdCByZWFkIGZ1cnRoZXIgb3IgdGhlCi0gIC8vIHByZS1kZXRlcm1pbmVkIGZpbGUgc2l6ZSBpcyByZWFjaGVkLgotICBkbyB7Ci0gICAgYnl0ZXNfbGFzdF9yZWFkID0gZnJlYWQoYnVmZmVyK2J5dGVzX3JlYWQsIDEsIGZpbGVfc2l6ZS1ieXRlc19yZWFkLCBmaWxlKTsKLSAgICBieXRlc19yZWFkICs9IGJ5dGVzX2xhc3RfcmVhZDsKLSAgfSB3aGlsZSAoYnl0ZXNfbGFzdF9yZWFkID4gMCAmJiBieXRlc19yZWFkIDwgZmlsZV9zaXplKTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50KGJ1ZmZlciwgYnl0ZXNfcmVhZCk7Ci0gIGRlbGV0ZVtdIGJ1ZmZlcjsKLQotICByZXR1cm4gY29udGVudDsKLSNlbHNlCi0gIHJldHVybiBzdGQ6OnN0cmluZygpOwotI2VuZGlmCi19Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi1zdGF0aWMgY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiogZ19pbmplY3RlZF90ZXN0X2FyZ3ZzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMOyAgLy8gT3duZWQuCi0KLXZvaWQgU2V0SW5qZWN0YWJsZUFyZ3ZzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGFyZ3ZzKSB7Ci0gIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gYXJndnMpCi0gICAgZGVsZXRlIGdfaW5qZWN0ZWRfdGVzdF9hcmd2czsKLSAgZ19pbmplY3RlZF90ZXN0X2FyZ3ZzID0gYXJndnM7Ci19Ci0KLWNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpIHsKLSAgaWYgKGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuICpnX2luamVjdGVkX3Rlc3RfYXJndnM7Ci0gIH0KLSAgcmV0dXJuIEdldEFyZ3ZzKCk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotbmFtZXNwYWNlIHBvc2l4IHsKLXZvaWQgQWJvcnQoKSB7Ci0gIERlYnVnQnJlYWsoKTsKLSAgVGVybWluYXRlUHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAxKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBwb3NpeAotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotLy8gZ2l2ZW4gZmxhZy4gIEZvciBleGFtcGxlLCBGbGFnVG9FbnZWYXIoImZvbyIpIHdpbGwgcmV0dXJuCi0vLyAiR1RFU1RfRk9PIiBpbiB0aGUgb3Blbi1zb3VyY2UgdmVyc2lvbi4KLXN0YXRpYyBzdGQ6OnN0cmluZyBGbGFnVG9FbnZWYXIoY29uc3QgY2hhciogZmxhZykgewotICBjb25zdCBzdGQ6OnN0cmluZyBmdWxsX2ZsYWcgPQotICAgICAgKE1lc3NhZ2UoKSA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgZmxhZykuR2V0U3RyaW5nKCk7Ci0KLSAgTWVzc2FnZSBlbnZfdmFyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBmdWxsX2ZsYWcubGVuZ3RoKCk7IGkrKykgewotICAgIGVudl92YXIgPDwgVG9VcHBlcihmdWxsX2ZsYWcuY19zdHIoKVtpXSk7Ci0gIH0KLQotICByZXR1cm4gZW52X3Zhci5HZXRTdHJpbmcoKTsKLX0KLQotLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcwotLy8gdGhlIHJlc3VsdCB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUKLS8vIHVuY2hhbmdlZCBhbmQgcmV0dXJucyBmYWxzZS4KLWJvb2wgUGFyc2VJbnQzMihjb25zdCBNZXNzYWdlJiBzcmNfdGV4dCwgY29uc3QgY2hhciogc3RyLCBJbnQzMiogdmFsdWUpIHsKLSAgLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBhIGRlY2ltYWwgaW50ZWdlci4KLSAgY2hhciogZW5kID0gTlVMTDsKLSAgY29uc3QgbG9uZyBsb25nX3ZhbHVlID0gc3RydG9sKHN0ciwgJmVuZCwgMTApOyAgLy8gTk9MSU5UCi0KLSAgLy8gSGFzIHN0cnRvbCgpIGNvbnN1bWVkIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmc/Ci0gIGlmICgqZW5kICE9ICdcMCcpIHsKLSAgICAvLyBObyAtIGFuIGludmFsaWQgY2hhcmFjdGVyIHdhcyBlbmNvdW50ZXJlZC4KLSAgICBNZXNzYWdlIG1zZzsKLSAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKLSAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCi0gICAgICAgIDw8ICIgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsKLSAgICBwb3NpeDo6UHJpbnRGKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSAgICBwb3NpeDo6Rmx1c2goKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KLSAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOwotICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8Ci0gICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucwotICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKLSAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCi0gICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KLSAgICAgICkgewotICAgIE1lc3NhZ2UgbXNnOwotICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAotICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKLSAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKLSAgICBwb3NpeDo6UHJpbnRGKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSAgICBwb3NpeDo6Rmx1c2goKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqdmFsdWUgPSByZXN1bHQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWFkcyBhbmQgcmV0dXJucyB0aGUgQm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCi0vLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCi0vLwotLy8gVGhlIHZhbHVlIGlzIGNvbnNpZGVyZWQgdHJ1ZSBpZmYgaXQncyBub3QgIjAiLgotYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWx1ZSkgewotI2lmIGRlZmluZWQoR1RFU1RfR0VUX0JPT0xfRlJPTV9FTlZfKQotICByZXR1cm4gR1RFU1RfR0VUX0JPT0xfRlJPTV9FTlZfKGZsYWcsIGRlZmF1bHRfdmFsdWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0dFVF9CT09MX0ZST01fRU5WXykKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOwotICByZXR1cm4gc3RyaW5nX3ZhbHVlID09IE5VTEwgPwotICAgICAgZGVmYXVsdF92YWx1ZSA6IHN0cmNtcChzdHJpbmdfdmFsdWUsICIwIikgIT0gMDsKLX0KLQotLy8gUmVhZHMgYW5kIHJldHVybnMgYSAzMi1iaXQgaW50ZWdlciBzdG9yZWQgaW4gdGhlIGVudmlyb25tZW50Ci0vLyB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCBpc24ndCBzZXQgb3IKLS8vIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgMzItYml0IGludGVnZXIsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KLUludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsdWUpIHsKLSNpZiBkZWZpbmVkKEdURVNUX0dFVF9JTlQzMl9GUk9NX0VOVl8pCi0gIHJldHVybiBHVEVTVF9HRVRfSU5UMzJfRlJPTV9FTlZfKGZsYWcsIGRlZmF1bHRfdmFsdWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0dFVF9JTlQzMl9GUk9NX0VOVl8pCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKLSAgaWYgKHN0cmluZ192YWx1ZSA9PSBOVUxMKSB7Ci0gICAgLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCi0gICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci0gIH0KLQotICBJbnQzMiByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOwotICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJFbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IGVudl92YXIsCi0gICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWUsICZyZXN1bHQpKSB7Ci0gICAgcG9zaXg6OlByaW50RigiVGhlIGRlZmF1bHQgdmFsdWUgJXMgaXMgdXNlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGRlZmF1bHRfdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIHBvc2l4OjpGbHVzaCgpOwotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCi0vLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCi1jb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgewotI2lmIGRlZmluZWQoR1RFU1RfR0VUX1NUUklOR19GUk9NX0VOVl8pCi0gIHJldHVybiBHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXyhmbGFnLCBkZWZhdWx0X3ZhbHVlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXykKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7Ci0gIHJldHVybiB2YWx1ZSA9PSBOVUxMID8gZGVmYXVsdF92YWx1ZSA6IHZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDU1NzBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKLS8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6Ci0vLwotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7Ci0vLwotLy8gSXQgdXNlcyB0aGUgPDwgb3BlcmF0b3Igd2hlbiBwb3NzaWJsZSwgYW5kIHByaW50cyB0aGUgYnl0ZXMgaW4gdGhlCi0vLyBvYmplY3Qgb3RoZXJ3aXNlLiAgQSB1c2VyIGNhbiBvdmVycmlkZSBpdHMgYmVoYXZpb3IgZm9yIGEgY2xhc3MKLS8vIHR5cGUgRm9vIGJ5IGRlZmluaW5nIGVpdGhlciBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiwgY29uc3QgRm9vJikKLS8vIG9yIHZvaWQgUHJpbnRUbyhjb25zdCBGb28mLCA6OnN0ZDo6b3N0cmVhbSopIGluIHRoZSBuYW1lc3BhY2UgdGhhdAotLy8gZGVmaW5lcyBGb28uCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgotI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3djaGFyPgotI2VuZGlmICAvLyAhZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjpzdGQ6Om9zdHJlYW07Ci0KLS8vIFByaW50cyBhIHNlZ21lbnQgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdC4KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfCi12b2lkIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIG9zdHJlYW0qIG9zKSB7Ci0gIGNoYXIgdGV4dFs1XSA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGogPSBzdGFydCArIGk7Ci0gICAgaWYgKGkgIT0gMCkgewotICAgICAgLy8gT3JnYW5pemVzIHRoZSBieXRlcyBpbnRvIGdyb3VwcyBvZiAyIGZvciBlYXN5IHBhcnNpbmcgYnkKLSAgICAgIC8vIGh1bWFuLgotICAgICAgaWYgKChqICUgMikgPT0gMCkKLSAgICAgICAgKm9zIDw8ICcgJzsKLSAgICAgIGVsc2UKLSAgICAgICAgKm9zIDw8ICctJzsKLSAgICB9Ci0gICAgR1RFU1RfU05QUklOVEZfKHRleHQsIHNpemVvZih0ZXh0KSwgIiUwMlgiLCBvYmpfYnl0ZXNbal0pOwotICAgICpvcyA8PCB0ZXh0OwotICB9Ci19Ci0KLS8vIFByaW50cyB0aGUgYnl0ZXMgaW4gdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLgotdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgewotICAvLyBUZWxscyB0aGUgdXNlciBob3cgYmlnIHRoZSBvYmplY3QgaXMuCi0gICpvcyA8PCBjb3VudCA8PCAiLWJ5dGUgb2JqZWN0IDwiOwotCi0gIGNvbnN0IHNpemVfdCBrVGhyZXNob2xkID0gMTMyOwotICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDY0OwotICAvLyBJZiB0aGUgb2JqZWN0IHNpemUgaXMgYmlnZ2VyIHRoYW4ga1RocmVzaG9sZCwgd2UnbGwgaGF2ZSB0byBvbWl0Ci0gIC8vIHNvbWUgZGV0YWlscyBieSBwcmludGluZyBvbmx5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Qga0NodW5rU2l6ZQotICAvLyBieXRlcy4KLSAgLy8gVE9ETyh3YW4pOiBsZXQgdGhlIHVzZXIgY29udHJvbCB0aGUgdGhyZXNob2xkIHVzaW5nIGEgZmxhZy4KLSAgaWYgKGNvdW50IDwga1RocmVzaG9sZCkgewotICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgMCwgY291bnQsIG9zKTsKLSAgfSBlbHNlIHsKLSAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGtDaHVua1NpemUsIG9zKTsKLSAgICAqb3MgPDwgIiAuLi4gIjsKLSAgICAvLyBSb3VuZHMgdXAgdG8gMi1ieXRlIGJvdW5kYXJ5LgotICAgIGNvbnN0IHNpemVfdCByZXN1bWVfcG9zID0gKGNvdW50IC0ga0NodW5rU2l6ZSArIDEpLzIqMjsKLSAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIHJlc3VtZV9wb3MsIGNvdW50IC0gcmVzdW1lX3Bvcywgb3MpOwotICB9Ci0gICpvcyA8PCAiPiI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgaW50ZXJuYWwyIHsKLQotLy8gRGVsZWdhdGVzIHRvIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbCgpIHRvIHByaW50IHRoZSBieXRlcyBpbiB0aGUKLS8vIGdpdmVuIG9iamVjdC4gIFRoZSBkZWxlZ2F0aW9uIHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uLCB3aGljaAotLy8gdXNlcyB0aGUgPDwgb3BlcmF0b3IgYW5kIHRodXMgaXMgZWFzaWVyIGRvbmUgb3V0c2lkZSBvZiB0aGUKLS8vIDo6dGVzdGluZzo6aW50ZXJuYWwgbmFtZXNwYWNlLCB3aGljaCBjb250YWlucyBhIDw8IG9wZXJhdG9yIHRoYXQKLS8vIHNvbWV0aW1lcyBjb25mbGljdHMgd2l0aCB0aGUgb25lIGluIFNUTC4KLXZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbChvYmpfYnl0ZXMsIGNvdW50LCBvcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbDIKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBhIGNoYXIgKG9yIHdjaGFyX3QpLCB3ZSBwcmludCBpdCBpbiBvbmUKLS8vIG9mIHRocmVlIGZvcm1hdHM6Ci0vLyAgIC0gYXMgaXMgaWYgaXQncyBhIHByaW50YWJsZSBBU0NJSSAoZS5nLiAnYScsICcyJywgJyAnKSwKLS8vICAgLSBhcyBhIGhleGlkZWNpbWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHg3RicpLCBvcgotLy8gICAtIGFzIGEgc3BlY2lhbCBlc2NhcGUgc2VxdWVuY2UgKGUuZy4gJ1xyJywgJ1xuJykuCi1lbnVtIENoYXJGb3JtYXQgewotICBrQXNJcywKLSAga0hleEVzY2FwZSwKLSAga1NwZWNpYWxFc2NhcGUKLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBjIGlzIGEgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3Rlci4gIFdlIHRlc3QgdGhlCi0vLyB2YWx1ZSBvZiBjIGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZyBpc3ByaW50KCksIHdoaWNoIGlzIGJ1Z2d5IG9uCi0vLyBXaW5kb3dzIE1vYmlsZS4KLWlubGluZSBib29sIElzUHJpbnRhYmxlQXNjaWkod2NoYXJfdCBjKSB7Ci0gIHJldHVybiAweDIwIDw9IGMgJiYgYyA8PSAweDdFOwotfQotCi0vLyBQcmludHMgYSB3aWRlIG9yIG5hcnJvdyBjaGFyIGMgYXMgYSBjaGFyYWN0ZXIgbGl0ZXJhbCB3aXRob3V0IHRoZQotLy8gcXVvdGVzLCBlc2NhcGluZyBpdCB3aGVuIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgotLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IFVuc2lnbmVkQ2hhciBpcyB0aGUgdW5zaWduZWQgdmVyc2lvbiBvZiBDaGFyLAotLy8gd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBVbnNpZ25lZENoYXIsIHR5cGVuYW1lIENoYXI+Ci1zdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzQ2hhckxpdGVyYWxUbyhDaGFyIGMsIG9zdHJlYW0qIG9zKSB7Ci0gIHN3aXRjaCAoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oYykpIHsKLSAgICBjYXNlIEwnXDAnOgotICAgICAgKm9zIDw8ICJcXDAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1wnJzoKLSAgICAgICpvcyA8PCAiXFwnIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcXCc6Ci0gICAgICAqb3MgPDwgIlxcXFwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1xhJzoKLSAgICAgICpvcyA8PCAiXFxhIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcYic6Ci0gICAgICAqb3MgPDwgIlxcYiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXGYnOgotICAgICAgKm9zIDw8ICJcXGYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1xuJzoKLSAgICAgICpvcyA8PCAiXFxuIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdccic6Ci0gICAgICAqb3MgPDwgIlxcciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXHQnOgotICAgICAgKm9zIDw8ICJcXHQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1x2JzoKLSAgICAgICpvcyA8PCAiXFx2IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoSXNQcmludGFibGVBc2NpaShjKSkgewotICAgICAgICAqb3MgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oYyk7Ci0gICAgICAgIHJldHVybiBrQXNJczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpvcyA8PCAiXFx4IiArIFN0cmluZzo6Rm9ybWF0SGV4SW50KHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOwotICAgICAgICByZXR1cm4ga0hleEVzY2FwZTsKLSAgICAgIH0KLSAgfQotICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7Ci19Ci0KLS8vIFByaW50cyBhIHdjaGFyX3QgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgotLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCi1zdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKHdjaGFyX3QgYywgb3N0cmVhbSogb3MpIHsKLSAgc3dpdGNoIChjKSB7Ci0gICAgY2FzZSBMJ1wnJzoKLSAgICAgICpvcyA8PCAiJyI7Ci0gICAgICByZXR1cm4ga0FzSXM7Ci0gICAgY2FzZSBMJyInOgotICAgICAgKm9zIDw8ICJcXFwiIjsKLSAgICAgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIFByaW50QXNDaGFyTGl0ZXJhbFRvPHdjaGFyX3Q+KGMsIG9zKTsKLSAgfQotfQotCi0vLyBQcmludHMgYSBjaGFyIGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4KLS8vIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgotc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjaGFyIGMsIG9zdHJlYW0qIG9zKSB7Ci0gIHJldHVybiBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKAotICAgICAgc3RhdGljX2Nhc3Q8d2NoYXJfdD4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykpLCBvcyk7Ci19Ci0KLS8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXJhY3RlciBjIGFuZCBpdHMgY29kZS4gICdcMCcgaXMgcHJpbnRlZAotLy8gYXMgIidcXDAnIiwgb3RoZXIgdW5wcmludGFibGUgY2hhcmFjdGVycyBhcmUgYWxzbyBwcm9wZXJseSBlc2NhcGVkCi0vLyB1c2luZyB0aGUgc3RhbmRhcmQgQysrIGVzY2FwZSBzZXF1ZW5jZS4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAotLy8gVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgotdm9pZCBQcmludENoYXJBbmRDb2RlVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgewotICAvLyBGaXJzdCwgcHJpbnQgYyBhcyBhIGxpdGVyYWwgaW4gdGhlIG1vc3QgcmVhZGFibGUgZm9ybSB3ZSBjYW4gZmluZC4KLSAgKm9zIDw8ICgoc2l6ZW9mKGMpID4gMSkgPyAiTCciIDogIiciKTsKLSAgY29uc3QgQ2hhckZvcm1hdCBmb3JtYXQgPSBQcmludEFzQ2hhckxpdGVyYWxUbzxVbnNpZ25lZENoYXI+KGMsIG9zKTsKLSAgKm9zIDw8ICInIjsKLQotICAvLyBUbyBhaWQgdXNlciBkZWJ1Z2dpbmcsIHdlIGFsc28gcHJpbnQgYydzIGNvZGUgaW4gZGVjaW1hbCwgdW5sZXNzCi0gIC8vIGl0J3MgMCAoaW4gd2hpY2ggY2FzZSBjIHdhcyBwcmludGVkIGFzICdcXDAnLCBtYWtpbmcgdGhlIGNvZGUKLSAgLy8gb2J2aW91cykuCi0gIGlmIChjID09IDApCi0gICAgcmV0dXJuOwotICAqb3MgPDwgIiAoIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGMpOwotCi0gIC8vIEZvciBtb3JlIGNvbnZlbmllbmNlLCB3ZSBwcmludCBjJ3MgY29kZSBhZ2FpbiBpbiBoZXhpZGVjaW1hbCwKLSAgLy8gdW5sZXNzIGMgd2FzIGFscmVhZHkgcHJpbnRlZCBpbiB0aGUgZm9ybSAnXHgjIycgb3IgdGhlIGNvZGUgaXMgaW4KLSAgLy8gWzEsIDldLgotICBpZiAoZm9ybWF0ID09IGtIZXhFc2NhcGUgfHwgKDEgPD0gYyAmJiBjIDw9IDkpKSB7Ci0gICAgLy8gRG8gbm90aGluZy4KLSAgfSBlbHNlIHsKLSAgICAqb3MgPDwgIiwgMHgiIDw8IFN0cmluZzo6Rm9ybWF0SGV4SW50KHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOwotICB9Ci0gICpvcyA8PCAiKSI7Ci19Ci0KLXZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludENoYXJBbmRDb2RlVG88dW5zaWduZWQgY2hhcj4oYywgb3MpOwotfQotdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludENoYXJBbmRDb2RlVG88dW5zaWduZWQgY2hhcj4oYywgb3MpOwotfQotCi0vLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKLS8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBjb2RlLiAgTCdcMCcgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4KLXZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCBvc3RyZWFtKiBvcykgewotICBQcmludENoYXJBbmRDb2RlVG88d2NoYXJfdD4od2MsIG9zKTsKLX0KLQotLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBvc3RyZWFtLiAgQ2hhclR5cGUgbXVzdCBiZSBlaXRoZXIKLS8vIGNoYXIgb3Igd2NoYXJfdC4KLS8vIFRoZSBhcnJheSBzdGFydHMgYXQgYmVnaW4sIHRoZSBsZW5ndGggaXMgbGVuLCBpdCBtYXkgaW5jbHVkZSAnXDAnIGNoYXJhY3RlcnMKLS8vIGFuZCBtYXkgbm90IGJlIE5VTC10ZXJtaW5hdGVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8KLXN0YXRpYyB2b2lkIFByaW50Q2hhcnNBc1N0cmluZ1RvKAotICAgIGNvbnN0IENoYXJUeXBlKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKLSAgY29uc3QgY2hhciogY29uc3Qga1F1b3RlQmVnaW4gPSBzaXplb2YoQ2hhclR5cGUpID09IDEgPyAiXCIiIDogIkxcIiI7Ci0gICpvcyA8PCBrUXVvdGVCZWdpbjsKLSAgYm9vbCBpc19wcmV2aW91c19oZXggPSBmYWxzZTsKLSAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgKytpbmRleCkgewotICAgIGNvbnN0IENoYXJUeXBlIGN1ciA9IGJlZ2luW2luZGV4XTsKLSAgICBpZiAoaXNfcHJldmlvdXNfaGV4ICYmIElzWERpZ2l0KGN1cikpIHsKLSAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBvZiAnXHguLicgZm9ybSBhbmQgdGhpcyBjaGFyYWN0ZXIgY2FuIGJlCi0gICAgICAvLyBpbnRlcnByZXRlZCBhcyBhbm90aGVyIGhleGFkZWNpbWFsIGRpZ2l0IGluIGl0cyBudW1iZXIuIEJyZWFrIHN0cmluZyB0bwotICAgICAgLy8gZGlzYW1iaWd1YXRlLgotICAgICAgKm9zIDw8ICJcIiAiIDw8IGtRdW90ZUJlZ2luOwotICAgIH0KLSAgICBpc19wcmV2aW91c19oZXggPSBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKGN1ciwgb3MpID09IGtIZXhFc2NhcGU7Ci0gIH0KLSAgKm9zIDw8ICJcIiI7Ci19Ci0KLS8vIFByaW50cyBhIChjb25zdCkgY2hhci93Y2hhcl90IGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzCi0vLyAnYmVnaW4nLiAgQ2hhclR5cGUgbXVzdCBiZSBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8KLXN0YXRpYyB2b2lkIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KAotICAgIGNvbnN0IENoYXJUeXBlKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKLSAgLy8gVGhlIGNvZGUKLSAgLy8gICBjb25zdCBjaGFyIGtGb29bXSA9ICJmb28iOwotICAvLyBnZW5lcmF0ZXMgYW4gYXJyYXkgb2YgNCwgbm90IDMsIGVsZW1lbnRzLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyAnXDAnLgotICAvLwotICAvLyBUaGVyZWZvcmUgd2hlbiBwcmludGluZyBhIGNoYXIgYXJyYXksIHdlIGRvbid0IHByaW50IHRoZSBsYXN0IGVsZW1lbnQgaWYKLSAgLy8gaXQncyAnXDAnLCBzdWNoIHRoYXQgdGhlIG91dHB1dCBtYXRjaGVzIHRoZSBzdHJpbmcgbGl0ZXJhbCBhcyBpdCdzCi0gIC8vIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBjb2RlLgotICBpZiAobGVuID4gMCAmJiBiZWdpbltsZW4gLSAxXSA9PSAnXDAnKSB7Ci0gICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8oYmVnaW4sIGxlbiAtIDEsIG9zKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBJZiwgaG93ZXZlciwgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgbm90ICdcMCcsIGUuZy4KLSAgLy8gICAgY29uc3QgY2hhciBrRm9vW10gPSB7ICdmJywgJ28nLCAnbycgfTsKLSAgLy8gd2UgbXVzdCBwcmludCB0aGUgZW50aXJlIGFycmF5LiAgV2UgYWxzbyBwcmludCBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUKLSAgLy8gdGhhdCB0aGUgYXJyYXkgaXMgbm90IE5VTC10ZXJtaW5hdGVkLgotICBQcmludENoYXJzQXNTdHJpbmdUbyhiZWdpbiwgbGVuLCBvcyk7Ci0gICpvcyA8PCAiIChubyB0ZXJtaW5hdGluZyBOVUwpIjsKLX0KLQotLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyIGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzICdiZWdpbicuCi12b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7Ci0gIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzCi0vLyAnYmVnaW4nLgotdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgewotICBVbml2ZXJzYWxQcmludENoYXJBcnJheShiZWdpbiwgbGVuLCBvcyk7Ci19Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gQyBzdHJpbmcgdG8gdGhlIG9zdHJlYW0uCi12b2lkIFByaW50VG8oY29uc3QgY2hhciogcywgb3N0cmVhbSogb3MpIHsKLSAgaWYgKHMgPT0gTlVMTCkgewotICAgICpvcyA8PCAiTlVMTCI7Ci0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8IEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpIDw8ICIgcG9pbnRpbmcgdG8gIjsKLSAgICBQcmludENoYXJzQXNTdHJpbmdUbyhzLCBpbnRlcm5hbDo6cG9zaXg6OlN0ckxlbihzKSwgb3MpOwotICB9Ci19Ci0KLS8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKLS8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCi0vLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCi0vLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCi0vLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgotLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQotLy8gUHJpbnRzIHRoZSBnaXZlbiB3aWRlIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgotdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIGlmIChzID09IE5VTEwpIHsKLSAgICAqb3MgPDwgIk5VTEwiOwotICB9IGVsc2UgewotICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7Ci0gICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgc3RkOjp3Y3NsZW4ocyksIG9zKTsKLSAgfQotfQotI2VuZGlmICAvLyB3Y2hhcl90IGlzIG5hdGl2ZQotCi0vLyBQcmludHMgYSA6OnN0cmluZyBvYmplY3QuCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLXZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKLSAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLXZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgewotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgOjp3c3RyaW5nIG9iamVjdC4KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLXZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgewotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLXZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MgYi90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZmIzNDAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgZXhpc3RzIHRvCi0vLyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbiB0aGUKLS8vIHVzZXIncyBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOwotCi0vLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrIHRyYWNlCi0vLyBpbiBpdC4KLXN0ZDo6c3RyaW5nIFRlc3RQYXJ0UmVzdWx0OjpFeHRyYWN0U3VtbWFyeShjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0YWNrX3RyYWNlID0gc3Ryc3RyKG1lc3NhZ2UsIGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlcik7Ci0gIHJldHVybiBzdGFja190cmFjZSA9PSBOVUxMID8gbWVzc2FnZSA6Ci0gICAgICBzdGQ6OnN0cmluZyhtZXNzYWdlLCBzdGFja190cmFjZSk7Ci19Ci0KLS8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdC4KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIHJldHVybiBvcwotICAgICAgPDwgcmVzdWx0LmZpbGVfbmFtZSgpIDw8ICI6IiA8PCByZXN1bHQubGluZV9udW1iZXIoKSA8PCAiOiAiCi0gICAgICA8PCAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOgotICAgICAgICAgIHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPyAiRmF0YWwgZmFpbHVyZSIgOgotICAgICAgICAgICJOb24tZmF0YWwgZmFpbHVyZSIpIDw8ICI6XG4iCi0gICAgICA8PCByZXN1bHQubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKLX0KLQotLy8gQXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KLXZvaWQgVGVzdFBhcnRSZXN1bHRBcnJheTo6QXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgYXJyYXlfLnB1c2hfYmFjayhyZXN1bHQpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBUZXN0UGFydFJlc3VsdCBhdCB0aGUgZ2l2ZW4gaW5kZXggKDAtYmFzZWQpLgotY29uc3QgVGVzdFBhcnRSZXN1bHQmIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKSkgewotICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCJcbkludmFsaWQgaW5kZXggKCVkKSBpbnRvIFRlc3RQYXJ0UmVzdWx0QXJyYXkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7Ci0gIH0KLQotICByZXR1cm4gYXJyYXlfW2luZGV4XTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgotaW50IFRlc3RQYXJ0UmVzdWx0QXJyYXk6OnNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5Xy5zaXplKCkpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpCi0gICAgOiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfKGZhbHNlKSwKLSAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyhHZXRVbml0VGVzdEltcGwoKS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSkgewotICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7Ci19Ci0KLUhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6fkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpIHsKLSAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAotICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKTsKLX0KLQotdm9pZCBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgaWYgKHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpKQotICAgIGhhc19uZXdfZmF0YWxfZmFpbHVyZV8gPSB0cnVlOwotICBvcmlnaW5hbF9yZXBvcnRlcl8tPlJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODdkNzYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGluIHN0ci4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgc3RyCi0vLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLXN0YXRpYyBjb25zdCBjaGFyKiBTa2lwU3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgewotICB3aGlsZSAoSXNTcGFjZSgqc3RyKSkKLSAgICBzdHIrKzsKLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTcGxpdEludG9UZXN0TmFtZXMoY29uc3QgY2hhciogc3JjKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lX3ZlYzsKLSAgc3JjID0gU2tpcFNwYWNlcyhzcmMpOwotICBmb3IgKDsgc3JjICE9IE5VTEw7IHNyYyA9IFNraXBDb21tYShzcmMpKSB7Ci0gICAgbmFtZV92ZWMucHVzaF9iYWNrKFN0cmlwVHJhaWxpbmdTcGFjZXMoR2V0UHJlZml4VW50aWxDb21tYShzcmMpKSk7Ci0gIH0KLSAgcmV0dXJuIG5hbWVfdmVjOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IHJlZ2lzdGVyZWRfdGVzdHMgbWF0Y2ggdGhlIHRlc3QgbmFtZXMgaW4KLS8vIHJlZ2lzdGVyZWRfdGVzdHNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKLS8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCi1jb25zdCBjaGFyKiBUeXBlZFRlc3RDYXNlUFN0YXRlOjpWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAotICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKSB7Ci0gIHR5cGVkZWYgUmVnaXN0ZXJlZFRlc3RzTWFwOjpjb25zdF9pdGVyYXRvciBSZWdpc3RlcmVkVGVzdEl0ZXI7Ci0gIHJlZ2lzdGVyZWRfID0gdHJ1ZTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZV92ZWMgPSBTcGxpdEludG9UZXN0TmFtZXMocmVnaXN0ZXJlZF90ZXN0cyk7Ci0KLSAgTWVzc2FnZSBlcnJvcnM7Ci0KLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRlc3RzOwotICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmFtZV9pdCA9IG5hbWVfdmVjLmJlZ2luKCk7Ci0gICAgICAgbmFtZV9pdCAhPSBuYW1lX3ZlYy5lbmQoKTsgKytuYW1lX2l0KSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSAqbmFtZV9pdDsKLSAgICBpZiAodGVzdHMuY291bnQobmFtZSkgIT0gMCkgewotICAgICAgZXJyb3JzIDw8ICJUZXN0ICIgPDwgbmFtZSA8PCAiIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZS5cbiI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yIChSZWdpc3RlcmVkVGVzdEl0ZXIgaXQgPSByZWdpc3RlcmVkX3Rlc3RzXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gcmVnaXN0ZXJlZF90ZXN0c18uZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBpZiAobmFtZSA9PSBpdC0+Zmlyc3QpIHsKLSAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZm91bmQpIHsKLSAgICAgIHRlc3RzLmluc2VydChuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgZXJyb3JzIDw8ICJObyB0ZXN0IG5hbWVkICIgPDwgbmFtZQotICAgICAgICAgICAgIDw8ICIgY2FuIGJlIGZvdW5kIGluIHRoaXMgdGVzdCBjYXNlLlxuIjsKLSAgICB9Ci0gIH0KLQotICBmb3IgKFJlZ2lzdGVyZWRUZXN0SXRlciBpdCA9IHJlZ2lzdGVyZWRfdGVzdHNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gcmVnaXN0ZXJlZF90ZXN0c18uZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIGlmICh0ZXN0cy5jb3VudChpdC0+Zmlyc3QpID09IDApIHsKLSAgICAgIGVycm9ycyA8PCAiWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgIiA8PCBpdC0+Zmlyc3QgPDwgIi5cbiI7Ci0gICAgfQotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yc19zdHIgPSBlcnJvcnMuR2V0U3RyaW5nKCk7Ci0gIGlmIChlcnJvcnNfc3RyICE9ICIiKSB7Ci0gICAgcG9zaXg6OlByaW50RigiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7Ci0gICAgcG9zaXg6OkZsdXNoKCk7Ci0gICAgcG9zaXg6OkFib3J0KCk7Ci0gIH0KLQotICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZmJkNmYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NjA4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9lenRpbWUvZXp0aW1lLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9maWxlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8d2NoYXIuaD4KLSNpbmNsdWRlIDx3Y3R5cGUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0vLyBTdGFyYm9hcmQgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBpbmNsdWRlcy4KLQotI2VsaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0KLS8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgotLy8gZ2V0dGltZW9mZGF5KCkuCi0jIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCi0KLSMgaW5jbHVkZSA8ZmNudGwuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxsaW1pdHMuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxzY2hlZC5oPiAgLy8gTk9MSU5UCi0vLyBEZWNsYXJlcyB2c25wcmludGYoKS4gIFRoaXMgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KLSMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxzdHJpbmc+Ci0KLSNlbGlmIEdURVNUX09TX1NZTUJJQU4KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotCi0jZWxpZiBHVEVTVF9PU19aT1MKLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotCi0vLyBPbiB6L09TIHdlIGFkZGl0aW9uYWxseSBuZWVkIHN0cmluZ3MuaCBmb3Igc3RyY2FzZWNtcC4KLSMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCi0KLSNlbGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAvLyBXZSBhcmUgb24gV2luZG93cyBDRS4KLQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKLSMgdW5kZWYgbWluCi0KLSNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KLQotIyBpbmNsdWRlIDxpby5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy90aW1lYi5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBOT0xJTlQKLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01JTkdXCi0vLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLgotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCi0vLyAgIGdldHRpbWVvZmRheSgpLgotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbgotLy8gICBXaW5kb3dzLCBsaWtlIEdldFRpY2tDb3VudCgpIG9yIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCkuICBNaW5HVwotLy8gICBzdXBwb3J0cyB0aGVzZS4gIGNvbnNpZGVyIHVzaW5nIHRoZW0gaW5zdGVhZC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCi0jICBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01JTkdXCi0KLS8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCi0vLyBzaWxlbmNlIGl0LgotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKLSMgdW5kZWYgbWluCi0KLSNlbHNlCi0KLS8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4KLS8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgotLy8gICBnZXR0aW1lb2ZkYXkoKS4KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLQotLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KLS8vIHNpbGVuY2UgaXQuCi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKLQotI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSMgaW5jbHVkZSA8c3RkZXhjZXB0PgotI2VuZGlmCi0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0jIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bwotLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCi0vLyBoaXMgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Ci11c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKLXVzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Ci11c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKLQotLy8gQ29uc3RhbnRzLgotCi0vLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKLS8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgotc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOwotCi0vLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCi0vLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAotLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKLQotLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KLXN0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKLQotLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCi1zdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOwotCi0vLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCi1zdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7Ci0vLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KLXN0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOwotLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgotc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCi0vLyBzdGFjayB0cmFjZS4KLWNvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKLQotLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcwotLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1ib29sIGdfaGVscF9mbGFnID0gZmFsc2U7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1zdGF0aWMgY29uc3QgY2hhciogR2V0RGVmYXVsdEZpbHRlcigpIHsKLSNpZmRlZiBHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXwotICBjb25zdCBjaGFyKiBjb25zdCB0ZXN0YnJpZGdlX3Rlc3Rfb25seSA9IGdldGVudihHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXyk7Ci0gIGlmICh0ZXN0YnJpZGdlX3Rlc3Rfb25seSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHRlc3RicmlkZ2VfdGVzdF9vbmx5OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX1RFU1RfRklMVEVSX0VOVl9WQVJfCi0gIHJldHVybiBrVW5pdmVyc2FsRmlsdGVyOwotfQotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLAotICAgICJSdW4gZGlzYWJsZWQgdGVzdHMgdG9vLCBpbiBhZGRpdGlvbiB0byB0aGUgdGVzdHMgbm9ybWFsbHkgYmVpbmcgcnVuLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgYnJlYWtfb25fZmFpbHVyZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYnJlYWtfb25fZmFpbHVyZSIsIGZhbHNlKSwKLSAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgY2F0Y2hfZXhjZXB0aW9ucywKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiY2F0Y2hfZXhjZXB0aW9ucyIsIHRydWUpLAotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCi0gICAgIiBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyB0ZXN0IGZhaWx1cmVzLiIpOwotCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBjb2xvciwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJjb2xvciIsICJhdXRvIiksCi0gICAgIldoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LiAgVmFsaWQgdmFsdWVzOiB5ZXMsIG5vLCAiCi0gICAgImFuZCBhdXRvLiAgJ2F1dG8nIG1lYW5zIHRvIHVzZSBjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyAiCi0gICAgImJlaW5nIHNlbnQgdG8gYSB0ZXJtaW5hbCBhbmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgIgotICAgICJpcyBzZXQgdG8gYSB0ZXJtaW5hbCB0eXBlIHRoYXQgc3VwcG9ydHMgY29sb3JzLiIpOwotCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBmaWx0ZXIsCi0gICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZmlsdGVyIiwgR2V0RGVmYXVsdEZpbHRlcigpKSwKLSAgICAiQSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zICIKLSAgICAiZm9yIGZpbHRlcmluZyB0aGUgdGVzdHMgdG8gcnVuLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgIgotICAgICInLScgYW5kIGEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gIgotICAgICJleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlICIKLSAgICAicGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuIik7Ci0KLUdURVNUX0RFRklORV9ib29sXyhsaXN0X3Rlc3RzLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAiTGlzdCBhbGwgdGVzdHMgd2l0aG91dCBydW5uaW5nIHRoZW0uIik7Ci0KLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIG91dHB1dCwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJvdXRwdXQiLCAiIiksCi0gICAgIkEgZm9ybWF0IChjdXJyZW50bHkgbXVzdCBiZSBcInhtbFwiKSwgb3B0aW9uYWxseSBmb2xsb3dlZCAiCi0gICAgImJ5IGEgY29sb24gYW5kIGFuIG91dHB1dCBmaWxlIG5hbWUgb3IgZGlyZWN0b3J5LiBBIGRpcmVjdG9yeSAiCi0gICAgImlzIGluZGljYXRlZCBieSBhIHRyYWlsaW5nIHBhdGhuYW1lIHNlcGFyYXRvci4gIgotICAgICJFeGFtcGxlczogXCJ4bWw6ZmlsZW5hbWUueG1sXCIsIFwieG1sOjpkaXJlY3RvcnluYW1lL1wiLiAiCi0gICAgIklmIGEgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgb3V0cHV0IGZpbGVzIHdpbGwgYmUgY3JlYXRlZCAiCi0gICAgIndpdGhpbiB0aGF0IGRpcmVjdG9yeSwgd2l0aCBmaWxlLW5hbWVzIGJhc2VkIG9uIHRoZSB0ZXN0ICIKLSAgICAiZXhlY3V0YWJsZSdzIG5hbWUgYW5kLCBpZiBuZWNlc3NhcnksIG1hZGUgdW5pcXVlIGJ5IGFkZGluZyAiCi0gICAgImRpZ2l0cy4iKTsKLQotR1RFU1RfREVGSU5FX2Jvb2xfKAotICAgIHByaW50X3RpbWUsCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInByaW50X3RpbWUiLCB0cnVlKSwKLSAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXwotICAgICIgc2hvdWxkIGRpc3BsYXkgZWxhcHNlZCB0aW1lIGluIHRleHQgb3V0cHV0LiIpOwotCi1HVEVTVF9ERUZJTkVfaW50MzJfKAotICAgIHJhbmRvbV9zZWVkLAotICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmFuZG9tX3NlZWQiLCAwKSwKLSAgICAiUmFuZG9tIG51bWJlciBzZWVkIHRvIHVzZSB3aGVuIHNodWZmbGluZyB0ZXN0IG9yZGVycy4gIE11c3QgYmUgaW4gcmFuZ2UgIgotICAgICJbMSwgOTk5OTldLCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZS4iKTsKLQotR1RFU1RfREVGSU5FX2ludDMyXygKLSAgICByZXBlYXQsCi0gICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyZXBlYXQiLCAxKSwKLSAgICAiSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IGVhY2ggdGVzdC4gIFNwZWNpZnkgYSBuZWdhdGl2ZSBudW1iZXIgIgotICAgICJmb3IgcmVwZWF0aW5nIGZvcmV2ZXIuICBVc2VmdWwgZm9yIHNoYWtpbmcgb3V0IGZsYWt5IHRlc3RzLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMsIGZhbHNlLAotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfICIgc2hvdWxkIGluY2x1ZGUgaW50ZXJuYWwgc3RhY2sgZnJhbWVzIHdoZW4gIgotICAgICJwcmludGluZyB0ZXN0IGZhaWx1cmUgc3RhY2sgdHJhY2VzLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgc2h1ZmZsZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigic2h1ZmZsZSIsIGZhbHNlKSwKLSAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXwotICAgICIgc2hvdWxkIHJhbmRvbWl6ZSB0ZXN0cycgb3JkZXIgb24gZXZlcnkgcnVuLiIpOwotCi1HVEVTVF9ERUZJTkVfaW50MzJfKAotICAgIHN0YWNrX3RyYWNlX2RlcHRoLAotICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigic3RhY2tfdHJhY2VfZGVwdGgiLCBrTWF4U3RhY2tUcmFjZURlcHRoKSwKLSAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBwcmludCB3aGVuIGFuICIKLSAgICAiYXNzZXJ0aW9uIGZhaWxzLiAgVGhlIHZhbGlkIHJhbmdlIGlzIDAgdGhyb3VnaCAxMDAsIGluY2x1c2l2ZS4iKTsKLQotR1RFU1RfREVGSU5FX3N0cmluZ18oCi0gICAgc3RyZWFtX3Jlc3VsdF90bywKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJzdHJlYW1fcmVzdWx0X3RvIiwgIiIpLAotICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0byBzdHJlYW0gIgotICAgICJ0ZXN0IHJlc3VsdHMuIEV4YW1wbGU6IFwibG9jYWxob3N0OjU1NVwiLiBUaGUgZmxhZyBpcyBlZmZlY3RpdmUgb25seSBvbiAiCi0gICAgIkxpbnV4LiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgdGhyb3dfb25fZmFpbHVyZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigidGhyb3dfb25fZmFpbHVyZSIsIGZhbHNlKSwKLSAgICAiV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gIgotICAgICJpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhIG5vbi16ZXJvIGNvZGUgIgotICAgICJvdGhlcndpc2UuIik7Ci0KLSNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBmbGFnZmlsZSwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJmbGFnZmlsZSIsICIiKSwKLSAgICAiVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgZmxhZ2ZpbGUgdG8gcmVhZCBjb21tYW5kLWxpbmUgZmxhZ3MgZnJvbS4iKTsKLSNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXwotCi0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi1HVEVTVF9ERUZJTkVfaW50MzJfKAotICAgIHRvdGFsX3NoYXJkcywKLSAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInRvdGFsX3NoYXJkcyIsIC0xKSwKLSAgICAiVGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMgdG8gc3BsaXQgdGVzdCBjYXNlcyBpbnRvLiIpOwotR1RFU1RfREVGSU5FX2ludDMyXygKLSAgICBzaGFyZF9pbmRleCwKLSAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInNoYXJkX2luZGV4IiwgLTEpLAotICAgICJUaGUgc2hhcmQgaW5kZXggdGhhdCBkZXRlcm1pbmVzIHRoZSBzdWJzZXQgb2YgdW5pdCB0ZXN0cyBydW4gaW4gdGhlIHNoYXJkLiIpOwotI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gR2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBmcm9tIFswLCByYW5nZSksIHVzaW5nIGEgTGluZWFyCi0vLyBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIChMQ0cpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzIDAgb3IgZ3JlYXRlcgotLy8gdGhhbiBrTWF4UmFuZ2UuCi1VSW50MzIgUmFuZG9tOjpHZW5lcmF0ZShVSW50MzIgcmFuZ2UpIHsKLSAgLy8gVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgc2FtZSBhcyBhcmUgdXNlZCBpbiBnbGliYydzIHJhbmQoMykuCi0gIHN0YXRlXyA9ICgxMTAzNTE1MjQ1VSpzdGF0ZV8gKyAxMjM0NVUpICUga01heFJhbmdlOwotCi0gIEdURVNUX0NIRUNLXyhyYW5nZSA+IDApCi0gICAgICA8PCAiQ2Fubm90IGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgMCkuIjsKLSAgR1RFU1RfQ0hFQ0tfKHJhbmdlIDw9IGtNYXhSYW5nZSkKLSAgICAgIDw8ICJHZW5lcmF0aW9uIG9mIGEgbnVtYmVyIGluIFswLCAiIDw8IHJhbmdlIDw8ICIpIHdhcyByZXF1ZXN0ZWQsICIKLSAgICAgIDw8ICJidXQgdGhpcyBjYW4gb25seSBnZW5lcmF0ZSBudW1iZXJzIGluIFswLCAiIDw8IGtNYXhSYW5nZSA8PCAiKS4iOwotCi0gIC8vIENvbnZlcnRpbmcgdmlhIG1vZHVsdXMgaW50cm9kdWNlcyBhIGJpdCBvZiBkb3dud2FyZCBiaWFzLCBidXQKLSAgLy8gaXQncyBzaW1wbGUsIGFuZCBhIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIGlzbid0IHRvbyBnb29kCi0gIC8vIHRvIGJlZ2luIHdpdGguCi0gIHJldHVybiBzdGF0ZV8gJSByYW5nZTsKLX0KLQotLy8gR1Rlc3RJc0luaXRpYWxpemVkKCkgcmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBoYXMgaW5pdGlhbGl6ZWQKLS8vIEdvb2dsZSBUZXN0LiAgVXNlZnVsIGZvciBjYXRjaGluZyB0aGUgdXNlciBtaXN0YWtlIG9mIG5vdCBpbml0aWFsaXppbmcKLS8vIEdvb2dsZSBUZXN0IGJlZm9yZSBjYWxsaW5nIFJVTl9BTExfVEVTVFMoKS4KLXN0YXRpYyBib29sIEdUZXN0SXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIEdldEFyZ3ZzKCkuc2l6ZSgpID4gMDsgfQotCi0vLyBJdGVyYXRlcyBvdmVyIGEgdmVjdG9yIG9mIFRlc3RDYXNlcywga2VlcGluZyBhIHJ1bm5pbmcgc3VtIG9mIHRoZQotLy8gcmVzdWx0cyBvZiBjYWxsaW5nIGEgZ2l2ZW4gaW50LXJldHVybmluZyBtZXRob2Qgb24gZWFjaC4KLS8vIFJldHVybnMgdGhlIHN1bS4KLXN0YXRpYyBpbnQgU3VtT3ZlclRlc3RDYXNlTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSo+JiBjYXNlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IChUZXN0Q2FzZTo6Km1ldGhvZCkoKSBjb25zdCkgewotICBpbnQgc3VtID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXNlX2xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICBzdW0gKz0gKGNhc2VfbGlzdFtpXS0+Km1ldGhvZCkoKTsKLSAgfQotICByZXR1cm4gc3VtOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgcGFzc2VkLgotc3RhdGljIGJvb2wgVGVzdENhc2VQYXNzZWQoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgewotICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5QYXNzZWQoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIGZhaWxlZC4KLXN0YXRpYyBib29sIFRlc3RDYXNlRmFpbGVkKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKLSAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpICYmIHRlc3RfY2FzZS0+RmFpbGVkKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdF9jYXNlIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZXN0IHRoYXQgc2hvdWxkCi0vLyBydW4uCi1zdGF0aWMgYm9vbCBTaG91bGRSdW5UZXN0Q2FzZShjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7Ci0gIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKTsKLX0KLQotLy8gQXNzZXJ0SGVscGVyIGNvbnN0cnVjdG9yLgotQXNzZXJ0SGVscGVyOjpBc3NlcnRIZWxwZXIoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCi0gICAgOiBkYXRhXyhuZXcgQXNzZXJ0SGVscGVyRGF0YSh0eXBlLCBmaWxlLCBsaW5lLCBtZXNzYWdlKSkgewotfQotCi1Bc3NlcnRIZWxwZXI6On5Bc3NlcnRIZWxwZXIoKSB7Ci0gIGRlbGV0ZSBkYXRhXzsKLX0KLQotLy8gTWVzc2FnZSBhc3NpZ25tZW50LCBmb3IgYXNzZXJ0aW9uIHN0cmVhbWluZyBzdXBwb3J0Lgotdm9pZCBBc3NlcnRIZWxwZXI6Om9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7Ci0gIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT4KLSAgICBBZGRUZXN0UGFydFJlc3VsdChkYXRhXy0+dHlwZSwgZGF0YV8tPmZpbGUsIGRhdGFfLT5saW5lLAotICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZFVzZXJNZXNzYWdlKGRhdGFfLT5tZXNzYWdlLCBtZXNzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+aW1wbCgpCi0gICAgICAgICAgICAgICAgICAgICAgLT5DdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpCi0gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIGZ1bmN0aW9uIGl0c2VsZi4KLSAgICAgICAgICAgICAgICAgICAgICApOyAgLy8gTk9MSU5UCi19Ci0KLS8vIE11dGV4IGZvciBsaW5rZWQgcG9pbnRlcnMuCi1HVEVTVF9BUElfIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7Ci0KLS8vIEEgY29weSBvZiBhbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNldCBieSBJbml0R29vZ2xlVGVzdCgpLgotOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBnX2FyZ3ZzOwotCi1jb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+JiBHZXRBcmd2cygpIHsKLSNpZiBkZWZpbmVkKEdURVNUX0NVU1RPTV9HRVRfQVJHVlNfKQotICByZXR1cm4gR1RFU1RfQ1VTVE9NX0dFVF9BUkdWU18oKTsKLSNlbHNlICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9HRVRfQVJHVlNfKQotICByZXR1cm4gZ19hcmd2czsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fR0VUX0FSR1ZTXykKLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKLS8vIGlzIHByZXNlbnQuCi1GaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSB7Ci0gIEZpbGVQYXRoIHJlc3VsdDsKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgcmVzdWx0LlNldChGaWxlUGF0aChHZXRBcmd2cygpWzBdKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpKTsKLSNlbHNlCi0gIHJlc3VsdC5TZXQoRmlsZVBhdGgoR2V0QXJndnMoKVswXSkpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSAgcmV0dXJuIHJlc3VsdC5SZW1vdmVEaXJlY3RvcnlOYW1lKCk7Ci19Ci0KLS8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCi0KLS8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCi1zdGQ6OnN0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpIHsKLSAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKLSAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpIHJldHVybiBzdGQ6OnN0cmluZygiIik7Ci0KLSAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7Ci0gIHJldHVybiAoY29sb24gPT0gTlVMTCkgPwotICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcpIDoKLSAgICAgIHN0ZDo6c3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnLCBjb2xvbiAtIGd0ZXN0X291dHB1dF9mbGFnKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIG91dHB1dCBmaWxlLCBvciB0aGUgZGVmYXVsdCBpZiBub25lCi0vLyB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi1zdGQ6OnN0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpIHsKLSAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKLSAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOwotICBpZiAoY29sb24gPT0gTlVMTCkKLSAgICByZXR1cm4gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKLSAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKAotICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAotICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoa0RlZmF1bHRPdXRwdXRGaWxlKSkuc3RyaW5nKCk7Ci0KLSAgaW50ZXJuYWw6OkZpbGVQYXRoIG91dHB1dF9uYW1lKGNvbG9uICsgMSk7Ci0gIGlmICghb3V0cHV0X25hbWUuSXNBYnNvbHV0ZVBhdGgoKSkKLSAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBcc29tZVxwYXRoIGlzIG5vdCBhbiBhYnNvbHV0ZQotICAgIC8vIHBhdGggKGFzIGl0cyBtZWFuaW5nIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZHJpdmUpLCB5ZXQgdGhlCi0gICAgLy8gZm9sbG93aW5nIGxvZ2ljIGZvciB0dXJuaW5nIGl0IGludG8gYW4gYWJzb2x1dGUgcGF0aCBpcyB3cm9uZy4KLSAgICAvLyBGaXggaXQuCi0gICAgb3V0cHV0X25hbWUgPSBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAotICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAotICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoY29sb24gKyAxKSk7Ci0KLSAgaWYgKCFvdXRwdXRfbmFtZS5Jc0RpcmVjdG9yeSgpKQotICAgIHJldHVybiBvdXRwdXRfbmFtZS5zdHJpbmcoKTsKLQotICBpbnRlcm5hbDo6RmlsZVBhdGggcmVzdWx0KGludGVybmFsOjpGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSgKLSAgICAgIG91dHB1dF9uYW1lLCBpbnRlcm5hbDo6R2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCksCi0gICAgICBHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKSk7Ci0gIHJldHVybiByZXN1bHQuc3RyaW5nKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHdpbGRjYXJkIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLiAgVGhlCi0vLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgotLy8KLS8vIFRoaXMgcmVjdXJzaXZlIGFsZ29yaXRobSBpc24ndCB2ZXJ5IGVmZmljaWVudCwgYnV0IGlzIGNsZWFyIGFuZAotLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KLWJvb2wgVW5pdFRlc3RPcHRpb25zOjpQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjb25zdCBjaGFyICpwYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cikgewotICBzd2l0Y2ggKCpwYXR0ZXJuKSB7Ci0gICAgY2FzZSAnXDAnOgotICAgIGNhc2UgJzonOiAgLy8gRWl0aGVyICc6JyBvciAnXDAnIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uCi0gICAgICByZXR1cm4gKnN0ciA9PSAnXDAnOwotICAgIGNhc2UgJz8nOiAgLy8gTWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4KLSAgICAgIHJldHVybiAqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOwotICAgIGNhc2UgJyonOiAgLy8gTWF0Y2hlcyBhbnkgc3RyaW5nIChwb3NzaWJseSBlbXB0eSkgb2YgY2hhcmFjdGVycy4KLSAgICAgIHJldHVybiAoKnN0ciAhPSAnXDAnICYmIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4sIHN0ciArIDEpKSB8fAotICAgICAgICAgIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4gKyAxLCBzdHIpOwotICAgIGRlZmF1bHQ6ICAvLyBOb24tc3BlY2lhbCBjaGFyYWN0ZXIuICBNYXRjaGVzIGl0c2VsZi4KLSAgICAgIHJldHVybiAqcGF0dGVybiA9PSAqc3RyICYmCi0gICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOwotICB9Ci19Ci0KLWJvb2wgVW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpIHsKLSAgY29uc3QgY2hhciAqY3VyX3BhdHRlcm4gPSBmaWx0ZXI7Ci0gIGZvciAoOzspIHsKLSAgICBpZiAoUGF0dGVybk1hdGNoZXNTdHJpbmcoY3VyX3BhdHRlcm4sIG5hbWUuY19zdHIoKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIEZpbmRzIHRoZSBuZXh0IHBhdHRlcm4gaW4gdGhlIGZpbHRlci4KLSAgICBjdXJfcGF0dGVybiA9IHN0cmNocihjdXJfcGF0dGVybiwgJzonKTsKLQotICAgIC8vIFJldHVybnMgaWYgbm8gbW9yZSBwYXR0ZXJuIGNhbiBiZSBmb3VuZC4KLSAgICBpZiAoY3VyX3BhdHRlcm4gPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNraXBzIHRoZSBwYXR0ZXJuIHNlcGFyYXRlciAodGhlICc6JyBjaGFyYWN0ZXIpLgotICAgIGN1cl9wYXR0ZXJuKys7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQotLy8gbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KLWJvb2wgVW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lID0gdGVzdF9jYXNlX25hbWUgKyAiLiIgKyB0ZXN0X25hbWUuY19zdHIoKTsKLQotICAvLyBTcGxpdCAtLWd0ZXN0X2ZpbHRlciBhdCAnLScsIGlmIHRoZXJlIGlzIG9uZSwgdG8gc2VwYXJhdGUgaW50bwotICAvLyBwb3NpdGl2ZSBmaWx0ZXIgYW5kIG5lZ2F0aXZlIGZpbHRlciBwb3J0aW9ucwotICBjb25zdCBjaGFyKiBjb25zdCBwID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGRhc2ggPSBzdHJjaHIocCwgJy0nKTsKLSAgc3RkOjpzdHJpbmcgcG9zaXRpdmU7Ci0gIHN0ZDo6c3RyaW5nIG5lZ2F0aXZlOwotICBpZiAoZGFzaCA9PSBOVUxMKSB7Ci0gICAgcG9zaXRpdmUgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsgIC8vIFdob2xlIHN0cmluZyBpcyBhIHBvc2l0aXZlIGZpbHRlcgotICAgIG5lZ2F0aXZlID0gIiI7Ci0gIH0gZWxzZSB7Ci0gICAgcG9zaXRpdmUgPSBzdGQ6OnN0cmluZyhwLCBkYXNoKTsgICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBkYXNoCi0gICAgbmVnYXRpdmUgPSBzdGQ6OnN0cmluZyhkYXNoICsgMSk7ICAvLyBFdmVyeXRoaW5nIGFmdGVyIHRoZSBkYXNoCi0gICAgaWYgKHBvc2l0aXZlLmVtcHR5KCkpIHsKLSAgICAgIC8vIFRyZWF0ICctdGVzdDEnIGFzIHRoZSBzYW1lIGFzICcqLXRlc3QxJwotICAgICAgcG9zaXRpdmUgPSBrVW5pdmVyc2FsRmlsdGVyOwotICAgIH0KLSAgfQotCi0gIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuICBJdCBtYXRjaGVzIGEKLSAgLy8gdGVzdCBpZiBhbnkgcGF0dGVybiBpbiBpdCBtYXRjaGVzIHRoZSB0ZXN0LgotICByZXR1cm4gKE1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBwb3NpdGl2ZS5jX3N0cigpKSAmJgotICAgICAgICAgICFNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgbmVnYXRpdmUuY19zdHIoKSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NFSAotLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCi0vLyBnaXZlbiBTRUggZXhjZXB0aW9uLCBvciBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIIG90aGVyd2lzZS4KLS8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KLWludCBVbml0VGVzdE9wdGlvbnM6OkdUZXN0U2hvdWxkUHJvY2Vzc1NFSChEV09SRCBleGNlcHRpb25fY29kZSkgewotICAvLyBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIGEgU0VIIGV4Y2VwdGlvbiBpZjoKLSAgLy8gICAxLiB0aGUgdXNlciB3YW50cyBpdCB0bywgQU5ECi0gIC8vICAgMi4gdGhpcyBpcyBub3QgYSBicmVha3BvaW50IGV4Y2VwdGlvbiwgQU5ECi0gIC8vICAgMy4gdGhpcyBpcyBub3QgYSBDKysgZXhjZXB0aW9uIChWQysrIGltcGxlbWVudHMgdGhlbSB2aWEgU0VILAotICAvLyAgICAgIGFwcGFyZW50bHkpLgotICAvLwotICAvLyBTRUggZXhjZXB0aW9uIGNvZGUgZm9yIEMrKyBleGNlcHRpb25zLgotICAvLyAoc2VlIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTg1Mjk0IGZvciBtb3JlIGluZm9ybWF0aW9uKS4KLSAgY29uc3QgRFdPUkQga0N4eEV4Y2VwdGlvbkNvZGUgPSAweGUwNmQ3MzYzOwotCi0gIGJvb2wgc2hvdWxkX2hhbmRsZSA9IHRydWU7Ci0KLSAgaWYgKCFHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKQotICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZXhjZXB0aW9uX2NvZGUgPT0gRVhDRVBUSU9OX0JSRUFLUE9JTlQpCi0gICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOwotICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBrQ3h4RXhjZXB0aW9uQ29kZSkKLSAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7Ci0KLSAgcmV0dXJuIHNob3VsZF9oYW5kbGUgPyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIDogRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQotLy8gR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCi0vLyByZXN1bHRzLiBJbnRlcmNlcHRzIG9ubHkgZmFpbHVyZXMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuCi1TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQotICAgIDogaW50ZXJjZXB0X21vZGVfKElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFEKSwKLSAgICAgIHJlc3VsdF8ocmVzdWx0KSB7Ci0gIEluaXQoKTsKLX0KLQotLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQotLy8gR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCi0vLyByZXN1bHRzLgotU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAotICAgIEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKLSAgICA6IGludGVyY2VwdF9tb2RlXyhpbnRlcmNlcHRfbW9kZSksCi0gICAgICByZXN1bHRfKHJlc3VsdCkgewotICBJbml0KCk7Ci19Ci0KLXZvaWQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkluaXQoKSB7Ci0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7Ci0gICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKLSAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKHRoaXMpOwotICB9IGVsc2UgewotICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOwotICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOwotICB9Ci19Ci0KLS8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBUZXN0Ci0vLyBiZWZvcmUuCi1TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6flNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgewotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgewotICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIob2xkX3JlcG9ydGVyXyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQob2xkX3JlcG9ydGVyXyk7Ci0gIH0KLX0KLQotLy8gSW5jcmVtZW50cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCBjb3VudCBhbmQgcmVtZW1iZXJzIHRoZSByZXN1bHQuCi0vLyBUaGlzIG1ldGhvZCBpcyBmcm9tIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIGludGVyZmFjZS4KLXZvaWQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgcmVzdWx0Xy0+QXBwZW5kKHJlc3VsdCk7Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgV2Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoaXMKLS8vIGluc3RlYWQgb2YgR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gZ2V0IHRoZSB0eXBlIElEIG9mCi0vLyB0ZXN0aW5nOjpUZXN0LiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4KLS8vIHVzaW5nIEdvb2dsZSBUZXN0IGFzIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMKLS8vIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZwotLy8gb24gd2hldGhlciB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yCi0vLyBmcm9tIHVzZXIgdGVzdCBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzCi0vLyByZXR1cm4gdGhlIHNhbWUgdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlCi0vLyBndGVzdC5jYywgd2hpY2ggaXMgd2l0aGluIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsuCi1UeXBlSWQgR2V0VGVzdFR5cGVJZCgpIHsKLSAgcmV0dXJuIEdldFR5cGVJZDxUZXN0PigpOwotfQotCi0vLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0Ci0vLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgotZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdCA9IEdldFRlc3RUeXBlSWQoKTsKLQotLy8gVGhpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGNoZWNrcyB0aGF0ICdyZXN1bHRzJyBjb250YWlucyBhIHRlc3QgcGFydAotLy8gZmFpbHVyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZQotLy8gZ2l2ZW4gc3Vic3RyaW5nLgotQXNzZXJ0aW9uUmVzdWx0IEhhc09uZUZhaWx1cmUoY29uc3QgY2hhciogLyogcmVzdWx0c19leHByICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogdHlwZV9leHByICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogc3Vic3RyX2V4cHIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5JiByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkKHR5cGUgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPwotICAgICAgICAgICAgICAgICAgICAgICAgIjEgZmF0YWwgZmFpbHVyZSIgOgotICAgICAgICAgICAgICAgICAgICAgICAgIjEgbm9uLWZhdGFsIGZhaWx1cmUiKTsKLSAgTWVzc2FnZSBtc2c7Ci0gIGlmIChyZXN1bHRzLnNpemUoKSAhPSAxKSB7Ci0gICAgbXNnIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiXG4iCi0gICAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCByZXN1bHRzLnNpemUoKSA8PCAiIGZhaWx1cmVzIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIG1zZyA8PCAiXG4iIDw8IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoaSk7Ci0gICAgfQotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOwotICB9Ci0KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHIgPSByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApOwotICBpZiAoci50eXBlKCkgIT0gdHlwZSkgewotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHI7Ci0gIH0KLQotICBpZiAoc3Ryc3RyKHIubWVzc2FnZSgpLCBzdWJzdHIuY19zdHIoKSkgPT0gTlVMTCkgewotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgY29udGFpbmluZyBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN1YnN0ciA8PCAiXCJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHI7Ci0gIH0KLQotICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotfQotCi0vLyBUaGUgY29uc3RydWN0b3Igb2YgU2luZ2xlRmFpbHVyZUNoZWNrZXIgcmVtZW1iZXJzIHdoZXJlIHRvIGxvb2sgdXAKLS8vIHRlc3QgcGFydCByZXN1bHRzLCB3aGF0IHR5cGUgb2YgZmFpbHVyZSB3ZSBleHBlY3QsIGFuZCB3aGF0Ci0vLyBzdWJzdHJpbmcgdGhlIGZhaWx1cmUgbWVzc2FnZSBzaG91bGQgY29udGFpbi4KLVNpbmdsZUZhaWx1cmVDaGVja2VyOjogU2luZ2xlRmFpbHVyZUNoZWNrZXIoCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywKLSAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAotICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKQotICAgIDogcmVzdWx0c18ocmVzdWx0cyksCi0gICAgICB0eXBlXyh0eXBlKSwKLSAgICAgIHN1YnN0cl8oc3Vic3RyKSB7fQotCi0vLyBUaGUgZGVzdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgotLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgotLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKLS8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgotU2luZ2xlRmFpbHVyZUNoZWNrZXI6On5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUMyhIYXNPbmVGYWlsdXJlLCAqcmVzdWx0c18sIHR5cGVfLCBzdWJzdHJfKTsKLX0KLQotRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAotICAgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KSA6IHVuaXRfdGVzdF8odW5pdF90ZXN0KSB7fQotCi12b2lkIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIHVuaXRfdGVzdF8tPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+QWRkVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLSAgdW5pdF90ZXN0Xy0+bGlzdGVuZXJzKCktPnJlcGVhdGVyKCktPk9uVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLX0KLQotRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAotICAgIFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KSA6IHVuaXRfdGVzdF8odW5pdF90ZXN0KSB7fQotCi12b2lkIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIHVuaXRfdGVzdF8tPkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKS0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLX0KLQotLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCi1UZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKgotVW5pdFRlc3RJbXBsOjpHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7Ci0gIHJldHVybiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKLX0KLQotLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCi12b2lkIFVuaXRUZXN0SW1wbDo6U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKLSAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcikgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7Ci0gIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfID0gcmVwb3J0ZXI7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCi1Vbml0VGVzdEltcGw6OkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkgewotICByZXR1cm4gcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5nZXQoKTsKLX0KLQotLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotdm9pZCBVbml0VGVzdEltcGw6OlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAotICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7Ci0gIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uc2V0KHJlcG9ydGVyKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KLWludCBVbml0VGVzdEltcGw6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VQYXNzZWQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VGYWlsZWQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZXNfLnNpemUoKSk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKLS8vIHRoYXQgc2hvdWxkIHJ1bi4KLWludCBVbml0VGVzdEltcGw6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBTaG91bGRSdW5UZXN0Q2FzZSk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgotaW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgotaW50IFVuaXRUZXN0SW1wbDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBVbml0VGVzdEltcGw6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUZXN0Q2FzZTo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgotaW50IFVuaXRUZXN0SW1wbDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotaW50IFVuaXRUZXN0SW1wbDo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgotaW50IFVuaXRUZXN0SW1wbDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3RJbXBsOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6dGVzdF90b19ydW5fY291bnQpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgotLy8KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5Ci0vLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgotLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0Ci0vLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgotLy8KLS8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscwotLy8gQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKLS8vIHRyYWNlIGJ1dCBCYXIoKSBhbmQgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lgotc3RkOjpzdHJpbmcgVW5pdFRlc3RJbXBsOjpDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKGludCBza2lwX2NvdW50KSB7Ci0gIHJldHVybiBvc19zdGFja190cmFjZV9nZXR0ZXIoKS0+Q3VycmVudFN0YWNrVHJhY2UoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpKSwKLSAgICAgIHNraXBfY291bnQgKyAxCi0gICAgICAvLyBTa2lwcyB0aGUgdXNlci1zcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcyBwbHVzIHRoaXMgZnVuY3Rpb24KLSAgICAgIC8vIGl0c2VsZi4KLSAgICAgICk7ICAvLyBOT0xJTlQKLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLVRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKSB7Ci0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0gIHJldHVybiBTYlRpbWVHZXROb3coKSAvIGtTYlRpbWVNaWxsaXNlY29uZDsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuCi0gIC8vIGh0dHA6Ly9hbmFsb2dvdXMuYmxvZ3Nwb3QuY29tLzIwMDUvMDQvZXBvY2guaHRtbAotICBjb25zdCBUaW1lSW5NaWxsaXMga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YSA9Ci0gICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsKLSAgY29uc3QgRFdPUkQga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCA9IDEwMDAwOwotCi0gIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7Ci0gIEZJTEVUSU1FIG5vd19maWxldGltZTsKLSAgVUxBUkdFX0lOVEVHRVIgbm93X2ludDY0OwotICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UKLSAgLy8gICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpPwotICBHZXRTeXN0ZW1UaW1lKCZub3dfc3lzdGltZSk7Ci0gIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7Ci0gICAgbm93X2ludDY0Lkxvd1BhcnQgPSBub3dfZmlsZXRpbWUuZHdMb3dEYXRlVGltZTsKLSAgICBub3dfaW50NjQuSGlnaFBhcnQgPSBub3dfZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWU7Ci0gICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0KLSAgICAgIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGE7Ci0gICAgcmV0dXJuIG5vd19pbnQ2NC5RdWFkUGFydDsKLSAgfQotICByZXR1cm4gMDsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCi0gIF9fdGltZWI2NCBub3c7Ci0KLSAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgX2Z0aW1lNjQoKSwgc28gd2Ugd2FudCB0byBzdXBwcmVzcyB3YXJuaW5nIDQ5OTYKLSAgLy8gKGRlcHJlY2F0ZWQgZnVuY3Rpb24pIHRoZXJlLgotICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIEdldFRpY2tDb3VudCgpPyAgT3IgdXNlCi0gIC8vICAgU3lzdGVtVGltZVRvRmlsZVRpbWUoKQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2KQotICBfZnRpbWU2NCgmbm93KTsKLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnRpbWUpICogMTAwMCArIG5vdy5taWxsaXRtOwotI2VsaWYgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8KLSAgc3RydWN0IHRpbWV2YWwgbm93OwotICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50dl9zZWMpICogMTAwMCArIG5vdy50dl91c2VjIC8gMTAwMDsKLSNlbHNlCi0jIGVycm9yICJEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBvbiB5b3VyIHN5c3RlbS4iCi0jZW5kaWYKLX0KLQotLy8gVXRpbGl0aWVzCi0KLS8vIGNsYXNzIFN0cmluZy4KLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCi0vLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCi0vLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCi0vLyBpbnB1dCBpcyBOVUxMLgotTFBDV1NUUiBTdHJpbmc6OkFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGFuc2kpIHsKLSAgaWYgKCFhbnNpKSByZXR1cm4gTlVMTDsKLSAgY29uc3QgaW50IGxlbmd0aCA9IHN0cmxlbihhbnNpKTsKLSAgY29uc3QgaW50IHVuaWNvZGVfbGVuZ3RoID0KLSAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbnNpLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOwotICBXQ0hBUiogdW5pY29kZSA9IG5ldyBXQ0hBUlt1bmljb2RlX2xlbmd0aCArIDFdOwotICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHVuaWNvZGVfbGVuZ3RoKTsKLSAgdW5pY29kZVt1bmljb2RlX2xlbmd0aF0gPSAwOwotICByZXR1cm4gdW5pY29kZTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZwotLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgotLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQotLy8gaW5wdXQgaXMgTlVMTC4KLWNvbnN0IGNoYXIqIFN0cmluZzo6VXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpICB7Ci0gIGlmICghdXRmMTZfc3RyKSByZXR1cm4gTlVMTDsKLSAgY29uc3QgaW50IGFuc2lfbGVuZ3RoID0KLSAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLSAgY2hhciogYW5zaSA9IG5ldyBjaGFyW2Fuc2lfbGVuZ3RoICsgMV07Ci0gIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLAotICAgICAgICAgICAgICAgICAgICAgIGFuc2ksIGFuc2lfbGVuZ3RoLCBOVUxMLCBOVUxMKTsKLSAgYW5zaVthbnNpX2xlbmd0aF0gPSAwOwotICByZXR1cm4gYW5zaTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KLS8vCi0vLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMCi0vLyBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCi0vLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KLWJvb2wgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIgKiBsaHMsIGNvbnN0IGNoYXIgKiByaHMpIHsKLSAgaWYgKCBsaHMgPT0gTlVMTCApIHJldHVybiByaHMgPT0gTlVMTDsKLQotICBpZiAoIHJocyA9PSBOVUxMICkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBzdHJjbXAobGhzLCByaHMpID09IDA7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLS8vIENvbnZlcnRzIGFuIGFycmF5IG9mIHdpZGUgY2hhcnMgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIE1lc3NhZ2Ugb2JqZWN0Lgotc3RhdGljIHZvaWQgU3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKGNvbnN0IHdjaGFyX3QqIHdzdHIsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXNnKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGxlbmd0aDsgKSB7ICAvLyBOT0xJTlQKLSAgICBpZiAod3N0cltpXSAhPSBMJ1wwJykgewotICAgICAgKm1zZyA8PCBXaWRlU3RyaW5nVG9VdGY4KHdzdHIgKyBpLCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCAtIGkpKTsKLSAgICAgIHdoaWxlIChpICE9IGxlbmd0aCAmJiB3c3RyW2ldICE9IEwnXDAnKQotICAgICAgICBpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICptc2cgPDwgJ1wwJzsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLXZvaWQgU3BsaXRTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjaGFyIGRlbGltaXRlciwKLSAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4qIGRlc3QpIHsKLSAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gcGFyc2VkOwotICA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKLSAgd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgewotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IHN0ci5maW5kKGRlbGltaXRlciwgcG9zKTsKLSAgICBpZiAoY29sb24gPT0gOjpzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcykpOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MsIGNvbG9uIC0gcG9zKSk7Ci0gICAgICBwb3MgPSBjb2xvbiArIDE7Ci0gICAgfQotICB9Ci0gIGRlc3QtPnN3YXAocGFyc2VkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIENvbnN0cnVjdHMgYW4gZW1wdHkgTWVzc2FnZS4KLS8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZgotLy8gQVNTRVJUL0VYUEVDVCBpbiBhIHByb2NlZHVyZSBhZGRzIG92ZXIgMjAwIGJ5dGVzIHRvIHRoZSBwcm9jZWR1cmUncwotLy8gc3RhY2sgZnJhbWUgbGVhZGluZyB0byBodWdlIHN0YWNrIGZyYW1lcyBpbiBzb21lIGNhc2VzOyBnY2MgZG9lcyBub3QgcmV1c2UKLS8vIHRoZSBzdGFjayBzcGFjZS4KLSNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQotTWVzc2FnZTo6TWVzc2FnZSgpIHsKLSAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKLSAgLy8gYSBkb3VibGUgdG8gYSBNZXNzYWdlLgotICBzc18gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDIpOwotfQotI2Vsc2UKLU1lc3NhZ2U6Ok1lc3NhZ2UoKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgewotICAvLyBCeSBkZWZhdWx0LCB3ZSB3YW50IHRoZXJlIHRvIGJlIGVub3VnaCBwcmVjaXNpb24gd2hlbiBwcmludGluZwotICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCi0gICpzc18gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDIpOwotfQotI2VuZGlmICAvLyBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgotCi0vLyBUaGVzZSB0d28gb3ZlcmxvYWRzIGFsbG93IHN0cmVhbWluZyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBNZXNzYWdlCi0vLyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCi1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7Ci0gIHJldHVybiAqdGhpcyA8PCBpbnRlcm5hbDo6U3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cik7Ci19Ci1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7Ci0gIHJldHVybiAqdGhpcyA8PCBpbnRlcm5hbDo6U3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLS8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04Ci0vLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgotTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpIHsKLSAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KLU1lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6d3N0cmluZyYgd3N0cikgewotICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7Ci0gIHJldHVybiAqdGhpczsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLS8vIEdldHMgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3Qgc28gZmFyIGFzIGFuIHN0ZDo6c3RyaW5nLgotLy8gRWFjaCAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCi1zdGQ6OnN0cmluZyBNZXNzYWdlOjpHZXRTdHJpbmcoKSBjb25zdCB7Ci0jaWYgX19jbGFuZ19fICYmIF9fY2xhbmdfbWFqb3JfXyA9PSAzICYmIF9fY2xhbmdfbWlub3JfXyA8PSA2Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtKHNzXy5zdHIoKSk7Ci0gIHJldHVybiBpbnRlcm5hbDo6U3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSk7Ci0jZWxzZQotICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKHNzXy5nZXQoKSk7Ci0jZW5kaWYgIC8vIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPT0gMyAmJiBfX2NsYW5nX21pbm9yX18gPD0gNgotfQotCi0vLyBBc3NlcnRpb25SZXN1bHQgY29uc3RydWN0b3JzLgotLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4KLUFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpCi0gICAgOiBzdWNjZXNzXyhvdGhlci5zdWNjZXNzXyksCi0gICAgICBtZXNzYWdlXyhvdGhlci5tZXNzYWdlXy5nZXQoKSAhPSBOVUxMID8KLSAgICAgICAgICAgICAgIG5ldyA6OnN0ZDo6c3RyaW5nKCpvdGhlci5tZXNzYWdlXykgOgotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPihOVUxMKSkgewotfQotCi0vLyBTd2FwcyB0d28gQXNzZXJ0aW9uUmVzdWx0cy4KLXZvaWQgQXNzZXJ0aW9uUmVzdWx0Ojpzd2FwKEFzc2VydGlvblJlc3VsdCYgb3RoZXIpIHsKLSAgdXNpbmcgc3RkOjpzd2FwOwotICBzd2FwKHN1Y2Nlc3NfLCBvdGhlci5zdWNjZXNzXyk7Ci0gIHN3YXAobWVzc2FnZV8sIG90aGVyLm1lc3NhZ2VfKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblJlc3VsdDo6b3BlcmF0b3IhKCkgY29uc3QgewotICBBc3NlcnRpb25SZXN1bHQgbmVnYXRpb24oIXN1Y2Nlc3NfKTsKLSAgaWYgKG1lc3NhZ2VfLmdldCgpICE9IE5VTEwpCi0gICAgbmVnYXRpb24gPDwgKm1lc3NhZ2VfOwotICByZXR1cm4gbmVnYXRpb247Ci19Ci0KLS8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKSB7Ci0gIHJldHVybiBBc3NlcnRpb25SZXN1bHQodHJ1ZSk7Ci19Ci0KLS8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCi1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpIHsKLSAgcmV0dXJuIEFzc2VydGlvblJlc3VsdChmYWxzZSk7Ci19Ci0KLS8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgotLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlLgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2U7Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLW5hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlIHsKLXN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgcmlnaHQpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPiA+IGNvc3RzKAotICAgICAgbGVmdC5zaXplKCkgKyAxLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KHJpZ2h0LnNpemUoKSArIDEpKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8RWRpdFR5cGU+ID4gYmVzdF9tb3ZlKAotICAgICAgbGVmdC5zaXplKCkgKyAxLCBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4ocmlnaHQuc2l6ZSgpICsgMSkpOwotCi0gIC8vIFBvcHVsYXRlIGZvciBlbXB0eSByaWdodC4KLSAgZm9yIChzaXplX3QgbF9pID0gMDsgbF9pIDwgY29zdHMuc2l6ZSgpOyArK2xfaSkgewotICAgIGNvc3RzW2xfaV1bMF0gPSBzdGF0aWNfY2FzdDxkb3VibGU+KGxfaSk7Ci0gICAgYmVzdF9tb3ZlW2xfaV1bMF0gPSBrUmVtb3ZlOwotICB9Ci0gIC8vIFBvcHVsYXRlIGZvciBlbXB0eSBsZWZ0LgotICBmb3IgKHNpemVfdCByX2kgPSAxOyByX2kgPCBjb3N0c1swXS5zaXplKCk7ICsrcl9pKSB7Ci0gICAgY29zdHNbMF1bcl9pXSA9IHN0YXRpY19jYXN0PGRvdWJsZT4ocl9pKTsKLSAgICBiZXN0X21vdmVbMF1bcl9pXSA9IGtBZGQ7Ci0gIH0KLQotICBmb3IgKHNpemVfdCBsX2kgPSAwOyBsX2kgPCBsZWZ0LnNpemUoKTsgKytsX2kpIHsKLSAgICBmb3IgKHNpemVfdCByX2kgPSAwOyByX2kgPCByaWdodC5zaXplKCk7ICsrcl9pKSB7Ci0gICAgICBpZiAobGVmdFtsX2ldID09IHJpZ2h0W3JfaV0pIHsKLSAgICAgICAgLy8gRm91bmQgYSBtYXRjaC4gQ29uc3VtZSBpdC4KLSAgICAgICAgY29zdHNbbF9pICsgMV1bcl9pICsgMV0gPSBjb3N0c1tsX2ldW3JfaV07Ci0gICAgICAgIGJlc3RfbW92ZVtsX2kgKyAxXVtyX2kgKyAxXSA9IGtNYXRjaDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNvbnN0IGRvdWJsZSBhZGQgPSBjb3N0c1tsX2kgKyAxXVtyX2ldOwotICAgICAgY29uc3QgZG91YmxlIHJlbW92ZSA9IGNvc3RzW2xfaV1bcl9pICsgMV07Ci0gICAgICBjb25zdCBkb3VibGUgcmVwbGFjZSA9IGNvc3RzW2xfaV1bcl9pXTsKLSAgICAgIGlmIChhZGQgPCByZW1vdmUgJiYgYWRkIDwgcmVwbGFjZSkgewotICAgICAgICBjb3N0c1tsX2kgKyAxXVtyX2kgKyAxXSA9IGFkZCArIDE7Ci0gICAgICAgIGJlc3RfbW92ZVtsX2kgKyAxXVtyX2kgKyAxXSA9IGtBZGQ7Ci0gICAgICB9IGVsc2UgaWYgKHJlbW92ZSA8IGFkZCAmJiByZW1vdmUgPCByZXBsYWNlKSB7Ci0gICAgICAgIGNvc3RzW2xfaSArIDFdW3JfaSArIDFdID0gcmVtb3ZlICsgMTsKLSAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga1JlbW92ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIG1ha2UgcmVwbGFjZSBhIGxpdHRsZSBtb3JlIGV4cGVuc2l2ZSB0aGFuIGFkZC9yZW1vdmUgdG8gbG93ZXIKLSAgICAgICAgLy8gdGhlaXIgcHJpb3JpdHkuCi0gICAgICAgIGNvc3RzW2xfaSArIDFdW3JfaSArIDFdID0gcmVwbGFjZSArIDEuMDAwMDE7Ci0gICAgICAgIGJlc3RfbW92ZVtsX2kgKyAxXVtyX2kgKyAxXSA9IGtSZXBsYWNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFJlY29uc3RydWN0IHRoZSBiZXN0IHBhdGguIFdlIGRvIGl0IGluIHJldmVyc2Ugb3JkZXIuCi0gIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBiZXN0X3BhdGg7Ci0gIGZvciAoc2l6ZV90IGxfaSA9IGxlZnQuc2l6ZSgpLCByX2kgPSByaWdodC5zaXplKCk7IGxfaSA+IDAgfHwgcl9pID4gMDspIHsKLSAgICBFZGl0VHlwZSBtb3ZlID0gYmVzdF9tb3ZlW2xfaV1bcl9pXTsKLSAgICBiZXN0X3BhdGgucHVzaF9iYWNrKG1vdmUpOwotICAgIGxfaSAtPSBtb3ZlICE9IGtBZGQ7Ci0gICAgcl9pIC09IG1vdmUgIT0ga1JlbW92ZTsKLSAgfQotICBzdGQ6OnJldmVyc2UoYmVzdF9wYXRoLmJlZ2luKCksIGJlc3RfcGF0aC5lbmQoKSk7Ci0gIHJldHVybiBiZXN0X3BhdGg7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBjb252ZXJ0IHN0cmluZyBpbnRvIGlkcyB3aXRoIGRlZHVwbGljYXRpb24uCi1jbGFzcyBJbnRlcm5hbFN0cmluZ3MgewotIHB1YmxpYzoKLSAgc2l6ZV90IEdldElkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBJZE1hcDo6aXRlcmF0b3IgaXQgPSBpZHNfLmZpbmQoc3RyKTsKLSAgICBpZiAoaXQgIT0gaWRzXy5lbmQoKSkgcmV0dXJuIGl0LT5zZWNvbmQ7Ci0gICAgc2l6ZV90IGlkID0gaWRzXy5zaXplKCk7Ci0gICAgcmV0dXJuIGlkc19bc3RyXSA9IGlkOwotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzaXplX3Q+IElkTWFwOwotICBJZE1hcCBpZHNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsZWZ0LAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmlnaHQpIHsKLSAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBsZWZ0X2lkcywgcmlnaHRfaWRzOwotICB7Ci0gICAgSW50ZXJuYWxTdHJpbmdzIGludGVybl90YWJsZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlZnQuc2l6ZSgpOyArK2kpIHsKLSAgICAgIGxlZnRfaWRzLnB1c2hfYmFjayhpbnRlcm5fdGFibGUuR2V0SWQobGVmdFtpXSkpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJpZ2h0LnNpemUoKTsgKytpKSB7Ci0gICAgICByaWdodF9pZHMucHVzaF9iYWNrKGludGVybl90YWJsZS5HZXRJZChyaWdodFtpXSkpOwotICAgIH0KLSAgfQotICByZXR1cm4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKGxlZnRfaWRzLCByaWdodF9pZHMpOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBIZWxwZXIgY2xhc3MgdGhhdCBob2xkcyB0aGUgc3RhdGUgZm9yIG9uZSBodW5rIGFuZCBwcmludHMgaXQgb3V0IHRvIHRoZQotLy8gc3RyZWFtLgotLy8gSXQgcmVvcmRlcnMgYWRkcy9yZW1vdmVzIHdoZW4gcG9zc2libGUgdG8gZ3JvdXAgYWxsIHJlbW92ZXMgYmVmb3JlIGFsbAotLy8gYWRkcy4gSXQgYWxzbyBhZGRzIHRoZSBodW5rIGhlYWRlciBiZWZvcmUgcHJpbnRpbnQgaW50byB0aGUgc3RyZWFtLgotY2xhc3MgSHVuayB7Ci0gcHVibGljOgotICBIdW5rKHNpemVfdCBsZWZ0X3N0YXJ0LCBzaXplX3QgcmlnaHRfc3RhcnQpCi0gICAgICA6IGxlZnRfc3RhcnRfKGxlZnRfc3RhcnQpLAotICAgICAgICByaWdodF9zdGFydF8ocmlnaHRfc3RhcnQpLAotICAgICAgICBhZGRzXygpLAotICAgICAgICByZW1vdmVzXygpLAotICAgICAgICBjb21tb25fKCkge30KLQotICB2b2lkIFB1c2hMaW5lKGNoYXIgZWRpdCwgY29uc3QgY2hhciogbGluZSkgewotICAgIHN3aXRjaCAoZWRpdCkgewotICAgICAgY2FzZSAnICc6Ci0gICAgICAgICsrY29tbW9uXzsKLSAgICAgICAgRmx1c2hFZGl0cygpOwotICAgICAgICBodW5rXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoJyAnLCBsaW5lKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICsrcmVtb3Zlc187Ci0gICAgICAgIGh1bmtfcmVtb3Zlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCctJywgbGluZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJysnOgotICAgICAgICArK2FkZHNfOwotICAgICAgICBodW5rX2FkZHNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcignKycsIGxpbmUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBQcmludFRvKHN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBQcmludEhlYWRlcihvcyk7Ci0gICAgRmx1c2hFZGl0cygpOwotICAgIGZvciAoc3RkOjpsaXN0PHN0ZDo6cGFpcjxjaGFyLCBjb25zdCBjaGFyKj4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgICAgICAgIGh1bmtfLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBodW5rXy5lbmQoKTsgKytpdCkgewotICAgICAgKm9zIDw8IGl0LT5maXJzdCA8PCBpdC0+c2Vjb25kIDw8ICJcbiI7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBoYXNfZWRpdHMoKSBjb25zdCB7IHJldHVybiBhZGRzXyB8fCByZW1vdmVzXzsgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBGbHVzaEVkaXRzKCkgewotICAgIGh1bmtfLnNwbGljZShodW5rXy5lbmQoKSwgaHVua19yZW1vdmVzXyk7Ci0gICAgaHVua18uc3BsaWNlKGh1bmtfLmVuZCgpLCBodW5rX2FkZHNfKTsKLSAgfQotCi0gIC8vIFByaW50IGEgdW5pZmllZCBkaWZmIGhlYWRlciBmb3Igb25lIGh1bmsuCi0gIC8vIFRoZSBmb3JtYXQgaXMKLSAgLy8gICAiQEAgLTxsZWZ0X3N0YXJ0Piw8bGVmdF9sZW5ndGg+ICs8cmlnaHRfc3RhcnQ+LDxyaWdodF9sZW5ndGg+IEBAIgotICAvLyB3aGVyZSB0aGUgbGVmdC9yaWdodCBwYXJ0cyBhcmUgb21taXR0ZWQgaWYgdW5uZWNlc3NhcnkuCi0gIHZvaWQgUHJpbnRIZWFkZXIoc3RkOjpvc3RyZWFtKiBzcykgY29uc3QgewotICAgICpzcyA8PCAiQEAgIjsKLSAgICBpZiAocmVtb3Zlc18pIHsKLSAgICAgICpzcyA8PCAiLSIgPDwgbGVmdF9zdGFydF8gPDwgIiwiIDw8IChyZW1vdmVzXyArIGNvbW1vbl8pOwotICAgIH0KLSAgICBpZiAocmVtb3Zlc18gJiYgYWRkc18pIHsKLSAgICAgICpzcyA8PCAiICI7Ci0gICAgfQotICAgIGlmIChhZGRzXykgewotICAgICAgKnNzIDw8ICIrIiA8PCByaWdodF9zdGFydF8gPDwgIiwiIDw8IChhZGRzXyArIGNvbW1vbl8pOwotICAgIH0KLSAgICAqc3MgPDwgIiBAQFxuIjsKLSAgfQotCi0gIHNpemVfdCBsZWZ0X3N0YXJ0XywgcmlnaHRfc3RhcnRfOwotICBzaXplX3QgYWRkc18sIHJlbW92ZXNfLCBjb21tb25fOwotICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNoYXIsIGNvbnN0IGNoYXIqPiA+IGh1bmtfLCBodW5rX2FkZHNfLCBodW5rX3JlbW92ZXNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIENyZWF0ZSBhIGxpc3Qgb2YgZGlmZiBodW5rcyBpbiBVbmlmaWVkIGRpZmYgZm9ybWF0LgotLy8gRWFjaCBodW5rIGhhcyBhIGhlYWRlciBnZW5lcmF0ZWQgYnkgUHJpbnRIZWFkZXIgYWJvdmUgcGx1cyBhIGJvZHkgd2l0aAotLy8gbGluZXMgcHJlZml4ZWQgd2l0aCAnICcgZm9yIG5vIGNoYW5nZSwgJy0nIGZvciBkZWxldGlvbiBhbmQgJysnIGZvcgotLy8gYWRkaXRpb24uCi0vLyAnY29udGV4dCcgcmVwcmVzZW50cyB0aGUgZGVzaXJlZCB1bmNoYW5nZWQgcHJlZml4L3N1ZmZpeCBhcm91bmQgdGhlIGRpZmYuCi0vLyBJZiB0d28gaHVua3MgYXJlIGNsb3NlIGVub3VnaCB0aGF0IHRoZWlyIGNvbnRleHRzIG92ZXJsYXAsIHRoZW4gdGhleSBhcmUKLS8vIGpvaW5lZCBpbnRvIG9uZSBodW5rLgotc3RkOjpzdHJpbmcgQ3JlYXRlVW5pZmllZERpZmYoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb250ZXh0KSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBlZGl0cyA9IENhbGN1bGF0ZU9wdGltYWxFZGl0cyhsZWZ0LCByaWdodCk7Ci0KLSAgc2l6ZV90IGxfaSA9IDAsIHJfaSA9IDAsIGVkaXRfaSA9IDA7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICB3aGlsZSAoZWRpdF9pIDwgZWRpdHMuc2l6ZSgpKSB7Ci0gICAgLy8gRmluZCBmaXJzdCBlZGl0LgotICAgIHdoaWxlIChlZGl0X2kgPCBlZGl0cy5zaXplKCkgJiYgZWRpdHNbZWRpdF9pXSA9PSBrTWF0Y2gpIHsKLSAgICAgICsrbF9pOwotICAgICAgKytyX2k7Ci0gICAgICArK2VkaXRfaTsKLSAgICB9Ci0KLSAgICAvLyBGaW5kIHRoZSBmaXJzdCBsaW5lIHRvIGluY2x1ZGUgaW4gdGhlIGh1bmsuCi0gICAgY29uc3Qgc2l6ZV90IHByZWZpeF9jb250ZXh0ID0gc3RkOjptaW4obF9pLCBjb250ZXh0KTsKLSAgICBIdW5rIGh1bmsobF9pIC0gcHJlZml4X2NvbnRleHQgKyAxLCByX2kgLSBwcmVmaXhfY29udGV4dCArIDEpOwotICAgIGZvciAoc2l6ZV90IGkgPSBwcmVmaXhfY29udGV4dDsgaSA+IDA7IC0taSkgewotICAgICAgaHVuay5QdXNoTGluZSgnICcsIGxlZnRbbF9pIC0gaV0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgLy8gSXRlcmF0ZSB0aGUgZWRpdHMgdW50aWwgd2UgZm91bmQgZW5vdWdoIHN1ZmZpeCBmb3IgdGhlIGh1bmsgb3IgdGhlIGlucHV0Ci0gICAgLy8gaXMgb3Zlci4KLSAgICBzaXplX3Qgbl9zdWZmaXggPSAwOwotICAgIGZvciAoOyBlZGl0X2kgPCBlZGl0cy5zaXplKCk7ICsrZWRpdF9pKSB7Ci0gICAgICBpZiAobl9zdWZmaXggPj0gY29udGV4dCkgewotICAgICAgICAvLyBDb250aW51ZSBvbmx5IGlmIHRoZSBuZXh0IGh1bmsgaXMgdmVyeSBjbG9zZS4KLSAgICAgICAgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVkaXRzLmJlZ2luKCkgKyBlZGl0X2k7Ci0gICAgICAgIHdoaWxlIChpdCAhPSBlZGl0cy5lbmQoKSAmJiAqaXQgPT0ga01hdGNoKSArK2l0OwotICAgICAgICBpZiAoaXQgPT0gZWRpdHMuZW5kKCkgfHwgKGl0IC0gZWRpdHMuYmVnaW4oKSkgLSBlZGl0X2kgPj0gY29udGV4dCkgewotICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5leHQgZWRpdCBvciBpdCBpcyB0b28gZmFyIGF3YXkuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRWRpdFR5cGUgZWRpdCA9IGVkaXRzW2VkaXRfaV07Ci0gICAgICAvLyBSZXNldCBjb3VudCB3aGVuIGEgbm9uIG1hdGNoIGlzIGZvdW5kLgotICAgICAgbl9zdWZmaXggPSBlZGl0ID09IGtNYXRjaCA/IG5fc3VmZml4ICsgMSA6IDA7Ci0KLSAgICAgIGlmIChlZGl0ID09IGtNYXRjaCB8fCBlZGl0ID09IGtSZW1vdmUgfHwgZWRpdCA9PSBrUmVwbGFjZSkgewotICAgICAgICBodW5rLlB1c2hMaW5lKGVkaXQgPT0ga01hdGNoID8gJyAnIDogJy0nLCBsZWZ0W2xfaV0uY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZWRpdCA9PSBrQWRkIHx8IGVkaXQgPT0ga1JlcGxhY2UpIHsKLSAgICAgICAgaHVuay5QdXNoTGluZSgnKycsIHJpZ2h0W3JfaV0uY19zdHIoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFkdmFuY2UgaW5kaWNlcywgZGVwZW5kaW5nIG9uIGVkaXQgdHlwZS4KLSAgICAgIGxfaSArPSBlZGl0ICE9IGtBZGQ7Ci0gICAgICByX2kgKz0gZWRpdCAhPSBrUmVtb3ZlOwotICAgIH0KLQotICAgIGlmICghaHVuay5oYXNfZWRpdHMoKSkgewotICAgICAgLy8gV2UgYXJlIGRvbmUuIFdlIGRvbid0IHdhbnQgdGhpcyBodW5rLgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaHVuay5QcmludFRvKCZzcyk7Ci0gIH0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZWRpdF9kaXN0YW5jZQotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgcmVjZWl2ZWQgaW4gRXFGYWlsdXJlKCkgYXJlIGFscmVhZHkKLS8vIGVzY2FwZWQuIFNwbGl0IHRoZW0gb24gZXNjYXBlZCAnXG4nIGJvdW5kYXJpZXMuIExlYXZlIGFsbCBvdGhlciBlc2NhcGVkCi0vLyBjaGFyYWN0ZXJzIHRoZSBzYW1lLgotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNwbGl0RXNjYXBlZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKLSAgc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gc3RyLnNpemUoKTsKLSAgaWYgKGVuZCA+IDIgJiYgc3RyWzBdID09ICciJyAmJiBzdHJbZW5kIC0gMV0gPT0gJyInKSB7Ci0gICAgKytzdGFydDsKLSAgICAtLWVuZDsKLSAgfQotICBib29sIGVzY2FwZWQgPSBmYWxzZTsKLSAgZm9yIChzaXplX3QgaSA9IHN0YXJ0OyBpICsgMSA8IGVuZDsgKytpKSB7Ci0gICAgaWYgKGVzY2FwZWQpIHsKLSAgICAgIGVzY2FwZWQgPSBmYWxzZTsKLSAgICAgIGlmIChzdHJbaV0gPT0gJ24nKSB7Ci0gICAgICAgIGxpbmVzLnB1c2hfYmFjayhzdHIuc3Vic3RyKHN0YXJ0LCBpIC0gc3RhcnQgLSAxKSk7Ci0gICAgICAgIHN0YXJ0ID0gaSArIDE7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVzY2FwZWQgPSBzdHJbaV0gPT0gJ1xcJzsKLSAgICB9Ci0gIH0KLSAgbGluZXMucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7Ci0gIHJldHVybiBsaW5lczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgotLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KLS8vCi0vLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCi0vLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCi0vLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6Ci0vLwotLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgotLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgotLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKLS8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCi0vLwotLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQotLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKLS8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCi1Bc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JpbmdfY2FzZSkgewotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBhY3R1YWxfZXhwcmVzc2lvbjsKLSAgaWYgKGFjdHVhbF92YWx1ZSAhPSBhY3R1YWxfZXhwcmVzc2lvbikgewotICAgIG1zZyA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsdWU7Ci0gIH0KLQotICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfZXhwcmVzc2lvbjsKLSAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsKLSAgICBtc2cgPDwgIiAoaWdub3JpbmcgY2FzZSkiOwotICB9Ci0gIGlmIChleHBlY3RlZF92YWx1ZSAhPSBleHBlY3RlZF9leHByZXNzaW9uKSB7Ci0gICAgbXNnIDw8ICJcbldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbHVlOwotICB9Ci0KLSAgaWYgKCFleHBlY3RlZF92YWx1ZS5lbXB0eSgpICYmICFhY3R1YWxfdmFsdWUuZW1wdHkoKSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBleHBlY3RlZF9saW5lcyA9Ci0gICAgICAgIFNwbGl0RXNjYXBlZFN0cmluZyhleHBlY3RlZF92YWx1ZSk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFjdHVhbF9saW5lcyA9Ci0gICAgICAgIFNwbGl0RXNjYXBlZFN0cmluZyhhY3R1YWxfdmFsdWUpOwotICAgIGlmIChleHBlY3RlZF9saW5lcy5zaXplKCkgPiAxIHx8IGFjdHVhbF9saW5lcy5zaXplKCkgPiAxKSB7Ci0gICAgICBtc2cgPDwgIlxuV2l0aCBkaWZmOlxuIgotICAgICAgICAgIDw8IGVkaXRfZGlzdGFuY2U6OkNyZWF0ZVVuaWZpZWREaWZmKGV4cGVjdGVkX2xpbmVzLCBhY3R1YWxfbGluZXMpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KLXN0ZDo6c3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKLSAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCi0gICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAotICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCi0gICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKSB7Ci0gIGNvbnN0IGNoYXIqIGFjdHVhbF9tZXNzYWdlID0gYXNzZXJ0aW9uX3Jlc3VsdC5tZXNzYWdlKCk7Ci0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGV4cHJlc3Npb25fdGV4dAotICAgICAgPDwgIlxuICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZTsKLSAgaWYgKGFjdHVhbF9tZXNzYWdlWzBdICE9ICdcMCcpCi0gICAgbXNnIDw8ICIgKCIgPDwgYWN0dWFsX21lc3NhZ2UgPDwgIikiOwotICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlOwotICByZXR1cm4gbXNnLkdldFN0cmluZygpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KLUFzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhYnNfZXJyb3JfZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzX2Vycm9yKSB7Ci0gIGNvbnN0IGRvdWJsZSBkaWZmID0gZmFicyh2YWwxIC0gdmFsMik7Ci0gIGlmIChkaWZmIDw9IGFic19lcnJvcikgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICAvLyBUT0RPKHdhbik6IGRvIG5vdCBwcmludCB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBpZiBpdCdzCi0gIC8vIGFscmVhZHkgYSBsaXRlcmFsLgotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIDw8IGV4cHIxIDw8ICIgYW5kICIgPDwgZXhwcjIKLSAgICAgIDw8ICIgaXMgIiA8PCBkaWZmIDw8ICIsIHdoaWNoIGV4Y2VlZHMgIiA8PCBhYnNfZXJyb3JfZXhwciA8PCAiLCB3aGVyZVxuIgotICAgICAgPDwgZXhwcjEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwxIDw8ICIsXG4iCi0gICAgICA8PCBleHByMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDIgPDwgIiwgYW5kXG4iCi0gICAgICA8PCBhYnNfZXJyb3JfZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IGFic19lcnJvciA8PCAiLiI7Ci19Ci0KLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgRmxvYXRMRSgpIGFuZCBEb3VibGVMRSgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Ci1Bc3NlcnRpb25SZXN1bHQgRmxvYXRpbmdQb2ludExFKGNvbnN0IGNoYXIqIGV4cHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDIpIHsKLSAgLy8gUmV0dXJucyBzdWNjZXNzIGlmIHZhbDEgaXMgbGVzcyB0aGFuIHZhbDIsCi0gIGlmICh2YWwxIDwgdmFsMikgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICAvLyBvciBpZiB2YWwxIGlzIGFsbW9zdCBlcXVhbCB0byB2YWwyLgotICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyh2YWwxKSwgcmhzKHZhbDIpOwotICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIC8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgdHdvIGNoZWNrcyB3aWxsIGJvdGggZmFpbCBpZiBlaXRoZXIgdmFsMSBvcgotICAvLyB2YWwyIGlzIE5hTiwgYXMgdGhlIElFRUUgZmxvYXRpbmctcG9pbnQgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdAotICAvLyBhbnkgcHJlZGljYXRlIGludm9sdmluZyBhIE5hTiBtdXN0IHJldHVybiBmYWxzZS4KLQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDFfc3M7Ci0gIHZhbDFfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQotICAgICAgICAgIDw8IHZhbDE7Ci0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwyX3NzOwotICB2YWwyX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKLSAgICAgICAgICA8PCB2YWwyOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgPD0gKCIgPDwgZXhwcjIgPDwgIilcbiIKLSAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMV9zcykgPDwgIiB2cyAiCi0gICAgICA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMl9zcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCi0vLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KLUFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZmxvYXQ+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Ci19Ci0KLS8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKLS8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgotQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZG91YmxlPihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEgd2l0aCBpbnQgb3IgZW51bQotLy8gYXJndW1lbnRzLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCkgewotICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksCi0gICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQpLAotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLy8gQSBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHRoZSBoZWxwZXIgZnVuY3Rpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKLS8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/IHdpdGggaW50ZWdlciBvciBlbnVtIGFyZ3VtZW50cy4gIEl0IGlzIGhlcmUKLS8vIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUgb2Ygc2ltaWxhciBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKSB7XAotICBpZiAodmFsMSBvcCB2YWwyKSB7XAotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAotICB9IGVsc2Uge1wKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIFwKLSAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAotICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKLSAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCi0gIH1cCi19Ci0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FIHdpdGggaW50IG9yCi0vLyBlbnVtIGFyZ3VtZW50cy4KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUgd2l0aCBpbnQgb3IKLS8vIGVudW0gYXJndW1lbnRzLgotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVCB3aXRoIGludCBvcgotLy8gZW51bSBhcmd1bWVudHMuCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8ICkKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFIHdpdGggaW50IG9yCi0vLyBlbnVtIGFyZ3VtZW50cy4KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1Qgd2l0aCBpbnQgb3IKLS8vIGVudW0gYXJndW1lbnRzLgotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApCi0KLSN1bmRlZiBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfCi0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgewotICBpZiAoU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGV4cGVjdGVkKSwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGFjdHVhbCksCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgewotICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGV4cGVjdGVkKSwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGFjdHVhbCksCi0gICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci19Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKLSAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoczEsIHMyKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7Ci0gIH0KLX0KLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORS4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKSB7Ci0gIGlmICghU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9IGVsc2UgewotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCi0gICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIikgKGlnbm9yaW5nIGNhc2UpLCBhY3R1YWw6IFwiIgotICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBJc1N1YlN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpLgotCi0vLyBUaGlzIGdyb3VwIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHJldHVybiB0cnVlIGlmZiBuZWVkbGUgaXMgYQotLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrLiAgTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgotLy8gb25seS4KLQotYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgewotICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKLSAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOwotCi0gIHJldHVybiBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKLX0KLQotYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgewotICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKLSAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOwotCi0gIHJldHVybiB3Y3NzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKLX0KLQotLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBlaXRoZXIgOjpzdGQ6OnN0cmluZyBvciA6OnN0ZDo6d3N0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgotYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKLSAgcmV0dXJuIGhheXN0YWNrLmZpbmQobmVlZGxlKSAhPSBTdHJpbmdUeXBlOjpucG9zOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZWl0aGVyIElzU3Vic3RyaW5nKCkgb3IgSXNOb3RTdWJzdHJpbmcoKSwKLS8vIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyBwYXJhbWV0ZXIuCi0vLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGNvbnN0IGNoYXIqLCBjb25zdCB3Y2hhcl90KiwgOjpzdGQ6OnN0cmluZywKLS8vIG9yIDo6c3RkOjp3c3RyaW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmdJbXBsKAotICAgIGJvb2wgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nLAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKLSAgaWYgKElzU3Vic3RyaW5nUHJlZChuZWVkbGUsIGhheXN0YWNrKSA9PSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcpCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICBjb25zdCBib29sIGlzX3dpZGVfc3RyaW5nID0gc2l6ZW9mKG5lZWRsZVswXSkgPiAxOwotICBjb25zdCBjaGFyKiBjb25zdCBiZWdpbl9zdHJpbmdfcXVvdGUgPSBpc193aWRlX3N0cmluZyA/ICJMXCIiIDogIlwiIjsKLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgPDwgIlZhbHVlIG9mOiAiIDw8IG5lZWRsZV9leHByIDw8ICJcbiIKLSAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgbmVlZGxlIDw8ICJcIlxuIgotICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IChleHBlY3RlZF90b19iZV9zdWJzdHJpbmcgPyAiIiA6ICJub3QgIikKLSAgICAgIDw8ICJhIHN1YnN0cmluZyBvZiAiIDw8IGhheXN0YWNrX2V4cHIgPDwgIlxuIgotICAgICAgPDwgIldoaWNoIGlzOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBoYXlzdGFjayA8PCAiXCIiOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhCi0vLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2sgKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYKLS8vIG9ubHkpLCBhbmQgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCi0KLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLQotbmFtZXNwYWNlIHsKLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBJc0hSRVNVTFR7U3VjY2Vzc0ZhaWx1cmV9IHByZWRpY2F0ZXMKLUFzc2VydGlvblJlc3VsdCBIUkVTVUxURmFpbHVyZUhlbHBlcihjb25zdCBjaGFyKiBleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaHIpIHsgIC8vIE5PTElOVAotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0gIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBzdXBwb3J0IEZvcm1hdE1lc3NhZ2UuCi0gIGNvbnN0IGNoYXIgZXJyb3JfdGV4dFtdID0gIiI7Ci0KLSMgZWxzZQotCi0gIC8vIExvb2tzIHVwIHRoZSBodW1hbi1yZWFkYWJsZSBzeXN0ZW0gbWVzc2FnZSBmb3IgdGhlIEhSRVNVTFQgY29kZQotICAvLyBhbmQgc2luY2Ugd2UncmUgbm90IHBhc3NpbmcgYW55IHBhcmFtcyB0byBGb3JtYXRNZXNzYWdlLCB3ZSBkb24ndAotICAvLyB3YW50IGluc2VydHMgZXhwYW5kZWQuCi0gIGNvbnN0IERXT1JEIGtGbGFncyA9IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKLSAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFM7Ci0gIGNvbnN0IERXT1JEIGtCdWZTaXplID0gNDA5NjsKLSAgLy8gR2V0cyB0aGUgc3lzdGVtJ3MgaHVtYW4gcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgZm9yIHRoaXMgSFJFU1VMVC4KLSAgY2hhciBlcnJvcl90ZXh0W2tCdWZTaXplXSA9IHsgJ1wwJyB9OwotICBEV09SRCBtZXNzYWdlX2xlbmd0aCA9IDo6Rm9ybWF0TWVzc2FnZUEoa0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIHNvdXJjZSwgd2UncmUgYXNraW5nIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHIsICAvLyB0aGUgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBsaW5lIHdpZHRoIHJlc3RyaWN0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGV4dCwgIC8vIG91dHB1dCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCdWZTaXplLCAgLy8gYnVmIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLy8gbm8gYXJndW1lbnRzIGZvciBpbnNlcnRzCi0gIC8vIFRyaW1zIHRhaWxpbmcgd2hpdGUgc3BhY2UgKEZvcm1hdE1lc3NhZ2UgbGVhdmVzIGEgdHJhaWxpbmcgQ1ItTEYpCi0gIGZvciAoOyBtZXNzYWdlX2xlbmd0aCAmJiBJc1NwYWNlKGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSk7Ci0gICAgICAgICAgLS1tZXNzYWdlX2xlbmd0aCkgewotICAgIGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSA9ICdcMCc7Ci0gIH0KLQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9oZXgoIjB4IiArIFN0cmluZzo6Rm9ybWF0SGV4SW50KGhyKSk7Ci0gIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cHIgPDwgIiAiIDw8IGV4cGVjdGVkIDw8ICIuXG4iCi0gICAgICA8PCAiICBBY3R1YWw6ICIgPDwgZXJyb3JfaGV4IDw8ICIgIiA8PCBlcnJvcl90ZXh0IDw8ICJcbiI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1Bc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxUU3VjY2Vzcyhjb25zdCBjaGFyKiBleHByLCBsb25nIGhyKSB7ICAvLyBOT0xJTlQKLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci0gIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAic3VjY2VlZHMiLCBocik7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVAotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLSAgcmV0dXJuIEhSRVNVTFRGYWlsdXJlSGVscGVyKGV4cHIsICJmYWlscyIsIGhyKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBlbmNvZGluZyBVbmljb2RlIHRleHQgKHdpZGUgc3RyaW5ncykgaW4KLS8vIFVURi04LgotCi0vLyBBIFVuaWNvZGUgY29kZS1wb2ludCBjYW4gaGF2ZSB1cHRvIDIxIGJpdHMsIGFuZCBpcyBlbmNvZGVkIGluIFVURi04Ci0vLyBsaWtlIHRoaXM6Ci0vLwotLy8gQ29kZS1wb2ludCBsZW5ndGggICBFbmNvZGluZwotLy8gICAwIC0gIDcgYml0cyAgICAgICAweHh4eHh4eAotLy8gICA4IC0gMTEgYml0cyAgICAgICAxMTB4eHh4eCAxMHh4eHh4eAotLy8gIDEyIC0gMTYgYml0cyAgICAgICAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotLy8gIDE3IC0gMjEgYml0cyAgICAgICAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotCi0vLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgb25lLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KLWNvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MSA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICA3KSAtIDE7Ci0KLS8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0d28tYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgotY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQyID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDUgKyA2KSkgLSAxOwotCi0vLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdGhyZWUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgotY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQzID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDQgKyAyKjYpKSAtIDE7Ci0KLS8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBmb3VyLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KLWNvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50NCA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICgzICsgMyo2KSkgLSAxOwotCi0vLyBDaG9wcyBvZmYgdGhlIG4gbG93ZXN0IGJpdHMgZnJvbSBhIGJpdCBwYXR0ZXJuLiAgUmV0dXJucyB0aGUgbgotLy8gbG93ZXN0IGJpdHMuICBBcyBhIHNpZGUgZWZmZWN0LCB0aGUgb3JpZ2luYWwgYml0IHBhdHRlcm4gd2lsbCBiZQotLy8gc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgbiBiaXRzLgotaW5saW5lIFVJbnQzMiBDaG9wTG93Qml0cyhVSW50MzIqIGJpdHMsIGludCBuKSB7Ci0gIGNvbnN0IFVJbnQzMiBsb3dfYml0cyA9ICpiaXRzICYgKChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8IG4pIC0gMSk7Ci0gICpiaXRzID4+PSBuOwotICByZXR1cm4gbG93X2JpdHM7Ci19Ci0KLS8vIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KLS8vIGNvZGVfcG9pbnQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgVUludDMyIGJlY2F1c2Ugd2NoYXJfdCBtYXkgbm90IGJlCi0vLyB3aWRlIGVub3VnaCB0byBjb250YWluIGEgY29kZSBwb2ludC4KLS8vIElmIHRoZSBjb2RlX3BvaW50IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludAotLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgaXQgd2lsbCBiZSBjb252ZXJ0ZWQKLS8vIHRvICIoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpIi4KLXN0ZDo6c3RyaW5nIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCkgewotICBpZiAoY29kZV9wb2ludCA+IGtNYXhDb2RlUG9pbnQ0KSB7Ci0gICAgcmV0dXJuICIoSW52YWxpZCBVbmljb2RlIDB4IiArIFN0cmluZzo6Rm9ybWF0SGV4SW50KGNvZGVfcG9pbnQpICsgIikiOwotICB9Ci0KLSAgY2hhciBzdHJbNV07ICAvLyBCaWcgZW5vdWdoIGZvciB0aGUgbGFyZ2VzdCB2YWxpZCBjb2RlIHBvaW50LgotICBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MSkgewotICAgIHN0clsxXSA9ICdcMCc7Ci0gICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweHh4eHh4eAotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDIpIHsKLSAgICBzdHJbMl0gPSAnXDAnOwotICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKLSAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEMwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMHh4eHh4Ci0gIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MykgewotICAgIHN0clszXSA9ICdcMCc7Ci0gICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAotICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKLSAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEUwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMTB4eHh4Ci0gIH0gZWxzZSB7ICAvLyBjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQ0Ci0gICAgc3RyWzRdID0gJ1wwJzsKLSAgICBzdHJbM10gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4Ci0gICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAotICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKLSAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEYwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMTEweHh4Ci0gIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUgdGhlIHN5c3RlbQotLy8gdXNlcyBVVEYtMTYgZm9yIHdpZGUgc3RyaW5nIGVuY29kaW5nLiBBbGwgc3VwcG9ydGVkIHN5c3RlbXMKLS8vIHdpdGggMTYgYml0IHdjaGFyX3QgKFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykgZG8gdXNlIFVURi0xNi4KLQotLy8gRGV0ZXJtaW5lcyBpZiB0aGUgYXJndW1lbnRzIGNvbnN0aXR1dGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCi0vLyBhbmQgdGh1cyBzaG91bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQKLS8vIHVzaW5nIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIuCi1pbmxpbmUgYm9vbCBJc1V0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LCB3Y2hhcl90IHNlY29uZCkgewotICByZXR1cm4gc2l6ZW9mKHdjaGFyX3QpID09IDIgJiYKLSAgICAgIChmaXJzdCAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChzZWNvbmQgJiAweEZDMDApID09IDB4REMwMDsKLX0KLQotLy8gQ3JlYXRlcyBhIFVuaWNvZGUgY29kZSBwb2ludCBmcm9tIFVURjE2IHN1cnJvZ2F0ZSBwYWlyLgotaW5saW5lIFVJbnQzMiBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBzZWNvbmQpIHsKLSAgY29uc3QgVUludDMyIG1hc2sgPSAoMSA8PCAxMCkgLSAxOwotICByZXR1cm4gKHNpemVvZih3Y2hhcl90KSA9PSAyKSA/Ci0gICAgICAoKChmaXJzdCAmIG1hc2spIDw8IDEwKSB8IChzZWNvbmQgJiBtYXNrKSkgKyAweDEwMDAwIDoKLSAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgY29uZGl0aW9uIGlzCi0gICAgICAvLyBmYWxzZSwgYnV0IHdlIHByb3ZpZGUgYSBzZW5zaWJsZSBkZWZhdWx0IGluIGNhc2UgaXQgaXMuCi0gICAgICBzdGF0aWNfY2FzdDxVSW50MzI+KGZpcnN0KTsKLX0KLQotLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCi0vLyBUaGUgd2lkZSBzdHJpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZW5jb2Rpbmc6Ci0vLyAgIFVURi0xNiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gMiAob24gV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKQotLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQotLy8gUGFyYW1ldGVyIHN0ciBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuCi0vLyBQYXJhbWV0ZXIgbnVtX2NoYXJzIG1heSBhZGRpdGlvbmFsbHkgbGltaXQgdGhlIG51bWJlcgotLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nCi0vLyBzaG91bGQgYmUgcHJvY2Vzc2VkLgotLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cwotLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dAotLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLiBJZiB0aGUgc3RyaW5nIGlzIGluIFVURjE2IGVuY29kaW5nCi0vLyBhbmQgY29udGFpbnMgaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLCB2YWx1ZXMgaW4gdGhvc2UgcGFpcnMKLS8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4KLXN0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKSB7Ci0gIGlmIChudW1fY2hhcnMgPT0gLTEpCi0gICAgbnVtX2NoYXJzID0gc3RhdGljX2Nhc3Q8aW50Pih3Y3NsZW4oc3RyKSk7Ci0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NoYXJzOyArK2kpIHsKLSAgICBVSW50MzIgdW5pY29kZV9jb2RlX3BvaW50OwotCi0gICAgaWYgKHN0cltpXSA9PSBMJ1wwJykgewotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChpICsgMSA8IG51bV9jaGFycyAmJiBJc1V0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sIHN0cltpICsgMV0pKSB7Ci0gICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2kgKyAxXSk7Ci0gICAgICBpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuaWNvZGVfY29kZV9wb2ludCA9IHN0YXRpY19jYXN0PFVJbnQzMj4oc3RyW2ldKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0gPDwgQ29kZVBvaW50VG9VdGY4KHVuaWNvZGVfY29kZV9wb2ludCk7Ci0gIH0KLSAgcmV0dXJuIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pOwotfQotCi0vLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYW4gc3RkOjpzdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgotLy8gTlVMTCB3aWxsIGJlIGNvbnZlcnRlZCB0byAiKG51bGwpIi4KLXN0ZDo6c3RyaW5nIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKGNvbnN0IHdjaGFyX3QgKiB3aWRlX2Nfc3RyKSB7Ci0gIGlmICh3aWRlX2Nfc3RyID09IE5VTEwpICByZXR1cm4gIihudWxsKSI7Ci0KLSAgcmV0dXJuIGludGVybmFsOjpXaWRlU3RyaW5nVG9VdGY4KHdpZGVfY19zdHIsIC0xKTsKLX0KLQotLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUKLS8vIGNvbnRlbnQuCi0vLwotLy8gVW5saWtlIHdjc2NtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAotLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAotLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi1ib29sIFN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCAqIGxocywgY29uc3Qgd2NoYXJfdCAqIHJocykgewotICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsKLQotICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gd2NzY21wKGxocywgcmhzKSA9PSAwOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSRVEgb24gd2lkZSBzdHJpbmdzLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogYWN0dWFsKSB7Ci0gIGlmIChTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGV4cGVjdGVkKSwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGFjdHVhbCksCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgewotICBpZiAoIVN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFByaW50VG9TdHJpbmcoczEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8IFByaW50VG9TdHJpbmcoczIpOwotfQotCi0vLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUKLS8vIHRoZSBzYW1lIGNvbnRlbnQuCi0vLwotLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCi0vLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLS8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotYm9vbCBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciAqIGxocywgY29uc3QgY2hhciAqIHJocykgewotICBpZiAobGhzID09IE5VTEwpCi0gICAgcmV0dXJuIHJocyA9PSBOVUxMOwotICBpZiAocmhzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gcG9zaXg6OlN0ckNhc2VDbXAobGhzLCByaHMpID09IDA7Ci19Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5Ci0gIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KLSAgLy8KLSAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCi0gIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgotICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQotICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAotICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgotICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCi0gIC8vIGN1cnJlbnQgbG9jYWxlLgotYm9vbCBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpIHsKLSAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7Ci0KLSAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIHJldHVybiBfd2NzaWNtcChsaHMsIHJocykgPT0gMDsKLSNlbGlmIEdURVNUX09TX0xJTlVYICYmICFHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gIHJldHVybiB3Y3NjYXNlY21wKGxocywgcmhzKSA9PSAwOwotI2Vsc2UKLSAgLy8gQW5kcm9pZCwgTWFjIE9TIFggYW5kIEN5Z3dpbiBkb24ndCBkZWZpbmUgd2NzY2FzZWNtcC4KLSAgLy8gT3RoZXIgdW5rbm93biBPU2VzIG1heSBub3QgZGVmaW5lIGl0IGVpdGhlci4KLSAgd2ludF90IGxlZnQsIHJpZ2h0OwotICBkbyB7Ci0gICAgbGVmdCA9IHRvd2xvd2VyKCpsaHMrKyk7Ci0gICAgcmlnaHQgPSB0b3dsb3dlcigqcmhzKyspOwotICB9IHdoaWxlIChsZWZ0ICYmIGxlZnQgPT0gcmlnaHQpOwotICByZXR1cm4gbGVmdCA9PSByaWdodDsKLSNlbmRpZiAgLy8gT1Mgc2VsZWN0b3IKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiBzdHIgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGlnbm9yaW5nIGNhc2UuCi0vLyBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4LgotYm9vbCBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpIHsKLSAgY29uc3Qgc2l6ZV90IHN0cl9sZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIGNvbnN0IHNpemVfdCBzdWZmaXhfbGVuID0gc3VmZml4Lmxlbmd0aCgpOwotICByZXR1cm4gKHN0cl9sZW4gPj0gc3VmZml4X2xlbikgJiYKLSAgICAgICAgIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoc3RyLmNfc3RyKCkgKyBzdHJfbGVuIC0gc3VmZml4X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4LmNfc3RyKCkpOwotfQotCi0vLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJTAyZCIuCi1zdGQ6OnN0cmluZyBTdHJpbmc6OkZvcm1hdEludFdpZHRoMihpbnQgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKSA8PCB2YWx1ZTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJVgiLgotc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRIZXhJbnQoaW50IHZhbHVlKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnVwcGVyY2FzZSA8PCB2YWx1ZTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBGb3JtYXRzIGEgYnl0ZSBhcyAiJTAyWCIuCi1zdGQ6OnN0cmluZyBTdHJpbmc6OkZvcm1hdEJ5dGUodW5zaWduZWQgY2hhciB2YWx1ZSkgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlCi0gICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4odmFsdWUpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIENvbnZlcnRzIHRoZSBidWZmZXIgaW4gYSBzdHJpbmdzdHJlYW0gdG8gYW4gc3RkOjpzdHJpbmcsIGNvbnZlcnRpbmcgTlVMCi0vLyBieXRlcyB0byAiXFwwIiBhbG9uZyB0aGUgd2F5Lgotc3RkOjpzdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3MpIHsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyID0gc3MtPnN0cigpOwotICBjb25zdCBjaGFyKiBjb25zdCBzdGFydCA9IHN0ci5jX3N0cigpOwotICBjb25zdCBjaGFyKiBjb25zdCBlbmQgPSBzdGFydCArIHN0ci5sZW5ndGgoKTsKLQotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNlcnZlKDIgKiAoZW5kIC0gc3RhcnQpKTsKLSAgZm9yIChjb25zdCBjaGFyKiBjaCA9IHN0YXJ0OyBjaCAhPSBlbmQ7ICsrY2gpIHsKLSAgICBpZiAoKmNoID09ICdcMCcpIHsKLSAgICAgIHJlc3VsdCArPSAiXFwwIjsgIC8vIFJlcGxhY2VzIE5VTCB3aXRoICJcXDAiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gKmNoOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCi1zdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgZ3Rlc3RfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpIHsKLSAgLy8gQXBwZW5kcyB0aGUgdXNlciBtZXNzYWdlIGlmIGl0J3Mgbm9uLWVtcHR5LgotICBjb25zdCBzdGQ6OnN0cmluZyB1c2VyX21zZ19zdHJpbmcgPSB1c2VyX21zZy5HZXRTdHJpbmcoKTsKLSAgaWYgKHVzZXJfbXNnX3N0cmluZy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGd0ZXN0X21zZzsKLSAgfQotCi0gIHJldHVybiBndGVzdF9tc2cgKyAiXG4iICsgdXNlcl9tc2dfc3RyaW5nOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gY2xhc3MgVGVzdFJlc3VsdAotCi0vLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCi1UZXN0UmVzdWx0OjpUZXN0UmVzdWx0KCkKLSAgICA6IGRlYXRoX3Rlc3RfY291bnRfKDApLAotICAgICAgZWxhcHNlZF90aW1lXygwKSB7Ci19Ci0KLS8vIEQndG9yLgotVGVzdFJlc3VsdDo6flRlc3RSZXN1bHQoKSB7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuCi0vLyByYW5nZSBmcm9tIDAgdG8gdG90YWxfcGFydF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwKLS8vIGFib3J0cyB0aGUgcHJvZ3JhbS4KLWNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UmVzdWx0OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3QgewotICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbF9wYXJ0X2NvdW50KCkpCi0gICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOwotICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfLmF0KGkpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQotLy8gcHJvZ3JhbS4KLWNvbnN0IFRlc3RQcm9wZXJ0eSYgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdCB7Ci0gIGlmIChpIDwgMCB8fCBpID49IHRlc3RfcHJvcGVydHlfY291bnQoKSkKLSAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7Ci0gIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfLmF0KGkpOwotfQotCi0vLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgotdm9pZCBUZXN0UmVzdWx0OjpDbGVhclRlc3RQYXJ0UmVzdWx0cygpIHsKLSAgdGVzdF9wYXJ0X3Jlc3VsdHNfLmNsZWFyKCk7Ci19Ci0KLS8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0Lgotdm9pZCBUZXN0UmVzdWx0OjpBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewotICB0ZXN0X3BhcnRfcmVzdWx0c18ucHVzaF9iYWNrKHRlc3RfcGFydF9yZXN1bHQpOwotfQotCi0vLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSBhcyB0aGUKLS8vIHN1cHBsaWVkIHByb3BlcnR5IGlzIGFscmVhZHkgcmVwcmVzZW50ZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHRlc3RfcHJvcGVydHkKLS8vIHJlcGxhY2VzIHRoZSBvbGQgdmFsdWUgZm9yIHRoYXQga2V5Lgotdm9pZCBUZXN0UmVzdWx0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgewotICBpZiAoIVZhbGlkYXRlVGVzdFByb3BlcnR5KHhtbF9lbGVtZW50LCB0ZXN0X3Byb3BlcnR5KSkgewotICAgIHJldHVybjsKLSAgfQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJnRlc3RfcHJvcGVyaXRlc19tdXRleF8pOwotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+OjppdGVyYXRvciBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9Ci0gICAgICBzdGQ6OmZpbmRfaWYodGVzdF9wcm9wZXJ0aWVzXy5iZWdpbigpLCB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJcyh0ZXN0X3Byb3BlcnR5LmtleSgpKSk7Ci0gIGlmIChwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9PSB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpKSB7Ci0gICAgdGVzdF9wcm9wZXJ0aWVzXy5wdXNoX2JhY2sodGVzdF9wcm9wZXJ0eSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5LT5TZXRWYWx1ZSh0ZXN0X3Byb3BlcnR5LnZhbHVlKCkpOwotfQotCi0vLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0c3VpdGVzPiBlbGVtZW50IG9mIFhNTAotLy8gb3V0cHV0Lgotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RTdWl0ZXNBdHRyaWJ1dGVzW10gPSB7Ci0gICJkaXNhYmxlZCIsCi0gICJlcnJvcnMiLAotICAiZmFpbHVyZXMiLAotICAibmFtZSIsCi0gICJyYW5kb21fc2VlZCIsCi0gICJ0ZXN0cyIsCi0gICJ0aW1lIiwKLSAgInRpbWVzdGFtcCIKLX07Ci0KLS8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RzdWl0ZT4gZWxlbWVudCBvZiBYTUwKLS8vIG91dHB1dC4KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0U3VpdGVBdHRyaWJ1dGVzW10gPSB7Ci0gICJkaXNhYmxlZCIsCi0gICJlcnJvcnMiLAotICAiZmFpbHVyZXMiLAotICAibmFtZSIsCi0gICJ0ZXN0cyIsCi0gICJ0aW1lIgotfTsKLQotLy8gVGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgYXR0cmlidXRlcyB1c2VkIGluIHRoZSA8dGVzdGNhc2U+IGVsZW1lbnQgb2YgWE1MIG91dHB1dC4KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0Q2FzZUF0dHJpYnV0ZXNbXSA9IHsKLSAgImNsYXNzbmFtZSIsCi0gICJuYW1lIiwKLSAgInN0YXR1cyIsCi0gICJ0aW1lIiwKLSAgInR5cGVfcGFyYW0iLAotICAidmFsdWVfcGFyYW0iCi19OwotCi10ZW1wbGF0ZSA8aW50IGtTaXplPgotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFycmF5QXNWZWN0b3IoY29uc3QgY2hhciogY29uc3QgKCZhcnJheSlba1NpemVdKSB7Ci0gIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oYXJyYXksIGFycmF5ICsga1NpemUpOwotfQotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50KSB7Ci0gIGlmICh4bWxfZWxlbWVudCA9PSAidGVzdHN1aXRlcyIpIHsKLSAgICByZXR1cm4gQXJyYXlBc1ZlY3RvcihrUmVzZXJ2ZWRUZXN0U3VpdGVzQXR0cmlidXRlcyk7Ci0gIH0gZWxzZSBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RzdWl0ZSIpIHsKLSAgICByZXR1cm4gQXJyYXlBc1ZlY3RvcihrUmVzZXJ2ZWRUZXN0U3VpdGVBdHRyaWJ1dGVzKTsKLSAgfSBlbHNlIGlmICh4bWxfZWxlbWVudCA9PSAidGVzdGNhc2UiKSB7Ci0gICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdENhc2VBdHRyaWJ1dGVzKTsKLSAgfSBlbHNlIHsKLSAgICBHVEVTVF9DSEVDS18oZmFsc2UpIDw8ICJVbnJlY29nbml6ZWQgeG1sX2VsZW1lbnQgcHJvdmlkZWQ6ICIgPDwgeG1sX2VsZW1lbnQ7Ci0gIH0KLSAgLy8gVGhpcyBjb2RlIGlzIHVucmVhY2hhYmxlIGJ1dCBzb21lIGNvbXBpbGVycyBtYXkgbm90IHJlYWxpemVzIHRoYXQuCi0gIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFdvcmRMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgd29yZHMpIHsKLSAgTWVzc2FnZSB3b3JkX2xpc3Q7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZHMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoaSA+IDAgJiYgd29yZHMuc2l6ZSgpID4gMikgewotICAgICAgd29yZF9saXN0IDw8ICIsICI7Ci0gICAgfQotICAgIGlmIChpID09IHdvcmRzLnNpemUoKSAtIDEpIHsKLSAgICAgIHdvcmRfbGlzdCA8PCAiYW5kICI7Ci0gICAgfQotICAgIHdvcmRfbGlzdCA8PCAiJyIgPDwgd29yZHNbaV0gPDwgIiciOwotICB9Ci0gIHJldHVybiB3b3JkX2xpc3QuR2V0U3RyaW5nKCk7Ci19Ci0KLWJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZXNlcnZlZF9uYW1lcykgewotICBpZiAoc3RkOjpmaW5kKHJlc2VydmVkX25hbWVzLmJlZ2luKCksIHJlc2VydmVkX25hbWVzLmVuZCgpLCBwcm9wZXJ0eV9uYW1lKSAhPQotICAgICAgICAgIHJlc2VydmVkX25hbWVzLmVuZCgpKSB7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVzZXJ2ZWQga2V5IHVzZWQgaW4gUmVjb3JkUHJvcGVydHkoKTogIiA8PCBwcm9wZXJ0eV9uYW1lCi0gICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IEZvcm1hdFdvcmRMaXN0KHJlc2VydmVkX25hbWVzKQotICAgICAgICAgICAgICAgICAgPDwgIiBhcmUgcmVzZXJ2ZWQgYnkgIiA8PCBHVEVTVF9OQU1FXyA8PCAiKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIHRoZSBlbGVtZW50IG5hbWVkCi0vLyB4bWxfZWxlbWVudC4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCi1ib29sIFRlc3RSZXN1bHQ6OlZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7Ci0gIHJldHVybiBWYWxpZGF0ZVRlc3RQcm9wZXJ0eU5hbWUodGVzdF9wcm9wZXJ0eS5rZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KHhtbF9lbGVtZW50KSk7Ci19Ci0KLS8vIENsZWFycyB0aGUgb2JqZWN0Lgotdm9pZCBUZXN0UmVzdWx0OjpDbGVhcigpIHsKLSAgdGVzdF9wYXJ0X3Jlc3VsdHNfLmNsZWFyKCk7Ci0gIHRlc3RfcHJvcGVydGllc18uY2xlYXIoKTsKLSAgZGVhdGhfdGVzdF9jb3VudF8gPSAwOwotICBlbGFwc2VkX3RpbWVfID0gMDsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYWlsZWQuCi1ib29sIFRlc3RSZXN1bHQ6OkZhaWxlZCgpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF9wYXJ0X2NvdW50KCk7ICsraSkgewotICAgIGlmIChHZXRUZXN0UGFydFJlc3VsdChpKS5mYWlsZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhdGFsbHkgZmFpbGVkLgotc3RhdGljIGJvb2wgVGVzdFBhcnRGYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgcmV0dXJuIHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhdGFsbHkgZmFpbGVkLgotYm9vbCBUZXN0UmVzdWx0OjpIYXNGYXRhbEZhaWx1cmUoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnRGYXRhbGx5RmFpbGVkKSA+IDA7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuCi1zdGF0aWMgYm9vbCBUZXN0UGFydE5vbmZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICByZXR1cm4gcmVzdWx0Lm5vbmZhdGFsbHlfZmFpbGVkKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCi1ib29sIFRlc3RSZXN1bHQ6Okhhc05vbmZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydE5vbmZhdGFsbHlGYWlsZWQpID4gMDsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IHBhcnRzLiAgVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIKLS8vIG9mIHN1Y2Nlc3NmdWwgdGVzdCBwYXJ0cyBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBwYXJ0cy4KLWludCBUZXN0UmVzdWx0Ojp0b3RhbF9wYXJ0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3BhcnRfcmVzdWx0c18uc2l6ZSgpKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0ZXN0IHByb3BlcnRpZXMuCi1pbnQgVGVzdFJlc3VsdDo6dGVzdF9wcm9wZXJ0eV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wcm9wZXJ0aWVzXy5zaXplKCkpOwotfQotCi0vLyBjbGFzcyBUZXN0Ci0KLS8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KLQotLy8gVGhlIGMndG9yIHNhdmVzIHRoZSBzdGF0ZXMgb2YgYWxsIGZsYWdzLgotVGVzdDo6VGVzdCgpCi0gICAgOiBndGVzdF9mbGFnX3NhdmVyXyhuZXcgR1RFU1RfRkxBR19TQVZFUl8pIHsKLX0KLQotLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBzdGF0ZXMgb2YgYWxsIGZsYWdzLiAgVGhlIGFjdHVhbCB3b3JrIGlzCi0vLyBkb25lIGJ5IHRoZSBkJ3RvciBvZiB0aGUgZ3Rlc3RfZmxhZ19zYXZlcl8gZmllbGQsIGFuZCB0aHVzIG5vdAotLy8gdmlzaWJsZSBoZXJlLgotVGVzdDo6flRlc3QoKSB7Ci19Ci0KLS8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KLS8vCi0vLyBBIHN1Yi1jbGFzcyBtYXkgb3ZlcnJpZGUgdGhpcy4KLXZvaWQgVGVzdDo6U2V0VXAoKSB7Ci19Ci0KLS8vIFRlYXJzIGRvd24gdGhlIHRlc3QgZml4dHVyZS4KLS8vCi0vLyBBIHN1Yi1jbGFzcyBtYXkgb3ZlcnJpZGUgdGhpcy4KLXZvaWQgVGVzdDo6VGVhckRvd24oKSB7Ci19Ci0KLS8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgotdm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJlY29yZFByb3BlcnR5KGtleSwgdmFsdWUpOwotfQotCi0vLyBBbGxvd3MgdXNlciBzdXBwbGllZCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgcmVjb3JkZWQgZm9yIGxhdGVyIG91dHB1dC4KLXZvaWQgVGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKSB7Ci0gIE1lc3NhZ2UgdmFsdWVfbWVzc2FnZTsKLSAgdmFsdWVfbWVzc2FnZSA8PCB2YWx1ZTsKLSAgUmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7Ci0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBmcmllbmQgb2YgVW5pdFRlc3QgYW5kIGFzIHN1Y2ggaGFzIGFjY2VzcyB0bwotICAvLyBBZGRUZXN0UGFydFJlc3VsdC4KLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkFkZFRlc3RQYXJ0UmVzdWx0KAotICAgICAgcmVzdWx0X3R5cGUsCi0gICAgICBOVUxMLCAgLy8gTm8gaW5mbyBhYm91dCB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLSAgICAgIC0xLCAgICAvLyBXZSBoYXZlIG5vIGluZm8gb24gd2hpY2ggbGluZSBjYXVzZWQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgIG1lc3NhZ2UsCi0gICAgICAiIik7ICAgLy8gTm8gc3RhY2sgdHJhY2UsIGVpdGhlci4KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEdvb2dsZSBUZXN0IHJlcXVpcmVzIGFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgdG8gdXNlIHRoZSBzYW1lIHRlc3QKLS8vIGZpeHR1cmUgY2xhc3MuICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY3VycmVudCB0ZXN0IGhhcyB0aGUKLS8vIHNhbWUgZml4dHVyZSBjbGFzcyBhcyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuICBJZgotLy8geWVzLCBpdCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBpdCBnZW5lcmF0ZXMgYSBHb29nbGUgVGVzdCBmYWlsdXJlIGFuZAotLy8gcmV0dXJucyBmYWxzZS4KLWJvb2wgVGVzdDo6SGFzU2FtZUZpeHR1cmVDbGFzcygpIHsKLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKLSAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IGltcGwtPmN1cnJlbnRfdGVzdF9jYXNlKCk7Ci0KLSAgLy8gSW5mbyBhYm91dCB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCi0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBmaXJzdF90ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbMF07Ci0gIGNvbnN0IGludGVybmFsOjpUeXBlSWQgZmlyc3RfZml4dHVyZV9pZCA9IGZpcnN0X3Rlc3RfaW5mby0+Zml4dHVyZV9jbGFzc19pZF87Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGZpcnN0X3Rlc3RfbmFtZSA9IGZpcnN0X3Rlc3RfaW5mby0+bmFtZSgpOwotCi0gIC8vIEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgdGVzdC4KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRoaXNfdGVzdF9pbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCB0aGlzX2ZpeHR1cmVfaWQgPSB0aGlzX3Rlc3RfaW5mby0+Zml4dHVyZV9jbGFzc19pZF87Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHRoaXNfdGVzdF9uYW1lID0gdGhpc190ZXN0X2luZm8tPm5hbWUoKTsKLQotICBpZiAodGhpc19maXh0dXJlX2lkICE9IGZpcnN0X2ZpeHR1cmVfaWQpIHsKLSAgICAvLyBJcyB0aGUgZmlyc3QgdGVzdCBkZWZpbmVkIHVzaW5nIFRFU1Q/Ci0gICAgY29uc3QgYm9vbCBmaXJzdF9pc19URVNUID0gZmlyc3RfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOwotICAgIC8vIElzIHRoaXMgdGVzdCBkZWZpbmVkIHVzaW5nIFRFU1Q/Ci0gICAgY29uc3QgYm9vbCB0aGlzX2lzX1RFU1QgPSB0aGlzX2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKLQotICAgIGlmIChmaXJzdF9pc19URVNUIHx8IHRoaXNfaXNfVEVTVCkgewotICAgICAgLy8gQm90aCBURVNUIGFuZCBURVNUX0YgYXBwZWFyIGluIHNhbWUgdGVzdCBjYXNlLCB3aGljaCBpcyBpbmNvcnJlY3QuCi0gICAgICAvLyBUZWxsIHRoZSB1c2VyIGhvdyB0byBmaXggdGhpcy4KLQotICAgICAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVEVTVCBhbmQgdGhlIG5hbWUgb2YgdGhlIFRFU1RfRi4gIE5vdGUKLSAgICAgIC8vIHRoYXQgZmlyc3RfaXNfVEVTVCBhbmQgdGhpc19pc19URVNUIGNhbm5vdCBib3RoIGJlIHRydWUsIGFzCi0gICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4KLSAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfbmFtZSA9Ci0gICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IGZpcnN0X3Rlc3RfbmFtZSA6IHRoaXNfdGVzdF9uYW1lOwotICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQotICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyB0aGlzX3Rlc3RfbmFtZSA6IGZpcnN0X3Rlc3RfbmFtZTsKLQotICAgICAgQUREX0ZBSUxVUkUoKQotICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgotICAgICAgICAgIDw8ICJjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXNcbiIKLSAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpCi0gICAgICAgICAgPDwgIixcbiIKLSAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfRl9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0XG4iCi0gICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiIKLSAgICAgICAgICA8PCAid2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0XG4iCi0gICAgICAgICAgPDwgImNhc2UuIjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVHdvIGZpeHR1cmUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXBwZWFyIGluIHR3byBkaWZmZXJlbnQKLSAgICAgIC8vIG5hbWVzcGFjZXMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBUZWxsIHRoZSB1c2VyIGhvdyB0byBmaXggdGhpcy4KLSAgICAgIEFERF9GQUlMVVJFKCkKLSAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKLSAgICAgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIgotICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iCi0gICAgICAgICAgPDwgInlvdSBkZWZpbmVkIHRlc3QgIiA8PCBmaXJzdF90ZXN0X25hbWUKLSAgICAgICAgICA8PCAiIGFuZCB0ZXN0ICIgPDwgdGhpc190ZXN0X25hbWUgPDwgIlxuIgotICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iCi0gICAgICAgICAgPDwgInRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvblxuIgotICAgICAgICAgIDw8ICJ1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lXG4iCi0gICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIEdURVNUX0hBU19TRUgKLQotLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LiAgVGhpcwotLy8gZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0IHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIHBvaW50ZXIgYmVjYXVzZSBWQysrCi0vLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucwotLy8gdXNpbmcgX190cnkgKHNlZSBlcnJvciBDMjcxMikuCi1zdGF0aWMgc3RkOjpzdHJpbmcqIEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoRFdPUkQgZXhjZXB0aW9uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKLSAgTWVzc2FnZSBtZXNzYWdlOwotICBtZXNzYWdlIDw8ICJTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweCIgPDwgc3RkOjpzZXRiYXNlKDE2KSA8PAotICAgIGV4Y2VwdGlvbl9jb2RlIDw8IHN0ZDo6c2V0YmFzZSgxMCkgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7Ci0KLSAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhtZXNzYWdlLkdldFN0cmluZygpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7Ci0gIE1lc3NhZ2UgbWVzc2FnZTsKLSAgaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwpIHsKLSAgICBtZXNzYWdlIDw8ICJDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gXCIiIDw8IGRlc2NyaXB0aW9uIDw8ICJcIiI7Ci0gIH0gZWxzZSB7Ci0gICAgbWVzc2FnZSA8PCAiVW5rbm93biBDKysgZXhjZXB0aW9uIjsKLSAgfQotICBtZXNzYWdlIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOwotCi0gIHJldHVybiBtZXNzYWdlLkdldFN0cmluZygpOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKLQotR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb246Okdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKQotICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gV2UgcHV0IHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSBhcyBJQk0ncyB4bEMKLS8vIGNvbXBpbGVyIHJlamVjdHMgdGhlIGNvZGUgaWYgdGhleSB3ZXJlIGRlY2xhcmVkIHN0YXRpYy4KLQotLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBoYW5kbGVzIFNFSCBleGNlcHRpb25zIGl0IHRocm93cywgd2hlbgotLy8gU0VIIGlzIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZSBSZXN1bHQgaW4gY2FzZSBvZiBhbgotLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysKLS8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGVyZWZvcmUsIHdlIHByb3ZpZGUgYSBzZXBhcmF0ZQotLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgU0VIIGV4Y2VwdGlvbnMuKQotdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KLVJlc3VsdCBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKLSNpZiBHVEVTVF9IQVNfU0VICi0gIF9fdHJ5IHsKLSAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKLSAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UCi0gICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7Ci0gICAgLy8gV2UgY3JlYXRlIHRoZSBleGNlcHRpb24gbWVzc2FnZSBvbiB0aGUgaGVhcCBiZWNhdXNlIFZDKysgcHJvaGliaXRzCi0gICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQotICAgIC8vIChzZWUgZXJyb3IgQzI3MTIpLgotICAgIHN0ZDo6c3RyaW5nKiBleGNlcHRpb25fbWVzc2FnZSA9IEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoCi0gICAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSwgbG9jYXRpb24pOwotICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uX21lc3NhZ2UpOwotICAgIGRlbGV0ZSBleGNlcHRpb25fbWVzc2FnZTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsKLSAgfQotI2Vsc2UKLSAgKHZvaWQpbG9jYXRpb247Ci0gIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi19Ci0KLS8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgY2F0Y2hlcyBhbmQgcmVwb3J0cyBDKysgYW5kL29yIFNFSC1zdHlsZQotLy8gZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlCi0vLyBSZXN1bHQgaW4gY2FzZSBvZiBhbiBTRUggZXhjZXB0aW9uLgotdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KLVJlc3VsdCBIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKLSAgLy8gTk9URTogVGhlIHVzZXIgY29kZSBjYW4gYWZmZWN0IHRoZSB3YXkgaW4gd2hpY2ggR29vZ2xlIFRlc3QgaGFuZGxlcwotICAvLyBleGNlcHRpb25zIGJ5IHNldHRpbmcgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSwgYnV0IG9ubHkgYmVmb3JlCi0gIC8vIFJVTl9BTExfVEVTVFMoKSBzdGFydHMuIEl0IGlzIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBmbGFnCi0gIC8vIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGFuZCBlaXRoZXIgcmVwb3J0IG9yIHJlLXRocm93IHRoZQotICAvLyBleGNlcHRpb24gYmFzZWQgb24gdGhlIGZsYWcncyB2YWx1ZToKLSAgLy8KLSAgLy8gdHJ5IHsKLSAgLy8gICAvLyBQZXJmb3JtIHRoZSB0ZXN0IG1ldGhvZC4KLSAgLy8gfSBjYXRjaCAoLi4uKSB7Ci0gIC8vICAgaWYgKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCi0gIC8vICAgICAvLyBSZXBvcnQgdGhlIGV4Y2VwdGlvbiBhcyBmYWlsdXJlLgotICAvLyAgIGVsc2UKLSAgLy8gICAgIHRocm93OyAgLy8gUmUtdGhyb3dzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uCi0gIC8vIH0KLSAgLy8KLSAgLy8gSG93ZXZlciwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmbGFnIGlzIHRvIGFsbG93IHRoZSBwcm9ncmFtIHRvIGRyb3AgaW50bwotICAvLyB0aGUgZGVidWdnZXIgd2hlbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gT24gbW9zdCBwbGF0Zm9ybXMsIG9uY2UgdGhlCi0gIC8vIGNvbnRyb2wgZW50ZXJzIHRoZSBjYXRjaCBibG9jaywgdGhlIGV4Y2VwdGlvbiBvcmlnaW4gaW5mb3JtYXRpb24gaXMKLSAgLy8gbG9zdCBhbmQgdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCB0aGUgcHJvZ3JhbSBhdCB0aGUgcG9pbnQgb2YgdGhlCi0gIC8vIHJlLXRocm93IGluIHRoaXMgZnVuY3Rpb24gLS0gaW5zdGVhZCBvZiBhdCB0aGUgcG9pbnQgb2YgdGhlIG9yaWdpbmFsCi0gIC8vIHRocm93IHN0YXRlbWVudCBpbiB0aGUgY29kZSB1bmRlciB0ZXN0LiAgRm9yIHRoaXMgcmVhc29uLCB3ZSBwZXJmb3JtCi0gIC8vIHRoZSBjaGVjayBlYXJseSwgc2FjcmlmaWNpbmcgdGhlIGFiaWxpdHkgdG8gYWZmZWN0IEdvb2dsZSBUZXN0J3MKLSAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGluIHRoZSBtZXRob2Qgd2hlcmUgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gIGlmIChpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSkgewotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOwotICAgIH0gY2F0Y2ggKGNvbnN0IGludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiYpIHsgIC8vIE5PTElOVAotICAgICAgLy8gVGhpcyBleGNlcHRpb24gdHlwZSBjYW4gb25seSBiZSB0aHJvd24gYnkgYSBmYWlsZWQgR29vZ2xlCi0gICAgICAvLyBUZXN0IGFzc2VydGlvbiB3aXRoIHRoZSBpbnRlbnRpb24gb2YgbGV0dGluZyBhbm90aGVyIHRlc3RpbmcKLSAgICAgIC8vIGZyYW1ld29yayBjYXRjaCBpdC4gIFRoZXJlZm9yZSB3ZSBqdXN0IHJlLXRocm93IGl0LgotICAgICAgdGhyb3c7Ci0gICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsgIC8vIE5PTElOVAotICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKLSAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKLSAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGUud2hhdCgpLCBsb2NhdGlvbikpOwotICAgIH0gY2F0Y2ggKC4uLikgeyAgLy8gTk9MSU5UCi0gICAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAotICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAotICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoTlVMTCwgbG9jYXRpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oMCk7Ci0jZWxzZQotICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICB9IGVsc2UgewotICAgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBSdW5zIHRoZSB0ZXN0IGFuZCB1cGRhdGVzIHRoZSB0ZXN0IHJlc3VsdC4KLXZvaWQgVGVzdDo6UnVuKCkgewotICBpZiAoIUhhc1NhbWVGaXh0dXJlQ2xhc3MoKSkgcmV0dXJuOwotCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCh0aGlzLCAmVGVzdDo6U2V0VXAsICJTZXRVcCgpIik7Ci0gIC8vIFdlIHdpbGwgcnVuIHRoZSB0ZXN0IG9ubHkgaWYgU2V0VXAoKSB3YXMgc3VjY2Vzc2Z1bC4KLSAgaWYgKCFIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gICAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgICB0aGlzLCAmVGVzdDo6VGVzdEJvZHksICJ0aGUgdGVzdCBib2R5Iik7Ci0gIH0KLQotICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUuICBIZW5jZSB3ZSB3aWxsCi0gIC8vIGFsd2F5cyBjYWxsIFRlYXJEb3duKCksIGV2ZW4gaWYgU2V0VXAoKSBvciB0aGUgdGVzdCBib2R5IGhhcwotICAvLyBmYWlsZWQuCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIHRoaXMsICZUZXN0OjpUZWFyRG93biwgIlRlYXJEb3duKCkiKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIGZhdGFsIGZhaWx1cmUuCi1ib29sIFRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5IYXNGYXRhbEZhaWx1cmUoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgotYm9vbCBUZXN0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+Ci0gICAgICBIYXNOb25mYXRhbEZhaWx1cmUoKTsKLX0KLQotLy8gY2xhc3MgVGVzdEluZm8KLQotLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gSXQgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHRlc3QgZmFjdG9yeQotLy8gb2JqZWN0LgotVGVzdEluZm86OlRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3Rlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkNvZGVMb2NhdGlvbiBhX2NvZGVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpCi0gICAgOiB0ZXN0X2Nhc2VfbmFtZV8oYV90ZXN0X2Nhc2VfbmFtZSksCi0gICAgICBuYW1lXyhhX25hbWUpLAotICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKLSAgICAgIHZhbHVlX3BhcmFtXyhhX3ZhbHVlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdmFsdWVfcGFyYW0pIDogTlVMTCksCi0gICAgICBsb2NhdGlvbl8oYV9jb2RlX2xvY2F0aW9uKSwKLSAgICAgIGZpeHR1cmVfY2xhc3NfaWRfKGZpeHR1cmVfY2xhc3NfaWQpLAotICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAotICAgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwKLSAgICAgIG1hdGNoZXNfZmlsdGVyXyhmYWxzZSksCi0gICAgICBmYWN0b3J5XyhmYWN0b3J5KSwKLSAgICAgIHJlc3VsdF8oKSB7fQotCi0vLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuCi1UZXN0SW5mbzo6flRlc3RJbmZvKCkgeyBkZWxldGUgZmFjdG9yeV87IH0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OwotLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCi0vLwotLy8gQXJndW1lbnRzOgotLy8KLS8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0vLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKLS8vICAgdHlwZV9wYXJhbTogICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgotLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0vLyAgIHZhbHVlX3BhcmFtOiAgICAgIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QncyB2YWx1ZSBwYXJhbWV0ZXIsCi0vLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0vLyAgIGNvZGVfbG9jYXRpb246ICAgIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRlc3QgaXMgZGVmaW5lZAotLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCi0vLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0vLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0vLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCi0vLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCi1UZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCi0gICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgY29uc3QgY2hhciogbmFtZSwKLSAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAotICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAotICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAotICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCi0gICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSB7Ci0gIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICBjb2RlX2xvY2F0aW9uLCBmaXh0dXJlX2NsYXNzX2lkLCBmYWN0b3J5KTsKLSAgR2V0VW5pdFRlc3RJbXBsKCktPkFkZFRlc3RJbmZvKHNldF91cF90YywgdGVhcl9kb3duX3RjLCB0ZXN0X2luZm8pOwotICByZXR1cm4gdGVzdF9pbmZvOwotfQotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLXZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbikgewotICBNZXNzYWdlIGVycm9yczsKLSAgZXJyb3JzCi0gICAgICA8PCAiQXR0ZW1wdGVkIHJlZGVmaW5pdGlvbiBvZiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLlxuIgotICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCi0gICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLCB5b3UgdHJpZWRcbiIKLSAgICAgIDw8ICJ0byBkZWZpbmUgYSB0ZXN0IHVzaW5nIGEgZml4dHVyZSBjbGFzcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lXG4iCi0gICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iCi0gICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBZb3Ugc2hvdWxkXG4iCi0gICAgICA8PCAicHJvYmFibHkgcmVuYW1lIG9uZSBvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50XG4iCi0gICAgICA8PCAidGVzdCBjYXNlcy4iOwotCi0gIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIlcyAlcyIsCi0gICAgICAgICAgRm9ybWF0RmlsZUxvY2F0aW9uKGNvZGVfbG9jYXRpb24uZmlsZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2xvY2F0aW9uLmxpbmUpLmNfc3RyKCksCi0gICAgICAgICAgZXJyb3JzLkdldFN0cmluZygpLmNfc3RyKCkpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotbmFtZXNwYWNlIHsKLQotLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIHRlc3QgbmFtZSBvZiBhIFRlc3RJbmZvIGFnYWluc3QgYSBrbm93bgotLy8gdmFsdWUuCi0vLwotLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVzdENhc2UgY2xhc3Mgb25seS4gIFdlIHB1dAotLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCi0vLyBuYW1lc3BhY2UuCi0vLwotLy8gVGVzdE5hbWVJcyBpcyBjb3B5YWJsZS4KLWNsYXNzIFRlc3ROYW1lSXMgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIC8vCi0gIC8vIFRlc3ROYW1lSXMgaGFzIE5PIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIGV4cGxpY2l0IFRlc3ROYW1lSXMoY29uc3QgY2hhciogbmFtZSkKLSAgICAgIDogbmFtZV8obmFtZSkge30KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdF9pbmZvIG1hdGNoZXMgbmFtZV8uCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0SW5mbyAqIHRlc3RfaW5mbykgY29uc3QgewotICAgIHJldHVybiB0ZXN0X2luZm8gJiYgdGVzdF9pbmZvLT5uYW1lKCkgPT0gbmFtZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1AKLS8vIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBpbnRvIHJlZ3VsYXIgdGVzdHMgYW5kIHJlZ2lzdGVycyB0aG9zZS4KLS8vIFRoaXMgd2lsbCBiZSBkb25lIGp1c3Qgb25jZSBkdXJpbmcgdGhlIHByb2dyYW0gcnVudGltZS4KLXZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsKLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICBpZiAoIXBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8pIHsKLSAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsKLSAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgfQotI2VuZGlmCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgotLy8gZGVsZXRlcyBpdC4KLXZvaWQgVGVzdEluZm86OlJ1bigpIHsKLSAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOwotCi0gIC8vIFRlbGxzIFVuaXRUZXN0IHdoZXJlIHRvIHN0b3JlIHRlc3QgcmVzdWx0LgotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7Ci0KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7Ci0KLSAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQuCi0gIHJlcGVhdGVyLT5PblRlc3RTdGFydCgqdGhpcyk7Ci0KLSAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOwotCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0KLSAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCi0gIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgICBmYWN0b3J5XywgJmludGVybmFsOjpUZXN0RmFjdG9yeUJhc2U6OkNyZWF0ZVRlc3QsCi0gICAgICAidGhlIHRlc3QgZml4dHVyZSdzIGNvbnN0cnVjdG9yIik7Ci0KLSAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSB0ZXN0IG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaXRzCi0gIC8vIGNvbnN0cnVjdG9yIGRpZG4ndCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCi0gIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAvLyBUaGlzIGRvZXNuJ3QgdGhyb3cgYXMgYWxsIHVzZXIgY29kZSB0aGF0IGNhbiB0aHJvdyBhcmUgd3JhcHBlZCBpbnRvCi0gICAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUuCi0gICAgdGVzdC0+UnVuKCk7Ci0gIH0KLQotICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4KLSAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKLSAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsKLQotICByZXN1bHRfLnNldF9lbGFwc2VkX3RpbWUoaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOwotCi0gIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCi0gIHJlcGVhdGVyLT5PblRlc3RFbmQoKnRoaXMpOwotCi0gIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcwotICAvLyB0ZXN0LgotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Ci19Ci0KLS8vIGNsYXNzIFRlc3RDYXNlCi0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotaW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFBhc3NlZCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi1pbnQgVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotaW50IFRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFJlcG9ydGFibGVEaXNhYmxlZCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLWludCBUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0RGlzYWJsZWQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBUZXN0Q2FzZTo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RSZXBvcnRhYmxlKTsKLX0KLQotLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgotaW50IFRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBTaG91bGRSdW5UZXN0KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLWludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9pbmZvX2xpc3RfLnNpemUoKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotLy8KLS8vIEFyZ3VtZW50czoKLS8vCi0vLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0vLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCi0vLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCi0vLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLS8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQotVGVzdENhc2U6OlRlc3RDYXNlKGNvbnN0IGNoYXIqIGFfbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAotICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpCi0gICAgOiBuYW1lXyhhX25hbWUpLAotICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKLSAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwKLSAgICAgIHRlYXJfZG93bl90Y18odGVhcl9kb3duX3RjKSwKLSAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKLSAgICAgIGVsYXBzZWRfdGltZV8oMCkgewotfQotCi0vLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgotVGVzdENhc2U6On5UZXN0Q2FzZSgpIHsKLSAgLy8gRGVsZXRlcyBldmVyeSBUZXN0IGluIHRoZSBjb2xsZWN0aW9uLgotICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOwotfQotCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0vLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi1jb25zdCBUZXN0SW5mbyogVGVzdENhc2U6OkdldFRlc3RJbmZvKGludCBpKSBjb25zdCB7Ci0gIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7Ci0gIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKLX0KLQotLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsKLSAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKLSAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOwotfQotCi0vLyBBZGRzIGEgdGVzdCB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSB0ZXN0IHVwb24KLS8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCi12b2lkIFRlc3RDYXNlOjpBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbykgewotICB0ZXN0X2luZm9fbGlzdF8ucHVzaF9iYWNrKHRlc3RfaW5mbyk7Ci0gIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsKLX0KLQotLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCi12b2lkIFRlc3RDYXNlOjpSdW4oKSB7Ci0gIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKLQotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UodGhpcyk7Ci0KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7Ci0KLSAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7Ci0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOwotCi0gIGNvbnN0IGludGVybmFsOjpUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsKLSAgICBHZXRNdXRhYmxlVGVzdEluZm8oaSktPlJ1bigpOwotICB9Ci0gIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKLQotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blRlYXJEb3duVGVzdENhc2UsICJUZWFyRG93blRlc3RDYXNlKCkiKTsKLQotICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7Ci0gIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKLX0KLQotLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLXZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgewotICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7Ci0gIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBUZXN0SW5mbzo6Q2xlYXJUZXN0UmVzdWx0KTsKLX0KLQotLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotdm9pZCBUZXN0Q2FzZTo6U2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSkgewotICBTaHVmZmxlKHJhbmRvbSwgJnRlc3RfaW5kaWNlc18pOwotfQotCi0vLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCi12b2lkIFRlc3RDYXNlOjpVbnNodWZmbGVUZXN0cygpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2luZGljZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgdGVzdF9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7Ci0gIH0KLX0KLQotLy8gRm9ybWF0cyBhIGNvdW50YWJsZSBub3VuLiAgRGVwZW5kaW5nIG9uIGl0cyBxdWFudGl0eSwgZWl0aGVyIHRoZQotLy8gc2luZ3VsYXIgZm9ybSBvciB0aGUgcGx1cmFsIGZvcm0gaXMgdXNlZC4gZS5nLgotLy8KLS8vIEZvcm1hdENvdW50YWJsZU5vdW4oMSwgImZvcm11bGEiLCAiZm9ybXVsaSIpIHJldHVybnMgIjEgZm9ybXVsYSIuCi0vLyBGb3JtYXRDb3VudGFibGVOb3VuKDUsICJib29rIiwgImJvb2tzIikgcmV0dXJucyAiNSBib29rcyIuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc2luZ3VsYXJfZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBwbHVyYWxfZm9ybSkgewotICByZXR1cm4gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhjb3VudCkgKyAiICIgKwotICAgICAgKGNvdW50ID09IDEgPyBzaW5ndWxhcl9mb3JtIDogcGx1cmFsX2Zvcm0pOwotfQotCi0vLyBGb3JtYXRzIHRoZSBjb3VudCBvZiB0ZXN0cy4KLXN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKLSAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKLX0KLQotLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KLXN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q2FzZUNvdW50KGludCB0ZXN0X2Nhc2VfY291bnQpIHsKLSAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlX2NvdW50LCAidGVzdCBjYXNlIiwgInRlc3QgY2FzZXMiKTsKLX0KLQotLy8gQ29udmVydHMgYSBUZXN0UGFydFJlc3VsdDo6VHlwZSBlbnVtIHRvIGh1bWFuLWZyaWVuZGx5IHN0cmluZwotLy8gcmVwcmVzZW50YXRpb24uICBCb3RoIGtOb25GYXRhbEZhaWx1cmUgYW5kIGtGYXRhbEZhaWx1cmUgYXJlIHRyYW5zbGF0ZWQKLS8vIHRvICJGYWlsdXJlIiwgYXMgdGhlIHVzZXIgdXN1YWxseSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UKLS8vIGJldHdlZW4gdGhlIHR3byB3aGVuIHZpZXdpbmcgdGhlIHRlc3QgcmVzdWx0Lgotc3RhdGljIGNvbnN0IGNoYXIgKiBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyhUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzOgotICAgICAgcmV0dXJuICJTdWNjZXNzIjsKLQotICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmU6Ci0gICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZToKLSNpZmRlZiBfTVNDX1ZFUgotICAgICAgcmV0dXJuICJlcnJvcjogIjsKLSNlbHNlCi0gICAgICByZXR1cm4gIkZhaWx1cmVcbiI7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIHJlc3VsdCB0eXBlIjsKLSAgfQotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCB0byBhbiBzdGQ6OnN0cmluZy4KLXN0YXRpYyBzdGQ6OnN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKLSAgcmV0dXJuIChNZXNzYWdlKCkKLSAgICAgICAgICA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpCi0gICAgICAgICAgPDwgIiAiIDw8IFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQudHlwZSgpKQotICAgICAgICAgIDw8IHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKS5HZXRTdHJpbmcoKTsKLX0KLQotLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQuCi1zdGF0aWMgdm9pZCBQcmludFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXN1bHQgPQotICAgICAgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOwotICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiJXNcbiIsIHJlc3VsdC5jX3N0cigpKTsKLSAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwotICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKLSAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAotICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKLSAgLy8gY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBsb2NhdGlvbjsgb3RoZXJ3aXNlIHRoZXkgZG8gbm90aGluZy4KLSNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICAvLyBXZSBkb24ndCBjYWxsIE91dHB1dERlYnVnU3RyaW5nKigpIG9uIFdpbmRvd3MgTW9iaWxlLCBhcyBwcmludGluZwotICAvLyB0byBzdGRvdXQgaXMgZG9uZSBieSBPdXRwdXREZWJ1Z1N0cmluZygpIHRoZXJlIGFscmVhZHkgLSB3ZSBkb24ndAotICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4KLSAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EocmVzdWx0LmNfc3RyKCkpOwotICA6Ok91dHB1dERlYnVnU3RyaW5nQSgiXG4iKTsKLSNlbmRpZgotfQotCi0vLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKLQotZW51bSBHVGVzdENvbG9yIHsKLSAgQ09MT1JfREVGQVVMVCwKLSAgQ09MT1JfUkVELAotICBDT0xPUl9HUkVFTiwKLSAgQ09MT1JfWUVMTE9XCi19OwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgXAotICAgICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCi0KLS8vIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBjb2xvci4KLVdPUkQgR2V0Q29sb3JBdHRyaWJ1dGUoR1Rlc3RDb2xvciBjb2xvcikgewotICBzd2l0Y2ggKGNvbG9yKSB7Ci0gICAgY2FzZSBDT0xPUl9SRUQ6ICAgIHJldHVybiBGT1JFR1JPVU5EX1JFRDsKLSAgICBjYXNlIENPTE9SX0dSRUVOOiAgcmV0dXJuIEZPUkVHUk9VTkRfR1JFRU47Ci0gICAgY2FzZSBDT0xPUl9ZRUxMT1c6IHJldHVybiBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU47Ci0gICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNlbHNlCi0KLS8vIFJldHVybnMgdGhlIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIGNvbG9yLiAgQ09MT1JfREVGQVVMVCBpcwotLy8gYW4gaW52YWxpZCBpbnB1dC4KLWNvbnN0IGNoYXIqIEdldEFuc2lDb2xvckNvZGUoR1Rlc3RDb2xvciBjb2xvcikgewotICBzd2l0Y2ggKGNvbG9yKSB7Ci0gICAgY2FzZSBDT0xPUl9SRUQ6ICAgICByZXR1cm4gIjEiOwotICAgIGNhc2UgQ09MT1JfR1JFRU46ICAgcmV0dXJuICIyIjsKLSAgICBjYXNlIENPTE9SX1lFTExPVzogIHJldHVybiAiMyI7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgfTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCi1ib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSkgewotICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9jb2xvciA9IEdURVNUX0ZMQUcoY29sb3IpLmNfc3RyKCk7Ci0KLSAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgImF1dG8iKSkgewotI2lmIEdURVNUX09TX1dJTkRPV1MgfHwgR1RFU1RfT1NfU1RBUkJPQVJECi0gICAgLy8gT24gV2luZG93cyB0aGUgVEVSTSB2YXJpYWJsZSBpcyB1c3VhbGx5IG5vdCBzZXQsIGJ1dCB0aGUKLSAgICAvLyBjb25zb2xlIHRoZXJlIGRvZXMgc3VwcG9ydCBjb2xvcnMuCi0gICAgcmV0dXJuIHN0ZG91dF9pc190dHk7Ci0jZWxzZQotICAgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcywgd2UgcmVseSBvbiB0aGUgVEVSTSB2YXJpYWJsZS4KLSAgICBjb25zdCBjaGFyKiBjb25zdCB0ZXJtID0gcG9zaXg6OkdldEVudigiVEVSTSIpOwotICAgIGNvbnN0IGJvb2wgdGVybV9zdXBwb3J0c19jb2xvciA9Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0iKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLWNvbG9yIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS0yNTZjb2xvciIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAic2NyZWVuIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4tMjU2Y29sb3IiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInJ4dnQtdW5pY29kZSIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAicnh2dC11bmljb2RlLTI1NmNvbG9yIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJsaW51eCIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAiY3lnd2luIik7Ci0gICAgcmV0dXJuIHN0ZG91dF9pc190dHkgJiYgdGVybV9zdXBwb3J0c19jb2xvcjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICB9Ci0KLSAgcmV0dXJuIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInllcyIpIHx8Ci0gICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0cnVlIikgfHwKLSAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInQiKSB8fAotICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiMSIpOwotICAvLyBXZSB0YWtlICJ5ZXMiLCAidHJ1ZSIsICJ0IiwgYW5kICIxIiBhcyBtZWFuaW5nICJ5ZXMiLiAgSWYgdGhlCi0gIC8vIHZhbHVlIGlzIG5laXRoZXIgb25lIG9mIHRoZXNlIG5vciAiYXV0byIsIHdlIHRyZWF0IGl0IGFzICJubyIgdG8KLSAgLy8gYmUgY29uc2VydmF0aXZlLgotfQotCi0vLyBIZWxwZXJzIGZvciBwcmludGluZyBjb2xvcmVkIHN0cmluZ3MgdG8gc3Rkb3V0LiBOb3RlIHRoYXQgb24gV2luZG93cywgd2UKLS8vIGNhbm5vdCBzaW1wbHkgZW1pdCBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGhhdmUgdGhlIHRlcm1pbmFsIGNoYW5nZSBjb2xvcnMuCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBhY3R1YWxseSBlbWl0IHRoZSBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuIHJldHVybiBhIHN0cmluZwotLy8gdGhhdCB3b3VsZCBiZSBjb2xvcmVkIHdoZW4gcHJpbnRlZCwgYXMgY2FuIGJlIGRvbmUgb24gTGludXguCi12b2lkIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvciBjb2xvciwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MgfHwgXAotICAgIEdURVNUX09TX0lPUyB8fCBHVEVTVF9PU19XSU5ET1dTX1BIT05FIHx8IEdURVNUX09TX1dJTkRPV1NfUlQKLSAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBBbHdheXNGYWxzZSgpOwotI2Vsc2UKLSNpZiBHVEVTVF9PU19TVEFSQk9BUkQKLSAgc3RhdGljIGNvbnN0IGJvb2wgaW5fY29sb3JfbW9kZSA9IFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkoMCkgIT0gMCk7Ci0jZWxzZQotICBzdGF0aWMgY29uc3QgYm9vbCBpbl9jb2xvcl9tb2RlID0KLSAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsKLSNlbmRpZgotICBjb25zdCBib29sIHVzZV9jb2xvciA9IGluX2NvbG9yX21vZGUgJiYgKGNvbG9yICE9IENPTE9SX0RFRkFVTFQpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUwotICAvLyBUaGUgJyE9IDAnIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgTVNWQyA3LjEuCi0KLSAgaWYgKCF1c2VfY29sb3IpIHsKLSAgICBwb3NpeDo6VlByaW50RihmbXQsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmIFwKLSAgICAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAotICBjb25zdCBIQU5ETEUgc3Rkb3V0X2hhbmRsZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCB0ZXh0IGNvbG9yLgotICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBidWZmZXJfaW5mbzsKLSAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsKLSAgY29uc3QgV09SRCBvbGRfY29sb3JfYXR0cnMgPSBidWZmZXJfaW5mby53QXR0cmlidXRlczsKLQotICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCi0gIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5Ci0gIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCi0gIHBvc2l4OjpGbHVzaCgpOwotICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb2xvckF0dHJpYnV0ZShjb2xvcikgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSk7Ci0gIHBvc2l4OjpWUHJpbnRGKGZtdCwgYXJncyk7Ci0KLSAgcG9zaXg6OkZsdXNoKCk7Ci0gIC8vIFJlc3RvcmVzIHRoZSB0ZXh0IGNvbG9yLgotICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLCBvbGRfY29sb3JfYXR0cnMpOwotI2Vsc2UKLSAgcG9zaXg6OlByaW50RigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7Ci0gIHBvc2l4OjpWUHJpbnRGKGZtdCwgYXJncyk7Ci0gIHBvc2l4OjpQcmludEYoIlwwMzNbbSIpOyAgLy8gUmVzZXRzIHRoZSB0ZXJtaW5hbCB0byBkZWZhdWx0LgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICB2YV9lbmQoYXJncyk7Ci19Ci0KLS8vIFRleHQgcHJpbnRlZCBpbiBHb29nbGUgVGVzdCdzIHRleHQgb3V0cHV0IGFuZCAtLWd1bml0X2xpc3RfdGVzdHMKLS8vIG91dHB1dCB0byBsYWJlbCB0aGUgdHlwZSBwYXJhbWV0ZXIgYW5kIHZhbHVlIHBhcmFtZXRlciBmb3IgYSB0ZXN0Lgotc3RhdGljIGNvbnN0IGNoYXIga1R5cGVQYXJhbUxhYmVsW10gPSAiVHlwZVBhcmFtIjsKLXN0YXRpYyBjb25zdCBjaGFyIGtWYWx1ZVBhcmFtTGFiZWxbXSA9ICJHZXRQYXJhbSgpIjsKLQotdm9pZCBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOwotICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOwotCi0gIGlmICh0eXBlX3BhcmFtICE9IE5VTEwgfHwgdmFsdWVfcGFyYW0gIT0gTlVMTCkgewotICAgIHBvc2l4OjpQcmludEYoIiwgd2hlcmUgIik7Ci0gICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCkgewotICAgICAgcG9zaXg6OlByaW50RigiJXMgPSAlcyIsIGtUeXBlUGFyYW1MYWJlbCwgdHlwZV9wYXJhbSk7Ci0gICAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkKLSAgICAgICAgcG9zaXg6OlByaW50RigiIGFuZCAiKTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKLSAgICAgIHBvc2l4OjpQcmludEYoIiVzID0gJXMiLCBrVmFsdWVQYXJhbUxhYmVsLCB2YWx1ZV9wYXJhbSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLgotLy8KLS8vIENsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciBpcyBjb3B5YWJsZS4KLWNsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIoKSB7fQotICBzdGF0aWMgdm9pZCBQcmludFRlc3ROYW1lKGNvbnN0IGNoYXIgKiB0ZXN0X2Nhc2UsIGNvbnN0IGNoYXIgKiB0ZXN0KSB7Ci0gICAgcG9zaXg6OlByaW50RigiJXMuJXMiLCB0ZXN0X2Nhc2UsIHRlc3QpOwotICB9Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIG92ZXJyaWRlIHdoYXQncyBpbiB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgY2xhc3MuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOwotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgdm9pZCBQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotfTsKLQotICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KAotICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pIHsKLSAgaWYgKEdURVNUX0ZMQUcocmVwZWF0KSAhPSAxKQotICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb24gKyAxKTsKLQotICBjb25zdCBjaGFyKiBjb25zdCBmaWx0ZXIgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKLQotICAvLyBQcmludHMgdGhlIGZpbHRlciBpZiBpdCdzIG5vdCAqLiAgVGhpcyByZW1pbmRzIHRoZSB1c2VyIHRoYXQgc29tZQotICAvLyB0ZXN0cyBtYXkgYmUgc2tpcHBlZC4KLSAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZmlsdGVyLCBrVW5pdmVyc2FsRmlsdGVyKSkgewotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAotICAgICAgICAgICAgICAgICAgIk5vdGU6ICVzIGZpbHRlciA9ICVzXG4iLCBHVEVTVF9OQU1FXywgZmlsdGVyKTsKLSAgfQotCi0gIGlmIChpbnRlcm5hbDo6U2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LCBmYWxzZSkpIHsKLSNpZiBHVEVTVF9PU19TVEFSQk9BUkQKLSAgICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEdURVNUX0ZMQUcoc2hhcmRfaW5kZXgpOwotICAgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IEdURVNUX0ZMQUcodG90YWxfc2hhcmRzKTsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJWQgb2YgJWQuXG4iLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0b3RhbF9zaGFyZHMpKTsKLSNlbHNlICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLSAgICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpOwotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAotICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAlZCBvZiAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNoYXJkX2luZGV4KSArIDEsCi0gICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OkdldEVudihrVGVzdFRvdGFsU2hhcmRzKSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAotICB9Ci0KLSAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICJOb3RlOiBSYW5kb21pemluZyB0ZXN0cycgb3JkZXJzIHdpdGggYSBzZWVkIG9mICVkIC5cbiIsCi0gICAgICAgICAgICAgICAgICB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7Ci0gIH0KLQotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKLSAgcG9zaXg6OlByaW50RigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKLSAgICAgICAgICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKLSAgcG9zaXg6OkZsdXNoKCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1NldFVwU3RhcnQoCi0gICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7Ci0gIHBvc2l4OjpQcmludEYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC5cbiIpOwotICBwb3NpeDo6Rmx1c2goKTsKLX0KLQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9Ci0gICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOwotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWy0tLS0tLS0tLS1dICIpOwotICBwb3NpeDo6UHJpbnRGKCIlcyBmcm9tICVzIiwgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCkpOwotICBpZiAodGVzdF9jYXNlLnR5cGVfcGFyYW0oKSA9PSBOVUxMKSB7Ci0gICAgcG9zaXg6OlByaW50RigiXG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwb3NpeDo6UHJpbnRGKCIsIHdoZXJlICVzID0gJXNcbiIsIGtUeXBlUGFyYW1MYWJlbCwgdGVzdF9jYXNlLnR5cGVfcGFyYW0oKSk7Ci0gIH0KLSAgcG9zaXg6OkZsdXNoKCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWyBSVU4gICAgICBdICIpOwotICBQcmludFRlc3ROYW1lKHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKLSAgcG9zaXg6OlByaW50RigiXG4iKTsKLSAgcG9zaXg6OkZsdXNoKCk7Ci19Ci0KLS8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RQYXJ0UmVzdWx0KAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gIGlmIChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKLSAgICByZXR1cm47Ci0KLSAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGFzc2VydGlvbiAoZS5nLiBleHBlY3RlZCB0aGlzIGFuZCBnb3QgdGhhdCkuCi0gIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLSAgcG9zaXg6OkZsdXNoKCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgewotICAgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbICAgICAgIE9LIF0gIik7Ci0gIH0gZWxzZSB7Ci0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7Ci0gIH0KLSAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7Ci0gIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPkZhaWxlZCgpKQotICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7Ci0KLSAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKLSAgICBwb3NpeDo6UHJpbnRGKCIgKCVzIG1zKVxuIiwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZygKLSAgICAgICAgdGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcG9zaXg6OlByaW50RigiXG4iKTsKLSAgfQotICBwb3NpeDo6Rmx1c2goKTsKLX0KLQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgewotICBpZiAoIUdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHJldHVybjsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBjb3VudHMgPQotICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlstLS0tLS0tLS0tXSAiKTsKLSAgcG9zaXg6OlByaW50RigiJXMgZnJvbSAlcyAoJXMgbXMgdG90YWwpXG5cbiIsCi0gICAgICAgICAgICAgICAgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCksCi0gICAgICAgICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOwotICBwb3NpeDo6Rmx1c2goKTsKLX0KLQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgKLSAgICBjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgewotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlstLS0tLS0tLS0tXSAiKTsKLSAgcG9zaXg6OlByaW50RigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duXG4iKTsKLSAgcG9zaXg6OkZsdXNoKCk7Ci19Ci0KLS8vIEludGVybmFsIGhlbHBlciBmb3IgcHJpbnRpbmcgdGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzLgotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgewotICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKLSAgaWYgKGZhaWxlZF90ZXN0X2NvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7Ci0gICAgaWYgKCF0ZXN0X2Nhc2Uuc2hvdWxkX3J1bigpIHx8ICh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSA9PSAwKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7Ci0gICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsKLSAgICAgIGlmICghdGVzdF9pbmZvLnNob3VsZF9ydW4oKSB8fCB0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7Ci0gICAgICBwb3NpeDo6UHJpbnRGKCIlcy4lcyIsIHRlc3RfY2FzZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOwotICAgICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsKLSAgICAgIHBvc2l4OjpQcmludEYoIlxuIik7Ci0gICAgfQotICB9Ci19Ci0KLSNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7Ci0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOwotICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCi0gICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCi0gICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOwotICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgewotICAgIHByaW50ZigiICglcyBtcyB0b3RhbCkiLAotICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgIFBBU1NFRCAgXSAiKTsKLSAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOwotCi0gIGludCBudW1fZmFpbHVyZXMgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKLSAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsKLSAgICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgICJbICBGQUlMRUQgIF0gIik7Ci0gICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKLSAgICBQcmludEZhaWxlZFRlc3RzKHVuaXRfdGVzdCk7Ci0gICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgJXNcbiIsIG51bV9mYWlsdXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7Ci0gIH0KLQotICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOwotICBpZiAobnVtX2Rpc2FibGVkICYmICFHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgewotICAgIGlmICghbnVtX2ZhaWx1cmVzKSB7Ci0gICAgICBwcmludGYoIlxuIik7ICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLgotICAgIH0KLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICIgIFlPVSBIQVZFICVkIERJU0FCTEVEICVzXG5cbiIsCi0gICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQsCi0gICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOwotICB9Ci0gIC8vIEVuc3VyZSB0aGF0IEdvb2dsZSBUZXN0IG91dHB1dCBpcyBwcmludGVkIGJlZm9yZSwgZS5nLiwgaGVhcGNoZWNrZXIgb3V0cHV0LgotICBmZmx1c2goc3Rkb3V0KTsKLX0KLSNlbHNlICAvLyAhR1RFU1RfT1NfU1RBUkJPQVJECi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7Ci0gIC8vIER1ZSB0byB0aGUgdGVzdCBwcm9jZXNzZXMgcmVseWluZyBvbiByZWdleC1wYXJzaW5nIG9mIEdURVNUIHRlc3QgcmVzdWx0Ci0gIC8vIHN1bW1hcnkgb3V0cHV0LCB3ZSBtb2RpZnkgdGhpcyBzdGVwIHRvIGF0b21pY2FsbHkgb3V0cHV0IHRoZSBsb2dzIHRvIHN0ZG91dAotICAvLyB0byBhdm9pZCBvdGhlciBleHRlcm5hbCBTYkxvZ1JhdyBjYWxscyBmcm9tIGJlaW5nIGluc2VydGVkIGJldHdlZW4gY2FsbHMgdG8KLSAgLy8gcG9zaXg6UHJpbnRGKCkuCi0gIC8vIFRoaXMgYmF0Y2hpbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdXRwdXQgaXMgd2VsbC1mb3JtYXR0ZWQgYXMgdGhlIHRlc3QKLSAgLy8gcnVubmVyIHNjcmlwdHMgYXJlIHNldHVwIHRvIGV4cGVjdC4KLSAgLy8gU2VlIGIvMjUxODI3NzQxCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIG91dF9zdHJlYW07Ci0gIG91dF9zdHJlYW0gPDwgIls9PT09PT09PT09XSAiOwotCi0gIG91dF9zdHJlYW0gPDwgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKQotICAgICAgICAgICAgIDw8ICIgZnJvbSAiCi0gICAgICAgICAgICAgPDwgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKQotICAgICAgICAgICAgIDw8ICIgcmFuLiI7Ci0KLSAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKLSAgICBvdXRfc3RyZWFtIDw8ICIgKCIKLSAgICAgICAgICAgICAgIDw8IGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKQotICAgICAgICAgICAgICAgPDwgIiBtcyB0b3RhbCkiOwotICB9Ci0gIG91dF9zdHJlYW0gPDwgc3RkOjplbmRsOwotCi0gIG91dF9zdHJlYW0gPDwgIlsgIFBBU1NFRCAgXSAiCi0gICAgICAgICAgICAgPDwgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSkKLSAgICAgICAgICAgICA8PCAiLiIKLSAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0KLSAgaW50IG51bV9mYWlsdXJlcyA9IHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpOwotICBpZiAoIXVuaXRfdGVzdC5QYXNzZWQoKSkgewotICAgIGNvbnN0IGludCBmYWlsZWRfdGVzdF9jb3VudCA9IHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpOwotICAgIG91dF9zdHJlYW0gPDwgIlsgIEZBSUxFRCAgXSAiCi0gICAgICAgICAgICAgICA8PCBGb3JtYXRUZXN0Q291bnQoZmFpbGVkX3Rlc3RfY291bnQpCi0gICAgICAgICAgICAgICA8PCAiLCBsaXN0ZWQgYmVsb3c6IgotICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotCi0gICAgLy8gUHJpbnQgZWFjaCBmYWlsZWQgdGVzdCBjYXNlIHdpdGhpbiB0aGUgdW5pdCB0ZXN0LgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpIHsKLSAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOwotICAgICAgaWYgKCF0ZXN0X2Nhc2Uuc2hvdWxkX3J1bigpIHx8ICh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSA9PSAwKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7Ci0gICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8gPSAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGopOwotICAgICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG91dF9zdHJlYW0gPDwgIlsgIEZBSUxFRCAgXSAiCi0gICAgICAgICAgICAgICAgICAgPDwgdGVzdF9jYXNlLm5hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIuIgotICAgICAgICAgICAgICAgICAgIDw8IHRlc3RfaW5mby5uYW1lKCk7Ci0KLSAgICAgICAgLy8gT3V0cHV0IHRoZSBmdWxsIHRlc3QgY29tbWVudCBpZiBwcmVzZW50LgotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCB0eXBlX3BhcmFtID0gdGVzdF9pbmZvLnR5cGVfcGFyYW0oKTsKLSAgICAgICAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfcGFyYW0gPSB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKTsKLSAgICAgICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCB8fCB2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgb3V0X3N0cmVhbSA8PCAiLCB3aGVyZSAiOwotICAgICAgICAgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG91dF9zdHJlYW0gPDwga1R5cGVQYXJhbUxhYmVsCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfcGFyYW07Ci0gICAgICAgICAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICBvdXRfc3RyZWFtIDw8ICIgYW5kICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBvdXRfc3RyZWFtIDw8IGtWYWx1ZVBhcmFtTGFiZWwKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWVfcGFyYW07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dF9zdHJlYW0gPDwgc3RkOjplbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dF9zdHJlYW0gPDwgbnVtX2ZhaWx1cmVzCi0gICAgICAgICAgICAgICA8PCAiIEZBSUxFRCAiCi0gICAgICAgICAgICAgICA8PCAobnVtX2ZhaWx1cmVzID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKQotICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICB9Ci0KLSAgaW50IG51bV9kaXNhYmxlZCA9IHVuaXRfdGVzdC5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKTsKLSAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKLSAgICBpZiAoIW51bV9mYWlsdXJlcykgewotICAgICAgLy8gQWRkIGEgc3BhY2VyIGlmIG5vIEZBSUxVUkUgYmFubmVyIGlzIGRpc3BsYXllZC4KLSAgICAgIG91dF9zdHJlYW0gPDwgc3RkOjplbmRsOwotICAgIH0KLSAgICBvdXRfc3RyZWFtIDw8ICIgIFlPVSBIQVZFICIKLSAgICAgICAgICAgICAgIDw8IG51bV9kaXNhYmxlZAotICAgICAgICAgICAgICAgPDwgIiBESVNBQkxFRCAiCi0gICAgICAgICAgICAgICA8PCAobnVtX2Rpc2FibGVkID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKQotICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gIH0KLSAgLy8gRW5zdXJlIHRoYXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIHByaW50ZWQgYmVmb3JlLCBlLmcuLCBoZWFwY2hlY2tlciBvdXRwdXQuCi0gIHBvc2l4OjpQcmludEYoIiVzIiwgb3V0X3N0cmVhbS5zdHIoKS5jX3N0cigpKTsKLSAgcG9zaXg6OkZsdXNoKCk7Ci19Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19TVEFSQk9BUkQKLQotLy8gRW5kIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcgotCi0vLyBjbGFzcyBUZXN0RXZlbnRSZXBlYXRlcgotLy8KLS8vIFRoaXMgY2xhc3MgZm9yd2FyZHMgZXZlbnRzIHRvIG90aGVyIGV2ZW50IGxpc3RlbmVycy4KLWNsYXNzIFRlc3RFdmVudFJlcGVhdGVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIFRlc3RFdmVudFJlcGVhdGVyKCkgOiBmb3J3YXJkaW5nX2VuYWJsZWRfKHRydWUpIHt9Ci0gIHZpcnR1YWwgflRlc3RFdmVudFJlcGVhdGVyKCk7Ci0gIHZvaWQgQXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcik7Ci0gIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbGlzdGVuZXJzXy4gU2V0IHRvIGZhbHNlCi0gIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLgotICBib29sIGZvcndhcmRpbmdfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRpbmdfZW5hYmxlZF87IH0KLSAgdm9pZCBzZXRfZm9yd2FyZGluZ19lbmFibGVkKGJvb2wgZW5hYmxlKSB7IGZvcndhcmRpbmdfZW5hYmxlZF8gPSBlbmFibGU7IH0KLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotCi0gcHJpdmF0ZToKLSAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbGlzdGVuZXJzXy4gU2V0IHRvIGZhbHNlCi0gIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLgotICBib29sIGZvcndhcmRpbmdfZW5hYmxlZF87Ci0gIC8vIFRoZSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IHJlY2VpdmUgZXZlbnRzLgotICBzdGQ6OnZlY3RvcjxUZXN0RXZlbnRMaXN0ZW5lcio+IGxpc3RlbmVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0RXZlbnRSZXBlYXRlcik7Ci19OwotCi1UZXN0RXZlbnRSZXBlYXRlcjo6flRlc3RFdmVudFJlcGVhdGVyKCkgewotICBGb3JFYWNoKGxpc3RlbmVyc18sIERlbGV0ZTxUZXN0RXZlbnRMaXN0ZW5lcj4pOwotfQotCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7Ci0gIGxpc3RlbmVyc18ucHVzaF9iYWNrKGxpc3RlbmVyKTsKLX0KLQotLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogRmFjdG9yIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSBpbnRvIFZlY3Rvcjo6RmluZC4KLVRlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRSZXBlYXRlcjo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKGxpc3RlbmVyc19baV0gPT0gbGlzdGVuZXIpIHsKLSAgICAgIGxpc3RlbmVyc18uZXJhc2UobGlzdGVuZXJzXy5iZWdpbigpICsgaSk7Ci0gICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIFNpbmNlIG1vc3QgbWV0aG9kcyBhcmUgdmVyeSBzaW1pbGFyLCB1c2UgbWFjcm9zIHRvIHJlZHVjZSBib2lsZXJwbGF0ZS4KLS8vIFRoaXMgZGVmaW5lcyBhIG1lbWJlciB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvIGFsbCBsaXN0ZW5lcnMuCi0jZGVmaW5lIEdURVNUX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAotICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgaSsrKSB7IFwKLSAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXAotICAgIH0gXAotICB9IFwKLX0KLS8vIFRoaXMgZGVmaW5lcyBhIG1lbWJlciB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvIGFsbCBsaXN0ZW5lcnMgaW4gcmV2ZXJzZQotLy8gb3JkZXIuCi0jZGVmaW5lIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpOYW1lKGNvbnN0IFR5cGUmIHBhcmFtZXRlcikgeyBcCi0gIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7IFwKLSAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeyBcCi0gICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKLSAgICB9IFwKLSAgfSBcCi19Ci0KLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbVN0YXJ0LCBVbml0VGVzdCkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0LCBVbml0VGVzdCkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0Q2FzZVN0YXJ0LCBUZXN0Q2FzZSkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0U3RhcnQsIFRlc3RJbmZvKQotR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQYXJ0UmVzdWx0LCBUZXN0UGFydFJlc3VsdCkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0LCBVbml0VGVzdCkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwRW5kLCBVbml0VGVzdCkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duRW5kLCBVbml0VGVzdCkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RFbmQsIFRlc3RJbmZvKQotR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VFbmQsIFRlc3RDYXNlKQotR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1FbmQsIFVuaXRUZXN0KQotCi0jdW5kZWYgR1RFU1RfUkVQRUFURVJfTUVUSE9EXwotI3VuZGVmIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXwotCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgewotICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgewotICAgICAgbGlzdGVuZXJzX1tpXS0+T25UZXN0SXRlcmF0aW9uU3RhcnQodW5pdF90ZXN0LCBpdGVyYXRpb24pOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7Ci0gIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvbkVuZCh1bml0X3Rlc3QsIGl0ZXJhdGlvbik7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEVuZCBUZXN0RXZlbnRSZXBlYXRlcgotCi0KLS8vIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGFuIFhNTCBvdXRwdXQgZmlsZS4KLWNsYXNzIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSk7Ci0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKLQotIHByaXZhdGU6Ci0gIC8vIElzIGMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciB0aGF0IGlzIG5vcm1hbGl6ZWQgdG8gYSBzcGFjZSBjaGFyYWN0ZXIKLSAgLy8gd2hlbiBpdCBhcHBlYXJzIGluIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWU/Ci0gIHN0YXRpYyBib29sIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjaGFyIGMpIHsKLSAgICByZXR1cm4gYyA9PSAweDkgfHwgYyA9PSAweEEgfHwgYyA9PSAweEQ7Ci0gIH0KLQotICAvLyBNYXkgYyBhcHBlYXIgaW4gYSB3ZWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQ/Ci0gIHN0YXRpYyBib29sIElzVmFsaWRYbWxDaGFyYWN0ZXIoY2hhciBjKSB7Ci0gICAgcmV0dXJuIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjKSB8fCBjID49IDB4MjA7Ci0gIH0KLQotICAvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZgotICAvLyBpc19hdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZQotICAvLyB2YWx1ZSwgYW5kIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQKLSAgLy8gd2l0aCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBib29sIGlzX2F0dHJpYnV0ZSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBhbiBhdHRyaWJ1dGUgdmFsdWUuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWxBdHRyaWJ1dGUoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCB0cnVlKTsKLSAgfQotCi0gIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBub3QgYW4gYXR0cmlidXRlIHZhbHVlLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sVGV4dChjb25zdCBjaGFyKiBzdHIpIHsKLSAgICByZXR1cm4gRXNjYXBlWG1sKHN0ciwgZmFsc2UpOwotICB9Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gYXR0cmlidXRlIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQgYW5kCi0gIC8vIHN0cmVhbXMgdGhlIGF0dHJpYnV0ZSBhcyBYTUwuCi0gIHN0YXRpYyB2b2lkIE91dHB1dFhtbEF0dHJpYnV0ZShzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0KLSAgLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgotICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZGF0YSk7Ci0KLSAgLy8gU3RyZWFtcyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIE91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKLQotICAvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0Ci0gIHN0YXRpYyB2b2lkIFByaW50WG1sVGVzdENhc2UoOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKLQotICAvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0LgotICBzdGF0aWMgdm9pZCBQcmludFhtbFVuaXRUZXN0KDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0KLSAgLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKLSAgLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KLSAgLy8gV2hlbiB0aGUgc3RkOjpzdHJpbmcgaXMgbm90IGVtcHR5LCBpdCBpbmNsdWRlcyBhIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcsCi0gIC8vIHRvIGRlbGltaXQgdGhpcyBhdHRyaWJ1dGUgZnJvbSBwcmlvciBhdHRyaWJ1dGVzLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KTsKLQotICAvLyBUaGUgb3V0cHV0IGZpbGUuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Ci19OwotCi0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi12b2lkIFdyaXRlT3VwdXRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRwdXRfZmlsZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmRhdGEpIHsKLSAgU2JGaWxlRXJyb3IgZXJyOwotICBzdGFyYm9hcmQ6OlNjb3BlZEZpbGUgY2FjaGVfZmlsZSgKLSAgICAgIG91dHB1dF9maWxlLmNfc3RyKCksIGtTYkZpbGVDcmVhdGVBbHdheXMgfCBrU2JGaWxlV3JpdGUsIE5VTEwsICZlcnIpOwotICAvLyBUT0RPOiBDaGFuZ2UgdG8gU0JfRENIRUNLIG9uY2UgYWxsIHBsYXRmb3JtcyBhcmUgdmVyaWZpZWQKLSAgaWYoZXJyICE9IGtTYkZpbGVPaykgewotICAgIFNCX0xPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuIGZpbGUgIiA8PCBvdXRwdXRfZmlsZSA8PCAiIGZvciBYTUwgb3V0cHV0IjsKLSAgfQotICBjYWNoZV9maWxlLldyaXRlQWxsKGRhdGEuY19zdHIoKSwgc3RhdGljX2Nhc3Q8aW50PihkYXRhLnNpemUoKSkpOwotfQotI2VuZGlmCi0KLS8vIENyZWF0ZXMgYSBuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyLgotWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpCi0gICAgOiBvdXRwdXRfZmlsZV8ob3V0cHV0X2ZpbGUpIHsKLSAgaWYgKG91dHB1dF9maWxlXy5jX3N0cigpID09IE5VTEwgfHwgb3V0cHV0X2ZpbGVfLmVtcHR5KCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlhNTCBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIG51bGxcbiIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotICAvLyBFbnN1cmUgZmlsZSBjb250ZW50cyBnZXQgcmVzZXQgYmV0d2VlbiBydW5zLCB0byBhdm9pZCBzdGFsZSByZXN1bHRzCi0gIFdyaXRlT3VwdXRGaWxlKG91dHB1dF9maWxlLCIiKTsKLSNlbmRpZgotfQotCi0vLyBDYWxsZWQgYWZ0ZXIgdGhlIHVuaXQgdGVzdCBlbmRzLgotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgewotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gIFByaW50WG1sVW5pdFRlc3QoJnN0cmVhbSwgdW5pdF90ZXN0KTsKLQotICBXcml0ZU91cHV0RmlsZShvdXRwdXRfZmlsZV8sIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pKTsKLSNlbHNlCi0gIEZJTEUqIHhtbG91dCA9IE5VTEw7Ci0gIEZpbGVQYXRoIG91dHB1dF9maWxlKG91dHB1dF9maWxlXyk7Ci0gIEZpbGVQYXRoIG91dHB1dF9kaXIob3V0cHV0X2ZpbGUuUmVtb3ZlRmlsZU5hbWUoKSk7Ci0KLSAgaWYgKG91dHB1dF9kaXIuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKSB7Ci0gICAgeG1sb3V0ID0gZm9wZW4ob3V0cHV0X2ZpbGVfLmNfc3RyKCksICJ3Iik7Ci0gIH0KLSAgaWYgKHhtbG91dCA9PSBOVUxMKSB7Ci0gICAgLy8gVE9ETyh3YW4pOiByZXBvcnQgdGhlIHJlYXNvbiBvZiB0aGUgZmFpbHVyZS4KLSAgICAvLwotICAgIC8vIFdlIGRvbid0IGRvIGl0IGZvciBub3cgYXM6Ci0gICAgLy8KLSAgICAvLyAgIDEuIFRoZXJlIGlzIG5vIHVyZ2VudCBuZWVkIGZvciBpdC4KLSAgICAvLyAgIDIuIEl0J3MgYSBiaXQgaW52b2x2ZWQgdG8gbWFrZSB0aGUgZXJybm8gdmFyaWFibGUgdGhyZWFkLXNhZmUgb24KLSAgICAvLyAgICAgIGFsbCB0aHJlZSBvcGVyYXRpbmcgc3lzdGVtcyAoTGludXgsIFdpbmRvd3MsIGFuZCBNYWMgT1MpLgotICAgIC8vICAgMy4gVG8gaW50ZXJwcmV0IHRoZSBtZWFuaW5nIG9mIGVycm5vIGluIGEgdGhyZWFkLXNhZmUgd2F5LAotICAgIC8vICAgICAgd2UgbmVlZCB0aGUgc3RyZXJyb3JfcigpIGZ1bmN0aW9uLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uCi0gICAgLy8gICAgICBXaW5kb3dzLgotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLAotICAgICAgICAgICAgb3V0cHV0X2ZpbGVfLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gIFByaW50WG1sVW5pdFRlc3QoJnN0cmVhbSwgdW5pdF90ZXN0KTsKLSAgZnByaW50Zih4bWxvdXQsICIlcyIsIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pLmNfc3RyKCkpOwotICBmY2xvc2UoeG1sb3V0KTsKLSNlbmRpZgotfQotCi0vLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZiBpc19hdHRyaWJ1dGUKLS8vIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIGFuZAotLy8gbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGNoYXJhY3RlcgotLy8gcmVmZXJlbmNlcy4KLS8vCi0vLyBJbnZhbGlkIFhNTCBjaGFyYWN0ZXJzIGluIHN0ciwgaWYgYW55LCBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LgotLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aGUgdGV4dCBwcm9jZXNzZWQgYnkgdGhpcwotLy8gbW9kdWxlIHdpbGwgY29uc2lzdCBvZiBvcmRpbmFyeSBFbmdsaXNoIHRleHQuCi0vLyBJZiB0aGlzIG1vZHVsZSBpcyBldmVyIG1vZGlmaWVkIHRvIHByb2R1Y2UgdmVyc2lvbiAxLjEgWE1MIG91dHB1dCwKLS8vIG1vc3QgaW52YWxpZCBjaGFyYWN0ZXJzIGNhbiBiZSByZXRhaW5lZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLS8vIFRPRE8od2FuKTogSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWluaW1hbGx5IGludmFzaXZlLCBodW1hbi1yZWFkYWJsZQotLy8gZXNjYXBpbmcgc2NoZW1lIGZvciBpbnZhbGlkIGNoYXJhY3RlcnMsIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZW0uCi1zdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OkVzY2FwZVhtbCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBib29sIGlzX2F0dHJpYnV0ZSkgewotICBNZXNzYWdlIG07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBjaGFyIGNoID0gc3RyW2ldOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgJzwnOgotICAgICAgICBtIDw8ICImbHQ7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICc+JzoKLSAgICAgICAgbSA8PCAiJmd0OyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnJic6Ci0gICAgICAgIG0gPDwgIiZhbXA7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdcJyc6Ci0gICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCi0gICAgICAgICAgbSA8PCAiJmFwb3M7IjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG0gPDwgJ1wnJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICciJzoKLSAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKLSAgICAgICAgICBtIDw8ICImcXVvdDsiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbSA8PCAnIic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoY2gpKSB7Ci0gICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSAmJiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2gpKQotICAgICAgICAgICAgbSA8PCAiJiN4IiA8PCBTdHJpbmc6OkZvcm1hdEJ5dGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKQotICAgICAgICAgICAgICA8PCAiOyI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbSA8PCBjaDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KLS8vIEN1cnJlbnRseSBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgc3RyaW5nLiBBbgotLy8gYWx0ZXJuYXRpdmUgaXMgdG8gcmVwbGFjZSB0aGVtIHdpdGggY2VydGFpbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgLiBvciA/Lgotc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHN0ZDo6c3RyaW5nIG91dHB1dDsKLSAgb3V0cHV0LnJlc2VydmUoc3RyLnNpemUoKSk7Ci0gIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RyLmJlZ2luKCk7IGl0ICE9IHN0ci5lbmQoKTsgKytpdCkKLSAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcigqaXQpKQotICAgICAgb3V0cHV0LnB1c2hfYmFjaygqaXQpOwotCi0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZ2VuZXJhdGUgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pdFRlc3QKLS8vIG9iamVjdC4KLS8vCi0vLyBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBjb25jZXB0cyBtYXAgdG8gdGhlIERURDoKLS8vCi0vLyA8dGVzdHN1aXRlcyBuYW1lPSJBbGxUZXN0cyI+ICAgICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBVbml0VGVzdCBvYmplY3QKLS8vICAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0Y2FzZS1uYW1lIj4gIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RDYXNlIG9iamVjdAotLy8gICAgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0LW5hbWUiPiAgICAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdEluZm8gb2JqZWN0Ci0vLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KLS8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgotLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0gaW5kaXZpZHVhbCBhc3NlcnRpb24gZmFpbHVyZXMKLS8vICAgICA8L3Rlc3RjYXNlPgotLy8gICA8L3Rlc3RzdWl0ZT4KLS8vIDwvdGVzdHN1aXRlcz4KLQotLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4KLXN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgKHN0YXRpY19jYXN0PGRvdWJsZT4obXMpICogMWUtMyk7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLXN0YXRpYyBib29sIFBvcnRhYmxlTG9jYWx0aW1lKHRpbWVfdCBzZWNvbmRzLCBzdHJ1Y3QgdG0qIG91dCkgewotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0gIHJldHVybiBsb2NhbHRpbWVfcyhvdXQsICZzZWNvbmRzKSA9PSAwOwotI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX01JTkdXNjRfXykgfHwgZGVmaW5lZChfX09SQklTX18pCi0gIC8vIE1JTkdXIDx0aW1lLmg+IHByb3ZpZGVzIG5laXRoZXIgbG9jYWx0aW1lX3Igbm9yIGxvY2FsdGltZV9zLCBidXQgdXNlcwotICAvLyBXaW5kb3dzJyBsb2NhbHRpbWUoKSwgd2hpY2ggaGFzIGEgdGhyZWFkLWxvY2FsIHRtIGJ1ZmZlci4KLSAgc3RydWN0IHRtKiB0bV9wdHIgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UCi0gIGlmICh0bV9wdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpvdXQgPSAqdG1fcHRyOwotICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gIHJldHVybiBsb2NhbHRpbWVfcigmc2Vjb25kcywgb3V0KSAhPSBOVUxMOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLy8gQ29udmVydHMgdGhlIGdpdmVuIGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTwotLy8gODYwMSBmb3JtYXQsIHdpdGhvdXQgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLgotc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKSB7Ci0vLyBFelRpbWVFeHBsb2RlZCBoYXMgdGhlIHNhbWUgbWVtYmVycywgYW5kIG1lbWJlciBuYW1lcywgYXMgc3RydWN0IHRtIGFuZCBjYW4KLS8vIGJlIHNpbGVudGx5IGluc2VydGVkIGhlcmUgdG8gcHJvdmlkZSBhbiBldmVuIG1vcmUgcG9ydGFibGUgKFN0YXJib2FyZGl6ZWQpCi0vLyBsb2NhbGUgdGltZS4KLSNpZiBHVEVTVF9PU19TVEFSQk9BUkQKLSAgRXpUaW1lRXhwbG9kZWQgdGltZV9zdHJ1Y3Q7Ci0gIGNvbnN0IEV6VGltZVQgc2Vjb25kcyA9IHN0YXRpY19jYXN0PEV6VGltZVQ+KG1zIC8gMTAwMCk7Ci0gIGlmIChFelRpbWVURXhwbG9kZUxvY2FsKCZzZWNvbmRzLCAmdGltZV9zdHJ1Y3QpID09IE5VTEwpIHsKLSNlbHNlCi0gIHN0cnVjdCB0bSB0aW1lX3N0cnVjdDsKLSAgaWYgKCFQb3J0YWJsZUxvY2FsdGltZShzdGF0aWNfY2FzdDx0aW1lX3Q+KG1zIC8gMTAwMCksICZ0aW1lX3N0cnVjdCkpIHsKLSNlbmRpZgotICAgIHJldHVybiAiIjsKLSAgfQotICAvLyBZWVlZLU1NLUREVGhoOm1tOnNzCi0gIHJldHVybiBTdHJlYW1hYmxlVG9TdHJpbmcodGltZV9zdHJ1Y3QudG1feWVhciArIDE5MDApICsgIi0iICsKLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX21vbiArIDEpICsgIi0iICsKLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX21kYXkpICsgIlQiICsKLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX2hvdXIpICsgIjoiICsKLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX21pbikgKyAiOiIgKwotICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fc2VjKTsKLX0KLQotLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhKSB7Ci0gIGNvbnN0IGNoYXIqIHNlZ21lbnQgPSBkYXRhOwotICAqc3RyZWFtIDw8ICI8IVtDREFUQVsiOwotICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciogY29uc3QgbmV4dF9zZWdtZW50ID0gc3Ryc3RyKHNlZ21lbnQsICJdXT4iKTsKLSAgICBpZiAobmV4dF9zZWdtZW50ICE9IE5VTEwpIHsKLSAgICAgIHN0cmVhbS0+d3JpdGUoCi0gICAgICAgICAgc2VnbWVudCwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihuZXh0X3NlZ21lbnQgLSBzZWdtZW50KSk7Ci0gICAgICAqc3RyZWFtIDw8ICJdXT5dXSZndDs8IVtDREFUQVsiOwotICAgICAgc2VnbWVudCA9IG5leHRfc2VnbWVudCArIHN0cmxlbigiXV0+Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpzdHJlYW0gPDwgc2VnbWVudDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAqc3RyZWFtIDw8ICJdXT4iOwotfQotCi12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sQXR0cmlidXRlKAotICAgIHN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYWxsb3dlZF9uYW1lcyA9Ci0gICAgICBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KGVsZW1lbnRfbmFtZSk7Ci0KLSAgR1RFU1RfQ0hFQ0tfKHN0ZDo6ZmluZChhbGxvd2VkX25hbWVzLmJlZ2luKCksIGFsbG93ZWRfbmFtZXMuZW5kKCksIG5hbWUpICE9Ci0gICAgICAgICAgICAgICAgICAgYWxsb3dlZF9uYW1lcy5lbmQoKSkKLSAgICAgIDw8ICJBdHRyaWJ1dGUgIiA8PCBuYW1lIDw8ICIgaXMgbm90IGFsbG93ZWQgZm9yIGVsZW1lbnQgPCIgPDwgZWxlbWVudF9uYW1lCi0gICAgICA8PCAiPi4iOwotCi0gICpzdHJlYW0gPDwgIiAiIDw8IG5hbWUgPDwgIj1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHZhbHVlKSA8PCAiXCIiOwotfQotCi0vLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgotLy8gVE9ETyh3YW4pOiBUaGVyZSBpcyBhbHNvIHZhbHVlIGluIHByaW50aW5nIHByb3BlcnRpZXMgd2l0aCB0aGUgcGxhaW4gcHJpbnRlci4KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKLSAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0ID0gKnRlc3RfaW5mby5yZXN1bHQoKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RjYXNlID0gInRlc3RjYXNlIjsKLQotICAqc3RyZWFtIDw8ICIgICAgPHRlc3RjYXNlIjsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAibmFtZSIsIHRlc3RfaW5mby5uYW1lKCkpOwotCi0gIGlmICh0ZXN0X2luZm8udmFsdWVfcGFyYW0oKSAhPSBOVUxMKSB7Ci0gICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidmFsdWVfcGFyYW0iLAotICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKSk7Ci0gIH0KLSAgaWYgKHRlc3RfaW5mby50eXBlX3BhcmFtKCkgIT0gTlVMTCkgewotICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInR5cGVfcGFyYW0iLCB0ZXN0X2luZm8udHlwZV9wYXJhbSgpKTsKLSAgfQotCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInN0YXR1cyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8uc2hvdWxkX3J1bigpID8gInJ1biIgOiAibm90cnVuIik7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHJlc3VsdC5lbGFwc2VkX3RpbWUoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJjbGFzc25hbWUiLCB0ZXN0X2Nhc2VfbmFtZSk7Ci0gICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMocmVzdWx0KTsKLQotICBpbnQgZmFpbHVyZXMgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50b3RhbF9wYXJ0X2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBwYXJ0ID0gcmVzdWx0LkdldFRlc3RQYXJ0UmVzdWx0KGkpOwotICAgIGlmIChwYXJ0LmZhaWxlZCgpKSB7Ci0gICAgICBpZiAoKytmYWlsdXJlcyA9PSAxKSB7Ci0gICAgICAgICpzdHJlYW0gPDwgIj5cbiI7Ci0gICAgICB9Ci0gICAgICBjb25zdCBzdHJpbmcgbG9jYXRpb24gPSBpbnRlcm5hbDo6Rm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKLSAgICAgICAgICBwYXJ0LmZpbGVfbmFtZSgpLCBwYXJ0LmxpbmVfbnVtYmVyKCkpOwotICAgICAgY29uc3Qgc3RyaW5nIHN1bW1hcnkgPSBsb2NhdGlvbiArICJcbiIgKyBwYXJ0LnN1bW1hcnkoKTsKLSAgICAgICpzdHJlYW0gPDwgIiAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9XCIiCi0gICAgICAgICAgICAgIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShzdW1tYXJ5LmNfc3RyKCkpCi0gICAgICAgICAgICAgIDw8ICJcIiB0eXBlPVwiXCI+IjsKLSAgICAgIGNvbnN0IHN0cmluZyBkZXRhaWwgPSBsb2NhdGlvbiArICJcbiIgKyBwYXJ0Lm1lc3NhZ2UoKTsKLSAgICAgIE91dHB1dFhtbENEYXRhU2VjdGlvbihzdHJlYW0sIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGRldGFpbCkuY19zdHIoKSk7Ci0gICAgICAqc3RyZWFtIDw8ICI8L2ZhaWx1cmU+XG4iOwotICAgIH0KLSAgfQotCi0gIGlmIChmYWlsdXJlcyA9PSAwKQotICAgICpzdHJlYW0gPDwgIiAvPlxuIjsKLSAgZWxzZQotICAgICpzdHJlYW0gPDwgIiAgICA8L3Rlc3RjYXNlPlxuIjsKLX0KLQotLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVGVzdENhc2Uoc3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0c3VpdGUgPSAidGVzdHN1aXRlIjsKLSAgKnN0cmVhbSA8PCAiICA8IiA8PCBrVGVzdHN1aXRlOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAibmFtZSIsIHRlc3RfY2FzZS5uYW1lKCkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAidGVzdHMiLAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAiZmFpbHVyZXMiLAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZSgKLSAgICAgIHN0cmVhbSwga1Rlc3RzdWl0ZSwgImRpc2FibGVkIiwKLSAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UucmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgImVycm9ycyIsICIwIik7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJ0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpKTsKLSAgKnN0cmVhbSA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyh0ZXN0X2Nhc2UuYWRfaG9jX3Rlc3RfcmVzdWx0KCkpCi0gICAgICAgICAgPDwgIj5cbiI7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2kpIHsKLSAgICBpZiAodGVzdF9jYXNlLkdldFRlc3RJbmZvKGkpLT5pc19yZXBvcnRhYmxlKCkpCi0gICAgICBPdXRwdXRYbWxUZXN0SW5mbyhzdHJlYW0sIHRlc3RfY2FzZS5uYW1lKCksICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSkpOwotICB9Ci0gICpzdHJlYW0gPDwgIiAgPC8iIDw8IGtUZXN0c3VpdGUgPDwgIj5cbiI7Ci19Ci0KLS8vIFByaW50cyBhbiBYTUwgc3VtbWFyeSBvZiB1bml0X3Rlc3QgdG8gb3V0cHV0IHN0cmVhbSBvdXQuCi12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxVbml0VGVzdChzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RzdWl0ZXMgPSAidGVzdHN1aXRlcyI7Ci0KLSAgKnN0cmVhbSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOwotICAqc3RyZWFtIDw8ICI8IiA8PCBrVGVzdHN1aXRlczsKLQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInRlc3RzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QucmVwb3J0YWJsZV90ZXN0X2NvdW50KCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJmYWlsdXJlcyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKAotICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlcywgImRpc2FibGVkIiwKLSAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QucmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJlcnJvcnMiLCAiMCIpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoCi0gICAgICBzdHJlYW0sIGtUZXN0c3VpdGVzLCAidGltZXN0YW1wIiwKLSAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKHVuaXRfdGVzdC5zdGFydF90aW1lc3RhbXAoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkpOwotCi0gIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7Ci0gICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJyYW5kb21fc2VlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSkpOwotICB9Ci0KLSAgKnN0cmVhbSA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyh1bml0X3Rlc3QuYWRfaG9jX3Rlc3RfcmVzdWx0KCkpOwotCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAibmFtZSIsICJBbGxUZXN0cyIpOwotICAqc3RyZWFtIDw8ICI+XG4iOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpIHsKLSAgICBpZiAodW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpLT5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSA+IDApCi0gICAgICBQcmludFhtbFRlc3RDYXNlKHN0cmVhbSwgKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKSk7Ci0gIH0KLSAgKnN0cmVhbSA8PCAiPC8iIDw8IGtUZXN0c3VpdGVzIDw8ICI+XG4iOwotfQotCi0vLyBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRlc3QgcHJvcGVydGllcyBpbiBhIHJlc3VsdCBhcyBzcGFjZQotLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KLXN0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6VGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoCi0gICAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KSB7Ci0gIE1lc3NhZ2UgYXR0cmlidXRlczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5ID0gcmVzdWx0LkdldFRlc3RQcm9wZXJ0eShpKTsKLSAgICBhdHRyaWJ1dGVzIDw8ICIgIiA8PCBwcm9wZXJ0eS5rZXkoKSA8PCAiPSIKLSAgICAgICAgPDwgIlwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUocHJvcGVydHkudmFsdWUoKSkgPDwgIlwiIjsKLSAgfQotICByZXR1cm4gYXR0cmlidXRlcy5HZXRTdHJpbmcoKTsKLX0KLQotLy8gRW5kIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcgotCi0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0KLS8vIENoZWNrcyBpZiBzdHIgY29udGFpbnMgJz0nLCAnJicsICclJyBvciAnXG4nIGNoYXJhY3RlcnMuIElmIHllcywKLS8vIHJlcGxhY2VzIHRoZW0gYnkgIiV4eCIgd2hlcmUgeHggaXMgdGhlaXIgaGV4YWRlY2ltYWwgdmFsdWUuIEZvcgotLy8gZXhhbXBsZSwgcmVwbGFjZXMgIj0iIHdpdGggIiUzRCIuICBUaGlzIGFsZ29yaXRobSBpcyBPKHN0cmxlbihzdHIpKQotLy8gaW4gYm90aCB0aW1lIGFuZCBzcGFjZSAtLSBpbXBvcnRhbnQgYXMgdGhlIGlucHV0IHN0ciBtYXkgY29udGFpbiBhbgotLy8gYXJiaXRyYXJpbHkgbG9uZyB0ZXN0IGZhaWx1cmUgbWVzc2FnZSBhbmQgc3RhY2sgdHJhY2UuCi1zdHJpbmcgU3RyZWFtaW5nTGlzdGVuZXI6OlVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2VydmUoc3RybGVuKHN0cikgKyAxKTsKLSAgZm9yIChjaGFyIGNoID0gKnN0cjsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHIpIHsKLSAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICBjYXNlICclJzoKLSAgICAgIGNhc2UgJz0nOgotICAgICAgY2FzZSAnJic6Ci0gICAgICBjYXNlICdcbic6Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiUiICsgU3RyaW5nOjpGb3JtYXRCeXRlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBTdHJlYW1pbmdMaXN0ZW5lcjo6U29ja2V0V3JpdGVyOjpNYWtlQ29ubmVjdGlvbigpIHsKLSAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gPT0gLTEpCi0gICAgICA8PCAiTWFrZUNvbm5lY3Rpb24oKSBjYW4ndCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbi4iOwotCi0gIGFkZHJpbmZvIGhpbnRzOwotICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgICAvLyBUbyBhbGxvdyBib3RoIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBhZGRyaW5mbyogc2VydmluZm8gPSBOVUxMOwotCi0gIC8vIFVzZSB0aGUgZ2V0YWRkcmluZm8oKSB0byBnZXQgYSBsaW5rZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgZm9yCi0gIC8vIHRoZSBnaXZlbiBob3N0IG5hbWUuCi0gIGNvbnN0IGludCBlcnJvcl9udW0gPSBnZXRhZGRyaW5mbygKLSAgICAgIGhvc3RfbmFtZV8uY19zdHIoKSwgcG9ydF9udW1fLmNfc3RyKCksICZoaW50cywgJnNlcnZpbmZvKTsKLSAgaWYgKGVycm9yX251bSAhPSAwKSB7Ci0gICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdhaV9zdHJlcnJvcihlcnJvcl9udW0pOwotICB9Ci0KLSAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuLgotICBmb3IgKGFkZHJpbmZvKiBjdXJfYWRkciA9IHNlcnZpbmZvOyBzb2NrZmRfID09IC0xICYmIGN1cl9hZGRyICE9IE5VTEw7Ci0gICAgICAgY3VyX2FkZHIgPSBjdXJfYWRkci0+YWlfbmV4dCkgewotICAgIHNvY2tmZF8gPSBzb2NrZXQoCi0gICAgICAgIGN1cl9hZGRyLT5haV9mYW1pbHksIGN1cl9hZGRyLT5haV9zb2NrdHlwZSwgY3VyX2FkZHItPmFpX3Byb3RvY29sKTsKLSAgICBpZiAoc29ja2ZkXyAhPSAtMSkgewotICAgICAgLy8gQ29ubmVjdCB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgc2VydmVyIHNvY2tldC4KLSAgICAgIGlmIChjb25uZWN0KHNvY2tmZF8sIGN1cl9hZGRyLT5haV9hZGRyLCBjdXJfYWRkci0+YWlfYWRkcmxlbikgPT0gLTEpIHsKLSAgICAgICAgY2xvc2Uoc29ja2ZkXyk7Ci0gICAgICAgIHNvY2tmZF8gPSAtMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmcmVlYWRkcmluZm8oc2VydmluZm8pOyAgLy8gYWxsIGRvbmUgd2l0aCB0aGlzIHN0cnVjdHVyZQotCi0gIGlmIChzb2NrZmRfID09IC0xKSB7Ci0gICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIGNvbm5lY3QgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOwotICB9Ci19Ci0KLS8vIEVuZCBvZiBjbGFzcyBTdHJlYW1pbmcgTGlzdGVuZXIKLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTX18KLQotLy8gQ2xhc3MgU2NvcGVkVHJhY2UKLQotLy8gUHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvIGEgcGVyLXRocmVhZAotLy8gdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KLVNjb3BlZFRyYWNlOjpTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4XykgewotICBUcmFjZUluZm8gdHJhY2U7Ci0gIHRyYWNlLmZpbGUgPSBmaWxlOwotICB0cmFjZS5saW5lID0gbGluZTsKLSAgdHJhY2UubWVzc2FnZSA9IG1lc3NhZ2UuR2V0U3RyaW5nKCk7Ci0KLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlB1c2hHVGVzdFRyYWNlKHRyYWNlKTsKLX0KLQotLy8gUG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgotU2NvcGVkVHJhY2U6On5TY29wZWRUcmFjZSgpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oJlVuaXRUZXN0OjptdXRleF8pIHsKLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlBvcEdUZXN0VHJhY2UoKTsKLX0KLQotCi0vLyBjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIKLQotY29uc3QgY2hhciogY29uc3QgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlOjprRWxpZGVkRnJhbWVzTWFya2VyID0KLSAgICAiLi4uICIgR1RFU1RfTkFNRV8gIiBpbnRlcm5hbCBmcmFtZXMgLi4uIjsKLQotc3RyaW5nIE9zU3RhY2tUcmFjZUdldHRlcjo6Q3VycmVudFN0YWNrVHJhY2UoaW50IC8qbWF4X2RlcHRoKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypza2lwX2NvdW50Ki8pIHsKLSAgcmV0dXJuICIiOwotfQotCi12b2lkIE9zU3RhY2tUcmFjZUdldHRlcjo6VXBvbkxlYXZpbmdHVGVzdCgpIHt9Ci0KLS8vIEEgaGVscGVyIGNsYXNzIHRoYXQgY3JlYXRlcyB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpbiBpdHMKLS8vIGNvbnN0cnVjdG9yIGFuZCBkZWxldGVzIHRoZSBmaWxlIGluIGl0cyBkZXN0cnVjdG9yLgotY2xhc3MgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoY29uc3QgY2hhciogcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGgpCi0gICAgICA6IHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyhwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCkgewotICAgIC8vIElmIGEgcGF0aCB0byB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpcyBzcGVjaWZpZWQuLi4KLSAgICBpZiAocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggIT0gTlVMTCAmJiAqcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggIT0gJ1wwJykgewotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZSB3aXRoIGEgc2luZ2xlICIwIiBjaGFyYWN0ZXIgaW4gaXQuICBJL08KLSAgICAgIC8vIGVycm9ycyBhcmUgaWdub3JlZCBhcyB0aGVyZSdzIG5vdGhpbmcgYmV0dGVyIHdlIGNhbiBkbyBhbmQgd2UKLSAgICAgIC8vIGRvbid0IHdhbnQgdG8gZmFpbCB0aGUgdGVzdCBiZWNhdXNlIG9mIHRoaXMuCi0gICAgICBGSUxFKiBwZmlsZSA9IHBvc2l4OjpGT3BlbihwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCwgInciKTsKLSAgICAgIGZ3cml0ZSgiMCIsIDEsIDEsIHBmaWxlKTsKLSAgICAgIGZjbG9zZShwZmlsZSk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotICB+U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoKSB7Ci0gICAgaWYgKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyAhPSBOVUxMICYmICpwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8gIT0gJ1wwJykgewotI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKLSAgICAgIHJlbW92ZShwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8pOwotI2VuZGlmCi0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBjaGFyKiBjb25zdCBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRQcmVtYXR1cmVFeGl0RmlsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzCi0KLVRlc3RFdmVudExpc3RlbmVyczo6VGVzdEV2ZW50TGlzdGVuZXJzKCkKLSAgICA6IHJlcGVhdGVyXyhuZXcgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKCkpLAotICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8oTlVMTCksCi0gICAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKE5VTEwpIHsKLX0KLQotVGVzdEV2ZW50TGlzdGVuZXJzOjp+VGVzdEV2ZW50TGlzdGVuZXJzKCkgeyBkZWxldGUgcmVwZWF0ZXJfOyB9Ci0KLS8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCi0vLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAotLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAotLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSB1c2VyLgotdm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgcmVwZWF0ZXJfLT5BcHBlbmQobGlzdGVuZXIpOwotfQotCi0vLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgotLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucwotLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgotVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKQotICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gTlVMTDsKLSAgZWxzZSBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXykKLSAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gTlVMTDsKLSAgcmV0dXJuIHJlcGVhdGVyXy0+UmVsZWFzZShsaXN0ZW5lcik7Ci19Ci0KLS8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCi0vLyBzdWJzY3JpYmVycy4KLVRlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OnJlcGVhdGVyKCkgeyByZXR1cm4gcmVwZWF0ZXJfOyB9Ci0KLS8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KLS8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cwotLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KLS8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCi0vLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGlmIChkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyAhPSBsaXN0ZW5lcikgewotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCi0gICAgLy8gbGlzdC4KLSAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyk7Ci0gICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBsaXN0ZW5lcjsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKLSAgICAgIEFwcGVuZChsaXN0ZW5lcik7Ci0gIH0KLX0KLQotLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKLS8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCi0vLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCi0vLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcwotLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgotdm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGlmIChkZWZhdWx0X3htbF9nZW5lcmF0b3JfICE9IGxpc3RlbmVyKSB7Ci0gICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKLSAgICAvLyBsaXN0LgotICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pOwotICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBsaXN0ZW5lcjsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKLSAgICAgIEFwcGVuZChsaXN0ZW5lcik7Ci0gIH0KLX0KLQotLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQotLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgotYm9vbCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiByZXBlYXRlcl8tPmZvcndhcmRpbmdfZW5hYmxlZCgpOwotfQotCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKSB7Ci0gIHJlcGVhdGVyXy0+c2V0X2ZvcndhcmRpbmdfZW5hYmxlZChmYWxzZSk7Ci19Ci0KLS8vIGNsYXNzIFVuaXRUZXN0Ci0KLS8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcwotLy8gY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuICBDb25zZWN1dGl2ZQotLy8gY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgotLy8KLS8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8gYXMgYSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0bwotLy8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgc3RhcnRzLCBmcm9tIHdoaWNoIHBvaW50IG9uIHRoZSByZXR1cm4KLS8vIHZhbHVlIHdpbGwgbmV2ZXIgY2hhbmdlLgotVW5pdFRlc3QqIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIHsKLSAgLy8gV2hlbiBjb21waWxlZCB3aXRoIE1TVkMgNy4xIGluIG9wdGltaXplZCBtb2RlLCBkZXN0cm95aW5nIHRoZQotICAvLyBVbml0VGVzdCBvYmplY3QgdXBvbiBleGl0aW5nIHRoZSBwcm9ncmFtIG1lc3NlcyB1cCB0aGUgZXhpdCBjb2RlLAotICAvLyBjYXVzaW5nIHN1Y2Nlc3NmdWwgdGVzdHMgdG8gYXBwZWFyIGZhaWxlZC4gIFdlIGhhdmUgdG8gdXNlIGEKLSAgLy8gZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSB0byBieXBhc3MgdGhlIGNvbXBpbGVyIGJ1Zy4KLSAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB0aGUgY29tcGlsZXIgaGFwcHksIGF0IHRoZSBjb3N0IG9mCi0gIC8vIGxlYWtpbmcgdGhlIFVuaXRUZXN0IG9iamVjdC4KLQotICAvLyBDb2RlR2VhciBDKytCdWlsZGVyIGluc2lzdHMgb24gYSBwdWJsaWMgZGVzdHJ1Y3RvciBmb3IgdGhlCi0gIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uICBVc2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB0byBrZWVwIGdvb2QgT08KLSAgLy8gZGVzaWduIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9yLgotCi0jaWYgKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0gIHN0YXRpYyBVbml0VGVzdCogY29uc3QgaW5zdGFuY2UgPSBuZXcgVW5pdFRlc3Q7Ci0gIHJldHVybiBpbnN0YW5jZTsKLSNlbHNlCi0gIHN0YXRpYyBVbml0VGVzdCBpbnN0YW5jZTsKLSAgcmV0dXJuICZpbnN0YW5jZTsKLSNlbmRpZiAgLy8gKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgotaW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0Ci0vLyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3Q6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPnRlc3RfY2FzZV90b19ydW5fY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCi1pbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCi1pbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jb3VudCgpOyB9Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi1pbnQgVW5pdFRlc3Q6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KLWludCBVbml0VGVzdDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBVbml0VGVzdDo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLWludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jb3VudCgpOyB9Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3Q6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50ZXN0X3RvX3J1bl9jb3VudCgpOyB9Ci0KLS8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0vLyBVTklYIGVwb2NoLgotaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6c3RhcnRfdGltZXN0YW1wKCkgY29uc3QgewotICAgIHJldHVybiBpbXBsKCktPnN0YXJ0X3RpbWVzdGFtcCgpOwotfQotCi0vLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLWludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OmVsYXBzZWRfdGltZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+ZWxhcHNlZF90aW1lKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KLWJvb2wgVW5pdFRlc3Q6OlBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+UGFzc2VkKCk7IH0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKLS8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgotYm9vbCBVbml0VGVzdDo6RmFpbGVkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5GYWlsZWQoKTsgfQotCi0vLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi1jb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPkdldFRlc3RDYXNlKGkpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGVzdCBmYWlsdXJlcyBhbmQKLS8vIHByb3BlcnRpZXMgbG9nZ2VkIG91dHNpZGUgb2YgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzLgotY29uc3QgVGVzdFJlc3VsdCYgVW5pdFRlc3Q6OmFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsKLSAgcmV0dXJuICppbXBsKCktPmFkX2hvY190ZXN0X3Jlc3VsdCgpOwotfQotCi0vLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi1UZXN0Q2FzZSogVW5pdFRlc3Q6OkdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgewotICByZXR1cm4gaW1wbCgpLT5HZXRNdXRhYmxlVGVzdENhc2UoaSk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCi0vLyBpbnNpZGUgR29vZ2xlIFRlc3QuCi1UZXN0RXZlbnRMaXN0ZW5lcnMmIFVuaXRUZXN0OjpsaXN0ZW5lcnMoKSB7Ci0gIHJldHVybiAqaW1wbCgpLT5saXN0ZW5lcnMoKTsKLX0KLQotLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAotLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4gdGhlCi0vLyBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbSBoYXZlCi0vLyBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbiB0aGUKLS8vICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KLS8vCi0vLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCi0vLwotLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKLS8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgotRW52aXJvbm1lbnQqIFVuaXRUZXN0OjpBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7Ci0gIGlmIChlbnYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaW1wbF8tPmVudmlyb25tZW50cygpLnB1c2hfYmFjayhlbnYpOwotICByZXR1cm4gZW52OwotfQotCi0vLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwgR29vZ2xlIFRlc3QKLS8vIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKSBldmVudHVhbGx5IGNhbGwKLS8vIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlIHNob3VsZCB1c2UgdGhlCi0vLyBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5Lgotdm9pZCBVbml0VGVzdDo6QWRkVGVzdFBhcnRSZXN1bHQoCi0gICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAotICAgIGludCBsaW5lX251bWJlciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8IG1lc3NhZ2U7Ci0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICBpZiAoaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpID4gMCkgewotICAgIG1zZyA8PCAiXG4iIDw8IEdURVNUX05BTUVfIDw8ICIgdHJhY2U6IjsKLQotICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSk7Ci0gICAgICAgICBpID4gMDsgLS1pKSB7Ci0gICAgICBjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSA9IGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpW2kgLSAxXTsKLSAgICAgIG1zZyA8PCAiXG4iIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odHJhY2UuZmlsZSwgdHJhY2UubGluZSkKLSAgICAgICAgICA8PCAiICIgPDwgdHJhY2UubWVzc2FnZTsKLSAgICB9Ci0gIH0KLQotICBpZiAob3Nfc3RhY2tfdHJhY2UuY19zdHIoKSAhPSBOVUxMICYmICFvc19zdGFja190cmFjZS5lbXB0eSgpKSB7Ci0gICAgbXNnIDw8IGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlciA8PCBvc19zdGFja190cmFjZTsKLSAgfQotCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHJlc3VsdCA9Ci0gICAgVGVzdFBhcnRSZXN1bHQocmVzdWx0X3R5cGUsIGZpbGVfbmFtZSwgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICBpbXBsXy0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKS0+Ci0gICAgICBSZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOwotCi0gIGlmIChyZXN1bHRfdHlwZSAhPSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpIHsKLSAgICAvLyBndGVzdF9icmVha19vbl9mYWlsdXJlIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgotICAgIC8vIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuICBUaGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHRoZSBsYXR0ZXIKLSAgICAvLyBpbiB0aGUgY29kZSAocGVyaGFwcyBpbiBvcmRlciB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucwotICAgIC8vIHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yaykgYW5kIHNwZWNpZnkgdGhlIGZvcm1lciBvbiB0aGUKLSAgICAvLyBjb21tYW5kIGxpbmUgZm9yIGRlYnVnZ2luZy4KLSAgICBpZiAoR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgewotI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLSAgICAgIC8vIFVzaW5nIERlYnVnQnJlYWsgb24gV2luZG93cyBhbGxvd3MgZ3Rlc3QgdG8gc3RpbGwgYnJlYWsgaW50byBhIGRlYnVnZ2VyCi0gICAgICAvLyB3aGVuIGEgZmFpbHVyZSBoYXBwZW5zIGFuZCBib3RoIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgYW5kCi0gICAgICAvLyB0aGUgLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGZsYWdzIGFyZSBzcGVjaWZpZWQuCi0gICAgICBEZWJ1Z0JyZWFrKCk7Ci0KLSNlbGlmIEdURVNUX09TX1NUQVJCT0FSRAotICAgICAgU2JTeXN0ZW1CcmVha0ludG9EZWJ1Z2dlcigpOwotI2Vsc2UKLSAgICAgIC8vIERlcmVmZXJlbmNlIE5VTEwgdGhyb3VnaCBhIHZvbGF0aWxlIHBvaW50ZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKLSAgICAgIC8vIGZyb20gcmVtb3ZpbmcuIFdlIHVzZSB0aGlzIHJhdGhlciB0aGFuIGFib3J0KCkgb3IgX19idWlsdGluX3RyYXAoKSBmb3IKLSAgICAgIC8vIHBvcnRhYmlsaXR5OiBTeW1iaWFuIGRvZXNuJ3QgaW1wbGVtZW50IGFib3J0KCkgd2VsbCwgYW5kIHNvbWUgZGVidWdnZXJzCi0gICAgICAvLyBkb24ndCBjb3JyZWN0bHkgdHJhcCBhYm9ydCgpLgotICAgICAgKnN0YXRpY19jYXN0PHZvbGF0aWxlIGludCo+KE5VTEwpID0gMTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICAgIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkgewotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0gICAgICB0aHJvdyBpbnRlcm5hbDo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24ocmVzdWx0KTsKLSNlbHNlCi0gICAgICAvLyBXZSBjYW5ub3QgY2FsbCBhYm9ydCgpIGFzIGl0IGdlbmVyYXRlcyBhIHBvcC11cCBpbiBkZWJ1ZyBtb2RlCi0gICAgICAvLyB0aGF0IGNhbm5vdCBiZSBzdXBwcmVzc2VkIGluIFZDIDcuMSBvciBiZWxvdy4KLSAgICAgIGV4aXQoMSk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLX0KLQotLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgZnJvbQotLy8gaW5zaWRlIGEgdGVzdCwgdG8gY3VycmVudCBUZXN0Q2FzZSdzIGFkX2hvY190ZXN0X3Jlc3VsdF8gd2hlbiBpbnZva2VkCi0vLyBmcm9tIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKLS8vIHdoZW4gaW52b2tlZCBlbHNld2hlcmUuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoCi0vLyB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCi12b2lkIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGltcGxfLT5SZWNvcmRQcm9wZXJ0eShUZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSkpOwotfQotCi0vLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCi0vLwotLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKLS8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgotaW50IFVuaXRUZXN0OjpSdW4oKSB7Ci0gIGNvbnN0IGJvb2wgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzID0KLSAgICAgIGludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5sZW5ndGgoKSA+IDA7Ci0KLSAgLy8gR29vZ2xlIFRlc3QgaW1wbGVtZW50cyB0aGlzIHByb3RvY29sIGZvciBjYXRjaGluZyB0aGF0IGEgdGVzdAotICAvLyBwcm9ncmFtIGV4aXRzIGJlZm9yZSByZXR1cm5pbmcgY29udHJvbCB0byBHb29nbGUgVGVzdDoKLSAgLy8KLSAgLy8gICAxLiBVcG9uIHN0YXJ0LCBHb29nbGUgVGVzdCBjcmVhdGVzIGEgZmlsZSB3aG9zZSBhYnNvbHV0ZSBwYXRoCi0gIC8vICAgICAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAvLyAgICAgIFRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRS4KLSAgLy8gICAyLiBXaGVuIEdvb2dsZSBUZXN0IGhhcyBmaW5pc2hlZCBpdHMgd29yaywgaXQgZGVsZXRlcyB0aGUgZmlsZS4KLSAgLy8KLSAgLy8gVGhpcyBhbGxvd3MgYSB0ZXN0IHJ1bm5lciB0byBzZXQgVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIGJlZm9yZQotICAvLyBydW5uaW5nIGEgR29vZ2xlLVRlc3QtYmFzZWQgdGVzdCBwcm9ncmFtIGFuZCBjaGVjayB0aGUgZXhpc3RlbmNlCi0gIC8vIG9mIHRoZSBmaWxlIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QgZXhlY3V0aW9uIHRvIHNlZSBpZiBpdCBoYXMKLSAgLy8gZXhpdGVkIHByZW1hdHVyZWx5LgotCi0gIC8vIElmIHdlIGFyZSBpbiB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QsIGRvbid0Ci0gIC8vIGNyZWF0ZS9kZWxldGUgdGhlIHByZW1hdHVyZSBleGl0IGZpbGUsIGFzIGRvaW5nIHNvIGlzIHVubmVjZXNzYXJ5Ci0gIC8vIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBjcmVhdGUvZGVsZXRlCi0gIC8vIHRoZSBmaWxlIHVwb24gZW50ZXJpbmcvbGVhdmluZyB0aGlzIGZ1bmN0aW9uLiAgSWYgdGhlIHByb2dyYW0KLSAgLy8gc29tZWhvdyBleGl0cyBiZWZvcmUgdGhpcyBmdW5jdGlvbiBoYXMgYSBjaGFuY2UgdG8gcmV0dXJuLCB0aGUKLSAgLy8gcHJlbWF0dXJlLWV4aXQgZmlsZSB3aWxsIGJlIGxlZnQgdW5kZWxldGVkLCBjYXVzaW5nIGEgdGVzdCBydW5uZXIKLSAgLy8gdGhhdCB1bmRlcnN0YW5kcyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCB0byByZXBvcnQgdGhlCi0gIC8vIHRlc3QgYXMgaGF2aW5nIGZhaWxlZC4KLSAgY29uc3QgaW50ZXJuYWw6OlNjb3BlZFByZW1hdHVyZUV4aXRGaWxlIHByZW1hdHVyZV9leGl0X2ZpbGUoCi0gICAgICBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPwotICAgICAgTlVMTCA6IGludGVybmFsOjpwb3NpeDo6R2V0RW52KCJURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUiKSk7Ci0KLSAgLy8gQ2FwdHVyZXMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykuICBUaGlzIHZhbHVlIHdpbGwgYmUKLSAgLy8gdXNlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcm9ncmFtLgotICBpbXBsKCktPnNldF9jYXRjaF9leGNlcHRpb25zKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpOwotCi0jaWYgR1RFU1RfSEFTX1NFSAotICAvLyBFaXRoZXIgdGhlIHVzZXIgd2FudHMgR29vZ2xlIFRlc3QgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlCi0gIC8vIHRlc3RzIG9yIHRoaXMgaXMgZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIGRlYXRoIHRlc3QgY2hpbGQKLSAgLy8gcHJvY2Vzcy4gSW4gZWl0aGVyIGNhc2UgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBzZWUgcG9wLXVwIGRpYWxvZ3MKLSAgLy8gYWJvdXQgY3Jhc2hlcyAtIHRoZXkgYXJlIGV4cGVjdGVkLgotICBpZiAoaW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkgfHwgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzKSB7Ci0jIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAotICAgIC8vIFNldEVycm9yTW9kZSBkb2Vzbid0IGV4aXN0IG9uIENFLgotICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgfAotICAgICAgICAgICAgICAgICBTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0jIGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBHVEVTVF9PU19XSU5ET1dTX01JTkdXKSAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgICAvLyBEZWF0aCB0ZXN0IGNoaWxkcmVuIGNhbiBiZSB0ZXJtaW5hdGVkIHdpdGggX2Fib3J0KCkuICBPbiBXaW5kb3dzLAotICAgIC8vIF9hYm9ydCgpIGNhbiBzaG93IGEgZGlhbG9nIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUKLSAgICAvLyBhYm9ydCBtZXNzYWdlIHRvIGdvIHRvIHN0ZGVyciBpbnN0ZWFkLgotICAgIF9zZXRfZXJyb3JfbW9kZShfT1VUX1RPX1NUREVSUik7Ci0jIGVuZGlmCi0KLSMgaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nCi0gICAgLy8gb2ZmZXJpbmcgYSBjaG9pY2UgdG8gZGVidWcgdGhlIGFib3J0ZWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBzdXBwcmVzcwotICAgIC8vIHRoaXMgZGlhbG9nIG9yIGl0IHdpbGwgcG9wIHVwIGZvciBldmVyeSBFWFBFQ1QvQVNTRVJUX0RFQVRIIHN0YXRlbWVudAotICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZAotICAgIC8vIGZhaWx1cmUgdmlhIHN0ZGVyci4KLSAgICAvLwotICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4KLSAgICAvLyBVc2VycyBvZiBwcmlvciBWQyB2ZXJzaW9ucyBzaGFsbCBzdWZmZXIgdGhlIGFnb255IGFuZCBwYWluIG9mCi0gICAgLy8gY2xpY2tpbmcgdGhyb3VnaCB0aGUgY291bnRsZXNzIGRlYnVnIGRpYWxvZ3MuCi0gICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlCi0gICAgLy8gZGVidWcgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggVkMgNy4xIG9yIGxvd2VyLgotICAgIGlmICghR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkKLSAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoCi0gICAgICAgICAgMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci0gICAgICAgICAgX1dSSVRFX0FCT1JUX01TRyB8IF9DQUxMX1JFUE9SVEZBVUxUKTsgIC8vIHBvcC11cCB3aW5kb3csIGNvcmUgZHVtcC4KLSMgZW5kaWYKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi0KLSAgcmV0dXJuIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIGltcGwoKSwKLSAgICAgICZpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cywKLSAgICAgICJhdXhpbGlhcnkgdGVzdCBjb2RlIChlbnZpcm9ubWVudHMgb3IgZXZlbnQgbGlzdGVuZXJzKSIpID8gMCA6IDE7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKLS8vIGV4ZWN1dGVkLgotY29uc3QgY2hhciogVW5pdFRlc3Q6Om9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPm9yaWdpbmFsX3dvcmtpbmdfZGlyXy5jX3N0cigpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKLS8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0Ci0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfY2FzZSgpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKLS8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotY29uc3QgVGVzdEluZm8qIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0Ci0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotfQotCi0vLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KLWludCBVbml0VGVzdDo6cmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+cmFuZG9tX3NlZWQoKTsgfQotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLS8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgotLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCi1pbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmCi0gICAgVW5pdFRlc3Q6OnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpCi0gICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICByZXR1cm4gaW1wbF8tPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0vLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgotVW5pdFRlc3Q6OlVuaXRUZXN0KCkgewotICBpbXBsXyA9IG5ldyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKHRoaXMpOwotfQotCi0vLyBEZXN0cnVjdG9yIG9mIFVuaXRUZXN0LgotVW5pdFRlc3Q6On5Vbml0VGVzdCgpIHsKLSAgZGVsZXRlIGltcGxfOwotfQotCi0vLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCi0vLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KLXZvaWQgVW5pdFRlc3Q6OlB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnB1c2hfYmFjayh0cmFjZSk7Ci19Ci0KLS8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgotdm9pZCBVbml0VGVzdDo6UG9wR1Rlc3RUcmFjZSgpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucG9wX2JhY2soKTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotVW5pdFRlc3RJbXBsOjpVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCkKLSAgICA6IHBhcmVudF8ocGFyZW50KSwKLSAgICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQzNTUgLyogdXNpbmcgdGhpcyBpbiBpbml0aWFsaXplciAqLykKLSAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAotICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAotICAgICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0gICAgICBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXygKLSAgICAgICAgICAmZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAotICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXygKLSAgICAgICAgICAmZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAgICAgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XygpLAotICAgICAgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXyhmYWxzZSksCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0gICAgICBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8oLTEpLAotICAgICAgY3VycmVudF90ZXN0X2Nhc2VfKE5VTEwpLAotICAgICAgY3VycmVudF90ZXN0X2luZm9fKE5VTEwpLAotICAgICAgYWRfaG9jX3Rlc3RfcmVzdWx0XygpLAotICAgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyhOVUxMKSwKLSAgICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8oZmFsc2UpLAotICAgICAgcmFuZG9tX3NlZWRfKDApLCAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCi0gICAgICByYW5kb21fKDApLCAgLy8gV2lsbCBiZSByZXNlZWRlZCBiZWZvcmUgZmlyc3QgdXNlLgotICAgICAgc3RhcnRfdGltZXN0YW1wXygwKSwKLSAgICAgIGVsYXBzZWRfdGltZV8oMCksCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSAgICAgIGRlYXRoX3Rlc3RfZmFjdG9yeV8obmV3IERlZmF1bHREZWF0aFRlc3RGYWN0b3J5KSwKLSNlbmRpZgotICAgICAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCi0gICAgICBjYXRjaF9leGNlcHRpb25zXyhmYWxzZSkgewotICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIobmV3IFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Ci19Ci0KLVVuaXRUZXN0SW1wbDo6flVuaXRUZXN0SW1wbCgpIHsKLSAgLy8gRGVsZXRlcyBldmVyeSBUZXN0Q2FzZS4KLSAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0Q2FzZT4pOwotCi0gIC8vIERlbGV0ZXMgZXZlcnkgRW52aXJvbm1lbnQuCi0gIEZvckVhY2goZW52aXJvbm1lbnRzXywgaW50ZXJuYWw6OkRlbGV0ZTxFbnZpcm9ubWVudD4pOwotCi0gIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOwotfQotCi0vLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBpbiBhCi0vLyBjb250ZXh0IG9mIGEgdGVzdCwgdG8gY3VycmVudCB0ZXN0IGNhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHQgd2hlbiBpbnZva2UKLS8vIGZyb20gU2V0VXBUZXN0Q2FzZS9UZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAotLy8gb3RoZXJ3aXNlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksCi0vLyB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgotdm9pZCBVbml0VGVzdEltcGw6OlJlY29yZFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgewotICBzdGQ6OnN0cmluZyB4bWxfZWxlbWVudDsKLSAgVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQ7ICAvLyBUZXN0UmVzdWx0IGFwcHJvcHJpYXRlIGZvciBwcm9wZXJ0eSByZWNvcmRpbmcuCi0KLSAgaWYgKGN1cnJlbnRfdGVzdF9pbmZvXyAhPSBOVUxMKSB7Ci0gICAgeG1sX2VsZW1lbnQgPSAidGVzdGNhc2UiOwotICAgIHRlc3RfcmVzdWx0ID0gJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pOwotICB9IGVsc2UgaWYgKGN1cnJlbnRfdGVzdF9jYXNlXyAhPSBOVUxMKSB7Ci0gICAgeG1sX2VsZW1lbnQgPSAidGVzdHN1aXRlIjsKLSAgICB0ZXN0X3Jlc3VsdCA9ICYoY3VycmVudF90ZXN0X2Nhc2VfLT5hZF9ob2NfdGVzdF9yZXN1bHRfKTsKLSAgfSBlbHNlIHsKLSAgICB4bWxfZWxlbWVudCA9ICJ0ZXN0c3VpdGVzIjsKLSAgICB0ZXN0X3Jlc3VsdCA9ICZhZF9ob2NfdGVzdF9yZXN1bHRfOwotICB9Ci0gIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgdGVzdF9wcm9wZXJ0eSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotLy8gRGlzYWJsZXMgZXZlbnQgZm9yd2FyZGluZyBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgaW4gYSBkZWF0aCB0ZXN0Ci0vLyBzdWJwcm9jZXNzLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgotdm9pZCBVbml0VGVzdEltcGw6OlN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCkgewotICBpZiAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCkKLSAgICBsaXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKLS8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVYbWxPdXRwdXQoKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZm9ybWF0ID0gVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKTsKLSAgaWYgKG91dHB1dF9mb3JtYXQgPT0gInhtbCIpIHsKLSAgICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKAotICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpLmNfc3RyKCkpKTsKLSAgfSBlbHNlCi0gICAgICBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgewotICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3V0cHV0IGZvcm1hdCBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmVkLlxuIiwgb3V0cHV0X2Zvcm1hdC5jX3N0cigpKTsKLSAgICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7Ci0gIH0KLX0KLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLS8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyBpbiBzdHJpbmcgZm9ybS4KLS8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCi12b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCkgewotICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0ID0gR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKLSAgaWYgKCF0YXJnZXQuZW1wdHkoKSkgewotICAgIGNvbnN0IHNpemVfdCBwb3MgPSB0YXJnZXQuZmluZCgnOicpOwotICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGxpc3RlbmVycygpLT5BcHBlbmQobmV3IFN0cmVhbWluZ0xpc3RlbmVyKHRhcmdldC5zdWJzdHIoMCwgcG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdWJzdHIocG9zKzEpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIHN0cmVhbWluZyB0YXJnZXQgXCIlc1wiIGlnbm9yZWQuXG4iLAotICAgICAgICAgICAgIHRhcmdldC5jX3N0cigpKTsKLSAgICAgIGludGVybmFsOjpwb3NpeDo6Rmx1c2goKTsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotCi0vLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgotLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KLS8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKLS8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCi0vLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50Lgotdm9pZCBVbml0VGVzdEltcGw6OlBvc3RGbGFnUGFyc2luZ0luaXQoKSB7Ci0gIC8vIEVuc3VyZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4ZWN1dGUgbW9yZSB0aGFuIG9uY2UuCi0gIGlmICghcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXykgewotICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8gPSB0cnVlOwotCi0jaWYgZGVmaW5lZChHVEVTVF9DVVNUT01fVEVTVF9FVkVOVF9MSVNURU5FUl8pCi0gICAgLy8gUmVnaXN0ZXIgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0IGtleSBwcm9jZXNzIHN0YXRlIGNoYW5nZXMuCi0gICAgbGlzdGVuZXJzKCktPkFwcGVuZChuZXcgR1RFU1RfQ1VTVE9NX1RFU1RfRVZFTlRfTElTVEVORVJfKCkpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9URVNUX0VWRU5UX0xJU1RFTkVSXykKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gICAgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpOwotICAgIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSAgICAvLyBSZWdpc3RlcnMgcGFyYW1ldGVyaXplZCB0ZXN0cy4gVGhpcyBtYWtlcyBwYXJhbWV0ZXJpemVkIHRlc3RzCi0gICAgLy8gYXZhaWxhYmxlIHRvIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSSB3aXRob3V0IHJ1bm5pbmcKLSAgICAvLyBSVU5fQUxMX1RFU1RTLgotICAgIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7Ci0KLSAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3IgWE1MIG91dHB1dC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXNlcnMKLSAgICAvLyB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dCBiZWZvcmUgaW52b2tpbmcgUlVOX0FMTF9URVNUUy4KLSAgICBDb25maWd1cmVYbWxPdXRwdXQoKTsKLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4KLSAgICBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotICB9Ci19Ci0KLS8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBuYW1lIG9mIGEgVGVzdENhc2UgYWdhaW5zdCBhIGtub3duCi0vLyB2YWx1ZS4KLS8vCi0vLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcyBvbmx5LiAgV2UgcHV0Ci0vLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKLS8vIG5hbWVzcGFjZS4KLS8vCi0vLyBUZXN0Q2FzZU5hbWVJcyBpcyBjb3B5YWJsZS4KLWNsYXNzIFRlc3RDYXNlTmFtZUlzIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBleHBsaWNpdCBUZXN0Q2FzZU5hbWVJcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKLSAgICAgIDogbmFtZV8obmFtZSkge30KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBuYW1lIG9mIHRlc3RfY2FzZSBtYXRjaGVzIG5hbWVfLgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X2Nhc2UgIT0gTlVMTCAmJiBzdHJjbXAodGVzdF9jYXNlLT5uYW1lKCksIG5hbWVfLmNfc3RyKCkpID09IDA7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotfTsKLQotLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKLS8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4gIEl0J3MgdGhlIENBTExFUidTCi0vLyBSRVNQT05TSUJJTElUWSB0byBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIFdIRU4gVEhFCi0vLyBURVNUUyBBUkUgTk9UIFNIVUZGTEVELgotLy8KLS8vIEFyZ3VtZW50czoKLS8vCi0vLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLS8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgotLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCi0vLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKLVRlc3RDYXNlKiBVbml0VGVzdEltcGw6OkdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykgewotICAvLyBDYW4gd2UgZmluZCBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWU/Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHRlc3RfY2FzZSA9Ci0gICAgICBzdGQ6OmZpbmRfaWYodGVzdF9jYXNlc18uYmVnaW4oKSwgdGVzdF9jYXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgVGVzdENhc2VOYW1lSXModGVzdF9jYXNlX25hbWUpKTsKLQotICBpZiAodGVzdF9jYXNlICE9IHRlc3RfY2FzZXNfLmVuZCgpKQotICAgIHJldHVybiAqdGVzdF9jYXNlOwotCi0gIC8vIE5vLiAgTGV0J3MgY3JlYXRlIG9uZS4KLSAgVGVzdENhc2UqIGNvbnN0IG5ld190ZXN0X2Nhc2UgPQotICAgICAgbmV3IFRlc3RDYXNlKHRlc3RfY2FzZV9uYW1lLCB0eXBlX3BhcmFtLCBzZXRfdXBfdGMsIHRlYXJfZG93bl90Yyk7Ci0KLSAgLy8gSXMgdGhpcyBhIGRlYXRoIHRlc3QgY2FzZT8KLSAgaWYgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWF0aFRlc3RDYXNlRmlsdGVyKSkgewotICAgIC8vIFllcy4gIEluc2VydHMgdGhlIHRlc3QgY2FzZSBhZnRlciB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UKLSAgICAvLyBkZWZpbmVkIHNvIGZhci4gIFRoaXMgb25seSB3b3JrcyB3aGVuIHRoZSB0ZXN0IGNhc2VzIGhhdmVuJ3QKLSAgICAvLyBiZWVuIHNodWZmbGVkLiAgT3RoZXJ3aXNlIHdlIG1heSBlbmQgdXAgcnVubmluZyBhIGRlYXRoIHRlc3QKLSAgICAvLyBhZnRlciBhIG5vbi1kZWF0aCB0ZXN0LgotICAgICsrbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOwotICAgIHRlc3RfY2FzZXNfLmluc2VydCh0ZXN0X2Nhc2VzXy5iZWdpbigpICsgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfLAotICAgICAgICAgICAgICAgICAgICAgICBuZXdfdGVzdF9jYXNlKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBOby4gIEFwcGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICB0ZXN0X2Nhc2VzXy5wdXNoX2JhY2sobmV3X3Rlc3RfY2FzZSk7Ci0gIH0KLQotICB0ZXN0X2Nhc2VfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlX2luZGljZXNfLnNpemUoKSkpOwotICByZXR1cm4gbmV3X3Rlc3RfY2FzZTsKLX0KLQotLy8gSGVscGVycyBmb3Igc2V0dGluZyB1cCAvIHRlYXJpbmcgZG93biB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuICBUaGV5Ci0vLyBhcmUgZm9yIHVzZSBpbiB0aGUgRm9yRWFjaCgpIGZ1bmN0aW9uLgotc3RhdGljIHZvaWQgU2V0VXBFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+U2V0VXAoKTsgfQotc3RhdGljIHZvaWQgVGVhckRvd25FbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+VGVhckRvd24oKTsgfQotCi0vLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAotLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMKLS8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGUgdGVzdCBpcyBjb25zaWRlcmVkIHRvIGJlIGZhaWxlZCwgYnV0IHRoZQotLy8gcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZSBydW4uCi0vLwotLy8gV2hlbiBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBlbmFibGVkLCBpdCBleHBhbmRzIGFuZCByZWdpc3RlcnMKLS8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgZmlyc3QgaW4gUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKS4KLS8vIEFsbCBvdGhlciBmdW5jdGlvbnMgY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMoKSBtYXkgc2FmZWx5IGFzc3VtZSB0aGF0Ci0vLyBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSByZWFkeSB0byBiZSBjb3VudGVkIGFuZCBydW4uCi1ib29sIFVuaXRUZXN0SW1wbDo6UnVuQWxsVGVzdHMoKSB7Ci0gIC8vIE1ha2VzIHN1cmUgSW5pdEdvb2dsZVRlc3QoKSB3YXMgY2FsbGVkLgotICBpZiAoIUdUZXN0SXNJbml0aWFsaXplZCgpKSB7Ci0gICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoCi0gICAgICAgICIlcyIsCi0gICAgICAgICJcblRoaXMgdGVzdCBwcm9ncmFtIGRpZCBOT1QgY2FsbCA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0ICIKLSAgICAgICAgImJlZm9yZSBjYWxsaW5nIFJVTl9BTExfVEVTVFMoKS4gIFBsZWFzZSBmaXggaXQuXG4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBTZXQgcGVyLXRocmVhZCBkYXRhIGluIGNhc2UgVW5pdFRlc3RJbXBsIHdhcyBpbnN0YW50aWF0ZWQgb24gYSBkaWZmZXJlbnQKLSAgLy8gdGhyZWFkIHRoYW4gUnVuQWxsVGVzdHMuCi0gIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uc2V0KAotICAgICAgJmRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyk7Ci0KLSAgLy8gRG8gbm90IHJ1biBhbnkgdGVzdCBpZiB0aGUgLS1oZWxwIGZsYWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgKGdfaGVscF9mbGFnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIFJlcGVhdHMgdGhlIGNhbGwgdG8gdGhlIHBvc3QtZmxhZyBwYXJzaW5nIGluaXRpYWxpemF0aW9uIGluIGNhc2UgdGhlCi0gIC8vIHVzZXIgZGlkbid0IGNhbGwgSW5pdEdvb2dsZVRlc3QuCi0gIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKLQotICAvLyBFdmVuIGlmIHNoYXJkaW5nIGlzIG5vdCBvbiwgdGVzdCBydW5uZXJzIG1heSB3YW50IHRvIHVzZSB0aGUKLSAgLy8gR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgdG8gcXVlcnkgd2hldGhlciB0aGUgdGVzdCBzdXBwb3J0cyB0aGUgc2hhcmRpbmcKLSAgLy8gcHJvdG9jb2wuCi0gIGludGVybmFsOjpXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKLQotICAvLyBUcnVlIGlmZiB3ZSBhcmUgaW4gYSBzdWJwcm9jZXNzIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUtc3R5bGUKLSAgLy8gZGVhdGggdGVzdC4KLSAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gZmFsc2U7Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpOwotIyBpZiBkZWZpbmVkKEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ0hJTERfU0VUVVBfKQotICBpZiAoaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgewotICAgIEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ0hJTERfU0VUVVBfKCk7Ci0gIH0KLSMgZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DSElMRF9TRVRVUF8pCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSAgY29uc3QgYm9vbCBzaG91bGRfc2hhcmQgPSBTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7Ci0KLSAgLy8gQ29tcGFyZXMgdGhlIGZ1bGwgdGVzdCBuYW1lcyB3aXRoIHRoZSBmaWx0ZXIgdG8gZGVjaWRlIHdoaWNoCi0gIC8vIHRlc3RzIHRvIHJ1bi4KLSAgY29uc3QgYm9vbCBoYXNfdGVzdHNfdG9fcnVuID0gRmlsdGVyVGVzdHMoc2hvdWxkX3NoYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIT05PUl9TSEFSRElOR19QUk9UT0NPTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MKSA+IDA7Ci0KLSAgLy8gTGlzdHMgdGhlIHRlc3RzIGFuZCBleGl0cyBpZiB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHsKLSAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlciogRmlsdGVyVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSkgPwotICAgICAgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSA6IDA7Ci0KLSAgLy8gVHJ1ZSBpZmYgYXQgbGVhc3Qgb25lIHRlc3QgaGFzIGZhaWxlZC4KLSAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKLQotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBsaXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKTsKLQotICBzdGFydF90aW1lc3RhbXBfID0gR2V0VGltZUluTWlsbGlzKCk7Ci0gIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtU3RhcnQoKnBhcmVudF8pOwotCi0gIC8vIEhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgdGVzdHM/ICBXZSBkb24ndCB3YW50IHRvIHJlcGVhdCB0aGVtCi0gIC8vIHdoZW4gd2UgYXJlIGluc2lkZSB0aGUgc3VicHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QuCi0gIGNvbnN0IGludCByZXBlYXQgPSBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID8gMSA6IEdURVNUX0ZMQUcocmVwZWF0KTsKLSAgLy8gUmVwZWF0cyBmb3JldmVyIGlmIHRoZSByZXBlYXQgY291bnQgaXMgbmVnYXRpdmUuCi0gIGNvbnN0IGJvb2wgZm9yZXZlciA9IHJlcGVhdCA8IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBmb3JldmVyIHx8IGkgIT0gcmVwZWF0OyBpKyspIHsKLSAgICAvLyBXZSB3YW50IHRvIHByZXNlcnZlIGZhaWx1cmVzIGdlbmVyYXRlZCBieSBhZC1ob2MgdGVzdAotICAgIC8vIGFzc2VydGlvbnMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKS4KLSAgICBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpOwotCi0gICAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gR2V0VGltZUluTWlsbGlzKCk7Ci0KLSAgICAvLyBTaHVmZmxlcyB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyBpZiByZXF1ZXN0ZWQuCi0gICAgaWYgKGhhc190ZXN0c190b19ydW4gJiYgR1RFU1RfRkxBRyhzaHVmZmxlKSkgewotICAgICAgcmFuZG9tKCktPlJlc2VlZChyYW5kb21fc2VlZF8pOwotICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBPblRlc3RJdGVyYXRpb25TdGFydCgpLAotICAgICAgLy8gc3VjaCB0aGF0IGEgdGVzdCBldmVudCBsaXN0ZW5lciBjYW4gc2VlIHRoZSBhY3R1YWwgdGVzdCBvcmRlcgotICAgICAgLy8gaW4gdGhlIGV2ZW50LgotICAgICAgU2h1ZmZsZVRlc3RzKCk7Ci0gICAgfQotCi0gICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCB0aGUgdGVzdHMgYXJlIGFib3V0IHRvIHN0YXJ0LgotICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25TdGFydCgqcGFyZW50XywgaSk7Ci0KLSAgICAvLyBSdW5zIGVhY2ggdGVzdCBjYXNlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0ZXN0IHRvIHJ1bi4KLSAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1bikgewotICAgICAgLy8gU2V0cyB1cCBhbGwgZW52aXJvbm1lbnRzIGJlZm9yZWhhbmQuCi0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KCpwYXJlbnRfKTsKLSAgICAgIEZvckVhY2goZW52aXJvbm1lbnRzXywgU2V0VXBFbnZpcm9ubWVudCk7Ci0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcEVuZCgqcGFyZW50Xyk7Ci0KLSAgICAgIC8vIFJ1bnMgdGhlIHRlc3RzIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmUgZHVyaW5nIGdsb2JhbAotICAgICAgLy8gc2V0LXVwLgotICAgICAgaWYgKCFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICBmb3IgKGludCB0ZXN0X2luZGV4ID0gMDsgdGVzdF9pbmRleCA8IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOwotICAgICAgICAgICAgIHRlc3RfaW5kZXgrKykgewotICAgICAgICAgIEdldE11dGFibGVUZXN0Q2FzZSh0ZXN0X2luZGV4KS0+UnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGVhcnMgZG93biBhbGwgZW52aXJvbm1lbnRzIGluIHJldmVyc2Ugb3JkZXIgYWZ0ZXJ3YXJkcy4KLSAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoKnBhcmVudF8pOwotICAgICAgc3RkOjpmb3JfZWFjaChlbnZpcm9ubWVudHNfLnJiZWdpbigpLCBlbnZpcm9ubWVudHNfLnJlbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgVGVhckRvd25FbnZpcm9ubWVudCk7Ci0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCgqcGFyZW50Xyk7Ci0gICAgfQotCi0gICAgZWxhcHNlZF90aW1lXyA9IEdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQ7Ci0KLSAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgdGhlIHRlc3RzIGhhdmUganVzdCBmaW5pc2hlZC4KLSAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uRW5kKCpwYXJlbnRfLCBpKTsKLQotICAgIC8vIEdldHMgdGhlIHJlc3VsdCBhbmQgY2xlYXJzIGl0LgotICAgIGlmICghUGFzc2VkKCkpIHsKLSAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHRlc3Qgb3JkZXIgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi4gIFRoaXMKLSAgICAvLyBhbGxvd3MgdGhlIHVzZXIgdG8gcXVpY2tseSByZXBybyBhIGZhaWx1cmUgdGhhdCBoYXBwZW5zIGluIHRoZQotICAgIC8vIE4tdGggaXRlcmF0aW9uIHdpdGhvdXQgcmVwZWF0aW5nIHRoZSBmaXJzdCAoTiAtIDEpIGl0ZXJhdGlvbnMuCi0gICAgLy8gVGhpcyBpcyBub3QgZW5jbG9zZWQgaW4gImlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7IC4uLiB9IiwgaW4KLSAgICAvLyBjYXNlIHRoZSB1c2VyIHNvbWVob3cgY2hhbmdlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgc29tZXdoZXJlCi0gICAgLy8gKGl0J3MgYWx3YXlzIHNhZmUgdG8gdW5zaHVmZmxlIHRoZSB0ZXN0cykuCi0gICAgVW5zaHVmZmxlVGVzdHMoKTsKLQotICAgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7Ci0gICAgICAvLyBQaWNrcyBhIG5ldyByYW5kb20gc2VlZCBmb3IgZWFjaCBpdGVyYXRpb24uCi0gICAgICByYW5kb21fc2VlZF8gPSBHZXROZXh0UmFuZG9tU2VlZChyYW5kb21fc2VlZF8pOwotICAgIH0KLSAgfQotCi0gIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtRW5kKCpwYXJlbnRfKTsKLQotICByZXR1cm4gIWZhaWxlZDsKLX0KLQotLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQotLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCi0vLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90Ci0vLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgotdm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHRlc3Rfc2hhcmRfZmlsZSA9IHBvc2l4OjpHZXRFbnYoa1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOwotICBpZiAodGVzdF9zaGFyZF9maWxlICE9IE5VTEwpIHsKLSAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKHRlc3Rfc2hhcmRfZmlsZSwgInciKTsKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byB0aGUgdGVzdCBzaGFyZCBzdGF0dXMgZmlsZSBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIGJ5IHRoZSAlcyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgIHRlc3Rfc2hhcmRfZmlsZSwga1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOwotICAgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwotICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgICBwb3NpeDo6RkNsb3NlKGZpbGUpOwotICB9Ci0KLX0KLQotLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50Ci0vLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCi0vLyBidXQgaW5jb25zaXN0ZW50IChpLmUuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKLS8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKLS8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKLS8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgotYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfZW52LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZF9pbmRleF9lbnYsCi0gICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgewotICBpZiAoaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0jaWYgR1RFU1RfT1NfU1RBUkJPQVJECi0gIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IEdURVNUX0ZMQUcodG90YWxfc2hhcmRzKTsKLSAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBHVEVTVF9GTEFHKHNoYXJkX2luZGV4KTsKLSNlbHNlICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLSAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gSW50MzJGcm9tRW52T3JEaWUodG90YWxfc2hhcmRzX2VudiwgLTEpOwotICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKHNoYXJkX2luZGV4X2VudiwgLTEpOwotI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLQotICBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCAhPSAtMSkgewotICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCi0gICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKLSAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiID0gIiA8PCBzaGFyZF9pbmRleAotICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiB1bnNldC5cbiI7Ci0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSAgICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyAhPSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgewotICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCi0gICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKLSAgICAgIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiA9ICIgPDwgdG90YWxfc2hhcmRzCi0gICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOwotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfSBlbHNlIGlmIChzaGFyZF9pbmRleCA8IDAgfHwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSB7Ci0gICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKLSAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogd2UgcmVxdWlyZSAwIDw9ICIKLSAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIDwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzCi0gICAgICA8PCAiLCBidXQgeW91IGhhdmUgIiA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIj0iIDw8IHNoYXJkX2luZGV4Ci0gICAgICA8PCAiLCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIj0iIDw8IHRvdGFsX3NoYXJkcyA8PCAiLlxuIjsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGludGVybmFsOjpwb3NpeDo6Rmx1c2goKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLQotICByZXR1cm4gdG90YWxfc2hhcmRzID4gMTsKLX0KLQotLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YXIgYXMgYW4gSW50MzIuIElmIGl0IGlzIHVuc2V0LAotLy8gcmV0dXJucyBkZWZhdWx0X3ZhbC4gSWYgaXQgaXMgbm90IGFuIEludDMyLCBwcmludHMgYW4gZXJyb3IKLS8vIGFuZCBhYm9ydHMuCi1JbnQzMiBJbnQzMkZyb21FbnZPckRpZShjb25zdCBjaGFyKiB2YXIsIEludDMyIGRlZmF1bHRfdmFsKSB7Ci0gIGNvbnN0IGNoYXIqIHN0cl92YWwgPSBwb3NpeDo6R2V0RW52KHZhcik7Ci0gIGlmIChzdHJfdmFsID09IE5VTEwpIHsKLSAgICByZXR1cm4gZGVmYXVsdF92YWw7Ci0gIH0KLQotICBJbnQzMiByZXN1bHQ7Ci0gIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IHZhciwKLSAgICAgICAgICAgICAgICAgIHN0cl92YWwsICZyZXN1bHQpKSB7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwKLS8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biBvbiB0aGlzIHNoYXJkLiBUaGUgdGVzdCBpZCBpcwotLy8gc29tZSBhcmJpdHJhcnkgYnV0IHVuaXF1ZSBub24tbmVnYXRpdmUgaW50ZWdlciBhc3NpZ25lZCB0byBlYWNoIHRlc3QKLS8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuCi1ib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpIHsKLSAgcmV0dXJuICh0ZXN0X2lkICUgdG90YWxfc2hhcmRzKSA9PSBzaGFyZF9pbmRleDsKLX0KLQotLy8gQ29tcGFyZXMgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0IHdpdGggdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciB0bwotLy8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biwgdGhlbiByZWNvcmRzIHRoZSByZXN1bHQgaW4KLS8vIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KLS8vIElmIHNoYXJkX3Rlc3RzID09IHRydWUsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cyBiYXNlZCBvbiBzaGFyZGluZwotLy8gdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudCAtIHNlZQotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9Hb29nbGVUZXN0QWR2YW5jZWRHdWlkZS4KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3RJbXBsOjpGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpIHsKLSNpZiBHVEVTVF9PU19TVEFSQk9BUkQKLSAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPwotICAgICAgR1RFU1RfRkxBRyh0b3RhbF9zaGFyZHMpIDogLTE7Ci0gIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPwotICAgICAgR1RFU1RfRkxBRyhzaGFyZF9pbmRleCkgOiAtMTsKLSNlbHNlICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLSAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPwotICAgICAgSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RUb3RhbFNoYXJkcywgLTEpIDogLTE7Ci0gIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPwotICAgICAgSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RTaGFyZEluZGV4LCAtMSkgOiAtMTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECi0KLSAgLy8gbnVtX3J1bm5hYmxlX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgd2lsbAotICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuCi0gIC8vIG51bV9zZWxlY3RlZF90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBydW4gb24KLSAgLy8gdGhpcyBzaGFyZC4KLSAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7Ci0gIGludCBudW1fc2VsZWN0ZWRfdGVzdHMgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSA9IHRlc3RfY2FzZS0+bmFtZSgpOwotICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4oZmFsc2UpOwotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKLSAgICAgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07Ci0gICAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X25hbWUodGVzdF9pbmZvLT5uYW1lKCkpOwotICAgICAgLy8gQSB0ZXN0IGlzIGRpc2FibGVkIGlmIHRlc3QgY2FzZSBuYW1lIG9yIHRlc3QgbmFtZSBtYXRjaGVzCi0gICAgICAvLyBrRGlzYWJsZVRlc3RGaWx0ZXIuCi0gICAgICBjb25zdCBib29sIGlzX2Rpc2FibGVkID0KLSAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKSB8fAotICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKTsKLSAgICAgIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfID0gaXNfZGlzYWJsZWQ7Ci0KLSAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlc19maWx0ZXIgPQotICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7Ci0gICAgICB0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXyA9IG1hdGNoZXNfZmlsdGVyOwotCi0gICAgICBjb25zdCBib29sIGlzX3J1bm5hYmxlID0KLSAgICAgICAgICAoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgfHwgIWlzX2Rpc2FibGVkKSAmJgotICAgICAgICAgIG1hdGNoZXNfZmlsdGVyOwotCi0gICAgICBjb25zdCBib29sIGlzX3NlbGVjdGVkID0gaXNfcnVubmFibGUgJiYKLSAgICAgICAgICAoc2hhcmRfdGVzdHMgPT0gSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MIHx8Ci0gICAgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5uYWJsZV90ZXN0cykpOwotCi0gICAgICBudW1fcnVubmFibGVfdGVzdHMgKz0gaXNfcnVubmFibGU7Ci0gICAgICBudW1fc2VsZWN0ZWRfdGVzdHMgKz0gaXNfc2VsZWN0ZWQ7Ci0KLSAgICAgIHRlc3RfaW5mby0+c2hvdWxkX3J1bl8gPSBpc19zZWxlY3RlZDsKLSAgICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4odGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgfHwgaXNfc2VsZWN0ZWQpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVtX3NlbGVjdGVkX3Rlc3RzOwotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIEMtc3RyaW5nIG9uIGEgc2luZ2xlIGxpbmUgYnkgcmVwbGFjaW5nIGFsbCAnXG4nCi0vLyBjaGFyYWN0ZXJzIHdpdGggc3RyaW5nICJcXG4iLiAgSWYgdGhlIG91dHB1dCB0YWtlcyBtb3JlIHRoYW4KLS8vIG1heF9sZW5ndGggY2hhcmFjdGVycywgb25seSBwcmludHMgdGhlIGZpcnN0IG1heF9sZW5ndGggY2hhcmFjdGVycwotLy8gYW5kICIuLi4iLgotc3RhdGljIHZvaWQgUHJpbnRPbk9uZUxpbmUoY29uc3QgY2hhciogc3RyLCBpbnQgbWF4X2xlbmd0aCkgewotICBpZiAoc3RyICE9IE5VTEwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgKnN0ciAhPSAnXDAnOyArK3N0cikgewotICAgICAgaWYgKGkgPj0gbWF4X2xlbmd0aCkgewotICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiLi4uIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKCpzdHIgPT0gJ1xuJykgewotICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiXFxuIik7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIlYyIsICpzdHIpOwotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KLXZvaWQgVW5pdFRlc3RJbXBsOjpMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpIHsKLSAgLy8gUHJpbnQgYXQgbW9zdCB0aGlzIG1hbnkgY2hhcmFjdGVycyBmb3IgZWFjaCB0eXBlL3ZhbHVlIHBhcmFtZXRlci4KLSAgY29uc3QgaW50IGtNYXhQYXJhbUxlbmd0aCA9IDI1MDsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOwotICAgIGJvb2wgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKLSAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgICAgIHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKLSAgICAgIGlmICh0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXykgewotICAgICAgICBpZiAoIXByaW50ZWRfdGVzdF9jYXNlX25hbWUpIHsKLSAgICAgICAgICBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gdHJ1ZTsKLSAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiJXMuIiwgdGVzdF9jYXNlLT5uYW1lKCkpOwotICAgICAgICAgIGlmICh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiICAjICVzID0gIiwga1R5cGVQYXJhbUxhYmVsKTsKLSAgICAgICAgICAgIC8vIFdlIHByaW50IHRoZSB0eXBlIHBhcmFtZXRlciBvbiBhIHNpbmdsZSBsaW5lIHRvIG1ha2UKLSAgICAgICAgICAgIC8vIHRoZSBvdXRwdXQgZWFzeSB0byBwYXJzZSBieSBhIHByb2dyYW0uCi0gICAgICAgICAgICBQcmludE9uT25lTGluZSh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSwga01heFBhcmFtTGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiAgJXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7Ci0gICAgICAgIGlmICh0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgewotICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIgICMgJXMgPSAiLCBrVmFsdWVQYXJhbUxhYmVsKTsKLSAgICAgICAgICAvLyBXZSBwcmludCB0aGUgdmFsdWUgcGFyYW1ldGVyIG9uIGEgc2luZ2xlIGxpbmUgdG8gbWFrZSB0aGUKLSAgICAgICAgICAvLyBvdXRwdXQgZWFzeSB0byBwYXJzZSBieSBhIHByb2dyYW0uCi0gICAgICAgICAgUHJpbnRPbk9uZUxpbmUodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpLCBrTWF4UGFyYW1MZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCJcbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7Ci19Ci0KLS8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4KLS8vCi0vLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgYXJlCi0vLyB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUgaW5wdXQgdGhlCi0vLyBjdXJyZW50IGdldHRlci4KLXZvaWQgVW5pdFRlc3RJbXBsOjpzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKAotICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKSB7Ci0gIGlmIChvc19zdGFja190cmFjZV9nZXR0ZXJfICE9IGdldHRlcikgewotICAgIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOwotICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBnZXR0ZXI7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7Ci0vLyBvdGhlcndpc2UsIGNyZWF0ZXMgYW4gT3NTdGFja1RyYWNlR2V0dGVyLCBtYWtlcyBpdCB0aGUgY3VycmVudAotLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KLU9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogVW5pdFRlc3RJbXBsOjpvc19zdGFja190cmFjZV9nZXR0ZXIoKSB7Ci0gIGlmIChvc19zdGFja190cmFjZV9nZXR0ZXJfID09IE5VTEwpIHsKLSNpZmRlZiBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfCi0gICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfOwotI2Vsc2UKLSAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gbmV3IE9zU3RhY2tUcmFjZUdldHRlcjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1RBQ0tfVFJBQ0VfR0VUVEVSXwotICB9Ci0KLSAgcmV0dXJuIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Ci19Ci0KLS8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKLS8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotVGVzdFJlc3VsdCogVW5pdFRlc3RJbXBsOjpjdXJyZW50X3Rlc3RfcmVzdWx0KCkgewotICByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fID8KLSAgICAgICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKSA6ICZhZF9ob2NfdGVzdF9yZXN1bHRfOwotfQotCi0vLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCi0vLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCi12b2lkIFVuaXRUZXN0SW1wbDo6U2h1ZmZsZVRlc3RzKCkgewotICAvLyBTaHVmZmxlcyB0aGUgZGVhdGggdGVzdCBjYXNlcy4KLSAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCAwLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKLQotICAvLyBTaHVmZmxlcyB0aGUgbm9uLWRlYXRoIHRlc3QgY2FzZXMuCi0gIFNodWZmbGVSYW5nZShyYW5kb20oKSwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7Ci0KLSAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluc2lkZSBlYWNoIHRlc3QgY2FzZS4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgewotICAgIHRlc3RfY2FzZXNfW2ldLT5TaHVmZmxlVGVzdHMocmFuZG9tKCkpOwotICB9Ci19Ci0KLS8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCi12b2lkIFVuaXRUZXN0SW1wbDo6VW5zaHVmZmxlVGVzdHMoKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAvLyBVbnNodWZmbGVzIHRoZSB0ZXN0cyBpbiBlYWNoIHRlc3QgY2FzZS4KLSAgICB0ZXN0X2Nhc2VzX1tpXS0+VW5zaHVmZmxlVGVzdHMoKTsKLSAgICAvLyBSZXNldHMgdGhlIGluZGV4IG9mIGVhY2ggdGVzdCBjYXNlLgotICAgIHRlc3RfY2FzZV9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KLS8vCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQotLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKLS8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAotLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKLS8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbgotLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lgotc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChVbml0VGVzdCogLyp1bml0X3Rlc3QqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpIHsKLSAgLy8gV2UgcGFzcyBza2lwX2NvdW50ICsgMSB0byBza2lwIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpbiBhZGRpdGlvbgotICAvLyB0byB3aGF0IHRoZSB1c2VyIHJlYWxseSB3YW50cyB0byBza2lwLgotICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3Aoc2tpcF9jb3VudCArIDEpOwotfQotCi0vLyBVc2VkIGJ5IHRoZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfIG1hY3JvIHRvCi0vLyBzdXBwcmVzcyB1bnJlYWNoYWJsZSBjb2RlIHdhcm5pbmdzLgotbmFtZXNwYWNlIHsKLWNsYXNzIENsYXNzVW5pcXVlVG9BbHdheXNUcnVlIHt9OwotfQotCi1ib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9Ci0KLWJvb2wgQWx3YXlzVHJ1ZSgpIHsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICAvLyBUaGlzIGNvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2Ugc28gQWx3YXlzVHJ1ZSgpIG5ldmVyIGFjdHVhbGx5IHRocm93cywKLSAgLy8gYnV0IGl0IG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGF0IGl0IG1heSB0aHJvdy4KLSAgaWYgKElzVHJ1ZShmYWxzZSkpCi0gICAgdGhyb3cgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUoKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0Ci0vLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKLS8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KLWJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKSB7Ci0gIGNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7Ci0gIGlmIChzdHJuY21wKCpwc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApIHsKLSAgICAqcHN0ciArPSBwcmVmaXhfbGVuOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlCi0vLyB0aGUgZm9ybWF0ICItLWZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlICI9dmFsdWUiCi0vLyBwYXJ0IGNhbiBiZSBvbWl0dGVkLgotLy8KLS8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLWNvbnN0IGNoYXIqIFBhcnNlRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgewotICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KLSAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLSIgZm9sbG93ZWQgYnkgR1RFU1RfRkxBR19QUkVGSVhfLgotICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsgZmxhZzsKLSAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7Ci0gIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBOVUxMOwotCi0gIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCi0gIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47Ci0KLSAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCi0gIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7Ci0gICAgcmV0dXJuIGZsYWdfZW5kOwotICB9Ci0KLSAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCi0gIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCi0gIC8vIHRoZSBmbGFnIG5hbWUuCi0gIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOwotCi0gIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCi0gIHJldHVybiBmbGFnX2VuZCArIDE7Ci19Ci0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcgotLy8gIi0tZmxhZz12YWx1ZSIgb3IgIi0tZmxhZyIuCi0vLwotLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBhcyBsb25nIGFzIGl0IGRvZXMKLS8vIG5vdCBzdGFydCB3aXRoICcwJywgJ2YnLCBvciAnRicuCi0vLwotLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpIHsKLSAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCi0gICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZgotLy8gIi0tZmxhZz12YWx1ZSIuCi0vLwotLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCi0vLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KLWJvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpIHsKLSAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOwotCi0gIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCi0gIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KLSAgcmV0dXJuIFBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZmxhZyAtLSIgPDwgZmxhZywKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZSk7Ci19Ci0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKLS8vICItLWZsYWc9dmFsdWUiLgotLy8KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucwotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCi1ib29sIFBhcnNlU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgewotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgotICAqdmFsdWUgPSB2YWx1ZV9zdHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgaGFzIGEgcHJlZml4IHRoYXQgR29vZ2xlIFRlc3QgdXNlcyBmb3IgaXRzCi0vLyBmbGFncywgaS5lLiwgc3RhcnRzIHdpdGggR1RFU1RfRkxBR19QUkVGSVhfIG9yIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLgotLy8gSWYgR29vZ2xlIFRlc3QgZGV0ZWN0cyB0aGF0IGEgY29tbWFuZCBsaW5lIGZsYWcgaGFzIGl0cyBwcmVmaXggYnV0IGlzIG5vdAotLy8gcmVjb2duaXplZCwgaXQgd2lsbCBwcmludCBpdHMgaGVscCBtZXNzYWdlLiBGbGFncyBzdGFydGluZyB3aXRoCi0vLyBHVEVTVF9JTlRFUk5BTF9QUkVGSVhfIGZvbGxvd2VkIGJ5ICJpbnRlcm5hbF8iIGFyZSBjb25zaWRlcmVkIEdvb2dsZSBUZXN0Ci0vLyBpbnRlcm5hbCBmbGFncyBhbmQgZG8gbm90IHRyaWdnZXIgdGhlIGhlbHAgbWVzc2FnZS4KLXN0YXRpYyBib29sIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGNvbnN0IGNoYXIqIHN0cikgewotICByZXR1cm4gKFNraXBQcmVmaXgoIi0tIiwgJnN0cikgfHwKLSAgICAgICAgICBTa2lwUHJlZml4KCItIiwgJnN0cikgfHwKLSAgICAgICAgICBTa2lwUHJlZml4KCIvIiwgJnN0cikpICYmCi0gICAgICAgICAhU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8gImludGVybmFsXyIsICZzdHIpICYmCi0gICAgICAgICAoU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8sICZzdHIpIHx8Ci0gICAgICAgICAgU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXywgJnN0cikpOwotfQotCi0vLyBQcmludHMgYSBzdHJpbmcgY29udGFpbmluZyBjb2RlLWVuY29kZWQgdGV4dC4gIFRoZSBmb2xsb3dpbmcgZXNjYXBlCi0vLyBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjb250cm9sIHRoZSB0ZXh0IGNvbG9yOgotLy8KLS8vICAgQEAgICAgcHJpbnRzIGEgc2luZ2xlICdAJyBjaGFyYWN0ZXIuCi0vLyAgIEBSICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHJlZC4KLS8vICAgQEcgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gZ3JlZW4uCi0vLyAgIEBZICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHllbGxvdy4KLS8vICAgQEQgICAgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0ZXh0IGNvbG9yLgotLy8KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBXcml0ZSB0ZXN0cyBmb3IgdGhpcyBvbmNlIHdlIGFkZCBzdGRvdXQKLS8vIGNhcHR1cmluZyB0byBHb29nbGUgVGVzdC4KLXN0YXRpYyB2b2lkIFByaW50Q29sb3JFbmNvZGVkKGNvbnN0IGNoYXIqIHN0cikgewotICBHVGVzdENvbG9yIGNvbG9yID0gQ09MT1JfREVGQVVMVDsgIC8vIFRoZSBjdXJyZW50IGNvbG9yLgotCi0gIC8vIENvbmNlcHR1YWxseSwgd2Ugc3BsaXQgdGhlIHN0cmluZyBpbnRvIHNlZ21lbnRzIGRpdmlkZWQgYnkgZXNjYXBlCi0gIC8vIHNlcXVlbmNlcy4gIFRoZW4gd2UgcHJpbnQgb25lIHNlZ21lbnQgYXQgYSB0aW1lLiAgQXQgdGhlIGVuZCBvZgotICAvLyBlYWNoIGl0ZXJhdGlvbiwgdGhlIHN0ciBwb2ludGVyIGFkdmFuY2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gIC8vIG5leHQgc2VnbWVudC4KLSAgZm9yICg7OykgewotICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJjaHIoc3RyLCAnQCcpOwotICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RkOjpzdHJpbmcoc3RyLCBwKS5jX3N0cigpKTsKLQotICAgIGNvbnN0IGNoYXIgY2ggPSBwWzFdOwotICAgIHN0ciA9IHAgKyAyOwotICAgIGlmIChjaCA9PSAnQCcpIHsKLSAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICJAIik7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnRCcpIHsKLSAgICAgIGNvbG9yID0gQ09MT1JfREVGQVVMVDsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdSJykgewotICAgICAgY29sb3IgPSBDT0xPUl9SRUQ7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnRycpIHsKLSAgICAgIGNvbG9yID0gQ09MT1JfR1JFRU47Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnWScpIHsKLSAgICAgIGNvbG9yID0gQ09MT1JfWUVMTE9XOwotICAgIH0gZWxzZSB7Ci0gICAgICAtLXN0cjsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIga0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlW10gPQotIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nICIgR1RFU1RfTkFNRV8gIi4gWW91IGNhbiB1c2UgdGhlXG4iCi0iZm9sbG93aW5nIGNvbW1hbmQgbGluZSBmbGFncyB0byBjb250cm9sIGl0cyBiZWhhdmlvcjpcbiIKLSJcbiIKLSJUZXN0IFNlbGVjdGlvbjpcbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BEXG4iCi0iICAgICAgTGlzdCB0aGUgbmFtZXMgb2YgYWxsIHRlc3RzIGluc3RlYWQgb2YgcnVubmluZyB0aGVtLiBUaGUgbmFtZSBvZlxuIgotIiAgICAgIFRFU1QoRm9vLCBCYXIpIGlzIFwiRm9vLkJhclwiLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmaWx0ZXI9QFlQT1NUSVZFX1BBVFRFUk5TIgotICAgICJbQEctQFlORUdBVElWRV9QQVRURVJOU11ARFxuIgotIiAgICAgIFJ1biBvbmx5IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXRcbiIKLSIgICAgICBub25lIG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4gJz8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXI7ICcqJ1xuIgotIiAgICAgIG1hdGNoZXMgYW55IHN1YnN0cmluZzsgJzonIHNlcGFyYXRlcyB0d28gcGF0dGVybnMuXG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzQERcbiIKLSIgICAgICBSdW4gYWxsIGRpc2FibGVkIHRlc3RzIHRvby5cbiIKLSJcbiIKLSJUZXN0IEV4ZWN1dGlvbjpcbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmVwZWF0PUBZW0NPVU5UXUBEXG4iCi0iICAgICAgUnVuIHRoZSB0ZXN0cyByZXBlYXRlZGx5OyB1c2UgYSBuZWdhdGl2ZSBjb3VudCB0byByZXBlYXQgZm9yZXZlci5cbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic2h1ZmZsZUBEXG4iCi0iICAgICAgUmFuZG9taXplIHRlc3RzJyBvcmRlcnMgb24gZXZlcnkgaXRlcmF0aW9uLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyYW5kb21fc2VlZD1AWVtOVU1CRVJdQERcbiIKLSIgICAgICBSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIGZvciBzaHVmZmxpbmcgdGVzdCBvcmRlcnMgKGJldHdlZW4gMSBhbmRcbiIKLSIgICAgICA5OTk5OSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUpLlxuIgotIlxuIgotIlRlc3QgT3V0cHV0OlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjb2xvcj1AWShAR3llc0BZfEBHbm9AWXxAR2F1dG9AWSlARFxuIgotIiAgICAgIEVuYWJsZS9kaXNhYmxlIGNvbG9yZWQgb3V0cHV0LiBUaGUgZGVmYXVsdCBpcyBAR2F1dG9ARC5cbiIKLSIgIC1ARy0iIEdURVNUX0ZMQUdfUFJFRklYXyAicHJpbnRfdGltZT0wQERcbiIKLSIgICAgICBEb24ndCBwcmludCB0aGUgZWxhcHNlZCB0aW1lIG9mIGVhY2ggdGVzdC5cbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAib3V0cHV0PXhtbEBZW0BHOkBZRElSRUNUT1JZX1BBVEhARyIKLSAgICBHVEVTVF9QQVRIX1NFUF8gIkBZfEBHOkBZRklMRV9QQVRIXUBEXG4iCi0iICAgICAgR2VuZXJhdGUgYW4gWE1MIHJlcG9ydCBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG9yIHdpdGggdGhlIGdpdmVuIGZpbGVcbiIKLSIgICAgICBuYW1lLiBAWUZJTEVfUEFUSEBEIGRlZmF1bHRzIHRvIEBHdGVzdF9kZXRhaWxzLnhtbEBELlxuIgotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic3RyZWFtX3Jlc3VsdF90bz1AWUhPU1RARzpAWVBPUlRARFxuIgotIiAgICAgIFN0cmVhbSB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlcnZlci5cbiIKLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotIlxuIgotIkFzc2VydGlvbiBCZWhhdmlvcjpcbiIKLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUwotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJkZWF0aF90ZXN0X3N0eWxlPUBZKEBHZmFzdEBZfEBHdGhyZWFkc2FmZUBZKUBEXG4iCi0iICAgICAgU2V0IHRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuXG4iCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImJyZWFrX29uX2ZhaWx1cmVARFxuIgotIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gZGVidWdnZXIgYnJlYWstcG9pbnRzLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJ0aHJvd19vbl9mYWlsdXJlQERcbiIKLSIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIEMrKyBleGNlcHRpb25zLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjYXRjaF9leGNlcHRpb25zPTBARFxuIgotIiAgICAgIERvIG5vdCByZXBvcnQgZXhjZXB0aW9ucyBhcyB0ZXN0IGZhaWx1cmVzLiBJbnN0ZWFkLCBhbGxvdyB0aGVtXG4iCi0iICAgICAgdG8gY3Jhc2ggdGhlIHByb2dyYW0gb3IgdGhyb3cgYSBwb3AtdXAgKG9uIFdpbmRvd3MpLlxuIgotIlxuIgotIkV4Y2VwdCBmb3IgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQEQsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQgIgotICAgICJ0aGUgY29ycmVzcG9uZGluZ1xuIgotImVudmlyb25tZW50IHZhcmlhYmxlIG9mIGEgZmxhZyAoYWxsIGxldHRlcnMgaW4gdXBwZXItY2FzZSkuIEZvciBleGFtcGxlLCB0b1xuIgotImRpc2FibGUgY29sb3JlZCB0ZXh0IG91dHB1dCwgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8KLSAgICAiY29sb3I9bm9ARCBvciBzZXRcbiIKLSJ0aGUgQEciIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiQ09MT1JARCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBAR25vQEQuXG4iCi0iXG4iCi0iRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIHRoZSAiIEdURVNUX05BTUVfICIgZG9jdW1lbnRhdGlvbiBhdFxuIgotIkBHIiBHVEVTVF9QUk9KRUNUX1VSTF8gIkBELiBJZiB5b3UgZmluZCBhIGJ1ZyBpbiAiIEdURVNUX05BTUVfICJcbiIKLSIobm90IG9uZSBpbiB5b3VyIG93biBjb2RlIG9yIHRlc3RzKSwgcGxlYXNlIHJlcG9ydCBpdCB0b1xuIgotIkBHPCIgR1RFU1RfREVWX0VNQUlMXyAiPkBELlxuIjsKLQotYm9vbCBQYXJzZUdvb2dsZVRlc3RGbGFnKGNvbnN0IGNoYXIqIGNvbnN0IGFyZykgewotICByZXR1cm4gUGFyc2VCb29sRmxhZyhhcmcsIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQnJlYWtPbkZhaWx1cmVGbGFnLAotICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQ2F0Y2hFeGNlcHRpb25zRmxhZywKLSAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrQ29sb3JGbGFnLCAmR1RFU1RfRkxBRyhjb2xvcikpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRGVhdGhUZXN0U3R5bGVGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpKSB8fAotICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtEZWF0aFRlc3RVc2VGb3JrLAotICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSkgfHwKLSAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtGaWx0ZXJGbGFnLCAmR1RFU1RfRkxBRyhmaWx0ZXIpKSB8fAotICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0xpc3RUZXN0c0ZsYWcsICZHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB8fAotICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga091dHB1dEZsYWcsICZHVEVTVF9GTEFHKG91dHB1dCkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1ByaW50VGltZUZsYWcsICZHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB8fAotICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmFuZG9tU2VlZEZsYWcsICZHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgfHwKLSAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JlcGVhdEZsYWcsICZHVEVTVF9GTEFHKHJlcGVhdCkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1NodWZmbGVGbGFnLCAmR1RFU1RfRkxBRyhzaHVmZmxlKSkgfHwKLSAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1N0YWNrVHJhY2VEZXB0aEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrU3RyZWFtUmVzdWx0VG9GbGFnLAotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pKSB8fAotI2lmIEdURVNUX09TX1NUQVJCT0FSRAotICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrVG90YWxTaGFyZHNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcodG90YWxfc2hhcmRzKSkgfHwKLSAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1NoYXJkSW5kZXhGbGFnLAotICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoc2hhcmRfaW5kZXgpKSB8fAotI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrVGhyb3dPbkZhaWx1cmVGbGFnLAotICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSk7Ci19Ci0KLSNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi12b2lkIExvYWRGbGFnc0Zyb21GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIEZJTEUqIGZsYWdmaWxlID0gcG9zaXg6OkZPcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKCFmbGFnZmlsZSkgewotICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKHN0ZGVyciwKLSAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwKLSAgICAgICAgICAgIEdURVNUX0ZMQUcoZmxhZ2ZpbGUpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotICBzdGQ6OnN0cmluZyBjb250ZW50cyhSZWFkRW50aXJlRmlsZShmbGFnZmlsZSkpOwotICBwb3NpeDo6RkNsb3NlKGZsYWdmaWxlKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOwotICBTcGxpdFN0cmluZyhjb250ZW50cywgJ1xuJywgJmxpbmVzKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7ICsraSkgewotICAgIGlmIChsaW5lc1tpXS5lbXB0eSgpKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKCFQYXJzZUdvb2dsZVRlc3RGbGFnKGxpbmVzW2ldLmNfc3RyKCkpKQotICAgICAgZ19oZWxwX2ZsYWcgPSB0cnVlOwotICB9Ci19Ci0jZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KLQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZwotLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuICBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlCi0vLyBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLXZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgewotICBmb3IgKGludCBpID0gMTsgaSA8ICphcmdjOyBpKyspIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZyA9IGFyZ19zdHJpbmcuY19zdHIoKTsKLQotICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUJvb2xGbGFnOwotICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUludDMyRmxhZzsKLSAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VTdHJpbmdGbGFnOwotCi0gICAgYm9vbCByZW1vdmVfZmxhZyA9IGZhbHNlOwotICAgIGlmIChQYXJzZUdvb2dsZVRlc3RGbGFnKGFyZykpIHsKLSAgICAgIHJlbW92ZV9mbGFnID0gdHJ1ZTsKLSNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi0gICAgfSBlbHNlIGlmIChQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRmxhZ2ZpbGVGbGFnLCAmR1RFU1RfRkxBRyhmbGFnZmlsZSkpKSB7Ci0gICAgICBMb2FkRmxhZ3NGcm9tRmlsZShHVEVTVF9GTEFHKGZsYWdmaWxlKSk7Ci0gICAgICByZW1vdmVfZmxhZyA9IHRydWU7Ci0jZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KLSAgICB9IGVsc2UgaWYgKGFyZ19zdHJpbmcgPT0gIi0taGVscCIgfHwgYXJnX3N0cmluZyA9PSAiLWgiIHx8Ci0gICAgICAgICAgICAgICBhcmdfc3RyaW5nID09ICItPyIgfHwgYXJnX3N0cmluZyA9PSAiLz8iIHx8Ci0gICAgICAgICAgICAgICBIYXNHb29nbGVUZXN0RmxhZ1ByZWZpeChhcmcpKSB7Ci0gICAgICAvLyBCb3RoIGhlbHAgZmxhZyBhbmQgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzIChleGNsdWRpbmcKLSAgICAgIC8vIGludGVybmFsIG9uZXMpIHRyaWdnZXIgaGVscCBkaXNwbGF5LgotICAgICAgZ19oZWxwX2ZsYWcgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChyZW1vdmVfZmxhZykgewotICAgICAgLy8gU2hpZnQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndiBsaXN0IGxlZnQgYnkgb25lLiAgTm90ZQotICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZwotICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzCi0gICAgICAvLyB3ZWxsLgotICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgewotICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07Ci0gICAgICB9Ci0KLSAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50LgotICAgICAgKCphcmdjKS0tOwotCi0gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQKLSAgICAgIC8vIGFuIGVsZW1lbnQuCi0gICAgICBpLS07Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdfaGVscF9mbGFnKSB7Ci0gICAgLy8gV2UgcHJpbnQgdGhlIGhlbHAgaGVyZSBpbnN0ZWFkIG9mIGluIFJVTl9BTExfVEVTVFMoKSwgYXMgdGhlCi0gICAgLy8gbGF0dGVyIG1heSBub3QgYmUgY2FsbGVkIGF0IGFsbCBpZiB0aGUgdXNlciBpcyB1c2luZyBHb29nbGUKLSAgICAvLyBUZXN0IHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yay4KLSAgICBQcmludENvbG9yRW5jb2RlZChrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2UpOwotICB9Ci19Ci0KLS8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKLS8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0Lgotdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndikgewotICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOwotfQotdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgewotICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOwotfQotCi0vLyBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgSW5pdEdvb2dsZVRlc3QoKS4KLS8vCi0vLyBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvcgotLy8gd2NoYXJfdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLXZvaWQgSW5pdEdvb2dsZVRlc3RJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7Ci0gIC8vIFdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHR3aWNlLgotICBpZiAoR1Rlc3RJc0luaXRpYWxpemVkKCkpIHJldHVybjsKLQotICBpZiAoKmFyZ2MgPD0gMCkgcmV0dXJuOwotCi0gIGdfYXJndnMuY2xlYXIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgIT0gKmFyZ2M7IGkrKykgewotICAgIGdfYXJndnMucHVzaF9iYWNrKFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKSk7Ci0gIH0KLQotICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoYXJnYywgYXJndik7Ci0gIEdldFVuaXRUZXN0SW1wbCgpLT5Qb3N0RmxhZ1BhcnNpbmdJbml0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKLS8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCi0vLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKLS8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCi0vLwotLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCi0vLyB1cGRhdGVkLgotLy8KLS8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCi12b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKLSNpZiBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLSAgR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKGFyZ2MsIGFyZ3YpOwotI2Vsc2UgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQotICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLX0KLQotLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgotLy8gVU5JQ09ERSBtb2RlLgotdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi0gIEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXyhhcmdjLCBhcmd2KTsKLSNlbHNlICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLSAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjIGIvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwMjgyMi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLUdURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHByaW50ZigiUnVubmluZyBtYWluKCkgZnJvbSBndGVzdF9tYWluLmNjXG4iKTsKLSAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGExM2QuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwLCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0vLwotLy8gVGVzdHMgdGhhdCB2ZXJpZnkgaW50ZXJhY3Rpb24gb2YgZXhjZXB0aW9ucyBhbmQgZGVhdGggdGVzdHMuCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSMgaWYgR1RFU1RfSEFTX1NFSAotIyAgaW5jbHVkZSA8d2luZG93cy5oPiAgICAgICAgICAvLyBGb3IgUmFpc2VFeGNlcHRpb24oKS4KLSMgZW5kaWYKLQotIyBpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotIyBpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0jICBpbmNsdWRlIDxleGNlcHRpb24+ICAvLyBGb3Igc3RkOjpleGNlcHRpb24uCi0KLS8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgcmVwb3J0IHRocm93biBleGNlcHRpb25zIGFzIGZhaWx1cmVzIGFuZCB0aGF0IHRoZQotLy8gZXhjZXB0aW9ucyBkbyBub3QgZXNjYXBlIGRlYXRoIHRlc3QgbWFjcm9zLgotVEVTVChDeHhFeGNlcHRpb25EZWF0aFRlc3QsIEV4Y2VwdGlvbklzRmFpbHVyZSkgewotICB0cnkgewotICAgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSCh0aHJvdyAxLCAiIiksICJ0aHJldyBhbiBleGNlcHRpb24iKTsKLSAgfSBjYXRjaCAoLi4uKSB7ICAvLyBOT0xJTlQKLSAgICBGQUlMKCkgPDwgIkFuIGV4Y2VwdGlvbiBlc2NhcGVkIGEgZGVhdGggdGVzdCBtYWNybyBpbnZvY2F0aW9uICIKLSAgICAgICAgICAgPDwgIndpdGggY2F0Y2hfZXhjZXB0aW9ucyAiCi0gICAgICAgICAgIDw8ICh0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gIH0KLX0KLQotY2xhc3MgVGVzdEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuICJleGNlcHRpb25hbCBtZXNzYWdlIjsgfQotfTsKLQotVEVTVChDeHhFeGNlcHRpb25EZWF0aFRlc3QsIFByaW50c01lc3NhZ2VGb3JTdGRFeGNlcHRpb25zKSB7Ci0gIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGlzIHF1b3RlZCBpbiB0aGUgZmFpbHVyZSB0ZXh0LgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgodGhyb3cgVGVzdEV4Y2VwdGlvbigpLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25hbCBtZXNzYWdlIik7Ci0gIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGxvY2F0aW9uIGlzIG1lbnRpb25lZCBpbiB0aGUgZmFpbHVyZSB0ZXh0LgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgodGhyb3cgVGVzdEV4Y2VwdGlvbigpLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MiKTsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLSMgaWYgR1RFU1RfSEFTX1NFSAotLy8gVGVzdHMgdGhhdCBlbmFibGluZyBpbnRlcmNlcHRpb24gb2YgU0VIIGV4Y2VwdGlvbnMgd2l0aCB0aGUKLS8vIGNhdGNoX2V4Y2VwdGlvbnMgZmxhZyBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBTRUggZXhjZXB0aW9ucyBiZWluZwotLy8gdHJlYXRlZCBhcyBkZWF0aCBieSBkZWF0aCB0ZXN0cy4KLVRFU1QoU2VoRXhjZXB0aW9uRGVhc1Rlc3QsIENhdGNoRXhjZXB0aW9uc0RvZXNOb3RJbnRlcmZlcmUpIHsKLSAgRVhQRUNUX0RFQVRIKFJhaXNlRXhjZXB0aW9uKDQyLCAweDAsIDAsIE5VTEwpLCAiIikKLSAgICAgIDw8ICJ3aXRoIGNhdGNoX2V4Y2VwdGlvbnMgIgotICAgICAgPDwgKHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLX0KLSMgZW5kaWYKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gR1RFU1RfRU5BQkxFX0NBVENIX0VYQ0VQVElPTlNfICE9IDA7Ci0gIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0YTNkMS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRlc3RzIGZvciBkZWF0aCB0ZXN0cy4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCi0KLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlOwotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0jICBpbmNsdWRlIDxkaXJlY3QuaD4gICAgICAgICAgLy8gRm9yIGNoZGlyKCkuCi0jIGVsc2UKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyAgaW5jbHVkZSA8c3lzL3dhaXQuaD4gICAgICAgIC8vIEZvciB3YWl0cGlkLgotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotIyBpbmNsdWRlIDxzaWduYWwuaD4KLSMgaW5jbHVkZSA8c3RkaW8uaD4KLQotIyBpZiBHVEVTVF9PU19MSU5VWAotIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSMgaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgotLy8gaGlzIGNvZGUuCi0jIGRlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotIyBpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jIHVuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgcG9zaXggPSA6OnRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDsKLQotdXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGaWxlUGF0aDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRMYXN0RXJybm9EZXNjcmlwdGlvbjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRVbml0VGVzdEltcGw7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW5EZWF0aFRlc3RDaGlsZDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpQYXJzZU5hdHVyYWxOdW1iZXI7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEEgaGVscGVyIGNsYXNzIHdob3NlIG9iamVjdHMgcmVwbGFjZSB0aGUgZGVhdGggdGVzdCBmYWN0b3J5IGZvciBhCi0vLyBzaW5nbGUgVW5pdFRlc3Qgb2JqZWN0IGR1cmluZyB0aGVpciBsaWZldGltZXMuCi1jbGFzcyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShEZWF0aFRlc3RGYWN0b3J5KiBuZXdfZmFjdG9yeSkKLSAgICAgIDogdW5pdF90ZXN0X2ltcGxfKEdldFVuaXRUZXN0SW1wbCgpKSB7Ci0gICAgb2xkX2ZhY3RvcnlfID0gdW5pdF90ZXN0X2ltcGxfLT5kZWF0aF90ZXN0X2ZhY3RvcnlfLnJlbGVhc2UoKTsKLSAgICB1bml0X3Rlc3RfaW1wbF8tPmRlYXRoX3Rlc3RfZmFjdG9yeV8ucmVzZXQobmV3X2ZhY3RvcnkpOwotICB9Ci0KLSAgflJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KCkgewotICAgIHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZWxlYXNlKCk7Ci0gICAgdW5pdF90ZXN0X2ltcGxfLT5kZWF0aF90ZXN0X2ZhY3RvcnlfLnJlc2V0KG9sZF9mYWN0b3J5Xyk7Ci0gIH0KLSBwcml2YXRlOgotICAvLyBQcmV2ZW50cyBjb3B5aW5nIFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5IG9iamVjdHMuCi0gIFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KGNvbnN0IFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5Jik7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5Jik7Ci0KLSAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3RfaW1wbF87Ci0gIERlYXRoVGVzdEZhY3RvcnkqIG9sZF9mYWN0b3J5XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotdm9pZCBEaWVXaXRoTWVzc2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOwotICBmZmx1c2goc3RkZXJyKTsgIC8vIE1ha2Ugc3VyZSB0aGUgdGV4dCBpcyBwcmludGVkIGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cy4KLQotICAvLyBXZSBjYWxsIF9leGl0KCkgaW5zdGVhZCBvZiBleGl0KCksIGFzIHRoZSBmb3JtZXIgaXMgYSBkaXJlY3QKLSAgLy8gc3lzdGVtIGNhbGwgYW5kIHRodXMgc2FmZXIgaW4gdGhlIHByZXNlbmNlIG9mIHRocmVhZHMuICBleGl0KCkKLSAgLy8gd2lsbCBpbnZva2UgdXNlci1kZWZpbmVkIGV4aXQtaG9va3MsIHdoaWNoIG1heSBkbyBkYW5nZXJvdXMKLSAgLy8gdGhpbmdzIHRoYXQgY29uZmxpY3Qgd2l0aCBkZWF0aCB0ZXN0cy4KLSAgLy8KLSAgLy8gU29tZSBjb21waWxlcnMgY2FuIHJlY29nbml6ZSB0aGF0IF9leGl0KCkgbmV2ZXIgcmV0dXJucyBhbmQgaXNzdWUgdGhlCi0gIC8vICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIGZvbGxvd2luZyB0aGlzIGZ1bmN0aW9uLCB1bmxlc3MKLSAgLy8gZm9vbGVkIGJ5IGEgZmFrZSBjb25kaXRpb24uCi0gIGlmIChBbHdheXNUcnVlKCkpCi0gICAgX2V4aXQoMSk7Ci19Ci0KLXZvaWQgRGllSW5zaWRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGZ1bmN0aW9uKSB7Ci0gIERpZVdpdGhNZXNzYWdlKCJkZWF0aCBpbnNpZGUgIiArIGZ1bmN0aW9uICsgIigpLiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHdvcmsuCi0KLWNsYXNzIFRlc3RGb3JEZWF0aFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBUZXN0Rm9yRGVhdGhUZXN0KCkgOiBvcmlnaW5hbF9kaXJfKEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkpIHt9Ci0KLSAgdmlydHVhbCB+VGVzdEZvckRlYXRoVGVzdCgpIHsKLSAgICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfZGlyXy5jX3N0cigpKTsKLSAgfQotCi0gIC8vIEEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiB0aGF0J3MgZXhwZWN0ZWQgdG8gZGllLgotICBzdGF0aWMgdm9pZCBTdGF0aWNNZW1iZXJGdW5jdGlvbigpIHsgRGllSW5zaWRlKCJTdGF0aWNNZW1iZXJGdW5jdGlvbiIpOyB9Ci0KLSAgLy8gQSBtZXRob2Qgb2YgdGhlIHRlc3QgZml4dHVyZSB0aGF0IG1heSBkaWUuCi0gIHZvaWQgTWVtYmVyRnVuY3Rpb24oKSB7Ci0gICAgaWYgKHNob3VsZF9kaWVfKQotICAgICAgRGllSW5zaWRlKCJNZW1iZXJGdW5jdGlvbiIpOwotICB9Ci0KLSAgLy8gVHJ1ZSBpZmYgTWVtYmVyRnVuY3Rpb24oKSBzaG91bGQgZGllLgotICBib29sIHNob3VsZF9kaWVfOwotICBjb25zdCBGaWxlUGF0aCBvcmlnaW5hbF9kaXJfOwotfTsKLQotLy8gQSBjbGFzcyB3aXRoIGEgbWVtYmVyIGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KLWNsYXNzIE1heURpZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNYXlEaWUoYm9vbCBzaG91bGRfZGllKSA6IHNob3VsZF9kaWVfKHNob3VsZF9kaWUpIHt9Ci0KLSAgLy8gQSBtZW1iZXIgZnVuY3Rpb24gdGhhdCBtYXkgZGllLgotICB2b2lkIE1lbWJlckZ1bmN0aW9uKCkgY29uc3QgewotICAgIGlmIChzaG91bGRfZGllXykKLSAgICAgIERpZUluc2lkZSgiTWF5RGllOjpNZW1iZXJGdW5jdGlvbiIpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUcnVlIGlmZiBNZW1iZXJGdW5jdGlvbigpIHNob3VsZCBkaWUuCi0gIGJvb2wgc2hvdWxkX2RpZV87Ci19OwotCi0vLyBBIGdsb2JhbCBmdW5jdGlvbiB0aGF0J3MgZXhwZWN0ZWQgdG8gZGllLgotdm9pZCBHbG9iYWxGdW5jdGlvbigpIHsgRGllSW5zaWRlKCJHbG9iYWxGdW5jdGlvbiIpOyB9Ci0KLS8vIEEgbm9uLXZvaWQgZnVuY3Rpb24gdGhhdCdzIGV4cGVjdGVkIHRvIGRpZS4KLWludCBOb25Wb2lkRnVuY3Rpb24oKSB7Ci0gIERpZUluc2lkZSgiTm9uVm9pZEZ1bmN0aW9uIik7Ci0gIHJldHVybiAxOwotfQotCi0vLyBBIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KLXZvaWQgRGllSWYoYm9vbCBzaG91bGRfZGllKSB7Ci0gIGlmIChzaG91bGRfZGllKQotICAgIERpZUluc2lkZSgiRGllSWYiKTsKLX0KLQotLy8gQSBiaW5hcnkgZnVuY3Rpb24gdGhhdCBtYXkgZGllLgotYm9vbCBEaWVJZkxlc3NUaGFuKGludCB4LCBpbnQgeSkgewotICBpZiAoeCA8IHkpIHsKLSAgICBEaWVJbnNpZGUoIkRpZUlmTGVzc1RoYW4iKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVBVEggY2FuIGJlIHVzZWQgb3V0c2lkZSBhIFRFU1QsIFRFU1RfRiwgb3IgdGVzdCBmaXh0dXJlLgotdm9pZCBEZWF0aFRlc3RTdWJyb3V0aW5lKCkgewotICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgImRlYXRoLipHbG9iYWxGdW5jdGlvbiIpOwotICBBU1NFUlRfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgImRlYXRoLipHbG9iYWxGdW5jdGlvbiIpOwotfQotCi0vLyBEZWF0aCBpbiBkYmcsIG5vdCBvcHQuCi1pbnQgRGllSW5EZWJ1Z0Vsc2UxMihpbnQqIHNpZGVlZmZlY3QpIHsKLSAgaWYgKHNpZGVlZmZlY3QpICpzaWRlZWZmZWN0ID0gMTI7Ci0KLSMgaWZuZGVmIE5ERUJVRwotCi0gIERpZUluc2lkZSgiRGllSW5EZWJ1Z0Vsc2UxMiIpOwotCi0jIGVuZGlmICAvLyBOREVCVUcKLQotICByZXR1cm4gMTI7Ci19Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0vLyBUZXN0cyB0aGUgRXhpdGVkV2l0aENvZGUgcHJlZGljYXRlLgotVEVTVChFeGl0U3RhdHVzUHJlZGljYXRlVGVzdCwgRXhpdGVkV2l0aENvZGUpIHsKLSAgLy8gT24gV2luZG93cywgdGhlIHByb2Nlc3MncyBleGl0IGNvZGUgaXMgdGhlIHNhbWUgYXMgaXRzIGV4aXQgc3RhdHVzLAotICAvLyBzbyB0aGUgcHJlZGljYXRlIGp1c3QgY29tcGFyZXMgdGhlIGl0cyBpbnB1dCB3aXRoIGl0cyBwYXJhbWV0ZXIuCi0gIEVYUEVDVF9UUlVFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApKDApKTsKLSAgRVhQRUNUX1RSVUUodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMSkoMSkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSg0MikoNDIpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpKDApKTsKLX0KLQotIyBlbHNlCi0KLS8vIFJldHVybnMgdGhlIGV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyB0aGF0IGNhbGxzIF9leGl0KDIpIHdpdGggYQotLy8gZ2l2ZW4gZXhpdCBjb2RlLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlCi0vLyBFeGl0U3RhdHVzUHJlZGljYXRlVGVzdCB0ZXN0IHN1aXRlLgotc3RhdGljIGludCBOb3JtYWxFeGl0U3RhdHVzKGludCBleGl0X2NvZGUpIHsKLSAgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOwotICBpZiAoY2hpbGRfcGlkID09IDApIHsKLSAgICBfZXhpdChleGl0X2NvZGUpOwotICB9Ci0gIGludCBzdGF0dXM7Ci0gIHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLy8gUmV0dXJucyB0aGUgZXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIHRoYXQgcmFpc2VzIGEgZ2l2ZW4gc2lnbmFsLgotLy8gSWYgdGhlIHNpZ25hbCBkb2VzIG5vdCBjYXVzZSB0aGUgcHJvY2VzcyB0byBkaWUsIHRoZW4gaXQgcmV0dXJucwotLy8gaW5zdGVhZCB0aGUgZXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIHRoYXQgZXhpdHMgbm9ybWFsbHkgd2l0aCBleGl0Ci0vLyBjb2RlIDEuICBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QKLS8vIHRlc3Qgc3VpdGUuCi1zdGF0aWMgaW50IEtpbGxlZEV4aXRTdGF0dXMoaW50IHNpZ251bSkgewotICBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7Ci0gIGlmIChjaGlsZF9waWQgPT0gMCkgewotICAgIHJhaXNlKHNpZ251bSk7Ci0gICAgX2V4aXQoMSk7Ci0gIH0KLSAgaW50IHN0YXR1czsKLSAgd2FpdHBpZChjaGlsZF9waWQsICZzdGF0dXMsIDApOwotICByZXR1cm4gc3RhdHVzOwotfQotCi0vLyBUZXN0cyB0aGUgRXhpdGVkV2l0aENvZGUgcHJlZGljYXRlLgotVEVTVChFeGl0U3RhdHVzUHJlZGljYXRlVGVzdCwgRXhpdGVkV2l0aENvZGUpIHsKLSAgY29uc3QgaW50IHN0YXR1czAgID0gTm9ybWFsRXhpdFN0YXR1cygwKTsKLSAgY29uc3QgaW50IHN0YXR1czEgID0gTm9ybWFsRXhpdFN0YXR1cygxKTsKLSAgY29uc3QgaW50IHN0YXR1czQyID0gTm9ybWFsRXhpdFN0YXR1cyg0Mik7Ci0gIGNvbnN0IHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlIHByZWQwKDApOwotICBjb25zdCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSBwcmVkMSgxKTsKLSAgY29uc3QgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUgcHJlZDQyKDQyKTsKLSAgRVhQRUNUX1BSRUQxKHByZWQwLCAgc3RhdHVzMCk7Ci0gIEVYUEVDVF9QUkVEMShwcmVkMSwgIHN0YXR1czEpOwotICBFWFBFQ1RfUFJFRDEocHJlZDQyLCBzdGF0dXM0Mik7Ci0gIEVYUEVDVF9GQUxTRShwcmVkMChzdGF0dXMxKSk7Ci0gIEVYUEVDVF9GQUxTRShwcmVkNDIoc3RhdHVzMCkpOwotICBFWFBFQ1RfRkFMU0UocHJlZDEoc3RhdHVzNDIpKTsKLX0KLQotLy8gVGVzdHMgdGhlIEtpbGxlZEJ5U2lnbmFsIHByZWRpY2F0ZS4KLVRFU1QoRXhpdFN0YXR1c1ByZWRpY2F0ZVRlc3QsIEtpbGxlZEJ5U2lnbmFsKSB7Ci0gIGNvbnN0IGludCBzdGF0dXNfc2VndiA9IEtpbGxlZEV4aXRTdGF0dXMoU0lHU0VHVik7Ci0gIGNvbnN0IGludCBzdGF0dXNfa2lsbCA9IEtpbGxlZEV4aXRTdGF0dXMoU0lHS0lMTCk7Ci0gIGNvbnN0IHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsIHByZWRfc2VndihTSUdTRUdWKTsKLSAgY29uc3QgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwgcHJlZF9raWxsKFNJR0tJTEwpOwotICBFWFBFQ1RfUFJFRDEocHJlZF9zZWd2LCBzdGF0dXNfc2Vndik7Ci0gIEVYUEVDVF9QUkVEMShwcmVkX2tpbGwsIHN0YXR1c19raWxsKTsKLSAgRVhQRUNUX0ZBTFNFKHByZWRfc2VndihzdGF0dXNfa2lsbCkpOwotICBFWFBFQ1RfRkFMU0UocHJlZF9raWxsKHN0YXR1c19zZWd2KSk7Ci19Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVGVzdHMgdGhhdCB0aGUgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggbWF5IG9yIG1heSBub3QKLS8vIGJlIGZvbGxvd2VkIGJ5IG9wZXJhdG9yPDwsIGFuZCB0aGF0IGluIGVpdGhlciBjYXNlIHRoZSBjb21wbGV0ZSB0ZXh0Ci0vLyBjb21wcmlzZXMgb25seSBhIHNpbmdsZSBDKysgc3RhdGVtZW50LgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFNpbmdsZVN0YXRlbWVudCkgewotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICAvLyBUaGlzIHdvdWxkIGZhaWwgaWYgZXhlY3V0ZWQ7IHRoaXMgaXMgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkKLSAgICBBU1NFUlRfREVBVEgocmV0dXJuLCAiIik7Ci0KLSAgaWYgKEFsd2F5c1RydWUoKSkKLSAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKLSAgZWxzZQotICAgIC8vIFRoaXMgZW1wdHkgImVsc2UiIGJyYW5jaCBpcyBtZWFudCB0byBlbnN1cmUgdGhhdCBFWFBFQ1RfREVBVEgKLSAgICAvLyBkb2Vzbid0IGV4cGFuZCBpbnRvIGFuICJpZiIgc3RhdGVtZW50IHdpdGhvdXQgYW4gImVsc2UiCi0gICAgOwotCi0gIGlmIChBbHdheXNGYWxzZSgpKQotICAgIEFTU0VSVF9ERUFUSChyZXR1cm4sICIiKSA8PCAiZGlkIG5vdCBkaWUiOwotCi0gIGlmIChBbHdheXNGYWxzZSgpKQotICAgIDsKLSAgZWxzZQotICAgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8IDEgPDwgMiA8PCAzOwotfQotCi12b2lkIERpZVdpdGhFbWJlZGRlZE51bCgpIHsKLSAgZnByaW50ZihzdGRlcnIsICJIZWxsbyVjbXkgbnVsbCB3b3JsZC5cbiIsICdcMCcpOwotICBmZmx1c2goc3RkZXJyKTsKLSAgX2V4aXQoMSk7Ci19Ci0KLSMgaWYgR1RFU1RfVVNFU19QQ1JFCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSCBhbmQgQVNTRVJUX0RFQVRIIHdvcmsgd2hlbiB0aGUgZXJyb3IKLS8vIG1lc3NhZ2UgaGFzIGEgTlVMIGNoYXJhY3RlciBpbiBpdC4KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFbWJlZGRlZE51bEluTWVzc2FnZSkgewotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogPHJlZ2V4Lmg+IGRvZXNuJ3Qgc3VwcG9ydCBtYXRjaGluZyBzdHJpbmdzCi0gIC8vIHdpdGggZW1iZWRkZWQgTlVMIGNoYXJhY3RlcnMgLSBmaW5kIGEgd2F5IHRvIHdvcmthcm91bmQgaXQuCi0gIEVYUEVDVF9ERUFUSChEaWVXaXRoRW1iZWRkZWROdWwoKSwgIm15IG51bGwgd29ybGQiKTsKLSAgQVNTRVJUX0RFQVRIKERpZVdpdGhFbWJlZGRlZE51bCgpLCAibXkgbnVsbCB3b3JsZCIpOwotfQotIyBlbmRpZiAgLy8gR1RFU1RfVVNFU19QQ1JFCi0KLS8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggaW50ZXJhY3RzIHdlbGwgd2l0aCBzd2l0Y2gKLS8vIHN0YXRlbWVudHMuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU3dpdGNoU3RhdGVtZW50KSB7Ci0gIC8vIE1pY3Jvc29mdCBjb21waWxlciB1c3VhbGx5IGNvbXBsYWlucyBhYm91dCBzd2l0Y2ggc3RhdGVtZW50cyB3aXRob3V0Ci0gIC8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDA2NSkKLQotICBzd2l0Y2ggKDApCi0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIGRlZmF1bHQgc3dpdGNoIGhhbmRsZXIiOwotCi0gIHN3aXRjaCAoMCkKLSAgICBjYXNlIDA6Ci0gICAgICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAiZXhpdCBpbiBzd2l0Y2ggY2FzZSI7Ci0KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi19Ci0KLS8vIFRlc3RzIHRoYXQgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgImZhc3QiIHN0eWxlCi0vLyBkZWF0aCB0ZXN0LgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN0YXRpY01lbWJlckZ1bmN0aW9uRmFzdFN0eWxlKSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7Ci0gIEFTU0VSVF9ERUFUSChTdGF0aWNNZW1iZXJGdW5jdGlvbigpLCAiZGVhdGguKlN0YXRpY01lbWJlciIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2FuIGJlIHVzZWQgaW4gYSAiZmFzdCIKLS8vIHN0eWxlIGRlYXRoIHRlc3QuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWVtYmVyRnVuY3Rpb25GYXN0U3R5bGUpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKLSAgc2hvdWxkX2RpZV8gPSB0cnVlOwotICBFWFBFQ1RfREVBVEgoTWVtYmVyRnVuY3Rpb24oKSwgImluc2lkZS4qTWVtYmVyRnVuY3Rpb24iKTsKLX0KLQotdm9pZCBDaGFuZ2VUb1Jvb3REaXIoKSB7IHBvc2l4OjpDaERpcihHVEVTVF9QQVRIX1NFUF8pOyB9Ci0KLS8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgd29yayBldmVuIGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYXMgYmVlbgotLy8gY2hhbmdlZC4KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBGYXN0RGVhdGhUZXN0SW5DaGFuZ2VkRGlyKSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7Ci0KLSAgQ2hhbmdlVG9Sb290RGlyKCk7Ci0gIEVYUEVDVF9FWElUKF9leGl0KDEpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSwgIiIpOwotCi0gIENoYW5nZVRvUm9vdERpcigpOwotICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKTsKLX0KLQotIyBpZiBHVEVTVF9PU19MSU5VWAotdm9pZCBTaWdwcm9mQWN0aW9uKGludCwgc2lnaW5mb190Kiwgdm9pZCopIHsgLyogbm8gb3AgKi8gfQotCi0vLyBTZXRzIFNJR1BST0YgYWN0aW9uIGFuZCBJVElNRVJfUFJPRiB0aW1lciAoaW50ZXJ2YWw6IDFtcykuCi12b2lkIFNldFNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigpIHsKLSAgc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKLSAgdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKLSAgdGltZXIuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDE7Ci0gIHRpbWVyLml0X3ZhbHVlID0gdGltZXIuaXRfaW50ZXJ2YWw7Ci0gIEFTU0VSVF9FUSgwLCBzZXRpdGltZXIoSVRJTUVSX1BST0YsICZ0aW1lciwgTlVMTCkpOwotICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ25hbF9hY3Rpb247Ci0gIG1lbXNldCgmc2lnbmFsX2FjdGlvbiwgMCwgc2l6ZW9mKHNpZ25hbF9hY3Rpb24pKTsKLSAgc2lnZW1wdHlzZXQoJnNpZ25hbF9hY3Rpb24uc2FfbWFzayk7Ci0gIHNpZ25hbF9hY3Rpb24uc2Ffc2lnYWN0aW9uID0gU2lncHJvZkFjdGlvbjsKLSAgc2lnbmFsX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU1RBUlQgfCBTQV9TSUdJTkZPOwotICBBU1NFUlRfRVEoMCwgc2lnYWN0aW9uKFNJR1BST0YsICZzaWduYWxfYWN0aW9uLCBOVUxMKSk7Ci19Ci0KLS8vIERpc2FibGVzIElUSU1FUl9QUk9GIHRpbWVyIGFuZCBpZ25vcmVzIFNJR1BST0Ygc2lnbmFsLgotdm9pZCBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKHN0cnVjdCBzaWdhY3Rpb24qIG9sZF9zaWduYWxfYWN0aW9uKSB7Ci0gIHN0cnVjdCBpdGltZXJ2YWwgdGltZXI7Ci0gIHRpbWVyLml0X2ludGVydmFsLnR2X3NlYyA9IDA7Ci0gIHRpbWVyLml0X2ludGVydmFsLnR2X3VzZWMgPSAwOwotICB0aW1lci5pdF92YWx1ZSA9IHRpbWVyLml0X2ludGVydmFsOwotICBBU1NFUlRfRVEoMCwgc2V0aXRpbWVyKElUSU1FUl9QUk9GLCAmdGltZXIsIE5VTEwpKTsKLSAgc3RydWN0IHNpZ2FjdGlvbiBzaWduYWxfYWN0aW9uOwotICBtZW1zZXQoJnNpZ25hbF9hY3Rpb24sIDAsIHNpemVvZihzaWduYWxfYWN0aW9uKSk7Ci0gIHNpZ2VtcHR5c2V0KCZzaWduYWxfYWN0aW9uLnNhX21hc2spOwotICBzaWduYWxfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotICBBU1NFUlRfRVEoMCwgc2lnYWN0aW9uKFNJR1BST0YsICZzaWduYWxfYWN0aW9uLCBvbGRfc2lnbmFsX2FjdGlvbikpOwotfQotCi0vLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHdvcmsgd2hlbiBTSUdQUk9GIGhhbmRsZXIgYW5kIHRpbWVyIGFyZSBzZXQuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRmFzdFNpZ3Byb2ZBY3Rpb25TZXQpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKLSAgU2V0U2lncHJvZkFjdGlvbkFuZFRpbWVyKCk7Ci0gIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOwotICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZF9zaWduYWxfYWN0aW9uOwotICBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKCZvbGRfc2lnbmFsX2FjdGlvbik7Ci0gIEVYUEVDVF9UUlVFKG9sZF9zaWduYWxfYWN0aW9uLnNhX3NpZ2FjdGlvbiA9PSBTaWdwcm9mQWN0aW9uKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZFNhZmVTaWdwcm9mQWN0aW9uU2V0KSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7Ci0gIFNldFNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigpOwotICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKLSAgc3RydWN0IHNpZ2FjdGlvbiBvbGRfc2lnbmFsX2FjdGlvbjsKLSAgRGlzYWJsZVNpZ3Byb2ZBY3Rpb25BbmRUaW1lcigmb2xkX3NpZ25hbF9hY3Rpb24pOwotICBFWFBFQ1RfVFJVRShvbGRfc2lnbmFsX2FjdGlvbi5zYV9zaWdhY3Rpb24gPT0gU2lncHJvZkFjdGlvbik7Ci19Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0vLyBSZXBlYXRzIGEgcmVwcmVzZW50YXRpdmUgc2FtcGxlIG9mIGRlYXRoIHRlc3RzIGluIHRoZSAidGhyZWFkc2FmZSIgc3R5bGU6Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTdGF0aWNNZW1iZXJGdW5jdGlvblRocmVhZHNhZmVTdHlsZSkgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOwotICBBU1NFUlRfREVBVEgoU3RhdGljTWVtYmVyRnVuY3Rpb24oKSwgImRlYXRoLipTdGF0aWNNZW1iZXIiKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1lbWJlckZ1bmN0aW9uVGhyZWFkc2FmZVN0eWxlKSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7Ci0gIHNob3VsZF9kaWVfID0gdHJ1ZTsKLSAgRVhQRUNUX0RFQVRIKE1lbWJlckZ1bmN0aW9uKCksICJpbnNpZGUuKk1lbWJlckZ1bmN0aW9uIik7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUaHJlYWRzYWZlRGVhdGhUZXN0SW5Mb29wKSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCi0gICAgRVhQRUNUX0VYSVQoX2V4aXQoaSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKGkpLCAiIikgPDwgIjogaSA9ICIgPDwgaTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZHNhZmVEZWF0aFRlc3RJbkNoYW5nZWREaXIpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKLQotICBDaGFuZ2VUb1Jvb3REaXIoKTsKLSAgRVhQRUNUX0VYSVQoX2V4aXQoMSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpLCAiIik7Ci0KLSAgQ2hhbmdlVG9Sb290RGlyKCk7Ci0gIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWl4ZWRTdHlsZXMpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKLSAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7Ci0gIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOwotfQotCi0jIGlmIEdURVNUX0hBU19DTE9ORSAmJiBHVEVTVF9IQVNfUFRIUkVBRAotCi1uYW1lc3BhY2UgewotCi1ib29sIHB0aHJlYWRfZmxhZzsKLQotdm9pZCBTZXRQdGhyZWFkRmxhZygpIHsKLSAgcHRocmVhZF9mbGFnID0gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEb2VzTm90RXhlY3V0ZUF0Zm9ya0hvb2tzKSB7Ci0gIGlmICghdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSkgewotICAgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7Ci0gICAgcHRocmVhZF9mbGFnID0gZmFsc2U7Ci0gICAgQVNTRVJUX0VRKDAsIHB0aHJlYWRfYXRmb3JrKCZTZXRQdGhyZWFkRmxhZywgTlVMTCwgTlVMTCkpOwotICAgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOwotICAgIEFTU0VSVF9GQUxTRShwdGhyZWFkX2ZsYWcpOwotICB9Ci19Ci0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DTE9ORSAmJiBHVEVTVF9IQVNfUFRIUkVBRAotCi0vLyBUZXN0cyB0aGF0IGEgbWV0aG9kIG9mIGFub3RoZXIgY2xhc3MgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE1ldGhvZE9mQW5vdGhlckNsYXNzKSB7Ci0gIGNvbnN0IE1heURpZSB4KHRydWUpOwotICBBU1NFUlRfREVBVEgoeC5NZW1iZXJGdW5jdGlvbigpLCAiTWF5RGllXFw6XFw6TWVtYmVyRnVuY3Rpb24iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIGdsb2JhbCBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgR2xvYmFsRnVuY3Rpb24pIHsKLSAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksICJHbG9iYWxGdW5jdGlvbiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGFueSB2YWx1ZSBjb252ZXJ0aWJsZSB0byBhbiBSRSB3b3JrcyBhcyBhIHNlY29uZAotLy8gYXJndW1lbnQgdG8gRVhQRUNUX0RFQVRILgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFjY2VwdHNBbnl0aGluZ0NvbnZlcnRpYmxlVG9SRSkgewotICBzdGF0aWMgY29uc3QgY2hhciByZWdleF9jX3N0cltdID0gIkdsb2JhbEZ1bmN0aW9uIjsKLSAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksIHJlZ2V4X2Nfc3RyKTsKLQotICBjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6UkUgcmVnZXgocmVnZXhfY19zdHIpOwotICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXgpOwotCi0jIGlmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgY29uc3Qgc3RyaW5nIHJlZ2V4X3N0cihyZWdleF9jX3N0cik7Ci0gIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9zdHIpOwotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0jIGlmICFHVEVTVF9VU0VTX1BDUkUKLQotICBjb25zdCA6OnN0ZDo6c3RyaW5nIHJlZ2V4X3N0ZF9zdHIocmVnZXhfY19zdHIpOwotICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXhfc3RkX3N0cik7Ci0KLSMgZW5kaWYgIC8vICFHVEVTVF9VU0VTX1BDUkUKLX0KLQotLy8gVGVzdHMgdGhhdCBhIG5vbi12b2lkIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBOb25Wb2lkRnVuY3Rpb24pIHsKLSAgQVNTRVJUX0RFQVRIKE5vblZvaWRGdW5jdGlvbigpLCAiTm9uVm9pZEZ1bmN0aW9uIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgZnVuY3Rpb25zIHRoYXQgdGFrZSBwYXJhbWV0ZXIocykgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEZ1bmN0aW9uV2l0aFBhcmFtZXRlcikgewotICBFWFBFQ1RfREVBVEgoRGllSWYodHJ1ZSksICJEaWVJZlxcKFxcKSIpOwotICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigyLCAzKSwgIkRpZUlmTGVzc1RoYW4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVBVEggY2FuIGJlIHVzZWQgb3V0c2lkZSBhIFRFU1QsIFRFU1RfRiwgb3IgdGVzdCBmaXh0dXJlLgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE91dHNpZGVGaXh0dXJlKSB7Ci0gIERlYXRoVGVzdFN1YnJvdXRpbmUoKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyBjYW4gYmUgZG9uZSBpbnNpZGUgYSBsb29wLgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEluc2lkZUxvb3ApIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICBFWFBFQ1RfREVBVEgoRGllSWZMZXNzVGhhbigtMSwgaSksICJEaWVJZkxlc3NUaGFuIikgPDwgIndoZXJlIGkgPT0gIiA8PCBpOwotICB9Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBjb21wb3VuZCBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIENvbXBvdW5kU3RhdGVtZW50KSB7Ci0gIEVYUEVDVF9ERUFUSCh7ICAvLyBOT0xJTlQKLSAgICBjb25zdCBpbnQgeCA9IDI7Ci0gICAgY29uc3QgaW50IHkgPSB4ICsgMTsKLSAgICBEaWVJZkxlc3NUaGFuKHgsIHkpOwotICB9LAotICAiRGllSWZMZXNzVGhhbiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGNvZGUgdGhhdCBkb2Vzbid0IGRpZSBjYXVzZXMgYSBkZWF0aCB0ZXN0IHRvIGZhaWwuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRG9lc05vdERpZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgoRGllSWYoZmFsc2UpLCAiRGllSWYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkaWUiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIGRlYXRoIHRlc3QgZmFpbHMgd2hlbiB0aGUgZXJyb3IgbWVzc2FnZSBpc24ndCBleHBlY3RlZC4KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFcnJvck1lc3NhZ2VNaXNtYXRjaCkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfREVBVEgoRGllSWYodHJ1ZSksICJEaWVJZkxlc3NUaGFuIikgPDwgIkVuZCBvZiBkZWF0aCB0ZXN0IG1lc3NhZ2UuIjsKLSAgfSwgImRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yIik7Ci19Ci0KLS8vIE9uIGV4aXQsICphYm9ydGVkIHdpbGwgYmUgdHJ1ZSBpZmYgdGhlIEVYUEVDVF9ERUFUSCgpIHN0YXRlbWVudAotLy8gYWJvcnRlZCB0aGUgZnVuY3Rpb24uCi12b2lkIEV4cGVjdERlYXRoVGVzdEhlbHBlcihib29sKiBhYm9ydGVkKSB7Ci0gICphYm9ydGVkID0gdHJ1ZTsKLSAgRVhQRUNUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIik7ICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbC4KLSAgKmFib3J0ZWQgPSBmYWxzZTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEggZG9lc24ndCBhYm9ydCB0aGUgdGVzdCBvbiBmYWlsdXJlLgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEVYUEVDVF9ERUFUSCkgewotICBib29sIGFib3J0ZWQgPSB0cnVlOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFeHBlY3REZWF0aFRlc3RIZWxwZXIoJmFib3J0ZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRpZSIpOwotICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIIGRvZXMgYWJvcnQgdGhlIHRlc3Qgb24gZmFpbHVyZS4KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBU1NFUlRfREVBVEgpIHsKLSAgc3RhdGljIGJvb2wgYWJvcnRlZDsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgYWJvcnRlZCA9IHRydWU7Ci0gICAgQVNTRVJUX0RFQVRIKERpZUlmKGZhbHNlKSwgIkRpZUlmIik7ICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbC4KLSAgICBhYm9ydGVkID0gZmFsc2U7Ci0gIH0sICJmYWlsZWQgdG8gZGllIik7Ci0gIEVYUEVDVF9UUlVFKGFib3J0ZWQpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSCBldmFsdWF0ZXMgdGhlIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU2luZ2xlRXZhbHVhdGlvbikgewotICBpbnQgeCA9IDM7Ci0gIEVYUEVDVF9ERUFUSChEaWVJZigoKyt4KSA9PSA0KSwgIkRpZUlmIik7Ci0KLSAgY29uc3QgY2hhciogcmVnZXggPSAiRGllSWYiOwotICBjb25zdCBjaGFyKiByZWdleF9zYXZlID0gcmVnZXg7Ci0gIEVYUEVDVF9ERUFUSChEaWVJZkxlc3NUaGFuKDMsIDQpLCByZWdleCsrKTsKLSAgRVhQRUNUX0VRKHJlZ2V4X3NhdmUgKyAxLCByZWdleCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgcnVuLWF3YXkgZGVhdGggdGVzdHMgYXJlIHJlcG9ydGVkIGFzIGZhaWx1cmVzLgotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFJ1bmF3YXlJc0ZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RFQVRIKHN0YXRpY19jYXN0PHZvaWQ+KDApLCAiRm9vIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGllLiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIHJlcG9ydCBleGVjdXRpbmcgJ3JldHVybicgaW4gdGhlIHN0YXRlbWVudCBhcwotLy8gZmFpbHVyZS4KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBSZXR1cm5Jc0ZhaWx1cmUpIHsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RFQVRIKHJldHVybiwgIkJhciIpLAotICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQlVHX0RFQVRIIHdvcmtzIGFzIGV4cGVjdGVkLCB0aGF0IGlzLCB5b3UgY2FuIHN0cmVhbSBhCi0vLyBtZXNzYWdlIHRvIGl0LCBhbmQgaW4gZGVidWcgbW9kZSBpdDoKLS8vIDEuIEFzc2VydHMgb24gZGVhdGguCi0vLyAyLiBIYXMgbm8gc2lkZSBlZmZlY3QuCi0vLwotLy8gQW5kIGluIG9wdCBtb2RlLCBpdDoKLS8vIDEuICBIYXMgc2lkZSBlZmZlY3RzIGJ1dCBkb2VzIG5vdCBhc3NlcnQuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGVzdEV4cGVjdERlYnVnRGVhdGgpIHsKLSAgaW50IHNpZGVlZmZlY3QgPSAwOwotCi0gIEVYUEVDVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnRWxzZTEyKCZzaWRlZWZmZWN0KSwgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIikKLSAgICAgIDw8ICJNdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UiOwotCi0jIGlmZGVmIE5ERUJVRwotCi0gIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9jY3VycyBpbiBvcHQgbW9kZSAoc2lkZWVmZmVjdCkuCi0gIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7Ci0KLSMgZWxzZQotCi0gIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IGRvZXMgbm90IG9jY3VyIGluIGRiZyBtb2RlIChubyBzaWRlZWZmZWN0KS4KLSAgRVhQRUNUX0VRKDAsIHNpZGVlZmZlY3QpOwotCi0jIGVuZGlmCi19Ci0KLS8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQlVHX0RFQVRIIHdvcmtzIGFzIGV4cGVjdGVkLCB0aGF0IGlzLCB5b3UgY2FuIHN0cmVhbSBhCi0vLyBtZXNzYWdlIHRvIGl0LCBhbmQgaW4gZGVidWcgbW9kZSBpdDoKLS8vIDEuIEFzc2VydHMgb24gZGVhdGguCi0vLyAyLiBIYXMgbm8gc2lkZSBlZmZlY3QuCi0vLwotLy8gQW5kIGluIG9wdCBtb2RlLCBpdDoKLS8vIDEuICBIYXMgc2lkZSBlZmZlY3RzIGJ1dCBkb2VzIG5vdCBhc3NlcnQuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGVzdEFzc2VydERlYnVnRGVhdGgpIHsKLSAgaW50IHNpZGVlZmZlY3QgPSAwOwotCi0gIEFTU0VSVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnRWxzZTEyKCZzaWRlZWZmZWN0KSwgImRlYXRoLipEaWVJbkRlYnVnRWxzZTEyIikKLSAgICAgIDw8ICJNdXN0IGFjY2VwdCBhIHN0cmVhbWVkIG1lc3NhZ2UiOwotCi0jIGlmZGVmIE5ERUJVRwotCi0gIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9jY3VycyBpbiBvcHQgbW9kZSAoc2lkZWVmZmVjdCkuCi0gIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7Ci0KLSMgZWxzZQotCi0gIC8vIENoZWNrcyB0aGF0IHRoZSBhc3NpZ25tZW50IGRvZXMgbm90IG9jY3VyIGluIGRiZyBtb2RlIChubyBzaWRlZWZmZWN0KS4KLSAgRVhQRUNUX0VRKDAsIHNpZGVlZmZlY3QpOwotCi0jIGVuZGlmCi19Ci0KLSMgaWZuZGVmIE5ERUJVRwotCi12b2lkIEV4cGVjdERlYnVnRGVhdGhIZWxwZXIoYm9vbCogYWJvcnRlZCkgewotICAqYWJvcnRlZCA9IHRydWU7Ci0gIEVYUEVDVF9ERUJVR19ERUFUSChyZXR1cm4sICIiKSA8PCAiVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsLiI7Ci0gICphYm9ydGVkID0gZmFsc2U7Ci19Ci0KLSMgIGlmIEdURVNUX09TX1dJTkRPV1MKLVRFU1QoUG9wVXBEZWF0aFRlc3QsIERvZXNOb3RTaG93UG9wVXBPbkFib3J0KSB7Ci0gIHByaW50ZigiVGhpcyB0ZXN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZhaWxpbmcgaWYgaXQgc2hvd3MgIgotICAgICAgICAgImFueSBwb3AtdXAgZGlhbG9ncy5cbiIpOwotICBmZmx1c2goc3Rkb3V0KTsKLQotICBFWFBFQ1RfREVBVEgoewotICAgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBmYWxzZTsKLSAgICBhYm9ydCgpOwotICB9LCAiIik7Ci19Ci0jICBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUJVR19ERUFUSCBpbiBkZWJ1ZyBtb2RlIGRvZXMgbm90IGFib3J0Ci0vLyB0aGUgZnVuY3Rpb24uCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhwZWN0RGVidWdEZWF0aERvZXNOb3RBYm9ydCkgewotICBib29sIGFib3J0ZWQgPSB0cnVlOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFeHBlY3REZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOwotICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7Ci19Ci0KLXZvaWQgQXNzZXJ0RGVidWdEZWF0aEhlbHBlcihib29sKiBhYm9ydGVkKSB7Ci0gICphYm9ydGVkID0gdHJ1ZTsKLSAgR1RFU1RfTE9HXyhJTkZPKSA8PCAiQmVmb3JlIEFTU0VSVF9ERUJVR19ERUFUSCI7Ci0gIEFTU0VSVF9ERUJVR19ERUFUSChHVEVTVF9MT0dfKElORk8pIDw8ICJJbiBBU1NFUlRfREVCVUdfREVBVEgiOyByZXR1cm4sICIiKQotICAgICAgPDwgIlRoaXMgaXMgZXhwZWN0ZWQgdG8gZmFpbC4iOwotICBHVEVTVF9MT0dfKElORk8pIDw8ICJBZnRlciBBU1NFUlRfREVCVUdfREVBVEgiOwotICAqYWJvcnRlZCA9IGZhbHNlOwotfQotCi0vLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUJVR19ERUFUSCBpbiBkZWJ1ZyBtb2RlIGFib3J0cyB0aGUgZnVuY3Rpb24gb24KLS8vIGZhaWx1cmUuCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0cykgewotICBzdGF0aWMgYm9vbCBhYm9ydGVkOwotICBhYm9ydGVkID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7Ci0gIEVYUEVDVF9UUlVFKGFib3J0ZWQpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0czIpIHsKLSAgc3RhdGljIGJvb2wgYWJvcnRlZDsKLSAgYWJvcnRlZCA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOwotICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHMzKSB7Ci0gIHN0YXRpYyBib29sIGFib3J0ZWQ7Ci0gIGFib3J0ZWQgPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKLSAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzNCkgewotICBzdGF0aWMgYm9vbCBhYm9ydGVkOwotICBhYm9ydGVkID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7Ci0gIEVYUEVDVF9UUlVFKGFib3J0ZWQpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0czUpIHsKLSAgc3RhdGljIGJvb2wgYWJvcnRlZDsKLSAgYWJvcnRlZCA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOwotICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHM2KSB7Ci0gIHN0YXRpYyBib29sIGFib3J0ZWQ7Ci0gIGFib3J0ZWQgPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKLSAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzNykgewotICBzdGF0aWMgYm9vbCBhYm9ydGVkOwotICBhYm9ydGVkID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7Ci0gIEVYUEVDVF9UUlVFKGFib3J0ZWQpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0czgpIHsKLSAgc3RhdGljIGJvb2wgYWJvcnRlZDsKLSAgYWJvcnRlZCA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOwotICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHM5KSB7Ci0gIHN0YXRpYyBib29sIGFib3J0ZWQ7Ci0gIGFib3J0ZWQgPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKLSAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzMTApIHsKLSAgc3RhdGljIGJvb2wgYWJvcnRlZDsKLSAgYWJvcnRlZCA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOwotICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKLX0KLQotIyBlbmRpZiAgLy8gX05ERUJVRwotCi0vLyBUZXN0cyB0aGUgKl9FWElUIGZhbWlseSBvZiBtYWNyb3MsIHVzaW5nIGEgdmFyaWV0eSBvZiBwcmVkaWNhdGVzLgotc3RhdGljIHZvaWQgVGVzdEV4aXRNYWNyb3MoKSB7Ci0gIEVYUEVDVF9FWElUKF9leGl0KDEpLCAgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMSksICAiIik7Ci0gIEFTU0VSVF9FWElUKF9leGl0KDQyKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoNDIpLCAiIik7Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0gIC8vIE9mIGFsbCBzaWduYWxzIGVmZmVjdHMgb24gdGhlIHByb2Nlc3MgZXhpdCBjb2RlLCBvbmx5IHRob3NlIG9mIFNJR0FCUlQKLSAgLy8gYXJlIGRvY3VtZW50ZWQgb24gV2luZG93cy4KLSAgLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kd3d6a3Q0YyhWUy43MSkuYXNweC4KLSAgRVhQRUNUX0VYSVQocmFpc2UoU0lHQUJSVCksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDMpLCAiIikgPDwgImJfYXIiOwotCi0jIGVsc2UKLQotICBFWFBFQ1RfRVhJVChyYWlzZShTSUdLSUxMKSwgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHS0lMTCksICIiKSA8PCAiZm9vIjsKLSAgQVNTRVJUX0VYSVQocmFpc2UoU0lHVVNSMiksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1VTUjIpLCAiIikgPDwgImJhciI7Ci0KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX0VYSVQoX2V4aXQoMCksIHRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR1NFR1YpLCAiIikKLSAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIHRvby4iOwotICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCB0b28uIik7Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfRVhJVChyYWlzZShTSUdTRUdWKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKQotICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOwotICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhpdE1hY3JvcykgewotICBUZXN0RXhpdE1hY3JvcygpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRXhpdE1hY3Jvc1VzaW5nRm9yaykgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gdHJ1ZTsKLSAgVGVzdEV4aXRNYWNyb3MoKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEludmFsaWRTdHlsZSkgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInJvY29jbyI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9ERUFUSChfZXhpdCgwKSwgIiIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKLSAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKLX0KLQotVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdEZhaWxlZE91dHB1dCkgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIEVYUEVDVF9ERUFUSChEaWVXaXRoTWVzc2FnZSgiZGVhdGhcbiIpLAotICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIiksCi0gICAgICAiQWN0dWFsIG1zZzpcbiIKLSAgICAgICJbICBERUFUSCAgIF0gZGVhdGhcbiIpOwotfQotCi1URVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0VW5leHBlY3RlZFJldHVybk91dHB1dCkgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIEVYUEVDVF9ERUFUSCh7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXR1cm5pbmdcbiIpOwotICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSwgIiIpLAotICAgICAgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgotICAgICAgIiBFcnJvciBtc2c6XG4iCi0gICAgICAiWyAgREVBVEggICBdIHJldHVybmluZ1xuIik7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RCYWRFeGl0Q29kZU91dHB1dCkgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIEVYUEVDVF9FWElUKERpZVdpdGhNZXNzYWdlKCJleGl0aW5nIHdpdGggcmMgMVxuIiksCi0gICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgzKSwKLSAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIiksCi0gICAgICAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgotICAgICAgIiAgICAgICAgICAgIEV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzIDFcbiIKLSAgICAgICJBY3R1YWwgbXNnOlxuIgotICAgICAgIlsgIERFQVRIICAgXSBleGl0aW5nIHdpdGggcmMgMVxuIik7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RNdWx0aUxpbmVNYXRjaEZhaWwpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBFWFBFQ1RfREVBVEgoRGllV2l0aE1lc3NhZ2UoImxpbmUgMVxubGluZSAyXG5saW5lIDNcbiIpLAotICAgICAgICAgICAgICAgICAgICJsaW5lIDFcbnh5elxubGluZSAzXG4iKSwKLSAgICAgICJBY3R1YWwgbXNnOlxuIgotICAgICAgIlsgIERFQVRIICAgXSBsaW5lIDFcbiIKLSAgICAgICJbICBERUFUSCAgIF0gbGluZSAyXG4iCi0gICAgICAiWyAgREVBVEggICBdIGxpbmUgM1xuIik7Ci19Ci0KLVRFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RNdWx0aUxpbmVNYXRjaFBhc3MpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKLSAgRVhQRUNUX0RFQVRIKERpZVdpdGhNZXNzYWdlKCJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKSwKLSAgICAgICAgICAgICAgICJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iKTsKLX0KLQotLy8gQSBEZWF0aFRlc3RGYWN0b3J5IHRoYXQgcmV0dXJucyBNb2NrRGVhdGhUZXN0cy4KLWNsYXNzIE1vY2tEZWF0aFRlc3RGYWN0b3J5IDogcHVibGljIERlYXRoVGVzdEZhY3RvcnkgewotIHB1YmxpYzoKLSAgTW9ja0RlYXRoVGVzdEZhY3RvcnkoKTsKLSAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKLQotICAvLyBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIENyZWF0ZS4KLSAgdm9pZCBTZXRQYXJhbWV0ZXJzKGJvb2wgY3JlYXRlLCBEZWF0aFRlc3Q6OlRlc3RSb2xlIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCk7Ci0KLSAgLy8gQWNjZXNzb3JzLgotICBpbnQgQXNzdW1lUm9sZUNhbGxzKCkgY29uc3QgeyByZXR1cm4gYXNzdW1lX3JvbGVfY2FsbHNfOyB9Ci0gIGludCBXYWl0Q2FsbHMoKSBjb25zdCB7IHJldHVybiB3YWl0X2NhbGxzXzsgfQotICBzaXplX3QgUGFzc2VkQ2FsbHMoKSBjb25zdCB7IHJldHVybiBwYXNzZWRfYXJnc18uc2l6ZSgpOyB9Ci0gIGJvb2wgUGFzc2VkQXJndW1lbnQoaW50IG4pIGNvbnN0IHsgcmV0dXJuIHBhc3NlZF9hcmdzX1tuXTsgfQotICBzaXplX3QgQWJvcnRDYWxscygpIGNvbnN0IHsgcmV0dXJuIGFib3J0X2FyZ3NfLnNpemUoKTsgfQotICBEZWF0aFRlc3Q6OkFib3J0UmVhc29uIEFib3J0QXJndW1lbnQoaW50IG4pIGNvbnN0IHsKLSAgICByZXR1cm4gYWJvcnRfYXJnc19bbl07Ci0gIH0KLSAgYm9vbCBUZXN0RGVsZXRlZCgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfZGVsZXRlZF87IH0KLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBNb2NrRGVhdGhUZXN0OwotICAvLyBJZiB0cnVlLCBDcmVhdGUgd2lsbCByZXR1cm4gYSBNb2NrRGVhdGhUZXN0OyBvdGhlcndpc2UgaXQgcmV0dXJucwotICAvLyBOVUxMLgotICBib29sIGNyZWF0ZV87Ci0gIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgQXNzdW1lUm9sZSBtZXRob2QuCi0gIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZV87Ci0gIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgV2FpdCBtZXRob2QuCi0gIGludCBzdGF0dXNfOwotICAvLyBUaGUgdmFsdWUgYSBNb2NrRGVhdGhUZXN0IHdpbGwgcmV0dXJuIGZyb20gaXRzIFBhc3NlZCBtZXRob2QuCi0gIGJvb2wgcGFzc2VkXzsKLQotICAvLyBOdW1iZXIgb2YgdGltZXMgQXNzdW1lUm9sZSB3YXMgY2FsbGVkLgotICBpbnQgYXNzdW1lX3JvbGVfY2FsbHNfOwotICAvLyBOdW1iZXIgb2YgdGltZXMgV2FpdCB3YXMgY2FsbGVkLgotICBpbnQgd2FpdF9jYWxsc187Ci0gIC8vIFRoZSBhcmd1bWVudHMgdG8gdGhlIGNhbGxzIHRvIFBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi0gIC8vIFNldFBhcmFtZXRlcnMuCi0gIHN0ZDo6dmVjdG9yPGJvb2w+IHBhc3NlZF9hcmdzXzsKLSAgLy8gVGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbHMgdG8gQWJvcnQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotICAvLyBTZXRQYXJhbWV0ZXJzLgotICBzdGQ6OnZlY3RvcjxEZWF0aFRlc3Q6OkFib3J0UmVhc29uPiBhYm9ydF9hcmdzXzsKLSAgLy8gVHJ1ZSBpZiB0aGUgbGFzdCBNb2NrRGVhdGhUZXN0IHJldHVybmVkIGJ5IENyZWF0ZSBoYXMgYmVlbgotICAvLyBkZWxldGVkLgotICBib29sIHRlc3RfZGVsZXRlZF87Ci19OwotCi0KLS8vIEEgRGVhdGhUZXN0IGltcGxlbWVudGF0aW9uIHVzZWZ1bCBpbiB0ZXN0aW5nLiAgSXQgcmV0dXJucyB2YWx1ZXMgc2V0Ci0vLyBhdCBpdHMgY3JlYXRpb24gZnJvbSBpdHMgdmFyaW91cyBpbmhlcml0ZWQgRGVhdGhUZXN0IG1ldGhvZHMsIGFuZAotLy8gcmVwb3J0cyBjYWxscyB0byB0aG9zZSBtZXRob2RzIHRvIGl0cyBwYXJlbnQgTW9ja0RlYXRoVGVzdEZhY3RvcnkKLS8vIG9iamVjdC4KLWNsYXNzIE1vY2tEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0IHsKLSBwdWJsaWM6Ci0gIE1vY2tEZWF0aFRlc3QoTW9ja0RlYXRoVGVzdEZhY3RvcnkgKnBhcmVudCwKLSAgICAgICAgICAgICAgICBUZXN0Um9sZSByb2xlLCBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCkgOgotICAgICAgcGFyZW50XyhwYXJlbnQpLCByb2xlXyhyb2xlKSwgc3RhdHVzXyhzdGF0dXMpLCBwYXNzZWRfKHBhc3NlZCkgewotICB9Ci0gIHZpcnR1YWwgfk1vY2tEZWF0aFRlc3QoKSB7Ci0gICAgcGFyZW50Xy0+dGVzdF9kZWxldGVkXyA9IHRydWU7Ci0gIH0KLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCkgewotICAgICsrcGFyZW50Xy0+YXNzdW1lX3JvbGVfY2FsbHNfOwotICAgIHJldHVybiByb2xlXzsKLSAgfQotICB2aXJ0dWFsIGludCBXYWl0KCkgewotICAgICsrcGFyZW50Xy0+d2FpdF9jYWxsc187Ci0gICAgcmV0dXJuIHN0YXR1c187Ci0gIH0KLSAgdmlydHVhbCBib29sIFBhc3NlZChib29sIGV4aXRfc3RhdHVzX29rKSB7Ci0gICAgcGFyZW50Xy0+cGFzc2VkX2FyZ3NfLnB1c2hfYmFjayhleGl0X3N0YXR1c19vayk7Ci0gICAgcmV0dXJuIHBhc3NlZF87Ci0gIH0KLSAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgewotICAgIHBhcmVudF8tPmFib3J0X2FyZ3NfLnB1c2hfYmFjayhyZWFzb24pOwotICB9Ci0KLSBwcml2YXRlOgotICBNb2NrRGVhdGhUZXN0RmFjdG9yeSogY29uc3QgcGFyZW50XzsKLSAgY29uc3QgVGVzdFJvbGUgcm9sZV87Ci0gIGNvbnN0IGludCBzdGF0dXNfOwotICBjb25zdCBib29sIHBhc3NlZF87Ci19OwotCi0KLS8vIE1vY2tEZWF0aFRlc3RGYWN0b3J5IGNvbnN0cnVjdG9yLgotTW9ja0RlYXRoVGVzdEZhY3Rvcnk6Ok1vY2tEZWF0aFRlc3RGYWN0b3J5KCkKLSAgICA6IGNyZWF0ZV8odHJ1ZSksCi0gICAgICByb2xlXyhEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCksCi0gICAgICBzdGF0dXNfKDApLAotICAgICAgcGFzc2VkXyh0cnVlKSwKLSAgICAgIGFzc3VtZV9yb2xlX2NhbGxzXygwKSwKLSAgICAgIHdhaXRfY2FsbHNfKDApLAotICAgICAgcGFzc2VkX2FyZ3NfKCksCi0gICAgICBhYm9ydF9hcmdzXygpIHsKLX0KLQotCi0vLyBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIENyZWF0ZS4KLXZvaWQgTW9ja0RlYXRoVGVzdEZhY3Rvcnk6OlNldFBhcmFtZXRlcnMoYm9vbCBjcmVhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgYm9vbCBwYXNzZWQpIHsKLSAgY3JlYXRlXyA9IGNyZWF0ZTsKLSAgcm9sZV8gPSByb2xlOwotICBzdGF0dXNfID0gc3RhdHVzOwotICBwYXNzZWRfID0gcGFzc2VkOwotCi0gIGFzc3VtZV9yb2xlX2NhbGxzXyA9IDA7Ci0gIHdhaXRfY2FsbHNfID0gMDsKLSAgcGFzc2VkX2FyZ3NfLmNsZWFyKCk7Ci0gIGFib3J0X2FyZ3NfLmNsZWFyKCk7Ci19Ci0KLQotLy8gU2V0cyB0ZXN0IHRvIE5VTEwgKGlmIGNyZWF0ZV8gaXMgZmFsc2UpIG9yIHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3Ci0vLyBNb2NrRGVhdGhUZXN0IG9iamVjdCB3aXRoIHBhcmFtZXRlcnMgdGFrZW4gZnJvbSB0aGUgbGFzdCBjYWxsCi0vLyB0byBTZXRQYXJhbWV0ZXJzIChpZiBjcmVhdGVfIGlzIHRydWUpLiAgQWx3YXlzIHJldHVybnMgdHJ1ZS4KLWJvb2wgTW9ja0RlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiAvKnN0YXRlbWVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OlJFKiAvKnJlZ2V4Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLypmaWxlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qbGluZSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKLSAgdGVzdF9kZWxldGVkXyA9IGZhbHNlOwotICBpZiAoY3JlYXRlXykgewotICAgICp0ZXN0ID0gbmV3IE1vY2tEZWF0aFRlc3QodGhpcywgcm9sZV8sIHN0YXR1c18sIHBhc3NlZF8pOwotICB9IGVsc2UgewotICAgICp0ZXN0ID0gTlVMTDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQSB0ZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgdGhlIGxvZ2ljIG9mIHRoZSBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4KLS8vIEl0IGluc3RhbGxzIGEgTW9ja0RlYXRoVGVzdEZhY3RvcnkgdGhhdCBpcyB1c2VkIGZvciB0aGUgZHVyYXRpb24KLS8vIG9mIHRoZSB0ZXN0IGNhc2UuCi1jbGFzcyBNYWNyb0xvZ2ljRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgc3RhdGljIHRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSogcmVwbGFjZXJfOwotICBzdGF0aWMgTW9ja0RlYXRoVGVzdEZhY3RvcnkqIGZhY3RvcnlfOwotCi0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7Ci0gICAgZmFjdG9yeV8gPSBuZXcgTW9ja0RlYXRoVGVzdEZhY3Rvcnk7Ci0gICAgcmVwbGFjZXJfID0gbmV3IHRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeShmYWN0b3J5Xyk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgewotICAgIGRlbGV0ZSByZXBsYWNlcl87Ci0gICAgcmVwbGFjZXJfID0gTlVMTDsKLSAgICBkZWxldGUgZmFjdG9yeV87Ci0gICAgZmFjdG9yeV8gPSBOVUxMOwotICB9Ci0KLSAgLy8gUnVucyBhIGRlYXRoIHRlc3QgdGhhdCBicmVha3MgdGhlIHJ1bGVzIGJ5IHJldHVybmluZy4gIFN1Y2ggYSBkZWF0aAotICAvLyB0ZXN0IGNhbm5vdCBiZSBydW4gZGlyZWN0bHkgZnJvbSBhIHRlc3Qgcm91dGluZSB0aGF0IHVzZXMgYQotICAvLyBNb2NrRGVhdGhUZXN0LCBvciB0aGUgcmVtYWluZGVyIG9mIHRoZSByb3V0aW5lIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgotICBzdGF0aWMgdm9pZCBSdW5SZXR1cm5pbmdEZWF0aFRlc3QoYm9vbCogZmxhZykgewotICAgIEFTU0VSVF9ERUFUSCh7ICAvLyBOT0xJTlQKLSAgICAgICpmbGFnID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9LCAiIik7Ci0gIH0KLX07Ci0KLXRlc3Rpbmc6OmludGVybmFsOjpSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeSogTWFjcm9Mb2dpY0RlYXRoVGVzdDo6cmVwbGFjZXJfCi0gICAgPSBOVUxMOwotTW9ja0RlYXRoVGVzdEZhY3RvcnkqIE1hY3JvTG9naWNEZWF0aFRlc3Q6OmZhY3RvcnlfID0gTlVMTDsKLQotCi0vLyBUZXN0IHRoYXQgbm90aGluZyBoYXBwZW5zIHdoZW4gdGhlIGZhY3RvcnkgZG9lc24ndCByZXR1cm4gYSBEZWF0aFRlc3Q6Ci1URVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgTm90aGluZ0hhcHBlbnMpIHsKLSAgYm9vbCBmbGFnID0gZmFsc2U7Ci0gIGZhY3RvcnlfLT5TZXRQYXJhbWV0ZXJzKGZhbHNlLCBEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCwgMCwgdHJ1ZSk7Ci0gIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOwotICBFWFBFQ1RfRkFMU0UoZmxhZyk7Ci0gIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOwotICBFWFBFQ1RfRVEoMCwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKLSAgRVhQRUNUX0VRKDBVLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7Ci0gIEVYUEVDVF9FUSgwVSwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7Ci0gIEVYUEVDVF9GQUxTRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCB0aGUgcGFyZW50IHByb2Nlc3MgZG9lc24ndCBydW4gdGhlIGRlYXRoIHRlc3QgY29kZSwKLS8vIGFuZCB0aGF0IHRoZSBQYXNzZWQgbWV0aG9kIHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgKHNpbXVsYXRlZCkKLS8vIGNoaWxkIHByb2Nlc3MgZXhpdHMgd2l0aCBzdGF0dXMgMDoKLVRFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBDaGlsZEV4aXRzU3VjY2Vzc2Z1bGx5KSB7Ci0gIGJvb2wgZmxhZyA9IGZhbHNlOwotICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVCwgMCwgdHJ1ZSk7Ci0gIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOwotICBFWFBFQ1RfRkFMU0UoZmxhZyk7Ci0gIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+QXNzdW1lUm9sZUNhbGxzKCkpOwotICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPldhaXRDYWxscygpKTsKLSAgQVNTRVJUX0VRKDFVLCBmYWN0b3J5Xy0+UGFzc2VkQ2FsbHMoKSk7Ci0gIEVYUEVDVF9GQUxTRShmYWN0b3J5Xy0+UGFzc2VkQXJndW1lbnQoMCkpOwotICBFWFBFQ1RfRVEoMFUsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOwotICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIFBhc3NlZCBtZXRob2Qgd2FzIGdpdmVuIHRoZSBhcmd1bWVudCAidHJ1ZSIgd2hlbgotLy8gdGhlIChzaW11bGF0ZWQpIGNoaWxkIHByb2Nlc3MgZXhpdHMgd2l0aCBzdGF0dXMgMToKLVRFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBDaGlsZEV4aXRzVW5zdWNjZXNzZnVsbHkpIHsKLSAgYm9vbCBmbGFnID0gZmFsc2U7Ci0gIGZhY3RvcnlfLT5TZXRQYXJhbWV0ZXJzKHRydWUsIERlYXRoVGVzdDo6T1ZFUlNFRV9URVNULCAxLCB0cnVlKTsKLSAgRVhQRUNUX0RFQVRIKGZsYWcgPSB0cnVlLCAiIik7Ci0gIEVYUEVDVF9GQUxTRShmbGFnKTsKLSAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7Ci0gIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOwotICBBU1NFUlRfRVEoMVUsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKLSAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlBhc3NlZEFyZ3VtZW50KDApKTsKLSAgRVhQRUNUX0VRKDBVLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKLSAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlRlc3REZWxldGVkKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSAoc2ltdWxhdGVkKSBjaGlsZCBwcm9jZXNzIGV4ZWN1dGVzIHRoZSBkZWF0aCB0ZXN0Ci0vLyBjb2RlLCBhbmQgaXMgYWJvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IEFib3J0UmVhc29uIGlmIGl0Ci0vLyBleGVjdXRlcyBhIHJldHVybiBzdGF0ZW1lbnQuCi1URVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGRQZXJmb3Jtc1JldHVybikgewotICBib29sIGZsYWcgPSBmYWxzZTsKLSAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpFWEVDVVRFX1RFU1QsIDAsIHRydWUpOwotICBSdW5SZXR1cm5pbmdEZWF0aFRlc3QoJmZsYWcpOwotICBFWFBFQ1RfVFJVRShmbGFnKTsKLSAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7Ci0gIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOwotICBFWFBFQ1RfRVEoMFUsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKLSAgRVhQRUNUX0VRKDFVLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKLSAgRVhQRUNUX0VRKERlYXRoVGVzdDo6VEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAotICAgICAgICAgICAgZmFjdG9yeV8tPkFib3J0QXJndW1lbnQoMCkpOwotICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIChzaW11bGF0ZWQpIGNoaWxkIHByb2Nlc3MgaXMgYWJvcnRlZCB3aXRoIHRoZQotLy8gY29ycmVjdCBBYm9ydFJlYXNvbiBpZiBpdCBkb2VzIG5vdCBkaWUuCi1URVNUX0YoTWFjcm9Mb2dpY0RlYXRoVGVzdCwgQ2hpbGREb2VzTm90RGllKSB7Ci0gIGJvb2wgZmxhZyA9IGZhbHNlOwotICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVCwgMCwgdHJ1ZSk7Ci0gIEVYUEVDVF9ERUFUSChmbGFnID0gdHJ1ZSwgIiIpOwotICBFWFBFQ1RfVFJVRShmbGFnKTsKLSAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7Ci0gIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOwotICBFWFBFQ1RfRVEoMFUsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKLSAgLy8gVGhpcyB0aW1lIHRoZXJlIGFyZSB0d28gY2FsbHMgdG8gQWJvcnQ6IG9uZSBzaW5jZSB0aGUgdGVzdCBkaWRuJ3QKLSAgLy8gZGllLCBhbmQgYW5vdGhlciBmcm9tIHRoZSBSZXR1cm5TZW50aW5lbCB3aGVuIGl0J3MgZGVzdHJveWVkLiAgVGhlCi0gIC8vIHNlbnRpbmVsIG5vcm1hbGx5IGlzbid0IGRlc3Ryb3llZCBpZiBhIHRlc3QgZG9lc24ndCBkaWUsIHNpbmNlCi0gIC8vIF9leGl0KDIpIGlzIGNhbGxlZCBpbiB0aGF0IGNhc2UgYnkgRm9ya2luZ0RlYXRoVGVzdCwgYnV0IG5vdCBieQotICAvLyBvdXIgTW9ja0RlYXRoVGVzdC4KLSAgQVNTRVJUX0VRKDJVLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKLSAgRVhQRUNUX0VRKERlYXRoVGVzdDo6VEVTVF9ESURfTk9UX0RJRSwKLSAgICAgICAgICAgIGZhY3RvcnlfLT5BYm9ydEFyZ3VtZW50KDApKTsKLSAgRVhQRUNUX0VRKERlYXRoVGVzdDo6VEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAotICAgICAgICAgICAgZmFjdG9yeV8tPkFib3J0QXJndW1lbnQoMSkpOwotICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBzdWNjZXNzZnVsIGRlYXRoIHRlc3QgZG9lcyBub3QgcmVnaXN0ZXIgYSBzdWNjZXNzZnVsCi0vLyB0ZXN0IHBhcnQuCi1URVNUKFN1Y2Nlc3NSZWdpc3RyYXRpb25EZWF0aFRlc3QsIE5vU3VjY2Vzc1BhcnQpIHsKLSAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7Ci0gIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOwotfQotCi1URVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNEZWF0aFRlc3QsIERlYXRoVGVzdCkgewotICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgQVNTRVJUX0RFQVRIKF9leGl0KDEpLCAiIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9ERUFUSChfZXhpdCgwKSwgIiIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIjsKLSAgfSwgImV4cGVjdGVkIGZhaWx1cmUiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX0RFQVRIKF9leGl0KDApLCAiIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiOwotICB9LCAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlCi0vLyBsYXN0IGVycm9yIGlzIDAgYW5kIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub24temVyby4KLVRFU1QoR2V0TGFzdEVycm5vRGVzY3JpcHRpb24sIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uV29ya3MpIHsKLSAgZXJybm8gPSBFTk9FTlQ7Ci0gIEVYUEVDVF9TVFJORSgiIiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgZXJybm8gPSAwOwotICBFWFBFQ1RfU1RSRVEoIiIsIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci19Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotVEVTVChBdXRvSGFuZGxlVGVzdCwgQXV0b0hhbmRsZVdvcmtzKSB7Ci0gIEhBTkRMRSBoYW5kbGUgPSA6OkNyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7Ci0gIEFTU0VSVF9ORShJTlZBTElEX0hBTkRMRV9WQUxVRSwgaGFuZGxlKTsKLQotICAvLyBUZXN0cyB0aGF0IHRoZSBBdXRvSGFuZGxlIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCB3aXRoIGEgaGFuZGxlLgotICB0ZXN0aW5nOjppbnRlcm5hbDo6QXV0b0hhbmRsZSBhdXRvX2hhbmRsZShoYW5kbGUpOwotICBFWFBFQ1RfRVEoaGFuZGxlLCBhdXRvX2hhbmRsZS5HZXQoKSk7Ci0KLSAgLy8gVGVzdHMgdGhhdCBSZXNldCBhc3NpZ25zIElOVkFMSURfSEFORExFX1ZBTFVFLgotICAvLyBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgdmVyaWZ5IHdoZXRoZXIgdGhlIG9yaWdpbmFsIGhhbmRsZSBpcyBjbG9zZWQuCi0gIGF1dG9faGFuZGxlLlJlc2V0KCk7Ci0gIEVYUEVDVF9FUShJTlZBTElEX0hBTkRMRV9WQUxVRSwgYXV0b19oYW5kbGUuR2V0KCkpOwotCi0gIC8vIFRlc3RzIHRoYXQgUmVzZXQgYXNzaWducyB0aGUgbmV3IGhhbmRsZS4KLSAgLy8gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHZlcmlmeSB3aGV0aGVyIHRoZSBvcmlnaW5hbCBoYW5kbGUgaXMgY2xvc2VkLgotICBoYW5kbGUgPSA6OkNyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7Ci0gIEFTU0VSVF9ORShJTlZBTElEX0hBTkRMRV9WQUxVRSwgaGFuZGxlKTsKLSAgYXV0b19oYW5kbGUuUmVzZXQoaGFuZGxlKTsKLSAgRVhQRUNUX0VRKGhhbmRsZSwgYXV0b19oYW5kbGUuR2V0KCkpOwotCi0gIC8vIFRlc3RzIHRoYXQgQXV0b0hhbmRsZSBjb250YWlucyBJTlZBTElEX0hBTkRMRV9WQUxVRSBieSBkZWZhdWx0LgotICB0ZXN0aW5nOjppbnRlcm5hbDo6QXV0b0hhbmRsZSBhdXRvX2hhbmRsZTI7Ci0gIEVYUEVDVF9FUShJTlZBTElEX0hBTkRMRV9WQUxVRSwgYXV0b19oYW5kbGUyLkdldCgpKTsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgQmlnZ2VzdFBhcnNhYmxlOwotdHlwZWRlZiBzaWduZWQgX19pbnQ2NCBCaWdnZXN0U2lnbmVkUGFyc2FibGU7Ci0jIGVsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RQYXJzYWJsZTsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBCaWdnZXN0U2lnbmVkUGFyc2FibGU7Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFdlIGNhbm5vdCB1c2Ugc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgYXMgaXQgY2xhc2hlcyB3aXRoIHRoZQotLy8gbWF4KCkgbWFjcm8gZGVmaW5lZCBieSA8d2luZG93cy5oPi4KLWNvbnN0IEJpZ2dlc3RQYXJzYWJsZSBrQmlnZ2VzdFBhcnNhYmxlTWF4ID0gVUxMT05HX01BWDsKLWNvbnN0IEJpZ2dlc3RTaWduZWRQYXJzYWJsZSBrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4ID0gTExPTkdfTUFYOwotCi1URVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIFJlamVjdHNJbnZhbGlkRm9ybWF0KSB7Ci0gIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOwotCi0gIC8vIFJlamVjdHMgbm9uLW51bWJlcnMuCi0gIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoIm5vbi1udW1iZXIgc3RyaW5nIiwgJnJlc3VsdCkpOwotCi0gIC8vIFJlamVjdHMgbnVtYmVycyB3aXRoIHdoaXRlc3BhY2UgcHJlZml4LgotICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIgMTIzIiwgJnJlc3VsdCkpOwotCi0gIC8vIFJlamVjdHMgbmVnYXRpdmUgbnVtYmVycy4KLSAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigiLTEyMyIsICZyZXN1bHQpKTsKLQotICAvLyBSZWplY3RzIG51bWJlcnMgc3RhcnRpbmcgd2l0aCBhIHBsdXMgc2lnbi4KLSAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigiKzEyMyIsICZyZXN1bHQpKTsKLSAgZXJybm8gPSAwOwotfQotCi1URVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIFJlamVjdHNPdmVyZmxvd25OdW1iZXJzKSB7Ci0gIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOwotCi0gIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IiwgJnJlc3VsdCkpOwotCi0gIHNpZ25lZCBjaGFyIGNoYXJfcmVzdWx0ID0gMDsKLSAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigiMjAwIiwgJmNoYXJfcmVzdWx0KSk7Ci0gIGVycm5vID0gMDsKLX0KLQotVEVTVChQYXJzZU5hdHVyYWxOdW1iZXJUZXN0LCBBY2NlcHRzVmFsaWROdW1iZXJzKSB7Ci0gIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOwotCi0gIHJlc3VsdCA9IDA7Ci0gIEFTU0VSVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcigiMTIzIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfRVEoMTIzVSwgcmVzdWx0KTsKLQotICAvLyBDaGVjayAwIGFzIGFuIGVkZ2UgY2FzZS4KLSAgcmVzdWx0ID0gMTsKLSAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIwIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfRVEoMFUsIHJlc3VsdCk7Ci0KLSAgcmVzdWx0ID0gMTsKLSAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIwMDAwMCIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX0VRKDBVLCByZXN1bHQpOwotfQotCi1URVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIEFjY2VwdHNUeXBlTGltaXRzKSB7Ci0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwga0JpZ2dlc3RQYXJzYWJsZU1heDsKLQotICBCaWdnZXN0UGFyc2FibGUgcmVzdWx0ID0gMDsKLSAgRVhQRUNUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKG1zZy5HZXRTdHJpbmcoKSwgJnJlc3VsdCkpOwotICBFWFBFQ1RfRVEoa0JpZ2dlc3RQYXJzYWJsZU1heCwgcmVzdWx0KTsKLQotICBNZXNzYWdlIG1zZzI7Ci0gIG1zZzIgPDwga0JpZ2dlc3RTaWduZWRQYXJzYWJsZU1heDsKLQotICBCaWdnZXN0U2lnbmVkUGFyc2FibGUgc2lnbmVkX3Jlc3VsdCA9IDA7Ci0gIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2cyLkdldFN0cmluZygpLCAmc2lnbmVkX3Jlc3VsdCkpOwotICBFWFBFQ1RfRVEoa0JpZ2dlc3RTaWduZWRQYXJzYWJsZU1heCwgc2lnbmVkX3Jlc3VsdCk7Ci0KLSAgTWVzc2FnZSBtc2czOwotICBtc2czIDw8IElOVF9NQVg7Ci0KLSAgaW50IGludF9yZXN1bHQgPSAwOwotICBFWFBFQ1RfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIobXNnMy5HZXRTdHJpbmcoKSwgJmludF9yZXN1bHQpKTsKLSAgRVhQRUNUX0VRKElOVF9NQVgsIGludF9yZXN1bHQpOwotCi0gIE1lc3NhZ2UgbXNnNDsKLSAgbXNnNCA8PCBVSU5UX01BWDsKLQotICB1bnNpZ25lZCBpbnQgdWludF9yZXN1bHQgPSAwOwotICBFWFBFQ1RfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIobXNnNC5HZXRTdHJpbmcoKSwgJnVpbnRfcmVzdWx0KSk7Ci0gIEVYUEVDVF9FUShVSU5UX01BWCwgdWludF9yZXN1bHQpOwotfQotCi1URVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIFdvcmtzRm9yU2hvcnRlckludGVnZXJzKSB7Ci0gIHNob3J0IHNob3J0X3Jlc3VsdCA9IDA7Ci0gIEFTU0VSVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcigiMTIzIiwgJnNob3J0X3Jlc3VsdCkpOwotICBFWFBFQ1RfRVEoMTIzLCBzaG9ydF9yZXN1bHQpOwotCi0gIHNpZ25lZCBjaGFyIGNoYXJfcmVzdWx0ID0gMDsKLSAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmY2hhcl9yZXN1bHQpKTsKLSAgRVhQRUNUX0VRKDEyMywgY2hhcl9yZXN1bHQpOwotfQotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLVRFU1QoRW52aXJvbm1lbnRUZXN0LCBIYW5kbGVGaXRzSW50b1NpemVUKSB7Ci0gIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIHRlc3QgYWZ0ZXIgdGhpcyBjb25kaXRpb24gaXMgdmVyaWZpZWQKLSAgLy8gaW4gYSBzdGF0aWMgYXNzZXJ0aW9uIGluIGd0ZXN0LWRlYXRoLXRlc3QuY2MgaW4gdGhlIGZ1bmN0aW9uCi0gIC8vIEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yLgotICBBU1NFUlRfVFJVRShzaXplb2YoSEFORExFKSA8PSBzaXplb2Yoc2l6ZV90KSk7Ci19Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRC9BU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEIHRyaWdnZXIKLS8vIGZhaWx1cmVzIHdoZW4gZGVhdGggdGVzdHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3lzdGVtLgotVEVTVChDb25kaXRpb25hbERlYXRoTWFjcm9zRGVhdGhUZXN0LCBFeHBlY3RzRGVhdGhXaGVuRGVhdGhUZXN0c0F2YWlsYWJsZSkgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKERpZUluc2lkZSgiQ29uZERlYXRoVGVzdEV4cGVjdE1hY3JvIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYXRoIGluc2lkZSBDb25kRGVhdGhUZXN0RXhwZWN0TWFjcm8iKTsKLSAgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChEaWVJbnNpZGUoIkNvbmREZWF0aFRlc3RBc3NlcnRNYWNybyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWF0aCBpbnNpZGUgQ29uZERlYXRoVGVzdEFzc2VydE1hY3JvIik7Ci0KLSAgLy8gRW1wdHkgc3RhdGVtZW50IHdpbGwgbm90IGNyYXNoLCB3aGljaCBtdXN0IHRyaWdnZXIgYSBmYWlsdXJlLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKSwgIiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKSwgIiIpOwotfQotCi1URVNUKEluRGVhdGhUZXN0Q2hpbGREZWF0aFRlc3QsIFJlcG9ydHNEZWF0aFRlc3RDb3JyZWN0bHlJbkZhc3RTdHlsZSkgewotICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOwotICBFWFBFQ1RfRkFMU0UoSW5EZWF0aFRlc3RDaGlsZCgpKTsKLSAgRVhQRUNUX0RFQVRIKHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgSW5EZWF0aFRlc3RDaGlsZCgpID8gIkluc2lkZSIgOiAiT3V0c2lkZSIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIF9leGl0KDEpOwotICB9LCAiSW5zaWRlIik7Ci19Ci0KLVRFU1QoSW5EZWF0aFRlc3RDaGlsZERlYXRoVGVzdCwgUmVwb3J0c0RlYXRoVGVzdENvcnJlY3RseUluVGhyZWFkU2FmZVN0eWxlKSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7Ci0gIEVYUEVDVF9GQUxTRShJbkRlYXRoVGVzdENoaWxkKCkpOwotICBFWFBFQ1RfREVBVEgoewotICAgIGZwcmludGYoc3RkZXJyLCBJbkRlYXRoVGVzdENoaWxkKCkgPyAiSW5zaWRlIiA6ICJPdXRzaWRlIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgX2V4aXQoMSk7Ci0gIH0sICJJbnNpZGUiKTsKLX0KLQotI2Vsc2UgIC8vICFHVEVTVF9IQVNfREVBVEhfVEVTVCBmb2xsb3dzCi0KLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3RkZXJyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3RkZXJyOwotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQvQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBhcmUgc3RpbGwKLS8vIGRlZmluZWQgYnV0IGRvIG5vdCB0cmlnZ2VyIGZhaWx1cmVzIHdoZW4gZGVhdGggdGVzdHMgYXJlIG5vdCBhdmFpbGFibGUgb24KLS8vIHRoZSBzeXN0ZW0uCi1URVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NUZXN0LCBXYXJuc1doZW5EZWF0aFRlc3RzTm90QXZhaWxhYmxlKSB7Ci0gIC8vIEVtcHR5IHN0YXRlbWVudCB3aWxsIG5vdCBjcmFzaCwgYnV0IHRoYXQgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgZmFpbHVyZQotICAvLyB3aGVuIGRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLgotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpOwotICBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLCAiOyIpKTsKLQotICAvLyBUaGUgc3RyZWFtZWQgbWVzc2FnZSBzaG91bGQgbm90IGJlIHByaW50ZWQgYXMgdGhlcmUgaXMgbm8gdGVzdCBmYWlsdXJlLgotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpIDw8ICJzdHJlYW1lZCBtZXNzYWdlIjsKLSAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCA9PSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICJzdHJlYW1lZCBtZXNzYWdlIikpOwotCi0gIENhcHR1cmVTdGRlcnIoKTsKLSAgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCg7LCAiIik7ICAvLyBOT0xJTlQKLSAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCAhPSBzdHJzdHIob3V0cHV0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIikpOwotICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgIjsiKSk7Ci0KLSAgQ2FwdHVyZVN0ZGVycigpOwotICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKSA8PCAic3RyZWFtZWQgbWVzc2FnZSI7ICAvLyBOT0xJTlQKLSAgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCA9PSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICJzdHJlYW1lZCBtZXNzYWdlIikpOwotfQotCi12b2lkIEZ1bmNXaXRoQXNzZXJ0KGludCogbikgewotICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybjssICIiKTsKLSAgKCpuKSsrOwotfQotCi0vLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgZG9lcyBub3QgcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQKLS8vIGZ1bmN0aW9uIChhcyBBU1NFUlRfREVBVEggZG9lcykgaWYgZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi1URVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NUZXN0LCBBc3NlcnREZWF0RG9lc05vdFJldHVybmhJZlVuc3VwcG9ydGVkKSB7Ci0gIGludCBuID0gMDsKLSAgRnVuY1dpdGhBc3NlcnQoJm4pOwotICBFWFBFQ1RfRVEoMSwgbik7Ci19Ci0KLSNlbmRpZiAgLy8gIUdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIFRlc3RzIHRoYXQgdGhlIGRlYXRoIHRlc3QgbWFjcm9zIGV4cGFuZCB0byBjb2RlIHdoaWNoIG1heSBvciBtYXkgbm90Ci0vLyBiZSBmb2xsb3dlZCBieSBvcGVyYXRvcjw8LCBhbmQgdGhhdCBpbiBlaXRoZXIgY2FzZSB0aGUgY29tcGxldGUgdGV4dAotLy8gY29tcHJpc2VzIG9ubHkgYSBzaW5nbGUgQysrIHN0YXRlbWVudC4KLS8vCi0vLyBUaGUgc3ludGF4IHNob3VsZCB3b3JrIHdoZXRoZXIgZGVhdGggdGVzdHMgYXJlIGF2YWlsYWJsZSBvciBub3QuCi1URVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NTeW50YXhEZWF0aFRlc3QsIFNpbmdsZVN0YXRlbWVudCkgewotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICAvLyBUaGlzIHdvdWxkIGZhaWwgaWYgZXhlY3V0ZWQ7IHRoaXMgaXMgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkKLSAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybiwgIiIpOwotCi0gIGlmIChBbHdheXNUcnVlKCkpCi0gICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpOwotICBlbHNlCi0gICAgLy8gVGhpcyBlbXB0eSAiZWxzZSIgYnJhbmNoIGlzIG1lYW50IHRvIGVuc3VyZSB0aGF0IEVYUEVDVF9ERUFUSAotICAgIC8vIGRvZXNuJ3QgZXhwYW5kIGludG8gYW4gImlmIiBzdGF0ZW1lbnQgd2l0aG91dCBhbiAiZWxzZSIKLSAgICA7ICAvLyBOT0xJTlQKLQotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHJldHVybiwgIiIpIDw8ICJkaWQgbm90IGRpZSI7Ci0KLSAgaWYgKEFsd2F5c0ZhbHNlKCkpCi0gICAgOyAgLy8gTk9MSU5UCi0gIGVsc2UKLSAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIikgPDwgMSA8PCAyIDw8IDM7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgY29uZGl0aW9uYWwgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggaW50ZXJhY3RzCi0vLyB3ZWxsIHdpdGggc3dpdGNoIHN0YXRlbWVudHMuCi1URVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NTeW50YXhEZWF0aFRlc3QsIFN3aXRjaFN0YXRlbWVudCkgewotICAvLyBNaWNyb3NvZnQgY29tcGlsZXIgdXN1YWxseSBjb21wbGFpbnMgYWJvdXQgc3dpdGNoIHN0YXRlbWVudHMgd2l0aG91dAotICAvLyBjYXNlIGxhYmVscy4gV2Ugc3VwcHJlc3MgdGhhdCB3YXJuaW5nIGZvciB0aGlzIHRlc3QuCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQwNjUpCi0KLSAgc3dpdGNoICgwKQotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIikKLSAgICAgICAgICA8PCAiZXhpdCBpbiBkZWZhdWx0IHN3aXRjaCBoYW5kbGVyIjsKLQotICBzd2l0Y2ggKDApCi0gICAgY2FzZSAwOgotICAgICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIHN3aXRjaCBjYXNlIjsKLQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLX0KLQotLy8gVGVzdHMgdGhhdCBhIHRlc3QgY2FzZSB3aG9zZSBuYW1lIGVuZHMgd2l0aCAiRGVhdGhUZXN0IiB3b3JrcyBmaW5lCi0vLyBvbiBXaW5kb3dzLgotVEVTVChOb3RBRGVhdGhUZXN0LCBUZXN0KSB7Ci0gIFNVQ0NFRUQoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1maWxlcGF0aF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzI5ODYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKLS8vCi0vLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQotLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLS8vCi0vLyBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGZyb20gZ3Rlc3RfdW5pdHRlc3QuY2MsIHRvIGF2b2lkIGNoYW5naW5nCi0vLyBidWlsZCBvciBtYWtlLWZpbGVzIGZvciBzb21lIGV4aXN0aW5nIEdvb2dsZSBUZXN0IGNsaWVudHMuIERvIG5vdAotLy8gI2luY2x1ZGUgdGhpcyBmaWxlIGFueXdoZXJlIGVsc2UhCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgotLy8gaGlzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCi0jZWxpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGluY2x1ZGUgPGRpcmVjdC5oPiAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgewotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBNb3ZlIHRoZXNlIHRvIHRoZSBQT1NJWCBhZGFwdGVyIHNlY3Rpb24gaW4KLS8vIGd0ZXN0LXBvcnQuaC4KLQotLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgdGhlIHJlbW92ZSBDIGZ1bmN0aW9uLgotaW50IHJlbW92ZShjb25zdCBjaGFyKiBwYXRoKSB7Ci0gIExQQ1dTVFIgd3BhdGggPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGgpOwotICBpbnQgcmV0ID0gRGVsZXRlRmlsZSh3cGF0aCkgPyAwIDogLTE7Ci0gIGRlbGV0ZSBbXSB3cGF0aDsKLSAgcmV0dXJuIHJldDsKLX0KLS8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIHRoZSBfcm1kaXIgQyBmdW5jdGlvbi4KLWludCBfcm1kaXIoY29uc3QgY2hhciogcGF0aCkgewotICBGaWxlUGF0aCBmaWxlcGF0aChwYXRoKTsKLSAgTFBDV1NUUiB3cGF0aCA9IFN0cmluZzo6QW5zaVRvVXRmMTYoCi0gICAgICBmaWxlcGF0aC5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5jX3N0cigpKTsKLSAgaW50IHJldCA9IFJlbW92ZURpcmVjdG9yeSh3cGF0aCkgPyAwIDogLTE7Ci0gIGRlbGV0ZSBbXSB3cGF0aDsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2Vsc2UKLQotVEVTVChHZXRDdXJyZW50RGlyVGVzdCwgUmV0dXJuc0N1cnJlbnREaXIpIHsKLSAgY29uc3QgRmlsZVBhdGggb3JpZ2luYWxfZGlyID0gRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKTsKLSAgRVhQRUNUX0ZBTFNFKG9yaWdpbmFsX2Rpci5Jc0VtcHR5KCkpOwotCi0gIHBvc2l4OjpDaERpcihHVEVTVF9QQVRIX1NFUF8pOwotICBjb25zdCBGaWxlUGF0aCBjd2QgPSBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpOwotICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfZGlyLmNfc3RyKCkpOwotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLQotICAvLyBTa2lwcyB0aGUgIjoiLgotICBjb25zdCBjaGFyKiBjb25zdCBjd2Rfd2l0aG91dF9kcml2ZSA9IHN0cmNocihjd2QuY19zdHIoKSwgJzonKTsKLSAgQVNTRVJUX1RSVUUoY3dkX3dpdGhvdXRfZHJpdmUgIT0gTlVMTCk7Ci0gIEVYUEVDVF9TVFJFUShHVEVTVF9QQVRIX1NFUF8sIGN3ZF93aXRob3V0X2RyaXZlICsgMSk7Ci0KLSMgZWxzZQotCi0gIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8sIGN3ZC5zdHJpbmcoKSk7Ci0KLSMgZW5kaWYKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi1URVNUKElzRW1wdHlUZXN0LCBSZXR1cm5zVHJ1ZUZvckVtcHR5UGF0aCkgewotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiIikuSXNFbXB0eSgpKTsKLX0KLQotVEVTVChJc0VtcHR5VGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uRW1wdHlQYXRoKSB7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYSIpLklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiLiIpLklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYS9iIikuSXNFbXB0eSgpKTsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJhXFxiXFwiKS5Jc0VtcHR5KCkpOwotfQotCi0vLyBSZW1vdmVEaXJlY3RvcnlOYW1lICIiIC0+ICIiCi1URVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVuRW1wdHlOYW1lKSB7Ci0gIEVYUEVDVF9FUSgiIiwgRmlsZVBhdGgoIiIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFmaWxlIiAtPiAiYWZpbGUiCi1URVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBCdXROb0RpcmVjdG9yeSkgewotICBFWFBFQ1RfRVEoImFmaWxlIiwKLSAgICAgIEZpbGVQYXRoKCJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZURpcmVjdG9yeU5hbWUgIi9hZmlsZSIgLT4gImFmaWxlIgotVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgUm9vdEZpbGVTaG91bGRHaXZlRmlsZU5hbWUpIHsKLSAgRVhQRUNUX0VRKCJhZmlsZSIsCi0gICAgICBGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLnN0cmluZygpKTsKLX0KLQotLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiYWRpci8iIC0+ICIiCi1URVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVyZVRoZXJlSXNOb0ZpbGVOYW1lKSB7Ci0gIEVYUEVDVF9FUSgiIiwKLSAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8pLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvYWZpbGUiIC0+ICJhZmlsZSIKLVRFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEdpdmVGaWxlTmFtZSkgewotICBFWFBFQ1RfRVEoImFmaWxlIiwKLSAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLnN0cmluZygpKTsKLX0KLQotLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiYWRpci9zdWJkaXIvYWZpbGUiIC0+ICJhZmlsZSIKLVRFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEFsc29HaXZlRmlsZU5hbWUpIHsKLSAgRVhQRUNUX0VRKCJhZmlsZSIsCi0gICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKQotICAgICAgLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXwotCi0vLyBUZXN0cyB0aGF0IFJlbW92ZURpcmVjdG9yeU5hbWUoKSB3b3JrcyB3aXRoIHRoZSBhbHRlcm5hdGUgc2VwYXJhdG9yCi0vLyBvbiBXaW5kb3dzLgotCi0vLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCIvYWZpbGUiKSAtPiAiYWZpbGUiCi1URVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBSb290RmlsZVNob3VsZEdpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgewotICBFWFBFQ1RfRVEoImFmaWxlIiwgRmlsZVBhdGgoIi9hZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZURpcmVjdG9yeU5hbWUoImFkaXIvIikgLT4gIiIKLVRFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFdoZXJlVGhlcmVJc05vRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKLSAgRVhQRUNUX0VRKCIiLCBGaWxlUGF0aCgiYWRpci8iKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOwotfQotCi0vLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyL2FmaWxlIikgLT4gImFmaWxlIgotVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgU2hvdWxkR2l2ZUZpbGVOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7Ci0gIEVYUEVDVF9FUSgiYWZpbGUiLCBGaWxlUGF0aCgiYWRpci9hZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZURpcmVjdG9yeU5hbWUoImFkaXIvc3ViZGlyL2FmaWxlIikgLT4gImFmaWxlIgotVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgU2hvdWxkQWxzb0dpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgewotICBFWFBFQ1RfRVEoImFmaWxlIiwKLSAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL3N1YmRpci9hZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLSNlbmRpZgotCi0vLyBSZW1vdmVGaWxlTmFtZSAiIiAtPiAiLi8iCi1URVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgRW1wdHlOYW1lKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgLy8gT24gV2luZG93cyBDRSwgd2UgdXNlIHRoZSByb290IGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXywgRmlsZVBhdGgoIiIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOwotI2Vsc2UKLSAgRVhQRUNUX0VRKCIuIiBHVEVTVF9QQVRIX1NFUF8sIEZpbGVQYXRoKCIiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKLSNlbmRpZgotfQotCi0vLyBSZW1vdmVGaWxlTmFtZSAiYWRpci8iIC0+ICJhZGlyLyIKLVRFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBCdXROb0ZpbGUpIHsKLSAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCi0gICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKLX0KLQotLy8gUmVtb3ZlRmlsZU5hbWUgImFkaXIvYWZpbGUiIC0+ICJhZGlyLyIKLVRFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc0Rpck5hbWUpIHsKLSAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCi0gICAgICAgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOwotfQotCi0vLyBSZW1vdmVGaWxlTmFtZSAiYWRpci9zdWJkaXIvYWZpbGUiIC0+ICJhZGlyL3N1YmRpci8iCi1URVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJBbmRTdWJEaXJOYW1lKSB7Ci0gIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXywKLSAgICAgIEZpbGVQYXRoKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gInN1YmRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpCi0gICAgICAuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZUZpbGVOYW1lICIvYWZpbGUiIC0+ICIvIgotVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzUm9vdERpcikgewotICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfLAotICAgICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOwotfQotCi0jaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KLQotLy8gVGVzdHMgdGhhdCBSZW1vdmVGaWxlTmFtZSgpIHdvcmtzIHdpdGggdGhlIGFsdGVybmF0ZSBzZXBhcmF0b3Igb24KLS8vIFdpbmRvd3MuCi0KLS8vIFJlbW92ZUZpbGVOYW1lKCJhZGlyLyIpIC0+ICJhZGlyLyIKLVRFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBCdXROb0ZpbGVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKLSAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8sCi0gICAgICAgICAgICBGaWxlUGF0aCgiYWRpci8iKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKLX0KLQotLy8gUmVtb3ZlRmlsZU5hbWUoImFkaXIvYWZpbGUiKSAtPiAiYWRpci8iCi1URVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7Ci0gIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAotICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKLX0KLQotLy8gUmVtb3ZlRmlsZU5hbWUoImFkaXIvc3ViZGlyL2FmaWxlIikgLT4gImFkaXIvc3ViZGlyLyIKLVRFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc0RpckFuZFN1YkRpck5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKLSAgRVhQRUNUX0VRKCJhZGlyIiBHVEVTVF9QQVRIX1NFUF8gInN1YmRpciIgR1RFU1RfUEFUSF9TRVBfLAotICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvc3ViZGlyL2FmaWxlIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZUZpbGVOYW1lKCIvYWZpbGUiKSAtPiAiXCIKLVRFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc1Jvb3REaXJGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKLSAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXywgRmlsZVBhdGgoIi9hZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOwotfQotCi0jZW5kaWYKLQotVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZVdoZW5OdW1iZXJJc1plcm8pIHsKLSAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiksIEZpbGVQYXRoKCJiYXIiKSwKLSAgICAgIDAsICJ4bWwiKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZU51bWJlckd0WmVybykgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iKSwgRmlsZVBhdGgoImJhciIpLAotICAgICAgMTIsICJ4bWwiKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyXzEyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZVdpdGhTbGFzaE51bWJlcklzWmVybykgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCi0gICAgICBGaWxlUGF0aCgiYmFyIiksIDAsICJ4bWwiKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVGaWxlTmFtZVdpdGhTbGFzaE51bWJlckd0WmVybykgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCi0gICAgICBGaWxlUGF0aCgiYmFyIiksIDEyLCAieG1sIik7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhcl8xMi54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOwotfQotCi1URVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlV2hlbk51bWJlcklzWmVyb0FuZERpcklzRW1wdHkpIHsKLSAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiIiksIEZpbGVQYXRoKCJiYXIiKSwKLSAgICAgIDAsICJ4bWwiKTsKLSAgRVhQRUNUX0VRKCJiYXIueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKLX0KLQotVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZVdoZW5OdW1iZXJJc05vdFplcm9BbmREaXJJc0VtcHR5KSB7Ci0gIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoIiIpLCBGaWxlUGF0aCgiYmFyIiksCi0gICAgICAxNCwgInhtbCIpOwotICBFWFBFQ1RfRVEoImJhcl8xNC54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOwotfQotCi1URVNUKENvbmNhdFBhdGhzVGVzdCwgV29ya3NXaGVuRGlyRG9lc05vdEVuZFdpdGhQYXRoU2VwKSB7Ci0gIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiYmFyLnhtbCIpKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoQ29uY2F0UGF0aHNUZXN0LCBXb3Jrc1doZW5QYXRoMUVuZHNXaXRoUGF0aFNlcCkgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIueG1sIikpOwotICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKLX0KLQotVEVTVChDb25jYXRQYXRoc1Rlc3QsIFBhdGgxQmVpbmdFbXB0eSkgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhci54bWwiKSk7Ci0gIEVYUEVDVF9FUSgiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMkJlaW5nRW1wdHkpIHsKLSAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iKSwgRmlsZVBhdGgoIiIpKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywgYWN0dWFsLnN0cmluZygpKTsKLX0KLQotVEVTVChDb25jYXRQYXRoc1Rlc3QsIEJvdGhQYXRoQmVpbmdFbXB0eSkgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoIiIpKTsKLSAgRVhQRUNUX0VRKCIiLCBhY3R1YWwuc3RyaW5nKCkpOwotfQotCi1URVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDFDb250YWluc1BhdGhTZXApIHsKLSAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiZm9vYmFyLnhtbCIpKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiBHVEVTVF9QQVRIX1NFUF8gImZvb2Jhci54bWwiLAotICAgICAgICAgICAgYWN0dWFsLnN0cmluZygpKTsKLX0KLQotVEVTVChDb25jYXRQYXRoc1Rlc3QsIFBhdGgyQ29udGFpbnNQYXRoU2VwKSB7Ci0gIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocygKLSAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCi0gICAgICBGaWxlUGF0aCgiYmFyIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIiwKLSAgICAgICAgICAgIGFjdHVhbC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMkVuZHNXaXRoUGF0aFNlcCkgewotICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhciIgR1RFU1RfUEFUSF9TRVBfKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfLCBhY3R1YWwuc3RyaW5nKCkpOwotfQotCi0vLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgIiIgLT4gIiIKLVRFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgRW1wdHlTdHJpbmcpIHsKLSAgRVhQRUNUX0VRKCIiLCBGaWxlUGF0aCgiIikuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOwotfQotCi0vLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvbyIgLT4gImZvbyIKLVRFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgRmlsZU5vU2xhc2hTdHJpbmcpIHsKLSAgRVhQRUNUX0VRKCJmb28iLCBGaWxlUGF0aCgiZm9vIikuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOwotfQotCi0vLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvby8iIC0+ICJmb28iCi1URVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIFNob3VsZFJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKSB7Ci0gIEVYUEVDVF9FUSgiZm9vIiwKLSAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXykuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOwotI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCi0gIEVYUEVDVF9FUSgiZm9vIiwgRmlsZVBhdGgoImZvby8iKS5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5zdHJpbmcoKSk7Ci0jZW5kaWYKLX0KLQotLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28vYmFyLyIgLT4gImZvby9iYXIvIgotVEVTVChSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JUZXN0LCBTaG91bGRSZW1vdmVMYXN0U2VwYXJhdG9yKSB7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCi0gICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfKQotICAgICAgICAgICAgICAgIC5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvciAiZm9vL2JhciIgLT4gImZvby9iYXIiCi1URVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIFNob3VsZFJldHVyblVubW9kaWZpZWQpIHsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKLSAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIikKLSAgICAgICAgICAgICAgICAuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOwotfQotCi1URVNUKERpcmVjdG9yeVRlc3QsIFJvb3REaXJlY3RvcnlFeGlzdHMpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cy4KLSAgY2hhciBjdXJyZW50X2RyaXZlW19NQVhfUEFUSF07ICAvLyBOT0xJTlQKLSAgY3VycmVudF9kcml2ZVswXSA9IHN0YXRpY19jYXN0PGNoYXI+KF9nZXRkcml2ZSgpICsgJ0EnIC0gMSk7Ci0gIGN1cnJlbnRfZHJpdmVbMV0gPSAnOic7Ci0gIGN1cnJlbnRfZHJpdmVbMl0gPSAnXFwnOwotICBjdXJyZW50X2RyaXZlWzNdID0gJ1wwJzsKLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoY3VycmVudF9kcml2ZSkuRGlyZWN0b3J5RXhpc3RzKCkpOwotI2Vsc2UKLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8iKS5EaXJlY3RvcnlFeGlzdHMoKSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLX0KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLVRFU1QoRGlyZWN0b3J5VGVzdCwgUm9vdE9mV3JvbmdEcml2ZURvZXNOb3RFeGlzdHMpIHsKLSAgY29uc3QgaW50IHNhdmVkX2RyaXZlXyA9IF9nZXRkcml2ZSgpOwotICAvLyBGaW5kIGEgZHJpdmUgdGhhdCBkb2Vzbid0IGV4aXN0LiBTdGFydCB3aXRoICdaJyB0byBhdm9pZCBjb21tb24gb25lcy4KLSAgZm9yIChjaGFyIGRyaXZlID0gJ1onOyBkcml2ZSA+PSAnQSc7IGRyaXZlLS0pCi0gICAgaWYgKF9jaGRyaXZlKGRyaXZlIC0gJ0EnICsgMSkgPT0gLTEpIHsKLSAgICAgIGNoYXIgbm9uX2RyaXZlW19NQVhfUEFUSF07ICAvLyBOT0xJTlQKLSAgICAgIG5vbl9kcml2ZVswXSA9IGRyaXZlOwotICAgICAgbm9uX2RyaXZlWzFdID0gJzonOwotICAgICAgbm9uX2RyaXZlWzJdID0gJ1xcJzsKLSAgICAgIG5vbl9kcml2ZVszXSA9ICdcMCc7Ci0gICAgICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgobm9uX2RyaXZlKS5EaXJlY3RvcnlFeGlzdHMoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIF9jaGRyaXZlKHNhdmVkX2RyaXZlXyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotLy8gV2luZG93cyBDRSBfZG9lc18gY29uc2lkZXIgYW4gZW1wdHkgZGlyZWN0b3J5IHRvIGV4aXN0LgotVEVTVChEaXJlY3RvcnlUZXN0LCBFbXB0eVBhdGhEaXJlY3RvcnlEb2VzTm90RXhpc3QpIHsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5EaXJlY3RvcnlFeGlzdHMoKSk7Ci19Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi1URVNUKERpcmVjdG9yeVRlc3QsIEN1cnJlbnREaXJlY3RvcnlFeGlzdHMpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cy4KLSMgaWZuZGVmIF9XSU4zMl9DRSAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeS4KLQotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLiIpLkRpcmVjdG9yeUV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi5cXCIpLkRpcmVjdG9yeUV4aXN0cygpKTsKLQotIyBlbmRpZiAgLy8gX1dJTjMyX0NFCi0jZWxzZQotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLiIpLkRpcmVjdG9yeUV4aXN0cygpKTsKLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4vIikuRGlyZWN0b3J5RXhpc3RzKCkpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi19Ci0KLS8vICJmb28vYmFyIiA9PSBmb28vL2JhciIgPT0gImZvby8vL2JhciIKLVRFU1QoTm9ybWFsaXplVGVzdCwgTXVsdGlwbGVDb25zZWN1dGl2ZVNlcGFwYXJhdG9yc0luTWlkc3RyaW5nKSB7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCi0gICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKLSAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKLSAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8KLSAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOwotfQotCi0vLyAiL2JhciIgPT0gLy9iYXIiID09ICIvLy9iYXIiCi1URVNUKE5vcm1hbGl6ZVRlc3QsIE11bHRpcGxlQ29uc2VjdXRpdmVTZXBhcGFyYXRvcnNBdFN0cmluZ1N0YXJ0KSB7Ci0gIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8gImJhciIsCi0gICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8gImJhciIsCi0gICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAotICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7Ci19Ci0KLS8vICJmb28vIiA9PSBmb28vLyIgPT0gImZvby8vLyIKLVRFU1QoTm9ybWFsaXplVGVzdCwgTXVsdGlwbGVDb25zZWN1dGl2ZVNlcGFwYXJhdG9yc0F0U3RyaW5nRW5kKSB7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sCi0gICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfKS5zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sCi0gICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXykuc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAotICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfKS5zdHJpbmcoKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXwotCi0vLyBUZXN0cyB0aGF0IHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFyZSBub3JtYWxpemVkCi0vLyByZWdhcmRsZXNzIG9mIHRoZWlyIGNvbWJpbmF0aW9uIChlLmcuICJmb29cIiA9PSJmb28vXCIgPT0KLS8vICJmb29cXC8iKS4KLVRFU1QoTm9ybWFsaXplVGVzdCwgTWl4QWx0ZXJuYXRlU2VwYXJhdG9yQXRTdHJpbmdFbmQpIHsKLSAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKLSAgICAgICAgICAgIEZpbGVQYXRoKCJmb28vIikuc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAotICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICIvIikuc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAotICAgICAgICAgICAgRmlsZVBhdGgoImZvby8vIiBHVEVTVF9QQVRIX1NFUF8pLnN0cmluZygpKTsKLX0KLQotI2VuZGlmCi0KLVRFU1QoQXNzaWdubWVudE9wZXJhdG9yVGVzdCwgRGVmYXVsdEFzc2lnbmVkVG9Ob25EZWZhdWx0KSB7Ci0gIEZpbGVQYXRoIGRlZmF1bHRfcGF0aDsKLSAgRmlsZVBhdGggbm9uX2RlZmF1bHRfcGF0aCgicGF0aCIpOwotICBub25fZGVmYXVsdF9wYXRoID0gZGVmYXVsdF9wYXRoOwotICBFWFBFQ1RfRVEoIiIsIG5vbl9kZWZhdWx0X3BhdGguc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoIiIsIGRlZmF1bHRfcGF0aC5zdHJpbmcoKSk7ICAvLyBSSFMgdmFyIGlzIHVuY2hhbmdlZC4KLX0KLQotVEVTVChBc3NpZ25tZW50T3BlcmF0b3JUZXN0LCBOb25EZWZhdWx0QXNzaWduZWRUb0RlZmF1bHQpIHsKLSAgRmlsZVBhdGggbm9uX2RlZmF1bHRfcGF0aCgicGF0aCIpOwotICBGaWxlUGF0aCBkZWZhdWx0X3BhdGg7Ci0gIGRlZmF1bHRfcGF0aCA9IG5vbl9kZWZhdWx0X3BhdGg7Ci0gIEVYUEVDVF9FUSgicGF0aCIsIGRlZmF1bHRfcGF0aC5zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgicGF0aCIsIG5vbl9kZWZhdWx0X3BhdGguc3RyaW5nKCkpOyAgLy8gUkhTIHZhciBpcyB1bmNoYW5nZWQuCi19Ci0KLVRFU1QoQXNzaWdubWVudE9wZXJhdG9yVGVzdCwgQ29uc3RBc3NpZ25lZFRvTm9uQ29uc3QpIHsKLSAgY29uc3QgRmlsZVBhdGggY29uc3RfZGVmYXVsdF9wYXRoKCJjb25zdF9wYXRoIik7Ci0gIEZpbGVQYXRoIG5vbl9kZWZhdWx0X3BhdGgoInBhdGgiKTsKLSAgbm9uX2RlZmF1bHRfcGF0aCA9IGNvbnN0X2RlZmF1bHRfcGF0aDsKLSAgRVhQRUNUX0VRKCJjb25zdF9wYXRoIiwgbm9uX2RlZmF1bHRfcGF0aC5zdHJpbmcoKSk7Ci19Ci0KLWNsYXNzIERpcmVjdG9yeUNyZWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB0ZXN0ZGF0YV9wYXRoXy5TZXQoRmlsZVBhdGgoCi0gICAgICAgIFRlbXBEaXIoKSArIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpICsKLSAgICAgICAgIl9kaXJlY3RvcnlfY3JlYXRpb24iIEdURVNUX1BBVEhfU0VQXyAidGVzdCIgR1RFU1RfUEFUSF9TRVBfKSk7Ci0gICAgdGVzdGRhdGFfZmlsZV8uU2V0KHRlc3RkYXRhX3BhdGhfLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKLQotICAgIHVuaXF1ZV9maWxlMF8uU2V0KEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUodGVzdGRhdGFfcGF0aF8sIEZpbGVQYXRoKCJ1bmlxdWUiKSwKLSAgICAgICAgMCwgInR4dCIpKTsKLSAgICB1bmlxdWVfZmlsZTFfLlNldChGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLCBGaWxlUGF0aCgidW5pcXVlIiksCi0gICAgICAgIDEsICJ0eHQiKSk7Ci0KLSAgICByZW1vdmUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7Ci0gICAgcmVtb3ZlKHVuaXF1ZV9maWxlMF8uY19zdHIoKSk7Ci0gICAgcmVtb3ZlKHVuaXF1ZV9maWxlMV8uY19zdHIoKSk7Ci0gICAgcG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIHJlbW92ZSh0ZXN0ZGF0YV9maWxlXy5jX3N0cigpKTsKLSAgICByZW1vdmUodW5pcXVlX2ZpbGUwXy5jX3N0cigpKTsKLSAgICByZW1vdmUodW5pcXVlX2ZpbGUxXy5jX3N0cigpKTsKLSAgICBwb3NpeDo6Um1EaXIodGVzdGRhdGFfcGF0aF8uY19zdHIoKSk7Ci0gIH0KLQotICB2b2lkIENyZWF0ZVRleHRGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gICAgRklMRSogZiA9IHBvc2l4OjpGT3BlbihmaWxlbmFtZSwgInciKTsKLSAgICBmcHJpbnRmKGYsICJ0ZXh0XG4iKTsKLSAgICBmY2xvc2UoZik7Ci0gIH0KLQotICAvLyBTdHJpbmdzIHJlcHJlc2VudGluZyBhIGRpcmVjdG9yeSBhbmQgYSBmaWxlLCB3aXRoIGlkZW50aWNhbCBwYXRocwotICAvLyBleGNlcHQgZm9yIHRoZSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyIHRoYXQgZGlzdGlucXVpc2hlcwotICAvLyBhIGRpcmVjdG9yeSBuYW1lZCAndGVzdCcgZnJvbSBhIGZpbGUgbmFtZWQgJ3Rlc3QnLiBFeGFtcGxlIG5hbWVzOgotICBGaWxlUGF0aCB0ZXN0ZGF0YV9wYXRoXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0LyIKLSAgRmlsZVBhdGggdGVzdGRhdGFfZmlsZV87ICAvLyAiL3RtcC9kaXJlY3RvcnlfY3JlYXRpb24vdGVzdCIKLSAgRmlsZVBhdGggdW5pcXVlX2ZpbGUwXzsgIC8vICIvdG1wL2RpcmVjdG9yeV9jcmVhdGlvbi90ZXN0L3VuaXF1ZS50eHQiCi0gIEZpbGVQYXRoIHVuaXF1ZV9maWxlMV87ICAvLyAiL3RtcC9kaXJlY3RvcnlfY3JlYXRpb24vdGVzdC91bmlxdWVfMS50eHQiCi19OwotCi1URVNUX0YoRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KSB7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9wYXRoXy5EaXJlY3RvcnlFeGlzdHMoKSkgPDwgdGVzdGRhdGFfcGF0aF8uc3RyaW5nKCk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkRpcmVjdG9yeUV4aXN0cygpKTsKLX0KLQotVEVTVF9GKERpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlRGlyZWN0b3JpZXNGb3JBbHJlYWR5RXhpc3RpbmdQYXRoKSB7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9wYXRoXy5EaXJlY3RvcnlFeGlzdHMoKSkgPDwgdGVzdGRhdGFfcGF0aF8uc3RyaW5nKCk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Ci0gIC8vIENhbGwgJ2NyZWF0ZScgYWdhaW4uLi4gc2hvdWxkIHN0aWxsIHN1Y2NlZWQuCi0gIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSk7Ci19Ci0KLVRFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzQW5kVW5pcXVlRmlsZW5hbWUpIHsKLSAgRmlsZVBhdGggZmlsZV9wYXRoKEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLAotICAgICAgRmlsZVBhdGgoInVuaXF1ZSIpLCAidHh0IikpOwotICBFWFBFQ1RfRVEodW5pcXVlX2ZpbGUwXy5zdHJpbmcoKSwgZmlsZV9wYXRoLnN0cmluZygpKTsKLSAgRVhQRUNUX0ZBTFNFKGZpbGVfcGF0aC5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7ICAvLyBmaWxlIG5vdCB0aGVyZQotCi0gIHRlc3RkYXRhX3BhdGhfLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKTsKLSAgRVhQRUNUX0ZBTFNFKGZpbGVfcGF0aC5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7ICAvLyBmaWxlIHN0aWxsIG5vdCB0aGVyZQotICBDcmVhdGVUZXh0RmlsZShmaWxlX3BhdGguY19zdHIoKSk7Ci0gIEVYUEVDVF9UUlVFKGZpbGVfcGF0aC5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7Ci0KLSAgRmlsZVBhdGggZmlsZV9wYXRoMihGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSh0ZXN0ZGF0YV9wYXRoXywKLSAgICAgIEZpbGVQYXRoKCJ1bmlxdWUiKSwgInR4dCIpKTsKLSAgRVhQRUNUX0VRKHVuaXF1ZV9maWxlMV8uc3RyaW5nKCksIGZpbGVfcGF0aDIuc3RyaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UoZmlsZV9wYXRoMi5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7ICAvLyBmaWxlIG5vdCB0aGVyZQotICBDcmVhdGVUZXh0RmlsZShmaWxlX3BhdGgyLmNfc3RyKCkpOwotICBFWFBFQ1RfVFJVRShmaWxlX3BhdGgyLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKLX0KLQotVEVTVF9GKERpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlRGlyZWN0b3JpZXNGYWlsKSB7Ci0gIC8vIGZvcmNlIGEgZmFpbHVyZSBieSBwdXR0aW5nIGEgZmlsZSB3aGVyZSB3ZSB3aWxsIHRyeSB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0gIENyZWF0ZVRleHRGaWxlKHRlc3RkYXRhX2ZpbGVfLmNfc3RyKCkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9maWxlXy5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9maWxlXy5EaXJlY3RvcnlFeGlzdHMoKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0ZGF0YV9maWxlXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOwotfQotCi1URVNUKE5vRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVOb0RpcmVjdG9yaWVzRm9yRGVmYXVsdFhtbEZpbGUpIHsKLSAgY29uc3QgRmlsZVBhdGggdGVzdF9kZXRhaWxfeG1sKCJ0ZXN0X2RldGFpbC54bWwiKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfZGV0YWlsX3htbC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOwotfQotCi1URVNUKEZpbGVQYXRoVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7Ci0gIEZpbGVQYXRoIGZwOwotICBFWFBFQ1RfRVEoIiIsIGZwLnN0cmluZygpKTsKLX0KLQotVEVTVChGaWxlUGF0aFRlc3QsIENoYXJBbmRDb3B5Q29uc3RydWN0b3JzKSB7Ci0gIGNvbnN0IEZpbGVQYXRoIGZwKCJzcGljeSIpOwotICBFWFBFQ1RfRVEoInNwaWN5IiwgZnAuc3RyaW5nKCkpOwotCi0gIGNvbnN0IEZpbGVQYXRoIGZwX2NvcHkoZnApOwotICBFWFBFQ1RfRVEoInNwaWN5IiwgZnBfY29weS5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoRmlsZVBhdGhUZXN0LCBTdHJpbmdDb25zdHJ1Y3RvcikgewotICBjb25zdCBGaWxlUGF0aCBmcChzdGQ6OnN0cmluZygiY2lkZXIiKSk7Ci0gIEVYUEVDVF9FUSgiY2lkZXIiLCBmcC5zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoRmlsZVBhdGhUZXN0LCBTZXQpIHsKLSAgY29uc3QgRmlsZVBhdGggYXBwbGUoImFwcGxlIik7Ci0gIEZpbGVQYXRoIG1hYygibWFjIik7Ci0gIG1hYy5TZXQoYXBwbGUpOyAgLy8gSW1wbGVtZW50IFNldCgpIHNpbmNlIG92ZXJsb2FkaW5nIG9wZXJhdG9yPSBpcyBmb3JiaWRkZW4uCi0gIEVYUEVDVF9FUSgiYXBwbGUiLCBtYWMuc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoImFwcGxlIiwgYXBwbGUuc3RyaW5nKCkpOwotfQotCi1URVNUKEZpbGVQYXRoVGVzdCwgVG9TdHJpbmcpIHsKLSAgY29uc3QgRmlsZVBhdGggZmlsZSgiZHJpbmsiKTsKLSAgRVhQRUNUX0VRKCJkcmluayIsIGZpbGUuc3RyaW5nKCkpOwotfQotCi1URVNUKEZpbGVQYXRoVGVzdCwgUmVtb3ZlRXh0ZW5zaW9uKSB7Ci0gIEVYUEVDVF9FUSgiYXBwIiwgRmlsZVBhdGgoImFwcC5jYyIpLlJlbW92ZUV4dGVuc2lvbigiY2MiKS5zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgiYXBwIiwgRmlsZVBhdGgoImFwcC5leGUiKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpLnN0cmluZygpKTsKLSAgRVhQRUNUX0VRKCJBUFAiLCBGaWxlUGF0aCgiQVBQLkVYRSIpLlJlbW92ZUV4dGVuc2lvbigiZXhlIikuc3RyaW5nKCkpOwotfQotCi1URVNUKEZpbGVQYXRoVGVzdCwgUmVtb3ZlRXh0ZW5zaW9uV2hlblRoZXJlSXNOb0V4dGVuc2lvbikgewotICBFWFBFQ1RfRVEoImFwcCIsIEZpbGVQYXRoKCJhcHAiKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpLnN0cmluZygpKTsKLX0KLQotVEVTVChGaWxlUGF0aFRlc3QsIElzRGlyZWN0b3J5KSB7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiY29sYSIpLklzRGlyZWN0b3J5KCkpOwotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgia29hbGEiIEdURVNUX1BBVEhfU0VQXykuSXNEaXJlY3RvcnkoKSk7Ci0jaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImtvYWxhLyIpLklzRGlyZWN0b3J5KCkpOwotI2VuZGlmCi19Ci0KLVRFU1QoRmlsZVBhdGhUZXN0LCBJc0Fic29sdXRlUGF0aCkgewotICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImlzIiBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikuSXNBYnNvbHV0ZVBhdGgoKSk7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuSXNBYnNvbHV0ZVBhdGgoKSk7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiYzpcXCIgR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiCi0gICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjOmZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5Jc0Fic29sdXRlUGF0aCgpKTsKLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImM6LyIgR1RFU1RfUEFUSF9TRVBfICJpc19ub3QiCi0gICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BBVEhfU0VQXyAicmVsYXRpdmUiKS5Jc0Fic29sdXRlUGF0aCgpKTsKLSNlbHNlCi0gIEVYUEVDVF9UUlVFKEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiaXNfbm90IiBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikKLSAgICAgICAgICAgICAgLklzQWJzb2x1dGVQYXRoKCkpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi19Ci0KLVRFU1QoRmlsZVBhdGhUZXN0LCBJc1Jvb3REaXJlY3RvcnkpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJhOlxcIikuSXNSb290RGlyZWN0b3J5KCkpOwotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiWjovIikuSXNSb290RGlyZWN0b3J5KCkpOwotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiZTovLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYjoiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7Ci0gIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYjphIikuSXNSb290RGlyZWN0b3J5KCkpOwotICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIjg6LyIpLklzUm9vdERpcmVjdG9yeSgpKTsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJjfC8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7Ci0jZWxzZQotICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKLSAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8vIikuSXNSb290RGlyZWN0b3J5KCkpOwotICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIiIpLklzUm9vdERpcmVjdG9yeSgpKTsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJcXCIpLklzUm9vdERpcmVjdG9yeSgpKTsKLSAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIveCIpLklzUm9vdERpcmVjdG9yeSgpKTsKLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtbGlua2VkX3B0cl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNmNTEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDMsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IERhbiBFZ25vciAoZWdub3JAZ29vZ2xlLmNvbSkKLS8vIFBvcnRlZCB0byBXaW5kb3dzOiBWYWRpbSBCZXJtYW4gKHZhZGltYkBnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOwotCi1pbnQgbnVtOwotTWVzc2FnZSogaGlzdG9yeSA9IE5VTEw7Ci0KLS8vIENsYXNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgotY2xhc3MgQSB7Ci0gcHVibGljOgotICBBKCk6IG15bnVtKG51bSsrKSB7ICpoaXN0b3J5IDw8ICJBIiA8PCBteW51bSA8PCAiIGN0b3JcbiI7IH0KLSAgdmlydHVhbCB+QSgpIHsgKmhpc3RvcnkgPDwgIkEiIDw8IG15bnVtIDw8ICIgZHRvclxuIjsgfQotICB2aXJ0dWFsIHZvaWQgVXNlKCkgeyAqaGlzdG9yeSA8PCAiQSIgPDwgbXludW0gPDwgIiB1c2VcbiI7IH0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBteW51bTsKLX07Ci0KLS8vIFN1YmNsYXNzCi1jbGFzcyBCIDogcHVibGljIEEgewotIHB1YmxpYzoKLSAgQigpIHsgKmhpc3RvcnkgPDwgIkIiIDw8IG15bnVtIDw8ICIgY3RvclxuIjsgfQotICB+QigpIHsgKmhpc3RvcnkgPDwgIkIiIDw8IG15bnVtIDw8ICIgZHRvclxuIjsgfQotICB2aXJ0dWFsIHZvaWQgVXNlKCkgeyAqaGlzdG9yeSA8PCAiQiIgPDwgbXludW0gPDwgIiB1c2VcbiI7IH0KLX07Ci0KLWNsYXNzIExpbmtlZFB0clRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBMaW5rZWRQdHJUZXN0KCkgewotICAgIG51bSA9IDA7Ci0gICAgaGlzdG9yeSA9IG5ldyBNZXNzYWdlOwotICB9Ci0KLSAgdmlydHVhbCB+TGlua2VkUHRyVGVzdCgpIHsKLSAgICBkZWxldGUgaGlzdG9yeTsKLSAgICBoaXN0b3J5ID0gTlVMTDsKLSAgfQotfTsKLQotVEVTVF9GKExpbmtlZFB0clRlc3QsIEdlbmVyYWxUZXN0KSB7Ci0gIHsKLSAgICBsaW5rZWRfcHRyPEE+IGEwLCBhMSwgYTI7Ci0gICAgLy8gVXNlIGV4cGxpY2l0IGZ1bmN0aW9uIGNhbGwgbm90YXRpb24gaGVyZSB0byBzdXBwcmVzcyBzZWxmLWFzc2lnbiB3YXJuaW5nLgotICAgIGEwLm9wZXJhdG9yPShhMCk7Ci0gICAgYTEgPSBhMjsKLSAgICBBU1NFUlRfRVEoYTAuZ2V0KCksIHN0YXRpY19jYXN0PEEqPihOVUxMKSk7Ci0gICAgQVNTRVJUX0VRKGExLmdldCgpLCBzdGF0aWNfY2FzdDxBKj4oTlVMTCkpOwotICAgIEFTU0VSVF9FUShhMi5nZXQoKSwgc3RhdGljX2Nhc3Q8QSo+KE5VTEwpKTsKLSAgICBBU1NFUlRfVFJVRShhMCA9PSBOVUxMKTsKLSAgICBBU1NFUlRfVFJVRShhMSA9PSBOVUxMKTsKLSAgICBBU1NFUlRfVFJVRShhMiA9PSBOVUxMKTsKLQotICAgIHsKLSAgICAgIGxpbmtlZF9wdHI8QT4gYTMobmV3IEEpOwotICAgICAgYTAgPSBhMzsKLSAgICAgIEFTU0VSVF9UUlVFKGEwID09IGEzKTsKLSAgICAgIEFTU0VSVF9UUlVFKGEwICE9IE5VTEwpOwotICAgICAgQVNTRVJUX1RSVUUoYTAuZ2V0KCkgPT0gYTMpOwotICAgICAgQVNTRVJUX1RSVUUoYTAgPT0gYTMuZ2V0KCkpOwotICAgICAgbGlua2VkX3B0cjxBPiBhNChhMCk7Ci0gICAgICBhMSA9IGE0OwotICAgICAgbGlua2VkX3B0cjxBPiBhNShuZXcgQSk7Ci0gICAgICBBU1NFUlRfVFJVRShhNS5nZXQoKSAhPSBhMyk7Ci0gICAgICBBU1NFUlRfVFJVRShhNSAhPSBhMy5nZXQoKSk7Ci0gICAgICBhMiA9IGE1OwotICAgICAgbGlua2VkX3B0cjxCPiBiMChuZXcgQik7Ci0gICAgICBsaW5rZWRfcHRyPEE+IGE2KGIwKTsKLSAgICAgIEFTU0VSVF9UUlVFKGIwID09IGE2KTsKLSAgICAgIEFTU0VSVF9UUlVFKGE2ID09IGIwKTsKLSAgICAgIEFTU0VSVF9UUlVFKGIwICE9IE5VTEwpOwotICAgICAgYTUgPSBiMDsKLSAgICAgIGE1ID0gYjA7Ci0gICAgICBhMy0+VXNlKCk7Ci0gICAgICBhNC0+VXNlKCk7Ci0gICAgICBhNS0+VXNlKCk7Ci0gICAgICBhNi0+VXNlKCk7Ci0gICAgICBiMC0+VXNlKCk7Ci0gICAgICAoKmIwKS5Vc2UoKTsKLSAgICAgIGIwLmdldCgpLT5Vc2UoKTsKLSAgICB9Ci0KLSAgICBhMC0+VXNlKCk7Ci0gICAgYTEtPlVzZSgpOwotICAgIGEyLT5Vc2UoKTsKLQotICAgIGExID0gYTI7Ci0gICAgYTIucmVzZXQobmV3IEEpOwotICAgIGEwLnJlc2V0KCk7Ci0KLSAgICBsaW5rZWRfcHRyPEE+IGE3OwotICB9Ci0KLSAgQVNTRVJUX1NUUkVRKAotICAgICJBMCBjdG9yXG4iCi0gICAgIkExIGN0b3JcbiIKLSAgICAiQTIgY3RvclxuIgotICAgICJCMiBjdG9yXG4iCi0gICAgIkEwIHVzZVxuIgotICAgICJBMCB1c2VcbiIKLSAgICAiQjIgdXNlXG4iCi0gICAgIkIyIHVzZVxuIgotICAgICJCMiB1c2VcbiIKLSAgICAiQjIgdXNlXG4iCi0gICAgIkIyIHVzZVxuIgotICAgICJCMiBkdG9yXG4iCi0gICAgIkEyIGR0b3JcbiIKLSAgICAiQTAgdXNlXG4iCi0gICAgIkEwIHVzZVxuIgotICAgICJBMSB1c2VcbiIKLSAgICAiQTMgY3RvclxuIgotICAgICJBMCBkdG9yXG4iCi0gICAgIkEzIGR0b3JcbiIKLSAgICAiQTEgZHRvclxuIiwKLSAgICBoaXN0b3J5LT5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotfSAgLy8gVW5uYW1lZCBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzQ3NjguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgZmlsZSB2ZXJpZmllcyBHb29nbGUgVGVzdCBldmVudCBsaXN0ZW5lcnMgcmVjZWl2ZSBldmVudHMgYXQgdGhlCi0vLyByaWdodCB0aW1lcy4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi11c2luZyA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudDsKLXVzaW5nIDo6dGVzdGluZzo6RW52aXJvbm1lbnQ7Ci11c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0Q2FzZTsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXI7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3RJbmZvOwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKLXVzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7Ci0KLS8vIFVzZWQgYnkgdGVzdHMgdG8gcmVnaXN0ZXIgdGhlaXIgZXZlbnRzLgotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBnX2V2ZW50cyA9IE5VTEw7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcihjb25zdCBjaGFyKiBuYW1lKSA6IG5hbWVfKG5hbWUpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKLSAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RQcm9ncmFtU3RhcnQiKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlOwotICAgIG1lc3NhZ2UgPDwgR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEl0ZXJhdGlvblN0YXJ0IikKLSAgICAgICAgICAgIDw8ICIoIiA8PCBpdGVyYXRpb24gPDwgIikiOwotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2sobWVzc2FnZS5HZXRTdHJpbmcoKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7Ci0gICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IikpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKLSAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1NldFVwRW5kIikpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykgewotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdENhc2VTdGFydCIpKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykgewotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdFN0YXJ0IikpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIC8qdGVzdF9wYXJ0X3Jlc3VsdCovKSB7Ci0gICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UGFydFJlc3VsdCIpKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHsKLSAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RFbmQiKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykgewotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdENhc2VFbmQiKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7Ci0gICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IikpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKLSAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1RlYXJEb3duRW5kIikpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlOwotICAgIG1lc3NhZ2UgPDwgR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEl0ZXJhdGlvbkVuZCIpCi0gICAgICAgICAgICA8PCAiKCIgIDw8IGl0ZXJhdGlvbiA8PCAiKSI7Ci0gICAgZ19ldmVudHMtPnB1c2hfYmFjayhtZXNzYWdlLkdldFN0cmluZygpKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7Ci0gICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0UHJvZ3JhbUVuZCIpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgR2V0RnVsbE1ldGhvZE5hbWUoY29uc3QgY2hhciogbmFtZSkgewotICAgIHJldHVybiBuYW1lXyArICIuIiArIG5hbWU7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBuYW1lXzsKLX07Ci0KLWNsYXNzIEVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXIgOiBwdWJsaWMgRW52aXJvbm1lbnQgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkVudmlyb25tZW50OjpTZXRVcCIpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkVudmlyb25tZW50OjpUZWFyRG93biIpOwotICB9Ci19OwotCi1jbGFzcyBMaXN0ZW5lclRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgewotICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6U2V0VXBUZXN0Q2FzZSIpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duVGVzdENhc2UiKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OlNldFVwIik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIpOwotICB9Ci19OwotCi1URVNUX0YoTGlzdGVuZXJUZXN0LCBEb2VzRm9vKSB7Ci0gIC8vIFRlc3QgZXhlY3V0aW9uIG9yZGVyIHdpdGhpbiBhIHRlc3QgY2FzZSBpcyBub3QgZ3VhcmFudGVlZCBzbyB3ZSBhcmUgbm90Ci0gIC8vIHJlY29yZGluZyB0aGUgdGVzdCBuYW1lLgotICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5Iik7Ci0gIFNVQ0NFRUQoKTsgIC8vIFRyaWdnZXJzIE9uVGVzdFBhcnRSZXN1bHQuCi19Ci0KLVRFU1RfRihMaXN0ZW5lclRlc3QsIERvZXNCYXIpIHsKLSAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIpOwotICBTVUNDRUVEKCk7ICAvLyBUcmlnZ2VycyBPblRlc3RQYXJ0UmVzdWx0LgotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RW52aXJvbm1lbnRJbnZvY2F0aW9uQ2F0Y2hlcjsKLXVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV2ZW50UmVjb3JkaW5nTGlzdGVuZXI7Ci0KLXZvaWQgVmVyaWZ5UmVzdWx0cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIGV4cGVjdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkX2RhdGFfc2l6ZSkgewotICBjb25zdCBzaXplX3QgYWN0dWFsX3NpemUgPSBkYXRhLnNpemUoKTsKLSAgLy8gSWYgdGhlIGZvbGxvd2luZyBhc3NlcnRpb24gZmFpbHMsIGEgbmV3IGVudHJ5IHdpbGwgYmUgYXBwZW5kZWQgdG8KLSAgLy8gZGF0YS4gIEhlbmNlIHdlIHNhdmUgZGF0YS5zaXplKCkgZmlyc3QuCi0gIEVYUEVDVF9FUShleHBlY3RlZF9kYXRhX3NpemUsIGFjdHVhbF9zaXplKTsKLQotICAvLyBDb21wYXJlcyB0aGUgY29tbW9uIHByZWZpeC4KLSAgY29uc3Qgc2l6ZV90IHNob3J0ZXJfc2l6ZSA9IGV4cGVjdGVkX2RhdGFfc2l6ZSA8PSBhY3R1YWxfc2l6ZSA/Ci0gICAgICBleHBlY3RlZF9kYXRhX3NpemUgOiBhY3R1YWxfc2l6ZTsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IgKDsgaSA8IHNob3J0ZXJfc2l6ZTsgKytpKSB7Ci0gICAgQVNTRVJUX1NUUkVRKGV4cGVjdGVkX2RhdGFbaV0sIGRhdGFbaV0uY19zdHIoKSkKLSAgICAgICAgPDwgImF0IHBvc2l0aW9uICIgPDwgaTsKLSAgfQotCi0gIC8vIFByaW50cyBleHRyYSBlbGVtZW50cyBpbiB0aGUgYWN0dWFsIGRhdGEuCi0gIGZvciAoOyBpIDwgYWN0dWFsX3NpemU7ICsraSkgewotICAgIHByaW50ZigiICBBY3R1YWwgZXZlbnQgIyVsdTogJXNcbiIsCi0gICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGkpLCBkYXRhW2ldLmNfc3RyKCkpOwotICB9Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXZlbnRzOwotICBnX2V2ZW50cyA9ICZldmVudHM7Ci0gIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkuQXBwZW5kKAotICAgICAgbmV3IEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIoIjFzdCIpKTsKLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLkFwcGVuZCgKLSAgICAgIG5ldyBFdmVudFJlY29yZGluZ0xpc3RlbmVyKCIybmQiKSk7Ci0KLSAgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBFbnZpcm9ubWVudEludm9jYXRpb25DYXRjaGVyKTsKLQotICBHVEVTVF9DSEVDS18oZXZlbnRzLnNpemUoKSA9PSAwKQotICAgICAgPDwgIkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCBzaG91bGQgbm90IGdlbmVyYXRlIGFueSBldmVudHMgaXRzZWxmLiI7Ci0KLSAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCkgPSAyOwotICBpbnQgcmV0X3ZhbCA9IFJVTl9BTExfVEVTVFMoKTsKLQotICBjb25zdCBjaGFyKiBjb25zdCBleHBlY3RlZF9ldmVudHNbXSA9IHsKLSAgICAiMXN0Lk9uVGVzdFByb2dyYW1TdGFydCIsCi0gICAgIjJuZC5PblRlc3RQcm9ncmFtU3RhcnQiLAotICAgICIxc3QuT25UZXN0SXRlcmF0aW9uU3RhcnQoMCkiLAotICAgICIybmQuT25UZXN0SXRlcmF0aW9uU3RhcnQoMCkiLAotICAgICIxc3QuT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IiwKLSAgICAiMm5kLk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCi0gICAgIkVudmlyb25tZW50OjpTZXRVcCIsCi0gICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKLSAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiLAotICAgICIxc3QuT25UZXN0Q2FzZVN0YXJ0IiwKLSAgICAiMm5kLk9uVGVzdENhc2VTdGFydCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6U2V0VXBUZXN0Q2FzZSIsCi0gICAgIjFzdC5PblRlc3RTdGFydCIsCi0gICAgIjJuZC5PblRlc3RTdGFydCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6U2V0VXAiLAotICAgICJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5IiwKLSAgICAiMXN0Lk9uVGVzdFBhcnRSZXN1bHQiLAotICAgICIybmQuT25UZXN0UGFydFJlc3VsdCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iLAotICAgICIybmQuT25UZXN0RW5kIiwKLSAgICAiMXN0Lk9uVGVzdEVuZCIsCi0gICAgIjFzdC5PblRlc3RTdGFydCIsCi0gICAgIjJuZC5PblRlc3RTdGFydCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6U2V0VXAiLAotICAgICJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5IiwKLSAgICAiMXN0Lk9uVGVzdFBhcnRSZXN1bHQiLAotICAgICIybmQuT25UZXN0UGFydFJlc3VsdCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd24iLAotICAgICIybmQuT25UZXN0RW5kIiwKLSAgICAiMXN0Lk9uVGVzdEVuZCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6VGVhckRvd25UZXN0Q2FzZSIsCi0gICAgIjJuZC5PblRlc3RDYXNlRW5kIiwKLSAgICAiMXN0Lk9uVGVzdENhc2VFbmQiLAotICAgICIxc3QuT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IiwKLSAgICAiMm5kLk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCi0gICAgIkVudmlyb25tZW50OjpUZWFyRG93biIsCi0gICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKLSAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiLAotICAgICIybmQuT25UZXN0SXRlcmF0aW9uRW5kKDApIiwKLSAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvbkVuZCgwKSIsCi0gICAgIjFzdC5PblRlc3RJdGVyYXRpb25TdGFydCgxKSIsCi0gICAgIjJuZC5PblRlc3RJdGVyYXRpb25TdGFydCgxKSIsCi0gICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAotICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IiwKLSAgICAiRW52aXJvbm1lbnQ6OlNldFVwIiwKLSAgICAiMm5kLk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiLAotICAgICIxc3QuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCi0gICAgIjFzdC5PblRlc3RDYXNlU3RhcnQiLAotICAgICIybmQuT25UZXN0Q2FzZVN0YXJ0IiwKLSAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcFRlc3RDYXNlIiwKLSAgICAiMXN0Lk9uVGVzdFN0YXJ0IiwKLSAgICAiMm5kLk9uVGVzdFN0YXJ0IiwKLSAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiLAotICAgICIxc3QuT25UZXN0UGFydFJlc3VsdCIsCi0gICAgIjJuZC5PblRlc3RQYXJ0UmVzdWx0IiwKLSAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIsCi0gICAgIjJuZC5PblRlc3RFbmQiLAotICAgICIxc3QuT25UZXN0RW5kIiwKLSAgICAiMXN0Lk9uVGVzdFN0YXJ0IiwKLSAgICAiMm5kLk9uVGVzdFN0YXJ0IiwKLSAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcCIsCi0gICAgIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiLAotICAgICIxc3QuT25UZXN0UGFydFJlc3VsdCIsCi0gICAgIjJuZC5PblRlc3RQYXJ0UmVzdWx0IiwKLSAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIsCi0gICAgIjJuZC5PblRlc3RFbmQiLAotICAgICIxc3QuT25UZXN0RW5kIiwKLSAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93blRlc3RDYXNlIiwKLSAgICAiMm5kLk9uVGVzdENhc2VFbmQiLAotICAgICIxc3QuT25UZXN0Q2FzZUVuZCIsCi0gICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAotICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IiwKLSAgICAiRW52aXJvbm1lbnQ6OlRlYXJEb3duIiwKLSAgICAiMm5kLk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiLAotICAgICIxc3QuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCi0gICAgIjJuZC5PblRlc3RJdGVyYXRpb25FbmQoMSkiLAotICAgICIxc3QuT25UZXN0SXRlcmF0aW9uRW5kKDEpIiwKLSAgICAiMm5kLk9uVGVzdFByb2dyYW1FbmQiLAotICAgICIxc3QuT25UZXN0UHJvZ3JhbUVuZCIKLSAgfTsKLSAgVmVyaWZ5UmVzdWx0cyhldmVudHMsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXZlbnRzLAotICAgICAgICAgICAgICAgIHNpemVvZihleHBlY3RlZF9ldmVudHMpL3NpemVvZihleHBlY3RlZF9ldmVudHNbMF0pKTsKLQotICAvLyBXZSBuZWVkIHRvIGNoZWNrIG1hbnVhbGx5IGZvciBhZCBob2MgdGVzdCBmYWlsdXJlcyB0aGF0IGhhcHBlbiBhZnRlcgotICAvLyBSVU5fQUxMX1RFU1RTIGZpbmlzaGVzLgotICBpZiAoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkZhaWxlZCgpKQotICAgIHJldF92YWwgPSAxOwotCi0gIHJldHVybiByZXRfdmFsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTIzOGUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRlc3RzIGZvciB0aGUgTWVzc2FnZSBjbGFzcy4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKLQotLy8gVGVzdHMgdGhlIHRlc3Rpbmc6Ok1lc3NhZ2UgY2xhc3MKLQotLy8gVGVzdHMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi1URVNUKE1lc3NhZ2VUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgY29uc3QgTWVzc2FnZSBtc2c7Ci0gIEVYUEVDVF9FUSgiIiwgbXNnLkdldFN0cmluZygpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGNvcHkgY29uc3RydWN0b3IuCi1URVNUKE1lc3NhZ2VUZXN0LCBDb3B5Q29uc3RydWN0b3IpIHsKLSAgY29uc3QgTWVzc2FnZSBtc2cxKCJIZWxsbyIpOwotICBjb25zdCBNZXNzYWdlIG1zZzIobXNnMSk7Ci0gIEVYUEVDVF9FUSgiSGVsbG8iLCBtc2cyLkdldFN0cmluZygpKTsKLX0KLQotLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgTWVzc2FnZSBmcm9tIGEgQy1zdHJpbmcuCi1URVNUKE1lc3NhZ2VUZXN0LCBDb25zdHJ1Y3RzRnJvbUNTdHJpbmcpIHsKLSAgTWVzc2FnZSBtc2coIkhlbGxvIik7Ci0gIEVYUEVDVF9FUSgiSGVsbG8iLCBtc2cuR2V0U3RyaW5nKCkpOwotfQotCi0vLyBUZXN0cyBzdHJlYW1pbmcgYSBmbG9hdC4KLVRFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNGbG9hdCkgewotICBjb25zdCBzdGQ6OnN0cmluZyBzID0gKE1lc3NhZ2UoKSA8PCAxLjIzNDU2RiA8PCAiICIgPDwgMi4zNDU2N0YpLkdldFN0cmluZygpOwotICAvLyBCb3RoIG51bWJlcnMgc2hvdWxkIGJlIHByaW50ZWQgd2l0aCBlbm91Z2ggcHJlY2lzaW9uLgotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiMS4yMzQ1NjAiLCBzLmNfc3RyKCkpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiIDIuMzQ1NjY5Iiwgcy5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgc3RyZWFtaW5nIGEgZG91YmxlLgotVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0RvdWJsZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBzID0gKE1lc3NhZ2UoKSA8PCAxMjYwNTcwODgwLjQ1NTU0OTcgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTI2MDU3MjI2NS4xOTU0NTM0KS5HZXRTdHJpbmcoKTsKLSAgLy8gQm90aCBudW1iZXJzIHNob3VsZCBiZSBwcmludGVkIHdpdGggZW5vdWdoIHByZWNpc2lvbi4KLSAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIjEyNjA1NzA4ODAuNDUiLCBzLmNfc3RyKCkpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiIDEyNjA1NzIyNjUuMTkiLCBzLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyBzdHJlYW1pbmcgYSBub24tY2hhciBwb2ludGVyLgotVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1BvaW50ZXIpIHsKLSAgaW50IG4gPSAwOwotICBpbnQqIHAgPSAmbjsKLSAgRVhQRUNUX05FKCIobnVsbCkiLCAoTWVzc2FnZSgpIDw8IHApLkdldFN0cmluZygpKTsKLX0KLQotLy8gVGVzdHMgc3RyZWFtaW5nIGEgTlVMTCBub24tY2hhciBwb2ludGVyLgotVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc051bGxQb2ludGVyKSB7Ci0gIGludCogcCA9IE5VTEw7Ci0gIEVYUEVDVF9FUSgiKG51bGwpIiwgKE1lc3NhZ2UoKSA8PCBwKS5HZXRTdHJpbmcoKSk7Ci19Ci0KLS8vIFRlc3RzIHN0cmVhbWluZyBhIEMgc3RyaW5nLgotVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0NTdHJpbmcpIHsKLSAgRVhQRUNUX0VRKCJGb28iLCAoTWVzc2FnZSgpIDw8ICJGb28iKS5HZXRTdHJpbmcoKSk7Ci19Ci0KLS8vIFRlc3RzIHN0cmVhbWluZyBhIE5VTEwgQyBzdHJpbmcuCi1URVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zTnVsbENTdHJpbmcpIHsKLSAgY2hhciogcCA9IE5VTEw7Ci0gIEVYUEVDVF9FUSgiKG51bGwpIiwgKE1lc3NhZ2UoKSA8PCBwKS5HZXRTdHJpbmcoKSk7Ci19Ci0KLS8vIFRlc3RzIHN0cmVhbWluZyBzdGQ6OnN0cmluZy4KLVRFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNTdHJpbmcpIHsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIoIkhlbGxvIik7Ci0gIEVYUEVDVF9FUSgiSGVsbG8iLCAoTWVzc2FnZSgpIDw8IHN0cikuR2V0U3RyaW5nKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgc3RyaW5ncyBjb250YWluaW5nIGVtYmVkZGVkIE5VTHMuCi1URVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zU3RyaW5nV2l0aEVtYmVkZGVkTlVMKSB7Ci0gIGNvbnN0IGNoYXIgY2hhcl9hcnJheV93aXRoX251bFtdID0KLSAgICAgICJIZXJlJ3MgYSBOVUxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyI7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyaW5nX3dpdGhfbnVsKGNoYXJfYXJyYXlfd2l0aF9udWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyX2FycmF5X3dpdGhfbnVsKSAtIDEpOwotICBFWFBFQ1RfRVEoIkhlcmUncyBhIE5VTFxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyIsCi0gICAgICAgICAgICAoTWVzc2FnZSgpIDw8IHN0cmluZ193aXRoX251bCkuR2V0U3RyaW5nKCkpOwotfQotCi0vLyBUZXN0cyBzdHJlYW1pbmcgYSBOVUwgY2hhci4KLVRFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNOVUxDaGFyKSB7Ci0gIEVYUEVDVF9FUSgiXFwwIiwgKE1lc3NhZ2UoKSA8PCAnXDAnKS5HZXRTdHJpbmcoKSk7Ci19Ci0KLS8vIFRlc3RzIHN0cmVhbWluZyBpbnQuCi1URVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zSW50KSB7Ci0gIEVYUEVDVF9FUSgiMTIzIiwgKE1lc3NhZ2UoKSA8PCAxMjMpLkdldFN0cmluZygpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgY2FuIGJlCi0vLyBzdHJlYW1lZCB0byBNZXNzYWdlLgotVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0Jhc2ljSW9NYW5pcCkgewotICBFWFBFQ1RfRVEoIkxpbmUgMS5cbkEgTlVMIGNoYXIgXFwwIGluIGxpbmUgMi4iLAotICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCAiTGluZSAxLiIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkEgTlVMIGNoYXIgIiA8PCBzdGQ6OmVuZHMgPDwgc3RkOjpmbHVzaAotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gbGluZSAyLiIpLkdldFN0cmluZygpKTsKLX0KLQotLy8gVGVzdHMgTWVzc2FnZTo6R2V0U3RyaW5nKCkKLVRFU1QoTWVzc2FnZVRlc3QsIEdldFN0cmluZykgewotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8IDEgPDwgIiBsYW1iIjsKLSAgRVhQRUNUX0VRKCIxIGxhbWIiLCBtc2cuR2V0U3RyaW5nKCkpOwotfQotCi0vLyBUZXN0cyBzdHJlYW1pbmcgYSBNZXNzYWdlIG9iamVjdCB0byBhbiBvc3RyZWFtLgotVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1RvT1N0cmVhbSkgewotICBNZXNzYWdlIG1zZygiSGVsbG8iKTsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgbXNnOwotICBFWFBFQ1RfRVEoIkhlbGxvIiwgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzcykpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgTWVzc2FnZSBvYmplY3QgZG9lc24ndCB0YWtlIHVwIHRvbyBtdWNoIHN0YWNrIHNwYWNlLgotVEVTVChNZXNzYWdlVGVzdCwgRG9lc05vdFRha2VVcE11Y2hTdGFja1NwYWNlKSB7Ci0gIEVYUEVDVF9MRShzaXplb2YoTWVzc2FnZSksIDE2VSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ODZkYzMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQotLy8KLS8vIEdvb2dsZSBUZXN0IFVuaXRUZXN0T3B0aW9ucyB0ZXN0cwotLy8KLS8vIFRoaXMgZmlsZSB0ZXN0cyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotLy8KLS8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgZnJvbSBndGVzdC5jYywgdG8gYXZvaWQgY2hhbmdpbmcgYnVpbGQgb3IKLS8vIG1ha2UtZmlsZXMgb24gV2luZG93cyBhbmQgb3RoZXIgcGxhdGZvcm1zLiBEbyBub3QgI2luY2x1ZGUgdGhpcyBmaWxlCi0vLyBhbnl3aGVyZSBlbHNlIQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSMgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgotLy8gaGlzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotLy8gVHVybnMgdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGggaW50byBhbiBhYnNvbHV0ZSBwYXRoLgotRmlsZVBhdGggR2V0QWJzb2x1dGVQYXRoT2YoY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKLSAgcmV0dXJuIEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLCByZWxhdGl2ZV9wYXRoKTsKLX0KLQotLy8gVGVzdGluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdC9HZXRPdXRwdXRGaWxlLgotCi1URVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZvcm1hdERlZmF1bHQpIHsKLSAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKLX0KLQotVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGb3JtYXQpIHsKLSAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmaWxlbmFtZSI7Ci0gIEVYUEVDVF9TVFJFUSgieG1sIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKLX0KLQotVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlRGVmYXVsdCkgewotICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKLSAgRVhQRUNUX0VRKEdldEFic29sdXRlUGF0aE9mKEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCi0gICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKLX0KLQotVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlU2luZ2xlRmlsZSkgewotICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lLmFiYyI7Ci0gIEVYUEVDVF9FUShHZXRBYnNvbHV0ZVBhdGhPZihGaWxlUGF0aCgiZmlsZW5hbWUuYWJjIikpLnN0cmluZygpLAotICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7Ci19Ci0KLVRFU1QoWG1sT3V0cHV0VGVzdCwgR2V0T3V0cHV0RmlsZUZyb21EaXJlY3RvcnlQYXRoKSB7Ci0gIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6cGF0aCIgR1RFU1RfUEFUSF9TRVBfOwotICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9Ci0gICAgICBHZXRBYnNvbHV0ZVBhdGhPZigKLSAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKLSAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIikpLnN0cmluZygpOwotICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUgPQotICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7Ci0jZWxzZQotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOwotI2VuZGlmCi19Ci0KLVRFU1QoT3V0cHV0RmlsZUhlbHBlcnNUZXN0LCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXhlX3N0ciA9IEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpOwotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgY29uc3QgYm9vbCBzdWNjZXNzID0KLSAgICAgIF9zdHJjbXBpKCJndGVzdC1vcHRpb25zX3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDAgfHwKLSAgICAgIF9zdHJjbXBpKCJndGVzdC1vcHRpb25zLWV4X3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDAgfHwKLSAgICAgIF9zdHJjbXBpKCJndGVzdF9hbGxfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAotICAgICAgX3N0cmNtcGkoImd0ZXN0X2RsbF90ZXN0IiwgZXhlX3N0ci5jX3N0cigpKSA9PSAwOwotI2Vsc2UKLSAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbW92ZSB0aGUgaGFyZC1jb2RlZCAibHQtIiBwcmVmaXggd2hlbgotICAvLyAgIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IGlzIHJlYWR5LgotICBjb25zdCBib29sIHN1Y2Nlc3MgPQotICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3Qtb3B0aW9uc190ZXN0IiB8fAotICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3RfYWxsX3Rlc3QiIHx8Ci0gICAgICBleGVfc3RyID09ICJsdC1ndGVzdF9hbGxfdGVzdCIgfHwKLSAgICAgIGV4ZV9zdHIgPT0gImd0ZXN0X2RsbF90ZXN0IjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICBpZiAoIXN1Y2Nlc3MpCi0gICAgRkFJTCgpIDw8ICJHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSByZXR1cm5zICIgPDwgZXhlX3N0cjsKLX0KLQotY2xhc3MgWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8gPSBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpOwotICAgIHBvc2l4OjpDaERpcigiLi4iKTsKLSAgICAvLyBUaGlzIHdpbGwgbWFrZSB0aGUgdGVzdCBmYWlsIGlmIHJ1biBmcm9tIHRoZSByb290IGRpcmVjdG9yeS4KLSAgICBFWFBFQ1RfTkUob3JpZ2luYWxfd29ya2luZ19kaXJfLnN0cmluZygpLAotICAgICAgICAgICAgICBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLnN0cmluZygpKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfd29ya2luZ19kaXJfLnN0cmluZygpLmNfc3RyKCkpOwotICB9Ci0KLSAgRmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOwotfTsKLQotVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHQpIHsKLSAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7Ci0gIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCi0gICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKLX0KLQotVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHRYTUwpIHsKLSAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbCI7Ci0gIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCi0gICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKLX0KLQotVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlRmlsZSkgewotICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lLmFiYyI7Ci0gIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJmaWxlbmFtZS5hYmMiKSkuc3RyaW5nKCksCi0gICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKLX0KLQotVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlUGF0aCkgewotICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOnBhdGgiIEdURVNUX1BBVEhfU0VQXzsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0X2ZpbGUgPQotICAgICAgRmlsZVBhdGg6OkNvbmNhdFBhdGhzKAotICAgICAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXywKLSAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKLSAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIikpLnN0cmluZygpOwotICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUgPQotICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7Ci0jZWxzZQotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOwotI2VuZGlmCi19Ci0KLVRFU1RfRihYbWxPdXRwdXRDaGFuZ2VEaXJUZXN0LCBQcmVzZXJ2ZU9yaWdpbmFsV29ya2luZ0RpcldpdGhBYnNvbHV0ZUZpbGUpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6YzpcXHRtcFxcZmlsZW5hbWUuYWJjIjsKLSAgRVhQRUNUX0VRKEZpbGVQYXRoKCJjOlxcdG1wXFxmaWxlbmFtZS5hYmMiKS5zdHJpbmcoKSwKLSAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOwotI2Vsc2UKLSAgR1RFU1RfRkxBRyhvdXRwdXQpID0ieG1sOi90bXAvZmlsZW5hbWUuYWJjIjsKLSAgRVhQRUNUX0VRKEZpbGVQYXRoKCIvdG1wL2ZpbGVuYW1lLmFiYyIpLnN0cmluZygpLAotICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7Ci0jZW5kaWYKLX0KLQotVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aEFic29sdXRlUGF0aCkgewotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICJjOlxcdG1wXFwiOwotI2Vsc2UKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICIvdG1wLyI7Ci0jZW5kaWYKLQotICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOiIgKyBwYXRoOwotICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9Ci0gICAgICBwYXRoICsgR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkuc3RyaW5nKCkgKyAiLnhtbCI7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZmlsZSA9Ci0gICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotICBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkX291dHB1dF9maWxlLmNfc3RyKCksIG91dHB1dF9maWxlLmNfc3RyKCkpOwotI2Vsc2UKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX291dHB1dF9maWxlLCBvdXRwdXRfZmlsZS5jX3N0cigpKTsKLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzgyZmUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIFRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYuICBUaGlzIHZlcmlmaWVzIHRoYXQgdGhlIGJhc2ljIGNvbnN0cnVjdHMgb2YKLS8vIEdvb2dsZSBUZXN0IHdvcmsuCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLXVzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I7Ci0KLS8vIFRlc3RzIHRoYXQgZ2VuZXJhdG9ycyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXQKLS8vIGFyZSBmdW5jdGlvbmFsLiBUaGUgdGVzdCB1c2luZyBleHRlcm5fZ2VuIGlzIGRlZmluZWQKLS8vIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYy4KLVBhcmFtR2VuZXJhdG9yPGludD4gZXh0ZXJuX2dlbiA9IFZhbHVlcygzMyk7Ci0KLS8vIFRlc3RzIHRoYXQgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgZGVmaW5lZCBpbiBvbmUgdHJhbnNsYXRpb24gdW5pdAotLy8gYW5kIGluc3RhbnRpYXRlZCBpbiBhbm90aGVyLiBUaGUgdGVzdCBpcyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYwotLy8gYW5kIEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QgZml4dHVyZSBjbGFzcyBpcyBkZWZpbmVkIGluCi0vLyBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaC4KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE11bHRpcGxlc09mMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDMzLCA2NikpOwotCi0vLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZAotLy8gaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMuIEFub3RoZXIgaW5zdGFudGlhdGlvbiBpcyBkZWZpbmVkCi0vLyBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuY2MgYW5kIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYWlvblVuaXRzVGVzdAotLy8gZml4dHVyZSBpcyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXF1ZW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNDIqMywgNDIqNCwgNDIqNSkpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyNzhiYi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIFRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYuIFRoaXMgZmlsZSB2ZXJpZmllcyB0aGF0IHRoZSBwYXJhbWV0ZXIKLS8vIGdlbmVyYXRvcnMgb2JqZWN0cyBwcm9kdWNlIGNvcnJlY3QgcGFyYW1ldGVyIHNlcXVlbmNlcyBhbmQgdGhhdAotLy8gR29vZ2xlIFRlc3QgcnVudGltZSBpbnN0YW50aWF0ZXMgY29ycmVjdCB0ZXN0cyBmcm9tIHRob3NlIHNlcXVlbmNlcy4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0jIGluY2x1ZGUgPGFsZ29yaXRobT4KLSMgaW5jbHVkZSA8aW9zdHJlYW0+Ci0jIGluY2x1ZGUgPGxpc3Q+Ci0jIGluY2x1ZGUgPHNzdHJlYW0+Ci0jIGluY2x1ZGUgPHN0cmluZz4KLSMgaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBUbyBpbmNsdWRlIGd0ZXN0LWludGVybmFsLWlubC5oLgotIyBkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSMgaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIiAgLy8gZm9yIFVuaXRUZXN0T3B0aW9ucwotIyB1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotIyBpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIgotCi11c2luZyA6OnN0ZDo6dmVjdG9yOwotdXNpbmcgOjpzdGQ6OnNvcnQ7Ci0KLXVzaW5nIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50OwotdXNpbmcgOjp0ZXN0aW5nOjpCb29sOwotdXNpbmcgOjp0ZXN0aW5nOjpNZXNzYWdlOwotdXNpbmcgOjp0ZXN0aW5nOjpSYW5nZTsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKLXVzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwotdXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXNJbjsKLQotIyBpZiBHVEVTVF9IQVNfQ09NQklORQotdXNpbmcgOjp0ZXN0aW5nOjpDb21iaW5lOwotdXNpbmcgOjp0ZXN0aW5nOjpnZXQ7Ci11c2luZyA6OnRlc3Rpbmc6Om1ha2VfdHVwbGU7Ci11c2luZyA6OnRlc3Rpbmc6OnR1cGxlOwotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKLQotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml0VGVzdE9wdGlvbnM7Ci0KLS8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nLgotLy8KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW1vdmUgUHJpbnRWYWx1ZSgpIHdoZW4gd2UgbW92ZSBtYXRjaGVycyBhbmQKLS8vIEVYUEVDVF9USEFUKCkgZnJvbSBHb29nbGUgTW9jayB0byBHb29nbGUgVGVzdC4gIEF0IHRoYXQgdGltZSwgd2UKLS8vIGNhbiB3cml0ZSBFWFBFQ1RfVEhBVCh4LCBFcSh5KSkgdG8gY29tcGFyZSB0d28gdHVwbGVzIHggYW5kIHksIGFzCi0vLyBFWFBFQ1RfVEhBVCgpIGFuZCB0aGUgbWF0Y2hlcnMga25vdyBob3cgdG8gcHJpbnQgdHVwbGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci06OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoY29uc3QgVCYgdmFsdWUpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gIHN0cmVhbSA8PCB2YWx1ZTsKLSAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKLX0KLQotIyBpZiBHVEVTVF9IQVNfQ09NQklORQotCi0vLyBUaGVzZSBvdmVybG9hZHMgYWxsb3cgcHJpbnRpbmcgdHVwbGVzIGluIG91ciB0ZXN0cy4gIFdlIGNhbm5vdAotLy8gZGVmaW5lIGFuIG9wZXJhdG9yPDwgZm9yIHR1cGxlcywgYXMgdGhhdCBkZWZpbml0aW9uIG5lZWRzIHRvIGJlIGluCi0vLyB0aGUgc3RkIG5hbWVzcGFjZSBpbiBvcmRlciB0byBiZSBwaWNrZWQgdXAgYnkgR29vZ2xlIFRlc3QgdmlhCi0vLyBBcmd1bWVudC1EZXBlbmRlbnQgTG9va3VwLCB5ZXQgZGVmaW5pbmcgYW55dGhpbmcgaW4gdGhlIHN0ZAotLy8gbmFtZXNwYWNlIGluIG5vbi1TVEwgY29kZSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci06OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoY29uc3QgdHVwbGU8VDEsIFQyPiYgdmFsdWUpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gIHN0cmVhbSA8PCAiKCIgPDwgZ2V0PDA+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwxPih2YWx1ZSkgPDwgIikiOwotICByZXR1cm4gc3RyZWFtLnN0cigpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLTo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZShjb25zdCB0dXBsZTxUMSwgVDIsIFQzPiYgdmFsdWUpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07Ci0gIHN0cmVhbSA8PCAiKCIgPDwgZ2V0PDA+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwxPih2YWx1ZSkKLSAgICAgICAgIDw8ICIsICI8PCBnZXQ8Mj4odmFsdWUpIDw8ICIpIjsKLSAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotOjpzdGQ6OnN0cmluZyBQcmludFZhbHVlKAotICAgIGNvbnN0IHR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHZhbHVlKSB7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICBzdHJlYW0gPDwgIigiIDw8IGdldDwwPih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8MT4odmFsdWUpCi0gICAgICAgICA8PCAiLCAiPDwgZ2V0PDI+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDwzPih2YWx1ZSkKLSAgICAgICAgIDw8ICIsICI8PCBnZXQ8ND4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDU+KHZhbHVlKQotICAgICAgICAgPDwgIiwgIjw8IGdldDw2Pih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8Nz4odmFsdWUpCi0gICAgICAgICA8PCAiLCAiPDwgZ2V0PDg+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDw5Pih2YWx1ZSkgPDwgIikiOwotICByZXR1cm4gc3RyZWFtLnN0cigpOwotfQotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQotCi0vLyBWZXJpZmllcyB0aGF0IGEgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IgYW5kIGFjY2Vzc2VkCi0vLyB2aWEgdGhlIGl0ZXJhdG9yIG9iamVjdCBtYXRjaGVzIHRoZSBleHBlY3RlZCBvbmUgdXNpbmcgR29vZ2xlIFRlc3QKLS8vIGFzc2VydGlvbnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci12b2lkIFZlcmlmeUdlbmVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvcjxUPiYgZ2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCAoJmV4cGVjdGVkX3ZhbHVlcylbTl0pIHsKLSAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VD46Oml0ZXJhdG9yIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKSB7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKLSAgICAgICAgPDwgIkF0IGVsZW1lbnQgIiA8PCBpIDw8ICIgd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKLSAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7Ci0gICAgLy8gV2UgY2Fubm90IHVzZSBFWFBFQ1RfRVEoKSBoZXJlIGFzIHRoZSB2YWx1ZXMgbWF5IGJlIHR1cGxlcywKLSAgICAvLyB3aGljaCBkb24ndCBzdXBwb3J0IDw8LgotICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkX3ZhbHVlc1tpXSA9PSAqaXQpCi0gICAgICAgIDw8ICJ3aGVyZSBpIGlzICIgPDwgaQotICAgICAgICA8PCAiLCBleHBlY3RlZF92YWx1ZXNbaV0gaXMgIiA8PCBQcmludFZhbHVlKGV4cGVjdGVkX3ZhbHVlc1tpXSkKLSAgICAgICAgPDwgIiwgKml0IGlzICIgPDwgUHJpbnRWYWx1ZSgqaXQpCi0gICAgICAgIDw8ICIsIGFuZCAnaXQnIGlzIGFuIGl0ZXJhdG9yIGNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7Ci0gICAgaXQrKzsKLSAgfQotICBFWFBFQ1RfVFJVRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpCi0gICAgICAgIDw8ICJBdCB0aGUgcHJlc3VtZWQgZW5kIG9mIHNlcXVlbmNlIHdoZW4gYWNjZXNzaW5nIHZpYSBhbiBpdGVyYXRvciAiCi0gICAgICAgIDw8ICJjcmVhdGVkIHdpdGggdGhlIGNvcHkgY29uc3RydWN0b3IuXG4iOwotCi0gIC8vIFRlc3QgdGhlIGl0ZXJhdG9yIGFzc2lnbm1lbnQuIFRoZSBmb2xsb3dpbmcgbGluZXMgdmVyaWZ5IHRoYXQKLSAgLy8gdGhlIHNlcXVlbmNlIGFjY2Vzc2VkIHZpYSBhbiBpdGVyYXRvciBpbml0aWFsaXplZCB2aWEgdGhlCi0gIC8vIGFzc2lnbm1lbnQgb3BlcmF0b3IgKGFzIG9wcG9zZWQgdG8gYSBjb3B5IGNvbnN0cnVjdG9yKSBtYXRjaGVzCi0gIC8vIGp1c3QgdGhlIHNhbWUuCi0gIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKSB7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKLSAgICAgICAgPDwgIkF0IGVsZW1lbnQgIiA8PCBpIDw8ICIgd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKLSAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci5cbiI7Ci0gICAgRVhQRUNUX1RSVUUoZXhwZWN0ZWRfdmFsdWVzW2ldID09ICppdCkKLSAgICAgICAgPDwgIndoZXJlIGkgaXMgIiA8PCBpCi0gICAgICAgIDw8ICIsIGV4cGVjdGVkX3ZhbHVlc1tpXSBpcyAiIDw8IFByaW50VmFsdWUoZXhwZWN0ZWRfdmFsdWVzW2ldKQotICAgICAgICA8PCAiLCAqaXQgaXMgIiA8PCBQcmludFZhbHVlKCppdCkKLSAgICAgICAgPDwgIiwgYW5kICdpdCcgaXMgYW4gaXRlcmF0b3IgY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKLSAgICBpdCsrOwotICB9Ci0gIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSkKLSAgICAgICAgPDwgIkF0IHRoZSBwcmVzdW1lZCBlbmQgb2Ygc2VxdWVuY2Ugd2hlbiBhY2Nlc3NpbmcgdmlhIGFuIGl0ZXJhdG9yICIKLSAgICAgICAgPDwgImNyZWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci5cbiI7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ+JiBnZW5lcmF0b3IpIHsKLSAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VD46Oml0ZXJhdG9yIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7Ci0gIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSk7Ci0KLSAgaXQgPSBnZW5lcmF0b3IuYmVnaW4oKTsKLSAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKTsKLX0KLQotLy8gR2VuZXJhdG9yIHRlc3RzLiBUaGV5IHRlc3QgdGhhdCBlYWNoIG9mIHRoZSBwcm92aWRlZCBnZW5lcmF0b3IgZnVuY3Rpb25zCi0vLyBnZW5lcmF0ZXMgYW4gZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgdmFsdWVzLiBUaGUgZ2VuZXJhbCB0ZXN0IHBhdHRlcm4KLS8vIGluc3RhbnRpYXRlcyBhIGdlbmVyYXRvciB1c2luZyBvbmUgb2YgdGhlIGdlbmVyYXRvciBmdW5jdGlvbnMsCi0vLyBjaGVja3MgdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IgdXNpbmcgaXRzIGl0ZXJhdG9yIEFQSSwKLS8vIGFuZCB0aGVuIHJlc2V0cyB0aGUgaXRlcmF0b3IgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXF1ZW5jZQotLy8gYW5kIGNoZWNrcyB0aGUgc2VxdWVuY2UgYWdhaW4uCi0KLS8vIFRlc3RzIHRoYXQgaXRlcmF0b3JzIHByb2R1Y2VkIGJ5IGdlbmVyYXRvciBmdW5jdGlvbnMgY29uZm9ybSB0byB0aGUKLS8vIEZvcndhcmRJdGVyYXRvciBjb25jZXB0LgotVEVTVChJdGVyYXRvclRlc3QsIFBhcmFtSXRlcmF0b3JDb25mb3Jtc1RvRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdCkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDEwKTsKLSAgUGFyYW1HZW5lcmF0b3I8aW50Pjo6aXRlcmF0b3IgaXQgPSBnZW4uYmVnaW4oKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IGl0ZXJhdG9yIGluaXRpYWxpemF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgotICBQYXJhbUdlbmVyYXRvcjxpbnQ+OjppdGVyYXRvciBpdDIgPSBpdDsKLSAgRVhQRUNUX1RSVUUoKml0ID09ICppdDIpIDw8ICJJbml0aWFsaXplZCBpdGVyYXRvcnMgbXVzdCBwb2ludCB0byB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImVsZW1lbnQgc2FtZSBhcyBpdHMgc291cmNlIHBvaW50cyB0byI7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCBpdGVyYXRvciBhc3NpZ25tZW50IHdvcmtzIGFzIGV4cGVjdGVkLgotICBpdCsrOwotICBFWFBFQ1RfRkFMU0UoKml0ID09ICppdDIpOwotICBpdDIgPSBpdDsKLSAgRVhQRUNUX1RSVUUoKml0ID09ICppdDIpIDw8ICJBc3NpZ25lZCBpdGVyYXRvcnMgbXVzdCBwb2ludCB0byB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImVsZW1lbnQgc2FtZSBhcyBpdHMgc291cmNlIHBvaW50cyB0byI7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCBwcmVmaXggb3BlcmF0b3IrKygpIHJldHVybnMgKnRoaXMuCi0gIEVYUEVDVF9FUSgmaXQsICYoKytpdCkpIDw8ICJSZXN1bHQgb2YgdGhlIHByZWZpeCBvcGVyYXRvcisrIG11c3QgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVmZXIgdG8gdGhlIG9yaWdpbmFsIG9iamVjdCI7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBwb3N0Zml4IG9wZXJhdG9yKysgcG9pbnRzIHRvIHRoZSB2YWx1ZQotICAvLyBwb2ludGVkIHRvIGJ5IHRoZSBvcmlnaW5hbCBpdGVyYXRvci4KLSAgaW50IG9yaWdpbmFsX3ZhbHVlID0gKml0OyAgLy8gSGF2ZSB0byBjb21wdXRlIGl0IG91dHNpZGUgb2YgbWFjcm8gY2FsbCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmFmZmVjdGVkIGJ5IHRoZSBwYXJhbWV0ZXIgZXZhbHVhdGlvbiBvcmRlci4KLSAgRVhQRUNUX0VRKG9yaWdpbmFsX3ZhbHVlLCAqKGl0KyspKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHByZWZpeCBhbmQgcG9zdGZpeCBvcGVyYXRvcisrKCkgYWR2YW5jZSBhbiBpdGVyYXRvcgotICAvLyBhbGwgdGhlIHNhbWUuCi0gIGl0MiA9IGl0OwotICBpdCsrOwotICArK2l0MjsKLSAgRVhQRUNUX1RSVUUoKml0ID09ICppdDIpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJhbmdlKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KLVRFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVdpdGhEZWZhdWx0U3RlcCkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDMpOwotICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MCwgMSwgMn07Ci0gIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Ci19Ci0KLS8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBSYW5nZSgpIGdlbmVyYXRlcyB0aGUgc2luZ2xlIGVsZW1lbnQgc2VxdWVuY2UKLS8vIGFzIGV4cGVjdGVkIHdoZW4gcHJvdmlkZWQgd2l0aCByYW5nZSBsaW1pdHMgdGhhdCBhcmUgZXF1YWwuCi1URVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VTaW5nbGVWYWx1ZSkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDEpOwotICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MH07Ci0gIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Ci19Ci0KLS8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBSYW5nZSgpIHdpdGggZ2VuZXJhdGVzIGVtcHR5IHNlcXVlbmNlIHdoZW4KLS8vIHN1cHBsaWVkIHdpdGggYW4gZW1wdHkgcmFuZ2UuCi1URVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VFbXB0eSkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDApOwotICBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGdlbik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmFuZ2UoKSB3aXRoIGN1c3RvbSBzdGVwIChncmVhdGVyIHRoZW4gb25lKSBnZW5lcmF0ZXMKLS8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KLVRFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVdpdGhDdXN0b21TdGVwKSB7Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgOSwgMyk7Ci0gIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswLCAzLCA2fTsKLSAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSYW5nZSgpIHdpdGggY3VzdG9tIHN0ZXAgKGdyZWF0ZXIgdGhlbiBvbmUpIGdlbmVyYXRlcwotLy8gdGhlIGV4cGVjdGVkIHNlcXVlbmNlIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBkb2VzIG5vdCBmYWxsIG9uIHRoZQotLy8gdXBwZXIgcmFuZ2UgbGltaXQuIFNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkgUmFuZ2UoKSBtdXN0IG5vdCBoYXZlCi0vLyBlbGVtZW50cyBiZXlvbmQgdGhlIHJhbmdlIGxpbWl0cy4KLVRFU1QoUmFuZ2VUZXN0LCBJbnRSYW5nZVdpdGhDdXN0b21TdGVwT3ZlclVwcGVyQm91bmQpIHsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCA0LCAzKTsKLSAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezAsIDN9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IFJhbmdlIHdvcmtzIHdpdGggdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgZGVmaW5lCi0vLyBjb3B5IGNvbnN0cnVjdG9yLCBvcGVyYXRvcj0oKSwgb3BlcmF0b3IrKCksIGFuZCBvcGVyYXRvcjwoKS4KLWNsYXNzIERvZ0FkZGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IERvZ0FkZGVyKGNvbnN0IGNoYXIqIGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9Ci0gIERvZ0FkZGVyKGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgOiB2YWx1ZV8ob3RoZXIudmFsdWVfLmNfc3RyKCkpIHt9Ci0KLSAgRG9nQWRkZXIgb3BlcmF0b3I9KGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgewotICAgIGlmICh0aGlzICE9ICZvdGhlcikKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgRG9nQWRkZXIgb3BlcmF0b3IrKGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgY29uc3QgewotICAgIE1lc3NhZ2UgbXNnOwotICAgIG1zZyA8PCB2YWx1ZV8uY19zdHIoKSA8PCBvdGhlci52YWx1ZV8uY19zdHIoKTsKLSAgICByZXR1cm4gRG9nQWRkZXIobXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERvZ0FkZGVyJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV8gPCBvdGhlci52YWx1ZV87Ci0gIH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyB2YWx1ZV87Ci19OwotCi1URVNUKFJhbmdlVGVzdCwgV29ya3NXaXRoQUN1c3RvbVR5cGUpIHsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8RG9nQWRkZXI+IGdlbiA9Ci0gICAgICBSYW5nZShEb2dBZGRlcigiY2F0IiksIERvZ0FkZGVyKCJjYXRkb2dkb2ciKSwgRG9nQWRkZXIoImRvZyIpKTsKLSAgUGFyYW1HZW5lcmF0b3I8RG9nQWRkZXI+OjppdGVyYXRvciBpdCA9IGdlbi5iZWdpbigpOwotCi0gIEFTU0VSVF9GQUxTRShpdCA9PSBnZW4uZW5kKCkpOwotICBFWFBFQ1RfU1RSRVEoImNhdCIsIGl0LT52YWx1ZSgpLmNfc3RyKCkpOwotCi0gIEFTU0VSVF9GQUxTRSgrK2l0ID09IGdlbi5lbmQoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiY2F0ZG9nIiwgaXQtPnZhbHVlKCkuY19zdHIoKSk7Ci0KLSAgRVhQRUNUX1RSVUUoKytpdCA9PSBnZW4uZW5kKCkpOwotfQotCi1jbGFzcyBJbnRXcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEludFdyYXBwZXIoaW50IGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9Ci0gIEludFdyYXBwZXIoY29uc3QgSW50V3JhcHBlciYgb3RoZXIpIDogdmFsdWVfKG90aGVyLnZhbHVlXykge30KLQotICBJbnRXcmFwcGVyIG9wZXJhdG9yPShjb25zdCBJbnRXcmFwcGVyJiBvdGhlcikgewotICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgLy8gb3BlcmF0b3IrKCkgYWRkcyBhIGRpZmZlcmVudCB0eXBlLgotICBJbnRXcmFwcGVyIG9wZXJhdG9yKyhpbnQgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIEludFdyYXBwZXIodmFsdWVfICsgb3RoZXIpOyB9Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludFdyYXBwZXImIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXyA8IG90aGVyLnZhbHVlXzsKLSAgfQotICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotIHByaXZhdGU6Ci0gIGludCB2YWx1ZV87Ci19OwotCi1URVNUKFJhbmdlVGVzdCwgV29ya3NXaXRoQUN1c3RvbVR5cGVXaXRoRGlmZmVyZW50SW5jcmVtZW50VHlwZSkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxJbnRXcmFwcGVyPiBnZW4gPSBSYW5nZShJbnRXcmFwcGVyKDApLCBJbnRXcmFwcGVyKDIpKTsKLSAgUGFyYW1HZW5lcmF0b3I8SW50V3JhcHBlcj46Oml0ZXJhdG9yIGl0ID0gZ2VuLmJlZ2luKCk7Ci0KLSAgQVNTRVJUX0ZBTFNFKGl0ID09IGdlbi5lbmQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBpdC0+dmFsdWUoKSk7Ci0KLSAgQVNTRVJUX0ZBTFNFKCsraXQgPT0gZ2VuLmVuZCgpKTsKLSAgRVhQRUNUX0VRKDEsIGl0LT52YWx1ZSgpKTsKLQotICBFWFBFQ1RfVFJVRSgrK2l0ID09IGdlbi5lbmQoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSB3aXRoIGFuIGFycmF5IHBhcmFtZXRlciBnZW5lcmF0ZXMKLS8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KLVRFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJbkFycmF5KSB7Ci0gIGludCBhcnJheVtdID0gezMsIDUsIDh9OwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKGFycmF5KTsKLSAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgYXJyYXkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgd2l0aCBhIGNvbnN0IGFycmF5IHBhcmFtZXRlciBnZW5lcmF0ZXMKLS8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KLVRFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJbkNvbnN0QXJyYXkpIHsKLSAgY29uc3QgaW50IGFycmF5W10gPSB7MywgNSwgOH07Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4oYXJyYXkpOwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBhcnJheSk7Ci19Ci0KLS8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHdpdGggYW4gYXJyYXkgcGFyYW1ldGVyIGNvbnRhaW5pbmcgYQotLy8gc2luZ2xlIGVsZW1lbnQgZ2VuZXJhdGVzIHRoZSBzaW5nbGUgZWxlbWVudCBzZXF1ZW5jZS4KLVRFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJblNpbmdsZUVsZW1lbnRBcnJheSkgewotICBpbnQgYXJyYXlbXSA9IHs0Mn07Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4oYXJyYXkpOwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBhcnJheSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlIGZvciBhbiBTVEwKLS8vIGNvbnRhaW5lciAodmVjdG9yKS4KLVRFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJblZlY3RvcikgewotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOwotICBDb250YWluZXJUeXBlIHZhbHVlczsKLSAgdmFsdWVzLnB1c2hfYmFjaygzKTsKLSAgdmFsdWVzLnB1c2hfYmFjayg1KTsKLSAgdmFsdWVzLnB1c2hfYmFjayg4KTsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMpOwotCi0gIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA1LCA4fTsKLSAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCi1URVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5JdGVyYXRvclJhbmdlKSB7Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7Ci0gIENvbnRhaW5lclR5cGUgdmFsdWVzOwotICB2YWx1ZXMucHVzaF9iYWNrKDMpOwotICB2YWx1ZXMucHVzaF9iYWNrKDUpOwotICB2YWx1ZXMucHVzaF9iYWNrKDgpOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOwotCi0gIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA1LCA4fTsKLSAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKLX0KLQotLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFZhbHVlc0luKCkgcHJvdmlkZWQgd2l0aCBhbiBpdGVyYXRvciByYW5nZSBzcGVjaWZ5aW5nIGEKLS8vIHNpbmdsZSB2YWx1ZSBnZW5lcmF0ZXMgYSBzaW5nbGUtZWxlbWVudCBzZXF1ZW5jZS4KLVRFU1QoVmFsdWVzSW5UZXN0LCBWYWx1ZXNJblNpbmdsZUVsZW1lbnRJdGVyYXRvclJhbmdlKSB7Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7Ci0gIENvbnRhaW5lclR5cGUgdmFsdWVzOwotICB2YWx1ZXMucHVzaF9iYWNrKDQyKTsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKLQotICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7NDJ9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0vLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBwcm92aWRlZCB3aXRoIGFuIGVtcHR5IGl0ZXJhdG9yIHJhbmdlCi0vLyBnZW5lcmF0ZXMgYW4gZW1wdHkgc2VxdWVuY2UuCi1URVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5FbXB0eUl0ZXJhdG9yUmFuZ2UpIHsKLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGludD4gQ29udGFpbmVyVHlwZTsKLSAgQ29udGFpbmVyVHlwZSB2YWx1ZXM7Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7Ci0KLSAgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShnZW4pOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBWYWx1ZXMoKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgotVEVTVChWYWx1ZXNUZXN0LCBWYWx1ZXNXb3JrcykgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcygzLCA1LCA4KTsKLQotICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNSwgOH07Ci0gIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVmFsdWVzKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZXMgZnJvbSBlbGVtZW50cyBvZgotLy8gZGlmZmVyZW50IHR5cGVzIGNvbnZlcnRpYmxlIHRvIFBhcmFtR2VuZXJhdG9yJ3MgcGFyYW1ldGVyIHR5cGUuCi1URVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dvcmtzRm9yVmFsdWVzT2ZDb21wYXRpYmxlVHlwZXMpIHsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8ZG91YmxlPiBnZW4gPSBWYWx1ZXMoMywgNS4wZiwgOC4wKTsKLQotICBjb25zdCBkb3VibGUgZXhwZWN0ZWRfdmFsdWVzW10gPSB7My4wLCA1LjAsIDguMH07Ci0gIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Ci19Ci0KLVRFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV29ya3NGb3JNYXhMZW5ndGhMaXN0KSB7Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzKAotICAgICAgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwLAotICAgICAgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsIDE2MCwgMTcwLCAxODAsIDE5MCwgMjAwLAotICAgICAgMjEwLCAyMjAsIDIzMCwgMjQwLCAyNTAsIDI2MCwgMjcwLCAyODAsIDI5MCwgMzAwLAotICAgICAgMzEwLCAzMjAsIDMzMCwgMzQwLCAzNTAsIDM2MCwgMzcwLCAzODAsIDM5MCwgNDAwLAotICAgICAgNDEwLCA0MjAsIDQzMCwgNDQwLCA0NTAsIDQ2MCwgNDcwLCA0ODAsIDQ5MCwgNTAwKTsKLQotICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7Ci0gICAgICAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIDkwLCAxMDAsCi0gICAgICAxMTAsIDEyMCwgMTMwLCAxNDAsIDE1MCwgMTYwLCAxNzAsIDE4MCwgMTkwLCAyMDAsCi0gICAgICAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyNzAsIDI4MCwgMjkwLCAzMDAsCi0gICAgICAzMTAsIDMyMCwgMzMwLCAzNDAsIDM1MCwgMzYwLCAzNzAsIDM4MCwgMzkwLCA0MDAsCi0gICAgICA0MTAsIDQyMCwgNDMwLCA0NDAsIDQ1MCwgNDYwLCA0NzAsIDQ4MCwgNDkwLCA1MDB9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0vLyBFZGdlIGNhc2UgdGVzdC4gVGVzdHMgdGhhdCBzaW5nbGUtcGFyYW1ldGVyIFZhbHVlcygpIGdlbmVyYXRlcyB0aGUgc2VxdWVuY2UKLS8vIHdpdGggdGhlIHNpbmdsZSB2YWx1ZS4KLVRFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV2l0aFNpbmdsZVBhcmFtZXRlcikgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcyg0Mik7Ci0KLSAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezQyfTsKLSAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBCb29sKCkgZ2VuZXJhdGVzIHNlcXVlbmNlIChmYWxzZSwgdHJ1ZSkuCi1URVNUKEJvb2xUZXN0LCBCb29sV29ya3MpIHsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8Ym9vbD4gZ2VuID0gQm9vbCgpOwotCi0gIGNvbnN0IGJvb2wgZXhwZWN0ZWRfdmFsdWVzW10gPSB7ZmFsc2UsIHRydWV9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0jIGlmIEdURVNUX0hBU19DT01CSU5FCi0KLS8vIFRlc3RzIHRoYXQgQ29tYmluZSgpIHdpdGggdHdvIHBhcmFtZXRlcnMgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KLVRFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoVHdvUGFyYW1ldGVycykgewotICBjb25zdCBjaGFyKiBmb28gPSAiZm9vIjsKLSAgY29uc3QgY2hhciogYmFyID0gImJhciI7Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGNvbnN0IGNoYXIqLCBpbnQ+ID4gZ2VuID0KLSAgICAgIENvbWJpbmUoVmFsdWVzKGZvbywgYmFyKSwgVmFsdWVzKDMsIDQpKTsKLQotICB0dXBsZTxjb25zdCBjaGFyKiwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHsKLSAgICBtYWtlX3R1cGxlKGZvbywgMyksIG1ha2VfdHVwbGUoZm9vLCA0KSwKLSAgICBtYWtlX3R1cGxlKGJhciwgMyksIG1ha2VfdHVwbGUoYmFyLCA0KX07Ci0gIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQ29tYmluZSgpIHdpdGggdGhyZWUgcGFyYW1ldGVycyBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgotVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhUaHJlZVBhcmFtZXRlcnMpIHsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcygwLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygzLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg1LCA2KSk7Ci0gIHR1cGxlPGludCwgaW50LCBpbnQ+IGV4cGVjdGVkX3ZhbHVlc1tdID0gewotICAgIG1ha2VfdHVwbGUoMCwgMywgNSksIG1ha2VfdHVwbGUoMCwgMywgNiksCi0gICAgbWFrZV90dXBsZSgwLCA0LCA1KSwgbWFrZV90dXBsZSgwLCA0LCA2KSwKLSAgICBtYWtlX3R1cGxlKDEsIDMsIDUpLCBtYWtlX3R1cGxlKDEsIDMsIDYpLAotICAgIG1ha2VfdHVwbGUoMSwgNCwgNSksIG1ha2VfdHVwbGUoMSwgNCwgNil9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBDb21iaW5lKCkgd2l0aCB0aGUgZmlyc3QgcGFyYW1ldGVyIGdlbmVyYXRpbmcgYSBzaW5nbGUgdmFsdWUKLS8vIHNlcXVlbmNlIGdlbmVyYXRlcyBhIHNlcXVlbmNlIHdpdGggdGhlIG51bWJlciBvZiBlbGVtZW50cyBlcXVhbCB0byB0aGUKLS8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgotVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhGaXJzdFBhcmFtZXRlclNpbmdsZVZhbHVlKSB7Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoVmFsdWVzKDQyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMCwgMSkpOwotCi0gIHR1cGxlPGludCwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHttYWtlX3R1cGxlKDQyLCAwKSwgbWFrZV90dXBsZSg0MiwgMSl9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBDb21iaW5lKCkgd2l0aCB0aGUgc2Vjb25kIHBhcmFtZXRlciBnZW5lcmF0aW5nIGEgc2luZ2xlIHZhbHVlCi0vLyBzZXF1ZW5jZSBnZW5lcmF0ZXMgYSBzZXF1ZW5jZSB3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlCi0vLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZmlyc3QgcGFyYW1ldGVyLgotVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhTZWNvbmRQYXJhbWV0ZXJTaW5nbGVWYWx1ZSkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcygwLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNDIpKTsKLQotICB0dXBsZTxpbnQsIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7bWFrZV90dXBsZSgwLCA0MiksIG1ha2VfdHVwbGUoMSwgNDIpfTsKLSAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB3aGVuIHRoZSBmaXJzdCBwYXJhbWV0ZXIgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsCi0vLyBDb21iaW5lKCkgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsIHRvby4KLVRFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoRmlyc3RQYXJhbWV0ZXJFbXB0eVJhbmdlKSB7Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50PiA+IGdlbiA9IENvbWJpbmUoUmFuZ2UoMCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDAsIDEpKTsKLSAgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShnZW4pOwotfQotCi0vLyBUZXN0cyB0aGF0IHdoZW4gdGhlIHNlY29uZCBwYXJhbWV0ZXIgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsCi0vLyBDb21iaW5lKCkgcHJvZHVjZXMgYW4gZW1wdHkgc2VxdWVuY2UsIHRvby4KLVRFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoU2Vjb25kUGFyYW1ldGVyRW1wdHlSYW5nZSkgewotICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcygwLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSgxLCAxKSk7Ci0gIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKLX0KLQotLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IGNvbWJpbmUgd29ya3Mgd2l0aCB0aGUgbWF4aW11bSBudW1iZXIKLS8vIG9mIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IEdvb2dsZSBUZXN0IChjdXJyZW50bHkgMTApLgotVEVTVChDb21iaW5lVGVzdCwgQ29tYmluZVdpdGhNYXhOdW1iZXJPZlBhcmFtZXRlcnMpIHsKLSAgY29uc3QgY2hhciogZm9vID0gImZvbyI7Ci0gIGNvbnN0IGNoYXIqIGJhciA9ICJiYXIiOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxjb25zdCBjaGFyKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcyhmb28sIGJhciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDEpLCBWYWx1ZXMoMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDMpLCBWYWx1ZXMoNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDUpLCBWYWx1ZXMoNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDcpLCBWYWx1ZXMoOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDkpKTsKLQotICB0dXBsZTxjb25zdCBjaGFyKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludD4KLSAgICAgIGV4cGVjdGVkX3ZhbHVlc1tdID0ge21ha2VfdHVwbGUoZm9vLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoYmFyLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KX07Ci0gIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Ci19Ci0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCi0KLS8vIFRlc3RzIHRoYXQgYW4gZ2VuZXJhdG9yIHByb2R1Y2VzIGNvcnJlY3Qgc2VxdWVuY2UgYWZ0ZXIgYmVpbmcKLS8vIGFzc2lnbmVkIGZyb20gYW5vdGhlciBnZW5lcmF0b3IuCi1URVNUKFBhcmFtR2VuZXJhdG9yVGVzdCwgQXNzaWdubWVudFdvcmtzKSB7Ci0gIFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzKDEsIDIpOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbjIgPSBWYWx1ZXMoMywgNCk7Ci0gIGdlbiA9IGdlbjI7Ci0KLSAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezMsIDR9OwotICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOwotfQotCi0vLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgdGVzdHMgYXJlIGV4cGFuZGVkIGFuZCBydW4gYXMgc3BlY2lmaWVkOgotLy8gb25lIHRlc3QgcGVyIGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvcgotLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QLiBJdCBhbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHRlc3QncwotLy8gZml4dHVyZSBjb25zdHJ1Y3RvciwgU2V0VXAoKSwgYW5kIFRlYXJEb3duKCkgaGF2ZSBydW4gYW5kIGhhdmUgYmVlbgotLy8gc3VwcGxpZWQgd2l0aCB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzLgotCi0vLyBUaGUgdXNlIG9mIGVudmlyb25tZW50IG9iamVjdCBhbGxvd3MgZGV0ZWN0aW9uIG9mIHRoZSBjYXNlIHdoZXJlIG5vIHRlc3QKLS8vIGNhc2UgZnVuY3Rpb25hbGl0eSBpcyBydW4gYXQgYWxsLiBJbiB0aGlzIGNhc2UgVGVzdENhc2VUZWFyRG93biB3aWxsIG5vdAotLy8gYmUgYWJsZSB0byBkZXRlY3QgbWlzc2luZyB0ZXN0cywgbmF0dXJhbGx5LgotdGVtcGxhdGUgPGludCBrRXhwZWN0ZWRDYWxscz4KLWNsYXNzIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7Ci0gcHVibGljOgotICBzdGF0aWMgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCogSW5zdGFuY2UoKSB7Ci0gICAgc3RhdGljIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQqIGluc3RhbmNlID0gbmV3IFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQ7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgdm9pZCBGaXh0dXJlQ29uc3RydWN0b3JFeGVjdXRlZCgpIHsgZml4dHVyZV9jb25zdHJ1Y3Rvcl9jb3VudF8rKzsgfQotICB2b2lkIFNldFVwRXhlY3V0ZWQoKSB7IHNldF91cF9jb3VudF8rKzsgfQotICB2b2lkIFRlYXJEb3duRXhlY3V0ZWQoKSB7IHRlYXJfZG93bl9jb3VudF8rKzsgfQotICB2b2lkIFRlc3RCb2R5RXhlY3V0ZWQoKSB7IHRlc3RfYm9keV9jb3VudF8rKzsgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAvLyBJZiBhbGwgTXVsdGlwbGVUZXN0R2VuZXJhdGlvblRlc3QgdGVzdHMgaGF2ZSBiZWVuIGRlLXNlbGVjdGVkCi0gICAgLy8gYnkgdGhlIGZpbHRlciBmbGFnLCB0aGUgZm9sbG93aW5nIGNoZWNrcyBtYWtlIG5vIHNlbnNlLgotICAgIGJvb2wgcGVyZm9ybV9jaGVjayA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRXhwZWN0ZWRDYWxsczsgKytpKSB7Ci0gICAgICBNZXNzYWdlIG1zZzsKLSAgICAgIG1zZyA8PCAiVGVzdHNFeHBhbmRlZEFuZFJ1bi8iIDw8IGk7Ci0gICAgICBpZiAoVW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdCgKLSAgICAgICAgICAgICAiVGVzdEV4cGFuc2lvbk1vZHVsZS9NdWx0aXBsZVRlc3RHZW5lcmF0aW9uVGVzdCIsCi0gICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKSkgewotICAgICAgICBwZXJmb3JtX2NoZWNrID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBlcmZvcm1fY2hlY2spIHsKLSAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgZml4dHVyZV9jb25zdHJ1Y3Rvcl9jb3VudF8pCi0gICAgICAgICAgPDwgIkZpeHR1cmUgY29uc3RydWN0b3Igb2YgUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKLSAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOwotICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZENhbGxzLCBzZXRfdXBfY291bnRfKQotICAgICAgICAgIDw8ICJGaXh0dXJlIFNldFVwIG1ldGhvZCBvZiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgotICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7Ci0gICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIHRlYXJfZG93bl9jb3VudF8pCi0gICAgICAgICAgPDwgIkZpeHR1cmUgVGVhckRvd24gbWV0aG9kIG9mIFBhcmFtVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSAiCi0gICAgICAgICAgPDwgImhhcyBub3QgYmVlbiBydW4gYXMgZXhwZWN0ZWQuIjsKLSAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgdGVzdF9ib2R5X2NvdW50XykKLSAgICAgICAgICA8PCAiVGVzdCBpbiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgotICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50KCkgOiBmaXh0dXJlX2NvbnN0cnVjdG9yX2NvdW50XygwKSwgc2V0X3VwX2NvdW50XygwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhcl9kb3duX2NvdW50XygwKSwgdGVzdF9ib2R5X2NvdW50XygwKSB7fQotCi0gIGludCBmaXh0dXJlX2NvbnN0cnVjdG9yX2NvdW50XzsKLSAgaW50IHNldF91cF9jb3VudF87Ci0gIGludCB0ZWFyX2Rvd25fY291bnRfOwotICBpbnQgdGVzdF9ib2R5X2NvdW50XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQpOwotfTsKLQotY29uc3QgaW50IHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXNbXSA9IHszNiwgNDIsIDcyfTsKLQotY2xhc3MgVGVzdEdlbmVyYXRpb25UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7Ci0gcHVibGljOgotICBlbnVtIHsKLSAgICBQQVJBTUVURVJfQ09VTlQgPQotICAgICAgICBzaXplb2YodGVzdF9nZW5lcmF0aW9uX3BhcmFtcykvc2l6ZW9mKHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXNbMF0pCi0gIH07Ci0KLSAgdHlwZWRlZiBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50PFBBUkFNRVRFUl9DT1VOVD4gRW52aXJvbm1lbnQ7Ci0KLSAgVGVzdEdlbmVyYXRpb25UZXN0KCkgewotICAgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5GaXh0dXJlQ29uc3RydWN0b3JFeGVjdXRlZCgpOwotICAgIGN1cnJlbnRfcGFyYW1ldGVyXyA9IEdldFBhcmFtKCk7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5TZXRVcEV4ZWN1dGVkKCk7Ci0gICAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5UZWFyRG93bkV4ZWN1dGVkKCk7Ci0gICAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgewotICAgIGJvb2wgYWxsX3Rlc3RzX2luX3Rlc3RfY2FzZV9zZWxlY3RlZCA9IHRydWU7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBBUkFNRVRFUl9DT1VOVDsgKytpKSB7Ci0gICAgICBNZXNzYWdlIHRlc3RfbmFtZTsKLSAgICAgIHRlc3RfbmFtZSA8PCAiVGVzdHNFeHBhbmRlZEFuZFJ1bi8iIDw8IGk7Ci0gICAgICBpZiAoICFVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KAotICAgICAgICAgICAgICAgICJUZXN0RXhwYW5zaW9uTW9kdWxlL011bHRpcGxlVGVzdEdlbmVyYXRpb25UZXN0IiwKLSAgICAgICAgICAgICAgICB0ZXN0X25hbWUuR2V0U3RyaW5nKCkpKSB7Ci0gICAgICAgIGFsbF90ZXN0c19pbl90ZXN0X2Nhc2Vfc2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgRVhQRUNUX1RSVUUoYWxsX3Rlc3RzX2luX3Rlc3RfY2FzZV9zZWxlY3RlZCkKLSAgICAgICAgPDwgIldoZW4gcnVubmluZyB0aGUgVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSBhbGwgb2YgaXRzIHRlc3RzXG4iCi0gICAgICAgIDw8ICJtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBmaWx0ZXIgZmxhZyBmb3IgdGhlIHRlc3QgY2FzZSB0byBwYXNzLlxuIgotICAgICAgICA8PCAiSWYgbm90IGFsbCBvZiB0aGVtIGFyZSBlbmFibGVkLCB3ZSBjYW4ndCByZWxpYWJseSBjb25jbHVkZVxuIgotICAgICAgICA8PCAidGhhdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGVzdHMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4iOwotCi0gICAgY29sbGVjdGVkX3BhcmFtZXRlcnNfLmNsZWFyKCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgewotICAgIHZlY3RvcjxpbnQ+IGV4cGVjdGVkX3ZhbHVlcyh0ZXN0X2dlbmVyYXRpb25fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2dlbmVyYXRpb25fcGFyYW1zICsgUEFSQU1FVEVSX0NPVU5UKTsKLSAgICAvLyBUZXN0IGV4ZWN1dGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBieSBHb29nbGUgVGVzdCwKLSAgICAvLyBzbyB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXyBjYW4gYmUKLSAgICAvLyBkaWZmZXJlbnQgYW5kIHdlIGhhdmUgdG8gc29ydCB0byBjb21wYXJlLgotICAgIHNvcnQoZXhwZWN0ZWRfdmFsdWVzLmJlZ2luKCksIGV4cGVjdGVkX3ZhbHVlcy5lbmQoKSk7Ci0gICAgc29ydChjb2xsZWN0ZWRfcGFyYW1ldGVyc18uYmVnaW4oKSwgY29sbGVjdGVkX3BhcmFtZXRlcnNfLmVuZCgpKTsKLQotICAgIEVYUEVDVF9UUlVFKGNvbGxlY3RlZF9wYXJhbWV0ZXJzXyA9PSBleHBlY3RlZF92YWx1ZXMpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBjdXJyZW50X3BhcmFtZXRlcl87Ci0gIHN0YXRpYyB2ZWN0b3I8aW50PiBjb2xsZWN0ZWRfcGFyYW1ldGVyc187Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RHZW5lcmF0aW9uVGVzdCk7Ci19OwotdmVjdG9yPGludD4gVGVzdEdlbmVyYXRpb25UZXN0Ojpjb2xsZWN0ZWRfcGFyYW1ldGVyc187Ci0KLVRFU1RfUChUZXN0R2VuZXJhdGlvblRlc3QsIFRlc3RzRXhwYW5kZWRBbmRSdW4pIHsKLSAgRW52aXJvbm1lbnQ6Okluc3RhbmNlKCktPlRlc3RCb2R5RXhlY3V0ZWQoKTsKLSAgRVhQRUNUX0VRKGN1cnJlbnRfcGFyYW1ldGVyXywgR2V0UGFyYW0oKSk7Ci0gIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5wdXNoX2JhY2soR2V0UGFyYW0oKSk7Ci19Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0RXhwYW5zaW9uTW9kdWxlLCBUZXN0R2VuZXJhdGlvblRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbih0ZXN0X2dlbmVyYXRpb25fcGFyYW1zKSk7Ci0KLS8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBlbGVtZW50IHNlcXVlbmNlICh0aGlyZCBwYXJhbWV0ZXIgb2YKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKSBpcyBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSBhbmQgbmVpdGhlciBhdAotLy8gdGhlIGNhbGwgc2l0ZSBvZiBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBub3IgaW4gUlVOX0FMTF9URVNUUygpLiAgRm9yCi0vLyB0aGF0LCB3ZSBkZWNsYXJlIHBhcmFtX3ZhbHVlXyB0byBiZSBhIHN0YXRpYyBtZW1iZXIgb2YKLS8vIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0IGFuZCBpbml0aWFsaXplIGl0IHRvIDAuICBXZSBzZXQgaXQgdG8gMSBpbgotLy8gbWFpbigpLCBqdXN0IGJlZm9yZSBpbnZvY2F0aW9uIG9mIEluaXRHb29nbGVUZXN0KCkuICBBZnRlciBjYWxsaW5nCi0vLyBJbml0R29vZ2xlVGVzdCgpLCB3ZSBzZXQgdGhlIHZhbHVlIHRvIDIuICBJZiB0aGUgc2VxdWVuY2UgaXMgZXZhbHVhdGVkCi0vLyBiZWZvcmUgb3IgYWZ0ZXIgSW5pdEdvb2dsZVRlc3QsIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgY3JlYXRlIGEKLS8vIHRlc3Qgd2l0aCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiAxLCBhbmQgdGhlIHRlc3QgYm9keSB3aWxsIGZhaWwgdGhlCi0vLyBhc3NlcnRpb24uCi1jbGFzcyBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4gewotIHB1YmxpYzoKLSAgc3RhdGljIGludCBwYXJhbV92YWx1ZSgpIHsgcmV0dXJuIHBhcmFtX3ZhbHVlXzsgfQotICBzdGF0aWMgdm9pZCBzZXRfcGFyYW1fdmFsdWUoaW50IHBhcmFtX3ZhbHVlKSB7IHBhcmFtX3ZhbHVlXyA9IHBhcmFtX3ZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgaW50IHBhcmFtX3ZhbHVlXzsKLX07Ci1pbnQgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnBhcmFtX3ZhbHVlXyA9IDA7Ci0KLVRFU1RfUChHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCwgR2VuZXJhdG9yc0V2YWx1YXRlZEluTWFpbikgewotICBFWFBFQ1RfRVEoMSwgR2V0UGFyYW0oKSk7Ci19Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChHZW5FdmFsTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnBhcmFtX3ZhbHVlKCkpKTsKLQotLy8gVGVzdHMgdGhhdCBnZW5lcmF0b3JzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdCBhcmUKLS8vIGZ1bmN0aW9uYWwuIEdlbmVyYXRvciBleHRlcm5fZ2VuIGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4KLWV4dGVybiBQYXJhbUdlbmVyYXRvcjxpbnQ+IGV4dGVybl9nZW47Ci1jbGFzcyBFeHRlcm5hbEdlbmVyYXRvclRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OwotVEVTVF9QKEV4dGVybmFsR2VuZXJhdG9yVGVzdCwgRXh0ZXJuYWxHZW5lcmF0b3IpIHsKLSAgLy8gU2VxdWVuY2UgcHJvZHVjZWQgYnkgZXh0ZXJuX2dlbiBjb250YWlucyBvbmx5IGEgc2luZ2xlIHZhbHVlCi0gIC8vIHdoaWNoIHdlIHZlcmlmeSBoZXJlLgotICBFWFBFQ1RfRVEoR2V0UGFyYW0oKSwgMzMpOwotfQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRXh0ZXJuYWxHZW5lcmF0b3JNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbEdlbmVyYXRvclRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5fZ2VuKTsKLQotLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBkZWZpbmVkIGluIG9uZSB0cmFuc2xhdGlvbgotLy8gdW5pdCBhbmQgaW5zdGFudGlhdGVkIGluIGFub3RoZXIuIFRoaXMgdGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbgotLy8gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4gRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCBmaXh0dXJlIGNsYXNzIGlzCi0vLyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oLgotVEVTVF9QKEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QsIElzTXVsdGlwbGVPZjMzKSB7Ci0gIEVYUEVDVF9FUSgwLCBHZXRQYXJhbSgpICUgMzMpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIG11bHRpcGxlCi0vLyBnZW5lcmF0b3JzLgotY2xhc3MgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307Ci1URVNUX1AoTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgQWxsb3dzTXVsdGlwbGVJbnN0YW5jZXMpIHsKLX0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMSwgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgVmFsdWVzKDEsIDIpKTsKLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMiwgTXVsdGlwbGVJbnN0YW50aWF0aW9uVGVzdCwgUmFuZ2UoMywgNSkpOwotCi0vLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGluc3RhbnRpYXRlZAotLy8gaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMuIFRoaXMgdGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZAotLy8gaGVyZSBhbmQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0Mi5jYy4KLS8vIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYXRpb25Vbml0c1Rlc3QgZml4dHVyZSBjbGFzcwotLy8gaXMgZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaC4KLVRFU1RfUChJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QsIElzTXVsdGlwbGVPZjQyKSB7Ci0gIEVYUEVDVF9FUSgwLCBHZXRQYXJhbSgpICUgNDIpOwotfQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyLCA0MioyKSk7Ci0KLS8vIFRlc3RzIHRoYXQgZWFjaCBpdGVyYXRpb24gb2YgcGFyYW1ldGVyaXplZCB0ZXN0IHJ1bnMgaW4gYSBzZXBhcmF0ZSB0ZXN0Ci0vLyBvYmplY3QuCi1jbGFzcyBTZXBhcmF0ZUluc3RhbmNlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4gewotIHB1YmxpYzoKLSAgU2VwYXJhdGVJbnN0YW5jZVRlc3QoKSA6IGNvdW50XygwKSB7fQotCi0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7Ci0gICAgRVhQRUNUX0dFKGdsb2JhbF9jb3VudF8sIDIpCi0gICAgICAgIDw8ICJJZiBzb21lIChidXQgbm90IGFsbCkgU2VwYXJhdGVJbnN0YW5jZVRlc3QgdGVzdHMgaGF2ZSBiZWVuICIKLSAgICAgICAgPDwgImZpbHRlcmVkIG91dCB0aGlzIHRlc3Qgd2lsbCBmYWlsLiBNYWtlIHN1cmUgdGhhdCBhbGwgIgotICAgICAgICA8PCAiR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgYXJlIHNlbGVjdGVkIG9yIGRlLXNlbGVjdGVkIHRvZ2V0aGVyICIKLSAgICAgICAgPDwgImJ5IHRoZSB0ZXN0IGZpbHRlci4iOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBjb3VudF87Ci0gIHN0YXRpYyBpbnQgZ2xvYmFsX2NvdW50XzsKLX07Ci1pbnQgU2VwYXJhdGVJbnN0YW5jZVRlc3Q6Omdsb2JhbF9jb3VudF8gPSAwOwotCi1URVNUX1AoU2VwYXJhdGVJbnN0YW5jZVRlc3QsIFRlc3RzUnVuSW5TZXBhcmF0ZUluc3RhbmNlcykgewotICBFWFBFQ1RfRVEoMCwgY291bnRfKyspOwotICBnbG9iYWxfY291bnRfKys7Ci19Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChGb3VyRWxlbVNlcXVlbmNlLCBTZXBhcmF0ZUluc3RhbmNlVGVzdCwgUmFuZ2UoMSwgNCkpOwotCi0vLyBUZXN0cyB0aGF0IGFsbCBpbnN0YW50aWF0aW9ucyBvZiBhIHRlc3QgaGF2ZSBuYW1lZCBhcHByb3ByaWF0ZWx5LiBUZXN0Ci0vLyBkZWZpbmVkIHdpdGggVEVTVF9QKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIGFuZCBpbnN0YW50aWF0ZWQgd2l0aAotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2VxdWVuY2VOYW1lLCBUZXN0Q2FzZU5hbWUsIGdlbmVyYXRvcikgbXVzdCBiZSBuYW1lZAotLy8gU2VxdWVuY2VOYW1lL1Rlc3RDYXNlTmFtZS5UZXN0TmFtZS9pLCB3aGVyZSBpIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZQotLy8gc2VxdWVuY2UgZWxlbWVudCB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0LgotY2xhc3MgTmFtaW5nVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4ge307Ci0KLVRFU1RfUChOYW1pbmdUZXN0LCBUZXN0c1JlcG9ydENvcnJlY3ROYW1lc0FuZFBhcmFtZXRlcnMpIHsKLSAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLQotICBFWFBFQ1RfU1RSRVEoIlplcm9Ub0ZpdmVTZXF1ZW5jZS9OYW1pbmdUZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLQotICBNZXNzYWdlIGluZGV4X3N0cmVhbTsKLSAgaW5kZXhfc3RyZWFtIDw8ICJUZXN0c1JlcG9ydENvcnJlY3ROYW1lc0FuZFBhcmFtZXRlcnMvIiA8PCBHZXRQYXJhbSgpOwotICBFWFBFQ1RfU1RSRVEoaW5kZXhfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksIHRlc3RfaW5mby0+bmFtZSgpKTsKLQotICBFWFBFQ1RfRVEoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLCB0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChaZXJvVG9GaXZlU2VxdWVuY2UsIE5hbWluZ1Rlc3QsIFJhbmdlKDAsIDUpKTsKLQotLy8gVGVzdHMgdGhhdCB1c2VyIHN1cHBsaWVkIGN1c3RvbSBwYXJhbWV0ZXIgbmFtZXMgYXJlIHdvcmtpbmcgY29ycmVjdGx5LgotLy8gUnVucyB0aGUgdGVzdCB3aXRoIGEgYnVpbHRpbiBoZWxwZXIgbWV0aG9kIHdoaWNoIHVzZXMgUHJpbnRUb1N0cmluZywKLS8vIGFzIHdlbGwgYXMgYSBjdXN0b20gZnVuY3Rpb24gYW5kIGN1c3RvbSBmdW5jdG9yIHRvIGVuc3VyZSBhbGwgcG9zc2libGUKLS8vIHVzZXMgd29yayBjb3JyZWN0bHkuCi1jbGFzcyBDdXN0b21GdW5jdG9yTmFtaW5nVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPHN0ZDo6c3RyaW5nPiB7fTsKLVRFU1RfUChDdXN0b21GdW5jdG9yTmFtaW5nVGVzdCwgQ3VzdG9tVGVzdE5hbWVzKSB7fQotCi1zdHJ1Y3QgQ3VzdG9tUGFyYW1OYW1lRnVuY3RvciB7Ci0gIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKCkoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHN0ZDo6c3RyaW5nPiYgaW5mbykgewotICAgIHJldHVybiBpbmZvLnBhcmFtOwotICB9Ci19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChDdXN0b21QYXJhbU5hbWVGdW5jdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tRnVuY3Rvck5hbWluZ1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoc3RkOjpzdHJpbmcoIkZ1bmN0b3JOYW1lIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tUGFyYW1OYW1lRnVuY3RvcigpKTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQWxsQWxsb3dlZENoYXJhY3RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21GdW5jdG9yTmFtaW5nVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkwXyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tUGFyYW1OYW1lRnVuY3RvcigpKTsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIEN1c3RvbVBhcmFtTmFtZUZ1bmN0aW9uKAotICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxzdGQ6OnN0cmluZz4mIGluZm8pIHsKLSAgcmV0dXJuIGluZm8ucGFyYW07Ci19Ci0KLWNsYXNzIEN1c3RvbUZ1bmN0aW9uTmFtaW5nVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPHN0ZDo6c3RyaW5nPiB7fTsKLVRFU1RfUChDdXN0b21GdW5jdGlvbk5hbWluZ1Rlc3QsIEN1c3RvbVRlc3ROYW1lcykge30KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ3VzdG9tUGFyYW1OYW1lRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21GdW5jdGlvbk5hbWluZ1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoc3RkOjpzdHJpbmcoIkZ1bmN0aW9uTmFtZSIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVBhcmFtTmFtZUZ1bmN0aW9uKTsKLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLQotLy8gVGVzdCBjdXN0b20gbmFtaW5nIHdpdGggYSBsYW1iZGEKLQotY2xhc3MgQ3VzdG9tTGFtYmRhTmFtaW5nVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPHN0ZDo6c3RyaW5nPiB7fTsKLVRFU1RfUChDdXN0b21MYW1iZGFOYW1pbmdUZXN0LCBDdXN0b21UZXN0TmFtZXMpIHt9Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEN1c3RvbVBhcmFtTmFtZUxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUxhbWJkYU5hbWluZ1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoc3RkOjpzdHJpbmcoIkxhbWJkYU5hbWUiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88c3RkOjpzdHJpbmc+JiBpbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLnBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi1URVNUKEN1c3RvbU5hbWluZ1Rlc3QsIENoZWNrTmFtZVJlZ2lzdHJ5KSB7Ci0gIDo6dGVzdGluZzo6VW5pdFRlc3QqIHVuaXRfdGVzdCA9IDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0ZXN0X25hbWVzOwotICBmb3IgKGludCBjYXNlX251bSA9IDA7Ci0gICAgICAgY2FzZV9udW0gPCB1bml0X3Rlc3QtPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOwotICAgICAgICsrY2FzZV9udW0pIHsKLSAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RDYXNlKiB0ZXN0X2Nhc2UgPSB1bml0X3Rlc3QtPkdldFRlc3RDYXNlKGNhc2VfbnVtKTsKLSAgICBmb3IgKGludCB0ZXN0X251bSA9IDA7Ci0gICAgICAgICB0ZXN0X251bSA8IHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpOwotICAgICAgICAgKyt0ZXN0X251bSkgewotICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogdGVzdF9pbmZvID0gdGVzdF9jYXNlLT5HZXRUZXN0SW5mbyh0ZXN0X251bSk7Ci0gICAgICB0ZXN0X25hbWVzLmluc2VydChzdGQ6OnN0cmluZyh0ZXN0X2luZm8tPm5hbWUoKSkpOwotICAgIH0KLSAgfQotICBFWFBFQ1RfRVEoMXUsIHRlc3RfbmFtZXMuY291bnQoIkN1c3RvbVRlc3ROYW1lcy9GdW5jdG9yTmFtZSIpKTsKLSAgRVhQRUNUX0VRKDF1LCB0ZXN0X25hbWVzLmNvdW50KCJDdXN0b21UZXN0TmFtZXMvRnVuY3Rpb25OYW1lIikpOwotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLSAgRVhQRUNUX0VRKDF1LCB0ZXN0X25hbWVzLmNvdW50KCJDdXN0b21UZXN0TmFtZXMvTGFtYmRhTmFtZSIpKTsKLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotfQotCi0vLyBUZXN0IGEgbnVtZXJpYyBuYW1lIHRvIGVuc3VyZSBQcmludFRvU3RyaW5nUGFyYW1OYW1lIHdvcmtzIGNvcnJlY3RseS4KLQotY2xhc3MgQ3VzdG9tSW50ZWdlck5hbWluZ1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OwotCi1URVNUX1AoQ3VzdG9tSW50ZWdlck5hbWluZ1Rlc3QsIFRlc3RzUmVwb3J0Q29ycmVjdE5hbWVzKSB7Ci0gIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9Ci0gICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKLSAgdGVzdF9uYW1lX3N0cmVhbSA8PCAiVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXMvIiA8PCBHZXRQYXJhbSgpOwotICBFWFBFQ1RfU1RSRVEodGVzdF9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLCB0ZXN0X2luZm8tPm5hbWUoKSk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFByaW50VG9TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbnRlZ2VyTmFtaW5nVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKDAsIDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nUGFyYW1OYW1lKCkpOwotCi0vLyBUZXN0IGEgY3VzdG9tIHN0cnVjdCB3aXRoIFByaW50VG9TdHJpbmcuCi0KLXN0cnVjdCBDdXN0b21TdHJ1Y3QgewotICBleHBsaWNpdCBDdXN0b21TdHJ1Y3QoaW50IHZhbHVlKSA6IHgodmFsdWUpIHt9Ci0gIGludCB4OwotfTsKLQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBjb25zdCBDdXN0b21TdHJ1Y3QmIHZhbCkgewotICBzdHJlYW0gPDwgdmFsLng7Ci0gIHJldHVybiBzdHJlYW07Ci19Ci0KLWNsYXNzIEN1c3RvbVN0cnVjdE5hbWluZ1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxDdXN0b21TdHJ1Y3Q+IHt9OwotCi1URVNUX1AoQ3VzdG9tU3RydWN0TmFtaW5nVGVzdCwgVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXMpIHsKLSAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgTWVzc2FnZSB0ZXN0X25hbWVfc3RyZWFtOwotICB0ZXN0X25hbWVfc3RyZWFtIDw8ICJUZXN0c1JlcG9ydENvcnJlY3ROYW1lcy8iIDw8IEdldFBhcmFtKCk7Ci0gIEVYUEVDVF9TVFJFUSh0ZXN0X25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksIHRlc3RfaW5mby0+bmFtZSgpKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUHJpbnRUb1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVN0cnVjdE5hbWluZ1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQ3VzdG9tU3RydWN0KDApLCBDdXN0b21TdHJ1Y3QoMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nUGFyYW1OYW1lKCkpOwotCi0vLyBUZXN0IHRoYXQgdXNpbmcgYSBzdGF0ZWZ1bCBwYXJhbWV0ZXIgbmFtaW5nIGZ1bmN0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgotCi1zdHJ1Y3QgU3RhdGVmdWxOYW1pbmdGdW5jdG9yIHsKLSAgU3RhdGVmdWxOYW1pbmdGdW5jdG9yKCkgOiBzdW0oMCkge30KLSAgc3RkOjpzdHJpbmcgb3BlcmF0b3IoKShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88aW50PiYgaW5mbykgewotICAgIGludCB2YWx1ZSA9IGluZm8ucGFyYW0gKyBzdW07Ci0gICAgc3VtICs9IGluZm8ucGFyYW07Ci0gICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyh2YWx1ZSk7Ci0gIH0KLSAgaW50IHN1bTsKLX07Ci0KLWNsYXNzIFN0YXRlZnVsTmFtaW5nVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Ci0gcHJvdGVjdGVkOgotICBTdGF0ZWZ1bE5hbWluZ1Rlc3QoKSA6IHN1bV8oMCkge30KLSAgaW50IHN1bV87Ci19OwotCi1URVNUX1AoU3RhdGVmdWxOYW1pbmdUZXN0LCBUZXN0c1JlcG9ydENvcnJlY3ROYW1lcykgewotICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICBzdW1fICs9IEdldFBhcmFtKCk7Ci0gIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKLSAgdGVzdF9uYW1lX3N0cmVhbSA8PCAiVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXMvIiA8PCBzdW1fOwotICBFWFBFQ1RfU1RSRVEodGVzdF9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLCB0ZXN0X2luZm8tPm5hbWUoKSk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0YXRlZnVsTmFtaW5nRnVuY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlZnVsTmFtaW5nVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKDAsIDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVmdWxOYW1pbmdGdW5jdG9yKCkpOwotCi0vLyBDbGFzcyB0aGF0IGNhbm5vdCBiZSBzdHJlYW1lZCBpbnRvIGFuIG9zdHJlYW0uICBJdCBuZWVkcyB0byBiZSBjb3B5YWJsZQotLy8gKGFuZCwgaW4gY2FzZSBvZiBNU1ZDLCBhbHNvIGFzc2lnbmFibGUpIGluIG9yZGVyIHRvIGJlIGEgdGVzdCBwYXJhbWV0ZXIKLS8vIHR5cGUuICBJdHMgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIGRvIGV4YWN0bHkKLS8vIHdoYXQgd2UgbmVlZC4KLWNsYXNzIFVuc3RyZWFtYWJsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBVbnN0cmVhbWFibGUoaW50IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLQotIHByaXZhdGU6Ci0gIGludCB2YWx1ZV87Ci19OwotCi1jbGFzcyBDb21tZW50VGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPFVuc3RyZWFtYWJsZT4ge307Ci0KLVRFU1RfUChDb21tZW50VGVzdCwgVGVzdHNDb3JyZWN0bHlSZXBvcnRVbnN0cmVhbWFibGVQYXJhbXMpIHsKLSAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLQotICBFWFBFQ1RfRVEoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLCB0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uV2l0aENvbW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoVW5zdHJlYW1hYmxlKDEpKSk7Ci0KLS8vIFZlcmlmeSB0aGF0IHdlIGNhbiBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgdGVzdCBmaXh0dXJlcywgd2hlcmUgdGhlIGJhc2UKLS8vIGNsYXNzIGZpeHR1cmUgaXMgbm90IHBhcmFtZXRlcml6ZWQgYW5kIHRoZSBkZXJpdmVkIGNsYXNzIGlzLiBJbiB0aGlzIGNhc2UKLS8vIFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCBpbmhlcml0cyBmcm9tIE5vblBhcmFtZXRlcml6ZWRCYXNlVGVzdC4gIFdlCi0vLyBwZXJmb3JtIHNpbXBsZSB0ZXN0cyBvbiBib3RoLgotY2xhc3MgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QoKSA6IG5fKDE3KSB7IH0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBuXzsKLX07Ci0KLWNsYXNzIFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCA6IHB1YmxpYyBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50PiB7Ci0gcHJvdGVjdGVkOgotICBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QoKSA6IGNvdW50XygwKSB7IH0KLSAgaW50IGNvdW50XzsKLSAgc3RhdGljIGludCBnbG9iYWxfY291bnRfOwotfTsKLQotaW50IFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdDo6Z2xvYmFsX2NvdW50XyA9IDA7Ci0KLVRFU1RfRihOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QsIEZpeHR1cmVJc0luaXRpYWxpemVkKSB7Ci0gIEVYUEVDVF9FUSgxNywgbl8pOwotfQotCi1URVNUX1AoUGFyYW1ldGVyaXplZERlcml2ZWRUZXN0LCBTZWVzU2VxdWVuY2UpIHsKLSAgRVhQRUNUX0VRKDE3LCBuXyk7Ci0gIEVYUEVDVF9FUSgwLCBjb3VudF8rKyk7Ci0gIEVYUEVDVF9FUShHZXRQYXJhbSgpLCBnbG9iYWxfY291bnRfKyspOwotfQotCi1jbGFzcyBQYXJhbWV0ZXJpemVkRGVhdGhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsgfTsKLQotVEVTVF9GKFBhcmFtZXRlcml6ZWREZWF0aFRlc3QsIEdldFBhcmFtRGllc0Zyb21UZXN0RikgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKEdldFBhcmFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdCAuKiIpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChSYW5nZVplcm9Ub0ZpdmUsIFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCwgUmFuZ2UoMCwgNSkpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLVRFU1QoQ29tcGlsZVRlc3QsIENvbWJpbmVJc0RlZmluZWRPbmx5V2hlbkd0ZXN0SGFzUGFyYW1UZXN0SXNEZWZpbmVkKSB7Ci0jaWYgR1RFU1RfSEFTX0NPTUJJTkUgJiYgIUdURVNUX0hBU19QQVJBTV9URVNUCi0gIEZBSUwoKSA8PCAiR1RFU1RfSEFTX0NPTUJJTkUgaXMgZGVmaW5lZCB3aGlsZSBHVEVTVF9IQVNfUEFSQU1fVEVTVCBpcyBub3RcbiIKLSNlbmRpZgotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAvLyBVc2VkIGluIFRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UuCi0gIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChUZXN0R2VuZXJhdGlvblRlc3Q6OkVudmlyb25tZW50OjpJbnN0YW5jZSgpKTsKLSAgLy8gVXNlZCBpbiBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCB0ZXN0IGNhc2UuIFRlc3RzIHRoYXQgdGhlIHVwZGF0ZWQgdmFsdWUKLSAgLy8gd2lsbCBiZSBwaWNrZWQgdXAgZm9yIGluc3RhbnRpYXRpbmcgdGVzdHMgaW4gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QuCi0gIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpzZXRfcGFyYW1fdmFsdWUoMSk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAvLyBVc2VkIGluIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0IHRlc3QgY2FzZS4gVGVzdHMgdGhhdCB2YWx1ZSB1cGRhdGVkCi0gIC8vIGhlcmUgd2lsbCBOT1QgYmUgdXNlZCBmb3IgaW5zdGFudGlhdGluZyB0ZXN0cyBpbgotICAvLyBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdC4KLSAgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3Q6OnNldF9wYXJhbV92YWx1ZSgyKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVhMTIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIHByb3ZpZGVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkKLS8vIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZi4KLQotI2lmbmRlZiBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXwotI2RlZmluZSBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLS8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBkZWZpbml0aW9uIGFuZCBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdAotLy8gaW4gc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdHMuCi1jbGFzcyBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKLX07Ci0KLS8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdCBpbiBtdWx0aXBsZQotLy8gdHJhbnNsYXRpb24gdW5pdHMuCi1jbGFzcyBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSNlbmRpZiAgLy8gR1RFU1RfVEVTVF9HVEVTVF9QQVJBTV9URVNUX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdiYWQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1wb3J0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KSwgd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGludGVybmFsIGNyb3NzLXBsYXRmb3JtIHN1cHBvcnQgdXRpbGl0aWVzLgotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIEdURVNUX09TX01BQwotIyBpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX01BQwotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIHN0ZDo6cGFpciBhbmQgc3RkOjptYWtlX3BhaXIuCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bwotLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCi0vLyBoaXMgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLXVzaW5nIHN0ZDo6bWFrZV9wYWlyOwotdXNpbmcgc3RkOjpwYWlyOwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1URVNUKElzWERpZ2l0VGVzdCwgV29ya3NGb3JOYXJyb3dBc2NpaSkgewotICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnMCcpKTsKLSAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJzknKSk7Ci0gIEVYUEVDVF9UUlVFKElzWERpZ2l0KCdBJykpOwotICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnRicpKTsKLSAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJ2EnKSk7Ci0gIEVYUEVDVF9UUlVFKElzWERpZ2l0KCdmJykpOwotCi0gIEVYUEVDVF9GQUxTRShJc1hEaWdpdCgnLScpKTsKLSAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KCdnJykpOwotICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoJ0cnKSk7Ci19Ci0KLVRFU1QoSXNYRGlnaXRUZXN0LCBSZXR1cm5zRmFsc2VGb3JOYXJyb3dOb25Bc2NpaSkgewotICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCkpKTsKLSAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KHN0YXRpY19jYXN0PGNoYXI+KCcwJyB8IDB4ODApKSk7Ci19Ci0KLVRFU1QoSXNYRGlnaXRUZXN0LCBXb3Jrc0ZvcldpZGVBc2NpaSkgewotICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJzAnKSk7Ci0gIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnOScpKTsKLSAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCdBJykpOwotICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJ0YnKSk7Ci0gIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnYScpKTsKLSAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCdmJykpOwotCi0gIEVYUEVDVF9GQUxTRShJc1hEaWdpdChMJy0nKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1hEaWdpdChMJ2cnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1hEaWdpdChMJ0cnKSk7Ci19Ci0KLVRFU1QoSXNYRGlnaXRUZXN0LCBSZXR1cm5zRmFsc2VGb3JXaWRlTm9uQXNjaWkpIHsKLSAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4ODApKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1hEaWdpdChzdGF0aWNfY2FzdDx3Y2hhcl90PihMJzAnIHwgMHg4MCkpKTsKLSAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KHN0YXRpY19jYXN0PHdjaGFyX3Q+KEwnMCcgfCAweDEwMCkpKTsKLX0KLQotY2xhc3MgQmFzZSB7Ci0gcHVibGljOgotICAvLyBDb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIGRvIGV4YWN0bHkgd2hhdCB3ZSBuZWVkLCBzbyB3ZQotICAvLyB1c2UgdGhlbS4KLSAgQmFzZSgpIDogbWVtYmVyXygwKSB7fQotICBleHBsaWNpdCBCYXNlKGludCBuKSA6IG1lbWJlcl8obikge30KLSAgdmlydHVhbCB+QmFzZSgpIHt9Ci0gIGludCBtZW1iZXIoKSB7IHJldHVybiBtZW1iZXJfOyB9Ci0KLSBwcml2YXRlOgotICBpbnQgbWVtYmVyXzsKLX07Ci0KLWNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBEZXJpdmVkKGludCBuKSA6IEJhc2Uobikge30KLX07Ci0KLVRFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ29udmVydHNQb2ludGVycykgewotICBEZXJpdmVkIGRlcml2ZWQoMCk7Ci0gIEVYUEVDVF9UUlVFKCZkZXJpdmVkID09IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZSo+KCZkZXJpdmVkKSk7Ci19Ci0KLVRFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlSW5oZXJpdGFuY2UpIHsKLSAgRGVyaXZlZCBkZXJpdmVkKDEpOwotICBCYXNlIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGRlcml2ZWQpOwotICBFWFBFQ1RfRVEoZGVyaXZlZC5tZW1iZXIoKSwgYmFzZS5tZW1iZXIoKSk7Ci19Ci0KLWNsYXNzIENhc3RhYmxlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENhc3RhYmxlKGJvb2wqIGNvbnZlcnRlZCkgOiBjb252ZXJ0ZWRfKGNvbnZlcnRlZCkge30KLSAgb3BlcmF0b3IgQmFzZSgpIHsKLSAgICAqY29udmVydGVkXyA9IHRydWU7Ci0gICAgcmV0dXJuIEJhc2UoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCogY29udmVydGVkXzsKLX07Ci0KLVRFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlTm9uQ29uc3RDYXN0T3BlcmF0b3IpIHsKLSAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKLSAgQ2FzdGFibGUgY2FzdGFibGUoJmNvbnZlcnRlZCk7Ci0gIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY2FzdGFibGUpOwotICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOwotfQotCi1jbGFzcyBDb25zdENhc3RhYmxlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbnN0Q2FzdGFibGUoYm9vbCogY29udmVydGVkKSA6IGNvbnZlcnRlZF8oY29udmVydGVkKSB7fQotICBvcGVyYXRvciBCYXNlKCkgY29uc3QgewotICAgICpjb252ZXJ0ZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gQmFzZSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBib29sKiBjb252ZXJ0ZWRfOwotfTsKLQotVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VDb25zdENhc3RPcGVyYXRvck9uQ29uc3RWYWx1ZXMpIHsKLSAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKLSAgY29uc3QgQ29uc3RDYXN0YWJsZSBjb25zdF9jYXN0YWJsZSgmY29udmVydGVkKTsKLSAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjb25zdF9jYXN0YWJsZSk7Ci0gIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7Ci19Ci0KLWNsYXNzIENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZSB7Ci0gcHVibGljOgotICBDb25zdEFuZE5vbkNvbnN0Q2FzdGFibGUoYm9vbCogY29udmVydGVkLCBib29sKiBjb25zdF9jb252ZXJ0ZWQpCi0gICAgICA6IGNvbnZlcnRlZF8oY29udmVydGVkKSwgY29uc3RfY29udmVydGVkXyhjb25zdF9jb252ZXJ0ZWQpIHt9Ci0gIG9wZXJhdG9yIEJhc2UoKSB7Ci0gICAgKmNvbnZlcnRlZF8gPSB0cnVlOwotICAgIHJldHVybiBCYXNlKCk7Ci0gIH0KLSAgb3BlcmF0b3IgQmFzZSgpIGNvbnN0IHsKLSAgICAqY29uc3RfY29udmVydGVkXyA9IHRydWU7Ci0gICAgcmV0dXJuIEJhc2UoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCogY29udmVydGVkXzsKLSAgYm9vbCogY29uc3RfY29udmVydGVkXzsKLX07Ci0KLVRFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuU2VsZWN0QmV0d2VlbkNvbnN0QW5kTm9uQ29uc3RDYXNyQXBwcm9wcmlhdGVseSkgewotICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOwotICBib29sIGNvbnN0X2NvbnZlcnRlZCA9IGZhbHNlOwotICBDb25zdEFuZE5vbkNvbnN0Q2FzdGFibGUgY2FzdGFibGUoJmNvbnZlcnRlZCwgJmNvbnN0X2NvbnZlcnRlZCk7Ci0gIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY2FzdGFibGUpOwotICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOwotICBFWFBFQ1RfRkFMU0UoY29uc3RfY29udmVydGVkKTsKLQotICBjb252ZXJ0ZWQgPSBmYWxzZTsKLSAgY29uc3RfY29udmVydGVkID0gZmFsc2U7Ci0gIGNvbnN0IENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZSBjb25zdF9jYXN0YWJsZSgmY29udmVydGVkLCAmY29uc3RfY29udmVydGVkKTsKLSAgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oY29uc3RfY2FzdGFibGUpOwotICBFWFBFQ1RfRkFMU0UoY29udmVydGVkKTsKLSAgRVhQRUNUX1RSVUUoY29uc3RfY29udmVydGVkKTsKLX0KLQotY2xhc3MgVG8gewotIHB1YmxpYzoKLSAgVG8oYm9vbCogY29udmVydGVkKSB7ICpjb252ZXJ0ZWQgPSB0cnVlOyB9ICAvLyBOT0xJTlQKLX07Ci0KLVRFU1QoSW1wbGljaXRDYXN0VGVzdCwgQ2FuVXNlSW1wbGljaXRDb25zdHJ1Y3RvcikgewotICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOwotICBUbyB0byA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88VG8+KCZjb252ZXJ0ZWQpOwotICAodm9pZCl0bzsKLSAgRVhQRUNUX1RSVUUoY29udmVydGVkKTsKLX0KLQotVEVTVChJdGVyYXRvclRyYWl0c1Rlc3QsIFdvcmtzRm9yU1RMQ29udGFpbmVySXRlcmF0b3JzKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsCi0gICAgICBJdGVyYXRvclRyYWl0czwgOjpzdGQ6OnZlY3RvcjxpbnQ+Ojpjb25zdF9pdGVyYXRvcj46OnZhbHVlX3R5cGU+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLAotICAgICAgSXRlcmF0b3JUcmFpdHM8IDo6c3RkOjpsaXN0PGJvb2w+OjppdGVyYXRvcj46OnZhbHVlX3R5cGU+KCk7Ci19Ci0KLVRFU1QoSXRlcmF0b3JUcmFpdHNUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb05vbkNvbnN0KSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxjaGFyLCBJdGVyYXRvclRyYWl0czxjaGFyKj46OnZhbHVlX3R5cGU+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCB2b2lkKiwgSXRlcmF0b3JUcmFpdHM8Y29uc3Qgdm9pZCoqPjo6dmFsdWVfdHlwZT4oKTsKLX0KLQotVEVTVChJdGVyYXRvclRyYWl0c1Rlc3QsIFdvcmtzRm9yUG9pbnRlclRvQ29uc3QpIHsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIEl0ZXJhdG9yVHJhaXRzPGNvbnN0IGNoYXIqPjo6dmFsdWVfdHlwZT4oKTsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IHZvaWQqLAotICAgICAgSXRlcmF0b3JUcmFpdHM8Y29uc3Qgdm9pZCogY29uc3QqPjo6dmFsdWVfdHlwZT4oKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgZWxlbWVudF90eXBlIHR5cGVkZWYgaXMgYXZhaWxhYmxlIGluIHNjb3BlZF9wdHIgYW5kIHJlZmVycwotLy8gdG8gdGhlIHBhcmFtZXRlciB0eXBlLgotVEVTVChTY29wZWRQdHJUZXN0LCBEZWZpbmVzRWxlbWVudFR5cGUpIHsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjxpbnQ+OjplbGVtZW50X3R5cGU+KCk7Ci19Ci0KLS8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEltcGxlbWVudCBUSEUgUkVTVCBvZiBzY29wZWRfcHRyIHRlc3RzLgotCi1URVNUKEd0ZXN0Q2hlY2tTeW50YXhUZXN0LCBCZWhhdmVzTGlrZUFTaW5nbGVTdGF0ZW1lbnQpIHsKLSAgaWYgKEFsd2F5c0ZhbHNlKCkpCi0gICAgR1RFU1RfQ0hFQ0tfKGZhbHNlKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCdzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5LiI7Ci0KLSAgaWYgKEFsd2F5c1RydWUoKSkKLSAgICBHVEVTVF9DSEVDS18odHJ1ZSk7Ci0gIGVsc2UKLSAgICA7ICAvLyBOT0xJTlQKLQotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICA7ICAvLyBOT0xJTlQKLSAgZWxzZQotICAgIEdURVNUX0NIRUNLXyh0cnVlKSA8PCAiIjsKLX0KLQotVEVTVChHdGVzdENoZWNrU3ludGF4VGVzdCwgV29ya3NXaXRoU3dpdGNoKSB7Ci0gIHN3aXRjaCAoMCkgewotICAgIGNhc2UgMToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBHVEVTVF9DSEVDS18odHJ1ZSk7Ci0gIH0KLQotICBzd2l0Y2ggKDApCi0gICAgY2FzZSAwOgotICAgICAgR1RFU1RfQ0hFQ0tfKHRydWUpIDw8ICJDaGVjayBmYWlsZWQgaW4gc3dpdGNoIGNhc2UiOwotfQotCi0vLyBWZXJpZmllcyBiZWhhdmlvciBvZiBGb3JtYXRGaWxlTG9jYXRpb24uCi1URVNUKEZvcm1hdEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNGaWxlTG9jYXRpb24pIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImZvby5jYyIsIEZvcm1hdEZpbGVMb2NhdGlvbigiZm9vLmNjIiwgNDIpKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgIjQyIiwgRm9ybWF0RmlsZUxvY2F0aW9uKCJmb28uY2MiLCA0MikpOwotfQotCi1URVNUKEZvcm1hdEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVbmtub3duRmlsZSkgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAotICAgICAgSXNTdWJzdHJpbmcsICJ1bmtub3duIGZpbGUiLCBGb3JtYXRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgIjQyIiwgRm9ybWF0RmlsZUxvY2F0aW9uKE5VTEwsIDQyKSk7Ci19Ci0KLVRFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkxpbmUpIHsKLSAgRVhQRUNUX0VRKCJmb28uY2M6IiwgRm9ybWF0RmlsZUxvY2F0aW9uKCJmb28uY2MiLCAtMSkpOwotfQotCi1URVNUKEZvcm1hdEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25GaWxlQW5kTGluZSkgewotICBFWFBFQ1RfRVEoInVua25vd24gZmlsZToiLCBGb3JtYXRGaWxlTG9jYXRpb24oTlVMTCwgLTEpKTsKLX0KLQotLy8gVmVyaWZpZXMgYmVoYXZpb3Igb2YgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbi4KLVRFU1QoRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNGaWxlTG9jYXRpb24pIHsKLSAgRVhQRUNUX0VRKCJmb28uY2M6NDIiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCJmb28uY2MiLCA0MikpOwotfQotCi1URVNUKEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duRmlsZSkgewotICBFWFBFQ1RfRVEoInVua25vd24gZmlsZTo0MiIsCi0gICAgICAgICAgICBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKE5VTEwsIDQyKSk7Ci19Ci0KLVRFU1QoRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25MaW5lKSB7Ci0gIEVYUEVDVF9FUSgiZm9vLmNjIiwgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigiZm9vLmNjIiwgLTEpKTsKLX0KLQotVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkZpbGVBbmRMaW5lKSB7Ci0gIEVYUEVDVF9FUSgidW5rbm93biBmaWxlIiwgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbihOVUxMLCAtMSkpOwotfQotCi0jaWYgR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX1FOWAotdm9pZCogVGhyZWFkRnVuYyh2b2lkKiBkYXRhKSB7Ci0gIGludGVybmFsOjpNdXRleCogbXV0ZXggPSBzdGF0aWNfY2FzdDxpbnRlcm5hbDo6TXV0ZXgqPihkYXRhKTsKLSAgbXV0ZXgtPkxvY2soKTsKLSAgbXV0ZXgtPlVubG9jaygpOwotICByZXR1cm4gTlVMTDsKLX0KLQotVEVTVChHZXRUaHJlYWRDb3VudFRlc3QsIFJldHVybnNDb3JyZWN0VmFsdWUpIHsKLSAgY29uc3Qgc2l6ZV90IHN0YXJ0aW5nX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoKTsKLSAgcHRocmVhZF90ICAgICAgIHRocmVhZF9pZDsKLQotICBpbnRlcm5hbDo6TXV0ZXggbXV0ZXg7Ci0gIHsKLSAgICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4KTsKLSAgICBwdGhyZWFkX2F0dHJfdCAgYXR0cjsKLSAgICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpKTsKLSAgICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSkpOwotCi0gICAgY29uc3QgaW50IHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfaWQsICZhdHRyLCAmVGhyZWFkRnVuYywgJm11dGV4KTsKLSAgICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpKTsKLSAgICBBU1NFUlRfRVEoMCwgc3RhdHVzKTsKLSAgICBFWFBFQ1RfRVEoc3RhcnRpbmdfY291bnQgKyAxLCBHZXRUaHJlYWRDb3VudCgpKTsKLSAgfQotCi0gIHZvaWQqIGR1bW15OwotICBBU1NFUlRfRVEoMCwgcHRocmVhZF9qb2luKHRocmVhZF9pZCwgJmR1bW15KSk7Ci0KLSAgLy8gVGhlIE9TIG1heSBub3QgaW1tZWRpYXRlbHkgcmVwb3J0IHRoZSB1cGRhdGVkIHRocmVhZCBjb3VudCBhZnRlcgotICAvLyBqb2luaW5nIGEgdGhyZWFkLCBjYXVzaW5nIGZsYWtpbmVzcyBpbiB0aGlzIHRlc3QuIFRvIGNvdW50ZXIgdGhhdCwgd2UKLSAgLy8gd2FpdCBmb3IgdXAgdG8gLjUgc2Vjb25kcyBmb3IgdGhlIE9TIHRvIHJlcG9ydCB0aGUgY29ycmVjdCB2YWx1ZS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICBpZiAoR2V0VGhyZWFkQ291bnQoKSA9PSBzdGFydGluZ19jb3VudCkKLSAgICAgIGJyZWFrOwotCi0gICAgU2xlZXBNaWxsaXNlY29uZHMoMTAwKTsKLSAgfQotCi0gIEVYUEVDVF9FUShzdGFydGluZ19jb3VudCwgR2V0VGhyZWFkQ291bnQoKSk7Ci19Ci0jZWxzZQotVEVTVChHZXRUaHJlYWRDb3VudFRlc3QsIFJldHVybnNaZXJvV2hlblVuYWJsZVRvQ291bnRUaHJlYWRzKSB7Ci0gIEVYUEVDVF9FUSgwVSwgR2V0VGhyZWFkQ291bnQoKSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYIHx8IEdURVNUX09TX01BQyB8fCBHVEVTVF9PU19RTlgKLQotVEVTVChHdGVzdENoZWNrRGVhdGhUZXN0LCBEaWVzV2l0aENvcnJlY3RPdXRwdXRPbkZhaWx1cmUpIHsKLSAgY29uc3QgYm9vbCBhX2ZhbHNlX2NvbmRpdGlvbiA9IGZhbHNlOwotICBjb25zdCBjaGFyIHJlZ2V4W10gPQotI2lmZGVmIF9NU0NfVkVSCi0gICAgICJndGVzdC1wb3J0X3Rlc3RcXC5jY1xcKFxcZCtcXCk6IgotI2VsaWYgR1RFU1RfVVNFU19QT1NJWF9SRQotICAgICAiZ3Rlc3QtcG9ydF90ZXN0XFwuY2M6WzAtOV0rIgotI2Vsc2UKLSAgICAgImd0ZXN0LXBvcnRfdGVzdFxcLmNjOlxcZCsiCi0jZW5kaWYgIC8vIF9NU0NfVkVSCi0gICAgICIuKmFfZmFsc2VfY29uZGl0aW9uLipFeHRyYSBpbmZvLioiOwotCi0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoR1RFU1RfQ0hFQ0tfKGFfZmFsc2VfY29uZGl0aW9uKSA8PCAiRXh0cmEgaW5mbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXgpOwotfQotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotVEVTVChHdGVzdENoZWNrRGVhdGhUZXN0LCBMaXZlc1NpbGVudGx5T25TdWNjZXNzKSB7Ci0gIEVYUEVDVF9FWElUKHsKLSAgICAgIEdURVNUX0NIRUNLXyh0cnVlKSA8PCAiRXh0cmEgaW5mbyI7Ci0gICAgICA6OnN0ZDo6Y2VyciA8PCAiU3VjY2Vzc1xuIjsKLSAgICAgIGV4aXQoMCk7IH0sCi0gICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiU3VjY2VzcyIpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIFZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3QgY2hvb3NlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgYXBwcm9wcmlhdGUgdG8KLS8vIHRoZSBwbGF0Zm9ybS4gVGhlIHRlc3Qgd2lsbCBwcm9kdWNlIGNvbXBpbGVyIGVycm9ycyBpbiBjYXNlIG9mIGZhaWx1cmUuCi0vLyBGb3Igc2ltcGxpY2l0eSwgd2Ugb25seSBjb3ZlciB0aGUgbW9zdCBpbXBvcnRhbnQgcGxhdGZvcm1zIGhlcmUuCi1URVNUKFJlZ2V4RW5naW5lU2VsZWN0aW9uVGVzdCwgU2VsZWN0c0NvcnJlY3RSZWdleEVuZ2luZSkgewotI2lmICFHVEVTVF9VU0VTX1BDUkUKLSMgaWYgR1RFU1RfSEFTX1BPU0lYX1JFCi0KLSAgRVhQRUNUX1RSVUUoR1RFU1RfVVNFU19QT1NJWF9SRSk7Ci0KLSMgZWxzZQotCi0gIEVYUEVDVF9UUlVFKEdURVNUX1VTRVNfU0lNUExFX1JFKTsKLQotIyBlbmRpZgotI2VuZGlmICAvLyAhR1RFU1RfVVNFU19QQ1JFCi19Ci0KLSNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLSMgaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KLWNsYXNzIFJFVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307Ci0KLS8vIERlZmluZXMgU3RyaW5nVHlwZXMgYXMgdGhlIGxpc3Qgb2YgYWxsIHN0cmluZyB0eXBlcyB0aGF0IGNsYXNzIFJFCi0vLyBzdXBwb3J0cy4KLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8Ci0gICAgOjpzdGQ6OnN0cmluZywKLSMgIGlmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0gICAgOjpzdHJpbmcsCi0jICBlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLSAgICBjb25zdCBjaGFyKj4gU3RyaW5nVHlwZXM7Ci0KLVRZUEVEX1RFU1RfQ0FTRShSRVRlc3QsIFN0cmluZ1R5cGVzKTsKLQotLy8gVGVzdHMgUkUncyBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMuCi1UWVBFRF9URVNUKFJFVGVzdCwgSW1wbGljaXRDb25zdHJ1Y3RvcldvcmtzKSB7Ci0gIGNvbnN0IFJFIGVtcHR5KFR5cGVQYXJhbSgiIikpOwotICBFWFBFQ1RfU1RSRVEoIiIsIGVtcHR5LnBhdHRlcm4oKSk7Ci0KLSAgY29uc3QgUkUgc2ltcGxlKFR5cGVQYXJhbSgiaGVsbG8iKSk7Ci0gIEVYUEVDVF9TVFJFUSgiaGVsbG8iLCBzaW1wbGUucGF0dGVybigpKTsKLQotICBjb25zdCBSRSBub3JtYWwoVHlwZVBhcmFtKCIuKihcXHcrKSIpKTsKLSAgRVhQRUNUX1NUUkVRKCIuKihcXHcrKSIsIG5vcm1hbC5wYXR0ZXJuKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFJFJ3MgY29uc3RydWN0b3JzIHJlamVjdCBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi1UWVBFRF9URVNUKFJFVGVzdCwgUmVqZWN0c0ludmFsaWRSZWdleCkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7Ci0gICAgY29uc3QgUkUgaW52YWxpZChUeXBlUGFyYW0oIj8iKSk7Ci0gIH0sICJcIj9cIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIik7Ci19Ci0KLS8vIFRlc3RzIFJFOjpGdWxsTWF0Y2goKS4KLVRZUEVEX1RFU1QoUkVUZXN0LCBGdWxsTWF0Y2hXb3JrcykgewotICBjb25zdCBSRSBlbXB0eShUeXBlUGFyYW0oIiIpKTsKLSAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oIiIpLCBlbXB0eSkpOwotICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImEiKSwgZW1wdHkpKTsKLQotICBjb25zdCBSRSByZShUeXBlUGFyYW0oImEuKnoiKSk7Ci0gIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJheiIpLCByZSkpOwotICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYXh5eiIpLCByZSkpOwotICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImJheiIpLCByZSkpOwotICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImF6eSIpLCByZSkpOwotfQotCi0vLyBUZXN0cyBSRTo6UGFydGlhbE1hdGNoKCkuCi1UWVBFRF9URVNUKFJFVGVzdCwgUGFydGlhbE1hdGNoV29ya3MpIHsKLSAgY29uc3QgUkUgZW1wdHkoVHlwZVBhcmFtKCIiKSk7Ci0gIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCIiKSwgZW1wdHkpKTsKLSAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImEiKSwgZW1wdHkpKTsKLQotICBjb25zdCBSRSByZShUeXBlUGFyYW0oImEuKnoiKSk7Ci0gIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJheiIpLCByZSkpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYXh5eiIpLCByZSkpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYmF6IiksIHJlKSk7Ci0gIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJhenkiKSwgcmUpKTsKLSAgRVhQRUNUX0ZBTFNFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJ6emEiKSwgcmUpKTsKLX0KLQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKLQotI2VsaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotVEVTVChJc0luU2V0VGVzdCwgTnVsQ2hhcklzTm90SW5BbnlTZXQpIHsKLSAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ1wwJywgIiIpKTsKLSAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ1wwJywgIlwwIikpOwotICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnXDAnLCAiYSIpKTsKLX0KLQotVEVTVChJc0luU2V0VGVzdCwgV29ya3NGb3JOb25OdWxDaGFycykgewotICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnYScsICJBYiIpKTsKLSAgRVhQRUNUX0ZBTFNFKElzSW5TZXQoJ2MnLCAiIikpOwotCi0gIEVYUEVDVF9UUlVFKElzSW5TZXQoJ2InLCAiYmNkIikpOwotICBFWFBFQ1RfVFJVRShJc0luU2V0KCdiJywgImFiIikpOwotfQotCi1URVNUKElzQXNjaWlEaWdpdFRlc3QsIElzRmFsc2VGb3JOb25EaWdpdCkgewotICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCdcMCcpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnICcpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnKycpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnLScpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnLicpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlEaWdpdCgnYScpKTsKLX0KLQotVEVTVChJc0FzY2lpRGlnaXRUZXN0LCBJc1RydWVGb3JEaWdpdCkgewotICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzAnKSk7Ci0gIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnMScpKTsKLSAgRVhQRUNUX1RSVUUoSXNBc2NpaURpZ2l0KCc1JykpOwotICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzknKSk7Ci19Ci0KLVRFU1QoSXNBc2NpaVB1bmN0VGVzdCwgSXNGYWxzZUZvck5vblB1bmN0KSB7Ci0gIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCcgJykpOwotICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCdcbicpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnYScpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnMCcpKTsKLX0KLQotVEVTVChJc0FzY2lpUHVuY3RUZXN0LCBJc1RydWVGb3JQdW5jdCkgewotICBmb3IgKGNvbnN0IGNoYXIqIHAgPSAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiI7ICpwOyBwKyspIHsKLSAgICBFWFBFQ1RfUFJFRDEoSXNBc2NpaVB1bmN0LCAqcCk7Ci0gIH0KLX0KLQotVEVTVChJc1JlcGVhdFRlc3QsIElzRmFsc2VGb3JOb25SZXBlYXRDaGFyKSB7Ci0gIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnXDAnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnICcpKTsKLSAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCdhJykpOwotICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJzEnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnLScpKTsKLX0KLQotVEVTVChJc1JlcGVhdFRlc3QsIElzVHJ1ZUZvclJlcGVhdENoYXIpIHsKLSAgRVhQRUNUX1RSVUUoSXNSZXBlYXQoJz8nKSk7Ci0gIEVYUEVDVF9UUlVFKElzUmVwZWF0KCcqJykpOwotICBFWFBFQ1RfVFJVRShJc1JlcGVhdCgnKycpKTsKLX0KLQotVEVTVChJc0FzY2lpV2hpdGVTcGFjZVRlc3QsIElzRmFsc2VGb3JOb25XaGl0ZVNwYWNlKSB7Ci0gIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnXDAnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnYScpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCcxJykpOwotICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJysnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnXycpKTsKLX0KLQotVEVTVChJc0FzY2lpV2hpdGVTcGFjZVRlc3QsIElzVHJ1ZUZvcldoaXRlU3BhY2UpIHsKLSAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJyAnKSk7Ci0gIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcbicpKTsKLSAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1xyJykpOwotICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXHQnKSk7Ci0gIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcdicpKTsKLSAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1xmJykpOwotfQotCi1URVNUKElzQXNjaWlXb3JkQ2hhclRlc3QsIElzRmFsc2VGb3JOb25Xb3JkQ2hhcikgewotICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCdcMCcpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignKycpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignLicpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignICcpKTsKLSAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXb3JkQ2hhcignXG4nKSk7Ci19Ci0KLVRFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNUcnVlRm9yTGV0dGVyKSB7Ci0gIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignYScpKTsKLSAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdiJykpOwotICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ0EnKSk7Ci0gIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignWicpKTsKLX0KLQotVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc1RydWVGb3JEaWdpdCkgewotICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzAnKSk7Ci0gIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignMScpKTsKLSAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCc3JykpOwotICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzknKSk7Ci19Ci0KLVRFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNUcnVlRm9yVW5kZXJzY29yZSkgewotICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ18nKSk7Ci19Ci0KLVRFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzRmFsc2VGb3JOb25QcmludGFibGUpIHsKLSAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnXDAwNycpKTsKLX0KLQotVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvckRpZ2l0KSB7Ci0gIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCcwJykpOwotICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnOScpKTsKLX0KLQotVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvcldoaXRlU3BhY2UpIHsKLSAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJyAnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdcbicpKTsKLX0KLQotVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvclNvbWVMZXR0ZXIpIHsKLSAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ2EnKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdaJykpOwotfQotCi1URVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc1RydWVGb3JQdW5jdCkgewotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCcuJykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCctJykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCdeJykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCckJykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCcoJykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCddJykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCd7JykpOwotICBFWFBFQ1RfVFJVRShJc1ZhbGlkRXNjYXBlKCd8JykpOwotfQotCi1URVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc1RydWVGb3JTb21lTGV0dGVyKSB7Ci0gIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ2QnKSk7Ci0gIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ0QnKSk7Ci0gIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3MnKSk7Ci0gIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ1MnKSk7Ci0gIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3cnKSk7Ci0gIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ1cnKSk7Ci19Ci0KLVRFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZFB1bmN0KSB7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1xcJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdcXCcsICcgJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdfJywgJy4nKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJy4nLCAnYScpKTsKLQotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1xcJywgJ1xcJykpOwotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ18nLCAnXycpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICcrJywgJysnKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnLicsICcuJykpOwotfQotCi1URVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfZCkgewotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJ2EnKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnLicpKTsKLQotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnMCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdkJywgJzknKSk7Ci19Ci0KLVRFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9EKSB7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnMCcpKTsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICc5JykpOwotCi0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICdcMCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJ2EnKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICctJykpOwotfQotCi1URVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfcykgewotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ2EnKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnLicpKTsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICc5JykpOwotCi0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICcgJykpOwotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnXG4nKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICdcdCcpKTsKLX0KLQotVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX1MpIHsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICcgJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJ1xyJykpOwotCi0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICdcMCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJ2EnKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnUycsICc5JykpOwotfQotCi1URVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfdykgewotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJysnKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnICcpKTsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdcbicpKTsKLQotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnMCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ2InKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdDJykpOwotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnXycpKTsKLX0KLQotVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX1cpIHsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdBJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ2InKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnOScpKTsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdfJykpOwotCi0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdcMCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJyonKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICdcbicpKTsKLX0KLQotVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkV2hpdGVTcGFjZSkgewotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdmJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdmJywgJ1xuJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICduJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICduJywgJ1xyJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdyJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdyJywgJ2EnKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3QnLCAnXDAnKSk7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3QnLCAndCcpKTsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndicsICdcMCcpKTsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndicsICdcZicpKTsKLQotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2YnLCAnXGYnKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnbicsICdcbicpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdyJywgJ1xyJykpOwotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3QnLCAnXHQnKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndicsICdcdicpKTsKLX0KLQotVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBVbmVzY2FwZWREb3QpIHsKLSAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnXG4nKSk7Ci0KLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICdcMCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICcuJykpOwotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJ2EnKSk7Ci0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnICcpKTsKLX0KLQotVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBVbmVzY2FwZWRDaGFyKSB7Ci0gIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICdhJywgJ1wwJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnYScsICdiJykpOwotICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnJCcsICdhJykpOwotCi0gIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJyQnLCAnJCcpKTsKLSAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnNScsICc1JykpOwotICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICdaJywgJ1onKSk7Ci19Ci0KLVRFU1QoVmFsaWRhdGVSZWdleFRlc3QsIEdlbmVyYXRlc0ZhaWx1cmVBbmRSZXR1cm5zRmFsc2VGb3JJbnZhbGlkKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KE5VTEwpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhXFwiKSksCi0gICAgICAiU3ludGF4IGVycm9yIGF0IGluZGV4IDEgaW4gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBcImFcXFwiOiAiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImFcXCIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJcXG5cXCIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJcXHNcXGhiIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXCJcXGhcIiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiXl4iKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmciKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIi4qXmIiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmciKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIiQkIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJeJGEiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImEoYiIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIicoJyBpcyB1bnN1cHBvcnRlZCIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYWIpIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiJyknIGlzIHVuc3VwcG9ydGVkIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJbYWIiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInWycgaXMgdW5zdXBwb3J0ZWQiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImF7MiIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIid7JyBpcyB1bnN1cHBvcnRlZCIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiPyIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIic/JyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJeKiIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIicqJyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCI1KisiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInKycgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbiIpOwotfQotCi1URVNUKFZhbGlkYXRlUmVnZXhUZXN0LCBSZXR1cm5zVHJ1ZUZvclZhbGlkKSB7Ci0gIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIiIpKTsKLSAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiYSIpKTsKLSAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiLioiKSk7Ci0gIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIl5hXysiKSk7Ci0gIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoIl5hXFx0XFwmPyIpKTsKLSAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiMDkqJCIpKTsKLSAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiXlokIikpOwotICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJhXFxeWlxcJFxcKFxcKVxcfFxcW1xcXVxce1xcfSIpKTsKLX0KLQotVEVTVChNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZFRlc3QsIFdvcmtzRm9yWmVyb09yT25lKSB7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJhIiwgImJhIikpOwotICAvLyBSZXBlYXRpbmcgbW9yZSB0aGFuIG9uY2UuCi0gIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJiIiwgImFhYiIpKTsKLQotICAvLyBSZXBlYXRpbmcgemVybyB0aW1lcy4KLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICdhJywgJz8nLCAiYiIsICJiYSIpKTsKLSAgLy8gUmVwZWF0aW5nIG9uY2UuCi0gIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImIiLCAiYWIiKSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnIycsICc/JywgIi4iLCAiIyMiKSk7Ci19Ci0KLVRFU1QoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc0Zvclplcm9Pck1hbnkpIHsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcqJywgImEkIiwgImJhYWIiKSk7Ci0KLSAgLy8gUmVwZWF0aW5nIHplcm8gdGltZXMuCi0gIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcqJywgImIiLCAiYmMiKSk7Ci0gIC8vIFJlcGVhdGluZyBvbmNlLgotICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKicsICJiIiwgImFiYyIpKTsKLSAgLy8gUmVwZWF0aW5nIG1vcmUgdGhhbiBvbmNlLgotICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCh0cnVlLCAndycsICcqJywgIi0iLCAiYWJfMS1nIikpOwotfQotCi1URVNUKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NGb3JPbmVPck1hbnkpIHsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcrJywgImEkIiwgImJhYWIiKSk7Ci0gIC8vIFJlcGVhdGluZyB6ZXJvIHRpbWVzLgotICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJysnLCAiYiIsICJiYyIpKTsKLQotICAvLyBSZXBlYXRpbmcgb25jZS4KLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJysnLCAiYiIsICJhYmMiKSk7Ci0gIC8vIFJlcGVhdGluZyBtb3JlIHRoYW4gb25jZS4KLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQodHJ1ZSwgJ3cnLCAnKycsICItIiwgImFiXzEtZyIpKTsKLX0KLQotVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgUmV0dXJuc1RydWVGb3JFbXB0eVJlZ2V4KSB7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIiIsICIiKSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIiIsICJhYiIpKTsKLX0KLQotVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NXaGVuRG9sbGFySXNJblJlZ2V4KSB7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCIkIiwgImEiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiJCIsICIiKSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImEkIiwgImEiKSk7Ci19Ci0KLVRFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIFdvcmtzV2hlblJlZ2V4U3RhcnRzV2l0aEVzY2FwZVNlcXVlbmNlKSB7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXHciLCAiKyIpKTsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIlxcVyIsICJhYiIpKTsKLQotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXHNhIiwgIlxuYWIiKSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcZCIsICIxYSIpKTsKLX0KLQotVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoUmVwZXRpdGlvbikgewotICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiLithIiwgImFiYyIpKTsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoImE/YiIsICJhYWIiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiLiphIiwgImJjMTItYWIiKSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImE/YiIsICJiIikpOwotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJhP2IiLCAiYWIiKSk7Ci19Ci0KLVRFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsCi0gICAgIFdvcmtzV2hlblJlZ2V4U3RhcnRzV2l0aFJlcGV0aW9uT2ZFc2NhcGVTZXF1ZW5jZSkgewotICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFwuK2EiLCAiYWJjIikpOwotICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFxzP2IiLCAiICBiIikpOwotCi0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcKCphIiwgIigoKChhYiIpKTsKLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxeP2IiLCAiXmIiKSk7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcXFw/YiIsICJiIikpOwotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXFxcP2IiLCAiXFxiIikpOwotfQotCi1URVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBNYXRjaGVzU2VxdWVudGlhbGx5KSB7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJhYi4qYyIsICJhY2FiYyIpKTsKLQotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJhYi4qYyIsICJhYi1mc2MiKSk7Ci19Ci0KLVRFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblN0cmluZ0lzTnVsbCkgewotICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCIiLCBOVUxMKSk7Ci19Ci0KLVRFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoQ2FyZXQpIHsKLSAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXmEiLCAiYmEiKSk7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoIl4kIiwgImEiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJeYSIsICJhYiIpKTsKLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJeIiwgImFiIikpOwotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIl4kIiwgIiIpKTsKLX0KLQotVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuTm9NYXRjaCkgewotICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCJhIiwgImJjZGUxMjMiKSk7Ci0gIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoImEuK2EiLCAiLS1hYTg4ODg4ODg4IikpOwotfQotCi1URVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNUcnVlV2hlbk1hdGNoaW5nUHJlZml4KSB7Ci0gIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXFx3KyIsICJhYjFfIC0gNSIpKTsKLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCIuKj0iLCAiPSIpKTsKLSAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJ4LiphYj8uKmJjIiwgInhhYWFiYyIpKTsKLX0KLQotVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5NYXRjaGluZ05vblByZWZpeCkgewotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIlxcdysiLCAiJCQkIGFiMV8gLSA1IikpOwotICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIlxcLis9IiwgIj0gIC4uLj0iKSk7Ci19Ci0KLS8vIFRlc3RzIFJFJ3MgaW1wbGljaXQgY29uc3RydWN0b3JzLgotVEVTVChSRVRlc3QsIEltcGxpY2l0Q29uc3RydWN0b3JXb3JrcykgewotICBjb25zdCBSRSBlbXB0eSgiIik7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgZW1wdHkucGF0dGVybigpKTsKLQotICBjb25zdCBSRSBzaW1wbGUoImhlbGxvIik7Ci0gIEVYUEVDVF9TVFJFUSgiaGVsbG8iLCBzaW1wbGUucGF0dGVybigpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBSRSdzIGNvbnN0cnVjdG9ycyByZWplY3QgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25zLgotVEVTVChSRVRlc3QsIFJlamVjdHNJbnZhbGlkUmVnZXgpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoewotICAgIGNvbnN0IFJFIG5vcm1hbChOVUxMKTsKLSAgfSwgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKLSAgICBjb25zdCBSRSBub3JtYWwoIi4qKFxcdysiKTsKLSAgfSwgIicoJyBpcyB1bnN1cHBvcnRlZCIpOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKLSAgICBjb25zdCBSRSBpbnZhbGlkKCJePyIpOwotICB9LCAiJz8nIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKLX0KLQotLy8gVGVzdHMgUkU6OkZ1bGxNYXRjaCgpLgotVEVTVChSRVRlc3QsIEZ1bGxNYXRjaFdvcmtzKSB7Ci0gIGNvbnN0IFJFIGVtcHR5KCIiKTsKLSAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaCgiIiwgZW1wdHkpKTsKLSAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goImEiLCBlbXB0eSkpOwotCi0gIGNvbnN0IFJFIHJlMSgiYSIpOwotICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCJhIiwgcmUxKSk7Ci0KLSAgY29uc3QgUkUgcmUoImEuKnoiKTsKLSAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaCgiYXoiLCByZSkpOwotICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCJheHl6IiwgcmUpKTsKLSAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goImJheiIsIHJlKSk7Ci0gIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKCJhenkiLCByZSkpOwotfQotCi0vLyBUZXN0cyBSRTo6UGFydGlhbE1hdGNoKCkuCi1URVNUKFJFVGVzdCwgUGFydGlhbE1hdGNoV29ya3MpIHsKLSAgY29uc3QgUkUgZW1wdHkoIiIpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCIiLCBlbXB0eSkpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJhIiwgZW1wdHkpKTsKLQotICBjb25zdCBSRSByZSgiYS4qeiIpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJheiIsIHJlKSk7Ci0gIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImF4eXoiLCByZSkpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJiYXoiLCByZSkpOwotICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKCJhenkiLCByZSkpOwotICBFWFBFQ1RfRkFMU0UoUkU6OlBhcnRpYWxNYXRjaCgienphIiwgcmUpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotVEVTVChDYXB0dXJlVGVzdCwgQ2FwdHVyZXNTdGRvdXQpIHsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBmcHJpbnRmKHN0ZG91dCwgImFiYyIpOwotICBFWFBFQ1RfU1RSRVEoImFiYyIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7Ci0KLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBmcHJpbnRmKHN0ZG91dCwgImRlZiVjZ2hpIiwgJ1wwJyk7Ci0gIEVYUEVDVF9FUSg6OnN0ZDo6c3RyaW5nKCJkZWZcMGdoaSIsIDcpLCA6OnN0ZDo6c3RyaW5nKEdldENhcHR1cmVkU3Rkb3V0KCkpKTsKLX0KLQotVEVTVChDYXB0dXJlVGVzdCwgQ2FwdHVyZXNTdGRlcnIpIHsKLSAgQ2FwdHVyZVN0ZGVycigpOwotICBmcHJpbnRmKHN0ZGVyciwgImprbCIpOwotICBFWFBFQ1RfU1RSRVEoImprbCIsIEdldENhcHR1cmVkU3RkZXJyKCkuY19zdHIoKSk7Ci0KLSAgQ2FwdHVyZVN0ZGVycigpOwotICBmcHJpbnRmKHN0ZGVyciwgImprbCVjbW5vIiwgJ1wwJyk7Ci0gIEVYUEVDVF9FUSg6OnN0ZDo6c3RyaW5nKCJqa2xcMG1ubyIsIDcpLCA6OnN0ZDo6c3RyaW5nKEdldENhcHR1cmVkU3RkZXJyKCkpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBzdGRvdXQgYW5kIHN0ZGVyciBjYXB0dXJlIGRvbid0IGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuCi1URVNUKENhcHR1cmVUZXN0LCBDYXB0dXJlc1N0ZG91dEFuZFN0ZGVycikgewotICBDYXB0dXJlU3Rkb3V0KCk7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgZnByaW50ZihzdGRvdXQsICJwcXIiKTsKLSAgZnByaW50ZihzdGRlcnIsICJzdHUiKTsKLSAgRVhQRUNUX1NUUkVRKCJwcXIiLCBHZXRDYXB0dXJlZFN0ZG91dCgpLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoInN0dSIsIEdldENhcHR1cmVkU3RkZXJyKCkuY19zdHIoKSk7Ci19Ci0KLVRFU1QoQ2FwdHVyZURlYXRoVGVzdCwgQ2Fubm90UmVlbnRlclN0ZG91dENhcHR1cmUpIHsKLSAgQ2FwdHVyZVN0ZG91dCgpOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKENhcHR1cmVTdGRvdXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25seSBvbmUgc3Rkb3V0IGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUiKTsKLSAgR2V0Q2FwdHVyZWRTdGRvdXQoKTsKLQotICAvLyBXZSBjYW5ub3QgdGVzdCBzdGRlcnIgY2FwdHVyaW5nIHVzaW5nIGRlYXRoIHRlc3RzIGFzIHRoZXkgdXNlIGl0Ci0gIC8vIHRoZW1zZWx2ZXMuCi19Ci0KLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLVRFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JJbml0aWFsaXplc1RvRGVmYXVsdFZhbHVlcykgewotICBUaHJlYWRMb2NhbDxpbnQ+IHQxOwotICBFWFBFQ1RfRVEoMCwgdDEuZ2V0KCkpOwotCi0gIFRocmVhZExvY2FsPHZvaWQqPiB0MjsKLSAgRVhQRUNUX1RSVUUodDIuZ2V0KCkgPT0gTlVMTCk7Ci19Ci0KLVRFU1QoVGhyZWFkTG9jYWxUZXN0LCBTaW5nbGVQYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXNUb1BhcmFtKSB7Ci0gIFRocmVhZExvY2FsPGludD4gdDEoMTIzKTsKLSAgRVhQRUNUX0VRKDEyMywgdDEuZ2V0KCkpOwotCi0gIGludCBpID0gMDsKLSAgVGhyZWFkTG9jYWw8aW50Kj4gdDIoJmkpOwotICBFWFBFQ1RfRVEoJmksIHQyLmdldCgpKTsKLX0KLQotY2xhc3MgTm9EZWZhdWx0Q29udHJ1Y3RvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOb0RlZmF1bHRDb250cnVjdG9yKGNvbnN0IGNoYXIqKSB7fQotICBOb0RlZmF1bHRDb250cnVjdG9yKGNvbnN0IE5vRGVmYXVsdENvbnRydWN0b3ImKSB7fQotfTsKLQotVEVTVChUaHJlYWRMb2NhbFRlc3QsIFZhbHVlRGVmYXVsdENvbnRydWN0b3JJc05vdFJlcXVpcmVkRm9yUGFyYW1WZXJzaW9uKSB7Ci0gIFRocmVhZExvY2FsPE5vRGVmYXVsdENvbnRydWN0b3I+IGJhcihOb0RlZmF1bHRDb250cnVjdG9yKCJmb28iKSk7Ci0gIGJhci5wb2ludGVyKCk7Ci19Ci0KLVRFU1QoVGhyZWFkTG9jYWxUZXN0LCBHZXRBbmRQb2ludGVyUmV0dXJuU2FtZVZhbHVlKSB7Ci0gIFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiB0aHJlYWRfbG9jYWxfc3RyaW5nOwotCi0gIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSwgJih0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpKSk7Ci0KLSAgLy8gVmVyaWZpZXMgdGhlIGNvbmRpdGlvbiBzdGlsbCBob2xkcyBhZnRlciBjYWxsaW5nIHNldC4KLSAgdGhyZWFkX2xvY2FsX3N0cmluZy5zZXQoImZvbyIpOwotICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCksICYodGhyZWFkX2xvY2FsX3N0cmluZy5nZXQoKSkpOwotfQotCi1URVNUKFRocmVhZExvY2FsVGVzdCwgUG9pbnRlckFuZENvbnN0UG9pbnRlclJldHVyblNhbWVWYWx1ZSkgewotICBUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4gdGhyZWFkX2xvY2FsX3N0cmluZzsKLSAgY29uc3QgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+JiBjb25zdF90aHJlYWRfbG9jYWxfc3RyaW5nID0KLSAgICAgIHRocmVhZF9sb2NhbF9zdHJpbmc7Ci0KLSAgRVhQRUNUX0VRKHRocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpLCBjb25zdF90aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSk7Ci0KLSAgdGhyZWFkX2xvY2FsX3N0cmluZy5zZXQoImZvbyIpOwotICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCksIGNvbnN0X3RocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpKTsKLX0KLQotI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotdm9pZCBBZGRUd28oaW50KiBwYXJhbSkgeyAqcGFyYW0gKz0gMjsgfQotCi1URVNUKFRocmVhZFdpdGhQYXJhbVRlc3QsIENvbnN0cnVjdG9yRXhlY3V0ZXNUaHJlYWRGdW5jKSB7Ci0gIGludCBpID0gNDA7Ci0gIFRocmVhZFdpdGhQYXJhbTxpbnQqPiB0aHJlYWQoJkFkZFR3bywgJmksIE5VTEwpOwotICB0aHJlYWQuSm9pbigpOwotICBFWFBFQ1RfRVEoNDIsIGkpOwotfQotCi1URVNUKE11dGV4RGVhdGhUZXN0LCBBc3NlcnRIZWxkU2hvdWxkQXNzZXJ0V2hlbk5vdExvY2tlZCkgewotICAvLyBBc3NlcnRIZWxkKCkgaXMgZmxha3kgb25seSBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgdGhyZWFkcyBhY2Nlc3NpbmcKLSAgLy8gdGhlIGxvY2suIEluIHRoaXMgY2FzZSwgdGhlIHRlc3QgaXMgcm9idXN0LgotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKLSAgICBNdXRleCBtOwotICAgIHsgTXV0ZXhMb2NrIGxvY2soJm0pOyB9Ci0gICAgbS5Bc3NlcnRIZWxkKCk7Ci0gIH0sCi0gICJ0aHJlYWQgLipob2xkIik7Ci19Ci0KLVRFU1QoTXV0ZXhUZXN0LCBBc3NlcnRIZWxkU2hvdWxkTm90QXNzZXJ0V2hlbkxvY2tlZCkgewotICBNdXRleCBtOwotICBNdXRleExvY2sgbG9jaygmbSk7Ci0gIG0uQXNzZXJ0SGVsZCgpOwotfQotCi1jbGFzcyBBdG9taWNDb3VudGVyV2l0aE11dGV4IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEF0b21pY0NvdW50ZXJXaXRoTXV0ZXgoTXV0ZXgqIG11dGV4KSA6Ci0gICAgdmFsdWVfKDApLCBtdXRleF8obXV0ZXgpLCByYW5kb21fKDQyKSB7fQotCi0gIHZvaWQgSW5jcmVtZW50KCkgewotICAgIE11dGV4TG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaW50IHRlbXAgPSB2YWx1ZV87Ci0gICAgewotICAgICAgLy8gV2UgbmVlZCB0byBwdXQgdXAgYSBtZW1vcnkgYmFycmllciB0byBwcmV2ZW50IHJlYWRzIGFuZCB3cml0ZXMgdG8KLSAgICAgIC8vIHZhbHVlXyByZWFycmFuZ2VkIHdpdGggdGhlIGNhbGwgdG8gU2xlZXBNaWxsaXNlY29uZHMgd2hlbiBvYnNlcnZlZAotICAgICAgLy8gZnJvbSBvdGhlciB0aHJlYWRzLgotI2lmIEdURVNUX0hBU19QVEhSRUFECi0gICAgICAvLyBPbiBQT1NJWCwgbG9ja2luZyBhIG11dGV4IHB1dHMgdXAgYSBtZW1vcnkgYmFycmllci4gIFdlIGNhbm5vdCB1c2UKLSAgICAgIC8vIE11dGV4IGFuZCBNdXRleExvY2sgaGVyZSBvciByZWx5IG9uIHRoZWlyIG1lbW9yeSBiYXJyaWVyCi0gICAgICAvLyBmdW5jdGlvbmFsaXR5IGFzIHdlIGFyZSB0ZXN0aW5nIHRoZW0gaGVyZS4KLSAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtZW1vcnlfYmFycmllcl9tdXRleDsKLSAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAotICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbWVtb3J5X2JhcnJpZXJfbXV0ZXgsIE5VTEwpKTsKLSAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfbG9jaygmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKLQotICAgICAgU2xlZXBNaWxsaXNlY29uZHMocmFuZG9tXy5HZW5lcmF0ZSgzMCkpOwotCi0gICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X3VubG9jaygmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKLSAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbWVtb3J5X2JhcnJpZXJfbXV0ZXgpKTsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSAgICAgIC8vIE9uIFdpbmRvd3MsIHBlcmZvcm1pbmcgYW4gaW50ZXJsb2NrZWQgYWNjZXNzIHB1dHMgdXAgYSBtZW1vcnkgYmFycmllci4KLSAgICAgIHZvbGF0aWxlIExPTkcgZHVtbXkgPSAwOwotICAgICAgOjpJbnRlcmxvY2tlZEluY3JlbWVudCgmZHVtbXkpOwotICAgICAgU2xlZXBNaWxsaXNlY29uZHMocmFuZG9tXy5HZW5lcmF0ZSgzMCkpOwotICAgICAgOjpJbnRlcmxvY2tlZEluY3JlbWVudCgmZHVtbXkpOwotI2Vsc2UKLSMgZXJyb3IgIk1lbW9yeSBiYXJyaWVyIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtLiIKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKLSAgICB9Ci0gICAgdmFsdWVfID0gdGVtcCArIDE7Ci0gIH0KLSAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSBwcml2YXRlOgotICB2b2xhdGlsZSBpbnQgdmFsdWVfOwotICBNdXRleCogY29uc3QgbXV0ZXhfOyAgLy8gUHJvdGVjdHMgdmFsdWVfLgotICBSYW5kb20gICAgICAgcmFuZG9tXzsKLX07Ci0KLXZvaWQgQ291bnRpbmdUaHJlYWRGdW5jKHBhaXI8QXRvbWljQ291bnRlcldpdGhNdXRleCosIGludD4gcGFyYW0pIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5zZWNvbmQ7ICsraSkKLSAgICAgIHBhcmFtLmZpcnN0LT5JbmNyZW1lbnQoKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgbXV0ZXggb25seSBsZXRzIG9uZSB0aHJlYWQgYXQgYSB0aW1lIHRvIGxvY2sgaXQuCi1URVNUKE11dGV4VGVzdCwgT25seU9uZVRocmVhZENhbkxvY2tBdEFUaW1lKSB7Ci0gIE11dGV4IG11dGV4OwotICBBdG9taWNDb3VudGVyV2l0aE11dGV4IGxvY2tlZF9jb3VudGVyKCZtdXRleCk7Ci0KLSAgdHlwZWRlZiBUaHJlYWRXaXRoUGFyYW08cGFpcjxBdG9taWNDb3VudGVyV2l0aE11dGV4KiwgaW50PiA+IFRocmVhZFR5cGU7Ci0gIGNvbnN0IGludCBrQ3ljbGVDb3VudCA9IDIwOwotICBjb25zdCBpbnQga1RocmVhZENvdW50ID0gNzsKLSAgc2NvcGVkX3B0cjxUaHJlYWRUeXBlPiBjb3VudGluZ190aHJlYWRzW2tUaHJlYWRDb3VudF07Ci0gIE5vdGlmaWNhdGlvbiB0aHJlYWRzX2Nhbl9zdGFydDsKLSAgLy8gQ3JlYXRlcyBhbmQgcnVucyBrVGhyZWFkQ291bnQgdGhyZWFkcyB0aGF0IGluY3JlbWVudCBsb2NrZWRfY291bnRlcgotICAvLyBrQ3ljbGVDb3VudCB0aW1lcyBlYWNoLgotICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRDb3VudDsgKytpKSB7Ci0gICAgY291bnRpbmdfdGhyZWFkc1tpXS5yZXNldChuZXcgVGhyZWFkVHlwZSgmQ291bnRpbmdUaHJlYWRGdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCZsb2NrZWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ3ljbGVDb3VudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkc19jYW5fc3RhcnQpKTsKLSAgfQotICB0aHJlYWRzX2Nhbl9zdGFydC5Ob3RpZnkoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkKLSAgICBjb3VudGluZ190aHJlYWRzW2ldLT5Kb2luKCk7Ci0KLSAgLy8gSWYgdGhlIG11dGV4IGxldHMgbW9yZSB0aGFuIG9uZSB0aHJlYWQgdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIGF0IGEKLSAgLy8gdGltZSwgdGhleSBhcmUgbGlrZWx5IHRvIGVuY291bnRlciBhIHJhY2UgY29uZGl0aW9uIGFuZCBoYXZlIHNvbWUKLSAgLy8gaW5jcmVtZW50cyBvdmVyd3JpdHRlbiwgcmVzdWx0aW5nIGluIHRoZSBsb3dlciB0aGVuIGV4cGVjdGVkIGNvdW50ZXIKLSAgLy8gdmFsdWUuCi0gIEVYUEVDVF9FUShrQ3ljbGVDb3VudCAqIGtUaHJlYWRDb3VudCwgbG9ja2VkX2NvdW50ZXIudmFsdWUoKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBSdW5Gcm9tVGhyZWFkKHZvaWQgKGZ1bmMpKFQpLCBUIHBhcmFtKSB7Ci0gIFRocmVhZFdpdGhQYXJhbTxUPiB0aHJlYWQoZnVuYywgcGFyYW0sIE5VTEwpOwotICB0aHJlYWQuSm9pbigpOwotfQotCi12b2lkIFJldHJpZXZlVGhyZWFkTG9jYWxWYWx1ZSgKLSAgICBwYWlyPFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiosIHN0ZDo6c3RyaW5nKj4gcGFyYW0pIHsKLSAgKnBhcmFtLnNlY29uZCA9IHBhcmFtLmZpcnN0LT5nZXQoKTsKLX0KLQotVEVTVChUaHJlYWRMb2NhbFRlc3QsIFBhcmFtZXRlcml6ZWRDb25zdHJ1Y3RvclNldHNEZWZhdWx0KSB7Ci0gIFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiB0aHJlYWRfbG9jYWxfc3RyaW5nKCJmb28iKTsKLSAgRVhQRUNUX1NUUkVRKCJmb28iLCB0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpLmNfc3RyKCkpOwotCi0gIHRocmVhZF9sb2NhbF9zdHJpbmcuc2V0KCJiYXIiKTsKLSAgRVhQRUNUX1NUUkVRKCJiYXIiLCB0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpLmNfc3RyKCkpOwotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgUnVuRnJvbVRocmVhZCgmUmV0cmlldmVUaHJlYWRMb2NhbFZhbHVlLAotICAgICAgICAgICAgICAgIG1ha2VfcGFpcigmdGhyZWFkX2xvY2FsX3N0cmluZywgJnJlc3VsdCkpOwotICBFWFBFQ1RfU1RSRVEoImZvbyIsIHJlc3VsdC5jX3N0cigpKTsKLX0KLQotLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciBvZiBkZXN0cnVjdG9ycyBiZWluZyBjYWxsZWQgb24gaW5zdGFuY2VzIG9mCi0vLyBEZXN0cnVjdG9yVHJhY2tlci4gIE9uIFdpbmRvd3MsIHdhaXRzIGZvciB0aGUgZGVzdHJ1Y3RvciBjYWxsIHJlcG9ydHMuCi1jbGFzcyBEZXN0cnVjdG9yQ2FsbCB7Ci0gcHVibGljOgotICBEZXN0cnVjdG9yQ2FsbCgpIHsKLSAgICBpbnZva2VkXyA9IGZhbHNlOwotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgICB3YWl0X2V2ZW50Xy5SZXNldCg6OkNyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKSk7Ci0gICAgR1RFU1RfQ0hFQ0tfKHdhaXRfZXZlbnRfLkdldCgpICE9IE5VTEwpOwotI2VuZGlmCi0gIH0KLQotICBib29sIENoZWNrRGVzdHJveWVkKCkgY29uc3QgewotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgICBpZiAoOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHdhaXRfZXZlbnRfLkdldCgpLCAxMDAwKSAhPSBXQUlUX09CSkVDVF8wKQotICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgcmV0dXJuIGludm9rZWRfOwotICB9Ci0KLSAgdm9pZCBSZXBvcnREZXN0cm95ZWQoKSB7Ci0gICAgaW52b2tlZF8gPSB0cnVlOwotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgICA6OlNldEV2ZW50KHdhaXRfZXZlbnRfLkdldCgpKTsKLSNlbmRpZgotICB9Ci0KLSAgc3RhdGljIHN0ZDo6dmVjdG9yPERlc3RydWN0b3JDYWxsKj4mIExpc3QoKSB7IHJldHVybiAqbGlzdF87IH0KLQotICBzdGF0aWMgdm9pZCBSZXNldExpc3QoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0Xy0+c2l6ZSgpOyArK2kpIHsKLSAgICAgIGRlbGV0ZSBsaXN0Xy0+YXQoaSk7Ci0gICAgfQotICAgIGxpc3RfLT5jbGVhcigpOwotICB9Ci0KLSBwcml2YXRlOgotICBib29sIGludm9rZWRfOwotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgQXV0b0hhbmRsZSB3YWl0X2V2ZW50XzsKLSNlbmRpZgotICBzdGF0aWMgc3RkOjp2ZWN0b3I8RGVzdHJ1Y3RvckNhbGwqPiogY29uc3QgbGlzdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZXN0cnVjdG9yQ2FsbCk7Ci19OwotCi1zdGQ6OnZlY3RvcjxEZXN0cnVjdG9yQ2FsbCo+KiBjb25zdCBEZXN0cnVjdG9yQ2FsbDo6bGlzdF8gPQotICAgIG5ldyBzdGQ6OnZlY3RvcjxEZXN0cnVjdG9yQ2FsbCo+OwotCi0vLyBEZXN0cnVjdG9yVHJhY2tlciBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIGl0cyBpbnN0YW5jZXMgaGF2ZSBiZWVuCi0vLyBkZXN0cm95ZWQuCi1jbGFzcyBEZXN0cnVjdG9yVHJhY2tlciB7Ci0gcHVibGljOgotICBEZXN0cnVjdG9yVHJhY2tlcigpIDogaW5kZXhfKEdldE5ld0luZGV4KCkpIHt9Ci0gIERlc3RydWN0b3JUcmFja2VyKGNvbnN0IERlc3RydWN0b3JUcmFja2VyJiAvKiByaHMgKi8pCi0gICAgICA6IGluZGV4XyhHZXROZXdJbmRleCgpKSB7fQotICB+RGVzdHJ1Y3RvclRyYWNrZXIoKSB7Ci0gICAgLy8gV2UgbmV2ZXIgYWNjZXNzIERlc3RydWN0b3JDYWxsOjpMaXN0KCkgY29uY3VycmVudGx5LCBzbyB3ZSBkb24ndCBuZWVkCi0gICAgLy8gdG8gcHJvdGVjdCB0aGlzIGFjY2Nlc3Mgd2l0aCBhIG11dGV4LgotICAgIERlc3RydWN0b3JDYWxsOjpMaXN0KClbaW5kZXhfXS0+UmVwb3J0RGVzdHJveWVkKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBzaXplX3QgR2V0TmV3SW5kZXgoKSB7Ci0gICAgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKS5wdXNoX2JhY2sobmV3IERlc3RydWN0b3JDYWxsKTsKLSAgICByZXR1cm4gRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKS5zaXplKCkgLSAxOwotICB9Ci0gIGNvbnN0IHNpemVfdCBpbmRleF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhEZXN0cnVjdG9yVHJhY2tlcik7Ci19OwotCi10eXBlZGVmIFRocmVhZExvY2FsPERlc3RydWN0b3JUcmFja2VyPiogVGhyZWFkUGFyYW07Ci0KLXZvaWQgQ2FsbFRocmVhZExvY2FsR2V0KFRocmVhZFBhcmFtIHRocmVhZF9sb2NhbF9wYXJhbSkgewotICB0aHJlYWRfbG9jYWxfcGFyYW0tPmdldCgpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdoZW4gYSBUaHJlYWRMb2NhbCBvYmplY3QgZGllcyBpbiBhIHRocmVhZCwgaXQgZGVzdHJveXMKLS8vIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhhdCB0aHJlYWQuCi1URVNUKFRocmVhZExvY2FsVGVzdCwgRGVzdHJveXNNYW5hZ2VkT2JqZWN0Rm9yT3duVGhyZWFkV2hlbkR5aW5nKSB7Ci0gIERlc3RydWN0b3JDYWxsOjpSZXNldExpc3QoKTsKLQotICB7Ci0gICAgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+IHRocmVhZF9sb2NhbF90cmFja2VyOwotICAgIEFTU0VSVF9FUSgwVSwgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKS5zaXplKCkpOwotCi0gICAgLy8gVGhpcyBjcmVhdGVzIGFub3RoZXIgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGZvciB0aGUgbWFpbiB0aHJlYWQuCi0gICAgdGhyZWFkX2xvY2FsX3RyYWNrZXIuZ2V0KCk7Ci0gICAgQVNTRVJUX0VRKDFVLCBEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpLnNpemUoKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKERlc3RydWN0b3JDYWxsOjpMaXN0KClbMF0tPkNoZWNrRGVzdHJveWVkKCkpOwotICB9Ci0KLSAgLy8gTm93IHRocmVhZF9sb2NhbF90cmFja2VyIGhhcyBkaWVkLgotICBBU1NFUlRfRVEoMVUsIERlc3RydWN0b3JDYWxsOjpMaXN0KCkuc2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKVswXS0+Q2hlY2tEZXN0cm95ZWQoKSk7Ci0KLSAgRGVzdHJ1Y3RvckNhbGw6OlJlc2V0TGlzdCgpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdoZW4gYSB0aHJlYWQgZXhpdHMsIHRoZSB0aHJlYWQtbG9jYWwgb2JqZWN0IGZvciB0aGF0Ci0vLyB0aHJlYWQgaXMgZGVzdHJveWVkLgotVEVTVChUaHJlYWRMb2NhbFRlc3QsIERlc3Ryb3lzTWFuYWdlZE9iamVjdEF0VGhyZWFkRXhpdCkgewotICBEZXN0cnVjdG9yQ2FsbDo6UmVzZXRMaXN0KCk7Ci0KLSAgewotICAgIFRocmVhZExvY2FsPERlc3RydWN0b3JUcmFja2VyPiB0aHJlYWRfbG9jYWxfdHJhY2tlcjsKLSAgICBBU1NFUlRfRVEoMFUsIERlc3RydWN0b3JDYWxsOjpMaXN0KCkuc2l6ZSgpKTsKLQotICAgIC8vIFRoaXMgY3JlYXRlcyBhbm90aGVyIERlc3RydWN0b3JUcmFja2VyIG9iamVjdCBpbiB0aGUgbmV3IHRocmVhZC4KLSAgICBUaHJlYWRXaXRoUGFyYW08VGhyZWFkUGFyYW0+IHRocmVhZCgKLSAgICAgICAgJkNhbGxUaHJlYWRMb2NhbEdldCwgJnRocmVhZF9sb2NhbF90cmFja2VyLCBOVUxMKTsKLSAgICB0aHJlYWQuSm9pbigpOwotCi0gICAgLy8gVGhlIHRocmVhZCBoYXMgZXhpdGVkLCBhbmQgd2Ugc2hvdWxkIGhhdmUgYSBEZXN0cm95ZWRUcmFja2VyCi0gICAgLy8gaW5zdGFuY2UgY3JlYXRlZCBmb3IgaXQuIEJ1dCBpdCBtYXkgbm90IGhhdmUgYmVlbiBkZXN0cm95ZWQgeWV0LgotICAgIEFTU0VSVF9FUSgxVSwgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKS5zaXplKCkpOwotICB9Ci0KLSAgLy8gVGhlIHRocmVhZCBoYXMgZXhpdGVkIGFuZCB0aHJlYWRfbG9jYWxfdHJhY2tlciBoYXMgZGllZC4KLSAgQVNTRVJUX0VRKDFVLCBEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpLnNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKERlc3RydWN0b3JDYWxsOjpMaXN0KClbMF0tPkNoZWNrRGVzdHJveWVkKCkpOwotCi0gIERlc3RydWN0b3JDYWxsOjpSZXNldExpc3QoKTsKLX0KLQotVEVTVChUaHJlYWRMb2NhbFRlc3QsIFRocmVhZExvY2FsTXV0YXRpb25zQWZmZWN0T25seUN1cnJlbnRUaHJlYWQpIHsKLSAgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+IHRocmVhZF9sb2NhbF9zdHJpbmc7Ci0gIHRocmVhZF9sb2NhbF9zdHJpbmcuc2V0KCJGb28iKTsKLSAgRVhQRUNUX1NUUkVRKCJGb28iLCB0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpLmNfc3RyKCkpOwotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgUnVuRnJvbVRocmVhZCgmUmV0cmlldmVUaHJlYWRMb2NhbFZhbHVlLAotICAgICAgICAgICAgICAgIG1ha2VfcGFpcigmdGhyZWFkX2xvY2FsX3N0cmluZywgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQuZW1wdHkoKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotVEVTVChXaW5kb3dzVHlwZXNUZXN0LCBIQU5ETEVJc1ZvaWRTdGFyKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxIQU5ETEUsIHZvaWQqPigpOwotfQotCi1URVNUKFdpbmRvd3NUeXBlc1Rlc3QsIENSSVRJQ0FMX1NFQ1RJT05Jc19SVExfQ1JJVElDQUxfU0VDVElPTikgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8Q1JJVElDQUxfU0VDVElPTiwgX1JUTF9DUklUSUNBTF9TRUNUSU9OPigpOwotfQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC1wcmludGVyc190ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTdjYzIuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKLS8vCi0vLyBUaGlzIGZpbGUgdGVzdHMgdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLS8vIGhhc2hfbWFwIGFuZCBoYXNoX3NldCBhcmUgYXZhaWxhYmxlIHVuZGVyIFZpc3VhbCBDKyssIG9yIG9uIExpbnV4LgotI2lmIEdURVNUX0hBU19IQVNIX01BUF8KLSMgaW5jbHVkZSA8aGFzaF9tYXA+ICAgICAgICAgICAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX0hBU19IQVNIX01BUF8KLSNpZiBHVEVTVF9IQVNfSEFTSF9TRVRfCi0jIGluY2x1ZGUgPGhhc2hfc2V0PiAgICAgICAgICAgIC8vIE5PTElOVAotI2VuZGlmICAvLyBHVEVTVF9IQVNfSEFTSF9TRVRfCi0KLSNpZiBHVEVTVF9IQVNfU1REX0ZPUldBUkRfTElTVF8KLSMgaW5jbHVkZSA8Zm9yd2FyZF9saXN0PiAvLyBOT0xJTlQKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GT1JXQVJEX0xJU1RfCi0KLS8vIFNvbWUgdXNlci1kZWZpbmVkIHR5cGVzIGZvciB0ZXN0aW5nIHRoZSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlci4KLQotLy8gQW4gYW5vbnltb3VzIGVudW0gdHlwZS4KLWVudW0gQW5vbnltb3VzRW51bSB7Ci0gIGtBRTEgPSAtMSwKLSAga0FFMiA9IDEKLX07Ci0KLS8vIEFuIGVudW0gd2l0aG91dCBhIHVzZXItZGVmaW5lZCBwcmludGVyLgotZW51bSBFbnVtV2l0aG91dFByaW50ZXIgewotICBrRVdQMSA9IC0yLAotICBrRVdQMiA9IDQyCi19OwotCi0vLyBBbiBlbnVtIHdpdGggYSA8PCBvcGVyYXRvci4KLWVudW0gRW51bVdpdGhTdHJlYW1pbmcgewotICBrRVdTMSA9IDEwCi19OwotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgRW51bVdpdGhTdHJlYW1pbmcgZSkgewotICByZXR1cm4gb3MgPDwgKGUgPT0ga0VXUzEgPyAia0VXUzEiIDogImludmFsaWQiKTsKLX0KLQotLy8gQW4gZW51bSB3aXRoIGEgUHJpbnRUbygpIGZ1bmN0aW9uLgotZW51bSBFbnVtV2l0aFByaW50VG8gewotICBrRVdQVDEgPSAxCi19OwotCi12b2lkIFByaW50VG8oRW51bVdpdGhQcmludFRvIGUsIHN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8IChlID09IGtFV1BUMSA/ICJrRVdQVDEiIDogImludmFsaWQiKTsKLX0KLQotLy8gQSBjbGFzcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQuCi1jbGFzcyBCaWdnZXN0SW50Q29udmVydGlibGUgewotIHB1YmxpYzoKLSAgb3BlcmF0b3IgOjp0ZXN0aW5nOjppbnRlcm5hbDo6QmlnZ2VzdEludCgpIGNvbnN0IHsgcmV0dXJuIDQyOyB9Ci19OwotCi0vLyBBIHVzZXItZGVmaW5lZCB1bnByaW50YWJsZSBjbGFzcyB0ZW1wbGF0ZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5wcmludGFibGVUZW1wbGF0ZUluR2xvYmFsIHsKLSBwdWJsaWM6Ci0gIFVucHJpbnRhYmxlVGVtcGxhdGVJbkdsb2JhbCgpIDogdmFsdWVfKCkge30KLSBwcml2YXRlOgotICBUIHZhbHVlXzsKLX07Ci0KLS8vIEEgdXNlci1kZWZpbmVkIHN0cmVhbWFibGUgdHlwZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLWNsYXNzIFN0cmVhbWFibGVJbkdsb2JhbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5TdHJlYW1hYmxlSW5HbG9iYWwoKSB7fQotfTsKLQotaW5saW5lIHZvaWQgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0cmVhbWFibGVJbkdsb2JhbCYgLyogeCAqLykgewotICBvcyA8PCAiU3RyZWFtYWJsZUluR2xvYmFsIjsKLX0KLQotdm9pZCBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywgY29uc3QgU3RyZWFtYWJsZUluR2xvYmFsKiAvKiB4ICovKSB7Ci0gIG9zIDw8ICJTdHJlYW1hYmxlSW5HbG9iYWwqIjsKLX0KLQotbmFtZXNwYWNlIGZvbyB7Ci0KLS8vIEEgdXNlci1kZWZpbmVkIHVucHJpbnRhYmxlIHR5cGUgaW4gYSB1c2VyIG5hbWVzcGFjZS4KLWNsYXNzIFVucHJpbnRhYmxlSW5Gb28gewotIHB1YmxpYzoKLSAgVW5wcmludGFibGVJbkZvbygpIDogel8oMCkgeyBtZW1jcHkoeHlfLCAiXHhFRlx4MTJceDBceDBceDM0XHhBQlx4MFx4MCIsIDgpOyB9Ci0gIGRvdWJsZSB6KCkgY29uc3QgeyByZXR1cm4gel87IH0KLSBwcml2YXRlOgotICBjaGFyIHh5X1s4XTsKLSAgZG91YmxlIHpfOwotfTsKLQotLy8gQSB1c2VyLWRlZmluZWQgcHJpbnRhYmxlIHR5cGUgaW4gYSB1c2VyLWNob3NlbiBuYW1lc3BhY2UuCi1zdHJ1Y3QgUHJpbnRhYmxlVmlhUHJpbnRUbyB7Ci0gIFByaW50YWJsZVZpYVByaW50VG8oKSA6IHZhbHVlKCkge30KLSAgaW50IHZhbHVlOwotfTsKLQotdm9pZCBQcmludFRvKGNvbnN0IFByaW50YWJsZVZpYVByaW50VG8mIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgIlByaW50YWJsZVZpYVByaW50VG86ICIgPDwgeC52YWx1ZTsKLX0KLQotLy8gQSB0eXBlIHdpdGggYSB1c2VyLWRlZmluZWQgPDwgZm9yIHByaW50aW5nIGl0cyBwb2ludGVyLgotc3RydWN0IFBvaW50ZXJQcmludGFibGUgewotfTsKLQotOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlclByaW50YWJsZSogLyogeCAqLykgewotICByZXR1cm4gb3MgPDwgIlBvaW50ZXJQcmludGFibGUqIjsKLX0KLQotLy8gQSB1c2VyLWRlZmluZWQgcHJpbnRhYmxlIGNsYXNzIHRlbXBsYXRlIGluIGEgdXNlci1jaG9zZW4gbmFtZXNwYWNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlKGNvbnN0IFQmIGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9Ci0KLSAgY29uc3QgVCYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLSBwcml2YXRlOgotICBUIHZhbHVlXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBQcmludFRvKGNvbnN0IFByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZTxUPiYgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICpvcyA8PCAiUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlOiAiIDw8IHgudmFsdWUoKTsKLX0KLQotLy8gQSB1c2VyLWRlZmluZWQgc3RyZWFtYWJsZSBjbGFzcyB0ZW1wbGF0ZSBpbiBhIHVzZXIgbmFtZXNwYWNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbyB7Ci0gcHVibGljOgotICBTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbygpIDogdmFsdWVfKCkge30KLQotICBjb25zdCBUJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotIHByaXZhdGU6Ci0gIFQgdmFsdWVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbWFibGVUZW1wbGF0ZUluRm9vPFQ+JiB4KSB7Ci0gIHJldHVybiBvcyA8PCAiU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb286ICIgPDwgeC52YWx1ZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZm9vCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBndGVzdF9wcmludGVyc190ZXN0IHsKLQotdXNpbmcgOjpzdGQ6OmRlcXVlOwotdXNpbmcgOjpzdGQ6Omxpc3Q7Ci11c2luZyA6OnN0ZDo6bWFrZV9wYWlyOwotdXNpbmcgOjpzdGQ6Om1hcDsKLXVzaW5nIDo6c3RkOjptdWx0aW1hcDsKLXVzaW5nIDo6c3RkOjptdWx0aXNldDsKLXVzaW5nIDo6c3RkOjpwYWlyOwotdXNpbmcgOjpzdGQ6OnNldDsKLXVzaW5nIDo6c3RkOjp2ZWN0b3I7Ci11c2luZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmc7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2U7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfOwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTsKLXVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2U7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmdzOwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQ7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyOwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludDsKLXVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nczsKLXVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZzsKLQotLy8gVGhlIGhhc2hfKiBjbGFzc2VzIGFyZSBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLiAgU1RMcG9ydAotLy8gZGVmaW5lcyB0aGVtIGluIG5hbWVzcGFjZSBzdGQuICBNU1ZDIGRlZmluZXMgdGhlbSBpbiA6OnN0ZGV4dC4gIEdDQwotLy8gZGVmaW5lcyB0aGVtIGluIDo6LgotI2lmZGVmIF9TVExQX0hBU0hfTUFQICAvLyBXZSBnb3QgPGhhc2hfbWFwPiBmcm9tIFNUTHBvcnQuCi11c2luZyA6OnN0ZDo6aGFzaF9tYXA7Ci11c2luZyA6OnN0ZDo6aGFzaF9zZXQ7Ci11c2luZyA6OnN0ZDo6aGFzaF9tdWx0aW1hcDsKLXVzaW5nIDo6c3RkOjpoYXNoX211bHRpc2V0OwotI2VsaWYgX01TQ19WRVIKLXVzaW5nIDo6c3RkZXh0OjpoYXNoX21hcDsKLXVzaW5nIDo6c3RkZXh0OjpoYXNoX3NldDsKLXVzaW5nIDo6c3RkZXh0OjpoYXNoX211bHRpbWFwOwotdXNpbmcgOjpzdGRleHQ6Omhhc2hfbXVsdGlzZXQ7Ci0jZW5kaWYKLQotLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyLiAgVGhpcwotLy8gaXMgYSBoZWxwZXIgZm9yIHRlc3RpbmcgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBmb3IgdmFyaW91cyB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RyaW5nIFByaW50KGNvbnN0IFQmIHZhbHVlKSB7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCAmc3MpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIFByaW50cyBhIHZhbHVlIHBhc3NlZCBieSByZWZlcmVuY2UgdG8gYSBzdHJpbmcsIHVzaW5nIHRoZSB1bml2ZXJzYWwKLS8vIHZhbHVlIHByaW50ZXIuICBUaGlzIGlzIGEgaGVscGVyIGZvciB0ZXN0aW5nCi0vLyBVbml2ZXJzYWxQcmludGVyPFQmPjo6UHJpbnQoKSBmb3IgdmFyaW91cyB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RyaW5nIFByaW50QnlSZWYoY29uc3QgVCYgdmFsdWUpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgVW5pdmVyc2FsUHJpbnRlcjxUJj46OlByaW50KHZhbHVlLCAmc3MpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIHZhcmlvdXMgZW51bSB0eXBlcy4KLQotVEVTVChQcmludEVudW1UZXN0LCBBbm9ueW1vdXNFbnVtKSB7Ci0gIEVYUEVDVF9FUSgiLTEiLCBQcmludChrQUUxKSk7Ci0gIEVYUEVDVF9FUSgiMSIsIFByaW50KGtBRTIpKTsKLX0KLQotVEVTVChQcmludEVudW1UZXN0LCBFbnVtV2l0aG91dFByaW50ZXIpIHsKLSAgRVhQRUNUX0VRKCItMiIsIFByaW50KGtFV1AxKSk7Ci0gIEVYUEVDVF9FUSgiNDIiLCBQcmludChrRVdQMikpOwotfQotCi1URVNUKFByaW50RW51bVRlc3QsIEVudW1XaXRoU3RyZWFtaW5nKSB7Ci0gIEVYUEVDVF9FUSgia0VXUzEiLCBQcmludChrRVdTMSkpOwotICBFWFBFQ1RfRVEoImludmFsaWQiLCBQcmludChzdGF0aWNfY2FzdDxFbnVtV2l0aFN0cmVhbWluZz4oMCkpKTsKLX0KLQotVEVTVChQcmludEVudW1UZXN0LCBFbnVtV2l0aFByaW50VG8pIHsKLSAgRVhQRUNUX0VRKCJrRVdQVDEiLCBQcmludChrRVdQVDEpKTsKLSAgRVhQRUNUX0VRKCJpbnZhbGlkIiwgUHJpbnQoc3RhdGljX2Nhc3Q8RW51bVdpdGhQcmludFRvPigwKSkpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyBhIGNsYXNzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludC4KLQotVEVTVChQcmludENsYXNzVGVzdCwgQmlnZ2VzdEludENvbnZlcnRpYmxlKSB7Ci0gIEVYUEVDVF9FUSgiNDIiLCBQcmludChCaWdnZXN0SW50Q29udmVydGlibGUoKSkpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyB2YXJpb3VzIGNoYXIgdHlwZXMuCi0KLS8vIGNoYXIuCi1URVNUKFByaW50Q2hhclRlc3QsIFBsYWluQ2hhcikgewotICBFWFBFQ1RfRVEoIidcXDAnIiwgUHJpbnQoJ1wwJykpOwotICBFWFBFQ1RfRVEoIidcXCcnICgzOSwgMHgyNykiLCBQcmludCgnXCcnKSk7Ci0gIEVYUEVDVF9FUSgiJ1wiJyAoMzQsIDB4MjIpIiwgUHJpbnQoJyInKSk7Ci0gIEVYUEVDVF9FUSgiJz8nICg2MywgMHgzRikiLCBQcmludCgnPycpKTsKLSAgRVhQRUNUX0VRKCInXFxcXCcgKDkyLCAweDVDKSIsIFByaW50KCdcXCcpKTsKLSAgRVhQRUNUX0VRKCInXFxhJyAoNykiLCBQcmludCgnXGEnKSk7Ci0gIEVYUEVDVF9FUSgiJ1xcYicgKDgpIiwgUHJpbnQoJ1xiJykpOwotICBFWFBFQ1RfRVEoIidcXGYnICgxMiwgMHhDKSIsIFByaW50KCdcZicpKTsKLSAgRVhQRUNUX0VRKCInXFxuJyAoMTAsIDB4QSkiLCBQcmludCgnXG4nKSk7Ci0gIEVYUEVDVF9FUSgiJ1xccicgKDEzLCAweEQpIiwgUHJpbnQoJ1xyJykpOwotICBFWFBFQ1RfRVEoIidcXHQnICg5KSIsIFByaW50KCdcdCcpKTsKLSAgRVhQRUNUX0VRKCInXFx2JyAoMTEsIDB4QikiLCBQcmludCgnXHYnKSk7Ci0gIEVYUEVDVF9FUSgiJ1xceDdGJyAoMTI3KSIsIFByaW50KCdceDdGJykpOwotICBFWFBFQ1RfRVEoIidcXHhGRicgKDI1NSkiLCBQcmludCgnXHhGRicpKTsKLSAgRVhQRUNUX0VRKCInICcgKDMyLCAweDIwKSIsIFByaW50KCcgJykpOwotICBFWFBFQ1RfRVEoIidhJyAoOTcsIDB4NjEpIiwgUHJpbnQoJ2EnKSk7Ci19Ci0KLS8vIHNpZ25lZCBjaGFyLgotVEVTVChQcmludENoYXJUZXN0LCBTaWduZWRDaGFyKSB7Ci0gIEVYUEVDVF9FUSgiJ1xcMCciLCBQcmludChzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oJ1wwJykpKTsKLSAgRVhQRUNUX0VRKCInXFx4Q0UnICgtNTApIiwKLSAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigtNTApKSk7Ci19Ci0KLS8vIHVuc2lnbmVkIGNoYXIuCi1URVNUKFByaW50Q2hhclRlc3QsIFVuc2lnbmVkQ2hhcikgewotICBFWFBFQ1RfRVEoIidcXDAnIiwgUHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oJ1wwJykpKTsKLSAgRVhQRUNUX0VRKCInYicgKDk4LCAweDYyKSIsCi0gICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPignYicpKSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIG90aGVyIHNpbXBsZSwgYnVpbHQtaW4gdHlwZXMuCi0KLS8vIGJvb2wuCi1URVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBCb29sKSB7Ci0gIEVYUEVDVF9FUSgiZmFsc2UiLCBQcmludChmYWxzZSkpOwotICBFWFBFQ1RfRVEoInRydWUiLCBQcmludCh0cnVlKSk7Ci19Ci0KLS8vIHdjaGFyX3QuCi1URVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBXY2hhcl90KSB7Ci0gIEVYUEVDVF9FUSgiTCdcXDAnIiwgUHJpbnQoTCdcMCcpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcJycgKDM5LCAweDI3KSIsIFByaW50KEwnXCcnKSk7Ci0gIEVYUEVDVF9FUSgiTCdcIicgKDM0LCAweDIyKSIsIFByaW50KEwnIicpKTsKLSAgRVhQRUNUX0VRKCJMJz8nICg2MywgMHgzRikiLCBQcmludChMJz8nKSk7Ci0gIEVYUEVDVF9FUSgiTCdcXFxcJyAoOTIsIDB4NUMpIiwgUHJpbnQoTCdcXCcpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcYScgKDcpIiwgUHJpbnQoTCdcYScpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcYicgKDgpIiwgUHJpbnQoTCdcYicpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcZicgKDEyLCAweEMpIiwgUHJpbnQoTCdcZicpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcbicgKDEwLCAweEEpIiwgUHJpbnQoTCdcbicpKTsKLSAgRVhQRUNUX0VRKCJMJ1xccicgKDEzLCAweEQpIiwgUHJpbnQoTCdccicpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcdCcgKDkpIiwgUHJpbnQoTCdcdCcpKTsKLSAgRVhQRUNUX0VRKCJMJ1xcdicgKDExLCAweEIpIiwgUHJpbnQoTCdcdicpKTsKLSAgRVhQRUNUX0VRKCJMJ1xceDdGJyAoMTI3KSIsIFByaW50KEwnXHg3RicpKTsKLSAgRVhQRUNUX0VRKCJMJ1xceEZGJyAoMjU1KSIsIFByaW50KEwnXHhGRicpKTsKLSAgRVhQRUNUX0VRKCJMJyAnICgzMiwgMHgyMCkiLCBQcmludChMJyAnKSk7Ci0gIEVYUEVDVF9FUSgiTCdhJyAoOTcsIDB4NjEpIiwgUHJpbnQoTCdhJykpOwotICBFWFBFQ1RfRVEoIkwnXFx4NTc2JyAoMTM5OCkiLCBQcmludChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDU3NikpKTsKLSAgRVhQRUNUX0VRKCJMJ1xceEM3NEQnICg1MTAyMSkiLCBQcmludChzdGF0aWNfY2FzdDx3Y2hhcl90PigweEM3NEQpKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCBJbnQ2NCBwcm92aWRlcyBtb3JlIHN0b3JhZ2UgdGhhbiB3Y2hhcl90LgotVEVTVChQcmludFR5cGVTaXplVGVzdCwgV2NoYXJfdCkgewotICBFWFBFQ1RfTFQoc2l6ZW9mKHdjaGFyX3QpLCBzaXplb2YodGVzdGluZzo6aW50ZXJuYWw6OkludDY0KSk7Ci19Ci0KLS8vIFZhcmlvdXMgaW50ZWdlciB0eXBlcy4KLVRFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIEludGVnZXIpIHsKLSAgRVhQRUNUX0VRKCInXFx4RkYnICgyNTUpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMjU1KSkpOyAgLy8gdWludDgKLSAgRVhQRUNUX0VRKCInXFx4ODAnICgtMTI4KSIsIFByaW50KHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigtMTI4KSkpOyAgLy8gaW50OAotICBFWFBFQ1RfRVEoIjY1NTM1IiwgUHJpbnQoVVNIUlRfTUFYKSk7ICAvLyB1aW50MTYKLSAgRVhQRUNUX0VRKCItMzI3NjgiLCBQcmludChTSFJUX01JTikpOyAgLy8gaW50MTYKLSAgRVhQRUNUX0VRKCI0Mjk0OTY3Mjk1IiwgUHJpbnQoVUlOVF9NQVgpKTsgIC8vIHVpbnQzMgotICBFWFBFQ1RfRVEoIi0yMTQ3NDgzNjQ4IiwgUHJpbnQoSU5UX01JTikpOyAgLy8gaW50MzIKLSAgRVhQRUNUX0VRKCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCi0gICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx0ZXN0aW5nOjppbnRlcm5hbDo6VUludDY0PigtMSkpKTsgIC8vIHVpbnQ2NAotICBFWFBFQ1RfRVEoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IiwKLSAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2ND4oMSkgPDwgNjMpKTsgIC8vIGludDY0Ci19Ci0KLS8vIFNpemUgdHlwZXMuCi1URVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBTaXplX3QpIHsKLSAgRVhQRUNUX0VRKCIxIiwgUHJpbnQoc2l6ZW9mKCdhJykpKTsgIC8vIHNpemVfdC4KLSNpZiAhR1RFU1RfT1NfV0lORE9XUwotICAvLyBXaW5kb3dzIGhhcyBubyBzc2l6ZV90IHR5cGUuCi0gIEVYUEVDVF9FUSgiLTIiLCBQcmludChzdGF0aWNfY2FzdDxzc2l6ZV90PigtMikpKTsgIC8vIHNzaXplX3QuCi0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCi19Ci0KLS8vIEZsb2F0aW5nLXBvaW50cy4KLVRFU1QoUHJpbnRCdWlsdEluVHlwZVRlc3QsIEZsb2F0aW5nUG9pbnRzKSB7Ci0gIEVYUEVDVF9FUSgiMS41IiwgUHJpbnQoMS41ZikpOyAgIC8vIGZsb2F0Ci0gIEVYUEVDVF9FUSgiLTIuNSIsIFByaW50KC0yLjUpKTsgIC8vIGRvdWJsZQotfQotCi0vLyBTaW5jZSA6OnN0ZDo6c3RyaW5nc3RyZWFtOjpvcGVyYXRvcjw8KGNvbnN0IHZvaWQgKikgZm9ybWF0cyB0aGUgcG9pbnRlcgotLy8gb3V0cHV0IGRpZmZlcmVudGx5IHdpdGggZGlmZmVyZW50IGNvbXBpbGVycywgd2UgaGF2ZSB0byBjcmVhdGUgdGhlIGV4cGVjdGVkCi0vLyBvdXRwdXQgZmlyc3QgYW5kIHVzZSBpdCBhcyBvdXIgZXhwZWN0YXRpb24uCi1zdGF0aWMgc3RyaW5nIFByaW50UG9pbnRlcihjb25zdCB2b2lkICpwKSB7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWRfcmVzdWx0X3N0cmVhbTsKLSAgZXhwZWN0ZWRfcmVzdWx0X3N0cmVhbSA8PCBwOwotICByZXR1cm4gZXhwZWN0ZWRfcmVzdWx0X3N0cmVhbS5zdHIoKTsKLX0KLQotLy8gVGVzdHMgcHJpbnRpbmcgQyBzdHJpbmdzLgotCi0vLyBjb25zdCBjaGFyKi4KLVRFU1QoUHJpbnRDU3RyaW5nVGVzdCwgQ29uc3QpIHsKLSAgY29uc3QgY2hhciogcCA9ICJXb3JsZCI7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIFwiV29ybGRcIiIsIFByaW50KHApKTsKLX0KLQotLy8gY2hhciouCi1URVNUKFByaW50Q1N0cmluZ1Rlc3QsIE5vbkNvbnN0KSB7Ci0gIGNoYXIgcFtdID0gIkhpIjsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gXCJIaVwiIiwKLSAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PGNoYXIqPihwKSkpOwotfQotCi0vLyBOVUxMIEMgc3RyaW5nLgotVEVTVChQcmludENTdHJpbmdUZXN0LCBOdWxsKSB7Ci0gIGNvbnN0IGNoYXIqIHAgPSBOVUxMOwotICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQyBzdHJpbmdzIGFyZSBlc2NhcGVkIHByb3Blcmx5LgotVEVTVChQcmludENTdHJpbmdUZXN0LCBFc2NhcGVzUHJvcGVybHkpIHsKLSAgY29uc3QgY2hhciogcCA9ICInXCI/XFxcYVxiXGZcblxyXHRcdlx4N0ZceEZGIGEiOwotICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBcIidcXFwiP1xcXFxcXGFcXGJcXGYiCi0gICAgICAgICAgICAiXFxuXFxyXFx0XFx2XFx4N0ZcXHhGRiBhXCIiLAotICAgICAgICAgICAgUHJpbnQocCkpOwotfQotCi0vLyBNU1ZDIGNvbXBpbGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIGRlZmluZSB3aGFyX3QgYXMgYSB0eXBlZGVmCi0vLyBvZiB1bnNpZ25lZCBzaG9ydC4gRGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0IHdjaGFyX3QqIGluIHRoYXQgY2FzZQotLy8gd291bGQgY2F1c2UgcG9pbnRlcnMgdG8gdW5zaWduZWQgc2hvcnRzIGJlIHByaW50ZWQgYXMgd2lkZSBzdHJpbmdzLAotLy8gcG9zc2libHkgYWNjZXNzaW5nIG1vcmUgbWVtb3J5IHRoYW4gaW50ZW5kZWQgYW5kIGNhdXNpbmcgaW52YWxpZAotLy8gbWVtb3J5IGFjY2Vzc2VzLiBNU1ZDIGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4KLS8vIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYXMgYSBuYXRpdmUgdHlwZS4KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKLQotLy8gY29uc3Qgd2NoYXJfdCouCi1URVNUKFByaW50V2lkZUNTdHJpbmdUZXN0LCBDb25zdCkgewotICBjb25zdCB3Y2hhcl90KiBwID0gTCJXb3JsZCI7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIExcIldvcmxkXCIiLCBQcmludChwKSk7Ci19Ci0KLS8vIHdjaGFyX3QqLgotVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgTm9uQ29uc3QpIHsKLSAgd2NoYXJfdCBwW10gPSBMIkhpIjsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gTFwiSGlcIiIsCi0gICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx3Y2hhcl90Kj4ocCkpKTsKLX0KLQotLy8gTlVMTCB3aWRlIEMgc3RyaW5nLgotVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgTnVsbCkgewotICBjb25zdCB3Y2hhcl90KiBwID0gTlVMTDsKLSAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdpZGUgQyBzdHJpbmdzIGFyZSBlc2NhcGVkIHByb3Blcmx5LgotVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgRXNjYXBlc1Byb3Blcmx5KSB7Ci0gIGNvbnN0IHdjaGFyX3Qgc1tdID0geydcJycsICciJywgJz8nLCAnXFwnLCAnXGEnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLAotICAgICAgICAgICAgICAgICAgICAgICAnXHQnLCAnXHYnLCAweEQzLCAweDU3NiwgMHg4RDMsIDB4Qzc0RCwgJyAnLCAnYScsICdcMCd9OwotICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMpICsgIiBwb2ludGluZyB0byBMXCInXFxcIj9cXFxcXFxhXFxiXFxmIgotICAgICAgICAgICAgIlxcblxcclxcdFxcdlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RCBhXCIiLAotICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHMpKSk7Ci19Ci0jZW5kaWYgIC8vIG5hdGl2ZSB3Y2hhcl90Ci0KLS8vIFRlc3RzIHByaW50aW5nIHBvaW50ZXJzIHRvIG90aGVyIGNoYXIgdHlwZXMuCi0KLS8vIHNpZ25lZCBjaGFyKi4KLVRFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIFNpZ25lZENoYXIpIHsKLSAgc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PHNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOwotICBwID0gTlVMTDsKLSAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOwotfQotCi0vLyBjb25zdCBzaWduZWQgY2hhciouCi1URVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBDb25zdFNpZ25lZENoYXIpIHsKLSAgc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PHNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOwotICBwID0gTlVMTDsKLSAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOwotfQotCi0vLyB1bnNpZ25lZCBjaGFyKi4KLVRFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIFVuc2lnbmVkQ2hhcikgewotICB1bnNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOwotICBwID0gTlVMTDsKLSAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOwotfQotCi0vLyBjb25zdCB1bnNpZ25lZCBjaGFyKi4KLVRFU1QoUHJpbnRDaGFyUG9pbnRlclRlc3QsIENvbnN0VW5zaWduZWRDaGFyKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigweDEyMzQpOwotICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7Ci0gIHAgPSBOVUxMOwotICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIHBvaW50ZXJzIHRvIHNpbXBsZSwgYnVpbHQtaW4gdHlwZXMuCi0KLS8vIGJvb2wqLgotVEVTVChQcmludFBvaW50ZXJUb0J1aWx0SW5UeXBlVGVzdCwgQm9vbCkgewotICBib29sKiBwID0gcmVpbnRlcnByZXRfY2FzdDxib29sKj4oMHhBQkNEKTsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOwotICBwID0gTlVMTDsKLSAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOwotfQotCi0vLyB2b2lkKi4KLVRFU1QoUHJpbnRQb2ludGVyVG9CdWlsdEluVHlwZVRlc3QsIFZvaWQpIHsKLSAgdm9pZCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KDB4QUJDRCk7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKLSAgcCA9IE5VTEw7Ci0gIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKLX0KLQotLy8gY29uc3Qgdm9pZCouCi1URVNUKFByaW50UG9pbnRlclRvQnVpbHRJblR5cGVUZXN0LCBDb25zdFZvaWQpIHsKLSAgY29uc3Qgdm9pZCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KDB4QUJDRCk7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKLSAgcCA9IE5VTEw7Ci0gIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKLX0KLQotLy8gVGVzdHMgcHJpbnRpbmcgcG9pbnRlcnMgdG8gcG9pbnRlcnMuCi1URVNUKFByaW50UG9pbnRlclRvUG9pbnRlclRlc3QsIEludFBvaW50ZXJQb2ludGVyKSB7Ci0gIGludCoqIHAgPSByZWludGVycHJldF9jYXN0PGludCoqPigweEFCQ0QpOwotICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7Ci0gIHAgPSBOVUxMOwotICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIChub24tbWVtYmVyKSBmdW5jdGlvbiBwb2ludGVycy4KLQotdm9pZCBNeUZ1bmN0aW9uKGludCAvKiBuICovKSB7fQotCi1URVNUKFByaW50UG9pbnRlclRlc3QsIE5vbk1lbWJlckZ1bmN0aW9uUG9pbnRlcikgewotICAvLyBXZSBjYW5ub3QgZGlyZWN0bHkgY2FzdCAmTXlGdW5jdGlvbiB0byBjb25zdCB2b2lkKiBiZWNhdXNlIHRoZQotICAvLyBzdGFuZGFyZCBkaXNhbGxvd3MgY2FzdGluZyBiZXR3ZWVuIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBhbmQKLSAgLy8gcG9pbnRlcnMgdG8gb2JqZWN0cywgYW5kIHNvbWUgY29tcGlsZXJzIChlLmcuIEdDQyAzLjQpIGVuZm9yY2UKLSAgLy8gdGhpcyBsaW1pdGF0aW9uLgotICBFWFBFQ1RfRVEoCi0gICAgICBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6QmlnZ2VzdEludD4oJk15RnVuY3Rpb24pKSksCi0gICAgICBQcmludCgmTXlGdW5jdGlvbikpOwotICBpbnQgKCpwKShib29sKSA9IE5VTEw7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOwotfQotCi0vLyBBbiBhc3NlcnRpb24gcHJlZGljYXRlIGRldGVybWluaW5nIHdoZXRoZXIgYSBvbmUgc3RyaW5nIGlzIGEgcHJlZml4IGZvcgotLy8gYW5vdGhlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgotQXNzZXJ0aW9uUmVzdWx0IEhhc1ByZWZpeChjb25zdCBTdHJpbmdUeXBlJiBzdHIsIGNvbnN0IFN0cmluZ1R5cGUmIHByZWZpeCkgewotICBpZiAoc3RyLmZpbmQocHJlZml4LCAwKSA9PSAwKQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgY29uc3QgYm9vbCBpc193aWRlX3N0cmluZyA9IHNpemVvZihwcmVmaXhbMF0pID4gMTsKLSAgY29uc3QgY2hhciogY29uc3QgYmVnaW5fc3RyaW5nX3F1b3RlID0gaXNfd2lkZV9zdHJpbmcgPyAiTFwiIiA6ICJcIiI7Ci0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBwcmVmaXggPDwgIlwiIGlzIG5vdCBhIHByZWZpeCBvZiAiCi0gICAgICA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgc3RyIDw8ICJcIlxuIjsKLX0KLQotLy8gVGVzdHMgcHJpbnRpbmcgbWVtYmVyIHZhcmlhYmxlIHBvaW50ZXJzLiAgQWx0aG91Z2ggdGhleSBhcmUgY2FsbGVkCi0vLyBwb2ludGVycywgdGhleSBkb24ndCBwb2ludCB0byBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLgotLy8gVGhlaXIgcmVwcmVzZW50YXRpb24gaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIFRodXMgdGhleSB3aWxsIGJlCi0vLyBwcmludGVkIGFzIHJhdyBieXRlcy4KLQotc3RydWN0IEZvbyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Gb28oKSB7fQotICBpbnQgTXlNZXRob2QoY2hhciB4KSB7IHJldHVybiB4ICsgMTsgfQotICB2aXJ0dWFsIGNoYXIgTXlWaXJ0dWFsTWV0aG9kKGludCAvKiBuICovKSB7IHJldHVybiAnYSc7IH0KLQotICBpbnQgdmFsdWU7Ci19OwotCi1URVNUKFByaW50UG9pbnRlclRlc3QsIE1lbWJlclZhcmlhYmxlUG9pbnRlcikgewotICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoUHJpbnQoJkZvbzo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKCZGb286OnZhbHVlKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKLSAgaW50IChGb286OipwKSA9IE5VTEw7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KHApLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuICBBbHRob3VnaCB0aGV5IGFyZSBjYWxsZWQKLS8vIHBvaW50ZXJzLCB0aGV5IGRvbid0IHBvaW50IHRvIGEgbG9jYXRpb24gaW4gdGhlIGFkZHJlc3Mgc3BhY2UuCi0vLyBUaGVpciByZXByZXNlbnRhdGlvbiBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGh1cyB0aGV5IHdpbGwgYmUKLS8vIHByaW50ZWQgYXMgcmF3IGJ5dGVzLgotVEVTVChQcmludFBvaW50ZXJUZXN0LCBNZW1iZXJGdW5jdGlvblBvaW50ZXIpIHsKLSAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KCZGb286Ok15TWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZigmRm9vOjpNeU1ldGhvZCkpICsgIi1ieXRlIG9iamVjdCAiKSk7Ci0gIEVYUEVDVF9UUlVFKAotICAgICAgSGFzUHJlZml4KFByaW50KCZGb286Ok15VmlydHVhbE1ldGhvZCksCi0gICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKCgmRm9vOjpNeVZpcnR1YWxNZXRob2QpKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKLSAgaW50IChGb286OipwKShjaGFyKSA9IE5VTEw7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KHApLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyBDIGFycmF5cy4KLQotLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBQcmludCgpIGlzIHRoYXQgaXQgZW5zdXJlcyB0aGF0IHRoZQotLy8gYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1zdHJpbmcgUHJpbnRBcnJheUhlbHBlcihUICgmYSlbTl0pIHsKLSAgcmV0dXJuIFByaW50KGEpOwotfQotCi0vLyBPbmUtZGltZW5zaW9uYWwgYXJyYXkuCi1URVNUKFByaW50QXJyYXlUZXN0LCBPbmVEaW1lbnNpb25hbEFycmF5KSB7Ci0gIGludCBhWzVdID0geyAxLCAyLCAzLCA0LCA1IH07Ci0gIEVYUEVDVF9FUSgieyAxLCAyLCAzLCA0LCA1IH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKLX0KLQotLy8gVHdvLWRpbWVuc2lvbmFsIGFycmF5LgotVEVTVChQcmludEFycmF5VGVzdCwgVHdvRGltZW5zaW9uYWxBcnJheSkgewotICBpbnQgYVsyXVs1XSA9IHsKLSAgICB7IDEsIDIsIDMsIDQsIDUgfSwKLSAgICB7IDYsIDcsIDgsIDksIDAgfQotICB9OwotICBFWFBFQ1RfRVEoInsgeyAxLCAyLCAzLCA0LCA1IH0sIHsgNiwgNywgOCwgOSwgMCB9IH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKLX0KLQotLy8gQXJyYXkgb2YgY29uc3QgZWxlbWVudHMuCi1URVNUKFByaW50QXJyYXlUZXN0LCBDb25zdEFycmF5KSB7Ci0gIGNvbnN0IGJvb2wgYVsxXSA9IHsgZmFsc2UgfTsKLSAgRVhQRUNUX0VRKCJ7IGZhbHNlIH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKLX0KLQotLy8gY2hhciBhcnJheSB3aXRob3V0IHRlcm1pbmF0aW5nIE5VTC4KLVRFU1QoUHJpbnRBcnJheVRlc3QsIENoYXJBcnJheVdpdGhOb1Rlcm1pbmF0aW5nTnVsKSB7Ci0gIC8vIEFycmF5IGEgY29udGFpbnMgJ1wwJyBpbiB0aGUgbWlkZGxlIGFuZCBkb2Vzbid0IGVuZCB3aXRoICdcMCcuCi0gIGNoYXIgYVtdID0geyAnSCcsICdcMCcsICdpJyB9OwotICBFWFBFQ1RfRVEoIlwiSFxcMGlcIiAobm8gdGVybWluYXRpbmcgTlVMKSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOwotfQotCi0vLyBjb25zdCBjaGFyIGFycmF5IHdpdGggdGVybWluYXRpbmcgTlVMLgotVEVTVChQcmludEFycmF5VGVzdCwgQ29uc3RDaGFyQXJyYXlXaXRoVGVybWluYXRpbmdOdWwpIHsKLSAgY29uc3QgY2hhciBhW10gPSAiXDBIaSI7Ci0gIEVYUEVDVF9FUSgiXCJcXDBIaVwiIiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Ci19Ci0KLS8vIGNvbnN0IHdjaGFyX3QgYXJyYXkgd2l0aG91dCB0ZXJtaW5hdGluZyBOVUwuCi1URVNUKFByaW50QXJyYXlUZXN0LCBXQ2hhckFycmF5V2l0aE5vVGVybWluYXRpbmdOdWwpIHsKLSAgLy8gQXJyYXkgYSBjb250YWlucyAnXDAnIGluIHRoZSBtaWRkbGUgYW5kIGRvZXNuJ3QgZW5kIHdpdGggJ1wwJy4KLSAgY29uc3Qgd2NoYXJfdCBhW10gPSB7IEwnSCcsIEwnXDAnLCBMJ2knIH07Ci0gIEVYUEVDVF9FUSgiTFwiSFxcMGlcIiAobm8gdGVybWluYXRpbmcgTlVMKSIsIFByaW50QXJyYXlIZWxwZXIoYSkpOwotfQotCi0vLyB3Y2hhcl90IGFycmF5IHdpdGggdGVybWluYXRpbmcgTlVMLgotVEVTVChQcmludEFycmF5VGVzdCwgV0NvbnN0Q2hhckFycmF5V2l0aFRlcm1pbmF0aW5nTnVsKSB7Ci0gIGNvbnN0IHdjaGFyX3QgYVtdID0gTCJcMEhpIjsKLSAgRVhQRUNUX0VRKCJMXCJcXDBIaVwiIiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Ci19Ci0KLS8vIEFycmF5IG9mIG9iamVjdHMuCi1URVNUKFByaW50QXJyYXlUZXN0LCBPYmplY3RBcnJheSkgewotICBzdHJpbmcgYVszXSA9IHsgIkhpIiwgIkhlbGxvIiwgIk5pIGhhbyIgfTsKLSAgRVhQRUNUX0VRKCJ7IFwiSGlcIiwgXCJIZWxsb1wiLCBcIk5pIGhhb1wiIH0iLCBQcmludEFycmF5SGVscGVyKGEpKTsKLX0KLQotLy8gQXJyYXkgd2l0aCBtYW55IGVsZW1lbnRzLgotVEVTVChQcmludEFycmF5VGVzdCwgQmlnQXJyYXkpIHsKLSAgaW50IGFbMTAwXSA9IHsgMSwgMiwgMyB9OwotICBFWFBFQ1RfRVEoInsgMSwgMiwgMywgMCwgMCwgMCwgMCwgMCwgLi4uLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0iLAotICAgICAgICAgICAgUHJpbnRBcnJheUhlbHBlcihhKSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLgotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLS8vIDo6c3RyaW5nLgotVEVTVChQcmludFN0cmluZ1Rlc3QsIFN0cmluZ0luR2xvYmFsTmFtZXNwYWNlKSB7Ci0gIGNvbnN0IGNoYXIgc1tdID0gIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceDdGXHhGRiBhIjsKLSAgY29uc3QgOjpzdHJpbmcgc3RyKHMsIHNpemVvZihzKSk7Ci0gIEVYUEVDVF9FUSgiXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2XFx4N0ZcXHhGRiBhXFwwXCIiLAotICAgICAgICAgICAgUHJpbnQoc3RyKSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLS8vIDo6c3RkOjpzdHJpbmcuCi1URVNUKFByaW50U3RyaW5nVGVzdCwgU3RyaW5nSW5TdGROYW1lc3BhY2UpIHsKLSAgY29uc3QgY2hhciBzW10gPSAiJ1wiP1xcXGFcYlxmXG5cMFxyXHRcdlx4N0ZceEZGIGEiOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cihzLCBzaXplb2YocykpOwotICBFWFBFQ1RfRVEoIlwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdlxceDdGXFx4RkYgYVxcMFwiIiwKLSAgICAgICAgICAgIFByaW50KHN0cikpOwotfQotCi1URVNUKFByaW50U3RyaW5nVGVzdCwgU3RyaW5nQW1iaWd1b3VzSGV4KSB7Ci0gIC8vICJceDZCQU5BTkEiIGlzIGFtYmlndW91cywgaXQgY2FuIGJlIGludGVycHJldGVkIGFzIHN0YXJ0aW5nIHdpdGggZWl0aGVyIG9mOgotICAvLyAnXHg2JywgJ1x4NkInLCBvciAnXHg2QkEnLgotCi0gIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIGRlY2ltYWwgZGlnaXQKLSAgRVhQRUNUX0VRKCJcIjBcXHgxMlwiIFwiM1wiIiwgUHJpbnQoOjpzdGQ6OnN0cmluZygiMFx4MTIiICIzIikpKTsKLSAgLy8gYSBoZXggZXNjYXBpbmcgc2VxdWVuY2UgZm9sbG93aW5nIGJ5IGEgaGV4IGRpZ2l0IChsb3dlci1jYXNlKQotICBFWFBFQ1RfRVEoIlwibW1cXHg2XCIgXCJiYW5hbmFzXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCJtbVx4NiIgImJhbmFuYXMiKSkpOwotICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBoZXggZGlnaXQgKHVwcGVyLWNhc2UpCi0gIEVYUEVDVF9FUSgiXCJOT01cXHg2XCIgXCJCQU5BTkFcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIk5PTVx4NiIgIkJBTkFOQSIpKSk7Ci0gIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIG5vbi14ZGlnaXQKLSAgRVhQRUNUX0VRKCJcIiFcXHg1LSFcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIiFceDUtISIpKSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIDo6d3N0cmluZyBhbmQgOjpzdGQ6OndzdHJpbmcuCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLS8vIDo6d3N0cmluZy4KLVRFU1QoUHJpbnRXaWRlU3RyaW5nVGVzdCwgU3RyaW5nSW5HbG9iYWxOYW1lc3BhY2UpIHsKLSAgY29uc3Qgd2NoYXJfdCBzW10gPSBMIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceEQzXHg1NzZceDhEM1x4Qzc0RCBhIjsKLSAgY29uc3QgOjp3c3RyaW5nIHN0cihzLCBzaXplb2Yocykvc2l6ZW9mKHdjaGFyX3QpKTsKLSAgRVhQRUNUX0VRKCJMXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2IgotICAgICAgICAgICAgIlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RCBhXFwwXCIiLAotICAgICAgICAgICAgUHJpbnQoc3RyKSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0vLyA6OnN0ZDo6d3N0cmluZy4KLVRFU1QoUHJpbnRXaWRlU3RyaW5nVGVzdCwgU3RyaW5nSW5TdGROYW1lc3BhY2UpIHsKLSAgY29uc3Qgd2NoYXJfdCBzW10gPSBMIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceEQzXHg1NzZceDhEM1x4Qzc0RCBhIjsKLSAgY29uc3QgOjpzdGQ6OndzdHJpbmcgc3RyKHMsIHNpemVvZihzKS9zaXplb2Yod2NoYXJfdCkpOwotICBFWFBFQ1RfRVEoIkxcIidcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXDBcXHJcXHRcXHYiCi0gICAgICAgICAgICAiXFx4RDNcXHg1NzZcXHg4RDNcXHhDNzREIGFcXDBcIiIsCi0gICAgICAgICAgICBQcmludChzdHIpKTsKLX0KLQotVEVTVChQcmludFdpZGVTdHJpbmdUZXN0LCBTdHJpbmdBbWJpZ3VvdXNIZXgpIHsKLSAgLy8gc2FtZSBmb3Igd2lkZSBzdHJpbmdzLgotICBFWFBFQ1RfRVEoIkxcIjBcXHgxMlwiIExcIjNcIiIsIFByaW50KDo6c3RkOjp3c3RyaW5nKEwiMFx4MTIiIEwiMyIpKSk7Ci0gIEVYUEVDVF9FUSgiTFwibW1cXHg2XCIgTFwiYmFuYW5hc1wiIiwKLSAgICAgICAgICAgIFByaW50KDo6c3RkOjp3c3RyaW5nKEwibW1ceDYiIEwiYmFuYW5hcyIpKSk7Ci0gIEVYUEVDVF9FUSgiTFwiTk9NXFx4NlwiIExcIkJBTkFOQVwiIiwKLSAgICAgICAgICAgIFByaW50KDo6c3RkOjp3c3RyaW5nKEwiTk9NXHg2IiBMIkJBTkFOQSIpKSk7Ci0gIEVYUEVDVF9FUSgiTFwiIVxceDUtIVwiIiwgUHJpbnQoOjpzdGQ6OndzdHJpbmcoTCIhXHg1LSEiKSkpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotLy8gVGVzdHMgcHJpbnRpbmcgdHlwZXMgdGhhdCBzdXBwb3J0IGdlbmVyaWMgc3RyZWFtaW5nIChpLmUuIHN0cmVhbWluZwotLy8gdG8gc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+IGZvciBhbnkgdmFsaWQgQ2hhciBhbmQKLS8vIENoYXJUcmFpdHMgdHlwZXMpLgotCi0vLyBUZXN0cyBwcmludGluZyBhIG5vbi10ZW1wbGF0ZSB0eXBlIHRoYXQgc3VwcG9ydHMgZ2VuZXJpYyBzdHJlYW1pbmcuCi0KLWNsYXNzIEFsbG93c0dlbmVyaWNTdHJlYW1pbmcge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzPgotc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAotICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsCi0gICAgY29uc3QgQWxsb3dzR2VuZXJpY1N0cmVhbWluZyYgLyogYSAqLykgewotICByZXR1cm4gb3MgPDwgIkFsbG93c0dlbmVyaWNTdHJlYW1pbmciOwotfQotCi1URVNUKFByaW50VHlwZVdpdGhHZW5lcmljU3RyZWFtaW5nVGVzdCwgTm9uVGVtcGxhdGVUeXBlKSB7Ci0gIEFsbG93c0dlbmVyaWNTdHJlYW1pbmcgYTsKLSAgRVhQRUNUX0VRKCJBbGxvd3NHZW5lcmljU3RyZWFtaW5nIiwgUHJpbnQoYSkpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyBhIHRlbXBsYXRlIHR5cGUgdGhhdCBzdXBwb3J0cyBnZW5lcmljIHN0cmVhbWluZy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGUge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyVHJhaXRzLCB0eXBlbmFtZSBUPgotc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAotICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsCi0gICAgY29uc3QgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlPFQ+JiAvKiBhICovKSB7Ci0gIHJldHVybiBvcyA8PCAiQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlIjsKLX0KLQotVEVTVChQcmludFR5cGVXaXRoR2VuZXJpY1N0cmVhbWluZ1Rlc3QsIFRlbXBsYXRlVHlwZSkgewotICBBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGU8aW50PiBhOwotICBFWFBFQ1RfRVEoIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZSIsIFByaW50KGEpKTsKLX0KLQotLy8gVGVzdHMgcHJpbnRpbmcgYSB0eXBlIHRoYXQgc3VwcG9ydHMgZ2VuZXJpYyBzdHJlYW1pbmcgYW5kIGNhbiBiZQotLy8gaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYW5vdGhlciBwcmludGFibGUgdHlwZS4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGUgewotIHB1YmxpYzoKLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KLXN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKLSAgICBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLAotICAgIGNvbnN0IEFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZTxUPiYgLyogYSAqLykgewotICByZXR1cm4gb3MgPDwgIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZSI7Ci19Ci0KLVRFU1QoUHJpbnRUeXBlV2l0aEdlbmVyaWNTdHJlYW1pbmdUZXN0LCBUeXBlSW1wbGljaXRseUNvbnZlcnRpYmxlKSB7Ci0gIEFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZTxpbnQ+IGE7Ci0gIEVYUEVDVF9FUSgiQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlIiwgUHJpbnQoYSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KLQotLy8gVGVzdHMgcHJpbnRpbmcgU3RyaW5nUGllY2UuCi0KLVRFU1QoUHJpbnRTdHJpbmdQaWVjZVRlc3QsIFNpbXBsZVN0cmluZ1BpZWNlKSB7Ci0gIGNvbnN0IFN0cmluZ1BpZWNlIHNwID0gIkhlbGxvIjsKLSAgRVhQRUNUX0VRKCJcIkhlbGxvXCIiLCBQcmludChzcCkpOwotfQotCi1URVNUKFByaW50U3RyaW5nUGllY2VUZXN0LCBVbnByaW50YWJsZUNoYXJhY3RlcnMpIHsKLSAgY29uc3QgY2hhciBzdHJbXSA9ICJOVUwgKFwwKSBhbmQgXHJcdCI7Ci0gIGNvbnN0IFN0cmluZ1BpZWNlIHNwKHN0ciwgc2l6ZW9mKHN0cikgLSAxKTsKLSAgRVhQRUNUX0VRKCJcIk5VTCAoXFwwKSBhbmQgXFxyXFx0XCIiLCBQcmludChzcCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCi0KLS8vIFRlc3RzIHByaW50aW5nIFNUTCBjb250YWluZXJzLgotCi1URVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgRW1wdHlEZXF1ZSkgewotICBkZXF1ZTxjaGFyPiBlbXB0eTsKLSAgRVhQRUNUX0VRKCJ7fSIsIFByaW50KGVtcHR5KSk7Ci19Ci0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBOb25FbXB0eURlcXVlKSB7Ci0gIGRlcXVlPGludD4gbm9uX2VtcHR5OwotICBub25fZW1wdHkucHVzaF9iYWNrKDEpOwotICBub25fZW1wdHkucHVzaF9iYWNrKDMpOwotICBFWFBFQ1RfRVEoInsgMSwgMyB9IiwgUHJpbnQobm9uX2VtcHR5KSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfSEFTSF9NQVBfCi0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBPbmVFbGVtZW50SGFzaE1hcCkgewotICBoYXNoX21hcDxpbnQsIGNoYXI+IG1hcDE7Ci0gIG1hcDFbMV0gPSAnYSc7Ci0gIEVYUEVDVF9FUSgieyAoMSwgJ2EnICg5NywgMHg2MSkpIH0iLCBQcmludChtYXAxKSk7Ci19Ci0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBIYXNoTXVsdGlNYXApIHsKLSAgaGFzaF9tdWx0aW1hcDxpbnQsIGJvb2w+IG1hcDE7Ci0gIG1hcDEuaW5zZXJ0KG1ha2VfcGFpcig1LCB0cnVlKSk7Ci0gIG1hcDEuaW5zZXJ0KG1ha2VfcGFpcig1LCBmYWxzZSkpOwotCi0gIC8vIEVsZW1lbnRzIG9mIGhhc2hfbXVsdGltYXAgY2FuIGJlIHByaW50ZWQgaW4gYW55IG9yZGVyLgotICBjb25zdCBzdHJpbmcgcmVzdWx0ID0gUHJpbnQobWFwMSk7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdCA9PSAieyAoNSwgdHJ1ZSksICg1LCBmYWxzZSkgfSIgfHwKLSAgICAgICAgICAgICAgcmVzdWx0ID09ICJ7ICg1LCBmYWxzZSksICg1LCB0cnVlKSB9IikKLSAgICAgICAgICAgICAgICAgIDw8ICIgd2hlcmUgUHJpbnQobWFwMSkgcmV0dXJucyBcIiIgPDwgcmVzdWx0IDw8ICJcIi4iOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19IQVNIX01BUF8KLQotI2lmIEdURVNUX0hBU19IQVNIX1NFVF8KLQotVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEhhc2hTZXQpIHsKLSAgaGFzaF9zZXQ8c3RyaW5nPiBzZXQxOwotICBzZXQxLmluc2VydCgiaGVsbG8iKTsKLSAgRVhQRUNUX0VRKCJ7IFwiaGVsbG9cIiB9IiwgUHJpbnQoc2V0MSkpOwotfQotCi1URVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgSGFzaE11bHRpU2V0KSB7Ci0gIGNvbnN0IGludCBrU2l6ZSA9IDU7Ci0gIGludCBhW2tTaXplXSA9IHsgMSwgMSwgMiwgNSwgMSB9OwotICBoYXNoX211bHRpc2V0PGludD4gc2V0MShhLCBhICsga1NpemUpOwotCi0gIC8vIEVsZW1lbnRzIG9mIGhhc2hfbXVsdGlzZXQgY2FuIGJlIHByaW50ZWQgaW4gYW55IG9yZGVyLgotICBjb25zdCBzdHJpbmcgcmVzdWx0ID0gUHJpbnQoc2V0MSk7Ci0gIGNvbnN0IHN0cmluZyBleHBlY3RlZF9wYXR0ZXJuID0gInsgZCwgZCwgZCwgZCwgZCB9IjsgIC8vIGQgbWVhbnMgYSBkaWdpdC4KLQotICAvLyBWZXJpZmllcyB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIHBhdHRlcm47IGFsc28gZXh0cmFjdHMKLSAgLy8gdGhlIG51bWJlcnMgaW4gdGhlIHJlc3VsdC4KLSAgQVNTRVJUX0VRKGV4cGVjdGVkX3BhdHRlcm4ubGVuZ3RoKCksIHJlc3VsdC5sZW5ndGgoKSk7Ci0gIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gcmVzdWx0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICBpZiAoZXhwZWN0ZWRfcGF0dGVybltpXSA9PSAnZCcpIHsKLSAgICAgIEFTU0VSVF9ORShpc2RpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJlc3VsdFtpXSkpLCAwKTsKLSAgICAgIG51bWJlcnMucHVzaF9iYWNrKHJlc3VsdFtpXSAtICcwJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9FUShleHBlY3RlZF9wYXR0ZXJuW2ldLCByZXN1bHRbaV0pIDw8ICIgd2hlcmUgcmVzdWx0IGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICAvLyBNYWtlcyBzdXJlIHRoZSByZXN1bHQgY29udGFpbnMgdGhlIHJpZ2h0IG51bWJlcnMuCi0gIHN0ZDo6c29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOwotICBzdGQ6OnNvcnQoYSwgYSArIGtTaXplKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChhLCBhICsga1NpemUsIG51bWJlcnMuYmVnaW4oKSkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19IQVNIX1NFVF8KLQotVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIExpc3QpIHsKLSAgY29uc3Qgc3RyaW5nIGFbXSA9IHsKLSAgICAiaGVsbG8iLAotICAgICJ3b3JsZCIKLSAgfTsKLSAgY29uc3QgbGlzdDxzdHJpbmc+IHN0cmluZ3MoYSwgYSArIDIpOwotICBFWFBFQ1RfRVEoInsgXCJoZWxsb1wiLCBcIndvcmxkXCIgfSIsIFByaW50KHN0cmluZ3MpKTsKLX0KLQotVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE1hcCkgewotICBtYXA8aW50LCBib29sPiBtYXAxOwotICBtYXAxWzFdID0gdHJ1ZTsKLSAgbWFwMVs1XSA9IGZhbHNlOwotICBtYXAxWzNdID0gdHJ1ZTsKLSAgRVhQRUNUX0VRKCJ7ICgxLCB0cnVlKSwgKDMsIHRydWUpLCAoNSwgZmFsc2UpIH0iLCBQcmludChtYXAxKSk7Ci19Ci0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBNdWx0aU1hcCkgewotICBtdWx0aW1hcDxib29sLCBpbnQ+IG1hcDE7Ci0gIC8vIFRoZSBtYWtlX3BhaXIgdGVtcGxhdGUgZnVuY3Rpb24gd291bGQgZGVkdWNlIHRoZSB0eXBlIGFzCi0gIC8vIHBhaXI8Ym9vbCwgaW50PiBoZXJlLCBhbmQgc2luY2UgdGhlIGtleSBwYXJ0IGluIGEgbXVsdGltYXAgaGFzIHRvCi0gIC8vIGJlIGNvbnN0YW50LCB3aXRob3V0IGEgdGVtcGxhdGVkIGN0b3IgaW4gdGhlIHBhaXIgY2xhc3MgKGFzIGluCi0gIC8vIGxpYkNzdGQgb24gU29sYXJpcyksIG1ha2VfcGFpciBjYWxsIHdvdWxkIGZhaWwgdG8gY29tcGlsZSBhcyBubwotICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGZvdW5kLiAgVGh1cyBleHBsaWNpdCB0eXBlbmFtZSBpcyB1c2VkCi0gIC8vIGhlcmUgaW5zdGVhZC4KLSAgbWFwMS5pbnNlcnQocGFpcjxjb25zdCBib29sLCBpbnQ+KHRydWUsIDApKTsKLSAgbWFwMS5pbnNlcnQocGFpcjxjb25zdCBib29sLCBpbnQ+KHRydWUsIDEpKTsKLSAgbWFwMS5pbnNlcnQocGFpcjxjb25zdCBib29sLCBpbnQ+KGZhbHNlLCAyKSk7Ci0gIEVYUEVDVF9FUSgieyAoZmFsc2UsIDIpLCAodHJ1ZSwgMCksICh0cnVlLCAxKSB9IiwgUHJpbnQobWFwMSkpOwotfQotCi1URVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgU2V0KSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBhW10gPSB7IDMsIDAsIDUgfTsKLSAgc2V0PHVuc2lnbmVkIGludD4gc2V0MShhLCBhICsgMyk7Ci0gIEVYUEVDVF9FUSgieyAwLCAzLCA1IH0iLCBQcmludChzZXQxKSk7Ci19Ci0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBNdWx0aVNldCkgewotICBjb25zdCBpbnQgYVtdID0geyAxLCAxLCAyLCA1LCAxIH07Ci0gIG11bHRpc2V0PGludD4gc2V0MShhLCBhICsgNSk7Ci0gIEVYUEVDVF9FUSgieyAxLCAxLCAxLCAyLCA1IH0iLCBQcmludChzZXQxKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZPUldBUkRfTElTVF8KLS8vIDxzbGlzdD4gaXMgYXZhaWxhYmxlIG9uIExpbnV4IGluIHRoZSBnb29nbGUzIG1vZGUsIGJ1dCBub3Qgb24KLS8vIFdpbmRvd3Mgb3IgTWFjIE9TIFguCi0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBTaW5nbHlMaW5rZWRMaXN0KSB7Ci0gIGludCBhW10gPSB7IDksIDIsIDggfTsKLSAgY29uc3Qgc3RkOjpmb3J3YXJkX2xpc3Q8aW50PiBpbnRzKGEsIGEgKyAzKTsKLSAgRVhQRUNUX0VRKCJ7IDksIDIsIDggfSIsIFByaW50KGludHMpKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GT1JXQVJEX0xJU1RfCi0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBQYWlyKSB7Ci0gIHBhaXI8Y29uc3QgYm9vbCwgaW50PiBwKHRydWUsIDUpOwotICBFWFBFQ1RfRVEoIih0cnVlLCA1KSIsIFByaW50KHApKTsKLX0KLQotVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFZlY3RvcikgewotICB2ZWN0b3I8aW50PiB2OwotICB2LnB1c2hfYmFjaygxKTsKLSAgdi5wdXNoX2JhY2soMik7Ci0gIEVYUEVDVF9FUSgieyAxLCAyIH0iLCBQcmludCh2KSk7Ci19Ci0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBMb25nU2VxdWVuY2UpIHsKLSAgY29uc3QgaW50IGFbMTAwXSA9IHsgMSwgMiwgMyB9OwotICBjb25zdCB2ZWN0b3I8aW50PiB2KGEsIGEgKyAxMDApOwotICBFWFBFQ1RfRVEoInsgMSwgMiwgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIgotICAgICAgICAgICAgIjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC4uLiB9IiwgUHJpbnQodikpOwotfQotCi1URVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTmVzdGVkQ29udGFpbmVyKSB7Ci0gIGNvbnN0IGludCBhMVtdID0geyAxLCAyIH07Ci0gIGNvbnN0IGludCBhMltdID0geyAzLCA0LCA1IH07Ci0gIGNvbnN0IGxpc3Q8aW50PiBsMShhMSwgYTEgKyAyKTsKLSAgY29uc3QgbGlzdDxpbnQ+IGwyKGEyLCBhMiArIDMpOwotCi0gIHZlY3RvcjxsaXN0PGludD4gPiB2OwotICB2LnB1c2hfYmFjayhsMSk7Ci0gIHYucHVzaF9iYWNrKGwyKTsKLSAgRVhQRUNUX0VRKCJ7IHsgMSwgMiB9LCB7IDMsIDQsIDUgfSB9IiwgUHJpbnQodikpOwotfQotCi1URVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgT25lRGltZW5zaW9uYWxOYXRpdmVBcnJheSkgewotICBjb25zdCBpbnQgYVszXSA9IHsgMSwgMiwgMyB9OwotICBOYXRpdmVBcnJheTxpbnQ+IGIoYSwgMywgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpKTsKLSAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMgfSIsIFByaW50KGIpKTsKLX0KLQotVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFR3b0RpbWVuc2lvbmFsTmF0aXZlQXJyYXkpIHsKLSAgY29uc3QgaW50IGFbMl1bM10gPSB7IHsgMSwgMiwgMyB9LCB7IDQsIDUsIDYgfSB9OwotICBOYXRpdmVBcnJheTxpbnRbM10+IGIoYSwgMiwgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpKTsKLSAgRVhQRUNUX0VRKCJ7IHsgMSwgMiwgMyB9LCB7IDQsIDUsIDYgfSB9IiwgUHJpbnQoYikpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgY2xhc3MgbmFtZWQgaXRlcmF0b3IgaXNuJ3QgdHJlYXRlZCBhcyBhIGNvbnRhaW5lci4KLQotc3RydWN0IGl0ZXJhdG9yIHsKLSAgY2hhciB4OwotfTsKLQotVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEl0ZXJhdG9yKSB7Ci0gIGl0ZXJhdG9yIGl0ID0ge307Ci0gIEVYUEVDVF9FUSgiMS1ieXRlIG9iamVjdCA8MDA+IiwgUHJpbnQoaXQpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIGNsYXNzIG5hbWVkIGNvbnN0X2l0ZXJhdG9yIGlzbid0IHRyZWF0ZWQgYXMgYSBjb250YWluZXIuCi0KLXN0cnVjdCBjb25zdF9pdGVyYXRvciB7Ci0gIGNoYXIgeDsKLX07Ci0KLVRFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBDb25zdEl0ZXJhdG9yKSB7Ci0gIGNvbnN0X2l0ZXJhdG9yIGl0ID0ge307Ci0gIEVYUEVDVF9FUSgiMS1ieXRlIG9iamVjdCA8MDA+IiwgUHJpbnQoaXQpKTsKLX0KLQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKLS8vIFRlc3RzIHByaW50aW5nIDo6c3RkOjp0cjE6OnR1cGxlcy4KLQotLy8gVHVwbGVzIG9mIHZhcmlvdXMgYXJpdGllcy4KLVRFU1QoUHJpbnRUcjFUdXBsZVRlc3QsIFZhcmlvdXNTaXplcykgewotICA6OnN0ZDo6dHIxOjp0dXBsZTw+IHQwOwotICBFWFBFQ1RfRVEoIigpIiwgUHJpbnQodDApKTsKLQotICA6OnN0ZDo6dHIxOjp0dXBsZTxpbnQ+IHQxKDUpOwotICBFWFBFQ1RfRVEoIig1KSIsIFByaW50KHQxKSk7Ci0KLSAgOjpzdGQ6OnRyMTo6dHVwbGU8Y2hhciwgYm9vbD4gdDIoJ2EnLCB0cnVlKTsKLSAgRVhQRUNUX0VRKCIoJ2EnICg5NywgMHg2MSksIHRydWUpIiwgUHJpbnQodDIpKTsKLQotICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQsIGludD4gdDMoZmFsc2UsIDIsIDMpOwotICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMykiLCBQcmludCh0MykpOwotCi0gIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQ+IHQ0KGZhbHNlLCAyLCAzLCA0KTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQpIiwgUHJpbnQodDQpKTsKLQotICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sPiB0NShmYWxzZSwgMiwgMywgNCwgdHJ1ZSk7Ci0gIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlKSIsIFByaW50KHQ1KSk7Ci0KLSAgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50PiB0NihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNik7Ci0gIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2KSIsIFByaW50KHQ2KSk7Ci0KLSAgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50LCBpbnQ+IHQ3KAotICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcpOwotICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNykiLCBQcmludCh0NykpOwotCi0gIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50LCBib29sPiB0OCgKLSAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlKTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUpIiwgUHJpbnQodDgpKTsKLQotICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQsIGludCwgYm9vbCwgaW50PiB0OSgKLSAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlLCA5KTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUsIDkpIiwgUHJpbnQodDkpKTsKLQotICBjb25zdCBjaGFyKiBjb25zdCBzdHIgPSAiOCI7Ci0gIC8vIFZDKysgMjAxMCdzIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlIG9mIEMrKzB4IGlzIGRlZmljaWVudCwgcmVxdWlyaW5nCi0gIC8vIGFuIGV4cGxpY2l0IHR5cGUgY2FzdCBvZiBOVUxMIHRvIGJlIHVzZWQuCi0gIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGNoYXIsIHNob3J0LCB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIsICAvLyBOT0xJTlQKLSAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2NCwgZmxvYXQsIGRvdWJsZSwgY29uc3QgY2hhciosIHZvaWQqLCBzdHJpbmc+Ci0gICAgICB0MTAoZmFsc2UsICdhJywgMywgNCwgNSwgMS41RiwgLTIuNSwgc3RyLAotICAgICAgICAgIEltcGxpY2l0Q2FzdF88dm9pZCo+KE5VTEwpLCAiMTAiKTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsICdhJyAoOTcsIDB4NjEpLCAzLCA0LCA1LCAxLjUsIC0yLjUsICIgKyBQcmludFBvaW50ZXIoc3RyKSArCi0gICAgICAgICAgICAiIHBvaW50aW5nIHRvIFwiOFwiLCBOVUxMLCBcIjEwXCIpIiwKLSAgICAgICAgICAgIFByaW50KHQxMCkpOwotfQotCi0vLyBOZXN0ZWQgdHVwbGVzLgotVEVTVChQcmludFRyMVR1cGxlVGVzdCwgTmVzdGVkVHVwbGUpIHsKLSAgOjpzdGQ6OnRyMTo6dHVwbGU8IDo6c3RkOjp0cjE6OnR1cGxlPGludCwgYm9vbD4sIGNoYXI+IG5lc3RlZCgKLSAgICAgIDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUoNSwgdHJ1ZSksICdhJyk7Ci0gIEVYUEVDVF9FUSgiKCg1LCB0cnVlKSwgJ2EnICg5NywgMHg2MSkpIiwgUHJpbnQobmVzdGVkKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQotCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLS8vIFRlc3RzIHByaW50aW5nIDo6c3RkOjp0dXBsZXMuCi0KLS8vIFR1cGxlcyBvZiB2YXJpb3VzIGFyaXRpZXMuCi1URVNUKFByaW50U3RkVHVwbGVUZXN0LCBWYXJpb3VzU2l6ZXMpIHsKLSAgOjpzdGQ6OnR1cGxlPD4gdDA7Ci0gIEVYUEVDVF9FUSgiKCkiLCBQcmludCh0MCkpOwotCi0gIDo6c3RkOjp0dXBsZTxpbnQ+IHQxKDUpOwotICBFWFBFQ1RfRVEoIig1KSIsIFByaW50KHQxKSk7Ci0KLSAgOjpzdGQ6OnR1cGxlPGNoYXIsIGJvb2w+IHQyKCdhJywgdHJ1ZSk7Ci0gIEVYUEVDVF9FUSgiKCdhJyAoOTcsIDB4NjEpLCB0cnVlKSIsIFByaW50KHQyKSk7Ci0KLSAgOjpzdGQ6OnR1cGxlPGJvb2wsIGludCwgaW50PiB0MyhmYWxzZSwgMiwgMyk7Ci0gIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzKSIsIFByaW50KHQzKSk7Ci0KLSAgOjpzdGQ6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQ+IHQ0KGZhbHNlLCAyLCAzLCA0KTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQpIiwgUHJpbnQodDQpKTsKLQotICA6OnN0ZDo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbD4gdDUoZmFsc2UsIDIsIDMsIDQsIHRydWUpOwotICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSkiLCBQcmludCh0NSkpOwotCi0gIDo6c3RkOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQ+IHQ2KGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2KTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYpIiwgUHJpbnQodDYpKTsKLQotICA6OnN0ZDo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50LCBpbnQ+IHQ3KAotICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcpOwotICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNykiLCBQcmludCh0NykpOwotCi0gIDo6c3RkOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQsIGludCwgYm9vbD4gdDgoCi0gICAgICBmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSk7Ci0gIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlKSIsIFByaW50KHQ4KSk7Ci0KLSAgOjpzdGQ6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50LCBib29sLCBpbnQ+IHQ5KAotICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUsIDkpOwotICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSwgOSkiLCBQcmludCh0OSkpOwotCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICI4IjsKLSAgLy8gVkMrKyAyMDEwJ3MgaW1wbGVtZW50YXRpb24gb2YgdHVwbGUgb2YgQysrMHggaXMgZGVmaWNpZW50LCByZXF1aXJpbmcKLSAgLy8gYW4gZXhwbGljaXQgdHlwZSBjYXN0IG9mIE5VTEwgdG8gYmUgdXNlZC4KLSAgOjpzdGQ6OnR1cGxlPGJvb2wsIGNoYXIsIHNob3J0LCB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIsICAvLyBOT0xJTlQKLSAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2NCwgZmxvYXQsIGRvdWJsZSwgY29uc3QgY2hhciosIHZvaWQqLCBzdHJpbmc+Ci0gICAgICB0MTAoZmFsc2UsICdhJywgMywgNCwgNSwgMS41RiwgLTIuNSwgc3RyLAotICAgICAgICAgIEltcGxpY2l0Q2FzdF88dm9pZCo+KE5VTEwpLCAiMTAiKTsKLSAgRVhQRUNUX0VRKCIoZmFsc2UsICdhJyAoOTcsIDB4NjEpLCAzLCA0LCA1LCAxLjUsIC0yLjUsICIgKyBQcmludFBvaW50ZXIoc3RyKSArCi0gICAgICAgICAgICAiIHBvaW50aW5nIHRvIFwiOFwiLCBOVUxMLCBcIjEwXCIpIiwKLSAgICAgICAgICAgIFByaW50KHQxMCkpOwotfQotCi0vLyBOZXN0ZWQgdHVwbGVzLgotVEVTVChQcmludFN0ZFR1cGxlVGVzdCwgTmVzdGVkVHVwbGUpIHsKLSAgOjpzdGQ6OnR1cGxlPCA6OnN0ZDo6dHVwbGU8aW50LCBib29sPiwgY2hhcj4gbmVzdGVkKAotICAgICAgOjpzdGQ6Om1ha2VfdHVwbGUoNSwgdHJ1ZSksICdhJyk7Ci0gIEVYUEVDVF9FUSgiKCg1LCB0cnVlKSwgJ2EnICg5NywgMHg2MSkpIiwgUHJpbnQobmVzdGVkKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi0vLyBUZXN0cyBwcmludGluZyB1c2VyLWRlZmluZWQgdW5wcmludGFibGUgdHlwZXMuCi0KLS8vIFVucHJpbnRhYmxlIHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgotVEVTVChQcmludFVucHJpbnRhYmxlVHlwZVRlc3QsIEluR2xvYmFsTmFtZXNwYWNlKSB7Ci0gIEVYUEVDVF9FUSgiMS1ieXRlIG9iamVjdCA8MDA+IiwKLSAgICAgICAgICAgIFByaW50KFVucHJpbnRhYmxlVGVtcGxhdGVJbkdsb2JhbDxjaGFyPigpKSk7Ci19Ci0KLS8vIFVucHJpbnRhYmxlIHR5cGVzIGluIGEgdXNlciBuYW1lc3BhY2UuCi1URVNUKFByaW50VW5wcmludGFibGVUeXBlVGVzdCwgSW5Vc2VyTmFtZXNwYWNlKSB7Ci0gIEVYUEVDVF9FUSgiMTYtYnl0ZSBvYmplY3QgPEVGLTEyIDAwLTAwIDM0LUFCIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwPiIsCi0gICAgICAgICAgICBQcmludCg6OmZvbzo6VW5wcmludGFibGVJbkZvbygpKSk7Ci19Ci0KLS8vIFVucHJpbnRhYmxlIHR5cGVzIGFyZSB0aGF0IHRvbyBiaWcgdG8gYmUgcHJpbnRlZCBjb21wbGV0ZWx5LgotCi1zdHJ1Y3QgQmlnIHsKLSAgQmlnKCkgeyBtZW1zZXQoYXJyYXksIDAsIHNpemVvZihhcnJheSkpOyB9Ci0gIGNoYXIgYXJyYXlbMjU3XTsKLX07Ci0KLVRFU1QoUHJpbnRVbnByaXRhYmxlVHlwZVRlc3QsIEJpZ09iamVjdCkgewotICBFWFBFQ1RfRVEoIjI1Ny1ieXRlIG9iamVjdCA8MDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgotICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKLSAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCi0gICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgLi4uIDAwLTAwIDAwLTAwIDAwLTAwICIKLSAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCi0gICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgotICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwPiIsCi0gICAgICAgICAgICBQcmludChCaWcoKSkpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyB1c2VyLWRlZmluZWQgc3RyZWFtYWJsZSB0eXBlcy4KLQotLy8gU3RyZWFtYWJsZSB0eXBlcyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLVRFU1QoUHJpbnRTdHJlYW1hYmxlVHlwZVRlc3QsIEluR2xvYmFsTmFtZXNwYWNlKSB7Ci0gIFN0cmVhbWFibGVJbkdsb2JhbCB4OwotICBFWFBFQ1RfRVEoIlN0cmVhbWFibGVJbkdsb2JhbCIsIFByaW50KHgpKTsKLSAgRVhQRUNUX0VRKCJTdHJlYW1hYmxlSW5HbG9iYWwqIiwgUHJpbnQoJngpKTsKLX0KLQotLy8gUHJpbnRhYmxlIHRlbXBsYXRlIHR5cGVzIGluIGEgdXNlciBuYW1lc3BhY2UuCi1URVNUKFByaW50U3RyZWFtYWJsZVR5cGVUZXN0LCBUZW1wbGF0ZVR5cGVJblVzZXJOYW1lc3BhY2UpIHsKLSAgRVhQRUNUX0VRKCJTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzogMCIsCi0gICAgICAgICAgICBQcmludCg6OmZvbzo6U3RyZWFtYWJsZVRlbXBsYXRlSW5Gb288aW50PigpKSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGhhdmUgYSBQcmludFRvKCkgZnVuY3Rpb24uCi1URVNUKFByaW50UHJpbnRhYmxlVHlwZVRlc3QsIEluVXNlck5hbWVzcGFjZSkgewotICBFWFBFQ1RfRVEoIlByaW50YWJsZVZpYVByaW50VG86IDAiLAotICAgICAgICAgICAgUHJpbnQoOjpmb286OlByaW50YWJsZVZpYVByaW50VG8oKSkpOwotfQotCi0vLyBUZXN0cyBwcmludGluZyBhIHBvaW50ZXIgdG8gYSB1c2VyLWRlZmluZWQgdHlwZSB0aGF0IGhhcyBhIDw8Ci0vLyBvcGVyYXRvciBmb3IgaXRzIHBvaW50ZXIuCi1URVNUKFByaW50UHJpbnRhYmxlVHlwZVRlc3QsIFBvaW50ZXJJblVzZXJOYW1lc3BhY2UpIHsKLSAgOjpmb286OlBvaW50ZXJQcmludGFibGUgeDsKLSAgRVhQRUNUX0VRKCJQb2ludGVyUHJpbnRhYmxlKiIsIFByaW50KCZ4KSk7Ci19Ci0KLS8vIFRlc3RzIHByaW50aW5nIHVzZXItZGVmaW5lZCBjbGFzcyB0ZW1wbGF0ZSB0aGF0IGhhdmUgYSBQcmludFRvKCkgZnVuY3Rpb24uCi1URVNUKFByaW50UHJpbnRhYmxlVHlwZVRlc3QsIFRlbXBsYXRlSW5Vc2VyTmFtZXNwYWNlKSB7Ci0gIEVYUEVDVF9FUSgiUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlOiA1IiwKLSAgICAgICAgICAgIFByaW50KDo6Zm9vOjpQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU8aW50Pig1KSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYm90aCB0aGUgYWRkcmVzcyBhbmQgdGhlCi0vLyB2YWx1ZSBvZiBhIHJlZmVyZW5jZS4KLVRFU1QoUHJpbnRSZWZlcmVuY2VUZXN0LCBQcmludHNBZGRyZXNzQW5kVmFsdWUpIHsKLSAgaW50IG4gPSA1OwotICBFWFBFQ1RfRVEoIkAiICsgUHJpbnRQb2ludGVyKCZuKSArICIgNSIsIFByaW50QnlSZWYobikpOwotCi0gIGludCBhWzJdWzNdID0gewotICAgIHsgMCwgMSwgMiB9LAotICAgIHsgMywgNCwgNSB9Ci0gIH07Ci0gIEVYUEVDVF9FUSgiQCIgKyBQcmludFBvaW50ZXIoYSkgKyAiIHsgeyAwLCAxLCAyIH0sIHsgMywgNCwgNSB9IH0iLAotICAgICAgICAgICAgUHJpbnRCeVJlZihhKSk7Ci0KLSAgY29uc3QgOjpmb286OlVucHJpbnRhYmxlSW5Gb28geDsKLSAgRVhQRUNUX0VRKCJAIiArIFByaW50UG9pbnRlcigmeCkgKyAiIDE2LWJ5dGUgb2JqZWN0ICIKLSAgICAgICAgICAgICI8RUYtMTIgMDAtMDAgMzQtQUIgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDA+IiwKLSAgICAgICAgICAgIFByaW50QnlSZWYoeCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYSBmdW5jdGlvbiBwb2ludGVyIHBhc3NlZCBieQotLy8gcmVmZXJlbmNlLgotVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIEhhbmRsZXNGdW5jdGlvblBvaW50ZXIpIHsKLSAgdm9pZCAoKmZwKShpbnQgbikgPSAmTXlGdW5jdGlvbjsKLSAgY29uc3Qgc3RyaW5nIGZwX3BvaW50ZXJfc3RyaW5nID0KLSAgICAgIFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmZnApKTsKLSAgLy8gV2UgY2Fubm90IGRpcmVjdGx5IGNhc3QgJk15RnVuY3Rpb24gdG8gY29uc3Qgdm9pZCogYmVjYXVzZSB0aGUKLSAgLy8gc3RhbmRhcmQgZGlzYWxsb3dzIGNhc3RpbmcgYmV0d2VlbiBwb2ludGVycyB0byBmdW5jdGlvbnMgYW5kCi0gIC8vIHBvaW50ZXJzIHRvIG9iamVjdHMsIGFuZCBzb21lIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40KSBlbmZvcmNlCi0gIC8vIHRoaXMgbGltaXRhdGlvbi4KLSAgY29uc3Qgc3RyaW5nIGZwX3N0cmluZyA9IFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OkJpZ2dlc3RJbnQ+KGZwKSkpOwotICBFWFBFQ1RfRVEoIkAiICsgZnBfcG9pbnRlcl9zdHJpbmcgKyAiICIgKyBmcF9zdHJpbmcsCi0gICAgICAgICAgICBQcmludEJ5UmVmKGZwKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBhIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyCi0vLyBwYXNzZWQgYnkgcmVmZXJlbmNlLgotVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIEhhbmRsZXNNZW1iZXJGdW5jdGlvblBvaW50ZXIpIHsKLSAgaW50IChGb286OipwKShjaGFyIGNoKSA9ICZGb286Ok15TWV0aG9kOwotICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoCi0gICAgICBQcmludEJ5UmVmKHApLAotICAgICAgIkAiICsgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZwKSkgKyAiICIgKwotICAgICAgICAgIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKLQotICBjaGFyIChGb286OipwMikoaW50IG4pID0gJkZvbzo6TXlWaXJ0dWFsTWV0aG9kOwotICBFWFBFQ1RfVFJVRShIYXNQcmVmaXgoCi0gICAgICBQcmludEJ5UmVmKHAyKSwKLSAgICAgICJAIiArIFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmcDIpKSArICIgIiArCi0gICAgICAgICAgUHJpbnQoc2l6ZW9mKHAyKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgdW5pdmVyc2FsIHByaW50ZXIgcHJpbnRzIGEgbWVtYmVyIHZhcmlhYmxlIHBvaW50ZXIKLS8vIHBhc3NlZCBieSByZWZlcmVuY2UuCi1URVNUKFByaW50UmVmZXJlbmNlVGVzdCwgSGFuZGxlc01lbWJlclZhcmlhYmxlUG9pbnRlcikgewotICBpbnQgKEZvbzo6KnApID0gJkZvbzo6dmFsdWU7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KAotICAgICAgUHJpbnRCeVJlZihwKSwKLSAgICAgICJAIiArIFByaW50UG9pbnRlcigmcCkgKyAiICIgKyBQcmludChzaXplb2YocCkpICsgIi1ieXRlIG9iamVjdCAiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKCksIHdoaWNoIGlzIHVzZWQgdG8gcHJpbnQKLS8vIGFuIG9wZXJhbmQgaW4gYSBjb21wYXJpc29uIGFzc2VydGlvbiAoZS5nLiBBU1NFUlRfRVEpIHdoZW4gdGhlIGFzc2VydGlvbgotLy8gZmFpbHMsIGZvcm1hdHMgdGhlIG9wZXJhbmQgaW4gdGhlIGRlc2lyZWQgd2F5LgotCi0vLyBzY2FsYXIKLVRFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JTY2FsYXIpIHsKLSAgRVhQRUNUX1NUUkVRKCIxMjMiLAotICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKDEyMywgMTI0KS5jX3N0cigpKTsKLX0KLQotLy8gbm9uLWNoYXIgcG9pbnRlcgotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0Zvck5vbkNoYXJQb2ludGVyKSB7Ci0gIGludCBuID0gMDsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcigmbiksCi0gICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoJm4sICZuKS5jX3N0cigpKTsKLX0KLQotLy8gbm9uLWNoYXIgYXJyYXkKLVRFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgRm9ybWF0c05vbkNoYXJBcnJheUFzUG9pbnRlcikgewotICAvLyBJbiBleHByZXNzaW9uICdhcnJheSA9PSB4JywgJ2FycmF5JyBpcyBjb21wYXJlZCBieSBwb2ludGVyLgotICAvLyBUaGVyZWZvcmUgd2Ugd2FudCB0byBwcmludCBhbiBhcnJheSBvcGVyYW5kIGFzIGEgcG9pbnRlci4KLSAgaW50IG5bXSA9IHsgMSwgMiwgMyB9OwotICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKG4pLAotICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKG4sIG4pLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyBmb3JtYXR0aW5nIGEgY2hhciBwb2ludGVyIHdoZW4gaXQncyBjb21wYXJlZCB3aXRoIGFub3RoZXIgcG9pbnRlci4KLS8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IGl0IGFzIGEgcmF3IHBvaW50ZXIsIGFzIHRoZSBjb21wYXJpc2lvbiBpcyBieQotLy8gcG9pbnRlci4KLQotLy8gY2hhciBwb2ludGVyIHZzIHBvaW50ZXIKLVRFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyUG9pbnRlclZzUG9pbnRlcikgewotICAvLyBJbiBleHByZXNzaW9uICdwID09IHgnLCB3aGVyZSAncCcgYW5kICd4JyBhcmUgKGNvbnN0IG9yIG5vdCkgY2hhcgotICAvLyBwb2ludGVycywgdGhlIG9wZXJhbmRzIGFyZSBjb21wYXJlZCBieSBwb2ludGVyLiAgVGhlcmVmb3JlIHdlCi0gIC8vIHdhbnQgdG8gcHJpbnQgJ3AnIGFzIGEgcG9pbnRlciBpbnN0ZWFkIG9mIGEgQyBzdHJpbmcgKHdlIGRvbid0Ci0gIC8vIGV2ZW4ga25vdyBpZiBpdCdzIHN1cHBvc2VkIHRvIHBvaW50IHRvIGEgdmFsaWQgQyBzdHJpbmcpLgotCi0gIC8vIGNvbnN0IGNoYXIqCi0gIGNvbnN0IGNoYXIqIHMgPSAiaGVsbG8iOwotICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMpLAotICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIHMpLmNfc3RyKCkpOwotCi0gIC8vIGNoYXIqCi0gIGNoYXIgY2ggPSAnYSc7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIoJmNoKSwKLSAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgmY2gsICZjaCkuY19zdHIoKSk7Ci19Ci0KLS8vIHdjaGFyX3QgcG9pbnRlciB2cyBwb2ludGVyCi1URVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJQb2ludGVyVnNQb2ludGVyKSB7Ci0gIC8vIEluIGV4cHJlc3Npb24gJ3AgPT0geCcsIHdoZXJlICdwJyBhbmQgJ3gnIGFyZSAoY29uc3Qgb3Igbm90KSBjaGFyCi0gIC8vIHBvaW50ZXJzLCB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkIGJ5IHBvaW50ZXIuICBUaGVyZWZvcmUgd2UKLSAgLy8gd2FudCB0byBwcmludCAncCcgYXMgYSBwb2ludGVyIGluc3RlYWQgb2YgYSB3aWRlIEMgc3RyaW5nICh3ZSBkb24ndAotICAvLyBldmVuIGtub3cgaWYgaXQncyBzdXBwb3NlZCB0byBwb2ludCB0byBhIHZhbGlkIHdpZGUgQyBzdHJpbmcpLgotCi0gIC8vIGNvbnN0IHdjaGFyX3QqCi0gIGNvbnN0IHdjaGFyX3QqIHMgPSBMImhlbGxvIjsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzKSwKLSAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCBzKS5jX3N0cigpKTsKLQotICAvLyB3Y2hhcl90KgotICB3Y2hhcl90IGNoID0gTCdhJzsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcigmY2gpLAotICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKCZjaCwgJmNoKS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgZm9ybWF0dGluZyBhIGNoYXIgcG9pbnRlciB3aGVuIGl0J3MgY29tcGFyZWQgdG8gYSBzdHJpbmcgb2JqZWN0LgotLy8gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcHJpbnQgdGhlIGNoYXIgcG9pbnRlciBhcyBhIEMgc3RyaW5nLgotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLS8vIGNoYXIgcG9pbnRlciB2cyA6OnN0cmluZwotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJQb2ludGVyVnNTdHJpbmcpIHsKLSAgY29uc3QgY2hhciogcyA9ICJoZWxsbyBcIndvcmxkIjsKLSAgRVhQRUNUX1NUUkVRKCJcImhlbGxvIFxcXCJ3b3JsZFwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KLSAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCA6OnN0cmluZygpKS5jX3N0cigpKTsKLQotICAvLyBjaGFyKgotICBjaGFyIHN0cltdID0gImhpXDEiOwotICBjaGFyKiBwID0gc3RyOwotICBFWFBFQ1RfU1RSRVEoIlwiaGlcXHgxXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgotICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHAsIDo6c3RyaW5nKCkpLmNfc3RyKCkpOwotfQotI2VuZGlmCi0KLS8vIGNoYXIgcG9pbnRlciB2cyBzdGQ6OnN0cmluZwotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJQb2ludGVyVnNTdGRTdHJpbmcpIHsKLSAgY29uc3QgY2hhciogcyA9ICJoZWxsbyBcIndvcmxkIjsKLSAgRVhQRUNUX1NUUkVRKCJcImhlbGxvIFxcXCJ3b3JsZFwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KLSAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCA6OnN0ZDo6c3RyaW5nKCkpLmNfc3RyKCkpOwotCi0gIC8vIGNoYXIqCi0gIGNoYXIgc3RyW10gPSAiaGlcMSI7Ci0gIGNoYXIqIHAgPSBzdHI7Ci0gIEVYUEVDVF9TVFJFUSgiXCJoaVxceDFcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCi0gICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocCwgOjpzdGQ6OnN0cmluZygpKS5jX3N0cigpKTsKLX0KLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotLy8gd2NoYXJfdCBwb2ludGVyIHZzIDo6d3N0cmluZwotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyUG9pbnRlclZzV1N0cmluZykgewotICBjb25zdCB3Y2hhcl90KiBzID0gTCJoaSBcIndvcmxkIjsKLSAgRVhQRUNUX1NUUkVRKCJMXCJoaSBcXFwid29ybGRcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCi0gICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgOjp3c3RyaW5nKCkpLmNfc3RyKCkpOwotCi0gIC8vIHdjaGFyX3QqCi0gIHdjaGFyX3Qgc3RyW10gPSBMImhpXDEiOwotICB3Y2hhcl90KiBwID0gc3RyOwotICBFWFBFQ1RfU1RSRVEoIkxcImhpXFx4MVwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KLSAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShwLCA6OndzdHJpbmcoKSkuY19zdHIoKSk7Ci19Ci0jZW5kaWYKLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotLy8gd2NoYXJfdCBwb2ludGVyIHZzIHN0ZDo6d3N0cmluZwotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyUG9pbnRlclZzU3RkV1N0cmluZykgewotICBjb25zdCB3Y2hhcl90KiBzID0gTCJoaSBcIndvcmxkIjsKLSAgRVhQRUNUX1NUUkVRKCJMXCJoaSBcXFwid29ybGRcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCi0gICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgOjpzdGQ6OndzdHJpbmcoKSkuY19zdHIoKSk7Ci0KLSAgLy8gd2NoYXJfdCoKLSAgd2NoYXJfdCBzdHJbXSA9IEwiaGlcMSI7Ci0gIHdjaGFyX3QqIHAgPSBzdHI7Ci0gIEVYUEVDVF9TVFJFUSgiTFwiaGlcXHgxXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgotICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHAsIDo6c3RkOjp3c3RyaW5nKCkpLmNfc3RyKCkpOwotfQotI2VuZGlmCi0KLS8vIFRlc3RzIGZvcm1hdHRpbmcgYSBjaGFyIGFycmF5IHdoZW4gaXQncyBjb21wYXJlZCB3aXRoIGEgcG9pbnRlciBvciBhcnJheS4KLS8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IHRoZSBhcnJheSBhcyBhIHJvdyBwb2ludGVyLCBhcyB0aGUgY29tcGFyaXNvbgotLy8gaXMgYnkgcG9pbnRlci4KLQotLy8gY2hhciBhcnJheSB2cyBwb2ludGVyCi1URVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNQb2ludGVyKSB7Ci0gIGNoYXIgc3RyW10gPSAiaGkgXCJ3b3JsZFwiIjsKLSAgY2hhciogcCA9IE5VTEw7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKLSAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHApLmNfc3RyKCkpOwotfQotCi0vLyBjaGFyIGFycmF5IHZzIGNoYXIgYXJyYXkKLVRFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyQXJyYXlWc0NoYXJBcnJheSkgewotICBjb25zdCBjaGFyIHN0cltdID0gImhpIFwid29ybGRcIiI7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKLSAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHN0cikuY19zdHIoKSk7Ci19Ci0KLS8vIHdjaGFyX3QgYXJyYXkgdnMgcG9pbnRlcgotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyQXJyYXlWc1BvaW50ZXIpIHsKLSAgd2NoYXJfdCBzdHJbXSA9IEwiaGkgXCJ3b3JsZFwiIjsKLSAgd2NoYXJfdCogcCA9IE5VTEw7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKLSAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHApLmNfc3RyKCkpOwotfQotCi0vLyB3Y2hhcl90IGFycmF5IHZzIHdjaGFyX3QgYXJyYXkKLVRFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhckFycmF5VnNXQ2hhckFycmF5KSB7Ci0gIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSBMImhpIFwid29ybGRcIiI7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIoc3RyKSwKLSAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIHN0cikuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIGZvcm1hdHRpbmcgYSBjaGFyIGFycmF5IHdoZW4gaXQncyBjb21wYXJlZCB3aXRoIGEgc3RyaW5nIG9iamVjdC4KLS8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IHRoZSBhcnJheSBhcyBhIEMgc3RyaW5nLgotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLS8vIGNoYXIgYXJyYXkgdnMgc3RyaW5nCi1URVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNTdHJpbmcpIHsKLSAgY29uc3QgY2hhciBzdHJbXSA9ICJoaSBcIndcMHJsZFwiIjsKLSAgRVhQRUNUX1NUUkVRKCJcImhpIFxcXCJ3XCIiLCAgLy8gVGhlIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtYmVkZGVkIE5VTCB0ZXJtaW5hdGVzIHRoZSBzdHJpbmcuCi0gICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCA6OnN0cmluZygpKS5jX3N0cigpKTsKLX0KLSNlbmRpZgotCi0vLyBjaGFyIGFycmF5IHZzIHN0ZDo6c3RyaW5nCi1URVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNTdGRTdHJpbmcpIHsKLSAgY29uc3QgY2hhciBzdHJbXSA9ICJoaSBcIndvcmxkXCIiOwotICBFWFBFQ1RfU1RSRVEoIlwiaGkgXFxcIndvcmxkXFxcIlwiIiwgIC8vIFRoZSBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgotICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgOjpzdGQ6OnN0cmluZygpKS5jX3N0cigpKTsKLX0KLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotLy8gd2NoYXJfdCBhcnJheSB2cyB3c3RyaW5nCi1URVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJBcnJheVZzV1N0cmluZykgewotICBjb25zdCB3Y2hhcl90IHN0cltdID0gTCJoaSBcIndvcmxkXCIiOwotICBFWFBFQ1RfU1RSRVEoIkxcImhpIFxcXCJ3b3JsZFxcXCJcIiIsICAvLyBUaGUgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KLSAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIDo6d3N0cmluZygpKS5jX3N0cigpKTsKLX0KLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0vLyB3Y2hhcl90IGFycmF5IHZzIHN0ZDo6d3N0cmluZwotVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyQXJyYXlWc1N0ZFdTdHJpbmcpIHsKLSAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IEwiaGkgXCJ3XDBybGRcIiI7Ci0gIEVYUEVDVF9TVFJFUSgKLSAgICAgICJMXCJoaSBcXFwid1wiIiwgIC8vIFRoZSBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1iZWRkZWQgTlVMIHRlcm1pbmF0ZXMgdGhlIHN0cmluZy4KLSAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIDo6c3RkOjp3c3RyaW5nKCkpLmNfc3RyKCkpOwotfQotI2VuZGlmCi0KLS8vIFVzZWZ1bCBmb3IgdGVzdGluZyBQcmludFRvU3RyaW5nKCkuICBXZSBjYW5ub3QgdXNlIEVYUEVDVF9FUSgpCi0vLyB0aGVyZSBhcyBpdHMgaW1wbGVtZW50YXRpb24gdXNlcyBQcmludFRvU3RyaW5nKCkuICBUaGUgY2FsbGVyIG11c3QKLS8vIGVuc3VyZSB0aGF0ICd2YWx1ZScgaGFzIG5vIHNpZGUgZWZmZWN0LgotI2RlZmluZSBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyh2YWx1ZSwgZXhwZWN0ZWRfc3RyaW5nKSAgICAgICAgIFwKLSAgRVhQRUNUX1RSVUUoUHJpbnRUb1N0cmluZyh2YWx1ZSkgPT0gKGV4cGVjdGVkX3N0cmluZykpICAgICAgICBcCi0gICAgICA8PCAiIHdoZXJlICIgI3ZhbHVlICIgcHJpbnRzIGFzICIgPDwgKFByaW50VG9TdHJpbmcodmFsdWUpKQotCi1URVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvclNjYWxhcikgewotICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXygxMjMsICIxMjMiKTsKLX0KLQotVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Db25zdENoYXIpIHsKLSAgY29uc3QgY2hhciogcCA9ICJoZWxsbyI7Ci0gIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXCIiKTsKLX0KLQotVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Ob25Db25zdENoYXIpIHsKLSAgY2hhciBzW10gPSAiaGVsbG8iOwotICBjaGFyKiBwID0gczsKLSAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocCwgIlwiaGVsbG9cIiIpOwotfQotCi1URVNUKFByaW50VG9TdHJpbmdUZXN0LCBFc2NhcGVzRm9yUG9pbnRlclRvQ29uc3RDaGFyKSB7Ci0gIGNvbnN0IGNoYXIqIHAgPSAiaGVsbG9cbiI7Ci0gIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXFxuXCIiKTsKLX0KLQotVEVTVChQcmludFRvU3RyaW5nVGVzdCwgRXNjYXBlc0ZvclBvaW50ZXJUb05vbkNvbnN0Q2hhcikgewotICBjaGFyIHNbXSA9ICJoZWxsb1wxIjsKLSAgY2hhciogcCA9IHM7Ci0gIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXFx4MVwiIik7Ci19Ci0KLVRFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yQXJyYXkpIHsKLSAgaW50IG5bM10gPSB7IDEsIDIsIDMgfTsKLSAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18obiwgInsgMSwgMiwgMyB9Iik7Ci19Ci0KLVRFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yQ2hhckFycmF5KSB7Ci0gIGNoYXIgc1tdID0gImhlbGxvIjsKLSAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18ocywgIlwiaGVsbG9cIiIpOwotfQotCi1URVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheVdpdGhFbWJlZGRlZE51bCkgewotICBjb25zdCBjaGFyIHN0cl93aXRoX251bFtdID0gImhlbGxvXDAgd29ybGQiOwotICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhzdHJfd2l0aF9udWwsICJcImhlbGxvXFwwIHdvcmxkXCIiKTsKLQotICBjaGFyIG11dGFibGVfc3RyX3dpdGhfbnVsW10gPSAiaGVsbG9cMCB3b3JsZCI7Ci0gIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKG11dGFibGVfc3RyX3dpdGhfbnVsLCAiXCJoZWxsb1xcMCB3b3JsZFwiIik7Ci19Ci0KLSN1bmRlZiBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXwotCi1URVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUZXN0LCBXb3Jrc0Zvck5vblJlZmVyZW5jZSkgewotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBVbml2ZXJzYWxUZXJzZVByaW50KDEyMywgJnNzKTsKLSAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Ci19Ci0KLVRFU1QoVW5pdmVyc2FsVGVyc2VQcmludFRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7Ci0gIGNvbnN0IGludCYgbiA9IDEyMzsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgVW5pdmVyc2FsVGVyc2VQcmludChuLCAmc3MpOwotICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKLX0KLQotVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VGVzdCwgV29ya3NGb3JDU3RyaW5nKSB7Ci0gIGNvbnN0IGNoYXIqIHMxID0gImFiYyI7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MxOwotICBVbml2ZXJzYWxUZXJzZVByaW50KHMxLCAmc3MxKTsKLSAgRVhQRUNUX0VRKCJcImFiY1wiIiwgc3MxLnN0cigpKTsKLQotICBjaGFyKiBzMiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHMxKTsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczI7Ci0gIFVuaXZlcnNhbFRlcnNlUHJpbnQoczIsICZzczIpOwotICBFWFBFQ1RfRVEoIlwiYWJjXCIiLCBzczIuc3RyKCkpOwotCi0gIGNvbnN0IGNoYXIqIHMzID0gTlVMTDsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczM7Ci0gIFVuaXZlcnNhbFRlcnNlUHJpbnQoczMsICZzczMpOwotICBFWFBFQ1RfRVEoIk5VTEwiLCBzczMuc3RyKCkpOwotfQotCi1URVNUKFVuaXZlcnNhbFByaW50VGVzdCwgV29ya3NGb3JOb25SZWZlcmVuY2UpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgVW5pdmVyc2FsUHJpbnQoMTIzLCAmc3MpOwotICBFWFBFQ1RfRVEoIjEyMyIsIHNzLnN0cigpKTsKLX0KLQotVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7Ci0gIGNvbnN0IGludCYgbiA9IDEyMzsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgVW5pdmVyc2FsUHJpbnQobiwgJnNzKTsKLSAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Ci19Ci0KLVRFU1QoVW5pdmVyc2FsUHJpbnRUZXN0LCBXb3Jrc0ZvckNTdHJpbmcpIHsKLSAgY29uc3QgY2hhciogczEgPSAiYWJjIjsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczE7Ci0gIFVuaXZlcnNhbFByaW50KHMxLCAmc3MxKTsKLSAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzMSkgKyAiIHBvaW50aW5nIHRvIFwiYWJjXCIiLCBzdHJpbmcoc3MxLnN0cigpKSk7Ci0KLSAgY2hhciogczIgPSBjb25zdF9jYXN0PGNoYXIqPihzMSk7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MyOwotICBVbml2ZXJzYWxQcmludChzMiwgJnNzMik7Ci0gIEVYUEVDVF9FUShQcmludFBvaW50ZXIoczIpICsgIiBwb2ludGluZyB0byBcImFiY1wiIiwgc3RyaW5nKHNzMi5zdHIoKSkpOwotCi0gIGNvbnN0IGNoYXIqIHMzID0gTlVMTDsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczM7Ci0gIFVuaXZlcnNhbFByaW50KHMzLCAmc3MzKTsKLSAgRVhQRUNUX0VRKCJOVUxMIiwgc3MzLnN0cigpKTsKLX0KLQotVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yQ2hhckFycmF5KSB7Ci0gIGNvbnN0IGNoYXIgc3RyW10gPSAiXCJMaW5lXDAgMVwiXG5MaW5lIDIiOwotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMTsKLSAgVW5pdmVyc2FsUHJpbnQoc3RyLCAmc3MxKTsKLSAgRVhQRUNUX0VRKCJcIlxcXCJMaW5lXFwwIDFcXFwiXFxuTGluZSAyXCIiLCBzczEuc3RyKCkpOwotCi0gIGNvbnN0IGNoYXIgbXV0YWJsZV9zdHJbXSA9ICJcIkxpbmVcMCAxXCJcbkxpbmUgMiI7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MyOwotICBVbml2ZXJzYWxQcmludChtdXRhYmxlX3N0ciwgJnNzMik7Ci0gIEVYUEVDVF9FUSgiXCJcXFwiTGluZVxcMCAxXFxcIlxcbkxpbmUgMlwiIiwgc3MyLnN0cigpKTsKLX0KLQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKLQotVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0V2l0aFRyMSwgUHJpbnRzRW1wdHlUdXBsZSkgewotICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKLSAgICAgIDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUoKSk7Ci0gIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLVRFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhUcjEsIFByaW50c09uZVR1cGxlKSB7Ci0gIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAotICAgICAgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZSgxKSk7Ci0gIEFTU0VSVF9FUSgxdSwgcmVzdWx0LnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7Ci19Ci0KLVRFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhUcjEsIFByaW50c1R3b1R1cGxlKSB7Ci0gIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAotICAgICAgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZSgxLCAnYScpKTsKLSAgQVNTRVJUX0VRKDJ1LCByZXN1bHQuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCIxIiwgcmVzdWx0WzBdKTsKLSAgRVhQRUNUX0VRKCInYScgKDk3LCAweDYxKSIsIHJlc3VsdFsxXSk7Ci19Ci0KLVRFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhUcjEsIFByaW50c1RlcnNlbHkpIHsKLSAgY29uc3QgaW50IG4gPSAxOwotICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKLSAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPGNvbnN0IGludCYsIGNvbnN0IGNoYXIqPihuLCAiYSIpKTsKLSAgQVNTRVJUX0VRKDJ1LCByZXN1bHQuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCIxIiwgcmVzdWx0WzBdKTsKLSAgRVhQRUNUX0VRKCJcImFcIiIsIHJlc3VsdFsxXSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQotCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLQotVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0V2l0aFN0ZCwgUHJpbnRzRW1wdHlUdXBsZSkgewotICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyg6OnN0ZDo6bWFrZV90dXBsZSgpKTsKLSAgRVhQRUNUX0VRKDB1LCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0V2l0aFN0ZCwgUHJpbnRzT25lVHVwbGUpIHsKLSAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCi0gICAgICA6OnN0ZDo6bWFrZV90dXBsZSgxKSk7Ci0gIEFTU0VSVF9FUSgxdSwgcmVzdWx0LnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7Ci19Ci0KLVRFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhTdGQsIFByaW50c1R3b1R1cGxlKSB7Ci0gIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAotICAgICAgOjpzdGQ6Om1ha2VfdHVwbGUoMSwgJ2EnKSk7Ci0gIEFTU0VSVF9FUSgydSwgcmVzdWx0LnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7Ci0gIEVYUEVDVF9FUSgiJ2EnICg5NywgMHg2MSkiLCByZXN1bHRbMV0pOwotfQotCi1URVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3RXaXRoU3RkLCBQcmludHNUZXJzZWx5KSB7Ci0gIGNvbnN0IGludCBuID0gMTsKLSAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCi0gICAgICA6OnN0ZDo6dHVwbGU8Y29uc3QgaW50JiwgY29uc3QgY2hhcio+KG4sICJhIikpOwotICBBU1NFUlRfRVEoMnUsIHJlc3VsdC5zaXplKCkpOwotICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOwotICBFWFBFQ1RfRVEoIlwiYVwiIiwgcmVzdWx0WzFdKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1RVUExFXwotCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfcHJpbnRlcnNfdGVzdAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYThiYTkzLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCi0vLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwotdXNpbmcgdGVzdGluZzo6VGVzdDsKLXVzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwotdXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheTsKLQotbmFtZXNwYWNlIHsKLQotLy8gVGVzdHMgdGhlIFRlc3RQYXJ0UmVzdWx0IGNsYXNzLgotCi0vLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIFRlc3RQYXJ0UmVzdWx0LgotY2xhc3MgVGVzdFBhcnRSZXN1bHRUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgVGVzdFBhcnRSZXN1bHRUZXN0KCkKLSAgICAgIDogcjFfKFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcywgImZvby9iYXIuY2MiLCAxMCwgIlN1Y2Nlc3MhIiksCi0gICAgICAgIHIyXyhUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgImZvby9iYXIuY2MiLCAtMSwgIkZhaWx1cmUhIiksCi0gICAgICAgIHIzXyhUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgTlVMTCwgLTEsICJGYWlsdXJlISIpIHt9Ci0KLSAgVGVzdFBhcnRSZXN1bHQgcjFfLCByMl8sIHIzXzsKLX07Ci0KLQotVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgQ29uc3RydWN0b3JXb3JrcykgewotICBNZXNzYWdlIG1lc3NhZ2U7Ci0gIG1lc3NhZ2UgPDwgInNvbWV0aGluZyBpcyB0ZXJyaWJseSB3cm9uZyI7Ci0gIG1lc3NhZ2UgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHRlc3Rpbmc6OmludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlcik7Ci0gIG1lc3NhZ2UgPDwgInNvbWUgdW5pbXBvcnRhbnQgc3RhY2sgdHJhY2UiOwotCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHJlc3VsdChUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21lX2ZpbGUuY2MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOwotCi0gIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgcmVzdWx0LnR5cGUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgic29tZV9maWxlLmNjIiwgcmVzdWx0LmZpbGVfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKDQyLCByZXN1bHQubGluZV9udW1iZXIoKSk7Ci0gIEVYUEVDVF9TVFJFUShtZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCksIHJlc3VsdC5tZXNzYWdlKCkpOwotICBFWFBFQ1RfU1RSRVEoInNvbWV0aGluZyBpcyB0ZXJyaWJseSB3cm9uZyIsIHJlc3VsdC5zdW1tYXJ5KCkpOwotfQotCi1URVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBSZXN1bHRBY2Nlc3NvcnNXb3JrKSB7Ci0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHN1Y2Nlc3MoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlLmNjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIpOwotICBFWFBFQ1RfVFJVRShzdWNjZXNzLnBhc3NlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MuZmFpbGVkKCkpOwotICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MuZmF0YWxseV9mYWlsZWQoKSk7Ci0KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQgbm9uZmF0YWxfZmFpbHVyZShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5jYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiKTsKLSAgRVhQRUNUX0ZBTFNFKG5vbmZhdGFsX2ZhaWx1cmUucGFzc2VkKCkpOwotICBFWFBFQ1RfVFJVRShub25mYXRhbF9mYWlsdXJlLmZhaWxlZCgpKTsKLSAgRVhQRUNUX1RSVUUobm9uZmF0YWxfZmFpbHVyZS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG5vbmZhdGFsX2ZhaWx1cmUuZmF0YWxseV9mYWlsZWQoKSk7Ci0KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQgZmF0YWxfZmFpbHVyZShUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5jYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiKTsKLSAgRVhQRUNUX0ZBTFNFKGZhdGFsX2ZhaWx1cmUucGFzc2VkKCkpOwotICBFWFBFQ1RfVFJVRShmYXRhbF9mYWlsdXJlLmZhaWxlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGZhdGFsX2ZhaWx1cmUubm9uZmF0YWxseV9mYWlsZWQoKSk7Ci0gIEVYUEVDVF9UUlVFKGZhdGFsX2ZhaWx1cmUuZmF0YWxseV9mYWlsZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0Ojp0eXBlKCkuCi1URVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCB0eXBlKSB7Ci0gIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MsIHIxXy50eXBlKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIHIyXy50eXBlKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIHIzXy50eXBlKCkpOwotfQotCi0vLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6ZmlsZV9uYW1lKCkuCi1URVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBmaWxlX25hbWUpIHsKLSAgRVhQRUNUX1NUUkVRKCJmb28vYmFyLmNjIiwgcjFfLmZpbGVfbmFtZSgpKTsKLSAgRVhQRUNUX1NUUkVRKE5VTEwsIHIzXy5maWxlX25hbWUoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpsaW5lX251bWJlcigpLgotVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgbGluZV9udW1iZXIpIHsKLSAgRVhQRUNUX0VRKDEwLCByMV8ubGluZV9udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSgtMSwgcjJfLmxpbmVfbnVtYmVyKCkpOwotfQotCi0vLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6bWVzc2FnZSgpLgotVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgbWVzc2FnZSkgewotICBFWFBFQ1RfU1RSRVEoIlN1Y2Nlc3MhIiwgcjFfLm1lc3NhZ2UoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpwYXNzZWQoKS4KLVRFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIFBhc3NlZCkgewotICBFWFBFQ1RfVFJVRShyMV8ucGFzc2VkKCkpOwotICBFWFBFQ1RfRkFMU0UocjJfLnBhc3NlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHIzXy5wYXNzZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpmYWlsZWQoKS4KLVRFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIEZhaWxlZCkgewotICBFWFBFQ1RfRkFMU0UocjFfLmZhaWxlZCgpKTsKLSAgRVhQRUNUX1RSVUUocjJfLmZhaWxlZCgpKTsKLSAgRVhQRUNUX1RSVUUocjNfLmZhaWxlZCgpKTsKLX0KLQotLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OmZhdGFsbHlfZmFpbGVkKCkuCi1URVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBGYXRhbGx5RmFpbGVkKSB7Ci0gIEVYUEVDVF9GQUxTRShyMV8uZmF0YWxseV9mYWlsZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShyMl8uZmF0YWxseV9mYWlsZWQoKSk7Ci0gIEVYUEVDVF9UUlVFKHIzXy5mYXRhbGx5X2ZhaWxlZCgpKTsKLX0KLQotLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6Om5vbmZhdGFsbHlfZmFpbGVkKCkuCi1URVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBOb25mYXRhbGx5RmFpbGVkKSB7Ci0gIEVYUEVDVF9GQUxTRShyMV8ubm9uZmF0YWxseV9mYWlsZWQoKSk7Ci0gIEVYUEVDVF9UUlVFKHIyXy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKHIzXy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKLX0KLQotLy8gVGVzdHMgdGhlIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY2xhc3MuCi0KLWNsYXNzIFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QoKQotICAgICAgOiByMV8oVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsICJmb28vYmFyLmNjIiwgLTEsICJGYWlsdXJlIDEiKSwKLSAgICAgICAgcjJfKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAiZm9vL2Jhci5jYyIsIC0xLCAiRmFpbHVyZSAyIikge30KLQotICBjb25zdCBUZXN0UGFydFJlc3VsdCByMV8sIHIyXzsKLX07Ci0KLS8vIFRlc3RzIHRoYXQgVGVzdFBhcnRSZXN1bHRBcnJheSBpbml0aWFsbHkgaGFzIHNpemUgMC4KLVRFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5VGVzdCwgSW5pdGlhbFNpemVJc1plcm8pIHsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOwotICBFWFBFQ1RfRVEoMCwgcmVzdWx0cy5zaXplKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0Ci0vLyBhZnRlciBvbmUgQXBwZW5kKCkgb3BlcmF0aW9uLgotVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0LCBDb250YWluc0dpdmVuUmVzdWx0QWZ0ZXJBcHBlbmQpIHsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOwotICByZXN1bHRzLkFwcGVuZChyMV8pOwotICBFWFBFQ1RfRVEoMSwgcmVzdWx0cy5zaXplKCkpOwotICBFWFBFQ1RfU1RSRVEoIkZhaWx1cmUgMSIsIHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdHMKLS8vIGFmdGVyIHR3byBBcHBlbmQoKSBvcGVyYXRpb25zLgotVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0LCBDb250YWluc0dpdmVuUmVzdWx0c0FmdGVyVHdvQXBwZW5kcykgewotICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7Ci0gIHJlc3VsdHMuQXBwZW5kKHIxXyk7Ci0gIHJlc3VsdHMuQXBwZW5kKHIyXyk7Ci0gIEVYUEVDVF9FUSgyLCByZXN1bHRzLnNpemUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiRmFpbHVyZSAxIiwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOwotICBFWFBFQ1RfU1RSRVEoIkZhaWx1cmUgMiIsIHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKLX0KLQotdHlwZWRlZiBUZXN0UGFydFJlc3VsdEFycmF5VGVzdCBUZXN0UGFydFJlc3VsdEFycmF5RGVhdGhUZXN0OwotCi0vLyBUZXN0cyB0aGF0IHRoZSBwcm9ncmFtIGRpZXMgd2hlbiBHZXRUZXN0UGFydFJlc3VsdCgpIGlzIGNhbGxlZCB3aXRoCi0vLyBhbiBpbnZhbGlkIGluZGV4LgotVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlEZWF0aFRlc3QsIERpZXNXaGVuSW5kZXhJc091dE9mQm91bmQpIHsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOwotICByZXN1bHRzLkFwcGVuZChyMV8pOwotCi0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgtMSksICIiKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLCAiIik7Ci19Ci0KLS8vIFRPRE8obWhldWxlQGdvb2dsZS5jb20pOiBBZGQgYSB0ZXN0IGZvciB0aGUgY2xhc3MgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyLgotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYWEzZTAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgiCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi11c2luZyA6OnN0ZDo6dHIxOjpnZXQ7Ci11c2luZyA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlOwotdXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGU7Ci11c2luZyA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50OwotdXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTsKLXVzaW5nIDo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwotCi0vLyBUZXN0cyB0aGF0IHR1cGxlX2VsZW1lbnQ8SywgdHVwbGU8VDAsIFQxLCAuLi4sIFROPiA+Ojp0eXBlIHJldHVybnMgVEsuCi1URVNUKHR1cGxlX2VsZW1lbnRfVGVzdCwgUmV0dXJuc0VsZW1lbnRUeXBlKSB7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8aW50LCBjaGFyPiA+Ojp0eXBlPigpOwotICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50JiwgdHVwbGVfZWxlbWVudDwxLCB0dXBsZTxkb3VibGUsIGludCY+ID46OnR5cGU+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLCB0dXBsZV9lbGVtZW50PDIsIHR1cGxlPGRvdWJsZSwgaW50LCBib29sPiA+Ojp0eXBlPigpOwotfQotCi0vLyBUZXN0cyB0aGF0IHR1cGxlX3NpemU8VD46OnZhbHVlIGdpdmVzIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlCi0vLyB0eXBlIFQuCi1URVNUKHR1cGxlX3NpemVfVGVzdCwgUmV0dXJuc051bWJlck9mRmllbGRzKSB7Ci0gIEVYUEVDVF9FUSgwLCArdHVwbGVfc2l6ZTx0dXBsZTw+ID46OnZhbHVlKTsKLSAgRVhQRUNUX0VRKDEsICt0dXBsZV9zaXplPHR1cGxlPHZvaWQqPiA+Ojp2YWx1ZSk7Ci0gIEVYUEVDVF9FUSgxLCArdHVwbGVfc2l6ZTx0dXBsZTxjaGFyPiA+Ojp2YWx1ZSk7Ci0gIEVYUEVDVF9FUSgxLCArKHR1cGxlX3NpemU8dHVwbGU8dHVwbGU8aW50LCBkb3VibGU+ID4gPjo6dmFsdWUpKTsKLSAgRVhQRUNUX0VRKDIsICsodHVwbGVfc2l6ZTx0dXBsZTxpbnQmLCBjb25zdCBjaGFyPiA+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfRVEoMywgKyh0dXBsZV9zaXplPHR1cGxlPGNoYXIqLCB2b2lkLCBjb25zdCBib29sJj4gPjo6dmFsdWUpKTsKLX0KLQotLy8gVGVzdHMgY29tcGFyaW5nIGEgdHVwbGUgd2l0aCBpdHNlbGYuCi1URVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1dpdGhTZWxmKSB7Ci0gIGNvbnN0IHR1cGxlPGludCwgY2hhciwgYm9vbD4gYSg1LCAnYScsIGZhbHNlKTsKLQotICBFWFBFQ1RfVFJVRShhID09IGEpOwotICBFWFBFQ1RfRkFMU0UoYSAhPSBhKTsKLX0KLQotLy8gVGVzdHMgY29tcGFyaW5nIHR3byB0dXBsZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLVRFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzRXF1YWxUdXBsZXMpIHsKLSAgY29uc3QgdHVwbGU8aW50LCBib29sPiBhKDUsIHRydWUpLCBiKDUsIHRydWUpOwotCi0gIEVYUEVDVF9UUlVFKGEgPT0gYik7Ci0gIEVYUEVDVF9GQUxTRShhICE9IGIpOwotfQotCi0vLyBUZXN0cyBjb21wYXJpbmcgdHdvIGRpZmZlcmVudCB0dXBsZXMgdGhhdCBoYXZlIG5vIHJlZmVyZW5jZSBmaWVsZHMuCi1URVNUKENvbXBhcmlzb25UZXN0LCBDb21wYXJlc1VuZXF1YWxUdXBsZXNXaXRob3V0UmVmZXJlbmNlRmllbGRzKSB7Ci0gIHR5cGVkZWYgdHVwbGU8Y29uc3QgaW50LCBjaGFyPiBGb29UdXBsZTsKLQotICBjb25zdCBGb29UdXBsZSBhKDAsICd4Jyk7Ci0gIGNvbnN0IEZvb1R1cGxlIGIoMSwgJ2EnKTsKLQotICBFWFBFQ1RfVFJVRShhICE9IGIpOwotICBFWFBFQ1RfRkFMU0UoYSA9PSBiKTsKLQotICBjb25zdCBGb29UdXBsZSBjKDEsICdiJyk7Ci0KLSAgRVhQRUNUX1RSVUUoYiAhPSBjKTsKLSAgRVhQRUNUX0ZBTFNFKGIgPT0gYyk7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyB0d28gZGlmZmVyZW50IHR1cGxlcyB0aGF0IGhhdmUgcmVmZXJlbmNlIGZpZWxkcy4KLVRFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzVW5lcXVhbFR1cGxlc1dpdGhSZWZlcmVuY2VGaWVsZHMpIHsKLSAgdHlwZWRlZiB0dXBsZTxpbnQmLCBjb25zdCBjaGFyJj4gRm9vVHVwbGU7Ci0KLSAgaW50IGkgPSA1OwotICBjb25zdCBjaGFyIGNoID0gJ2EnOwotICBjb25zdCBGb29UdXBsZSBhKGksIGNoKTsKLQotICBpbnQgaiA9IDY7Ci0gIGNvbnN0IEZvb1R1cGxlIGIoaiwgY2gpOwotCi0gIEVYUEVDVF9UUlVFKGEgIT0gYik7Ci0gIEVYUEVDVF9GQUxTRShhID09IGIpOwotCi0gIGogPSA1OwotICBjb25zdCBjaGFyIGNoMiA9ICdiJzsKLSAgY29uc3QgRm9vVHVwbGUgYyhqLCBjaDIpOwotCi0gIEVYUEVDVF9UUlVFKGIgIT0gYyk7Ci0gIEVYUEVDVF9GQUxTRShiID09IGMpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgdHVwbGUgZmllbGQgd2l0aCBhIHJlZmVyZW5jZSB0eXBlIGlzIGFuIGFsaWFzIG9mIHRoZQotLy8gdmFyaWFibGUgaXQncyBzdXBwb3NlZCB0byByZWZlcmVuY2UuCi1URVNUKFJlZmVyZW5jZUZpZWxkVGVzdCwgSXNBbGlhc09mUmVmZXJlbmNlZFZhcmlhYmxlKSB7Ci0gIGludCBuID0gMDsKLSAgdHVwbGU8Ym9vbCwgaW50Jj4gdCh0cnVlLCBuKTsKLQotICBuID0gMTsKLSAgRVhQRUNUX0VRKG4sIGdldDwxPih0KSkKLSAgICAgIDw8ICJDaGFuZ2luZyBhIHVuZGVybHlpbmcgdmFyaWFibGUgc2hvdWxkIHVwZGF0ZSB0aGUgcmVmZXJlbmNlIGZpZWxkLiI7Ci0KLSAgLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nIGZ1bm55IHdpdGgKLSAgLy8gdGhlICYgb3BlcmF0b3IgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBnZXQ8PigpLgotICBFWFBFQ1RfRVEoJm4sICYoZ2V0PDE+KHQpKSkKLSAgICAgIDw8ICJUaGUgYWRkcmVzcyBvZiBhIHJlZmVyZW5jZSBmaWVsZCBzaG91bGQgZXF1YWwgdGhlIGFkZHJlc3Mgb2YgIgotICAgICAgPDwgInRoZSB1bmRlcmx5aW5nIHZhcmlhYmxlLiI7Ci0KLSAgZ2V0PDE+KHQpID0gMjsKLSAgRVhQRUNUX0VRKDIsIG4pCi0gICAgICA8PCAiQ2hhbmdpbmcgYSByZWZlcmVuY2UgZmllbGQgc2hvdWxkIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YXJpYWJsZS4iOwotfQotCi0vLyBUZXN0cyB0aGF0IHR1cGxlJ3MgZGVmYXVsdCBjb25zdHJ1Y3RvciBkZWZhdWx0IGluaXRpYWxpemVzIGVhY2ggZmllbGQuCi0vLyBUaGlzIHRlc3QgbmVlZHMgdG8gY29tcGlsZSB3aXRob3V0IGdlbmVyYXRpbmcgd2FybmluZ3MuCi1URVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JEZWZhdWx0SW5pdGlhbGl6ZXNFYWNoRmllbGQpIHsKLSAgLy8gVGhlIFRSMSByZXBvcnQgcmVxdWlyZXMgdGhhdCB0dXBsZSdzIGRlZmF1bHQgY29uc3RydWN0b3IgZGVmYXVsdAotICAvLyBpbml0aWFsaXplcyBlYWNoIGZpZWxkLCBldmVuIGlmIGl0J3MgYSBwcmltaXRpdmUgdHlwZS4gIElmIHRoZQotICAvLyBpbXBsZW1lbnRhdGlvbiBmb3JnZXRzIHRvIGRvIHRoaXMsIHRoaXMgdGVzdCB3aWxsIGNhdGNoIGl0IGJ5Ci0gIC8vIGdlbmVyYXRpbmcgd2FybmluZ3MgYWJvdXQgdXNpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgKGFzc3VtaW5nCi0gIC8vIGEgZGVjZW50IGNvbXBpbGVyKS4KLQotICB0dXBsZTw+IGVtcHR5OwotCi0gIHR1cGxlPGludD4gYTEsIGIxOwotICBiMSA9IGExOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIxKSk7Ci0KLSAgdHVwbGU8aW50LCBkb3VibGU+IGEyLCBiMjsKLSAgYjIgPSBhMjsKLSAgRVhQRUNUX0VRKDAsIGdldDwwPihiMikpOwotICBFWFBFQ1RfRVEoMC4wLCBnZXQ8MT4oYjIpKTsKLQotICB0dXBsZTxkb3VibGUsIGNoYXIsIGJvb2wqPiBhMywgYjM7Ci0gIGIzID0gYTM7Ci0gIEVYUEVDVF9FUSgwLjAsIGdldDwwPihiMykpOwotICBFWFBFQ1RfRVEoJ1wwJywgZ2V0PDE+KGIzKSk7Ci0gIEVYUEVDVF9UUlVFKGdldDwyPihiMykgPT0gTlVMTCk7Ci0KLSAgdHVwbGU8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBhMTAsIGIxMDsKLSAgYjEwID0gYTEwOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDE+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDI+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDM+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDQ+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDU+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDY+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDc+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDg+KGIxMCkpOwotICBFWFBFQ1RfRVEoMCwgZ2V0PDk+KGIxMCkpOwotfQotCi0vLyBUZXN0cyBjb25zdHJ1Y3RpbmcgYSB0dXBsZSBmcm9tIGl0cyBmaWVsZHMuCi1URVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBDb25zdHJ1Y3RzRnJvbUZpZWxkcykgewotICBpbnQgbiA9IDE7Ci0gIC8vIFJlZmVyZW5jZSBmaWVsZC4KLSAgdHVwbGU8aW50Jj4gYShuKTsKLSAgRVhQRUNUX0VRKCZuLCAmKGdldDwwPihhKSkpOwotCi0gIC8vIE5vbi1yZWZlcmVuY2UgZmllbGRzLgotICB0dXBsZTxpbnQsIGNoYXI+IGIoNSwgJ2EnKTsKLSAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7Ci0gIEVYUEVDVF9FUSgnYScsIGdldDwxPihiKSk7Ci0KLSAgLy8gQ29uc3QgcmVmZXJlbmNlIGZpZWxkLgotICBjb25zdCBpbnQgbSA9IDI7Ci0gIHR1cGxlPGJvb2wsIGNvbnN0IGludCY+IGModHJ1ZSwgbSk7Ci0gIEVYUEVDVF9UUlVFKGdldDwwPihjKSk7Ci0gIEVYUEVDVF9FUSgmbSwgJihnZXQ8MT4oYykpKTsKLX0KLQotLy8gVGVzdHMgdHVwbGUncyBjb3B5IGNvbnN0cnVjdG9yLgotVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7Ci0gIHR1cGxlPGRvdWJsZSwgYm9vbD4gYSgwLjAsIHRydWUpOwotICB0dXBsZTxkb3VibGUsIGJvb2w+IGIoYSk7Ci0KLSAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIGdldDwwPihiKSk7Ci0gIEVYUEVDVF9UUlVFKGdldDwxPihiKSk7Ci19Ci0KLS8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIHR1cGxlIGZyb20gYW5vdGhlciB0dXBsZSB0aGF0IGhhcyBhIGNvbXBhdGlibGUKLS8vIGJ1dCBkaWZmZXJlbnQgdHlwZS4KLVRFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tRGlmZmVyZW50VHVwbGVUeXBlKSB7Ci0gIHR1cGxlPGludCwgaW50LCBjaGFyPiBhKDAsIDEsICdhJyk7Ci0gIHR1cGxlPGRvdWJsZSwgbG9uZywgaW50PiBiKGEpOwotCi0gIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCBnZXQ8MD4oYikpOwotICBFWFBFQ1RfRVEoMSwgZ2V0PDE+KGIpKTsKLSAgRVhQRUNUX0VRKCdhJywgZ2V0PDI+KGIpKTsKLX0KLQotLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgMi10dXBsZSBmcm9tIGFuIHN0ZDo6cGFpci4KLVRFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tUGFpcikgewotICA6OnN0ZDo6cGFpcjxpbnQsIGNoYXI+IGEoMSwgJ2EnKTsKLSAgdHVwbGU8aW50LCBjaGFyPiBiKGEpOwotICB0dXBsZTxpbnQsIGNvbnN0IGNoYXImPiBjKGEpOwotfQotCi0vLyBUZXN0cyBhc3NpZ25pbmcgYSB0dXBsZSB0byBhbm90aGVyIHR1cGxlIHdpdGggdGhlIHNhbWUgdHlwZS4KLVRFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc1RvU2FtZVR1cGxlVHlwZSkgewotICBjb25zdCB0dXBsZTxpbnQsIGxvbmc+IGEoNSwgN0wpOwotICB0dXBsZTxpbnQsIGxvbmc+IGI7Ci0gIGIgPSBhOwotICBFWFBFQ1RfRVEoNSwgZ2V0PDA+KGIpKTsKLSAgRVhQRUNUX0VRKDdMLCBnZXQ8MT4oYikpOwotfQotCi0vLyBUZXN0cyBhc3NpZ25pbmcgYSB0dXBsZSB0byBhbm90aGVyIHR1cGxlIHdpdGggYSBkaWZmZXJlbnQgYnV0Ci0vLyBjb21wYXRpYmxlIHR5cGUuCi1URVNUKFR1cGxlQXNzaWdubWVudFRlc3QsIEFzc2lnbnNUb0RpZmZlcmVudFR1cGxlVHlwZSkgewotICBjb25zdCB0dXBsZTxpbnQsIGxvbmcsIGJvb2w+IGEoMSwgN0wsIHRydWUpOwotICB0dXBsZTxsb25nLCBpbnQsIGJvb2w+IGI7Ci0gIGIgPSBhOwotICBFWFBFQ1RfRVEoMUwsIGdldDwwPihiKSk7Ci0gIEVYUEVDVF9FUSg3LCBnZXQ8MT4oYikpOwotICBFWFBFQ1RfVFJVRShnZXQ8Mj4oYikpOwotfQotCi0vLyBUZXN0cyBhc3NpZ25pbmcgYW4gc3RkOjpwYWlyIHRvIGEgMi10dXBsZS4KLVRFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc0Zyb21QYWlyKSB7Ci0gIGNvbnN0IDo6c3RkOjpwYWlyPGludCwgYm9vbD4gYSg1LCB0cnVlKTsKLSAgdHVwbGU8aW50LCBib29sPiBiOwotICBiID0gYTsKLSAgRVhQRUNUX0VRKDUsIGdldDwwPihiKSk7Ci0gIEVYUEVDVF9UUlVFKGdldDwxPihiKSk7Ci0KLSAgdHVwbGU8bG9uZywgYm9vbD4gYzsKLSAgYyA9IGE7Ci0gIEVYUEVDVF9FUSg1TCwgZ2V0PDA+KGMpKTsKLSAgRVhQRUNUX1RSVUUoZ2V0PDE+KGMpKTsKLX0KLQotLy8gQSBmaXh0dXJlIGZvciB0ZXN0aW5nIGJpZyB0dXBsZXMuCi1jbGFzcyBCaWdUdXBsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB0eXBlZGVmIHR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludD4gQmlnVHVwbGU7Ci0KLSAgQmlnVHVwbGVUZXN0KCkgOgotICAgICAgYV8oMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiksCi0gICAgICBiXygxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzKSB7fQotCi0gIEJpZ1R1cGxlIGFfLCBiXzsKLX07Ci0KLS8vIFRlc3RzIGNvbnN0cnVjdGluZyBiaWcgdHVwbGVzLgotVEVTVF9GKEJpZ1R1cGxlVGVzdCwgQ29uc3RydWN0aW9uKSB7Ci0gIEJpZ1R1cGxlIGE7Ci0gIEJpZ1R1cGxlIGIoYl8pOwotfQotCi0vLyBUZXN0cyB0aGF0IGdldDxOPih0KSByZXR1cm5zIHRoZSBOLXRoICgwLWJhc2VkKSBmaWVsZCBvZiB0dXBsZSB0LgotVEVTVF9GKEJpZ1R1cGxlVGVzdCwgZ2V0KSB7Ci0gIEVYUEVDVF9FUSgxLCBnZXQ8MD4oYV8pKTsKLSAgRVhQRUNUX0VRKDIsIGdldDw5PihhXykpOwotCi0gIC8vIFRlc3RzIHRoYXQgZ2V0KCkgd29ya3Mgb24gYSBjb25zdCB0dXBsZSB0b28uCi0gIGNvbnN0IEJpZ1R1cGxlIGEoYV8pOwotICBFWFBFQ1RfRVEoMSwgZ2V0PDA+KGEpKTsKLSAgRVhQRUNUX0VRKDIsIGdldDw5PihhKSk7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyBiaWcgdHVwbGVzLgotVEVTVF9GKEJpZ1R1cGxlVGVzdCwgQ29tcGFyaXNvbnMpIHsKLSAgRVhQRUNUX1RSVUUoYV8gPT0gYV8pOwotICBFWFBFQ1RfRkFMU0UoYV8gIT0gYV8pOwotCi0gIEVYUEVDVF9UUlVFKGFfICE9IGJfKTsKLSAgRVhQRUNUX0ZBTFNFKGFfID09IGJfKTsKLX0KLQotVEVTVChNYWtlVHVwbGVUZXN0LCBXb3Jrc0ZvclNjYWxhclR5cGVzKSB7Ci0gIHR1cGxlPGJvb2wsIGludD4gYTsKLSAgYSA9IG1ha2VfdHVwbGUodHJ1ZSwgNSk7Ci0gIEVYUEVDVF9UUlVFKGdldDwwPihhKSk7Ci0gIEVYUEVDVF9FUSg1LCBnZXQ8MT4oYSkpOwotCi0gIHR1cGxlPGNoYXIsIGludCwgbG9uZz4gYjsKLSAgYiA9IG1ha2VfdHVwbGUoJ2EnLCAnYicsIDUpOwotICBFWFBFQ1RfRVEoJ2EnLCBnZXQ8MD4oYikpOwotICBFWFBFQ1RfRVEoJ2InLCBnZXQ8MT4oYikpOwotICBFWFBFQ1RfRVEoNSwgZ2V0PDI+KGIpKTsKLX0KLQotVEVTVChNYWtlVHVwbGVUZXN0LCBXb3Jrc0ZvclBvaW50ZXJzKSB7Ci0gIGludCBhW10gPSB7IDEsIDIsIDMsIDQgfTsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gImhpIjsKLSAgaW50KiBjb25zdCBwID0gYTsKLQotICB0dXBsZTxjb25zdCBjaGFyKiwgaW50Kj4gdDsKLSAgdCA9IG1ha2VfdHVwbGUoc3RyLCBwKTsKLSAgRVhQRUNUX0VRKHN0ciwgZ2V0PDA+KHQpKTsKLSAgRVhQRUNUX0VRKHAsIGdldDwxPih0KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4NDcwMC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gVGVzdHMgdGhhdCB0aGUgc2FtZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZQotLy8gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCi0vLyAoQ29udGFpbmVyVGVzdCBpcyBhbHNvIGluc3RhbnRpYXRlZCBpbiBndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MuKQotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoVmVjdG9yLCBDb250YWluZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VHlwZXM8c3RkOjp2ZWN0b3I8aW50PiA+KTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2MjhiYS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgiCi0KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgdGVzdGluZzo6VGVzdDsKLQotLy8gVXNlZCBmb3IgdGVzdGluZyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUKLS8vIGN0b3IvZHRvciwgYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlZCB0ZXN0cyBhbmQKLS8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBDb21tb25UZXN0IDogcHVibGljIFRlc3QgewotICAvLyBGb3Igc29tZSB0ZWNobmljYWwgcmVhc29uLCBTZXRVcFRlc3RDYXNlKCkgYW5kIFRlYXJEb3duVGVzdENhc2UoKQotICAvLyBtdXN0IGJlIHB1YmxpYy4KLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7Ci0gICAgc2hhcmVkXyA9IG5ldyBUKDUpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBkZWxldGUgc2hhcmVkXzsKLSAgICBzaGFyZWRfID0gTlVMTDsKLSAgfQotCi0gIC8vIFRoaXMgJ3Byb3RlY3RlZDonIGlzIG9wdGlvbmFsLiAgVGhlcmUncyBubyBoYXJtIGluIG1ha2luZyBhbGwKLSAgLy8gbWVtYmVycyBvZiB0aGlzIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgcHVibGljLgotIHByb3RlY3RlZDoKLSAgLy8gV2UgdXNlZCB0byB1c2Ugc3RkOjpsaXN0IGhlcmUsIGJ1dCBzd2l0Y2hlZCB0byBzdGQ6OnZlY3RvciBzaW5jZQotICAvLyBNU1ZDJ3MgPGxpc3Q+IGRvZXNuJ3QgY29tcGlsZSBjbGVhbmx5IHdpdGggL1c0LgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFQ+IFZlY3RvcjsKLSAgdHlwZWRlZiBzdGQ6OnNldDxpbnQ+IEludFNldDsKLQotICBDb21tb25UZXN0KCkgOiB2YWx1ZV8oMSkge30KLQotICB2aXJ0dWFsIH5Db21tb25UZXN0KCkgeyBFWFBFQ1RfRVEoMywgdmFsdWVfKTsgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBFWFBFQ1RfRVEoMSwgdmFsdWVfKTsKLSAgICB2YWx1ZV8rKzsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBFWFBFQ1RfRVEoMiwgdmFsdWVfKTsKLSAgICB2YWx1ZV8rKzsKLSAgfQotCi0gIFQgdmFsdWVfOwotICBzdGF0aWMgVCogc2hhcmVkXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCogQ29tbW9uVGVzdDxUPjo6c2hhcmVkXyA9IE5VTEw7Ci0KLS8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHR5cGVkIHRlc3RzLgotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLXVzaW5nIHRlc3Rpbmc6OlR5cGVzOwotCi0vLyBUZXN0cyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUgY3Rvci9kdG9yLAotLy8gYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlZCB0ZXN0cwotCi10eXBlZGVmIFR5cGVzPGNoYXIsIGludD4gVHdvVHlwZXM7Ci1UWVBFRF9URVNUX0NBU0UoQ29tbW9uVGVzdCwgVHdvVHlwZXMpOwotCi1UWVBFRF9URVNUKENvbW1vblRlc3QsIFZhbHVlc0FyZUNvcnJlY3QpIHsKLSAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhCi0gIC8vIHRoZSBUZXN0Rml4dHVyZTo6IHByZWZpeC4KLSAgRVhQRUNUX0VRKDUsICpUZXN0Rml4dHVyZTo6c2hhcmVkXyk7Ci0KLSAgLy8gVHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhIHRoZQotICAvLyAidHlwZW5hbWUgVGVzdEZpeHR1cmU6OiIgcHJlZml4LgotICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6VmVjdG9yIGVtcHR5OwotICBFWFBFQ1RfRVEoMFUsIGVtcHR5LnNpemUoKSk7Ci0KLSAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6OkludFNldCBlbXB0eTI7Ci0gIEVYUEVDVF9FUSgwVSwgZW1wdHkyLnNpemUoKSk7Ci0KLSAgLy8gTm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzIG11c3QgYmUgdmlzaXRlZCB2aWEKLSAgLy8gJ3RoaXMnLCBhcyByZXF1aXJlZCBieSBDKysgZm9yIGNsYXNzIHRlbXBsYXRlcy4KLSAgRVhQRUNUX0VRKDIsIHRoaXMtPnZhbHVlXyk7Ci19Ci0KLS8vIFRoZSBzZWNvbmQgdGVzdCBtYWtlcyBzdXJlIHNoYXJlZF8gaXMgbm90IGRlbGV0ZWQgYWZ0ZXIgdGhlIGZpcnN0Ci0vLyB0ZXN0LgotVFlQRURfVEVTVChDb21tb25UZXN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpIHsKLSAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGFsc28gYmUgdmlzaXRlZAotICAvLyB2aWEgJ3RoaXMnLgotICBBU1NFUlRfVFJVRSh0aGlzLT5zaGFyZWRfICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoNSwgKnRoaXMtPnNoYXJlZF8pOwotCi0gIC8vIFR5cGVQYXJhbSBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIuCi0gIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxUeXBlUGFyYW0+KDIpLCB0aGlzLT52YWx1ZV8pOwotfQotCi0vLyBUZXN0cyB0aGF0IG11bHRpcGxlIFRZUEVEX1RFU1RfQ0FTRSdzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzYW1lCi0vLyB0cmFuc2xhdGlvbiB1bml0LgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVkVGVzdDEgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi0vLyBWZXJpZmllcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgVFlQRURfVEVTVF9DQVNFIGNhbiBiZSBhCi0vLyBzaW5nbGUgdHlwZS4KLVRZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QxLCBpbnQpOwotVFlQRURfVEVTVChUeXBlZFRlc3QxLCBBKSB7fQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVkVGVzdDIgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi0vLyBWZXJpZmllcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgVFlQRURfVEVTVF9DQVNFIGNhbiBiZSBhCi0vLyBUeXBlczwuLi4+IHR5cGUgbGlzdC4KLVRZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QyLCBUeXBlczxpbnQ+KTsKLQotLy8gVGhpcyBhbHNvIHZlcmlmaWVzIHRoYXQgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdHlwZWQgdGVzdCBjYXNlcyBjYW4KLS8vIHNoYXJlIHRoZSBzYW1lIG5hbWUuCi1UWVBFRF9URVNUKFR5cGVkVGVzdDIsIEEpIHt9Ci0KLS8vIFRlc3RzIHRoYXQgYSB0eXBlZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgaW4gYSBuYW1lc3BhY2UuCi0KLW5hbWVzcGFjZSBsaWJyYXJ5MSB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTnVtZXJpY1Rlc3QgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi10eXBlZGVmIFR5cGVzPGludCwgbG9uZz4gTnVtZXJpY1R5cGVzOwotVFlQRURfVEVTVF9DQVNFKE51bWVyaWNUZXN0LCBOdW1lcmljVHlwZXMpOwotCi1UWVBFRF9URVNUKE51bWVyaWNUZXN0LCBEZWZhdWx0SXNaZXJvKSB7Ci0gIEVYUEVDVF9FUSgwLCBUeXBlUGFyYW0oKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsaWJyYXJ5MQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLS8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLXVzaW5nIHRlc3Rpbmc6OlR5cGVzOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkVGVzdENhc2VQU3RhdGU7Ci0KLS8vIFRlc3RzIFR5cGVkVGVzdENhc2VQU3RhdGUuCi0KLWNsYXNzIFR5cGVkVGVzdENhc2VQU3RhdGVUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQSIpOwotICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQiIpOwotICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQyIpOwotICB9Ci0KLSAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSBzdGF0ZV87Ci19OwotCi1URVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QsIFN1Y2NlZWRzRm9yTWF0Y2hpbmdMaXN0KSB7Ci0gIGNvbnN0IGNoYXIqIHRlc3RzID0gIkEsIEIsIEMiOwotICBFWFBFQ1RfRVEodGVzdHMsCi0gICAgICAgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgdGVzdHMpKTsKLX0KLQotLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgdGVzdHMgYW5kIHNwYWNlcyBhcm91bmQgdGhlIG5hbWVzCi0vLyBkb24ndCBtYXR0ZXIuCi1URVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QsIElnbm9yZXNPcmRlckFuZFNwYWNlcykgewotICBjb25zdCBjaGFyKiB0ZXN0cyA9ICJBLEMsICAgQiI7Ci0gIEVYUEVDVF9FUSh0ZXN0cywKLSAgICAgICAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCB0ZXN0cykpOwotfQotCi10eXBlZGVmIFR5cGVkVGVzdENhc2VQU3RhdGVUZXN0IFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3Q7Ci0KLVRFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzRHVwbGljYXRlcykgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAotICAgICAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsICJBLCBCLCBBLCBDIiksCi0gICAgICAiZm9vXFwuY2MuMS4/OiBUZXN0IEEgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlXFwuIik7Ci19Ci0KLVRFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzRXh0cmFUZXN0KSB7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCi0gICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEIsIEMsIEQiKSwKLSAgICAgICJmb29cXC5jYy4xLj86IE5vIHRlc3QgbmFtZWQgRCBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2VcXC4iKTsKLX0KLQotVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNNaXNzZWRUZXN0KSB7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCi0gICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEMiKSwKLSAgICAgICJmb29cXC5jYy4xLj86IFlvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0IEJcXC4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBkZWZpbmluZyBhIHRlc3QgZm9yIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgZ2VuZXJhdGVzCi0vLyBhIHJ1bi10aW1lIGVycm9yIGlmIHRoZSB0ZXN0IGNhc2UgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KLVRFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzVGVzdEFmdGVyUmVnaXN0cmF0aW9uKSB7Ci0gIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQiwgQyIpOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAotICAgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAyLCAiRm9vVGVzdCIsICJEIiksCi0gICAgICAiZm9vXFwuY2MuMi4/OiBUZXN0IEQgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCIKLSAgICAgICJcXChGb29UZXN0LCBcXC5cXC5cXC5cXClcXC4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBTZXRVcFRlc3RDYXNlKCkvVGVhckRvd25UZXN0Q2FzZSgpLCBmaXh0dXJlIGN0b3IvZHRvciwKLS8vIGFuZCBTZXRVcCgpL1RlYXJEb3duKCkgd29yayBjb3JyZWN0bHkgaW4gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIENvbW1vblRlc3Q8VD4gewotfTsKLQotVFlQRURfVEVTVF9DQVNFX1AoRGVyaXZlZFRlc3QpOwotCi1UWVBFRF9URVNUX1AoRGVyaXZlZFRlc3QsIFZhbHVlc0FyZUNvcnJlY3QpIHsKLSAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhCi0gIC8vIHRoZSBUZXN0Rml4dHVyZTo6IHByZWZpeC4KLSAgRVhQRUNUX0VRKDUsICpUZXN0Rml4dHVyZTo6c2hhcmVkXyk7Ci0KLSAgLy8gTm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzIG11c3QgYmUgdmlzaXRlZCB2aWEKLSAgLy8gJ3RoaXMnLCBhcyByZXF1aXJlZCBieSBDKysgZm9yIGNsYXNzIHRlbXBsYXRlcy4KLSAgRVhQRUNUX0VRKDIsIHRoaXMtPnZhbHVlXyk7Ci19Ci0KLS8vIFRoZSBzZWNvbmQgdGVzdCBtYWtlcyBzdXJlIHNoYXJlZF8gaXMgbm90IGRlbGV0ZWQgYWZ0ZXIgdGhlIGZpcnN0Ci0vLyB0ZXN0LgotVFlQRURfVEVTVF9QKERlcml2ZWRUZXN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpIHsKLSAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGFsc28gYmUgdmlzaXRlZAotICAvLyB2aWEgJ3RoaXMnLgotICBBU1NFUlRfVFJVRSh0aGlzLT5zaGFyZWRfICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoNSwgKnRoaXMtPnNoYXJlZF8pOwotICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKLX0KLQotUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRGVyaXZlZFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNBcmVDb3JyZWN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpOwotCi10eXBlZGVmIFR5cGVzPHNob3J0LCBsb25nPiBNeVR3b1R5cGVzOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIERlcml2ZWRUZXN0LCBNeVR3b1R5cGVzKTsKLQotLy8gVGVzdHMgdGhhdCBtdWx0aXBsZSBUWVBFRF9URVNUX0NBU0VfUCdzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzYW1lCi0vLyB0cmFuc2xhdGlvbiB1bml0LgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVkVGVzdFAxIDogcHVibGljIFRlc3QgewotfTsKLQotVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UDEpOwotCi0vLyBGb3IgdGVzdGluZyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9DQVNFX1AoKSBhbmQKLS8vIFRZUEVEX1RFU1RfUCgpIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG5hbWVzcGFjZS4KLXR5cGVkZWYgaW50IEludEFmdGVyVHlwZWRUZXN0Q2FzZVA7Ci0KLVRZUEVEX1RFU1RfUChUeXBlZFRlc3RQMSwgQSkge30KLVRZUEVEX1RFU1RfUChUeXBlZFRlc3RQMSwgQikge30KLQotLy8gRm9yIHRlc3RpbmcgdGhhdCB0aGUgY29kZSBiZXR3ZWVuIFRZUEVEX1RFU1RfUCgpIGFuZAotLy8gUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoKSBpcyBub3QgZW5jbG9zZWQgaW4gYSBuYW1lc3BhY2UuCi10eXBlZGVmIGludCBJbnRCZWZvcmVSZWdpc3RlclR5cGVkVGVzdENhc2VQOwotCi1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMSwgQSwgQik7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVHlwZWRUZXN0UDIgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMik7Ci0KLS8vIFRoaXMgYWxzbyB2ZXJpZmllcyB0aGF0IHRlc3RzIGZyb20gZGlmZmVyZW50IHR5cGUtcGFyYW1ldGVyaXplZAotLy8gdGVzdCBjYXNlcyBjYW4gc2hhcmUgdGhlIHNhbWUgbmFtZS4KLVRZUEVEX1RFU1RfUChUeXBlZFRlc3RQMiwgQSkge30KLQotUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UDIsIEEpOwotCi0vLyBWZXJpZmllcyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9DQVNFX1AoKSBhbmQKLS8vIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKCkgaXMgbm90IGVuY2xvc2VkIGluIGEgbmFtZXNwYWNlLgotSW50QWZ0ZXJUeXBlZFRlc3RDYXNlUCBhZnRlciA9IDA7Ci1JbnRCZWZvcmVSZWdpc3RlclR5cGVkVGVzdENhc2VQIGJlZm9yZSA9IDA7Ci0KLS8vIFZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgYXJndW1lbnQgb2YgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKQotLy8gY2FuIGJlIGVpdGhlciBhIHNpbmdsZSB0eXBlIG9yIGEgVHlwZXM8Li4uPiB0eXBlIGxpc3QuCi1JTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChJbnQsIFR5cGVkVGVzdFAxLCBpbnQpOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoSW50LCBUeXBlZFRlc3RQMiwgVHlwZXM8aW50Pik7Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKLS8vIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LgotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoRG91YmxlLCBUeXBlZFRlc3RQMiwgVHlwZXM8ZG91YmxlPik7Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKLS8vIGluc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgotLy8gKENvbnRhaW5lclRlc3QgaXMgYWxzbyBpbnN0YW50aWF0ZWQgaW4gZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjLikKLXR5cGVkZWYgVHlwZXM8c3RkOjp2ZWN0b3I8ZG91YmxlPiwgc3RkOjpzZXQ8Y2hhcj4gPiBNeUNvbnRhaW5lcnM7Ci1JTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgQ29udGFpbmVyVGVzdCwgTXlDb250YWluZXJzKTsKLQotLy8gVGVzdHMgdGhhdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgYW5kCi0vLyBpbnN0YW50aWF0ZWQgaW4gYSBuYW1lc3BhY2UuCi0KLW5hbWVzcGFjZSBsaWJyYXJ5MiB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTnVtZXJpY1Rlc3QgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0VfUChOdW1lcmljVGVzdCk7Ci0KLVRZUEVEX1RFU1RfUChOdW1lcmljVGVzdCwgRGVmYXVsdElzWmVybykgewotICBFWFBFQ1RfRVEoMCwgVHlwZVBhcmFtKCkpOwotfQotCi1UWVBFRF9URVNUX1AoTnVtZXJpY1Rlc3QsIFplcm9Jc0xlc3NUaGFuT25lKSB7Ci0gIEVYUEVDVF9MVChUeXBlUGFyYW0oMCksIFR5cGVQYXJhbSgxKSk7Ci19Ci0KLVJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKE51bWVyaWNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElzWmVybywgWmVyb0lzTGVzc1RoYW5PbmUpOwotdHlwZWRlZiBUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIE51bWVyaWNUZXN0LCBOdW1lcmljVHlwZXMpOwotCi1zdGF0aWMgY29uc3QgY2hhciogR2V0VGVzdE5hbWUoKSB7Ci0gIHJldHVybiB0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKS0+bmFtZSgpOwotfQotLy8gVGVzdCB0aGUgc3RyaXBwaW5nIG9mIHNwYWNlIGZyb20gdGVzdCBuYW1lcwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFRyaW1tZWRUZXN0IDogcHVibGljIFRlc3QgeyB9OwotVFlQRURfVEVTVF9DQVNFX1AoVHJpbW1lZFRlc3QpOwotVFlQRURfVEVTVF9QKFRyaW1tZWRUZXN0LCBUZXN0MSkgeyBFWFBFQ1RfU1RSRVEoIlRlc3QxIiwgR2V0VGVzdE5hbWUoKSk7IH0KLVRZUEVEX1RFU1RfUChUcmltbWVkVGVzdCwgVGVzdDIpIHsgRVhQRUNUX1NUUkVRKCJUZXN0MiIsIEdldFRlc3ROYW1lKCkpOyB9Ci1UWVBFRF9URVNUX1AoVHJpbW1lZFRlc3QsIFRlc3QzKSB7IEVYUEVDVF9TVFJFUSgiVGVzdDMiLCBHZXRUZXN0TmFtZSgpKTsgfQotVFlQRURfVEVTVF9QKFRyaW1tZWRUZXN0LCBUZXN0NCkgeyBFWFBFQ1RfU1RSRVEoIlRlc3Q0IiwgR2V0VGVzdE5hbWUoKSk7IH0KLVRZUEVEX1RFU1RfUChUcmltbWVkVGVzdCwgVGVzdDUpIHsgRVhQRUNUX1NUUkVRKCJUZXN0NSIsIEdldFRlc3ROYW1lKCkpOyB9Ci1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCgKLSAgICBUcmltbWVkVGVzdCwKLSAgICBUZXN0MSwgVGVzdDIsVGVzdDMgLCBUZXN0NCAsVGVzdDUgKTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IE15UGFpciB7fTsKLS8vIEJlIHN1cmUgdG8gdHJ5IGEgdHlwZSB3aXRoIGEgY29tbWEgaW4gaXRzIG5hbWUganVzdCBpbiBjYXNlIGl0IG1hdHRlcnMuCi10eXBlZGVmIFR5cGVzPGludCwgZG91YmxlLCBNeVBhaXI8aW50LCBpbnQ+ID4gVHJpbVR5cGVzOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIFRyaW1tZWRUZXN0LCBUcmltVHlwZXMpOwotCi19ICAvLyBuYW1lc3BhY2UgbGlicmFyeTIKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLSNpZiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVCkgJiYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCkKLQotLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIHNvbWUKLS8vIGNvbXBpbGVycy4gSWYgd2UgdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGNvbXBpbGUgb3V0IGFsbAotLy8gY29kZSByZWZlcnJpbmcgdG8gdGhlIGd0ZXN0X21haW4gbGlicmFyeSwgTVNWQyBsaW5rZXIgd2lsbCBub3QgbGluawotLy8gdGhhdCBsaWJyYXJ5IGF0IGFsbCBhbmQgY29uc2VxdWVudGx5IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZW50cnkKLS8vIHBvaW50IGRlZmluZWQgaW4gdGhhdCBsaWJyYXJ5IChmYXRhbCBlcnJvciBMTksxNTYxOiBlbnRyeSBwb2ludAotLy8gbXVzdCBiZSBkZWZpbmVkKS4gVGhpcyBkdW1teSB0ZXN0IGtlZXBzIGd0ZXN0X21haW4gbGlua2VkIGluLgotVEVTVChEdW1teVRlc3QsIFR5cGVkVGVzdHNBcmVOb3RTdXBwb3J0ZWRPblRoaXNQbGF0Zm9ybSkge30KLQotI2VuZGlmICAvLyAjaWYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1QpICYmICFkZWZpbmVkKEdURVNUX0hBU19UWVBFRF9URVNUX1ApCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmggYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDc1NzAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaWZuZGVmIEdURVNUX1RFU1RfR1RFU1RfVFlQRURfVEVTVF9URVNUX0hfCi0jZGVmaW5lIEdURVNUX1RFU1RfR1RFU1RfVFlQRURfVEVTVF9URVNUX0hfCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi11c2luZyB0ZXN0aW5nOjpUZXN0OwotCi0vLyBGb3IgdGVzdGluZyB0aGF0IHRoZSBzYW1lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlCi0vLyBpbnN0YW50aWF0ZWQgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KLS8vIENvbnRhaW5lclRlc3Qgd2lsbCBiZSBpbnN0YW50aWF0ZWQgaW4gYm90aCBndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MKLS8vIGFuZCBndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENvbnRhaW5lclRlc3QgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0VfUChDb250YWluZXJUZXN0KTsKLQotVFlQRURfVEVTVF9QKENvbnRhaW5lclRlc3QsIENhbkJlRGVmYXVsdENvbnN0cnVjdGVkKSB7Ci0gIFR5cGVQYXJhbSBjb250YWluZXI7Ci19Ci0KLVRZUEVEX1RFU1RfUChDb250YWluZXJUZXN0LCBJbml0aWFsU2l6ZUlzWmVybykgewotICBUeXBlUGFyYW0gY29udGFpbmVyOwotICBFWFBFQ1RfRVEoMFUsIGNvbnRhaW5lci5zaXplKCkpOwotfQotCi1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChDb250YWluZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuQmVEZWZhdWx0Q29uc3RydWN0ZWQsIEluaXRpYWxTaXplSXNaZXJvKTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLSNlbmRpZiAgLy8gR1RFU1RfVEVTVF9HVEVTVF9UWVBFRF9URVNUX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmNTE2OC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgdmVyaWZ5aW5nIGNvcnJlY3RuZXNzIG9mIGRhdGEgcHJvdmlkZWQgdmlhCi0vLyBVbml0VGVzdCdzIHB1YmxpYyBtZXRob2RzLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIHN0cmNtcC4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLXVzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IExlc3NCeU5hbWUgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCogYSwgY29uc3QgVCogYikgewotICAgIHJldHVybiBzdHJjbXAoYS0+bmFtZSgpLCBiLT5uYW1lKCkpIDwgMDsKLSAgfQotfTsKLQotY2xhc3MgVW5pdFRlc3RIZWxwZXIgewotIHB1YmxpYzoKLSAgLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHRlc3QgY2FzZXMgc29ydGVkIGJ5IHRoZSB0ZXN0IGNhc2UKLSAgLy8gbmFtZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBhcnJheS4KLSAgc3RhdGljIFRlc3RDYXNlIGNvbnN0KiogR2V0U29ydGVkVGVzdENhc2VzKCkgewotICAgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7Ci0gICAgVGVzdENhc2UgY29uc3QqKiBjb25zdCB0ZXN0X2Nhc2VzID0KLSAgICAgICAgbmV3IGNvbnN0IFRlc3RDYXNlKlt1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCldOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkKLSAgICAgIHRlc3RfY2FzZXNbaV0gPSB1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7Ci0KLSAgICBzdGQ6OnNvcnQodGVzdF9jYXNlcywKLSAgICAgICAgICAgICAgdGVzdF9jYXNlcyArIHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSwKLSAgICAgICAgICAgICAgTGVzc0J5TmFtZTxUZXN0Q2FzZT4oKSk7Ci0gICAgcmV0dXJuIHRlc3RfY2FzZXM7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgYnkgaXRzIG5hbWUuICBUaGUgY2FsbGVyIGRvZXNuJ3Qgb3duIHRoZSByZXR1cm5lZAotICAvLyBwb2ludGVyLgotICBzdGF0aWMgY29uc3QgVGVzdENhc2UqIEZpbmRUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgVW5pdFRlc3QmIHVuaXRfdGVzdCA9ICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7Ci0gICAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOwotICAgICAgaWYgKDAgPT0gc3RyY21wKHRlc3RfY2FzZS0+bmFtZSgpLCBuYW1lKSkKLSAgICAgICAgcmV0dXJuIHRlc3RfY2FzZTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBhcnJheSBvZiBwb2ludGVycyB0byBhbGwgdGVzdHMgaW4gYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZQotICAvLyBzb3J0ZWQgYnkgdGhlIHRlc3QgbmFtZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotICAvLyBhcnJheS4KLSAgc3RhdGljIFRlc3RJbmZvIGNvbnN0KiogR2V0U29ydGVkVGVzdHMoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgewotICAgIFRlc3RJbmZvIGNvbnN0KiogY29uc3QgdGVzdHMgPQotICAgICAgICBuZXcgY29uc3QgVGVzdEluZm8qW3Rlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpXTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkKLSAgICAgIHRlc3RzW2ldID0gdGVzdF9jYXNlLT5HZXRUZXN0SW5mbyhpKTsKLQotICAgIHN0ZDo6c29ydCh0ZXN0cywgdGVzdHMgKyB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSwKLSAgICAgICAgICAgICAgTGVzc0J5TmFtZTxUZXN0SW5mbz4oKSk7Ci0gICAgcmV0dXJuIHRlc3RzOwotICB9Ci19OwotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUZXN0Q2FzZVdpdGhDb21tZW50VGVzdCA6IHB1YmxpYyBUZXN0IHt9OwotVFlQRURfVEVTVF9DQVNFKFRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LCBUeXBlczxpbnQ+KTsKLVRZUEVEX1RFU1QoVGVzdENhc2VXaXRoQ29tbWVudFRlc3QsIER1bW15KSB7fQotCi1jb25zdCBpbnQga1R5cGVkVGVzdENhc2VzID0gMTsKLWNvbnN0IGludCBrVHlwZWRUZXN0cyA9IDE7Ci0jZWxzZQotY29uc3QgaW50IGtUeXBlZFRlc3RDYXNlcyA9IDA7Ci1jb25zdCBpbnQga1R5cGVkVGVzdHMgPSAwOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi0vLyBXZSBjYW4gb25seSB0ZXN0IHRoZSBhY2Nlc3NvcnMgdGhhdCBkbyBub3QgY2hhbmdlIHZhbHVlIHdoaWxlIHRlc3RzIHJ1bi4KLS8vIFNpbmNlIHRlc3RzIGNhbiBiZSBydW4gaW4gYW55IG9yZGVyLCB0aGUgdmFsdWVzIHRoZSBhY2Nlc3NvcnMgdGhhdCB0cmFjawotLy8gdGVzdCBleGVjdXRpb24gKHN1Y2ggYXMgZmFpbGVkX3Rlc3RfY291bnQpIGNhbiBub3QgYmUgcHJlZGljdGVkLgotVEVTVChBcGlUZXN0LCBVbml0VGVzdEltbXV0YWJsZUFjY2Vzc29yc1dvcmspIHsKLSAgVW5pdFRlc3QqIHVuaXRfdGVzdCA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOwotCi0gIEFTU0VSVF9FUSgyICsga1R5cGVkVGVzdENhc2VzLCB1bml0X3Rlc3QtPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDEgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDIsIHVuaXRfdGVzdC0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDUgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMyArIGtUeXBlZFRlc3RzLCB1bml0X3Rlc3QtPnRlc3RfdG9fcnVuX2NvdW50KCkpOwotCi0gIGNvbnN0IFRlc3RDYXNlKiogY29uc3QgdGVzdF9jYXNlcyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0Q2FzZXMoKTsKLQotICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2VzWzBdLT5uYW1lKCkpOwotICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX1Rlc3QiLCB0ZXN0X2Nhc2VzWzFdLT5uYW1lKCkpOwotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCi0gIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RfY2FzZXNbMl0tPm5hbWUoKSk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLSAgZGVsZXRlW10gdGVzdF9jYXNlczsKLQotICAvLyBUaGUgZm9sbG93aW5nIGxpbmVzIGluaXRpYXRlIGFjdGlvbnMgdG8gdmVyaWZ5IGNlcnRhaW4gbWV0aG9kcyBpbgotICAvLyBGaW5hbFN1Y2Nlc3NDaGVja2VyOjpUZWFyRG93bi4KLQotICAvLyBSZWNvcmRzIGEgdGVzdCBwcm9wZXJ0eSB0byB2ZXJpZnkgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KCkuCi0gIFJlY29yZFByb3BlcnR5KCJrZXkiLCAidmFsdWUiKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzTnVsbChjb25zdCBjaGFyKiBzdHIpIHsKLSAgaWYgKHN0ciAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCAiYXJndW1lbnQgaXMgIiA8PCBzdHI7Ci0gIH0KLSAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLX0KLQotVEVTVChBcGlUZXN0LCBUZXN0Q2FzZUltbXV0YWJsZUFjY2Vzc29yc1dvcmspIHsKLSAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkFwaVRlc3QiKTsKLSAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOwotCi0gIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpKTsKLSAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDMsIHRlc3RfY2FzZS0+dGVzdF90b19ydW5fY291bnQoKSk7Ci0gIEFTU0VSVF9FUSg0LCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSk7Ci0KLSAgY29uc3QgVGVzdEluZm8qKiB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOwotCi0gIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfRHVtbXkxIiwgdGVzdHNbMF0tPm5hbWUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzBdLT52YWx1ZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKLQotICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlRGlzYWJsZWRBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMV0tPm5hbWUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzFdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzFdLT52YWx1ZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dHlwZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5zaG91bGRfcnVuKCkpOwotCi0gIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMl0tPm5hbWUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzJdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzJdLT52YWx1ZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dHlwZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5zaG91bGRfcnVuKCkpOwotCi0gIEVYUEVDVF9TVFJFUSgiVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbM10tPm5hbWUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzNdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzNdLT52YWx1ZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dHlwZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5zaG91bGRfcnVuKCkpOwotCi0gIGRlbGV0ZVtdIHRlc3RzOwotICB0ZXN0cyA9IE5VTEw7Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotICB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIik7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKLQotICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7Ci0gIEVYUEVDVF9TVFJFUShHZXRUeXBlTmFtZTxpbnQ+KCkuY19zdHIoKSwgdGVzdF9jYXNlLT50eXBlX3BhcmFtKCkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7Ci0gIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOwotICBBU1NFUlRfRVEoMSwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOwotCi0gIHRlc3RzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RzKHRlc3RfY2FzZSk7Ci0KLSAgRVhQRUNUX1NUUkVRKCJEdW1teSIsIHRlc3RzWzBdLT5uYW1lKCkpOwotICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dmFsdWVfcGFyYW0oKSkpOwotICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RzWzBdLT50eXBlX3BhcmFtKCkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKLQotICBkZWxldGVbXSB0ZXN0czsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKLX0KLQotVEVTVChBcGlUZXN0LCBUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yaykgewotICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiRElTQUJMRURfVGVzdCIpOwotICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7Ci0KLSAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlLT5uYW1lKCkpOwotICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlLT50eXBlX3BhcmFtKCkpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpKTsKLSAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZS0+dGVzdF90b19ydW5fY291bnQoKSk7Ci0gIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKSk7Ci0KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8oMCk7Ci0gIEVYUEVDVF9TVFJFUSgiRHVtbXkyIiwgdGVzdF9pbmZvLT5uYW1lKCkpOwotICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKSk7Ci0gIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2luZm8tPnR5cGVfcGFyYW0oKSkpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9pbmZvLT5zaG91bGRfcnVuKCkpOwotfQotCi0vLyBUaGVzZSB0d28gdGVzdHMgYXJlIGhlcmUgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0ZXN0aW5nCi0vLyB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50LCBkaXNhYmxlZF90ZXN0X2NvdW50LCBhbmQgdGVzdF90b19ydW5fY291bnQuCi1URVNUKEFwaVRlc3QsIERJU0FCTEVEX0R1bW15MSkge30KLVRFU1QoRElTQUJMRURfVGVzdCwgRHVtbXkyKSB7fQotCi1jbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyIDogcHVibGljIEVudmlyb25tZW50IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBVbml0VGVzdCogdW5pdF90ZXN0ID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7Ci0KLSAgICBFWFBFQ1RfRVEoMSArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMyArIGtUeXBlZFRlc3RzLCB1bml0X3Rlc3QtPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgdW5pdF90ZXN0LT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLCB1bml0X3Rlc3QtPmZhaWxlZF90ZXN0X2NvdW50KCkpOwotICAgIEVYUEVDVF9UUlVFKHVuaXRfdGVzdC0+UGFzc2VkKCkpOwotICAgIEVYUEVDVF9GQUxTRSh1bml0X3Rlc3QtPkZhaWxlZCgpKTsKLSAgICBBU1NFUlRfRVEoMiArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSk7Ci0KLSAgICBjb25zdCBUZXN0Q2FzZSoqIGNvbnN0IHRlc3RfY2FzZXMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdENhc2VzKCk7Ci0KLSAgICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2VzWzBdLT5uYW1lKCkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2Nhc2VzWzBdLT50eXBlX3BhcmFtKCkpKTsKLSAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzBdLT5zaG91bGRfcnVuKCkpOwotICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzBdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOwotICAgIEFTU0VSVF9FUSg0LCB0ZXN0X2Nhc2VzWzBdLT50b3RhbF90ZXN0X2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgzLCB0ZXN0X2Nhc2VzWzBdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMF0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMF0tPlBhc3NlZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0UodGVzdF9jYXNlc1swXS0+RmFpbGVkKCkpOwotCi0gICAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlc1sxXS0+bmFtZSgpKTsKLSAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlc1sxXS0+dHlwZV9wYXJhbSgpKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZXNbMV0tPnNob3VsZF9ydW4oKSk7Ci0gICAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZXNbMV0tPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7Ci0gICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZXNbMV0tPnRvdGFsX3Rlc3RfY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMV0tPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlc1sxXS0+ZmFpbGVkX3Rlc3RfY291bnQoKSk7Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RfY2FzZXNbMl0tPm5hbWUoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0X2Nhc2VzWzJdLT50eXBlX3BhcmFtKCkpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMl0tPnNob3VsZF9ydW4oKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMl0tPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7Ci0gICAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZXNbMl0tPnRvdGFsX3Rlc3RfY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIHRlc3RfY2FzZXNbMl0tPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlc1syXS0+ZmFpbGVkX3Rlc3RfY291bnQoKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlc1syXS0+UGFzc2VkKCkpOwotICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VzWzJdLT5GYWlsZWQoKSk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLSAgICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiQXBpVGVzdCIpOwotICAgIGNvbnN0IFRlc3RJbmZvKiogdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKLSAgICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX0R1bW15MSIsIHRlc3RzWzBdLT5uYW1lKCkpOwotICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLSAgICBFWFBFQ1RfRkFMU0UodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7Ci0KLSAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlRGlzYWJsZWRBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMV0tPm5hbWUoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbMV0tPnRlc3RfY2FzZV9uYW1lKCkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dmFsdWVfcGFyYW0oKSkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dHlwZV9wYXJhbSgpKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdHNbMV0tPnNob3VsZF9ydW4oKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdHNbMV0tPnJlc3VsdCgpLT5QYXNzZWQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHRlc3RzWzFdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKLQotICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbMl0tPm5hbWUoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbMl0tPnRlc3RfY2FzZV9uYW1lKCkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dmFsdWVfcGFyYW0oKSkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dHlwZV9wYXJhbSgpKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdHNbMl0tPnNob3VsZF9ydW4oKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdHNbMl0tPnJlc3VsdCgpLT5QYXNzZWQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHRlc3RzWzJdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKLQotICAgIEVYUEVDVF9TVFJFUSgiVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrIiwgdGVzdHNbM10tPm5hbWUoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdHNbM10tPnRlc3RfY2FzZV9uYW1lKCkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dmFsdWVfcGFyYW0oKSkpOwotICAgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dHlwZV9wYXJhbSgpKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdHNbM10tPnNob3VsZF9ydW4oKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdHNbM10tPnJlc3VsdCgpLT5QYXNzZWQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIHRlc3RzWzNdLT5yZXN1bHQoKS0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKLSAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5ID0gdGVzdHNbM10tPnJlc3VsdCgpLT5HZXRUZXN0UHJvcGVydHkoMCk7Ci0gICAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJ2YWx1ZSIsIHByb3BlcnR5LnZhbHVlKCkpOwotCi0gICAgZGVsZXRlW10gdGVzdHM7Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotICAgIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiKTsKLSAgICB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOwotCi0gICAgRVhQRUNUX1NUUkVRKCJEdW1teSIsIHRlc3RzWzBdLT5uYW1lKCkpOwotICAgIEVYUEVDVF9TVFJFUSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIsIHRlc3RzWzBdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKLSAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnZhbHVlX3BhcmFtKCkpKTsKLSAgICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RzWzBdLT50eXBlX3BhcmFtKCkpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RzWzBdLT5zaG91bGRfcnVuKCkpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RzWzBdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOwotICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1swXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7Ci0KLSAgICBkZWxldGVbXSB0ZXN0czsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKLSAgICBkZWxldGVbXSB0ZXN0X2Nhc2VzOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyB0ZXN0aW5nOjppbnRlcm5hbDo6RmluYWxTdWNjZXNzQ2hlY2tlcigpKTsKLQotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTVhYTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9hbGxfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGVzdHMgZm9yIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFNvbWV0aW1lcyBpdCdzIGRlc2lyYWJsZSB0byBidWlsZCBtb3N0IG9mIEdvb2dsZSBUZXN0J3Mgb3duIHRlc3RzCi0vLyBieSBjb21waWxpbmcgYSBzaW5nbGUgZmlsZS4gIFRoaXMgZmlsZSBzZXJ2ZXMgdGhpcyBwdXJwb3NlLgotI2luY2x1ZGUgInRlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyIKLSNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIgotI2luY2x1ZGUgInRlc3QvcHJvZHVjdGlvbi5jYyIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5IGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4ZjNlMGYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIGJyZWFrLW9uLWZhaWx1cmUgbW9kZS4KLQotQSB1c2VyIGNhbiBhc2sgR29vZ2xlIFRlc3QgdG8gc2VnLWZhdWx0IHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzLCB1c2luZwotZWl0aGVyIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQotLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcuICBUaGlzIHNjcmlwdCB0ZXN0cyBzdWNoIGZ1bmN0aW9uYWxpdHkKLWJ5IGludm9raW5nIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfIChhIHByb2dyYW0gd3JpdHRlbiB3aXRoCi1Hb29nbGUgVGVzdCkgd2l0aCBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIGFuZCBjb21tYW5kIGxpbmUgZmxhZ3MuCi0iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKLWltcG9ydCBvcwotaW1wb3J0IHN5cwotCi0KLSMgQ29uc3RhbnRzLgotCi1JU19XSU5ET1dTID0gb3MubmFtZSA9PSAnbnQnCi0KLSMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIGJyZWFrLW9uLWZhaWx1cmUgbW9kZS4KLUJSRUFLX09OX0ZBSUxVUkVfRU5WX1ZBUiA9ICdHVEVTVF9CUkVBS19PTl9GQUlMVVJFJwotCi0jIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBicmVhay1vbi1mYWlsdXJlIG1vZGUuCi1CUkVBS19PTl9GQUlMVVJFX0ZMQUcgPSAnZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZScKLQotIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlLgotVEhST1dfT05fRkFJTFVSRV9FTlZfVkFSID0gJ0dURVNUX1RIUk9XX09OX0ZBSUxVUkUnCi0KLSMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIGNhdGNoLWV4Y2VwdGlvbnMgbW9kZS4KLUNBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUiA9ICdHVEVTVF9DQVRDSF9FWENFUFRJT05TJwotCi0jIFBhdGggdG8gdGhlIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfIHByb2dyYW0uCi1FWEVfUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKAotICAgICdndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XycpCi0KLQotZW52aXJvbiA9IGd0ZXN0X3Rlc3RfdXRpbHMuZW52aXJvbgotU2V0RW52VmFyID0gZ3Rlc3RfdGVzdF91dGlscy5TZXRFbnZWYXIKLQotIyBUZXN0cyBpbiB0aGlzIGZpbGUgcnVuIGEgR29vZ2xlLVRlc3QtYmFzZWQgdGVzdCBwcm9ncmFtIGFuZCBleHBlY3QgaXQKLSMgdG8gdGVybWluYXRlIHByZW1hdHVyZWx5LiAgVGhlcmVmb3JlIHRoZXkgYXJlIGluY29tcGF0aWJsZSB3aXRoCi0jIHRoZSBwcmVtYXR1cmUtZXhpdC1maWxlIHByb3RvY29sIGJ5IGRlc2lnbi4gIFVuc2V0IHRoZQotIyBwcmVtYXR1cmUtZXhpdCBmaWxlcGF0aCB0byBwcmV2ZW50IEdvb2dsZSBUZXN0IGZyb20gY3JlYXRpbmcKLSMgdGhlIGZpbGUuCi1TZXRFbnZWYXIoZ3Rlc3RfdGVzdF91dGlscy5QUkVNQVRVUkVfRVhJVF9GSUxFX0VOVl9WQVIsIE5vbmUpCi0KLQotZGVmIFJ1bihjb21tYW5kKToKLSAgIiIiUnVucyBhIGNvbW1hbmQ7IHJldHVybnMgMSBpZiBpdCB3YXMga2lsbGVkIGJ5IGEgc2lnbmFsLCBvciAwIG90aGVyd2lzZS4iIiIKLQotICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQsIGVudj1lbnZpcm9uKQotICBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsOgotICAgIHJldHVybiAxCi0gIGVsc2U6Ci0gICAgcmV0dXJuIDAKLQotCi0jIFRoZSB0ZXN0cy4KLQotCi1jbGFzcyBHVGVzdEJyZWFrT25GYWlsdXJlVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0gICIiIlRlc3RzIHVzaW5nIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlIG9yCi0gIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZyB0byB0dXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvCi0gIHNlZ21lbnRhdGlvbiBmYXVsdHMuCi0gICIiIgotCi0gIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZW52X3Zhcl92YWx1ZSwgZmxhZ192YWx1ZSwgZXhwZWN0X3NlZ19mYXVsdCk6Ci0gICAgIiIiUnVucyBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyBhbmQgdmVyaWZpZXMgdGhhdCBpdCBkb2VzCi0gICAgKG9yIGRvZXMgbm90KSBoYXZlIGEgc2VnLWZhdWx0LgotCi0gICAgQXJnczoKLSAgICAgIGVudl92YXJfdmFsdWU6ICAgIHZhbHVlIG9mIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTsgTm9uZSBpZiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHVuc2V0LgotICAgICAgZmxhZ192YWx1ZTogICAgICAgdmFsdWUgb2YgdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnOwotICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSBpZiB0aGUgZmxhZyBzaG91bGQgbm90IGJlIHByZXNlbnQuCi0gICAgICBleHBlY3Rfc2VnX2ZhdWx0OiAxIGlmIHRoZSBwcm9ncmFtIGlzIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGEgc2VnLWZhdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgMCBvdGhlcndpc2UuCi0gICAgIiIiCi0KLSAgICBTZXRFbnZWYXIoQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSLCBlbnZfdmFyX3ZhbHVlKQotCi0gICAgaWYgZW52X3Zhcl92YWx1ZSBpcyBOb25lOgotICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnIGlzIG5vdCBzZXQnCi0gICAgZWxzZToKLSAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJz0nICsgZW52X3Zhcl92YWx1ZQotCi0gICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgotICAgICAgZmxhZyA9ICcnCi0gICAgZWxpZiBmbGFnX3ZhbHVlID09ICcwJzoKLSAgICAgIGZsYWcgPSAnLS0lcz0wJyAlIEJSRUFLX09OX0ZBSUxVUkVfRkxBRwotICAgIGVsc2U6Ci0gICAgICBmbGFnID0gJy0tJXMnICUgQlJFQUtfT05fRkFJTFVSRV9GTEFHCi0KLSAgICBjb21tYW5kID0gW0VYRV9QQVRIXQotICAgIGlmIGZsYWc6Ci0gICAgICBjb21tYW5kLmFwcGVuZChmbGFnKQotCi0gICAgaWYgZXhwZWN0X3NlZ19mYXVsdDoKLSAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkJwotICAgIGVsc2U6Ci0gICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCBub3QnCi0KLSAgICBoYXNfc2VnX2ZhdWx0ID0gUnVuKGNvbW1hbmQpCi0KLSAgICBTZXRFbnZWYXIoQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSLCBOb25lKQotCi0gICAgbXNnID0gKCd3aGVuICVzJXMsIGFuIGFzc2VydGlvbiBmYWlsdXJlIGluICIlcyIgJXMgY2F1c2UgYSBzZWctZmF1bHQuJyAlCi0gICAgICAgICAgIChCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIsIGVudl92YXJfdmFsdWVfbXNnLCAnICcuam9pbihjb21tYW5kKSwKLSAgICAgICAgICAgIHNob3VsZF9vcl9ub3QpKQotICAgIHNlbGYuYXNzZXJ0XyhoYXNfc2VnX2ZhdWx0ID09IGV4cGVjdF9zZWdfZmF1bHQsIG1zZykKLQotICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKLSAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgbW9kZS4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQotCi0gIGRlZiB0ZXN0RW52VmFyKHNlbGYpOgotICAgICIiIlRlc3RzIHVzaW5nIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQotCi0gIGRlZiB0ZXN0RmxhZyhzZWxmKToKLSAgICAiIiJUZXN0cyB1c2luZyB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCi0KLSAgZGVmIHRlc3RGbGFnT3ZlcnJpZGVzRW52VmFyKHNlbGYpOgotICAgICIiIlRlc3RzIHRoYXQgdGhlIGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAotICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MCkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAotICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKLQotICBkZWYgdGVzdEJyZWFrT25GYWlsdXJlT3ZlcnJpZGVzVGhyb3dPbkZhaWx1cmUoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhhdCBndGVzdF9icmVha19vbl9mYWlsdXJlIG92ZXJyaWRlcyBndGVzdF90aHJvd19vbl9mYWlsdXJlLiIiIgotCi0gICAgU2V0RW52VmFyKFRIUk9XX09OX0ZBSUxVUkVfRU5WX1ZBUiwgJzEnKQotICAgIHRyeToKLSAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQotICAgIGZpbmFsbHk6Ci0gICAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRV9FTlZfVkFSLCBOb25lKQotCi0gIGlmIElTX1dJTkRPV1M6Ci0gICAgZGVmIHRlc3RDYXRjaEV4Y2VwdGlvbnNEb2VzTm90SW50ZXJmZXJlKHNlbGYpOgotICAgICAgIiIiVGVzdHMgdGhhdCBndGVzdF9jYXRjaF9leGNlcHRpb25zIGRvZXNuJ3QgaW50ZXJmZXJlLiIiIgotCi0gICAgICBTZXRFbnZWYXIoQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSLCAnMScpCi0gICAgICB0cnk6Ci0gICAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQotICAgICAgZmluYWxseToKLSAgICAgICAgU2V0RW52VmFyKENBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUiwgTm9uZSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDA3NDc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyBicmVhay1vbi1mYWlsdXJlIG1vZGUuCi0vLwotLy8gQSB1c2VyIGNhbiBhc2sgR29vZ2xlIFRlc3QgdG8gc2VnLWZhdWx0IHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzLCB1c2luZwotLy8gZWl0aGVyIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQotLy8gLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWcuICBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgdGVzdGluZyBzdWNoCi0vLyBmdW5jdGlvbmFsaXR5LgotLy8KLS8vIFRoaXMgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuICBJdCBpcwotLy8gZXhwZWN0ZWQgdG8gZmFpbC4gIERvbid0IHJ1biBpdCBkaXJlY3RseS4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHsKLQotLy8gQSB0ZXN0IHRoYXQncyBleHBlY3RlZCB0byBmYWlsLgotVEVTVChGb28sIEJhcikgewotICBFWFBFQ1RfRVEoMiwgMyk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU0VIICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotLy8gT24gV2luZG93cyBNb2JpbGUgZ2xvYmFsIGV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgbm90IHN1cHBvcnRlZC4KLUxPTkcgV0lOQVBJIEV4aXRXaXRoRXhjZXB0aW9uQ29kZSgKLSAgICBzdHJ1Y3QgX0VYQ0VQVElPTl9QT0lOVEVSUyogZXhjZXB0aW9uX3BvaW50ZXJzKSB7Ci0gIGV4aXQoZXhjZXB0aW9uX3BvaW50ZXJzLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGUpOwotfQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIC8vIFN1cHByZXNzZXMgZGlzcGxheSBvZiB0aGUgV2luZG93cyBlcnJvciBkaWFsb2cgdXBvbiBlbmNvdW50ZXJpbmcKLSAgLy8gYSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgKHNlZ21lbnQgdmlvbGF0aW9uKS4KLSAgU2V0RXJyb3JNb2RlKFNFTV9OT0dQRkFVTFRFUlJPUkJPWCB8IFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOwotCi0jIGlmIEdURVNUX0hBU19TRUggJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSAgLy8gVGhlIGRlZmF1bHQgdW5oYW5kbGVkIGV4Y2VwdGlvbiBmaWx0ZXIgZG9lcyBub3QgYWx3YXlzIGV4aXQKLSAgLy8gd2l0aCB0aGUgZXhjZXB0aW9uIGNvZGUgYXMgZXhpdCBjb2RlIC0gZm9yIGV4YW1wbGUgaXQgZXhpdHMgd2l0aAotICAvLyAwIGZvciBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiBhbmQgMSBmb3IgRVhDRVBUSU9OX0JSRUFLUE9JTlQKLSAgLy8gaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUuIFRodXMgd2UgdXNlIG91ciBvd24KLSAgLy8gZmlsdGVyIHdoaWNoIGFsd2F5cyBleGl0cyB3aXRoIHRoZSBleGNlcHRpb24gY29kZSBmb3IgdW5oYW5kbGVkCi0gIC8vIGV4Y2VwdGlvbnMuCi0gIFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihFeGl0V2l0aEV4Y2VwdGlvbkNvZGUpOwotCi0jIGVuZGlmCi0jZW5kaWYKLQotICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmZjMjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVGVzdHMgR29vZ2xlIFRlc3QncyBleGNlcHRpb24gY2F0Y2hpbmcgYmVoYXZpb3IuCi0KLVRoaXMgc2NyaXB0IGludm9rZXMgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0XyBhbmQKLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfZXhfdGVzdF8gKHByb2dyYW1zIHdyaXR0ZW4gd2l0aAotR29vZ2xlIFRlc3QpIGFuZCB2ZXJpZmllcyB0aGVpciBvdXRwdXQuCi0iIiIKLQotX19hdXRob3JfXyA9ICd2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KScKLQotaW1wb3J0IG9zCi0KLWltcG9ydCBndGVzdF90ZXN0X3V0aWxzCi0KLSMgQ29uc3RhbnRzLgotRkxBR19QUkVGSVggPSAnLS1ndGVzdF8nCi1MSVNUX1RFU1RTX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdsaXN0X3Rlc3RzJwotTk9fQ0FUQ0hfRVhDRVBUSU9OU19GTEFHID0gRkxBR19QUkVGSVggKyAnY2F0Y2hfZXhjZXB0aW9ucz0wJwotRklMVEVSX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdmaWx0ZXInCi0KLSMgUGF0aCB0byB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XyBiaW5hcnksIGNvbXBpbGVkIHdpdGgKLSMgZXhjZXB0aW9ucyBlbmFibGVkLgotRVhfRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKLSAgICAnZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XycpCi0KLSMgUGF0aCB0byB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0XyBiaW5hcnksIGNvbXBpbGVkIHdpdGgKLSMgZXhjZXB0aW9ucyBkaXNhYmxlZC4KLUVYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCi0gICAgJ2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfbm9fZXhfdGVzdF8nKQotCi1lbnZpcm9uID0gZ3Rlc3RfdGVzdF91dGlscy5lbnZpcm9uCi1TZXRFbnZWYXIgPSBndGVzdF90ZXN0X3V0aWxzLlNldEVudlZhcgotCi0jIFRlc3RzIGluIHRoaXMgZmlsZSBydW4gYSBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0IHByb2dyYW0gYW5kIGV4cGVjdCBpdAotIyB0byB0ZXJtaW5hdGUgcHJlbWF0dXJlbHkuICBUaGVyZWZvcmUgdGhleSBhcmUgaW5jb21wYXRpYmxlIHdpdGgKLSMgdGhlIHByZW1hdHVyZS1leGl0LWZpbGUgcHJvdG9jb2wgYnkgZGVzaWduLiAgVW5zZXQgdGhlCi0jIHByZW1hdHVyZS1leGl0IGZpbGVwYXRoIHRvIHByZXZlbnQgR29vZ2xlIFRlc3QgZnJvbSBjcmVhdGluZwotIyB0aGUgZmlsZS4KLVNldEVudlZhcihndGVzdF90ZXN0X3V0aWxzLlBSRU1BVFVSRV9FWElUX0ZJTEVfRU5WX1ZBUiwgTm9uZSkKLQotVEVTVF9MSVNUID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAotICAgIFtFWEVfUEFUSCwgTElTVF9URVNUU19GTEFHXSwgZW52PWVudmlyb24pLm91dHB1dAotCi1TVVBQT1JUU19TRUhfRVhDRVBUSU9OUyA9ICdUaHJvd3NTZWhFeGNlcHRpb24nIGluIFRFU1RfTElTVAotCi1pZiBTVVBQT1JUU19TRUhfRVhDRVBUSU9OUzoKLSAgQklOQVJZX09VVFBVVCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbRVhFX1BBVEhdLCBlbnY9ZW52aXJvbikub3V0cHV0Ci0KLUVYX0JJTkFSWV9PVVRQVVQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCi0gICAgW0VYX0VYRV9QQVRIXSwgZW52PWVudmlyb24pLm91dHB1dAotCi0KLSMgVGhlIHRlc3RzLgotaWYgU1VQUE9SVFNfU0VIX0VYQ0VQVElPTlM6Ci0gICMgcHlsaW50OmRpc2FibGUtbXNnPUM2MzAyCi0gIGNsYXNzIENhdGNoU2VoRXhjZXB0aW9uc1Rlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0gICAgIiIiVGVzdHMgZXhjZXB0aW9uLWNhdGNoaW5nIGJlaGF2aW9yLiIiIgotCi0KLSAgICBkZWYgVGVzdFNlaEV4Y2VwdGlvbnMoc2VsZiwgdGVzdF9vdXRwdXQpOgotICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biAnCi0gICAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgY29uc3RydWN0b3InCi0gICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCi0gICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duICcKLSAgICAgICAgICAgICAgICAgICAnaW4gdGhlIHRlc3QgZml4dHVyZVwncyBkZXN0cnVjdG9yJwotICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQotICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiBTZXRVcFRlc3RDYXNlKCknCi0gICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCi0gICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIFRlYXJEb3duVGVzdENhc2UoKScKLSAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKLSAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gU2V0VXAoKScKLSAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKLSAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gVGVhckRvd24oKScKLSAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKLSAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gdGhlIHRlc3QgYm9keScKLSAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKLQotICAgIGRlZiB0ZXN0Q2F0Y2hlc1NlaEV4Y2VwdGlvbnNXaXRoQ3h4RXhjZXB0aW9uc0VuYWJsZWQoc2VsZik6Ci0gICAgICBzZWxmLlRlc3RTZWhFeGNlcHRpb25zKEVYX0JJTkFSWV9PVVRQVVQpCi0KLSAgICBkZWYgdGVzdENhdGNoZXNTZWhFeGNlcHRpb25zV2l0aEN4eEV4Y2VwdGlvbnNEaXNhYmxlZChzZWxmKToKLSAgICAgIHNlbGYuVGVzdFNlaEV4Y2VwdGlvbnMoQklOQVJZX09VVFBVVCkKLQotCi1jbGFzcyBDYXRjaEN4eEV4Y2VwdGlvbnNUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgotICAiIiJUZXN0cyBDKysgZXhjZXB0aW9uLWNhdGNoaW5nIGJlaGF2aW9yLgotCi0gICAgIFRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHZlcmlmeSB0aGF0OgotICAgICAqIEMrKyBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIGxvZ2dlZCBhcyBDKysgKG5vdCBTRUgpIGV4Y2VwdGlvbnMKLSAgICAgKiBFeGNlcHRpb24gdGhyb3duIGFmZmVjdCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0IHdvcmsgZmxvdyBpbiB0aGUKLSAgICAgICBleHBlY3RlZCBtYW5uZXIuCi0gICIiIgotCi0gIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJbkZpeHR1cmVDb25zdHJ1Y3RvcihzZWxmKToKLSAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAnCi0gICAgICAgICAgICAgICAgICciU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIgdGhyb3duICcKLSAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgY29uc3RydWN0b3InCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCd1bmV4cGVjdGVkJyBub3QgaW4gRVhfQklOQVJZX09VVFBVVCwKLSAgICAgICAgICAgICAgICAgJ1RoaXMgZmFpbHVyZSBiZWxvbmdzIGluIHRoaXMgdGVzdCBvbmx5IGlmICcKLSAgICAgICAgICAgICAgICAgJyJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCIgKG5vIHF1b3RlcykgJwotICAgICAgICAgICAgICAgICAnYXBwZWFycyBvbiB0aGUgc2FtZSBsaW5lIGFzIHdvcmRzICJjYWxsZWQgdW5leHBlY3RlZGx5IicpCi0KLSAgaWYgKCdDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0LlRocm93c0V4Y2VwdGlvbkluRGVzdHJ1Y3RvcicgaW4KLSAgICAgIEVYX0JJTkFSWV9PVVRQVVQpOgotCi0gICAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luRml4dHVyZURlc3RydWN0b3Ioc2VsZik6Ci0gICAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAnCi0gICAgICAgICAgICAgICAgICAgJyJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIiB0aHJvd24gJwotICAgICAgICAgICAgICAgICAgICdpbiB0aGUgdGVzdCBmaXh0dXJlXCdzIGRlc3RydWN0b3InCi0gICAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLSAgICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKLSAgICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKLSAgICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQotCi0gIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblNldFVwVGVzdENhc2Uoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJwotICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBTZXRVcFRlc3RDYXNlKCknCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IGNvbnN0cnVjdG9yICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IGRlc3RydWN0b3IgJwotICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLSAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlNldFVwKCkgJwotICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLSAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlRlYXJEb3duKCkgJwotICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLSAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgdGVzdCBib2R5ICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0KLSAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luVGVhckRvd25UZXN0Q2FzZShzZWxmKToKLSAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCi0gICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFRlYXJEb3duVGVzdENhc2UoKScKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLQotICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5TZXRVcChzZWxmKToKLSAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCi0gICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFNldFVwKCknCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdCBkZXN0cnVjdG9yICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd24oKSAnCi0gICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJwotICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQotICAgIHNlbGYuYXNzZXJ0XygndW5leHBlY3RlZCcgbm90IGluIEVYX0JJTkFSWV9PVVRQVVQsCi0gICAgICAgICAgICAgICAgICdUaGlzIGZhaWx1cmUgYmVsb25ncyBpbiB0aGlzIHRlc3Qgb25seSBpZiAnCi0gICAgICAgICAgICAgICAgICciQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QiIChubyBxdW90ZXMpICcKLSAgICAgICAgICAgICAgICAgJ2FwcGVhcnMgb24gdGhlIHNhbWUgbGluZSBhcyB3b3JkcyAiY2FsbGVkIHVuZXhwZWN0ZWRseSInKQotCi0gIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblRlYXJEb3duKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKLSAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gVGVhckRvd24oKScKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLSAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJwotICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLSAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IGRlc3RydWN0b3IgJwotICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKLSAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKLQotICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5UZXN0Qm9keShzZWxmKToKLSAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCi0gICAgICAgICAgICAgICAgICcgdGhyb3duIGluIHRoZSB0ZXN0IGJvZHknCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCBkZXN0cnVjdG9yICcKLSAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0gICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdDo6VGVhckRvd24oKSAnCi0gICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJwotICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQotCi0gIGRlZiB0ZXN0Q2F0Y2hlc05vblN0ZEN4eEV4Y2VwdGlvbnMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRfKCdVbmtub3duIEMrKyBleGNlcHRpb24gdGhyb3duIGluIHRoZSB0ZXN0IGJvZHknCi0gICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCi0KLSAgZGVmIHRlc3RVbmhhbmRsZWRDeHhFeGNlcHRpb25zQWJvcnRUaGVQcm9ncmFtKHNlbGYpOgotICAgICMgRmlsdGVycyBvdXQgU0VIIGV4Y2VwdGlvbiB0ZXN0cyBvbiBXaW5kb3dzLiBVbmhhbmRsZWQgU0VIIGV4Y2VwdGlvbnMKLSAgICAjIGNhdXNlIHRlc3RzIHRvIHNob3cgcG9wLXVwIHdpbmRvd3MgdGhlcmUuCi0gICAgRklUTEVSX09VVF9TRUhfVEVTVFNfRkxBRyA9IEZJTFRFUl9GTEFHICsgJz0tKlNlaConCi0gICAgIyBCeSBkZWZhdWx0LCBHb29nbGUgVGVzdCBkb2Vzbid0IGNhdGNoIHRoZSBleGNlcHRpb25zLgotICAgIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKLSAgICAgICAgW0VYX0VYRV9QQVRILAotICAgICAgICAgTk9fQ0FUQ0hfRVhDRVBUSU9OU19GTEFHLAotICAgICAgICAgRklUTEVSX09VVF9TRUhfVEVTVFNfRkxBR10sCi0gICAgICAgIGVudj1lbnZpcm9uKS5vdXRwdXQKLQotICAgIHNlbGYuYXNzZXJ0XygnVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0nCi0gICAgICAgICAgICAgICAgIGluIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCkKLSAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiB1bmNhdWdodF9leGNlcHRpb25zX2V4X2JpbmFyeV9vdXRwdXQpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZmM4MmMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLS8vCi0vLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiBUZXN0cyBpbiB0aGlzIGZpbGUgdGhyb3cgQysrIG9yIFNFSAotLy8gZXhjZXB0aW9ucywgYW5kIHRoZSBvdXRwdXQgaXMgdmVyaWZpZWQgYnkgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0LnB5LgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBleGl0KCkuCi0KLSNpZiBHVEVTVF9IQVNfU0VICi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSMgaW5jbHVkZSA8ZXhjZXB0aW9uPiAgLy8gRm9yIHNldF90ZXJtaW5hdGUoKS4KLSMgaW5jbHVkZSA8c3RkZXhjZXB0PgotI2VuZGlmCi0KLXVzaW5nIHRlc3Rpbmc6OlRlc3Q7Ci0KLSNpZiBHVEVTVF9IQVNfU0VICi0KLWNsYXNzIFNlaEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSAgU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7IFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsgfQotfTsKLQotVEVTVF9GKFNlaEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0LCBUaHJvd3NFeGNlcHRpb25JbkNvbnN0cnVjdG9yKSB7fQotCi1jbGFzcyBTZWhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSAgflNlaEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QoKSB7IFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsgfQotfTsKLQotVEVTVF9GKFNlaEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QsIFRocm93c0V4Y2VwdGlvbkluRGVzdHJ1Y3Rvcikge30KLQotY2xhc3MgU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7IFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsgfQotfTsKLQotVEVTVF9GKFNlaEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZSkge30KLQotY2xhc3MgU2VoRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7IFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsgfQotfTsKLQotVEVTVF9GKFNlaEV4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZVRlc3QsIFRocm93c0V4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZSkge30KLQotY2xhc3MgU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsgfQotfTsKLQotVEVTVF9GKFNlaEV4Y2VwdGlvbkluU2V0VXBUZXN0LCBUaHJvd3NFeGNlcHRpb25JblNldFVwKSB7fQotCi1jbGFzcyBTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Ci19OwotCi1URVNUX0YoU2VoRXhjZXB0aW9uSW5UZWFyRG93blRlc3QsIFRocm93c0V4Y2VwdGlvbkluVGVhckRvd24pIHt9Ci0KLVRFU1QoU2VoRXhjZXB0aW9uVGVzdCwgVGhyb3dzU2VoRXhjZXB0aW9uKSB7Ci0gIFJhaXNlRXhjZXB0aW9uKDQyLCAwLCAwLCBOVUxMKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi1jbGFzcyBDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gIEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0KCkgewotICAgIC8vIFdpdGhvdXQgdGhpcyBtYWNybyBWQysrIGNvbXBsYWlucyBhYm91dCB1bnJlYWNoYWJsZSBjb2RlIGF0IHRoZSBlbmQgb2YKLSAgICAvLyB0aGUgY29uc3RydWN0b3IuCi0gICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXygKLSAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIikpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgotICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgfkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0KCkgewotICAgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IGRlc3RydWN0b3IgIgotICAgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdDo6U2V0VXAoKSAiCi0gICAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0OjpUZWFyRG93bigpICIKLSAgICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7Ci0gIH0KLX07Ci0KLVRFU1RfRihDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5Db25zdHJ1Y3RvcikgewotICBBRERfRkFJTFVSRSgpIDw8ICJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCB0ZXN0IGJvZHkgIgotICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7Ci19Ci0KLS8vIEV4Y2VwdGlvbnMgaW4gZGVzdHJ1Y3RvcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gQysrMTEuCi0jaWYgIWRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pICYmICBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKLWNsYXNzIEN4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgewotICAgIHByaW50ZigiJXMiLAotICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKLSAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIH5DeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0KCkgewotICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oCi0gICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpKTsKLSAgfQotfTsKLQotVEVTVF9GKEN4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QsIFRocm93c0V4Y2VwdGlvbkluRGVzdHJ1Y3Rvcikge30KLSNlbmRpZiAgLy8gQysrMTEgbW9kZQotCi1jbGFzcyBDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSAgQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgY29uc3RydWN0b3IgIgotICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCi0gICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB+Q3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgZGVzdHJ1Y3RvciAiCi0gICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlNldFVwKCkgIgotICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgcHJpbnRmKCIlcyIsCi0gICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0OjpUZWFyRG93bigpICIKLSAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOwotICB9Ci19OwotCi1URVNUX0YoQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlKSB7Ci0gIHByaW50ZigiJXMiLAotICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgdGVzdCBib2R5ICIKLSAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLX0KLQotY2xhc3MgQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7Ci0gIH0KLX07Ci0KLVRFU1RfRihDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0LCBUaHJvd3NFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2UpIHt9Ci0KLWNsYXNzIEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgotICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgfkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0KCkgewotICAgIHByaW50ZigiJXMiLAotICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgZGVzdHJ1Y3RvciAiCi0gICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7IH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgcHJpbnRmKCIlcyIsCi0gICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd24oKSAiCi0gICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLSAgfQotfTsKLQotVEVTVF9GKEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0LCBUaHJvd3NFeGNlcHRpb25JblNldFVwKSB7Ci0gIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0IHRlc3QgYm9keSAiCi0gICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKLX0KLQotY2xhc3MgQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgewotICAgIHByaW50ZigiJXMiLAotICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCi0gICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB+Q3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QoKSB7Ci0gICAgcHJpbnRmKCIlcyIsCi0gICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCBkZXN0cnVjdG9yICIKLSAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOwotICB9Ci19OwotCi1URVNUX0YoQ3h4RXhjZXB0aW9uSW5UZWFyRG93blRlc3QsIFRocm93c0V4Y2VwdGlvbkluVGVhckRvd24pIHt9Ci0KLWNsYXNzIEN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgotICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgfkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0KCkgewotICAgIHByaW50ZigiJXMiLAotICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QgZGVzdHJ1Y3RvciAiCi0gICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVzdEJvZHlUZXN0OjpUZWFyRG93bigpICIKLSAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOwotICB9Ci19OwotCi1URVNUX0YoQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QsIFRocm93c1N0ZEN4eEV4Y2VwdGlvbikgewotICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsKLX0KLQotVEVTVChDeHhFeGNlcHRpb25UZXN0LCBUaHJvd3NOb25TdGRDeHhFeGNlcHRpb24pIHsKLSAgdGhyb3cgIkMtc3RyaW5nIjsKLX0KLQotLy8gVGhpcyB0ZXJtaW5hdGUgaGFuZGxlciBhYm9ydHMgdGhlIHByb2dyYW0gdXNpbmcgZXhpdCgpIHJhdGhlciB0aGFuIGFib3J0KCkuCi0vLyBUaGlzIGF2b2lkcyBzaG93aW5nIHBvcC11cHMgb24gV2luZG93cyBzeXN0ZW1zIGFuZCBjb3JlIGR1bXBzIG9uIFVuaXgtbGlrZQotLy8gb25lcy4KLXZvaWQgVGVybWluYXRlSGFuZGxlcigpIHsKLSAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgIlVuaGFuZGxlZCBDKysgZXhjZXB0aW9uIHRlcm1pbmF0aW5nIHRoZSBwcm9ncmFtLiIpOwotICBmZmx1c2goTlVMTCk7Ci0gIGV4aXQoMyk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgc3RkOjpzZXRfdGVybWluYXRlKCZUZXJtaW5hdGVIYW5kbGVyKTsKLSNlbmRpZgotICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdC5weSBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMDJhNTNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3QgY29ycmVjdGx5IGRldGVybWluZXMgd2hldGhlciB0byB1c2UgY29sb3JzLiIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgb3MKLWltcG9ydCBndGVzdF90ZXN0X3V0aWxzCi0KLQotSVNfV0lORE9XUyA9IG9zLm5hbWUgPSAnbnQnCi0KLUNPTE9SX0VOVl9WQVIgPSAnR1RFU1RfQ09MT1InCi1DT0xPUl9GTEFHID0gJ2d0ZXN0X2NvbG9yJwotQ09NTUFORCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9jb2xvcl90ZXN0XycpCi0KLQotZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6Ci0gICIiIlNldHMgdGhlIGVudiB2YXJpYWJsZSB0byAndmFsdWUnOyB1bnNldHMgaXQgd2hlbiAndmFsdWUnIGlzIE5vbmUuIiIiCi0KLSAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgb3MuZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCi0gIGVsaWYgZW52X3ZhciBpbiBvcy5lbnZpcm9uOgotICAgIGRlbCBvcy5lbnZpcm9uW2Vudl92YXJdCi0KLQotZGVmIFVzZXNDb2xvcih0ZXJtLCBjb2xvcl9lbnZfdmFyLCBjb2xvcl9mbGFnKToKLSAgIiIiUnVucyBndGVzdF9jb2xvcl90ZXN0XyBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLiIiIgotCi0gIFNldEVudlZhcignVEVSTScsIHRlcm0pCi0gIFNldEVudlZhcihDT0xPUl9FTlZfVkFSLCBjb2xvcl9lbnZfdmFyKQotCi0gIGlmIGNvbG9yX2ZsYWcgaXMgTm9uZToKLSAgICBhcmdzID0gW10KLSAgZWxzZToKLSAgICBhcmdzID0gWyctLSVzPSVzJyAlIChDT0xPUl9GTEFHLCBjb2xvcl9mbGFnKV0KLSAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbQ09NTUFORF0gKyBhcmdzKQotICByZXR1cm4gbm90IHAuZXhpdGVkIG9yIHAuZXhpdF9jb2RlCi0KLQotY2xhc3MgR1Rlc3RDb2xvclRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0Tm9FbnZWYXJOb0ZsYWcoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSdzIG5laXRoZXIgR1RFU1RfQ09MT1Igbm9yIC0tZ3Rlc3RfY29sb3IuIiIiCi0KLSAgICBpZiBub3QgSVNfV0lORE9XUzoKLSAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgTm9uZSkpCi0gICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZW1hY3MnLCBOb25lLCBOb25lKSkKLSAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1tb25vJywgTm9uZSwgTm9uZSkpCi0gICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigndW5rbm93bicsIE5vbmUsIE5vbmUpKQotICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignbGludXgnLCBOb25lLCBOb25lKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdjeWd3aW4nLCBOb25lLCBOb25lKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsIE5vbmUpKQotICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgTm9uZSwgTm9uZSkpCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tMjU2Y29sb3InLCBOb25lLCBOb25lKSkKLQotICBkZWYgdGVzdEZsYWdPbmx5KHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUncyAtLWd0ZXN0X2NvbG9yIGJ1dCBub3QgR1RFU1RfQ09MT1IuIiIiCi0KLSAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsIE5vbmUsICdubycpKQotICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsIE5vbmUsICdubycpKQotICAgIGlmIG5vdCBJU19XSU5ET1dTOgotICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2VtYWNzJywgTm9uZSwgJ2F1dG8nKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICdhdXRvJykpCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICd5ZXMnKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICd5ZXMnKSkKLQotICBkZWYgdGVzdEVudlZhck9ubHkoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2hlbiB0aGVyZSdzIEdURVNUX0NPTE9SIGJ1dCBub3QgLS1ndGVzdF9jb2xvci4iIiIKLQotICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdkdW1iJywgJ25vJywgTm9uZSkpCi0gICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ25vJywgTm9uZSkpCi0gICAgaWYgbm90IElTX1dJTkRPV1M6Ci0gICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsICdhdXRvJywgTm9uZSkpCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAnYXV0bycsIE5vbmUpKQotICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCAneWVzJywgTm9uZSkpCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAneWVzJywgTm9uZSkpCi0KLSAgZGVmIHRlc3RFbnZWYXJBbmRGbGFnKHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUgYXJlIGJvdGggR1RFU1RfQ09MT1IgYW5kIC0tZ3Rlc3RfY29sb3IuIiIiCi0KLSAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tY29sb3InLCAnbm8nLCAnbm8nKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgJ25vJywgJ3llcycpKQotICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ25vJywgJ2F1dG8nKSkKLQotICBkZWYgdGVzdEFsaWFzZXNPZlllc0FuZE5vKHNlbGYpOgotICAgICIiIlRlc3RzIHVzaW5nIGFsaWFzZXMgaW4gc3BlY2lmeWluZyAtLWd0ZXN0X2NvbG9yLiIiIgotCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICd0cnVlJykpCi0gICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICdZRVMnKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJ1QnKSkKLSAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgTm9uZSwgJzEnKSkKLQotICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICdmJykpCi0gICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ2ZhbHNlJykpCi0gICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJzAnKSkKLSAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAndW5rbm93bicpKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MWViYjguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3RfLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gQSBoZWxwZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyBob3cgR29vZ2xlIFRlc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZQotLy8gY29sb3JzIGluIHRoZSBvdXRwdXQuICBJdCBwcmludHMgIllFUyIgYW5kIHJldHVybnMgMSBpZiBHb29nbGUgVGVzdAotLy8gZGVjaWRlcyB0byB1c2UgY29sb3JzLCBhbmQgcHJpbnRzICJOTyIgYW5kIHJldHVybnMgMCBvdGhlcndpc2UuCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bwotLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCi0vLyBoaXMgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaG91bGRVc2VDb2xvcjsKLQotLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgVW5pdFRlc3Qgc2luZ2xldG9uIGlzCi0vLyBjcmVhdGVkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZCwgYW5kIHRodXMgdGhhdCBTaG91bGRVc2VDb2xvcigpCi0vLyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgaW4gYSByZWFsIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QuICBXZSBkb24ndCBhY3R1YWwKLS8vIHJ1biB0aGUgVEVTVCBpdHNlbGYuCi1URVNUKEdUZXN0Q29sb3JUZXN0LCBEdW1teSkgewotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotCi0gIGlmIChTaG91bGRVc2VDb2xvcih0cnVlKSkgewotICAgIC8vIEdvb2dsZSBUZXN0IGRlY2lkZXMgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0IChhc3N1bWluZyBpdAotICAgIC8vIGdvZXMgdG8gYSBUVFkpLgotICAgIHByaW50ZigiWUVTXG4iKTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICAvLyBHb29nbGUgVGVzdCBkZWNpZGVzIG5vdCB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCi0gICAgcHJpbnRmKCJOT1xuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzI0MzM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCBjb3JyZWN0bHkgcGFyc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcy4iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IG9zCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscwotCi0KLUlTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKLUlTX0xJTlVYID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy51bmFtZSgpWzBdID09ICdMaW51eCcKLQotQ09NTUFORCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9lbnZfdmFyX3Rlc3RfJykKLQotZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCi0KLQotZGVmIEFzc2VydEVxKGV4cGVjdGVkLCBhY3R1YWwpOgotICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6Ci0gICAgcHJpbnQgJ0V4cGVjdGVkOiAlcycgJSAoZXhwZWN0ZWQsKQotICAgIHByaW50ICcgIEFjdHVhbDogJXMnICUgKGFjdHVhbCwpCi0gICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKLQotCi1kZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKLSAgIiIiU2V0cyB0aGUgZW52IHZhcmlhYmxlIHRvICd2YWx1ZSc7IHVuc2V0cyBpdCB3aGVuICd2YWx1ZScgaXMgTm9uZS4iIiIKLQotICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICBlbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKLSAgZWxpZiBlbnZfdmFyIGluIGVudmlyb246Ci0gICAgZGVsIGVudmlyb25bZW52X3Zhcl0KLQotCi1kZWYgR2V0RmxhZyhmbGFnKToKLSAgIiIiUnVucyBndGVzdF9lbnZfdmFyX3Rlc3RfIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQuIiIiCi0KLSAgYXJncyA9IFtDT01NQU5EXQotICBpZiBmbGFnIGlzIG5vdCBOb25lOgotICAgIGFyZ3MgKz0gW2ZsYWddCi0gIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoYXJncywgZW52PWVudmlyb24pLm91dHB1dAotCi0KLWRlZiBUZXN0RmxhZyhmbGFnLCB0ZXN0X3ZhbCwgZGVmYXVsdF92YWwpOgotICAiIiJWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBmbGFnIGlzIGFmZmVjdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVudiB2YXIuIiIiCi0KLSAgZW52X3ZhciA9ICdHVEVTVF8nICsgZmxhZy51cHBlcigpCi0gIFNldEVudlZhcihlbnZfdmFyLCB0ZXN0X3ZhbCkKLSAgQXNzZXJ0RXEodGVzdF92YWwsIEdldEZsYWcoZmxhZykpCi0gIFNldEVudlZhcihlbnZfdmFyLCBOb25lKQotICBBc3NlcnRFcShkZWZhdWx0X3ZhbCwgR2V0RmxhZyhmbGFnKSkKLQotCi1jbGFzcyBHVGVzdEVudlZhclRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0RW52VmFyQWZmZWN0c0ZsYWcoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzaG91bGQgYWZmZWN0IHRoZSBjb3JyZXNwb25kaW5nIGZsYWcuIiIiCi0KLSAgICBUZXN0RmxhZygnYnJlYWtfb25fZmFpbHVyZScsICcxJywgJzAnKQotICAgIFRlc3RGbGFnKCdjb2xvcicsICd5ZXMnLCAnYXV0bycpCi0gICAgVGVzdEZsYWcoJ2ZpbHRlcicsICdGb29UZXN0LkJhcicsICcqJykKLSAgICBUZXN0RmxhZygnb3V0cHV0JywgJ3htbDp0bXAvZm9vLnhtbCcsICcnKQotICAgIFRlc3RGbGFnKCdwcmludF90aW1lJywgJzAnLCAnMScpCi0gICAgVGVzdEZsYWcoJ3JlcGVhdCcsICc5OTknLCAnMScpCi0gICAgVGVzdEZsYWcoJ3Rocm93X29uX2ZhaWx1cmUnLCAnMScsICcwJykKLSAgICBUZXN0RmxhZygnZGVhdGhfdGVzdF9zdHlsZScsICd0aHJlYWRzYWZlJywgJ2Zhc3QnKQotICAgIFRlc3RGbGFnKCdjYXRjaF9leGNlcHRpb25zJywgJzAnLCAnMScpCi0KLSAgICBpZiBJU19MSU5VWDoKLSAgICAgIFRlc3RGbGFnKCdkZWF0aF90ZXN0X3VzZV9mb3JrJywgJzEnLCAnMCcpCi0gICAgICBUZXN0RmxhZygnc3RhY2tfdHJhY2VfZGVwdGgnLCAnMCcsICcxMDAnKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzlhZmM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEEgaGVscGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgdGhhdCBHb29nbGUgVGVzdCBwYXJzZXMgdGhlIGVudmlyb25tZW50Ci0vLyB2YXJpYWJsZXMgY29ycmVjdGx5LgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi11c2luZyA6OnN0ZDo6Y291dDsKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIG1ha2UgdGhlIHRlc3QgbW9yZSByZWFsaXN0aWMgYnkgZW5zdXJpbmcKLS8vIHRoYXQgdGhlIFVuaXRUZXN0IHNpbmdsZXRvbiBpcyBjcmVhdGVkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZC4KLS8vIFdlIGRvbid0IGFjdHVhbCBydW4gdGhlIFRFU1QgaXRzZWxmLgotVEVTVChHVGVzdEVudlZhclRlc3QsIER1bW15KSB7Ci19Ci0KLXZvaWQgUHJpbnRGbGFnKGNvbnN0IGNoYXIqIGZsYWcpIHsKLSAgaWYgKHN0cmNtcChmbGFnLCAiYnJlYWtfb25fZmFpbHVyZSIpID09IDApIHsKLSAgICBjb3V0IDw8IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0cmNtcChmbGFnLCAiY2F0Y2hfZXhjZXB0aW9ucyIpID09IDApIHsKLSAgICBjb3V0IDw8IEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0cmNtcChmbGFnLCAiY29sb3IiKSA9PSAwKSB7Ci0gICAgY291dCA8PCBHVEVTVF9GTEFHKGNvbG9yKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RyY21wKGZsYWcsICJkZWF0aF90ZXN0X3N0eWxlIikgPT0gMCkgewotICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RyY21wKGZsYWcsICJkZWF0aF90ZXN0X3VzZV9mb3JrIikgPT0gMCkgewotICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RyY21wKGZsYWcsICJmaWx0ZXIiKSA9PSAwKSB7Ci0gICAgY291dCA8PCBHVEVTVF9GTEFHKGZpbHRlcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0cmNtcChmbGFnLCAib3V0cHV0IikgPT0gMCkgewotICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhvdXRwdXQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdHJjbXAoZmxhZywgInByaW50X3RpbWUiKSA9PSAwKSB7Ci0gICAgY291dCA8PCBHVEVTVF9GTEFHKHByaW50X3RpbWUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdHJjbXAoZmxhZywgInJlcGVhdCIpID09IDApIHsKLSAgICBjb3V0IDw8IEdURVNUX0ZMQUcocmVwZWF0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RyY21wKGZsYWcsICJzdGFja190cmFjZV9kZXB0aCIpID09IDApIHsKLSAgICBjb3V0IDw8IEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdHJjbXAoZmxhZywgInRocm93X29uX2ZhaWx1cmUiKSA9PSAwKSB7Ci0gICAgY291dCA8PCBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvdXQgPDwgIkludmFsaWQgZmxhZyBuYW1lICIgPDwgZmxhZwotICAgICAgIDw8ICIuICBWYWxpZCBuYW1lcyBhcmUgYnJlYWtfb25fZmFpbHVyZSwgY29sb3IsIGZpbHRlciwgZXRjLlxuIjsKLSAgZXhpdCgxKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgY291dCA8PCAiVXNhZ2U6IGd0ZXN0X2Vudl92YXJfdGVzdF8gTkFNRV9PRl9GTEFHXG4iOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgdGVzdGluZzo6UHJpbnRGbGFnKGFyZ3ZbMV0pOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmYxOWUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2Vudmlyb25tZW50X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUZXN0cyB1c2luZyBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMuCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEgIC8vIFJlcXVpcmVkIGZvciB0aGUgbmV4dCAjaW5jbHVkZS4KLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOwotfQotCi1uYW1lc3BhY2UgewotCi1lbnVtIEZhaWx1cmVUeXBlIHsKLSAgTk9fRkFJTFVSRSwgTk9OX0ZBVEFMX0ZBSUxVUkUsIEZBVEFMX0ZBSUxVUkUKLX07Ci0KLS8vIEZvciB0ZXN0aW5nIHVzaW5nIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cy4KLWNsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgTXlFbnZpcm9ubWVudCgpIHsgUmVzZXQoKTsgfQotCi0gIC8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgZmFpbHVyZV9pbl9zZXRfdXBfLCBTZXRVcCgpIHdpbGwKLSAgLy8gZ2VuZXJhdGUgYSBub24tZmF0YWwgZmFpbHVyZSwgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlLCBvcgotICAvLyBzdWNjZWVkLgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgc2V0X3VwX3dhc19ydW5fID0gdHJ1ZTsKLQotICAgIHN3aXRjaCAoZmFpbHVyZV9pbl9zZXRfdXBfKSB7Ci0gICAgICBjYXNlIE5PTl9GQVRBTF9GQUlMVVJFOgotICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgc2V0LXVwLiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGQVRBTF9GQUlMVVJFOgotICAgICAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUgaW4gZ2xvYmFsIHNldC11cC4iOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgdGVhcl9kb3duX3dhc19ydW5fID0gdHJ1ZTsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgdGVhci1kb3duLiI7Ci0gIH0KLQotICAvLyBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBlbnZpcm9ubWVudCBzLnQuIGl0IGNhbiBiZSByZXVzZWQuCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgZmFpbHVyZV9pbl9zZXRfdXBfID0gTk9fRkFJTFVSRTsKLSAgICBzZXRfdXBfd2FzX3J1bl8gPSBmYWxzZTsKLSAgICB0ZWFyX2Rvd25fd2FzX3J1bl8gPSBmYWxzZTsKLSAgfQotCi0gIC8vIFdlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgZmFpbHVyZSBTZXRVcCgpIHNob3VsZAotICAvLyBnZW5lcmF0ZS4KLSAgdm9pZCBzZXRfZmFpbHVyZV9pbl9zZXRfdXAoRmFpbHVyZVR5cGUgdHlwZSkgewotICAgIGZhaWx1cmVfaW5fc2V0X3VwXyA9IHR5cGU7Ci0gIH0KLQotICAvLyBXYXMgU2V0VXAoKSBydW4/Ci0gIGJvb2wgc2V0X3VwX3dhc19ydW4oKSBjb25zdCB7IHJldHVybiBzZXRfdXBfd2FzX3J1bl87IH0KLQotICAvLyBXYXMgVGVhckRvd24oKSBydW4/Ci0gIGJvb2wgdGVhcl9kb3duX3dhc19ydW4oKSBjb25zdCB7IHJldHVybiB0ZWFyX2Rvd25fd2FzX3J1bl87IH0KLQotIHByaXZhdGU6Ci0gIEZhaWx1cmVUeXBlIGZhaWx1cmVfaW5fc2V0X3VwXzsKLSAgYm9vbCBzZXRfdXBfd2FzX3J1bl87Ci0gIGJvb2wgdGVhcl9kb3duX3dhc19ydW5fOwotfTsKLQotLy8gV2FzIHRoZSBURVNUIHJ1bj8KLWJvb2wgdGVzdF93YXNfcnVuOwotCi0vLyBUaGUgc29sZSBwdXJwb3NlIG9mIHRoaXMgVEVTVCBpcyB0byBlbmFibGUgdXMgdG8gY2hlY2sgd2hldGhlciBpdAotLy8gd2FzIHJ1bi4KLVRFU1QoRm9vVGVzdCwgQmFyKSB7Ci0gIHRlc3Rfd2FzX3J1biA9IHRydWU7Ci19Ci0KLS8vIFByaW50cyB0aGUgbWVzc2FnZSBhbmQgYWJvcnRzIHRoZSBwcm9ncmFtIGlmIGNvbmRpdGlvbiBpcyBmYWxzZS4KLXZvaWQgQ2hlY2soYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIG1zZykgewotICBpZiAoIWNvbmRpdGlvbikgewotICAgIHByaW50ZigiRkFJTEVEOiAlc1xuIiwgbXNnKTsKLSAgICB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7Ci0gIH0KLX0KLQotLy8gUnVucyB0aGUgdGVzdHMuICBSZXR1cm4gdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KLS8vCi0vLyBUaGUgJ2ZhaWx1cmUnIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgZmFpbHVyZSB0aGF0IHNob3VsZAotLy8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBnbG9iYWwgc2V0LXVwLgotaW50IFJ1bkFsbFRlc3RzKE15RW52aXJvbm1lbnQqIGVudiwgRmFpbHVyZVR5cGUgZmFpbHVyZSkgewotICBlbnYtPlJlc2V0KCk7Ci0gIGVudi0+c2V0X2ZhaWx1cmVfaW5fc2V0X3VwKGZhaWx1cmUpOwotICB0ZXN0X3dhc19ydW4gPSBmYWxzZTsKLSAgdGVzdGluZzo6aW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5DbGVhckFkSG9jVGVzdFJlc3VsdCgpOwotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICAvLyBSZWdpc3RlcnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudCwgYW5kIHZlcmlmaWVzIHRoYXQgdGhlCi0gIC8vIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiByZXR1cm5zIGl0cyBhcmd1bWVudC4KLSAgTXlFbnZpcm9ubWVudCogY29uc3QgZW52ID0gbmV3IE15RW52aXJvbm1lbnQ7Ci0gIENoZWNrKHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChlbnYpID09IGVudiwKLSAgICAgICAgIkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHNob3VsZCByZXR1cm4gaXRzIGFyZ3VtZW50LiIpOwotCi0gIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgdGhlIHRlc3RzIHdoZW4gdGhlIGdsb2JhbAotICAvLyBzZXQtdXAgaXMgc3VjY2Vzc2Z1bC4KLSAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT19GQUlMVVJFKSAhPSAwLAotICAgICAgICAiUlVOX0FMTF9URVNUUygpIHNob3VsZCByZXR1cm4gbm9uLXplcm8sIGFzIHRoZSBnbG9iYWwgdGVhci1kb3duICIKLSAgICAgICAgInNob3VsZCBnZW5lcmF0ZSBhIGZhaWx1cmUuIik7Ci0gIENoZWNrKHRlc3Rfd2FzX3J1biwKLSAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgbm8gIgotICAgICAgICAiZmFpbHVyZSIpOwotICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCi0gICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOwotCi0gIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgdGhlIHRlc3RzIHdoZW4gdGhlIGdsb2JhbAotICAvLyBzZXQtdXAgZ2VuZXJhdGVzIG5vIGZhdGFsIGZhaWx1cmUuCi0gIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgTk9OX0ZBVEFMX0ZBSUxVUkUpICE9IDAsCi0gICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgYm90aCB0aGUgZ2xvYmFsIHNldC11cCAiCi0gICAgICAgICJhbmQgdGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIGdlbmVyYXRlIGEgbm9uLWZhdGFsIGZhaWx1cmUuIik7Ci0gIENoZWNrKHRlc3Rfd2FzX3J1biwKLSAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgbm8gIgotICAgICAgICAiZmF0YWwgZmFpbHVyZS4iKTsKLSAgQ2hlY2soZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAotICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIHJ1bi4iKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IFJVTl9BTExfVEVTVFMoKSBydW5zIG5vIHRlc3Qgd2hlbiB0aGUgZ2xvYmFsIHNldC11cAotICAvLyBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlLgotICBDaGVjayhSdW5BbGxUZXN0cyhlbnYsIEZBVEFMX0ZBSUxVUkUpICE9IDAsCi0gICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgdGhlIGdsb2JhbCBzZXQtdXAgIgotICAgICAgICAic2hvdWxkIGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4iKTsKLSAgQ2hlY2soIXRlc3Rfd2FzX3J1biwKLSAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgbm90IHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgc2hvdWxkIGdlbmVyYXRlICIKLSAgICAgICAgImEgZmF0YWwgZmFpbHVyZS4iKTsKLSAgQ2hlY2soZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAotICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIHJ1bi4iKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IFJVTl9BTExfVEVTVFMoKSBkb2Vzbid0IGRvIGdsb2JhbCBzZXQtdXAgb3IKLSAgLy8gdGVhci1kb3duIHdoZW4gdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uCi0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSA9ICItKiI7Ci0gIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgTk9fRkFJTFVSRSkgPT0gMCwKLSAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIHplcm8sIGFzIHRoZXJlIGlzIG5vIHRlc3QgdG8gcnVuLiIpOwotICBDaGVjayghZW52LT5zZXRfdXBfd2FzX3J1bigpLAotICAgICAgICAiVGhlIGdsb2JhbCBzZXQtdXAgc2hvdWxkIG5vdCBydW4sIGFzIHRoZXJlIGlzIG5vIHRlc3QgdG8gcnVuLiIpOwotICBDaGVjayghZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAotICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIG5vdCBydW4sICIKLSAgICAgICAgImFzIHRoZSBnbG9iYWwgc2V0LXVwIHdhcyBub3QgcnVuLiIpOwotCi0gIHByaW50ZigiUEFTU1xuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weSBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkMWE3NzAuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QgdGVzdCBmaWx0ZXJzLgotCi1BIHVzZXIgY2FuIHNwZWNpZnkgd2hpY2ggdGVzdChzKSBpbiBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdG8gcnVuIHZpYSBlaXRoZXIKLXRoZSBHVEVTVF9GSUxURVIgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlIC0tZ3Rlc3RfZmlsdGVyIGZsYWcuCi1UaGlzIHNjcmlwdCB0ZXN0cyBzdWNoIGZ1bmN0aW9uYWxpdHkgYnkgaW52b2tpbmcKLWd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGggR29vZ2xlIFRlc3QpIHdpdGggZGlmZmVyZW50Ci1lbnZpcm9ubWVudHMgYW5kIGNvbW1hbmQgbGluZSBmbGFncy4KLQotTm90ZSB0aGF0IHRlc3Qgc2hhcmRpbmcgbWF5IGFsc28gaW5mbHVlbmNlIHdoaWNoIHRlc3RzIGFyZSBmaWx0ZXJlZC4gVGhlcmVmb3JlLAotd2UgdGVzdCB0aGF0IGhlcmUgYWxzby4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHNldHMKLWltcG9ydCBzeXMKLQotaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKLQotIyBDb25zdGFudHMuCi0KLSMgQ2hlY2tzIGlmIHRoaXMgcGxhdGZvcm0gY2FuIHBhc3MgZW1wdHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNoaWxkCi0jIHByb2Nlc3Nlcy4gIFdlIHNldCBhbiBlbnYgdmFyaWFibGUgdG8gYW4gZW1wdHkgc3RyaW5nIGFuZCBpbnZva2UgYSBweXRob24KLSMgc2NyaXB0IGluIGEgc3VicHJvY2VzcyB0byBwcmludCB3aGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBTVElMTCBpbgotIyBvcy5lbnZpcm9uLiAgV2UgdGhlbiB1c2UgJ2V2YWwnIHRvIHBhcnNlIHRoZSBjaGlsZCdzIG91dHB1dCBzbyB0aGF0IGFuCi0jIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGlucHV0IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gJ1RydWUnIG5vciAnRmFsc2UnLgotb3MuZW52aXJvblsnRU1QVFlfVkFSJ10gPSAnJwotY2hpbGQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCi0gICAgW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAnaW1wb3J0IG9zOyBwcmludCBcJ0VNUFRZX1ZBUlwnIGluIG9zLmVudmlyb24nXSkKLUNBTl9QQVNTX0VNUFRZX0VOViA9IGV2YWwoY2hpbGQub3V0cHV0KQotCi0KLSMgQ2hlY2sgaWYgdGhpcyBwbGF0Zm9ybSBjYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIGNoaWxkIHByb2Nlc3Nlcy4KLSMgV2Ugc2V0IGFuIGVudiB2YXJpYWJsZSB0byBhIG5vbi1lbXB0eSBzdHJpbmcsIHVuc2V0IGl0LCBhbmQgaW52b2tlCi0jIGEgcHl0aG9uIHNjcmlwdCBpbiBhIHN1YnByb2Nlc3MgdG8gcHJpbnQgd2hldGhlciB0aGUgdmFyaWFibGUKLSMgaXMgTk8gTE9OR0VSIGluIG9zLmVudmlyb24uCi0jIFdlIHVzZSAnZXZhbCcgdG8gcGFyc2UgdGhlIGNoaWxkJ3Mgb3V0cHV0IHNvIHRoYXQgYW4gZXhjZXB0aW9uCi0jIGlzIHRocm93biBpZiB0aGUgaW5wdXQgaXMgbmVpdGhlciAnVHJ1ZScgbm9yICdGYWxzZScuCi1vcy5lbnZpcm9uWydVTlNFVF9WQVInXSA9ICdYJwotZGVsIG9zLmVudmlyb25bJ1VOU0VUX1ZBUiddCi1jaGlsZCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKLSAgICBbc3lzLmV4ZWN1dGFibGUsICctYycsICdpbXBvcnQgb3M7IHByaW50IFwnVU5TRVRfVkFSXCcgbm90IGluIG9zLmVudmlyb24nXSkKLUNBTl9VTlNFVF9FTlYgPSBldmFsKGNoaWxkLm91dHB1dCkKLQotCi0jIENoZWNrcyBpZiB3ZSBzaG91bGQgdGVzdCB3aXRoIGFuIGVtcHR5IGZpbHRlci4gVGhpcyBkb2Vzbid0Ci0jIG1ha2Ugc2Vuc2Ugb24gcGxhdGZvcm1zIHRoYXQgY2Fubm90IHBhc3MgZW1wdHkgZW52IHZhcmlhYmxlcyAoV2luMzIpCi0jIGFuZCBvbiBwbGF0Zm9ybXMgdGhhdCBjYW5ub3QgdW5zZXQgdmFyaWFibGVzIChzaW5jZSB3ZSBjYW5ub3QgdGVsbAotIyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIiIGFuZCBOVUxMIC0tIEJvcmxhbmQgYW5kIFNvbGFyaXMgPCA1LjEwKQotQ0FOX1RFU1RfRU1QVFlfRklMVEVSID0gKENBTl9QQVNTX0VNUFRZX0VOViBhbmQgQ0FOX1VOU0VUX0VOVikKLQotCi0jIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3Igc3BlY2lmeWluZyB0aGUgdGVzdCBmaWx0ZXJzLgotRklMVEVSX0VOVl9WQVIgPSAnR1RFU1RfRklMVEVSJwotCi0jIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRlc3Qgc2hhcmRpbmcuCi1UT1RBTF9TSEFSRFNfRU5WX1ZBUiA9ICdHVEVTVF9UT1RBTF9TSEFSRFMnCi1TSEFSRF9JTkRFWF9FTlZfVkFSID0gJ0dURVNUX1NIQVJEX0lOREVYJwotU0hBUkRfU1RBVFVTX0ZJTEVfRU5WX1ZBUiA9ICdHVEVTVF9TSEFSRF9TVEFUVVNfRklMRScKLQotIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIHNwZWNpZnlpbmcgdGhlIHRlc3QgZmlsdGVycy4KLUZJTFRFUl9GTEFHID0gJ2d0ZXN0X2ZpbHRlcicKLQotIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIGluY2x1ZGluZyBkaXNhYmxlZCB0ZXN0cy4KLUFMU09fUlVOX0RJU0FCRURfVEVTVFNfRkxBRyA9ICdndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cycKLQotIyBDb21tYW5kIHRvIHJ1biB0aGUgZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyBwcm9ncmFtLgotQ09NTUFORCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdndGVzdF9maWx0ZXJfdW5pdHRlc3RfJykKLQotIyBSZWdleCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBlbmFibGVkIGluIHRoZSBiaW5hcnkuCi1QQVJBTV9URVNUX1JFR0VYID0gcmUuY29tcGlsZShyJy9QYXJhbVRlc3QnKQotCi0jIFJlZ2V4IGZvciBwYXJzaW5nIHRlc3QgY2FzZSBuYW1lcyBmcm9tIEdvb2dsZSBUZXN0J3Mgb3V0cHV0LgotVEVTVF9DQVNFX1JFR0VYID0gcmUuY29tcGlsZShyJ15cW1wtK1xdIFxkKyB0ZXN0cz8gZnJvbSAoXHcrKC9cdyspPyknKQotCi0jIFJlZ2V4IGZvciBwYXJzaW5nIHRlc3QgbmFtZXMgZnJvbSBHb29nbGUgVGVzdCdzIG91dHB1dC4KLVRFU1RfUkVHRVggPSByZS5jb21waWxlKHInXlxbXHMqUlVOXHMqXF0uKlwuKFx3KygvXHcrKT8pJykKLQotIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgdG8gdGVsbCBHb29nbGUgVGVzdCB0byBvdXRwdXQgdGhlIGxpc3Qgb2YgdGVzdHMgaXQKLSMgd2lsbCBydW4uCi1MSVNUX1RFU1RTX0ZMQUcgPSAnLS1ndGVzdF9saXN0X3Rlc3RzJwotCi0jIEluZGljYXRlcyB3aGV0aGVyIEdvb2dsZSBUZXN0IHN1cHBvcnRzIGRlYXRoIHRlc3RzLgotU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAnSGFzRGVhdGhUZXN0JyBpbiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCi0gICAgW0NPTU1BTkQsIExJU1RfVEVTVFNfRkxBR10pLm91dHB1dAotCi0jIEZ1bGwgbmFtZXMgb2YgYWxsIHRlc3RzIGluIGd0ZXN0X2ZpbHRlcl91bml0dGVzdHNfLgotUEFSQU1fVEVTVFMgPSBbCi0gICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAotICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8xJywKLSAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMCcsCi0gICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzEnLAotICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WC8wJywKLSAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFgvMScsCi0gICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RZLzAnLAotICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WS8xJywKLSAgICBdCi0KLURJU0FCTEVEX1RFU1RTID0gWwotICAgICdCYXJUZXN0LkRJU0FCTEVEX1Rlc3RGb3VyJywKLSAgICAnQmFyVGVzdC5ESVNBQkxFRF9UZXN0Rml2ZScsCi0gICAgJ0JhelRlc3QuRElTQUJMRURfVGVzdEMnLAotICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywKLSAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5ESVNBQkxFRF9UZXN0MicsCi0gICAgJ0RJU0FCTEVEX0Zvb2JhcmJhelRlc3QuVGVzdEEnLAotICAgIF0KLQotaWYgU1VQUE9SVFNfREVBVEhfVEVTVFM6Ci0gIERFQVRIX1RFU1RTID0gWwotICAgICdIYXNEZWF0aFRlc3QuVGVzdDEnLAotICAgICdIYXNEZWF0aFRlc3QuVGVzdDInLAotICAgIF0KLWVsc2U6Ci0gIERFQVRIX1RFU1RTID0gW10KLQotIyBBbGwgdGhlIG5vbi1kaXNhYmxlZCB0ZXN0cy4KLUFDVElWRV9URVNUUyA9IFsKLSAgICAnRm9vVGVzdC5BYmMnLAotICAgICdGb29UZXN0Llh5eicsCi0KLSAgICAnQmFyVGVzdC5UZXN0T25lJywKLSAgICAnQmFyVGVzdC5UZXN0VHdvJywKLSAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAotCi0gICAgJ0JhelRlc3QuVGVzdE9uZScsCi0gICAgJ0JhelRlc3QuVGVzdEEnLAotICAgICdCYXpUZXN0LlRlc3RCJywKLSAgICBdICsgREVBVEhfVEVTVFMgKyBQQVJBTV9URVNUUwotCi1wYXJhbV90ZXN0c19wcmVzZW50ID0gTm9uZQotCi0jIFV0aWxpdGllcy4KLQotZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCi0KLQotZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6Ci0gICIiIlNldHMgdGhlIGVudiB2YXJpYWJsZSB0byAndmFsdWUnOyB1bnNldHMgaXQgd2hlbiAndmFsdWUnIGlzIE5vbmUuIiIiCi0KLSAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCi0gIGVsaWYgZW52X3ZhciBpbiBlbnZpcm9uOgotICAgIGRlbCBlbnZpcm9uW2Vudl92YXJdCi0KLQotZGVmIFJ1bkFuZFJldHVybk91dHB1dChhcmdzID0gTm9uZSk6Ci0gICIiIlJ1bnMgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgb3V0cHV0LiIiIgotCi0gIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgKGFyZ3Mgb3IgW10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnZpcm9uKS5vdXRwdXQKLQotCi1kZWYgUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MgPSBOb25lKToKLSAgIiIiUnVucyB0aGUgdGVzdCBwcm9ncmFtIGFuZCByZXR1cm5zIGl0cyBleGl0IGNvZGUgYW5kIGEgbGlzdCBvZiB0ZXN0cyBydW4uIiIiCi0KLSAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbQ09NTUFORF0gKyAoYXJncyBvciBbXSksIGVudj1lbnZpcm9uKQotICB0ZXN0c19ydW4gPSBbXQotICB0ZXN0X2Nhc2UgPSAnJwotICB0ZXN0ID0gJycKLSAgZm9yIGxpbmUgaW4gcC5vdXRwdXQuc3BsaXQoJ1xuJyk6Ci0gICAgbWF0Y2ggPSBURVNUX0NBU0VfUkVHRVgubWF0Y2gobGluZSkKLSAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKLSAgICAgIHRlc3RfY2FzZSA9IG1hdGNoLmdyb3VwKDEpCi0gICAgZWxzZToKLSAgICAgIG1hdGNoID0gVEVTVF9SRUdFWC5tYXRjaChsaW5lKQotICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6Ci0gICAgICAgIHRlc3QgPSBtYXRjaC5ncm91cCgxKQotICAgICAgICB0ZXN0c19ydW4uYXBwZW5kKHRlc3RfY2FzZSArICcuJyArIHRlc3QpCi0gIHJldHVybiAodGVzdHNfcnVuLCBwLmV4aXRfY29kZSkKLQotCi1kZWYgSW52b2tlV2l0aE1vZGlmaWVkRW52KGV4dHJhX2VudiwgZnVuY3Rpb24sICphcmdzLCAqKmt3YXJncyk6Ci0gICIiIlJ1bnMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgaW4gYSBtb2RpZmllZCBlbnZpcm9ubWVudC4iIiIKLSAgdHJ5OgotICAgIG9yaWdpbmFsX2VudiA9IGVudmlyb24uY29weSgpCi0gICAgZW52aXJvbi51cGRhdGUoZXh0cmFfZW52KQotICAgIHJldHVybiBmdW5jdGlvbigqYXJncywgKiprd2FyZ3MpCi0gIGZpbmFsbHk6Ci0gICAgZW52aXJvbi5jbGVhcigpCi0gICAgZW52aXJvbi51cGRhdGUob3JpZ2luYWxfZW52KQotCi0KLWRlZiBSdW5XaXRoU2hhcmRpbmcodG90YWxfc2hhcmRzLCBzaGFyZF9pbmRleCwgY29tbWFuZCk6Ci0gICIiIlJ1bnMgYSB0ZXN0IHByb2dyYW0gc2hhcmQgYW5kIHJldHVybnMgZXhpdCBjb2RlIGFuZCBhIGxpc3Qgb2YgdGVzdHMgcnVuLiIiIgotCi0gIGV4dHJhX2VudiA9IHtTSEFSRF9JTkRFWF9FTlZfVkFSOiBzdHIoc2hhcmRfaW5kZXgpLAotICAgICAgICAgICAgICAgVE9UQUxfU0hBUkRTX0VOVl9WQVI6IHN0cih0b3RhbF9zaGFyZHMpfQotICByZXR1cm4gSW52b2tlV2l0aE1vZGlmaWVkRW52KGV4dHJhX2VudiwgUnVuQW5kRXh0cmFjdFRlc3RMaXN0LCBjb21tYW5kKQotCi0jIFRoZSB1bml0IHRlc3QuCi0KLQotY2xhc3MgR1Rlc3RGaWx0ZXJVbml0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKLSAgIiIiVGVzdHMgdGhlIGVudiB2YXJpYWJsZSBvciB0aGUgY29tbWFuZCBsaW5lIGZsYWcgdG8gZmlsdGVyIHRlc3RzLiIiIgotCi0gICMgVXRpbGl0aWVzLgotCi0gIGRlZiBBc3NlcnRTZXRFcXVhbChzZWxmLCBsaHMsIHJocyk6Ci0gICAgIiIiQXNzZXJ0cyB0aGF0IHR3byBzZXRzIGFyZSBlcXVhbC4iIiIKLQotICAgIGZvciBlbGVtIGluIGxoczoKLSAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIHJocywgJyVzIGluICVzJyAlIChlbGVtLCByaHMpKQotCi0gICAgZm9yIGVsZW0gaW4gcmhzOgotICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gbGhzLCAnJXMgaW4gJXMnICUgKGVsZW0sIGxocykpCi0KLSAgZGVmIEFzc2VydFBhcnRpdGlvbklzVmFsaWQoc2VsZiwgc2V0X3ZhciwgbGlzdF9vZl9zZXRzKToKLSAgICAiIiJBc3NlcnRzIHRoYXQgbGlzdF9vZl9zZXRzIGlzIGEgdmFsaWQgcGFydGl0aW9uIG9mIHNldF92YXIuIiIiCi0KLSAgICBmdWxsX3BhcnRpdGlvbiA9IFtdCi0gICAgZm9yIHNsaWNlX3ZhciBpbiBsaXN0X29mX3NldHM6Ci0gICAgICBmdWxsX3BhcnRpdGlvbi5leHRlbmQoc2xpY2VfdmFyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldF92YXIpLCBsZW4oZnVsbF9wYXJ0aXRpb24pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0cy5TZXQoc2V0X3ZhciksIHNldHMuU2V0KGZ1bGxfcGFydGl0aW9uKSkKLQotICBkZWYgQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHNlbGYsIHRlc3RzX3RvX3J1bik6Ci0gICAgIiIiQWRqdXN0IHRlc3RzX3RvX3J1biBpbiBjYXNlIHZhbHVlIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGRpc2FibGVkLiIiIgotCi0gICAgZ2xvYmFsIHBhcmFtX3Rlc3RzX3ByZXNlbnQKLSAgICBpZiBub3QgcGFyYW1fdGVzdHNfcHJlc2VudDoKLSAgICAgIHJldHVybiBsaXN0KHNldHMuU2V0KHRlc3RzX3RvX3J1bikgLSBzZXRzLlNldChQQVJBTV9URVNUUykpCi0gICAgZWxzZToKLSAgICAgIHJldHVybiB0ZXN0c190b19ydW4KLQotICBkZWYgUnVuQW5kVmVyaWZ5KHNlbGYsIGd0ZXN0X2ZpbHRlciwgdGVzdHNfdG9fcnVuKToKLSAgICAiIiJDaGVja3MgdGhhdCB0aGUgYmluYXJ5IHJ1bnMgY29ycmVjdCBzZXQgb2YgdGVzdHMgZm9yIGEgZ2l2ZW4gZmlsdGVyLiIiIgotCi0gICAgdGVzdHNfdG9fcnVuID0gc2VsZi5BZGp1c3RGb3JQYXJhbWV0ZXJpemVkVGVzdHModGVzdHNfdG9fcnVuKQotCi0gICAgIyBGaXJzdCwgdGVzdHMgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi0gICAgIyBXaW5kb3dzIHJlbW92ZXMgZW1wdHkgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50IHdoZW4gcGFzc2luZyBpdAotICAgICMgdG8gYSBuZXcgcHJvY2Vzcy4gIFRoaXMgbWVhbnMgaXQgaXMgaW1wb3NzaWJsZSB0byBwYXNzIGFuIGVtcHR5IGZpbHRlcgotICAgICMgaW50byBhIHByb2Nlc3MgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSG93ZXZlciwgd2UgY2FuIHN0aWxsCi0gICAgIyB0ZXN0IHRoZSBjYXNlIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdCBzdXBwbGllZCAoaS5lLiwgZ3Rlc3RfZmlsdGVyIGlzCi0gICAgIyBOb25lKS4KLSAgICAjIHB5bGludDogZGlzYWJsZS1tc2c9QzY0MDMKLSAgICBpZiBDQU5fVEVTVF9FTVBUWV9GSUxURVIgb3IgZ3Rlc3RfZmlsdGVyICE9ICcnOgotICAgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBndGVzdF9maWx0ZXIpCi0gICAgICB0ZXN0c19ydW4gPSBSdW5BbmRFeHRyYWN0VGVzdExpc3QoKVswXQotICAgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBOb25lKQotICAgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIHRlc3RzX3RvX3J1bikKLSAgICAjIHB5bGludDogZW5hYmxlLW1zZz1DNjQwMwotCi0gICAgIyBOZXh0LCB0ZXN0cyB1c2luZyB0aGUgY29tbWFuZCBsaW5lIGZsYWcuCi0KLSAgICBpZiBndGVzdF9maWx0ZXIgaXMgTm9uZToKLSAgICAgIGFyZ3MgPSBbXQotICAgIGVsc2U6Ci0gICAgICBhcmdzID0gWyctLSVzPSVzJyAlIChGSUxURVJfRkxBRywgZ3Rlc3RfZmlsdGVyKV0KLQotICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzKVswXQotICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCB0ZXN0c190b19ydW4pCi0KLSAgZGVmIFJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhzZWxmLCBndGVzdF9maWx0ZXIsIHRvdGFsX3NoYXJkcywgdGVzdHNfdG9fcnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9Tm9uZSwgY2hlY2tfZXhpdF8wPUZhbHNlKToKLSAgICAiIiJDaGVja3MgdGhhdCBiaW5hcnkgcnVucyBjb3JyZWN0IHRlc3RzIGZvciB0aGUgZ2l2ZW4gZmlsdGVyIGFuZCBzaGFyZC4KLQotICAgIFJ1bnMgYWxsIHNoYXJkcyBvZiBndGVzdF9maWx0ZXJfdW5pdHRlc3RfIHdpdGggdGhlIGdpdmVuIGZpbHRlciwgYW5kCi0gICAgdmVyaWZpZXMgdGhhdCB0aGUgcmlnaHQgc2V0IG9mIHRlc3RzIHdlcmUgcnVuLiBUaGUgdW5pb24gb2YgdGVzdHMgcnVuCi0gICAgb24gZWFjaCBzaGFyZCBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRlc3RzX3RvX3J1biwgd2l0aG91dCBkdXBsaWNhdGVzLgotCi0gICAgQXJnczoKLSAgICAgIGd0ZXN0X2ZpbHRlcjogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gdGhlIHRlc3RzLgotICAgICAgdG90YWxfc2hhcmRzOiBBIHRvdGFsIG51bWJlciBvZiBzaGFyZHMgdG8gc3BsaXQgdGVzdCBydW4gaW50by4KLSAgICAgIHRlc3RzX3RvX3J1bjogQSBzZXQgb2YgdGVzdHMgZXhwZWN0ZWQgdG8gcnVuLgotICAgICAgYXJncyAgIDogICAgICBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdG8gdGhlIHRlc3QgYmluYXJ5LgotICAgICAgY2hlY2tfZXhpdF8wOiBXaGVuIHNldCB0byBhIHRydWUgdmFsdWUsIG1ha2Ugc3VyZSB0aGF0IGFsbCBzaGFyZHMKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuCi0gICAgIiIiCi0KLSAgICB0ZXN0c190b19ydW4gPSBzZWxmLkFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyh0ZXN0c190b19ydW4pCi0KLSAgICAjIFdpbmRvd3MgcmVtb3ZlcyBlbXB0eSB2YXJpYWJsZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQgd2hlbiBwYXNzaW5nIGl0Ci0gICAgIyB0byBhIG5ldyBwcm9jZXNzLiAgVGhpcyBtZWFucyBpdCBpcyBpbXBvc3NpYmxlIHRvIHBhc3MgYW4gZW1wdHkgZmlsdGVyCi0gICAgIyBpbnRvIGEgcHJvY2VzcyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwKLSAgICAjIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgdmFyaWFibGUgaXMgbm90IHN1cHBsaWVkIChpLmUuLCBndGVzdF9maWx0ZXIgaXMKLSAgICAjIE5vbmUpLgotICAgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjQwMwotICAgIGlmIENBTl9URVNUX0VNUFRZX0ZJTFRFUiBvciBndGVzdF9maWx0ZXIgIT0gJyc6Ci0gICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIGd0ZXN0X2ZpbHRlcikKLSAgICAgIHBhcnRpdGlvbiA9IFtdCi0gICAgICBmb3IgaSBpbiByYW5nZSgwLCB0b3RhbF9zaGFyZHMpOgotICAgICAgICAodGVzdHNfcnVuLCBleGl0X2NvZGUpID0gUnVuV2l0aFNoYXJkaW5nKHRvdGFsX3NoYXJkcywgaSwgYXJncykKLSAgICAgICAgaWYgY2hlY2tfZXhpdF8wOgotICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXhpdF9jb2RlKQotICAgICAgICBwYXJ0aXRpb24uYXBwZW5kKHRlc3RzX3J1bikKLQotICAgICAgc2VsZi5Bc3NlcnRQYXJ0aXRpb25Jc1ZhbGlkKHRlc3RzX3RvX3J1biwgcGFydGl0aW9uKQotICAgICAgU2V0RW52VmFyKEZJTFRFUl9FTlZfVkFSLCBOb25lKQotICAgICMgcHlsaW50OiBlbmFibGUtbXNnPUM2NDAzCi0KLSAgZGVmIFJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoc2VsZiwgZ3Rlc3RfZmlsdGVyLCB0ZXN0c190b19ydW4pOgotICAgICIiIkNoZWNrcyB0aGF0IHRoZSBiaW5hcnkgcnVucyBjb3JyZWN0IHNldCBvZiB0ZXN0cyBmb3IgdGhlIGdpdmVuIGZpbHRlci4KLQotICAgIFJ1bnMgZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyB3aXRoIHRoZSBnaXZlbiBmaWx0ZXIsIGFuZCBlbmFibGVzCi0gICAgZGlzYWJsZWQgdGVzdHMuIFZlcmlmaWVzIHRoYXQgdGhlIHJpZ2h0IHNldCBvZiB0ZXN0cyB3ZXJlIHJ1bi4KLQotICAgIEFyZ3M6Ci0gICAgICBndGVzdF9maWx0ZXI6IEEgZmlsdGVyIHRvIGFwcGx5IHRvIHRoZSB0ZXN0cy4KLSAgICAgIHRlc3RzX3RvX3J1bjogQSBzZXQgb2YgdGVzdHMgZXhwZWN0ZWQgdG8gcnVuLgotICAgICIiIgotCi0gICAgdGVzdHNfdG9fcnVuID0gc2VsZi5BZGp1c3RGb3JQYXJhbWV0ZXJpemVkVGVzdHModGVzdHNfdG9fcnVuKQotCi0gICAgIyBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgbGluZS4KLSAgICBhcmdzID0gWyctLSVzJyAlIEFMU09fUlVOX0RJU0FCRURfVEVTVFNfRkxBR10KLSAgICBpZiBndGVzdF9maWx0ZXIgaXMgbm90IE5vbmU6Ci0gICAgICBhcmdzLmFwcGVuZCgnLS0lcz0lcycgJSAoRklMVEVSX0ZMQUcsIGd0ZXN0X2ZpbHRlcikpCi0KLSAgICB0ZXN0c19ydW4gPSBSdW5BbmRFeHRyYWN0VGVzdExpc3QoYXJncylbMF0KLSAgICBzZWxmLkFzc2VydFNldEVxdWFsKHRlc3RzX3J1biwgdGVzdHNfdG9fcnVuKQotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICAiIiJTZXRzIHVwIHRlc3QgY2FzZS4KLQotICAgIERldGVybWluZXMgd2hldGhlciB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBlbmFibGVkIGluIHRoZSBiaW5hcnkgYW5kCi0gICAgc2V0cyB0aGUgZmxhZ3MgYWNjb3JkaW5nbHkuCi0gICAgIiIiCi0KLSAgICBnbG9iYWwgcGFyYW1fdGVzdHNfcHJlc2VudAotICAgIGlmIHBhcmFtX3Rlc3RzX3ByZXNlbnQgaXMgTm9uZToKLSAgICAgIHBhcmFtX3Rlc3RzX3ByZXNlbnQgPSBQQVJBTV9URVNUX1JFR0VYLnNlYXJjaCgKLSAgICAgICAgICBSdW5BbmRSZXR1cm5PdXRwdXQoKSkgaXMgbm90IE5vbmUKLQotICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKLSAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2Ygbm90IHNwZWNpZnlpbmcgdGhlIGZpbHRlci4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KE5vbmUsIEFDVElWRV9URVNUUykKLQotICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcldpdGhTaGFyZHMoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIHdpdGhvdXQgdGhlIGZpbHRlciwgd2l0aCBzaGFyZGluZyBlbmFibGVkLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgMSwgQUNUSVZFX1RFU1RTKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIDIsIEFDVElWRV9URVNUUykKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCBsZW4oQUNUSVZFX1RFU1RTKSAtIDEsIEFDVElWRV9URVNUUykKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCBsZW4oQUNUSVZFX1RFU1RTKSwgQUNUSVZFX1RFU1RTKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIGxlbihBQ1RJVkVfVEVTVFMpICsgMSwgQUNUSVZFX1RFU1RTKQotCi0gIGRlZiB0ZXN0RW1wdHlGaWx0ZXIoc2VsZik6Ci0gICAgIiIiVGVzdHMgYW4gZW1wdHkgZmlsdGVyLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJycsIFtdKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCcnLCAxLCBbXSkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZygnJywgMiwgW10pCi0KLSAgZGVmIHRlc3RCYWRGaWx0ZXIoc2VsZik6Ci0gICAgIiIiVGVzdHMgYSBmaWx0ZXIgdGhhdCBtYXRjaGVzIG5vdGhpbmcuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnQmFkRmlsdGVyJywgW10pCi0gICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdCYWRGaWx0ZXInLCBbXSkKLQotICBkZWYgdGVzdEZ1bGxOYW1lKHNlbGYpOgotICAgICIiIlRlc3RzIGZpbHRlcmluZyBieSBmdWxsIG5hbWUuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRm9vVGVzdC5YeXonLCBbJ0Zvb1Rlc3QuWHl6J10pCi0gICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdGb29UZXN0Llh5eicsIFsnRm9vVGVzdC5YeXonXSkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZygnRm9vVGVzdC5YeXonLCA1LCBbJ0Zvb1Rlc3QuWHl6J10pCi0KLSAgZGVmIHRlc3RVbml2ZXJzYWxGaWx0ZXJzKHNlbGYpOgotICAgICIiIlRlc3RzIGZpbHRlcnMgdGhhdCBtYXRjaCBldmVyeXRoaW5nLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJyonLCBBQ1RJVkVfVEVTVFMpCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJyouKicsIEFDVElWRV9URVNUUykKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZygnKi4qJywgbGVuKEFDVElWRV9URVNUUykgLSAzLCBBQ1RJVkVfVEVTVFMpCi0gICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCcqJywgQUNUSVZFX1RFU1RTICsgRElTQUJMRURfVEVTVFMpCi0gICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCcqLionLCBBQ1RJVkVfVEVTVFMgKyBESVNBQkxFRF9URVNUUykKLQotICBkZWYgdGVzdEZpbHRlckJ5VGVzdENhc2Uoc2VsZik6Ci0gICAgIiIiVGVzdHMgZmlsdGVyaW5nIGJ5IHRlc3QgY2FzZSBuYW1lLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0Zvb1Rlc3QuKicsIFsnRm9vVGVzdC5BYmMnLCAnRm9vVGVzdC5YeXonXSkKLQotICAgIEJBWl9URVNUUyA9IFsnQmF6VGVzdC5UZXN0T25lJywgJ0JhelRlc3QuVGVzdEEnLCAnQmF6VGVzdC5UZXN0QiddCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0JhelRlc3QuKicsIEJBWl9URVNUUykKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0JhelRlc3QuKicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBWl9URVNUUyArIFsnQmF6VGVzdC5ESVNBQkxFRF9UZXN0QyddKQotCi0gIGRlZiB0ZXN0RmlsdGVyQnlUZXN0KHNlbGYpOgotICAgICIiIlRlc3RzIGZpbHRlcmluZyBieSB0ZXN0IG5hbWUuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi5UZXN0T25lJywgWydCYXJUZXN0LlRlc3RPbmUnLCAnQmF6VGVzdC5UZXN0T25lJ10pCi0KLSAgZGVmIHRlc3RGaWx0ZXJEaXNhYmxlZFRlc3RzKHNlbGYpOgotICAgICIiIlNlbGVjdCBvbmx5IHRoZSBkaXNhYmxlZCB0ZXN0cyB0byBydW4uIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MScsIFtdKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MSddKQotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJypESVNBQkxFRF8qJywgW10pCi0gICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCcqRElTQUJMRURfKicsIERJU0FCTEVEX1RFU1RTKQotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJyouRElTQUJMRURfKicsIFtdKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnKi5ESVNBQkxFRF8qJywgWwotICAgICAgICAnQmFyVGVzdC5ESVNBQkxFRF9UZXN0Rm91cicsCi0gICAgICAgICdCYXJUZXN0LkRJU0FCTEVEX1Rlc3RGaXZlJywKLSAgICAgICAgJ0JhelRlc3QuRElTQUJMRURfVGVzdEMnLAotICAgICAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5ESVNBQkxFRF9UZXN0MicsCi0gICAgICAgIF0pCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRElTQUJMRURfKicsIFtdKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnRElTQUJMRURfKicsIFsKLSAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLAotICAgICAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5ESVNBQkxFRF9UZXN0MicsCi0gICAgICAgICdESVNBQkxFRF9Gb29iYXJiYXpUZXN0LlRlc3RBJywKLSAgICAgICAgXSkKLQotICBkZWYgdGVzdFdpbGRjYXJkSW5UZXN0Q2FzZU5hbWUoc2VsZik6Ci0gICAgIiIiVGVzdHMgdXNpbmcgd2lsZGNhcmQgaW4gdGhlIHRlc3QgY2FzZSBuYW1lLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJyphKi4qJywgWwotICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKLSAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCi0gICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCi0KLSAgICAgICAgJ0JhelRlc3QuVGVzdE9uZScsCi0gICAgICAgICdCYXpUZXN0LlRlc3RBJywKLSAgICAgICAgJ0JhelRlc3QuVGVzdEInLCBdICsgREVBVEhfVEVTVFMgKyBQQVJBTV9URVNUUykKLQotICBkZWYgdGVzdFdpbGRjYXJkSW5UZXN0TmFtZShzZWxmKToKLSAgICAiIiJUZXN0cyB1c2luZyB3aWxkY2FyZCBpbiB0aGUgdGVzdCBuYW1lLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJyouKkEqJywgWydGb29UZXN0LkFiYycsICdCYXpUZXN0LlRlc3RBJ10pCi0KLSAgZGVmIHRlc3RGaWx0ZXJXaXRob3V0RG90KHNlbGYpOgotICAgICIiIlRlc3RzIGEgZmlsdGVyIHRoYXQgaGFzIG5vICcuJyBpbiBpdC4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqeionLCBbCi0gICAgICAgICdGb29UZXN0Llh5eicsCi0KLSAgICAgICAgJ0JhelRlc3QuVGVzdE9uZScsCi0gICAgICAgICdCYXpUZXN0LlRlc3RBJywKLSAgICAgICAgJ0JhelRlc3QuVGVzdEInLAotICAgICAgICBdKQotCi0gIGRlZiB0ZXN0VHdvUGF0dGVybnMoc2VsZik6Ci0gICAgIiIiVGVzdHMgZmlsdGVycyB0aGF0IGNvbnNpc3Qgb2YgdHdvIHBhdHRlcm5zLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0ZvbyouKjoqQSonLCBbCi0gICAgICAgICdGb29UZXN0LkFiYycsCi0gICAgICAgICdGb29UZXN0Llh5eicsCi0KLSAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAotICAgICAgICBdKQotCi0gICAgIyBBbiBlbXB0eSBwYXR0ZXJuICsgYSBub24tZW1wdHkgb25lCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJzoqQSonLCBbJ0Zvb1Rlc3QuQWJjJywgJ0JhelRlc3QuVGVzdEEnXSkKLQotICBkZWYgdGVzdFRocmVlUGF0dGVybnMoc2VsZik6Ci0gICAgIiIiVGVzdHMgZmlsdGVycyB0aGF0IGNvbnNpc3Qgb2YgdGhyZWUgcGF0dGVybnMuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKm9vKjoqQSo6Kk9uZScsIFsKLSAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKLSAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKLQotICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKLQotICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKLSAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAotICAgICAgICBdKQotCi0gICAgIyBUaGUgMm5kIHBhdHRlcm4gaXMgZW1wdHkuCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJypvbyo6OipPbmUnLCBbCi0gICAgICAgICdGb29UZXN0LkFiYycsCi0gICAgICAgICdGb29UZXN0Llh5eicsCi0KLSAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCi0KLSAgICAgICAgJ0JhelRlc3QuVGVzdE9uZScsCi0gICAgICAgIF0pCi0KLSAgICAjIFRoZSBsYXN0IDIgcGF0dGVybnMgYXJlIGVtcHR5LgotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqb28qOjonLCBbCi0gICAgICAgICdGb29UZXN0LkFiYycsCi0gICAgICAgICdGb29UZXN0Llh5eicsCi0gICAgICAgIF0pCi0KLSAgZGVmIHRlc3ROZWdhdGl2ZUZpbHRlcnMoc2VsZik6Ci0gICAgc2VsZi5SdW5BbmRWZXJpZnkoJyotQmF6VGVzdC5UZXN0T25lJywgWwotICAgICAgICAnRm9vVGVzdC5BYmMnLAotICAgICAgICAnRm9vVGVzdC5YeXonLAotCi0gICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAotICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKLSAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKLQotICAgICAgICAnQmF6VGVzdC5UZXN0QScsCi0gICAgICAgICdCYXpUZXN0LlRlc3RCJywKLSAgICAgICAgXSArIERFQVRIX1RFU1RTICsgUEFSQU1fVEVTVFMpCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi1Gb29UZXN0LkFiYzpCYXpUZXN0LionLCBbCi0gICAgICAgICdGb29UZXN0Llh5eicsCi0KLSAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCi0gICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAotICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAotICAgICAgICBdICsgREVBVEhfVEVTVFMgKyBQQVJBTV9URVNUUykKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdCYXJUZXN0LiotQmFyVGVzdC5UZXN0T25lJywgWwotICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKLSAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKLSAgICAgICAgXSkKLQotICAgICMgVGVzdHMgd2l0aG91dCBsZWFkaW5nICcqJy4KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnLUZvb1Rlc3QuQWJjOkZvb1Rlc3QuWHl6OkJhelRlc3QuKicsIFsKLSAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCi0gICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAotICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAotICAgICAgICBdICsgREVBVEhfVEVTVFMgKyBQQVJBTV9URVNUUykKLQotICAgICMgVmFsdWUgcGFyYW1ldGVyaXplZCB0ZXN0cy4KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi8qJywgUEFSQU1fVEVTVFMpCi0KLSAgICAjIFZhbHVlIHBhcmFtZXRlcml6ZWQgdGVzdHMgZmlsdGVyaW5nIGJ5IHRoZSBzZXF1ZW5jZSBuYW1lLgotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdTZXFQLyonLCBbCi0gICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKLSAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzEnLAotICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMCcsCi0gICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8xJywKLSAgICAgICAgXSkKLQotICAgICMgVmFsdWUgcGFyYW1ldGVyaXplZCB0ZXN0cyBmaWx0ZXJpbmcgYnkgdGhlIHRlc3QgbmFtZS4KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi8wJywgWwotICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMCcsCi0gICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8wJywKLSAgICAgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RYLzAnLAotICAgICAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFkvMCcsCi0gICAgICAgIF0pCi0KLSAgZGVmIHRlc3RGbGFnT3ZlcnJpZGVzRW52VmFyKHNlbGYpOgotICAgICIiIlRlc3RzIHRoYXQgdGhlIGZpbHRlciBmbGFnIG92ZXJyaWRlcyB0aGUgZmlsdGVyaW5nIGVudi4gdmFyaWFibGUuIiIiCi0KLSAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsICdGb28qJykKLSAgICBhcmdzID0gWyctLSVzPSVzJyAlIChGSUxURVJfRkxBRywgJypPbmUnKV0KLSAgICB0ZXN0c19ydW4gPSBSdW5BbmRFeHRyYWN0VGVzdExpc3QoYXJncylbMF0KLSAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIE5vbmUpCi0KLSAgICBzZWxmLkFzc2VydFNldEVxdWFsKHRlc3RzX3J1biwgWydCYXJUZXN0LlRlc3RPbmUnLCAnQmF6VGVzdC5UZXN0T25lJ10pCi0KLSAgZGVmIHRlc3RTaGFyZFN0YXR1c0ZpbGVJc0NyZWF0ZWQoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhhdCB0aGUgc2hhcmQgZmlsZSBpcyBjcmVhdGVkIGlmIHNwZWNpZmllZCBpbiB0aGUgZW52aXJvbm1lbnQuIiIiCi0KLSAgICBzaGFyZF9zdGF0dXNfZmlsZSA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhcmRfc3RhdHVzX2ZpbGUnKQotICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQotCi0gICAgZXh0cmFfZW52ID0ge1NIQVJEX1NUQVRVU19GSUxFX0VOVl9WQVI6IHNoYXJkX3N0YXR1c19maWxlfQotICAgIHRyeToKLSAgICAgIEludm9rZVdpdGhNb2RpZmllZEVudihleHRyYV9lbnYsIFJ1bkFuZFJldHVybk91dHB1dCkKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNoYXJkX3N0YXR1c19maWxlKSkKLSAgICAgIG9zLnJlbW92ZShzaGFyZF9zdGF0dXNfZmlsZSkKLQotICBkZWYgdGVzdFNoYXJkU3RhdHVzRmlsZUlzQ3JlYXRlZFdpdGhMaXN0VGVzdHMoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhhdCB0aGUgc2hhcmQgZmlsZSBpcyBjcmVhdGVkIHdpdGggdGhlICJsaXN0X3Rlc3RzIiBmbGFnLiIiIgotCi0gICAgc2hhcmRfc3RhdHVzX2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXJkX3N0YXR1c19maWxlMicpCi0gICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCi0KLSAgICBleHRyYV9lbnYgPSB7U0hBUkRfU1RBVFVTX0ZJTEVfRU5WX1ZBUjogc2hhcmRfc3RhdHVzX2ZpbGV9Ci0gICAgdHJ5OgotICAgICAgb3V0cHV0ID0gSW52b2tlV2l0aE1vZGlmaWVkRW52KGV4dHJhX2VudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5BbmRSZXR1cm5PdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xJU1RfVEVTVFNfRkxBR10pCi0gICAgZmluYWxseToKLSAgICAgICMgVGhpcyBhc3NlcnRpb24gZW5zdXJlcyB0aGF0IEdvb2dsZSBUZXN0IGVudW1lcmF0ZWQgdGhlIHRlc3RzIGFzCi0gICAgICAjIG9wcG9zZWQgdG8gcnVubmluZyB0aGVtLgotICAgICAgc2VsZi5hc3NlcnRfKCdbPT09PT09PT09PV0nIG5vdCBpbiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgb3V0cHV0IGR1cmluZyB0ZXN0IGVudW1lcmF0aW9uLlxuJwotICAgICAgICAgICAgICAgICAgICdQbGVhc2UgZW5zdXJlIHRoYXQgTElTVF9URVNUU19GTEFHIGlzIGFzc2lnbmVkIHRoZVxuJwotICAgICAgICAgICAgICAgICAgICdjb3JyZWN0IGZsYWcgdmFsdWUgZm9yIGxpc3RpbmcgR29vZ2xlIFRlc3QgdGVzdHMuJykKLQotICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNoYXJkX3N0YXR1c19maWxlKSkKLSAgICAgIG9zLnJlbW92ZShzaGFyZF9zdGF0dXNfZmlsZSkKLQotICBpZiBTVVBQT1JUU19ERUFUSF9URVNUUzoKLSAgICBkZWYgdGVzdFNoYXJkaW5nV29ya3NXaXRoRGVhdGhUZXN0cyhzZWxmKToKLSAgICAgICIiIlRlc3RzIGludGVncmF0aW9uIHdpdGggZGVhdGggdGVzdHMgYW5kIHNoYXJkaW5nLiIiIgotCi0gICAgICBndGVzdF9maWx0ZXIgPSAnSGFzRGVhdGhUZXN0Lio6U2VxUC8qJwotICAgICAgZXhwZWN0ZWRfdGVzdHMgPSBbCi0gICAgICAgICAgJ0hhc0RlYXRoVGVzdC5UZXN0MScsCi0gICAgICAgICAgJ0hhc0RlYXRoVGVzdC5UZXN0MicsCi0KLSAgICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMCcsCi0gICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzEnLAotICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8wJywKLSAgICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMScsCi0gICAgICAgICAgXQotCi0gICAgICBmb3IgZmxhZyBpbiBbJy0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT10aHJlYWRzYWZlJywKLSAgICAgICAgICAgICAgICAgICAnLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPWZhc3QnXToKLSAgICAgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoZ3Rlc3RfZmlsdGVyLCAzLCBleHBlY3RlZF90ZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfZXhpdF8wPVRydWUsIGFyZ3M9W2ZsYWddKQotICAgICAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhndGVzdF9maWx0ZXIsIDUsIGV4cGVjdGVkX3Rlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGl0XzA9VHJ1ZSwgYXJncz1bZmxhZ10pCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RlZmZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QgdGVzdCBmaWx0ZXJzLgotLy8KLS8vIEEgdXNlciBjYW4gc3BlY2lmeSB3aGljaCB0ZXN0KHMpIGluIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0byBydW4gdmlhCi0vLyBlaXRoZXIgdGhlIEdURVNUX0ZJTFRFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgLS1ndGVzdF9maWx0ZXIKLS8vIGZsYWcuICBUaGlzIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3VjaCBmdW5jdGlvbmFsaXR5LgotLy8KLS8vIFRoZSBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIERvbid0IHJ1biBpdAotLy8gZGlyZWN0bHkuCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi0vLyBUZXN0IGNhc2UgRm9vVGVzdC4KLQotY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLX07Ci0KLVRFU1RfRihGb29UZXN0LCBBYmMpIHsKLX0KLQotVEVTVF9GKEZvb1Rlc3QsIFh5eikgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotLy8gVGVzdCBjYXNlIEJhclRlc3QuCi0KLVRFU1QoQmFyVGVzdCwgVGVzdE9uZSkgewotfQotCi1URVNUKEJhclRlc3QsIFRlc3RUd28pIHsKLX0KLQotVEVTVChCYXJUZXN0LCBUZXN0VGhyZWUpIHsKLX0KLQotVEVTVChCYXJUZXN0LCBESVNBQkxFRF9UZXN0Rm91cikgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotVEVTVChCYXJUZXN0LCBESVNBQkxFRF9UZXN0Rml2ZSkgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotLy8gVGVzdCBjYXNlIEJhelRlc3QuCi0KLVRFU1QoQmF6VGVzdCwgVGVzdE9uZSkgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotVEVTVChCYXpUZXN0LCBUZXN0QSkgewotfQotCi1URVNUKEJhelRlc3QsIFRlc3RCKSB7Ci19Ci0KLVRFU1QoQmF6VGVzdCwgRElTQUJMRURfVGVzdEMpIHsKLSAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Ci19Ci0KLS8vIFRlc3QgY2FzZSBIYXNEZWF0aFRlc3QKLQotVEVTVChIYXNEZWF0aFRlc3QsIFRlc3QxKSB7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoZXhpdCgxKSwgIi4qIik7Ci19Ci0KLS8vIFdlIG5lZWQgYXQgbGVhc3QgdHdvIGRlYXRoIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhbGwgZGVhdGggdGVzdHMKLS8vIGFyZW4ndCBvbiB0aGUgZmlyc3Qgc2hhcmQuCi1URVNUKEhhc0RlYXRoVGVzdCwgVGVzdDIpIHsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChleGl0KDEpLCAiLioiKTsKLX0KLQotLy8gVGVzdCBjYXNlIEZvb2JhclRlc3QKLQotVEVTVChESVNBQkxFRF9Gb29iYXJUZXN0LCBUZXN0MSkgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotVEVTVChESVNBQkxFRF9Gb29iYXJUZXN0LCBESVNBQkxFRF9UZXN0MikgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotLy8gVGVzdCBjYXNlIEZvb2JhcmJhelRlc3QKLQotVEVTVChESVNBQkxFRF9Gb29iYXJiYXpUZXN0LCBUZXN0QSkgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIjsKLX0KLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi1jbGFzcyBQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKLX07Ci0KLVRFU1RfUChQYXJhbVRlc3QsIFRlc3RYKSB7Ci19Ci0KLVRFU1RfUChQYXJhbVRlc3QsIFRlc3RZKSB7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcVAsIFBhcmFtVGVzdCwgdGVzdGluZzo6VmFsdWVzKDEsIDIpKTsKLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcVEsIFBhcmFtVGVzdCwgdGVzdGluZzo6VmFsdWVzKDUsIDYpKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdC5weSBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9oZWxwX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5M2M4MzguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0cyB0aGUgLS1oZWxwIGZsYWcgb2YgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yay4KLQotU1lOT1BTSVMKLSAgICAgICBndGVzdF9oZWxwX3Rlc3QucHkgLS1idWlsZF9kaXI9QlVJTEQvRElSCi0gICAgICAgICAjIHdoZXJlIEJVSUxEL0RJUiBjb250YWlucyB0aGUgYnVpbHQgZ3Rlc3RfaGVscF90ZXN0XyBmaWxlLgotICAgICAgIGd0ZXN0X2hlbHBfdGVzdC5weQotIiIiCi0KLV9fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCi0KLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscwotCi0KLUlTX0xJTlVYID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy51bmFtZSgpWzBdID09ICdMaW51eCcKLUlTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKLQotUFJPR1JBTV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2hlbHBfdGVzdF8nKQotRkxBR19QUkVGSVggPSAnLS1ndGVzdF8nCi1ERUFUSF9URVNUX1NUWUxFX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdkZWF0aF90ZXN0X3N0eWxlJwotU1RSRUFNX1JFU1VMVF9UT19GTEFHID0gRkxBR19QUkVGSVggKyAnc3RyZWFtX3Jlc3VsdF90bycKLVVOS05PV05fRkxBRyA9IEZMQUdfUFJFRklYICsgJ3Vua25vd25fZmxhZ19mb3JfdGVzdGluZycKLUxJU1RfVEVTVFNfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2xpc3RfdGVzdHMnCi1JTkNPUlJFQ1RfRkxBR19WQVJJQU5UUyA9IFtyZS5zdWIoJ14tLScsICctJywgTElTVF9URVNUU19GTEFHKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLnN1YignXi0tJywgJy8nLCBMSVNUX1RFU1RTX0ZMQUcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuc3ViKCdfJywgJy0nLCBMSVNUX1RFU1RTX0ZMQUcpXQotSU5URVJOQUxfRkxBR19GT1JfVEVTVElORyA9IEZMQUdfUFJFRklYICsgJ2ludGVybmFsX2ZsYWdfZm9yX3Rlc3RpbmcnCi0KLVNVUFBPUlRTX0RFQVRIX1RFU1RTID0gIkRlYXRoVGVzdCIgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAotICAgIFtQUk9HUkFNX1BBVEgsIExJU1RfVEVTVFNfRkxBR10pLm91dHB1dAotCi0jIFRoZSBoZWxwIG1lc3NhZ2UgbXVzdCBtYXRjaCB0aGlzIHJlZ2V4LgotSEVMUF9SRUdFWCA9IHJlLmNvbXBpbGUoCi0gICAgRkxBR19QUkVGSVggKyByJ2xpc3RfdGVzdHMuKicgKwotICAgIEZMQUdfUFJFRklYICsgcidmaWx0ZXI9LionICsKLSAgICBGTEFHX1BSRUZJWCArIHInYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMuKicgKwotICAgIEZMQUdfUFJFRklYICsgcidyZXBlYXQ9LionICsKLSAgICBGTEFHX1BSRUZJWCArIHInc2h1ZmZsZS4qJyArCi0gICAgRkxBR19QUkVGSVggKyByJ3JhbmRvbV9zZWVkPS4qJyArCi0gICAgRkxBR19QUkVGSVggKyByJ2NvbG9yPS4qJyArCi0gICAgRkxBR19QUkVGSVggKyByJ3ByaW50X3RpbWUuKicgKwotICAgIEZMQUdfUFJFRklYICsgcidvdXRwdXQ9LionICsKLSAgICBGTEFHX1BSRUZJWCArIHInYnJlYWtfb25fZmFpbHVyZS4qJyArCi0gICAgRkxBR19QUkVGSVggKyByJ3Rocm93X29uX2ZhaWx1cmUuKicgKwotICAgIEZMQUdfUFJFRklYICsgcidjYXRjaF9leGNlcHRpb25zPTAuKicsCi0gICAgcmUuRE9UQUxMKQotCi0KLWRlZiBSdW5XaXRoRmxhZyhmbGFnKToKLSAgIiIiUnVucyBndGVzdF9oZWxwX3Rlc3RfIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0KLSAgUmV0dXJuczoKLSAgICB0aGUgZXhpdCBjb2RlIGFuZCB0aGUgdGV4dCBvdXRwdXQgYXMgYSB0dXBsZS4KLSAgQXJnczoKLSAgICBmbGFnOiB0aGUgY29tbWFuZC1saW5lIGZsYWcgdG8gcGFzcyB0byBndGVzdF9oZWxwX3Rlc3RfLCBvciBOb25lLgotICAiIiIKLQotICBpZiBmbGFnIGlzIE5vbmU6Ci0gICAgY29tbWFuZCA9IFtQUk9HUkFNX1BBVEhdCi0gIGVsc2U6Ci0gICAgY29tbWFuZCA9IFtQUk9HUkFNX1BBVEgsIGZsYWddCi0gIGNoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCi0gIHJldHVybiBjaGlsZC5leGl0X2NvZGUsIGNoaWxkLm91dHB1dAotCi0KLWNsYXNzIEdUZXN0SGVscFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0gICIiIlRlc3RzIHRoZSAtLWhlbHAgZmxhZyBhbmQgaXRzIGVxdWl2YWxlbnQgZm9ybXMuIiIiCi0KLSAgZGVmIFRlc3RIZWxwRmxhZyhzZWxmLCBmbGFnKToKLSAgICAiIiJWZXJpZmllcyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gaGVscCBmbGFnIGlzIHNwZWNpZmllZC4KLQotICAgIFRoZSByaWdodCBtZXNzYWdlIG11c3QgYmUgcHJpbnRlZCBhbmQgdGhlIHRlc3RzIG11c3QKLSAgICBza2lwcGVkIHdoZW4gdGhlIGdpdmVuIGZsYWcgaXMgc3BlY2lmaWVkLgotCi0gICAgQXJnczoKLSAgICAgIGZsYWc6ICBBIGZsYWcgdG8gcGFzcyB0byB0aGUgYmluYXJ5IG9yIE5vbmUuCi0gICAgIiIiCi0KLSAgICBleGl0X2NvZGUsIG91dHB1dCA9IFJ1bldpdGhGbGFnKGZsYWcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgZXhpdF9jb2RlKQotICAgIHNlbGYuYXNzZXJ0XyhIRUxQX1JFR0VYLnNlYXJjaChvdXRwdXQpLCBvdXRwdXQpCi0KLSAgICBpZiBJU19MSU5VWDoKLSAgICAgIHNlbGYuYXNzZXJ0XyhTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgaW4gb3V0cHV0LCBvdXRwdXQpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuYXNzZXJ0XyhTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgbm90IGluIG91dHB1dCwgb3V0cHV0KQotCi0gICAgaWYgU1VQUE9SVFNfREVBVEhfVEVTVFMgYW5kIG5vdCBJU19XSU5ET1dTOgotICAgICAgc2VsZi5hc3NlcnRfKERFQVRIX1RFU1RfU1RZTEVfRkxBRyBpbiBvdXRwdXQsIG91dHB1dCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5hc3NlcnRfKERFQVRIX1RFU1RfU1RZTEVfRkxBRyBub3QgaW4gb3V0cHV0LCBvdXRwdXQpCi0KLSAgZGVmIFRlc3ROb25IZWxwRmxhZyhzZWxmLCBmbGFnKToKLSAgICAiIiJWZXJpZmllcyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gbm8gaGVscCBmbGFnIGlzIHNwZWNpZmllZC4KLQotICAgIFZlcmlmaWVzIHRoYXQgd2hlbiBubyBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgdGVzdHMgYXJlIHJ1bgotICAgIGFuZCB0aGUgaGVscCBtZXNzYWdlIGlzIG5vdCBwcmludGVkLgotCi0gICAgQXJnczoKLSAgICAgIGZsYWc6ICBBIGZsYWcgdG8gcGFzcyB0byB0aGUgYmluYXJ5IG9yIE5vbmUuCi0gICAgIiIiCi0KLSAgICBleGl0X2NvZGUsIG91dHB1dCA9IFJ1bldpdGhGbGFnKGZsYWcpCi0gICAgc2VsZi5hc3NlcnRfKGV4aXRfY29kZSAhPSAwKQotICAgIHNlbGYuYXNzZXJ0Xyhub3QgSEVMUF9SRUdFWC5zZWFyY2gob3V0cHV0KSwgb3V0cHV0KQotCi0gIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhGdWxsRmxhZyhzZWxmKToKLSAgICBzZWxmLlRlc3RIZWxwRmxhZygnLS1oZWxwJykKLQotICBkZWYgdGVzdFByaW50c0hlbHBXaXRoU2hvcnRGbGFnKHNlbGYpOgotICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctaCcpCi0KLSAgZGVmIHRlc3RQcmludHNIZWxwV2l0aFF1ZXN0aW9uRmxhZyhzZWxmKToKLSAgICBzZWxmLlRlc3RIZWxwRmxhZygnLT8nKQotCi0gIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhXaW5kb3dzU3R5bGVRdWVzdGlvbkZsYWcoc2VsZik6Ci0gICAgc2VsZi5UZXN0SGVscEZsYWcoJy8/JykKLQotICBkZWYgdGVzdFByaW50c0hlbHBXaXRoVW5yZWNvZ25pemVkR29vZ2xlVGVzdEZsYWcoc2VsZik6Ci0gICAgc2VsZi5UZXN0SGVscEZsYWcoVU5LTk9XTl9GTEFHKQotCi0gIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhJbmNvcnJlY3RGbGFnU3R5bGUoc2VsZik6Ci0gICAgZm9yIGluY29ycmVjdF9mbGFnIGluIElOQ09SUkVDVF9GTEFHX1ZBUklBTlRTOgotICAgICAgc2VsZi5UZXN0SGVscEZsYWcoaW5jb3JyZWN0X2ZsYWcpCi0KLSAgZGVmIHRlc3RSdW5zVGVzdHNXaXRob3V0SGVscEZsYWcoc2VsZik6Ci0gICAgIiIiVmVyaWZpZXMgdGhhdCB3aGVuIG5vIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSB0ZXN0cyBhcmUgcnVuCi0gICAgYW5kIHRoZSBoZWxwIG1lc3NhZ2UgaXMgbm90IHByaW50ZWQuIiIiCi0KLSAgICBzZWxmLlRlc3ROb25IZWxwRmxhZyhOb25lKQotCi0gIGRlZiB0ZXN0UnVuc1Rlc3RzV2l0aEd0ZXN0SW50ZXJuYWxGbGFnKHNlbGYpOgotICAgICIiIlZlcmlmaWVzIHRoYXQgdGhlIHRlc3RzIGFyZSBydW4gYW5kIG5vIGhlbHAgbWVzc2FnZSBpcyBwcmludGVkIHdoZW4KLSAgICBhIGZsYWcgc3RhcnRpbmcgd2l0aCBHb29nbGUgVGVzdCBwcmVmaXggYW5kICdpbnRlcm5hbF8nIGlzIHN1cHBsaWVkLiIiIgotCi0gICAgc2VsZi5UZXN0Tm9uSGVscEZsYWcoSU5URVJOQUxfRkxBR19GT1JfVEVTVElORykKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmNzhjMi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFRoaXMgcHJvZ3JhbSBpcyBtZWFudCB0byBiZSBydW4gYnkgZ3Rlc3RfaGVscF90ZXN0LnB5LiAgRG8gbm90IHJ1bgotLy8gaXQgZGlyZWN0bHkuCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0vLyBXaGVuIGEgaGVscCBmbGFnIGlzIHNwZWNpZmllZCwgdGhpcyBwcm9ncmFtIHNob3VsZCBza2lwIHRoZSB0ZXN0cwotLy8gYW5kIGV4aXQgd2l0aCAwOyBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyB0ZXN0IHdpbGwgYmUgZXhlY3V0ZWQsCi0vLyBjYXVzaW5nIHRoaXMgcHJvZ3JhbSB0byBleGl0IHdpdGggYSBub24temVybyBjb2RlLgotVEVTVChIZWxwRmxhZ1Rlc3QsIFNob3VsZE5vdEJlUnVuKSB7Ci0gIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiVGVzdHMgc2hvdWxkbid0IGJlIHJ1biB3aGVuIC0taGVscCBpcyBzcGVjaWZpZWQuIjsKLX0KLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi1URVNUKERlYXRoVGVzdCwgVXNlZEJ5UHl0aG9uU2NyaXB0VG9EZXRlY3RTdXBwb3J0Rm9yRGVhdGhUZXN0c0luVGhpc0JpbmFyeSkge30KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3QucHkgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI1YjA5ZC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuCi0KLUEgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIGxpc3QgYWxsIHRlc3RzIGJ5IHNwZWNpZnlpbmcgdGhlCi0tLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4gIFRoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eQotYnkgaW52b2tpbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKLUdvb2dsZSBUZXN0KSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncGhhbm5hQGdvb2dsZS5jb20gKFBhdHJpY2sgSGFubmEpJwotCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscwotaW1wb3J0IHJlCi0KLQotIyBDb25zdGFudHMuCi0KLSMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBlbmFibGluZy9kaXNhYmxpbmcgbGlzdGluZyBhbGwgdGVzdHMuCi1MSVNUX1RFU1RTX0ZMQUcgPSAnZ3Rlc3RfbGlzdF90ZXN0cycKLQotIyBQYXRoIHRvIHRoZSBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBwcm9ncmFtLgotRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8nKQotCi0jIFRoZSBleHBlY3RlZCBvdXRwdXQgd2hlbiBydW5uaW5nIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIHdpdGgKLSMgLS1ndGVzdF9saXN0X3Rlc3RzCi1FWFBFQ1RFRF9PVVRQVVRfTk9fRklMVEVSX1JFID0gcmUuY29tcGlsZShyIiIiRm9vRGVhdGhUZXN0XC4KLSAgVGVzdDEKLUZvb1wuCi0gIEJhcjEKLSAgQmFyMgotICBESVNBQkxFRF9CYXIzCi1BYmNcLgotICBYeXoKLSAgRGVmCi1Gb29CYXJcLgotICBCYXoKLUZvb1Rlc3RcLgotICBUZXN0MQotICBESVNBQkxFRF9UZXN0MgotICBUZXN0MwotVHlwZWRUZXN0LzBcLiAgIyBUeXBlUGFyYW0gPSAoVmVyeUxvezI0NX18Y2xhc3MgVmVyeUxvezIzOX0pXC5cLlwuCi0gIFRlc3RBCi0gIFRlc3RCCi1UeXBlZFRlc3QvMVwuICAjIFR5cGVQYXJhbSA9IGludFxzKlwqCi0gIFRlc3RBCi0gIFRlc3RCCi1UeXBlZFRlc3QvMlwuICAjIFR5cGVQYXJhbSA9IC4qTXlBcnJheTxib29sLFxzKjQyPgotICBUZXN0QQotICBUZXN0QgotTXkvVHlwZVBhcmFtVGVzdC8wXC4gICMgVHlwZVBhcmFtID0gKFZlcnlMb3syNDV9fGNsYXNzIFZlcnlMb3syMzl9KVwuXC5cLgotICBUZXN0QQotICBUZXN0QgotTXkvVHlwZVBhcmFtVGVzdC8xXC4gICMgVHlwZVBhcmFtID0gaW50XHMqXCoKLSAgVGVzdEEKLSAgVGVzdEIKLU15L1R5cGVQYXJhbVRlc3QvMlwuICAjIFR5cGVQYXJhbSA9IC4qTXlBcnJheTxib29sLFxzKjQyPgotICBUZXN0QQotICBUZXN0QgotTXlJbnN0YW50aWF0aW9uL1ZhbHVlUGFyYW1UZXN0XC4KLSAgVGVzdEEvMCAgIyBHZXRQYXJhbVwoXCkgPSBvbmUgbGluZQotICBUZXN0QS8xICAjIEdldFBhcmFtXChcKSA9IHR3b1xcbmxpbmVzCi0gIFRlc3RBLzIgICMgR2V0UGFyYW1cKFwpID0gYSB2ZXJ5XFxubG97MjQxfVwuXC5cLgotICBUZXN0Qi8wICAjIEdldFBhcmFtXChcKSA9IG9uZSBsaW5lCi0gIFRlc3RCLzEgICMgR2V0UGFyYW1cKFwpID0gdHdvXFxubGluZXMKLSAgVGVzdEIvMiAgIyBHZXRQYXJhbVwoXCkgPSBhIHZlcnlcXG5sb3syNDF9XC5cLlwuCi0iIiIpCi0KLSMgVGhlIGV4cGVjdGVkIG91dHB1dCB3aGVuIHJ1bm5pbmcgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gd2l0aAotIyAtLWd0ZXN0X2xpc3RfdGVzdHMgYW5kIC0tZ3Rlc3RfZmlsdGVyPUZvbyouCi1FWFBFQ1RFRF9PVVRQVVRfRklMVEVSX0ZPT19SRSA9IHJlLmNvbXBpbGUociIiIkZvb0RlYXRoVGVzdFwuCi0gIFRlc3QxCi1Gb29cLgotICBCYXIxCi0gIEJhcjIKLSAgRElTQUJMRURfQmFyMwotRm9vQmFyXC4KLSAgQmF6Ci1Gb29UZXN0XC4KLSAgVGVzdDEKLSAgRElTQUJMRURfVGVzdDIKLSAgVGVzdDMKLSIiIikKLQotIyBVdGlsaXRpZXMuCi0KLQotZGVmIFJ1bihhcmdzKToKLSAgIiIiUnVucyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZiB0ZXN0cyBwcmludGVkLiIiIgotCi0gIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0VYRV9QQVRIXSArIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9zdGRlcnI9RmFsc2UpLm91dHB1dAotCi0KLSMgVGhlIHVuaXQgdGVzdC4KLQotY2xhc3MgR1Rlc3RMaXN0VGVzdHNVbml0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKLSAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHRvIGxpc3QgYWxsIHRlc3RzLiIiIgotCi0gIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZmxhZ192YWx1ZSwgZXhwZWN0ZWRfb3V0cHV0X3JlLCBvdGhlcl9mbGFnKToKLSAgICAiIiJSdW5zIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IHByaW50cwotICAgIHRoZSBjb3JyZWN0IHRlc3RzLgotCi0gICAgQXJnczoKLSAgICAgIGZsYWdfdmFsdWU6ICAgICAgICAgdmFsdWUgb2YgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnOwotICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KLSAgICAgIGV4cGVjdGVkX291dHB1dF9yZTogcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGFmdGVyIHJ1bm5pbmcgY29tbWFuZDsKLSAgICAgIG90aGVyX2ZsYWc6ICAgICAgICAgYSBkaWZmZXJlbnQgZmxhZyB0byBiZSBwYXNzZWQgdG8gY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICBhbG9uZyB3aXRoIGd0ZXN0X2xpc3RfdGVzdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgotICAgICIiIgotCi0gICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgotICAgICAgZmxhZyA9ICcnCi0gICAgICBmbGFnX2V4cHJlc3Npb24gPSAnbm90IHNldCcKLSAgICBlbGlmIGZsYWdfdmFsdWUgPT0gJzAnOgotICAgICAgZmxhZyA9ICctLSVzPTAnICUgTElTVF9URVNUU19GTEFHCi0gICAgICBmbGFnX2V4cHJlc3Npb24gPSAnMCcKLSAgICBlbHNlOgotICAgICAgZmxhZyA9ICctLSVzJyAlIExJU1RfVEVTVFNfRkxBRwotICAgICAgZmxhZ19leHByZXNzaW9uID0gJzEnCi0KLSAgICBhcmdzID0gW2ZsYWddCi0KLSAgICBpZiBvdGhlcl9mbGFnIGlzIG5vdCBOb25lOgotICAgICAgYXJncyArPSBbb3RoZXJfZmxhZ10KLQotICAgIG91dHB1dCA9IFJ1bihhcmdzKQotCi0gICAgaWYgZXhwZWN0ZWRfb3V0cHV0X3JlOgotICAgICAgc2VsZi5hc3NlcnRfKAotICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZS5tYXRjaChvdXRwdXQpLAotICAgICAgICAgICgnd2hlbiAlcyBpcyAlcywgdGhlIG91dHB1dCBvZiAiJXMiIGlzICIlcyIsXG4nCi0gICAgICAgICAgICd3aGljaCBkb2VzIG5vdCBtYXRjaCByZWdleCAiJXMiJyAlCi0gICAgICAgICAgIChMSVNUX1RFU1RTX0ZMQUcsIGZsYWdfZXhwcmVzc2lvbiwgJyAnLmpvaW4oYXJncyksIG91dHB1dCwKLSAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZS5wYXR0ZXJuKSkpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuYXNzZXJ0XygKLSAgICAgICAgICBub3QgRVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUl9SRS5tYXRjaChvdXRwdXQpLAotICAgICAgICAgICgnd2hlbiAlcyBpcyAlcywgdGhlIG91dHB1dCBvZiAiJXMiIGlzICIlcyInJQotICAgICAgICAgICAoTElTVF9URVNUU19GTEFHLCBmbGFnX2V4cHJlc3Npb24sICcgJy5qb2luKGFyZ3MpLCBvdXRwdXQpKSkKLQotICBkZWYgdGVzdERlZmF1bHRCZWhhdmlvcihzZWxmKToKLSAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgbW9kZS4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPU5vbmUpCi0KLSAgZGVmIHRlc3RGbGFnKHNlbGYpOgotICAgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9JzAnLAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Tm9uZSkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9RVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUl9SRSwKLSAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPU5vbmUpCi0KLSAgZGVmIHRlc3RPdmVycmlkZU5vbkZpbHRlckZsYWdzKHNlbGYpOgotICAgICIiIlRlc3RzIHRoYXQgLS1ndGVzdF9saXN0X3Rlc3RzIG92ZXJyaWRlcyB0aGUgbm9uLWZpbHRlciBmbGFncy4iIiIKLQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGZsYWdfdmFsdWU9JzEnLAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dF9yZT1FWFBFQ1RFRF9PVVRQVVRfTk9fRklMVEVSX1JFLAotICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Jy0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZScpCi0KLSAgZGVmIHRlc3RXaXRoRmlsdGVyRmxhZ3Moc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhhdCAtLWd0ZXN0X2xpc3RfdGVzdHMgdGFrZXMgaW50byBhY2NvdW50IHRoZQotICAgIC0tZ3Rlc3RfZmlsdGVyIGZsYWcuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9RVhQRUNURURfT1VUUFVUX0ZJTFRFUl9GT09fUkUsCi0gICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz0nLS1ndGVzdF9maWx0ZXI9Rm9vKicpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3YzE3Ni4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogcGhhbm5hQGdvb2dsZS5jb20gKFBhdHJpY2sgSGFubmEpCi0KLS8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4KLS8vCi0vLyBBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBsaXN0IGFsbCB0ZXN0cyB0aGF0IHdpbGwgcnVuCi0vLyBzbyB0aGF0IHdoZW4gdXNpbmcgYSBmaWx0ZXIsIGEgdXNlciB3aWxsIGtub3cgd2hhdAotLy8gdGVzdHMgdG8gbG9vayBmb3IuIFRoZSB0ZXN0cyB3aWxsIG5vdCBiZSBydW4gYWZ0ZXIgbGlzdGluZy4KLS8vCi0vLyBUaGlzIHByb2dyYW0gd2lsbCBiZSBpbnZva2VkIGZyb20gYSBQeXRob24gdW5pdCB0ZXN0LgotLy8gRG9uJ3QgcnVuIGl0IGRpcmVjdGx5LgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gU2V2ZXJhbCBkaWZmZXJlbnQgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdGhhdCB3aWxsIGJlIGxpc3RlZC4KLVRFU1QoRm9vLCBCYXIxKSB7Ci19Ci0KLVRFU1QoRm9vLCBCYXIyKSB7Ci19Ci0KLVRFU1QoRm9vLCBESVNBQkxFRF9CYXIzKSB7Ci19Ci0KLVRFU1QoQWJjLCBYeXopIHsKLX0KLQotVEVTVChBYmMsIERlZikgewotfQotCi1URVNUKEZvb0JhciwgQmF6KSB7Ci19Ci0KLWNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi1URVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKLX0KLQotVEVTVF9GKEZvb1Rlc3QsIERJU0FCTEVEX1Rlc3QyKSB7Ci19Ci0KLVRFU1RfRihGb29UZXN0LCBUZXN0MykgewotfQotCi1URVNUKEZvb0RlYXRoVGVzdCwgVGVzdDEpIHsKLX0KLQotLy8gQSBncm91cCBvZiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotCi1jbGFzcyBNeVR5cGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTXlUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgdmFsdWVfOwotfTsKLQotLy8gVGVhY2hlcyBHb29nbGUgVGVzdCBob3cgdG8gcHJpbnQgYSBNeVR5cGUuCi12b2lkIFByaW50VG8oY29uc3QgTXlUeXBlJiB4LCBzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICpvcyA8PCB4LnZhbHVlKCk7Ci19Ci0KLWNsYXNzIFZhbHVlUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08TXlUeXBlPiB7Ci19OwotCi1URVNUX1AoVmFsdWVQYXJhbVRlc3QsIFRlc3RBKSB7Ci19Ci0KLVRFU1RfUChWYWx1ZVBhcmFtVGVzdCwgVGVzdEIpIHsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCi0gICAgTXlJbnN0YW50aWF0aW9uLCBWYWx1ZVBhcmFtVGVzdCwKLSAgICB0ZXN0aW5nOjpWYWx1ZXMoTXlUeXBlKCJvbmUgbGluZSIpLAotICAgICAgICAgICAgICAgICAgICBNeVR5cGUoInR3b1xubGluZXMiKSwKLSAgICAgICAgICAgICAgICAgICAgTXlUeXBlKCJhIHZlcnlcbmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmcgbGluZSIpKSk7ICAvLyBOT0xJTlQKLQotLy8gQSBncm91cCBvZiB0eXBlZCB0ZXN0cy4KLQotLy8gQSBkZWxpYmVyYXRlbHkgbG9uZyB0eXBlIG5hbWUgZm9yIHRlc3RpbmcgdGhlIGxpbmUtdHJ1bmNhdGluZwotLy8gYmVoYXZpb3Igd2hlbiBwcmludGluZyBhIHR5cGUgcGFyYW1ldGVyLgotY2xhc3MgVmVyeUxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vZ05hbWUgeyAgLy8gTk9MSU5UCi19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVkVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQga1NpemU+Ci1jbGFzcyBNeUFycmF5IHsKLX07Ci0KLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8VmVyeUxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vZ05hbWUsICAvLyBOT0xJTlQKLSAgICAgICAgICAgICAgICAgICAgICAgaW50KiwgTXlBcnJheTxib29sLCA0Mj4gPiBNeVR5cGVzOwotCi1UWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCBNeVR5cGVzKTsKLQotVFlQRURfVEVTVChUeXBlZFRlc3QsIFRlc3RBKSB7Ci19Ci0KLVRZUEVEX1RFU1QoVHlwZWRUZXN0LCBUZXN0QikgewotfQotCi0vLyBBIGdyb3VwIG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUeXBlUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotfTsKLQotVFlQRURfVEVTVF9DQVNFX1AoVHlwZVBhcmFtVGVzdCk7Ci0KLVRZUEVEX1RFU1RfUChUeXBlUGFyYW1UZXN0LCBUZXN0QSkgewotfQotCi1UWVBFRF9URVNUX1AoVHlwZVBhcmFtVGVzdCwgVGVzdEIpIHsKLX0KLQotUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZVBhcmFtVGVzdCwgVGVzdEEsIFRlc3RCKTsKLQotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIFR5cGVQYXJhbVRlc3QsIE15VHlwZXMpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDliYjguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVGVzdHMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRlZmluZSBtYWluKCkgd2hlbiB3ZSBsaW5rIHRvCi0vLyBndGVzdF9tYWluIGluc3RlYWQgb2YgZ3Rlc3QuCi0KLW5hbWVzcGFjZSB7Ci0KLVRFU1QoR1Rlc3RNYWluVGVzdCwgU2hvdWxkU3VjY2VlZCkgewotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gV2UgYXJlIHVzaW5nIHRoZSBtYWluKCkgZnVuY3Rpb24gZGVmaW5lZCBpbiBzcmMvZ3Rlc3RfbWFpbi5jYywgc28KLS8vIHdlIGRvbid0IGRlZmluZSBpdCBoZXJlLgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNTk5YS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVGVzdHMgdGhhdCBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdGhhdCBoYXMgbm8gdGVzdCBkZWZpbmVkIGNhbiBydW4KLS8vIHN1Y2Nlc3NmdWxseS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotCi0gIC8vIEFuIGFkLWhvYyBhc3NlcnRpb24gb3V0c2lkZSBvZiBhbGwgdGVzdHMuCi0gIC8vCi0gIC8vIFRoaXMgc2VydmVzIHRocmVlIHB1cnBvc2VzOgotICAvLwotICAvLyAxLiBJdCB2ZXJpZmllcyB0aGF0IGFuIGFkLWhvYyBhc3NlcnRpb24gY2FuIGJlIGV4ZWN1dGVkIGV2ZW4gaWYKLSAgLy8gICAgbm8gdGVzdCBpcyBkZWZpbmVkLgotICAvLyAyLiBJdCB2ZXJpZmllcyB0aGF0IGEgZmFpbGVkIGFkLWhvYyBhc3NlcnRpb24gY2F1c2VzIHRoZSB0ZXN0Ci0gIC8vICAgIHByb2dyYW0gdG8gZmFpbC4KLSAgLy8gMy4gV2UgaGFkIGEgYnVnIHdoZXJlIHRoZSBYTUwgb3V0cHV0IHdvbid0IGJlIGdlbmVyYXRlZCBpZiBhbgotICAvLyAgICBhc3NlcnRpb24gaXMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQsIGV2ZW4KLSAgLy8gICAgdGhvdWdoIC0tZ3Rlc3Rfb3V0cHV0PXhtbCBpcyBzcGVjaWZpZWQuICBUaGlzIG1ha2VzIHN1cmUgdGhlCi0gIC8vICAgIGJ1ZyBpcyBmaXhlZCBhbmQgZG9lc24ndCByZWdyZXNzLgotICBFWFBFQ1RfRVEoMSwgMik7Ci0KLSAgLy8gVGhlIGFib3ZlIEVYUEVDVF9FUSgpIHNob3VsZCBjYXVzZSBSVU5fQUxMX1RFU1RTKCkgdG8gcmV0dXJuIG5vbi16ZXJvLgotICByZXR1cm4gUlVOX0FMTF9URVNUUygpID8gMCA6IDE7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1YzYzN2IuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3RzIHRoZSB0ZXh0IG91dHB1dCBvZiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgotCi1TWU5PUFNJUwotICAgICAgIGd0ZXN0X291dHB1dF90ZXN0LnB5IC0tYnVpbGRfZGlyPUJVSUxEL0RJUiAtLWdlbmdvbGRlbgotICAgICAgICAgIyB3aGVyZSBCVUlMRC9ESVIgY29udGFpbnMgdGhlIGJ1aWx0IGd0ZXN0X291dHB1dF90ZXN0XyBmaWxlLgotICAgICAgIGd0ZXN0X291dHB1dF90ZXN0LnB5IC0tZ2VuZ29sZGVuCi0gICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKLSIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgZGlmZmxpYgotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLWltcG9ydCBndGVzdF90ZXN0X3V0aWxzCi0KLQotIyBUaGUgZmxhZyBmb3IgZ2VuZXJhdGluZyB0aGUgZ29sZGVuIGZpbGUKLUdFTkdPTERFTl9GTEFHID0gJy0tZ2VuZ29sZGVuJwotQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSX05BTUUgPSAnR1RFU1RfQ0FUQ0hfRVhDRVBUSU9OUycKLQotSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JwotCi0jIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IHJlbW92ZSB0aGUgX2xpbiBzdWZmaXguCi1HT0xERU5fTkFNRSA9ICdndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dCcKLQotUFJPR1JBTV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X291dHB1dF90ZXN0XycpCi0KLSMgQXQgbGVhc3Qgb25lIGNvbW1hbmQgd2UgZXhlcmNpc2UgbXVzdCBub3QgaGF2ZSB0aGUKLSMgJ2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycgYXJndW1lbnQuCi1DT01NQU5EX0xJU1RfVEVTVFMgPSAoe30sIFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2xpc3RfdGVzdHMnXSkKLUNPTU1BTkRfV0lUSF9DT0xPUiA9ICh7fSwgW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3RfY29sb3I9eWVzJ10pCi1DT01NQU5EX1dJVEhfVElNRSA9ICh7fSwgW1BST0dSQU1fUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZ3Rlc3RfcHJpbnRfdGltZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1ndGVzdF9maWx0ZXI9RmF0YWxGYWlsdXJlVGVzdC4qOkxvZ2dpbmdUZXN0LionXSkKLUNPTU1BTkRfV0lUSF9ESVNBQkxFRCA9ICgKLSAgICB7fSwgW1BST0dSQU1fUEFUSCwKLSAgICAgICAgICctLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzJywKLSAgICAgICAgICdpbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMnLAotICAgICAgICAgJy0tZ3Rlc3RfZmlsdGVyPSpESVNBQkxFRF8qJ10pCi1DT01NQU5EX1dJVEhfU0hBUkRJTkcgPSAoCi0gICAgeydHVEVTVF9TSEFSRF9JTkRFWCc6ICcxJywgJ0dURVNUX1RPVEFMX1NIQVJEUyc6ICcyJ30sCi0gICAgW1BST0dSQU1fUEFUSCwKLSAgICAgJ2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCi0gICAgICctLWd0ZXN0X2ZpbHRlcj1QYXNzaW5nVGVzdC4qJ10pCi0KLUdPTERFTl9QQVRIID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksIEdPTERFTl9OQU1FKQotCi0KLWRlZiBUb1VuaXhMaW5lRW5kaW5nKHMpOgotICAiIiJDaGFuZ2VzIGFsbCBXaW5kb3dzL01hYyBsaW5lIGVuZGluZ3MgaW4gcyB0byBVTklYIGxpbmUgZW5kaW5ncy4iIiIKLQotICByZXR1cm4gcy5yZXBsYWNlKCdcclxuJywgJ1xuJykucmVwbGFjZSgnXHInLCAnXG4nKQotCi0KLWRlZiBSZW1vdmVMb2NhdGlvbnModGVzdF9vdXRwdXQpOgotICAiIiJSZW1vdmVzIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuCi0KLSAgQXJnczoKLSAgICAgICB0ZXN0X291dHB1dDogIHRoZSBvdXRwdXQgb2YgYSBHb29nbGUgVGVzdCBwcm9ncmFtLgotCi0gIFJldHVybnM6Ci0gICAgICAgb3V0cHV0IHdpdGggYWxsIGZpbGUgbG9jYXRpb24gaW5mbyAoaW4gdGhlIGZvcm0gb2YKLSAgICAgICAnRElSRUNUT1JZL0ZJTEVfTkFNRTpMSU5FX05VTUJFUjogJ29yCi0gICAgICAgJ0RJUkVDVE9SWVxcRklMRV9OQU1FKExJTkVfTlVNQkVSKTogJykgcmVwbGFjZWQgYnkKLSAgICAgICAnRklMRV9OQU1FOiM6ICcuCi0gICIiIgotCi0gIHJldHVybiByZS5zdWIocicuKlsvXFxdKC4rKShcOlxkK3xcKFxkK1wpKVw6ICcsIHInXDE6IzogJywgdGVzdF9vdXRwdXQpCi0KLQotZGVmIFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCk6Ci0gICIiIlJlbW92ZXMgYWxsIHN0YWNrIHRyYWNlcyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKLQotICAjICo/IG1lYW5zICJmaW5kIHRoZSBzaG9ydGVzdCBzdHJpbmcgdGhhdCBtYXRjaGVzIi4KLSAgcmV0dXJuIHJlLnN1YihyJ1N0YWNrIHRyYWNlOigufFxuKSo/XG5cbicsCi0gICAgICAgICAgICAgICAgJ1N0YWNrIHRyYWNlOiAob21pdHRlZClcblxuJywgb3V0cHV0KQotCi0KLWRlZiBSZW1vdmVTdGFja1RyYWNlcyhvdXRwdXQpOgotICAiIiJSZW1vdmVzIGFsbCB0cmFjZXMgb2Ygc3RhY2sgdHJhY2VzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgotCi0gICMgKj8gbWVhbnMgImZpbmQgdGhlIHNob3J0ZXN0IHN0cmluZyB0aGF0IG1hdGNoZXMiLgotICByZXR1cm4gcmUuc3ViKHInU3RhY2sgdHJhY2U6KC58XG4pKj9cblxuJywgJycsIG91dHB1dCkKLQotCi1kZWYgUmVtb3ZlVGltZShvdXRwdXQpOgotICAiIiJSZW1vdmVzIGFsbCB0aW1lIGluZm9ybWF0aW9uIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgotCi0gIHJldHVybiByZS5zdWIocidcKFxkKyBtcycsICcoPyBtcycsIG91dHB1dCkKLQotCi1kZWYgUmVtb3ZlVHlwZUluZm9EZXRhaWxzKHRlc3Rfb3V0cHV0KToKLSAgIiIiUmVtb3ZlcyBjb21waWxlci1zcGVjaWZpYyB0eXBlIGluZm8gZnJvbSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgotCi0gIEFyZ3M6Ci0gICAgICAgdGVzdF9vdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KLQotICBSZXR1cm5zOgotICAgICAgIG91dHB1dCB3aXRoIHR5cGUgaW5mb3JtYXRpb24gbm9ybWFsaXplZCB0byBjYW5vbmljYWwgZm9ybS4KLSAgIiIiCi0KLSAgIyBzb21lIGNvbXBpbGVycyBvdXRwdXQgdGhlIG5hbWUgb2YgdHlwZSAndW5zaWduZWQgaW50JyBhcyAndW5zaWduZWQnCi0gIHJldHVybiByZS5zdWIocid1bnNpZ25lZCBpbnQnLCAndW5zaWduZWQnLCB0ZXN0X291dHB1dCkKLQotCi1kZWYgTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0odGVzdF9vdXRwdXQpOgotICAiIiJOb3JtYWxpemVzIHBsYXRmb3JtIHNwZWNpZmljIG91dHB1dCBkZXRhaWxzIGZvciBlYXNpZXIgY29tcGFyaXNvbi4iIiIKLQotICBpZiBJU19XSU5ET1dTOgotICAgICMgUmVtb3ZlcyB0aGUgY29sb3IgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBvbiBXaW5kb3dzLgotICAgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKCdceDFiXFxbKDA7M1xkKT9tJywgJycsIHRlc3Rfb3V0cHV0KQotICAgICMgQ2hhbmdlcyBmYWlsdXJlIG1lc3NhZ2UgaGVhZGVycyBpbnRvIHRoZSBXaW5kb3dzIGZvcm1hdC4KLSAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJzogRmFpbHVyZVxuJywgcic6IGVycm9yOiAnLCB0ZXN0X291dHB1dCkKLSAgICAjIENoYW5nZXMgZmlsZShsaW5lX251bWJlcikgdG8gZmlsZTpsaW5lX251bWJlci4KLSAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJygoXHd8XC4pKylcKChcZCspXCk6JywgcidcMTpcMzonLCB0ZXN0X291dHB1dCkKLQotICByZXR1cm4gdGVzdF9vdXRwdXQKLQotCi1kZWYgUmVtb3ZlVGVzdENvdW50cyhvdXRwdXQpOgotICAiIiJSZW1vdmVzIHRlc3QgY291bnRzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgotCi0gIG91dHB1dCA9IHJlLnN1YihyJ1xkKyB0ZXN0cz8sIGxpc3RlZCBiZWxvdycsCi0gICAgICAgICAgICAgICAgICAnPyB0ZXN0cywgbGlzdGVkIGJlbG93Jywgb3V0cHV0KQotICBvdXRwdXQgPSByZS5zdWIocidcZCsgRkFJTEVEIFRFU1RTJywKLSAgICAgICAgICAgICAgICAgICc/IEZBSUxFRCBURVNUUycsIG91dHB1dCkKLSAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIFxkKyB0ZXN0IGNhc2VzPycsCi0gICAgICAgICAgICAgICAgICAnPyB0ZXN0cyBmcm9tID8gdGVzdCBjYXNlcycsIG91dHB1dCkKLSAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIChbYS16QS1aX10pJywKLSAgICAgICAgICAgICAgICAgIHInPyB0ZXN0cyBmcm9tIFwxJywgb3V0cHV0KQotICByZXR1cm4gcmUuc3ViKHInXGQrIHRlc3RzP1wuJywgJz8gdGVzdHMuJywgb3V0cHV0KQotCi0KLWRlZiBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCBwYXR0ZXJuKToKLSAgIiIiUmVtb3ZlcyBvdXRwdXQgb2Ygc3BlY2lmaWVkIHRlc3RzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgotCi0gIFRoaXMgZnVuY3Rpb24gc3RyaXBzIG5vdCBvbmx5IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgYSB0ZXN0IGJ1dCBhbHNvCi0gIGFsbCBvdXRwdXQgaW4gYmV0d2Vlbi4KLQotICBBcmdzOgotICAgIHRlc3Rfb3V0cHV0OiAgICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXN0IG91dHB1dC4KLSAgICBwYXR0ZXJuOiAgICAgICAgICAgQSByZWdleCBzdHJpbmcgdGhhdCBtYXRjaGVzIG5hbWVzIG9mIHRlc3QgY2FzZXMgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgdG8gcmVtb3ZlLgotCi0gIFJldHVybnM6Ci0gICAgQ29udGVudHMgb2YgdGVzdF9vdXRwdXQgd2l0aCB0ZXN0cyB3aG9zZSBuYW1lcyBtYXRjaCBwYXR0ZXJuIHJlbW92ZWQuCi0gICIiIgotCi0gIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKAotICAgICAgcicuKlxbIFJVTiAgICAgIFxdIC4qJXMoLnxcbikqP1xbKCAgRkFJTEVEICB8ICAgICAgIE9LIClcXSAuKiVzLipcbicgJSAoCi0gICAgICAgICAgcGF0dGVybiwgcGF0dGVybiksCi0gICAgICAnJywKLSAgICAgIHRlc3Rfb3V0cHV0KQotICByZXR1cm4gcmUuc3ViKHInLiolcy4qXG4nICUgcGF0dGVybiwgJycsIHRlc3Rfb3V0cHV0KQotCi0KLWRlZiBOb3JtYWxpemVPdXRwdXQob3V0cHV0KToKLSAgIiIiTm9ybWFsaXplcyBvdXRwdXQgKHRoZSBvdXRwdXQgb2YgZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmV4ZSkuIiIiCi0KLSAgb3V0cHV0ID0gVG9Vbml4TGluZUVuZGluZyhvdXRwdXQpCi0gIG91dHB1dCA9IFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpCi0gIG91dHB1dCA9IFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCkKLSAgb3V0cHV0ID0gUmVtb3ZlVGltZShvdXRwdXQpCi0gIHJldHVybiBvdXRwdXQKLQotCi1kZWYgR2V0U2hlbGxDb21tYW5kT3V0cHV0KGVudl9jbWQpOgotICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgcmV0dXJucyBpdHMgb3V0cHV0IGluIGEgc3RyaW5nLgotCi0gIEFyZ3M6Ci0gICAgZW52X2NtZDogVGhlIHNoZWxsIGNvbW1hbmQuIEEgMi10dXBsZSB3aGVyZSBlbGVtZW50IDAgaXMgYSBkaWN0IG9mIGV4dHJhCi0gICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCwgYW5kIGVsZW1lbnQgMSBpcyBhIHN0cmluZyB3aXRoCi0gICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KLQotICBSZXR1cm5zOgotICAgIEEgc3RyaW5nIHdpdGggdGhlIGNvbW1hbmQncyBjb21iaW5lZCBzdGFuZGFyZCBhbmQgZGlhZ25vc3RpYyBvdXRwdXQuCi0gICIiIgotCi0gICMgU3Bhd25zIGNtZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgZ2V0cyBpdHMgc3RhbmRhcmQgSS9PIGZpbGUgb2JqZWN0cy4KLSAgIyBTZXQgYW5kIHNhdmUgdGhlIGVudmlyb25tZW50IHByb3Blcmx5LgotICBlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKLSAgZW52aXJvbi51cGRhdGUoZW52X2NtZFswXSkKLSAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhlbnZfY21kWzFdLCBlbnY9ZW52aXJvbikKLQotICByZXR1cm4gcC5vdXRwdXQKLQotCi1kZWYgR2V0Q29tbWFuZE91dHB1dChlbnZfY21kKToKLSAgIiIiUnVucyBhIGNvbW1hbmQgYW5kIHJldHVybnMgaXRzIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uCi0gIGluZm8gc3RyaXBwZWQgb2ZmLgotCi0gIEFyZ3M6Ci0gICAgZW52X2NtZDogIFRoZSBzaGVsbCBjb21tYW5kLiBBIDItdHVwbGUgd2hlcmUgZWxlbWVudCAwIGlzIGEgZGljdCBvZiBleHRyYQotICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0LCBhbmQgZWxlbWVudCAxIGlzIGEgc3RyaW5nIHdpdGgKLSAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KLSAgIiIiCi0KLSAgIyBEaXNhYmxlcyBleGNlcHRpb24gcG9wLXVwcyBvbiBXaW5kb3dzLgotICBlbnZpcm9uLCBjbWRsaW5lID0gZW52X2NtZAotICBlbnZpcm9uID0gZGljdChlbnZpcm9uKSAgIyBFbnN1cmVzIHdlIGFyZSBtb2RpZnlpbmcgYSBjb3B5LgotICBlbnZpcm9uW0NBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUl9OQU1FXSA9ICcxJwotICByZXR1cm4gTm9ybWFsaXplT3V0cHV0KEdldFNoZWxsQ29tbWFuZE91dHB1dCgoZW52aXJvbiwgY21kbGluZSkpKQotCi0KLWRlZiBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCk6Ci0gICIiIlJldHVybnMgY29uY2F0ZW5hdGVkIG91dHB1dCBmcm9tIHNldmVyYWwgcmVwcmVzZW50YXRpdmUgY29tbWFuZHMuIiIiCi0KLSAgcmV0dXJuIChHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9DT0xPUikgKwotICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1RJTUUpICsKLSAgICAgICAgICBHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9ESVNBQkxFRCkgKwotICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1NIQVJESU5HKSkKLQotCi10ZXN0X2xpc3QgPSBHZXRTaGVsbENvbW1hbmRPdXRwdXQoQ09NTUFORF9MSVNUX1RFU1RTKQotU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAnRGVhdGhUZXN0JyBpbiB0ZXN0X2xpc3QKLVNVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gdGVzdF9saXN0Ci1TVVBQT1JUU19USFJFQURTID0gJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnIGluIHRlc3RfbGlzdAotU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTID0gRmFsc2UKLQotQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFID0gKFNVUFBPUlRTX0RFQVRIX1RFU1RTIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RZUEVEX1RFU1RTIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RIUkVBRFMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IElTX1dJTkRPV1MpCi0KLWNsYXNzIEdUZXN0T3V0cHV0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKLSAgZGVmIFJlbW92ZVVuc3VwcG9ydGVkVGVzdHMoc2VsZiwgdGVzdF9vdXRwdXQpOgotICAgIGlmIG5vdCBTVVBQT1JUU19ERUFUSF9URVNUUzoKLSAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ0RlYXRoVGVzdCcpCi0gICAgaWYgbm90IFNVUFBPUlRTX1RZUEVEX1RFU1RTOgotICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZWRUZXN0JykKLSAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ1R5cGVkRGVhdGhUZXN0JykKLSAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ1R5cGVQYXJhbURlYXRoVGVzdCcpCi0gICAgaWYgbm90IFNVUFBPUlRTX1RIUkVBRFM6Ci0gICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnKQotICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QnKQotICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3Jrc0NvbmN1cnJlbnRseScpCi0gICAgaWYgbm90IFNVUFBPUlRTX1NUQUNLX1RSQUNFUzoKLSAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlU3RhY2tUcmFjZXModGVzdF9vdXRwdXQpCi0KLSAgICByZXR1cm4gdGVzdF9vdXRwdXQKLQotICBkZWYgdGVzdE91dHB1dChzZWxmKToKLSAgICBvdXRwdXQgPSBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCkKLQotICAgIGdvbGRlbl9maWxlID0gb3BlbihHT0xERU5fUEFUSCwgJ3JiJykKLSAgICAjIEEgbWlzLWNvbmZpZ3VyZWQgc291cmNlIGNvbnRyb2wgc3lzdGVtIGNhbiBjYXVzZSBcciBhcHBlYXIgaW4gRU9MCi0gICAgIyBzZXF1ZW5jZXMgd2hlbiB3ZSByZWFkIHRoZSBnb2xkZW4gZmlsZSBpcnJlc3BlY3RpdmUgb2YgYW4gb3BlcmF0aW5nCi0gICAgIyBzeXN0ZW0gdXNlZC4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN0cmlwIHRob3NlIFxyJ3MgZnJvbSBuZXdsaW5lcwotICAgICMgdW5jb25kaXRpb25hbGx5LgotICAgIGdvbGRlbiA9IFRvVW5peExpbmVFbmRpbmcoZ29sZGVuX2ZpbGUucmVhZCgpKQotICAgIGdvbGRlbl9maWxlLmNsb3NlKCkKLQotICAgICMgV2Ugd2FudCB0aGUgdGVzdCB0byBwYXNzIHJlZ2FyZGxlc3Mgb2YgY2VydGFpbiBmZWF0dXJlcyBiZWluZwotICAgICMgc3VwcG9ydGVkIG9yIG5vdC4KLQotICAgICMgV2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdHlwZSBuYW1lIHNwZWNpZmljcyBpbiBhbGwgY2FzZXMuCi0gICAgbm9ybWFsaXplZF9hY3R1YWwgPSBSZW1vdmVUeXBlSW5mb0RldGFpbHMob3V0cHV0KQotICAgIG5vcm1hbGl6ZWRfZ29sZGVuID0gUmVtb3ZlVHlwZUluZm9EZXRhaWxzKGdvbGRlbikKLQotICAgIGlmIENBTl9HRU5FUkFURV9HT0xERU5fRklMRToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWFsaXplZF9nb2xkZW4sIG5vcm1hbGl6ZWRfYWN0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oZGlmZmxpYi51bmlmaWVkX2RpZmYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkX2dvbGRlbi5zcGxpdCgnXG4nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsLnNwbGl0KCdcbicpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvbGRlbicsICdhY3R1YWwnKSkpCi0gICAgZWxzZToKLSAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsID0gTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0oCi0gICAgICAgICAgUmVtb3ZlVGVzdENvdW50cyhub3JtYWxpemVkX2FjdHVhbCkpCi0gICAgICBub3JtYWxpemVkX2dvbGRlbiA9IE5vcm1hbGl6ZVRvQ3VycmVudFBsYXRmb3JtKAotICAgICAgICAgIFJlbW92ZVRlc3RDb3VudHMoc2VsZi5SZW1vdmVVbnN1cHBvcnRlZFRlc3RzKG5vcm1hbGl6ZWRfZ29sZGVuKSkpCi0KLSAgICAgICMgVGhpcyBjb2RlIGlzIHZlcnkgaGFuZHkgd2hlbiBkZWJ1Z2dpbmcgZ29sZGVuIGZpbGUgZGlmZmVyZW5jZXM6Ci0gICAgICBpZiBvcy5nZXRlbnYoJ0RFQlVHX0dURVNUX09VVFBVVF9URVNUJyk6Ci0gICAgICAgIG9wZW4ob3MucGF0aC5qb2luKAotICAgICAgICAgICAgZ3Rlc3RfdGVzdF91dGlscy5HZXRTb3VyY2VEaXIoKSwKLSAgICAgICAgICAgICdfZ3Rlc3Rfb3V0cHV0X3Rlc3Rfbm9ybWFsaXplZF9hY3R1YWwudHh0JyksICd3YicpLndyaXRlKAotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsKQotICAgICAgICBvcGVuKG9zLnBhdGguam9pbigKLSAgICAgICAgICAgIGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksCi0gICAgICAgICAgICAnX2d0ZXN0X291dHB1dF90ZXN0X25vcm1hbGl6ZWRfZ29sZGVuLnR4dCcpLCAnd2InKS53cml0ZSgKLSAgICAgICAgICAgICAgICBub3JtYWxpemVkX2dvbGRlbikKLQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemVkX2dvbGRlbiwgbm9ybWFsaXplZF9hY3R1YWwpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgaWYgc3lzLmFyZ3ZbMTpdID09IFtHRU5HT0xERU5fRkxBR106Ci0gICAgaWYgQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFOgotICAgICAgb3V0cHV0ID0gR2V0T3V0cHV0T2ZBbGxDb21tYW5kcygpCi0gICAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICd3YicpCi0gICAgICBnb2xkZW5fZmlsZS53cml0ZShvdXRwdXQpCi0gICAgICBnb2xkZW5fZmlsZS5jbG9zZSgpCi0gICAgZWxzZToKLSAgICAgIG1lc3NhZ2UgPSAoCi0gICAgICAgICAgIiIiVW5hYmxlIHRvIHdyaXRlIGEgZ29sZGVuIGZpbGUgd2hlbiBjb21waWxlZCBpbiBhbiBlbnZpcm9ubWVudAotdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGFsbCB0aGUgcmVxdWlyZWQgZmVhdHVyZXMgKGRlYXRoIHRlc3RzLCB0eXBlZCB0ZXN0cywKLWFuZCBtdWx0aXBsZSB0aHJlYWRzKS4gIFBsZWFzZSBnZW5lcmF0ZSB0aGUgZ29sZGVuIGZpbGUgdXNpbmcgYSBiaW5hcnkgYnVpbHQKLXdpdGggdGhvc2UgZmVhdHVyZXMgZW5hYmxlZC4iIiIpCi0KLSAgICAgIHN5cy5zdGRlcnIud3JpdGUobWVzc2FnZSkKLSAgICAgIHN5cy5leGl0KDEpCi0gIGVsc2U6Ci0gICAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDcwYTlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdF8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBUaGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gZ2VuZXJhdGUgR29vZ2xlIFRlc3Qgb3V0cHV0IHVuZGVyCi0vLyB2YXJpb3VzIGNvbmRpdGlvbnMuICBUaGUgb3V0cHV0IHdpbGwgdGhlbiBiZSB2ZXJpZmllZCBieQotLy8gZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgdG8gZW5zdXJlIHRoYXQgR29vZ2xlIFRlc3QgZ2VuZXJhdGVzIHRoZQotLy8gZGVzaXJlZCBtZXNzYWdlcy4gIFRoZXJlZm9yZSwgbW9zdCB0ZXN0cyBpbiB0aGlzIGZpbGUgYXJlIE1FQU5UIFRPCi0vLyBGQUlMLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgotLy8gaGlzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZiBHVEVTVF9JU19USFJFQURTQUZFCi11c2luZyB0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKLXVzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXk7Ci0KLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpOb3RpZmljYXRpb247Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VGhyZWFkV2l0aFBhcmFtOwotI2VuZGlmCi0KLW5hbWVzcGFjZSBwb3NpeCA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OwotCi0vLyBUZXN0cyBjYXRjaGluZyBmYXRhbCBmYWlsdXJlcy4KLQotLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgotdm9pZCBUZXN0RXExKGludCB4KSB7Ci0gIEFTU0VSVF9FUSgxLCB4KTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBjYWxscyBhIHRlc3Qgc3Vicm91dGluZSwgY2F0Y2hlcyB0aGUgZmF0YWwgZmFpbHVyZSBpdAotLy8gZ2VuZXJhdGVzLCBhbmQgdGhlbiByZXR1cm5zIGVhcmx5Lgotdm9pZCBUcnlUZXN0U3Vicm91dGluZSgpIHsKLSAgLy8gQ2FsbHMgYSBzdWJyb3VudGluZSB0aGF0IHlpZWxkcyBhIGZhdGFsIGZhaWx1cmUuCi0gIFRlc3RFcTEoMik7Ci0KLSAgLy8gQ2F0Y2hlcyB0aGUgZmF0YWwgZmFpbHVyZSBhbmQgYWJvcnRzIHRoZSB0ZXN0LgotICAvLwotICAvLyBUaGUgdGVzdGluZzo6VGVzdDo6IHByZWZpeCBpcyBuZWNlc3Nhcnkgd2hlbiBjYWxsaW5nCi0gIC8vIEhhc0ZhdGFsRmFpbHVyZSgpIG91dHNpZGUgb2YgYSBURVNULCBURVNUX0YsIG9yIHRlc3QgZml4dHVyZS4KLSAgaWYgKHRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47Ci0KLSAgLy8gSWYgd2UgZ2V0IGhlcmUsIHNvbWV0aGluZyBpcyB3cm9uZy4KLSAgRkFJTCgpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLiI7Ci19Ci0KLVRFU1QoUGFzc2luZ1Rlc3QsIFBhc3NpbmdUZXN0MSkgewotfQotCi1URVNUKFBhc3NpbmdUZXN0LCBQYXNzaW5nVGVzdDIpIHsKLX0KLQotLy8gVGVzdHMgdGhhdCBwYXJhbWV0ZXJzIG9mIGZhaWxpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgcHJpbnRlZCBpbiB0aGUKLS8vIGZhaWxpbmcgdGVzdCBzdW1tYXJ5LgotY2xhc3MgRmFpbGluZ1BhcmFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4ge307Ci0KLVRFU1RfUChGYWlsaW5nUGFyYW1UZXN0LCBGYWlscykgewotICBFWFBFQ1RfRVEoMSwgR2V0UGFyYW0oKSk7Ci19Ci0KLS8vIFRoaXMgZ2VuZXJhdGVzIGEgdGVzdCB3aGljaCB3aWxsIGZhaWwuIEdvb2dsZSBUZXN0IGlzIGV4cGVjdGVkIHRvIHByaW50Ci0vLyBpdHMgcGFyYW1ldGVyIHdoZW4gaXQgb3V0cHV0cyB0aGUgbGlzdCBvZiBhbGwgZmFpbGVkIHRlc3RzLgotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUHJpbnRpbmdGYWlsaW5nUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgRmFpbGluZ1BhcmFtVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygyKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtHb2xkZW5TdHJpbmdbXSA9ICJcIkxpbmVcMCAxXCJcbkxpbmUgMiI7Ci0KLVRFU1QoTm9uZmF0YWxGYWlsdXJlVGVzdCwgRXNjYXBlc1N0cmluZ09wZXJhbmRzKSB7Ci0gIHN0ZDo6c3RyaW5nIGFjdHVhbCA9ICJhY3R1YWwgXCJzdHJpbmdcIiI7Ci0gIEVYUEVDVF9FUShrR29sZGVuU3RyaW5nLCBhY3R1YWwpOwotCi0gIGNvbnN0IGNoYXIqIGdvbGRlbiA9IGtHb2xkZW5TdHJpbmc7Ci0gIEVYUEVDVF9FUShnb2xkZW4sIGFjdHVhbCk7Ci19Ci0KLVRFU1QoTm9uZmF0YWxGYWlsdXJlVGVzdCwgRGlmZkZvckxvbmdTdHJpbmdzKSB7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbl9zdHIoa0dvbGRlblN0cmluZywgc2l6ZW9mKGtHb2xkZW5TdHJpbmcpIC0gMSk7Ci0gIEVYUEVDVF9FUShnb2xkZW5fc3RyLCAiTGluZSAyIik7Ci19Ci0KLS8vIFRlc3RzIGNhdGNoaW5nIGEgZmF0YWwgZmFpbHVyZSBpbiBhIHN1YnJvdXRpbmUuCi1URVNUKEZhdGFsRmFpbHVyZVRlc3QsIEZhdGFsRmFpbHVyZUluU3Vicm91dGluZSkgewotICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSlcbiIpOwotCi0gIFRyeVRlc3RTdWJyb3V0aW5lKCk7Ci19Ci0KLS8vIFRlc3RzIGNhdGNoaW5nIGEgZmF0YWwgZmFpbHVyZSBpbiBhIG5lc3RlZCBzdWJyb3V0aW5lLgotVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBGYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpXG4iKTsKLQotICAvLyBDYWxscyBhIHN1YnJvdW50aW5lIHRoYXQgeWllbGRzIGEgZmF0YWwgZmFpbHVyZS4KLSAgVHJ5VGVzdFN1YnJvdXRpbmUoKTsKLQotICAvLyBDYXRjaGVzIHRoZSBmYXRhbCBmYWlsdXJlIGFuZCBhYm9ydHMgdGhlIHRlc3QuCi0gIC8vCi0gIC8vIFdoZW4gY2FsbGluZyBIYXNGYXRhbEZhaWx1cmUoKSBpbnNpZGUgYSBURVNULCBURVNUX0YsIG9yIHRlc3QKLSAgLy8gZml4dHVyZSwgdGhlIHRlc3Rpbmc6OlRlc3Q6OiBwcmVmaXggaXMgbm90IG5lZWRlZC4KLSAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47Ci0KLSAgLy8gSWYgd2UgZ2V0IGhlcmUsIHNvbWV0aGluZyBpcyB3cm9uZy4KLSAgRkFJTCgpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLiI7Ci19Ci0KLS8vIFRlc3RzIEhhc0ZhdGFsRmFpbHVyZSgpIGFmdGVyIGEgZmFpbGVkIEVYUEVDVCBjaGVjay4KLVRFU1QoRmF0YWxGYWlsdXJlVGVzdCwgTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lKSB7Ci0gIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpXG4iKTsKLSAgRVhQRUNUX1RSVUUoZmFsc2UpOyAgLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZQotICBBU1NFUlRfRkFMU0UoSGFzRmF0YWxGYWlsdXJlKCkpOyAgLy8gVGhpcyBzaG91bGQgc3VjY2VlZC4KLX0KLQotLy8gVGVzdHMgaW50ZXJsZWF2aW5nIHVzZXIgbG9nZ2luZyBhbmQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucy4KLVRFU1QoTG9nZ2luZ1Rlc3QsIEludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgYVs0XSA9IHsKLSAgICAzLCA5LCAyLCA2Ci0gIH07Ci0KLSAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSlcbiIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKGEpL3NpemVvZigqYSkpOyBpKyspIHsKLSAgICBwcmludGYoImkgPT0gJWRcbiIsIGkpOwotICAgIEVYUEVDVF9HRSgzLCBhW2ldKTsKLSAgfQotfQotCi0vLyBUZXN0cyB0aGUgU0NPUEVEX1RSQUNFIG1hY3JvLgotCi0vLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgdGVzdGluZyBTQ09QRURfVFJBQ0UuCi12b2lkIFN1YldpdGhvdXRUcmFjZShpbnQgbikgewotICBFWFBFQ1RfRVEoMSwgbik7Ci0gIEFTU0VSVF9FUSgyLCBuKTsKLX0KLQotLy8gQW5vdGhlciBoZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RpbmcgU0NPUEVEX1RSQUNFLgotdm9pZCBTdWJXaXRoVHJhY2UoaW50IG4pIHsKLSAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAibiA9ICIgPDwgbik7Ci0KLSAgU3ViV2l0aG91dFRyYWNlKG4pOwotfQotCi0vLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpIG9iZXlzIGxleGljYWwgc2NvcGVzLgotVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBPYmV5c1Njb3BlcykgewotICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHRyYWNlIGJlZm9yZSBTQ09QRURfVFJBQ0UoKSBpcyBpbnZva2VkLgotICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLiI7Ci0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiRXhwZWN0ZWQgdHJhY2UiKTsKLSAgICAvLyBBZnRlciBTQ09QRURfVFJBQ0UoKSwgYSBmYWlsdXJlIGluIHRoZSBjdXJyZW50IHNjb3BlIHNob3VsZCBjb250YWluCi0gICAgLy8gdGhlIHRyYWNlLgotICAgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBoYXZlIGEgdHJhY2UuIjsKLSAgfQotCi0gIC8vIE9uY2UgdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBzY29wZSBvZiB0aGUgU0NPUEVEX1RSQUNFKCksIHRoZXJlCi0gIC8vIHNob3VsZCBiZSBubyB0cmFjZSBhZ2Fpbi4KLSAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkbid0IGhhdmUgYSB0cmFjZS4iOwotfQotCi0vLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSB3b3JrcyBpbnNpZGUgYSBsb29wLgotVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBXb3Jrc0luTG9vcCkgewotICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMjsgaSsrKSB7Ci0gICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaSA9ICIgPDwgaSk7Ci0KLSAgICBTdWJXaXRob3V0VHJhY2UoaSk7Ci0gIH0KLX0KLQotLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0Ugd29ya3MgaW4gYSBzdWJyb3V0aW5lLgotVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBXb3Jrc0luU3Vicm91dGluZSkgewotICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7Ci0KLSAgU3ViV2l0aFRyYWNlKDEpOwotICBTdWJXaXRoVHJhY2UoMik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFIGNhbiBiZSBuZXN0ZWQuCi1URVNUKFNDT1BFRF9UUkFDRVRlc3QsIENhbkJlTmVzdGVkKSB7Ci0gIHByaW50ZigiKGV4cGVjdGVkIHRvIGZhaWwpXG4iKTsKLQotICBTQ09QRURfVFJBQ0UoIiIpOyAgLy8gQSB0cmFjZSB3aXRob3V0IGEgbWVzc2FnZS4KLQotICBTdWJXaXRoVHJhY2UoMik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgbXVsdGlwbGUgU0NPUEVEX1RSQUNFcyBjYW4gYmUgdXNlZCBpbiB0aGUgc2FtZSBzY29wZS4KLVRFU1QoU0NPUEVEX1RSQUNFVGVzdCwgQ2FuQmVSZXBlYXRlZCkgewotICBwcmludGYoIihleHBlY3RlZCB0byBmYWlsKVxuIik7Ci0KLSAgU0NPUEVEX1RSQUNFKCJBIik7Ci0gIEFERF9GQUlMVVJFKCkKLSAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLiI7Ci0KLSAgU0NPUEVEX1RSQUNFKCJCIik7Ci0gIEFERF9GQUlMVVJFKCkKLSAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBIGFuZCBCLiI7Ci0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiQyIpOwotICAgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCAiCi0gICAgICAgICAgICAgICAgICA8PCAiY29udGFpbiB0cmFjZSBwb2ludCBBLCBCLCBhbmQgQy4iOwotICB9Ci0KLSAgU0NPUEVEX1RSQUNFKCJEIik7Ci0gIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCAiCi0gICAgICAgICAgICAgICAgPDwgImNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEQuIjsKLX0KLQotI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKLS8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFKClzIGNhbiBiZSB1c2VkIGNvbmN1cnJlbnRseSBmcm9tIG11bHRpcGxlCi0vLyB0aHJlYWRzLiAgTmFtZWx5LCBhbiBhc3NlcnRpb24gc2hvdWxkIGJlIGFmZmVjdGVkIGJ5Ci0vLyBTQ09QRURfVFJBQ0UoKXMgaW4gaXRzIG93biB0aHJlYWQgb25seS4KLQotLy8gSGVyZSdzIHRoZSBzZXF1ZW5jZSBvZiBhY3Rpb25zIHRoYXQgaGFwcGVuIGluIHRoZSB0ZXN0OgotLy8KLS8vICAgVGhyZWFkIEEgKG1haW4pICAgICAgICAgICAgICAgIHwgVGhyZWFkIEIgKHNwYXduZWQpCi0vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICAgc3Bhd25zIHRocmVhZCBCICAgICAgICAgICAgICAgIHwKLS8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICB3YWl0cyBmb3IgbjEgICAgICAgICAgICAgICAgICAgfCBTQ09QRURfVFJBQ0UoIlRyYWNlIEIiKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVzIGZhaWx1cmUgIzEKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbm90aWZpZXMgbjEKLS8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICBTQ09QRURfVFJBQ0UoIlRyYWNlIEEiKTsgICAgICAgfCB3YWl0cyBmb3IgbjIKLS8vICAgZ2VuZXJhdGVzIGZhaWx1cmUgIzIgICAgICAgICAgIHwKLS8vICAgbm90aWZpZXMgbjIgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICB3YWl0cyBmb3IgbjMgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZXMgZmFpbHVyZSAjMwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFjZSBCIGRpZXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVzIGZhaWx1cmUgIzQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbm90aWZpZXMgbjMKLS8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICBnZW5lcmF0ZXMgZmFpbHVyZSAjNSAgICAgICAgICAgfCBmaW5pc2hlcwotLy8gICB0cmFjZSBBIGRpZXMgICAgICAgICAgICAgICAgICAgfAotLy8gICBnZW5lcmF0ZXMgZmFpbHVyZSAjNiAgICAgICAgICAgfAotLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgIHdhaXRzIGZvciB0aHJlYWQgQiB0byBmaW5pc2ggICB8Ci0KLXN0cnVjdCBDaGVja1BvaW50cyB7Ci0gIE5vdGlmaWNhdGlvbiBuMTsKLSAgTm90aWZpY2F0aW9uIG4yOwotICBOb3RpZmljYXRpb24gbjM7Ci19OwotCi1zdGF0aWMgdm9pZCBUaHJlYWRXaXRoU2NvcGVkVHJhY2UoQ2hlY2tQb2ludHMqIGNoZWNrX3BvaW50cykgewotICB7Ci0gICAgU0NPUEVEX1RSQUNFKCJUcmFjZSBCIik7Ci0gICAgQUREX0ZBSUxVUkUoKQotICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQiBhbGl2ZSkuIjsKLSAgICBjaGVja19wb2ludHMtPm4xLk5vdGlmeSgpOwotICAgIGNoZWNrX3BvaW50cy0+bjIuV2FpdEZvck5vdGlmaWNhdGlvbigpOwotCi0gICAgQUREX0ZBSUxVUkUoKQotICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMyAoaW4gdGhyZWFkIEIsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLiI7Ci0gIH0gIC8vIFRyYWNlIEIgZGllcyBoZXJlLgotICBBRERfRkFJTFVSRSgpCi0gICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNCAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuIjsKLSAgY2hlY2tfcG9pbnRzLT5uMy5Ob3RpZnkoKTsKLX0KLQotVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBXb3Jrc0NvbmN1cnJlbnRseSkgewotICBwcmludGYoIihleHBlY3RpbmcgNiBmYWlsdXJlcylcbiIpOwotCi0gIENoZWNrUG9pbnRzIGNoZWNrX3BvaW50czsKLSAgVGhyZWFkV2l0aFBhcmFtPENoZWNrUG9pbnRzKj4gdGhyZWFkKCZUaHJlYWRXaXRoU2NvcGVkVHJhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tfcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGNoZWNrX3BvaW50cy5uMS5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7Ci0KLSAgewotICAgIFNDT1BFRF9UUkFDRSgiVHJhY2UgQSIpOwotICAgIEFERF9GQUlMVVJFKCkKLSAgICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIgKGluIHRocmVhZCBBLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4iOwotICAgIGNoZWNrX3BvaW50cy5uMi5Ob3RpZnkoKTsKLSAgICBjaGVja19wb2ludHMubjMuV2FpdEZvck5vdGlmaWNhdGlvbigpOwotCi0gICAgQUREX0ZBSUxVUkUoKQotICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNSAoaW4gdGhyZWFkIEEsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuIjsKLSAgfSAgLy8gVHJhY2UgQSBkaWVzIGhlcmUuCi0gIEFERF9GQUlMVVJFKCkKLSAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM2IChpbiB0aHJlYWQgQSwgbm8gdHJhY2UgYWxpdmUpLiI7Ci0gIHRocmVhZC5Kb2luKCk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotVEVTVChEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QsCi0gICAgIERJU0FCTEVEX0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1N1cHByZXNzZXNXYXJuaW5nKSB7Ci0gIC8vIFRoaXMgdGVzdCBib2R5IGlzIGludGVudGlvbmFsbHkgZW1wdHkuICBJdHMgc29sZSBwdXJwb3NlIGlzIGZvcgotICAvLyB2ZXJpZnlpbmcgdGhhdCB0aGUgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnCi0gIC8vIHN1cHByZXNzZXMgdGhlICJZT1UgSEFWRSAxMiBESVNBQkxFRCBURVNUUyIgd2FybmluZyBhdCB0aGUgZW5kIG9mCi0gIC8vIHRoZSB0ZXN0IG91dHB1dC4KLX0KLQotLy8gVGVzdHMgdXNpbmcgYXNzZXJ0aW9ucyBvdXRzaWRlIG9mIFRFU1QgYW5kIFRFU1RfRi4KLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdHdvIGZhaWx1cmVzIGludGVudGlvbmFsbHkuCi12b2lkIEFkSG9jVGVzdCgpIHsKLSAgcHJpbnRmKCJUaGUgbm9uLXRlc3QgcGFydCBvZiB0aGUgY29kZSBpcyBleHBlY3RlZCB0byBoYXZlIDIgZmFpbHVyZXMuXG5cbiIpOwotICBFWFBFQ1RfVFJVRShmYWxzZSk7Ci0gIEVYUEVDVF9FUSgyLCAzKTsKLX0KLQotLy8gUnVucyBhbGwgVEVTVHMsIGFsbCBURVNUX0ZzLCBhbmQgdGhlIGFkIGhvYyB0ZXN0LgotaW50IFJ1bkFsbFRlc3RzKCkgewotICBBZEhvY1Rlc3QoKTsKLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KLQotLy8gVGVzdHMgbm9uLWZhdGFsIGZhaWx1cmVzIGluIHRoZSBmaXh0dXJlIGNvbnN0cnVjdG9yLgotY2xhc3MgTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgewotICAgIHByaW50ZigiKGV4cGVjdGluZyA1IGZhaWx1cmVzKVxuIik7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4iOwotICB9Ci0KLSAgfk5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM1LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gU2V0VXAoKS4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzQsIGluIFRlYXJEb3duLiI7Ci0gIH0KLX07Ci0KLVRFU1RfRihOb25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QsIEZhaWx1cmVJbkNvbnN0cnVjdG9yKSB7Ci0gIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMsIGluIHRoZSB0ZXN0IGJvZHkuIjsKLX0KLQotLy8gVGVzdHMgZmF0YWwgZmFpbHVyZXMgaW4gdGhlIGZpeHR1cmUgY29uc3RydWN0b3IuCi1jbGFzcyBGYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBGYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QoKSB7Ci0gICAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgZmFpbHVyZXMpXG4iKTsKLSAgICBJbml0KCk7Ci0gIH0KLQotICB+RmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgewotICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuIjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gU2V0VXAoKS4gICIKLSAgICAgICAgICAgICAgICAgIDw8ICJXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFzIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IgIgotICAgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gVGVhckRvd24oKS4gICIKLSAgICAgICAgICAgICAgICAgIDw8ICJXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFzIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IgIgotICAgICAgICAgICAgICAgICAgPDwgImhhZCBhIGZhdGFsIGZhaWx1cmUuIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0KCkgewotICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gdGhlIHRlc3QgZml4dHVyZSBjJ3Rvci4iOwotICB9Ci19OwotCi1URVNUX0YoRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LCBGYWlsdXJlSW5Db25zdHJ1Y3RvcikgewotICBBRERfRkFJTFVSRSgpIDw8ICJVTkVYUEVDVEVEIGZhaWx1cmUgaW4gdGhlIHRlc3QgYm9keS4gICIKLSAgICAgICAgICAgICAgICA8PCAiV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhcyB0aGUgdGVzdCBmaXh0dXJlIGMndG9yICIKLSAgICAgICAgICAgICAgICA8PCAiaGFkIGEgZmF0YWwgZmFpbHVyZS4iOwotfQotCi0vLyBUZXN0cyBub24tZmF0YWwgZmFpbHVyZXMgaW4gU2V0VXAoKS4KLWNsYXNzIE5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+Tm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QoKSB7Ci0gICAgRGVpbml0KCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgcHJpbnRmKCIoZXhwZWN0aW5nIDQgZmFpbHVyZXMpXG4iKTsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiBTZXRVcCgpLiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiBUZWFyRG93bigpLiI7Ci0gIH0KLSBwcml2YXRlOgotICB2b2lkIERlaW5pdCgpIHsKLSAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzQsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuIjsKLSAgfQotfTsKLQotVEVTVF9GKE5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LCBGYWlsdXJlSW5TZXRVcCkgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIHRoZSB0ZXN0IGZ1bmN0aW9uLiI7Ci19Ci0KLS8vIFRlc3RzIGZhdGFsIGZhaWx1cmVzIGluIFNldFVwKCkuCi1jbGFzcyBGYXRhbEZhaWx1cmVJblNldFVwVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgfkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0KCkgewotICAgIERlaW5pdCgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIHByaW50ZigiKGV4cGVjdGluZyAzIGZhaWx1cmVzKVxuIik7Ci0gICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiBTZXRVcCgpLiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiBUZWFyRG93bigpLiI7Ci0gIH0KLSBwcml2YXRlOgotICB2b2lkIERlaW5pdCgpIHsKLSAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuIjsKLSAgfQotfTsKLQotVEVTVF9GKEZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LCBGYWlsdXJlSW5TZXRVcCkgewotICBGQUlMKCkgPDwgIlVORVhQRUNURUQgZmFpbHVyZSBpbiB0aGUgdGVzdCBmdW5jdGlvbi4gICIKLSAgICAgICAgIDw8ICJXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFzIFNldFVwKCkgZmFpbGVkLiI7Ci19Ci0KLVRFU1QoQWRkRmFpbHVyZUF0VGVzdCwgTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIpIHsKLSAgQUREX0ZBSUxVUkVfQVQoImZvby5jYyIsIDQyKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSBpbiBmb28uY2MiOwotfQotCi0jaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQotCi0vLyBBIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgbWF5IGRpZS4KLXZvaWQgRGllSWYoYm9vbCBzaG91bGRfZGllKSB7Ci0gIEdURVNUX0NIRUNLXyghc2hvdWxkX2RpZSkgPDwgIiAtIGRlYXRoIGluc2lkZSBEaWVJZigpLiI7Ci19Ci0KLS8vIFRlc3RzIHJ1bm5pbmcgZGVhdGggdGVzdHMgaW4gYSBtdWx0aS10aHJlYWRlZCBjb250ZXh0LgotCi0vLyBVc2VkIGZvciBjb29yZGluYXRpb24gYmV0d2VlbiB0aGUgbWFpbiBhbmQgdGhlIHNwYXduIHRocmVhZC4KLXN0cnVjdCBTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMgewotICBTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMoKSB7fQotCi0gIE5vdGlmaWNhdGlvbiBzcGF3bl90aHJlYWRfc3RhcnRlZDsKLSAgTm90aWZpY2F0aW9uIHNwYXduX3RocmVhZF9va190b190ZXJtaW5hdGU7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyk7Ci19OwotCi0vLyBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIHRocmVhZCBzcGF3biBieSB0aGUKLS8vIE11bHRpcGxlVGhyZWFkcyB0ZXN0IChiZWxvdykuCi1zdGF0aWMgdm9pZCBUaHJlYWRSb3V0aW5lKFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyogbm90aWZpY2F0aW9ucykgewotICAvLyBTaWduYWxzIHRoZSBtYWluIHRocmVhZCB0aGF0IHRoaXMgdGhyZWFkIGhhcyBzdGFydGVkLgotICBub3RpZmljYXRpb25zLT5zcGF3bl90aHJlYWRfc3RhcnRlZC5Ob3RpZnkoKTsKLQotICAvLyBXYWl0cyBmb3IgcGVybWlzc2lvbiB0byBmaW5pc2ggZnJvbSB0aGUgbWFpbiB0aHJlYWQuCi0gIG5vdGlmaWNhdGlvbnMtPnNwYXduX3RocmVhZF9va190b190ZXJtaW5hdGUuV2FpdEZvck5vdGlmaWNhdGlvbigpOwotfQotCi0vLyBUaGlzIGlzIGEgZGVhdGgtdGVzdCB0ZXN0LCBidXQgaXQncyBub3QgbmFtZWQgd2l0aCBhIERlYXRoVGVzdAotLy8gc3VmZml4LiAgSXQgc3RhcnRzIHRocmVhZHMgd2hpY2ggbWlnaHQgaW50ZXJmZXJlIHdpdGggbGF0ZXIKLS8vIGRlYXRoIHRlc3RzLCBzbyBpdCBtdXN0IHJ1biBhZnRlciBhbGwgb3RoZXIgZGVhdGggdGVzdHMuCi1jbGFzcyBEZWF0aFRlc3RBbmRNdWx0aVRocmVhZHNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gU3RhcnRzIGEgdGhyZWFkIGFuZCB3YWl0cyBmb3IgaXQgdG8gYmVnaW4uCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB0aHJlYWRfLnJlc2V0KG5ldyBUaHJlYWRXaXRoUGFyYW08U3Bhd25UaHJlYWROb3RpZmljYXRpb25zKj4oCi0gICAgICAgICZUaHJlYWRSb3V0aW5lLCAmbm90aWZpY2F0aW9uc18sIE5VTEwpKTsKLSAgICBub3RpZmljYXRpb25zXy5zcGF3bl90aHJlYWRfc3RhcnRlZC5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7Ci0gIH0KLSAgLy8gVGVsbHMgdGhlIHRocmVhZCB0byBmaW5pc2gsIGFuZCByZWFwcyBpdC4KLSAgLy8gRGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB0aHJlYWQgbGlicmFyeSBpbiB1c2UsCi0gIC8vIGEgbWFuYWdlciB0aHJlYWQgbWlnaHQgc3RpbGwgYmUgbGVmdCBydW5uaW5nIHRoYXQgd2lsbCBpbnRlcmZlcmUKLSAgLy8gd2l0aCBsYXRlciBkZWF0aCB0ZXN0cy4gIFRoaXMgaXMgdW5mb3J0dW5hdGUsIGJ1dCB0aGlzIGNsYXNzCi0gIC8vIGNsZWFucyB1cCBhZnRlciBpdHNlbGYgYXMgYmVzdCBpdCBjYW4uCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBub3RpZmljYXRpb25zXy5zcGF3bl90aHJlYWRfb2tfdG9fdGVybWluYXRlLk5vdGlmeSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMgbm90aWZpY2F0aW9uc187Ci0gIHRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyPFRocmVhZFdpdGhQYXJhbTxTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqPiA+Ci0gICAgICB0aHJlYWRfOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCi0KLS8vIFRoZSBNaXhlZFVwVGVzdENhc2VUZXN0IHRlc3QgY2FzZSB2ZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IHdpbGwgZmFpbCBhCi0vLyB0ZXN0IGlmIGl0IHVzZXMgYSBkaWZmZXJlbnQgZml4dHVyZSBjbGFzcyB0aGFuIHdoYXQgb3RoZXIgdGVzdHMgaW4KLS8vIHRoZSBzYW1lIHRlc3QgY2FzZSB1c2UuICBJdCBkZWxpYmVyYXRlbHkgY29udGFpbnMgdHdvIGZpeHR1cmUKLS8vIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkZWZpbmVkIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzLgotCi0vLyBUaGUgTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QgdGVzdCBjYXNlIHZlcmlmaWVzIHRoYXQKLS8vIHdoZW4gdGhlIHVzZXIgZGVmaW5lcyB0d28gdGVzdHMgd2l0aCB0aGUgc2FtZSB0ZXN0IGNhc2UgbmFtZSBBTkQKLS8vIHNhbWUgdGVzdCBuYW1lIChidXQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMpLCB0aGUgc2Vjb25kIHRlc3Qgd2lsbAotLy8gZmFpbC4KLQotbmFtZXNwYWNlIGZvbyB7Ci0KLWNsYXNzIE1peGVkVXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi1URVNUX0YoTWl4ZWRVcFRlc3RDYXNlVGVzdCwgRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbykge30KLVRFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBTZWNvbmRUZXN0RnJvbU5hbWVzcGFjZUZvbykge30KLQotY2xhc3MgTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi1URVNUX0YoTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCi0gICAgICAgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBmb28KLQotbmFtZXNwYWNlIGJhciB7Ci0KLWNsYXNzIE1peGVkVXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHR3byB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbC4gIFdlIHJlbHkgb24gdGhlCi0vLyBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0IGdlbmVyYXRlcyB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZS4KLVRFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBUaGlzU2hvdWxkRmFpbCkge30KLVRFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBUaGlzU2hvdWxkRmFpbFRvbykge30KLQotY2xhc3MgTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi0vLyBFeHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gY2hlY2sgdGhhdCBHb29nbGUgVGVzdAotLy8gZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgotVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LAotICAgICAgIFRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsKSB7fQotCi19ICAvLyBuYW1lc3BhY2UgYmFyCi0KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3QgY2FzZXMgdmVyaWZ5IHRoYXQgR29vZ2xlIFRlc3QgY2F0Y2hlcyB0aGUgdXNlcgotLy8gZXJyb3Igb2YgbWl4aW5nIFRFU1QgYW5kIFRFU1RfRiBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UuICBUaGUgZmlyc3QKLS8vIHRlc3QgY2FzZSBjaGVja3MgdGhlIHNjZW5hcmlvIHdoZXJlIFRFU1RfRiBhcHBlYXJzIGJlZm9yZSBURVNULCBhbmQKLS8vIHRoZSBzZWNvbmQgb25lIGNoZWNrcyB3aGVyZSBURVNUIGFwcGVhcnMgYmVmb3JlIFRFU1RfRi4KLQotY2xhc3MgVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotfTsKLQotVEVTVF9GKFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVF9GKSB7fQotCi0vLyBFeHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gY2hlY2sgdGhhdCBHb29nbGUgVGVzdAotLy8gZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgotVEVTVChURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UsIERlZmluZWRVc2luZ1RFU1RBbmRTaG91bGRGYWlsKSB7fQotCi1jbGFzcyBURVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi1URVNUKFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVCkge30KLQotLy8gRXhwZWN0ZWQgdG8gZmFpbC4gIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIGNoZWNrIHRoYXQgR29vZ2xlIFRlc3QKLS8vIGdlbmVyYXRlcyB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZS4KLVRFU1RfRihURVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UsIERlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwpIHsKLX0KLQotLy8gVXNlZCBmb3IgdGVzdGluZyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGFuZCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpLgotaW50IGdsb2JhbF9pbnRlZ2VyID0gMDsKLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGNhbiByZWZlcmVuY2UgZ2xvYmFsIHZhcmlhYmxlcy4KLVRFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlR2xvYmFsVmFyaWFibGVzKSB7Ci0gIGdsb2JhbF9pbnRlZ2VyID0gMDsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoewotICAgIEVYUEVDVF9FUSgxLCBnbG9iYWxfaW50ZWdlcikgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Ci0gIH0sICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGNhbiByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzCi0vLyAoc3RhdGljIG9yIG5vdCkuCi1URVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIENhblJlZmVyZW5jZUxvY2FsVmFyaWFibGVzKSB7Ci0gIGludCBtID0gMDsKLSAgc3RhdGljIGludCBuOwotICBuID0gMTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoewotICAgIEVYUEVDVF9FUShtLCBuKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKLSAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgc3VjY2VlZHMgd2hlbiB0aGVyZSBpcyBleGFjdGx5Ci0vLyBvbmUgbm9uLWZhdGFsIGZhaWx1cmUgYW5kIG5vIGZhdGFsIGZhaWx1cmUuCi1URVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIFN1Y2NlZWRzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoewotICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Ci0gIH0sICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGZhaWxzIHdoZW4gdGhlcmUgaXMgbm8KLS8vIG5vbi1mYXRhbCBmYWlsdXJlLgotVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGZhaWxzIHdoZW4gdGhlcmUgYXJlIHR3bwotLy8gbm9uLWZhdGFsIGZhaWx1cmVzLgotVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMS4iOwotICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIDIuIjsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBvbmUgZmF0YWwKLS8vIGZhaWx1cmUuCi1URVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7Ci0gICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGZhaWxzIHdoZW4gdGhlIHN0YXRlbWVudCBiZWluZwotLy8gdGVzdGVkIHJldHVybnMuCi1URVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFJldHVybnMpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7Ci0gICAgcmV0dXJuOwotICB9LCAiIik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCi0vLyB0ZXN0ZWQgdGhyb3dzLgotVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICB0cnkgewotICAgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKLSAgICAgIHRocm93IDA7Ci0gICAgfSwgIiIpOwotICB9IGNhdGNoKGludCkgeyAgLy8gTk9MSU5UCi0gIH0KLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBnbG9iYWwgdmFyaWFibGVzLgotVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBDYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMpIHsKLSAgZ2xvYmFsX2ludGVnZXIgPSAwOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7Ci0gICAgQVNTRVJUX0VRKDEsIGdsb2JhbF9pbnRlZ2VyKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOwotICB9LCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGNhbiByZWZlcmVuY2UgbG9jYWwgc3RhdGljCi0vLyB2YXJpYWJsZXMuCi1URVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhblJlZmVyZW5jZUxvY2FsU3RhdGljVmFyaWFibGVzKSB7Ci0gIHN0YXRpYyBpbnQgbjsKLSAgbiA9IDE7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKLSAgICBBU1NFUlRfRVEoMCwgbikgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKLSAgfSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBzdWNjZWVkcyB3aGVuIHRoZXJlIGlzIGV4YWN0bHkKLS8vIG9uZSBmYXRhbCBmYWlsdXJlIGFuZCBubyBub24tZmF0YWwgZmFpbHVyZS4KLVRFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgU3VjY2VlZHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZSkgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7Ci0gICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7Ci0gIH0sICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBubyBmYXRhbAotLy8gZmFpbHVyZS4KLVRFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVJc05vRmF0YWxGYWlsdXJlKSB7Ci0gIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUpXG4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoewotICB9LCAiIik7Ci19Ci0KLS8vIEEgaGVscGVyIGZvciBnZW5lcmF0aW5nIGEgZmF0YWwgZmFpbHVyZS4KLXZvaWQgRmF0YWxGYWlsdXJlKCkgewotICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGZhaWxzIHdoZW4gdGhlcmUgYXJlIHR3bwotLy8gZmF0YWwgZmFpbHVyZXMuCi1URVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcykgewotICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKLSAgICBGYXRhbEZhaWx1cmUoKTsKLSAgICBGYXRhbEZhaWx1cmUoKTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBvbmUgbm9uLWZhdGFsCi0vLyBmYWlsdXJlLgotVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlKSB7Ci0gIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUpXG4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoewotICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGZhaWxzIHdoZW4gdGhlIHN0YXRlbWVudCBiZWluZwotLy8gdGVzdGVkIHJldHVybnMuCi1URVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFJldHVybnMpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7Ci0gICAgcmV0dXJuOwotICB9LCAiIik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCi0vLyB0ZXN0ZWQgdGhyb3dzLgotVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MpIHsKLSAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOwotICB0cnkgewotICAgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKLSAgICAgIHRocm93IDA7Ci0gICAgfSwgIiIpOwotICB9IGNhdGNoKGludCkgeyAgLy8gTk9MSU5UCi0gIH0KLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBUaGlzICNpZmRlZiBibG9jayB0ZXN0cyB0aGUgb3V0cHV0IG9mIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi1zdGQ6OnN0cmluZyBQYXJhbU5hbWVGdW5jKGNvbnN0IHRlc3Rpbmc6OlRlc3RQYXJhbUluZm88c3RkOjpzdHJpbmc+JiBpbmZvKSB7Ci0gIHJldHVybiBpbmZvLnBhcmFtOwotfQotCi1jbGFzcyBQYXJhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnN0cmluZz4gewotfTsKLQotVEVTVF9QKFBhcmFtVGVzdCwgU3VjY2VzcykgewotICBFWFBFQ1RfRVEoImEiLCBHZXRQYXJhbSgpKTsKLX0KLQotVEVTVF9QKFBhcmFtVGVzdCwgRmFpbHVyZSkgewotICBFWFBFQ1RfRVEoImIiLCBHZXRQYXJhbSgpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFByaW50aW5nU3RyaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhzdGQ6OnN0cmluZygiYSIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTmFtZUZ1bmMpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLS8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHRoZSBvdXRwdXQgb2YgdHlwZWQgdGVzdHMuCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCB0ZXN0aW5nOjpUeXBlczxpbnQ+KTsKLQotVFlQRURfVEVTVChUeXBlZFRlc3QsIFN1Y2Nlc3MpIHsKLSAgRVhQRUNUX0VRKDAsIFR5cGVQYXJhbSgpKTsKLX0KLQotVFlQRURfVEVTVChUeXBlZFRlc3QsIEZhaWx1cmUpIHsKLSAgRVhQRUNUX0VRKDEsIFR5cGVQYXJhbSgpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSI7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKLQotLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdGhlIG91dHB1dCBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKLQotVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIFN1Y2Nlc3MpIHsKLSAgRVhQRUNUX0VRKDBVLCBUeXBlUGFyYW0oKSk7Ci19Ci0KLVRZUEVEX1RFU1RfUChUeXBlZFRlc3RQLCBGYWlsdXJlKSB7Ci0gIEVYUEVDVF9FUSgxVSwgVHlwZVBhcmFtKCkpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKLX0KLQotUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UCwgU3VjY2VzcywgRmFpbHVyZSk7Ci0KLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8dW5zaWduZWQgY2hhciwgdW5zaWduZWQgaW50PiBVbnNpZ25lZFR5cGVzOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoVW5zaWduZWQsIFR5cGVkVGVzdFAsIFVuc2lnbmVkVHlwZXMpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIHZlcmlmeSB0aGF0IHRlc3RzIHdob3NlIHRlc3QgY2FzZQotLy8gbmFtZSBlbmRzIHdpdGggRGVhdGhUZXN0IGFyZSBydW4gZmlyc3QuCi0KLVRFU1QoQURlYXRoVGVzdCwgU2hvdWxkUnVuRmlyc3QpIHsKLX0KLQotIyBpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi0vLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlZCB0ZXN0cyB3aG9zZSB0ZXN0Ci0vLyBjYXNlIG5hbWUgZW5kcyB3aXRoIERlYXRoVGVzdCBhcmUgcnVuIGZpcnN0LgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEFUeXBlZERlYXRoVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLX07Ci0KLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBkb3VibGU+IE51bWVyaWNUeXBlczsKLVRZUEVEX1RFU1RfQ0FTRShBVHlwZWREZWF0aFRlc3QsIE51bWVyaWNUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoQVR5cGVkRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgewotfQotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi0jIGlmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotCi0vLyBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byB2ZXJpZnkgdGhhdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vIHdob3NlIHRlc3QgY2FzZSBuYW1lIGVuZHMgd2l0aCBEZWF0aFRlc3QgYXJlIHJ1biBmaXJzdC4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBBVHlwZVBhcmFtRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotfTsKLQotVFlQRURfVEVTVF9DQVNFX1AoQVR5cGVQYXJhbURlYXRoVGVzdCk7Ci0KLVRZUEVEX1RFU1RfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgewotfQotCi1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChBVHlwZVBhcmFtRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCk7Ci0KLUlOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBBVHlwZVBhcmFtRGVhdGhUZXN0LCBOdW1lcmljVHlwZXMpOwotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gVGVzdHMgdmFyaW91cyBmYWlsdXJlIGNvbmRpdGlvbnMgb2YKLS8vIEVYUEVDVF97LE5PTn1GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9LgotY2xhc3MgRXhwZWN0RmFpbHVyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOiAgLy8gTXVzdCBiZSBwdWJsaWMgYW5kIG5vdCBwcm90ZWN0ZWQgZHVlIHRvIGEgYnVnIGluIGcrKyAzLjQuMi4KLSAgZW51bSBGYWlsdXJlTW9kZSB7Ci0gICAgRkFUQUxfRkFJTFVSRSwKLSAgICBOT05GQVRBTF9GQUlMVVJFCi0gIH07Ci0gIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmUoRmFpbHVyZU1vZGUgZmFpbHVyZSkgewotICAgIGlmIChmYWlsdXJlID09IEZBVEFMX0ZBSUxVUkUpIHsKLSAgICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOwotICAgIH0KLSAgfQotfTsKLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmUpIHsKLSAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgotICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Ci0gIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KLSAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLCAiRXhwZWN0ZWQgbm9uLWZhdGFsICIKLSAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmUuIik7Ci0gIC8vIFdyb25nIG1lc3NhZ2UuCi0gIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC4iKTsKLX0KLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmUpIHsKLSAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KLSAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKLSAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgotICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOwotICAvLyBXcm9uZyBtZXNzYWdlLgotICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksICJTb21lIG90aGVyIG5vbi1mYXRhbCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsdXJlLiIpOwotfQotCi0jaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQotCi1jbGFzcyBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0IDogcHVibGljIEV4cGVjdEZhaWx1cmVUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZhaWx1cmVNb2RlIGZhaWx1cmUpIHsKLSAgICBUaHJlYWRXaXRoUGFyYW08RmFpbHVyZU1vZGU+IHRocmVhZCgmQWRkRmFpbHVyZSwgZmFpbHVyZSwgTlVMTCk7Ci0gICAgdGhyZWFkLkpvaW4oKTsKLSAgfQotfTsKLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZSkgewotICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCi0gIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpLAotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKLX0KLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZSkgewotICAvLyBXZSBvbmx5IGludGVyY2VwdCB0aGUgY3VycmVudCB0aHJlYWQuCi0gIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Ci19Ci0KLXR5cGVkZWYgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3Q7Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIG9ubHkgY2F0Y2hlcyBmYWlsdXJlcyBmcm9tCi0vLyB0aGUgY3VycmVudCB0aHJlYWQgaWYgaXQgaXMgaW5zdGFudGlhdGVkIHdpdGggSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQuCi1URVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LCBJbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZCkgewotICBwcmludGYoIihleHBlY3RpbmcgMiBmYWlsdXJlcylcbiIpOwotICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7Ci0gIHsKLSAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKLSAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAotICAgICAgICAmcmVzdWx0cyk7Ci0gICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSk7Ci0gICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSk7Ci0gIH0KLSAgLy8gVGhlIHR3byBmYWlsdXJlcyBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnRlcmNlcHRlZC4KLSAgRVhQRUNUX0VRKDAsIHJlc3VsdHMuc2l6ZSgpKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKLSAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgotICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Ci0gIC8vIEV4cGVjdGVkIGZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBub24tZmF0YWwgZmFpbHVyZS4KLSAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Ci0gIC8vIFdyb25nIG1lc3NhZ2UuCi0gIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iKTsKLX0KLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKLSAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBzdWNjZWVkcy4KLSAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhTVUNDRUVEKCksICJFeHBlY3RlZCBub24tZmF0YWwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbHVyZS4iKTsKLSAgLy8gRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUsIGJ1dCBnb3QgYSBmYXRhbCBmYWlsdXJlLgotICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOwotICAvLyBXcm9uZyBtZXNzYWdlLgotICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIpOwotfQotCi0KLS8vIFR3byB0ZXN0IGVudmlyb25tZW50cyBmb3IgdGVzdGluZyB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKS4KLQotY2xhc3MgRm9vRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIHByaW50ZigiJXMiLCAiRm9vRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgcHJpbnRmKCIlcyIsICJGb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKLSAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKLSAgfQotfTsKLQotY2xhc3MgQmFyRW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIHByaW50ZigiJXMiLCAiQmFyRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLlxuIik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgcHJpbnRmKCIlcyIsICJCYXJFbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuXG4iKTsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOwotICB9Ci19OwotCi0vLyBUaGUgbWFpbiBmdW5jdGlvbi4KLS8vCi0vLyBUaGUgaWRlYSBpcyB0byB1c2UgR29vZ2xlIFRlc3QgdG8gcnVuIGFsbCB0aGUgdGVzdHMgd2UgaGF2ZSBkZWZpbmVkIChzb21lCi0vLyBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsKSwgYW5kIHRoZW4gY29tcGFyZSB0aGUgdGVzdCByZXN1bHRzCi0vLyB3aXRoIHRoZSAiZ29sZGVuIiBmaWxlLgotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBmYWxzZTsKLQotICAvLyBXZSBqdXN0IHJ1biB0aGUgdGVzdHMsIGtub3dpbmcgc29tZSBvZiB0aGVtIGFyZSBpbnRlbmRlZCB0byBmYWlsLgotICAvLyBXZSB3aWxsIHVzZSBhIHNlcGFyYXRlIFB5dGhvbiBzY3JpcHQgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mCi0gIC8vIHRoaXMgcHJvZ3JhbSB3aXRoIHRoZSBnb2xkZW4gZmlsZS4KLQotICAvLyBJdCdzIGhhcmQgdG8gdGVzdCBJbml0R29vZ2xlVGVzdCgpIGRpcmVjdGx5LCBhcyBpdCBoYXMgbWFueQotICAvLyBnbG9iYWwgc2lkZSBlZmZlY3RzLiAgVGhlIGZvbGxvd2luZyBsaW5lIHNlcnZlcyBhcyBhIHNhbml0eSB0ZXN0Ci0gIC8vIGZvciBpdC4KLSAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotICBib29sIGludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cyA9Ci0gICAgICBzdGQ6OmNvdW50KGFyZ3YsIGFyZ3YgKyBhcmdjLAotICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzIikpID4gMDsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gIGlmICh0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgIT0gIiIpIHsKLSAgICAvLyBTa2lwIHRoZSB1c3VhbCBvdXRwdXQgY2FwdHVyaW5nIGlmIHdlJ3JlIHJ1bm5pbmcgYXMgdGhlIGNoaWxkCi0gICAgLy8gcHJvY2VzcyBvZiBhbiB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QuCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLSAgICBwb3NpeDo6RlJlb3BlbigibnVsOiIsICJ3Iiwgc3Rkb3V0KTsKLSMgZWxzZQotICAgIHBvc2l4OjpGUmVvcGVuKCIvZGV2L251bGwiLCAidyIsIHN0ZG91dCk7Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0gICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0gIGlmIChpbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMpCi0gICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLQotICAvLyBSZWdpc3RlcnMgdHdvIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cy4KLSAgLy8gVGhlIGdvbGRlbiBmaWxlIHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgc2V0IHVwIGluIHRoZSBvcmRlciB0aGV5Ci0gIC8vIGFyZSByZWdpc3RlcmVkLCBhbmQgdG9ybiBkb3duIGluIHRoZSByZXZlcnNlIG9yZGVyLgotICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEZvb0Vudmlyb25tZW50KTsKLSAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBCYXJFbnZpcm9ubWVudCk7Ci0KLSAgcmV0dXJuIFJ1bkFsbFRlc3RzKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZmY4NTMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzQzICswLDAgQEAKLVRoZSBub24tdGVzdCBwYXJ0IG9mIHRoZSBjb2RlIGlzIGV4cGVjdGVkIHRvIGhhdmUgMiBmYWlsdXJlcy4KLQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBmYWxzZQotICBBY3R1YWw6IGZhbHNlCi1FeHBlY3RlZDogdHJ1ZQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiAzCi1FeHBlY3RlZDogMgotG1swOzMybVs9PT09PT09PT09XSAbW21SdW5uaW5nIDY2IHRlc3RzIGZyb20gMjkgdGVzdCBjYXNlcy4KLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLgotRm9vRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLgotQmFyRW52aXJvbm1lbnQ6OlNldFVwKCkgY2FsbGVkLgotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBRGVhdGhUZXN0Ci0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUFEZWF0aFRlc3QuU2hvdWxkUnVuRmlyc3QKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttQURlYXRoVGVzdC5TaG91bGRSdW5GaXJzdAotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBVHlwZWREZWF0aFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50Ci0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUFUeXBlZERlYXRoVGVzdC8wLlNob3VsZFJ1bkZpcnN0Ci0bWzA7MzJtWyAgICAgICBPSyBdIBtbbUFUeXBlZERlYXRoVGVzdC8wLlNob3VsZFJ1bkZpcnN0Ci0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEFUeXBlZERlYXRoVGVzdC8xLCB3aGVyZSBUeXBlUGFyYW0gPSBkb3VibGUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttQVR5cGVkRGVhdGhUZXN0LzEuU2hvdWxkUnVuRmlyc3QKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttQVR5cGVkRGVhdGhUZXN0LzEuU2hvdWxkUnVuRmlyc3QKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8wLCB3aGVyZSBUeXBlUGFyYW0gPSBpbnQKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8wLlNob3VsZFJ1bkZpcnN0Ci0bWzA7MzJtWyAgICAgICBPSyBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBNeS9BVHlwZVBhcmFtRGVhdGhUZXN0LzEsIHdoZXJlIFR5cGVQYXJhbSA9IGRvdWJsZQotG1swOzMybVsgUlVOICAgICAgXSAbW21NeS9BVHlwZVBhcmFtRGVhdGhUZXN0LzEuU2hvdWxkUnVuRmlyc3QKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0Ci0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBQYXNzaW5nVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21QYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDEKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QxCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbVBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgotG1swOzMybVsgICAgICAgT0sgXSAbW21QYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIE5vbmZhdGFsRmFpbHVyZVRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1WYWx1ZSBvZjogYWN0dWFsCi0gIEFjdHVhbDogImFjdHVhbCBcInN0cmluZ1wiIgotRXhwZWN0ZWQ6IGtHb2xkZW5TdHJpbmcKLVdoaWNoIGlzOiAiXCJMaW5lIgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBhY3R1YWwKLSAgQWN0dWFsOiAiYWN0dWFsIFwic3RyaW5nXCIiCi1FeHBlY3RlZDogZ29sZGVuCi1XaGljaCBpczogIlwiTGluZSIKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5EaWZmRm9yTG9uZ1N0cmluZ3MKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1WYWx1ZSBvZjogIkxpbmUgMiIKLUV4cGVjdGVkOiBnb2xkZW5fc3RyCi1XaGljaCBpczogIlwiTGluZVwwIDFcIlxuTGluZSAyIgotV2l0aCBkaWZmOgotQEAgLTEsMiBAQAotLVwiTGluZVwwIDFcIgotIExpbmUgMgotCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbmZhdGFsRmFpbHVyZVRlc3QuRGlmZkZvckxvbmdTdHJpbmdzCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTMgdGVzdHMgZnJvbSBGYXRhbEZhaWx1cmVUZXN0Ci0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCi0oZXhwZWN0aW5nIGEgZmFpbHVyZSB0aGF0IHggc2hvdWxkIGJlIDEpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotVmFsdWUgb2Y6IHgKLSAgQWN0dWFsOiAyCi1FeHBlY3RlZDogMQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQotG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQotKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiB4Ci0gIEFjdHVhbDogMgotRXhwZWN0ZWQ6IDEKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKLShleHBlY3RpbmcgYSBmYWlsdXJlIG9uIGZhbHNlKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBmYWxzZQotICBBY3R1YWw6IGZhbHNlCi1FeHBlY3RlZDogdHJ1ZQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBMb2dnaW5nVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21Mb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucwotKGV4cGVjdGluZyAyIGZhaWx1cmVzIG9uICgzKSA+PSAoYVtpXSkpCi1pID09IDAKLWkgPT0gMQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgOQotaSA9PSAyCi1pID09IDMKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1FeHBlY3RlZDogKDMpID49IChhW2ldKSwgYWN0dWFsOiAzIHZzIDYKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTG9nZ2luZ1Rlc3QuSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttNiB0ZXN0cyBmcm9tIFNDT1BFRF9UUkFDRVRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5PYmV5c1Njb3BlcwotKGV4cGVjdGVkIHRvIGZhaWwpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1UaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGhhdmUgYSB0cmFjZS4KLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEV4cGVjdGVkIHRyYWNlCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1UaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0Lk9iZXlzU2NvcGVzCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJbkxvb3AKLShleHBlY3RlZCB0byBmYWlsKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBuCi0gIEFjdHVhbDogMQotRXhwZWN0ZWQ6IDIKLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IGkgPSAxCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotVmFsdWUgb2Y6IG4KLSAgQWN0dWFsOiAyCi1FeHBlY3RlZDogMQotR29vZ2xlIFRlc3QgdHJhY2U6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogaSA9IDIKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luTG9vcAotG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5TdWJyb3V0aW5lCi0oZXhwZWN0ZWQgdG8gZmFpbCkKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1WYWx1ZSBvZjogbgotICBBY3R1YWw6IDEKLUV4cGVjdGVkOiAyCi1Hb29nbGUgVGVzdCB0cmFjZToKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBuID0gMQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBuCi0gIEFjdHVhbDogMgotRXhwZWN0ZWQ6IDEKLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IG4gPSAyCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAotKGV4cGVjdGVkIHRvIGZhaWwpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotVmFsdWUgb2Y6IG4KLSAgQWN0dWFsOiAyCi1FeHBlY3RlZDogMQotR29vZ2xlIFRlc3QgdHJhY2U6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogbiA9IDIKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiAKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAotG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlUmVwZWF0ZWQKLShleHBlY3RlZCB0byBmYWlsKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQS4KLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLVRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEgYW5kIEIuCi1Hb29nbGUgVGVzdCB0cmFjZToKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBCCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGNvbnRhaW4gdHJhY2UgcG9pbnQgQSwgQiwgYW5kIEMuCi1Hb29nbGUgVGVzdCB0cmFjZToKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBDCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLVRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEsIEIsIGFuZCBELgotR29vZ2xlIFRlc3QgdHJhY2U6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRAotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEIKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBBCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVSZXBlYXRlZAotG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzQ29uY3VycmVudGx5Ci0oZXhwZWN0aW5nIDYgZmFpbHVyZXMpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICMxIChpbiB0aHJlYWQgQiwgb25seSB0cmFjZSBCIGFsaXZlKS4KLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEIKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzIgKGluIHRocmVhZCBBLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4KLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEEKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzMgKGluIHRocmVhZCBCLCB0cmFjZSBBICYgQiBib3RoIGFsaXZlKS4KLUdvb2dsZSBUZXN0IHRyYWNlOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFRyYWNlIEIKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzQgKGluIHRocmVhZCBCLCBvbmx5IHRyYWNlIEEgYWxpdmUpLgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgZmFpbHVyZSAjNSAoaW4gdGhyZWFkIEEsIG9ubHkgdHJhY2UgQSBhbGl2ZSkuCi1Hb29nbGUgVGVzdCB0cmFjZToKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBUcmFjZSBBCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICM2IChpbiB0aHJlYWQgQSwgbm8gdHJhY2UgYWxpdmUpLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzQ29uY3VycmVudGx5Ci0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKLShleHBlY3RpbmcgNSBmYWlsdXJlcykKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICMyLCBpbiBTZXRVcCgpLgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gdGhlIHRlc3QgYm9keS4KLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzQsIGluIFRlYXJEb3duLgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgZmFpbHVyZSAjNSwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKLShleHBlY3RpbmcgMiBmYWlsdXJlcykKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IuCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QuRmFpbHVyZUluU2V0VXAKLShleHBlY3RpbmcgNCBmYWlsdXJlcykKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIFNldFVwKCkuCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICMyLCBpbiB0aGUgdGVzdCBmdW5jdGlvbi4KLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzMsIGluIFRlYXJEb3duKCkuCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICM0LCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBGYXRhbEZhaWx1cmVJblNldFVwVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAotKGV4cGVjdGluZyAzIGZhaWx1cmVzKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgZmFpbHVyZSAjMSwgaW4gU2V0VXAoKS4KLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFRlYXJEb3duKCkuCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlICMzLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGQndG9yLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBZGRGYWlsdXJlQXRUZXN0Ci0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKLWZvby5jYzo0MjogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYWlsdXJlIGluIGZvby5jYwotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21BZGRGYWlsdXJlQXRUZXN0Lk1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTQgdGVzdHMgZnJvbSBNaXhlZFVwVGVzdENhc2VUZXN0Ci0bWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuRmlyc3RUZXN0RnJvbU5hbWVzcGFjZUZvbwotG1swOzMybVsgICAgICAgT0sgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LkZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28KLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5TZWNvbmRUZXN0RnJvbU5hbWVzcGFjZUZvbwotG1swOzMybVsgICAgICAgT0sgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWwKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKLWNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlIE1peGVkVXBUZXN0Q2FzZVRlc3QsCi15b3UgZGVmaW5lZCB0ZXN0IEZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28gYW5kIHRlc3QgVGhpc1Nob3VsZEZhaWwKLXVzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYKLXRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvbgotdW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZQotb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWxUb28KLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKLWNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlIE1peGVkVXBUZXN0Q2FzZVRlc3QsCi15b3UgZGVmaW5lZCB0ZXN0IEZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28gYW5kIHRlc3QgVGhpc1Nob3VsZEZhaWxUb28KLXVzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYKLXRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvbgotdW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZQotb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsVG9vCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAotG1swOzMybVsgICAgICAgT0sgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAotG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRmFpbGVkCi1BbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQotY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCi15b3UgZGVmaW5lZCB0ZXN0IFRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsIGFuZCB0ZXN0IFRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCi11c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmCi10aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb24KLXVuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmUKLW9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QuVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZQotG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GCi0bWzA7MzJtWyAgICAgICBPSyBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0YKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RBbmRTaG91bGRGYWlsCi1ndGVzdC5jYzojOiBGYWlsdXJlCi1GYWlsZWQKLUFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCi1jbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXMKLWlsbGVnYWwuICBJbiB0ZXN0IGNhc2UgVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLAotdGVzdCBEZWZpbmVkVXNpbmdURVNUX0YgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0Ci10ZXN0IERlZmluZWRVc2luZ1RFU1RBbmRTaG91bGRGYWlsIGlzIGRlZmluZWQgdXNpbmcgVEVTVC4gIFlvdSBwcm9iYWJseQotd2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0Ci1jYXNlLgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZQotG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVAotG1swOzMybVsgICAgICAgT0sgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVAotG1swOzMybVsgUlVOICAgICAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRmFpbGVkCi1BbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQotY2xhc3MsIHNvIG1peGluZyBURVNUX0YgYW5kIFRFU1QgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGlzCi1pbGxlZ2FsLiAgSW4gdGVzdCBjYXNlIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwKLXRlc3QgRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbCBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXQKLXRlc3QgRGVmaW5lZFVzaW5nVEVTVCBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHkKLXdhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdAotY2FzZS4KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttOCB0ZXN0cyBmcm9tIEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VMb2NhbFZhcmlhYmxlcwotG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsVmFyaWFibGVzCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQotG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LlN1Y2NlZWRzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUKLShleHBlY3RpbmcgYSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKLSAgQWN0dWFsOiAwIGZhaWx1cmVzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vTm9uZmF0YWxGYWlsdXJlCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29Ob25mYXRhbEZhaWx1cmVzCi0oZXhwZWN0aW5nIGEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDogMiBmYWlsdXJlcwotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgotRmFpbGVkCi1FeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAxLgotCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6Ci1GYWlsZWQKLUV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlIDIuCi0KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCi0oZXhwZWN0aW5nIGEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDoKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgotRmFpbGVkCi1FeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgotCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQotG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKLShleHBlY3RpbmcgYSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKLSAgQWN0dWFsOiAwIGZhaWx1cmVzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucwotG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cwotKGV4cGVjdGluZyBhIGZhaWx1cmUpCi1ndGVzdC5jYzojOiBGYWlsdXJlCi1FeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6IDAgZmFpbHVyZXMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKLRtbMDszMm1bLS0tLS0tLS0tLV0gG1ttOCB0ZXN0cyBmcm9tIEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VMb2NhbFN0YXRpY1ZhcmlhYmxlcwotG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkNhblJlZmVyZW5jZUxvY2FsU3RhdGljVmFyaWFibGVzCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuU3VjY2VlZHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQotG1swOzMybVsgICAgICAgT0sgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LlN1Y2NlZWRzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUKLShleHBlY3RpbmcgYSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6IDAgZmFpbHVyZXMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b0ZhdGFsRmFpbHVyZXMKLShleHBlY3RpbmcgYSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6IDIgZmFpbHVyZXMKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgotRmFpbGVkCi1FeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgotCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKLUZhaWxlZAotRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KLQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcwotG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKLShleHBlY3RpbmcgYSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6Ci1GYWlsZWQKLUV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgotCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQotG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKLShleHBlY3RpbmcgYSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6IDAgZmFpbHVyZXMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCi0oZXhwZWN0aW5nIGEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKLSAgQWN0dWFsOiAwIGZhaWx1cmVzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBUeXBlZFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50Ci0bWzA7MzJtWyBSVU4gICAgICBdIBtbbVR5cGVkVGVzdC8wLlN1Y2Nlc3MKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttVHlwZWRUZXN0LzAuU3VjY2VzcwotG1swOzMybVsgUlVOICAgICAgXSAbW21UeXBlZFRlc3QvMC5GYWlsdXJlCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotVmFsdWUgb2Y6IFR5cGVQYXJhbSgpCi0gIEFjdHVhbDogMAotRXhwZWN0ZWQ6IDEKLUV4cGVjdGVkIGZhaWx1cmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttVHlwZWRUZXN0LzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gaW50Ci0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBVbnNpZ25lZC9UeXBlZFRlc3RQLzAsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGNoYXIKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLlN1Y2Nlc3MKLRtbMDszMm1bICAgICAgIE9LIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLlN1Y2Nlc3MKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8wLkZhaWx1cmUKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCi1WYWx1ZSBvZjogVHlwZVBhcmFtKCkKLSAgQWN0dWFsOiAnXDAnCi1FeHBlY3RlZDogMVUKLVdoaWNoIGlzOiAxCi1FeHBlY3RlZCBmYWlsdXJlCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBjaGFyCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBVbnNpZ25lZC9UeXBlZFRlc3RQLzEsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGludAotG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuU3VjY2VzcwotG1swOzMybVsgICAgICAgT0sgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuU3VjY2VzcwotG1swOzMybVsgUlVOICAgICAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuRmFpbHVyZQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBUeXBlUGFyYW0oKQotICBBY3R1YWw6IDAKLUV4cGVjdGVkOiAxVQotV2hpY2ggaXM6IDEKLUV4cGVjdGVkIGZhaWx1cmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8xLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IHVuc2lnbmVkIGludAotG1swOzMybVstLS0tLS0tLS0tXSAbW200IHRlc3RzIGZyb20gRXhwZWN0RmFpbHVyZVRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCi0oZXhwZWN0aW5nIDEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKLSAgQWN0dWFsOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6Ci1TdWNjZWVkZWQKLQotKGV4cGVjdGluZyAxIGZhaWx1cmUpCi1ndGVzdC5jYzojOiBGYWlsdXJlCi1FeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDoKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKLUZhaWxlZAotRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCi0KLShleHBlY3RpbmcgMSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIGZhdGFsIGZhaWx1cmUgZXhwZWN0ZWQuIgotICBBY3R1YWw6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKLUZhaWxlZAotRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KLQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCi0oZXhwZWN0aW5nIDEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDoKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgotU3VjY2VlZGVkCi0KLShleHBlY3RpbmcgMSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKLSAgQWN0dWFsOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6Ci1GYWlsZWQKLUV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCi0KLShleHBlY3RpbmcgMSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBub24tZmF0YWwgZmFpbHVyZS4iCi0gIEFjdHVhbDoKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKLUZhaWxlZAotRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCi0KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcwotKGV4cGVjdGluZyAxIGZhaWx1cmUpCi1ndGVzdC5jYzojOiBGYWlsdXJlCi1FeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDoKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgotU3VjY2VlZGVkCi0KLShleHBlY3RpbmcgMSBmYWlsdXJlKQotZ3Rlc3QuY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6Ci1GYWlsZWQKLUV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgotCi0oZXhwZWN0aW5nIDEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBmYXRhbCBmYWlsdXJlIGV4cGVjdGVkLiIKLSAgQWN0dWFsOgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6Ci1GYWlsZWQKLUV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCi0KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcwotKGV4cGVjdGluZyAxIGZhaWx1cmUpCi1ndGVzdC5jYzojOiBGYWlsdXJlCi1FeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQotICBBY3R1YWw6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogU3VjY2VzczoKLVN1Y2NlZWRlZAotCi0oZXhwZWN0aW5nIDEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDoKLWd0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgotRmFpbGVkCi1FeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgotCi0oZXhwZWN0aW5nIDEgZmFpbHVyZSkKLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlIGNvbnRhaW5pbmcgIlNvbWUgb3RoZXIgbm9uLWZhdGFsIGZhaWx1cmUuIgotICBBY3R1YWw6Ci1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6Ci1GYWlsZWQKLUV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgotCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcwotG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQotKGV4cGVjdGluZyAyIGZhaWx1cmVzKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKLSAgQWN0dWFsOiAwIGZhaWx1cmVzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCi0bWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCi0oZXhwZWN0aW5nIDIgZmFpbHVyZXMpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KLWd0ZXN0LmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCi0gIEFjdHVhbDogMCBmYWlsdXJlcwotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QKLRtbMDszMm1bIFJVTiAgICAgIF0gG1ttU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LkludGVyY2VwdE9ubHlDdXJyZW50VGhyZWFkCi0oZXhwZWN0aW5nIDIgZmFpbHVyZXMpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdC5JbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZAotG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBQcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotVmFsdWUgb2Y6IEdldFBhcmFtKCkKLSAgQWN0dWFsOiAyCi1FeHBlY3RlZDogMQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wLCB3aGVyZSBHZXRQYXJhbSgpID0gMgotG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gUHJpbnRpbmdTdHJpbmdzL1BhcmFtVGVzdAotG1swOzMybVsgUlVOICAgICAgXSAbW21QcmludGluZ1N0cmluZ3MvUGFyYW1UZXN0LlN1Y2Nlc3MvYQotG1swOzMybVsgICAgICAgT0sgXSAbW21QcmludGluZ1N0cmluZ3MvUGFyYW1UZXN0LlN1Y2Nlc3MvYQotG1swOzMybVsgUlVOICAgICAgXSAbW21QcmludGluZ1N0cmluZ3MvUGFyYW1UZXN0LkZhaWx1cmUvYQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiBHZXRQYXJhbSgpCi0gIEFjdHVhbDogImEiCi1FeHBlY3RlZDogImIiCi1FeHBlY3RlZCBmYWlsdXJlCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVByaW50aW5nU3RyaW5ncy9QYXJhbVRlc3QuRmFpbHVyZS9hLCB3aGVyZSBHZXRQYXJhbSgpID0gImEiCi0bWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgotQmFyRW52aXJvbm1lbnQ6OlRlYXJEb3duKCkgY2FsbGVkLgotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUZhaWxlZAotRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCi1Gb29FbnZpcm9ubWVudDo6VGVhckRvd24oKSBjYWxsZWQuCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRmFpbGVkCi1FeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgotG1swOzMybVs9PT09PT09PT09XSAbW202NiB0ZXN0cyBmcm9tIDI5IHRlc3QgY2FzZXMgcmFuLgotG1swOzMybVsgIFBBU1NFRCAgXSAbW20yMiB0ZXN0cy4KLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttNDQgdGVzdHMsIGxpc3RlZCBiZWxvdzoKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5Fc2NhcGVzU3RyaW5nT3BlcmFuZHMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uZmF0YWxGYWlsdXJlVGVzdC5EaWZmRm9yTG9uZ1N0cmluZ3MKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTG9nZ2luZ1Rlc3QuSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5PYmV5c1Njb3BlcwotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5Mb29wCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJblN1YnJvdXRpbmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZU5lc3RlZAotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlUmVwZWF0ZWQKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0NvbmN1cnJlbnRseQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QuRmFpbHVyZUluQ29uc3RydWN0b3IKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUFkZEZhaWx1cmVBdFRlc3QuTWVzc2FnZUNvbnRhaW5zU3BlY2lmaWVkRmlsZUFuZExpbmVOdW1iZXIKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbAotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsVG9vCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbAotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbAotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcwotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vRmF0YWxGYWlsdXJlCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttVHlwZWRUZXN0LzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gaW50Ci0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBjaGFyCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBpbnQKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKLRtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QuRXhwZWN0Tm9uRmF0YWxGYWlsdXJlCi0bWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdC5JbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZAotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ0ZhaWxpbmdQYXJhbXMvRmFpbGluZ1BhcmFtVGVzdC5GYWlscy8wLCB3aGVyZSBHZXRQYXJhbSgpID0gMgotG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ1N0cmluZ3MvUGFyYW1UZXN0LkZhaWx1cmUvYSwgd2hlcmUgR2V0UGFyYW0oKSA9ICJhIgotCi00NCBGQUlMRUQgVEVTVFMKLRtbMDszM20gIFlPVSBIQVZFIDEgRElTQUJMRUQgVEVTVAotCi0bW21Ob3RlOiBHb29nbGUgVGVzdCBmaWx0ZXIgPSBGYXRhbEZhaWx1cmVUZXN0Lio6TG9nZ2luZ1Rlc3QuKgotWz09PT09PT09PT1dIFJ1bm5pbmcgNCB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcy4KLVstLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCi1bLS0tLS0tLS0tLV0gMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QKLVsgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQotKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiB4Ci0gIEFjdHVhbDogMgotRXhwZWN0ZWQ6IDEKLVsgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZSAoPyBtcykKLVsgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZQotKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLVZhbHVlIG9mOiB4Ci0gIEFjdHVhbDogMgotRXhwZWN0ZWQ6IDEKLVsgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZSAoPyBtcykKLVsgUlVOICAgICAgXSBGYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQotKGV4cGVjdGluZyBhIGZhaWx1cmUgb24gZmFsc2UpCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotVmFsdWUgb2Y6IGZhbHNlCi0gIEFjdHVhbDogZmFsc2UKLUV4cGVjdGVkOiB0cnVlCi1bICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUgKD8gbXMpCi1bLS0tLS0tLS0tLV0gMyB0ZXN0cyBmcm9tIEZhdGFsRmFpbHVyZVRlc3QgKD8gbXMgdG90YWwpCi0KLVstLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBMb2dnaW5nVGVzdAotWyBSVU4gICAgICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCi0oZXhwZWN0aW5nIDIgZmFpbHVyZXMgb24gKDMpID49IChhW2ldKSkKLWkgPT0gMAotaSA9PSAxCi1ndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQotRXhwZWN0ZWQ6ICgzKSA+PSAoYVtpXSksIGFjdHVhbDogMyB2cyA5Ci1pID09IDIKLWkgPT0gMwotZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKLUV4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgNgotWyAgRkFJTEVEICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zICg/IG1zKQotWy0tLS0tLS0tLS1dIDEgdGVzdCBmcm9tIExvZ2dpbmdUZXN0ICg/IG1zIHRvdGFsKQotCi1bLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duCi1bPT09PT09PT09PV0gNCB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcyByYW4uICg/IG1zIHRvdGFsKQotWyAgUEFTU0VEICBdIDAgdGVzdHMuCi1bICBGQUlMRUQgIF0gNCB0ZXN0cywgbGlzdGVkIGJlbG93OgotWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCi1bICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKLVsgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0Lk5vbmZhdGFsRmFpbHVyZUluU3Vicm91dGluZQotWyAgRkFJTEVEICBdIExvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCi0KLSA0IEZBSUxFRCBURVNUUwotTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gKkRJU0FCTEVEXyoKLVs9PT09PT09PT09XSBSdW5uaW5nIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlLgotWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KLVstLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QKLVsgUlVOICAgICAgXSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QuRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcKLVsgICAgICAgT0sgXSBEaXNhYmxlZFRlc3RzV2FybmluZ1Rlc3QuRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcKLVstLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KLVs9PT09PT09PT09XSAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZSByYW4uCi1bICBQQVNTRUQgIF0gMSB0ZXN0LgotTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gUGFzc2luZ1Rlc3QuKgotTm90ZTogVGhpcyBpcyB0ZXN0IHNoYXJkIDIgb2YgMi4KLVs9PT09PT09PT09XSBSdW5uaW5nIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlLgotWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KLVstLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBQYXNzaW5nVGVzdAotWyBSVU4gICAgICBdIFBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgotWyAgICAgICBPSyBdIFBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MgotWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgotWz09PT09PT09PT1dIDEgdGVzdCBmcm9tIDEgdGVzdCBjYXNlIHJhbi4KLVsgIFBBU1NFRCAgXSAxIHRlc3QuCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0ZWZmOC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAxMC8zMS8yMDExIGJ5IGNvbW1hbmQKLS8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLQotLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBndGVzdF9wcmVkX2ltcGwuaAotLy8KLS8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBzY3JpcHQgYW5kIHF1aXRlIGxvbmcuICBJZiB5b3UgaW50ZW5kIHRvCi0vLyBsZWFybiBob3cgR29vZ2xlIFRlc3Qgd29ya3MgYnkgcmVhZGluZyBpdHMgdW5pdCB0ZXN0cywgcmVhZAotLy8gZ3Rlc3RfdW5pdHRlc3QuY2MgaW5zdGVhZC4KLS8vCi0vLyBUaGlzIGlzIGludGVuZGVkIGFzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgR29vZ2xlIFRlc3QgcHJlZGljYXRlCi0vLyBhc3NlcnRpb25zLiAgV2UgY29tcGlsZSBpdCBhcyBwYXJ0IG9mIHRoZSBndGVzdF91bml0dGVzdCB0YXJnZXQKLS8vIG9ubHkgdG8ga2VlcCB0aGUgaW1wbGVtZW50YXRpb24gdGlkeSBhbmQgY29tcGFjdCwgYXMgaXQgaXMgcXVpdGUKLS8vIGludm9sdmVkIHRvIHNldCB1cCB0aGUgc3RhZ2UgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgdXNpbmcgR29vZ2xlCi0vLyBUZXN0IGl0c2VsZi4KLS8vCi0vLyBDdXJyZW50bHksIGd0ZXN0X3VuaXR0ZXN0IHRha2VzIH4xMSBzZWNvbmRzIHRvIHJ1biBpbiB0aGUgdGVzdGluZwotLy8gZGFlbW9uLiAgSW4gdGhlIGZ1dHVyZSwgaWYgaXQgZ3Jvd3MgdG9vIGxhcmdlIGFuZCBuZWVkcyBtdWNoIG1vcmUKLS8vIHRpbWUgdG8gZmluaXNoLCB3ZSBzaG91bGQgY29uc2lkZXIgc2VwYXJhdGluZyB0aGlzIGZpbGUgaW50byBhCi0vLyBzdGFuZC1hbG9uZSByZWdyZXNzaW9uIHRlc3QuCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0KLS8vIEEgdXNlci1kZWZpbmVkIGRhdGEgdHlwZS4KLXN0cnVjdCBCb29sIHsKLSAgZXhwbGljaXQgQm9vbChpbnQgdmFsKSA6IHZhbHVlKHZhbCAhPSAwKSB7fQotCi0gIGJvb2wgb3BlcmF0b3I+KGludCBuKSBjb25zdCB7IHJldHVybiB2YWx1ZSA+IEJvb2wobikudmFsdWU7IH0KLQotICBCb29sIG9wZXJhdG9yKyhjb25zdCBCb29sJiByaHMpIGNvbnN0IHsgcmV0dXJuIEJvb2wodmFsdWUgKyByaHMudmFsdWUpOyB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gcmhzLnZhbHVlOyB9Ci0KLSAgYm9vbCB2YWx1ZTsKLX07Ci0KLS8vIEVuYWJsZXMgQm9vbCB0byBiZSB1c2VkIGluIGFzc2VydGlvbnMuCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQm9vbCYgeCkgewotICByZXR1cm4gb3MgPDwgKHgudmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLX0KLQotLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KLQotLy8gQSB1bmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1ib29sIFByZWRGdW5jdGlvbjEoVDEgdjEpIHsKLSAgcmV0dXJuIHYxID4gMDsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgotLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCi0vLyBmdW5jdGlvbi4KLWJvb2wgUHJlZEZ1bmN0aW9uMUludChpbnQgdjEpIHsKLSAgcmV0dXJuIHYxID4gMDsKLX0KLWJvb2wgUHJlZEZ1bmN0aW9uMUJvb2woQm9vbCB2MSkgewotICByZXR1cm4gdjEgPiAwOwotfQotCi0vLyBBIHVuYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgotc3RydWN0IFByZWRGdW5jdG9yMSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSkgewotICAgIHJldHVybiB2MSA+IDA7Ci0gIH0KLX07Ci0KLS8vIEEgdW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLXRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24xKGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSB7Ci0gIGlmIChQcmVkRnVuY3Rpb24xKHYxKSkKLSAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8IGUxCi0gICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKLSAgICAgIDw8IHYxIDw8ICIuIjsKLX0KLQotLy8gQSB1bmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCi1zdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3IxIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSBjb25zdCB7Ci0gICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjEoZTEsIHYxKTsKLSAgfQotfTsKLQotLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDEuCi0KLWNsYXNzIFByZWRpY2F0ZTFUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOwotICAgIGZpbmlzaGVkXyA9IGZhbHNlOwotICAgIG4xXyA9IDA7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAotICAgIC8vIGV4YWN0bHkgb25jZS4KLSAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0KLSAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCi0gICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgewotICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOwotICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7Ci0gICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgotICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOwotICAgIH0KLSAgfQotCi0gIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCi0gIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87Ci0KLSAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCi0gIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKLQotICBzdGF0aWMgaW50IG4xXzsKLX07Ci0KLWJvb2wgUHJlZGljYXRlMVRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Ci1ib29sIFByZWRpY2F0ZTFUZXN0OjpmaW5pc2hlZF87Ci1pbnQgUHJlZGljYXRlMVRlc3Q6Om4xXzsKLQotdHlwZWRlZiBQcmVkaWNhdGUxVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlMVRlc3QgQVNTRVJUX1BSRURfRk9STUFUMVRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEVYUEVDVF9QUkVEMVRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEFTU0VSVF9QUkVEMVRlc3Q7Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdGlvbjFJbnQsCi0gICAgICAgICAgICAgICArK24xXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICsrbjFfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKLSAgICAgICAgICAgICAgICAgbjFfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgbjFfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKLSAgICAgICAgICAgICAgICsrbjFfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMShQcmVkRnVuY3Rpb24xQm9vbCwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAotICAgICAgICAgICAgICAgKytuMV8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFJbnQsCi0gICAgICAgICAgICAgICAgIG4xXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAotICAgICAgICAgICAgICAgICBuMV8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCi0gICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCi0gICAgICAgICAgICAgICAgICAgICAgKytuMV8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCi0gICAgICAgICAgICAgICAgICAgICAgKytuMV8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0vLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIGJpbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KLQotLy8gQSBiaW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWJvb2wgUHJlZEZ1bmN0aW9uMihUMSB2MSwgVDIgdjIpIHsKLSAgcmV0dXJuIHYxICsgdjIgPiAwOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCi0vLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKLS8vIGZ1bmN0aW9uLgotYm9vbCBQcmVkRnVuY3Rpb24ySW50KGludCB2MSwgaW50IHYyKSB7Ci0gIHJldHVybiB2MSArIHYyID4gMDsKLX0KLWJvb2wgUHJlZEZ1bmN0aW9uMkJvb2woQm9vbCB2MSwgQm9vbCB2MikgewotICByZXR1cm4gdjEgKyB2MiA+IDA7Ci19Ci0KLS8vIEEgYmluYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgotc3RydWN0IFByZWRGdW5jdG9yMiB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIHsKLSAgICByZXR1cm4gdjEgKyB2MiA+IDA7Ci0gIH0KLX07Ci0KLS8vIEEgYmluYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjIoY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgewotICBpZiAoUHJlZEZ1bmN0aW9uMih2MSwgdjIpKQotICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIKLSAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgotICAgICAgPDwgdjEgKyB2MiA8PCAiLiI7Ci19Ci0KLS8vIEEgYmluYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KLXN0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjIgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSBjb25zdCB7Ci0gICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjIoZTEsIGUyLCB2MSwgdjIpOwotICB9Ci19OwotCi0vLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMi4KLQotY2xhc3MgUHJlZGljYXRlMlRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7Ci0gICAgZmluaXNoZWRfID0gZmFsc2U7Ci0gICAgbjFfID0gbjJfID0gMDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCi0gICAgLy8gZXhhY3RseSBvbmNlLgotICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8Ci0gICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCi0gICAgICAgICJleGFjdGx5IG9uY2UuIjsKLSAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0KLSAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCi0gICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgewotICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOwotICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7Ci0gICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgotICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOwotICAgIH0KLSAgfQotCi0gIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCi0gIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87Ci0KLSAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCi0gIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKLQotICBzdGF0aWMgaW50IG4xXzsKLSAgc3RhdGljIGludCBuMl87Ci19OwotCi1ib29sIFByZWRpY2F0ZTJUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOwotYm9vbCBQcmVkaWNhdGUyVGVzdDo6ZmluaXNoZWRfOwotaW50IFByZWRpY2F0ZTJUZXN0OjpuMV87Ci1pbnQgUHJlZGljYXRlMlRlc3Q6Om4yXzsKLQotdHlwZWRlZiBQcmVkaWNhdGUyVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlMlRlc3QgQVNTRVJUX1BSRURfRk9STUFUMlRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEVYUEVDVF9QUkVEMlRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEFTU0VSVF9QUkVEMlRlc3Q7Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJJbnQsCi0gICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICsrbjJfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEMihQcmVkRnVuY3Rpb24yQm9vbCwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCi0gICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICsrbjJfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAotICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgbjJfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCi0gICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICBuMl8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdG9yMigpLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKLSAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgKytuMl8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAotICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKLSAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgKytuMl8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCi0gICAgICAgICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICAgICAgICAgKytuMl8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCi0gICAgICAgICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICAgICAgICAgKytuMl8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAotICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAotICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjJfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAotICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjJfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyB0ZXJuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgotCi0vLyBBIHRlcm5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1ib29sIFByZWRGdW5jdGlvbjMoVDEgdjEsIFQyIHYyLCBUMyB2MykgewotICByZXR1cm4gdjEgKyB2MiArIHYzID4gMDsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgotLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCi0vLyBmdW5jdGlvbi4KLWJvb2wgUHJlZEZ1bmN0aW9uM0ludChpbnQgdjEsIGludCB2MiwgaW50IHYzKSB7Ci0gIHJldHVybiB2MSArIHYyICsgdjMgPiAwOwotfQotYm9vbCBQcmVkRnVuY3Rpb24zQm9vbChCb29sIHYxLCBCb29sIHYyLCBCb29sIHYzKSB7Ci0gIHJldHVybiB2MSArIHYyICsgdjMgPiAwOwotfQotCi0vLyBBIHRlcm5hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCi1zdHJ1Y3QgUHJlZEZ1bmN0b3IzIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIHsKLSAgICByZXR1cm4gdjEgKyB2MiArIHYzID4gMDsKLSAgfQotfTsKLQotLy8gQSB0ZXJuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLXRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24zKGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgewotICBpZiAoUHJlZEZ1bmN0aW9uMyh2MSwgdjIsIHYzKSkKLSAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzCi0gICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKLSAgICAgIDw8IHYxICsgdjIgKyB2MyA8PCAiLiI7Ci19Ci0KLS8vIEEgdGVybmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCi1zdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3IzIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci0gIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIGNvbnN0IHsKLSAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uMyhlMSwgZTIsIGUzLCB2MSwgdjIsIHYzKTsKLSAgfQotfTsKLQotLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuCi0KLWNsYXNzIFByZWRpY2F0ZTNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOwotICAgIGZpbmlzaGVkXyA9IGZhbHNlOwotICAgIG4xXyA9IG4yXyA9IG4zXyA9IDA7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAotICAgIC8vIGV4YWN0bHkgb25jZS4KLSAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0gICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKLSAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKLSAgICAgICAgImV4YWN0bHkgb25jZS4iOwotICAgIEVYUEVDVF9FUSgxLCBuM18pIDw8Ci0gICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNCAiCi0gICAgICAgICJleGFjdGx5IG9uY2UuIjsKLQotICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KLSAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7Ci0gICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7Ci0gICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKLSAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCi0gICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KLSAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKLQotICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KLSAgc3RhdGljIGJvb2wgZmluaXNoZWRfOwotCi0gIHN0YXRpYyBpbnQgbjFfOwotICBzdGF0aWMgaW50IG4yXzsKLSAgc3RhdGljIGludCBuM187Ci19OwotCi1ib29sIFByZWRpY2F0ZTNUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOwotYm9vbCBQcmVkaWNhdGUzVGVzdDo6ZmluaXNoZWRfOwotaW50IFByZWRpY2F0ZTNUZXN0OjpuMV87Ci1pbnQgUHJlZGljYXRlM1Rlc3Q6Om4yXzsKLWludCBQcmVkaWNhdGUzVGVzdDo6bjNfOwotCi10eXBlZGVmIFByZWRpY2F0ZTNUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0OwotdHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlM1Rlc3QgRVhQRUNUX1BSRUQzVGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlM1Rlc3QgQVNTRVJUX1BSRUQzVGVzdDsKLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKLSAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgKytuMl8sCi0gICAgICAgICAgICAgICArK24zXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCi0gICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICsrbjJfLAotICAgICAgICAgICAgICAgKytuM18pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICBuM18rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCi0gICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCi0gICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgbjNfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAotICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICsrbjNfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgKytuMl8sCi0gICAgICAgICAgICAgICArK24zXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAotICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNJbnQsCi0gICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgbjNfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCi0gICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICBuM18rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCi0gICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAotICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyA0LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KLQotLy8gQSA0LWFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1ib29sIFByZWRGdW5jdGlvbjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIHsKLSAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgotLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCi0vLyBmdW5jdGlvbi4KLWJvb2wgUHJlZEZ1bmN0aW9uNEludChpbnQgdjEsIGludCB2MiwgaW50IHYzLCBpbnQgdjQpIHsKLSAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKLX0KLWJvb2wgUHJlZEZ1bmN0aW9uNEJvb2woQm9vbCB2MSwgQm9vbCB2MiwgQm9vbCB2MywgQm9vbCB2NCkgewotICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOwotfQotCi0vLyBBIDQtYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgotc3RydWN0IFByZWRGdW5jdG9yNCB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgewotICAgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCA+IDA7Ci0gIH0KLX07Ci0KLS8vIEEgNC1hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLXRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb240KGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7Ci0gIGlmIChQcmVkRnVuY3Rpb240KHYxLCB2MiwgdjMsIHY0KSkKLSAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0Ci0gICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKLSAgICAgIDw8IHYxICsgdjIgKyB2MyArIHY0IDw8ICIuIjsKLX0KLQotLy8gQSA0LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCi1zdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3I0IHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSBjb25zdCB7Ci0gICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjQoZTEsIGUyLCBlMywgZTQsIHYxLCB2MiwgdjMsIHY0KTsKLSAgfQotfTsKLQotLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDQuCi0KLWNsYXNzIFByZWRpY2F0ZTRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOwotICAgIGZpbmlzaGVkXyA9IGZhbHNlOwotICAgIG4xXyA9IG4yXyA9IG4zXyA9IG40XyA9IDA7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAotICAgIC8vIGV4YWN0bHkgb25jZS4KLSAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0gICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKLSAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKLSAgICAgICAgImV4YWN0bHkgb25jZS4iOwotICAgIEVYUEVDVF9FUSgxLCBuM18pIDw8Ci0gICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNCAiCi0gICAgICAgICJleGFjdGx5IG9uY2UuIjsKLSAgICBFWFBFQ1RfRVEoMSwgbjRfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDUgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0KLSAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCi0gICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgewotICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOwotICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7Ci0gICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgotICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOwotICAgIH0KLSAgfQotCi0gIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCi0gIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87Ci0KLSAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCi0gIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKLQotICBzdGF0aWMgaW50IG4xXzsKLSAgc3RhdGljIGludCBuMl87Ci0gIHN0YXRpYyBpbnQgbjNfOwotICBzdGF0aWMgaW50IG40XzsKLX07Ci0KLWJvb2wgUHJlZGljYXRlNFRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Ci1ib29sIFByZWRpY2F0ZTRUZXN0OjpmaW5pc2hlZF87Ci1pbnQgUHJlZGljYXRlNFRlc3Q6Om4xXzsKLWludCBQcmVkaWNhdGU0VGVzdDo6bjJfOwotaW50IFByZWRpY2F0ZTRUZXN0OjpuM187Ci1pbnQgUHJlZGljYXRlNFRlc3Q6Om40XzsKLQotdHlwZWRlZiBQcmVkaWNhdGU0VGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdDsKLXR5cGVkZWYgUHJlZGljYXRlNFRlc3QgQVNTRVJUX1BSRURfRk9STUFUNFRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEVYUEVDVF9QUkVENFRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEFTU0VSVF9QUkVENFRlc3Q7Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdGlvbjRJbnQsCi0gICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICsrbjJfLAotICAgICAgICAgICAgICAgKytuM18sCi0gICAgICAgICAgICAgICArK240Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgKytuMl8sCi0gICAgICAgICAgICAgICArK24zXywKLSAgICAgICAgICAgICAgICsrbjRfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICBuM18rKywKLSAgICAgICAgICAgICAgICAgbjRfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICBuM18rKywKLSAgICAgICAgICAgICAgICAgbjRfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKLSAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgKytuMl8sCi0gICAgICAgICAgICAgICArK24zXywKLSAgICAgICAgICAgICAgICsrbjRfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVENChQcmVkRnVuY3Rpb240Qm9vbCwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAotICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICsrbjNfLAotICAgICAgICAgICAgICAgKytuNF8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRJbnQsCi0gICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgIG40XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAotICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAotICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgbjJfKyssCi0gICAgICAgICAgICAgICAgIG4zXysrLAotICAgICAgICAgICAgICAgICBuNF8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCi0gICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCi0gICAgICAgICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICAgICAgICAgKytuMl8sCi0gICAgICAgICAgICAgICAgICAgICAgKytuM18sCi0gICAgICAgICAgICAgICAgICAgICAgKytuNF8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCi0gICAgICAgICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICAgICAgICAgKytuMl8sCi0gICAgICAgICAgICAgICAgICAgICAgKytuM18sCi0gICAgICAgICAgICAgICAgICAgICAgKytuNF8pOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuNF8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXywKLSAgICAgICAgICAgICAgICAgICAgICArK240Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXywKLSAgICAgICAgICAgICAgICAgICAgICArK240Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuNF8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0vLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIDUtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgotCi0vLyBBIDUtYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1ib29sIFByZWRGdW5jdGlvbjUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1KSB7Ci0gIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgotLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCi0vLyBmdW5jdGlvbi4KLWJvb2wgUHJlZEZ1bmN0aW9uNUludChpbnQgdjEsIGludCB2MiwgaW50IHYzLCBpbnQgdjQsIGludCB2NSkgewotICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7Ci19Ci1ib29sIFByZWRGdW5jdGlvbjVCb29sKEJvb2wgdjEsIEJvb2wgdjIsIEJvb2wgdjMsIEJvb2wgdjQsIEJvb2wgdjUpIHsKLSAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPiAwOwotfQotCi0vLyBBIDUtYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgotc3RydWN0IFByZWRGdW5jdG9yNSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIHsKLSAgICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7Ci0gIH0KLX07Ci0KLS8vIEEgNS1hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci10ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uNShjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7Ci0gIGlmIChQcmVkRnVuY3Rpb241KHYxLCB2MiwgdjMsIHY0LCB2NSkpCi0gICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMyA8PCAiICsgIiA8PCBlNCA8PCAiICsgIiA8PCBlNQotICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCi0gICAgICA8PCB2MSArIHYyICsgdjMgKyB2NCArIHY1IDw8ICIuIjsKLX0KLQotLy8gQSA1LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCi1zdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3I1IHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLSAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgY29uc3QgewotICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb241KGUxLCBlMiwgZTMsIGU0LCBlNSwgdjEsIHYyLCB2MywgdjQsIHY1KTsKLSAgfQotfTsKLQotLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDUuCi0KLWNsYXNzIFByZWRpY2F0ZTVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOwotICAgIGZpbmlzaGVkXyA9IGZhbHNlOwotICAgIG4xXyA9IG4yXyA9IG4zXyA9IG40XyA9IG41XyA9IDA7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAotICAgIC8vIGV4YWN0bHkgb25jZS4KLSAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0gICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKLSAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKLSAgICAgICAgImV4YWN0bHkgb25jZS4iOwotICAgIEVYUEVDVF9FUSgxLCBuM18pIDw8Ci0gICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNCAiCi0gICAgICAgICJleGFjdGx5IG9uY2UuIjsKLSAgICBFWFBFQ1RfRVEoMSwgbjRfKSA8PAotICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDUgIgotICAgICAgICAiZXhhY3RseSBvbmNlLiI7Ci0gICAgRVhQRUNUX0VRKDEsIG41XykgPDwKLSAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA2ICIKLSAgICAgICAgImV4YWN0bHkgb25jZS4iOwotCi0gICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgotICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKLSAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKLSAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgewotICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKLSAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKLSAgICB9Ci0gIH0KLQotICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgotICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOwotCi0gIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgotICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87Ci0KLSAgc3RhdGljIGludCBuMV87Ci0gIHN0YXRpYyBpbnQgbjJfOwotICBzdGF0aWMgaW50IG4zXzsKLSAgc3RhdGljIGludCBuNF87Ci0gIHN0YXRpYyBpbnQgbjVfOwotfTsKLQotYm9vbCBQcmVkaWNhdGU1VGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKLWJvb2wgUHJlZGljYXRlNVRlc3Q6OmZpbmlzaGVkXzsKLWludCBQcmVkaWNhdGU1VGVzdDo6bjFfOwotaW50IFByZWRpY2F0ZTVUZXN0OjpuMl87Ci1pbnQgUHJlZGljYXRlNVRlc3Q6Om4zXzsKLWludCBQcmVkaWNhdGU1VGVzdDo6bjRfOwotaW50IFByZWRpY2F0ZTVUZXN0OjpuNV87Ci0KLXR5cGVkZWYgUHJlZGljYXRlNVRlc3QgRVhQRUNUX1BSRURfRk9STUFUNVRlc3Q7Ci10eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0OwotdHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBFWFBFQ1RfUFJFRDVUZXN0OwotdHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBBU1NFUlRfUFJFRDVUZXN0OwotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241SW50LAotICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICsrbjNfLAotICAgICAgICAgICAgICAgKytuNF8sCi0gICAgICAgICAgICAgICArK241Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0aW9uNUJvb2wsCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAotICAgICAgICAgICAgICAgKytuMV8sCi0gICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICsrbjNfLAotICAgICAgICAgICAgICAgKytuNF8sCi0gICAgICAgICAgICAgICArK241Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAotICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuM18pLAotICAgICAgICAgICAgICAgQm9vbCgrK240XyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKLSAgICAgICAgICAgICAgICAgbjFfKyssCi0gICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICBuM18rKywKLSAgICAgICAgICAgICAgICAgbjRfKyssCi0gICAgICAgICAgICAgICAgIG41XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAotICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgbjJfKyssCi0gICAgICAgICAgICAgICAgIG4zXysrLAotICAgICAgICAgICAgICAgICBuNF8rKywKLSAgICAgICAgICAgICAgICAgbjVfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCi0gICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICsrbjJfLAotICAgICAgICAgICAgICAgKytuM18sCi0gICAgICAgICAgICAgICArK240XywKLSAgICAgICAgICAgICAgICsrbjVfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKLSAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAotICAgICAgICAgICAgICAgQm9vbCgrK241XykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCi0gICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICsrbjJfLAotICAgICAgICAgICAgICAgKytuM18sCi0gICAgICAgICAgICAgICArK240XywKLSAgICAgICAgICAgICAgICsrbjVfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCi0gICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCi0gICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKLSAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCi0gICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgIG40XysrLAotICAgICAgICAgICAgICAgICBuNV8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKLSAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCi0gICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICBuMl8rKywKLSAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgIG40XysrLAotICAgICAgICAgICAgICAgICBuNV8rKyk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCi0gICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCi0gICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAotICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAotICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKLSAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAotICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAotICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCi0gICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOwotICBmaW5pc2hlZF8gPSB0cnVlOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KLVRFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7Ci0gICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgfSwgIiIpOwotfQotCi0vLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KLQotLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXywKLSAgICAgICAgICAgICAgICAgICAgICArK240XywKLSAgICAgICAgICAgICAgICAgICAgICArK241Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKLSAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgotVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKLSAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKLSAgICAgICAgICAgICAgICAgICAgICArK24xXywKLSAgICAgICAgICAgICAgICAgICAgICArK24yXywKLSAgICAgICAgICAgICAgICAgICAgICArK24zXywKLSAgICAgICAgICAgICAgICAgICAgICArK240XywKLSAgICAgICAgICAgICAgICAgICAgICArK241Xyk7Ci0gIGZpbmlzaGVkXyA9IHRydWU7Ci19Ci0KLS8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQotLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgewotICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAotICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKLSAgZmluaXNoZWRfID0gdHJ1ZTsKLX0KLQotLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKLS8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKLSAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCi1URVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgewotICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCi0gICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKLSAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKLSAgICBmaW5pc2hlZF8gPSB0cnVlOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCi0vLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KLVRFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7Ci0gIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOwotICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gIH0sICIiKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9wcmVtYXR1cmVfZXhpdF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNGRjN2QuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTMsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IG1hbmlwdWxhdGVzIHRoZSBwcmVtYXR1cmUtZXhpdC1kZXRlY3Rpb24KLS8vIGZpbGUgY29ycmVjdGx5LgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6R2V0RW52OwotdXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OlN0YXQ7Ci11c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6U3RhdFN0cnVjdDsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgUHJlbWF0dXJlRXhpdFRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHVibGljOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBmaWxlIGV4aXN0cy4KLSAgc3RhdGljIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBjaGFyKiBmaWxlcGF0aCkgewotICAgIFN0YXRTdHJ1Y3Qgc3RhdDsKLSAgICByZXR1cm4gU3RhdChmaWxlcGF0aCwgJnN0YXQpID09IDA7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgUHJlbWF0dXJlRXhpdFRlc3QoKSB7Ci0gICAgcHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXyA9IEdldEVudigiVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIik7Ci0KLSAgICAvLyBOb3JtYWxpemUgTlVMTCB0byAiIiBmb3IgZWFzZSBvZiBoYW5kbGluZy4KLSAgICBpZiAocHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXyA9PSBOVUxMKSB7Ci0gICAgICBwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfID0gIiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBleGlzdHMuCi0gIGJvb2wgUHJlbWF0dXJlRXhpdEZpbGVFeGlzdHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZpbGVFeGlzdHMocHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXyk7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfOwotfTsKLQotdHlwZWRlZiBQcmVtYXR1cmVFeGl0VGVzdCBQcmVtYXR1cmVFeGl0RGVhdGhUZXN0OwotCi0vLyBUZXN0cyB0aGF0OgotLy8gICAtIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlIGV4aXN0cyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhCi0vLyAgICAgZGVhdGggdGVzdCAoRVhQRUNUX0RFQVRIKiksIGFuZAotLy8gICAtIGEgZGVhdGggdGVzdCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIHRoZSBtYWluIHRlc3QgcHJvY2VzcydzCi0vLyAgICAgaGFuZGxpbmcgb2YgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUuCi1URVNUX0YoUHJlbWF0dXJlRXhpdERlYXRoVGVzdCwgRmlsZUV4aXN0c0R1cmluZ0V4ZWN1dGlvbk9mRGVhdGhUZXN0KSB7Ci0gIGlmICgqcHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXyA9PSAnXDAnKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7Ci0gICAgICAvLyBJZiB0aGUgZmlsZSBleGlzdHMsIGNyYXNoIHRoZSBwcm9jZXNzIHN1Y2ggdGhhdCB0aGUgbWFpbiB0ZXN0Ci0gICAgICAvLyBwcm9jZXNzIHdpbGwgY2F0Y2ggdGhlIChleHBlY3RlZCkgY3Jhc2ggYW5kIHJlcG9ydCBhIHN1Y2Nlc3M7Ci0gICAgICAvLyBvdGhlcndpc2UgZG9uJ3QgY3Jhc2gsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIG1haW4gdGVzdCBwcm9jZXNzCi0gICAgICAvLyB0byByZXBvcnQgdGhhdCB0aGUgZGVhdGggdGVzdCBoYXMgZmFpbGVkLgotICAgICAgaWYgKFByZW1hdHVyZUV4aXRGaWxlRXhpc3RzKCkpIHsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgZXhpc3RzIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEKLS8vIG5vcm1hbCAobm9uLWRlYXRoKSB0ZXN0LgotVEVTVF9GKFByZW1hdHVyZUV4aXRUZXN0LCBQcmVtYXR1cmVFeGl0RmlsZUV4aXN0c0R1cmluZ1Rlc3RFeGVjdXRpb24pIHsKLSAgaWYgKCpwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfID09ICdcMCcpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBFWFBFQ1RfVFJVRShQcmVtYXR1cmVFeGl0RmlsZUV4aXN0cygpKQotICAgICAgPDwgIiBmaWxlICIgPDwgcHJlbWF0dXJlX2V4aXRfZmlsZV9wYXRoXwotICAgICAgPDwgIiBzaG91bGQgZXhpc3QgZHVyaW5nIHRlc3QgZXhlY3V0aW9uLCBidXQgZG9lc24ndC4iOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgY29uc3QgaW50IGV4aXRfY29kZSA9IFJVTl9BTExfVEVTVFMoKTsKLQotICAvLyBUZXN0IHRoYXQgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaXMgZGVsZXRlZCB1cG9uIHJldHVybiBmcm9tCi0gIC8vIFJVTl9BTExfVEVTVFMoKS4KLSAgY29uc3QgY2hhciogY29uc3QgZmlsZXBhdGggPSBHZXRFbnYoIlRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSIpOwotICBpZiAoZmlsZXBhdGggIT0gTlVMTCAmJiAqZmlsZXBhdGggIT0gJ1wwJykgewotICAgIGlmIChQcmVtYXR1cmVFeGl0VGVzdDo6RmlsZUV4aXN0cyhmaWxlcGF0aCkpIHsKLSAgICAgIHByaW50ZigKLSAgICAgICAgICAiRmlsZSAlcyBzaG91bGRuJ3QgZXhpc3QgYWZ0ZXIgdGhlIHRlc3QgcHJvZ3JhbSBmaW5pc2hlcywgYnV0IGRvZXMuIiwKLSAgICAgICAgICBmaWxlcGF0aCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZXhpdF9jb2RlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGFiY2UuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVW5pdCB0ZXN0IGZvciBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaC4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidGVzdC9wcm9kdWN0aW9uLmgiCi0KLS8vIFRlc3RzIHRoYXQgcHJpdmF0ZSBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGEgVEVTVCBkZWNsYXJlZCBhcwotLy8gYSBmcmllbmQgb2YgdGhlIGNsYXNzLgotVEVTVChQcml2YXRlQ29kZVRlc3QsIENhbkFjY2Vzc1ByaXZhdGVNZW1iZXJzKSB7Ci0gIFByaXZhdGVDb2RlIGE7Ci0gIEVYUEVDVF9FUSgwLCBhLnhfKTsKLQotICBhLnNldF94KDEpOwotICBFWFBFQ1RfRVEoMSwgYS54Xyk7Ci19Ci0KLXR5cGVkZWYgdGVzdGluZzo6VGVzdCBQcml2YXRlQ29kZUZpeHR1cmVUZXN0OwotCi0vLyBUZXN0cyB0aGF0IHByaXZhdGUgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgZnJvbSBhIFRFU1RfRiBkZWNsYXJlZAotLy8gYXMgYSBmcmllbmQgb2YgdGhlIGNsYXNzLgotVEVTVF9GKFByaXZhdGVDb2RlRml4dHVyZVRlc3QsIENhbkFjY2Vzc1ByaXZhdGVNZW1iZXJzKSB7Ci0gIFByaXZhdGVDb2RlIGE7Ci0gIEVYUEVDVF9FUSgwLCBhLnhfKTsKLQotICBhLnNldF94KDIpOwotICBFWFBFQ1RfRVEoMiwgYS54Xyk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTAxMmEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFRlc3RzIHRoZSAtLWd0ZXN0X3JlcGVhdD1udW1iZXIgZmxhZy4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgotLy8gaGlzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOwotR1RFU1RfREVDTEFSRV9pbnQzMl8ocmVwZWF0KTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotdXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KTsKLQotbmFtZXNwYWNlIHsKLQotLy8gV2UgbmVlZCB0aGlzIHdoZW4gd2UgYXJlIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCB0aGVyZWZvcmUKLS8vIGNhbm5vdCB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucy4KLSNkZWZpbmUgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgYWN0dWFsKSBcCi0gIGRvIHtcCi0gICAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbCA9IChleHBlY3RlZCk7XAotICAgIGNvbnN0IGludCBhY3R1YWxfdmFsID0gKGFjdHVhbCk7XAotICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoZXhwZWN0ZWRfdmFsICE9IGFjdHVhbF92YWwpKSB7XAotICAgICAgOjpzdGQ6OmNvdXQgPDwgIlZhbHVlIG9mOiAiICNhY3R1YWwgIlxuIlwKLSAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsIDw8ICJcbiJcCi0gICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgI2V4cGVjdGVkICJcbiJcCi0gICAgICAgICAgICAgICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsIDw8ICJcbiI7XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7XAotICAgIH1cCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLQotLy8gVXNlZCBmb3IgdmVyaWZ5aW5nIHRoYXQgZ2xvYmFsIGVudmlyb25tZW50IHNldC11cCBhbmQgdGVhci1kb3duIGFyZQotLy8gaW5zaWRlIHRoZSBndGVzdF9yZXBlYXQgbG9vcC4KLQotaW50IGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKLWludCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCA9IDA7Ci0KLWNsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgTXlFbnZpcm9ubWVudCgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgZ19lbnZpcm9ubWVudF9zZXRfdXBfY291bnQrKzsgfQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50Kys7IH0KLX07Ci0KLS8vIEEgdGVzdCB0aGF0IHNob3VsZCBmYWlsLgotCi1pbnQgZ19zaG91bGRfZmFpbF9jb3VudCA9IDA7Ci0KLVRFU1QoRm9vVGVzdCwgU2hvdWxkRmFpbCkgewotICBnX3Nob3VsZF9mYWlsX2NvdW50Kys7Ci0gIEVYUEVDVF9FUSgwLCAxKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOwotfQotCi0vLyBBIHRlc3QgdGhhdCBzaG91bGQgcGFzcy4KLQotaW50IGdfc2hvdWxkX3Bhc3NfY291bnQgPSAwOwotCi1URVNUKEZvb1Rlc3QsIFNob3VsZFBhc3MpIHsKLSAgZ19zaG91bGRfcGFzc19jb3VudCsrOwotfQotCi0vLyBBIHRlc3QgdGhhdCBjb250YWlucyBhIHRocmVhZC1zYWZlIGRlYXRoIHRlc3QgYW5kIGEgZmFzdCBkZWF0aAotLy8gdGVzdC4gIEl0IHNob3VsZCBwYXNzLgotCi1pbnQgZ19kZWF0aF90ZXN0X2NvdW50ID0gMDsKLQotVEVTVChCYXJEZWF0aFRlc3QsIFRocmVhZFNhZmVBbmRGYXN0KSB7Ci0gIGdfZGVhdGhfdGVzdF9jb3VudCsrOwotCi0gIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCksICIiKTsKLQotICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpLCAiIik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotaW50IGdfcGFyYW1fdGVzdF9jb3VudCA9IDA7Ci0KLWNvbnN0IGludCBrTnVtYmVyT2ZQYXJhbVRlc3RzID0gMTA7Ci0KLWNsYXNzIE15UGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7fTsKLQotVEVTVF9QKE15UGFyYW1UZXN0LCBTaG91bGRQYXNzKSB7Ci0gIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgcGFyYW1ldGVyIHZhbHVlIGNoZWNraW5nIHJvYnVzdAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBXUlQgb3JkZXIgb2YgdGVzdHMuCi0gIEdURVNUX0NIRUNLX0lOVF9FUV8oZ19wYXJhbV90ZXN0X2NvdW50ICUga051bWJlck9mUGFyYW1UZXN0cywgR2V0UGFyYW0oKSk7Ci0gIGdfcGFyYW1fdGVzdF9jb3VudCsrOwotfQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXlQYXJhbVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTXlQYXJhbVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpSYW5nZSgwLCBrTnVtYmVyT2ZQYXJhbVRlc3RzKSk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLS8vIFJlc2V0cyB0aGUgY291bnQgZm9yIGVhY2ggdGVzdC4KLXZvaWQgUmVzZXRDb3VudHMoKSB7Ci0gIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKLSAgZ19lbnZpcm9ubWVudF90ZWFyX2Rvd25fY291bnQgPSAwOwotICBnX3Nob3VsZF9mYWlsX2NvdW50ID0gMDsKLSAgZ19zaG91bGRfcGFzc19jb3VudCA9IDA7Ci0gIGdfZGVhdGhfdGVzdF9jb3VudCA9IDA7Ci0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgZ19wYXJhbV90ZXN0X2NvdW50ID0gMDsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLX0KLQotLy8gQ2hlY2tzIHRoYXQgdGhlIGNvdW50IGZvciBlYWNoIHRlc3QgaXMgZXhwZWN0ZWQuCi12b2lkIENoZWNrQ291bnRzKGludCBleHBlY3RlZCkgewotICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgZ19zaG91bGRfZmFpbF9jb3VudCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfc2hvdWxkX3Bhc3NfY291bnQpOwotICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2RlYXRoX3Rlc3RfY291bnQpOwotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0gIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotfQotCi0vLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgR29vZ2xlIFRlc3Qgd2hlbiAtLWd0ZXN0X3JlcGVhdCBpcyBub3Qgc3BlY2lmaWVkLgotdm9pZCBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKSB7Ci0gIFJlc2V0Q291bnRzKCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKLSAgQ2hlY2tDb3VudHMoMSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBiZWhhdmlvciBvZiBHb29nbGUgVGVzdCB3aGVuIC0tZ3Rlc3RfcmVwZWF0IGhhcyB0aGUgZ2l2ZW4gdmFsdWUuCi12b2lkIFRlc3RSZXBlYXQoaW50IHJlcGVhdCkgewotICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7Ci0KLSAgUmVzZXRDb3VudHMoKTsKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgPiAwID8gMSA6IDAsIFJVTl9BTExfVEVTVFMoKSk7Ci0gIENoZWNrQ291bnRzKHJlcGVhdCk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIC0tZ3Rlc3RfcmVwZWF0IHdoZW4gLS1ndGVzdF9maWx0ZXIgc3BlY2lmaWVzIGFuIGVtcHR5Ci0vLyBzZXQgb2YgdGVzdHMuCi12b2lkIFRlc3RSZXBlYXRXaXRoRW1wdHlGaWx0ZXIoaW50IHJlcGVhdCkgewotICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7Ci0gIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICJOb25lIjsKLQotICBSZXNldENvdW50cygpOwotICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7Ci0gIENoZWNrQ291bnRzKDApOwotfQotCi0vLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgotLy8gc3VjY2Vzc2Z1bCB0ZXN0cy4KLXZvaWQgVGVzdFJlcGVhdFdpdGhGaWx0ZXJGb3JTdWNjZXNzZnVsVGVzdHMoaW50IHJlcGVhdCkgewotICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7Ci0gIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIqLSpTaG91bGRGYWlsIjsKLQotICBSZXNldENvdW50cygpOwotICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8oMCwgZ19zaG91bGRfZmFpbF9jb3VudCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX3Nob3VsZF9wYXNzX2NvdW50KTsKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZGVhdGhfdGVzdF9jb3VudCk7Ci0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotfQotCi0vLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgotLy8gZmFpbGVkIHRlc3RzLgotdm9pZCBUZXN0UmVwZWF0V2l0aEZpbHRlckZvckZhaWxlZFRlc3RzKGludCByZXBlYXQpIHsKLSAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OwotICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiKlNob3VsZEZhaWwiOwotCi0gIFJlc2V0Q291bnRzKCk7Ci0gIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50KTsKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfc2hvdWxkX2ZhaWxfY291bnQpOwotICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfc2hvdWxkX3Bhc3NfY291bnQpOwotICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfZGVhdGhfdGVzdF9jb3VudCk7Ci0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBnX3BhcmFtX3Rlc3RfY291bnQpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBNeUVudmlyb25tZW50KTsKLQotICBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKTsKLSAgVGVzdFJlcGVhdCgwKTsKLSAgVGVzdFJlcGVhdCgxKTsKLSAgVGVzdFJlcGVhdCg1KTsKLQotICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDIpOwotICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDMpOwotCi0gIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yU3VjY2Vzc2Z1bFRlc3RzKDMpOwotCi0gIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yRmFpbGVkVGVzdHMoNCk7Ci0KLSAgLy8gSXQgd291bGQgYmUgbmljZSB0byB2ZXJpZnkgdGhhdCB0aGUgdGVzdHMgaW5kZWVkIGxvb3AgZm9yZXZlcgotICAvLyB3aGVuIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBuZWdhdGl2ZSwgYnV0IHRoaXMgdGVzdCB3aWxsIGJlIHF1aXRlCi0gIC8vIGNvbXBsaWNhdGVkIHRvIHdyaXRlLiAgU2luY2UgdGhpcyBmbGFnIGlzIGZvciBpbnRlcmFjdGl2ZQotICAvLyBkZWJ1Z2dpbmcgb25seSBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIG5vcm1hbCB0ZXN0IHJlc3VsdCwgc3VjaCBhCi0gIC8vIHRlc3Qgd291bGQgYmUgYW4gb3ZlcmtpbGwuCi0KLSAgcHJpbnRmKCJQQVNTXG4iKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0LnB5IGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzBkMDMwMy4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVmVyaWZpZXMgdGhhdCB0ZXN0IHNodWZmbGluZyB3b3Jrcy4iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IG9zCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscwotCi0jIENvbW1hbmQgdG8gcnVuIHRoZSBndGVzdF9zaHVmZmxlX3Rlc3RfIHByb2dyYW0uCi1DT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X3NodWZmbGVfdGVzdF8nKQotCi0jIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRlc3Qgc2hhcmRpbmcuCi1UT1RBTF9TSEFSRFNfRU5WX1ZBUiA9ICdHVEVTVF9UT1RBTF9TSEFSRFMnCi1TSEFSRF9JTkRFWF9FTlZfVkFSID0gJ0dURVNUX1NIQVJEX0lOREVYJwotCi1URVNUX0ZJTFRFUiA9ICdBKi5BOkEqLkI6QyonCi0KLUFMTF9URVNUUyA9IFtdCi1BQ1RJVkVfVEVTVFMgPSBbXQotRklMVEVSRURfVEVTVFMgPSBbXQotU0hBUkRFRF9URVNUUyA9IFtdCi0KLVNIVUZGTEVEX0FMTF9URVNUUyA9IFtdCi1TSFVGRkxFRF9BQ1RJVkVfVEVTVFMgPSBbXQotU0hVRkZMRURfRklMVEVSRURfVEVTVFMgPSBbXQotU0hVRkZMRURfU0hBUkRFRF9URVNUUyA9IFtdCi0KLQotZGVmIEFsc29SdW5EaXNhYmxlZFRlc3RzRmxhZygpOgotICByZXR1cm4gJy0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMnCi0KLQotZGVmIEZpbHRlckZsYWcodGVzdF9maWx0ZXIpOgotICByZXR1cm4gJy0tZ3Rlc3RfZmlsdGVyPSVzJyAlICh0ZXN0X2ZpbHRlciwpCi0KLQotZGVmIFJlcGVhdEZsYWcobik6Ci0gIHJldHVybiAnLS1ndGVzdF9yZXBlYXQ9JXMnICUgKG4sKQotCi0KLWRlZiBTaHVmZmxlRmxhZygpOgotICByZXR1cm4gJy0tZ3Rlc3Rfc2h1ZmZsZScKLQotCi1kZWYgUmFuZG9tU2VlZEZsYWcobik6Ci0gIHJldHVybiAnLS1ndGVzdF9yYW5kb21fc2VlZD0lcycgJSAobiwpCi0KLQotZGVmIFJ1bkFuZFJldHVybk91dHB1dChleHRyYV9lbnYsIGFyZ3MpOgotICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgaXRzIG91dHB1dC4iIiIKLQotICBlbnZpcm9uX2NvcHkgPSBvcy5lbnZpcm9uLmNvcHkoKQotICBlbnZpcm9uX2NvcHkudXBkYXRlKGV4dHJhX2VudikKLQotICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIGFyZ3MsIGVudj1lbnZpcm9uX2NvcHkpLm91dHB1dAotCi0KLWRlZiBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoZXh0cmFfZW52LCBhcmdzKToKLSAgIiIiUnVucyB0aGUgdGVzdCBwcm9ncmFtIGFuZCByZXR1cm5zIGEgbGlzdCBvZiB0ZXN0IGxpc3RzLgotCi0gIEFyZ3M6Ci0gICAgZXh0cmFfZW52OiBhIG1hcCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB0aGVpciB2YWx1ZXMKLSAgICBhcmdzOiBjb21tYW5kIGxpbmUgZmxhZ3MgdG8gcGFzcyB0byBndGVzdF9zaHVmZmxlX3Rlc3RfCi0KLSAgUmV0dXJuczoKLSAgICBBIGxpc3Qgd2hlcmUgdGhlIGktdGggZWxlbWVudCBpcyB0aGUgbGlzdCBvZiB0ZXN0cyBydW4gaW4gdGhlIGktdGgKLSAgICB0ZXN0IGl0ZXJhdGlvbi4KLSAgIiIiCi0KLSAgdGVzdF9pdGVyYXRpb25zID0gW10KLSAgZm9yIGxpbmUgaW4gUnVuQW5kUmV0dXJuT3V0cHV0KGV4dHJhX2VudiwgYXJncykuc3BsaXQoJ1xuJyk6Ci0gICAgaWYgbGluZS5zdGFydHN3aXRoKCctLS0tJyk6Ci0gICAgICB0ZXN0cyA9IFtdCi0gICAgICB0ZXN0X2l0ZXJhdGlvbnMuYXBwZW5kKHRlc3RzKQotICAgIGVsaWYgbGluZS5zdHJpcCgpOgotICAgICAgdGVzdHMuYXBwZW5kKGxpbmUuc3RyaXAoKSkgICMgJ1Rlc3RDYXNlTmFtZS5UZXN0TmFtZScKLQotICByZXR1cm4gdGVzdF9pdGVyYXRpb25zCi0KLQotZGVmIEdldFRlc3RDYXNlcyh0ZXN0cyk6Ci0gICIiIlJldHVybnMgYSBsaXN0IG9mIHRlc3QgY2FzZXMgaW4gdGhlIGdpdmVuIGZ1bGwgdGVzdCBuYW1lcy4KLQotICBBcmdzOgotICAgIHRlc3RzOiBhIGxpc3Qgb2YgZnVsbCB0ZXN0IG5hbWVzCi0KLSAgUmV0dXJuczoKLSAgICBBIGxpc3Qgb2YgdGVzdCBjYXNlcyBmcm9tICd0ZXN0cycsIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLgotICAgIENvbnNlY3V0aXZlIGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWQuCi0gICIiIgotCi0gIHRlc3RfY2FzZXMgPSBbXQotICBmb3IgdGVzdCBpbiB0ZXN0czoKLSAgICB0ZXN0X2Nhc2UgPSB0ZXN0LnNwbGl0KCcuJylbMF0KLSAgICBpZiBub3QgdGVzdF9jYXNlIGluIHRlc3RfY2FzZXM6Ci0gICAgICB0ZXN0X2Nhc2VzLmFwcGVuZCh0ZXN0X2Nhc2UpCi0KLSAgcmV0dXJuIHRlc3RfY2FzZXMKLQotCi1kZWYgQ2FsY3VsYXRlVGVzdExpc3RzKCk6Ci0gICIiIkNhbGN1bGF0ZXMgdGhlIGxpc3Qgb2YgdGVzdHMgcnVuIHVuZGVyIGRpZmZlcmVudCBmbGFncy4iIiIKLQotICBpZiBub3QgQUxMX1RFU1RTOgotICAgIEFMTF9URVNUUy5leHRlbmQoCi0gICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7fSwgW0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZygpXSlbMF0pCi0KLSAgaWYgbm90IEFDVElWRV9URVNUUzoKLSAgICBBQ1RJVkVfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7fSwgW10pWzBdKQotCi0gIGlmIG5vdCBGSUxURVJFRF9URVNUUzoKLSAgICBGSUxURVJFRF9URVNUUy5leHRlbmQoCi0gICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7fSwgW0ZpbHRlckZsYWcoVEVTVF9GSUxURVIpXSlbMF0pCi0KLSAgaWYgbm90IFNIQVJERURfVEVTVFM6Ci0gICAgU0hBUkRFRF9URVNUUy5leHRlbmQoCi0gICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pWzBdKQotCi0gIGlmIG5vdCBTSFVGRkxFRF9BTExfVEVTVFM6Ci0gICAgU0hVRkZMRURfQUxMX1RFU1RTLmV4dGVuZChHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCi0gICAgICAgIHt9LCBbQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCksIFNodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCi0KLSAgaWYgbm90IFNIVUZGTEVEX0FDVElWRV9URVNUUzoKLSAgICBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKLSAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pWzBdKQotCi0gIGlmIG5vdCBTSFVGRkxFRF9GSUxURVJFRF9URVNUUzoKLSAgICBTSFVGRkxFRF9GSUxURVJFRF9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAotICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpLCBGaWx0ZXJGbGFnKFRFU1RfRklMVEVSKV0pWzBdKQotCi0gIGlmIG5vdCBTSFVGRkxFRF9TSEFSREVEX1RFU1RTOgotICAgIFNIVUZGTEVEX1NIQVJERURfVEVTVFMuZXh0ZW5kKAotICAgICAgICBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoe1RPVEFMX1NIQVJEU19FTlZfVkFSOiAnMycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzEnfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pWzBdKQotCi0KLWNsYXNzIEdUZXN0U2h1ZmZsZVVuaXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgotICAiIiJUZXN0cyB0ZXN0IHNodWZmbGluZy4iIiIKLQotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgQ2FsY3VsYXRlVGVzdExpc3RzKCkKLQotICBkZWYgdGVzdFNodWZmbGVQcmVzZXJ2ZXNOdW1iZXJPZlRlc3RzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEFMTF9URVNUUyksIGxlbihTSFVGRkxFRF9BTExfVEVTVFMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEFDVElWRV9URVNUUyksIGxlbihTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEZJTFRFUkVEX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihTSEFSREVEX1RFU1RTKSwgbGVuKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZUNoYW5nZXNUZXN0T3JkZXIoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX0FMTF9URVNUUyAhPSBBTExfVEVTVFMsIFNIVUZGTEVEX0FMTF9URVNUUykKLSAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfQUNUSVZFX1RFU1RTICE9IEFDVElWRV9URVNUUywgU0hVRkZMRURfQUNUSVZFX1RFU1RTKQotICAgIHNlbGYuYXNzZXJ0XyhTSFVGRkxFRF9GSUxURVJFRF9URVNUUyAhPSBGSUxURVJFRF9URVNUUywKLSAgICAgICAgICAgICAgICAgU0hVRkZMRURfRklMVEVSRURfVEVTVFMpCi0gICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX1NIQVJERURfVEVTVFMgIT0gU0hBUkRFRF9URVNUUywKLSAgICAgICAgICAgICAgICAgU0hVRkZMRURfU0hBUkRFRF9URVNUUykKLQotICBkZWYgdGVzdFNodWZmbGVDaGFuZ2VzVGVzdENhc2VPcmRlcihzZWxmKToKLSAgICBzZWxmLmFzc2VydF8oR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FMTF9URVNUUykgIT0gR2V0VGVzdENhc2VzKEFMTF9URVNUUyksCi0gICAgICAgICAgICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9BTExfVEVTVFMpKQotICAgIHNlbGYuYXNzZXJ0XygKLSAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FDVElWRV9URVNUUykgIT0gR2V0VGVzdENhc2VzKEFDVElWRV9URVNUUyksCi0gICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpKQotICAgIHNlbGYuYXNzZXJ0XygKLSAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoRklMVEVSRURfVEVTVFMpLAotICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpKQotICAgIHNlbGYuYXNzZXJ0XygKLSAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpICE9IEdldFRlc3RDYXNlcyhTSEFSREVEX1RFU1RTKSwKLSAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RSZXBlYXRUZXN0KHNlbGYpOgotICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FMTF9URVNUUzoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgU0hVRkZMRURfQUxMX1RFU1RTLmNvdW50KHRlc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQotICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgU0hVRkZMRURfQUNUSVZFX1RFU1RTLmNvdW50KHRlc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQotICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9GSUxURVJFRF9URVNUUy5jb3VudCh0ZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgJyVzIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UnICUgKHRlc3QsKSkKLSAgICBmb3IgdGVzdCBpbiBTSFVGRkxFRF9TSEFSREVEX1RFU1RTOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9TSEFSREVEX1RFU1RTLmNvdW50KHRlc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RDcmVhdGVOZXdUZXN0KHNlbGYpOgotICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FMTF9URVNUUzoKLSAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIEFMTF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQotICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKLSAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIEFDVElWRV9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQotICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgotICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gRklMVEVSRURfVEVTVFMsICclcyBpcyBhbiBpbnZhbGlkIHRlc3QnICUgKHRlc3QsKSkKLSAgICBmb3IgdGVzdCBpbiBTSFVGRkxFRF9TSEFSREVEX1RFU1RTOgotICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hBUkRFRF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZUluY2x1ZGVzQWxsVGVzdHMoc2VsZik6Ci0gICAgZm9yIHRlc3QgaW4gQUxMX1RFU1RTOgotICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQotICAgIGZvciB0ZXN0IGluIEFDVElWRV9URVNUUzoKLSAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUywgJyVzIGlzIG1pc3NpbmcnICUgKHRlc3QsKSkKLSAgICBmb3IgdGVzdCBpbiBGSUxURVJFRF9URVNUUzoKLSAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQotICAgIGZvciB0ZXN0IGluIFNIQVJERURfVEVTVFM6Ci0gICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSFVGRkxFRF9TSEFSREVEX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZUxlYXZlc0RlYXRoVGVzdHNBdEZyb250KHNlbGYpOgotICAgIG5vbl9kZWF0aF90ZXN0X2ZvdW5kID0gRmFsc2UKLSAgICBmb3IgdGVzdCBpbiBTSFVGRkxFRF9BQ1RJVkVfVEVTVFM6Ci0gICAgICBpZiAnRGVhdGhUZXN0LicgaW4gdGVzdDoKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBub25fZGVhdGhfdGVzdF9mb3VuZCwKLSAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QnICUgKHRlc3QsKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIG5vbl9kZWF0aF90ZXN0X2ZvdW5kID0gVHJ1ZQotCi0gIGRlZiBfVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKHNlbGYsIHRlc3RzKToKLSAgICB0ZXN0X2Nhc2VzID0gW10KLSAgICBmb3IgdGVzdCBpbiB0ZXN0czoKLSAgICAgIFt0ZXN0X2Nhc2UsIF9dID0gdGVzdC5zcGxpdCgnLicpCi0gICAgICBpZiB0ZXN0X2Nhc2VzIGFuZCB0ZXN0X2Nhc2VzWy0xXSAhPSB0ZXN0X2Nhc2U6Ci0gICAgICAgIHRlc3RfY2FzZXMuYXBwZW5kKHRlc3RfY2FzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0ZXN0X2Nhc2VzLmNvdW50KHRlc3RfY2FzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgY2FzZSAlcyBpcyBub3QgZ3JvdXBlZCB0b2dldGhlciBpbiAlcycgJQotICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X2Nhc2UsIHRlc3RzKSkKLQotICBkZWYgdGVzdFNodWZmbGVEb2VzTm90SW50ZXJsZWF2ZVRlc3RDYXNlcyhzZWxmKToKLSAgICBzZWxmLl9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoU0hVRkZMRURfQUxMX1RFU1RTKQotICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpCi0gICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTKQotICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9TSEFSREVEX1RFU1RTKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZVJlc3RvcmVzT3JkZXJBZnRlckVhY2hJdGVyYXRpb24oc2VsZik6Ci0gICAgIyBHZXQgdGhlIHRlc3QgbGlzdHMgaW4gYWxsIDMgaXRlcmF0aW9ucywgdXNpbmcgcmFuZG9tIHNlZWQgMSwgMiwKLSAgICAjIGFuZCAzIHJlc3BlY3RpdmVseS4gIEdvb2dsZSBUZXN0IHBpY2tzIGEgZGlmZmVyZW50IHNlZWQgaW4gZWFjaAotICAgICMgaXRlcmF0aW9uLCBhbmQgdGhpcyB0ZXN0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLSAgICAjIHBpY2tpbmcgc3VjY2Vzc2l2ZSBudW1iZXJzLiAgVGhpcyBkZXBlbmRlbmN5IGlzIG5vdCBpZGVhbCwgYnV0Ci0gICAgIyBtYWtlcyB0aGUgdGVzdCBtdWNoIGVhc2llciB0byB3cml0ZS4KLSAgICBbdGVzdHNfaW5faXRlcmF0aW9uMSwgdGVzdHNfaW5faXRlcmF0aW9uMiwgdGVzdHNfaW5faXRlcmF0aW9uM10gPSAoCi0gICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKLSAgICAgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSksIFJlcGVhdEZsYWcoMyldKSkKLQotICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMSBnZXRzIHRoZSBzYW1lCi0gICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMSBhYm92ZS4KLSAgICBbdGVzdHNfd2l0aF9zZWVkMV0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCi0gICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHNfaW5faXRlcmF0aW9uMSwgdGVzdHNfd2l0aF9zZWVkMSkKLQotICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMiBnZXRzIHRoZSBzYW1lCi0gICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMiBhYm92ZS4gIFN1Y2Nlc3MgbWVhbnMgdGhhdCBHb29nbGUgVGVzdAotICAgICMgY29ycmVjdGx5IHJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIGJlZm9yZSByZS1zaHVmZmxpbmcgYXQgdGhlCi0gICAgIyBiZWdpbm5pbmcgb2YgaXRlcmF0aW9uIDIuCi0gICAgW3Rlc3RzX3dpdGhfc2VlZDJdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAotICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDIpXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RzX2luX2l0ZXJhdGlvbjIsIHRlc3RzX3dpdGhfc2VlZDIpCi0KLSAgICAjIE1ha2Ugc3VyZSBydW5uaW5nIHRoZSB0ZXN0cyB3aXRoIHJhbmRvbSBzZWVkIDMgZ2V0cyB0aGUgc2FtZQotICAgICMgb3JkZXIgYXMgaW4gaXRlcmF0aW9uIDMgYWJvdmUuICBTdWNjZXNzIG1lYW5zIHRoYXQgR29vZ2xlIFRlc3QKLSAgICAjIGNvcnJlY3RseSByZXN0b3JlcyB0aGUgdGVzdCBvcmRlciBiZWZvcmUgcmUtc2h1ZmZsaW5nIGF0IHRoZQotICAgICMgYmVnaW5uaW5nIG9mIGl0ZXJhdGlvbiAzLgotICAgIFt0ZXN0c193aXRoX3NlZWQzXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKLSAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygzKV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0c19pbl9pdGVyYXRpb24zLCB0ZXN0c193aXRoX3NlZWQzKQotCi0gIGRlZiB0ZXN0U2h1ZmZsZUdlbmVyYXRlc05ld09yZGVySW5FYWNoSXRlcmF0aW9uKHNlbGYpOgotICAgIFt0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c19pbl9pdGVyYXRpb24yLCB0ZXN0c19pbl9pdGVyYXRpb24zXSA9ICgKLSAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAotICAgICAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKSwgUmVwZWF0RmxhZygzKV0pKQotCi0gICAgc2VsZi5hc3NlcnRfKHRlc3RzX2luX2l0ZXJhdGlvbjEgIT0gdGVzdHNfaW5faXRlcmF0aW9uMiwKLSAgICAgICAgICAgICAgICAgdGVzdHNfaW5faXRlcmF0aW9uMSkKLSAgICBzZWxmLmFzc2VydF8odGVzdHNfaW5faXRlcmF0aW9uMSAhPSB0ZXN0c19pbl9pdGVyYXRpb24zLAotICAgICAgICAgICAgICAgICB0ZXN0c19pbl9pdGVyYXRpb24xKQotICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0c19pbl9pdGVyYXRpb24yICE9IHRlc3RzX2luX2l0ZXJhdGlvbjMsCi0gICAgICAgICAgICAgICAgIHRlc3RzX2luX2l0ZXJhdGlvbjIpCi0KLSAgZGVmIHRlc3RTaHVmZmxlU2hhcmRlZFRlc3RzUHJlc2VydmVzUGFydGl0aW9uKHNlbGYpOgotICAgICMgSWYgd2UgcnVuIE0gdGVzdHMgb24gTiBzaGFyZHMsIHRoZSBzYW1lIE0gdGVzdHMgc2hvdWxkIGJlIHJ1biBpbgotICAgICMgdG90YWwsIHJlZ2FyZGxlc3Mgb2YgdGhlIHJhbmRvbSBzZWVkcyB1c2VkIGJ5IHRoZSBzaGFyZHMuCi0gICAgW3Rlc3RzMV0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoe1RPVEFMX1NIQVJEU19FTlZfVkFSOiAnMycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJEX0lOREVYX0VOVl9WQVI6ICcwJ30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSkKLSAgICBbdGVzdHMyXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzEnfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMjApXSkKLSAgICBbdGVzdHMzXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzInfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMjUpXSkKLSAgICBzb3J0ZWRfc2hhcmRlZF90ZXN0cyA9IHRlc3RzMSArIHRlc3RzMiArIHRlc3RzMwotICAgIHNvcnRlZF9zaGFyZGVkX3Rlc3RzLnNvcnQoKQotICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMgPSBbXQotICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMuZXh0ZW5kKEFDVElWRV9URVNUUykKLSAgICBzb3J0ZWRfYWN0aXZlX3Rlc3RzLnNvcnQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkX2FjdGl2ZV90ZXN0cywgc29ydGVkX3NoYXJkZWRfdGVzdHMpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc2h1ZmZsZV90ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI0NDFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFZlcmlmaWVzIHRoYXQgdGVzdCBzaHVmZmxpbmcgd29ya3MuCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi11c2luZyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXI7Ci11c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpNZXNzYWdlOwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3RJbmZvOwotdXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI7Ci0KLS8vIFRoZSB0ZXN0IG1ldGhvZHMgYXJlIGVtcHR5LCBhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHRoaXMgcHJvZ3JhbSBpcwotLy8gdG8gcHJpbnQgdGhlIHRlc3QgbmFtZXMgYmVmb3JlL2FmdGVyIHNodWZmbGluZy4KLQotY2xhc3MgQSA6IHB1YmxpYyBUZXN0IHt9OwotVEVTVF9GKEEsIEEpIHt9Ci1URVNUX0YoQSwgQikge30KLQotVEVTVChBRGVhdGhUZXN0LCBBKSB7fQotVEVTVChBRGVhdGhUZXN0LCBCKSB7fQotVEVTVChBRGVhdGhUZXN0LCBDKSB7fQotCi1URVNUKEIsIEEpIHt9Ci1URVNUKEIsIEIpIHt9Ci1URVNUKEIsIEMpIHt9Ci1URVNUKEIsIERJU0FCTEVEX0QpIHt9Ci1URVNUKEIsIERJU0FCTEVEX0UpIHt9Ci0KLVRFU1QoQkRlYXRoVGVzdCwgQSkge30KLVRFU1QoQkRlYXRoVGVzdCwgQikge30KLQotVEVTVChDLCBBKSB7fQotVEVTVChDLCBCKSB7fQotVEVTVChDLCBDKSB7fQotVEVTVChDLCBESVNBQkxFRF9EKSB7fQotCi1URVNUKENEZWF0aFRlc3QsIEEpIHt9Ci0KLVRFU1QoRElTQUJMRURfRCwgQSkge30KLVRFU1QoRElTQUJMRURfRCwgRElTQUJMRURfQikge30KLQotLy8gVGhpcyBwcmludGVyIHByaW50cyB0aGUgZnVsbCB0ZXN0IG5hbWVzIG9ubHksIHN0YXJ0aW5nIGVhY2ggdGVzdAotLy8gaXRlcmF0aW9uIHdpdGggYSAiLS0tLSIgbWFya2VyLgotY2xhc3MgVGVzdE5hbWVQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogaXRlcmF0aW9uICovKSB7Ci0gICAgcHJpbnRmKCItLS0tXG4iKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gICAgcHJpbnRmKCIlcy4lc1xuIiwgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICAvLyBSZXBsYWNlcyB0aGUgZGVmYXVsdCBwcmludGVyIHdpdGggVGVzdE5hbWVQcmludGVyLCB3aGljaCBwcmludHMKLSAgLy8gdGhlIHRlc3QgbmFtZSBvbmx5LgotICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKLSAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOwotICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBUZXN0TmFtZVByaW50ZXIpOwotCi0gIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2QwOTFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKLS8vCi0vLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBHb29nbGUgVGVzdCBieSBpbmNsdWRpbmcKLS8vIHRoZSBndGVzdC5oIGhlYWRlciBmaWxlIGFsb25lLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHsKLQotdm9pZCBTdWJyb3V0aW5lKCkgewotICBFWFBFQ1RfRVEoNDIsIDQyKTsKLX0KLQotVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKDspOwotICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTVUNDRUVEKCkpOwotICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWJyb3V0aW5lKCkpOwotICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRSh7IFNVQ0NFRUQoKTsgfSk7Ci19Ci0KLVRFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZSkgewotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSg7KTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3Vicm91dGluZSgpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoeyBTVUNDRUVEKCk7IH0pOwotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkYWE0My4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0UoKSBhbmQgdmFyaW91cyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGNhbiBiZQotLy8gdXNlZCBpbiBhIGxhcmdlIG51bWJlciBvZiB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8vIFdlIG11c3QgZGVmaW5lIHRoaXMgbWFjcm8gaW4gb3JkZXIgdG8gI2luY2x1ZGUKLS8vIGd0ZXN0LWludGVybmFsLWlubC5oLiAgVGhpcyBpcyBob3cgR29vZ2xlIFRlc3QgcHJldmVudHMgYSB1c2VyIGZyb20KLS8vIGFjY2lkZW50YWxseSBkZXBlbmRpbmcgb24gaXRzIGludGVybmFsIGltcGxlbWVudGF0aW9uLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIHsKLQotdXNpbmcgaW50ZXJuYWw6Ok5vdGlmaWNhdGlvbjsKLXVzaW5nIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJczsKLXVzaW5nIGludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07Ci11c2luZyBpbnRlcm5hbDo6c2NvcGVkX3B0cjsKLQotLy8gSW4gb3JkZXIgdG8gcnVuIHRlc3RzIGluIHRoaXMgZmlsZSwgZm9yIHBsYXRmb3JtcyB3aGVyZSBHb29nbGUgVGVzdCBpcwotLy8gdGhyZWFkIHNhZmUsIGltcGxlbWVudCBUaHJlYWRXaXRoUGFyYW0uIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaXRzIEFQSQotLy8gaW4gZ3Rlc3QtcG9ydC5oLCB3aGVyZSBpdCBpcyBkZWZpbmVkIGZvciBhbHJlYWR5IHN1cHBvcnRlZCBwbGF0Zm9ybXMuCi0KLS8vIEhvdyBtYW55IHRocmVhZHMgdG8gY3JlYXRlPwotY29uc3QgaW50IGtUaHJlYWRDb3VudCA9IDUwOwotCi1zdGQ6OnN0cmluZyBJZFRvS2V5KGludCBpZCwgY29uc3QgY2hhciogc3VmZml4KSB7Ci0gIE1lc3NhZ2Uga2V5OwotICBrZXkgPDwgImtleV8iIDw8IGlkIDw8ICJfIiA8PCBzdWZmaXg7Ci0gIHJldHVybiBrZXkuR2V0U3RyaW5nKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIElkVG9TdHJpbmcoaW50IGlkKSB7Ci0gIE1lc3NhZ2UgaWRfbWVzc2FnZTsKLSAgaWRfbWVzc2FnZSA8PCBpZDsKLSAgcmV0dXJuIGlkX21lc3NhZ2UuR2V0U3RyaW5nKCk7Ci19Ci0KLXZvaWQgRXhwZWN0S2V5QW5kVmFsdWVXZXJlUmVjb3JkZWRGb3JJZCgKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+JiBwcm9wZXJ0aWVzLAotICAgIGludCBpZCwgY29uc3QgY2hhciogc3VmZml4KSB7Ci0gIFRlc3RQcm9wZXJ0eUtleUlzIG1hdGNoZXNfa2V5KElkVG9LZXkoaWQsIHN1ZmZpeCkuY19zdHIoKSk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT46OmNvbnN0X2l0ZXJhdG9yIHByb3BlcnR5ID0KLSAgICAgIHN0ZDo6ZmluZF9pZihwcm9wZXJ0aWVzLmJlZ2luKCksIHByb3BlcnRpZXMuZW5kKCksIG1hdGNoZXNfa2V5KTsKLSAgQVNTRVJUX1RSVUUocHJvcGVydHkgIT0gcHJvcGVydGllcy5lbmQoKSkKLSAgICAgIDw8ICJleHBlY3RpbmcgIiA8PCBzdWZmaXggPDwgIiB2YWx1ZSBmb3IgaWQgIiA8PCBpZDsKLSAgRVhQRUNUX1NUUkVRKElkVG9TdHJpbmcoaWQpLmNfc3RyKCksIHByb3BlcnR5LT52YWx1ZSgpKTsKLX0KLQotLy8gQ2FsbHMgYSBsYXJnZSBudW1iZXIgb2YgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucywgd2hlcmUgZXhhY3RseSBvbmUgb2YgdGhlbQotLy8gd2lsbCBmYWlsLgotdm9pZCBNYW55QXNzZXJ0cyhpbnQgaWQpIHsKLSAgR1RFU1RfTE9HXyhJTkZPKSA8PCAiVGhyZWFkICMiIDw8IGlkIDw8ICIgcnVubmluZy4uLiI7Ci0KLSAgU0NPUEVEX1RSQUNFKE1lc3NhZ2UoKSA8PCAiVGhyZWFkICMiIDw8IGlkKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRDb3VudDsgaSsrKSB7Ci0gICAgU0NPUEVEX1RSQUNFKE1lc3NhZ2UoKSA8PCAiSXRlcmF0aW9uICMiIDw8IGkpOwotCi0gICAgLy8gQSBidW5jaCBvZiBhc3NlcnRpb25zIHRoYXQgc2hvdWxkIHN1Y2NlZWQuCi0gICAgRVhQRUNUX1RSVUUodHJ1ZSk7Ci0gICAgQVNTRVJUX0ZBTFNFKGZhbHNlKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOwotICAgIEVYUEVDVF9TVFJFUSgiYSIsICJhIik7Ci0gICAgQVNTRVJUX0xFKDUsIDYpOwotICAgIEVYUEVDVF9FUShpLCBpKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOwotCi0gICAgLy8gUmVjb3JkUHJvcGVydHkoKSBzaG91bGQgaW50ZXJhY3Qgc2FmZWx5IHdpdGggb3RoZXIgdGhyZWFkcyBhcyB3ZWxsLgotICAgIC8vIFRoZSBzaGFyZWRfa2V5IGZvcmNlcyBwcm9wZXJ0eSB1cGRhdGVzLgotICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KElkVG9LZXkoaWQsICJzdHJpbmciKS5jX3N0cigpLCBJZFRvU3RyaW5nKGlkKS5jX3N0cigpKTsKLSAgICBUZXN0OjpSZWNvcmRQcm9wZXJ0eShJZFRvS2V5KGlkLCAiaW50IikuY19zdHIoKSwgaWQpOwotICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KCJzaGFyZWRfa2V5IiwgSWRUb1N0cmluZyhpZCkuY19zdHIoKSk7Ci0KLSAgICAvLyBUaGlzIGFzc2VydGlvbiBzaG91bGQgZmFpbCBrVGhyZWFkQ291bnQgdGltZXMgcGVyIHRocmVhZC4gIEl0Ci0gICAgLy8gaXMgZm9yIHRlc3Rpbmcgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gaGFuZGxlIGZhaWxlZCBhc3NlcnRpb25zIGluIGEKLSAgICAvLyBtdWx0aS10aHJlYWRlZCBjb250ZXh0LgotICAgIEVYUEVDVF9MVChpLCAwKSA8PCAiVGhpcyBzaG91bGQgYWx3YXlzIGZhaWwuIjsKLSAgfQotfQotCi12b2lkIENoZWNrVGVzdEZhaWx1cmVDb3VudChpbnQgZXhwZWN0ZWRfZmFpbHVyZXMpIHsKLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgY29uc3QgVGVzdFJlc3VsdCogY29uc3QgcmVzdWx0ID0gaW5mby0+cmVzdWx0KCk7Ci0gIEdURVNUX0NIRUNLXyhleHBlY3RlZF9mYWlsdXJlcyA9PSByZXN1bHQtPnRvdGFsX3BhcnRfY291bnQoKSkKLSAgICAgIDw8ICJMb2dnZWQgIiA8PCByZXN1bHQtPnRvdGFsX3BhcnRfY291bnQoKSA8PCAiIGZhaWx1cmVzICIKLSAgICAgIDw8ICIgdnMuICIgPDwgZXhwZWN0ZWRfZmFpbHVyZXMgPDwgIiBleHBlY3RlZCI7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFNDT1BFRF9UUkFDRSgpIGFuZCBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluIG1hbnkgdGhyZWFkcwotLy8gY29uY3VycmVudGx5LgotVEVTVChTdHJlc3NUZXN0LCBDYW5Vc2VTY29wZWRUcmFjZUFuZEFzc2VydGlvbnNJbk1hbnlUaHJlYWRzKSB7Ci0gIHsKLSAgICBzY29wZWRfcHRyPFRocmVhZFdpdGhQYXJhbTxpbnQ+ID4gdGhyZWFkc1trVGhyZWFkQ291bnRdOwotICAgIE5vdGlmaWNhdGlvbiB0aHJlYWRzX2Nhbl9zdGFydDsKLSAgICBmb3IgKGludCBpID0gMDsgaSAhPSBrVGhyZWFkQ291bnQ7IGkrKykKLSAgICAgIHRocmVhZHNbaV0ucmVzZXQobmV3IFRocmVhZFdpdGhQYXJhbTxpbnQ+KCZNYW55QXNzZXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkc19jYW5fc3RhcnQpKTsKLQotICAgIHRocmVhZHNfY2FuX3N0YXJ0Lk5vdGlmeSgpOwotCi0gICAgLy8gQmxvY2tzIHVudGlsIGFsbCB0aGUgdGhyZWFkcyBhcmUgZG9uZS4KLSAgICBmb3IgKGludCBpID0gMDsgaSAhPSBrVGhyZWFkQ291bnQ7IGkrKykKLSAgICAgIHRocmVhZHNbaV0tPkpvaW4oKTsKLSAgfQotCi0gIC8vIEVuc3VyZXMgdGhhdCBrVGhyZWFkQ291bnQqa1RocmVhZENvdW50IGZhaWx1cmVzIGhhdmUgYmVlbiByZXBvcnRlZC4KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgY29uc3QgVGVzdFJlc3VsdCogY29uc3QgcmVzdWx0ID0gaW5mby0+cmVzdWx0KCk7Ci0KLSAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotICAvLyBXZSBoYXZlIG5vIGFjY2VzcyB0byB0aGUgVGVzdFJlc3VsdCdzIGxpc3Qgb2YgcHJvcGVydGllcyBidXQgd2UgY2FuCi0gIC8vIGNvcHkgdGhlbSBvbmUgYnkgb25lLgotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+dGVzdF9wcm9wZXJ0eV9jb3VudCgpOyArK2kpCi0gICAgcHJvcGVydGllcy5wdXNoX2JhY2socmVzdWx0LT5HZXRUZXN0UHJvcGVydHkoaSkpOwotCi0gIEVYUEVDVF9FUShrVGhyZWFkQ291bnQgKiAyICsgMSwgcmVzdWx0LT50ZXN0X3Byb3BlcnR5X2NvdW50KCkpCi0gICAgICA8PCAiU3RyaW5nIGFuZCBpbnQgdmFsdWVzIHJlY29yZGVkIG9uIGVhY2ggdGhyZWFkLCAiCi0gICAgICA8PCAiYXMgd2VsbCBhcyBvbmUgc2hhcmVkX2tleSI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyArK2kpIHsKLSAgICBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKHByb3BlcnRpZXMsIGksICJzdHJpbmciKTsKLSAgICBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKHByb3BlcnRpZXMsIGksICJpbnQiKTsKLSAgfQotICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoa1RocmVhZENvdW50KmtUaHJlYWRDb3VudCk7Ci19Ci0KLXZvaWQgRmFpbGluZ1RocmVhZChib29sIGlzX2ZhdGFsKSB7Ci0gIGlmIChpc19mYXRhbCkKLSAgICBGQUlMKCkgPDwgIkZhdGFsIGZhaWx1cmUgaW4gc29tZSBvdGhlciB0aHJlYWQuICIKLSAgICAgICAgICAgPDwgIihUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuKSI7Ci0gIGVsc2UKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJOb24tZmF0YWwgZmFpbHVyZSBpbiBzb21lIG90aGVyIHRocmVhZC4gIgotICAgICAgICAgICAgICAgICAgPDwgIihUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuKSI7Ci19Ci0KLXZvaWQgR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoYm9vbCBpc19mYXRhbCkgewotICBUaHJlYWRXaXRoUGFyYW08Ym9vbD4gdGhyZWFkKCZGYWlsaW5nVGhyZWFkLCBpc19mYXRhbCwgTlVMTCk7Ci0gIHRocmVhZC5Kb2luKCk7Ci19Ci0KLVRFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7Ci0gIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpKTsKLSAgLy8gV2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZmFpbHVyZSAodGhlIG9uZSBmcm9tCi0gIC8vIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKCkpLCBzaW5jZSB0aGUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUKLSAgLy8gc2hvdWxkIHN1Y2NlZWQuCi0gIENoZWNrVGVzdEZhaWx1cmVDb3VudCgxKTsKLX0KLQotdm9pZCBBc3NlcnROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKCkgewotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZCh0cnVlKSk7Ci19Ci1URVNUKE5vRmF0YWxGYWlsdXJlVGVzdCwgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgewotICAvLyBVc2luZyBhIHN1YnJvdXRpbmUsIHRvIG1ha2Ugc3VyZSwgdGhhdCB0aGUgdGVzdCBjb250aW51ZXMuCi0gIEFzc2VydE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMoKTsKLSAgLy8gV2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZmFpbHVyZSAodGhlIG9uZSBmcm9tCi0gIC8vIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKCkpLCBzaW5jZSB0aGUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUKLSAgLy8gc2hvdWxkIHN1Y2NlZWQuCi0gIENoZWNrVGVzdEZhaWx1cmVDb3VudCgxKTsKLX0KLQotVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3RGYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgewotICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgZmFpbCwgc2luY2UgdGhlIGN1cnJlbnQgdGhyZWFkIGRvZXNuJ3QgZ2VuZXJhdGUgYQotICAvLyBmYXRhbCBmYWlsdXJlLCBvbmx5IGFub3RoZXIgb25lIGRvZXMuCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpLCAiZXhwZWN0ZWQiKTsKLSAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDIpOwotfQotCi1URVNUKEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgewotICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgc3VjY2VlZCwgYmVjYXVzZSBmYWlsdXJlcyBpbiBhbGwgdGhyZWFkcyBhcmUKLSAgLy8gY29uc2lkZXJlZC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoCi0gICAgICBHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZCh0cnVlKSwgImV4cGVjdGVkIik7Ci0gIENoZWNrVGVzdEZhaWx1cmVDb3VudCgwKTsKLSAgLy8gV2UgbmVlZCB0byBhZGQgYSBmYWlsdXJlLCBiZWNhdXNlIG1haW4oKSBjaGVja3MgdGhhdCB0aGVyZSBhcmUgZmFpbHVyZXMuCi0gIC8vIEJ1dCB3aGVuIG9ubHkgdGhpcyB0ZXN0IGlzIHJ1biwgd2Ugc2hvdWxkbid0IGhhdmUgYW55IGZhaWx1cmVzLgotICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGlzIGFuIGV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Ci19Ci0KLVRFU1QoTm9uRmF0YWxGYWlsdXJlVGVzdCwgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMpIHsKLSAgLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIGZhaWwsIHNpbmNlIHRoZSBjdXJyZW50IHRocmVhZCBkb2Vzbid0IGdlbmVyYXRlIGEKLSAgLy8gZmF0YWwgZmFpbHVyZSwgb25seSBhbm90aGVyIG9uZSBkb2VzLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZChmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCIpOwotICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoMik7Ci19Ci0KLVRFU1QoTm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzVGVzdCwgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7Ci0gIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBzdWNjZWVkLCBiZWNhdXNlIGZhaWx1cmVzIGluIGFsbCB0aHJlYWRzIGFyZQotICAvLyBjb25zaWRlcmVkLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUygKLSAgICAgIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKGZhbHNlKSwgImV4cGVjdGVkIik7Ci0gIENoZWNrVGVzdEZhaWx1cmVDb3VudCgwKTsKLSAgLy8gV2UgbmVlZCB0byBhZGQgYSBmYWlsdXJlLCBiZWNhdXNlIG1haW4oKSBjaGVja3MgdGhhdCB0aGVyZSBhcmUgZmFpbHVyZXMsCi0gIC8vIEJ1dCB3aGVuIG9ubHkgdGhpcyB0ZXN0IGlzIHJ1biwgd2Ugc2hvdWxkbid0IGhhdmUgYW55IGZhaWx1cmVzLgotICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGlzIGFuIGV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICBjb25zdCBpbnQgcmVzdWx0ID0gUlVOX0FMTF9URVNUUygpOyAgLy8gRXhwZWN0ZWQgdG8gZmFpbC4KLSAgR1RFU1RfQ0hFQ0tfKHJlc3VsdCA9PSAxKSA8PCAiUlVOX0FMTF9URVNUUygpIGRpZCBub3QgZmFpbCBhcyBleHBlY3RlZCI7Ci0KLSAgcHJpbnRmKCJcblBBU1NcbiIpOwotICByZXR1cm4gMDsKLX0KLQotI2Vsc2UKLVRFU1QoU3RyZXNzVGVzdCwKLSAgICAgRElTQUJMRURfVGhyZWFkU2FmZXR5VGVzdHNBcmVTa2lwcGVkV2hlbkdvb2dsZVRlc3RJc05vdFRocmVhZFNhZmUpIHsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Rlc3RfdXRpbHMucHkgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UzY2JjYS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJVbml0IHRlc3QgdXRpbGl0aWVzIGZvciBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLiIiIgotCi1fX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJwotCi1pbXBvcnQgYXRleGl0Ci1pbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzeXMKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHVuaXR0ZXN0Ci1fdGVzdF9tb2R1bGUgPSB1bml0dGVzdAotCi0jIFN1cHByZXNzZXMgdGhlICdJbXBvcnQgbm90IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUnIGxpbnQgY29tcGxhaW50LgotIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2MjA0Ci10cnk6Ci0gIGltcG9ydCBzdWJwcm9jZXNzCi0gIF9TVUJQUk9DRVNTX01PRFVMRV9BVkFJTEFCTEUgPSBUcnVlCi1leGNlcHQ6Ci0gIGltcG9ydCBwb3BlbjIKLSAgX1NVQlBST0NFU1NfTU9EVUxFX0FWQUlMQUJMRSA9IEZhbHNlCi0jIHB5bGludDogZW5hYmxlLW1zZz1DNjIwNAotCi1HVEVTVF9PVVRQVVRfVkFSX05BTUUgPSAnR1RFU1RfT1VUUFVUJwotCi1JU19XSU5ET1dTID0gb3MubmFtZSA9PSAnbnQnCi1JU19DWUdXSU4gPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kICdDWUdXSU4nIGluIG9zLnVuYW1lKClbMF0KLQotIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHNwZWNpZnlpbmcgdGhlIHBhdGggdG8gdGhlIHByZW1hdHVyZS1leGl0IGZpbGUuCi1QUkVNQVRVUkVfRVhJVF9GSUxFX0VOVl9WQVIgPSAnVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFJwotCi1lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKLQotCi1kZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKLSAgIiIiU2V0cy91bnNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSBnaXZlbiB2YWx1ZS4iIiIKLQotICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICBlbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKLSAgZWxpZiBlbnZfdmFyIGluIGVudmlyb246Ci0gICAgZGVsIGVudmlyb25bZW52X3Zhcl0KLQotCi0jIEhlcmUgd2UgZXhwb3NlIGEgY2xhc3MgZnJvbSBhIHBhcnRpY3VsYXIgbW9kdWxlLCBkZXBlbmRpbmcgb24gdGhlCi0jIGVudmlyb25tZW50LiBUaGUgY29tbWVudCBzdXBwcmVzc2VzIHRoZSAnSW52YWxpZCB2YXJpYWJsZSBuYW1lJyBsaW50Ci0jIGNvbXBsYWludC4KLVRlc3RDYXNlID0gX3Rlc3RfbW9kdWxlLlRlc3RDYXNlICAjIHB5bGludDogZGlzYWJsZS1tc2c9QzY0MDkKLQotIyBJbml0aWFsbHkgbWFwcyBhIGZsYWcgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIEFmdGVyCi0jIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGlzIGNhbGxlZCwgbWFwcyBhIGZsYWcgdG8gaXRzIGFjdHVhbCB2YWx1ZS4KLV9mbGFnX21hcCA9IHsnc291cmNlX2Rpcic6IG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksCi0gICAgICAgICAgICAgJ2J1aWxkX2Rpcic6IG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSl9Ci1fZ3Rlc3RfZmxhZ3NfYXJlX3BhcnNlZCA9IEZhbHNlCi0KLQotZGVmIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncyhhcmd2KToKLSAgIiIiUGFyc2VzIGFuZCBzdHJpcHMgR29vZ2xlIFRlc3QgZmxhZ3MgZnJvbSBhcmd2LiAgVGhpcyBpcyBpZGVtcG90ZW50LiIiIgotCi0gICMgU3VwcHJlc3NlcyB0aGUgbGludCBjb21wbGFpbnQgYWJvdXQgYSBnbG9iYWwgdmFyaWFibGUgc2luY2Ugd2UgbmVlZCBpdAotICAjIGhlcmUgdG8gbWFpbnRhaW4gbW9kdWxlLXdpZGUgc3RhdGUuCi0gIGdsb2JhbCBfZ3Rlc3RfZmxhZ3NfYXJlX3BhcnNlZCAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPVcwNjAzCi0gIGlmIF9ndGVzdF9mbGFnc19hcmVfcGFyc2VkOgotICAgIHJldHVybgotCi0gIF9ndGVzdF9mbGFnc19hcmVfcGFyc2VkID0gVHJ1ZQotICBmb3IgZmxhZyBpbiBfZmxhZ19tYXA6Ci0gICAgIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIGlmIGZsYWcudXBwZXIoKSBpbiBvcy5lbnZpcm9uOgotICAgICAgX2ZsYWdfbWFwW2ZsYWddID0gb3MuZW52aXJvbltmbGFnLnVwcGVyKCldCi0KLSAgICAjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBvdmVycmlkZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgIGkgPSAxICAjIFNraXBzIHRoZSBwcm9ncmFtIG5hbWUuCi0gICAgd2hpbGUgaSA8IGxlbihhcmd2KToKLSAgICAgIHByZWZpeCA9ICctLScgKyBmbGFnICsgJz0nCi0gICAgICBpZiBhcmd2W2ldLnN0YXJ0c3dpdGgocHJlZml4KToKLSAgICAgICAgX2ZsYWdfbWFwW2ZsYWddID0gYXJndltpXVtsZW4ocHJlZml4KTpdCi0gICAgICAgIGRlbCBhcmd2W2ldCi0gICAgICAgIGJyZWFrCi0gICAgICBlbHNlOgotICAgICAgICAjIFdlIGRvbid0IGluY3JlbWVudCBpIGluIGNhc2Ugd2UganVzdCBmb3VuZCBhIC0tZ3Rlc3RfKiBmbGFnCi0gICAgICAgICMgYW5kIHJlbW92ZWQgaXQgZnJvbSBhcmd2LgotICAgICAgICBpICs9IDEKLQotCi1kZWYgR2V0RmxhZyhmbGFnKToKLSAgIiIiUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZsYWcuIiIiCi0KLSAgIyBJbiBjYXNlIEdldEZsYWcoKSBpcyBjYWxsZWQgYmVmb3JlIE1haW4oKSwgd2UgYWx3YXlzIGNhbGwKLSAgIyBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3MoKSBoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgLS1ndGVzdF8qIGZsYWdzCi0gICMgYXJlIHBhcnNlZC4KLSAgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKHN5cy5hcmd2KQotCi0gIHJldHVybiBfZmxhZ19tYXBbZmxhZ10KLQotCi1kZWYgR2V0U291cmNlRGlyKCk6Ci0gICIiIlJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgLnB5IGZpbGVzIGFyZS4iIiIKLQotICByZXR1cm4gb3MucGF0aC5hYnNwYXRoKEdldEZsYWcoJ3NvdXJjZV9kaXInKSkKLQotCi1kZWYgR2V0QnVpbGREaXIoKToKLSAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSB0ZXN0IGJpbmFyaWVzIGFyZS4iIiIKLQotICByZXR1cm4gb3MucGF0aC5hYnNwYXRoKEdldEZsYWcoJ2J1aWxkX2RpcicpKQotCi0KLV90ZW1wX2RpciA9IE5vbmUKLQotZGVmIF9SZW1vdmVUZW1wRGlyKCk6Ci0gIGlmIF90ZW1wX2RpcjoKLSAgICBzaHV0aWwucm10cmVlKF90ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQotCi1hdGV4aXQucmVnaXN0ZXIoX1JlbW92ZVRlbXBEaXIpCi0KLQotZGVmIEdldFRlbXBEaXIoKToKLSAgIiIiUmV0dXJucyBhIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IGZpbGVzLiIiIgotCi0gIGdsb2JhbCBfdGVtcF9kaXIKLSAgaWYgbm90IF90ZW1wX2RpcjoKLSAgICBfdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKLSAgcmV0dXJuIF90ZW1wX2RpcgotCi0KLWRlZiBHZXRUZXN0RXhlY3V0YWJsZVBhdGgoZXhlY3V0YWJsZV9uYW1lLCBidWlsZF9kaXI9Tm9uZSk6Ci0gICIiIlJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRlc3QgYmluYXJ5IGdpdmVuIGl0cyBuYW1lLgotCi0gIFRoZSBmdW5jdGlvbiB3aWxsIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQgdGhlIHByb2dyYW0gaWYgdGhlIHJlc3VsdGluZyBmaWxlCi0gIGRvZXNuJ3QgZXhpc3QuCi0KLSAgQXJnczoKLSAgICBleGVjdXRhYmxlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgYmluYXJ5IHRoYXQgdGhlIHRlc3Qgc2NyaXB0IHJ1bnMuCi0gICAgYnVpbGRfZGlyOiAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gbG9vayBmb3IgZXhlY3V0YWJsZXMsIGJ5IGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgR2V0QnVpbGREaXIoKS4KLQotICBSZXR1cm5zOgotICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0ZXN0IGJpbmFyeS4KLSAgIiIiCi0KLSAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oYnVpbGRfZGlyIG9yIEdldEJ1aWxkRGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVfbmFtZSkpCi0gIGlmIChJU19XSU5ET1dTIG9yIElTX0NZR1dJTikgYW5kIG5vdCBwYXRoLmVuZHN3aXRoKCcuZXhlJyk6Ci0gICAgcGF0aCArPSAnLmV4ZScKLQotICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgbWVzc2FnZSA9ICgKLSAgICAgICAgJ1VuYWJsZSB0byBmaW5kIHRoZSB0ZXN0IGJpbmFyeSAiJXMiLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHByb3ZpZGVcbicKLSAgICAgICAgJ2EgcGF0aCB0byB0aGUgYmluYXJ5IHZpYSB0aGUgLS1idWlsZF9kaXIgZmxhZyBvciB0aGUgQlVJTERfRElSXG4nCi0gICAgICAgICdlbnZpcm9ubWVudCB2YXJpYWJsZS4nICUgcGF0aCkKLSAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtZXNzYWdlCi0gICAgc3lzLmV4aXQoMSkKLQotICByZXR1cm4gcGF0aAotCi0KLWRlZiBHZXRFeGl0U3RhdHVzKGV4aXRfY29kZSk6Ci0gICIiIlJldHVybnMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSwgb3IgLTEgaWYgZXhpdCgpIHdhc24ndCBjYWxsZWQuCi0KLSAgQXJnczoKLSAgICBleGl0X2NvZGU6IHRoZSByZXN1bHQgdmFsdWUgb2Ygb3Muc3lzdGVtKGNvbW1hbmQpLgotICAiIiIKLQotICBpZiBvcy5uYW1lID09ICdudCc6Ci0gICAgIyBPbiBXaW5kb3dzLCBvcy5XRVhJVFNUQVRVUygpIGRvZXNuJ3Qgd29yayBhbmQgb3Muc3lzdGVtKCkgcmV0dXJucwotICAgICMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSBkaXJlY3RseS4KLSAgICByZXR1cm4gZXhpdF9jb2RlCi0gIGVsc2U6Ci0gICAgIyBPbiBVbml4LCBvcy5XRVhJVFNUQVRVUygpIG11c3QgYmUgdXNlZCB0byBleHRyYWN0IHRoZSBleGl0IHN0YXR1cwotICAgICMgZnJvbSB0aGUgcmVzdWx0IG9mIG9zLnN5c3RlbSgpLgotICAgIGlmIG9zLldJRkVYSVRFRChleGl0X2NvZGUpOgotICAgICAgcmV0dXJuIG9zLldFWElUU1RBVFVTKGV4aXRfY29kZSkKLSAgICBlbHNlOgotICAgICAgcmV0dXJuIC0xCi0KLQotY2xhc3MgU3VicHJvY2VzczoKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIHdvcmtpbmdfZGlyPU5vbmUsIGNhcHR1cmVfc3RkZXJyPVRydWUsIGVudj1Ob25lKToKLSAgICAiIiJDaGFuZ2VzIGludG8gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBpZiBwcm92aWRlZCwgYW5kIGV4ZWN1dGVzIGEgY29tbWFuZC4KLQotICAgIFJlc3RvcmVzIHRoZSBvbGQgZGlyZWN0b3J5IGFmdGVyd2FyZHMuCi0KLSAgICBBcmdzOgotICAgICAgY29tbWFuZDogICAgICAgIFRoZSBjb21tYW5kIHRvIHJ1biwgaW4gdGhlIGZvcm0gb2Ygc3lzLmFyZ3YuCi0gICAgICB3b3JraW5nX2RpcjogICAgVGhlIGRpcmVjdG9yeSB0byBjaGFuZ2UgaW50by4KLSAgICAgIGNhcHR1cmVfc3RkZXJyOiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY2FwdHVyZSBzdGRlcnIgaW4gdGhlIG91dHB1dCBtZW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICBvciB0byBkaXNjYXJkIGl0LgotICAgICAgZW52OiAgICAgICAgICAgIERpY3Rpb25hcnkgd2l0aCBlbnZpcm9ubWVudCB0byBwYXNzIHRvIHRoZSBzdWJwcm9jZXNzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgb3V0Y29tZSBvZiB0aGUgZXhlY3V0ZWQgcHJvY2Vzcy4gSXQgaGFzIHRoZQotICAgICAgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0gICAgICAgIHRlcm1pbmF0ZWRfYnlfc2lnbmFsICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gdGVybWluYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGEgc2lnbmFsLgotICAgICAgICBzaWduYWwgICAgICAgICAgICAgICAgIFN5Z25hbCB0aGF0IHRlcm1pbmF0ZWQgdGhlIGNoaWxkIHByb2Nlc3MuCi0gICAgICAgIGV4aXRlZCAgICAgICAgICAgICAgICAgVHJ1ZSBpZmYgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkIG5vcm1hbGx5LgotICAgICAgICBleGl0X2NvZGUgICAgICAgICAgICAgIFRoZSBjb2RlIHdpdGggd2hpY2ggdGhlIGNoaWxkIHByb2Nlc3MgZXhpdGVkLgotICAgICAgICBvdXRwdXQgICAgICAgICAgICAgICAgIENoaWxkIHByb2Nlc3MncyBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCBpbiBhIHN0cmluZy4KLSAgICAiIiIKLQotICAgICMgVGhlIHN1YnByb2Nlc3MgbW9kdWxlIGlzIHRoZSBwcmVmZXJyYWJsZSB3YXkgb2YgcnVubmluZyBwcm9ncmFtcwotICAgICMgc2luY2UgaXQgaXMgYXZhaWxhYmxlIGFuZCBiZWhhdmVzIGNvbnNpc3RlbnRseSBvbiBhbGwgcGxhdGZvcm1zLAotICAgICMgaW5jbHVkaW5nIFdpbmRvd3MuIEJ1dCBpdCBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyBpbiBweXRob24gMi40LgotICAgICMgSW4gZWFybGllciBweXRob24gdmVyc2lvbnMsIHdlIHJldmVydCB0byB0aGUgcG9wZW4yIG1vZHVsZSwgd2hpY2ggaXMKLSAgICAjIGF2YWlsYWJsZSBpbiBweXRob24gMi4wIGFuZCBsYXRlciBidXQgZG9lc24ndCBwcm92aWRlIHJlcXVpcmVkCi0gICAgIyBmdW5jdGlvbmFsaXR5IChQb3BlbjQpIHVuZGVyIFdpbmRvd3MuIFRoaXMgYWxsb3dzIHVzIHRvIHN1cHBvcnQgTWFjCi0gICAgIyBPUyBYIDEwLjQgVGlnZXIsIHdoaWNoIGhhcyBweXRob24gMi4zIGluc3RhbGxlZC4KLSAgICBpZiBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFOgotICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6Ci0gICAgICAgIHN0ZGVyciA9IHN1YnByb2Nlc3MuU1RET1VUCi0gICAgICBlbHNlOgotICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlBJUEUKLQotICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9d29ya2luZ19kaXIsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLCBlbnY9ZW52KQotICAgICAgIyBjb21tdW5pY2F0ZSByZXR1cm5zIGEgdHVwbGUgd2l0aCB0aGUgZmlsZSBvYmVjdCBmb3IgdGhlIGNoaWxkJ3MKLSAgICAgICMgb3V0cHV0LgotICAgICAgc2VsZi5vdXRwdXQgPSBwLmNvbW11bmljYXRlKClbMF0KLSAgICAgIHNlbGYuX3JldHVybl9jb2RlID0gcC5yZXR1cm5jb2RlCi0gICAgZWxzZToKLSAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQotCi0gICAgICBkZWYgX1JlcGxhY2VFbnZEaWN0KGRlc3QsIHNyYyk6Ci0gICAgICAgICMgQ2hhbmdlcyBtYWRlIGJ5IG9zLmVudmlyb24uY2xlYXIgYXJlIG5vdCBpbmhlcml0YWJsZSBieSBjaGlsZAotICAgICAgICAjIHByb2Nlc3NlcyB1bnRpbCBQeXRob24gMi42LiBUbyBwcm9kdWNlIGluaGVyaXRhYmxlIGNoYW5nZXMgd2UgaGF2ZQotICAgICAgICAjIHRvIGRlbGV0ZSBlbnZpcm9ubWVudCBpdGVtcyB3aXRoIHRoZSBkZWwgc3RhdGVtZW50LgotICAgICAgICBmb3Iga2V5IGluIGRlc3Qua2V5cygpOgotICAgICAgICAgIGRlbCBkZXN0W2tleV0KLSAgICAgICAgZGVzdC51cGRhdGUoc3JjKQotCi0gICAgICAjIFdoZW4gJ2VudicgaXMgbm90IE5vbmUsIGJhY2t1cCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCByZXBsYWNlCi0gICAgICAjIHRoZW0gd2l0aCB0aGUgcGFzc2VkICdlbnYnLiBXaGVuICdlbnYnIGlzIE5vbmUsIHdlIHNpbXBseSB1c2UgdGhlCi0gICAgICAjIGN1cnJlbnQgJ29zLmVudmlyb24nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHN1YnByb2Nlc3MuUG9wZW4KLSAgICAgICMgc2VtYW50aWNzIHVzZWQgYWJvdmUuCi0gICAgICBpZiBlbnYgaXMgbm90IE5vbmU6Ci0gICAgICAgIG9sZF9lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKLSAgICAgICAgX1JlcGxhY2VFbnZEaWN0KG9zLmVudmlyb24sIGVudikKLQotICAgICAgdHJ5OgotICAgICAgICBpZiB3b3JraW5nX2RpciBpcyBub3QgTm9uZToKLSAgICAgICAgICBvcy5jaGRpcih3b3JraW5nX2RpcikKLSAgICAgICAgaWYgY2FwdHVyZV9zdGRlcnI6Ci0gICAgICAgICAgcCA9IHBvcGVuMi5Qb3BlbjQoY29tbWFuZCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBwID0gcG9wZW4yLlBvcGVuMyhjb21tYW5kKQotICAgICAgICBwLnRvY2hpbGQuY2xvc2UoKQotICAgICAgICBzZWxmLm91dHB1dCA9IHAuZnJvbWNoaWxkLnJlYWQoKQotICAgICAgICByZXRfY29kZSA9IHAud2FpdCgpCi0gICAgICBmaW5hbGx5OgotICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQotCi0gICAgICAgICMgUmVzdG9yZSB0aGUgb2xkIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAgICAjIGlmIHRoZXkgd2VyZSByZXBsYWNlZC4KLSAgICAgICAgaWYgZW52IGlzIG5vdCBOb25lOgotICAgICAgICAgIF9SZXBsYWNlRW52RGljdChvcy5lbnZpcm9uLCBvbGRfZW52aXJvbikKLQotICAgICAgIyBDb252ZXJ0cyByZXRfY29kZSB0byBtYXRjaCB0aGUgc2VtYW50aWNzIG9mCi0gICAgICAjIHN1YnByb2Nlc3MuUG9wZW4ucmV0dXJuY29kZS4KLSAgICAgIGlmIG9zLldJRlNJR05BTEVEKHJldF9jb2RlKToKLSAgICAgICAgc2VsZi5fcmV0dXJuX2NvZGUgPSAtb3MuV1RFUk1TSUcocmV0X2NvZGUpCi0gICAgICBlbHNlOiAgIyBvcy5XSUZFWElURUQocmV0X2NvZGUpIHNob3VsZCByZXR1cm4gVHJ1ZSBoZXJlLgotICAgICAgICBzZWxmLl9yZXR1cm5fY29kZSA9IG9zLldFWElUU1RBVFVTKHJldF9jb2RlKQotCi0gICAgaWYgc2VsZi5fcmV0dXJuX2NvZGUgPCAwOgotICAgICAgc2VsZi50ZXJtaW5hdGVkX2J5X3NpZ25hbCA9IFRydWUKLSAgICAgIHNlbGYuZXhpdGVkID0gRmFsc2UKLSAgICAgIHNlbGYuc2lnbmFsID0gLXNlbGYuX3JldHVybl9jb2RlCi0gICAgZWxzZToKLSAgICAgIHNlbGYudGVybWluYXRlZF9ieV9zaWduYWwgPSBGYWxzZQotICAgICAgc2VsZi5leGl0ZWQgPSBUcnVlCi0gICAgICBzZWxmLmV4aXRfY29kZSA9IHNlbGYuX3JldHVybl9jb2RlCi0KLQotZGVmIE1haW4oKToKLSAgIiIiUnVucyB0aGUgdW5pdCB0ZXN0LiIiIgotCi0gICMgV2UgbXVzdCBjYWxsIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncygpIGJlZm9yZSBjYWxsaW5nCi0gICMgdW5pdHRlc3QubWFpbigpLiAgT3RoZXJ3aXNlIHRoZSBsYXR0ZXIgd2lsbCBiZSBjb25mdXNlZCBieSB0aGUKLSAgIyAtLWd0ZXN0XyogZmxhZ3MuCi0gIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncyhzeXMuYXJndikKLSAgIyBUaGUgdGVzdGVkIGJpbmFyaWVzIHNob3VsZCBub3QgYmUgd3JpdGluZyBYTUwgb3V0cHV0IGZpbGVzIHVubGVzcyB0aGUKLSAgIyBzY3JpcHQgZXhwbGljaXRseSBpbnN0cnVjdHMgdGhlbSB0by4KLSAgIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBNb3ZlIHRoaXMgaW50byBTdWJwcm9jZXNzIHdoZW4gd2UgaW1wbGVtZW50Ci0gICMgcGFzc2luZyBlbnZpcm9ubWVudCBpbnRvIGl0IGFzIGEgcGFyYW1ldGVyLgotICBpZiBHVEVTVF9PVVRQVVRfVkFSX05BTUUgaW4gb3MuZW52aXJvbjoKLSAgICBkZWwgb3MuZW52aXJvbltHVEVTVF9PVVRQVVRfVkFSX05BTUVdCi0KLSAgX3Rlc3RfbW9kdWxlLm1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDZjNzYuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFRlc3RzIEdvb2dsZSBUZXN0J3MgdGhyb3ctb24tZmFpbHVyZSBtb2RlIHdpdGggZXhjZXB0aW9ucyBlbmFibGVkLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0vLyBQcmludHMgdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZSBhbmQgZXhpdHMgdGhlIHByb2dyYW0gd2l0aAotLy8gbm9uLXplcm8uICBXZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGEgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHRvCi0vLyBpbmRpY2F0ZSBhIGZhaWx1cmUsIGFzIHRoZSBsYXR0ZXIgaXMgYmVlbiB0ZXN0ZWQgYW5kIGNhbm5vdCBiZQotLy8gcmVsaWVkIG9uLgotdm9pZCBGYWlsKGNvbnN0IGNoYXIqIG1zZykgewotICBwcmludGYoIkZBSUxVUkU6ICVzXG4iLCBtc2cpOwotICBmZmx1c2goc3Rkb3V0KTsKLSAgZXhpdCgxKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhbiBhc3NlcnRpb24gZmFpbHVyZSB0aHJvd3MgYSBzdWJjbGFzcyBvZgotLy8gc3RkOjpydW50aW1lX2Vycm9yLgotdm9pZCBUZXN0RmFpbHVyZVRocm93c1J1bnRpbWVFcnJvcigpIHsKLSAgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7Ci0KLSAgLy8gQSBzdWNjZXNzZnVsIGFzc2VydGlvbiBzaG91bGRuJ3QgdGhyb3cuCi0gIHRyeSB7Ci0gICAgRVhQRUNUX0VRKDMsIDMpOwotICB9IGNhdGNoKC4uLikgewotICAgIEZhaWwoIkEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gd3JvbmdmdWxseSB0aHJldy4iKTsKLSAgfQotCi0gIC8vIEEgZmFpbGVkIGFzc2VydGlvbiBzaG91bGQgdGhyb3cgYSBzdWJjbGFzcyBvZiBzdGQ6OnJ1bnRpbWVfZXJyb3IuCi0gIHRyeSB7Ci0gICAgRVhQRUNUX0VRKDIsIDMpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKLSAgfSBjYXRjaChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpIHsKLSAgICBpZiAoc3Ryc3RyKGUud2hhdCgpLCAiRXhwZWN0ZWQgZmFpbHVyZSIpICE9IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgIkEgZmFpbGVkIGFzc2VydGlvbiBkaWQgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIHRoZSByaWdodCB0eXBlLCAiCi0gICAgICAgICAgICJidXQgdGhlIG1lc3NhZ2UgaXMgaW5jb3JyZWN0LiAgSW5zdGVhZCBvZiBjb250YWluaW5nIFwiRXhwZWN0ZWQgIgotICAgICAgICAgICAiZmFpbHVyZVwiLCBpdCBpczpcbiIpOwotICAgIEZhaWwoZS53aGF0KCkpOwotICB9IGNhdGNoKC4uLikgewotICAgIEZhaWwoIkEgZmFpbGVkIGFzc2VydGlvbiB0aHJldyB0aGUgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24uIik7Ci0gIH0KLSAgRmFpbCgiQSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCd2ZSB0aHJvd24gYnV0IGRpZG4ndC4iKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHBlb3BsZSBjYW4gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4KLSAgLy8gb3RoZXIgdGVzdGluZyBmcmFtZXdvcmtzLCBhcyBsb25nIGFzIHRoZXkgaW5pdGlhbGl6ZSBHb29nbGUgVGVzdAotICAvLyBwcm9wZXJseSBhbmQgc2V0IHRoZSB0aHJvd24tb24tZmFpbHVyZSBtb2RlLiAgVGhlcmVmb3JlLCB3ZSBkb24ndAotICAvLyB1c2UgR29vZ2xlIFRlc3QncyBjb25zdHJ1Y3RzIGZvciBkZWZpbmluZyBhbmQgcnVubmluZyB0ZXN0cwotICAvLyAoZS5nLiBURVNUIGFuZCBSVU5fQUxMX1RFU1RTKSBoZXJlLgotCi0gIFRlc3RGYWlsdXJlVGhyb3dzUnVudGltZUVycm9yKCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weSBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2NzhmZmUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0cyBHb29nbGUgVGVzdCdzIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCi0KLVRoaXMgc2NyaXB0IGludm9rZXMgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XyAoYSBwcm9ncmFtIHdyaXR0ZW4gd2l0aAotR29vZ2xlIFRlc3QpIHdpdGggZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgotIiIiCi0KLV9fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCi0KLWltcG9ydCBvcwotaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKLQotCi0jIENvbnN0YW50cy4KLQotIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlLgotVEhST1dfT05fRkFJTFVSRSA9ICdndGVzdF90aHJvd19vbl9mYWlsdXJlJwotCi0jIFBhdGggdG8gdGhlIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gcHJvZ3JhbSwgY29tcGlsZWQgd2l0aAotIyBleGNlcHRpb25zIGRpc2FibGVkLgotRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKLSAgICAnZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XycpCi0KLQotIyBVdGlsaXRpZXMuCi0KLQotZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6Ci0gICIiIlNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSBnaXZlbiB2YWx1ZTsgdW5zZXRzIGl0IHdoZW4gdGhlCi0gIGdpdmVuIHZhbHVlIGlzIE5vbmUuCi0gICIiIgotCi0gIGVudl92YXIgPSBlbnZfdmFyLnVwcGVyKCkKLSAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgb3MuZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCi0gIGVsaWYgZW52X3ZhciBpbiBvcy5lbnZpcm9uOgotICAgIGRlbCBvcy5lbnZpcm9uW2Vudl92YXJdCi0KLQotZGVmIFJ1bihjb21tYW5kKToKLSAgIiIiUnVucyBhIGNvbW1hbmQ7IHJldHVybnMgVHJ1ZS9GYWxzZSBpZiBpdHMgZXhpdCBjb2RlIGlzL2lzbid0IDAuIiIiCi0KLSAgcHJpbnQgJ1J1bm5pbmcgIiVzIi4gLiAuJyAlICcgJy5qb2luKGNvbW1hbmQpCi0gIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKLSAgcmV0dXJuIHAuZXhpdGVkIGFuZCBwLmV4aXRfY29kZSA9PSAwCi0KLQotIyBUaGUgdGVzdHMuICBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVmYWN0b3IgdGhlIGNsYXNzIHRvIHNoYXJlIGNvbW1vbgotIyBsb2dpYyB3aXRoIGNvZGUgaW4gZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weS4KLWNsYXNzIFRocm93T25GYWlsdXJlVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKLSAgIiIiVGVzdHMgdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZS4iIiIKLQotICBkZWYgUnVuQW5kVmVyaWZ5KHNlbGYsIGVudl92YXJfdmFsdWUsIGZsYWdfdmFsdWUsIHNob3VsZF9mYWlsKToKLSAgICAiIiJSdW5zIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8gYW5kIHZlcmlmaWVzIHRoYXQgaXQgZG9lcwotICAgIChvciBkb2VzIG5vdCkgZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KLQotICAgIEFyZ3M6Ci0gICAgICBlbnZfdmFyX3ZhbHVlOiAgICB2YWx1ZSBvZiB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU7IE5vbmUgaWYgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSB1bnNldC4KLSAgICAgIGZsYWdfdmFsdWU6ICAgICAgIHZhbHVlIG9mIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgaWYgdGhlIGZsYWcgc2hvdWxkIG5vdCBiZSBwcmVzZW50LgotICAgICAgc2hvdWxkX2ZhaWw6ICAgICAgVHJ1ZSBpZmYgdGhlIHByb2dyYW0gaXMgZXhwZWN0ZWQgdG8gZmFpbC4KLSAgICAiIiIKLQotICAgIFNldEVudlZhcihUSFJPV19PTl9GQUlMVVJFLCBlbnZfdmFyX3ZhbHVlKQotCi0gICAgaWYgZW52X3Zhcl92YWx1ZSBpcyBOb25lOgotICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnIGlzIG5vdCBzZXQnCi0gICAgZWxzZToKLSAgICAgIGVudl92YXJfdmFsdWVfbXNnID0gJz0nICsgZW52X3Zhcl92YWx1ZQotCi0gICAgaWYgZmxhZ192YWx1ZSBpcyBOb25lOgotICAgICAgZmxhZyA9ICcnCi0gICAgZWxpZiBmbGFnX3ZhbHVlID09ICcwJzoKLSAgICAgIGZsYWcgPSAnLS0lcz0wJyAlIFRIUk9XX09OX0ZBSUxVUkUKLSAgICBlbHNlOgotICAgICAgZmxhZyA9ICctLSVzJyAlIFRIUk9XX09OX0ZBSUxVUkUKLQotICAgIGNvbW1hbmQgPSBbRVhFX1BBVEhdCi0gICAgaWYgZmxhZzoKLSAgICAgIGNvbW1hbmQuYXBwZW5kKGZsYWcpCi0KLSAgICBpZiBzaG91bGRfZmFpbDoKLSAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkJwotICAgIGVsc2U6Ci0gICAgICBzaG91bGRfb3Jfbm90ID0gJ3Nob3VsZCBub3QnCi0KLSAgICBmYWlsZWQgPSBub3QgUnVuKGNvbW1hbmQpCi0KLSAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRSwgTm9uZSkKLQotICAgIG1zZyA9ICgnd2hlbiAlcyVzLCBhbiBhc3NlcnRpb24gZmFpbHVyZSBpbiAiJXMiICVzIGNhdXNlIGEgbm9uLXplcm8gJwotICAgICAgICAgICAnZXhpdCBjb2RlLicgJQotICAgICAgICAgICAoVEhST1dfT05fRkFJTFVSRSwgZW52X3Zhcl92YWx1ZV9tc2csICcgJy5qb2luKGNvbW1hbmQpLAotICAgICAgICAgICAgc2hvdWxkX29yX25vdCkpCi0gICAgc2VsZi5hc3NlcnRfKGZhaWxlZCA9PSBzaG91bGRfZmFpbCwgbXNnKQotCi0gIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBtb2RlLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLCBmbGFnX3ZhbHVlPU5vbmUsIHNob3VsZF9mYWlsPUZhbHNlKQotCi0gIGRlZiB0ZXN0VGhyb3dPbkZhaWx1cmVFbnZWYXIoc2VsZik6Ci0gICAgIiIiVGVzdHMgdXNpbmcgdGhlIEdURVNUX1RIUk9XX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUuIiIiCi0KLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPVRydWUpCi0KLSAgZGVmIHRlc3RUaHJvd09uRmFpbHVyZUZsYWcoc2VsZik6Ci0gICAgIiIiVGVzdHMgdXNpbmcgdGhlIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAotICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQotICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQotCi0gIGRlZiB0ZXN0VGhyb3dPbkZhaWx1cmVGbGFnT3ZlcnJpZGVzRW52VmFyKHNlbGYpOgotICAgICIiIlRlc3RzIHRoYXQgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlIG92ZXJyaWRlcyBHVEVTVF9USFJPV19PTl9GQUlMVVJFLiIiIgotCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCi0gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCi0gICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCi0gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKLSAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1GYWxzZSkKLSAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKLSAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg4ZmUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gVGVzdHMgR29vZ2xlIFRlc3QncyB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgotLy8KLS8vIFRoaXMgcHJvZ3JhbSBtdXN0IGJlIGNvbXBpbGVkIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4gIEl0IHdpbGwgYmUKLS8vIGludm9rZWQgYnkgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5LCBhbmQgaXMgZXhwZWN0ZWQgdG8gZXhpdAotLy8gd2l0aCBub24temVybyBpbiB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlIG9yIDAgb3RoZXJ3aXNlLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBmZmx1c2gsIGZwcmludGYsIE5VTEwsIGV0Yy4KLSNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhpdAotI2luY2x1ZGUgPGV4Y2VwdGlvbj4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBzZXRfdGVybWluYXRlCi0KLS8vIFRoaXMgdGVybWluYXRlIGhhbmRsZXIgYWJvcnRzIHRoZSBwcm9ncmFtIHVzaW5nIGV4aXQoKSByYXRoZXIgdGhhbiBhYm9ydCgpLgotLy8gVGhpcyBhdm9pZHMgc2hvd2luZyBwb3AtdXBzIG9uIFdpbmRvd3Mgc3lzdGVtcyBhbmQgY29yZSBkdW1wcyBvbiBVbml4LWxpa2UKLS8vIG9uZXMuCi12b2lkIFRlcm1pbmF0ZUhhbmRsZXIoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsICJVbmhhbmRsZWQgQysrIGV4Y2VwdGlvbiB0ZXJtaW5hdGluZyB0aGUgcHJvZ3JhbS4iKTsKLSAgZmZsdXNoKE5VTEwpOwotICBleGl0KDEpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICBzdGQ6OnNldF90ZXJtaW5hdGUoJlRlcm1pbmF0ZUhhbmRsZXIpOwotI2VuZGlmCi0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHBlb3BsZSBjYW4gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4KLSAgLy8gb3RoZXIgdGVzdGluZyBmcmFtZXdvcmtzLCBhcyBsb25nIGFzIHRoZXkgaW5pdGlhbGl6ZSBHb29nbGUgVGVzdAotICAvLyBwcm9wZXJseSBhbmQgc2V0IHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuICBUaGVyZWZvcmUsIHdlIGRvbid0Ci0gIC8vIHVzZSBHb29nbGUgVGVzdCdzIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIGFuZCBydW5uaW5nIHRlc3RzCi0gIC8vIChlLmcuIFRFU1QgYW5kIFJVTl9BTExfVEVTVFMpIGhlcmUuCi0KLSAgLy8gSW4gdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQsIHRoaXMKLSAgLy8gYXNzZXJ0aW9uIHdpbGwgY2F1c2UgdGhlIHByb2dyYW0gdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gY29kZS4KLSAgRVhQRUNUX0VRKDIsIDMpOwotCi0gIC8vIFdoZW4gbm90IGluIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUsIHRoZSBjb250cm9sIHdpbGwgcmVhY2gKLSAgLy8gaGVyZS4KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5IGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmFlNTdlZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCB3YXJucyB0aGUgdXNlciB3aGVuIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS4iIiIKLQotX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKLQotaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKLQotCi1DT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8nKQotCi0KLWRlZiBBc3NlcnQoY29uZGl0aW9uKToKLSAgaWYgbm90IGNvbmRpdGlvbjoKLSAgICByYWlzZSBBc3NlcnRpb25FcnJvcgotCi0KLWRlZiBBc3NlcnRFcShleHBlY3RlZCwgYWN0dWFsKToKLSAgaWYgZXhwZWN0ZWQgIT0gYWN0dWFsOgotICAgIHByaW50ICdFeHBlY3RlZDogJXMnICUgKGV4cGVjdGVkLCkKLSAgICBwcmludCAnICBBY3R1YWw6ICVzJyAlIChhY3R1YWwsKQotICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCi0KLQotZGVmIFRlc3RFeGl0Q29kZUFuZE91dHB1dChjb21tYW5kKToKLSAgIiIiUnVucyB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgdmVyaWZpZXMgaXRzIGV4aXQgY29kZSBhbmQgb3V0cHV0LiIiIgotCi0gICMgVmVyaWZpZXMgdGhhdCAnY29tbWFuZCcgZXhpdHMgd2l0aCBjb2RlIDEuCi0gIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKLSAgQXNzZXJ0KHAuZXhpdGVkKQotICBBc3NlcnRFcSgxLCBwLmV4aXRfY29kZSkKLSAgQXNzZXJ0KCdJbml0R29vZ2xlVGVzdCcgaW4gcC5vdXRwdXQpCi0KLQotY2xhc3MgR1Rlc3RVbmluaXRpYWxpemVkVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKLSAgZGVmIHRlc3RFeGl0Q29kZUFuZE91dHB1dChzZWxmKToKLSAgICBUZXN0RXhpdENvZGVBbmRPdXRwdXQoQ09NTUFORCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8uY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzMTY5OC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1URVNUKER1bW15VGVzdCwgRHVtbXkpIHsKLSAgLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgdmVyaWZ5IGFueXRoaW5nLiAgV2UganVzdCBuZWVkIGl0IHRvIGNyZWF0ZSBhCi0gIC8vIHJlYWxpc3RpYyBzdGFnZSBmb3IgdGVzdGluZyB0aGUgYmVoYXZpb3Igb2YgR29vZ2xlIFRlc3Qgd2hlbgotICAvLyBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkIHdpdGhvdXQgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKSBiZWluZwotICAvLyBjYWxsZWQgZmlyc3QuCi19Ci0KLWludCBtYWluKCkgewotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGFlZDM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDc2OTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBiYXNpYyBjb25zdHJ1Y3RzIG9mCi0vLyBHb29nbGUgVGVzdCB3b3JrLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29tbWFuZCBsaW5lIGZsYWcgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZAotLy8gaW4gY29kZSBvbmNlIDxndGVzdC9ndGVzdC5oPiBoYXMgYmVlbiAjaW5jbHVkZWQuCi0vLyBEbyBub3QgbW92ZSBpdCBhZnRlciBvdGhlciAjaW5jbHVkZXMuCi1URVNUKENvbW1hbmRMaW5lRmxhZ3NUZXN0LCBDYW5CZUFjY2Vzc2VkSW5Db2RlT25jZUdUZXN0SElzSW5jbHVkZWQpIHsKLSAgYm9vbCBkdW1teSA9IHRlc3Rpbmc6OkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpCi0gICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpCi0gICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpCi0gICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNvbG9yKSAhPSAidW5rbm93biIKLSAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSAhPSAidW5rbm93biIKLSAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcobGlzdF90ZXN0cykKLSAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KSAhPSAidW5rbm93biIKLSAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkKLSAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpCi0gICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCkgPiAwCi0gICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKQotICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKQotICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPiAwCi0gICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pICE9ICJ1bmtub3duIgotICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKLSAgRVhQRUNUX1RSVUUoZHVtbXkgfHwgIWR1bW15KTsgIC8vIFN1cHByZXNzZXMgd2FybmluZyB0aGF0IGR1bW15IGlzIHVudXNlZC4KLX0KLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gRm9yIElOVF9NQVguCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxvc3RyZWFtPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgotLy8gaGlzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotCi1jbGFzcyBTdHJlYW1pbmdMaXN0ZW5lclRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHVibGljOgotICBjbGFzcyBGYWtlU29ja2V0V3JpdGVyIDogcHVibGljIFN0cmVhbWluZ0xpc3RlbmVyOjpBYnN0cmFjdFNvY2tldFdyaXRlciB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KLSAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsgb3V0cHV0XyArPSBtZXNzYWdlOyB9Ci0KLSAgICBzdHJpbmcgb3V0cHV0XzsKLSAgfTsKLQotICBTdHJlYW1pbmdMaXN0ZW5lclRlc3QoKQotICAgICAgOiBmYWtlX3NvY2tfd3JpdGVyXyhuZXcgRmFrZVNvY2tldFdyaXRlciksCi0gICAgICAgIHN0cmVhbWVyXyhmYWtlX3NvY2tfd3JpdGVyXyksCi0gICAgICAgIHRlc3RfaW5mb19vYmpfKCJGb29UZXN0IiwgIkJhciIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCAwLCBOVUxMKSB7fQotCi0gcHJvdGVjdGVkOgotICBzdHJpbmcqIG91dHB1dCgpIHsgcmV0dXJuICYoZmFrZV9zb2NrX3dyaXRlcl8tPm91dHB1dF8pOyB9Ci0KLSAgRmFrZVNvY2tldFdyaXRlciogY29uc3QgZmFrZV9zb2NrX3dyaXRlcl87Ci0gIFN0cmVhbWluZ0xpc3RlbmVyIHN0cmVhbWVyXzsKLSAgVW5pdFRlc3QgdW5pdF90ZXN0XzsKLSAgVGVzdEluZm8gdGVzdF9pbmZvX29ial87ICAvLyBUaGUgbmFtZSB0ZXN0X2luZm9fIHdhcyB0YWtlbiBieSB0ZXN0aW5nOjpUZXN0LgotfTsKLQotVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0UHJvZ3JhbUVuZCkgewotICAqb3V0cHV0KCkgPSAiIjsKLSAgc3RyZWFtZXJfLk9uVGVzdFByb2dyYW1FbmQodW5pdF90ZXN0Xyk7Ci0gIEVYUEVDVF9FUSgiZXZlbnQ9VGVzdFByb2dyYW1FbmQmcGFzc2VkPTFcbiIsICpvdXRwdXQoKSk7Ci19Ci0KLVRFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdEl0ZXJhdGlvbkVuZCkgewotICAqb3V0cHV0KCkgPSAiIjsKLSAgc3RyZWFtZXJfLk9uVGVzdEl0ZXJhdGlvbkVuZCh1bml0X3Rlc3RfLCA0Mik7Ci0gIEVYUEVDVF9FUSgiZXZlbnQ9VGVzdEl0ZXJhdGlvbkVuZCZwYXNzZWQ9MSZlbGFwc2VkX3RpbWU9MG1zXG4iLCAqb3V0cHV0KCkpOwotfQotCi1URVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RDYXNlU3RhcnQpIHsKLSAgKm91dHB1dCgpID0gIiI7Ci0gIHN0cmVhbWVyXy5PblRlc3RDYXNlU3RhcnQoVGVzdENhc2UoIkZvb1Rlc3QiLCAiQmFyIiwgTlVMTCwgTlVMTCkpOwotICBFWFBFQ1RfRVEoImV2ZW50PVRlc3RDYXNlU3RhcnQmbmFtZT1Gb29UZXN0XG4iLCAqb3V0cHV0KCkpOwotfQotCi1URVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RDYXNlRW5kKSB7Ci0gICpvdXRwdXQoKSA9ICIiOwotICBzdHJlYW1lcl8uT25UZXN0Q2FzZUVuZChUZXN0Q2FzZSgiRm9vVGVzdCIsICJCYXIiLCBOVUxMLCBOVUxMKSk7Ci0gIEVYUEVDVF9FUSgiZXZlbnQ9VGVzdENhc2VFbmQmcGFzc2VkPTEmZWxhcHNlZF90aW1lPTBtc1xuIiwgKm91dHB1dCgpKTsKLX0KLQotVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0U3RhcnQpIHsKLSAgKm91dHB1dCgpID0gIiI7Ci0gIHN0cmVhbWVyXy5PblRlc3RTdGFydCh0ZXN0X2luZm9fb2JqXyk7Ci0gIEVYUEVDVF9FUSgiZXZlbnQ9VGVzdFN0YXJ0Jm5hbWU9QmFyXG4iLCAqb3V0cHV0KCkpOwotfQotCi1URVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RFbmQpIHsKLSAgKm91dHB1dCgpID0gIiI7Ci0gIHN0cmVhbWVyXy5PblRlc3RFbmQodGVzdF9pbmZvX29ial8pOwotICBFWFBFQ1RfRVEoImV2ZW50PVRlc3RFbmQmcGFzc2VkPTEmZWxhcHNlZF90aW1lPTBtc1xuIiwgKm91dHB1dCgpKTsKLX0KLQotVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0UGFydFJlc3VsdCkgewotICAqb3V0cHV0KCkgPSAiIjsKLSAgc3RyZWFtZXJfLk9uVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQoCi0gICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgImZvby5jYyIsIDQyLCAiZmFpbGVkPVxuJiUiKSk7Ci0KLSAgLy8gTWV0YSBjaGFyYWN0ZXJzIGluIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugc2hvdWxkIGJlIHByb3Blcmx5IGVzY2FwZWQuCi0gIEVYUEVDVF9FUSgKLSAgICAgICJldmVudD1UZXN0UGFydFJlc3VsdCZmaWxlPWZvby5jYyZsaW5lPTQyJm1lc3NhZ2U9ZmFpbGVkJTNEJTBBJTI2JTI1XG4iLAotICAgICAgKm91dHB1dCgpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0KLS8vIFByb3ZpZGVzIGFjY2VzcyB0byBvdGhlcndpc2UgcHJpdmF0ZSBwYXJ0cyBvZiB0aGUgVGVzdEV2ZW50TGlzdGVuZXJzIGNsYXNzCi0vLyB0aGF0IGFyZSBuZWVkZWQgdG8gdGVzdCBpdC4KLWNsYXNzIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBUZXN0RXZlbnRMaXN0ZW5lciogR2V0UmVwZWF0ZXIoVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMpIHsKLSAgICByZXR1cm4gbGlzdGVuZXJzLT5yZXBlYXRlcigpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgewotICAgIGxpc3RlbmVycy0+U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIobGlzdGVuZXIpOwotICB9Ci0gIHN0YXRpYyB2b2lkIFNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gICAgbGlzdGVuZXJzLT5TZXREZWZhdWx0WG1sR2VuZXJhdG9yKGxpc3RlbmVyKTsKLSAgfQotCi0gIHN0YXRpYyBib29sIEV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoY29uc3QgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMpIHsKLSAgICByZXR1cm4gbGlzdGVuZXJzLkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKSB7Ci0gICAgbGlzdGVuZXJzLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOwotICB9Ci19OwotCi1jbGFzcyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlciA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyKCkge30KLQotICAvLyBGb3J3YXJkcyB0byBVbml0VGVzdDo6UmVjb3JkUHJvcGVydHkoKSB0byBieXBhc3MgYWNjZXNzIGNvbnRyb2xzLgotICB2b2lkIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoY29uc3QgY2hhcioga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgICB1bml0X3Rlc3RfLlJlY29yZFByb3BlcnR5KGtleSwgdmFsdWUpOwotICB9Ci0KLSAgVW5pdFRlc3QgdW5pdF90ZXN0XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotdXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZTsKLXVzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdDsKLXVzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3M7Ci11c2luZyB0ZXN0aW5nOjpEb3VibGVMRTsKLXVzaW5nIHRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXI7Ci11c2luZyB0ZXN0aW5nOjpFbnZpcm9ubWVudDsKLXVzaW5nIHRlc3Rpbmc6OkZsb2F0TEU7Ci11c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7Ci11c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOwotdXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhjb2xvcik7Ci11c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOwotdXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhmaWx0ZXIpOwotdXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcob3V0cHV0KTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSk7Ci11c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMpOwotdXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzaHVmZmxlKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOwotdXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKLXVzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7Ci11c2luZyB0ZXN0aW5nOjpJc05vdFN1YnN0cmluZzsKLXVzaW5nIHRlc3Rpbmc6OklzU3Vic3RyaW5nOwotdXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKLXVzaW5nIHRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwotdXNpbmcgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwotdXNpbmcgdGVzdGluZzo6VGVzdDsKLXVzaW5nIHRlc3Rpbmc6OlRlc3RDYXNlOwotdXNpbmcgdGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwotdXNpbmcgdGVzdGluZzo6VGVzdEluZm87Ci11c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKLXVzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXk7Ci11c2luZyB0ZXN0aW5nOjpUZXN0UHJvcGVydHk7Ci11c2luZyB0ZXN0aW5nOjpUZXN0UmVzdWx0OwotdXNpbmcgdGVzdGluZzo6VGltZUluTWlsbGlzOwotdXNpbmcgdGVzdGluZzo6VW5pdFRlc3Q7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QWRkUmVmZXJlbmNlOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWU7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QXBwZW5kVXNlck1lc3NhZ2U7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QXJyYXlBd2FyZUZpbmQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6QXJyYXlFcTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb2RlUG9pbnRUb1V0Zjg7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydFR5cGVzRXF1YWw7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q29weUFycmF5OwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNvdW50SWY7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RXFGYWlsdXJlOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nUG9pbnQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9yRWFjaDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHM7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRFbGVtZW50T3I7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0TmV4dFJhbmRvbVNlZWQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0UmFuZG9tU2VlZEZyb21GbGFnOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFRlc3RUeXBlSWQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFR5cGVJZDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRVbml0VGVzdEltcGw7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyRnJvbUVudk9yRGllOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc0NvbnRhaW5lcjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc0NvbnRhaW5lclRlc3Q7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNOb3RDb250YWluZXI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UGFyc2VJbnQzMkZsYWc7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UmVsYXRpb25Ub1NvdXJjZUNvcHk7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVDb25zdDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVSZWZlcmVuY2U7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkUnVuVGVzdE9uU2hhcmQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkU2hhcmQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2hvdWxkVXNlQ29sb3I7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2h1ZmZsZTsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaHVmZmxlUmFuZ2U7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2tpcFByZWZpeDsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmc7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOwotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlRlc3RSZXN1bHRBY2Nlc3NvcjsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpVSW50MzI7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmODsKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjplZGl0X2Rpc3RhbmNlOjpDYWxjdWxhdGVPcHRpbWFsRWRpdHM7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6ZWRpdF9kaXN0YW5jZTo6Q3JlYXRlVW5pZmllZERpZmY7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6ZWRpdF9kaXN0YW5jZTo6RWRpdFR5cGU7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a01heFJhbmRvbVNlZWQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3Q7Ci11c2luZyB0ZXN0aW5nOjprTWF4U3RhY2tUcmFjZURlcHRoOwotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNhcHR1cmVTdGRvdXQ7Ci11c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q2FwdHVyZWRTdGRvdXQ7Ci0jZW5kaWYKLQotI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07Ci0jZW5kaWYKLQotY2xhc3MgVGVzdGluZ1ZlY3RvciA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxpbnQ+IHsKLX07Ci0KLTo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgewotICBvcyA8PCAieyAiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgewotICAgIG9zIDw8IHZlY3RvcltpXSA8PCAiICI7Ci0gIH0KLSAgb3MgPDwgIn0iOwotICByZXR1cm4gb3M7Ci19Ci0KLS8vIFRoaXMgbGluZSB0ZXN0cyB0aGF0IHdlIGNhbiBkZWZpbmUgdGVzdHMgaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2UuCi1uYW1lc3BhY2UgewotCi1URVNUKEdldFJhbmRvbVNlZWRGcm9tRmxhZ1Rlc3QsIEhhbmRsZXNaZXJvKSB7Ci0gIGNvbnN0IGludCBzZWVkID0gR2V0UmFuZG9tU2VlZEZyb21GbGFnKDApOwotICBFWFBFQ1RfTEUoMSwgc2VlZCk7Ci0gIEVYUEVDVF9MRShzZWVkLCBzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSk7Ci19Ci0KLVRFU1QoR2V0UmFuZG9tU2VlZEZyb21GbGFnVGVzdCwgUHJlc2VydmVzVmFsaWRTZWVkKSB7Ci0gIEVYUEVDVF9FUSgxLCBHZXRSYW5kb21TZWVkRnJvbUZsYWcoMSkpOwotICBFWFBFQ1RfRVEoMiwgR2V0UmFuZG9tU2VlZEZyb21GbGFnKDIpKTsKLSAgRVhQRUNUX0VRKGtNYXhSYW5kb21TZWVkIC0gMSwgR2V0UmFuZG9tU2VlZEZyb21GbGFnKGtNYXhSYW5kb21TZWVkIC0gMSkpOwotICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCksCi0gICAgICAgICAgICBHZXRSYW5kb21TZWVkRnJvbUZsYWcoa01heFJhbmRvbVNlZWQpKTsKLX0KLQotVEVTVChHZXRSYW5kb21TZWVkRnJvbUZsYWdUZXN0LCBOb3JtYWxpemVzSW52YWxpZFNlZWQpIHsKLSAgY29uc3QgaW50IHNlZWQxID0gR2V0UmFuZG9tU2VlZEZyb21GbGFnKC0xKTsKLSAgRVhQRUNUX0xFKDEsIHNlZWQxKTsKLSAgRVhQRUNUX0xFKHNlZWQxLCBzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSk7Ci0KLSAgY29uc3QgaW50IHNlZWQyID0gR2V0UmFuZG9tU2VlZEZyb21GbGFnKGtNYXhSYW5kb21TZWVkICsgMSk7Ci0gIEVYUEVDVF9MRSgxLCBzZWVkMik7Ci0gIEVYUEVDVF9MRShzZWVkMiwgc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCkpOwotfQotCi1URVNUKEdldE5leHRSYW5kb21TZWVkVGVzdCwgV29ya3NGb3JWYWxpZElucHV0KSB7Ci0gIEVYUEVDVF9FUSgyLCBHZXROZXh0UmFuZG9tU2VlZCgxKSk7Ci0gIEVYUEVDVF9FUSgzLCBHZXROZXh0UmFuZG9tU2VlZCgyKSk7Ci0gIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtNYXhSYW5kb21TZWVkKSwKLSAgICAgICAgICAgIEdldE5leHRSYW5kb21TZWVkKGtNYXhSYW5kb21TZWVkIC0gMSkpOwotICBFWFBFQ1RfRVEoMSwgR2V0TmV4dFJhbmRvbVNlZWQoa01heFJhbmRvbVNlZWQpKTsKLQotICAvLyBXZSBkZWxpYmVyYXRlbHkgZG9uJ3QgdGVzdCBHZXROZXh0UmFuZG9tU2VlZCgpIHdpdGggaW52YWxpZAotICAvLyBpbnB1dHMsIGFzIHRoYXQgcmVxdWlyZXMgZGVhdGggdGVzdHMsIHdoaWNoIGFyZSBleHBlbnNpdmUuICBUaGlzCi0gIC8vIGlzIGZpbmUgYXMgR2V0TmV4dFJhbmRvbVNlZWQoKSBpcyBpbnRlcm5hbCBhbmQgaGFzIGEKLSAgLy8gc3RyYWlnaHRmb3J3YXJkIGRlZmluaXRpb24uCi19Ci0KLXN0YXRpYyB2b2lkIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpIHsKLSAgVGVzdFJlc3VsdEFjY2Vzc29yOjpDbGVhclRlc3RQYXJ0UmVzdWx0cygKLSAgICAgIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCkpOwotfQotCi0vLyBUZXN0cyBHZXRUeXBlSWQuCi0KLVRFU1QoR2V0VHlwZUlkVGVzdCwgUmV0dXJuc1NhbWVWYWx1ZUZvclNhbWVUeXBlKSB7Ci0gIEVYUEVDVF9FUShHZXRUeXBlSWQ8aW50PigpLCBHZXRUeXBlSWQ8aW50PigpKTsKLSAgRVhQRUNUX0VRKEdldFR5cGVJZDxUZXN0PigpLCBHZXRUeXBlSWQ8VGVzdD4oKSk7Ci19Ci0KLWNsYXNzIFN1YkNsYXNzT2ZUZXN0IDogcHVibGljIFRlc3Qge307Ci1jbGFzcyBBbm90aGVyU3ViQ2xhc3NPZlRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKLQotVEVTVChHZXRUeXBlSWRUZXN0LCBSZXR1cm5zRGlmZmVyZW50VmFsdWVzRm9yRGlmZmVyZW50VHlwZXMpIHsKLSAgRVhQRUNUX05FKEdldFR5cGVJZDxpbnQ+KCksIEdldFR5cGVJZDxjb25zdCBpbnQ+KCkpOwotICBFWFBFQ1RfTkUoR2V0VHlwZUlkPGludD4oKSwgR2V0VHlwZUlkPGNoYXI+KCkpOwotICBFWFBFQ1RfTkUoR2V0VHlwZUlkPGludD4oKSwgR2V0VGVzdFR5cGVJZCgpKTsKLSAgRVhQRUNUX05FKEdldFR5cGVJZDxTdWJDbGFzc09mVGVzdD4oKSwgR2V0VGVzdFR5cGVJZCgpKTsKLSAgRVhQRUNUX05FKEdldFR5cGVJZDxBbm90aGVyU3ViQ2xhc3NPZlRlc3Q+KCksIEdldFRlc3RUeXBlSWQoKSk7Ci0gIEVYUEVDVF9ORShHZXRUeXBlSWQ8QW5vdGhlclN1YkNsYXNzT2ZUZXN0PigpLCBHZXRUeXBlSWQ8U3ViQ2xhc3NPZlRlc3Q+KCkpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IEdldFRlc3RUeXBlSWQoKSByZXR1cm5zIHRoZSBzYW1lIHZhbHVlLCBubyBtYXR0ZXIgaXQKLS8vIGlzIGNhbGxlZCBmcm9tIGluc2lkZSBHb29nbGUgVGVzdCBvciBvdXRzaWRlIG9mIGl0LgotVEVTVChHZXRUZXN0VHlwZUlkVGVzdCwgUmV0dXJuc1RoZVNhbWVWYWx1ZUluc2lkZU9yT3V0c2lkZU9mR29vZ2xlVGVzdCkgewotICBFWFBFQ1RfRVEoa1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3QsIEdldFRlc3RUeXBlSWQoKSk7Ci19Ci0KLS8vIFRlc3RzIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygpLgotCi1URVNUKEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kc1Rlc3QsIEZvcm1hdHNaZXJvKSB7Ci0gIEVYUEVDVF9FUSgiMCIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygwKSk7Ci19Ci0KLVRFU1QoRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzVGVzdCwgRm9ybWF0c1Bvc2l0aXZlTnVtYmVyKSB7Ci0gIEVYUEVDVF9FUSgiMC4wMDMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMykpOwotICBFWFBFQ1RfRVEoIjAuMDEiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMTApKTsKLSAgRVhQRUNUX0VRKCIwLjIiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMjAwKSk7Ci0gIEVYUEVDVF9FUSgiMS4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDEyMDApKTsKLSAgRVhQRUNUX0VRKCIzIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDMwMDApKTsKLX0KLQotVEVTVChGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHNUZXN0LCBGb3JtYXRzTmVnYXRpdmVOdW1iZXIpIHsKLSAgRVhQRUNUX0VRKCItMC4wMDMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTMpKTsKLSAgRVhQRUNUX0VRKCItMC4wMSIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMTApKTsKLSAgRVhQRUNUX0VRKCItMC4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0yMDApKTsKLSAgRVhQRUNUX0VRKCItMS4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0xMjAwKSk7Ci0gIEVYUEVDVF9FUSgiLTMiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTMwMDApKTsKLX0KLQotLy8gVGVzdHMgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoKS4gIFRoZSBjb3JyZWN0bmVzcyBvZiBjb252ZXJzaW9uCi0vLyBmb3IgcGFydGljdWxhciBkYXRlcyBiZWxvdyB3YXMgdmVyaWZpZWQgaW4gUHl0aG9uIHVzaW5nCi0vLyBkYXRldGltZS5kYXRldGltZS5mcm9tdXRjdGltZXN0YW1wKDx0aW1ldGFtcD4vMTAwMCkuCi0KLS8vIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdGltZXpvbmUsIHNvIHdlCi0vLyBoYXZlIHRvIHNldCB1cCBhIHBhcnRpY3VsYXIgdGltZXpvbmUgdG8gb2J0YWluIHByZWRpY3RhYmxlIHJlc3VsdHMuCi1jbGFzcyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHVibGljOgotICAvLyBPbiBDeWd3aW4sIEdDQyBkb2Vzbid0IGFsbG93IHVucXVhbGlmaWVkIGludGVnZXIgbGl0ZXJhbHMgdG8gZXhjZWVkCi0gIC8vIDMyIGJpdHMsIGV2ZW4gd2hlbiA2NC1iaXQgaW50ZWdlciB0eXBlcyBhcmUgYXZhaWxhYmxlLiAgV2UgaGF2ZSB0bwotICAvLyBmb3JjZSB0aGUgY29uc3RhbnRzIHRvIGhhdmUgYSA2NC1iaXQgdHlwZSBoZXJlLgotICBzdGF0aWMgY29uc3QgVGltZUluTWlsbGlzIGtNaWxsaXNQZXJTZWMgPSAxMDAwOwotCi0gcHJpdmF0ZToKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIHNhdmVkX3R6XyA9IE5VTEw7Ci0KLSAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2IC8qIGdldGVudiwgc3RyZHVwOiBkZXByZWNhdGVkICovKQotICAgIGlmIChnZXRlbnYoIlRaIikpCi0gICAgICBzYXZlZF90el8gPSBzdHJkdXAoZ2V0ZW52KCJUWiIpKTsKLSAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLQotICAgIC8vIFNldCB1cCB0aGUgdGltZSB6b25lIGZvciBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSB0byB1c2UuICBXZQotICAgIC8vIGNhbm5vdCB1c2UgdGhlIGxvY2FsIHRpbWUgem9uZSBiZWNhdXNlIHRoZSBmdW5jdGlvbidzIG91dHB1dCBkZXBlbmRzCi0gICAgLy8gb24gdGhlIHRpbWUgem9uZS4KLSAgICBTZXRUaW1lWm9uZSgiVVRDKzAwIik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgU2V0VGltZVpvbmUoc2F2ZWRfdHpfKTsKLSAgICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHNhdmVkX3R6XykpOwotICAgIHNhdmVkX3R6XyA9IE5VTEw7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBTZXRUaW1lWm9uZShjb25zdCBjaGFyKiB0aW1lX3pvbmUpIHsKLSAgICAvLyB0enNldCgpIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgVFogdmFyaWFibGUgYmVpbmcgcHJlc2VudCBhbmQgZW1wdHkKLSAgICAvLyBhbmQgbm90IGJlaW5nIHByZXNlbnQsIHNvIHdlIGhhdmUgdG8gY29uc2lkZXIgdGhlIGNhc2Ugb2YgdGltZV96b25lCi0gICAgLy8gYmVpbmcgTlVMTC4KLSNpZiBfTVNDX1ZFUgotICAgIC8vIC4uLlVubGVzcyBpdCdzIE1TVkMsIHdob3NlIHN0YW5kYXJkIGxpYnJhcnkncyBfcHV0ZW52IGRvZXNuJ3QKLSAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIGVtcHR5IGFuZCBhIG1pc3NpbmcgdmFyaWFibGUuCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9Ci0gICAgICAgIHN0ZDo6c3RyaW5nKCJUWj0iKSArICh0aW1lX3pvbmUgPyB0aW1lX3pvbmUgOiAiIik7Ci0gICAgX3B1dGVudihlbnZfdmFyLmNfc3RyKCkpOwotICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQ5OTYgLyogZGVwcmVjYXRlZCBmdW5jdGlvbiAqLykKLSAgICB0enNldCgpOwotICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotI2Vsc2UKLSAgICBpZiAodGltZV96b25lKSB7Ci0gICAgICBzZXRlbnYoKCJUWiIpLCB0aW1lX3pvbmUsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bnNldGVudigiVFoiKTsKLSAgICB9Ci0gICAgdHpzZXQoKTsKLSNlbmRpZgotICB9Ci0KLSAgY29uc3QgY2hhciogc2F2ZWRfdHpfOwotfTsKLQotY29uc3QgVGltZUluTWlsbGlzIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdDo6a01pbGxpc1BlclNlYzsKLQotVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzVHdvRGlnaXRTZWdtZW50cykgewotICBFWFBFQ1RfRVEoIjIwMTEtMTAtMzFUMTg6NTI6NDIiLAotICAgICAgICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMyMDA4NzE2MiAqIGtNaWxsaXNQZXJTZWMpKTsKLX0KLQotVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgTWlsbGlzZWNvbmRzRG9Ob3RBZmZlY3RSZXN1bHQpIHsKLSAgRVhQRUNUX0VRKAotICAgICAgIjIwMTEtMTAtMzFUMTg6NTI6NDIiLAotICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMyMDA4NzE2MiAqIGtNaWxsaXNQZXJTZWMgKyAyMzQpKTsKLX0KLQotVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzTGVhZGluZ1plcm9lcykgewotICBFWFBFQ1RfRVEoIjIwMTEtMDktMDNUMDU6MDc6MDIiLAotICAgICAgICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMxNTAyNjQyMiAqIGtNaWxsaXNQZXJTZWMpKTsKLX0KLQotVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzMjRIb3VyVGltZSkgewotICBFWFBFQ1RfRVEoIjIwMTEtMDktMjhUMTc6MDg6MjIiLAotICAgICAgICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMTMxNzIyOTcwMiAqIGtNaWxsaXNQZXJTZWMpKTsKLX0KLQotVEVTVF9GKEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxVGVzdCwgUHJpbnRzRXBvY2hTdGFydCkgewotICBFWFBFQ1RfRVEoIjE5NzAtMDEtMDFUMDA6MDA6MDAiLCBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSgwKSk7Ci19Ci0KLSNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCi0KLSMgaWZkZWYgX19CT1JMQU5EQ19fCi0vLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgotIyAgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKLSMgZW5kaWYKLQotLy8gVGVzdHMgdGhhdCBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGlzIHRydWUgd2hlbiB4IGlzIGEgbnVsbAotLy8gcG9pbnRlciBsaXRlcmFsLgotVEVTVChOdWxsTGl0ZXJhbFRlc3QsIElzVHJ1ZUZvck51bGxMaXRlcmFscykgewotICBFWFBFQ1RfVFJVRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKE5VTEwpKTsKLSAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwKSk7Ci0gIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMFUpKTsKLSAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygwTCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgaXMgZmFsc2Ugd2hlbiB4IGlzIG5vdCBhIG51bGwKLS8vIHBvaW50ZXIgbGl0ZXJhbC4KLVRFU1QoTnVsbExpdGVyYWxUZXN0LCBJc0ZhbHNlRm9yTm9uTnVsbExpdGVyYWxzKSB7Ci0gIEVYUEVDVF9GQUxTRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oMC4wKSk7Ci0gIEVYUEVDVF9GQUxTRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKCdhJykpOwotICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhzdGF0aWNfY2FzdDx2b2lkKj4oTlVMTCkpKTsKLX0KLQotIyBpZmRlZiBfX0JPUkxBTkRDX18KLS8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXBwcmVzc2VkIHRoZW0uCi0jICBwcmFnbWEgb3B0aW9uIHBvcAotIyBlbmRpZgotCi0jZW5kaWYgIC8vIEdURVNUX0NBTl9DT01QQVJFX05VTEwKLS8vCi0vLyBUZXN0cyBDb2RlUG9pbnRUb1V0ZjgoKS4KLQotLy8gVGVzdHMgdGhhdCB0aGUgTlVMIGNoYXJhY3RlciBMJ1wwJyBpcyBlbmNvZGVkIGNvcnJlY3RseS4KLVRFU1QoQ29kZVBvaW50VG9VdGY4VGVzdCwgQ2FuRW5jb2RlTnVsKSB7Ci0gIEVYUEVDVF9FUSgiIiwgQ29kZVBvaW50VG9VdGY4KEwnXDAnKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQVNDSUkgY2hhcmFjdGVycyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkuCi1URVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZUFzY2lpKSB7Ci0gIEVYUEVDVF9FUSgiYSIsIENvZGVQb2ludFRvVXRmOChMJ2EnKSk7Ci0gIEVYUEVDVF9FUSgiWiIsIENvZGVQb2ludFRvVXRmOChMJ1onKSk7Ci0gIEVYUEVDVF9FUSgiJiIsIENvZGVQb2ludFRvVXRmOChMJyYnKSk7Ci0gIEVYUEVDVF9FUSgiXHg3RiIsIENvZGVQb2ludFRvVXRmOChMJ1x4N0YnKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgOCB0byAxMSBiaXRzIGFyZSBlbmNvZGVkCi0vLyBhcyAxMTB4eHh4eCAxMHh4eHh4eC4KLVRFU1QoQ29kZVBvaW50VG9VdGY4VGVzdCwgQ2FuRW5jb2RlOFRvMTFCaXRzKSB7Ci0gIC8vIDAwMCAxMTAxIDAwMTEgPT4gMTEwLTAwMDExIDEwLTAxMDAxMQotICBFWFBFQ1RfRVEoIlx4QzNceDkzIiwgQ29kZVBvaW50VG9VdGY4KEwnXHhEMycpKTsKLQotICAvLyAxMDEgMDExMSAwMTEwID0+IDExMC0xMDEwMSAxMC0xMTAxMTAKLSAgLy8gU29tZSBjb21waWxlcnMgKGUuZy4sIEdDQyBvbiBNaW5HVykgY2Fubm90IGhhbmRsZSBub24tQVNDSUkgY29kZXBvaW50cwotICAvLyBpbiB3aWRlIHN0cmluZ3MgYW5kIHdpZGUgY2hhcnMuIEluIG9yZGVyIHRvIGFjY29tb2RhdGUgdGhlbSwgd2UgaGF2ZSB0bwotICAvLyBpbnRyb2R1Y2Ugc3VjaCBjaGFyYWN0ZXIgY29uc3RhbnRzIGFzIGludGVnZXJzLgotICBFWFBFQ1RfRVEoIlx4RDVceEI2IiwKLSAgICAgICAgICAgIENvZGVQb2ludFRvVXRmOChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDU3NikpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSAxMiB0byAxNiBiaXRzIGFyZSBlbmNvZGVkCi0vLyBhcyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eC4KLVRFU1QoQ29kZVBvaW50VG9VdGY4VGVzdCwgQ2FuRW5jb2RlMTJUbzE2Qml0cykgewotICAvLyAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTAtMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCi0gIEVYUEVDVF9FUSgiXHhFMFx4QTNceDkzIiwKLSAgICAgICAgICAgIENvZGVQb2ludFRvVXRmOChzdGF0aWNfY2FzdDx3Y2hhcl90PigweDhEMykpKTsKLQotICAvLyAxMTAwIDAxMTEgMDEwMCAxMTAxID0+IDExMTAtMTEwMCAxMC0wMTExMDEgMTAtMDAxMTAxCi0gIEVYUEVDVF9FUSgiXHhFQ1x4OURceDhEIiwKLSAgICAgICAgICAgIENvZGVQb2ludFRvVXRmOChzdGF0aWNfY2FzdDx3Y2hhcl90PigweEM3NEQpKSk7Ci19Ci0KLSNpZiAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KLS8vIFRlc3RzIGluIHRoaXMgZ3JvdXAgcmVxdWlyZSBhIHdjaGFyX3QgdG8gaG9sZCA+IDE2IGJpdHMsIGFuZCB0aHVzCi0vLyBhcmUgc2tpcHBlZCBvbiBXaW5kb3dzLCBDeWd3aW4sIGFuZCBTeW1iaWFuLCB3aGVyZSBhIHdjaGFyX3QgaXMKLS8vIDE2LWJpdCB3aWRlLiBUaGlzIGNvZGUgbWF5IG5vdCBjb21waWxlIG9uIHRob3NlIHN5c3RlbXMuCi0KLS8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTcgdG8gMjEgYml0cyBhcmUgZW5jb2RlZAotLy8gYXMgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHguCi1URVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZTE3VG8yMUJpdHMpIHsKLSAgLy8gMCAwMDAxIDAwMDAgMTAwMCAxMTAxIDAwMTEgPT4gMTExMTAtMDAwIDEwLTAxMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCi0gIEVYUEVDVF9FUSgiXHhGMFx4OTBceEEzXHg5MyIsIENvZGVQb2ludFRvVXRmOChMJ1x4MTA4RDMnKSk7Ci0KLSAgLy8gMCAwMDAxIDAwMDAgMDEwMCAwMDAwIDAwMDAgPT4gMTExMTAtMDAwIDEwLTAxMDAwMCAxMC0wMTAwMDAgMTAtMDAwMDAwCi0gIEVYUEVDVF9FUSgiXHhGMFx4OTBceDkwXHg4MCIsIENvZGVQb2ludFRvVXRmOChMJ1x4MTA0MDAnKSk7Ci0KLSAgLy8gMSAwMDAwIDEwMDAgMDExMCAwMDExIDAxMDAgPT4gMTExMTAtMTAwIDEwLTAwMTAwMCAxMC0wMTEwMDAgMTAtMTEwMTAwCi0gIEVYUEVDVF9FUSgiXHhGNFx4ODhceDk4XHhCNCIsIENvZGVQb2ludFRvVXRmOChMJ1x4MTA4NjM0JykpOwotfQotCi0vLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgY29kZS1wb2ludCBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KLVRFU1QoQ29kZVBvaW50VG9VdGY4VGVzdCwgQ2FuRW5jb2RlSW52YWxpZENvZGVQb2ludCkgewotICBFWFBFQ1RfRVEoIihJbnZhbGlkIFVuaWNvZGUgMHgxMjM0QUJDRCkiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEyMzRBQkNEJykpOwotfQotCi0jZW5kaWYgIC8vICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XwotCi0vLyBUZXN0cyBXaWRlU3RyaW5nVG9VdGY4KCkuCi0KLS8vIFRlc3RzIHRoYXQgdGhlIE5VTCBjaGFyYWN0ZXIgTCdcMCcgaXMgZW5jb2RlZCBjb3JyZWN0bHkuCi1URVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVOdWwpIHsKLSAgRVhQRUNUX1NUUkVRKCIiLCBXaWRlU3RyaW5nVG9VdGY4KEwiIiwgMCkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgV2lkZVN0cmluZ1RvVXRmOChMIiIsIC0xKS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBBU0NJSSBzdHJpbmdzIGFyZSBlbmNvZGVkIGNvcnJlY3RseS4KLVRFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZUFzY2lpKSB7Ci0gIEVYUEVDVF9TVFJFUSgiYSIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhIiwgMSkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiYWIiLCBXaWRlU3RyaW5nVG9VdGY4KEwiYWIiLCAyKS5jX3N0cigpKTsKLSAgRVhQRUNUX1NUUkVRKCJhIiwgV2lkZVN0cmluZ1RvVXRmOChMImEiLCAtMSkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiYWIiLCBXaWRlU3RyaW5nVG9VdGY4KEwiYWIiLCAtMSkuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgOCB0byAxMSBiaXRzIGFyZSBlbmNvZGVkCi0vLyBhcyAxMTB4eHh4eCAxMHh4eHh4eC4KLVRFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZThUbzExQml0cykgewotICAvLyAwMDAgMTEwMSAwMDExID0+IDExMC0wMDAxMSAxMC0wMTAwMTEKLSAgRVhQRUNUX1NUUkVRKCJceEMzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceEQzIiwgMSkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiXHhDM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHhEMyIsIC0xKS5jX3N0cigpKTsKLQotICAvLyAxMDEgMDExMSAwMTEwID0+IDExMC0xMDEwMSAxMC0xMTAxMTAKLSAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4NTc2LCAnXDAnIH07Ci0gIEVYUEVDVF9TVFJFUSgiXHhENVx4QjYiLCBXaWRlU3RyaW5nVG9VdGY4KHMsIDEpLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoIlx4RDVceEI2IiwgV2lkZVN0cmluZ1RvVXRmOChzLCAtMSkuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTIgdG8gMTYgYml0cyBhcmUgZW5jb2RlZAotLy8gYXMgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHguCi1URVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGUxMlRvMTZCaXRzKSB7Ci0gIC8vIDAwMDAgMTAwMCAxMTAxIDAwMTEgPT4gMTExMC0wMDAwIDEwLTEwMDAxMSAxMC0wMTAwMTEKLSAgY29uc3Qgd2NoYXJfdCBzMVtdID0geyAweDhEMywgJ1wwJyB9OwotICBFWFBFQ1RfU1RSRVEoIlx4RTBceEEzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoczEsIDEpLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoIlx4RTBceEEzXHg5MyIsIFdpZGVTdHJpbmdUb1V0ZjgoczEsIC0xKS5jX3N0cigpKTsKLQotICAvLyAxMTAwIDAxMTEgMDEwMCAxMTAxID0+IDExMTAtMTEwMCAxMC0wMTExMDEgMTAtMDAxMTAxCi0gIGNvbnN0IHdjaGFyX3QgczJbXSA9IHsgMHhDNzRELCAnXDAnIH07Ci0gIEVYUEVDVF9TVFJFUSgiXHhFQ1x4OURceDhEIiwgV2lkZVN0cmluZ1RvVXRmOChzMiwgMSkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiXHhFQ1x4OURceDhEIiwgV2lkZVN0cmluZ1RvVXRmOChzMiwgLTEpLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBjb252ZXJzaW9uIHN0b3BzIHdoZW4gdGhlIGZ1bmN0aW9uIGVuY291bnRlcnMgXDAgY2hhcmFjdGVyLgotVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgU3RvcHNPbk51bENoYXJhY3RlcikgewotICBFWFBFQ1RfU1RSRVEoIkFCQyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJBQkNcMFhZWiIsIDEwMCkuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIGNvbnZlcnNpb24gc3RvcHMgd2hlbiB0aGUgZnVuY3Rpb24gcmVhY2hlcyB0aGUgbGltaXQKLS8vIHNwZWNpZmllZCBieSB0aGUgJ2xlbmd0aCcgcGFyYW1ldGVyLgotVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgU3RvcHNXaGVuTGVuZ3RoTGltaXRSZWFjaGVkKSB7Ci0gIEVYUEVDVF9TVFJFUSgiQUJDIiwgV2lkZVN0cmluZ1RvVXRmOChMIkFCQ0RFRiIsIDMpLmNfc3RyKCkpOwotfQotCi0jaWYgIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCi0vLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDE3IHRvIDIxIGJpdHMgYXJlIGVuY29kZWQKLS8vIGFzIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4LiBUaGlzIGNvZGUgbWF5IG5vdCBjb21waWxlCi0vLyBvbiB0aGUgc3lzdGVtcyB1c2luZyBVVEYtMTYgZW5jb2RpbmcuCi1URVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGUxN1RvMjFCaXRzKSB7Ci0gIC8vIDAgMDAwMSAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTEwLTAwMCAxMC0wMTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQotICBFWFBFQ1RfU1RSRVEoIlx4RjBceDkwXHhBM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHgxMDhEMyIsIDEpLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoIlx4RjBceDkwXHhBM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHgxMDhEMyIsIC0xKS5jX3N0cigpKTsKLQotICAvLyAxIDAwMDAgMTAwMCAwMTEwIDAwMTEgMDEwMCA9PiAxMTExMC0xMDAgMTAtMDAxMDAwIDEwLTAxMTAwMCAxMC0xMTAxMDAKLSAgRVhQRUNUX1NUUkVRKCJceEY0XHg4OFx4OThceEI0IiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4NjM0IiwgMSkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiXHhGNFx4ODhceDk4XHhCNCIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwODYzNCIsIC0xKS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBlbmNvZGluZyBhbiBpbnZhbGlkIGNvZGUtcG9pbnQgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCByZXN1bHQuCi1URVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVJbnZhbGlkQ29kZVBvaW50KSB7Ci0gIEVYUEVDVF9TVFJFUSgiKEludmFsaWQgVW5pY29kZSAweEFCQ0RGRikiLAotICAgICAgICAgICAgICAgV2lkZVN0cmluZ1RvVXRmOChMIlx4QUJDREZGIiwgLTEpLmNfc3RyKCkpOwotfQotI2Vsc2UgIC8vICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XwotLy8gVGVzdHMgdGhhdCBzdXJyb2dhdGUgcGFpcnMgYXJlIGVuY29kZWQgY29ycmVjdGx5IG9uIHRoZSBzeXN0ZW1zIHVzaW5nCi0vLyBVVEYtMTYgZW5jb2RpbmcgaW4gdGhlIHdpZGUgc3RyaW5ncy4KLVRFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZVZhbGlkVXRmMTZTVXJyb2dhdGVQYWlycykgewotICBjb25zdCB3Y2hhcl90IHNbXSA9IHsgMHhEODAxLCAweERDMDAsICdcMCcgfTsKLSAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4OTBceDgwIiwgV2lkZVN0cmluZ1RvVXRmOChzLCAtMSkuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgZW5jb2RpbmcgYW4gaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKLS8vIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgotVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlSW52YWxpZFV0ZjE2U3Vycm9nYXRlUGFpcikgewotICAvLyBMZWFkaW5nIHN1cnJvZ2F0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0gIGNvbnN0IHdjaGFyX3QgczFbXSA9IHsgMHhEODAwLCAnXDAnIH07Ci0gIEVYUEVDVF9TVFJFUSgiXHhFRFx4QTBceDgwIiwgV2lkZVN0cmluZ1RvVXRmOChzMSwgLTEpLmNfc3RyKCkpOwotICAvLyBMZWFkaW5nIHN1cnJvZ2F0ZSBpcyBub3QgZm9sbG93ZWQgYnkgdGhlIHRyYWlsaW5nIHN1cnJvZ2F0ZS4KLSAgY29uc3Qgd2NoYXJfdCBzMltdID0geyAweEQ4MDAsICdNJywgJ1wwJyB9OwotICBFWFBFQ1RfU1RSRVEoIlx4RURceEEwXHg4ME0iLCBXaWRlU3RyaW5nVG9VdGY4KHMyLCAtMSkuY19zdHIoKSk7Ci0gIC8vIFRyYWlsaW5nIHN1cnJvZ2F0ZSBhcHBlYXJhcyB3aXRob3V0IGEgbGVhZGluZyBzdXJyb2dhdGUuCi0gIGNvbnN0IHdjaGFyX3QgczNbXSA9IHsgMHhEQzAwLCAnUCcsICdRJywgJ1InLCAnXDAnIH07Ci0gIEVYUEVDVF9TVFJFUSgiXHhFRFx4QjBceDgwUFFSIiwgV2lkZVN0cmluZ1RvVXRmOChzMywgLTEpLmNfc3RyKCkpOwotfQotI2VuZGlmICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KLQotLy8gVGVzdHMgdGhhdCBjb2RlcG9pbnQgY29uY2F0ZW5hdGlvbiB3b3JrcyBjb3JyZWN0bHkuCi0jaWYgIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCi1URVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDb25jYXRlbmF0ZXNDb2RlcG9pbnRzQ29ycmVjdGx5KSB7Ci0gIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweDEwODYzNCwgMHhDNzRELCAnXG4nLCAweDU3NiwgMHg4RDMsIDB4MTA4NjM0LCAnXDAnfTsKLSAgRVhQRUNUX1NUUkVRKAotICAgICAgIlx4RjRceDg4XHg5OFx4QjQiCi0gICAgICAgICAgIlx4RUNceDlEXHg4RCIKLSAgICAgICAgICAiXG4iCi0gICAgICAgICAgIlx4RDVceEI2IgotICAgICAgICAgICJceEUwXHhBM1x4OTMiCi0gICAgICAgICAgIlx4RjRceDg4XHg5OFx4QjQiLAotICAgICAgV2lkZVN0cmluZ1RvVXRmOChzLCAtMSkuY19zdHIoKSk7Ci19Ci0jZWxzZQotVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ29uY2F0ZW5hdGVzQ29kZXBvaW50c0NvcnJlY3RseSkgewotICBjb25zdCB3Y2hhcl90IHNbXSA9IHsgMHhDNzRELCAnXG4nLCAweDU3NiwgMHg4RDMsICdcMCd9OwotICBFWFBFQ1RfU1RSRVEoCi0gICAgICAiXHhFQ1x4OURceDhEIiAiXG4iICJceEQ1XHhCNiIgIlx4RTBceEEzXHg5MyIsCi0gICAgICBXaWRlU3RyaW5nVG9VdGY4KHMsIC0xKS5jX3N0cigpKTsKLX0KLSNlbmRpZiAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCi0KLS8vIFRlc3RzIHRoZSBSYW5kb20gY2xhc3MuCi0KLVRFU1QoUmFuZG9tRGVhdGhUZXN0LCBHZW5lcmF0ZXNDcmFzaGVzT25JbnZhbGlkUmFuZ2UpIHsKLSAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20oNDIpOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAotICAgICAgcmFuZG9tLkdlbmVyYXRlKDApLAotICAgICAgIkNhbm5vdCBnZW5lcmF0ZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgXFxbMCwgMFxcKSIpOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAotICAgICAgcmFuZG9tLkdlbmVyYXRlKHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb206OmtNYXhSYW5nZSArIDEpLAotICAgICAgIkdlbmVyYXRpb24gb2YgYSBudW1iZXIgaW4gXFxbMCwgMjE0NzQ4MzY0OVxcKSB3YXMgcmVxdWVzdGVkLCAiCi0gICAgICAiYnV0IHRoaXMgY2FuIG9ubHkgZ2VuZXJhdGUgbnVtYmVycyBpbiBcXFswLCAyMTQ3NDgzNjQ4XFwpIik7Ci19Ci0KLVRFU1QoUmFuZG9tVGVzdCwgR2VuZXJhdGVzTnVtYmVyc1dpdGhpblJhbmdlKSB7Ci0gIGNvbnN0IFVJbnQzMiBrUmFuZ2UgPSAxMDAwMDsKLSAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20oMTIzNDUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBFWFBFQ1RfTFQocmFuZG9tLkdlbmVyYXRlKGtSYW5nZSksIGtSYW5nZSkgPDwgIiBmb3IgaXRlcmF0aW9uICIgPDwgaTsKLSAgfQotCi0gIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tMih0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tOjprTWF4UmFuZ2UpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBFWFBFQ1RfTFQocmFuZG9tMi5HZW5lcmF0ZShrUmFuZ2UpLCBrUmFuZ2UpIDw8ICIgZm9yIGl0ZXJhdGlvbiAiIDw8IGk7Ci0gIH0KLX0KLQotVEVTVChSYW5kb21UZXN0LCBSZXBlYXRzV2hlblJlc2VlZGVkKSB7Ci0gIGNvbnN0IGludCBrU2VlZCA9IDEyMzsKLSAgY29uc3QgaW50IGtBcnJheVNpemUgPSAxMDsKLSAgY29uc3QgVUludDMyIGtSYW5nZSA9IDEwMDAwOwotICBVSW50MzIgdmFsdWVzW2tBcnJheVNpemVdOwotCi0gIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKGtTZWVkKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQXJyYXlTaXplOyBpKyspIHsKLSAgICB2YWx1ZXNbaV0gPSByYW5kb20uR2VuZXJhdGUoa1JhbmdlKTsKLSAgfQotCi0gIHJhbmRvbS5SZXNlZWQoa1NlZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtBcnJheVNpemU7IGkrKykgewotICAgIEVYUEVDVF9FUSh2YWx1ZXNbaV0sIHJhbmRvbS5HZW5lcmF0ZShrUmFuZ2UpKSA8PCAiIGZvciBpdGVyYXRpb24gIiA8PCBpOwotICB9Ci19Ci0KLS8vIFRlc3RzIFNUTCBjb250YWluZXIgdXRpbGl0aWVzLgotCi0vLyBUZXN0cyBDb3VudElmKCkuCi0KLXN0YXRpYyBib29sIElzUG9zaXRpdmUoaW50IG4pIHsgcmV0dXJuIG4gPiAwOyB9Ci0KLVRFU1QoQ29udGFpbmVyVXRpbGl0eVRlc3QsIENvdW50SWYpIHsKLSAgc3RkOjp2ZWN0b3I8aW50PiB2OwotICBFWFBFQ1RfRVEoMCwgQ291bnRJZih2LCBJc1Bvc2l0aXZlKSk7ICAvLyBXb3JrcyBmb3IgYW4gZW1wdHkgY29udGFpbmVyLgotCi0gIHYucHVzaF9iYWNrKC0xKTsKLSAgdi5wdXNoX2JhY2soMCk7Ci0gIEVYUEVDVF9FUSgwLCBDb3VudElmKHYsIElzUG9zaXRpdmUpKTsgIC8vIFdvcmtzIHdoZW4gbm8gdmFsdWUgc2F0aXNmaWVzLgotCi0gIHYucHVzaF9iYWNrKDIpOwotICB2LnB1c2hfYmFjaygtMTApOwotICB2LnB1c2hfYmFjaygxMCk7Ci0gIEVYUEVDVF9FUSgyLCBDb3VudElmKHYsIElzUG9zaXRpdmUpKTsKLX0KLQotLy8gVGVzdHMgRm9yRWFjaCgpLgotCi1zdGF0aWMgaW50IGdfc3VtID0gMDsKLXN0YXRpYyB2b2lkIEFjY3VtdWxhdGUoaW50IG4pIHsgZ19zdW0gKz0gbjsgfQotCi1URVNUKENvbnRhaW5lclV0aWxpdHlUZXN0LCBGb3JFYWNoKSB7Ci0gIHN0ZDo6dmVjdG9yPGludD4gdjsKLSAgZ19zdW0gPSAwOwotICBGb3JFYWNoKHYsIEFjY3VtdWxhdGUpOwotICBFWFBFQ1RfRVEoMCwgZ19zdW0pOyAgLy8gV29ya3MgZm9yIGFuIGVtcHR5IGNvbnRhaW5lcjsKLQotICBnX3N1bSA9IDA7Ci0gIHYucHVzaF9iYWNrKDEpOwotICBGb3JFYWNoKHYsIEFjY3VtdWxhdGUpOwotICBFWFBFQ1RfRVEoMSwgZ19zdW0pOyAgLy8gV29ya3MgZm9yIGEgY29udGFpbmVyIHdpdGggb25lIGVsZW1lbnQuCi0KLSAgZ19zdW0gPSAwOwotICB2LnB1c2hfYmFjaygyMCk7Ci0gIHYucHVzaF9iYWNrKDMwMCk7Ci0gIEZvckVhY2godiwgQWNjdW11bGF0ZSk7Ci0gIEVYUEVDVF9FUSgzMjEsIGdfc3VtKTsKLX0KLQotLy8gVGVzdHMgR2V0RWxlbWVudE9yKCkuCi1URVNUKENvbnRhaW5lclV0aWxpdHlUZXN0LCBHZXRFbGVtZW50T3IpIHsKLSAgc3RkOjp2ZWN0b3I8Y2hhcj4gYTsKLSAgRVhQRUNUX0VRKCd4JywgR2V0RWxlbWVudE9yKGEsIDAsICd4JykpOwotCi0gIGEucHVzaF9iYWNrKCdhJyk7Ci0gIGEucHVzaF9iYWNrKCdiJyk7Ci0gIEVYUEVDVF9FUSgnYScsIEdldEVsZW1lbnRPcihhLCAwLCAneCcpKTsKLSAgRVhQRUNUX0VRKCdiJywgR2V0RWxlbWVudE9yKGEsIDEsICd4JykpOwotICBFWFBFQ1RfRVEoJ3gnLCBHZXRFbGVtZW50T3IoYSwgLTIsICd4JykpOwotICBFWFBFQ1RfRVEoJ3gnLCBHZXRFbGVtZW50T3IoYSwgMiwgJ3gnKSk7Ci19Ci0KLVRFU1QoQ29udGFpbmVyVXRpbGl0eURlYXRoVGVzdCwgU2h1ZmZsZVJhbmdlKSB7Ci0gIHN0ZDo6dmVjdG9yPGludD4gYTsKLSAgYS5wdXNoX2JhY2soMCk7Ci0gIGEucHVzaF9iYWNrKDEpOwotICBhLnB1c2hfYmFjaygyKTsKLSAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb20oMSk7Ci0KLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKLSAgICAgIFNodWZmbGVSYW5nZSgmcmFuZG9tLCAtMSwgMSwgJmEpLAotICAgICAgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBzdGFydCAtMTogbXVzdCBiZSBpbiByYW5nZSBcXFswLCAzXFxdIik7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCi0gICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgNCwgNCwgJmEpLAotICAgICAgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBzdGFydCA0OiBtdXN0IGJlIGluIHJhbmdlIFxcWzAsIDNcXF0iKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKLSAgICAgIFNodWZmbGVSYW5nZSgmcmFuZG9tLCAzLCAyLCAmYSksCi0gICAgICAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIGZpbmlzaCAyOiBtdXN0IGJlIGluIHJhbmdlIFxcWzMsIDNcXF0iKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKLSAgICAgIFNodWZmbGVSYW5nZSgmcmFuZG9tLCAzLCA0LCAmYSksCi0gICAgICAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIGZpbmlzaCA0OiBtdXN0IGJlIGluIHJhbmdlIFxcWzMsIDNcXF0iKTsKLX0KLQotY2xhc3MgVmVjdG9yU2h1ZmZsZVRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50IGtWZWN0b3JTaXplID0gMjA7Ci0KLSAgVmVjdG9yU2h1ZmZsZVRlc3QoKSA6IHJhbmRvbV8oMSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1ZlY3RvclNpemU7IGkrKykgewotICAgICAgdmVjdG9yXy5wdXNoX2JhY2soaSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGJvb2wgVmVjdG9ySXNDb3JydXB0KGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgewotICAgIGlmIChrVmVjdG9yU2l6ZSAhPSBzdGF0aWNfY2FzdDxpbnQ+KHZlY3Rvci5zaXplKCkpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIGZvdW5kX2luX3ZlY3RvcltrVmVjdG9yU2l6ZV0gPSB7IGZhbHNlIH07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGNvbnN0IGludCBlID0gdmVjdG9yW2ldOwotICAgICAgaWYgKGUgPCAwIHx8IGUgPj0ga1ZlY3RvclNpemUgfHwgZm91bmRfaW5fdmVjdG9yW2VdKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZm91bmRfaW5fdmVjdG9yW2VdID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBWZWN0b3Igc2l6ZSBpcyBjb3JyZWN0LCBlbGVtZW50cycgcmFuZ2UgaXMgY29ycmVjdCwgbm8KLSAgICAvLyBkdXBsaWNhdGUgZWxlbWVudHMuICBUaGVyZWZvcmUgbm8gY29ycnVwdGlvbiBoYXMgb2NjdXJyZWQuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgVmVjdG9ySXNOb3RDb3JydXB0KGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgewotICAgIHJldHVybiAhVmVjdG9ySXNDb3JydXB0KHZlY3Rvcik7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBSYW5nZUlzU2h1ZmZsZWQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yLCBpbnQgYmVnaW4sIGludCBlbmQpIHsKLSAgICBmb3IgKGludCBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgewotICAgICAgaWYgKGkgIT0gdmVjdG9yW2ldKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBSYW5nZUlzVW5zaHVmZmxlZCgKLSAgICAgIGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvciwgaW50IGJlZ2luLCBpbnQgZW5kKSB7Ci0gICAgcmV0dXJuICFSYW5nZUlzU2h1ZmZsZWQodmVjdG9yLCBiZWdpbiwgZW5kKTsKLSAgfQotCi0gIHN0YXRpYyBib29sIFZlY3RvcklzU2h1ZmZsZWQoY29uc3QgVGVzdGluZ1ZlY3RvciYgdmVjdG9yKSB7Ci0gICAgcmV0dXJuIFJhbmdlSXNTaHVmZmxlZCh2ZWN0b3IsIDAsIHN0YXRpY19jYXN0PGludD4odmVjdG9yLnNpemUoKSkpOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgVmVjdG9ySXNVbnNodWZmbGVkKGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgewotICAgIHJldHVybiAhVmVjdG9ySXNTaHVmZmxlZCh2ZWN0b3IpOwotICB9Ci0KLSAgdGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbSByYW5kb21fOwotICBUZXN0aW5nVmVjdG9yIHZlY3Rvcl87Ci19OyAgLy8gY2xhc3MgVmVjdG9yU2h1ZmZsZVRlc3QKLQotY29uc3QgaW50IFZlY3RvclNodWZmbGVUZXN0OjprVmVjdG9yU2l6ZTsKLQotVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBIYW5kbGVzRW1wdHlSYW5nZSkgewotICAvLyBUZXN0cyBhbiBlbXB0eSByYW5nZSBhdCB0aGUgYmVnaW5uaW5nLi4uCi0gIFNodWZmbGVSYW5nZSgmcmFuZG9tXywgMCwgMCwgJnZlY3Rvcl8pOwotICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7Ci0KLSAgLy8gLi4uaW4gdGhlIG1pZGRsZS4uLgotICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplLzIsIGtWZWN0b3JTaXplLzIsICZ2ZWN0b3JfKTsKLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7Ci0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOwotCi0gIC8vIC4uLmF0IHRoZSBlbmQuLi4KLSAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZSAtIDEsIGtWZWN0b3JTaXplIC0gMSwgJnZlY3Rvcl8pOwotICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7Ci0KLSAgLy8gLi4uYW5kIHBhc3QgdGhlIGVuZC4KLSAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZSwga1ZlY3RvclNpemUsICZ2ZWN0b3JfKTsKLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7Ci0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOwotfQotCi1URVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIEhhbmRsZXNSYW5nZU9mU2l6ZU9uZSkgewotICAvLyBUZXN0cyBhIHNpemUgb25lIHJhbmdlIGF0IHRoZSBiZWdpbm5pbmcuLi4KLSAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCAwLCAxLCAmdmVjdG9yXyk7Ci0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOwotICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKLQotICAvLyAuLi5pbiB0aGUgbWlkZGxlLi4uCi0gIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUvMiwga1ZlY3RvclNpemUvMiArIDEsICZ2ZWN0b3JfKTsKLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7Ci0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOwotCi0gIC8vIC4uLmFuZCBhdCB0aGUgZW5kLgotICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplIC0gMSwga1ZlY3RvclNpemUsICZ2ZWN0b3JfKTsKLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7Ci0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOwotfQotCi0vLyBCZWNhdXNlIHdlIHVzZSBvdXIgb3duIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGFuZCBhIGZpeGVkIHNlZWQsCi0vLyB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgdGhlIGZvbGxvd2luZyAicmFuZG9tIiB0ZXN0cyB3aWxsIHN1Y2NlZWQuCi0KLVRFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgU2h1ZmZsZXNFbnRpcmVWZWN0b3IpIHsKLSAgU2h1ZmZsZSgmcmFuZG9tXywgJnZlY3Rvcl8pOwotICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKLSAgRVhQRUNUX0ZBTFNFKFZlY3RvcklzVW5zaHVmZmxlZCh2ZWN0b3JfKSkgPDwgdmVjdG9yXzsKLQotICAvLyBUZXN0cyB0aGUgZmlyc3QgYW5kIGxhc3QgZWxlbWVudHMgaW4gcGFydGljdWxhciB0byBlbnN1cmUgdGhhdAotICAvLyB0aGVyZSBhcmUgbm8gb2ZmLWJ5LW9uZSBwcm9ibGVtcyBpbiBvdXIgc2h1ZmZsZSBhbGdvcml0aG0uCi0gIEVYUEVDVF9ORSgwLCB2ZWN0b3JfWzBdKTsKLSAgRVhQRUNUX05FKGtWZWN0b3JTaXplIC0gMSwgdmVjdG9yX1trVmVjdG9yU2l6ZSAtIDFdKTsKLX0KLQotVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBTaHVmZmxlc1N0YXJ0T2ZWZWN0b3IpIHsKLSAgY29uc3QgaW50IGtSYW5nZVNpemUgPSBrVmVjdG9yU2l6ZS8yOwotCi0gIFNodWZmbGVSYW5nZSgmcmFuZG9tXywgMCwga1JhbmdlU2l6ZSwgJnZlY3Rvcl8pOwotCi0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOwotICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1NodWZmbGVkLCB2ZWN0b3JfLCAwLCBrUmFuZ2VTaXplKTsKLSAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCBrUmFuZ2VTaXplLCBrVmVjdG9yU2l6ZSk7Ci19Ci0KLVRFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgU2h1ZmZsZXNFbmRPZlZlY3RvcikgewotICBjb25zdCBpbnQga1JhbmdlU2l6ZSA9IGtWZWN0b3JTaXplIC8gMjsKLSAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrUmFuZ2VTaXplLCBrVmVjdG9yU2l6ZSwgJnZlY3Rvcl8pOwotCi0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOwotICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIDAsIGtSYW5nZVNpemUpOwotICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1NodWZmbGVkLCB2ZWN0b3JfLCBrUmFuZ2VTaXplLCBrVmVjdG9yU2l6ZSk7Ci19Ci0KLVRFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgU2h1ZmZsZXNNaWRkbGVPZlZlY3RvcikgewotICBpbnQga1JhbmdlU2l6ZSA9IGtWZWN0b3JTaXplLzM7Ci0gIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1JhbmdlU2l6ZSwgMiprUmFuZ2VTaXplLCAmdmVjdG9yXyk7Ci0KLSAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7Ci0gIEVYUEVDVF9QUkVEMyhSYW5nZUlzVW5zaHVmZmxlZCwgdmVjdG9yXywgMCwga1JhbmdlU2l6ZSk7Ci0gIEVYUEVDVF9QUkVEMyhSYW5nZUlzU2h1ZmZsZWQsIHZlY3Rvcl8sIGtSYW5nZVNpemUsIDIqa1JhbmdlU2l6ZSk7Ci0gIEVYUEVDVF9QUkVEMyhSYW5nZUlzVW5zaHVmZmxlZCwgdmVjdG9yXywgMiprUmFuZ2VTaXplLCBrVmVjdG9yU2l6ZSk7Ci19Ci0KLVRFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgU2h1ZmZsZXNSZXBlYXRhYmx5KSB7Ci0gIFRlc3RpbmdWZWN0b3IgdmVjdG9yMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmVjdG9yU2l6ZTsgaSsrKSB7Ci0gICAgdmVjdG9yMi5wdXNoX2JhY2soaSk7Ci0gIH0KLQotICByYW5kb21fLlJlc2VlZCgxMjM0KTsKLSAgU2h1ZmZsZSgmcmFuZG9tXywgJnZlY3Rvcl8pOwotICByYW5kb21fLlJlc2VlZCgxMjM0KTsKLSAgU2h1ZmZsZSgmcmFuZG9tXywgJnZlY3RvcjIpOwotCi0gIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOwotICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3IyKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGtWZWN0b3JTaXplOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEodmVjdG9yX1tpXSwgdmVjdG9yMltpXSkgPDwgIiB3aGVyZSBpIGlzICIgPDwgaTsKLSAgfQotfQotCi0vLyBUZXN0cyB0aGUgc2l6ZSBvZiB0aGUgQXNzZXJ0SGVscGVyIGNsYXNzLgotCi1URVNUKEFzc2VydEhlbHBlclRlc3QsIEFzc2VydEhlbHBlcklzU21hbGwpIHsKLSAgLy8gVG8gYXZvaWQgYnJlYWtpbmcgY2xpZW50cyB0aGF0IHVzZSBsb3RzIG9mIGFzc2VydGlvbnMgaW4gb25lCi0gIC8vIGZ1bmN0aW9uLCB3ZSBjYW5ub3QgZ3JvdyB0aGUgc2l6ZSBvZiBBc3NlcnRIZWxwZXIuCi0gIEVYUEVDVF9MRShzaXplb2YodGVzdGluZzo6aW50ZXJuYWw6OkFzc2VydEhlbHBlciksIHNpemVvZih2b2lkKikpOwotfQotCi0vLyBUZXN0cyBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCkuCi1URVNUKFN0cmluZ1Rlc3QsIEVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKSB7Ci0gIEVYUEVDVF9UUlVFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoImZvb2JhciIsICJCQVIiKSk7Ci0gIEVYUEVDVF9UUlVFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoImZvb2JhUiIsICJiYXIiKSk7Ci0gIEVYUEVDVF9UUlVFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoImZvb2JhciIsICIiKSk7Ci0gIEVYUEVDVF9UUlVFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoIiIsICIiKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoIkZvb2JhciIsICJmb28iKSk7Ci0gIEVYUEVDVF9GQUxTRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYXIiLCAiRm9vIikpOwotICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiIiwgImZvbyIpKTsKLX0KLQotLy8gQysrQnVpbGRlcidzIHByZXByb2Nlc3NvciBpcyBidWdneTsgaXQgZmFpbHMgdG8gZXhwYW5kIG1hY3JvcyB0aGF0Ci0vLyBhcHBlYXIgaW4gbWFjcm8gcGFyYW1ldGVycyBhZnRlciB3aWRlIGNoYXIgbGl0ZXJhbHMuICBQcm92aWRlIGFuIGFsaWFzCi0vLyBmb3IgTlVMTCBhcyBhIHdvcmthcm91bmQuCi1zdGF0aWMgY29uc3Qgd2NoYXJfdCogY29uc3Qga051bGwgPSBOVUxMOwotCi0vLyBUZXN0cyBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzCi1URVNUKFN0cmluZ1Rlc3QsIENhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKSB7Ci0gIEVYUEVDVF9UUlVFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTlVMTCwgTlVMTCkpOwotICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhrTnVsbCwgTCIiKSk7Ci0gIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiIiwga051bGwpKTsKLSAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoa051bGwsIEwiZm9vYmFyIikpOwotICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMImZvb2JhciIsIGtOdWxsKSk7Ci0gIEVYUEVDVF9UUlVFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJmb29iYXIiLCBMImZvb2JhciIpKTsKLSAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMImZvb2JhciIsIEwiRk9PQkFSIikpOwotICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiRk9PQkFSIiwgTCJmb29iYXIiKSk7Ci19Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFRlc3RzIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKCkuCi1URVNUKFN0cmluZ1Rlc3QsIFNob3dXaWRlQ1N0cmluZykgewotICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsCi0gICAgICAgICAgICAgICBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhOVUxMKS5jX3N0cigpKTsKLSAgRVhQRUNUX1NUUkVRKCIiLCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhMIiIpLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoImZvbyIsIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKEwiZm9vIikuY19zdHIoKSk7Ci19Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLVRFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2TnVsbCkgewotICBFWFBFQ1RfRVEoTlVMTCwgU3RyaW5nOjpBbnNpVG9VdGYxNihOVUxMKSk7Ci0gIEVYUEVDVF9FUShOVUxMLCBTdHJpbmc6OlV0ZjE2VG9BbnNpKE5VTEwpKTsKLX0KLQotVEVTVChTdHJpbmdUZXN0LCBBbnNpQW5kVXRmMTZDb252ZXJ0QmFzaWMpIHsKLSAgY29uc3QgY2hhciogYW5zaSA9IFN0cmluZzo6VXRmMTZUb0Fuc2koTCJzdHIiKTsKLSAgRVhQRUNUX1NUUkVRKCJzdHIiLCBhbnNpKTsKLSAgZGVsZXRlIFtdIGFuc2k7Ci0gIGNvbnN0IFdDSEFSKiB1dGYxNiA9IFN0cmluZzo6QW5zaVRvVXRmMTYoInN0ciIpOwotICBFWFBFQ1RfRVEoMCwgd2NzbmNtcChMInN0ciIsIHV0ZjE2LCAzKSk7Ci0gIGRlbGV0ZSBbXSB1dGYxNjsKLX0KLQotVEVTVChTdHJpbmdUZXN0LCBBbnNpQW5kVXRmMTZDb252ZXJ0UGF0aENoYXJzKSB7Ci0gIGNvbnN0IGNoYXIqIGFuc2kgPSBTdHJpbmc6OlV0ZjE2VG9BbnNpKEwiLjpcXCBcIio/Iik7Ci0gIEVYUEVDVF9TVFJFUSgiLjpcXCBcIio/IiwgYW5zaSk7Ci0gIGRlbGV0ZSBbXSBhbnNpOwotICBjb25zdCBXQ0hBUiogdXRmMTYgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KCIuOlxcIFwiKj8iKTsKLSAgRVhQRUNUX0VRKDAsIHdjc25jbXAoTCIuOlxcIFwiKj8iLCB1dGYxNiwgMykpOwotICBkZWxldGUgW10gdXRmMTY7Ci19Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVGVzdHMgVGVzdFByb3BlcnR5IGNvbnN0cnVjdGlvbi4KLVRFU1QoVGVzdFByb3BlcnR5VGVzdCwgU3RyaW5nVmFsdWUpIHsKLSAgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXkiLCAiMSIpOwotICBFWFBFQ1RfU1RSRVEoImtleSIsIHByb3BlcnR5LmtleSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIxIiwgcHJvcGVydHkudmFsdWUoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RQcm9wZXJ0eSByZXBsYWNpbmcgYSB2YWx1ZS4KLVRFU1QoVGVzdFByb3BlcnR5VGVzdCwgUmVwbGFjZVN0cmluZ1ZhbHVlKSB7Ci0gIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgIjEiKTsKLSAgRVhQRUNUX1NUUkVRKCIxIiwgcHJvcGVydHkudmFsdWUoKSk7Ci0gIHByb3BlcnR5LlNldFZhbHVlKCIyIik7Ci0gIEVYUEVDVF9TVFJFUSgiMiIsIHByb3BlcnR5LnZhbHVlKCkpOwotfQotCi0vLyBBZGRGYXRhbEZhaWx1cmUoKSBhbmQgQWRkTm9uZmF0YWxGYWlsdXJlKCkgbXVzdCBiZSBzdGFuZC1hbG9uZQotLy8gZnVuY3Rpb25zIChpLmUuIHRoZWlyIGRlZmluaXRpb25zIGNhbm5vdCBiZSBpbmxpbmVkIGF0IHRoZSBjYWxsCi0vLyBzaXRlcyksIG9yIEMrK0J1aWxkZXIgd29uJ3QgY29tcGlsZSB0aGUgY29kZS4KLXN0YXRpYyB2b2lkIEFkZEZhdGFsRmFpbHVyZSgpIHsKLSAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7Ci19Ci0KLXN0YXRpYyB2b2lkIEFkZE5vbmZhdGFsRmFpbHVyZSgpIHsKLSAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKLX0KLQotY2xhc3MgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzogIC8vIE11c3QgYmUgcHVibGljIGFuZCBub3QgcHJvdGVjdGVkIGR1ZSB0byBhIGJ1ZyBpbiBnKysgMy40LjIuCi0gIGVudW0gRmFpbHVyZU1vZGUgewotICAgIEZBVEFMX0ZBSUxVUkUsCi0gICAgTk9ORkFUQUxfRkFJTFVSRQotICB9OwotICBzdGF0aWMgdm9pZCBBZGRGYWlsdXJlKEZhaWx1cmVNb2RlIGZhaWx1cmUpIHsKLSAgICBpZiAoZmFpbHVyZSA9PSBGQVRBTF9GQUlMVVJFKSB7Ci0gICAgICBBZGRGYXRhbEZhaWx1cmUoKTsKLSAgICB9IGVsc2UgewotICAgICAgQWRkTm9uZmF0YWxGYWlsdXJlKCk7Ci0gICAgfQotICB9Ci19OwotCi0vLyBUZXN0cyB0aGF0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGludGVyY2VwdHMgdGVzdAotLy8gZmFpbHVyZXMuCi1URVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LCBJbnRlcmNlcHRzVGVzdEZhaWx1cmVzKSB7Ci0gIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKLSAgewotICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKAotICAgICAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsCi0gICAgICAgICZyZXN1bHRzKTsKLSAgICBBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpOwotICAgIEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSk7Ci0gIH0KLQotICBFWFBFQ1RfRVEoMiwgcmVzdWx0cy5zaXplKCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm5vbmZhdGFsbHlfZmFpbGVkKCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLmZhdGFsbHlfZmFpbGVkKCkpOwotfQotCi1URVNUX0YoU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0LCBEZXByZWNhdGVkQ29uc3RydWN0b3IpIHsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOwotICB7Ci0gICAgLy8gVGVzdHMsIHRoYXQgdGhlIGRlcHJlY2F0ZWQgY29uc3RydWN0b3Igc3RpbGwgd29ya3MuCi0gICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgcmVwb3J0ZXIoJnJlc3VsdHMpOwotICAgIEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIHJlc3VsdHMuc2l6ZSgpKTsKLX0KLQotI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotY2xhc3MgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJXaXRoVGhyZWFkc1Rlc3QKLSAgOiBwdWJsaWMgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyB2b2lkIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZhaWx1cmVNb2RlIGZhaWx1cmUpIHsKLSAgICBUaHJlYWRXaXRoUGFyYW08RmFpbHVyZU1vZGU+IHRocmVhZCgmQWRkRmFpbHVyZSwgZmFpbHVyZSwgTlVMTCk7Ci0gICAgdGhyZWFkLkpvaW4oKTsKLSAgfQotfTsKLQotVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0LAotICAgICAgIEludGVyY2VwdHNUZXN0RmFpbHVyZXNJbkFsbFRocmVhZHMpIHsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOwotICB7Ci0gICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgcmVwb3J0ZXIoCi0gICAgICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJTlRFUkNFUFRfQUxMX1RIUkVBRFMsICZyZXN1bHRzKTsKLSAgICBBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpOwotICAgIEFkZEZhaWx1cmUoRkFUQUxfRkFJTFVSRSk7Ci0gICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSk7Ci0gICAgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSk7Ci0gIH0KLQotICBFWFBFQ1RfRVEoNCwgcmVzdWx0cy5zaXplKCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm5vbmZhdGFsbHlfZmFpbGVkKCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLmZhdGFsbHlfZmFpbGVkKCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDIpLm5vbmZhdGFsbHlfZmFpbGVkKCkpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDMpLmZhdGFsbHlfZmFpbGVkKCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotLy8gVGVzdHMgRVhQRUNUX0ZBVEFMX0ZBSUxVUkV7LE9OX0FMTF9USFJFQURTfS4gIE1ha2VzIHN1cmUgdGhhdCB0aGV5Ci0vLyB3b3JrIGV2ZW4gaWYgdGhlIGZhaWx1cmUgaXMgZ2VuZXJhdGVkIGluIGEgY2FsbGVkIGZ1bmN0aW9uIHJhdGhlciB0aGFuCi0vLyB0aGUgY3VycmVudCBjb250ZXh0LgotCi10eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCBFeHBlY3RGYXRhbEZhaWx1cmVUZXN0OwotCi1URVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc0ZhdGFsRmFsaXVyZSkgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYXRhbEZhaWx1cmUoKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNTdHJpbmdPYmplY3QpIHsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksIDo6c3RyaW5nKCJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpKTsKLX0KLSNlbmRpZgotCi1URVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c1N0ZFN0cmluZ09iamVjdCkgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYXRhbEZhaWx1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnN0cmluZygiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKSk7Ci19Ci0KLVRFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBDYXRjaGVzRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7Ci0gIC8vIFdlIGhhdmUgYW5vdGhlciB0ZXN0IGJlbG93IHRvIHZlcmlmeSB0aGF0IHRoZSBtYWNybyBjYXRjaGVzIGZhdGFsCi0gIC8vIGZhaWx1cmVzIGdlbmVyYXRlZCBvbiBhbm90aGVyIHRocmVhZC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmF0YWxGYWlsdXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOwotfQotCi0jaWZkZWYgX19CT1JMQU5EQ19fCi0vLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIKLSMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYwotI2VuZGlmCi0KLS8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW4gYmUgdXNlZCBpbiBhIG5vbi12b2lkCi0vLyBmdW5jdGlvbiBldmVuIHdoZW4gdGhlIHN0YXRlbWVudCBpbiBpdCBjb250YWlucyBBU1NFUlRfKi4KLQotaW50IE5vblZvaWRGdW5jdGlvbigpIHsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoZmFsc2UpLCAiIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEZBSUwoKSwgIiIpOwotICByZXR1cm4gMDsKLX0KLQotVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhbkJlVXNlZEluTm9uVm9pZEZ1bmN0aW9uKSB7Ci0gIE5vblZvaWRGdW5jdGlvbigpOwotfQotCi0vLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgLi4uKSBkb2Vzbid0IGFib3J0IHRoZQotLy8gY3VycmVudCBmdW5jdGlvbiBldmVuIHRob3VnaCAnc3RhdGVtZW50JyBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlLgotCi12b2lkIERvZXNOb3RBYm9ydEhlbHBlcihib29sKiBhYm9ydGVkKSB7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKGZhbHNlKSwgIiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhGQUlMKCksICIiKTsKLQotICAqYWJvcnRlZCA9IGZhbHNlOwotfQotCi0jaWZkZWYgX19CT1JMQU5EQ19fCi0vLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcHJlc3NlZCB0aGVtLgotIyBwcmFnbWEgb3B0aW9uIHBvcAotI2VuZGlmCi0KLVRFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBEb2VzTm90QWJvcnQpIHsKLSAgYm9vbCBhYm9ydGVkID0gdHJ1ZTsKLSAgRG9lc05vdEFib3J0SGVscGVyKCZhYm9ydGVkKTsKLSAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRXssX09OX0FMTF9USFJFQURTfSBhY2NlcHRzIGEKLS8vIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gd2hpY2ggZXhwYW5kcyB0byBjb2RlIGNvbnRhaW5pbmcgYW4KLS8vIHVucHJvdGVjdGVkIGNvbW1hLgotCi1zdGF0aWMgaW50IGdsb2JhbF92YXIgPSAwOwotI2RlZmluZSBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfIGdsb2JhbF92YXIrKywgZ2xvYmFsX3ZhcisrCi0KLVRFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSkgewotI2lmbmRlZiBfX0JPUkxBTkRDX18KLSAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlci4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoewotICAgIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV87Ci0gICAgQWRkRmF0YWxGYWlsdXJlKCk7Ci0gIH0sICIiKTsKLSNlbmRpZgotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHsKLSAgICBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfOwotICAgIEFkZEZhdGFsRmFpbHVyZSgpOwotICB9LCAiIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFeyxPTl9BTExfVEhSRUFEU30uCi0KLXR5cGVkZWYgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0IEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3Q7Ci0KLVRFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYXRjaGVzTm9uZmF0YWxGYWlsdXJlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotVEVTVF9GKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNTdHJpbmdPYmplY3QpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkTm9uZmF0YWxGYWlsdXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nKCJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKSk7Ci19Ci0jZW5kaWYKLQotVEVTVF9GKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNTdGRTdHJpbmdPYmplY3QpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkTm9uZmF0YWxGYWlsdXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpKTsKLX0KLQotVEVTVF9GKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIENhdGNoZXNOb25mYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKLSAgLy8gV2UgaGF2ZSBhbm90aGVyIHRlc3QgYmVsb3cgdG8gdmVyaWZ5IHRoYXQgdGhlIG1hY3JvIGNhdGNoZXMKLSAgLy8gbm9uLWZhdGFsIGZhaWx1cmVzIGdlbmVyYXRlZCBvbiBhbm90aGVyIHRocmVhZC4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkTm9uZmF0YWxGYWlsdXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkV7LF9PTl9BTExfVEhSRUFEU30gYWNjZXB0cyBhCi0vLyBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHdoaWNoIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuCi0vLyB1bnByb3RlY3RlZCBjb21tYS4KLVRFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7Ci0gICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKLSAgICBBZGROb25mYXRhbEZhaWx1cmUoKTsKLSAgfSwgIiIpOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHsKLSAgICBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfOwotICAgIEFkZE5vbmZhdGFsRmFpbHVyZSgpOwotICB9LCAiIik7Ci19Ci0KLSNpZiBHVEVTVF9JU19USFJFQURTQUZFCi0KLXR5cGVkZWYgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJXaXRoVGhyZWFkc1Rlc3QKLSAgICBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0OwotCi1URVNUX0YoRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCwgRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKLX0KLQotVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUygKLSAgICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpLCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQotCi0vLyBUZXN0cyB0aGUgVGVzdFByb3BlcnR5IGNsYXNzLgotCi1URVNUKFRlc3RQcm9wZXJ0eVRlc3QsIENvbnN0cnVjdG9yV29ya3MpIHsKLSAgY29uc3QgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXkiLCAidmFsdWUiKTsKLSAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgidmFsdWUiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKLX0KLQotVEVTVChUZXN0UHJvcGVydHlUZXN0LCBTZXRWYWx1ZSkgewotICBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleSIsICJ2YWx1ZV8xIik7Ci0gIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOwotICBwcm9wZXJ0eS5TZXRWYWx1ZSgidmFsdWVfMiIpOwotICBFWFBFQ1RfU1RSRVEoImtleSIsIHByb3BlcnR5LmtleSgpKTsKLSAgRVhQRUNUX1NUUkVRKCJ2YWx1ZV8yIiwgcHJvcGVydHkudmFsdWUoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBUZXN0UmVzdWx0IGNsYXNzCi0KLS8vIFRoZSB0ZXN0IGZpeHR1cmUgZm9yIHRlc3RpbmcgVGVzdFJlc3VsdC4KLWNsYXNzIFRlc3RSZXN1bHRUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4gVFBSVmVjdG9yOwotCi0gIC8vIFdlIG1ha2UgdXNlIG9mIDIgVGVzdFBhcnRSZXN1bHQgb2JqZWN0cywKLSAgVGVzdFBhcnRSZXN1bHQgKiBwcjEsICogcHIyOwotCi0gIC8vIC4uLiBhbmQgMyBUZXN0UmVzdWx0IG9iamVjdHMuCi0gIFRlc3RSZXN1bHQgKiByMCwgKiByMSwgKiByMjsKLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgLy8gcHIxIGlzIGZvciBzdWNjZXNzLgotICAgIHByMSA9IG5ldyBUZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28vYmFyLmNjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWNjZXNzISIpOwotCi0gICAgLy8gcHIyIGlzIGZvciBmYXRhbCBmYWlsdXJlLgotICAgIHByMiA9IG5ldyBUZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby9iYXIuY2MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgIC8vIFRoaXMgbGluZSBudW1iZXIgbWVhbnMgInVua25vd24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsdXJlISIpOwotCi0gICAgLy8gQ3JlYXRlcyB0aGUgVGVzdFJlc3VsdCBvYmplY3RzLgotICAgIHIwID0gbmV3IFRlc3RSZXN1bHQoKTsKLSAgICByMSA9IG5ldyBUZXN0UmVzdWx0KCk7Ci0gICAgcjIgPSBuZXcgVGVzdFJlc3VsdCgpOwotCi0gICAgLy8gSW4gb3JkZXIgdG8gdGVzdCBUZXN0UmVzdWx0LCB3ZSBuZWVkIHRvIG1vZGlmeSBpdHMgaW50ZXJuYWwKLSAgICAvLyBzdGF0ZSwgaW4gcGFydGljdWxhciB0aGUgVGVzdFBhcnRSZXN1bHQgdmVjdG9yIGl0IGhvbGRzLgotICAgIC8vIHRlc3RfcGFydF9yZXN1bHRzKCkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci4KLSAgICAvLyBXZSBjYXN0IGl0IHRvIGEgbm9uLWNvbnN0IG9iamVjdCBzLnQuIGl0IGNhbiBiZSBtb2RpZmllZCAoeWVzLAotICAgIC8vIHRoaXMgaXMgYSBoYWNrKS4KLSAgICBUUFJWZWN0b3IqIHJlc3VsdHMxID0gY29uc3RfY2FzdDxUUFJWZWN0b3IqPigKLSAgICAgICAgJlRlc3RSZXN1bHRBY2Nlc3Nvcjo6dGVzdF9wYXJ0X3Jlc3VsdHMoKnIxKSk7Ci0gICAgVFBSVmVjdG9yKiByZXN1bHRzMiA9IGNvbnN0X2Nhc3Q8VFBSVmVjdG9yKj4oCi0gICAgICAgICZUZXN0UmVzdWx0QWNjZXNzb3I6OnRlc3RfcGFydF9yZXN1bHRzKCpyMikpOwotCi0gICAgLy8gcjAgaXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KLQotICAgIC8vIHIxIGNvbnRhaW5zIGEgc2luZ2xlIFNVQ0NFU1MgVGVzdFBhcnRSZXN1bHQuCi0gICAgcmVzdWx0czEtPnB1c2hfYmFjaygqcHIxKTsKLQotICAgIC8vIHIyIGNvbnRhaW5zIGEgU1VDQ0VTUywgYW5kIGEgRkFJTFVSRS4KLSAgICByZXN1bHRzMi0+cHVzaF9iYWNrKCpwcjEpOwotICAgIHJlc3VsdHMyLT5wdXNoX2JhY2soKnByMik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgZGVsZXRlIHByMTsKLSAgICBkZWxldGUgcHIyOwotCi0gICAgZGVsZXRlIHIwOwotICAgIGRlbGV0ZSByMTsKLSAgICBkZWxldGUgcjI7Ci0gIH0KLQotICAvLyBIZWxwZXIgdGhhdCBjb21wYXJlcyB0d28gdHdvIFRlc3RQYXJ0UmVzdWx0cy4KLSAgc3RhdGljIHZvaWQgQ29tcGFyZVRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBhY3R1YWwpIHsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQudHlwZSgpLCBhY3R1YWwudHlwZSgpKTsKLSAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQuZmlsZV9uYW1lKCksIGFjdHVhbC5maWxlX25hbWUoKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLmxpbmVfbnVtYmVyKCksIGFjdHVhbC5saW5lX251bWJlcigpKTsKLSAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQuc3VtbWFyeSgpLCBhY3R1YWwuc3VtbWFyeSgpKTsKLSAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQubWVzc2FnZSgpLCBhY3R1YWwubWVzc2FnZSgpKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucGFzc2VkKCksIGFjdHVhbC5wYXNzZWQoKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLmZhaWxlZCgpLCBhY3R1YWwuZmFpbGVkKCkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC5ub25mYXRhbGx5X2ZhaWxlZCgpLCBhY3R1YWwubm9uZmF0YWxseV9mYWlsZWQoKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLmZhdGFsbHlfZmFpbGVkKCksIGFjdHVhbC5mYXRhbGx5X2ZhaWxlZCgpKTsKLSAgfQotfTsKLQotLy8gVGVzdHMgVGVzdFJlc3VsdDo6dG90YWxfcGFydF9jb3VudCgpLgotVEVTVF9GKFRlc3RSZXN1bHRUZXN0LCB0b3RhbF9wYXJ0X2NvdW50KSB7Ci0gIEFTU0VSVF9FUSgwLCByMC0+dG90YWxfcGFydF9jb3VudCgpKTsKLSAgQVNTRVJUX0VRKDEsIHIxLT50b3RhbF9wYXJ0X2NvdW50KCkpOwotICBBU1NFUlRfRVEoMiwgcjItPnRvdGFsX3BhcnRfY291bnQoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RSZXN1bHQ6OlBhc3NlZCgpLgotVEVTVF9GKFRlc3RSZXN1bHRUZXN0LCBQYXNzZWQpIHsKLSAgQVNTRVJUX1RSVUUocjAtPlBhc3NlZCgpKTsKLSAgQVNTRVJUX1RSVUUocjEtPlBhc3NlZCgpKTsKLSAgQVNTRVJUX0ZBTFNFKHIyLT5QYXNzZWQoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RSZXN1bHQ6OkZhaWxlZCgpLgotVEVTVF9GKFRlc3RSZXN1bHRUZXN0LCBGYWlsZWQpIHsKLSAgQVNTRVJUX0ZBTFNFKHIwLT5GYWlsZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShyMS0+RmFpbGVkKCkpOwotICBBU1NFUlRfVFJVRShyMi0+RmFpbGVkKCkpOwotfQotCi0vLyBUZXN0cyBUZXN0UmVzdWx0OjpHZXRUZXN0UGFydFJlc3VsdCgpLgotCi10eXBlZGVmIFRlc3RSZXN1bHRUZXN0IFRlc3RSZXN1bHREZWF0aFRlc3Q7Ci0KLVRFU1RfRihUZXN0UmVzdWx0RGVhdGhUZXN0LCBHZXRUZXN0UGFydFJlc3VsdCkgewotICBDb21wYXJlVGVzdFBhcnRSZXN1bHQoKnByMSwgcjItPkdldFRlc3RQYXJ0UmVzdWx0KDApKTsKLSAgQ29tcGFyZVRlc3RQYXJ0UmVzdWx0KCpwcjIsIHIyLT5HZXRUZXN0UGFydFJlc3VsdCgxKSk7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocjItPkdldFRlc3RQYXJ0UmVzdWx0KDIpLCAiIik7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocjItPkdldFRlc3RQYXJ0UmVzdWx0KC0xKSwgIiIpOwotfQotCi0vLyBUZXN0cyBUZXN0UmVzdWx0IGhhcyBubyBwcm9wZXJ0aWVzIHdoZW4gbm9uZSBhcmUgYWRkZWQuCi1URVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIE5vUHJvcGVydGllc0ZvdW5kV2hlbk5vbmVBcmVBZGRlZCkgewotICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OwotICBBU1NFUlRfRVEoMCwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKLX0KLQotLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgdGhlIGV4cGVjdGVkIHByb3BlcnR5IHdoZW4gYWRkZWQuCi1URVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIE9uZVByb3BlcnR5Rm91bmRXaGVuQWRkZWQpIHsKLSAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKLSAgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXlfMSIsICIxIik7Ci0gIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eSk7Ci0gIEFTU0VSVF9FUSgxLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOwotICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eSA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgwKTsKLSAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsIGFjdHVhbF9wcm9wZXJ0eS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMSIsIGFjdHVhbF9wcm9wZXJ0eS52YWx1ZSgpKTsKLX0KLQotLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgbXVsdGlwbGUgcHJvcGVydGllcyB3aGVuIGFkZGVkLgotVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBNdWx0aXBsZVByb3BlcnRpZXNGb3VuZFdoZW5BZGRlZCkgewotICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMSgia2V5XzEiLCAiMSIpOwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMigia2V5XzIiLCAiMiIpOwotICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMSk7Ci0gIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8yKTsKLSAgQVNTRVJUX0VRKDIsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7Ci0gIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5XzEgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7Ci0gIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHlfMS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMSIsIGFjdHVhbF9wcm9wZXJ0eV8xLnZhbHVlKCkpOwotCi0gIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5XzIgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMSk7Ci0gIEVYUEVDVF9TVFJFUSgia2V5XzIiLCBhY3R1YWxfcHJvcGVydHlfMi5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMiIsIGFjdHVhbF9wcm9wZXJ0eV8yLnZhbHVlKCkpOwotfQotCi0vLyBUZXN0cyBUZXN0UmVzdWx0OjpSZWNvcmRQcm9wZXJ0eSgpIG92ZXJyaWRlcyB2YWx1ZXMgZm9yIGR1cGxpY2F0ZSBrZXlzLgotVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBPdmVycmlkZXNWYWx1ZXNGb3JEdXBsaWNhdGVLZXlzKSB7Ci0gIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7Ci0gIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8xXzEoImtleV8xIiwgIjEiKTsKLSAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzJfMSgia2V5XzIiLCAiMiIpOwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMV8yKCJrZXlfMSIsICIxMiIpOwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMl8yKCJrZXlfMiIsICIyMiIpOwotICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMV8xKTsKLSAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzJfMSk7Ci0gIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8xXzIpOwotICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMl8yKTsKLQotICBBU1NFUlRfRVEoMiwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKLSAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHlfMSA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgwKTsKLSAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsIGFjdHVhbF9wcm9wZXJ0eV8xLmtleSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIxMiIsIGFjdHVhbF9wcm9wZXJ0eV8xLnZhbHVlKCkpOwotCi0gIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5XzIgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMSk7Ci0gIEVYUEVDVF9TVFJFUSgia2V5XzIiLCBhY3R1YWxfcHJvcGVydHlfMi5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMjIiLCBhY3R1YWxfcHJvcGVydHlfMi52YWx1ZSgpKTsKLX0KLQotLy8gVGVzdHMgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KCkuCi1URVNUKFRlc3RSZXN1bHRQcm9wZXJ0eVRlc3QsIEdldFRlc3RQcm9wZXJ0eSkgewotICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMSgia2V5XzEiLCAiMSIpOwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMigia2V5XzIiLCAiMiIpOwotICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMygia2V5XzMiLCAiMyIpOwotICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMSk7Ci0gIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8yKTsKLSAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzMpOwotCi0gIGNvbnN0IFRlc3RQcm9wZXJ0eSYgZmV0Y2hlZF9wcm9wZXJ0eV8xID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOwotICBjb25zdCBUZXN0UHJvcGVydHkmIGZldGNoZWRfcHJvcGVydHlfMiA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgxKTsKLSAgY29uc3QgVGVzdFByb3BlcnR5JiBmZXRjaGVkX3Byb3BlcnR5XzMgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMik7Ci0KLSAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsIGZldGNoZWRfcHJvcGVydHlfMS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMSIsIGZldGNoZWRfcHJvcGVydHlfMS52YWx1ZSgpKTsKLQotICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgZmV0Y2hlZF9wcm9wZXJ0eV8yLmtleSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIyIiwgZmV0Y2hlZF9wcm9wZXJ0eV8yLnZhbHVlKCkpOwotCi0gIEVYUEVDVF9TVFJFUSgia2V5XzMiLCBmZXRjaGVkX3Byb3BlcnR5XzMua2V5KCkpOwotICBFWFBFQ1RfU1RSRVEoIjMiLCBmZXRjaGVkX3Byb3BlcnR5XzMudmFsdWUoKSk7Ci0KLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMyksICIiKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoLTEpLCAiIik7Ci19Ci0KLS8vIFRlc3RzIHRoZSBUZXN0IGNsYXNzLgotLy8KLS8vIEl0J3MgZGlmZmljdWx0IHRvIHRlc3QgZXZlcnkgcHVibGljIG1ldGhvZCBvZiB0aGlzIGNsYXNzICh3ZSBhcmUKLS8vIGFscmVhZHkgc3RyZXRjaGluZyB0aGUgbGltaXQgb2YgR29vZ2xlIFRlc3QgYnkgdXNpbmcgaXQgdG8gdGVzdCBpdHNlbGYhKS4KLS8vIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoYXQsIGFzIHdlIGFyZSBhbHJlYWR5IHRlc3RpbmcKLS8vIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFRlc3QgY2xhc3MgZXh0ZW5zaXZlbHkgYnkgdXNpbmcgR29vZ2xlIFRlc3QKLS8vIGFsb25lLgotLy8KLS8vIFRoZXJlZm9yZSwgdGhpcyBzZWN0aW9uIG9ubHkgY29udGFpbnMgb25lIHRlc3QuCi0KLS8vIFRlc3RzIHRoYXQgR1Rlc3RGbGFnU2F2ZXIgd29ya3Mgb24gV2luZG93cyBhbmQgTWFjLgotCi1jbGFzcyBHVGVzdEZsYWdTYXZlclRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICAvLyBTYXZlcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3Mgc3VjaCB0aGF0IHdlIGNhbiByZXN0b3JlIHRoZW0gbGF0ZXIsIGFuZAotICAvLyB0aGVuIHNldHMgdGhlbSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgd2lsbCBiZSBjYWxsZWQKLSAgLy8gYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIGlzIHJ1bi4KLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBzYXZlcl8gPSBuZXcgR1Rlc3RGbGFnU2F2ZXI7Ci0KLSAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGZhbHNlOwotICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBmYWxzZTsKLSAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gZmFsc2U7Ci0gICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGZhbHNlOwotICAgIEdURVNUX0ZMQUcoY29sb3IpID0gImF1dG8iOwotICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIiOwotICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBmYWxzZTsKLSAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKLSAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gdHJ1ZTsKLSAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IDA7Ci0gICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gMTsKLSAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gZmFsc2U7Ci0gICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBrTWF4U3RhY2tUcmFjZURlcHRoOwotICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSAiIjsKLSAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gZmFsc2U7Ci0gIH0KLQotICAvLyBSZXN0b3JlcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgdGhhdCB0aGUgdGVzdHMgaGF2ZSBtb2RpZmllZC4gIFRoaXMgd2lsbAotICAvLyBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBpcyBydW4uCi0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7Ci0gICAgZGVsZXRlIHNhdmVyXzsKLSAgICBzYXZlcl8gPSBOVUxMOwotICB9Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZW4KLSAgLy8gbW9kaWZpZXMgZWFjaCBvZiB0aGVtLgotICB2b2lkIFZlcmlmeUFuZE1vZGlmeUZsYWdzKCkgewotICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpOwotICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKTsKLSAgICBFWFBFQ1RfU1RSRVEoImF1dG8iLCBHVEVTVF9GTEFHKGNvbG9yKS5jX3N0cigpKTsKLSAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCIiLCBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpOwotICAgIEVYUEVDVF9TVFJFUSgiIiwgR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCkpOwotICAgIEVYUEVDVF9UUlVFKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpOwotICAgIEVYUEVDVF9FUSgwLCBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSk7Ci0gICAgRVhQRUNUX0VRKDEsIEdURVNUX0ZMQUcocmVwZWF0KSk7Ci0gICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoc2h1ZmZsZSkpOwotICAgIEVYUEVDVF9FUShrTWF4U3RhY2tUcmFjZURlcHRoLCBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCIiLCBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pLmNfc3RyKCkpOwotICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKTsKLQotICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gdHJ1ZTsKLSAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gdHJ1ZTsKLSAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gdHJ1ZTsKLSAgICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJubyI7Ci0gICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IHRydWU7Ci0gICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gImFiYyI7Ci0gICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IHRydWU7Ci0gICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmb28ueG1sIjsKLSAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gZmFsc2U7Ci0gICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSAxOwotICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IDEwMDsKLSAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gdHJ1ZTsKLSAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IDE7Ci0gICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9ICJsb2NhbGhvc3Q6MTIzNCI7Ci0gICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEZvciBzYXZpbmcgR29vZ2xlIFRlc3QgZmxhZ3MgZHVyaW5nIHRoaXMgdGVzdCBjYXNlLgotICBzdGF0aWMgR1Rlc3RGbGFnU2F2ZXIqIHNhdmVyXzsKLX07Ci0KLUdUZXN0RmxhZ1NhdmVyKiBHVGVzdEZsYWdTYXZlclRlc3Q6OnNhdmVyXyA9IE5VTEw7Ci0KLS8vIEdvb2dsZSBUZXN0IGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBvZiB0ZXN0cy4gIFRoZSBmb2xsb3dpbmcgdHdvCi0vLyB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gd29yayByZWdhcmRsZXNzIG9mIHRoZWlyIG9yZGVyLgotCi0vLyBNb2RpZmllcyB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gdGhlIHRlc3QgYm9keS4KLVRFU1RfRihHVGVzdEZsYWdTYXZlclRlc3QsIE1vZGlmeUdUZXN0RmxhZ3MpIHsKLSAgVmVyaWZ5QW5kTW9kaWZ5RmxhZ3MoKTsKLX0KLQotLy8gVmVyaWZpZXMgdGhhdCB0aGUgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gdGhlIGJvZHkgb2YgdGhlIHByZXZpb3VzIHRlc3Qgd2VyZQotLy8gcmVzdG9yZWQgdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLgotVEVTVF9GKEdUZXN0RmxhZ1NhdmVyVGVzdCwgVmVyaWZ5R1Rlc3RGbGFncykgewotICBWZXJpZnlBbmRNb2RpZnlGbGFncygpOwotfQotCi0vLyBTZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlIGdpdmVuCi0vLyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBhcmd1bWVudCBpcyAiIiwgdW5zZXRzIHRoZSBlbnZpcm9ubWVudAotLy8gdmFyaWFibGUuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYm90aCBhcmd1bWVudHMgYXJlIG5vdCBOVUxMLgotc3RhdGljIHZvaWQgU2V0RW52KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCi0gIHJldHVybjsKLSNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQotICAvLyBDKytCdWlsZGVyJ3MgcHV0ZW52IG9ubHkgc3RvcmVzIGEgcG9pbnRlciB0byBpdHMgcGFyYW1ldGVyOyB3ZSBoYXZlIHRvCi0gIC8vIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIGl0IG1pZ2h0IGJlIG5lZWRlZC4KLSAgLy8gV2UgdXNlIGFuIHN0ZDo6bWFwIHRvIGRvIHNvLgotICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nKj4gYWRkZWRfZW52OwotCi0gIC8vIEJlY2F1c2UgcHV0ZW52IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBidWZmZXIsIHdlIGNhbid0IGRlbGV0ZSB0aGUKLSAgLy8gcHJldmlvdXMgc3RyaW5nIChpZiBwcmVzZW50KSB1bnRpbCBhZnRlciBpdCdzIHJlcGxhY2VkLgotICBzdGQ6OnN0cmluZyAqcHJldl9lbnYgPSBOVUxMOwotICBpZiAoYWRkZWRfZW52LmZpbmQobmFtZSkgIT0gYWRkZWRfZW52LmVuZCgpKSB7Ci0gICAgcHJldl9lbnYgPSBhZGRlZF9lbnZbbmFtZV07Ci0gIH0KLSAgYWRkZWRfZW52W25hbWVdID0gbmV3IHN0ZDo6c3RyaW5nKAotICAgICAgKE1lc3NhZ2UoKSA8PCBuYW1lIDw8ICI9IiA8PCB2YWx1ZSkuR2V0U3RyaW5nKCkpOwotCi0gIC8vIFRoZSBzdGFuZGFyZCBzaWduYXR1cmUgb2YgcHV0ZW52IGFjY2VwdHMgYSAnY2hhcionIGFyZ3VtZW50LiBPdGhlcgotICAvLyBpbXBsZW1lbnRhdGlvbnMsIGxpa2UgQysrQnVpbGRlcidzLCBhY2NlcHQgYSAnY29uc3QgY2hhcionLgotICAvLyBXZSBjYXN0IGF3YXkgdGhlICdjb25zdCcgc2luY2UgdGhhdCB3b3VsZCB3b3JrIGZvciBib3RoIHZhcmlhbnRzLgotICBwdXRlbnYoY29uc3RfY2FzdDxjaGFyKj4oYWRkZWRfZW52W25hbWVdLT5jX3N0cigpKSk7Ci0gIGRlbGV0ZSBwcmV2X2VudjsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIElmIHdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KLSAgX3B1dGVudigoTWVzc2FnZSgpIDw8IG5hbWUgPDwgIj0iIDw8IHZhbHVlKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSNlbHNlCi0gIGlmICgqdmFsdWUgPT0gJ1wwJykgewotICAgIHVuc2V0ZW52KG5hbWUpOwotICB9IGVsc2UgewotICAgIHNldGVudihuYW1lLCB2YWx1ZSwgMSk7Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLX0KLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCi0KLXVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudjsKLQotLy8gVGVzdHMgSW50MzJGcm9tR1Rlc3RFbnYoKS4KLQotLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCi1URVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFyaWFibGVJc05vdFNldCkgewotICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIiIpOwotICBFWFBFQ1RfRVEoMTAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMTApKTsKLX0KLQotIyBpZiAhZGVmaW5lZChHVEVTVF9HRVRfSU5UMzJfRlJPTV9FTlZfKQotCi0vLyBUZXN0cyB0aGF0IEludDMyRnJvbUdUZXN0RW52KCkgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuIHRoZQotLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcmZsb3dzIGFzIGFuIEludDMyLgotVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhbHVlT3ZlcmZsb3dzKSB7Ci0gIHByaW50ZigiKGV4cGVjdGluZyAyIHdhcm5pbmdzKVxuIik7Ci0KLSAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIxMjM0NTY3ODk4NzY1NDMyMSIpOwotICBFWFBFQ1RfRVEoMjAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMjApKTsKLQotICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIi0xMjM0NTY3ODk4NzY1NDMyMSIpOwotICBFWFBFQ1RfRVEoMzAsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMzApKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRlY2ltYWwgaW50ZWdlci4KLVRFU1QoSW50MzJGcm9tR1Rlc3RFbnZUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZUlzSW52YWxpZCkgewotICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOwotCi0gIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiQTEiKTsKLSAgRVhQRUNUX0VRKDQwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDQwKSk7Ci0KLSAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIxMlgiKTsKLSAgRVhQRUNUX0VRKDUwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDUwKSk7Ci19Ci0KLSMgZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0dFVF9JTlQzMl9GUk9NX0VOVl8pCi0KLS8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSBwYXJzZXMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZQotLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBpdCByZXByZXNlbnRzIGEgdmFsaWQgZGVjaW1hbCBpbnRlZ2VyIGluCi0vLyB0aGUgcmFuZ2Ugb2YgYW4gSW50MzIuCi1URVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUGFyc2VzQW5kUmV0dXJuc1ZhbGlkVmFsdWUpIHsKLSAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIxMjMiKTsKLSAgRVhQRUNUX0VRKDEyMywgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAwKSk7Ci0KLSAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICItMzIxIik7Ci0gIEVYUEVDVF9FUSgtMzIxLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDApKTsKLX0KLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIFRlc3RzIFBhcnNlSW50MzJGbGFnKCkuCi0KLS8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IGNoYW5nZSB0aGUKLS8vIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBmbGFnIGhhcyB3cm9uZyBmb3JtYXQKLVRFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBSZXR1cm5zRmFsc2VGb3JJbnZhbGlkRmxhZykgewotICBJbnQzMiB2YWx1ZSA9IDEyMzsKLSAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWE9MTAwIiwgImIiLCAmdmFsdWUpKTsKLSAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOwotCi0gIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiYT0xMDAiLCAiYSIsICZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IGNoYW5nZSB0aGUKLS8vIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBmbGFnIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KLVRFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZU92ZXJmbG93cykgewotICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOwotCi0gIEludDMyIHZhbHVlID0gMTIzOwotICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYWJjPTEyMzQ1Njc4OTg3NjU0MzIxIiwgImFiYyIsICZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz0tMTIzNDU2Nzg5ODc2NTQzMjEiLCAiYWJjIiwgJnZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBQYXJzZUludDMyRmxhZygpIHJldHVybnMgZmFsc2UgYW5kIGRvZXNuJ3QgY2hhbmdlIHRoZQotLy8gb3V0cHV0IHZhbHVlIHdoZW4gdGhlIGZsYWcgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgZGVjaW1hbAotLy8gaW50ZWdlci4KLVRFU1QoUGFyc2VJbnQzMkZsYWdUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZUlzSW52YWxpZCkgewotICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOwotCi0gIEludDMyIHZhbHVlID0gMTIzOwotICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoIi0tYWJjPUExIiwgImFiYyIsICZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz0xMlgiLCAiYWJjIiwgJnZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBQYXJzZUludDMyRmxhZygpIHBhcnNlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYW5kCi0vLyByZXR1cm5zIHRydWUgd2hlbiB0aGUgZmxhZyByZXByZXNlbnRzIGEgdmFsaWQgZGVjaW1hbCBpbnRlZ2VyIGluCi0vLyB0aGUgcmFuZ2Ugb2YgYW4gSW50MzIuCi1URVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUGFyc2VzQW5kUmV0dXJuc1ZhbGlkVmFsdWUpIHsKLSAgSW50MzIgdmFsdWUgPSAxMjM7Ci0gIEVYUEVDVF9UUlVFKFBhcnNlSW50MzJGbGFnKCItLSIgR1RFU1RfRkxBR19QUkVGSVhfICJhYmM9NDU2IiwgImFiYyIsICZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoNDU2LCB2YWx1ZSk7Ci0KLSAgRVhQRUNUX1RSVUUoUGFyc2VJbnQzMkZsYWcoIi0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFiYz0tNzg5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyIsICZ2YWx1ZSkpOwotICBFWFBFQ1RfRVEoLTc4OSwgdmFsdWUpOwotfQotCi0vLyBUZXN0cyB0aGF0IEludDMyRnJvbUVudk9yRGllKCkgcGFyc2VzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyIG9yCi0vLyByZXR1cm5zIHRoZSBjb3JyZWN0IGRlZmF1bHQuCi0vLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRS4KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLVRFU1QoSW50MzJGcm9tRW52T3JEaWVUZXN0LCBQYXJzZXNBbmRSZXR1cm5zVmFsaWRWYWx1ZSkgewotICBFWFBFQ1RfRVEoMzMzLCBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgMzMzKSk7Ci0gIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgIjEyMyIpOwotICBFWFBFQ1RfRVEoMTIzLCBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgMzMzKSk7Ci0gIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgIi0xMjMiKTsKLSAgRVhQRUNUX0VRKC0xMjMsIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVW5zZXRWYXIiLCAzMzMpKTsKLX0KLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIFRlc3RzIHRoYXQgSW50MzJGcm9tRW52T3JEaWUoKSBhYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlCi0vLyBpZiB0aGUgdmFyaWFibGUgaXMgbm90IGFuIEludDMyLgotVEVTVChJbnQzMkZyb21FbnZPckRpZURlYXRoVGVzdCwgQWJvcnRzT25GYWlsdXJlKSB7Ci0gIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsICJ4eHgiKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKLSAgICAgIEludDMyRnJvbUVudk9yRGllKEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVkFSIiwgMTIzKSwKLSAgICAgICIuKiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IEludDMyRnJvbUVudk9yRGllKCkgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZQotLy8gaWYgdGhlIHZhcmlhYmxlIGNhbm5vdCBiZSByZXByZXNudGVkIGJ5IGFuIEludDMyLgotVEVTVChJbnQzMkZyb21FbnZPckRpZURlYXRoVGVzdCwgQWJvcnRzT25JbnQzMk92ZXJmbG93KSB7Ci0gIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsICIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0Iik7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCi0gICAgICBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsIDEyMyksCi0gICAgICAiLioiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBTaG91bGRSdW5UZXN0T25TaGFyZCgpIHNlbGVjdHMgYWxsIHRlc3RzCi0vLyB3aGVyZSB0aGVyZSBpcyAxIHNoYXJkLgotVEVTVChTaG91bGRSdW5UZXN0T25TaGFyZFRlc3QsIElzUGFydGl0aW9uV2hlblRoZXJlSXNPbmVTaGFyZCkgewotICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAwKSk7Ci0gIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDEpKTsKLSAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMikpOwotICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAzKSk7Ci0gIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDQpKTsKLX0KLQotY2xhc3MgU2hvdWxkU2hhcmRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGluZGV4X3Zhcl8gPSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIklOREVYIjsKLSAgICB0b3RhbF92YXJfID0gR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJUT1RBTCI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgU2V0RW52KGluZGV4X3Zhcl8sICIiKTsKLSAgICBTZXRFbnYodG90YWxfdmFyXywgIiIpOwotICB9Ci0KLSAgY29uc3QgY2hhciogaW5kZXhfdmFyXzsKLSAgY29uc3QgY2hhciogdG90YWxfdmFyXzsKLX07Ci0KLS8vIFRlc3RzIHRoYXQgc2hhcmRpbmcgaXMgZGlzYWJsZWQgaWYgbmVpdGhlciBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0vLyBhcmUgc2V0LgotVEVTVF9GKFNob3VsZFNoYXJkVGVzdCwgUmV0dXJuc0ZhbHNlV2hlbk5laXRoZXJFbnZWYXJJc1NldCkgewotICBTZXRFbnYoaW5kZXhfdmFyXywgIiIpOwotICBTZXRFbnYodG90YWxfdmFyXywgIiIpOwotCi0gIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOwotICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHNoYXJkaW5nIGlzIG5vdCBlbmFibGVkIGlmIHRvdGFsX3NoYXJkcyAgPT0gMS4KLVRFU1RfRihTaG91bGRTaGFyZFRlc3QsIFJldHVybnNGYWxzZVdoZW5Ub3RhbFNoYXJkSXNPbmUpIHsKLSAgU2V0RW52KGluZGV4X3Zhcl8sICIwIik7Ci0gIFNldEVudih0b3RhbF92YXJfLCAiMSIpOwotICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKLSAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBzaGFyZGluZyBpcyBlbmFibGVkIGlmIHRvdGFsX3NoYXJkcyA+IDEgYW5kCi0vLyB3ZSBhcmUgbm90IGluIGEgZGVhdGggdGVzdCBzdWJwcm9jZXNzLgotLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi1URVNUX0YoU2hvdWxkU2hhcmRUZXN0LCBXb3Jrc1doZW5TaGFyZEVudlZhcnNBcmVWYWxpZCkgewotICBTZXRFbnYoaW5kZXhfdmFyXywgIjQiKTsKLSAgU2V0RW52KHRvdGFsX3Zhcl8sICIyMiIpOwotICBFWFBFQ1RfVFJVRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOwotICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOwotCi0gIFNldEVudihpbmRleF92YXJfLCAiOCIpOwotICBTZXRFbnYodG90YWxfdmFyXywgIjkiKTsKLSAgRVhQRUNUX1RSVUUoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKLSAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKLQotICBTZXRFbnYoaW5kZXhfdmFyXywgIjAiKTsKLSAgU2V0RW52KHRvdGFsX3Zhcl8sICI5Iik7Ci0gIEVYUEVDVF9UUlVFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7Ci0gIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7Ci19Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBUZXN0cyB0aGF0IHdlIGV4aXQgaW4gZXJyb3IgaWYgdGhlIHNoYXJkaW5nIHZhbHVlcyBhcmUgbm90IHZhbGlkLgotCi10eXBlZGVmIFNob3VsZFNoYXJkVGVzdCBTaG91bGRTaGFyZERlYXRoVGVzdDsKLQotVEVTVF9GKFNob3VsZFNoYXJkRGVhdGhUZXN0LCBBYm9ydHNXaGVuU2hhcmRpbmdFbnZWYXJzQXJlSW52YWxpZCkgewotICBTZXRFbnYoaW5kZXhfdmFyXywgIjQiKTsKLSAgU2V0RW52KHRvdGFsX3Zhcl8sICI0Iik7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKLQotICBTZXRFbnYoaW5kZXhfdmFyXywgIjQiKTsKLSAgU2V0RW52KHRvdGFsX3Zhcl8sICItMiIpOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7Ci0KLSAgU2V0RW52KGluZGV4X3Zhcl8sICI1Iik7Ci0gIFNldEVudih0b3RhbF92YXJfLCAiIik7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKLQotICBTZXRFbnYoaW5kZXhfdmFyXywgIiIpOwotICBTZXRFbnYodG90YWxfdmFyXywgIjUiKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSksICIuKiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IFNob3VsZFJ1blRlc3RPblNoYXJkIGlzIGEgcGFydGl0aW9uIHdoZW4gNQotLy8gc2hhcmRzIGFyZSB1c2VkLgotVEVTVChTaG91bGRSdW5UZXN0T25TaGFyZFRlc3QsIElzUGFydGl0aW9uV2hlblRoZXJlQXJlRml2ZVNoYXJkcykgewotICAvLyBDaG9vc2UgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0ZXN0cyBhbmQgc2hhcmRzLgotICBjb25zdCBpbnQgbnVtX3Rlc3RzID0gMTc7Ci0gIGNvbnN0IGludCBudW1fc2hhcmRzID0gNTsKLQotICAvLyBDaGVjayBwYXJ0aXRpb25pbmc6IGVhY2ggdGVzdCBzaG91bGQgYmUgb24gZXhhY3RseSAxIHNoYXJkLgotICBmb3IgKGludCB0ZXN0X2lkID0gMDsgdGVzdF9pZCA8IG51bV90ZXN0czsgdGVzdF9pZCsrKSB7Ci0gICAgaW50IHByZXZfc2VsZWN0ZWRfc2hhcmRfaW5kZXggPSAtMTsKLSAgICBmb3IgKGludCBzaGFyZF9pbmRleCA9IDA7IHNoYXJkX2luZGV4IDwgbnVtX3NoYXJkczsgc2hhcmRfaW5kZXgrKykgewotICAgICAgaWYgKFNob3VsZFJ1blRlc3RPblNoYXJkKG51bV9zaGFyZHMsIHNoYXJkX2luZGV4LCB0ZXN0X2lkKSkgewotICAgICAgICBpZiAocHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA8IDApIHsKLSAgICAgICAgICBwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4ID0gc2hhcmRfaW5kZXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiU2hhcmQgIiA8PCBwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4IDw8ICIgYW5kICIKLSAgICAgICAgICAgIDw8IHNoYXJkX2luZGV4IDw8ICIgYXJlIGJvdGggc2VsZWN0ZWQgdG8gcnVuIHRlc3QgIiA8PCB0ZXN0X2lkOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2hlY2sgYmFsYW5jZTogVGhpcyBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIHNoYXJkaW5nIHByb3RvY29sLCBidXQgaXMgYQotICAvLyBkZXNpcmFibGUgcHJvcGVydHkgZm9yIHBlcmZvcm1hbmNlLgotICBmb3IgKGludCBzaGFyZF9pbmRleCA9IDA7IHNoYXJkX2luZGV4IDwgbnVtX3NoYXJkczsgc2hhcmRfaW5kZXgrKykgewotICAgIGludCBudW1fdGVzdHNfb25fc2hhcmQgPSAwOwotICAgIGZvciAoaW50IHRlc3RfaWQgPSAwOyB0ZXN0X2lkIDwgbnVtX3Rlc3RzOyB0ZXN0X2lkKyspIHsKLSAgICAgIG51bV90ZXN0c19vbl9zaGFyZCArPQotICAgICAgICBTaG91bGRSdW5UZXN0T25TaGFyZChudW1fc2hhcmRzLCBzaGFyZF9pbmRleCwgdGVzdF9pZCk7Ci0gICAgfQotICAgIEVYUEVDVF9HRShudW1fdGVzdHNfb25fc2hhcmQsIG51bV90ZXN0cyAvIG51bV9zaGFyZHMpOwotICB9Ci19Ci0KLS8vIEZvciB0aGUgc2FtZSByZWFzb24gd2UgYXJlIG5vdCBleHBsaWNpdGx5IHRlc3RpbmcgZXZlcnl0aGluZyBpbiB0aGUKLS8vIFRlc3QgY2xhc3MsIHRoZXJlIGFyZSBubyBzZXBhcmF0ZSB0ZXN0cyBmb3IgdGhlIGZvbGxvd2luZyBjbGFzc2VzCi0vLyAoZXhjZXB0IGZvciBzb21lIHRyaXZpYWwgY2FzZXMpOgotLy8KLS8vICAgVGVzdENhc2UsIFVuaXRUZXN0LCBVbml0VGVzdFJlc3VsdFByaW50ZXIuCi0vLwotLy8gU2ltaWxhcmx5LCB0aGVyZSBhcmUgbm8gc2VwYXJhdGUgdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgotLy8KLS8vICAgVEVTVCwgVEVTVF9GLCBSVU5fQUxMX1RFU1RTCi0KLVRFU1QoVW5pdFRlc3RUZXN0LCBDYW5HZXRPcmlnaW5hbFdvcmtpbmdEaXIpIHsKLSAgQVNTRVJUX1RSVUUoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgIT0gTlVMTCk7Ci0gIEVYUEVDVF9TVFJORShVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSwgIiIpOwotfQotCi1URVNUKFVuaXRUZXN0VGVzdCwgUmV0dXJuc1BsYXVzaWJsZVRpbWVzdGFtcCkgewotICBFWFBFQ1RfTFQoMCwgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnN0YXJ0X3RpbWVzdGFtcCgpKTsKLSAgRVhQRUNUX0xFKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5zdGFydF90aW1lc3RhbXAoKSwgR2V0VGltZUluTWlsbGlzKCkpOwotfQotCi0vLyBXaGVuIGEgcHJvcGVydHkgdXNpbmcgYSByZXNlcnZlZCBrZXkgaXMgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiwgaXQKLS8vIHRlc3RzIHRoYXQgYSBub24tZmF0YWwgZmFpbHVyZSBpcyBhZGRlZCwgYSBmYXRhbCBmYWlsdXJlIGlzIG5vdCBhZGRlZCwKLS8vIGFuZCB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVjb3JkZWQuCi12b2lkIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KAotICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0LCBjb25zdCBjaGFyKiBrZXkpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoVGVzdDo6UmVjb3JkUHJvcGVydHkoa2V5LCAiMSIpLCAiUmVzZXJ2ZWQga2V5Iik7Ci0gIEFTU0VSVF9FUSgwLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpIDw8ICJQcm9wZXJ0eSBmb3Iga2V5ICciIDw8IGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyByZWNvcmRlZCB1bmV4cGVjdGVkbHkuIjsKLX0KLQotdm9pZCBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAotICAgIGNvbnN0IGNoYXIqIGtleSkgewotICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfaW5mbyAhPSBOVUxMKTsKLSAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoKnRlc3RfaW5mby0+cmVzdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSk7Ci19Ci0KLXZvaWQgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCi0gICAgY29uc3QgY2hhcioga2V5KSB7Ci0gIGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKLSAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOwotICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleSgKLSAgICAgIHRlc3RfY2FzZS0+YWRfaG9jX3Rlc3RfcmVzdWx0KCksIGtleSk7Ci19Ci0KLXZvaWQgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICBjb25zdCBjaGFyKiBrZXkpIHsKLSAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoCi0gICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+YWRfaG9jX3Rlc3RfcmVzdWx0KCksIGtleSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgcHJvcGVydHkgcmVjb3JkaW5nIGZ1bmN0aW9ucyBpbiBVbml0VGVzdCBvdXRzaWRlIG9mIHRlc3RzCi0vLyBmdW5jdGlvbnMgY29ycmVjbHkuICBDcmVhdGluZyBhIHNlcGFyYXRlIGluc3RhbmNlIG9mIFVuaXRUZXN0IGVuc3VyZXMgaXQKLS8vIGlzIGluIGEgc3RhdGUgc2ltaWxhciB0byB0aGUgVW5pdFRlc3QncyBzaW5nbGV0b24ncyBiZXR3ZWVuIHRlc3RzLgotY2xhc3MgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3QgOgotICAgIHB1YmxpYyB0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKLSAgICAgICAgImRpc2FibGVkIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCi0gICAgICAgICJlcnJvcnMiKTsKLSAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKLSAgICAgICAgImZhaWx1cmVzIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCi0gICAgICAgICJuYW1lIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCi0gICAgICAgICJ0ZXN0cyIpOwotICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAotICAgICAgICAidGltZSIpOwotCi0gICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoInRlc3RfY2FzZV9rZXlfMSIsICIxIik7Ci0gICAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfY2FzZSgpOwotICAgIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2UtPmFkX2hvY190ZXN0X3Jlc3VsdCgpLnRlc3RfcHJvcGVydHlfY291bnQoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJ0ZXN0X2Nhc2Vfa2V5XzEiLAotICAgICAgICAgICAgICAgICB0ZXN0X2Nhc2UtPmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS5rZXkoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCIxIiwKLSAgICAgICAgICAgICAgICAgdGVzdF9jYXNlLT5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkudmFsdWUoKSk7Ci0gIH0KLX07Ci0KLS8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIHRoZSBleHBlY3RlZCBwcm9wZXJ0eSB3aGVuIGFkZGVkLgotVEVTVF9GKFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0LCBPbmVQcm9wZXJ0eUZvdW5kV2hlbkFkZGVkKSB7Ci0gIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8xIiwgIjEiKTsKLQotICBBU1NFUlRfRVEoMSwgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOwotCi0gIEVYUEVDVF9TVFJFUSgia2V5XzEiLAotICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkua2V5KCkpOwotICBFWFBFQ1RfU1RSRVEoIjEiLAotICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkudmFsdWUoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIG11bHRpcGxlIHByb3BlcnRpZXMgd2hlbiBhZGRlZC4KLVRFU1RfRihVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdCwgTXVsdGlwbGVQcm9wZXJ0aWVzRm91bmRXaGVuQWRkZWQpIHsKLSAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOwotICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMiIsICIyIik7Ci0KLSAgQVNTRVJUX0VRKDIsIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKLQotICBFWFBFQ1RfU1RSRVEoImtleV8xIiwKLSAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLmtleSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIxIiwgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkudmFsdWUoKSk7Ci0KLSAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsCi0gICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgxKS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMiIsIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDEpLnZhbHVlKCkpOwotfQotCi0vLyBUZXN0cyBUZXN0UmVzdWx0OjpSZWNvcmRQcm9wZXJ0eSgpIG92ZXJyaWRlcyB2YWx1ZXMgZm9yIGR1cGxpY2F0ZSBrZXlzLgotVEVTVF9GKFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0LCBPdmVycmlkZXNWYWx1ZXNGb3JEdXBsaWNhdGVLZXlzKSB7Ci0gIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8xIiwgIjEiKTsKLSAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzIiLCAiMiIpOwotICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxMiIpOwotICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMiIsICIyMiIpOwotCi0gIEFTU0VSVF9FUSgyLCB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLnRlc3RfcHJvcGVydHlfY291bnQoKSk7Ci0KLSAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsCi0gICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMTIiLAotICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkudmFsdWUoKSk7Ci0KLSAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsCi0gICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgxKS5rZXkoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMjIiLAotICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMSkudmFsdWUoKSk7Ci19Ci0KLVRFU1RfRihVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdCwKLSAgICAgICBBZGRGYWlsdXJlSW5zaWRlVGVzdHNXaGVuVXNpbmdUZXN0Q2FzZVJlc2VydmVkS2V5cykgewotICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAotICAgICAgIm5hbWUiKTsKLSAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKLSAgICAgICJ2YWx1ZV9wYXJhbSIpOwotICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAotICAgICAgInR5cGVfcGFyYW0iKTsKLSAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKLSAgICAgICJzdGF0dXMiKTsKLSAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKLSAgICAgICJ0aW1lIik7Ci0gIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCi0gICAgICAiY2xhc3NuYW1lIik7Ci19Ci0KLVRFU1RfRihVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdCwKLSAgICAgICBBZGRSZWNvcmRXaXRoUmVzZXJ2ZWRLZXlzR2VuZXJhdGVzQ29ycmVjdFByb3BlcnR5TGlzdCkgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KCJuYW1lIiwgIjEiKSwKLSAgICAgICInY2xhc3NuYW1lJywgJ25hbWUnLCAnc3RhdHVzJywgJ3RpbWUnLCAndHlwZV9wYXJhbScsIGFuZCAndmFsdWVfcGFyYW0nIgotICAgICAgIiBhcmUgcmVzZXJ2ZWQiKTsKLX0KLQotY2xhc3MgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyBFbnZpcm9ubWVudCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICAgICAgInRlc3RzIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICAgICAgImZhaWx1cmVzIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICAgICAgImRpc2FibGVkIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICAgICAgImVycm9ycyIpOwotICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCi0gICAgICAgICJuYW1lIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICAgICAgInRpbWVzdGFtcCIpOwotICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCi0gICAgICAgICJ0aW1lIik7Ci0gICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlPdXRzaWRlT2ZUZXN0Q2FzZSgKLSAgICAgICAgInJhbmRvbV9zZWVkIik7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgd2lsbCB0ZXN0IHByb3BlcnR5IHJlY29yZGluZyBvdXRzaWRlIG9mIGFueSB0ZXN0IG9yIHRlc3QgY2FzZS4KLXN0YXRpYyBFbnZpcm9ubWVudCogcmVjb3JkX3Byb3BlcnR5X2VudiA9Ci0gICAgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEVudmlyb25tZW50KTsKLQotLy8gVGhpcyBncm91cCBvZiB0ZXN0cyBpcyBmb3IgcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEKiwgZXRjKQotLy8gb2YgdmFyaW91cyBhcml0aWVzLiAgVGhleSBkbyBub3QgYXR0ZW1wdCB0byBiZSBleGhhdXN0aXZlLiAgUmF0aGVyLAotLy8gdmlldyB0aGVtIGFzIHNtb2tlIHRlc3RzIHRoYXQgY2FuIGJlIGVhc2lseSByZXZpZXdlZCBhbmQgdmVyaWZpZWQuCi0vLyBBIG1vcmUgY29tcGxldGUgc2V0IG9mIHRlc3RzIGZvciBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBjYW4gYmUgZm91bmQKLS8vIGluIGd0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYy4KLQotLy8gRmlyc3QsIHNvbWUgcHJlZGljYXRlcyBhbmQgcHJlZGljYXRlLWZvcm1hdHRlcnMgbmVlZGVkIGJ5IHRoZSB0ZXN0cy4KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbiBudW1iZXIuCi1ib29sIElzRXZlbihpbnQgbikgewotICByZXR1cm4gKG4gJSAyKSA9PSAwOwotfQotCi0vLyBBIGZ1bmN0b3IgdGhhdCByZXR1cm5zIHRydWUgaWZmIHRoZSBhcmd1bWVudCBpcyBhbiBldmVuIG51bWJlci4KLXN0cnVjdCBJc0V2ZW5GdW5jdG9yIHsKLSAgYm9vbCBvcGVyYXRvcigpKGludCBuKSB7IHJldHVybiBJc0V2ZW4obik7IH0KLX07Ci0KLS8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbiB0aGF0IGFzc2VydHMgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4KLS8vIG51bWJlci4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRJc0V2ZW4oY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsKLSAgaWYgKElzRXZlbihuKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8IGV4cHIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCBuIDw8ICIsIHdoaWNoIGlzIG5vdCBldmVuLiI7Ci0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7Ci19Ci0KLS8vIEEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBBc3NlcnRpb25SZXN1bHQgZm9yIHVzZSBpbgotLy8gRVhQRUNUL0FTU0VSVF9UUlVFL0ZBTFNFLgotQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdElzRXZlbihpbnQgbikgewotICBpZiAoSXNFdmVuKG4pKQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOwotICBlbHNlCi0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKLX0KLQotLy8gQSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIEFzc2VydGlvblJlc3VsdCBidXQgZ2l2ZXMgbm8KLS8vIGV4cGxhbmF0aW9uIHdoeSBpdCBzdWNjZWVkcy4gTmVlZGVkIGZvciB0ZXN0aW5nIHRoYXQKLS8vIEVYUEVDVC9BU1NFUlRfRkFMU0UgaGFuZGxlcyBzdWNoIGZ1bmN0aW9ucyBjb3JyZWN0bHkuCi1Bc3NlcnRpb25SZXN1bHQgUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbihpbnQgbikgewotICBpZiAoSXNFdmVuKG4pKQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOwotfQotCi0vLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3RvciB0aGF0IGFzc2VydHMgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4KLS8vIG51bWJlci4KLXN0cnVjdCBBc3NlcnRJc0V2ZW5GdW5jdG9yIHsKLSAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsKLSAgICByZXR1cm4gQXNzZXJ0SXNFdmVuKGV4cHIsIG4pOwotICB9Ci19OwotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBzdW0gb2YgdGhlIGFyZ3VtZW50cyBpcyBhbiBldmVuIG51bWJlci4KLWJvb2wgU3VtSXNFdmVuMihpbnQgbjEsIGludCBuMikgewotICByZXR1cm4gSXNFdmVuKG4xICsgbjIpOwotfQotCi0vLyBBIGZ1bmN0b3IgdGhhdCByZXR1cm5zIHRydWUgaWZmIHRoZSBzdW0gb2YgdGhlIGFyZ3VtZW50cyBpcyBhbiBldmVuCi0vLyBudW1iZXIuCi1zdHJ1Y3QgU3VtSXNFdmVuM0Z1bmN0b3IgewotICBib29sIG9wZXJhdG9yKCkoaW50IG4xLCBpbnQgbjIsIGludCBuMykgewotICAgIHJldHVybiBJc0V2ZW4objEgKyBuMiArIG4zKTsKLSAgfQotfTsKLQotLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uIHRoYXQgYXNzZXJ0cyB0aGUgc3VtIG9mIHRoZQotLy8gYXJndW1lbnRzIGlzIGFuIGV2ZW4gbnVtYmVyLgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFN1bUlzRXZlbjQoCi0gICAgY29uc3QgY2hhciogZTEsIGNvbnN0IGNoYXIqIGUyLCBjb25zdCBjaGFyKiBlMywgY29uc3QgY2hhciogZTQsCi0gICAgaW50IG4xLCBpbnQgbjIsIGludCBuMywgaW50IG40KSB7Ci0gIGNvbnN0IGludCBzdW0gPSBuMSArIG4yICsgbjMgKyBuNDsKLSAgaWYgKElzRXZlbihzdW0pKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwgZTEgPDwgIiArICIgPDwgZTIgPDwgIiArICIgPDwgZTMgPDwgIiArICIgPDwgZTQKLSAgICAgIDw8ICIgKCIgPDwgbjEgPDwgIiArICIgPDwgbjIgPDwgIiArICIgPDwgbjMgPDwgIiArICIgPDwgbjQKLSAgICAgIDw8ICIpIGV2YWx1YXRlcyB0byAiIDw8IHN1bSA8PCAiLCB3aGljaCBpcyBub3QgZXZlbi4iOwotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOwotfQotCi0vLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3RvciB0aGF0IGFzc2VydHMgdGhlIHN1bSBvZiB0aGUgYXJndW1lbnRzCi0vLyBpcyBhbiBldmVuIG51bWJlci4KLXN0cnVjdCBBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvciB7Ci0gIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKAotICAgICAgY29uc3QgY2hhciogZTEsIGNvbnN0IGNoYXIqIGUyLCBjb25zdCBjaGFyKiBlMywgY29uc3QgY2hhciogZTQsCi0gICAgICBjb25zdCBjaGFyKiBlNSwgaW50IG4xLCBpbnQgbjIsIGludCBuMywgaW50IG40LCBpbnQgbjUpIHsKLSAgICBjb25zdCBpbnQgc3VtID0gbjEgKyBuMiArIG4zICsgbjQgKyBuNTsKLSAgICBpZiAoSXNFdmVuKHN1bSkpIHsKLSAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gICAgfQotCi0gICAgTWVzc2FnZSBtc2c7Ci0gICAgbXNnIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0IDw8ICIgKyAiIDw8IGU1Ci0gICAgICAgIDw8ICIgKCIKLSAgICAgICAgPDwgbjEgPDwgIiArICIgPDwgbjIgPDwgIiArICIgPDwgbjMgPDwgIiArICIgPDwgbjQgPDwgIiArICIgPDwgbjUKLSAgICAgICAgPDwgIikgZXZhbHVhdGVzIHRvICIgPDwgc3VtIDw8ICIsIHdoaWNoIGlzIG5vdCBldmVuLiI7Ci0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKLSAgfQotfTsKLQotCi0vLyBUZXN0cyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KLQotLy8gVGVzdHMgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCBkb24ndCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgotVEVTVChQcmVkMVRlc3QsIFdpdGhvdXRGb3JtYXQpIHsKLSAgLy8gU3VjY2VzcyBjYXNlcy4KLSAgRVhQRUNUX1BSRUQxKElzRXZlbkZ1bmN0b3IoKSwgMikgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7Ci0gIEFTU0VSVF9QUkVEMShJc0V2ZW4sIDQpOwotCi0gIC8vIEZhaWx1cmUgY2FzZXMuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEMShJc0V2ZW4sIDUpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKLSAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1BSRUQxKElzRXZlbkZ1bmN0b3IoKSwgNSksCi0gICAgICAgICAgICAgICAgICAgICAgICJldmFsdWF0ZXMgdG8gZmFsc2UiKTsKLX0KLQotLy8gVGVzdHMgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgotVEVTVChQcmVkMVRlc3QsIFdpdGhGb3JtYXQpIHsKLSAgLy8gU3VjY2VzcyBjYXNlcy4KLSAgRVhQRUNUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW4sIDIpOwotICBBU1NFUlRfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbkZ1bmN0b3IoKSwgNCkKLSAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIFVORVhQRUNURUQhIjsKLQotICAvLyBGYWlsdXJlIGNhc2VzLgotICBjb25zdCBpbnQgbiA9IDU7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuRnVuY3RvcigpLCBuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm4gZXZhbHVhdGVzIHRvIDUsIHdoaWNoIGlzIG5vdCBldmVuLiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbiwgNSkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOwotICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOwotfQotCi0vLyBUZXN0cyB0aGF0IHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zIGV2YWx1YXRlcyB0aGVpciBhcmd1bWVudHMKLS8vIGV4YWN0bHkgb25jZS4KLVRFU1QoUHJlZDFUZXN0LCBTaW5nbGVFdmFsdWF0aW9uT25GYWlsdXJlKSB7Ci0gIC8vIEEgc3VjY2VzcyBjYXNlLgotICBzdGF0aWMgaW50IG4gPSAwOwotICBFWFBFQ1RfUFJFRDEoSXNFdmVuLCBuKyspOwotICBFWFBFQ1RfRVEoMSwgbikgPDwgIlRoZSBhcmd1bWVudCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOwotCi0gIC8vIEEgZmFpbHVyZSBjYXNlLgotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbkZ1bmN0b3IoKSwgbisrKQotICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7Ci0gIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Ci0gIEVYUEVDVF9FUSgyLCBuKSA8PCAiVGhlIGFyZ3VtZW50IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Ci19Ci0KLQotLy8gVGVzdHMgcHJlZGljYXRlIGFzc2VydGlvbnMgd2hvc2UgYXJpdHkgaXMgPj0gMi4KLQotLy8gVGVzdHMgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCBkb24ndCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgotVEVTVChQcmVkVGVzdCwgV2l0aG91dEZvcm1hdCkgewotICAvLyBTdWNjZXNzIGNhc2VzLgotICBBU1NFUlRfUFJFRDIoU3VtSXNFdmVuMiwgMiwgNCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7Ci0gIEVYUEVDVF9QUkVEMyhTdW1Jc0V2ZW4zRnVuY3RvcigpLCA0LCA2LCA4KTsKLQotICAvLyBGYWlsdXJlIGNhc2VzLgotICBjb25zdCBpbnQgbjEgPSAxOwotICBjb25zdCBpbnQgbjIgPSAyOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDIoU3VtSXNFdmVuMiwgbjEsIG4yKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7Ci0gIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEMyhTdW1Jc0V2ZW4zRnVuY3RvcigpLCAxLCAyLCA0KTsKLSAgfSwgImV2YWx1YXRlcyB0byBmYWxzZSIpOwotfQotCi0vLyBUZXN0cyBwcmVkaWNhdGUgYXNzZXJ0aW9ucyB0aGF0IHVzZSBhIGN1c3RvbSBmb3JtYXR0ZXIuCi1URVNUKFByZWRUZXN0LCBXaXRoRm9ybWF0KSB7Ci0gIC8vIFN1Y2Nlc3MgY2FzZXMuCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDQoQXNzZXJ0U3VtSXNFdmVuNCwgNCwgNiwgOCwgMTApIDw8Ci0gICAgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDUoQXNzZXJ0U3VtSXNFdmVuNUZ1bmN0b3IoKSwgMiwgNCwgNiwgOCwgMTApOwotCi0gIC8vIEZhaWx1cmUgY2FzZXMuCi0gIGNvbnN0IGludCBuMSA9IDE7Ci0gIGNvbnN0IGludCBuMiA9IDI7Ci0gIGNvbnN0IGludCBuMyA9IDQ7Ci0gIGNvbnN0IGludCBuNCA9IDY7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoQXNzZXJ0U3VtSXNFdmVuNCwgbjEsIG4yLCBuMywgbjQpOwotICB9LCAiZXZhbHVhdGVzIHRvIDEzLCB3aGljaCBpcyBub3QgZXZlbi4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX1BSRURfRk9STUFUNShBc3NlcnRTdW1Jc0V2ZW41RnVuY3RvcigpLCAxLCAyLCA0LCA2LCA4KQotICAgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7Ci0gIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgcHJlZGljYXRlIGFzc2VydGlvbnMgZXZhbHVhdGVzIHRoZWlyIGFyZ3VtZW50cwotLy8gZXhhY3RseSBvbmNlLgotVEVTVChQcmVkVGVzdCwgU2luZ2xlRXZhbHVhdGlvbk9uRmFpbHVyZSkgewotICAvLyBBIHN1Y2Nlc3MgY2FzZS4KLSAgaW50IG4xID0gMDsKLSAgaW50IG4yID0gMDsKLSAgRVhQRUNUX1BSRUQyKFN1bUlzRXZlbjIsIG4xKyssIG4yKyspOwotICBFWFBFQ1RfRVEoMSwgbjEpIDw8ICJBcmd1bWVudCAxIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Ci0gIEVYUEVDVF9FUSgxLCBuMikgPDwgIkFyZ3VtZW50IDIgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKLQotICAvLyBBbm90aGVyIHN1Y2Nlc3MgY2FzZS4KLSAgbjEgPSBuMiA9IDA7Ci0gIGludCBuMyA9IDA7Ci0gIGludCBuNCA9IDA7Ci0gIGludCBuNSA9IDA7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDUoQXNzZXJ0U3VtSXNFdmVuNUZ1bmN0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICBuMSsrLCBuMisrLCBuMysrLCBuNCsrLCBuNSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7Ci0gIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKLSAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOwotICBFWFBFQ1RfRVEoMSwgbjMpIDw8ICJBcmd1bWVudCAzIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Ci0gIEVYUEVDVF9FUSgxLCBuNCkgPDwgIkFyZ3VtZW50IDQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKLSAgRVhQRUNUX0VRKDEsIG41KSA8PCAiQXJndW1lbnQgNSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOwotCi0gIC8vIEEgZmFpbHVyZSBjYXNlLgotICBuMSA9IG4yID0gbjMgPSAwOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRDMoU3VtSXNFdmVuM0Z1bmN0b3IoKSwgKytuMSwgbjIrKywgbjMrKykKLSAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOwotICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOwotICBFWFBFQ1RfRVEoMSwgbjEpIDw8ICJBcmd1bWVudCAxIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Ci0gIEVYUEVDVF9FUSgxLCBuMikgPDwgIkFyZ3VtZW50IDIgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKLSAgRVhQRUNUX0VRKDEsIG4zKSA8PCAiQXJndW1lbnQgMyBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOwotCi0gIC8vIEFub3RoZXIgZmFpbHVyZSBjYXNlLgotICBuMSA9IG4yID0gbjMgPSBuNCA9IDA7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoQXNzZXJ0U3VtSXNFdmVuNCwgKytuMSwgbjIrKywgbjMrKywgbjQrKyk7Ci0gIH0sICJldmFsdWF0ZXMgdG8gMSwgd2hpY2ggaXMgbm90IGV2ZW4uIik7Ci0gIEVYUEVDVF9FUSgxLCBuMSkgPDwgIkFyZ3VtZW50IDEgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKLSAgRVhQRUNUX0VRKDEsIG4yKSA8PCAiQXJndW1lbnQgMiBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOwotICBFWFBFQ1RfRVEoMSwgbjMpIDw8ICJBcmd1bWVudCAzIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Ci0gIEVYUEVDVF9FUSgxLCBuNCkgPDwgIkFyZ3VtZW50IDQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKLX0KLQotCi0vLyBTb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgdXNpbmcgb3ZlcmxvYWRlZC90ZW1wbGF0ZQotLy8gZnVuY3Rpb25zIHdpdGggQVNTRVJUX1BSRURuIGFuZCBFWFBFQ1RfUFJFRG4uCi0KLWJvb2wgSXNQb3NpdGl2ZShkb3VibGUgeCkgewotICByZXR1cm4geCA+IDA7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBJc05lZ2F0aXZlKFQgeCkgewotICByZXR1cm4geCA8IDA7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1ib29sIEdyZWF0ZXJUaGFuKFQxIHgxLCBUMiB4MikgewotICByZXR1cm4geDEgPiB4MjsKLX0KLQotLy8gVGVzdHMgdGhhdCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiAqX1BSRUQqIGFzIGxvbmcgYXMKLS8vIHRoZWlyIHR5cGVzIGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KLVRFU1QoUHJlZGljYXRlQXNzZXJ0aW9uVGVzdCwgQWNjZXB0c092ZXJsb2FkZWRGdW5jdGlvbikgewotICAvLyBDKytCdWlsZGVyIHJlcXVpcmVzIEMtc3R5bGUgY2FzdHMgcmF0aGVyIHRoYW4gc3RhdGljX2Nhc3QuCi0gIEVYUEVDVF9QUkVEMSgoYm9vbCAoKikoaW50KSkoSXNQb3NpdGl2ZSksIDUpOyAgLy8gTk9MSU5UCi0gIEFTU0VSVF9QUkVEMSgoYm9vbCAoKikoZG91YmxlKSkoSXNQb3NpdGl2ZSksIDYuMCk7ICAvLyBOT0xJTlQKLX0KLQotLy8gVGVzdHMgdGhhdCB0ZW1wbGF0ZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEKiBhcyBsb25nIGFzCi0vLyB0aGVpciB0eXBlcyBhcmUgZXhwbGljaXRseSBzcGVjaWZpZWQuCi1URVNUKFByZWRpY2F0ZUFzc2VydGlvblRlc3QsIEFjY2VwdHNUZW1wbGF0ZUZ1bmN0aW9uKSB7Ci0gIEVYUEVDVF9QUkVEMShJc05lZ2F0aXZlPGludD4sIC01KTsKLSAgLy8gTWFrZXMgc3VyZSB0aGF0IHdlIGNhbiBoYW5kbGUgdGVtcGxhdGVzIHdpdGggbW9yZSB0aGFuIG9uZQotICAvLyBwYXJhbWV0ZXIuCi0gIEFTU0VSVF9QUkVEMigoR3JlYXRlclRoYW48aW50LCBpbnQ+KSwgNSwgMCk7Ci19Ci0KLQotLy8gU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIHVzaW5nIG92ZXJsb2FkZWQvdGVtcGxhdGUKLS8vIGZ1bmN0aW9ucyB3aXRoIEFTU0VSVF9QUkVEX0ZPUk1BVG4gYW5kIEVYUEVDVF9QUkVEX0ZPUk1BVG4uCi0KLUFzc2VydGlvblJlc3VsdCBJc1Bvc2l0aXZlRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIgKi8sIGludCBuKSB7Ci0gIHJldHVybiBuID4gMCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6Ci0gICAgICBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiRmFpbHVyZSIpOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNQb3NpdGl2ZUZvcm1hdChjb25zdCBjaGFyKiAvKiBleHByICovLCBkb3VibGUgeCkgewotICByZXR1cm4geCA+IDAgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgotICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1Bc3NlcnRpb25SZXN1bHQgSXNOZWdhdGl2ZUZvcm1hdChjb25zdCBjaGFyKiAvKiBleHByICovLCBUIHgpIHsKLSAgcmV0dXJuIHggPCAwID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKLSAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1Bc3NlcnRpb25SZXN1bHQgRXF1YWxzRm9ybWF0KGNvbnN0IGNoYXIqIC8qIGV4cHIxICovLCBjb25zdCBjaGFyKiAvKiBleHByMiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHgxLCBjb25zdCBUMiYgeDIpIHsKLSAgcmV0dXJuIHgxID09IHgyID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKLSAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEX0ZPUk1BVCoKLS8vIHdpdGhvdXQgZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZWlyIHR5cGVzLgotVEVTVChQcmVkaWNhdGVGb3JtYXRBc3NlcnRpb25UZXN0LCBBY2NlcHRzT3ZlcmxvYWRlZEZ1bmN0aW9uKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNQb3NpdGl2ZUZvcm1hdCwgNSk7Ci0gIEFTU0VSVF9QUkVEX0ZPUk1BVDEoSXNQb3NpdGl2ZUZvcm1hdCwgNi4wKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0ZW1wbGF0ZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEX0ZPUk1BVCogd2l0aG91dAotLy8gZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZWlyIHR5cGVzLgotVEVTVChQcmVkaWNhdGVGb3JtYXRBc3NlcnRpb25UZXN0LCBBY2NlcHRzVGVtcGxhdGVGdW5jdGlvbikgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQxKElzTmVnYXRpdmVGb3JtYXQsIC01KTsKLSAgQVNTRVJUX1BSRURfRk9STUFUMihFcXVhbHNGb3JtYXQsIDMsIDMpOwotfQotCi0KLS8vIFRlc3RzIHN0cmluZyBhc3NlcnRpb25zLgotCi0vLyBUZXN0cyBBU1NFUlRfU1RSRVEgd2l0aCBub24tTlVMTCBhcmd1bWVudHMuCi1URVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIEFTU0VSVF9TVFJFUSkgewotICBjb25zdCBjaGFyICogY29uc3QgcDEgPSAiZ29vZCI7Ci0gIEFTU0VSVF9TVFJFUShwMSwgcDEpOwotCi0gIC8vIExldCBwMiBoYXZlIHRoZSBzYW1lIGNvbnRlbnQgYXMgcDEsIGJ1dCBiZSBhdCBhIGRpZmZlcmVudCBhZGRyZXNzLgotICBjb25zdCBjaGFyIHAyW10gPSAiZ29vZCI7Ci0gIEFTU0VSVF9TVFJFUShwMSwgcDIpOwotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUSgiYmFkIiwgImdvb2QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBcImJhZFwiIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9TVFJFUSB3aXRoIE5VTEwgYXJndW1lbnRzLgotVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSRVFfTnVsbCkgewotICBBU1NFUlRfU1RSRVEoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKSwgTlVMTCk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUShOVUxMLCAibm9uLW51bGwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1udWxsIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9TVFJFUSB3aXRoIE5VTEwgYXJndW1lbnRzLgotVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSRVFfTnVsbDIpIHsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKCJub24tbnVsbCIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAibm9uLW51bGwiKTsKLX0KLQotLy8gVGVzdHMgQVNTRVJUX1NUUk5FLgotVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSTkUpIHsKLSAgQVNTRVJUX1NUUk5FKCJoaSIsICJIaSIpOwotICBBU1NFUlRfU1RSTkUoIkhpIiwgTlVMTCk7Ci0gIEFTU0VSVF9TVFJORShOVUxMLCAiSGkiKTsKLSAgQVNTRVJUX1NUUk5FKCIiLCBOVUxMKTsKLSAgQVNTRVJUX1NUUk5FKE5VTEwsICIiKTsKLSAgQVNTRVJUX1NUUk5FKCIiLCAiSGkiKTsKLSAgQVNTRVJUX1NUUk5FKCJIaSIsICIiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUk5FKCJIaSIsICJIaSIpLAotICAgICAgICAgICAgICAgICAgICAgICAiXCJIaVwiIHZzIFwiSGlcIiIpOwotfQotCi0vLyBUZXN0cyBBU1NFUlRfU1RSQ0FTRUVRLgotVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSQ0FTRUVRKSB7Ci0gIEFTU0VSVF9TVFJDQVNFRVEoImhpIiwgIkhpIik7Ci0gIEFTU0VSVF9TVFJDQVNFRVEoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKSwgTlVMTCk7Ci0KLSAgQVNTRVJUX1NUUkNBU0VFUSgiIiwgIiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRUVRKCJIaSIsICJoaTIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIihpZ25vcmluZyBjYXNlKSIpOwotfQotCi0vLyBUZXN0cyBBU1NFUlRfU1RSQ0FTRU5FLgotVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSQ0FTRU5FKSB7Ci0gIEFTU0VSVF9TVFJDQVNFTkUoImhpMSIsICJIaTIiKTsKLSAgQVNTRVJUX1NUUkNBU0VORSgiSGkiLCBOVUxMKTsKLSAgQVNTRVJUX1NUUkNBU0VORShOVUxMLCAiSGkiKTsKLSAgQVNTRVJUX1NUUkNBU0VORSgiIiwgTlVMTCk7Ci0gIEFTU0VSVF9TVFJDQVNFTkUoTlVMTCwgIiIpOwotICBBU1NFUlRfU1RSQ0FTRU5FKCIiLCAiSGkiKTsKLSAgQVNTRVJUX1NUUkNBU0VORSgiSGkiLCAiIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFTkUoIkhpIiwgImhpIiksCi0gICAgICAgICAgICAgICAgICAgICAgICIoaWdub3JpbmcgY2FzZSkiKTsKLX0KLQotLy8gVGVzdHMgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCi1URVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIFNUUkVRX1dpZGUpIHsKLSAgLy8gTlVMTCBzdHJpbmdzLgotICBBU1NFUlRfU1RSRVEoc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCAqPihOVUxMKSwgTlVMTCk7Ci0KLSAgLy8gRW1wdHkgc3RyaW5ncy4KLSAgQVNTRVJUX1NUUkVRKEwiIiwgTCIiKTsKLQotICAvLyBOb24tbnVsbCB2cyBOVUxMLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoTCJub24tbnVsbCIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLW51bGwiKTsKLQotICAvLyBFcXVhbCBzdHJpbmdzLgotICBFWFBFQ1RfU1RSRVEoTCJIaSIsIEwiSGkiKTsKLQotICAvLyBVbmVxdWFsIHN0cmluZ3MuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUShMImFiYyIsIEwiQWJjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJBYmMiKTsKLQotICAvLyBTdHJpbmdzIGNvbnRhaW5pbmcgd2lkZSBjaGFyYWN0ZXJzLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoTCJhYmNceDgxMTkiLCBMImFiY1x4ODEyMCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIik7Ci0KLSAgLy8gVGhlIHN0cmVhbWluZyB2YXJpYXRpb24uCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9TVFJFUShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTIxIikgPDwgIkV4cGVjdGVkIGZhaWx1cmUiOwotICB9LCAiRXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi0vLyBUZXN0cyAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KLVRFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgU1RSTkVfV2lkZSkgewotICAvLyBOVUxMIHN0cmluZ3MuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9TVFJORShzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90ICo+KE5VTEwpLCBOVUxMKTsKLSAgfSwgIiIpOwotCi0gIC8vIEVtcHR5IHN0cmluZ3MuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORShMIiIsIEwiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJMXCJcIiIpOwotCi0gIC8vIE5vbi1udWxsIHZzIE5VTEwuCi0gIEFTU0VSVF9TVFJORShMIm5vbi1udWxsIiwgTlVMTCk7Ci0KLSAgLy8gRXF1YWwgc3RyaW5ncy4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKEwiSGkiLCBMIkhpIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJMXCJIaVwiIik7Ci0KLSAgLy8gVW5lcXVhbCBzdHJpbmdzLgotICBFWFBFQ1RfU1RSTkUoTCJhYmMiLCBMIkFiYyIpOwotCi0gIC8vIFN0cmluZ3MgY29udGFpbmluZyB3aWRlIGNoYXJhY3RlcnMuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTE5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiKTsKLQotICAvLyBUaGUgc3RyZWFtaW5nIHZhcmlhdGlvbi4KLSAgQVNTRVJUX1NUUk5FKEwiYWJjXHg4MTE5IiwgTCJhYmNceDgxMjAiKSA8PCAiVGhpcyBzaG91bGRuJ3QgaGFwcGVuIjsKLX0KLQotLy8gVGVzdHMgZm9yIDo6dGVzdGluZzo6SXNTdWJzdHJpbmcoKS4KLQotLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IGNoYXIqLgotVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yQ1N0cmluZykgewotICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBOVUxMLCAiYSIpKTsKLSAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgImIiLCBOVUxMKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAiaGF5c3RhY2siKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oTlVMTCksIE5VTEwpKTsKLSAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCAibmVlZGxlIiwgInR3byBuZWVkbGVzIikpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKLS8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3Qgd2NoYXJfdCouCi1URVNUKElzU3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JXaWRlQ1N0cmluZykgewotICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBrTnVsbCwgTCJhIikpOwotICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBMImIiLCBrTnVsbCkpOwotICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwiaGF5c3RhY2siKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oTlVMTCksIE5VTEwpKTsKLSAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwidHdvIG5lZWRsZXMiKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAotLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCBjaGFyKi4KLVRFU1QoSXNTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvckNTdHJpbmcpIHsKLSAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKLSAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJuZWVkbGVcIlxuIgotICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCi0gICAgICAgICAgICAgICAiV2hpY2ggaXM6IFwiaGF5c3RhY2tcIiIsCi0gICAgICAgICAgICAgICBJc1N1YnN0cmluZygibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZGxlIiwgImhheXN0YWNrIikuZmFpbHVyZV9tZXNzYWdlKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjpzdHJpbmcuCi1URVNUKElzU3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRzRm9yU3RkU3RyaW5nKSB7Ci0gIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgc3RkOjpzdHJpbmcoImhlbGxvIiksICJhaGVsbG9iIikpOwotICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCAiaGVsbG8iLCBzdGQ6OnN0cmluZygid29ybGQiKSkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0vLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjp3c3RyaW5nLgotVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yU3RkV3N0cmluZykgewotICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIDo6c3RkOjp3c3RyaW5nKEwibmVlZGxlIiksIEwidHdvIG5lZWRsZXMiKSk7Ci0gIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgOjpzdGQ6OndzdHJpbmcoTCJoYXlzdGFjayIpKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAotLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6d3N0cmluZy4KLVRFU1QoSXNTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvcldzdHJpbmcpIHsKLSAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKLSAgICAgICAgICAgICAgICIgIEFjdHVhbDogTFwibmVlZGxlXCJcbiIKLSAgICAgICAgICAgICAgICJFeHBlY3RlZDogYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgotICAgICAgICAgICAgICAgIldoaWNoIGlzOiBMXCJoYXlzdGFja1wiIiwKLSAgICAgICAgICAgICAgIElzU3Vic3RyaW5nKAotICAgICAgICAgICAgICAgICAgICJuZWVkbGVfZXhwciIsICJoYXlzdGFja19leHByIiwKLSAgICAgICAgICAgICAgICAgICA6OnN0ZDo6d3N0cmluZyhMIm5lZWRsZSIpLCBMImhheXN0YWNrIikuZmFpbHVyZV9tZXNzYWdlKCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi0vLyBUZXN0cyBmb3IgOjp0ZXN0aW5nOjpJc05vdFN1YnN0cmluZygpLgotCi0vLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nKCkgcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHQgd2hlbiB0aGUgaW5wdXQKLS8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3QgY2hhciouCi1URVNUKElzTm90U3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRGb3JDU3RyaW5nKSB7Ci0gIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJoYXlzdGFjayIpKTsKLSAgRVhQRUNUX0ZBTFNFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJ0d28gbmVlZGxlcyIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IHdjaGFyX3QqLgotVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yV2lkZUNTdHJpbmcpIHsKLSAgRVhQRUNUX1RSVUUoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwiaGF5c3RhY2siKSk7Ci0gIEVYUEVDVF9GQUxTRShJc05vdFN1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgTCJ0d28gbmVlZGxlcyIpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBtZXNzYWdlIHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IHdjaGFyX3QqLgotVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIEdlbmVyYXRlc0NvcnJlY3RNZXNzYWdlRm9yV2lkZUNTdHJpbmcpIHsKLSAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKLSAgICAgICAgICAgICAgICIgIEFjdHVhbDogTFwibmVlZGxlXCJcbiIKLSAgICAgICAgICAgICAgICJFeHBlY3RlZDogbm90IGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrX2V4cHJcbiIKLSAgICAgICAgICAgICAgICJXaGljaCBpczogTFwidHdvIG5lZWRsZXNcIiIsCi0gICAgICAgICAgICAgICBJc05vdFN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCi0gICAgICAgICAgICAgICAgICAgTCJuZWVkbGUiLCBMInR3byBuZWVkbGVzIikuZmFpbHVyZV9tZXNzYWdlKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjpzdHJpbmcuCi1URVNUKElzTm90U3Vic3RyaW5nVGVzdCwgUmV0dXJuc0NvcnJlY3RSZXN1bHRzRm9yU3RkU3RyaW5nKSB7Ci0gIEVYUEVDVF9GQUxTRShJc05vdFN1YnN0cmluZygiIiwgIiIsIHN0ZDo6c3RyaW5nKCJoZWxsbyIpLCAiYWhlbGxvYiIpKTsKLSAgRVhQRUNUX1RSVUUoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCAiaGVsbG8iLCBzdGQ6OnN0cmluZygid29ybGQiKSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKLS8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OnN0cmluZy4KLVRFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvclN0ZFN0cmluZykgewotICBFWFBFQ1RfU1RSRVEoIlZhbHVlIG9mOiBuZWVkbGVfZXhwclxuIgotICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBcIm5lZWRsZVwiXG4iCi0gICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IG5vdCBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCi0gICAgICAgICAgICAgICAiV2hpY2ggaXM6IFwidHdvIG5lZWRsZXNcIiIsCi0gICAgICAgICAgICAgICBJc05vdFN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCi0gICAgICAgICAgICAgICAgICAgOjpzdGQ6OnN0cmluZygibmVlZGxlIiksICJ0d28gbmVlZGxlcyIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotCi0vLyBUZXN0cyB0aGF0IElzTm90U3Vic3RyaW5nIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0Ci0vLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjp3c3RyaW5nLgotVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yU3RkV3N0cmluZykgewotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBJc05vdFN1YnN0cmluZygiIiwgIiIsIDo6c3RkOjp3c3RyaW5nKEwibmVlZGxlIiksIEwidHdvIG5lZWRsZXMiKSk7Ci0gIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCA6OnN0ZDo6d3N0cmluZyhMImhheXN0YWNrIikpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotLy8gVGVzdHMgZmxvYXRpbmctcG9pbnQgYXNzZXJ0aW9ucy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Ci1jbGFzcyBGbG9hdGluZ1BvaW50VGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIFByZS1jYWxjdWxhdGVkIG51bWJlcnMgdG8gYmUgdXNlZCBieSB0aGUgdGVzdHMuCi0gIHN0cnVjdCBUZXN0VmFsdWVzIHsKLSAgICBSYXdUeXBlIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm87Ci0gICAgUmF3VHlwZSBjbG9zZV90b19uZWdhdGl2ZV96ZXJvOwotICAgIFJhd1R5cGUgZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm87Ci0KLSAgICBSYXdUeXBlIGNsb3NlX3RvX29uZTsKLSAgICBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9vbmU7Ci0KLSAgICBSYXdUeXBlIGluZmluaXR5OwotICAgIFJhd1R5cGUgY2xvc2VfdG9faW5maW5pdHk7Ci0gICAgUmF3VHlwZSBmdXJ0aGVyX2Zyb21faW5maW5pdHk7Ci0KLSAgICBSYXdUeXBlIG5hbjE7Ci0gICAgUmF3VHlwZSBuYW4yOwotICB9OwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gRmxvYXRpbmc7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRmxvYXRpbmc6OkJpdHMgQml0czsKLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgY29uc3Qgc2l6ZV90IG1heF91bHBzID0gRmxvYXRpbmc6OmtNYXhVbHBzOwotCi0gICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMC4wLgotICAgIGNvbnN0IEJpdHMgemVyb19iaXRzID0gRmxvYXRpbmcoMCkuYml0cygpOwotCi0gICAgLy8gTWFrZXMgc29tZSBudW1iZXJzIGNsb3NlIHRvIDAuMC4KLSAgICB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8gPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAotICAgICAgICB6ZXJvX2JpdHMgKyBtYXhfdWxwcy8yKTsKLSAgICB2YWx1ZXNfLmNsb3NlX3RvX25lZ2F0aXZlX3plcm8gPSAtRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKLSAgICAgICAgemVyb19iaXRzICsgbWF4X3VscHMgLSBtYXhfdWxwcy8yKTsKLSAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvID0gLUZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCi0gICAgICAgIHplcm9fYml0cyArIG1heF91bHBzICsgMSAtIG1heF91bHBzLzIpOwotCi0gICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMS4wLgotICAgIGNvbnN0IEJpdHMgb25lX2JpdHMgPSBGbG9hdGluZygxKS5iaXRzKCk7Ci0KLSAgICAvLyBNYWtlcyBzb21lIG51bWJlcnMgY2xvc2UgdG8gMS4wLgotICAgIHZhbHVlc18uY2xvc2VfdG9fb25lID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhvbmVfYml0cyArIG1heF91bHBzKTsKLSAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAotICAgICAgICBvbmVfYml0cyArIG1heF91bHBzICsgMSk7Ci0KLSAgICAvLyAraW5maW5pdHkuCi0gICAgdmFsdWVzXy5pbmZpbml0eSA9IEZsb2F0aW5nOjpJbmZpbml0eSgpOwotCi0gICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgK2luZmluaXR5LgotICAgIGNvbnN0IEJpdHMgaW5maW5pdHlfYml0cyA9IEZsb2F0aW5nKHZhbHVlc18uaW5maW5pdHkpLmJpdHMoKTsKLQotICAgIC8vIE1ha2VzIHNvbWUgbnVtYmVycyBjbG9zZSB0byBpbmZpbml0eS4KLSAgICB2YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5ID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKLSAgICAgICAgaW5maW5pdHlfYml0cyAtIG1heF91bHBzKTsKLSAgICB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9pbmZpbml0eSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCi0gICAgICAgIGluZmluaXR5X2JpdHMgLSBtYXhfdWxwcyAtIDEpOwotCi0gICAgLy8gTWFrZXMgc29tZSBOQU4ncy4gIFNldHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmcmFjdGlvbiBzbyB0aGF0Ci0gICAgLy8gb3VyIE5hTidzIGFyZSBxdWlldDsgdHJ5aW5nIHRvIHByb2Nlc3MgYSBzaWduYWxpbmcgTmFOIHdvdWxkIHJhaXNlIGFuCi0gICAgLy8gZXhjZXB0aW9uIGlmIG91ciBlbnZpcm9ubWVudCBlbmFibGVzIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMuCi0gICAgdmFsdWVzXy5uYW4xID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhGbG9hdGluZzo6a0V4cG9uZW50Qml0TWFzawotICAgICAgICB8IChzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoRmxvYXRpbmc6OmtGcmFjdGlvbkJpdENvdW50IC0gMSkpIHwgMSk7Ci0gICAgdmFsdWVzXy5uYW4yID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyhGbG9hdGluZzo6a0V4cG9uZW50Qml0TWFzawotICAgICAgICB8IChzdGF0aWNfY2FzdDxCaXRzPigxKSA8PCAoRmxvYXRpbmc6OmtGcmFjdGlvbkJpdENvdW50IC0gMSkpIHwgMjAwKTsKLSAgfQotCi0gIHZvaWQgVGVzdFNpemUoKSB7Ci0gICAgRVhQRUNUX0VRKHNpemVvZihSYXdUeXBlKSwgc2l6ZW9mKEJpdHMpKTsKLSAgfQotCi0gIHN0YXRpYyBUZXN0VmFsdWVzIHZhbHVlc187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KLXR5cGVuYW1lIEZsb2F0aW5nUG9pbnRUZXN0PFJhd1R5cGU+OjpUZXN0VmFsdWVzCi0gICAgRmxvYXRpbmdQb2ludFRlc3Q8UmF3VHlwZT46OnZhbHVlc187Ci0KLS8vIEluc3RhbnRpYXRlcyBGbG9hdGluZ1BvaW50VGVzdCBmb3IgdGVzdGluZyAqX0ZMT0FUX0VRLgotdHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxmbG9hdD4gRmxvYXRUZXN0OwotCi0vLyBUZXN0cyB0aGF0IHRoZSBzaXplIG9mIEZsb2F0OjpCaXRzIG1hdGNoZXMgdGhlIHNpemUgb2YgZmxvYXQuCi1URVNUX0YoRmxvYXRUZXN0LCBTaXplKSB7Ci0gIFRlc3RTaXplKCk7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyB3aXRoICswIGFuZCAtMC4KLVRFU1RfRihGbG9hdFRlc3QsIFplcm9zKSB7Ci0gIEVYUEVDVF9GTE9BVF9FUSgwLjAsIC0wLjApOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoLTAuMCwgMS4wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkxPQVRfRVEoMC4wLCAxLjUpLAotICAgICAgICAgICAgICAgICAgICAgICAiMS41Iik7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIDAuCi0vLwotLy8gVGhpcyBlbnN1cmVzIHRoYXQgKl9GTE9BVF9FUSBoYW5kbGVzIHRoZSBzaWduIGNvcnJlY3RseSBhbmQgbm8KLS8vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlIGFic29sdXRlIHZhbHVlIGlzIHZlcnkKLS8vIHNtYWxsLgotVEVTVF9GKEZsb2F0VGVzdCwgQWxtb3N0WmVyb3MpIHsKLSAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQotICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCi0gIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgotICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCi0gIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKLSAgLy8gKHBhcmVudGhlc2VzKS4KLSAgc3RhdGljIGNvbnN0IEZsb2F0VGVzdDo6VGVzdFZhbHVlcyYgdiA9IHRoaXMtPnZhbHVlc187Ci0KLSAgRVhQRUNUX0ZMT0FUX0VRKDAuMCwgdi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvKTsKLSAgRVhQRUNUX0ZMT0FUX0VRKC0wLjAsIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7Ci0gIEVYUEVDVF9GTE9BVF9FUSh2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7Ci0KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX0ZMT0FUX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywKLSAgICAgICAgICAgICAgICAgICAgdi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyk7Ci0gIH0sICJ2LmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvIik7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIGVhY2ggb3RoZXIuCi1URVNUX0YoRmxvYXRUZXN0LCBTbWFsbERpZmYpIHsKLSAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lIik7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGZhciBhcGFydC4KLVRFU1RfRihGbG9hdFRlc3QsIExhcmdlRGlmZikgewotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMi41LCAzLjApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4wIik7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyB3aXRoIGluZmluaXR5LgotLy8KLS8vIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlCi0vLyBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5IGxhcmdlLgotVEVTVF9GKEZsb2F0VGVzdCwgSW5maW5pdHkpIHsKLSAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkpOwotICBFWFBFQ1RfRkxPQVRfRVEoLXZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKLSNpZiAhR1RFU1RfT1NfU1lNQklBTgotICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmluZmluaXR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIi12YWx1ZXNfLmluZmluaXR5Iik7Ci0KLSAgLy8gVGhpcyBpcyBpbnRlcmVzdGluZyBhcyB0aGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IGFuZCBuYW4xCi0gIC8vIGFyZSBvbmx5IDEgRExQIGFwYXJ0LgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18ubmFuMSIpOwotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgotfQotCi0vLyBUZXN0cyB0aGF0IGNvbXBhcmluZyB3aXRoIE5BTiBhbHdheXMgcmV0dXJucyBmYWxzZS4KLVRFU1RfRihGbG9hdFRlc3QsIE5hTikgewotI2lmICFHVEVTVF9PU19TWU1CSUFOCi0vLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KLQotICAvLyBJbiBDKytCdWlsZGVyLCBuYW1lcyB3aXRoaW4gbG9jYWwgY2xhc3NlcyAoc3VjaCBhcyB1c2VkIGJ5Ci0gIC8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFKSBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUKLSAgLy8gc2NvcGluZyBjbGFzcy4gIFVzZSBhIHN0YXRpYyBsb2NhbCBhbGlhcyBhcyBhIHdvcmthcm91bmQuCi0gIC8vIFdlIHVzZSB0aGUgYXNzaWdubWVudCBzeW50YXggc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgU3VuIFN0dWRpbywKLSAgLy8gZG9uJ3QgYWxsb3cgaW5pdGlhbGl6aW5nIHJlZmVyZW5jZXMgdXNpbmcgY29uc3RydWN0aW9uIHN5bnRheAotICAvLyAocGFyZW50aGVzZXMpLgotICBzdGF0aWMgY29uc3QgRmxvYXRUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodi5uYW4xLCB2Lm5hbjEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidi5uYW4xIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2Lm5hbjEsIHYubmFuMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ2Lm5hbjIiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdi5uYW4xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOwotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GTE9BVF9FUSh2Lm5hbjEsIHYuaW5maW5pdHkpLAotICAgICAgICAgICAgICAgICAgICAgICAidi5pbmZpbml0eSIpOwotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgotfQotCi0vLyBUZXN0cyB0aGF0ICpfRkxPQVRfRVEgYXJlIHJlZmxleGl2ZS4KLVRFU1RfRihGbG9hdFRlc3QsIFJlZmxleGl2ZSkgewotICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCAwLjApOwotICBFWFBFQ1RfRkxPQVRfRVEoMS4wLCAxLjApOwotICBBU1NFUlRfRkxPQVRfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5pbmZpbml0eSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgKl9GTE9BVF9FUSBhcmUgY29tbXV0YXRpdmUuCi1URVNUX0YoRmxvYXRUZXN0LCBDb21tdXRhdGl2ZSkgewotICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmNsb3NlX3RvX29uZSkuCi0gIEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmNsb3NlX3RvX29uZSwgMS4wKTsKLQotICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRkxPQVRfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9ORUFSLgotVEVTVF9GKEZsb2F0VGVzdCwgRVhQRUNUX05FQVIpIHsKLSAgRVhQRUNUX05FQVIoLTEuMGYsIC0xLjFmLCAwLjJmKTsKLSAgRVhQRUNUX05FQVIoMi4wZiwgMy4wZiwgMS4wZik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORUFSKDEuMGYsMS41ZiwgMC4yNWYpLCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMGYgYW5kIDEuNWYgaXMgMC41LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjVmIik7Ci0gIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KLSAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBsaW5lLgotfQotCi0vLyBUZXN0cyBBU1NFUlRfTkVBUi4KLVRFU1RfRihGbG9hdFRlc3QsIEFTU0VSVF9ORUFSKSB7Ci0gIEFTU0VSVF9ORUFSKC0xLjBmLCAtMS4xZiwgMC4yZik7Ci0gIEFTU0VSVF9ORUFSKDIuMGYsIDMuMGYsIDEuMGYpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLjBmLDEuNWYsIDAuMjVmKSwgIC8vIE5PTElOVAotICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjBmIGFuZCAxLjVmIGlzIDAuNSwgIgotICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1ZiIpOwotICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCi0gIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgbGluZS4KLX0KLQotLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIEZsb2F0TEUoKSBzaG91bGQgc3VjY2VlZC4KLVRFU1RfRihGbG9hdFRlc3QsIEZsb2F0TEVTdWNjZWVkcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIDEuMGYsIDIuMGYpOyAgLy8gV2hlbiB2YWwxIDwgdmFsMiwKLSAgQVNTRVJUX1BSRURfRk9STUFUMihGbG9hdExFLCAxLjBmLCAxLjBmKTsgIC8vIHZhbDEgPT0gdmFsMiwKLQotICAvLyBvciB3aGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuLCBidXQgYWxtb3N0IGVxdWFscyB0bywgdmFsMi4KLSAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIDAuMGYpOwotfQotCi0vLyBUZXN0cyB0aGUgY2FzZXMgd2hlcmUgRmxvYXRMRSgpIHNob3VsZCBmYWlsLgotVEVTVF9GKEZsb2F0VGVzdCwgRmxvYXRMRUZhaWxzKSB7Ci0gIC8vIFdoZW4gdmFsMSBpcyBncmVhdGVyIHRoYW4gdmFsMiBieSBhIGxhcmdlIG1hcmdpbiwKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCAyLjBmLCAxLjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIigyLjBmKSA8PSAoMS4wZikiKTsKLQotICAvLyBvciBieSBhIHNtYWxsIHlldCBub24tbmVnbGlnaWJsZSBtYXJnaW4sCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjBmKTsKLSAgfSwgIih2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpIDw9ICgxLjBmKSIpOwotCi0jaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KLSAgLy8gQysrQnVpbGRlciBnaXZlcyBiYWQgcmVzdWx0cyBmb3Igb3JkZXJlZCBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcwotICAvLyBkdWUgdG8gY29tcGlsZXIgYnVncy4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCB2YWx1ZXNfLm5hbjEsIHZhbHVlc18uaW5maW5pdHkpOwotICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18uaW5maW5pdHkpIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgLXZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSk7Ci0gIH0sICIoLXZhbHVlc18uaW5maW5pdHkpIDw9ICh2YWx1ZXNfLm5hbjEpIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLm5hbjEpOwotICB9LCAiKHZhbHVlc18ubmFuMSkgPD0gKHZhbHVlc18ubmFuMSkiKTsKLSNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotfQotCi0vLyBJbnN0YW50aWF0ZXMgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgKl9ET1VCTEVfRVEuCi10eXBlZGVmIEZsb2F0aW5nUG9pbnRUZXN0PGRvdWJsZT4gRG91YmxlVGVzdDsKLQotLy8gVGVzdHMgdGhhdCB0aGUgc2l6ZSBvZiBEb3VibGU6OkJpdHMgbWF0Y2hlcyB0aGUgc2l6ZSBvZiBkb3VibGUuCi1URVNUX0YoRG91YmxlVGVzdCwgU2l6ZSkgewotICBUZXN0U2l6ZSgpOwotfQotCi0vLyBUZXN0cyBjb21wYXJpbmcgd2l0aCArMCBhbmQgLTAuCi1URVNUX0YoRG91YmxlVGVzdCwgWmVyb3MpIHsKLSAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIC0wLjApOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKC0wLjAsIDEuMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RPVUJMRV9FUSgwLjAsIDEuMCksCi0gICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKLX0KLQotLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgY2xvc2UgdG8gMC4KLS8vCi0vLyBUaGlzIGVuc3VyZXMgdGhhdCAqX0RPVUJMRV9FUSBoYW5kbGVzIHRoZSBzaWduIGNvcnJlY3RseSBhbmQgbm8KLS8vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlIGFic29sdXRlIHZhbHVlIGlzIHZlcnkKLS8vIHNtYWxsLgotVEVTVF9GKERvdWJsZVRlc3QsIEFsbW9zdFplcm9zKSB7Ci0gIC8vIEluIEMrK0J1aWxkZXIsIG5hbWVzIHdpdGhpbiBsb2NhbCBjbGFzc2VzIChzdWNoIGFzIHVzZWQgYnkKLSAgLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUpIGNhbm5vdCBiZSByZXNvbHZlZCBhZ2FpbnN0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZQotICAvLyBzY29waW5nIGNsYXNzLiAgVXNlIGEgc3RhdGljIGxvY2FsIGFsaWFzIGFzIGEgd29ya2Fyb3VuZC4KLSAgLy8gV2UgdXNlIHRoZSBhc3NpZ25tZW50IHN5bnRheCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSBTdW4gU3R1ZGlvLAotICAvLyBkb24ndCBhbGxvdyBpbml0aWFsaXppbmcgcmVmZXJlbmNlcyB1c2luZyBjb25zdHJ1Y3Rpb24gc3ludGF4Ci0gIC8vIChwYXJlbnRoZXNlcykuCi0gIHN0YXRpYyBjb25zdCBEb3VibGVUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKLQotICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgdi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvKTsKLSAgRVhQRUNUX0RPVUJMRV9FUSgtMC4wLCB2LmNsb3NlX3RvX25lZ2F0aXZlX3plcm8pOwotICBFWFBFQ1RfRE9VQkxFX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywgdi5jbG9zZV90b19uZWdhdGl2ZV96ZXJvKTsKLQotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfRE9VQkxFX0VRKHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybywKLSAgICAgICAgICAgICAgICAgICAgIHYuZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8pOwotICB9LCAidi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyIpOwotfQotCi0vLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBjbG9zZSB0byBlYWNoIG90aGVyLgotVEVTVF9GKERvdWJsZVRlc3QsIFNtYWxsRGlmZikgewotICBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18uZnVydGhlcl9mcm9tX29uZSIpOwotfQotCi0vLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBmYXIgYXBhcnQuCi1URVNUX0YoRG91YmxlVGVzdCwgTGFyZ2VEaWZmKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMi4wLCAzLjApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4wIik7Ci19Ci0KLS8vIFRlc3RzIGNvbXBhcmluZyB3aXRoIGluZmluaXR5LgotLy8KLS8vIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG92ZXJmbG93IG9jY3VycyB3aGVuIGNvbXBhcmluZyBudW1iZXJzIHdob3NlCi0vLyBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5IGxhcmdlLgotVEVTVF9GKERvdWJsZVRlc3QsIEluZmluaXR5KSB7Ci0gIEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSk7Ci0gIEVYUEVDVF9ET1VCTEVfRVEoLXZhbHVlc18uaW5maW5pdHksIC12YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKLSNpZiAhR1RFU1RfT1NfU1lNQklBTgotICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmluZmluaXR5LCAtdmFsdWVzXy5pbmZpbml0eSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICItdmFsdWVzXy5pbmZpbml0eSIpOwotCi0gIC8vIFRoaXMgaXMgaW50ZXJlc3RpbmcgYXMgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eV8gYW5kIG5hbjFfCi0gIC8vIGFyZSBvbmx5IDEgRExQIGFwYXJ0LgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXNfLm5hbjEiKTsKLSNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KLX0KLQotLy8gVGVzdHMgdGhhdCBjb21wYXJpbmcgd2l0aCBOQU4gYWx3YXlzIHJldHVybnMgZmFsc2UuCi1URVNUX0YoRG91YmxlVGVzdCwgTmFOKSB7Ci0jaWYgIUdURVNUX09TX1NZTUJJQU4KLSAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQotICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCi0gIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgotICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCi0gIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKLSAgLy8gKHBhcmVudGhlc2VzKS4KLSAgc3RhdGljIGNvbnN0IERvdWJsZVRlc3Q6OlRlc3RWYWx1ZXMmIHYgPSB0aGlzLT52YWx1ZXNfOwotCi0gIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHYubmFuMSwgdi5uYW4xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHYubmFuMSwgdi5uYW4yKSwgInYubmFuMiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdi5uYW4xKSwgInYubmFuMSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRE9VQkxFX0VRKHYubmFuMSwgdi5pbmZpbml0eSksCi0gICAgICAgICAgICAgICAgICAgICAgICJ2LmluZmluaXR5Iik7Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCi19Ci0KLS8vIFRlc3RzIHRoYXQgKl9ET1VCTEVfRVEgYXJlIHJlZmxleGl2ZS4KLVRFU1RfRihEb3VibGVUZXN0LCBSZWZsZXhpdmUpIHsKLSAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIDAuMCk7Ci0gIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCAxLjApOwotI2lmICFHVEVTVF9PU19TWU1CSUFOCi0gIC8vIE5va2lhJ3MgU1RMcG9ydCBjcmFzaGVzIGlmIHdlIHRyeSB0byBvdXRwdXQgaW5maW5pdHkgb3IgTmFOLgotICBBU1NFUlRfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uaW5maW5pdHkpOwotI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgotfQotCi0vLyBUZXN0cyB0aGF0ICpfRE9VQkxFX0VRIGFyZSBjb21tdXRhdGl2ZS4KLVRFU1RfRihEb3VibGVUZXN0LCBDb21tdXRhdGl2ZSkgewotICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpLgotICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uY2xvc2VfdG9fb25lLCAxLjApOwotCi0gIC8vIFdlIGFscmVhZHkgdGVzdGVkIEVYUEVDVF9ET1VCTEVfRVEoMS4wLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUpLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSwgMS4wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOwotfQotCi0vLyBUZXN0cyBFWFBFQ1RfTkVBUi4KLVRFU1RfRihEb3VibGVUZXN0LCBFWFBFQ1RfTkVBUikgewotICBFWFBFQ1RfTkVBUigtMS4wLCAtMS4xLCAwLjIpOwotICBFWFBFQ1RfTkVBUigyLjAsIDMuMCwgMS4wKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FQVIoMS4wLCAxLjUsIDAuMjUpLCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMCBhbmQgMS41IGlzIDAuNSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1Iik7Ci0gIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KLSAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQuCi19Ci0KLS8vIFRlc3RzIEFTU0VSVF9ORUFSLgotVEVTVF9GKERvdWJsZVRlc3QsIEFTU0VSVF9ORUFSKSB7Ci0gIEFTU0VSVF9ORUFSKC0xLjAsIC0xLjEsIDAuMik7Ci0gIEFTU0VSVF9ORUFSKDIuMCwgMy4wLCAxLjApOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLjAsIDEuNSwgMC4yNSksICAvLyBOT0xJTlQKLSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCAxLjUgaXMgMC41LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIDAuMjUiKTsKLSAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubwotICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIHN0YXRlbWVudC4KLX0KLQotLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIERvdWJsZUxFKCkgc2hvdWxkIHN1Y2NlZWQuCi1URVNUX0YoRG91YmxlVGVzdCwgRG91YmxlTEVTdWNjZWVkcykgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAxLjAsIDIuMCk7ICAvLyBXaGVuIHZhbDEgPCB2YWwyLAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAxLjAsIDEuMCk7ICAvLyB2YWwxID09IHZhbDIsCi0KLSAgLy8gb3Igd2hlbiB2YWwxIGlzIGdyZWF0ZXIgdGhhbiwgYnV0IGFsbW9zdCBlcXVhbHMgdG8sIHZhbDIuCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18uY2xvc2VfdG9fcG9zaXRpdmVfemVybywgMC4wKTsKLX0KLQotLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIERvdWJsZUxFKCkgc2hvdWxkIGZhaWwuCi1URVNUX0YoRG91YmxlVGVzdCwgRG91YmxlTEVGYWlscykgewotICAvLyBXaGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuIHZhbDIgYnkgYSBsYXJnZSBtYXJnaW4sCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIDIuMCwgMS4wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIigyLjApIDw9ICgxLjApIik7Ci0KLSAgLy8gb3IgYnkgYSBzbWFsbCB5ZXQgbm9uLW5lZ2xpZ2libGUgbWFyZ2luLAotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCB2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUsIDEuMCk7Ci0gIH0sICIodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSA8PSAoMS4wKSIpOwotCi0jaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KLSAgLy8gQysrQnVpbGRlciBnaXZlcyBiYWQgcmVzdWx0cyBmb3Igb3JkZXJlZCBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcwotICAvLyBkdWUgdG8gY29tcGlsZXIgYnVncy4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLmluZmluaXR5KTsKLSAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLmluZmluaXR5KSIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAtdmFsdWVzXy5pbmZpbml0eSwgdmFsdWVzXy5uYW4xKTsKLSAgfSwgIiAoLXZhbHVlc18uaW5maW5pdHkpIDw9ICh2YWx1ZXNfLm5hbjEpIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18ubmFuMSwgdmFsdWVzXy5uYW4xKTsKLSAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLm5hbjEpIik7Ci0jZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKLX0KLQotCi0vLyBWZXJpZmllcyB0aGF0IGEgdGVzdCBvciB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBESVNBQkxFRF8gaXMKLS8vIG5vdCBydW4uCi0KLS8vIEEgdGVzdCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXy4KLS8vIFNob3VsZCBub3QgcnVuLgotVEVTVChEaXNhYmxlZFRlc3QsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW4pIHsKLSAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4uIjsKLX0KLQotLy8gQSB0ZXN0IHdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCBESVNBQkxFRF8uCi0vLyBTaG91bGQgcnVuLgotVEVTVChEaXNhYmxlZFRlc3QsIE5vdERJU0FCTEVEX1Rlc3RTaG91bGRSdW4pIHsKLSAgRVhQRUNUX0VRKDEsIDEpOwotfQotCi0vLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIERJU0FCTEVEXy4KLS8vIFNob3VsZCBub3QgcnVuLgotVEVTVChESVNBQkxFRF9UZXN0Q2FzZSwgVGVzdFNob3VsZE5vdFJ1bikgewotICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogVGVzdCBpbiBkaXNhYmxlZCB0ZXN0IGNhc2Ugc2hvdWxkIG5vdCBiZSBydW4uIjsKLX0KLQotLy8gQSB0ZXN0IGNhc2UgYW5kIHRlc3Qgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBESVNBQkxFRF8uCi0vLyBTaG91bGQgbm90IHJ1bi4KLVRFU1QoRElTQUJMRURfVGVzdENhc2UsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW4pIHsKLSAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IFRlc3QgaW4gZGlzYWJsZWQgdGVzdCBjYXNlIHNob3VsZCBub3QgYmUgcnVuLiI7Ci19Ci0KLS8vIENoZWNrIHRoYXQgd2hlbiBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UgYXJlIGRpc2FibGVkLCBTZXR1cFRlc3RDYXNlKCkgYW5kCi0vLyBUZWFyRG93blRlc3RDYXNlKCkgYXJlIG5vdCBjYWxsZWQuCi1jbGFzcyBEaXNhYmxlZFRlc3RzVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7Ci0gICAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IEFsbCB0ZXN0cyBkaXNhYmxlZCBpbiB0ZXN0IGNhc2UuICIKLSAgICAgICAgICAgICAgIlNldHVwVGVzdENhc2UoKSBzaG91bGQgbm90IGJlIGNhbGxlZC4iOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogQWxsIHRlc3RzIGRpc2FibGVkIGluIHRlc3QgY2FzZS4gIgotICAgICAgICAgICAgICAiVGVhckRvd25UZXN0Q2FzZSgpIHNob3VsZCBub3QgYmUgY2FsbGVkLiI7Ci0gIH0KLX07Ci0KLVRFU1RfRihEaXNhYmxlZFRlc3RzVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bl8xKSB7Ci0gIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Ci19Ci0KLVRFU1RfRihEaXNhYmxlZFRlc3RzVGVzdCwgRElTQUJMRURfVGVzdFNob3VsZE5vdFJ1bl8yKSB7Ci0gIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgZGlzYWJsZWQgdHlwZWQgdGVzdHMgYXJlbid0IHJ1bi4KLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVHlwZWRUZXN0IDogcHVibGljIFRlc3QgewotfTsKLQotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOwotVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdCwgTnVtZXJpY1R5cGVzKTsKLQotVFlQRURfVEVTVChUeXBlZFRlc3QsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bikgewotICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdHlwZWQgdGVzdCBzaG91bGQgbm90IHJ1bi4iOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIERJU0FCTEVEX1R5cGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKLX07Ci0KLVRZUEVEX1RFU1RfQ0FTRShESVNBQkxFRF9UeXBlZFRlc3QsIE51bWVyaWNUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoRElTQUJMRURfVHlwZWRUZXN0LCBTaG91bGROb3RSdW4pIHsKLSAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHR5cGVkIHRlc3Qgc2hvdWxkIG5vdCBydW4uIjsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi0vLyBUZXN0cyB0aGF0IGRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmVuJ3QgcnVuLgotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVkVGVzdFAgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQKTsKLQotVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bikgewotICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIgotICAgICAgICAgPDwgIkRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Ci19Ci0KLVJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFAsIERJU0FCTEVEX1Nob3VsZE5vdFJ1bik7Ci0KLUlOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBUeXBlZFRlc3RQLCBOdW1lcmljVHlwZXMpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIERJU0FCTEVEX1R5cGVkVGVzdFAgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1UWVBFRF9URVNUX0NBU0VfUChESVNBQkxFRF9UeXBlZFRlc3RQKTsKLQotVFlQRURfVEVTVF9QKERJU0FCTEVEX1R5cGVkVGVzdFAsIFNob3VsZE5vdFJ1bikgewotICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIgotICAgICAgICAgPDwgIkRpc2FibGVkIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Ci19Ci0KLVJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKERJU0FCTEVEX1R5cGVkVGVzdFAsIFNob3VsZE5vdFJ1bik7Ci0KLUlOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBESVNBQkxFRF9UeXBlZFRlc3RQLCBOdW1lcmljVHlwZXMpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCi0KLWNsYXNzIFNpbmdsZUV2YWx1YXRpb25UZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzogIC8vIE11c3QgYmUgcHVibGljIGFuZCBub3QgcHJvdGVjdGVkIGR1ZSB0byBhIGJ1ZyBpbiBnKysgMy40LjIuCi0gIC8vIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSB0aGUgRmFpbGVkQVNTRVJUX1NUUkVRIHRlc3QKLSAgLy8gYmVsb3cuICBJdCdzIHB1YmxpYyB0byB3b3JrIGFyb3VuZCBDKytCdWlsZGVyJ3MgYnVnIHdpdGggc2NvcGluZyBsb2NhbAotICAvLyBjbGFzc2VzLgotICBzdGF0aWMgdm9pZCBDb21wYXJlQW5kSW5jcmVtZW50Q2hhclB0cnMoKSB7Ci0gICAgQVNTRVJUX1NUUkVRKHAxXysrLCBwMl8rKyk7Ci0gIH0KLQotICAvLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgdGhlIEZhaWxlZEFTU0VSVF9ORSB0ZXN0IGJlbG93LiAgSXQncwotICAvLyBwdWJsaWMgdG8gd29yayBhcm91bmQgQysrQnVpbGRlcidzIGJ1ZyB3aXRoIHNjb3BpbmcgbG9jYWwgY2xhc3Nlcy4KLSAgc3RhdGljIHZvaWQgQ29tcGFyZUFuZEluY3JlbWVudEludHMoKSB7Ci0gICAgQVNTRVJUX05FKGFfKyssIGJfKyspOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFNpbmdsZUV2YWx1YXRpb25UZXN0KCkgewotICAgIHAxXyA9IHMxXzsKLSAgICBwMl8gPSBzMl87Ci0gICAgYV8gPSAwOwotICAgIGJfID0gMDsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzMV87Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzMl87Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBwMV87Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBwMl87Ci0KLSAgc3RhdGljIGludCBhXzsKLSAgc3RhdGljIGludCBiXzsKLX07Ci0KLWNvbnN0IGNoYXIqIGNvbnN0IFNpbmdsZUV2YWx1YXRpb25UZXN0OjpzMV8gPSAiMDEyMzQiOwotY29uc3QgY2hhciogY29uc3QgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnMyXyA9ICJhYmNkZSI7Ci1jb25zdCBjaGFyKiBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6cDFfOwotY29uc3QgY2hhciogU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnAyXzsKLWludCBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6YV87Ci1pbnQgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OmJfOwotCi0vLyBUZXN0cyB0aGF0IHdoZW4gQVNTRVJUX1NUUkVRIGZhaWxzLCBpdCBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cwotLy8gZXhhY3RseSBvbmNlLgotVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBGYWlsZWRBU1NFUlRfU1RSRVEpIHsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoU2luZ2xlRXZhbHVhdGlvblRlc3Q6OkNvbXBhcmVBbmRJbmNyZW1lbnRDaGFyUHRycygpLAotICAgICAgICAgICAgICAgICAgICAgICAicDJfKysiKTsKLSAgRVhQRUNUX0VRKHMxXyArIDEsIHAxXyk7Ci0gIEVYUEVDVF9FUShzMl8gKyAxLCBwMl8pOwotfQotCi0vLyBUZXN0cyB0aGF0IHN0cmluZyBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgotVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBBU1NFUlRfU1RSKSB7Ci0gIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1NUUk5FCi0gIEVYUEVDVF9TVFJORShwMV8rKywgcDJfKyspOwotICBFWFBFQ1RfRVEoczFfICsgMSwgcDFfKTsKLSAgRVhQRUNUX0VRKHMyXyArIDEsIHAyXyk7Ci0KLSAgLy8gZmFpbGVkIEVYUEVDVF9TVFJDQVNFRVEKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VFUShwMV8rKywgcDJfKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JpbmcgY2FzZSIpOwotICBFWFBFQ1RfRVEoczFfICsgMiwgcDFfKTsKLSAgRVhQRUNUX0VRKHMyXyArIDIsIHAyXyk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2hlbiBBU1NFUlRfTkUgZmFpbHMsIGl0IGV2YWx1YXRlcyBpdHMgYXJndW1lbnRzIGV4YWN0bHkKLS8vIG9uY2UuCi1URVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIEZhaWxlZEFTU0VSVF9ORSkgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShTaW5nbGVFdmFsdWF0aW9uVGVzdDo6Q29tcGFyZUFuZEluY3JlbWVudEludHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIihhXysrKSAhPSAoYl8rKykiKTsKLSAgRVhQRUNUX0VRKDEsIGFfKTsKLSAgRVhQRUNUX0VRKDEsIGJfKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhc3NlcnRpb24gYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgotVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBPdGhlckNhc2VzKSB7Ci0gIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1RSVUUKLSAgRVhQRUNUX1RSVUUoMCA9PSBhXysrKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoMSwgYV8pOwotCi0gIC8vIGZhaWxlZCBFWFBFQ1RfVFJVRQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgtMSA9PSBhXysrKSwgIi0xID09IGFfKysiKTsKLSAgRVhQRUNUX0VRKDIsIGFfKTsKLQotICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9HVAotICBFWFBFQ1RfR1QoYV8rKywgYl8rKyk7Ci0gIEVYUEVDVF9FUSgzLCBhXyk7Ci0gIEVYUEVDVF9FUSgxLCBiXyk7Ci0KLSAgLy8gZmFpbGVkIEVYUEVDVF9MVAotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoYV8rKywgYl8rKyksICIoYV8rKykgPCAoYl8rKykiKTsKLSAgRVhQRUNUX0VRKDQsIGFfKTsKLSAgRVhQRUNUX0VRKDIsIGJfKTsKLQotICAvLyBzdWNjZXNzZnVsIEFTU0VSVF9UUlVFCi0gIEFTU0VSVF9UUlVFKDAgPCBhXysrKTsgIC8vIE5PTElOVAotICBFWFBFQ1RfRVEoNSwgYV8pOwotCi0gIC8vIHN1Y2Nlc3NmdWwgQVNTRVJUX0dUCi0gIEFTU0VSVF9HVChhXysrLCBiXysrKTsKLSAgRVhQRUNUX0VRKDYsIGFfKTsKLSAgRVhQRUNUX0VRKDMsIGJfKTsKLX0KLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLXZvaWQgVGhyb3dBbkludGVnZXIoKSB7Ci0gIHRocm93IDE7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYXNzZXJ0aW9uIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4KLVRFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgRXhjZXB0aW9uVGVzdHMpIHsKLSAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfVEhST1cKLSAgRVhQRUNUX1RIUk9XKHsgIC8vIE5PTElOVAotICAgIGFfKys7Ci0gICAgVGhyb3dBbkludGVnZXIoKTsKLSAgfSwgaW50KTsKLSAgRVhQRUNUX0VRKDEsIGFfKTsKLQotICAvLyBmYWlsZWQgRVhQRUNUX1RIUk9XLCB0aHJvd3MgZGlmZmVyZW50Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyh7ICAvLyBOT0xJTlQKLSAgICBhXysrOwotICAgIFRocm93QW5JbnRlZ2VyKCk7Ci0gIH0sIGJvb2wpLCAidGhyb3dzIGEgZGlmZmVyZW50IHR5cGUiKTsKLSAgRVhQRUNUX0VRKDIsIGFfKTsKLQotICAvLyBmYWlsZWQgRVhQRUNUX1RIUk9XLCB0aHJvd3Mgbm90aGluZwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coYV8rKywgYm9vbCksICJ0aHJvd3Mgbm90aGluZyIpOwotICBFWFBFQ1RfRVEoMywgYV8pOwotCi0gIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX05PX1RIUk9XCi0gIEVYUEVDVF9OT19USFJPVyhhXysrKTsKLSAgRVhQRUNUX0VRKDQsIGFfKTsKLQotICAvLyBmYWlsZWQgRVhQRUNUX05PX1RIUk9XCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyh7ICAvLyBOT0xJTlQKLSAgICBhXysrOwotICAgIFRocm93QW5JbnRlZ2VyKCk7Ci0gIH0pLCAiaXQgdGhyb3dzIik7Ci0gIEVYUEVDVF9FUSg1LCBhXyk7Ci0KLSAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfQU5ZX1RIUk9XCi0gIEVYUEVDVF9BTllfVEhST1coeyAgLy8gTk9MSU5UCi0gICAgYV8rKzsKLSAgICBUaHJvd0FuSW50ZWdlcigpOwotICB9KTsKLSAgRVhQRUNUX0VRKDYsIGFfKTsKLQotICAvLyBmYWlsZWQgRVhQRUNUX0FOWV9USFJPVwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKGFfKyspLCAiaXQgZG9lc24ndCIpOwotICBFWFBFQ1RfRVEoNywgYV8pOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLS8vIFRlc3RzIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFLgotY2xhc3MgTm9GYXRhbEZhaWx1cmVUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTdWNjZWVkcygpIHt9Ci0gIHZvaWQgRmFpbHNOb25GYXRhbCgpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8ICJzb21lIG5vbi1mYXRhbCBmYWlsdXJlIjsKLSAgfQotICB2b2lkIEZhaWxzKCkgewotICAgIEZBSUwoKSA8PCAic29tZSBmYXRhbCBmYWlsdXJlIjsKLSAgfQotCi0gIHZvaWQgRG9Bc3NlcnROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKSB7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHMoKSk7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAic2hvbGQgbm90IHJlYWNoIGhlcmUuIjsKLSAgfQotCi0gIHZvaWQgRG9FeHBlY3ROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKSB7Ci0gICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHMoKSk7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAib3RoZXIgZmFpbHVyZSI7Ci0gIH0KLX07Ci0KLVRFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE5vRmFpbHVyZSkgewotICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWNjZWVkcygpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3VjY2VlZHMoKSk7Ci19Ci0KLVRFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE5vbkZhdGFsSXNOb0ZhaWx1cmUpIHsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShGYWlsc05vbkZhdGFsKCkpLAotICAgICAgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGYWlsc05vbkZhdGFsKCkpLAotICAgICAgInNvbWUgbm9uLWZhdGFsIGZhaWx1cmUiKTsKLX0KLQotVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVPbkZhdGFsRmFpbHVyZSkgewotICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOwotICB7Ci0gICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKLSAgICBEb0Fzc2VydE5vRmF0YWxGYWlsdXJlT25GYWlscygpOwotICB9Ci0gIEFTU0VSVF9FUSgyLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAic29tZSBmYXRhbCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiaXQgZG9lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKLX0KLQotVEVTVF9GKE5vRmF0YWxGYWlsdXJlVGVzdCwgRXhwZWN0Tm9GYXRhbEZhaWx1cmVPbkZhdGFsRmFpbHVyZSkgewotICBUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzOwotICB7Ci0gICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoJmd0ZXN0X2ZhaWx1cmVzKTsKLSAgICBEb0V4cGVjdE5vRmF0YWxGYWlsdXJlT25GYWlscygpOwotICB9Ci0gIEFTU0VSVF9FUSgzLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOwotICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgyKS50eXBlKCkpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAic29tZSBmYXRhbCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOwotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiaXQgZG9lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIm90aGVyIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDIpLm1lc3NhZ2UoKSk7Ci19Ci0KLVRFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIE1lc3NhZ2VJc1N0cmVhbWFibGUpIHsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlczsKLSAgewotICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKCZndGVzdF9mYWlsdXJlcyk7Ci0gICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8ICJmb28iKSA8PCAibXkgbWVzc2FnZSI7Ci0gIH0KLSAgQVNTRVJUX0VRKDIsIGd0ZXN0X2ZhaWx1cmVzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLnR5cGUoKSk7Ci0gIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLnR5cGUoKSk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJmb28iLAotICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApLm1lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJteSBtZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS5tZXNzYWdlKCkpOwotfQotCi0vLyBUZXN0cyBub24tc3RyaW5nIGFzc2VydGlvbnMuCi0KLXN0ZDo6c3RyaW5nIEVkaXRzVG9TdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+JiBlZGl0cykgewotICBzdGQ6OnN0cmluZyBvdXQ7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWRpdHMuc2l6ZSgpOyArK2kpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBrRWRpdHNbXSA9ICIgKy0vIjsKLSAgICBvdXQuYXBwZW5kKDEsIGtFZGl0c1tlZGl0c1tpXV0pOwotICB9Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHNpemVfdD4gQ2hhcnNUb0luZGljZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG91dDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKLSAgICBvdXQucHVzaF9iYWNrKHN0cltpXSk7Ci0gIH0KLSAgcmV0dXJuIG91dDsKLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENoYXJzVG9MaW5lcyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdXQ7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7Ci0gICAgb3V0LnB1c2hfYmFjayhzdHIuc3Vic3RyKGksIDEpKTsKLSAgfQotICByZXR1cm4gb3V0OwotfQotCi1URVNUKEVkaXREaXN0YW5jZSwgVGVzdENhc2VzKSB7Ci0gIHN0cnVjdCBDYXNlIHsKLSAgICBpbnQgbGluZTsKLSAgICBjb25zdCBjaGFyKiBsZWZ0OwotICAgIGNvbnN0IGNoYXIqIHJpZ2h0OwotICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2VkaXRzOwotICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2RpZmY7Ci0gIH07Ci0gIHN0YXRpYyBjb25zdCBDYXNlIGtDYXNlc1tdID0gewotICAgICAgLy8gTm8gY2hhbmdlLgotICAgICAge19fTElORV9fLCAiQSIsICJBIiwgIiAiLCAiIn0sCi0gICAgICB7X19MSU5FX18sICJBQkNERSIsICJBQkNERSIsICIgICAgICIsICIifSwKLSAgICAgIC8vIFNpbXBsZSBhZGRzLgotICAgICAge19fTElORV9fLCAiWCIsICJYQSIsICIgKyIsICJAQCArMSwyIEBAXG4gWFxuK0FcbiJ9LAotICAgICAge19fTElORV9fLCAiWCIsICJYQUJDRCIsICIgKysrKyIsICJAQCArMSw1IEBAXG4gWFxuK0FcbitCXG4rQ1xuK0RcbiJ9LAotICAgICAgLy8gU2ltcGxlIHJlbW92ZXMuCi0gICAgICB7X19MSU5FX18sICJYQSIsICJYIiwgIiAtIiwgIkBAIC0xLDIgQEBcbiBYXG4tQVxuIn0sCi0gICAgICB7X19MSU5FX18sICJYQUJDRCIsICJYIiwgIiAtLS0tIiwgIkBAIC0xLDUgQEBcbiBYXG4tQVxuLUJcbi1DXG4tRFxuIn0sCi0gICAgICAvLyBTaW1wbGUgcmVwbGFjZXMuCi0gICAgICB7X19MSU5FX18sICJBIiwgImEiLCAiLyIsICJAQCAtMSwxICsxLDEgQEBcbi1BXG4rYVxuIn0sCi0gICAgICB7X19MSU5FX18sICJBQkNEIiwgImFiY2QiLCAiLy8vLyIsCi0gICAgICAgIkBAIC0xLDQgKzEsNCBAQFxuLUFcbi1CXG4tQ1xuLURcbithXG4rYlxuK2NcbitkXG4ifSwKLSAgICAgIC8vIFBhdGggZmluZGluZy4KLSAgICAgIHtfX0xJTkVfXywgIkFCQ0RFRkdIIiwgIkFCWEVHSDEiLCAiICAtLyAtICArIiwKLSAgICAgICAiQEAgLTEsOCArMSw3IEBAXG4gQVxuIEJcbi1DXG4tRFxuK1hcbiBFXG4tRlxuIEdcbiBIXG4rMVxuIn0sCi0gICAgICB7X19MSU5FX18sICJBQUFBQkNDQ0MiLCAiQUJBQkNEQ0RDIiwgIi0gLyAgICsgLyAiLAotICAgICAgICJAQCAtMSw5ICsxLDkgQEBcbi1BXG4gQVxuLUFcbitCXG4gQVxuIEJcbiBDXG4rRFxuIENcbi1DXG4rRFxuIENcbiJ9LAotICAgICAge19fTElORV9fLCAiQUJDREUiLCAiQkNEQ0QiLCAiLSAgICsvIiwKLSAgICAgICAiQEAgLTEsNSArMSw1IEBAXG4tQVxuIEJcbiBDXG4gRFxuLUVcbitDXG4rRFxuIn0sCi0gICAgICB7X19MSU5FX18sICJBQkNERUZHSElKS0wiLCAiQkNEQ0RFRkdKS0xKSyIsICItICsrICAgICAtLSAgICsrIiwKLSAgICAgICAiQEAgLTEsNCArMSw1IEBAXG4tQVxuIEJcbitDXG4rRFxuIENcbiBEXG4iCi0gICAgICAgIkBAIC02LDcgKzcsNyBAQFxuIEZcbiBHXG4tSFxuLUlcbiBKXG4gS1xuIExcbitKXG4rS1xuIn0sCi0gICAgICB7fX07Ci0gIGZvciAoY29uc3QgQ2FzZSogYyA9IGtDYXNlczsgYy0+bGVmdDsgKytjKSB7Ci0gICAgRVhQRUNUX1RSVUUoYy0+ZXhwZWN0ZWRfZWRpdHMgPT0KLSAgICAgICAgICAgICAgICBFZGl0c1RvU3RyaW5nKENhbGN1bGF0ZU9wdGltYWxFZGl0cyhDaGFyc1RvSW5kaWNlcyhjLT5sZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvSW5kaWNlcyhjLT5yaWdodCkpKSkKLSAgICAgICAgPDwgIkxlZnQgPCIgPDwgYy0+bGVmdCA8PCAiPiBSaWdodCA8IiA8PCBjLT5yaWdodCA8PCAiPiBFZGl0cyA8IgotICAgICAgICA8PCBFZGl0c1RvU3RyaW5nKENhbGN1bGF0ZU9wdGltYWxFZGl0cygKLSAgICAgICAgICAgICAgIENoYXJzVG9JbmRpY2VzKGMtPmxlZnQpLCBDaGFyc1RvSW5kaWNlcyhjLT5yaWdodCkpKSA8PCAiPiI7Ci0gICAgRVhQRUNUX1RSVUUoYy0+ZXhwZWN0ZWRfZGlmZiA9PSBDcmVhdGVVbmlmaWVkRGlmZihDaGFyc1RvTGluZXMoYy0+bGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvTGluZXMoYy0+cmlnaHQpKSkKLSAgICAgICAgPDwgIkxlZnQgPCIgPDwgYy0+bGVmdCA8PCAiPiBSaWdodCA8IiA8PCBjLT5yaWdodCA8PCAiPiBEaWZmIDwiCi0gICAgICAgIDw8IENyZWF0ZVVuaWZpZWREaWZmKENoYXJzVG9MaW5lcyhjLT5sZWZ0KSwgQ2hhcnNUb0xpbmVzKGMtPnJpZ2h0KSkKLSAgICAgICAgPDwgIj4iOwotICB9Ci19Ci0KLS8vIFRlc3RzIEVxRmFpbHVyZSgpLCB1c2VkIGZvciBpbXBsZW1lbnRpbmcgKkVRKiBhc3NlcnRpb25zLgotVEVTVChBc3NlcnRpb25UZXN0LCBFcUZhaWx1cmUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZm9vX3ZhbCgiNSIpLCBiYXJfdmFsKCI2Iik7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzEoCi0gICAgICBFcUZhaWx1cmUoImZvbyIsICJiYXIiLCBmb29fdmFsLCBiYXJfdmFsLCBmYWxzZSkKLSAgICAgIC5mYWlsdXJlX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9TVFJFUSgKLSAgICAgICJWYWx1ZSBvZjogYmFyXG4iCi0gICAgICAiICBBY3R1YWw6IDZcbiIKLSAgICAgICJFeHBlY3RlZDogZm9vXG4iCi0gICAgICAiV2hpY2ggaXM6IDUiLAotICAgICAgbXNnMS5jX3N0cigpKTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBtc2cyKAotICAgICAgRXFGYWlsdXJlKCJmb28iLCAiNiIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKQotICAgICAgLmZhaWx1cmVfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX1NUUkVRKAotICAgICAgIlZhbHVlIG9mOiA2XG4iCi0gICAgICAiRXhwZWN0ZWQ6IGZvb1xuIgotICAgICAgIldoaWNoIGlzOiA1IiwKLSAgICAgIG1zZzIuY19zdHIoKSk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnMygKLSAgICAgIEVxRmFpbHVyZSgiNSIsICJiYXIiLCBmb29fdmFsLCBiYXJfdmFsLCBmYWxzZSkKLSAgICAgIC5mYWlsdXJlX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9TVFJFUSgKLSAgICAgICJWYWx1ZSBvZjogYmFyXG4iCi0gICAgICAiICBBY3R1YWw6IDZcbiIKLSAgICAgICJFeHBlY3RlZDogNSIsCi0gICAgICBtc2czLmNfc3RyKCkpOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzQoCi0gICAgICBFcUZhaWx1cmUoIjUiLCAiNiIsIGZvb192YWwsIGJhcl92YWwsIGZhbHNlKS5mYWlsdXJlX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9TVFJFUSgKLSAgICAgICJWYWx1ZSBvZjogNlxuIgotICAgICAgIkV4cGVjdGVkOiA1IiwKLSAgICAgIG1zZzQuY19zdHIoKSk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnNSgKLSAgICAgIEVxRmFpbHVyZSgiZm9vIiwgImJhciIsCi0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoIlwieFwiIiksIHN0ZDo6c3RyaW5nKCJcInlcIiIpLAotICAgICAgICAgICAgICAgIHRydWUpLmZhaWx1cmVfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX1NUUkVRKAotICAgICAgIlZhbHVlIG9mOiBiYXJcbiIKLSAgICAgICIgIEFjdHVhbDogXCJ5XCJcbiIKLSAgICAgICJFeHBlY3RlZDogZm9vIChpZ25vcmluZyBjYXNlKVxuIgotICAgICAgIldoaWNoIGlzOiBcInhcIiIsCi0gICAgICBtc2c1LmNfc3RyKCkpOwotfQotCi1URVNUKEFzc2VydGlvblRlc3QsIEVxRmFpbHVyZVdpdGhEaWZmKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGxlZnQoCi0gICAgICAiMVxcbjJYWFhcXG4zXFxuNVxcbjZcXG43XFxuOFxcbjlcXG4xMFxcbjExXFxuMTJYWFhcXG4xM1xcbjE0XFxuMTUiKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcmlnaHQoCi0gICAgICAiMVxcbjJcXG4zXFxuNFxcbjVcXG42XFxuN1xcbjhcXG45XFxuMTFcXG4xMlxcbjEzXFxuMTQiKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnMSgKLSAgICAgIEVxRmFpbHVyZSgibGVmdCIsICJyaWdodCIsIGxlZnQsIHJpZ2h0LCBmYWxzZSkuZmFpbHVyZV9tZXNzYWdlKCkpOwotICBFWFBFQ1RfU1RSRVEoCi0gICAgICAiVmFsdWUgb2Y6IHJpZ2h0XG4iCi0gICAgICAiICBBY3R1YWw6IDFcXG4yXFxuM1xcbjRcXG41XFxuNlxcbjdcXG44XFxuOVxcbjExXFxuMTJcXG4xM1xcbjE0XG4iCi0gICAgICAiRXhwZWN0ZWQ6IGxlZnRcbiIKLSAgICAgICJXaGljaCBpczogIgotICAgICAgIjFcXG4yWFhYXFxuM1xcbjVcXG42XFxuN1xcbjhcXG45XFxuMTBcXG4xMVxcbjEyWFhYXFxuMTNcXG4xNFxcbjE1XG4iCi0gICAgICAiV2l0aCBkaWZmOlxuQEAgLTEsNSArMSw2IEBAXG4gMVxuLTJYWFhcbisyXG4gM1xuKzRcbiA1XG4gNlxuIgotICAgICAgIkBAIC03LDggKzgsNiBAQFxuIDhcbiA5XG4tMTBcbiAxMVxuLTEyWFhYXG4rMTJcbiAxM1xuIDE0XG4tMTVcbiIsCi0gICAgICBtc2cxLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyBBcHBlbmRVc2VyTWVzc2FnZSgpLCB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlICpFUSogbWFjcm9zLgotVEVTVChBc3NlcnRpb25UZXN0LCBBcHBlbmRVc2VyTWVzc2FnZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBmb28oImZvbyIpOwotCi0gIE1lc3NhZ2UgbXNnOwotICBFWFBFQ1RfU1RSRVEoImZvbyIsCi0gICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShmb28sIG1zZykuY19zdHIoKSk7Ci0KLSAgbXNnIDw8ICJiYXIiOwotICBFWFBFQ1RfU1RSRVEoImZvb1xuYmFyIiwKLSAgICAgICAgICAgICAgIEFwcGVuZFVzZXJNZXNzYWdlKGZvbywgbXNnKS5jX3N0cigpKTsKLX0KLQotI2lmZGVmIF9fQk9STEFORENfXwotLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKLSMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKLSNlbmRpZgotCi0vLyBUZXN0cyBBU1NFUlRfVFJVRS4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1RSVUUpIHsKLSAgQVNTRVJUX1RSVUUoMiA+IDEpOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKDIgPCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIjIgPCAxIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9UUlVFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgQXNzZXJ0VHJ1ZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKLSAgQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuKDIpKTsKLSNpZm5kZWYgX19CT1JMQU5EQ19fCi0gIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKFJlc3VsdElzRXZlbigzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDMpXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKLSNlbmRpZgotICBBU1NFUlRfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKVxuIgotICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9GQUxTRS4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0ZBTFNFKSB7Ci0gIEFTU0VSVF9GQUxTRSgyIDwgMSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKDIgPiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyID4gMVxuIgotICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOwotfQotCi0vLyBUZXN0cyBBU1NFUlRfRkFMU0UocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgotVEVTVChBc3NlcnRpb25UZXN0LCBBc3NlcnRGYWxzZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKLSAgQVNTRVJUX0ZBTFNFKFJlc3VsdElzRXZlbigzKSk7Ci0jaWZuZGVmIF9fQk9STEFORENfXwotICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuKDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMilcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlICgyIGlzIGV2ZW4pXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKLSNlbmRpZgotICBBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Ci19Ci0KLSNpZmRlZiBfX0JPUkxBTkRDX18KLS8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQotIyBwcmFnbWEgb3B0aW9uIHBvcAotI2VuZGlmCi0KLS8vIFRlc3RzIHVzaW5nIEFTU0VSVF9FUSBvbiBkb3VibGUgdmFsdWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZQotLy8gc3VyZSB0aGF0IHRoZSBzcGVjaWFsaXphdGlvbiB3ZSBkaWQgZm9yIGludGVnZXIgYW5kIGFub255bW91cyBlbnVtcwotLy8gaXNuJ3QgdXNlZCBmb3IgZG91YmxlIGFyZ3VtZW50cy4KLVRFU1QoRXhwZWN0VGVzdCwgQVNTRVJUX0VRX0RvdWJsZSkgewotICAvLyBBIHN1Y2Nlc3MuCi0gIEFTU0VSVF9FUSg1LjYsIDUuNik7Ci0KLSAgLy8gQSBmYWlsdXJlLgotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoNS4xLCA1LjIpLAotICAgICAgICAgICAgICAgICAgICAgICAiNS4xIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9FUS4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0VRKSB7Ci0gIEFTU0VSVF9FUSg1LCAyICsgMyk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSg1LCAyKjMpLAotICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIqM1xuIgotICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IDZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiA1Iik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9FUShOVUxMLCBwb2ludGVyKS4KLSNpZiBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCi1URVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9FUV9OVUxMKSB7Ci0gIC8vIEEgc3VjY2Vzcy4KLSAgY29uc3QgY2hhciogcCA9IE5VTEw7Ci0gIC8vIFNvbWUgb2xkZXIgR0NDIHZlcnNpb25zIG1heSBpc3N1ZSBhIHNwdXJpb3VzIHdhcmluZyBpbiB0aGlzIG9yIHRoZSBuZXh0Ci0gIC8vIGFzc2VydGlvbiBzdGF0ZW1lbnQuIFRoaXMgd2FybmluZyBzaG91bGQgbm90IGJlIHN1cHByZXNzZWQgd2l0aAotICAvLyBzdGF0aWNfY2FzdCBzaW5jZSB0aGUgdGVzdCB2ZXJpZmllcyB0aGUgYWJpbGl0eSB0byB1c2UgYmFyZSBOVUxMIGFzIHRoZQotICAvLyBleHBlY3RlZCBwYXJhbWV0ZXIgdG8gdGhlIG1hY3JvLgotICBBU1NFUlRfRVEoTlVMTCwgcCk7Ci0KLSAgLy8gQSBmYWlsdXJlLgotICBzdGF0aWMgaW50IG4gPSAwOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoTlVMTCwgJm4pLAotICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6ICZuXG4iKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAotCi0vLyBUZXN0cyBBU1NFUlRfRVEoMCwgbm9uX3BvaW50ZXIpLiAgU2luY2UgdGhlIGxpdGVyYWwgMCBjYW4gYmUKLS8vIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgYnkgdGhlIGNvbXBpbGVyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQotLy8gdGhhdCBBU1NFUlRfRVEoMCwgbm9uX3BvaW50ZXIpIGlzbid0IGludGVycHJldGVkIGJ5IEdvb2dsZSBUZXN0IGFzCi0vLyBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8dm9pZCo+KE5VTEwpLCBub25fcG9pbnRlcikuCi1URVNUKEV4cGVjdFRlc3QsIEFTU0VSVF9FUV8wKSB7Ci0gIGludCBuID0gMDsKLQotICAvLyBBIHN1Y2Nlc3MuCi0gIEFTU0VSVF9FUSgwLCBuKTsKLQotICAvLyBBIGZhaWx1cmUuCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSgwLCA1LjYpLAotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDAiKTsKLX0KLQotLy8gVGVzdHMgQVNTRVJUX05FLgotVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTkUpIHsKLSAgQVNTRVJUX05FKDYsIDcpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkUoJ2EnLCAnYScpLAotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgnYScpICE9ICgnYScpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJhY3R1YWw6ICdhJyAoOTcsIDB4NjEpIHZzICdhJyAoOTcsIDB4NjEpIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9MRS4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0xFKSB7Ci0gIEFTU0VSVF9MRSgyLCAzKTsKLSAgQVNTRVJUX0xFKDIsIDIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTEUoMiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDw9ICgwKSwgYWN0dWFsOiAyIHZzIDAiKTsKLX0KLQotLy8gVGVzdHMgQVNTRVJUX0xULgotVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTFQpIHsKLSAgQVNTRVJUX0xUKDIsIDMpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTFQoMiwgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDwgKDIpLCBhY3R1YWw6IDIgdnMgMiIpOwotfQotCi0vLyBUZXN0cyBBU1NFUlRfR0UuCi1URVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9HRSkgewotICBBU1NFUlRfR0UoMiwgMSk7Ci0gIEFTU0VSVF9HRSgyLCAyKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKDIsIDMpLAotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+PSAoMyksIGFjdHVhbDogMiB2cyAzIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9HVC4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0dUKSB7Ci0gIEFTU0VSVF9HVCgyLCAxKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dUKDIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKLX0KLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLXZvaWQgVGhyb3dOb3RoaW5nKCkge30KLQotLy8gVGVzdHMgQVNTRVJUX1RIUk9XLgotVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfVEhST1cpIHsKLSAgQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCk7Ci0KLSMgaWZuZGVmIF9fQk9STEFORENfXwotCi0gIC8vIElDRSdzIGluIEMrK0J1aWxkZXIgMjAwNyBhbmQgMjAwOS4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCi0gICAgICBBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgYm9vbCksCi0gICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCi0gICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiIpOwotIyBlbmRpZgotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAotICAgICAgQVNTRVJUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKSwKLSAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCi0gICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiIpOwotfQotCi0vLyBUZXN0cyBBU1NFUlRfTk9fVEhST1cuCi1URVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9OT19USFJPVykgewotICBBU1NFUlRfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbi4iCi0gICAgICAgICAgICAgICAgICAgICAgICJcbiAgQWN0dWFsOiBpdCB0aHJvd3MuIik7Ci19Ci0KLS8vIFRlc3RzIEFTU0VSVF9BTllfVEhST1cuCi1URVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9BTllfVEhST1cpIHsKLSAgQVNTRVJUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoCi0gICAgICBBU1NFUlRfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSwKLSAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIKLSAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBNYWtlcyBzdXJlIHdlIGRlYWwgd2l0aCB0aGUgcHJlY2VkZW5jZSBvZiA8PC4gIFRoaXMgdGVzdCBzaG91bGQKLS8vIGNvbXBpbGUuCi1URVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFByZWNlZGVuY2UpIHsKLSAgQVNTRVJUX0VRKDEgPCAyLCB0cnVlKTsKLSAgYm9vbCBmYWxzZV92YWx1ZSA9IGZhbHNlOwotICBBU1NFUlRfRVEodHJ1ZSAmJiBmYWxzZV92YWx1ZSwgZmFsc2UpOwotfQotCi0vLyBBIHN1YnJvdXRpbmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIHRlc3QuCi12b2lkIFRlc3RFcTEoaW50IHgpIHsKLSAgQVNTRVJUX0VRKDEsIHgpOwotfQotCi0vLyBUZXN0cyBjYWxsaW5nIGEgdGVzdCBzdWJyb3V0aW5lIHRoYXQncyBub3QgcGFydCBvZiBhIGZpeHR1cmUuCi1URVNUKEFzc2VydGlvblRlc3QsIE5vbkZpeHR1cmVTdWJyb3V0aW5lKSB7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RFcTEoMiksCi0gICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogeCIpOwotfQotCi0vLyBBbiB1bmNvcHlhYmxlIGNsYXNzLgotY2xhc3MgVW5jb3B5YWJsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBVbmNvcHlhYmxlKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQotCi0gIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5jb3B5YWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlKCkgPT0gcmhzLnZhbHVlKCk7Ci0gIH0KLSBwcml2YXRlOgotICAvLyBUaGlzIGNvbnN0cnVjdG9yIGRlbGliZXJhdGVseSBoYXMgbm8gaW1wbGVtZW50YXRpb24sIGFzIHdlIGRvbid0Ci0gIC8vIHdhbnQgdGhpcyBjbGFzcyB0byBiZSBjb3B5YWJsZS4KLSAgVW5jb3B5YWJsZShjb25zdCBVbmNvcHlhYmxlJik7ICAvLyBOT0xJTlQKLQotICBpbnQgdmFsdWVfOwotfTsKLQotOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBVbmNvcHlhYmxlJiB2YWx1ZSkgewotICByZXR1cm4gb3MgPDwgdmFsdWUudmFsdWUoKTsKLX0KLQotCi1ib29sIElzUG9zaXRpdmVVbmNvcHlhYmxlKGNvbnN0IFVuY29weWFibGUmIHgpIHsKLSAgcmV0dXJuIHgudmFsdWUoKSA+IDA7Ci19Ci0KLS8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KLXZvaWQgVGVzdEFzc2VydE5vblBvc2l0aXZlKCkgewotICBVbmNvcHlhYmxlIHkoLTEpOwotICBBU1NFUlRfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHkpOwotfQotLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgotdm9pZCBUZXN0QXNzZXJ0RXF1YWxzVW5jb3B5YWJsZSgpIHsKLSAgVW5jb3B5YWJsZSB4KDUpOwotICBVbmNvcHlhYmxlIHkoLTEpOwotICBBU1NFUlRfRVEoeCwgeSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdW5jb3B5YWJsZSBvYmplY3RzIGNhbiBiZSB1c2VkIGluIGFzc2VydGlvbnMuCi1URVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFdvcmtzV2l0aFVuY29weWFibGVPYmplY3QpIHsKLSAgVW5jb3B5YWJsZSB4KDUpOwotICBBU1NFUlRfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHgpOwotICBBU1NFUlRfRVEoeCwgeCk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFRlc3RBc3NlcnROb25Qb3NpdGl2ZSgpLAotICAgICJJc1Bvc2l0aXZlVW5jb3B5YWJsZSh5KSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlXG55IGV2YWx1YXRlcyB0byAtMSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShUZXN0QXNzZXJ0RXF1YWxzVW5jb3B5YWJsZSgpLAotICAgICJWYWx1ZSBvZjogeVxuICBBY3R1YWw6IC0xXG5FeHBlY3RlZDogeFxuV2hpY2ggaXM6IDUiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB1bmNvcHlhYmxlIG9iamVjdHMgY2FuIGJlIHVzZWQgaW4gZXhwZWN0cy4KLVRFU1QoQXNzZXJ0aW9uVGVzdCwgRXhwZWN0V29ya3NXaXRoVW5jb3B5YWJsZU9iamVjdCkgewotICBVbmNvcHlhYmxlIHgoNSk7Ci0gIEVYUEVDVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeCk7Ci0gIFVuY29weWFibGUgeSgtMSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEMShJc1Bvc2l0aXZlVW5jb3B5YWJsZSwgeSksCi0gICAgIklzUG9zaXRpdmVVbmNvcHlhYmxlKHkpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmVcbnkgZXZhbHVhdGVzIHRvIC0xIik7Ci0gIEVYUEVDVF9FUSh4LCB4KTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHgsIHkpLAotICAgICJWYWx1ZSBvZjogeVxuICBBY3R1YWw6IC0xXG5FeHBlY3RlZDogeFxuV2hpY2ggaXM6IDUiKTsKLX0KLQotZW51bSBOYW1lZEVudW0gewotICBrRTEgPSAwLAotICBrRTIgPSAxCi19OwotCi1URVNUKEFzc2VydGlvblRlc3QsIE5hbWVkRW51bSkgewotICBFWFBFQ1RfRVEoa0UxLCBrRTEpOwotICBFWFBFQ1RfTFQoa0UxLCBrRTIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoa0UxLCBrRTIpLCAiV2hpY2ggaXM6IDAiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKGtFMSwga0UyKSwgIkFjdHVhbDogMSIpOwotfQotCi0vLyBUaGUgdmVyc2lvbiBvZiBnY2MgdXNlZCBpbiBYQ29kZSAyLjIgaGFzIGEgYnVnIGFuZCBkb2Vzbid0IGFsbG93Ci0vLyBhbm9ueW1vdXMgZW51bXMgaW4gYXNzZXJ0aW9ucy4gIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHRlc3QgaXMgbm90Ci0vLyBkb25lIG9uIE1hYy4KLS8vIFN1biBTdHVkaW8gYW5kIEhQIGFDQyBhbHNvIHJlamVjdCB0aGlzIGNvZGUuCi0jaWYgIUdURVNUX09TX01BQyAmJiAhZGVmaW5lZChfX1NVTlBST19DQykgJiYgIWRlZmluZWQoX19IUF9hQ0MpCi0KLS8vIFRlc3RzIHVzaW5nIGFzc2VydGlvbnMgd2l0aCBhbm9ueW1vdXMgZW51bXMuCi1lbnVtIHsKLSAga0Nhc2VBID0gLTEsCi0KLSMgaWYgR1RFU1RfT1NfTElOVVgKLQotICAvLyBXZSB3YW50IHRvIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIHNpemUgb2YgdGhlIGFub255bW91cyBlbnVtIGlzCi0gIC8vIGxhcmdlciB0aGFuIHNpemVvZihpbnQpLCB0byBtYWtlIHN1cmUgb3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAvLyBhc3NlcnRpb25zIGRvZXNuJ3QgdHJ1bmNhdGUgdGhlIGVudW1zLiAgSG93ZXZlciwgTVNWQwotICAvLyAoaW5jb3JyZWN0bHkpIGRvZXNuJ3QgYWxsb3cgYW4gZW51bSB2YWx1ZSB0byBleGNlZWQgdGhlIHJhbmdlIG9mCi0gIC8vIGFuIGludCwgc28gdGhpcyBoYXMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KLSAgLy8KLSAgLy8gT24gTGludXgsIGtDYXNlQiBhbmQga0Nhc2VBIGhhdmUgdGhlIHNhbWUgdmFsdWUgd2hlbiB0cnVuY2F0ZWQgdG8KLSAgLy8gaW50IHNpemUuICBXZSB3YW50IHRvIHRlc3Qgd2hldGhlciB0aGlzIHdpbGwgY29uZnVzZSB0aGUKLSAgLy8gYXNzZXJ0aW9ucy4KLSAga0Nhc2VCID0gdGVzdGluZzo6aW50ZXJuYWw6OmtNYXhCaWdnZXN0SW50LAotCi0jIGVsc2UKLQotICBrQ2FzZUIgPSBJTlRfTUFYLAotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0gIGtDYXNlQyA9IDQyCi19OwotCi1URVNUKEFzc2VydGlvblRlc3QsIEFub255bW91c0VudW0pIHsKLSMgaWYgR1RFU1RfT1NfTElOVVgKLQotICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrQ2FzZUEpLCBzdGF0aWNfY2FzdDxpbnQ+KGtDYXNlQikpOwotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0gIEVYUEVDVF9FUShrQ2FzZUEsIGtDYXNlQSk7Ci0gIEVYUEVDVF9ORShrQ2FzZUEsIGtDYXNlQik7Ci0gIEVYUEVDVF9MVChrQ2FzZUEsIGtDYXNlQik7Ci0gIEVYUEVDVF9MRShrQ2FzZUEsIGtDYXNlQik7Ci0gIEVYUEVDVF9HVChrQ2FzZUIsIGtDYXNlQSk7Ci0gIEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRShrQ2FzZUEsIGtDYXNlQiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIoa0Nhc2VBKSA+PSAoa0Nhc2VCKSIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0Uoa0Nhc2VBLCBrQ2FzZUMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiLTEgdnMgNDIiKTsKLQotICBBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUEpOwotICBBU1NFUlRfTkUoa0Nhc2VBLCBrQ2FzZUIpOwotICBBU1NFUlRfTFQoa0Nhc2VBLCBrQ2FzZUIpOwotICBBU1NFUlRfTEUoa0Nhc2VBLCBrQ2FzZUIpOwotICBBU1NFUlRfR1Qoa0Nhc2VCLCBrQ2FzZUEpOwotICBBU1NFUlRfR0Uoa0Nhc2VBLCBrQ2FzZUEpOwotCi0jIGlmbmRlZiBfX0JPUkxBTkRDX18KLQotICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUIpLAotICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IGtDYXNlQiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUMpLAotICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsOiA0MiIpOwotIyBlbmRpZgotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShrQ2FzZUEsIGtDYXNlQyksCi0gICAgICAgICAgICAgICAgICAgICAgICJXaGljaCBpczogLTEiKTsKLX0KLQotI2VuZGlmICAvLyAhR1RFU1RfT1NfTUFDICYmICFkZWZpbmVkKF9fU1VOUFJPX0NDKQotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotCi1zdGF0aWMgSFJFU1VMVCBVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSB7Ci0gIHJldHVybiBFX1VORVhQRUNURUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIE9rSFJFU1VMVFN1Y2Nlc3MoKSB7Ci0gIHJldHVybiBTX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVCBGYWxzZUhSRVNVTFRTdWNjZXNzKCkgewotICByZXR1cm4gU19GQUxTRTsKLX0KLQotLy8gSFJFU1VMVCBhc3NlcnRpb24gdGVzdHMgdGVzdCBib3RoIHplcm8gYW5kIG5vbi16ZXJvCi0vLyBzdWNjZXNzIGNvZGVzIGFzIHdlbGwgYXMgZmFpbHVyZSBtZXNzYWdlIGZvciBlYWNoLgotLy8KLS8vIFdpbmRvd3MgQ0UgZG9lc24ndCBzdXBwb3J0IG1lc3NhZ2UgdGV4dHMuCi1URVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQpIHsKLSAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFNfT0spOwotICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19GQUxTRSk7Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSwKLSAgICAiRXhwZWN0ZWQ6IChVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSkgc3VjY2VlZHMuXG4iCi0gICAgIiAgQWN0dWFsOiAweDgwMDBGRkZGIik7Ci19Ci0KLVRFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRCkgewotICBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoU19PSyk7Ci0gIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX0ZBTFNFKTsKLQotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkpLAotICAgICJFeHBlY3RlZDogKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSBzdWNjZWVkcy5cbiIKLSAgICAiICBBY3R1YWw6IDB4ODAwMEZGRkYiKTsKLX0KLQotVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKSB7Ci0gIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChPa0hSRVNVTFRTdWNjZXNzKCkpLAotICAgICJFeHBlY3RlZDogKE9rSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCi0gICAgIiAgQWN0dWFsOiAweDAiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0hSRVNVTFRfRkFJTEVEKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSksCi0gICAgIkV4cGVjdGVkOiAoRmFsc2VIUkVTVUxUU3VjY2VzcygpKSBmYWlscy5cbiIKLSAgICAiICBBY3R1YWw6IDB4MSIpOwotfQotCi1URVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBBU1NFUlRfSFJFU1VMVF9GQUlMRUQpIHsKLSAgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKEVfVU5FWFBFQ1RFRCk7Ci0KLSMgaWZuZGVmIF9fQk9STEFORENfXwotCi0gIC8vIElDRSdzIGluIEMrK0J1aWxkZXIgMjAwNyBhbmQgMjAwOS4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0hSRVNVTFRfRkFJTEVEKE9rSFJFU1VMVFN1Y2Nlc3MoKSksCi0gICAgIkV4cGVjdGVkOiAoT2tIUkVTVUxUU3VjY2VzcygpKSBmYWlscy5cbiIKLSAgICAiICBBY3R1YWw6IDB4MCIpOwotIyBlbmRpZgotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpLAotICAgICJFeHBlY3RlZDogKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCi0gICAgIiAgQWN0dWFsOiAweDEiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBzdHJlYW1pbmcgdG8gdGhlIEhSRVNVTFQgbWFjcm9zIHdvcmtzLgotVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgU3RyZWFtaW5nKSB7Ci0gIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChTX09LKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKFNfT0spIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoRV9VTkVYUEVDVEVEKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKEVfVU5FWFBFQ1RFRCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoRV9VTkVYUEVDVEVEKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotCi0jIGlmbmRlZiBfX0JPUkxBTkRDX18KLQotICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyIDIwMDcgYW5kIDIwMDkuCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAotICAgICAgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKEVfVU5FWFBFQ1RFRCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLSMgZW5kaWYKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKLSAgICAgIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChTX09LKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAotICAgICAgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKFNfT0spIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0jaWZkZWYgX19CT1JMQU5EQ19fCi0vLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgotIyBwcmFnbWEgb3B0aW9uIHB1c2ggLXctY2NjIC13LXJjaAotI2VuZGlmCi0KLS8vIFRlc3RzIHRoYXQgdGhlIGFzc2VydGlvbiBtYWNyb3MgYmVoYXZlIGxpa2Ugc2luZ2xlIHN0YXRlbWVudHMuCi1URVNUKEFzc2VydGlvblN5bnRheFRlc3QsIEJhc2ljQXNzZXJ0aW9uc0JlaGF2ZXNMaWtlU2luZ2xlU3RhdGVtZW50KSB7Ci0gIGlmIChBbHdheXNGYWxzZSgpKQotICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0J3MgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkuIjsKLQotICBpZiAoQWx3YXlzVHJ1ZSgpKQotICAgIEVYUEVDVF9GQUxTRShmYWxzZSk7Ci0gIGVsc2UKLSAgICA7ICAvLyBOT0xJTlQKLQotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICBBU1NFUlRfTFQoMSwgMyk7Ci0KLSAgaWYgKEFsd2F5c0ZhbHNlKCkpCi0gICAgOyAgLy8gTk9MSU5UCi0gIGVsc2UKLSAgICBFWFBFQ1RfR1QoMywgMikgPDwgIiI7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotLy8gVGVzdHMgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBub3QgY29tcGxhaW4gYWJvdXQgdW5yZWFjaGFibGUgY29kZSBpbiB0aGUKLS8vIEVYUEVDVF9USFJPVy9FWFBFQ1RfQU5ZX1RIUk9XL0VYUEVDVF9OT19USFJPVyBtYWNyb3MuCi1URVNUKEV4cGVjdFRocm93VGVzdCwgRG9lc05vdEdlbmVyYXRlVW5yZWFjaGFibGVDb2RlV2FybmluZykgewotICBpbnQgbiA9IDA7Ci0KLSAgRVhQRUNUX1RIUk9XKHRocm93IDEsIGludCk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyhuKyssIGludCksICIiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKHRocm93IDEsIGNvbnN0IGNoYXIqKSwgIiIpOwotICBFWFBFQ1RfTk9fVEhST1cobisrKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05PX1RIUk9XKHRocm93IDEpLCAiIik7Ci0gIEVYUEVDVF9BTllfVEhST1codGhyb3cgMSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9BTllfVEhST1cobisrKSwgIiIpOwotfQotCi1URVNUKEFzc2VydGlvblN5bnRheFRlc3QsIEV4Y2VwdGlvbkFzc2VydGlvbnNCZWhhdmVzTGlrZVNpbmdsZVN0YXRlbWVudCkgewotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICBFWFBFQ1RfVEhST1coVGhyb3dOb3RoaW5nKCksIGJvb2wpOwotCi0gIGlmIChBbHdheXNUcnVlKCkpCi0gICAgRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCk7Ci0gIGVsc2UKLSAgICA7ICAvLyBOT0xJTlQKLQotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICBFWFBFQ1RfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSk7Ci0KLSAgaWYgKEFsd2F5c1RydWUoKSkKLSAgICBFWFBFQ1RfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpOwotICBlbHNlCi0gICAgOyAgLy8gTk9MSU5UCi0KLSAgaWYgKEFsd2F5c0ZhbHNlKCkpCi0gICAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSk7Ci0KLSAgaWYgKEFsd2F5c1RydWUoKSkKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpOwotICBlbHNlCi0gICAgOyAgLy8gTk9MSU5UCi19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLVRFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgTm9GYXRhbEZhaWx1cmVBc3NlcnRpb25zQmVoYXZlc0xpa2VTaW5nbGVTdGF0ZW1lbnQpIHsKLSAgaWYgKEFsd2F5c0ZhbHNlKCkpCi0gICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpKSA8PCAiVGhpcyBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJJdCdzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5LiI7Ci0gIGVsc2UKLSAgICA7ICAvLyBOT0xJTlQKLQotICBpZiAoQWx3YXlzRmFsc2UoKSkKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGQUlMKCkpIDw8ICIiOwotICBlbHNlCi0gICAgOyAgLy8gTk9MSU5UCi0KLSAgaWYgKEFsd2F5c1RydWUoKSkKLSAgICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTVUNDRUVEKCkpOwotICBlbHNlCi0gICAgOyAgLy8gTk9MSU5UCi0KLSAgaWYgKEFsd2F5c0ZhbHNlKCkpCi0gICAgOyAgLy8gTk9MSU5UCi0gIGVsc2UKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTVUNDRUVEKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBhc3NlcnRpb24gbWFjcm9zIHdvcmsgd2VsbCB3aXRoIHN3aXRjaCBzdGF0ZW1lbnRzLgotVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBXb3Jrc1dpdGhTd2l0Y2gpIHsKLSAgc3dpdGNoICgwKSB7Ci0gICAgY2FzZSAxOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVF9UUlVFKHRydWUpOwotICB9Ci0KLSAgc3dpdGNoICgwKQotICAgIGNhc2UgMDoKLSAgICAgIEVYUEVDVF9GQUxTRShmYWxzZSkgPDwgIkVYUEVDVF9GQUxTRSBmYWlsZWQgaW4gc3dpdGNoIGNhc2UiOwotCi0gIC8vIEJpbmFyeSBhc3NlcnRpb25zIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGRpZmZlcmVudCBjb2RlIHBhdGgKLSAgLy8gdGhhbiB0aGUgQm9vbGVhbiBhc3NlcnRpb25zLiAgSGVuY2Ugd2UgdGVzdCB0aGVtIHNlcGFyYXRlbHkuCi0gIHN3aXRjaCAoMCkgewotICAgIGNhc2UgMToKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUX0VRKDEsIDEpIDw8ICJBU1NFUlRfRVEgZmFpbGVkIGluIGRlZmF1bHQgc3dpdGNoIGhhbmRsZXIiOwotICB9Ci0KLSAgc3dpdGNoICgwKQotICAgIGNhc2UgMDoKLSAgICAgIEVYUEVDVF9ORSgxLCAyKTsKLX0KLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLXZvaWQgVGhyb3dBU3RyaW5nKCkgewotICAgIHRocm93ICJzdGQ6OnN0cmluZyI7Ci19Ci0KLS8vIFRlc3QgdGhhdCB0aGUgZXhjZXB0aW9uIGFzc2VydGlvbiBtYWNyb3MgY29tcGlsZSBhbmQgd29yayB3aXRoIGNvbnN0Ci0vLyB0eXBlIHF1YWxpZmllci4KLVRFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgV29ya3NXaXRoQ29uc3QpIHsKLSAgICBBU1NFUlRfVEhST1coVGhyb3dBU3RyaW5nKCksIGNvbnN0IGNoYXIqKTsKLQotICAgIEVYUEVDVF9USFJPVyhUaHJvd0FTdHJpbmcoKSwgY29uc3QgY2hhciopOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgdHJhY2tzIFNVQ0NFRUQqLgotVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgU1VDQ0VFRCkgewotICBTVUNDRUVEKCk7Ci0gIFNVQ0NFRUQoKSA8PCAiT0siOwotICBFWFBFQ1RfRVEoMiwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgRVhQRUNUXyouCi1URVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBFWFBFQ1QpIHsKLSAgRVhQRUNUX1RSVUUodHJ1ZSk7Ci0gIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzc2Z1bCBFWFBFQ1RfU1RSKi4KLVRFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIEVYUEVDVF9TVFIpIHsKLSAgRVhQRUNUX1NUUkVRKCIiLCAiIik7Ci0gIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzc2Z1bCBBU1NFUlRfKi4KLVRFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIEFTU0VSVCkgewotICBBU1NFUlRfVFJVRSh0cnVlKTsKLSAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEFTU0VSVF9TVFIqLgotVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUikgewotICBBU1NFUlRfU1RSRVEoIiIsICIiKTsKLSAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIFRlc3RzIHRoZSBtZXNzYWdlIHN0cmVhbWluZyB2YXJpYXRpb24gb2YgYXNzZXJ0aW9ucy4KLQotVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEVYUEVDVCkgewotICBFWFBFQ1RfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKDEsIDEpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMxLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICMxIik7Ci0gIEVYUEVDVF9MRSgxLCAyKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoMSwgMCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzIuIik7Ci0gIEVYUEVDVF9HRSgxLCAwKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR1QoMSwgMikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzMuIik7Ci0KLSAgRVhQRUNUX1NUUkVRKCIxIiwgIjEiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoIjEiLCAiMSIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICM0LiIpOwotICBFWFBFQ1RfU1RSQ0FTRUVRKCJhIiwgIkEiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSQ0FTRU5FKCJhIiwgIkEiKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjNS4iKTsKLQotICBFWFBFQ1RfRkxPQVRfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSgxLCAxLjIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM2LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICM2LiIpOwotICBFWFBFQ1RfTkVBUigxLCAxLjEsIDAuMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKLX0KLQotVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEFTU0VSVCkgewotICBBU1NFUlRfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKLSAgQVNTRVJUX05FKDEsIDIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Ci0gIEFTU0VSVF9MRSgxLCAyKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBBU1NFUlRfTFQoMSwgMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKLSAgQVNTRVJUX0dFKDEsIDApIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HVCgxLCAyKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZS4iKTsKLX0KLQotVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEFTU0VSVF9TVFIpIHsKLSAgQVNTRVJUX1NUUkVRKCIxIiwgIjEiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBBU1NFUlRfU1RSTkUoIjEiLCAiMiIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Ci0gIEFTU0VSVF9TVFJDQVNFRVEoImEiLCAiQSIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFTkUoImEiLCAiQSIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlLiIpOwotfQotCi1URVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgQVNTRVJUX0ZMT0FUSU5HKSB7Ci0gIEFTU0VSVF9GTE9BVF9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBBU1NFUlRfRE9VQkxFX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ORUFSKDEsMS4yLCAwLjEpIDw8ICJFeHBlY3QgZmFpbHVyZS4iLCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3QgZmFpbHVyZS4iKTsKLSAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubwotICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIHN0YXRlbWVudC4KLX0KLQotLy8gVGVzdHMgdXNpbmcgQVNTRVJUX0ZBTFNFIHdpdGggYSBzdHJlYW1lZCBtZXNzYWdlLgotVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEFTU0VSVF9GQUxTRSkgewotICBBU1NFUlRfRkFMU0UoZmFsc2UpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEFTU0VSVF9GQUxTRSh0cnVlKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZTogIiA8PCAyIDw8ICIgPiAiIDw8IDEKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB0cnVlOwotICB9LCAiRXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi0vLyBUZXN0cyB1c2luZyBGQUlMIHdpdGggYSBzdHJlYW1lZCBtZXNzYWdlLgotVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEZBSUwpIHsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICIwIik7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFNVQ0NFRUQgd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCi1URVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgU1VDQ0VFRCkgewotICBTVUNDRUVEKCkgPDwgIlN1Y2Nlc3MgPT0gIiA8PCAxOwotfQotCi0vLyBUZXN0cyB1c2luZyBBU1NFUlRfVFJVRSB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KLVRFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlRfVFJVRSkgewotICBBU1NFUlRfVFJVRSh0cnVlKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOwotICBBU1NFUlRfVFJVRSh0cnVlKSA8PCB0cnVlOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxjaGFyICo+KE5VTEwpOwotICB9LCAiKG51bGwpKG51bGwpIik7Ci19Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0vLyBUZXN0cyB1c2luZyB3aWRlIHN0cmluZ3MgaW4gYXNzZXJ0aW9uIG1lc3NhZ2VzLgotVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIFdpZGVTdHJpbmdNZXNzYWdlKSB7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEVYUEVDVF9UUlVFKGZhbHNlKSA8PCBMIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC5ceDgxMTkiOwotICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBBU1NFUlRfRVEoMSwgMikgPDwgIlRoaXMgZmFpbHVyZSBpcyAiCi0gICAgICAgICAgICAgICAgICAgIDw8IEwiZXhwZWN0ZWQgdG9vLlx4ODEyMCI7Ci0gIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQgdG9vLiIpOwotfQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFRlc3RzIEVYUEVDVF9UUlVFLgotVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfVFJVRSkgewotICBFWFBFQ1RfVFJVRSh0cnVlKSA8PCAiSW50ZW50aW9uYWwgc3VjY2VzcyI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKGZhbHNlKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMS4iKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoZmFsc2UpIDw8ICJJbnRlbnRpb25hbCBmYWlsdXJlICMyLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlbnRpb25hbCBmYWlsdXJlICMyLiIpOwotICBFWFBFQ1RfVFJVRSgyID4gMSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoMiA8IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIgPCAxXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2VcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKDIgPiAzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjIgPiAzIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9UUlVFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KLVRFU1QoRXhwZWN0VGVzdCwgRXhwZWN0VHJ1ZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKLSAgRVhQRUNUX1RSVUUoUmVzdWx0SXNFdmVuKDIpKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoUmVzdWx0SXNFdmVuKDMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMylcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZSAoMyBpcyBvZGQpXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOwotICBFWFBFQ1RfVFJVRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9GQUxTRSB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0ZBTFNFKSB7Ci0gIEVYUEVDVF9GQUxTRSgyIDwgMSk7ICAvLyBOT0xJTlQKLSAgRVhQRUNUX0ZBTFNFKGZhbHNlKSA8PCAiSW50ZW50aW9uYWwgc3VjY2VzcyI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSh0cnVlKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMS4iKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKHRydWUpIDw8ICJJbnRlbnRpb25hbCBmYWlsdXJlICMyLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlbnRpb25hbCBmYWlsdXJlICMyLiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoMiA+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIgPiAxXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSgyIDwgMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIyIDwgMyIpOwotfQotCi0vLyBUZXN0cyBFWFBFQ1RfRkFMU0UocHJlZGljYXRlKSBmb3IgcHJlZGljYXRlcyByZXR1cm5pbmcgQXNzZXJ0aW9uUmVzdWx0LgotVEVTVChFeHBlY3RUZXN0LCBFeHBlY3RGYWxzZVdpdGhBc3NlcnRpb25SZXN1bHQpIHsKLSAgRVhQRUNUX0ZBTFNFKFJlc3VsdElzRXZlbigzKSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW4oMikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbigyKVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWUgKDIgaXMgZXZlbilcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOwotICBFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigzKSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW5Ob0V4cGxhbmF0aW9uKDIpXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7Ci19Ci0KLSNpZmRlZiBfX0JPUkxBTkRDX18KLS8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQotIyBwcmFnbWEgb3B0aW9uIHBvcAotI2VuZGlmCi0KLS8vIFRlc3RzIEVYUEVDVF9FUS4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRKSB7Ci0gIEVYUEVDVF9FUSg1LCAyICsgMyk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg1LCAyKjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDIqM1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IDZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiA1Iik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg1LCAyIC0gMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIyIC0gMyIpOwotfQotCi0vLyBUZXN0cyB1c2luZyBFWFBFQ1RfRVEgb24gZG91YmxlIHZhbHVlcy4gIFRoZSBwdXJwb3NlIGlzIHRvIG1ha2UKLS8vIHN1cmUgdGhhdCB0aGUgc3BlY2lhbGl6YXRpb24gd2UgZGlkIGZvciBpbnRlZ2VyIGFuZCBhbm9ueW1vdXMgZW51bXMKLS8vIGlzbid0IHVzZWQgZm9yIGRvdWJsZSBhcmd1bWVudHMuCi1URVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9FUV9Eb3VibGUpIHsKLSAgLy8gQSBzdWNjZXNzLgotICBFWFBFQ1RfRVEoNS42LCA1LjYpOwotCi0gIC8vIEEgZmFpbHVyZS4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDUuMSwgNS4yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjUuMSIpOwotfQotCi0jaWYgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAotLy8gVGVzdHMgRVhQRUNUX0VRKE5VTEwsIHBvaW50ZXIpLgotVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVFfTlVMTCkgewotICAvLyBBIHN1Y2Nlc3MuCi0gIGNvbnN0IGNoYXIqIHAgPSBOVUxMOwotICAvLyBTb21lIG9sZGVyIEdDQyB2ZXJzaW9ucyBtYXkgaXNzdWUgYSBzcHVyaW91cyB3YXJuaW5nIGluIHRoaXMgb3IgdGhlIG5leHQKLSAgLy8gYXNzZXJ0aW9uIHN0YXRlbWVudC4gVGhpcyB3YXJuaW5nIHNob3VsZCBub3QgYmUgc3VwcHJlc3NlZCB3aXRoCi0gIC8vIHN0YXRpY19jYXN0IHNpbmNlIHRoZSB0ZXN0IHZlcmlmaWVzIHRoZSBhYmlsaXR5IHRvIHVzZSBiYXJlIE5VTEwgYXMgdGhlCi0gIC8vIGV4cGVjdGVkIHBhcmFtZXRlciB0byB0aGUgbWFjcm8uCi0gIEVYUEVDVF9FUShOVUxMLCBwKTsKLQotICAvLyBBIGZhaWx1cmUuCi0gIGludCBuID0gMDsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKE5VTEwsICZuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAmblxuIik7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0NBTl9DT01QQVJFX05VTEwKLQotLy8gVGVzdHMgRVhQRUNUX0VRKDAsIG5vbl9wb2ludGVyKS4gIFNpbmNlIHRoZSBsaXRlcmFsIDAgY2FuIGJlCi0vLyB0cmVhdGVkIGFzIGEgbnVsbCBwb2ludGVyIGJ5IHRoZSBjb21waWxlciwgd2UgbmVlZCB0byBtYWtlIHN1cmUKLS8vIHRoYXQgRVhQRUNUX0VRKDAsIG5vbl9wb2ludGVyKSBpc24ndCBpbnRlcnByZXRlZCBieSBHb29nbGUgVGVzdCBhcwotLy8gRVhQRUNUX0VRKHN0YXRpY19jYXN0PHZvaWQqPihOVUxMKSwgbm9uX3BvaW50ZXIpLgotVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVFfMCkgewotICBpbnQgbiA9IDA7Ci0KLSAgLy8gQSBzdWNjZXNzLgotICBFWFBFQ1RfRVEoMCwgbik7Ci0KLSAgLy8gQSBmYWlsdXJlLgotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoMCwgNS42KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAwIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9ORS4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX05FKSB7Ci0gIEVYUEVDVF9ORSg2LCA3KTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUoJ2EnLCAnYScpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgnYScpICE9ICgnYScpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhY3R1YWw6ICdhJyAoOTcsIDB4NjEpIHZzICdhJyAoOTcsIDB4NjEpIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORSgyLCAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiKTsKLSAgY2hhciogY29uc3QgcDAgPSBOVUxMOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUocDAsIHAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInAwIik7Ci0gIC8vIE9ubHkgd2F5IHRvIGdldCB0aGUgTm9raWEgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgY2FzdAotICAvLyBpcyB0byBoYXZlIGEgc2VwYXJhdGUgdm9pZCogdmFyaWFibGUgZmlyc3QuIFB1dHRpbmcKLSAgLy8gdGhlIHR3byBjYXN0cyBvbiB0aGUgc2FtZSBsaW5lIGRvZXNuJ3Qgd29yaywgbmVpdGhlciBkb2VzCi0gIC8vIGEgZGlyZWN0IEMtc3R5bGUgdG8gY2hhciouCi0gIHZvaWQqIHB2MSA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKLSAgY2hhciogY29uc3QgcDEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdjEpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUocDEsIHAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInAxIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9MRS4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0xFKSB7Ci0gIEVYUEVDVF9MRSgyLCAzKTsKLSAgRVhQRUNUX0xFKDIsIDIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTEUoMiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpIDw9ICgwKSwgYWN0dWFsOiAyIHZzIDAiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xFKDEuMSwgMC45KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIigxLjEpIDw9ICgwLjkpIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9MVC4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0xUKSB7Ci0gIEVYUEVDVF9MVCgyLCAzKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA8ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIDwgKDEpIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9HRS4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0dFKSB7Ci0gIEVYUEVDVF9HRSgyLCAxKTsKLSAgRVhQRUNUX0dFKDIsIDIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0UoMiwgMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogKDIpID49ICgzKSwgYWN0dWFsOiAyIHZzIDMiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dFKDAuOSwgMS4xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIigwLjkpID49ICgxLjEpIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9HVC4KLVRFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0dUKSB7Ci0gIEVYUEVDVF9HVCgyLCAxKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKDIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKDIsIDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpID4gKDMpIik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBUZXN0cyBFWFBFQ1RfVEhST1cuCi1URVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9USFJPVykgewotICBFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIGJvb2wuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAotICAgICAgRVhQRUNUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKSwKLSAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIGJvb2wuXG4iCi0gICAgICAiICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiIpOwotfQotCi0vLyBUZXN0cyBFWFBFQ1RfTk9fVEhST1cuCi1URVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9OT19USFJPVykgewotICBFWFBFQ1RfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogVGhyb3dBbkludGVnZXIoKSBkb2Vzbid0IHRocm93IGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbi5cbiAgQWN0dWFsOiBpdCB0aHJvd3MuIik7Ci19Ci0KLS8vIFRlc3RzIEVYUEVDVF9BTllfVEhST1cuCi1URVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9BTllfVEhST1cpIHsKLSAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCi0gICAgICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSwKLSAgICAgICJFeHBlY3RlZDogVGhyb3dOb3RoaW5nKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIKLSAgICAgICIgIEFjdHVhbDogaXQgZG9lc24ndC4iKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBNYWtlIHN1cmUgd2UgZGVhbCB3aXRoIHRoZSBwcmVjZWRlbmNlIG9mIDw8LgotVEVTVChFeHBlY3RUZXN0LCBFeHBlY3RQcmVjZWRlbmNlKSB7Ci0gIEVYUEVDVF9FUSgxIDwgMiwgdHJ1ZSk7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh0cnVlLCB0cnVlICYmIGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiB0cnVlICYmIGZhbHNlIik7Ci19Ci0KLQotLy8gVGVzdHMgdGhlIFN0cmVhbWFibGVUb1N0cmluZygpIGZ1bmN0aW9uLgotCi0vLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIHNjYWxhci4KLVRFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgU2NhbGFyKSB7Ci0gIEVYUEVDVF9TVFJFUSgiNSIsIFN0cmVhbWFibGVUb1N0cmluZyg1KS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBub24tY2hhciBwb2ludGVyLgotVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBQb2ludGVyKSB7Ci0gIGludCBuID0gMDsKLSAgaW50KiBwID0gJm47Ci0gIEVYUEVDVF9TVFJORSgiKG51bGwpIiwgU3RyZWFtYWJsZVRvU3RyaW5nKHApLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIE5VTEwgbm9uLWNoYXIgcG9pbnRlci4KLVRFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgTnVsbFBvaW50ZXIpIHsKLSAgaW50KiBwID0gTlVMTDsKLSAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLCBTdHJlYW1hYmxlVG9TdHJpbmcocCkuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgQyBzdHJpbmcuCi1URVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIENTdHJpbmcpIHsKLSAgRVhQRUNUX1NUUkVRKCJGb28iLCBTdHJlYW1hYmxlVG9TdHJpbmcoIkZvbyIpLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIE5VTEwgQyBzdHJpbmcuCi1URVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIE51bGxDU3RyaW5nKSB7Ci0gIGNoYXIqIHAgPSBOVUxMOwotICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsIFN0cmVhbWFibGVUb1N0cmluZyhwKS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgc3RyZWFtYWJsZSB2YWx1ZXMgYXMgYXNzZXJ0aW9uIG1lc3NhZ2VzLgotCi0vLyBUZXN0cyB1c2luZyBzdGQ6OnN0cmluZyBhcyBhbiBhc3NlcnRpb24gbWVzc2FnZS4KLVRFU1QoU3RyZWFtYWJsZVRlc3QsIHN0cmluZykgewotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc3RyKAotICAgICAgIlRoaXMgZmFpbHVyZSBtZXNzYWdlIGlzIGEgc3RkOjpzdHJpbmcsIGFuZCBpcyBleHBlY3RlZC4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RyLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgc3RyaW5ncyBjb250YWluaW5nIGVtYmVkZGVkIE5VTHMuCi0vLyBMaW1pdGVkIHRvIExpbnV4IGJlY2F1c2Ugd2UgY2FuIG9ubHkgZG8gdGhpcyB3aXRoIHN0ZDo6c3RyaW5nJ3MuCi1URVNUKFN0cmVhbWFibGVUZXN0LCBzdHJpbmdXaXRoRW1iZWRkZWROVUwpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcl9hcnJheV93aXRoX251bFtdID0KLSAgICAgICJIZXJlJ3MgYSBOVUxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyI7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdfd2l0aF9udWwoY2hhcl9hcnJheV93aXRoX251bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcl9hcnJheV93aXRoX251bCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpOyAgLy8gZHJvcHMgdGhlIHRyYWlsaW5nIE5VTAotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgc3RyaW5nX3dpdGhfbnVsLAotICAgICAgICAgICAgICAgICAgICAgICAiSGVyZSdzIGEgTlVMXFwwIGFuZCBzb21lIG1vcmUgc3RyaW5nIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgd2UgY2FuIG91dHB1dCBhIE5VTCBjaGFyLgotVEVTVChTdHJlYW1hYmxlVGVzdCwgTlVMQ2hhcikgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBGQUlMKCkgPDwgIkEgTlVMIiA8PCAnXDAnIDw8ICIgYW5kIHNvbWUgbW9yZSBzdHJpbmciOwotICB9LCAiQSBOVUxcXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgaW50IGFzIGFuIGFzc2VydGlvbiBtZXNzYWdlLgotVEVTVChTdHJlYW1hYmxlVGVzdCwgaW50KSB7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCA5MDA5MTMsCi0gICAgICAgICAgICAgICAgICAgICAgICI5MDA5MTMiKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgTlVMTCBjaGFyIHBvaW50ZXIgYXMgYW4gYXNzZXJ0aW9uIG1lc3NhZ2UuCi0vLwotLy8gSW4gTVNWQywgc3RyZWFtaW5nIGEgTlVMTCBjaGFyICogY2F1c2VzIGFjY2VzcyB2aW9sYXRpb24uICBHb29nbGUgVGVzdAotLy8gaW1wbGVtZW50ZWQgYSB3b3JrYXJvdW5kIChzdWJzdGl0dXRpbmcgIihudWxsKSIgZm9yIE5VTEwpLiAgVGhpcwotLy8gdGVzdHMgd2hldGhlciB0aGUgd29ya2Fyb3VuZCB3b3Jrcy4KLVRFU1QoU3RyZWFtYWJsZVRlc3QsIE51bGxDaGFyUHRyKSB7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICIobnVsbCkiKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgY2FuIGJlCi0vLyBzdHJlYW1lZCB0byB0ZXN0aW5nOjpNZXNzYWdlLgotVEVTVChTdHJlYW1hYmxlVGVzdCwgQmFzaWNJb01hbmlwKSB7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAotICAgIEZBSUwoKSA8PCAiTGluZSAxLiIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgIDw8ICJBIE5VTCBjaGFyICIgPDwgc3RkOjplbmRzIDw8IHN0ZDo6Zmx1c2ggPDwgIiBpbiBsaW5lIDIuIjsKLSAgfSwgIkxpbmUgMS5cbkEgTlVMIGNoYXIgXFwwIGluIGxpbmUgMi4iKTsKLX0KLQotLy8gVGVzdHMgdGhlIG1hY3JvcyB0aGF0IGhhdmVuJ3QgYmVlbiBjb3ZlcmVkIHNvIGZhci4KLQotdm9pZCBBZGRGYWlsdXJlSGVscGVyKGJvb2wqIGFib3J0ZWQpIHsKLSAgKmFib3J0ZWQgPSB0cnVlOwotICBBRERfRkFJTFVSRSgpIDw8ICJJbnRlbnRpb25hbCBmYWlsdXJlLiI7Ci0gICphYm9ydGVkID0gZmFsc2U7Ci19Ci0KLS8vIFRlc3RzIEFERF9GQUlMVVJFLgotVEVTVChNYWNyb1Rlc3QsIEFERF9GQUlMVVJFKSB7Ci0gIGJvb2wgYWJvcnRlZCA9IHRydWU7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmVIZWxwZXIoJmFib3J0ZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZS4iKTsKLSAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOwotfQotCi0vLyBUZXN0cyBBRERfRkFJTFVSRV9BVC4KLVRFU1QoTWFjcm9UZXN0LCBBRERfRkFJTFVSRV9BVCkgewotICAvLyBWZXJpZmllcyB0aGF0IEFERF9GQUlMVVJFX0FUIGRvZXMgZ2VuZXJhdGUgYSBub25mYXRhbCBmYWlsdXJlIGFuZAotICAvLyB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZSB1c2VyLXN0cmVhbWVkIHBhcnQuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFERF9GQUlMVVJFX0FUKCJmb28uY2MiLCA0MikgPDwgIldyb25nISIsICJXcm9uZyEiKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSB1c2VyLXN0cmVhbWVkIHBhcnQgaXMgb3B0aW9uYWwuCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFERF9GQUlMVVJFX0FUKCJmb28uY2MiLCA0MiksICJGYWlsZWQiKTsKLQotICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QgdmVyaWZ5IHRoYXQgdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucwotICAvLyB0aGUgcmlnaHQgZmlsZSBwYXRoIGFuZCBsaW5lIG51bWJlciB0aGUgc2FtZSB3YXksIGFzCi0gIC8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZG9lc24ndCBnZXQgdG8gc2VlIHRoZSBmaWxlIHBhdGggYW5kCi0gIC8vIGxpbmUgbnVtYmVyLiAgSW5zdGVhZCwgd2UgZG8gdGhhdCBpbiBndGVzdF9vdXRwdXRfdGVzdF8uY2MuCi19Ci0KLS8vIFRlc3RzIEZBSUwuCi1URVNUKE1hY3JvVGVzdCwgRkFJTCkgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCksCi0gICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8ICJJbnRlbnRpb25hbCBmYWlsdXJlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJJbnRlbnRpb25hbCBmYWlsdXJlLiIpOwotfQotCi0vLyBUZXN0cyBTVUNDRUVECi1URVNUKE1hY3JvVGVzdCwgU1VDQ0VFRCkgewotICBTVUNDRUVEKCk7Ci0gIFNVQ0NFRUQoKSA8PCAiRXhwbGljaXQgc3VjY2Vzcy4iOwotfQotCi0vLyBUZXN0cyBmb3IgRVhQRUNUX0VRKCkgYW5kIEFTU0VSVF9FUSgpLgotLy8KLS8vIFRoZXNlIHRlc3RzIGZhaWwgKmludGVudGlvbmFsbHkqLCBzLnQuIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIGNhbiBiZQotLy8gZ2VuZXJhdGVkIGFuZCB0ZXN0ZWQuCi0vLwotLy8gV2UgaGF2ZSBkaWZmZXJlbnQgdGVzdHMgZm9yIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcy4KLQotLy8gVGVzdHMgdXNpbmcgYm9vbCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgotVEVTVChFcUFzc2VydGlvblRlc3QsIEJvb2wpIHsKLSAgRVhQRUNUX0VRKHRydWUsICB0cnVlKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoewotICAgICAgYm9vbCBmYWxzZV92YWx1ZSA9IGZhbHNlOwotICAgICAgQVNTRVJUX0VRKGZhbHNlX3ZhbHVlLCB0cnVlKTsKLSAgICB9LCAiVmFsdWUgb2Y6IHRydWUiKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgaW50IHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgSW50KSB7Ci0gIEFTU0VSVF9FUSgzMiwgMzIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoMzIsIDMzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjMzIik7Ci19Ci0KLS8vIFRlc3RzIHVzaW5nIHRpbWVfdCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgotVEVTVChFcUFzc2VydGlvblRlc3QsIFRpbWVfVCkgewotICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dGltZV90PigwKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHRpbWVfdD4oMCkpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8dGltZV90PigwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRpbWVfdD4oMTIzNCkpLAotICAgICAgICAgICAgICAgICAgICAgICAiMTIzNCIpOwotfQotCi0vLyBUZXN0cyB1c2luZyBjaGFyIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgQ2hhcikgewotICBBU1NFUlRfRVEoJ3onLCAneicpOwotICBjb25zdCBjaGFyIGNoID0gJ2InOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoJ1wwJywgY2gpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiY2giKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKCdhJywgY2gpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiY2giKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgd2NoYXJfdCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgotVEVTVChFcUFzc2VydGlvblRlc3QsIFdpZGVDaGFyKSB7Ci0gIEVYUEVDVF9FUShMJ2InLCBMJ2InKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoTCdcMCcsIEwneCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IEwneCdcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBMJ3gnICgxMjAsIDB4NzgpXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogTCdcMCdcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaWNoIGlzOiBMJ1wwJyAoMCwgMHgwKSIpOwotCi0gIHN0YXRpYyB3Y2hhcl90IHdjaGFyOwotICB3Y2hhciA9IEwnYic7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShMJ2EnLCB3Y2hhciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ3Y2hhciIpOwotICB3Y2hhciA9IDB4ODExOTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0YXRpY19jYXN0PHdjaGFyX3Q+KDB4ODEyMCksIHdjaGFyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiB3Y2hhciIpOwotfQotCi0vLyBUZXN0cyB1c2luZyA6OnN0ZDo6c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgU3RkU3RyaW5nKSB7Ci0gIC8vIENvbXBhcmVzIGEgY29uc3QgY2hhciogdG8gYW4gc3RkOjpzdHJpbmcgdGhhdCBoYXMgaWRlbnRpY2FsCi0gIC8vIGNvbnRlbnQuCi0gIEFTU0VSVF9FUSgiVGVzdCIsIDo6c3RkOjpzdHJpbmcoIlRlc3QiKSk7Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCBzdGQ6OnN0cmluZ3MuCi0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cjEoIkEgKiBpbiB0aGUgbWlkZGxlIik7Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cjIoc3RyMSk7Ci0gIEVYUEVDVF9FUShzdHIxLCBzdHIyKTsKLQotICAvLyBDb21wYXJlcyBhIGNvbnN0IGNoYXIqIHRvIGFuIHN0ZDo6c3RyaW5nIHRoYXQgaGFzIGRpZmZlcmVudAotICAvLyBjb250ZW50Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgiVGVzdCIsIDo6c3RkOjpzdHJpbmcoInRlc3QiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcInRlc3RcIiIpOwotCi0gIC8vIENvbXBhcmVzIGFuIHN0ZDo6c3RyaW5nIHRvIGEgY2hhciogdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCi0gIGNoYXIqIGNvbnN0IHAxID0gY29uc3RfY2FzdDxjaGFyKj4oImZvbyIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoOjpzdGQ6OnN0cmluZygiYmFyIiksIHAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInAxIik7Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIHN0ZDo6c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2YKLSAgLy8gd2hpY2ggaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLiAgVGhpcyBzaG91bGQgZmFpbC4KLSAgc3RhdGljIDo6c3RkOjpzdHJpbmcgc3RyMyhzdHIxKTsKLSAgc3RyMy5hdCgyKSA9ICdcMCc7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdHIxLCBzdHIzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBzdHIzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJBIFxcMCBpbiB0aGUgbWlkZGxlXCIiKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotCi0vLyBUZXN0cyB1c2luZyA6OnN0ZDo6d3N0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgotVEVTVChFcUFzc2VydGlvblRlc3QsIFN0ZFdpZGVTdHJpbmcpIHsKLSAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCBzdGQ6OndzdHJpbmdzLgotICBjb25zdCA6OnN0ZDo6d3N0cmluZyB3c3RyMShMIkEgKiBpbiB0aGUgbWlkZGxlIik7Ci0gIGNvbnN0IDo6c3RkOjp3c3RyaW5nIHdzdHIyKHdzdHIxKTsKLSAgQVNTRVJUX0VRKHdzdHIxLCB3c3RyMik7Ci0KLSAgLy8gQ29tcGFyZXMgYW4gc3RkOjp3c3RyaW5nIHRvIGEgY29uc3Qgd2NoYXJfdCogdGhhdCBoYXMgaWRlbnRpY2FsCi0gIC8vIGNvbnRlbnQuCi0gIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODExOVtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODExOSwgJ1wwJyB9OwotICBFWFBFQ1RfRVEoOjpzdGQ6OndzdHJpbmcoa1Rlc3RYODExOSksIGtUZXN0WDgxMTkpOwotCi0gIC8vIENvbXBhcmVzIGFuIHN0ZDo6d3N0cmluZyB0byBhIGNvbnN0IHdjaGFyX3QqIHRoYXQgaGFzIGRpZmZlcmVudAotICAvLyBjb250ZW50LgotICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMjBbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMjAsICdcMCcgfTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgRVhQRUNUX0VRKDo6c3RkOjp3c3RyaW5nKGtUZXN0WDgxMTkpLCBrVGVzdFg4MTIwKTsKLSAgfSwgImtUZXN0WDgxMjAiKTsKLQotICAvLyBDb21wYXJlcyB0d28gc3RkOjp3c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2YKLSAgLy8gd2hpY2ggaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLgotICA6OnN0ZDo6d3N0cmluZyB3c3RyMyh3c3RyMSk7Ci0gIHdzdHIzLmF0KDIpID0gTCdcMCc7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh3c3RyMSwgd3N0cjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAid3N0cjMiKTsKLQotICAvLyBDb21wYXJlcyBhIHdjaGFyX3QqIHRvIGFuIHN0ZDo6d3N0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQKLSAgLy8gY29udGVudC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX0VRKGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KEwiZm9vIiksIDo6c3RkOjp3c3RyaW5nKEwiYmFyIikpOwotICB9LCAiIik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotLy8gVGVzdHMgdXNpbmcgOjpzdHJpbmcgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KLVRFU1QoRXFBc3NlcnRpb25UZXN0LCBHbG9iYWxTdHJpbmcpIHsKLSAgLy8gQ29tcGFyZXMgYSBjb25zdCBjaGFyKiB0byBhIDo6c3RyaW5nIHRoYXQgaGFzIGlkZW50aWNhbCBjb250ZW50LgotICBFWFBFQ1RfRVEoIlRlc3QiLCA6OnN0cmluZygiVGVzdCIpKTsKLQotICAvLyBDb21wYXJlcyB0d28gaWRlbnRpY2FsIDo6c3RyaW5ncy4KLSAgY29uc3QgOjpzdHJpbmcgc3RyMSgiQSAqIGluIHRoZSBtaWRkbGUiKTsKLSAgY29uc3QgOjpzdHJpbmcgc3RyMihzdHIxKTsKLSAgQVNTRVJUX0VRKHN0cjEsIHN0cjIpOwotCi0gIC8vIENvbXBhcmVzIGEgOjpzdHJpbmcgdG8gYSBjb25zdCBjaGFyKiB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDo6c3RyaW5nKCJUZXN0IiksICJ0ZXN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0Iik7Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIDo6c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2Ygd2hpY2gKLSAgLy8gaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLgotICA6OnN0cmluZyBzdHIzKHN0cjEpOwotICBzdHIzLmF0KDIpID0gJ1wwJzsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHN0cjEsIHN0cjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyMyIpOwotCi0gIC8vIENvbXBhcmVzIGEgOjpzdHJpbmcgdG8gYSBjaGFyKiB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCi0gICAgQVNTRVJUX0VRKDo6c3RyaW5nKCJiYXIiKSwgY29uc3RfY2FzdDxjaGFyKj4oImZvbyIpKTsKLSAgfSwgIiIpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLQotLy8gVGVzdHMgdXNpbmcgOjp3c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgR2xvYmFsV2lkZVN0cmluZykgewotICAvLyBDb21wYXJlcyB0d28gaWRlbnRpY2FsIDo6d3N0cmluZ3MuCi0gIHN0YXRpYyBjb25zdCA6OndzdHJpbmcgd3N0cjEoTCJBICogaW4gdGhlIG1pZGRsZSIpOwotICBzdGF0aWMgY29uc3QgOjp3c3RyaW5nIHdzdHIyKHdzdHIxKTsKLSAgRVhQRUNUX0VRKHdzdHIxLCB3c3RyMik7Ci0KLSAgLy8gQ29tcGFyZXMgYSBjb25zdCB3Y2hhcl90KiB0byBhIDo6d3N0cmluZyB0aGF0IGhhcyBpZGVudGljYWwgY29udGVudC4KLSAgY29uc3Qgd2NoYXJfdCBrVGVzdFg4MTE5W10gPSB7ICdUJywgJ2UnLCAncycsICd0JywgMHg4MTE5LCAnXDAnIH07Ci0gIEFTU0VSVF9FUShrVGVzdFg4MTE5LCA6OndzdHJpbmcoa1Rlc3RYODExOSkpOwotCi0gIC8vIENvbXBhcmVzIGEgY29uc3Qgd2NoYXJfdCogdG8gYSA6OndzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50Ci0gIC8vIGNvbnRlbnQuCi0gIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODEyMFtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODEyMCwgJ1wwJyB9OwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKLSAgICBFWFBFQ1RfRVEoa1Rlc3RYODEyMCwgOjp3c3RyaW5nKGtUZXN0WDgxMTkpKTsKLSAgfSwgIlRlc3RcXHg4MTE5Iik7Ci0KLSAgLy8gQ29tcGFyZXMgYSB3Y2hhcl90KiB0byBhIDo6d3N0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQgY29udGVudC4KLSAgd2NoYXJfdCogY29uc3QgcDEgPSBjb25zdF9jYXN0PHdjaGFyX3QqPihMImZvbyIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDEsIDo6d3N0cmluZyhMImJhciIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImJhciIpOwotCi0gIC8vIENvbXBhcmVzIHR3byA6OndzdHJpbmdzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMsIG9uZSBvZiB3aGljaAotICAvLyBoYXZpbmcgYSBOVUwgY2hhcmFjdGVyIGluIHRoZSBtaWRkbGUuCi0gIHN0YXRpYyA6OndzdHJpbmcgd3N0cjM7Ci0gIHdzdHIzID0gd3N0cjE7Ci0gIHdzdHIzLmF0KDIpID0gTCdcMCc7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSh3c3RyMSwgd3N0cjMpLAotICAgICAgICAgICAgICAgICAgICAgICAid3N0cjMiKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLQotLy8gVGVzdHMgdXNpbmcgY2hhciBwb2ludGVycyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgQ2hhclBvaW50ZXIpIHsKLSAgY2hhciogY29uc3QgcDAgPSBOVUxMOwotICAvLyBPbmx5IHdheSB0byBnZXQgdGhlIE5va2lhIGNvbXBpbGVyIHRvIGNvbXBpbGUgdGhlIGNhc3QKLSAgLy8gaXMgdG8gaGF2ZSBhIHNlcGFyYXRlIHZvaWQqIHZhcmlhYmxlIGZpcnN0LiBQdXR0aW5nCi0gIC8vIHRoZSB0d28gY2FzdHMgb24gdGhlIHNhbWUgbGluZSBkb2Vzbid0IHdvcmssIG5laXRoZXIgZG9lcwotICAvLyBhIGRpcmVjdCBDLXN0eWxlIHRvIGNoYXIqLgotICB2b2lkKiBwdjEgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCi0gIHZvaWQqIHB2MiA9ICh2b2lkKikweEFCQzA7ICAvLyBOT0xJTlQKLSAgY2hhciogY29uc3QgcDEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdjEpOwotICBjaGFyKiBjb25zdCBwMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHB2Mik7Ci0gIEFTU0VSVF9FUShwMSwgcDEpOwotCi0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMCwgcDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHAyIik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMSwgcDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicDIiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KDB4MTIzNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigweEFCQzApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFCQzAiKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgd2NoYXJfdCBwb2ludGVycyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgV2lkZUNoYXJQb2ludGVyKSB7Ci0gIHdjaGFyX3QqIGNvbnN0IHAwID0gTlVMTDsKLSAgLy8gT25seSB3YXkgdG8gZ2V0IHRoZSBOb2tpYSBjb21waWxlciB0byBjb21waWxlIHRoZSBjYXN0Ci0gIC8vIGlzIHRvIGhhdmUgYSBzZXBhcmF0ZSB2b2lkKiB2YXJpYWJsZSBmaXJzdC4gUHV0dGluZwotICAvLyB0aGUgdHdvIGNhc3RzIG9uIHRoZSBzYW1lIGxpbmUgZG9lc24ndCB3b3JrLCBuZWl0aGVyIGRvZXMKLSAgLy8gYSBkaXJlY3QgQy1zdHlsZSB0byBjaGFyKi4KLSAgdm9pZCogcHYxID0gKHZvaWQqKTB4MTIzNDsgIC8vIE5PTElOVAotICB2b2lkKiBwdjIgPSAodm9pZCopMHhBQkMwOyAgLy8gTk9MSU5UCi0gIHdjaGFyX3QqIGNvbnN0IHAxID0gcmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4ocHYxKTsKLSAgd2NoYXJfdCogY29uc3QgcDIgPSByZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihwdjIpOwotICBFWFBFQ1RfRVEocDAsIHAwKTsKLQotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDAsIHAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBwMiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDEsIHAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInAyIik7Ci0gIHZvaWQqIHB2MyA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKLSAgdm9pZCogcHY0ID0gKHZvaWQqKTB4QUJDMDsgIC8vIE5PTElOVAotICBjb25zdCB3Y2hhcl90KiBwMyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHB2Myk7Ci0gIGNvbnN0IHdjaGFyX3QqIHA0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4ocHY0KTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAzLCBwNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwNCIpOwotfQotCi0vLyBUZXN0cyB1c2luZyBvdGhlciB0eXBlcyBvZiBwb2ludGVycyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCi1URVNUKEVxQXNzZXJ0aW9uVGVzdCwgT3RoZXJQb2ludGVyKSB7Ci0gIEFTU0VSVF9FUShzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihOVUxMKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGludCo+KE5VTEwpKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0YXRpY19jYXN0PGNvbnN0IGludCo+KE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQqPigweDEyMzQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIjB4MTIzNCIpOwotfQotCi0vLyBBIGNsYXNzIHRoYXQgc3VwcG9ydHMgYmluYXJ5IGNvbXBhcmlzb24gb3BlcmF0b3JzIGJ1dCBub3Qgc3RyZWFtaW5nLgotY2xhc3MgVW5wcmludGFibGVDaGFyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVucHJpbnRhYmxlQ2hhcihjaGFyIGNoKSA6IGNoYXJfKGNoKSB7fQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgewotICAgIHJldHVybiBjaGFyXyA9PSByaHMuY2hhcl87Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJfICE9IHJocy5jaGFyXzsKLSAgfQotICBib29sIG9wZXJhdG9yPChjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgewotICAgIHJldHVybiBjaGFyXyA8IHJocy5jaGFyXzsKLSAgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gY2hhcl8gPD0gcmhzLmNoYXJfOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJfID4gcmhzLmNoYXJfOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgewotICAgIHJldHVybiBjaGFyXyA+PSByaHMuY2hhcl87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNoYXIgY2hhcl87Ci19OwotCi0vLyBUZXN0cyB0aGF0IEFTU0VSVF9FUSgpIGFuZCBmcmllbmRzIGRvbid0IHJlcXVpcmUgdGhlIGFyZ3VtZW50cyB0bwotLy8gYmUgcHJpbnRhYmxlLgotVEVTVChDb21wYXJpc29uQXNzZXJ0aW9uVGVzdCwgQWNjZXB0c1VucHJpbnRhYmxlQXJncykgewotICBjb25zdCBVbnByaW50YWJsZUNoYXIgeCgneCcpLCB5KCd5Jyk7Ci0gIEFTU0VSVF9FUSh4LCB4KTsKLSAgRVhQRUNUX05FKHgsIHkpOwotICBBU1NFUlRfTFQoeCwgeSk7Ci0gIEVYUEVDVF9MRSh4LCB5KTsKLSAgQVNTRVJUX0dUKHksIHgpOwotICBFWFBFQ1RfR0UoeCwgeCk7Ci0KLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHgsIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTFQoeSwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKHgsIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc5PiIpOwotCi0gIC8vIENvZGUgdGVzdGVkIGJ5IEVYUEVDVF9GQVRBTF9GQUlMVVJFIGNhbm5vdCByZWZlcmVuY2UgbG9jYWwKLSAgLy8gdmFyaWFibGVzLCBzbyB3ZSBoYXZlIHRvIHdyaXRlIFVucHJpbnRhYmxlQ2hhcigneCcpIGluc3RlYWQgb2YgeC4KLSNpZm5kZWYgX19CT1JMQU5EQ19fCi0gIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCi0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ORShVbnByaW50YWJsZUNoYXIoJ3gnKSwgVW5wcmludGFibGVDaGFyKCd4JykpLAotICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MRShVbnByaW50YWJsZUNoYXIoJ3knKSwgVW5wcmludGFibGVDaGFyKCd4JykpLAotICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7Ci0jZW5kaWYKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xFKFVucHJpbnRhYmxlQ2hhcigneScpLCBVbnByaW50YWJsZUNoYXIoJ3gnKSksCi0gICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKFVucHJpbnRhYmxlQ2hhcigneCcpLCBVbnByaW50YWJsZUNoYXIoJ3knKSksCi0gICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OD4iKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0dFKFVucHJpbnRhYmxlQ2hhcigneCcpLCBVbnByaW50YWJsZUNoYXIoJ3knKSksCi0gICAgICAgICAgICAgICAgICAgICAgICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKLX0KLQotLy8gVGVzdHMgdGhlIEZSSUVORF9URVNUIG1hY3JvLgotCi0vLyBUaGlzIGNsYXNzIGhhcyBhIHByaXZhdGUgbWVtYmVyIHdlIHdhbnQgdG8gdGVzdC4gIFdlIHdpbGwgdGVzdCBpdAotLy8gYm90aCBpbiBhIFRFU1QgYW5kIGluIGEgVEVTVF9GLgotY2xhc3MgRm9vIHsKLSBwdWJsaWM6Ci0gIEZvbygpIHt9Ci0KLSBwcml2YXRlOgotICBpbnQgQmFyKCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gIC8vIERlY2xhcmVzIHRoZSBmcmllbmQgdGVzdHMgdGhhdCBjYW4gYWNjZXNzIHRoZSBwcml2YXRlIG1lbWJlcgotICAvLyBCYXIoKS4KLSAgRlJJRU5EX1RFU1QoRlJJRU5EX1RFU1RfVGVzdCwgVEVTVCk7Ci0gIEZSSUVORF9URVNUKEZSSUVORF9URVNUX1Rlc3QyLCBURVNUX0YpOwotfTsKLQotLy8gVGVzdHMgdGhhdCB0aGUgRlJJRU5EX1RFU1QgZGVjbGFyYXRpb24gYWxsb3dzIGEgVEVTVCB0byBhY2Nlc3MgYQotLy8gY2xhc3MncyBwcml2YXRlIG1lbWJlcnMuICBUaGlzIHNob3VsZCBjb21waWxlLgotVEVTVChGUklFTkRfVEVTVF9UZXN0LCBURVNUKSB7Ci0gIEFTU0VSVF9FUSgxLCBGb28oKS5CYXIoKSk7Ci19Ci0KLS8vIFRoZSBmaXh0dXJlIG5lZWRlZCB0byB0ZXN0IHVzaW5nIEZSSUVORF9URVNUIHdpdGggVEVTVF9GLgotY2xhc3MgRlJJRU5EX1RFU1RfVGVzdDIgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICBGb28gZm9vOwotfTsKLQotLy8gVGVzdHMgdGhhdCB0aGUgRlJJRU5EX1RFU1QgZGVjbGFyYXRpb24gYWxsb3dzIGEgVEVTVF9GIHRvIGFjY2VzcyBhCi0vLyBjbGFzcydzIHByaXZhdGUgbWVtYmVycy4gIFRoaXMgc2hvdWxkIGNvbXBpbGUuCi1URVNUX0YoRlJJRU5EX1RFU1RfVGVzdDIsIFRFU1RfRikgewotICBBU1NFUlRfRVEoMSwgZm9vLkJhcigpKTsKLX0KLQotLy8gVGVzdHMgdGhlIGxpZmUgY3ljbGUgb2YgVGVzdCBvYmplY3RzLgotCi0vLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIHRoZSBsaWZlIGN5Y2xlIG9mIFRlc3Qgb2JqZWN0cy4KLS8vCi0vLyBUaGlzIGNsYXNzIGNvdW50cyB0aGUgbnVtYmVyIG9mIGxpdmUgdGVzdCBvYmplY3RzIHRoYXQgdXNlcyB0aGlzCi0vLyBmaXh0dXJlLgotY2xhc3MgVGVzdExpZmVDeWNsZVRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICAvLyBDb25zdHJ1Y3Rvci4gIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzCi0gIC8vIHRoaXMgZml4dHVyZS4KLSAgVGVzdExpZmVDeWNsZVRlc3QoKSB7IGNvdW50XysrOyB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4gIERlY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzIHRoaXMKLSAgLy8gZml4dHVyZS4KLSAgflRlc3RMaWZlQ3ljbGVUZXN0KCkgeyBjb3VudF8tLTsgfQotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBsaXZlIHRlc3Qgb2JqZWN0cyB0aGF0IHVzZXMgdGhpcyBmaXh0dXJlLgotICBpbnQgY291bnQoKSBjb25zdCB7IHJldHVybiBjb3VudF87IH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBpbnQgY291bnRfOwotfTsKLQotaW50IFRlc3RMaWZlQ3ljbGVUZXN0Ojpjb3VudF8gPSAwOwotCi0vLyBUZXN0cyB0aGUgbGlmZSBjeWNsZSBvZiB0ZXN0IG9iamVjdHMuCi1URVNUX0YoVGVzdExpZmVDeWNsZVRlc3QsIFRlc3QxKSB7Ci0gIC8vIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSB0ZXN0IG9iamVjdCBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0J3MKLSAgLy8gY3VycmVudGx5IGFsaXZlLgotICBBU1NFUlRfRVEoMSwgY291bnQoKSk7Ci19Ci0KLS8vIFRlc3RzIHRoZSBsaWZlIGN5Y2xlIG9mIHRlc3Qgb2JqZWN0cy4KLVRFU1RfRihUZXN0TGlmZUN5Y2xlVGVzdCwgVGVzdDIpIHsKLSAgLy8gQWZ0ZXIgVGVzdDEgaXMgZG9uZSBhbmQgVGVzdDIgaXMgc3RhcnRlZCwgdGhlcmUgc2hvdWxkIHN0aWxsIGJlCi0gIC8vIG9ubHkgb25lIGxpdmUgdGVzdCBvYmplY3QsIGFzIHRoZSBvYmplY3QgZm9yIFRlc3QxIHNob3VsZCd2ZSBiZWVuCi0gIC8vIGRlbGV0ZWQuCi0gIEFTU0VSVF9FUSgxLCBjb3VudCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIFRlc3RzIHRoYXQgdGhlIGNvcHkgY29uc3RydWN0b3Igd29ya3Mgd2hlbiBpdCBpcyBOT1Qgb3B0aW1pemVkIGF3YXkgYnkKLS8vIHRoZSBjb21waWxlci4KLVRFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgQ29weUNvbnN0cnVjdG9yV29ya3NXaGVuTm90T3B0aW1pZWQpIHsKLSAgLy8gQ2hlY2tzIHRoYXQgdGhlIGNvcHkgY29uc3RydWN0b3IgZG9lc24ndCB0cnkgdG8gZGVyZWZlcmVuY2UgTlVMTCBwb2ludGVycwotICAvLyBpbiB0aGUgc291cmNlIG9iamVjdC4KLSAgQXNzZXJ0aW9uUmVzdWx0IHIxID0gQXNzZXJ0aW9uU3VjY2VzcygpOwotICBBc3NlcnRpb25SZXN1bHQgcjIgPSByMTsKLSAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGFkZGVkIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gb3B0aW1pemluZwotICAvLyBhd2F5IHRoZSBjb25zdHJ1Y3RvciBjYWxsLgotICByMSA8PCAiYWJjIjsKLQotICBBc3NlcnRpb25SZXN1bHQgcjMgPSByMTsKLSAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGJvb2w+KHIzKSwgc3RhdGljX2Nhc3Q8Ym9vbD4ocjEpKTsKLSAgRVhQRUNUX1NUUkVRKCJhYmMiLCByMS5tZXNzYWdlKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEFzc2VydGlvblN1Y2Nlc3MgYW5kIEFzc2VydGlvbkZhaWx1cmUgY29uc3RydWN0Ci0vLyBBc3NlcnRpb25SZXN1bHQgb2JqZWN0cyBhcyBleHBlY3RlZC4KLVRFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgQ29uc3RydWN0aW9uV29ya3MpIHsKLSAgQXNzZXJ0aW9uUmVzdWx0IHIxID0gQXNzZXJ0aW9uU3VjY2VzcygpOwotICBFWFBFQ1RfVFJVRShyMSk7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgcjEubWVzc2FnZSgpKTsKLQotICBBc3NlcnRpb25SZXN1bHQgcjIgPSBBc3NlcnRpb25TdWNjZXNzKCkgPDwgImFiYyI7Ci0gIEVYUEVDVF9UUlVFKHIyKTsKLSAgRVhQRUNUX1NUUkVRKCJhYmMiLCByMi5tZXNzYWdlKCkpOwotCi0gIEFzc2VydGlvblJlc3VsdCByMyA9IEFzc2VydGlvbkZhaWx1cmUoKTsKLSAgRVhQRUNUX0ZBTFNFKHIzKTsKLSAgRVhQRUNUX1NUUkVRKCIiLCByMy5tZXNzYWdlKCkpOwotCi0gIEFzc2VydGlvblJlc3VsdCByNCA9IEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiZGVmIjsKLSAgRVhQRUNUX0ZBTFNFKHI0KTsKLSAgRVhQRUNUX1NUUkVRKCJkZWYiLCByNC5tZXNzYWdlKCkpOwotCi0gIEFzc2VydGlvblJlc3VsdCByNSA9IEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJnaGkiKTsKLSAgRVhQRUNUX0ZBTFNFKHI1KTsKLSAgRVhQRUNUX1NUUkVRKCJnaGkiLCByNS5tZXNzYWdlKCkpOwotfQotCi0vLyBUZXN0cyB0aGF0IHRoZSBuZWdhdGlvbiBmbGlwcyB0aGUgcHJlZGljYXRlIHJlc3VsdCBidXQga2VlcHMgdGhlIG1lc3NhZ2UuCi1URVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIE5lZ2F0aW9uV29ya3MpIHsKLSAgQXNzZXJ0aW9uUmVzdWx0IHIxID0gQXNzZXJ0aW9uU3VjY2VzcygpIDw8ICJhYmMiOwotICBFWFBFQ1RfRkFMU0UoIXIxKTsKLSAgRVhQRUNUX1NUUkVRKCJhYmMiLCAoIXIxKS5tZXNzYWdlKCkpOwotCi0gIEFzc2VydGlvblJlc3VsdCByMiA9IEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiZGVmIjsKLSAgRVhQRUNUX1RSVUUoIXIyKTsKLSAgRVhQRUNUX1NUUkVRKCJkZWYiLCAoIXIyKS5tZXNzYWdlKCkpOwotfQotCi1URVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIFN0cmVhbWluZ1dvcmtzKSB7Ci0gIEFzc2VydGlvblJlc3VsdCByID0gQXNzZXJ0aW9uU3VjY2VzcygpOwotICByIDw8ICJhYmMiIDw8ICdkJyA8PCAwIDw8IHRydWU7Ci0gIEVYUEVDVF9TVFJFUSgiYWJjZDB0cnVlIiwgci5tZXNzYWdlKCkpOwotfQotCi1URVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENhblN0cmVhbU9zdHJlYW1NYW5pcHVsYXRvcnMpIHsKLSAgQXNzZXJ0aW9uUmVzdWx0IHIgPSBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIHIgPDwgIkRhdGEiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmZsdXNoIDw8IHN0ZDo6ZW5kcyA8PCAiV2lsbCBiZSB2aXNpYmxlIjsKLSAgRVhQRUNUX1NUUkVRKCJEYXRhXG5cXDBXaWxsIGJlIHZpc2libGUiLCByLm1lc3NhZ2UoKSk7Ci19Ci0KLS8vIFRoZSBuZXh0IHRlc3QgdXNlcyBleHBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9ycyAtLSBhIEMrKzExIGZlYXR1cmUuCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotCi1URVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENvbnN0cnVjdGlibGVGcm9tQ29udGV4dHVhbGx5Q29udmVydGlibGVUb0Jvb2wpIHsKLSAgc3RydWN0IEV4cGxpY2l0bHlDb252ZXJ0aWJsZVRvQm9vbCB7Ci0gICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9Ci0gICAgYm9vbCB2YWx1ZTsKLSAgfTsKLSAgRXhwbGljaXRseUNvbnZlcnRpYmxlVG9Cb29sIHYxID0ge2ZhbHNlfTsKLSAgRXhwbGljaXRseUNvbnZlcnRpYmxlVG9Cb29sIHYyID0ge3RydWV9OwotICBFWFBFQ1RfRkFMU0UodjEpOwotICBFWFBFQ1RfVFJVRSh2Mik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi1zdHJ1Y3QgQ29udmVydGlibGVUb0Fzc2VydGlvblJlc3VsdCB7Ci0gIG9wZXJhdG9yIEFzc2VydGlvblJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIEFzc2VydGlvblJlc3VsdCh0cnVlKTsgfQotfTsKLQotVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBDb25zdHJ1Y3RpYmxlRnJvbUltcGxpY2l0bHlDb252ZXJ0aWJsZSkgewotICBDb252ZXJ0aWJsZVRvQXNzZXJ0aW9uUmVzdWx0IG9iajsKLSAgRVhQRUNUX1RSVUUob2JqKTsKLX0KLQotLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gYW5kIG9wZXJhdG9yIDw8IGFyZQotLy8gYm90aCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLWNsYXNzIEJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQmFzZShpbnQgYW5feCkgOiB4Xyhhbl94KSB7fQotICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9Ci0gcHJpdmF0ZToKLSAgaW50IHhfOwotfTsKLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2UmIHZhbCkgewotICByZXR1cm4gb3MgPDwgdmFsLngoKTsKLX0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2UqIHBvaW50ZXIpIHsKLSAgcmV0dXJuIG9zIDw8ICIoIiA8PCBwb2ludGVyLT54KCkgPDwgIikiOwotfQotCi1URVNUKE1lc3NhZ2VUZXN0LCBDYW5TdHJlYW1Vc2VyVHlwZUluR2xvYmFsTmFtZVNwYWNlKSB7Ci0gIE1lc3NhZ2UgbXNnOwotICBCYXNlIGEoMSk7Ci0KLSAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIDo6b3BlcmF0b3I8PC4KLSAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyBzdHJlYW1pbmcgYSB1c2VyIHR5cGUgd2hvc2UgZGVmaW5pdGlvbiBhbmQgb3BlcmF0b3I8PCBhcmUKLS8vIGJvdGggaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2UuCi1uYW1lc3BhY2UgewotY2xhc3MgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlIDogcHVibGljIEJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlKGludCBhbl94KTogQmFzZShhbl94KSB7fQotfTsKLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSYgdmFsKSB7Ci0gIHJldHVybiBvcyA8PCB2YWwueCgpOwotfQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlKiBwb2ludGVyKSB7Ci0gIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKE1lc3NhZ2VUZXN0LCBDYW5TdHJlYW1Vc2VyVHlwZUluVW5uYW1lZE5hbWVTcGFjZSkgewotICBNZXNzYWdlIG1zZzsKLSAgTXlUeXBlSW5Vbm5hbWVkTmFtZVNwYWNlIGEoMSk7Ci0KLSAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIDx1bm5hbWVkX25hbWVzcGFjZT46Om9wZXJhdG9yPDwuCi0gIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gYW5kIG9wZXJhdG9yPDwgYXJlCi0vLyBib3RoIGluIGEgdXNlciBuYW1lc3BhY2UuCi1uYW1lc3BhY2UgbmFtZXNwYWNlMSB7Ci1jbGFzcyBNeVR5cGVJbk5hbWVTcGFjZTEgOiBwdWJsaWMgQmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNeVR5cGVJbk5hbWVTcGFjZTEoaW50IGFuX3gpOiBCYXNlKGFuX3gpIHt9Ci19Owotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5OYW1lU3BhY2UxJiB2YWwpIHsKLSAgcmV0dXJuIG9zIDw8IHZhbC54KCk7Ci19Ci1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNeVR5cGVJbk5hbWVTcGFjZTEqIHBvaW50ZXIpIHsKLSAgcmV0dXJuIG9zIDw8ICIoIiA8PCBwb2ludGVyLT54KCkgPDwgIikiOwotfQotfSAgLy8gbmFtZXNwYWNlIG5hbWVzcGFjZTEKLQotVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJblVzZXJOYW1lU3BhY2UpIHsKLSAgTWVzc2FnZSBtc2c7Ci0gIG5hbWVzcGFjZTE6Ok15VHlwZUluTmFtZVNwYWNlMSBhKDEpOwotCi0gIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyBuYW1lc3BhY2UxOjpvcGVyYXRvcjw8LgotICBFWFBFQ1RfU1RSRVEoIjEoMSkiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLS8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGlzIGluIGEgdXNlciBuYW1lc3BhY2UKLS8vIGJ1dCB3aG9zZSBvcGVyYXRvcjw8IGlzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgotbmFtZXNwYWNlIG5hbWVzcGFjZTIgewotY2xhc3MgTXlUeXBlSW5OYW1lU3BhY2UyIDogcHVibGljIDo6QmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNeVR5cGVJbk5hbWVTcGFjZTIoaW50IGFuX3gpOiBCYXNlKGFuX3gpIHt9Ci19OwotfSAgLy8gbmFtZXNwYWNlIG5hbWVzcGFjZTIKLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZTI6Ok15VHlwZUluTmFtZVNwYWNlMiYgdmFsKSB7Ci0gIHJldHVybiBvcyA8PCB2YWwueCgpOwotfQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlMjo6TXlUeXBlSW5OYW1lU3BhY2UyKiBwb2ludGVyKSB7Ci0gIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJblVzZXJOYW1lU3BhY2VXaXRoU3RyZWFtT3BlcmF0b3JJbkdsb2JhbCkgewotICBNZXNzYWdlIG1zZzsKLSAgbmFtZXNwYWNlMjo6TXlUeXBlSW5OYW1lU3BhY2UyIGEoMSk7Ci0KLSAgbXNnIDw8IGEgPDwgJmE7ICAvLyBVc2VzIDo6b3BlcmF0b3I8PC4KLSAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotfQotCi0vLyBUZXN0cyBzdHJlYW1pbmcgTlVMTCBwb2ludGVycyB0byB0ZXN0aW5nOjpNZXNzYWdlLgotVEVTVChNZXNzYWdlVGVzdCwgTnVsbFBvaW50ZXJzKSB7Ci0gIE1lc3NhZ2UgbXNnOwotICBjaGFyKiBjb25zdCBwMSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGNoYXIqIGNvbnN0IHAyID0gTlVMTDsKLSAgaW50KiBwMyA9IE5VTEw7Ci0gIGRvdWJsZSogcDQgPSBOVUxMOwotICBib29sKiBwNSA9IE5VTEw7Ci0gIE1lc3NhZ2UqIHA2ID0gTlVMTDsKLQotICBtc2cgPDwgcDEgPDwgcDIgPDwgcDMgPDwgcDQgPDwgcDUgPDwgcDY7Ci0gIEFTU0VSVF9TVFJFUSgiKG51bGwpKG51bGwpKG51bGwpKG51bGwpKG51bGwpKG51bGwpIiwKLSAgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgc3RyZWFtaW5nIHdpZGUgc3RyaW5ncyB0byB0ZXN0aW5nOjpNZXNzYWdlLgotVEVTVChNZXNzYWdlVGVzdCwgV2lkZVN0cmluZ3MpIHsKLSAgLy8gU3RyZWFtcyBhIE5VTEwgb2YgdHlwZSBjb25zdCB3Y2hhcl90Ki4KLSAgY29uc3Qgd2NoYXJfdCogY29uc3Rfd3N0ciA9IE5VTEw7Ci0gIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwKLSAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgY29uc3Rfd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgLy8gU3RyZWFtcyBhIE5VTEwgb2YgdHlwZSB3Y2hhcl90Ki4KLSAgd2NoYXJfdCogd3N0ciA9IE5VTEw7Ci0gIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwKLSAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgLy8gU3RyZWFtcyBhIG5vbi1OVUxMIG9mIHR5cGUgY29uc3Qgd2NoYXJfdCouCi0gIGNvbnN0X3dzdHIgPSBMImFiY1x4ODExOSI7Ci0gIEVYUEVDVF9TVFJFUSgiYWJjXHhlOFx4ODRceDk5IiwKLSAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgY29uc3Rfd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgLy8gU3RyZWFtcyBhIG5vbi1OVUxMIG9mIHR5cGUgd2NoYXJfdCouCi0gIHdzdHIgPSBjb25zdF9jYXN0PHdjaGFyX3QqPihjb25zdF93c3RyKTsKLSAgRVhQRUNUX1NUUkVRKCJhYmNceGU4XHg4NFx4OTkiLAotICAgICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCB3c3RyKS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotCi0vLyBUaGlzIGxpbmUgdGVzdHMgdGhhdCB3ZSBjYW4gZGVmaW5lIHRlc3RzIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZS4KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVGVzdHMgdGhlIFRlc3RJbmZvIGNsYXNzLgotCi1jbGFzcyBUZXN0SW5mb1Rlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgVGVzdEluZm8qIEdldFRlc3RJbmZvKGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgewotICAgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBHZXRVbml0VGVzdEltcGwoKS0+Ci0gICAgICAgIEdldFRlc3RDYXNlKCJUZXN0SW5mb1Rlc3QiLCAiIiwgTlVMTCwgTlVMTCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpOyArK2kpIHsKLSAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPkdldFRlc3RJbmZvKGkpOwotICAgICAgaWYgKHN0cmNtcCh0ZXN0X25hbWUsIHRlc3RfaW5mby0+bmFtZSgpKSA9PSAwKQotICAgICAgICByZXR1cm4gdGVzdF9pbmZvOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBUZXN0UmVzdWx0KiBHZXRUZXN0UmVzdWx0KAotICAgICAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIHJldHVybiB0ZXN0X2luZm8tPnJlc3VsdCgpOwotICB9Ci19OwotCi0vLyBUZXN0cyBUZXN0SW5mbzo6dGVzdF9jYXNlX25hbWUoKSBhbmQgVGVzdEluZm86Om5hbWUoKS4KLVRFU1RfRihUZXN0SW5mb1Rlc3QsIE5hbWVzKSB7Ci0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSBHZXRUZXN0SW5mbygiTmFtZXMiKTsKLQotICBBU1NFUlRfU1RSRVEoIlRlc3RJbmZvVGVzdCIsIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSk7Ci0gIEFTU0VSVF9TVFJFUSgiTmFtZXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7Ci19Ci0KLS8vIFRlc3RzIFRlc3RJbmZvOjpyZXN1bHQoKS4KLVRFU1RfRihUZXN0SW5mb1Rlc3QsIHJlc3VsdCkgewotICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gR2V0VGVzdEluZm8oInJlc3VsdCIpOwotCi0gIC8vIEluaXRpYWxseSwgdGhlcmUgaXMgbm8gVGVzdFBhcnRSZXN1bHQgZm9yIHRoaXMgdGVzdC4KLSAgQVNTRVJUX0VRKDAsIEdldFRlc3RSZXN1bHQodGVzdF9pbmZvKS0+dG90YWxfcGFydF9jb3VudCgpKTsKLQotICAvLyBBZnRlciB0aGUgcHJldmlvdXMgYXNzZXJ0aW9uLCB0aGVyZSBpcyBzdGlsbCBub25lLgotICBBU1NFUlRfRVEoMCwgR2V0VGVzdFJlc3VsdCh0ZXN0X2luZm8pLT50b3RhbF9wYXJ0X2NvdW50KCkpOwotfQotCi0jZGVmaW5lIFZFUklGWV9DT0RFX0xPQ0FUSU9OIFwKLSAgY29uc3QgaW50IGV4cGVjdGVkX2xpbmUgPSBfX0xJTkVfXyAtIDE7IFwKLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOyBcCi0gIEFTU0VSVF9UUlVFKHRlc3RfaW5mbyk7IFwKLSAgRVhQRUNUX1NUUkVRKF9fRklMRV9fLCB0ZXN0X2luZm8tPmZpbGUoKSk7IFwKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2xpbmUsIHRlc3RfaW5mby0+bGluZSgpKQotCi1URVNUKENvZGVMb2NhdGlvbkZvclRFU1QsIFZlcmlmeSkgewotICBWRVJJRllfQ09ERV9MT0NBVElPTjsKLX0KLQotY2xhc3MgQ29kZUxvY2F0aW9uRm9yVEVTVEYgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1URVNUX0YoQ29kZUxvY2F0aW9uRm9yVEVTVEYsIFZlcmlmeSkgewotICBWRVJJRllfQ09ERV9MT0NBVElPTjsKLX0KLQotY2xhc3MgQ29kZUxvY2F0aW9uRm9yVEVTVFAgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsKLX07Ci0KLVRFU1RfUChDb2RlTG9jYXRpb25Gb3JURVNUUCwgVmVyaWZ5KSB7Ci0gIFZFUklGWV9DT0RFX0xPQ0FUSU9OOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUCgsIENvZGVMb2NhdGlvbkZvclRFU1RQLCBWYWx1ZXMoMCkpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENvZGVMb2NhdGlvbkZvclRZUEVEVEVTVCA6IHB1YmxpYyBUZXN0IHsKLX07Ci0KLVRZUEVEX1RFU1RfQ0FTRShDb2RlTG9jYXRpb25Gb3JUWVBFRFRFU1QsIGludCk7Ci0KLVRZUEVEX1RFU1QoQ29kZUxvY2F0aW9uRm9yVFlQRURURVNULCBWZXJpZnkpIHsKLSAgVkVSSUZZX0NPREVfTE9DQVRJT047Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQ29kZUxvY2F0aW9uRm9yVFlQRURURVNUUCA6IHB1YmxpYyBUZXN0IHsKLX07Ci0KLVRZUEVEX1RFU1RfQ0FTRV9QKENvZGVMb2NhdGlvbkZvclRZUEVEVEVTVFApOwotCi1UWVBFRF9URVNUX1AoQ29kZUxvY2F0aW9uRm9yVFlQRURURVNUUCwgVmVyaWZ5KSB7Ci0gIFZFUklGWV9DT0RFX0xPQ0FUSU9OOwotfQotCi1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChDb2RlTG9jYXRpb25Gb3JUWVBFRFRFU1RQLCBWZXJpZnkpOwotCi1JTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgQ29kZUxvY2F0aW9uRm9yVFlQRURURVNUUCwgaW50KTsKLQotI3VuZGVmIFZFUklGWV9DT0RFX0xPQ0FUSU9OCi0KLS8vIFRlc3RzIHNldHRpbmcgdXAgYW5kIHRlYXJpbmcgZG93biBhIHRlc3QgY2FzZS4KLQotY2xhc3MgU2V0VXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlCi0gIC8vIGlzIHJ1bi4KLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBwcmludGYoIlNldHRpbmcgdXAgdGhlIHRlc3QgY2FzZSAuIC4gLlxuIik7Ci0KLSAgICAvLyBJbml0aWFsaXplcyBzb21lIHNoYXJlZCByZXNvdXJjZS4gIEluIHRoaXMgc2ltcGxlIGV4YW1wbGUsIHdlCi0gICAgLy8ganVzdCBjcmVhdGUgYSBDIHN0cmluZy4gIE1vcmUgY29tcGxleCBzdHVmZiBjYW4gYmUgZG9uZSBpZgotICAgIC8vIGRlc2lyZWQuCi0gICAgc2hhcmVkX3Jlc291cmNlXyA9ICIxMjMiOwotCi0gICAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwLgotICAgIGNvdW50ZXJfKys7Ci0KLSAgICAvLyBTZXRVcFRlc3RDYXNlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gICAgRVhQRUNUX0VRKDEsIGNvdW50ZXJfKTsKLSAgfQotCi0gIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBhZnRlciB0aGUgbGFzdCB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIGlzCi0gIC8vIHJ1bi4KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBwcmludGYoIlRlYXJpbmcgZG93biB0aGUgdGVzdCBjYXNlIC4gLiAuXG4iKTsKLQotICAgIC8vIERlY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cC4KLSAgICBjb3VudGVyXy0tOwotCi0gICAgLy8gVGVhckRvd25UZXN0Q2FzZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLgotICAgIEVYUEVDVF9FUSgwLCBjb3VudGVyXyk7Ci0KLSAgICAvLyBDbGVhbnMgdXAgdGhlIHNoYXJlZCByZXNvdXJjZS4KLSAgICBzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKLSAgfQotCi0gIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCBpbiB0aGlzIHRlc3QgY2FzZS4KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIC8vIFNldFVwVGVzdENhc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSwgc28gY291bnRlcl8gc2hvdWxkCi0gICAgLy8gYWx3YXlzIGJlIDEuCi0gICAgRVhQRUNUX0VRKDEsIGNvdW50ZXJfKTsKLSAgfQotCi0gIC8vIE51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cC4KLSAgc3RhdGljIGludCBjb3VudGVyXzsKLQotICAvLyBTb21lIHJlc291cmNlIHRvIGJlIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBzaGFyZWRfcmVzb3VyY2VfOwotfTsKLQotaW50IFNldFVwVGVzdENhc2VUZXN0Ojpjb3VudGVyXyA9IDA7Ci1jb25zdCBjaGFyKiBTZXRVcFRlc3RDYXNlVGVzdDo6c2hhcmVkX3Jlc291cmNlXyA9IE5VTEw7Ci0KLS8vIEEgdGVzdCB0aGF0IHVzZXMgdGhlIHNoYXJlZCByZXNvdXJjZS4KLVRFU1RfRihTZXRVcFRlc3RDYXNlVGVzdCwgVGVzdDEpIHsKLSAgRVhQRUNUX1NUUk5FKE5VTEwsIHNoYXJlZF9yZXNvdXJjZV8pOwotfQotCi0vLyBBbm90aGVyIHRlc3QgdGhhdCB1c2VzIHRoZSBzaGFyZWQgcmVzb3VyY2UuCi1URVNUX0YoU2V0VXBUZXN0Q2FzZVRlc3QsIFRlc3QyKSB7Ci0gIEVYUEVDVF9TVFJFUSgiMTIzIiwgc2hhcmVkX3Jlc291cmNlXyk7Ci19Ci0KLS8vIFRoZSBJbml0R29vZ2xlVGVzdFRlc3QgdGVzdCBjYXNlIHRlc3RzIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCkuCi0KLS8vIFRoZSBGbGFncyBzdHJ1Y3Qgc3RvcmVzIGEgY29weSBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCi1zdHJ1Y3QgRmxhZ3MgewotICAvLyBDb25zdHJ1Y3RzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIGVhY2ggZmxhZyBoYXMgaXRzIGRlZmF1bHQgdmFsdWUuCi0gIEZsYWdzKCkgOiBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyhmYWxzZSksCi0gICAgICAgICAgICBicmVha19vbl9mYWlsdXJlKGZhbHNlKSwKLSAgICAgICAgICAgIGNhdGNoX2V4Y2VwdGlvbnMoZmFsc2UpLAotICAgICAgICAgICAgZGVhdGhfdGVzdF91c2VfZm9yayhmYWxzZSksCi0gICAgICAgICAgICBmaWx0ZXIoIiIpLAotICAgICAgICAgICAgbGlzdF90ZXN0cyhmYWxzZSksCi0gICAgICAgICAgICBvdXRwdXQoIiIpLAotICAgICAgICAgICAgcHJpbnRfdGltZSh0cnVlKSwKLSAgICAgICAgICAgIHJhbmRvbV9zZWVkKDApLAotICAgICAgICAgICAgcmVwZWF0KDEpLAotICAgICAgICAgICAgc2h1ZmZsZShmYWxzZSksCi0gICAgICAgICAgICBzdGFja190cmFjZV9kZXB0aChrTWF4U3RhY2tUcmFjZURlcHRoKSwKLSAgICAgICAgICAgIHN0cmVhbV9yZXN1bHRfdG8oIiIpLAotICAgICAgICAgICAgdGhyb3dfb25fZmFpbHVyZShmYWxzZSkge30KLQotICAvLyBGYWN0b3J5IG1ldGhvZHMuCi0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyBoYXMKLSAgLy8gdGhlIGdpdmVuIHZhbHVlLgotICBzdGF0aWMgRmxhZ3MgQWxzb1J1bkRpc2FibGVkVGVzdHMoYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgewotICAgIEZsYWdzIGZsYWdzOwotICAgIGZsYWdzLmFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIGhhcwotICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCi0gIHN0YXRpYyBGbGFncyBCcmVha09uRmFpbHVyZShib29sIGJyZWFrX29uX2ZhaWx1cmUpIHsKLSAgICBGbGFncyBmbGFnczsKLSAgICBmbGFncy5icmVha19vbl9mYWlsdXJlID0gYnJlYWtfb25fZmFpbHVyZTsKLSAgICByZXR1cm4gZmxhZ3M7Ci0gIH0KLQotICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb25zIGZsYWcgaGFzCi0gIC8vIHRoZSBnaXZlbiB2YWx1ZS4KLSAgc3RhdGljIEZsYWdzIENhdGNoRXhjZXB0aW9ucyhib29sIGNhdGNoX2V4Y2VwdGlvbnMpIHsKLSAgICBGbGFncyBmbGFnczsKLSAgICBmbGFncy5jYXRjaF9leGNlcHRpb25zID0gY2F0Y2hfZXhjZXB0aW9uczsKLSAgICByZXR1cm4gZmxhZ3M7Ci0gIH0KLQotICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBndGVzdF9kZWF0aF90ZXN0X3VzZV9mb3JrIGZsYWcgaGFzCi0gIC8vIHRoZSBnaXZlbiB2YWx1ZS4KLSAgc3RhdGljIEZsYWdzIERlYXRoVGVzdFVzZUZvcmsoYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrKSB7Ci0gICAgRmxhZ3MgZmxhZ3M7Ci0gICAgZmxhZ3MuZGVhdGhfdGVzdF91c2VfZm9yayA9IGRlYXRoX3Rlc3RfdXNlX2Zvcms7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfZmlsdGVyIGZsYWcgaGFzIHRoZSBnaXZlbgotICAvLyB2YWx1ZS4KLSAgc3RhdGljIEZsYWdzIEZpbHRlcihjb25zdCBjaGFyKiBmaWx0ZXIpIHsKLSAgICBGbGFncyBmbGFnczsKLSAgICBmbGFncy5maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIGhhcyB0aGUKLSAgLy8gZ2l2ZW4gdmFsdWUuCi0gIHN0YXRpYyBGbGFncyBMaXN0VGVzdHMoYm9vbCBsaXN0X3Rlc3RzKSB7Ci0gICAgRmxhZ3MgZmxhZ3M7Ci0gICAgZmxhZ3MubGlzdF90ZXN0cyA9IGxpc3RfdGVzdHM7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcgaGFzIHRoZSBnaXZlbgotICAvLyB2YWx1ZS4KLSAgc3RhdGljIEZsYWdzIE91dHB1dChjb25zdCBjaGFyKiBvdXRwdXQpIHsKLSAgICBGbGFncyBmbGFnczsKLSAgICBmbGFncy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfcHJpbnRfdGltZSBmbGFnIGhhcyB0aGUgZ2l2ZW4KLSAgLy8gdmFsdWUuCi0gIHN0YXRpYyBGbGFncyBQcmludFRpbWUoYm9vbCBwcmludF90aW1lKSB7Ci0gICAgRmxhZ3MgZmxhZ3M7Ci0gICAgZmxhZ3MucHJpbnRfdGltZSA9IHByaW50X3RpbWU7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfcmFuZG9tX3NlZWQgZmxhZyBoYXMKLSAgLy8gdGhlIGdpdmVuIHZhbHVlLgotICBzdGF0aWMgRmxhZ3MgUmFuZG9tU2VlZChJbnQzMiByYW5kb21fc2VlZCkgewotICAgIEZsYWdzIGZsYWdzOwotICAgIGZsYWdzLnJhbmRvbV9zZWVkID0gcmFuZG9tX3NlZWQ7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfcmVwZWF0IGZsYWcgaGFzIHRoZSBnaXZlbgotICAvLyB2YWx1ZS4KLSAgc3RhdGljIEZsYWdzIFJlcGVhdChJbnQzMiByZXBlYXQpIHsKLSAgICBGbGFncyBmbGFnczsKLSAgICBmbGFncy5yZXBlYXQgPSByZXBlYXQ7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3Rfc2h1ZmZsZSBmbGFnIGhhcwotICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCi0gIHN0YXRpYyBGbGFncyBTaHVmZmxlKGJvb2wgc2h1ZmZsZSkgewotICAgIEZsYWdzIGZsYWdzOwotICAgIGZsYWdzLnNodWZmbGUgPSBzaHVmZmxlOwotICAgIHJldHVybiBmbGFnczsKLSAgfQotCi0gIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpIGZsYWcgaGFzCi0gIC8vIHRoZSBnaXZlbiB2YWx1ZS4KLSAgc3RhdGljIEZsYWdzIFN0YWNrVHJhY2VEZXB0aChJbnQzMiBzdGFja190cmFjZV9kZXB0aCkgewotICAgIEZsYWdzIGZsYWdzOwotICAgIGZsYWdzLnN0YWNrX3RyYWNlX2RlcHRoID0gc3RhY2tfdHJhY2VfZGVwdGg7Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSBmbGFnIGhhcwotICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCi0gIHN0YXRpYyBGbGFncyBTdHJlYW1SZXN1bHRUbyhjb25zdCBjaGFyKiBzdHJlYW1fcmVzdWx0X3RvKSB7Ci0gICAgRmxhZ3MgZmxhZ3M7Ci0gICAgZmxhZ3Muc3RyZWFtX3Jlc3VsdF90byA9IHN0cmVhbV9yZXN1bHRfdG87Ci0gICAgcmV0dXJuIGZsYWdzOwotICB9Ci0KLSAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnIGhhcwotICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCi0gIHN0YXRpYyBGbGFncyBUaHJvd09uRmFpbHVyZShib29sIHRocm93X29uX2ZhaWx1cmUpIHsKLSAgICBGbGFncyBmbGFnczsKLSAgICBmbGFncy50aHJvd19vbl9mYWlsdXJlID0gdGhyb3dfb25fZmFpbHVyZTsKLSAgICByZXR1cm4gZmxhZ3M7Ci0gIH0KLQotICAvLyBUaGVzZSBmaWVsZHMgc3RvcmUgdGhlIGZsYWcgdmFsdWVzLgotICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzOwotICBib29sIGJyZWFrX29uX2ZhaWx1cmU7Ci0gIGJvb2wgY2F0Y2hfZXhjZXB0aW9uczsKLSAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrOwotICBjb25zdCBjaGFyKiBmaWx0ZXI7Ci0gIGJvb2wgbGlzdF90ZXN0czsKLSAgY29uc3QgY2hhciogb3V0cHV0OwotICBib29sIHByaW50X3RpbWU7Ci0gIEludDMyIHJhbmRvbV9zZWVkOwotICBJbnQzMiByZXBlYXQ7Ci0gIGJvb2wgc2h1ZmZsZTsKLSAgSW50MzIgc3RhY2tfdHJhY2VfZGVwdGg7Ci0gIGNvbnN0IGNoYXIqIHN0cmVhbV9yZXN1bHRfdG87Ci0gIGJvb2wgdGhyb3dfb25fZmFpbHVyZTsKLX07Ci0KLS8vIEZpeHR1cmUgZm9yIHRlc3RpbmcgSW5pdEdvb2dsZVRlc3QoKS4KLWNsYXNzIEluaXRHb29nbGVUZXN0VGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIENsZWFycyB0aGUgZmxhZ3MgYmVmb3JlIGVhY2ggdGVzdC4KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gZmFsc2U7Ci0gICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IGZhbHNlOwotICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBmYWxzZTsKLSAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZmFsc2U7Ci0gICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gIiI7Ci0gICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IGZhbHNlOwotICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICIiOwotICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSB0cnVlOwotICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gMDsKLSAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSAxOwotICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBmYWxzZTsKLSAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IGtNYXhTdGFja1RyYWNlRGVwdGg7Ci0gICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9ICIiOwotICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSBmYWxzZTsKLSAgfQotCi0gIC8vIEFzc2VydHMgdGhhdCB0d28gbmFycm93IG9yIHdpZGUgc3RyaW5nIGFycmF5cyBhcmUgZXF1YWwuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgc3RhdGljIHZvaWQgQXNzZXJ0U3RyaW5nQXJyYXlFcShzaXplX3Qgc2l6ZTEsIENoYXJUeXBlKiogYXJyYXkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplMiwgQ2hhclR5cGUqKiBhcnJheTIpIHsKLSAgICBBU1NFUlRfRVEoc2l6ZTEsIHNpemUyKSA8PCAiIEFycmF5IHNpemVzIGRpZmZlcmVudC4iOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2l6ZTE7IGkrKykgewotICAgICAgQVNTRVJUX1NUUkVRKGFycmF5MVtpXSwgYXJyYXkyW2ldKSA8PCAiIHdoZXJlIGkgPT0gIiA8PCBpOwotICAgIH0KLSAgfQotCi0gIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGZsYWcgdmFsdWVzIG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZXMuCi0gIHN0YXRpYyB2b2lkIENoZWNrRmxhZ3MoY29uc3QgRmxhZ3MmIGV4cGVjdGVkKSB7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLmFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLAotICAgICAgICAgICAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLmJyZWFrX29uX2ZhaWx1cmUsIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC5jYXRjaF9leGNlcHRpb25zLCBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuZGVhdGhfdGVzdF91c2VfZm9yaywgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSk7Ci0gICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmZpbHRlciwgR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC5saXN0X3Rlc3RzLCBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKTsKLSAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQub3V0cHV0LCBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLnByaW50X3RpbWUsIEdURVNUX0ZMQUcocHJpbnRfdGltZSkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC5yYW5kb21fc2VlZCwgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC5yZXBlYXQsIEdURVNUX0ZMQUcocmVwZWF0KSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLnNodWZmbGUsIEdURVNUX0ZMQUcoc2h1ZmZsZSkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC5zdGFja190cmFjZV9kZXB0aCwgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpOwotICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5zdHJlYW1fcmVzdWx0X3RvLAotICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pLmNfc3RyKCkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZC50aHJvd19vbl9mYWlsdXJlLCBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKTsKLSAgfQotCi0gIC8vIFBhcnNlcyBhIGNvbW1hbmQgbGluZSAoc3BlY2lmaWVkIGJ5IGFyZ2MxIGFuZCBhcmd2MSksIHRoZW4KLSAgLy8gdmVyaWZpZXMgdGhhdCB0aGUgZmxhZyB2YWx1ZXMgYXJlIGV4cGVjdGVkIGFuZCB0aGF0IHRoZQotICAvLyByZWNvZ25pemVkIGZsYWdzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotICBzdGF0aWMgdm9pZCBUZXN0UGFyc2luZ0ZsYWdzKGludCBhcmdjMSwgY29uc3QgQ2hhclR5cGUqKiBhcmd2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYzIsIGNvbnN0IENoYXJUeXBlKiogYXJndjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxhZ3MmIGV4cGVjdGVkLCBib29sIHNob3VsZF9wcmludF9oZWxwKSB7Ci0gICAgY29uc3QgYm9vbCBzYXZlZF9oZWxwX2ZsYWcgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpnX2hlbHBfZmxhZzsKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpnX2hlbHBfZmxhZyA9IGZhbHNlOwotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotICAgIENhcHR1cmVTdGRvdXQoKTsKLSNlbmRpZgotCi0gICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgaW50ZXJuYWw6OlBhcnNlR29vZ2xlVGVzdEZsYWdzT25seSgmYXJnYzEsIGNvbnN0X2Nhc3Q8Q2hhclR5cGUqKj4oYXJndjEpKTsKLQotI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBjYXB0dXJlZF9zdGRvdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOwotI2VuZGlmCi0KLSAgICAvLyBWZXJpZmllcyB0aGUgZmxhZyB2YWx1ZXMuCi0gICAgQ2hlY2tGbGFncyhleHBlY3RlZCk7Ci0KLSAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSByZWNvZ25pemVkIGZsYWdzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbW1hbmQKLSAgICAvLyBsaW5lLgotICAgIEFzc2VydFN0cmluZ0FycmF5RXEoYXJnYzEgKyAxLCBhcmd2MSwgYXJnYzIgKyAxLCBhcmd2Mik7Ci0KLSAgICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkgc2hvdWxkIG5laXRoZXIgc2V0IGdfaGVscF9mbGFnIG5vciBwcmludCB0aGUKLSAgICAvLyBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBmbGFncyBpdCByZWNvZ25pemVzLgotICAgIEVYUEVDVF9FUShzaG91bGRfcHJpbnRfaGVscCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWcpOwotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQgPQotICAgICAgICAiVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmciOwotICAgIGlmIChzaG91bGRfcHJpbnRfaGVscCkgewotICAgICAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgZXhwZWN0ZWRfaGVscF9mcmFnbWVudCwgY2FwdHVyZWRfc3Rkb3V0KTsKLSAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX1BSRURfRk9STUFUMihJc05vdFN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaGVscF9mcmFnbWVudCwgY2FwdHVyZWRfc3Rkb3V0KTsKLSAgICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnID0gc2F2ZWRfaGVscF9mbGFnOwotICB9Ci0KLSAgLy8gVGhpcyBtYWNybyB3cmFwcyBUZXN0UGFyc2luZ0ZsYWdzIHMudC4gdGhlIHVzZXIgZG9lc24ndCBuZWVkCi0gIC8vIHRvIHNwZWNpZnkgdGhlIGFycmF5IHNpemVzLgotCi0jZGVmaW5lIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndjEsIGFyZ3YyLCBleHBlY3RlZCwgc2hvdWxkX3ByaW50X2hlbHApIFwKLSAgVGVzdFBhcnNpbmdGbGFncyhzaXplb2YoYXJndjEpL3NpemVvZigqYXJndjEpIC0gMSwgYXJndjEsIFwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoYXJndjIpL3NpemVvZigqYXJndjIpIC0gMSwgYXJndjIsIFwKLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgc2hvdWxkX3ByaW50X2hlbHApCi19OwotCi0vLyBUZXN0cyBwYXJzaW5nIGFuIGVtcHR5IGNvbW1hbmQgbGluZS4KLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEVtcHR5KSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3MoKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIGEgY29tbWFuZCBsaW5lIHRoYXQgaGFzIG5vIGZsYWcuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBOb0ZsYWcpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzKCksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyBhIGJhZCAtLWd0ZXN0X2ZpbHRlciBmbGFnLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyQmFkKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfZmlsdGVyIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfZmlsdGVyIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiIiksIHRydWUpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIGFuIGVtcHR5IC0tZ3Rlc3RfZmlsdGVyIGZsYWcuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBGaWx0ZXJFbXB0eSkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X2ZpbHRlcj0iLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiIiksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyBhIG5vbi1lbXB0eSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyTm9uRW1wdHkpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9maWx0ZXI9YWJjIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoImFiYyIpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVXaXRob3V0VmFsdWUpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKLSAgICBOVUxMCi19OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MC4KLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlRmFsc2VfMCkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MCIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPWYuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBCcmVha09uRmFpbHVyZUZhbHNlX2YpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPWYiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKGZhbHNlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1GLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVGYWxzZV9GKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1GIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCi0vLyBkZWZpbml0aW9uLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVUcnVlKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT0xIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucy4KLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIENhdGNoRXhjZXB0aW9ucykgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkNhdGNoRXhjZXB0aW9ucyh0cnVlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yay4KLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIERlYXRoVGVzdFVzZUZvcmspIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9kZWF0aF90ZXN0X3VzZV9mb3JrIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpEZWF0aFRlc3RVc2VGb3JrKHRydWUpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIGhhdmluZyB0aGUgc2FtZSBmbGFnIHR3aWNlIHdpdGggZGlmZmVyZW50IHZhbHVlcy4gIFRoZQotLy8gZXhwZWN0ZWQgYmVoYXZpb3IgaXMgdGhhdCB0aGUgb25lIGNvbWluZyBsYXN0IHRha2VzIHByZWNlZGVuY2UuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBEdXBsaWNhdGVkRmxhZ3MpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9maWx0ZXI9YSIsCi0gICAgIi0tZ3Rlc3RfZmlsdGVyPWIiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiYiIpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIGhhdmluZyBhbiB1bnJlY29nbml6ZWQgZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVW5yZWNvZ25pemVkRmxhZykgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUiLAotICAgICJiYXIiLCAgLy8gVW5yZWNvZ25pemVkIGJ5IEdvb2dsZSBUZXN0LgotICAgICItLWd0ZXN0X2ZpbHRlcj1iIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgImJhciIsCi0gICAgTlVMTAotICB9OwotCi0gIEZsYWdzIGZsYWdzOwotICBmbGFncy5icmVha19vbl9mYWlsdXJlID0gdHJ1ZTsKLSAgZmxhZ3MuZmlsdGVyID0gImIiOwotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBmbGFncywgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZwotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmxhZykgewotICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAgICJmb28uZXhlIiwKLSAgICAgICItLWd0ZXN0X2xpc3RfdGVzdHMiLAotICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICAgImZvby5leGUiLAotICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKHRydWUpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdpdGggYSAidHJ1ZSIgdmFsdWUKLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIExpc3RUZXN0c1RydWUpIHsKLSAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgICAiZm9vLmV4ZSIsCi0gICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzPTEiLAotICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICAgImZvby5leGUiLAotICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKHRydWUpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdpdGggYSAiZmFsc2UiIHZhbHVlCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZSkgewotICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAgICJmb28uZXhlIiwKLSAgICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9MCIsCi0gICAgICBOVUxMCi0gICAgfTsKLQotICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgICAiZm9vLmV4ZSIsCi0gICAgICBOVUxMCi0gICAgfTsKLQotICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9saXN0X3Rlc3RzPWYuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZV9mKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz1mIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9saXN0X3Rlc3RzPUYuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNGYWxzZV9GKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz1GIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpMaXN0VGVzdHMoZmFsc2UpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQgKGludmFsaWQpLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0RW1wdHkpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9vdXRwdXQiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9vdXRwdXQiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFncygpLCB0cnVlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X291dHB1dD14bWwKLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbCkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X291dHB1dD14bWwiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Ok91dHB1dCgieG1sIiksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X291dHB1dD14bWw6ZmlsZQotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0WG1sRmlsZSkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X291dHB1dD14bWw6ZmlsZSIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6T3V0cHV0KCJ4bWw6ZmlsZSIpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sOmRpcmVjdG9yeS9wYXRoLwotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgT3V0cHV0WG1sRGlyZWN0b3J5KSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDpkaXJlY3RvcnkvcGF0aC8iLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6T3V0cHV0KCJ4bWw6ZGlyZWN0b3J5L3BhdGgvIiksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcKLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZsYWcpIHsKLSAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgICAiZm9vLmV4ZSIsCi0gICAgICAiLS1ndGVzdF9wcmludF90aW1lIiwKLSAgICAgIE5VTEwKLSAgICB9OwotCi0gICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAgICJmb28uZXhlIiwKLSAgICAgIE5VTEwKLSAgICB9OwotCi0gICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZSh0cnVlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X3ByaW50X3RpbWUgZmxhZyB3aXRoIGEgInRydWUiIHZhbHVlCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBQcmludFRpbWVUcnVlKSB7Ci0gICAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICAgImZvby5leGUiLAotICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZT0xIiwKLSAgICAgIE5VTEwKLSAgICB9OwotCi0gICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAgICJmb28uZXhlIiwKLSAgICAgIE5VTEwKLSAgICB9OwotCi0gICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZSh0cnVlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X3ByaW50X3RpbWUgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2UpIHsKLSAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgICAiZm9vLmV4ZSIsCi0gICAgICAiLS1ndGVzdF9wcmludF90aW1lPTAiLAotICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICAgImZvby5leGUiLAotICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcHJpbnRfdGltZT1mLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2VfZikgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3ByaW50X3RpbWU9ZiIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcHJpbnRfdGltZT1GLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lRmFsc2VfRikgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3ByaW50X3RpbWU9RiIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UHJpbnRUaW1lKGZhbHNlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcmFuZG9tX3NlZWQ9bnVtYmVyCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBSYW5kb21TZWVkKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfcmFuZG9tX3NlZWQ9MTAwMCIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6UmFuZG9tU2VlZCgxMDAwKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfcmVwZWF0PW51bWJlcgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUmVwZWF0KSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfcmVwZWF0PTEwMDAiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlJlcGVhdCgxMDAwKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcKLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEFsc29SdW5EaXNhYmxlZFRlc3RzRmxhZykgewotICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAgICJmb28uZXhlIiwKLSAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwKLSAgICAgIE5VTEwKLSAgICB9OwotCi0gICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAgICJmb28uZXhlIiwKLSAgICAgIE5VTEwKLSAgICB9OwotCi0gICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOjpBbHNvUnVuRGlzYWJsZWRUZXN0cyh0cnVlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgd2l0aCBhICJ0cnVlIiB2YWx1ZQotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQWxzb1J1bkRpc2FibGVkVGVzdHNUcnVlKSB7Ci0gICAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICAgImZvby5leGUiLAotICAgICAgIi0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM9MSIsCi0gICAgICBOVUxMCi0gICAgfTsKLQotICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgICAiZm9vLmV4ZSIsCi0gICAgICBOVUxMCi0gICAgfTsKLQotICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHModHJ1ZSksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIHdpdGggYSAiZmFsc2UiIHZhbHVlCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBBbHNvUnVuRGlzYWJsZWRUZXN0c0ZhbHNlKSB7Ci0gICAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICAgImZvby5leGUiLAotICAgICAgIi0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHM9MCIsCi0gICAgICBOVUxMCi0gICAgfTsKLQotICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgICAiZm9vLmV4ZSIsCi0gICAgICBOVUxMCi0gICAgfTsKLQotICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHMoZmFsc2UpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zaHVmZmxlLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZVdpdGhvdXRWYWx1ZSkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3NodWZmbGUiLAotICAgIE5VTEwKLX07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTaHVmZmxlKHRydWUpLCBmYWxzZSk7Ci19Ci0KLS8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zaHVmZmxlPTAuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTaHVmZmxlRmFsc2VfMCkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3NodWZmbGU9MCIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6U2h1ZmZsZShmYWxzZSksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3Rfc2h1ZmZsZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCi0vLyBkZWZpbml0aW9uLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZVRydWUpIHsKLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICAiLS1ndGVzdF9zaHVmZmxlPTEiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlNodWZmbGUodHJ1ZSksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoPW51bWJlci4KLVRFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFN0YWNrVHJhY2VEZXB0aCkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoPTUiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlN0YWNrVHJhY2VEZXB0aCg1KSwgZmFsc2UpOwotfQotCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTdHJlYW1SZXN1bHRUbykgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3N0cmVhbV9yZXN1bHRfdG89bG9jYWxob3N0OjEyMzQiLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXygKLSAgICAgIGFyZ3YsIGFyZ3YyLCBGbGFnczo6U3RyZWFtUmVzdWx0VG8oImxvY2FsaG9zdDoxMjM0IiksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBUaHJvd09uRmFpbHVyZVdpdGhvdXRWYWx1ZSkgewotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7Ci0gICAgImZvby5leGUiLAotICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUiLAotICAgIE5VTEwKLX07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0wLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVGYWxzZV8wKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0wIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFyc2luZyBhIC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZSBmbGFnIHRoYXQgaGFzIGEgInRydWUiCi0vLyBkZWZpbml0aW9uLgotVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVUcnVlKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgIi0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZT0xIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgTlVMTAotICB9OwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpUaHJvd09uRmFpbHVyZSh0cnVlKSwgZmFsc2UpOwotfQotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotLy8gVGVzdHMgcGFyc2luZyB3aWRlIHN0cmluZ3MuCi1URVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBXaWRlU3RyaW5ncykgewotICBjb25zdCB3Y2hhcl90KiBhcmd2W10gPSB7Ci0gICAgTCJmb28uZXhlIiwKLSAgICBMIi0tZ3Rlc3RfZmlsdGVyPUZvbyoiLAotICAgIEwiLS1ndGVzdF9saXN0X3Rlc3RzPTEiLAotICAgIEwiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKLSAgICBMIi0tbm9uX2d0ZXN0X2ZsYWciLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCB3Y2hhcl90KiBhcmd2MltdID0gewotICAgIEwiZm9vLmV4ZSIsCi0gICAgTCItLW5vbl9ndGVzdF9mbGFnIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgRmxhZ3MgZXhwZWN0ZWRfZmxhZ3M7Ci0gIGV4cGVjdGVkX2ZsYWdzLmJyZWFrX29uX2ZhaWx1cmUgPSB0cnVlOwotICBleHBlY3RlZF9mbGFncy5maWx0ZXIgPSAiRm9vKiI7Ci0gIGV4cGVjdGVkX2ZsYWdzLmxpc3RfdGVzdHMgPSB0cnVlOwotCi0gIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIGV4cGVjdGVkX2ZsYWdzLCBmYWxzZSk7Ci19Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi1jbGFzcyBGbGFnZmlsZVRlc3QgOiBwdWJsaWMgSW5pdEdvb2dsZVRlc3RUZXN0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBJbml0R29vZ2xlVGVzdFRlc3Q6OlNldFVwKCk7Ci0KLSAgICB0ZXN0ZGF0YV9wYXRoXy5TZXQoaW50ZXJuYWw6OkZpbGVQYXRoKAotICAgICAgICBpbnRlcm5hbDo6VGVtcERpcigpICsgaW50ZXJuYWw6OkdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpICsKLSAgICAgICAgIl9mbGFnZmlsZV90ZXN0IikpOwotICAgIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6Um1EaXIodGVzdGRhdGFfcGF0aF8uY19zdHIoKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdGRhdGFfcGF0aF8uQ3JlYXRlRm9sZGVyKCkpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6Um1EaXIodGVzdGRhdGFfcGF0aF8uY19zdHIoKSk7Ci0gICAgSW5pdEdvb2dsZVRlc3RUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgaW50ZXJuYWw6OkZpbGVQYXRoIENyZWF0ZUZsYWdmaWxlKGNvbnN0IGNoYXIqIGNvbnRlbnRzKSB7Ci0gICAgaW50ZXJuYWw6OkZpbGVQYXRoIGZpbGVfcGF0aChpbnRlcm5hbDo6RmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoCi0gICAgICAgIHRlc3RkYXRhX3BhdGhfLCBpbnRlcm5hbDo6RmlsZVBhdGgoInVuaXF1ZSIpLCAidHh0IikpOwotICAgIEZJTEUqIGYgPSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkZPcGVuKGZpbGVfcGF0aC5jX3N0cigpLCAidyIpOwotICAgIGZwcmludGYoZiwgIiVzIiwgY29udGVudHMpOwotICAgIGZjbG9zZShmKTsKLSAgICByZXR1cm4gZmlsZV9wYXRoOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnRlcm5hbDo6RmlsZVBhdGggdGVzdGRhdGFfcGF0aF87Ci19OwotCi0vLyBUZXN0cyBhbiBlbXB0eSBmbGFnZmlsZS4KLVRFU1RfRihGbGFnZmlsZVRlc3QsIEVtcHR5KSB7Ci0gIGludGVybmFsOjpGaWxlUGF0aCBmbGFnZmlsZV9wYXRoKENyZWF0ZUZsYWdmaWxlKCIiKSk7Ci0gIHN0ZDo6c3RyaW5nIGZsYWdmaWxlX2ZsYWcgPQotICAgICAgc3RkOjpzdHJpbmcoIi0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZsYWdmaWxlPSIpICsgZmxhZ2ZpbGVfcGF0aC5jX3N0cigpOwotCi0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgZmxhZ2ZpbGVfZmxhZy5jX3N0cigpLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3MoKSwgZmFsc2UpOwotfQotCi0vLyBUZXN0cyBwYXNzaW5nIGEgbm9uLWVtcHR5IC0tZ3Rlc3RfZmlsdGVyIGZsYWcgdmlhIC0tZ3Rlc3RfZmxhZ2ZpbGUuCi1URVNUX0YoRmxhZ2ZpbGVUZXN0LCBGaWx0ZXJOb25FbXB0eSkgewotICBpbnRlcm5hbDo6RmlsZVBhdGggZmxhZ2ZpbGVfcGF0aChDcmVhdGVGbGFnZmlsZSgKLSAgICAgICItLSIgIEdURVNUX0ZMQUdfUFJFRklYXyAgImZpbHRlcj1hYmMiKSk7Ci0gIHN0ZDo6c3RyaW5nIGZsYWdmaWxlX2ZsYWcgPQotICAgICAgc3RkOjpzdHJpbmcoIi0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZsYWdmaWxlPSIpICsgZmxhZ2ZpbGVfcGF0aC5jX3N0cigpOwotCi0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAiZm9vLmV4ZSIsCi0gICAgZmxhZ2ZpbGVfZmxhZy5jX3N0cigpLAotICAgIE5VTEwKLSAgfTsKLQotICBjb25zdCBjaGFyKiBhcmd2MltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkZpbHRlcigiYWJjIiksIGZhbHNlKTsKLX0KLQotLy8gVGVzdHMgcGFzc2luZyBzZXZlcmFsIGZsYWdzIHZpYSAtLWd0ZXN0X2ZsYWdmaWxlLgotVEVTVF9GKEZsYWdmaWxlVGVzdCwgU2V2ZXJhbEZsYWdzKSB7Ci0gIGludGVybmFsOjpGaWxlUGF0aCBmbGFnZmlsZV9wYXRoKENyZWF0ZUZsYWdmaWxlKAotICAgICAgIi0tIiAgR1RFU1RfRkxBR19QUkVGSVhfICAiZmlsdGVyPWFiY1xuIgotICAgICAgIi0tIiAgR1RFU1RfRkxBR19QUkVGSVhfICAiYnJlYWtfb25fZmFpbHVyZVxuIgotICAgICAgIi0tIiAgR1RFU1RfRkxBR19QUkVGSVhfICAibGlzdF90ZXN0cyIpKTsKLSAgc3RkOjpzdHJpbmcgZmxhZ2ZpbGVfZmxhZyA9Ci0gICAgICBzdGQ6OnN0cmluZygiLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZmxhZ2ZpbGU9IikgKyBmbGFnZmlsZV9wYXRoLmNfc3RyKCk7Ci0KLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJmb28uZXhlIiwKLSAgICBmbGFnZmlsZV9mbGFnLmNfc3RyKCksCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7Ci0gICAgImZvby5leGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBGbGFncyBleHBlY3RlZF9mbGFnczsKLSAgZXhwZWN0ZWRfZmxhZ3MuYnJlYWtfb25fZmFpbHVyZSA9IHRydWU7Ci0gIGV4cGVjdGVkX2ZsYWdzLmZpbHRlciA9ICJhYmMiOwotICBleHBlY3RlZF9mbGFncy5saXN0X3Rlc3RzID0gdHJ1ZTsKLQotICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBleHBlY3RlZF9mbGFncywgZmFsc2UpOwotfQotI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi0KLS8vIFRlc3RzIGN1cnJlbnRfdGVzdF9pbmZvKCkgaW4gVW5pdFRlc3QuCi1jbGFzcyBDdXJyZW50VGVzdEluZm9UZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgTlVMTCBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4KLSAgLy8gdGhlIHRlc3QgY2FzZSBpcyBydW4uCi0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7Ci0gICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHRlc3RzIHJ1bm5pbmcgYXQgdGhpcyBwb2ludC4KLSAgICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KLSAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RfaW5mbyA9PSBOVUxMKQotICAgICAgICA8PCAiVGhlcmUgc2hvdWxkIGJlIG5vIHRlc3RzIHJ1bm5pbmcgYXQgdGhpcyBwb2ludC4iOwotICB9Ci0KLSAgLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgTlVMTCBhZnRlciB0aGUgbGFzdCB0ZXN0IGluCi0gIC8vIHRoZSB0ZXN0IGNhc2UgaGFzIHJ1bi4KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KLSAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RfaW5mbyA9PSBOVUxMKQotICAgICAgICA8PCAiVGhlcmUgc2hvdWxkIGJlIG5vIHRlc3RzIHJ1bm5pbmcgYXQgdGhpcyBwb2ludC4iOwotICB9Ci19OwotCi0vLyBUZXN0cyB0aGF0IGN1cnJlbnRfdGVzdF9pbmZvKCkgcmV0dXJucyBUZXN0SW5mbyBmb3IgY3VycmVudGx5IHJ1bm5pbmcKLS8vIHRlc3QgYnkgY2hlY2tpbmcgdGhlIGV4cGVjdGVkIHRlc3QgbmFtZSBhZ2FpbnN0IHRoZSBhY3R1YWwgb25lLgotVEVTVF9GKEN1cnJlbnRUZXN0SW5mb1Rlc3QsIFdvcmtzRm9yRmlyc3RUZXN0SW5BVGVzdENhc2UpIHsKLSAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbyA9Ci0gICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIEFTU0VSVF9UUlVFKE5VTEwgIT0gdGVzdF9pbmZvKQotICAgICAgPDwgIlRoZXJlIGlzIGEgdGVzdCBydW5uaW5nIHNvIHdlIHNob3VsZCBoYXZlIGEgdmFsaWQgVGVzdEluZm8uIjsKLSAgRVhQRUNUX1NUUkVRKCJDdXJyZW50VGVzdEluZm9UZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKQotICAgICAgPDwgIkV4cGVjdGVkIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0IGNhc2UuIjsKLSAgRVhQRUNUX1NUUkVRKCJXb3Jrc0ZvckZpcnN0VGVzdEluQVRlc3RDYXNlIiwgdGVzdF9pbmZvLT5uYW1lKCkpCi0gICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIjsKLX0KLQotLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgVGVzdEluZm8gZm9yIGN1cnJlbnRseSBydW5uaW5nCi0vLyB0ZXN0IGJ5IGNoZWNraW5nIHRoZSBleHBlY3RlZCB0ZXN0IG5hbWUgYWdhaW5zdCB0aGUgYWN0dWFsIG9uZS4gIFdlCi0vLyB1c2UgdGhpcyB0ZXN0IHRvIHNlZSB0aGF0IHRoZSBUZXN0SW5mbyBvYmplY3QgYWN0dWFsbHkgY2hhbmdlZCBmcm9tCi0vLyB0aGUgcHJldmlvdXMgaW52b2NhdGlvbi4KLVRFU1RfRihDdXJyZW50VGVzdEluZm9UZXN0LCBXb3Jrc0ZvclNlY29uZFRlc3RJbkFUZXN0Q2FzZSkgewotICBjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvID0KLSAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgQVNTRVJUX1RSVUUoTlVMTCAhPSB0ZXN0X2luZm8pCi0gICAgICA8PCAiVGhlcmUgaXMgYSB0ZXN0IHJ1bm5pbmcgc28gd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBUZXN0SW5mby4iOwotICBFWFBFQ1RfU1RSRVEoIkN1cnJlbnRUZXN0SW5mb1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpCi0gICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QgY2FzZS4iOwotICBFWFBFQ1RfU1RSRVEoIldvcmtzRm9yU2Vjb25kVGVzdEluQVRlc3RDYXNlIiwgdGVzdF9pbmZvLT5uYW1lKCkpCi0gICAgICA8PCAiRXhwZWN0ZWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gVGhlc2UgdHdvIGxpbmVzIHRlc3QgdGhhdCB3ZSBjYW4gZGVmaW5lIHRlc3RzIGluIGEgbmFtZXNwYWNlIHRoYXQKLS8vIGhhcyB0aGUgbmFtZSAidGVzdGluZyIgYW5kIGlzIG5lc3RlZCBpbiBhbm90aGVyIG5hbWVzcGFjZS4KLW5hbWVzcGFjZSBteV9uYW1lc3BhY2UgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBNYWtlcyBzdXJlIHRoYXQgVEVTVCBrbm93cyB0byB1c2UgOjp0ZXN0aW5nOjpUZXN0IGluc3RlYWQgb2YKLS8vIDo6bXlfbmFtZXNwYWNlOjp0ZXN0aW5nOjpUZXN0LgotY2xhc3MgVGVzdCB7fTsKLQotLy8gTWFrZXMgc3VyZSB0aGF0IGFuIGFzc2VydGlvbiBrbm93cyB0byB1c2UgOjp0ZXN0aW5nOjpNZXNzYWdlIGluc3RlYWQgb2YKLS8vIDo6bXlfbmFtZXNwYWNlOjp0ZXN0aW5nOjpNZXNzYWdlLgotY2xhc3MgTWVzc2FnZSB7fTsKLQotLy8gTWFrZXMgc3VyZSB0aGF0IGFuIGFzc2VydGlvbiBrbm93cyB0byB1c2UKLS8vIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGluc3RlYWQgb2YKLS8vIDo6bXlfbmFtZXNwYWNlOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuCi1jbGFzcyBBc3NlcnRpb25SZXN1bHQge307Ci0KLS8vIFRlc3RzIHRoYXQgYW4gYXNzZXJ0aW9uIHRoYXQgc2hvdWxkIHN1Y2NlZWQgd29ya3MgYXMgZXhwZWN0ZWQuCi1URVNUKE5lc3RlZFRlc3RpbmdOYW1lc3BhY2VUZXN0LCBTdWNjZXNzKSB7Ci0gIEVYUEVDVF9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOwotfQotCi0vLyBUZXN0cyB0aGF0IGFuIGFzc2VydGlvbiB0aGF0IHNob3VsZCBmYWlsIHdvcmtzIGFzIGV4cGVjdGVkLgotVEVTVChOZXN0ZWRUZXN0aW5nTmFtZXNwYWNlVGVzdCwgRmFpbHVyZSkgewotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIG15X25hbWVzcGFjZQotCi0vLyBUZXN0cyB0aGF0IG9uZSBjYW4gY2FsbCBzdXBlcmNsYXNzIFNldFVwIGFuZCBUZWFyRG93biBtZXRob2RzLS0KLS8vIHRoYXQgaXMsIHRoYXQgdGhleSBhcmUgbm90IHByaXZhdGUuCi0vLyBObyB0ZXN0cyBhcmUgYmFzZWQgb24gdGhpcyBmaXh0dXJlOyB0aGUgdGVzdCAicGFzc2VzIiBpZiBpdCBjb21waWxlcwotLy8gc3VjY2Vzc2Z1bGx5LgotY2xhc3MgUHJvdGVjdGVkRml4dHVyZU1ldGhvZHNUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIFRlc3Q6OlNldFVwKCk7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIFRlc3Q6OlRlYXJEb3duKCk7Ci0gIH0KLX07Ci0KLS8vIFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0IHRlc3RzIHRoZSBzdHJlYW1pbmcgdmVyc2lvbnMgb2YgYSByZXByZXNlbnRhdGl2ZQotLy8gc2FtcGxlIG9mIGFzc2VydGlvbnMuCi1URVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBVbmNvbmRpdGlvbmFsKSB7Ci0gIFNVQ0NFRUQoKSA8PCAiZXhwZWN0ZWQgc3VjY2VzcyI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFERF9GQUlMVVJFKCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi0jaWZkZWYgX19CT1JMQU5EQ19fCi0vLyBTaWxlbmNlcyB3YXJuaW5nczogIkNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIsICJVbnJlYWNoYWJsZSBjb2RlIgotIyBwcmFnbWEgb3B0aW9uIHB1c2ggLXctY2NjIC13LXJjaAotI2VuZGlmCi0KLVRFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFRydXRoKSB7Ci0gIEVYUEVDVF9UUlVFKHRydWUpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfVFJVRSh0cnVlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoZmFsc2UpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLX0KLQotVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVHJ1dGgyKSB7Ci0gIEVYUEVDVF9GQUxTRShmYWxzZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEFTU0VSVF9GQUxTRShmYWxzZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSh0cnVlKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRSh0cnVlKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci19Ci0KLSNpZmRlZiBfX0JPUkxBTkRDX18KLS8vIFJlc3RvcmVzIHdhcm5pbmdzIGFmdGVyIHByZXZpb3VzICIjcHJhZ21hIG9wdGlvbiBwdXNoIiBzdXByZXNzZWQgdGhlbQotIyBwcmFnbWEgb3B0aW9uIHBvcAotI2VuZGlmCi0KLVRFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEludGVnZXJFcXVhbHMpIHsKLSAgRVhQRUNUX0VRKDEsIDEpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfRVEoMSwgMSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgxLCAyKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUSgxLCAyKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci19Ci0KLVRFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIEludGVnZXJMZXNzVGhhbikgewotICBFWFBFQ1RfTFQoMSwgMikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEFTU0VSVF9MVCgxLCAyKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDIsIDEpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xUKDIsIDEpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLX0KLQotVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nc0VxdWFsKSB7Ci0gIEVYUEVDVF9TVFJFUSgiZm9vIiwgImZvbyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfU1RSRVEoImZvbyIsICJmb28iKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkVRKCJmb28iLCAiYmFyIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci19Ci0KLVRFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ3NOb3RFcXVhbCkgewotICBFWFBFQ1RfU1RSTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgQVNTRVJUX1NUUk5FKCJmb28iLCAiYmFyIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORSgiZm9vIiwgImZvbyIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUk5FKCJmb28iLCAiZm9vIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi1URVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBTdHJpbmdzRXF1YWxJZ25vcmluZ0Nhc2UpIHsKLSAgRVhQRUNUX1NUUkNBU0VFUSgiZm9vIiwgIkZPTyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfU1RSQ0FTRUVRKCJmb28iLCAiRk9PIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJDQVNFRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJDQVNFRVEoImZvbyIsICJiYXIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci19Ci0KLVRFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ05vdEVxdWFsSWdub3JpbmdDYXNlKSB7Ci0gIEVYUEVDVF9TVFJDQVNFTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgQVNTRVJUX1NUUkNBU0VORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSQ0FTRU5FKCJmb28iLCAiRk9PIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRU5FKCJiYXIiLCAiQkFSIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi1URVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBGbG9hdGluZ1BvaW50RXF1YWxzKSB7Ci0gIEVYUEVDVF9GTE9BVF9FUSgxLjAsIDEuMCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEFTU0VSVF9GTE9BVF9FUSgxLjAsIDEuMCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7Ci0gIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSgwLjAsIDEuMCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkxPQVRfRVEoMC4wLCAxLjApIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKLX0KLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLVRFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFRocm93KSB7Ci0gIEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKLSAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKLX0KLQotVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgTm9UaHJvdykgewotICBFWFBFQ1RfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfTk9fVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTk9fVEhST1coVGhyb3dBbkludGVnZXIoKSkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi1URVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBBbnlUaHJvdykgewotICBFWFBFQ1RfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBBU1NFUlRfQU5ZX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOwotICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGNvcnJlY3RseSBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgotCi1URVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzQ29sb3JzV2hlbkdUZXN0Q29sb3JGbGFnSXNZZXMpIHsKLSAgR1RFU1RfRkxBRyhjb2xvcikgPSAieWVzIjsKLQotICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgotICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCi0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJkdW1iIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCi0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCi19Ci0KLVRFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuR1Rlc3RDb2xvckZsYWdJc0FsaWFzT2ZZZXMpIHsKLSAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KLQotICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJUcnVlIjsKLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCi0KLSAgR1RFU1RfRkxBRyhjb2xvcikgPSAidCI7Ci0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgotCi0gIEdURVNUX0ZMQUcoY29sb3IpID0gIjEiOwotICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KLX0KLQotVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc05vQ29sb3JXaGVuR1Rlc3RDb2xvckZsYWdJc05vKSB7Ci0gIEdURVNUX0ZMQUcoY29sb3IpID0gIm5vIjsKLQotICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCi0KLSAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KLSAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KLSAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgotfQotCi1URVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzTm9Db2xvcldoZW5HVGVzdENvbG9yRmxhZ0lzSW52YWxpZCkgewotICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgotCi0gIEdURVNUX0ZMQUcoY29sb3IpID0gIkYiOwotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIEdURVNUX0ZMQUcoY29sb3IpID0gIjAiOwotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIEdURVNUX0ZMQUcoY29sb3IpID0gInVua25vd24iOwotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotfQotCi1URVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzQ29sb3JzV2hlblN0ZG91dElzVHR5KSB7Ci0gIEdURVNUX0ZMQUcoY29sb3IpID0gImF1dG8iOwotCi0gIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCi0gIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgICAvLyBTdGRvdXQgaXMgYSBUVFkuCi19Ci0KLVRFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNDb2xvcnNXaGVuVGVybVN1cHBvcnRzQ29sb3JzKSB7Ci0gIEdURVNUX0ZMQUcoY29sb3IpID0gImF1dG8iOwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotICAvLyBPbiBXaW5kb3dzLCB3ZSBpZ25vcmUgdGhlIFRFUk0gdmFyaWFibGUgYXMgaXQncyB1c3VhbGx5IG5vdCBzZXQuCi0KLSAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsKLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICIiKTsKLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJ4dGVybSIpOwotICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCi0jZWxzZQotICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHdlIHJlbHkgb24gVEVSTSB0byBkZXRlcm1pbmUgaWYgdGhlCi0gIC8vIHRlcm1pbmFsIHN1cHBvcnRzIGNvbG9ycy4KLQotICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJlbWFjcyIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJ2dDEwMCIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgotICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJ4dGVybS1tb25vIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCi0gIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCi0KLSAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJ4dGVybS1jb2xvciIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCi0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KLQotICBTZXRFbnYoIlRFUk0iLCAieHRlcm0tMjU2Y29sb3IiKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgotICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCi0KLSAgU2V0RW52KCJURVJNIiwgInNjcmVlbiIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCi0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KLQotICBTZXRFbnYoIlRFUk0iLCAic2NyZWVuLTI1NmNvbG9yIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KLSAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgotCi0gIFNldEVudigiVEVSTSIsICJyeHZ0LXVuaWNvZGUiKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgotICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCi0KLSAgU2V0RW52KCJURVJNIiwgInJ4dnQtdW5pY29kZS0yNTZjb2xvciIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCi0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KLQotICBTZXRFbnYoIlRFUk0iLCAibGludXgiKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgotICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCi0KLSAgU2V0RW52KCJURVJNIiwgImN5Z3dpbiIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCi0gIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotfQotCi0vLyBWZXJpZmllcyB0aGF0IFN0YXRpY0Fzc2VydFR5cGVFcSB3b3JrcyBpbiBhIG5hbWVzcGFjZSBzY29wZS4KLQotc3RhdGljIGJvb2wgZHVtbXkxIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsIGJvb2w+KCk7Ci1zdGF0aWMgYm9vbCBkdW1teTIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPQotICAgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBpbnQsIGNvbnN0IGludD4oKTsKLQotLy8gVmVyaWZpZXMgdGhhdCBTdGF0aWNBc3NlcnRUeXBlRXEgd29ya3MgaW4gYSBjbGFzcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTdGF0aWNBc3NlcnRUeXBlRXFUZXN0SGVscGVyIHsKLSBwdWJsaWM6Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcVRlc3RIZWxwZXIoKSB7IFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLCBUPigpOyB9Ci19OwotCi1URVNUKFN0YXRpY0Fzc2VydFR5cGVFcVRlc3QsIFdvcmtzSW5DbGFzcykgewotICBTdGF0aWNBc3NlcnRUeXBlRXFUZXN0SGVscGVyPGJvb2w+KCk7Ci19Ci0KLS8vIFZlcmlmaWVzIHRoYXQgU3RhdGljQXNzZXJ0VHlwZUVxIHdvcmtzIGluc2lkZSBhIGZ1bmN0aW9uLgotCi10eXBlZGVmIGludCBJbnRBbGlhczsKLQotVEVTVChTdGF0aWNBc3NlcnRUeXBlRXFUZXN0LCBDb21waWxlc0ZvckVxdWFsVHlwZXMpIHsKLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwgSW50QWxpYXM+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQqLCBJbnRBbGlhcyo+KCk7Ci19Ci0KLVRFU1QoR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcFRlc3QsIFJldHVybnNUaGVTdGFja1RyYWNlKSB7Ci0gIHRlc3Rpbmc6OlVuaXRUZXN0KiBjb25zdCB1bml0X3Rlc3QgPSB0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKLQotICAvLyBXZSBkb24ndCBoYXZlIGEgc3RhY2sgd2Fsa2VyIGluIEdvb2dsZSBUZXN0IHlldC4KLSAgRVhQRUNUX1NUUkVRKCIiLCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKHVuaXRfdGVzdCwgMCkuY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiIiwgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCh1bml0X3Rlc3QsIDEpLmNfc3RyKCkpOwotfQotCi1URVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5UaGVyZUlzTm9GYWlsdXJlKSB7Ci0gIEVYUEVDVF9GQUxTRShIYXNOb25mYXRhbEZhaWx1cmUoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEZhaWxGYXRhbGx5KCkgeyBGQUlMKCk7IH0KLQotVEVTVChIYXNOb25mYXRhbEZhaWx1cmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuVGhlcmVJc09ubHlGYXRhbEZhaWx1cmUpIHsKLSAgRmFpbEZhdGFsbHkoKTsKLSAgY29uc3QgYm9vbCBoYXNfbm9uZmF0YWxfZmFpbHVyZSA9IEhhc05vbmZhdGFsRmFpbHVyZSgpOwotICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKLSAgRVhQRUNUX0ZBTFNFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKLX0KLQotVEVTVChIYXNOb25mYXRhbEZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUlzTm9uZmF0YWxGYWlsdXJlKSB7Ci0gIEFERF9GQUlMVVJFKCk7Ci0gIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmUoKTsKLSAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7Ci0gIEVYUEVDVF9UUlVFKGhhc19ub25mYXRhbF9mYWlsdXJlKTsKLX0KLQotVEVTVChIYXNOb25mYXRhbEZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUFyZUZhdGFsQW5kTm9uZmF0YWxGYWlsdXJlcykgewotICBGYWlsRmF0YWxseSgpOwotICBBRERfRkFJTFVSRSgpOwotICBjb25zdCBib29sIGhhc19ub25mYXRhbF9mYWlsdXJlID0gSGFzTm9uZmF0YWxGYWlsdXJlKCk7Ci0gIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOwotICBFWFBFQ1RfVFJVRShoYXNfbm9uZmF0YWxfZmFpbHVyZSk7Ci19Ci0KLS8vIEEgd3JhcHBlciBmb3IgY2FsbGluZyBIYXNOb25mYXRhbEZhaWx1cmUgb3V0c2lkZSBvZiBhIHRlc3QgYm9keS4KLXN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZUhlbHBlcigpIHsKLSAgcmV0dXJuIHRlc3Rpbmc6OlRlc3Q6Okhhc05vbmZhdGFsRmFpbHVyZSgpOwotfQotCi1URVNUKEhhc05vbmZhdGFsRmFpbHVyZVRlc3QsIFdvcmtzT3V0c2lkZU9mVGVzdEJvZHkpIHsKLSAgRVhQRUNUX0ZBTFNFKEhhc05vbmZhdGFsRmFpbHVyZUhlbHBlcigpKTsKLX0KLQotVEVTVChIYXNOb25mYXRhbEZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5MikgewotICBBRERfRkFJTFVSRSgpOwotICBjb25zdCBib29sIGhhc19ub25mYXRhbF9mYWlsdXJlID0gSGFzTm9uZmF0YWxGYWlsdXJlSGVscGVyKCk7Ci0gIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOwotICBFWFBFQ1RfVFJVRShoYXNfbm9uZmF0YWxfZmFpbHVyZSk7Ci19Ci0KLVRFU1QoSGFzRmFpbHVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5UaGVyZUlzTm9GYWlsdXJlKSB7Ci0gIEVYUEVDVF9GQUxTRShIYXNGYWlsdXJlKCkpOwotfQotCi1URVNUKEhhc0ZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUlzRmF0YWxGYWlsdXJlKSB7Ci0gIEZhaWxGYXRhbGx5KCk7Ci0gIGNvbnN0IGJvb2wgaGFzX2ZhaWx1cmUgPSBIYXNGYWlsdXJlKCk7Ci0gIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOwotICBFWFBFQ1RfVFJVRShoYXNfZmFpbHVyZSk7Ci19Ci0KLVRFU1QoSGFzRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlSXNOb25mYXRhbEZhaWx1cmUpIHsKLSAgQUREX0ZBSUxVUkUoKTsKLSAgY29uc3QgYm9vbCBoYXNfZmFpbHVyZSA9IEhhc0ZhaWx1cmUoKTsKLSAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7Ci0gIEVYUEVDVF9UUlVFKGhhc19mYWlsdXJlKTsKLX0KLQotVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVBcmVGYXRhbEFuZE5vbmZhdGFsRmFpbHVyZXMpIHsKLSAgRmFpbEZhdGFsbHkoKTsKLSAgQUREX0ZBSUxVUkUoKTsKLSAgY29uc3QgYm9vbCBoYXNfZmFpbHVyZSA9IEhhc0ZhaWx1cmUoKTsKLSAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7Ci0gIEVYUEVDVF9UUlVFKGhhc19mYWlsdXJlKTsKLX0KLQotLy8gQSB3cmFwcGVyIGZvciBjYWxsaW5nIEhhc0ZhaWx1cmUgb3V0c2lkZSBvZiBhIHRlc3QgYm9keS4KLXN0YXRpYyBib29sIEhhc0ZhaWx1cmVIZWxwZXIoKSB7IHJldHVybiB0ZXN0aW5nOjpUZXN0OjpIYXNGYWlsdXJlKCk7IH0KLQotVEVTVChIYXNGYWlsdXJlVGVzdCwgV29ya3NPdXRzaWRlT2ZUZXN0Qm9keSkgewotICBFWFBFQ1RfRkFMU0UoSGFzRmFpbHVyZUhlbHBlcigpKTsKLX0KLQotVEVTVChIYXNGYWlsdXJlVGVzdCwgV29ya3NPdXRzaWRlT2ZUZXN0Qm9keTIpIHsKLSAgQUREX0ZBSUxVUkUoKTsKLSAgY29uc3QgYm9vbCBoYXNfZmFpbHVyZSA9IEhhc0ZhaWx1cmVIZWxwZXIoKTsKLSAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7Ci0gIEVYUEVDVF9UUlVFKGhhc19mYWlsdXJlKTsKLX0KLQotY2xhc3MgVGVzdExpc3RlbmVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgVGVzdExpc3RlbmVyKCkgOiBvbl9zdGFydF9jb3VudGVyXyhOVUxMKSwgaXNfZGVzdHJveWVkXyhOVUxMKSB7fQotICBUZXN0TGlzdGVuZXIoaW50KiBvbl9zdGFydF9jb3VudGVyLCBib29sKiBpc19kZXN0cm95ZWQpCi0gICAgICA6IG9uX3N0YXJ0X2NvdW50ZXJfKG9uX3N0YXJ0X2NvdW50ZXIpLAotICAgICAgICBpc19kZXN0cm95ZWRfKGlzX2Rlc3Ryb3llZCkge30KLQotICB2aXJ0dWFsIH5UZXN0TGlzdGVuZXIoKSB7Ci0gICAgaWYgKGlzX2Rlc3Ryb3llZF8pCi0gICAgICAqaXNfZGVzdHJveWVkXyA9IHRydWU7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgewotICAgIGlmIChvbl9zdGFydF9jb3VudGVyXyAhPSBOVUxMKQotICAgICAgKCpvbl9zdGFydF9jb3VudGVyXykrKzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgaW50KiBvbl9zdGFydF9jb3VudGVyXzsKLSAgYm9vbCogaXNfZGVzdHJveWVkXzsKLX07Ci0KLS8vIFRlc3RzIHRoZSBjb25zdHJ1Y3Rvci4KLVRFU1QoVGVzdEV2ZW50TGlzdGVuZXJzVGVzdCwgQ29uc3RydWN0aW9uV29ya3MpIHsKLSAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKLQotICBFWFBFQ1RfVFJVRShUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycykgIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSA9PSBOVUxMKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgVGVzdEV2ZW50TGlzdGVuZXJzIGRlc3RydWN0b3IgZGVsZXRlcyBhbGwgdGhlIGxpc3RlbmVycyBpdAotLy8gb3ducy4KLVRFU1QoVGVzdEV2ZW50TGlzdGVuZXJzVGVzdCwgRGVzdHJ1Y3Rpb25Xb3JrcykgewotICBib29sIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfaXNfZGVzdHJveWVkID0gZmFsc2U7Ci0gIGJvb2wgZGVmYXVsdF94bWxfcHJpbnRlcl9pc19kZXN0cm95ZWQgPSBmYWxzZTsKLSAgYm9vbCBleHRyYV9saXN0ZW5lcl9pc19kZXN0cm95ZWQgPSBmYWxzZTsKLSAgVGVzdExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyID0gbmV3IFRlc3RMaXN0ZW5lcigKLSAgICAgIE5VTEwsICZkZWZhdWx0X3Jlc3VsdF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7Ci0gIFRlc3RMaXN0ZW5lciogZGVmYXVsdF94bWxfcHJpbnRlciA9IG5ldyBUZXN0TGlzdGVuZXIoCi0gICAgICBOVUxMLCAmZGVmYXVsdF94bWxfcHJpbnRlcl9pc19kZXN0cm95ZWQpOwotICBUZXN0TGlzdGVuZXIqIGV4dHJhX2xpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigKLSAgICAgIE5VTEwsICZleHRyYV9saXN0ZW5lcl9pc19kZXN0cm95ZWQpOwotCi0gIHsKLSAgICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOwotICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKTsKLSAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcigmbGlzdGVuZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfeG1sX3ByaW50ZXIpOwotICAgIGxpc3RlbmVycy5BcHBlbmQoZXh0cmFfbGlzdGVuZXIpOwotICB9Ci0gIEVYUEVDVF9UUlVFKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfaXNfZGVzdHJveWVkKTsKLSAgRVhQRUNUX1RSVUUoZGVmYXVsdF94bWxfcHJpbnRlcl9pc19kZXN0cm95ZWQpOwotICBFWFBFQ1RfVFJVRShleHRyYV9saXN0ZW5lcl9pc19kZXN0cm95ZWQpOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgbGlzdGVuZXIgQXBwZW5kJ2VkIHRvIGEgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3Qgc3RhcnRzCi0vLyByZWNlaXZpbmcgZXZlbnRzLgotVEVTVChUZXN0RXZlbnRMaXN0ZW5lcnNUZXN0LCBBcHBlbmQpIHsKLSAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOwotICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOwotICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7Ci0gIHsKLSAgICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOwotICAgIGxpc3RlbmVycy5BcHBlbmQobGlzdGVuZXIpOwotICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAotICAgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOwotICAgIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKLSAgfQotICBFWFBFQ1RfVFJVRShpc19kZXN0cm95ZWQpOwotfQotCi0vLyBUZXN0cyB0aGF0IGxpc3RlbmVycyByZWNlaXZlIGV2ZW50cyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGFwcGVuZGVkIHRvCi0vLyB0aGUgbGlzdCwgZXhjZXB0IGZvciAqRW5kIHJlcXVlc3RzLCB3aGljaCBtdXN0IGJlIHJlY2VpdmVkIGluIHRoZSByZXZlcnNlCi0vLyBvcmRlci4KLWNsYXNzIFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB2ZWN0b3IsIGNvbnN0IGNoYXIqIGlkKQotICAgICAgOiB2ZWN0b3JfKHZlY3RvciksIGlkXyhpZCkge30KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgewotICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RQcm9ncmFtU3RhcnQiKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgewotICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RQcm9ncmFtRW5kIikpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKLSAgICB2ZWN0b3JfLT5wdXNoX2JhY2soR2V0RXZlbnREZXNjcmlwdGlvbigiT25UZXN0SXRlcmF0aW9uU3RhcnQiKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7Ci0gICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdEl0ZXJhdGlvbkVuZCIpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgR2V0RXZlbnREZXNjcmlwdGlvbihjb25zdCBjaGFyKiBtZXRob2QpIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgbWVzc2FnZSA8PCBpZF8gPDwgIi4iIDw8IG1ldGhvZDsKLSAgICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogdmVjdG9yXzsKLSAgY29uc3QgY2hhciogY29uc3QgaWRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIpOwotfTsKLQotVEVTVChFdmVudExpc3RlbmVyVGVzdCwgQXBwZW5kS2VlcHNPcmRlcikgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVjOwotICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOwotICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcigmdmVjLCAiMXN0IikpOwotICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcigmdmVjLCAiMm5kIikpOwotICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lcigmdmVjLCAiM3JkIikpOwotCi0gIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAotICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKLSAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0UHJvZ3JhbVN0YXJ0IiwgdmVjWzBdLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RQcm9ncmFtU3RhcnQiLCB2ZWNbMV0uY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiM3JkLk9uVGVzdFByb2dyYW1TdGFydCIsIHZlY1syXS5jX3N0cigpKTsKLQotICB2ZWMuY2xlYXIoKTsKLSAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtRW5kKAotICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKLSAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0UHJvZ3JhbUVuZCIsIHZlY1swXS5jX3N0cigpKTsKLSAgRVhQRUNUX1NUUkVRKCIybmQuT25UZXN0UHJvZ3JhbUVuZCIsIHZlY1sxXS5jX3N0cigpKTsKLSAgRVhQRUNUX1NUUkVRKCIxc3QuT25UZXN0UHJvZ3JhbUVuZCIsIHZlY1syXS5jX3N0cigpKTsKLQotICB2ZWMuY2xlYXIoKTsKLSAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RJdGVyYXRpb25TdGFydCgKLSAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSwgMCk7Ci0gIEFTU0VSVF9FUSgzVSwgdmVjLnNpemUoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMXN0Lk9uVGVzdEl0ZXJhdGlvblN0YXJ0IiwgdmVjWzBdLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RJdGVyYXRpb25TdGFydCIsIHZlY1sxXS5jX3N0cigpKTsKLSAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0SXRlcmF0aW9uU3RhcnQiLCB2ZWNbMl0uY19zdHIoKSk7Ci0KLSAgdmVjLmNsZWFyKCk7Ci0gIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0SXRlcmF0aW9uRW5kKAotICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLCAwKTsKLSAgQVNTRVJUX0VRKDNVLCB2ZWMuc2l6ZSgpKTsKLSAgRVhQRUNUX1NUUkVRKCIzcmQuT25UZXN0SXRlcmF0aW9uRW5kIiwgdmVjWzBdLmNfc3RyKCkpOwotICBFWFBFQ1RfU1RSRVEoIjJuZC5PblRlc3RJdGVyYXRpb25FbmQiLCB2ZWNbMV0uY19zdHIoKSk7Ci0gIEVYUEVDVF9TVFJFUSgiMXN0Lk9uVGVzdEl0ZXJhdGlvbkVuZCIsIHZlY1syXS5jX3N0cigpKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBhIGxpc3RlbmVyIHJlbW92ZWQgZnJvbSBhIFRlc3RFdmVudExpc3RlbmVycyBsaXN0IHN0b3BzIHJlY2VpdmluZwotLy8gZXZlbnRzIGFuZCBpcyBub3QgZGVsZXRlZCB3aGVuIHRoZSBsaXN0IGlzIGRlc3Ryb3llZC4KLVRFU1QoVGVzdEV2ZW50TGlzdGVuZXJzVGVzdCwgUmVsZWFzZSkgewotICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7Ci0gIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7Ci0gIC8vIEFsdGhvdWdoIEFwcGVuZCBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCB0byB0aGUgbGlzdCwKLSAgLy8gdGhlIGZvbGxvd2luZyBjYWxscyByZWxlYXNlIGl0LCBhbmQgd2UgbmVlZCB0byBkZWxldGUgaXQgYmVmb3JlIHRoZQotICAvLyB0ZXN0IGVuZHMuCi0gIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKLSAgewotICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7Ci0gICAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7Ci0gICAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcikpOwotICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAotICAgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOwotICAgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSA9PSBOVUxMKTsKLSAgfQotICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7Ci0gIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOwotICBkZWxldGUgbGlzdGVuZXI7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgbm8gZXZlbnRzIGFyZSBmb3J3YXJkZWQgd2hlbiBldmVudCBmb3J3YXJkaW5nIGlzIGRpc2FibGVkLgotVEVTVChFdmVudExpc3RlbmVyVGVzdCwgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcpIHsKLSAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOwotICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgTlVMTCk7Ci0KLSAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKLSAgbGlzdGVuZXJzLkFwcGVuZChsaXN0ZW5lcik7Ci0gIEFTU0VSVF9UUlVFKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKGxpc3RlbmVycykpOwotICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoJmxpc3RlbmVycyk7Ci0gIEFTU0VSVF9GQUxTRShUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6RXZlbnRGb3J3YXJkaW5nRW5hYmxlZChsaXN0ZW5lcnMpKTsKLSAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCi0gICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOwotICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgZXZlbnRzIGdlbmVyYXRlZCBieSBHb29nbGUgVGVzdCBhcmUgbm90IGZvcndhcmRlZCBpbgotLy8gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCi1URVNUKEV2ZW50TGlzdGVuZXJEZWF0aFRlc3QsIEV2ZW50c05vdEZvcndhcmRlZEluRGVhdGhUZXN0U3VicHJlY2Vzc2VzKSB7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoewotICAgICAgR1RFU1RfQ0hFQ0tfKFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKAotICAgICAgICAgICpHZXRVbml0VGVzdEltcGwoKS0+bGlzdGVuZXJzKCkpKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSI7fSwKLSAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciBpbnN0YWxsZWQgdmlhIFNldERlZmF1bHRSZXN1bHRQcmludGVyKCkgc3RhcnRzCi0vLyByZWNlaXZpbmcgZXZlbnRzIGFuZCBpcyByZXR1cm5lZCB2aWEgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpIGFuZCB0aGF0Ci0vLyB0aGUgcHJldmlvdXMgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QgYW5kIGRlbGV0ZWQuCi1URVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKSB7Ci0gIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKLSAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKLSAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOwotCi0gIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7Ci0gIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0KLSAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKLQotICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKLSAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7Ci0KLSAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOwotCi0gIC8vIFJlcGxhY2luZyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIHdpdGggc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHJlbW92ZSBpdAotICAvLyBmcm9tIHRoZSBsaXN0IGFuZCBkZXN0cm95IGl0LgotICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoJmxpc3RlbmVycywgTlVMTCk7Ci0KLSAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoaXNfZGVzdHJveWVkKTsKLQotICAvLyBBZnRlciBicm9hZGNhc3RpbmcgYW4gZXZlbnQgdGhlIGNvdW50ZXIgaXMgc3RpbGwgdGhlIHNhbWUsIGluZGljYXRpbmcKLSAgLy8gdGhlIGxpc3RlbmVyIGlzIG5vdCBpbiB0aGUgbGlzdCBhbnltb3JlLgotICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKLSAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7Ci0gIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKLX0KLQotLy8gVGVzdHMgdGhhdCB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBsaXN0ZW5lciBzdG9wcyByZWNlaXZpbmcgZXZlbnRzCi0vLyB3aGVuIHJlbW92ZWQgdmlhIFJlbGVhc2UgYW5kIHRoYXQgaXMgbm90IG93bmVkIGJ5IHRoZSBsaXN0IGFueW1vcmUuCi1URVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBSZW1vdmluZ0RlZmF1bHRSZXN1bHRQcmludGVyV29ya3MpIHsKLSAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOwotICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOwotICAvLyBBbHRob3VnaCBBcHBlbmQgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QgdG8gdGhlIGxpc3QsCi0gIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMgcmVsZWFzZSBpdCwgYW5kIHdlIG5lZWQgdG8gZGVsZXRlIGl0IGJlZm9yZSB0aGUKLSAgLy8gdGVzdCBlbmRzLgotICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7Ci0gIHsKLSAgICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOwotICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0KLSAgICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSA9PSBOVUxMKTsKLSAgICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKLQotICAgIC8vIEJyb2FkY2FzdGluZyBldmVudHMgbm93IHNob3VsZCBub3QgYWZmZWN0IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIuCi0gICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCi0gICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIG9uX3N0YXJ0X2NvdW50ZXIpOwotICB9Ci0gIC8vIERlc3Ryb3lpbmcgdGhlIGxpc3Qgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGxpc3RlbmVyIG5vdywgdG9vLgotICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKLSAgZGVsZXRlIGxpc3RlbmVyOwotfQotCi0vLyBUZXN0cyB0aGF0IGEgbGlzdGVuZXIgaW5zdGFsbGVkIHZpYSBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCkgc3RhcnRzCi0vLyByZWNlaXZpbmcgZXZlbnRzIGFuZCBpcyByZXR1cm5lZCB2aWEgZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgYW5kIHRoYXQKLS8vIHRoZSBwcmV2aW91cyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFuZCBkZWxldGVkLgotVEVTVChFdmVudExpc3RlbmVyVGVzdCwgZGVmYXVsdF94bWxfZ2VuZXJhdG9yKSB7Ci0gIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKLSAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKLSAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOwotCi0gIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7Ci0gIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQotICBFWFBFQ1RfRVEobGlzdGVuZXIsIGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSk7Ci0KLSAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCi0gICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOwotCi0gIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKLQotICAvLyBSZXBsYWNpbmcgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIHdpdGggc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHJlbW92ZSBpdAotICAvLyBmcm9tIHRoZSBsaXN0IGFuZCBkZXN0cm95IGl0LgotICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcigmbGlzdGVuZXJzLCBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGlzX2Rlc3Ryb3llZCk7Ci0KLSAgLy8gQWZ0ZXIgYnJvYWRjYXN0aW5nIGFuIGV2ZW50IHRoZSBjb3VudGVyIGlzIHN0aWxsIHRoZSBzYW1lLCBpbmRpY2F0aW5nCi0gIC8vIHRoZSBsaXN0ZW5lciBpcyBub3QgaW4gdGhlIGxpc3QgYW55bW9yZS4KLSAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCi0gICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOwotICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBsaXN0ZW5lciBzdG9wcyByZWNlaXZpbmcgZXZlbnRzCi0vLyB3aGVuIHJlbW92ZWQgdmlhIFJlbGVhc2UgYW5kIHRoYXQgaXMgbm90IG93bmVkIGJ5IHRoZSBsaXN0IGFueW1vcmUuCi1URVNUKEV2ZW50TGlzdGVuZXJUZXN0LCBSZW1vdmluZ0RlZmF1bHRYbWxHZW5lcmF0b3JXb3JrcykgewotICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7Ci0gIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7Ci0gIC8vIEFsdGhvdWdoIEFwcGVuZCBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCB0byB0aGUgbGlzdCwKLSAgLy8gdGhlIGZvbGxvd2luZyBjYWxscyByZWxlYXNlIGl0LCBhbmQgd2UgbmVlZCB0byBkZWxldGUgaXQgYmVmb3JlIHRoZQotICAvLyB0ZXN0IGVuZHMuCi0gIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKLSAgewotICAgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7Ci0gICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoJmxpc3RlbmVycywgbGlzdGVuZXIpOwotCi0gICAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcikpOwotICAgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSA9PSBOVUxMKTsKLSAgICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKLQotICAgIC8vIEJyb2FkY2FzdGluZyBldmVudHMgbm93IHNob3VsZCBub3QgYWZmZWN0IGRlZmF1bHRfeG1sX2dlbmVyYXRvci4KLSAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKLSAgICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgb25fc3RhcnRfY291bnRlcik7Ci0gIH0KLSAgLy8gRGVzdHJveWluZyB0aGUgbGlzdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgbGlzdGVuZXIgbm93LCB0b28uCi0gIEVYUEVDVF9GQUxTRShpc19kZXN0cm95ZWQpOwotICBkZWxldGUgbGlzdGVuZXI7Ci19Ci0KLS8vIFNhbml0eSB0ZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgYWx0ZXJuYXRpdmUsIHZlcmJvc2Ugc3BlbGxpbmdzIG9mCi0vLyBzb21lIG9mIHRoZSBtYWNyb3Mgd29yay4gIFdlIGRvbid0IHRlc3QgdGhlbSB0aG9yb3VnaGx5IGFzIHRoYXQKLS8vIHdvdWxkIGJlIHF1aXRlIGludm9sdmVkLiAgU2luY2UgdGhlaXIgaW1wbGVtZW50YXRpb25zIGFyZQotLy8gc3RyYWlnaHRmb3J3YXJkLCBhbmQgdGhleSBhcmUgcmFyZWx5IHVzZWQsIHdlJ2xsIGp1c3QgcmVseSBvbiB0aGUKLS8vIHVzZXJzIHRvIHRlbGwgdXMgd2hlbiB0aGV5IGFyZSBicm9rZW4uCi1HVEVTVF9URVNUKEFsdGVybmF0aXZlTmFtZVRlc3QsIFdvcmtzKSB7ICAvLyBHVEVTVF9URVNUIGlzIHRoZSBzYW1lIGFzIFRFU1QuCi0gIEdURVNUX1NVQ0NFRUQoKSA8PCAiT0siOyAgLy8gR1RFU1RfU1VDQ0VFRCBpcyB0aGUgc2FtZSBhcyBTVUNDRUVELgotCi0gIC8vIEdURVNUX0ZBSUwgaXMgdGhlIHNhbWUgYXMgRkFJTC4KLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfRkFJTCgpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKLQotICAvLyBHVEVTVF9BU1NFUlRfWFkgaXMgdGhlIHNhbWUgYXMgQVNTRVJUX1hZLgotCi0gIEdURVNUX0FTU0VSVF9FUSgwLCAwKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0VRKDAsIDEpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0VRKDEsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKLQotICBHVEVTVF9BU1NFUlRfTkUoMCwgMSk7Ci0gIEdURVNUX0FTU0VSVF9ORSgxLCAwKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX05FKDAsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKLQotICBHVEVTVF9BU1NFUlRfTEUoMCwgMCk7Ci0gIEdURVNUX0FTU0VSVF9MRSgwLCAxKTsKLSAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0xFKDEsIDApIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKLQotICBHVEVTVF9BU1NFUlRfTFQoMCwgMSk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9MVCgwLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9MVCgxLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7Ci0KLSAgR1RFU1RfQVNTRVJUX0dFKDAsIDApOwotICBHVEVTVF9BU1NFUlRfR0UoMSwgMCk7Ci0gIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9HRSgwLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7Ci0KLSAgR1RFU1RfQVNTRVJUX0dUKDEsIDApOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfR1QoMCwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOwotICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfR1QoMSwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOwotfQotCi0vLyBUZXN0cyBmb3IgaW50ZXJuYWwgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuaXZlcnNhbAotLy8gcHJpbnRpbmcuCi0vLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBGaW5kIGEgYmV0dGVyIGhvbWUgZm9yIHRoZW0uCi0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJCYXNlIHt9OwotY2xhc3MgQ29udmVyc2lvbkhlbHBlckRlcml2ZWQgOiBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckJhc2Uge307Ci0KLS8vIFRlc3RzIHRoYXQgSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KLVRFU1QoSXNBUHJvdG9jb2xNZXNzYWdlVGVzdCwgVmFsdWVJc0NvbXBpbGVUaW1lQ29uc3RhbnQpIHsKLSAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKElzQVByb3RvY29sTWVzc2FnZTxQcm90b2NvbE1lc3NhZ2U+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3RydWUpOwotICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oIUlzQVByb3RvY29sTWVzc2FnZTxpbnQ+Ojp2YWx1ZSwgY29uc3RfZmFsc2UpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgdHJ1ZSB3aGVuIFQgaXMKLS8vIHByb3RvMjo6TWVzc2FnZSBvciBhIHN1Yi1jbGFzcyBvZiBpdC4KLVRFU1QoSXNBUHJvdG9jb2xNZXNzYWdlVGVzdCwgVmFsdWVJc1RydWVXaGVuVHlwZUlzQVByb3RvY29sTWVzc2FnZSkgewotICBFWFBFQ1RfVFJVRShJc0FQcm90b2NvbE1lc3NhZ2U8IDo6cHJvdG8yOjpNZXNzYWdlPjo6dmFsdWUpOwotICBFWFBFQ1RfVFJVRShJc0FQcm90b2NvbE1lc3NhZ2U8UHJvdG9jb2xNZXNzYWdlPjo6dmFsdWUpOwotfQotCi0vLyBUZXN0cyB0aGF0IElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgZmFsc2Ugd2hlbiBUIGlzIG5laXRoZXIKLS8vIFByb3RvY29sTWVzc2FnZSBub3IgYSBzdWItY2xhc3Mgb2YgaXQuCi1URVNUKElzQVByb3RvY29sTWVzc2FnZVRlc3QsIFZhbHVlSXNGYWxzZVdoZW5UeXBlSXNOb3RBUHJvdG9jb2xNZXNzYWdlKSB7Ci0gIEVYUEVDVF9GQUxTRShJc0FQcm90b2NvbE1lc3NhZ2U8aW50Pjo6dmFsdWUpOwotICBFWFBFQ1RfRkFMU0UoSXNBUHJvdG9jb2xNZXNzYWdlPGNvbnN0IENvbnZlcnNpb25IZWxwZXJCYXNlPjo6dmFsdWUpOwotfQotCi0vLyBUZXN0cyB0aGF0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsIGNvbXBpbGVzIHdoZW4gdGhlIHR5cGUgYXJndW1lbnRzIGFyZQotLy8gZXF1YWwuCi1URVNUKENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsLCBDb21waWxlc1doZW5UeXBlc0FyZUVxdWFsKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIHZvaWQ+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCosIGludCo+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVtb3ZlUmVmZXJlbmNlIGRvZXMgbm90IGFmZmVjdCBub24tcmVmZXJlbmNlIHR5cGVzLgotVEVTVChSZW1vdmVSZWZlcmVuY2VUZXN0LCBEb2VzTm90QWZmZWN0Tm9uUmVmZXJlbmNlVHlwZSkgewotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZVJlZmVyZW5jZTxpbnQ+Ojp0eXBlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyLCBSZW1vdmVSZWZlcmVuY2U8Y29uc3QgY2hhcj46OnR5cGU+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVtb3ZlUmVmZXJlbmNlIHJlbW92ZXMgcmVmZXJlbmNlIGZyb20gcmVmZXJlbmNlIHR5cGVzLgotVEVTVChSZW1vdmVSZWZlcmVuY2VUZXN0LCBSZW1vdmVzUmVmZXJlbmNlKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUmVtb3ZlUmVmZXJlbmNlPGludCY+Ojp0eXBlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyLCBSZW1vdmVSZWZlcmVuY2U8Y29uc3QgY2hhciY+Ojp0eXBlPigpOwotfQotCi0vLyBUZXN0cyBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXZvaWQgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlKCkgewotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVDIpPigpOwotfQotCi1URVNUKFJlbW92ZVJlZmVyZW5jZVRlc3QsIE1hY3JvVmVyc2lvbikgewotICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2U8aW50LCBpbnQ+KCk7Ci0gIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZTxjb25zdCBjaGFyLCBjb25zdCBjaGFyJj4oKTsKLX0KLQotCi0vLyBUZXN0cyB0aGF0IFJlbW92ZUNvbnN0IGRvZXMgbm90IGFmZmVjdCBub24tY29uc3QgdHlwZXMuCi1URVNUKFJlbW92ZUNvbnN0VGVzdCwgRG9lc05vdEFmZmVjdE5vbkNvbnN0VHlwZSkgewotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZUNvbnN0PGludD46OnR5cGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXImLCBSZW1vdmVDb25zdDxjaGFyJj46OnR5cGU+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgUmVtb3ZlQ29uc3QgcmVtb3ZlcyBjb25zdCBmcm9tIGNvbnN0IHR5cGVzLgotVEVTVChSZW1vdmVDb25zdFRlc3QsIFJlbW92ZXNDb25zdCkgewotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZUNvbnN0PGNvbnN0IGludD46OnR5cGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXJbMl0sIFJlbW92ZUNvbnN0PGNvbnN0IGNoYXJbMl0+Ojp0eXBlPigpOwotICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjaGFyWzJdWzNdLCBSZW1vdmVDb25zdDxjb25zdCBjaGFyWzJdWzNdPjo6dHlwZT4oKTsKLX0KLQotLy8gVGVzdHMgR1RFU1RfUkVNT1ZFX0NPTlNUXy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXZvaWQgVGVzdEdUZXN0UmVtb3ZlQ29uc3QoKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRU1PVkVfQ09OU1RfKFQyKT4oKTsKLX0KLQotVEVTVChSZW1vdmVDb25zdFRlc3QsIE1hY3JvVmVyc2lvbikgewotICBUZXN0R1Rlc3RSZW1vdmVDb25zdDxpbnQsIGludD4oKTsKLSAgVGVzdEdUZXN0UmVtb3ZlQ29uc3Q8ZG91YmxlJiwgZG91YmxlJj4oKTsKLSAgVGVzdEdUZXN0UmVtb3ZlQ29uc3Q8Y2hhciwgY29uc3QgY2hhcj4oKTsKLX0KLQotLy8gVGVzdHMgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotdm9pZCBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdCgpIHsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUMik+KCk7Ci19Ci0KLVRFU1QoUmVtb3ZlUmVmZXJlbmNlVG9Db25zdFRlc3QsIFdvcmtzKSB7Ci0gIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGludCwgaW50PigpOwotICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxkb3VibGUsIGRvdWJsZSY+KCk7Ci0gIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGNoYXIsIGNvbnN0IGNoYXI+KCk7Ci0gIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZUFuZENvbnN0PGNoYXIsIGNvbnN0IGNoYXImPigpOwotICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxjb25zdCBjaGFyKiwgY29uc3QgY2hhcio+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQWRkUmVmZXJlbmNlIGRvZXMgbm90IGFmZmVjdCByZWZlcmVuY2UgdHlwZXMuCi1URVNUKEFkZFJlZmVyZW5jZVRlc3QsIERvZXNOb3RBZmZlY3RSZWZlcmVuY2VUeXBlKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCYsIEFkZFJlZmVyZW5jZTxpbnQmPjo6dHlwZT4oKTsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciYsIEFkZFJlZmVyZW5jZTxjb25zdCBjaGFyJj46OnR5cGU+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgQWRkUmVmZXJlbmNlIGFkZHMgcmVmZXJlbmNlIHRvIG5vbi1yZWZlcmVuY2UgdHlwZXMuCi1URVNUKEFkZFJlZmVyZW5jZVRlc3QsIEFkZHNSZWZlcmVuY2UpIHsKLSAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50JiwgQWRkUmVmZXJlbmNlPGludD46OnR5cGU+KCk7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXImLCBBZGRSZWZlcmVuY2U8Y29uc3QgY2hhcj46OnR5cGU+KCk7Ci19Ci0KLS8vIFRlc3RzIEdURVNUX0FERF9SRUZFUkVOQ0VfLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotdm9pZCBUZXN0R1Rlc3RBZGRSZWZlcmVuY2UoKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9BRERfUkVGRVJFTkNFXyhUMik+KCk7Ci19Ci0KLVRFU1QoQWRkUmVmZXJlbmNlVGVzdCwgTWFjcm9WZXJzaW9uKSB7Ci0gIFRlc3RHVGVzdEFkZFJlZmVyZW5jZTxpbnQmLCBpbnQ+KCk7Ci0gIFRlc3RHVGVzdEFkZFJlZmVyZW5jZTxjb25zdCBjaGFyJiwgY29uc3QgY2hhciY+KCk7Ci19Ci0KLS8vIFRlc3RzIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8uCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci12b2lkIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3QoKSB7Ci0gIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfKFQyKT4oKTsKLX0KLQotVEVTVChHVGVzdFJlZmVyZW5jZVRvQ29uc3RUZXN0LCBXb3JrcykgewotICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IGNoYXImLCBjaGFyPigpOwotICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IGludCYsIGNvbnN0IGludD4oKTsKLSAgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdDxjb25zdCBkb3VibGUmLCBkb3VibGU+KCk7Ci0gIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyY+KCk7Ci19Ci0KLS8vIFRlc3RzIHRoYXQgSW1wbGljaXRseUNvbnZlcnRpYmxlPFQxLCBUMj46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgotVEVTVChJbXBsaWNpdGx5Q29udmVydGlibGVUZXN0LCBWYWx1ZUlzQ29tcGlsZVRpbWVDb25zdGFudCkgewotICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQsIGludD46OnZhbHVlKSwgY29uc3RfdHJ1ZSk7Ci0gIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoIUltcGxpY2l0bHlDb252ZXJ0aWJsZTx2b2lkKiwgaW50Kj46OnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2ZhbHNlKTsKLX0KLQotLy8gVGVzdHMgdGhhdCBJbXBsaWNpdGx5Q29udmVydGlibGU8VDEsIFQyPjo6dmFsdWUgaXMgdHJ1ZSB3aGVuIFQxIGNhbgotLy8gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gVDIuCi1URVNUKEltcGxpY2l0bHlDb252ZXJ0aWJsZVRlc3QsIFZhbHVlSXNUcnVlV2hlbkNvbnZlcnRpYmxlKSB7Ci0gIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8aW50LCBkb3VibGU+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGRvdWJsZSwgaW50Pjo6dmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxpbnQqLCB2b2lkKj46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8aW50KiwgY29uc3QgaW50Kj46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8Q29udmVyc2lvbkhlbHBlckRlcml2ZWQmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnZlcnNpb25IZWxwZXJCYXNlJj46OnZhbHVlKSk7Ci0gIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgQ29udmVyc2lvbkhlbHBlckJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbkhlbHBlckJhc2U+Ojp2YWx1ZSkpOwotfQotCi0vLyBUZXN0cyB0aGF0IEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUMSwgVDI+Ojp2YWx1ZSBpcyBmYWxzZSB3aGVuIFQxCi0vLyBjYW5ub3QgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gVDIuCi1URVNUKEltcGxpY2l0bHlDb252ZXJ0aWJsZVRlc3QsIFZhbHVlSXNGYWxzZVdoZW5Ob3RDb252ZXJ0aWJsZSkgewotICBFWFBFQ1RfRkFMU0UoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxkb3VibGUsIGludCo+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfRkFMU0UoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTx2b2lkKiwgaW50Kj46OnZhbHVlKSk7Ci0gIEVYUEVDVF9GQUxTRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IGludCosIGludCo+Ojp2YWx1ZSkpOwotICBFWFBFQ1RfRkFMU0UoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxDb252ZXJzaW9uSGVscGVyQmFzZSYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25IZWxwZXJEZXJpdmVkJj46OnZhbHVlKSk7Ci19Ci0KLS8vIFRlc3RzIElzQ29udGFpbmVyVGVzdC4KLQotY2xhc3MgTm9uQ29udGFpbmVyIHt9OwotCi1URVNUKElzQ29udGFpbmVyVGVzdFRlc3QsIFdvcmtzRm9yTm9uQ29udGFpbmVyKSB7Ci0gIEVYUEVDVF9FUShzaXplb2YoSXNOb3RDb250YWluZXIpLCBzaXplb2YoSXNDb250YWluZXJUZXN0PGludD4oMCkpKTsKLSAgRVhQRUNUX0VRKHNpemVvZihJc05vdENvbnRhaW5lciksIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8Y2hhcls1XT4oMCkpKTsKLSAgRVhQRUNUX0VRKHNpemVvZihJc05vdENvbnRhaW5lciksIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8Tm9uQ29udGFpbmVyPigwKSkpOwotfQotCi1URVNUKElzQ29udGFpbmVyVGVzdFRlc3QsIFdvcmtzRm9yQ29udGFpbmVyKSB7Ci0gIEVYUEVDVF9FUShzaXplb2YoSXNDb250YWluZXIpLAotICAgICAgICAgICAgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxzdGQ6OnZlY3Rvcjxib29sPiA+KDApKSk7Ci0gIEVYUEVDVF9FUShzaXplb2YoSXNDb250YWluZXIpLAotICAgICAgICAgICAgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxzdGQ6Om1hcDxpbnQsIGRvdWJsZT4gPigwKSkpOwotfQotCi0vLyBUZXN0cyBBcnJheUVxKCkuCi0KLVRFU1QoQXJyYXlFcVRlc3QsIFdvcmtzRm9yRGVnZW5lcmF0ZWRBcnJheXMpIHsKLSAgRVhQRUNUX1RSVUUoQXJyYXlFcSg1LCA1TCkpOwotICBFWFBFQ1RfRkFMU0UoQXJyYXlFcSgnYScsIDApKTsKLX0KLQotVEVTVChBcnJheUVxVGVzdCwgV29ya3NGb3JPbmVEaW1lbnNpb25hbEFycmF5cykgewotICAvLyBOb3RlIHRoYXQgYSBhbmQgYiBhcmUgZGlzdGluY3QgYnV0IGNvbXBhdGlibGUgdHlwZXMuCi0gIGNvbnN0IGludCBhW10gPSB7IDAsIDEgfTsKLSAgbG9uZyBiW10gPSB7IDAsIDEgfTsKLSAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7Ci0gIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgMiwgYikpOwotCi0gIGJbMF0gPSAyOwotICBFWFBFQ1RfRkFMU0UoQXJyYXlFcShhLCBiKSk7Ci0gIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIDEsIGIpKTsKLX0KLQotVEVTVChBcnJheUVxVGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbEFycmF5cykgewotICBjb25zdCBjaGFyIGFbXVszXSA9IHsgImhpIiwgImxvIiB9OwotICBjb25zdCBjaGFyIGJbXVszXSA9IHsgImhpIiwgImxvIiB9OwotICBjb25zdCBjaGFyIGNbXVszXSA9IHsgImhpIiwgImxpIiB9OwotCi0gIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYikpOwotICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIDIsIGIpKTsKLQotICBFWFBFQ1RfRkFMU0UoQXJyYXlFcShhLCBjKSk7Ci0gIEVYUEVDVF9GQUxTRShBcnJheUVxKGEsIDIsIGMpKTsKLX0KLQotLy8gVGVzdHMgQXJyYXlBd2FyZUZpbmQoKS4KLQotVEVTVChBcnJheUF3YXJlRmluZFRlc3QsIFdvcmtzRm9yT25lRGltZW5zaW9uYWxBcnJheSkgewotICBjb25zdCBjaGFyIGFbXSA9ICJoZWxsbyI7Ci0gIEVYUEVDVF9FUShhICsgNCwgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDUsICdvJykpOwotICBFWFBFQ1RfRVEoYSArIDUsIEFycmF5QXdhcmVGaW5kKGEsIGEgKyA1LCAneCcpKTsKLX0KLQotVEVTVChBcnJheUF3YXJlRmluZFRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheSkgewotICBpbnQgYVtdWzJdID0geyB7IDAsIDEgfSwgeyAyLCAzIH0sIHsgNCwgNSB9IH07Ci0gIGNvbnN0IGludCBiWzJdID0geyAyLCAzIH07Ci0gIEVYUEVDVF9FUShhICsgMSwgQXJyYXlBd2FyZUZpbmQoYSwgYSArIDMsIGIpKTsKLQotICBjb25zdCBpbnQgY1syXSA9IHsgNiwgNyB9OwotICBFWFBFQ1RfRVEoYSArIDMsIEFycmF5QXdhcmVGaW5kKGEsIGEgKyAzLCBjKSk7Ci19Ci0KLS8vIFRlc3RzIENvcHlBcnJheSgpLgotCi1URVNUKENvcHlBcnJheVRlc3QsIFdvcmtzRm9yRGVnZW5lcmF0ZWRBcnJheXMpIHsKLSAgaW50IG4gPSAwOwotICBDb3B5QXJyYXkoJ2EnLCAmbik7Ci0gIEVYUEVDVF9FUSgnYScsIG4pOwotfQotCi1URVNUKENvcHlBcnJheVRlc3QsIFdvcmtzRm9yT25lRGltZW5zaW9uYWxBcnJheXMpIHsKLSAgY29uc3QgY2hhciBhWzNdID0gImhpIjsKLSAgaW50IGJbM107Ci0jaWZuZGVmIF9fQk9STEFORENfXyAgLy8gQysrQnVpbGRlciBjYW5ub3QgY29tcGlsZSBzb21lIGFycmF5IHNpemUgZGVkdWN0aW9ucy4KLSAgQ29weUFycmF5KGEsICZiKTsKLSAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7Ci0jZW5kaWYKLQotICBpbnQgY1szXTsKLSAgQ29weUFycmF5KGEsIDMsIGMpOwotICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGMpKTsKLX0KLQotVEVTVChDb3B5QXJyYXlUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXlzKSB7Ci0gIGNvbnN0IGludCBhWzJdWzNdID0geyB7IDAsIDEsIDIgfSwgeyAzLCA0LCA1IH0gfTsKLSAgaW50IGJbMl1bM107Ci0jaWZuZGVmIF9fQk9STEFORENfXyAgLy8gQysrQnVpbGRlciBjYW5ub3QgY29tcGlsZSBzb21lIGFycmF5IHNpemUgZGVkdWN0aW9ucy4KLSAgQ29weUFycmF5KGEsICZiKTsKLSAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBiKSk7Ci0jZW5kaWYKLQotICBpbnQgY1syXVszXTsKLSAgQ29weUFycmF5KGEsIDIsIGMpOwotICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGMpKTsKLX0KLQotLy8gVGVzdHMgTmF0aXZlQXJyYXkuCi0KLVRFU1QoTmF0aXZlQXJyYXlUZXN0LCBDb25zdHJ1Y3RvckZyb21BcnJheVdvcmtzKSB7Ci0gIGNvbnN0IGludCBhWzNdID0geyAwLCAxLCAyIH07Ci0gIE5hdGl2ZUFycmF5PGludD4gbmEoYSwgMywgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpKTsKLSAgRVhQRUNUX0VRKDNVLCBuYS5zaXplKCkpOwotICBFWFBFQ1RfRVEoYSwgbmEuYmVnaW4oKSk7Ci19Ci0KLVRFU1QoTmF0aXZlQXJyYXlUZXN0LCBDcmVhdGVzQW5kRGVsZXRlc0NvcHlPZkFycmF5V2hlbkFza2VkVG8pIHsKLSAgdHlwZWRlZiBpbnQgQXJyYXlbMl07Ci0gIEFycmF5KiBhID0gbmV3IEFycmF5WzFdOwotICAoKmEpWzBdID0gMDsKLSAgKCphKVsxXSA9IDE7Ci0gIE5hdGl2ZUFycmF5PGludD4gbmEoKmEsIDIsIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KCkpOwotICBFWFBFQ1RfTkUoKmEsIG5hLmJlZ2luKCkpOwotICBkZWxldGVbXSBhOwotICBFWFBFQ1RfRVEoMCwgbmEuYmVnaW4oKVswXSk7Ci0gIEVYUEVDVF9FUSgxLCBuYS5iZWdpbigpWzFdKTsKLQotICAvLyBXZSByZWx5IG9uIHRoZSBoZWFwIGNoZWNrZXIgdG8gdmVyaWZ5IHRoYXQgbmEgZGVsZXRlcyB0aGUgY29weSBvZgotICAvLyBhcnJheS4KLX0KLQotVEVTVChOYXRpdmVBcnJheVRlc3QsIFR5cGVNZW1iZXJzQXJlQ29ycmVjdCkgewotICBTdGF0aWNBc3NlcnRUeXBlRXE8Y2hhciwgTmF0aXZlQXJyYXk8Y2hhcj46OnZhbHVlX3R5cGU+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnRbMl0sIE5hdGl2ZUFycmF5PGludFsyXT46OnZhbHVlX3R5cGU+KCk7Ci0KLSAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGNoYXIqLCBOYXRpdmVBcnJheTxjaGFyPjo6Y29uc3RfaXRlcmF0b3I+KCk7Ci0gIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBib29sKCopWzJdLCBOYXRpdmVBcnJheTxib29sWzJdPjo6Y29uc3RfaXRlcmF0b3I+KCk7Ci19Ci0KLVRFU1QoTmF0aXZlQXJyYXlUZXN0LCBNZXRob2RzV29yaykgewotICBjb25zdCBpbnQgYVszXSA9IHsgMCwgMSwgMiB9OwotICBOYXRpdmVBcnJheTxpbnQ+IG5hKGEsIDMsIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KCkpOwotICBBU1NFUlRfRVEoM1UsIG5hLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgzLCBuYS5lbmQoKSAtIG5hLmJlZ2luKCkpOwotCi0gIE5hdGl2ZUFycmF5PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmEuYmVnaW4oKTsKLSAgRVhQRUNUX0VRKDAsICppdCk7Ci0gICsraXQ7Ci0gIEVYUEVDVF9FUSgxLCAqaXQpOwotICBpdCsrOwotICBFWFBFQ1RfRVEoMiwgKml0KTsKLSAgKytpdDsKLSAgRVhQRUNUX0VRKG5hLmVuZCgpLCBpdCk7Ci0KLSAgRVhQRUNUX1RSVUUobmEgPT0gbmEpOwotCi0gIE5hdGl2ZUFycmF5PGludD4gbmEyKGEsIDMsIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7Ci0gIEVYUEVDVF9UUlVFKG5hID09IG5hMik7Ci0KLSAgY29uc3QgaW50IGIxWzNdID0geyAwLCAxLCAxIH07Ci0gIGNvbnN0IGludCBiMls0XSA9IHsgMCwgMSwgMiwgMyB9OwotICBFWFBFQ1RfRkFMU0UobmEgPT0gTmF0aXZlQXJyYXk8aW50PihiMSwgMywgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpKSk7Ci0gIEVYUEVDVF9GQUxTRShuYSA9PSBOYXRpdmVBcnJheTxpbnQ+KGIyLCA0LCBSZWxhdGlvblRvU291cmNlQ29weSgpKSk7Ci19Ci0KLVRFU1QoTmF0aXZlQXJyYXlUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXkpIHsKLSAgY29uc3QgY2hhciBhWzJdWzNdID0geyAiaGkiLCAibG8iIH07Ci0gIE5hdGl2ZUFycmF5PGNoYXJbM10+IG5hKGEsIDIsIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7Ci0gIEFTU0VSVF9FUSgyVSwgbmEuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGEsIG5hLmJlZ2luKCkpOwotfQotCi0vLyBUZXN0cyBTa2lwUHJlZml4KCkuCi0KLVRFU1QoU2tpcFByZWZpeFRlc3QsIFNraXBzV2hlblByZWZpeE1hdGNoZXMpIHsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gImhlbGxvIjsKLQotICBjb25zdCBjaGFyKiBwID0gc3RyOwotICBFWFBFQ1RfVFJVRShTa2lwUHJlZml4KCIiLCAmcCkpOwotICBFWFBFQ1RfRVEoc3RyLCBwKTsKLQotICBwID0gc3RyOwotICBFWFBFQ1RfVFJVRShTa2lwUHJlZml4KCJoZWxsIiwgJnApKTsKLSAgRVhQRUNUX0VRKHN0ciArIDQsIHApOwotfQotCi1URVNUKFNraXBQcmVmaXhUZXN0LCBEb2VzTm90U2tpcFdoZW5QcmVmaXhEb2VzTm90TWF0Y2gpIHsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gIndvcmxkIjsKLQotICBjb25zdCBjaGFyKiBwID0gc3RyOwotICBFWFBFQ1RfRkFMU0UoU2tpcFByZWZpeCgiVyIsICZwKSk7Ci0gIEVYUEVDVF9FUShzdHIsIHApOwotCi0gIHAgPSBzdHI7Ci0gIEVYUEVDVF9GQUxTRShTa2lwUHJlZml4KCJ3b3JsZCEiLCAmcCkpOwotICBFWFBFQ1RfRVEoc3RyLCBwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWNlZDQuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKLS8vCi0vLyBndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8gd3JpdGVzIHNvbWUgeG1sIHZpYSBUZXN0UHJvcGVydHkgdXNlZCBieQotLy8gZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLWNsYXNzIFByb3BlcnR5T25lIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIFJlY29yZFByb3BlcnR5KCJTZXRVcFByb3AiLCAxKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duUHJvcCIsIDEpOwotICB9Ci19OwotCi1URVNUX0YoUHJvcGVydHlPbmUsIFRlc3RTb21lUHJvcGVydGllcykgewotICBSZWNvcmRQcm9wZXJ0eSgiVGVzdFNvbWVQcm9wZXJ0eSIsIDEpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYyBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAwYjIuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMl90ZXN0Xy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKLS8vCi0vLyBndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8gd3JpdGVzIHNvbWUgeG1sIHZpYSBUZXN0UHJvcGVydHkgdXNlZCBieQotLy8gZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLWNsYXNzIFByb3BlcnR5VHdvIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIFJlY29yZFByb3BlcnR5KCJTZXRVcFByb3AiLCAyKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duUHJvcCIsIDIpOwotICB9Ci19OwotCi1URVNUX0YoUHJvcGVydHlUd28sIFRlc3RTb21lUHJvcGVydGllcykgewotICBSZWNvcmRQcm9wZXJ0eSgiVGVzdFNvbWVQcm9wZXJ0eSIsIDIpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlc190ZXN0LnB5IGIvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlc190ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjRlNDM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJVbml0IHRlc3QgZm9yIHRoZSBndGVzdF94bWxfb3V0cHV0IG1vZHVsZS4iIiIKLQotX19hdXRob3JfXyA9ICJrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpIgotCi1pbXBvcnQgb3MKLWZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQotCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscwotaW1wb3J0IGd0ZXN0X3htbF90ZXN0X3V0aWxzCi0KLQotR1RFU1RfT1VUUFVUX1NVQkRJUiA9ICJ4bWxfb3V0ZmlsZXMiCi1HVEVTVF9PVVRQVVRfMV9URVNUID0gImd0ZXN0X3htbF9vdXRmaWxlMV90ZXN0XyIKLUdURVNUX09VVFBVVF8yX1RFU1QgPSAiZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfIgotCi1FWFBFQ1RFRF9YTUxfMSA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dGVzdHN1aXRlcyB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiPgotICA8dGVzdHN1aXRlIG5hbWU9IlByb3BlcnR5T25lIiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJUZXN0U29tZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5T25lIiBTZXRVcFByb3A9IjEiIFRlc3RTb21lUHJvcGVydHk9IjEiIFRlYXJEb3duUHJvcD0iMSIgLz4KLSAgPC90ZXN0c3VpdGU+Ci08L3Rlc3RzdWl0ZXM+Ci0iIiIKLQotRVhQRUNURURfWE1MXzIgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRlc3RzdWl0ZXMgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIiB0aW1lc3RhbXA9IioiIG5hbWU9IkFsbFRlc3RzIj4KLSAgPHRlc3RzdWl0ZSBuYW1lPSJQcm9wZXJ0eVR3byIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iVGVzdFNvbWVQcm9wZXJ0aWVzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eVR3byIgU2V0VXBQcm9wPSIyIiBUZXN0U29tZVByb3BlcnR5PSIyIiBUZWFyRG93blByb3A9IjIiIC8+Ci0gIDwvdGVzdHN1aXRlPgotPC90ZXN0c3VpdGVzPgotIiIiCi0KLQotY2xhc3MgR1Rlc3RYTUxPdXRGaWxlc1Rlc3QoZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMuR1Rlc3RYTUxUZXN0Q2FzZSk6Ci0gICIiIlVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyBYTUwgb3V0cHV0IGZ1bmN0aW9uYWxpdHkuIiIiCi0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICMgV2Ugd2FudCB0aGUgdHJhaWxpbmcgJy8nIHRoYXQgdGhlIGxhc3QgIiIgcHJvdmlkZXMgaW4gb3MucGF0aC5qb2luLCBmb3IKLSAgICAjIHRlbGxpbmcgR29vZ2xlIFRlc3QgdG8gY3JlYXRlIGFuIG91dHB1dCBkaXJlY3RvcnkgaW5zdGVhZCBvZiBhIHNpbmdsZSBmaWxlCi0gICAgIyBmb3IgeG1sIG91dHB1dC4KLSAgICBzZWxmLm91dHB1dF9kaXJfID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfT1VUUFVUX1NVQkRJUiwgIiIpCi0gICAgc2VsZi5EZWxldGVGaWxlc0FuZERpcigpCi0KLSAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgIHNlbGYuRGVsZXRlRmlsZXNBbmREaXIoKQotCi0gIGRlZiBEZWxldGVGaWxlc0FuZERpcihzZWxmKToKLSAgICB0cnk6Ci0gICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpcl8sIEdURVNUX09VVFBVVF8xX1RFU1QgKyAiLnhtbCIpKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgIHBhc3MKLSAgICB0cnk6Ci0gICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpcl8sIEdURVNUX09VVFBVVF8yX1RFU1QgKyAiLnhtbCIpKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgIHBhc3MKLSAgICB0cnk6Ci0gICAgICBvcy5ybWRpcihzZWxmLm91dHB1dF9kaXJfKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgIHBhc3MKLQotICBkZWYgdGVzdE91dGZpbGUxKHNlbGYpOgotICAgIHNlbGYuX1Rlc3RPdXRGaWxlKEdURVNUX09VVFBVVF8xX1RFU1QsIEVYUEVDVEVEX1hNTF8xKQotCi0gIGRlZiB0ZXN0T3V0ZmlsZTIoc2VsZik6Ci0gICAgc2VsZi5fVGVzdE91dEZpbGUoR1RFU1RfT1VUUFVUXzJfVEVTVCwgRVhQRUNURURfWE1MXzIpCi0KLSAgZGVmIF9UZXN0T3V0RmlsZShzZWxmLCB0ZXN0X25hbWUsIGV4cGVjdGVkX3htbCk6Ci0gICAgZ3Rlc3RfcHJvZ19wYXRoID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgodGVzdF9uYW1lKQotICAgIGNvbW1hbmQgPSBbZ3Rlc3RfcHJvZ19wYXRoLCAiLS1ndGVzdF9vdXRwdXQ9eG1sOiVzIiAlIHNlbGYub3V0cHV0X2Rpcl9dCi0gICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19kaXI9Z3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCkpCi0gICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIHAuZXhpdF9jb2RlKQotCi0gICAgIyBUT0RPKHdhbkBnb29nbGUuY29tKTogbGlidG9vbCBjYXVzZXMgdGhlIGJ1aWx0IHRlc3QgYmluYXJ5IHRvIGJlCi0gICAgIyAgIG5hbWVkIGx0LWd0ZXN0X3htbF9vdXRmaWxlc190ZXN0XyBpbnN0ZWFkIG9mCi0gICAgIyAgIGd0ZXN0X3htbF9vdXRmaWxlc190ZXN0Xy4gIFRvIGFjY291bnQgZm9yIHRoaXMgcG9zc2liaWxsaXR5LCB3ZQotICAgICMgICBhbGxvdyBib3RoIG5hbWVzIGluIHRoZSBmb2xsb3dpbmcgY29kZS4gIFdlIHNob3VsZCByZW1vdmUgdGhpcwotICAgICMgICBoYWNrIHdoZW4gQ2hhbmRsZXIgQ2FycnV0aCdzIGxpYnRvb2wgcmVwbGFjZW1lbnQgdG9vbCBpcyByZWFkeS4KLSAgICBvdXRwdXRfZmlsZV9uYW1lMSA9IHRlc3RfbmFtZSArICIueG1sIgotICAgIG91dHB1dF9maWxlMSA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBvdXRwdXRfZmlsZV9uYW1lMSkKLSAgICBvdXRwdXRfZmlsZV9uYW1lMiA9ICdsdC0nICsgb3V0cHV0X2ZpbGVfbmFtZTEKLSAgICBvdXRwdXRfZmlsZTIgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyXywgb3V0cHV0X2ZpbGVfbmFtZTIpCi0gICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNmaWxlKG91dHB1dF9maWxlMSkgb3Igb3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUyKSwKLSAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUxKQotCi0gICAgZXhwZWN0ZWQgPSBtaW5pZG9tLnBhcnNlU3RyaW5nKGV4cGVjdGVkX3htbCkKLSAgICBpZiBvcy5wYXRoLmlzZmlsZShvdXRwdXRfZmlsZTEpOgotICAgICAgYWN0dWFsID0gbWluaWRvbS5wYXJzZShvdXRwdXRfZmlsZTEpCi0gICAgZWxzZToKLSAgICAgIGFjdHVhbCA9IG1pbmlkb20ucGFyc2Uob3V0cHV0X2ZpbGUyKQotICAgIHNlbGYuTm9ybWFsaXplWG1sKGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCi0gICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoZXhwZWN0ZWQuZG9jdW1lbnRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCi0gICAgZXhwZWN0ZWQudW5saW5rKCkKLSAgICBhY3R1YWwudW5saW5rKCkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBvcy5lbnZpcm9uWyJHVEVTVF9TVEFDS19UUkFDRV9ERVBUSCJdID0gIjAiCi0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdC5weSBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjA1ZDRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlVuaXQgdGVzdCBmb3IgdGhlIGd0ZXN0X3htbF9vdXRwdXQgbW9kdWxlIiIiCi0KLV9fYXV0aG9yX18gPSAnZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpJwotCi1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBlcnJubwotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLWZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQotCi1pbXBvcnQgZ3Rlc3RfdGVzdF91dGlscwotaW1wb3J0IGd0ZXN0X3htbF90ZXN0X3V0aWxzCi0KLQotR1RFU1RfRklMVEVSX0ZMQUcgPSAnLS1ndGVzdF9maWx0ZXInCi1HVEVTVF9MSVNUX1RFU1RTX0ZMQUcgPSAnLS1ndGVzdF9saXN0X3Rlc3RzJwotR1RFU1RfT1VUUFVUX0ZMQUcgICAgICAgICA9ICItLWd0ZXN0X291dHB1dCIKLUdURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSAidGVzdF9kZXRhaWwueG1sIgotR1RFU1RfUFJPR1JBTV9OQU1FID0gImd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfIgotCi1TVVBQT1JUU19TVEFDS19UUkFDRVMgPSBGYWxzZQotCi1pZiBTVVBQT1JUU19TVEFDS19UUkFDRVM6Ci0gIFNUQUNLX1RSQUNFX1RFTVBMQVRFID0gJ1xuU3RhY2sgdHJhY2U6XG4qJwotZWxzZToKLSAgU1RBQ0tfVFJBQ0VfVEVNUExBVEUgPSAnJwotCi1FWFBFQ1RFRF9OT05fRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZXN0c3VpdGVzIHRlc3RzPSIyMyIgZmFpbHVyZXM9IjQiIGRpc2FibGVkPSIyIiBlcnJvcnM9IjAiIHRpbWU9IioiIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiIGFkX2hvY19wcm9wZXJ0eT0iNDIiPgotICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJTdWNjZWVkcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU3VjY2Vzc2Z1bFRlc3QiLz4KLSAgPC90ZXN0c3VpdGU+Ci0gIDx0ZXN0c3VpdGUgbmFtZT0iRmFpbGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iRmFpbHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkZhaWxlZFRlc3QiPgotICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO1ZhbHVlIG9mOiAyJiN4MEE7RXhwZWN0ZWQ6IDEiIHR5cGU9IiI+PCFbQ0RBVEFbZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KgotVmFsdWUgb2Y6IDIKLUV4cGVjdGVkOiAxJShzdGFjaylzXV0+PC9mYWlsdXJlPgotICAgIDwvdGVzdGNhc2U+Ci0gIDwvdGVzdHN1aXRlPgotICA8dGVzdHN1aXRlIG5hbWU9Ik1peGVkUmVzdWx0VGVzdCIgdGVzdHM9IjMiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMSIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iU3VjY2VlZHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik1peGVkUmVzdWx0VGVzdCIvPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJGYWlscyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTWl4ZWRSZXN1bHRUZXN0Ij4KLSAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMiYjeDBBO0V4cGVjdGVkOiAxIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKLVZhbHVlIG9mOiAyCi1FeHBlY3RlZDogMSUoc3RhY2spc11dPjwvZmFpbHVyZT4KLSAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMyYjeDBBO0V4cGVjdGVkOiAyIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKLVZhbHVlIG9mOiAzCi1FeHBlY3RlZDogMiUoc3RhY2spc11dPjwvZmFpbHVyZT4KLSAgICA8L3Rlc3RjYXNlPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJESVNBQkxFRF90ZXN0IiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJNaXhlZFJlc3VsdFRlc3QiLz4KLSAgPC90ZXN0c3VpdGU+Ci0gIDx0ZXN0c3VpdGUgbmFtZT0iWG1sUXVvdGluZ1Rlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+Ci0gICAgPHRlc3RjYXNlIG5hbWU9Ik91dHB1dHNDRGF0YSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iWG1sUXVvdGluZ1Rlc3QiPgotICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO0ZhaWxlZCYjeDBBO1hNTCBvdXRwdXQ6ICZsdDs/eG1sIGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7Jmd0OyZsdDt0b3AmZ3Q7Jmx0OyFbQ0RBVEFbY2RhdGEgdGV4dF1dJmd0OyZsdDsvdG9wJmd0OyIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCi1GYWlsZWQKLVhNTCBvdXRwdXQ6IDw/eG1sIGVuY29kaW5nPSJ1dGYtOCI+PHRvcD48IVtDREFUQVtjZGF0YSB0ZXh0XV0+XV0mZ3Q7PCFbQ0RBVEFbPC90b3A+JShzdGFjaylzXV0+PC9mYWlsdXJlPgotICAgIDwvdGVzdGNhc2U+Ci0gIDwvdGVzdHN1aXRlPgotICA8dGVzdHN1aXRlIG5hbWU9IkludmFsaWRDaGFyYWN0ZXJzVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iSW52YWxpZENoYXJhY3RlcnNJbk1lc3NhZ2UiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkludmFsaWRDaGFyYWN0ZXJzVGVzdCI+Ci0gICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqJiN4MEE7RmFpbGVkJiN4MEE7SW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtdIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKLUZhaWxlZAotSW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtdJShzdGFjaylzXV0+PC9mYWlsdXJlPgotICAgIDwvdGVzdGNhc2U+Ci0gIDwvdGVzdHN1aXRlPgotICA8dGVzdHN1aXRlIG5hbWU9IkRpc2FibGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMSIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iRElTQUJMRURfdGVzdF9ub3RfcnVuIiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJEaXNhYmxlZFRlc3QiLz4KLSAgPC90ZXN0c3VpdGU+Ci0gIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlSZWNvcmRpbmdUZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiIFNldFVwVGVzdENhc2U9InllcyIgVGVhckRvd25UZXN0Q2FzZT0iYXllIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iT25lUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiLz4KLSAgICA8dGVzdGNhc2UgbmFtZT0iSW50VmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5X2ludD0iMSIvPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJUaHJlZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiIGtleV8yPSIyIiBrZXlfMz0iMyIvPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eVJlY29yZGluZ1Rlc3QiIGtleV8xPSIyIi8+Ci0gIDwvdGVzdHN1aXRlPgotICA8dGVzdHN1aXRlIG5hbWU9Ik5vRml4dHVyZVRlc3QiIHRlc3RzPSIzIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+Ci0gICAgIDx0ZXN0Y2FzZSBuYW1lPSJSZWNvcmRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5PSIxIi8+Ci0gICAgIDx0ZXN0Y2FzZSBuYW1lPSJFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5X2Zvcl91dGlsaXR5X2ludD0iMSIvPgotICAgICA8dGVzdGNhc2UgbmFtZT0iRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkU3RyaW5nVmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik5vRml4dHVyZVRlc3QiIGtleV9mb3JfdXRpbGl0eV9zdHJpbmc9IjEiLz4KLSAgPC90ZXN0c3VpdGU+Ci0gIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgotICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgotICA8L3Rlc3RzdWl0ZT4KLSAgPHRlc3RzdWl0ZSBuYW1lPSJUeXBlZFRlc3QvMCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJUeXBlZFRlc3QvMCIgLz4KLSAgPC90ZXN0c3VpdGU+Ci0gIDx0ZXN0c3VpdGUgbmFtZT0iVHlwZWRUZXN0LzEiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+Ci0gICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iVHlwZWRUZXN0LzEiIC8+Ci0gIDwvdGVzdHN1aXRlPgotICA8dGVzdHN1aXRlIG5hbWU9IlNpbmdsZS9UeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLzAiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+Ci0gICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMCIgLz4KLSAgPC90ZXN0c3VpdGU+Ci0gIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KLSAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTaW5nbGUvVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZS8xIiAvPgotICA8L3Rlc3RzdWl0ZT4KLTwvdGVzdHN1aXRlcz4iIiIgJSB7J3N0YWNrJzogU1RBQ0tfVFJBQ0VfVEVNUExBVEV9Ci0KLUVYUEVDVEVEX0ZJTFRFUkVEX1RFU1RfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIKLSAgICAgICAgICAgIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiIGFkX2hvY19wcm9wZXJ0eT0iNDIiPgotICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIgotICAgICAgICAgICAgIGVycm9ycz0iMCIgdGltZT0iKiI+Ci0gICAgPHRlc3RjYXNlIG5hbWU9IlN1Y2NlZWRzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTdWNjZXNzZnVsVGVzdCIvPgotICA8L3Rlc3RzdWl0ZT4KLTwvdGVzdHN1aXRlcz4iIiIKLQotRVhQRUNURURfRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZXN0c3VpdGVzIHRlc3RzPSIwIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIKLSAgICAgICAgICAgIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiPgotPC90ZXN0c3VpdGVzPiIiIgotCi1HVEVTVF9QUk9HUkFNX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChHVEVTVF9QUk9HUkFNX05BTUUpCi0KLVNVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAotICAgIFtHVEVTVF9QUk9HUkFNX1BBVEgsIEdURVNUX0xJU1RfVEVTVFNfRkxBR10sIGNhcHR1cmVfc3RkZXJyPUZhbHNlKS5vdXRwdXQKLQotCi1jbGFzcyBHVGVzdFhNTE91dHB1dFVuaXRUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgotICAiIiIKLSAgVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgZnVuY3Rpb25hbGl0eS4KLSAgIiIiCi0KLSAgIyBUaGlzIHRlc3QgY3VycmVudGx5IGJyZWFrcyBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0eXBlZCBhbmQKLSAgIyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHNvIHdlIGRvbid0IHJ1biBpdCB1bmRlciB0aGVtLgotICBpZiBTVVBQT1JUU19UWVBFRF9URVNUUzoKLSAgICBkZWYgdGVzdE5vbkVtcHR5WG1sT3V0cHV0KHNlbGYpOgotICAgICAgIiIiCi0gICAgICBSdW5zIGEgdGVzdCBwcm9ncmFtIHRoYXQgZ2VuZXJhdGVzIGEgbm9uLWVtcHR5IFhNTCBvdXRwdXQsIGFuZAotICAgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KLSAgICAgICIiIgotICAgICAgc2VsZi5fVGVzdFhtbE91dHB1dChHVEVTVF9QUk9HUkFNX05BTUUsIEVYUEVDVEVEX05PTl9FTVBUWV9YTUwsIDEpCi0KLSAgZGVmIHRlc3RFbXB0eVhtbE91dHB1dChzZWxmKToKLSAgICAiIiJWZXJpZmllcyBYTUwgb3V0cHV0IGZvciBhIEdvb2dsZSBUZXN0IGJpbmFyeSB3aXRob3V0IGFjdHVhbCB0ZXN0cy4KLQotICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kCi0gICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KLSAgICAiIiIKLQotICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnLCBFWFBFQ1RFRF9FTVBUWV9YTUwsIDApCi0KLSAgZGVmIHRlc3RUaW1lc3RhbXBWYWx1ZShzZWxmKToKLSAgICAiIiJDaGVja3Mgd2hldGhlciB0aGUgdGltZXN0YW1wIGF0dHJpYnV0ZSBpbiB0aGUgWE1MIG91dHB1dCBpcyB2YWxpZC4KLQotICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kIGNoZWNrcyBpZgotICAgIHRoZSB0aW1lc3RhbXAgYXR0cmlidXRlIGluIHRoZSB0ZXN0c3VpdGVzIHRhZyBpcyB2YWxpZC4KLSAgICAiIiIKLSAgICBhY3R1YWwgPSBzZWxmLl9HZXRYbWxPdXRwdXQoJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnLCBbXSwgMCkKLSAgICBkYXRlX3RpbWVfc3RyID0gYWN0dWFsLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCd0aW1lc3RhbXAnKS52YWx1ZQotICAgICMgZGF0ZXRpbWUuc3RycHRpbWUoKSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBQeXRob24gMi41KyBzbyB3ZSBoYXZlIHRvCi0gICAgIyBwYXJzZSB0aGUgZXhwZWN0ZWQgZGF0ZXRpbWUgbWFudWFsbHkuCi0gICAgbWF0Y2ggPSByZS5tYXRjaChyJyhcZCspLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKTooXGRcZCknLCBkYXRlX3RpbWVfc3RyKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgcmUubWF0Y2gsCi0gICAgICAgICdYTUwgZGF0ZXR0aW1lIHN0cmluZyAlcyBoYXMgaW5jb3JyZWN0IGZvcm1hdCcgJSBkYXRlX3RpbWVfc3RyKQotICAgIGRhdGVfdGltZV9mcm9tX3htbCA9IGRhdGV0aW1lLmRhdGV0aW1lKAotICAgICAgICB5ZWFyPWludChtYXRjaC5ncm91cCgxKSksIG1vbnRoPWludChtYXRjaC5ncm91cCgyKSksCi0gICAgICAgIGRheT1pbnQobWF0Y2guZ3JvdXAoMykpLCBob3VyPWludChtYXRjaC5ncm91cCg0KSksCi0gICAgICAgIG1pbnV0ZT1pbnQobWF0Y2guZ3JvdXAoNSkpLCBzZWNvbmQ9aW50KG1hdGNoLmdyb3VwKDYpKSkKLQotICAgIHRpbWVfZGVsdGEgPSBhYnMoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgLSBkYXRlX3RpbWVfZnJvbV94bWwpCi0gICAgIyB0aW1lc3RhbXAgdmFsdWUgc2hvdWxkIGJlIG5lYXIgdGhlIGN1cnJlbnQgbG9jYWwgdGltZQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lX2RlbHRhIDwgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9NjAwKSwKLSAgICAgICAgICAgICAgICAgICAgJ3RpbWVfZGVsdGEgaXMgJXMnICUgdGltZV9kZWx0YSkKLSAgICBhY3R1YWwudW5saW5rKCkKLQotICBkZWYgdGVzdERlZmF1bHRPdXRwdXRGaWxlKHNlbGYpOgotICAgICIiIgotICAgIENvbmZpcm1zIHRoYXQgR29vZ2xlIFRlc3QgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCBmaWxlIHdpdGggdGhlIGV4cGVjdGVkCi0gICAgZGVmYXVsdCBuYW1lIGlmIG5vIG5hbWUgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0gICAgIiIiCi0gICAgb3V0cHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfREVGQVVMVF9PVVRQVVRfRklMRSkKLSAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKLSAgICAgICAgJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnKQotICAgIHRyeToKLSAgICAgIG9zLnJlbW92ZShvdXRwdXRfZmlsZSkKLSAgICBleGNlcHQgT1NFcnJvciwgZToKLSAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgotICAgICAgICByYWlzZQotCi0gICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKLSAgICAgICAgW2d0ZXN0X3Byb2dfcGF0aCwgJyVzPXhtbCcgJSBHVEVTVF9PVVRQVVRfRkxBR10sCi0gICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQotICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKLSAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKLSAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUpKQotCi0gIGRlZiB0ZXN0U3VwcHJlc3NlZFhtbE91dHB1dChzZWxmKToKLSAgICAiIiIKLSAgICBUZXN0cyB0aGF0IG5vIFhNTCBmaWxlIGlzIGdlbmVyYXRlZCBpZiB0aGUgZGVmYXVsdCBYTUwgbGlzdGVuZXIgaXMKLSAgICBzaHV0IGRvd24gYmVmb3JlIFJVTl9BTExfVEVTVFMgaXMgaW52b2tlZC4KLSAgICAiIiIKLQotICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BST0dSQU1fTkFNRSArICdvdXQueG1sJykKLSAgICBpZiBvcy5wYXRoLmlzZmlsZSh4bWxfcGF0aCk6Ci0gICAgICBvcy5yZW1vdmUoeG1sX3BhdGgpCi0KLSAgICBjb21tYW5kID0gW0dURVNUX1BST0dSQU1fUEFUSCwKLSAgICAgICAgICAgICAgICclcz14bWw6JXMnICUgKEdURVNUX09VVFBVVF9GTEFHLCB4bWxfcGF0aCksCi0gICAgICAgICAgICAgICAnLS1zaHV0X2Rvd25feG1sJ10KLSAgICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCi0gICAgaWYgcC50ZXJtaW5hdGVkX2J5X3NpZ25hbDoKLSAgICAgICMgcC5zaWduYWwgaXMgYXZhbGFibGUgb25seSBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsIGlzIFRydWUuCi0gICAgICBzZWxmLmFzc2VydEZhbHNlKAotICAgICAgICAgIHAudGVybWluYXRlZF9ieV9zaWduYWwsCi0gICAgICAgICAgJyVzIHdhcyBraWxsZWQgYnkgc2lnbmFsICVkJyAlIChHVEVTVF9QUk9HUkFNX05BTUUsIHAuc2lnbmFsKSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgcC5leGl0X2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleGl0ZWQgd2l0aCBjb2RlICVzLCB3aGljaCBkb2Vzbid0IG1hdGNoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgZXhwZWN0ZWQgZXhpdCBjb2RlICVzLicKLSAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbW1hbmQsIHAuZXhpdF9jb2RlLCAxKSkKLQotICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5pc2ZpbGUoeG1sX3BhdGgpKQotCi0gIGRlZiB0ZXN0RmlsdGVyZWRUZXN0WG1sT3V0cHV0KHNlbGYpOgotICAgICIiIlZlcmlmaWVzIFhNTCBvdXRwdXQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkLgotCi0gICAgUnVucyBhIHRlc3QgcHJvZ3JhbSB0aGF0IGV4ZWN1dGVzIG9ubHkgc29tZSB0ZXN0cyBhbmQgdmVyaWZpZXMgdGhhdAotICAgIG5vbi1zZWxlY3RlZCB0ZXN0cyBkbyBub3Qgc2hvdyB1cCBpbiB0aGUgWE1MIG91dHB1dC4KLSAgICAiIiIKLQotICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoR1RFU1RfUFJPR1JBTV9OQU1FLCBFWFBFQ1RFRF9GSUxURVJFRF9URVNUX1hNTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3M9Wyclcz1TdWNjZXNzZnVsVGVzdC4qJyAlIEdURVNUX0ZJTFRFUl9GTEFHXSkKLQotICBkZWYgX0dldFhtbE91dHB1dChzZWxmLCBndGVzdF9wcm9nX25hbWUsIGV4dHJhX2FyZ3MsIGV4cGVjdGVkX2V4aXRfY29kZSk6Ci0gICAgIiIiCi0gICAgUmV0dXJucyB0aGUgeG1sIG91dHB1dCBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbSBndGVzdF9wcm9nX25hbWUuCi0gICAgRnVydGhlcm1vcmUsIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIG11c3QgYmUgZXhwZWN0ZWRfZXhpdF9jb2RlLgotICAgICIiIgotICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X3Byb2dfbmFtZSArICdvdXQueG1sJykKLSAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChndGVzdF9wcm9nX25hbWUpCi0KLSAgICBjb21tYW5kID0gKFtndGVzdF9wcm9nX3BhdGgsICclcz14bWw6JXMnICUgKEdURVNUX09VVFBVVF9GTEFHLCB4bWxfcGF0aCldICsKLSAgICAgICAgICAgICAgIGV4dHJhX2FyZ3MpCi0gICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQotICAgIGlmIHAudGVybWluYXRlZF9ieV9zaWduYWw6Ci0gICAgICBzZWxmLmFzc2VydF8oRmFsc2UsCi0gICAgICAgICAgICAgICAgICAgJyVzIHdhcyBraWxsZWQgYnkgc2lnbmFsICVkJyAlIChndGVzdF9wcm9nX25hbWUsIHAuc2lnbmFsKSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfZXhpdF9jb2RlLCBwLmV4aXRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGV4aXRlZCB3aXRoIGNvZGUgJXMsIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBleHBlY3RlZCBleGl0IGNvZGUgJXMuJwotICAgICAgICAgICAgICAgICAgICAgICAgJSAoY29tbWFuZCwgcC5leGl0X2NvZGUsIGV4cGVjdGVkX2V4aXRfY29kZSkpCi0gICAgYWN0dWFsID0gbWluaWRvbS5wYXJzZSh4bWxfcGF0aCkKLSAgICByZXR1cm4gYWN0dWFsCi0KLSAgZGVmIF9UZXN0WG1sT3V0cHV0KHNlbGYsIGd0ZXN0X3Byb2dfbmFtZSwgZXhwZWN0ZWRfeG1sLAotICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXhpdF9jb2RlLCBleHRyYV9hcmdzPU5vbmUpOgotICAgICIiIgotICAgIEFzc2VydHMgdGhhdCB0aGUgWE1MIGRvY3VtZW50IGdlbmVyYXRlZCBieSBydW5uaW5nIHRoZSBwcm9ncmFtCi0gICAgZ3Rlc3RfcHJvZ19uYW1lIG1hdGNoZXMgZXhwZWN0ZWRfeG1sLCBhIHN0cmluZyBjb250YWluaW5nIGFub3RoZXIKLSAgICBYTUwgZG9jdW1lbnQuICBGdXJ0aGVybW9yZSwgdGhlIHByb2dyYW0ncyBleGl0IGNvZGUgbXVzdCBiZQotICAgIGV4cGVjdGVkX2V4aXRfY29kZS4KLSAgICAiIiIKLQotICAgIGFjdHVhbCA9IHNlbGYuX0dldFhtbE91dHB1dChndGVzdF9wcm9nX25hbWUsIGV4dHJhX2FyZ3Mgb3IgW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V4aXRfY29kZSkKLSAgICBleHBlY3RlZCA9IG1pbmlkb20ucGFyc2VTdHJpbmcoZXhwZWN0ZWRfeG1sKQotICAgIHNlbGYuTm9ybWFsaXplWG1sKGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCi0gICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoZXhwZWN0ZWQuZG9jdW1lbnRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCi0gICAgZXhwZWN0ZWQudW5saW5rKCkKLSAgICBhY3R1YWwudW5saW5rKCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBvcy5lbnZpcm9uWydHVEVTVF9TVEFDS19UUkFDRV9ERVBUSCddID0gJzEnCi0gIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2MgYi90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yjg3NzEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKLQotLy8gVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCBYTUwgb3V0cHV0LgotLy8KLS8vIEEgdXNlciBjYW4gc3BlY2lmeSBYTUwgb3V0cHV0IGluIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0byBydW4gdmlhCi0vLyBlaXRoZXIgdGhlIEdURVNUX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgLS1ndGVzdF9vdXRwdXQKLS8vIGZsYWcuICBUaGlzIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3VjaCBmdW5jdGlvbmFsaXR5LgotLy8KLS8vIFRoaXMgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuICBEb24ndCBydW4gaXQKLS8vIGRpcmVjdGx5LgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOwotdXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VGVzdDsKLXVzaW5nIDo6dGVzdGluZzo6VmFsdWVzOwotCi1jbGFzcyBTdWNjZXNzZnVsVGVzdCA6IHB1YmxpYyBUZXN0IHsKLX07Ci0KLVRFU1RfRihTdWNjZXNzZnVsVGVzdCwgU3VjY2VlZHMpIHsKLSAgU1VDQ0VFRCgpIDw8ICJUaGlzIGlzIGEgc3VjY2Vzcy4iOwotICBBU1NFUlRfRVEoMSwgMSk7Ci19Ci0KLWNsYXNzIEZhaWxlZFRlc3QgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1URVNUX0YoRmFpbGVkVGVzdCwgRmFpbHMpIHsKLSAgQVNTRVJUX0VRKDEsIDIpOwotfQotCi1jbGFzcyBEaXNhYmxlZFRlc3QgOiBwdWJsaWMgVGVzdCB7Ci19OwotCi1URVNUX0YoRGlzYWJsZWRUZXN0LCBESVNBQkxFRF90ZXN0X25vdF9ydW4pIHsKLSAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4iOwotfQotCi1URVNUKE1peGVkUmVzdWx0VGVzdCwgU3VjY2VlZHMpIHsKLSAgRVhQRUNUX0VRKDEsIDEpOwotICBBU1NFUlRfRVEoMSwgMSk7Ci19Ci0KLVRFU1QoTWl4ZWRSZXN1bHRUZXN0LCBGYWlscykgewotICBFWFBFQ1RfRVEoMSwgMik7Ci0gIEFTU0VSVF9FUSgyLCAzKTsKLX0KLQotVEVTVChNaXhlZFJlc3VsdFRlc3QsIERJU0FCTEVEX3Rlc3QpIHsKLSAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4iOwotfQotCi1URVNUKFhtbFF1b3RpbmdUZXN0LCBPdXRwdXRzQ0RhdGEpIHsKLSAgRkFJTCgpIDw8ICJYTUwgb3V0cHV0OiAiCi0gICAgICAgICAgICAiPD94bWwgZW5jb2Rpbmc9XCJ1dGYtOFwiPjx0b3A+PCFbQ0RBVEFbY2RhdGEgdGV4dF1dPjwvdG9wPiI7Ci19Ci0KLS8vIEhlbHBzIHRvIHRlc3QgdGhhdCBpbnZhbGlkIGNoYXJhY3RlcnMgcHJvZHVjZWQgYnkgdGVzdCBjb2RlIGRvIG5vdCBtYWtlCi0vLyBpdCBpbnRvIHRoZSBYTUwgZmlsZS4KLVRFU1QoSW52YWxpZENoYXJhY3RlcnNUZXN0LCBJbnZhbGlkQ2hhcmFjdGVyc0luTWVzc2FnZSkgewotICBGQUlMKCkgPDwgIkludmFsaWQgY2hhcmFjdGVycyBpbiBicmFja2V0cyBbXHgxXHgyXSI7Ci19Ci0KLWNsYXNzIFByb3BlcnR5UmVjb3JkaW5nVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7IFJlY29yZFByb3BlcnR5KCJTZXRVcFRlc3RDYXNlIiwgInllcyIpOyB9Ci0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7IFJlY29yZFByb3BlcnR5KCJUZWFyRG93blRlc3RDYXNlIiwgImF5ZSIpOyB9Ci19OwotCi1URVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBPbmVQcm9wZXJ0eSkgewotICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOwotfQotCi1URVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBJbnRWYWx1ZWRQcm9wZXJ0eSkgewotICBSZWNvcmRQcm9wZXJ0eSgia2V5X2ludCIsIDEpOwotfQotCi1URVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBUaHJlZVByb3BlcnRpZXMpIHsKLSAgUmVjb3JkUHJvcGVydHkoImtleV8xIiwgIjEiKTsKLSAgUmVjb3JkUHJvcGVydHkoImtleV8yIiwgIjIiKTsKLSAgUmVjb3JkUHJvcGVydHkoImtleV8zIiwgIjMiKTsKLX0KLQotVEVTVF9GKFByb3BlcnR5UmVjb3JkaW5nVGVzdCwgVHdvVmFsdWVzRm9yT25lS2V5VXNlc0xhc3RWYWx1ZSkgewotICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOwotICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMiIpOwotfQotCi1URVNUKE5vRml4dHVyZVRlc3QsIFJlY29yZFByb3BlcnR5KSB7Ci0gIFJlY29yZFByb3BlcnR5KCJrZXkiLCAiMSIpOwotfQotCi12b2lkIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCB2YWx1ZSkgewotICB0ZXN0aW5nOjpUZXN0OjpSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLX0KLQotdm9pZCBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgdGVzdGluZzo6VGVzdDo6UmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci19Ci0KLVRFU1QoTm9GaXh0dXJlVGVzdCwgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkSW50VmFsdWVkUHJvcGVydHkpIHsKLSAgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkUHJvcGVydHkoImtleV9mb3JfdXRpbGl0eV9pbnQiLCAxKTsKLX0KLQotVEVTVChOb0ZpeHR1cmVUZXN0LCBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRTdHJpbmdWYWx1ZWRQcm9wZXJ0eSkgewotICBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRQcm9wZXJ0eSgia2V5X2Zvcl91dGlsaXR5X3N0cmluZyIsICIxIik7Ci19Ci0KLS8vIFZlcmlmaWVzIHRoYXQgdGhlIHRlc3QgcGFyYW1ldGVyIHZhbHVlIGlzIG91dHB1dCBpbiB0aGUgJ3ZhbHVlX3BhcmFtJwotLy8gWE1MIGF0dHJpYnV0ZSBmb3IgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLWNsYXNzIFZhbHVlUGFyYW1UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7fTsKLVRFU1RfUChWYWx1ZVBhcmFtVGVzdCwgSGFzVmFsdWVQYXJhbUF0dHJpYnV0ZSkge30KLVRFU1RfUChWYWx1ZVBhcmFtVGVzdCwgQW5vdGhlclRlc3RUaGF0SGFzVmFsdWVQYXJhbUF0dHJpYnV0ZSkge30KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNpbmdsZSwgVmFsdWVQYXJhbVRlc3QsIFZhbHVlcygzMywgNDIpKTsKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCi0vLyBWZXJpZmllcyB0aGF0IHRoZSB0eXBlIHBhcmFtZXRlciBuYW1lIGlzIG91dHB1dCBpbiB0aGUgJ3R5cGVfcGFyYW0nCi0vLyBYTUwgYXR0cmlidXRlIGZvciB0eXBlZCB0ZXN0cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUeXBlZFRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBsb25nPiBUeXBlZFRlc3RUeXBlczsKLVRZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QsIFR5cGVkVGVzdFR5cGVzKTsKLVRZUEVEX1RFU1QoVHlwZWRUZXN0LCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpIHt9Ci0jZW5kaWYKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLS8vIFZlcmlmaWVzIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUgaXMgb3V0cHV0IGluIHRoZSAndHlwZV9wYXJhbScKLS8vIFhNTCBhdHRyaWJ1dGUgZm9yIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIDogcHVibGljIFRlc3Qge307Ci1UWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlKTsKLVRZUEVEX1RFU1RfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpIHt9Ci1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLCBIYXNUeXBlUGFyYW1BdHRyaWJ1dGUpOwotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGxvbmc+IFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2VUeXBlczsKLUlOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFNpbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlVHlwZXMpOwotI2VuZGlmCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS1zaHV0X2Rvd25feG1sIikgPT0gMCkgewotICAgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOwotICAgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkpOwotICB9Ci0gIHRlc3Rpbmc6OlRlc3Q6OlJlY29yZFByb3BlcnR5KCJhZF9ob2NfcHJvcGVydHkiLCAiNDIiKTsKLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weSBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2QwYzNiMi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVW5pdCB0ZXN0IHV0aWxpdGllcyBmb3IgZ3Rlc3RfeG1sX291dHB1dCIiIgotCi1fX2F1dGhvcl9fID0gJ2VlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKScKLQotaW1wb3J0IHJlCi1mcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20sIE5vZGUKLQotaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKLQotCi1HVEVTVF9PVVRQVVRfRkxBRyAgICAgICAgID0gJy0tZ3Rlc3Rfb3V0cHV0JwotR1RFU1RfREVGQVVMVF9PVVRQVVRfRklMRSA9ICd0ZXN0X2RldGFpbC54bWwnCi0KLWNsYXNzIEdUZXN0WE1MVGVzdENhc2UoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6Ci0gICIiIgotICBCYXNlIGNsYXNzIGZvciB0ZXN0cyBvZiBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgZnVuY3Rpb25hbGl0eS4KLSAgIiIiCi0KLQotICBkZWYgQXNzZXJ0RXF1aXZhbGVudE5vZGVzKHNlbGYsIGV4cGVjdGVkX25vZGUsIGFjdHVhbF9ub2RlKToKLSAgICAiIiIKLSAgICBBc3NlcnRzIHRoYXQgYWN0dWFsX25vZGUgKGEgRE9NIG5vZGUgb2JqZWN0KSBpcyBlcXVpdmFsZW50IHRvCi0gICAgZXhwZWN0ZWRfbm9kZSAoYW5vdGhlciBET00gbm9kZSBvYmplY3QpLCBpbiB0aGF0IGVpdGhlciBib3RoIG9mCi0gICAgdGhlbSBhcmUgQ0RBVEEgbm9kZXMgYW5kIGhhdmUgdGhlIHNhbWUgdmFsdWUsIG9yIGJvdGggYXJlIERPTQotICAgIGVsZW1lbnRzIGFuZCBhY3R1YWxfbm9kZSBtZWV0cyBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgKiAgSXQgaGFzIHRoZSBzYW1lIHRhZyBuYW1lIGFzIGV4cGVjdGVkX25vZGUuCi0gICAgKiAgSXQgaGFzIHRoZSBzYW1lIHNldCBvZiBhdHRyaWJ1dGVzIGFzIGV4cGVjdGVkX25vZGUsIGVhY2ggd2l0aAotICAgICAgIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiBleHBlY3RlZF9ub2RlLgotICAgICAgIEV4Y2VwdGlvbnMgYXJlIGFueSBhdHRyaWJ1dGUgbmFtZWQgInRpbWUiLCB3aGljaCBuZWVkcyBvbmx5IGJlCi0gICAgICAgY29udmVydGlibGUgdG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYW5kIGFueSBhdHRyaWJ1dGUgbmFtZWQKLSAgICAgICAidHlwZV9wYXJhbSIgd2hpY2ggb25seSBoYXMgdG8gYmUgbm9uLWVtcHR5LgotICAgICogIEl0IGhhcyBhbiBlcXVpdmFsZW50IHNldCBvZiBjaGlsZCBub2RlcyAoaW5jbHVkaW5nIGVsZW1lbnRzIGFuZAotICAgICAgIENEQVRBIHNlY3Rpb25zKSBhcyBleHBlY3RlZF9ub2RlLiAgTm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUKLSAgICAgICBvcmRlciBvZiB0aGUgY2hpbGRyZW4gYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgaW4gYW55Ci0gICAgICAgcGFydGljdWxhciBvcmRlci4KLSAgICAiIiIKLQotICAgIGlmIGV4cGVjdGVkX25vZGUubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFscyhOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSwgYWN0dWFsX25vZGUubm9kZVR5cGUpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF9ub2RlLm5vZGVWYWx1ZSwgYWN0dWFsX25vZGUubm9kZVZhbHVlKQotICAgICAgcmV0dXJuCi0KLSAgICBzZWxmLmFzc2VydEVxdWFscyhOb2RlLkVMRU1FTlRfTk9ERSwgYWN0dWFsX25vZGUubm9kZVR5cGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIGV4cGVjdGVkX25vZGUubm9kZVR5cGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfbm9kZS50YWdOYW1lLCBhY3R1YWxfbm9kZS50YWdOYW1lKQotCi0gICAgZXhwZWN0ZWRfYXR0cmlidXRlcyA9IGV4cGVjdGVkX25vZGUuYXR0cmlidXRlcwotICAgIGFjdHVhbF9hdHRyaWJ1dGVzICAgPSBhY3R1YWxfbm9kZSAgLmF0dHJpYnV0ZXMKLSAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgZXhwZWN0ZWRfYXR0cmlidXRlcy5sZW5ndGgsIGFjdHVhbF9hdHRyaWJ1dGVzLmxlbmd0aCwKLSAgICAgICAgJ2F0dHJpYnV0ZSBudW1iZXJzIGRpZmZlciBpbiBlbGVtZW50ICVzOlxuRXhwZWN0ZWQ6ICVyXG5BY3R1YWw6ICVyJyAlICgKLSAgICAgICAgICAgIGFjdHVhbF9ub2RlLnRhZ05hbWUsIGV4cGVjdGVkX2F0dHJpYnV0ZXMua2V5cygpLAotICAgICAgICAgICAgYWN0dWFsX2F0dHJpYnV0ZXMua2V5cygpKSkKLSAgICBmb3IgaSBpbiByYW5nZShleHBlY3RlZF9hdHRyaWJ1dGVzLmxlbmd0aCk6Ci0gICAgICBleHBlY3RlZF9hdHRyID0gZXhwZWN0ZWRfYXR0cmlidXRlcy5pdGVtKGkpCi0gICAgICBhY3R1YWxfYXR0ciAgID0gYWN0dWFsX2F0dHJpYnV0ZXMuZ2V0KGV4cGVjdGVkX2F0dHIubmFtZSkKLSAgICAgIHNlbGYuYXNzZXJ0XygKLSAgICAgICAgICBhY3R1YWxfYXR0ciBpcyBub3QgTm9uZSwKLSAgICAgICAgICAnZXhwZWN0ZWQgYXR0cmlidXRlICVzIG5vdCBmb3VuZCBpbiBlbGVtZW50ICVzJyAlCi0gICAgICAgICAgKGV4cGVjdGVkX2F0dHIubmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSkpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgICBleHBlY3RlZF9hdHRyLnZhbHVlLCBhY3R1YWxfYXR0ci52YWx1ZSwKLSAgICAgICAgICAnIHZhbHVlcyBvZiBhdHRyaWJ1dGUgJXMgaW4gZWxlbWVudCAlcyBkaWZmZXI6ICVzIHZzICVzJyAlCi0gICAgICAgICAgKGV4cGVjdGVkX2F0dHIubmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSwKLSAgICAgICAgICAgZXhwZWN0ZWRfYXR0ci52YWx1ZSwgYWN0dWFsX2F0dHIudmFsdWUpKQotCi0gICAgZXhwZWN0ZWRfY2hpbGRyZW4gPSBzZWxmLl9HZXRDaGlsZHJlbihleHBlY3RlZF9ub2RlKQotICAgIGFjdHVhbF9jaGlsZHJlbiA9IHNlbGYuX0dldENoaWxkcmVuKGFjdHVhbF9ub2RlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAotICAgICAgICBsZW4oZXhwZWN0ZWRfY2hpbGRyZW4pLCBsZW4oYWN0dWFsX2NoaWxkcmVuKSwKLSAgICAgICAgJ251bWJlciBvZiBjaGlsZCBlbGVtZW50cyBkaWZmZXIgaW4gZWxlbWVudCAnICsgYWN0dWFsX25vZGUudGFnTmFtZSkKLSAgICBmb3IgY2hpbGRfaWQsIGNoaWxkIGluIGV4cGVjdGVkX2NoaWxkcmVuLml0ZXJpdGVtcygpOgotICAgICAgc2VsZi5hc3NlcnRfKGNoaWxkX2lkIGluIGFjdHVhbF9jaGlsZHJlbiwKLSAgICAgICAgICAgICAgICAgICAnPCVzPiBpcyBub3QgaW4gPCVzPiAoaW4gZWxlbWVudCAlcyknICUKLSAgICAgICAgICAgICAgICAgICAoY2hpbGRfaWQsIGFjdHVhbF9jaGlsZHJlbiwgYWN0dWFsX25vZGUudGFnTmFtZSkpCi0gICAgICBzZWxmLkFzc2VydEVxdWl2YWxlbnROb2RlcyhjaGlsZCwgYWN0dWFsX2NoaWxkcmVuW2NoaWxkX2lkXSkKLQotICBpZGVudGlmeWluZ19hdHRyaWJ1dGUgPSB7Ci0gICAgJ3Rlc3RzdWl0ZXMnOiAnbmFtZScsCi0gICAgJ3Rlc3RzdWl0ZSc6ICduYW1lJywKLSAgICAndGVzdGNhc2UnOiAgJ25hbWUnLAotICAgICdmYWlsdXJlJzogICAnbWVzc2FnZScsCi0gICAgfQotCi0gIGRlZiBfR2V0Q2hpbGRyZW4oc2VsZiwgZWxlbWVudCk6Ci0gICAgIiIiCi0gICAgRmV0Y2hlcyBhbGwgb2YgdGhlIGNoaWxkIG5vZGVzIG9mIGVsZW1lbnQsIGEgRE9NIEVsZW1lbnQgb2JqZWN0LgotICAgIFJldHVybnMgdGhlbSBhcyB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeSBrZXllZCBieSB0aGUgSURzIG9mIHRoZQotICAgIGNoaWxkcmVuLiAgRm9yIDx0ZXN0c3VpdGVzPiwgPHRlc3RzdWl0ZT4gYW5kIDx0ZXN0Y2FzZT4gZWxlbWVudHMsIHRoZSBJRAotICAgIGlzIHRoZSB2YWx1ZSBvZiB0aGVpciAibmFtZSIgYXR0cmlidXRlOyBmb3IgPGZhaWx1cmU+IGVsZW1lbnRzLCBpdCBpcwotICAgIHRoZSB2YWx1ZSBvZiB0aGUgIm1lc3NhZ2UiIGF0dHJpYnV0ZTsgQ0RBVEEgc2VjdGlvbnMgYW5kIG5vbi13aGl0ZXNwYWNlCi0gICAgdGV4dCBub2RlcyBhcmUgY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGUgQ0RBVEEgc2VjdGlvbiB3aXRoIElECi0gICAgImRldGFpbCIuICBBbiBleGNlcHRpb24gaXMgcmFpc2VkIGlmIGFueSBlbGVtZW50IG90aGVyIHRoYW4gdGhlIGFib3ZlCi0gICAgZm91ciBpcyBlbmNvdW50ZXJlZCwgaWYgdHdvIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgaWRlbnRpZnlpbmcKLSAgICBhdHRyaWJ1dGVzIGFyZSBlbmNvdW50ZXJlZCwgb3IgaWYgYW55IG90aGVyIHR5cGUgb2Ygbm9kZSBpcyBlbmNvdW50ZXJlZC4KLSAgICAiIiIKLQotICAgIGNoaWxkcmVuID0ge30KLSAgICBmb3IgY2hpbGQgaW4gZWxlbWVudC5jaGlsZE5vZGVzOgotICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREU6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhjaGlsZC50YWdOYW1lIGluIHNlbGYuaWRlbnRpZnlpbmdfYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgJ0VuY291bnRlcmVkIHVua25vd24gZWxlbWVudCA8JXM+JyAlIGNoaWxkLnRhZ05hbWUpCi0gICAgICAgIGNoaWxkSUQgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoc2VsZi5pZGVudGlmeWluZ19hdHRyaWJ1dGVbY2hpbGQudGFnTmFtZV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjaGlsZElEIG5vdCBpbiBjaGlsZHJlbikKLSAgICAgICAgY2hpbGRyZW5bY2hpbGRJRF0gPSBjaGlsZAotICAgICAgZWxpZiBjaGlsZC5ub2RlVHlwZSBpbiBbTm9kZS5URVhUX05PREUsIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFXToKLSAgICAgICAgaWYgJ2RldGFpbCcgbm90IGluIGNoaWxkcmVuOgotICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSBvcgotICAgICAgICAgICAgICBub3QgY2hpbGQubm9kZVZhbHVlLmlzc3BhY2UoKSk6Ci0gICAgICAgICAgICBjaGlsZHJlblsnZGV0YWlsJ10gPSBjaGlsZC5vd25lckRvY3VtZW50LmNyZWF0ZUNEQVRBU2VjdGlvbigKLSAgICAgICAgICAgICAgICBjaGlsZC5ub2RlVmFsdWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgY2hpbGRyZW5bJ2RldGFpbCddLm5vZGVWYWx1ZSArPSBjaGlsZC5ub2RlVmFsdWUKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuZmFpbCgnRW5jb3VudGVyZWQgdW5leHBlY3RlZCBub2RlIHR5cGUgJWQnICUgY2hpbGQubm9kZVR5cGUpCi0gICAgcmV0dXJuIGNoaWxkcmVuCi0KLSAgZGVmIE5vcm1hbGl6ZVhtbChzZWxmLCBlbGVtZW50KToKLSAgICAiIiIKLSAgICBOb3JtYWxpemVzIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCB0byBlbGltaW5hdGUgcmVmZXJlbmNlcyB0byB0cmFuc2llbnQKLSAgICBpbmZvcm1hdGlvbiB0aGF0IG1heSBjaGFuZ2UgZnJvbSBydW4gdG8gcnVuLgotCi0gICAgKiAgVGhlICJ0aW1lIiBhdHRyaWJ1dGUgb2YgPHRlc3RzdWl0ZXM+LCA8dGVzdHN1aXRlPiBhbmQgPHRlc3RjYXNlPgotICAgICAgIGVsZW1lbnRzIGlzIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgYXN0ZXJpc2ssIGlmIGl0IGNvbnRhaW5zCi0gICAgICAgb25seSBkaWdpdCBjaGFyYWN0ZXJzLgotICAgICogIFRoZSAidGltZXN0YW1wIiBhdHRyaWJ1dGUgb2YgPHRlc3RzdWl0ZXM+IGVsZW1lbnRzIGlzIHJlcGxhY2VkIHdpdGggYQotICAgICAgIHNpbmdsZSBhc3RlcmlzaywgaWYgaXQgY29udGFpbnMgYSB2YWxpZCBJU084NjAxIGRhdGV0aW1lIHZhbHVlLgotICAgICogIFRoZSAidHlwZV9wYXJhbSIgYXR0cmlidXRlIG9mIDx0ZXN0Y2FzZT4gZWxlbWVudHMgaXMgcmVwbGFjZWQgd2l0aCBhCi0gICAgICAgc2luZ2xlIGFzdGVyaXNrIChpZiBpdCBzbiBub24tZW1wdHkpIGFzIGl0IGlzIHRoZSB0eXBlIG5hbWUgcmV0dXJuZWQKLSAgICAgICBieSB0aGUgY29tcGlsZXIgYW5kIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4KLSAgICAqICBUaGUgbGluZSBpbmZvIHJlcG9ydGVkIGluIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSAibWVzc2FnZSIKLSAgICAgICBhdHRyaWJ1dGUgYW5kIENEQVRBIHNlY3Rpb24gb2YgPGZhaWx1cmU+IGVsZW1lbnRzIGlzIHJlcGxhY2VkIHdpdGggdGhlCi0gICAgICAgZmlsZSdzIGJhc2VuYW1lIGFuZCBhIHNpbmdsZSBhc3RlcmlzayBmb3IgdGhlIGxpbmUgbnVtYmVyLgotICAgICogIFRoZSBkaXJlY3RvcnkgbmFtZXMgaW4gZmlsZSBwYXRocyBhcmUgcmVtb3ZlZC4KLSAgICAqICBUaGUgc3RhY2sgdHJhY2VzIGFyZSByZW1vdmVkLgotICAgICIiIgotCi0gICAgaWYgZWxlbWVudC50YWdOYW1lID09ICd0ZXN0c3VpdGVzJzoKLSAgICAgIHRpbWVzdGFtcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndGltZXN0YW1wJykKLSAgICAgIHRpbWVzdGFtcC52YWx1ZSA9IHJlLnN1YihyJ15cZHs0fS1cZFxkLVxkXGRUXGRcZDpcZFxkOlxkXGQkJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKicsIHRpbWVzdGFtcC52YWx1ZSkKLSAgICBpZiBlbGVtZW50LnRhZ05hbWUgaW4gKCd0ZXN0c3VpdGVzJywgJ3Rlc3RzdWl0ZScsICd0ZXN0Y2FzZScpOgotICAgICAgdGltZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndGltZScpCi0gICAgICB0aW1lLnZhbHVlID0gcmUuc3ViKHInXlxkKyhcLlxkKyk/JCcsICcqJywgdGltZS52YWx1ZSkKLSAgICAgIHR5cGVfcGFyYW0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3R5cGVfcGFyYW0nKQotICAgICAgaWYgdHlwZV9wYXJhbSBhbmQgdHlwZV9wYXJhbS52YWx1ZToKLSAgICAgICAgdHlwZV9wYXJhbS52YWx1ZSA9ICcqJwotICAgIGVsaWYgZWxlbWVudC50YWdOYW1lID09ICdmYWlsdXJlJzoKLSAgICAgIHNvdXJjZV9saW5lX3BhdCA9IHInXi4qWy9cXF0oLio6KVxkK1xuJwotICAgICAgIyBSZXBsYWNlcyB0aGUgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gd2l0aCBhIG5vcm1hbGl6ZWQgZm9ybS4KLSAgICAgIG1lc3NhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ21lc3NhZ2UnKQotICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlLnN1Yihzb3VyY2VfbGluZV9wYXQsICdcXDEqXG4nLCBtZXNzYWdlLnZhbHVlKQotICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKLSAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgICAgIyBSZXBsYWNlcyB0aGUgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gd2l0aCBhIG5vcm1hbGl6ZWQgZm9ybS4KLSAgICAgICAgICBjZGF0YSA9IHJlLnN1Yihzb3VyY2VfbGluZV9wYXQsICdcXDEqXG4nLCBjaGlsZC5ub2RlVmFsdWUpCi0gICAgICAgICAgIyBSZW1vdmVzIHRoZSBhY3R1YWwgc3RhY2sgdHJhY2UuCi0gICAgICAgICAgY2hpbGQubm9kZVZhbHVlID0gcmUuc3ViKHInXG5TdGFjayB0cmFjZTpcbigufFxuKSonLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywgY2RhdGEpCi0gICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKLSAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgotICAgICAgICBzZWxmLk5vcm1hbGl6ZVhtbChjaGlsZCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9wcm9kdWN0aW9uLmNjIGIvdGVzdGluZy9ndGVzdC90ZXN0L3Byb2R1Y3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGE0MGIuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L3Byb2R1Y3Rpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoaXMgaXMgcGFydCBvZiB0aGUgdW5pdCB0ZXN0IGZvciBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaC4KLQotI2luY2x1ZGUgInByb2R1Y3Rpb24uaCIKLQotUHJpdmF0ZUNvZGU6OlByaXZhdGVDb2RlKCkgOiB4XygwKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC90ZXN0L3Byb2R1Y3Rpb24uaCBiL3Rlc3RpbmcvZ3Rlc3QvdGVzdC9wcm9kdWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmQ1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC90ZXN0L3Byb2R1Y3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhpcyBpcyBwYXJ0IG9mIHRoZSB1bml0IHRlc3QgZm9yIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oLgotCi0jaWZuZGVmIEdURVNUX1RFU1RfUFJPRFVDVElPTl9IXwotI2RlZmluZSBHVEVTVF9URVNUX1BST0RVQ1RJT05fSF8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3Byb2QuaCIKLQotY2xhc3MgUHJpdmF0ZUNvZGUgewotIHB1YmxpYzoKLSAgLy8gRGVjbGFyZXMgYSBmcmllbmQgdGVzdCB0aGF0IGRvZXMgbm90IHVzZSBhIGZpeHR1cmUuCi0gIEZSSUVORF9URVNUKFByaXZhdGVDb2RlVGVzdCwgQ2FuQWNjZXNzUHJpdmF0ZU1lbWJlcnMpOwotCi0gIC8vIERlY2xhcmVzIGEgZnJpZW5kIHRlc3QgdGhhdCB1c2VzIGEgZml4dHVyZS4KLSAgRlJJRU5EX1RFU1QoUHJpdmF0ZUNvZGVGaXh0dXJlVGVzdCwgQ2FuQWNjZXNzUHJpdmF0ZU1lbWJlcnMpOwotCi0gIFByaXZhdGVDb2RlKCk7Ci0KLSAgaW50IHgoKSBjb25zdCB7IHJldHVybiB4XzsgfQotIHByaXZhdGU6Ci0gIHZvaWQgc2V0X3goaW50IGFuX3gpIHsgeF8gPSBhbl94OyB9Ci0gIGludCB4XzsKLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfVEVTVF9QUk9EVUNUSU9OX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcgYi90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjgxNTcuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8KLS8vICBEZWJ1Z1Byb2plY3QueGNjb25maWcKLS8vCi0vLyAgVGhlc2UgYXJlIERlYnVnIENvbmZpZ3VyYXRpb24gcHJvamVjdCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yayBhbmQKLS8vICBleGFtcGxlcy4gSXQgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlByb2plY3QiIGluZm8KLS8vICBkaWFsb2cuCi0vLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgotLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLwotLy8gCi0KLSNpbmNsdWRlICJHZW5lcmFsLnhjY29uZmlnIgotCi0vLyBObyBvcHRpbWl6YXRpb24KLUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwCi0KLS8vIERlcGxveW1lbnQgcG9zdHByb2Nlc3NpbmcgaXMgd2hhdCB0cmlnZ2VycyBYY29kZSB0byBzdHJpcCwgdHVybiBpdCBvZmYKLURFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBOTwotCi0vLyBEZWFkIGNvZGUgc3RyaXBwaW5nIG9mZgotREVBRF9DT0RFX1NUUklQUElORyA9IE5PCi0KLS8vIERlYnVnIHN5bWJvbHMgc2hvdWxkIGJlIG9uIG9idmlvdXNseQotR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTCi0KLS8vIERlZmluZSB0aGUgREVCVUcgbWFjcm8gaW4gYWxsIGRlYnVnIGJ1aWxkcwotT1RIRVJfQ0ZMQUdTID0gJChPVEhFUl9DRkxBR1MpIC1EREVCVUc9MQotCi0vLyBUaGVzZSBhcmUgdHVybmVkIG9mZiB0byBhdm9pZCBTVEwgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBjbGllbnQgY29kZQotLy8gLy8gVHVybnMgb24gc3BlY2lhbCBDKysgU1RMIGNoZWNrcyB0byAiZW5jb3VyYWdlIiBnb29kIFNUTCB1c2UKLS8vIEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMpIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDIF9HTElCQ1hYX0RFQlVHIF9HTElCQ1BQX0NPTkNFUFRfQ0hFQ0tTCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcgYi90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2IxYzguLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8KLS8vICBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcKLS8vCi0vLyAgVGhlc2UgYXJlIEZyYW1ld29yayB0YXJnZXQgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kIGV4YW1wbGVzLiBJdAotLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgotLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKLS8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KLS8vIAotCi0vLyBEeW5hbWljIGxpYnMgbmVlZCB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudAotR0NDX0RZTkFNSUNfTk9fUElDID0gTk8KLQotLy8gRHluYW1pYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBleHRlcm5hbCBzeW1ib2xzIHN0cmlwcGVkLgotU1RSSVBfU1RZTEUgPSBub24tZ2xvYmFsCi0KLS8vIExldCB0aGUgdXNlciBpbnN0YWxsIGJ5IHNwZWNpZnlpbmcgdGhlICREU1RST09UIHdpdGggeGNvZGVidWlsZAotU0tJUF9JTlNUQUxMID0gTk8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcgYi90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNlMzIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLwotLy8gIEdlbmVyYWwueGNjb25maWcKLS8vCi0vLyAgVGhlc2UgYXJlIEdlbmVyYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yayBhbmQKLS8vICBleGFtcGxlcy4KLS8vICBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIFhjb2RlIENvbmZpZ3VyYXRpb24gZmlsZXMgaW46Ci0vLyAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS10b29sYm94LWZvci1tYWMvCi0vLyAKLQotLy8gQnVpbGQgZm9yIFBQQyBhbmQgSW50ZWwsIDMyLSBhbmQgNjQtYml0Ci1BUkNIUyA9IGkzODYgeDg2XzY0IHBwYyBwcGM2NAotCi0vLyBaZXJvbGluayBwcmV2ZW50cyBsaW5rIHdhcm5pbmdzIHNvIHR1cm4gaXQgb2ZmCi1aRVJPX0xJTksgPSBOTwotCi0vLyBQcmViaW5kaW5nIGNvbnNpZGVyZWQgdW5oZWxwZnVsIGluIDEwLjMgYW5kIGxhdGVyCi1QUkVCSU5ESU5HID0gTk8KLQotLy8gU3RyaWN0ZXN0IHdhcm5pbmcgcG9saWN5Ci1XQVJOSU5HX0NGTEFHUyA9IC1XYWxsIC1XZXJyb3IgLVdlbmRpZi1sYWJlbHMgLVduZXdsaW5lLWVvZiAtV25vLXNpZ24tY29tcGFyZSAtV3NoYWRvdwotCi0vLyBXb3JrIGFyb3VuZCBYY29kZSBidWdzIGJ5IHVzaW5nIGV4dGVybmFsIHN0cmlwLiBTZWU6Ci0vLyBodHRwOi8vbGlzdHMuYXBwbGUuY29tL2FyY2hpdmVzL1hjb2RlLXVzZXJzLzIwMDYvRmViL21zZzAwMDUwLmh0bWwKLVNFUEFSQVRFX1NUUklQID0gWUVTCi0KLS8vIEZvcmNlIEM5OSBkaWFsZWN0Ci1HQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGM5OQotCi0vLyBub3Qgc3VyZSB3aHkgYXBwbGUgZGVmYXVsdHMgdGhpcyBvbiwgYnV0IGl0J3MgcHJldHR5IHJpc2t5Ci1BTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTwotCi0vLyBUdXJuIG9uIHBvc2l0aW9uIGRlcGVuZGVudCBjb2RlIGZvciBtb3N0IGNhc2VzIChvdmVycmlkZGVuIHdoZXJlIGFwcHJvcHJpYXRlKQotR0NDX0RZTkFNSUNfTk9fUElDID0gWUVTCi0KLS8vIERlZmF1bHQgU0RLIGFuZCBtaW5pbXVtIE9TIHZlcnNpb24gaXMgMTAuNAotU0RLUk9PVCA9ICQoREVWRUxPUEVSX1NES19ESVIpL01hY09TWDEwLjR1LnNkawotTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNAotR0NDX1ZFUlNJT04gPSA0LjAKLQotLy8gVkVSU0lPTklORyBCVUlMRCBTRVRUSU5HUyAodXNlZCBpbiBJbmZvLnBsaXN0KQotR1RFU1RfVkVSU0lPTklORk9fQUJPVVQgPSAgwqkgMjAwOCBHb29nbGUgSW5jLgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvUmVsZWFzZVByb2plY3QueGNjb25maWcgYi90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0OWYwYS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vCi0vLyAgUmVsZWFzZVByb2plY3QueGNjb25maWcKLS8vCi0vLyAgVGhlc2UgYXJlIFJlbGVhc2UgQ29uZmlndXJhdGlvbiBwcm9qZWN0IHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrCi0vLyAgYW5kIGV4YW1wbGVzLiBJdCBpcyBzZXQgaW4gdGhlICJCYXNlZCBPbjoiIGRyb3Bkb3duIGluIHRoZSAiUHJvamVjdCIgaW5mbwotLy8gIGRpYWxvZy4KLS8vICBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIFhjb2RlIENvbmZpZ3VyYXRpb24gZmlsZXMgaW46Ci0vLyAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS10b29sYm94LWZvci1tYWMvCi0vLyAKLQotI2luY2x1ZGUgIkdlbmVyYWwueGNjb25maWciCi0KLS8vIHN1YmNvbmZpZy9SZWxlYXNlLnhjY29uZmlnCi0KLS8vIE9wdGltaXplIGZvciBzcGFjZSBhbmQgc2l6ZSAoQXBwbGUgcmVjb21tZW5kYXRpb24pCi1HQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gcwotCi0vLyBEZXBsb21lbnQgcG9zdHByb2Nlc3NpbmcgaXMgd2hhdCB0cmlnZ2VycyBYY29kZSB0byBzdHJpcAotREVQTE9ZTUVOVF9QT1NUUFJPQ0VTU0lORyA9IFlFUwotCi0vLyBObyBzeW1ib2xzCi1HQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTwotCi0vLyBEZWFkIGNvZGUgc3RyaXAgZG9lcyBub3QgYWZmZWN0IE9iakMgY29kZSBidXQgY2FuIGhlbHAgZm9yIEMKLURFQURfQ09ERV9TVFJJUFBJTkcgPSBZRVMKLQotLy8gTkRFQlVHIGlzIHVzZWQgYnkgdGhpbmdzIGxpa2UgYXNzZXJ0LmgsIHNvIGRlZmluZSBpdCBmb3IgZ2VuZXJhbCBjb21wYXQuCi0vLyBBU1NFUlQgZ29pbmcgYXdheSBpbiByZWxlYXNlIHRlbmRzIHRvIGNyZWF0ZSB1bnVzZWQgdmFycy4KLU9USEVSX0NGTEFHUyA9ICQoT1RIRVJfQ0ZMQUdTKSAtRE5ERUJVRz0xIC1Xbm8tdW51c2VkLXZhcmlhYmxlCi0KLS8vIFdoZW4gd2Ugc3RyaXAgd2Ugd2FudCB0byBzdHJpcCBhbGwgc3ltYm9scyBpbiByZWxlYXNlLCBidXQgc2F2ZSBleHRlcm5hbHMuCi1TVFJJUF9TVFlMRSA9IGFsbApkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjJmYTUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vCi0vLyAgU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZwotLy8KLS8vICBUaGVzZSBhcmUgc3RhdGljIGxpYnJhcnkgdGFyZ2V0IHNldHRpbmdzIGZvciBsaWJndGVzdC5hLiBJdAotLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgotLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKLS8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KLS8vIAotCi0vLyBTdGF0aWMgbGlicyBjYW4gYmUgaW5jbHVkZWQgaW4gYnVuZGxlcyBzbyBtYWtlIHRoZW0gcG9zaXRpb24gaW5kZXBlbmRlbnQKLUdDQ19EWU5BTUlDX05PX1BJQyA9IE5PCi0KLS8vIFN0YXRpYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBpbnRlcm5hbCBnbG9iYWxzIG9yIGV4dGVybmFsIHN5bWJvbHMKLS8vIHN0cmlwcGVkLgotU1RSSVBfU1RZTEUgPSBkZWJ1Z2dpbmcKLQotLy8gTGV0IHRoZSB1c2VyIGluc3RhbGwgYnkgc3BlY2lmeWluZyB0aGUgJERTVFJPT1Qgd2l0aCB4Y29kZWJ1aWxkCi1TS0lQX0lOU1RBTEwgPSBOTwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZyBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjUyYmEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLy8KLS8vICBUZXN0VGFyZ2V0LnhjY29uZmlnCi0vLwotLy8gIFRoZXNlIGFyZSBUZXN0IHRhcmdldCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yayBhbmQgZXhhbXBsZXMuIEl0Ci0vLyAgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlRhcmdldCIgaW5mbyBkaWFsb2cuCi0KLVBST0RVQ1RfTkFNRSA9ICQoVEFSR0VUX05BTUUpCi1IRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vaW5jbHVkZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdCBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvUmVzb3VyY2VzL0luZm8ucGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDI4ZWEuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KLTxwbGlzdCB2ZXJzaW9uPSIxLjAiPgotPGRpY3Q+Ci0JPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+Ci0JPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KLQk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgotCTxzdHJpbmc+PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KLQk8c3RyaW5nPmNvbS5nb29nbGUuJHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgotCTxzdHJpbmc+Ni4wPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Ci0JPHN0cmluZz5GTVdLPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgotCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Ci0JPHN0cmluZz5HVEVTVF9WRVJTSU9OSU5GT19MT05HPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgotCTxzdHJpbmc+R1RFU1RfVkVSU0lPTklORk9fU0hPUlQ8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgotCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9IEdURVNUX1ZFUlNJT05JTkZPX0xPTkcsICR7R1RFU1RfVkVSU0lPTklORk9fQUJPVVR9PC9zdHJpbmc+Ci0JPGtleT5OU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQ8L2tleT4KLQk8c3RyaW5nPiR7R1RFU1RfVkVSU0lPTklORk9fQUJPVVR9PC9zdHJpbmc+Ci0JPGtleT5DU1Jlc291cmNlc0ZpbGVNYXBwZWQ8L2tleT4KLQk8dHJ1ZS8+Ci08L2RpY3Q+Ci08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0IGIvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg1MmVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvSW5mby5wbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KLTxwbGlzdCB2ZXJzaW9uPSIxLjAiPgotPGRpY3Q+Ci0JPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+Ci0JPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KLQk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgotCTxzdHJpbmc+PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KLQk8c3RyaW5nPmNvbS5nb29nbGUuZ3Rlc3QuJHtQUk9EVUNUX05BTUU6aWRlbnRpZmllcn08L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+Ci0JPHN0cmluZz42LjA8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgotCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Ci0JPHN0cmluZz5GTVdLPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgotCTxzdHJpbmc+MS4wPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgotCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Ci0JPHN0cmluZz4xLjA8L3N0cmluZz4KLQk8a2V5PkNTUmVzb3VyY2VzRmlsZU1hcHBlZDwva2V5PgotCTx0cnVlLz4KLTwvZGljdD4KLTwvcGxpc3Q+CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3NjE3ZS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL1dpZGdldEZyYW1ld29yay54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8vICEkKlVURjgqJCEKLXsKLQlhcmNoaXZlVmVyc2lvbiA9IDE7Ci0JY2xhc3NlcyA9IHsKLQl9OwotCW9iamVjdFZlcnNpb24gPSA0MjsKLQlvYmplY3RzID0gewotCi0vKiBCZWdpbiBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLwotCQk0MDI0RDE2MjExM0Q3RDI0MDBDNzA1OUUgLyogVGVzdCAqLyA9IHsKLQkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDI0RDE2OTExM0Q3RDQ2MDBDNzA1OUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlRlc3QiICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJNDAyNEQxNjExMTNEN0QyNDAwQzcwNTlFIC8qIFNoZWxsU2NyaXB0ICovLAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCQk0MDI0RDE2NjExM0Q3RDMxMDBDNzA1OUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCSk7Ci0JCQluYW1lID0gVGVzdDsKLQkJCXByb2R1Y3ROYW1lID0gVGVzdEFuZEJ1aWxkOwotCQl9OwotCQk0MDI0RDFFOTExM0Q4M0ZGMDBDNzA1OUUgLyogVGVzdEFuZEJ1aWxkICovID0gewotCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OwotCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwMjREMUYwMTEzRDg0MkIwMEM3MDU5RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVGVzdEFuZEJ1aWxkIiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCQk0MDI0RDFFRDExM0Q4NDA5MDBDNzA1OUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MDI0RDFFRjExM0Q4NDBEMDBDNzA1OUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCSk7Ci0JCQluYW1lID0gVGVzdEFuZEJ1aWxkOwotCQkJcHJvZHVjdE5hbWUgPSBUZXN0QW5kQnVpbGQ7Ci0JCX07Ci0vKiBFbmQgUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KLQkJM0I3RUIxMjUwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCN0VCMTIzMEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgKi87IH07Ci0JCTNCN0VCMTI2MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCN0VCMTI0MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07Ci0JCTNCN0VCMTI4MEU1QUVFNDYwMEM3RjIzOSAvKiB3aWRnZXRfdGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCN0VCMTI3MEU1QUVFNDYwMEM3RjIzOSAvKiB3aWRnZXRfdGVzdC5jYyAqLzsgfTsKLQkJM0I3RUIxNDgwRTVBRjNCNDAwQzdGMjM5IC8qIFdpZGdldC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0LmZyYW1ld29yayAqLzsgfTsKLQkJNDAyNEQxODgxMTNEN0Q3ODAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDI0RDE4NTExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSAqLzsgfTsKLQkJNDAyNEQxODkxMTNEN0Q3QTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi87IH07Ci0vKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KLQkJM0IwN0JERjAwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMDsKLQkJCXJlbW90ZUluZm8gPSBnVGVzdEV4YW1wbGU7Ci0JCX07Ci0JCTQwMjREMTY1MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7Ci0JCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7Ci0JCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Ci0JCQlwcm94eVR5cGUgPSAxOwotCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAzQjA3QkRFOTBFM0YzRjlFMDA2NDc4Njk7Ci0JCQlyZW1vdGVJbmZvID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsKLQkJfTsKLQkJNDAyNEQxRUMxMTNEODQwOTAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMDsKLQkJCXJlbW90ZUluZm8gPSBXaWRnZXRGcmFtZXdvcms7Ci0JCX07Ci0JCTQwMjREMUVFMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7Ci0JCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7Ci0JCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Ci0JCQlwcm94eVR5cGUgPSAxOwotCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDI0RDE2MjExM0Q3RDI0MDBDNzA1OUU7Ci0JCQlyZW1vdGVJbmZvID0gVGVzdDsKLQkJfTsKLS8qIEVuZCBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KLQkJM0IwN0JERUEwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07Ci0JCTNCN0VCMTIzMEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSB3aWRnZXQuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTNCN0VCMTI0MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gd2lkZ2V0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTNCN0VCMTI3MEU1QUVFNDYwMEM3RjIzOSAvKiB3aWRnZXRfdGVzdC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHdpZGdldF90ZXN0LmNjOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk0MDI0RDE4MzExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9IGxpYmd0ZXN0X21haW4uYTsgcGF0aCA9IC91c3IvbG9jYWwvbGliL2xpYmd0ZXN0X21haW4uYTsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKLQkJNDAyNEQxODUxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gbGliZ3Rlc3QuYTsgcGF0aCA9IC91c3IvbG9jYWwvbGliL2xpYmd0ZXN0LmE7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07Ci0JCTQwMjREMUUyMTEzRDgzODIwMEM3MDU5RSAvKiBydW50ZXN0cy5zaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQuc2NyaXB0LnNoOyBwYXRoID0gcnVudGVzdHMuc2g7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCThEMDdGMkM3MDQ4NkNDN0EwMDdDRDFEMCAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCThEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gV2lkZ2V0LmZyYW1ld29yazsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLS8qIEVuZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQkzQjA3QkRFODBFM0YzRjlFMDA2NDc4NjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKLQkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTQwMjREMTg5MTEzRDdEN0EwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKLQkJCQk0MDI0RDE4ODExM0Q3RDc4MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovLAotCQkJCTNCN0VCMTQ4MEU1QUYzQjQwMEM3RjIzOSAvKiBXaWRnZXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCThEMDdGMkMzMDQ4NkNDN0EwMDdDRDFEMCAvKiBGcmFtZXdvcmtzICovID0gewotCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0vKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCi0JCTAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJOEQwN0YyQzgwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldC5mcmFtZXdvcmsgKi8sCi0JCQkJM0IwN0JERUEwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi8sCi0JCQkpOwotCQkJbmFtZSA9IFByb2R1Y3RzOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGdUZXN0RXhhbXBsZSAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNDAyNEQxRTExMTNEODM2QzAwQzcwNTlFIC8qIFNjcmlwdHMgKi8sCi0JCQkJMDhGQjc3QUNGRTg0MTcwN0MwMkFBQzA3IC8qIFNvdXJjZSAqLywKLQkJCQkwODlDMTY2NUZFODQxMTU4QzAyQUFDMDcgLyogUmVzb3VyY2VzICovLAotCQkJCTNCMDdCRTM1MEU0MDk0RTQwMDY0Nzg2OSAvKiBUZXN0ICovLAotCQkJCTA4NjdENjlBRkU4NDAyOEZDMDJBQUMwNyAvKiBFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMgKi8sCi0JCQkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovLAotCQkJKTsKLQkJCW5hbWUgPSBnVGVzdEV4YW1wbGU7Ci0JCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwotCQl9OwotCQkwODY3RDY5QUZFODQwMjhGQzAyQUFDMDcgLyogRXh0ZXJuYWwgRnJhbWV3b3JrcyBhbmQgTGlicmFyaWVzICovID0gewotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQk0MDI0RDE4MzExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hICovLAotCQkJCTQwMjREMTg1MTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdC5hICovLAotCQkJKTsKLQkJCW5hbWUgPSAiRXh0ZXJuYWwgRnJhbWV3b3JrcyBhbmQgTGlicmFyaWVzIjsKLQkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7Ci0JCX07Ci0JCTA4OUMxNjY1RkU4NDExNThDMDJBQUMwNyAvKiBSZXNvdXJjZXMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCThEMDdGMkM3MDQ4NkNDN0EwMDdDRDFEMCAvKiBJbmZvLnBsaXN0ICovLAotCQkJKTsKLQkJCW5hbWUgPSBSZXNvdXJjZXM7Ci0JCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwotCQl9OwotCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovID0gewotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQkzQjdFQjEyMzBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjICovLAotCQkJCTNCN0VCMTI0MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuaCAqLywKLQkJCSk7Ci0JCQluYW1lID0gU291cmNlOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJM0IwN0JFMzUwRTQwOTRFNDAwNjQ3ODY5IC8qIFRlc3QgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTNCN0VCMTI3MEU1QUVFNDYwMEM3RjIzOSAvKiB3aWRnZXRfdGVzdC5jYyAqLywKLQkJCSk7Ci0JCQluYW1lID0gVGVzdDsKLQkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7Ci0JCX07Ci0JCTQwMjREMUUxMTEzRDgzNkMwMEM3MDU5RSAvKiBTY3JpcHRzICovID0gewotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQk0MDI0RDFFMjExM0Q4MzgyMDBDNzA1OUUgLyogcnVudGVzdHMuc2ggKi8sCi0JCQkpOwotCQkJbmFtZSA9IFNjcmlwdHM7Ci0JCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwotCQl9OwotLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLyA9IHsKLQkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTNCN0VCMTI2MEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuaCBpbiBIZWFkZXJzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KLQkJM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi8gPSB7Ci0JCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gM0IwN0JERjQwRTNGM0ZCNjAwNjQ3ODY5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJXaWRnZXRGcmFtZXdvcmtUZXN0IiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJCTNCMDdCREU3MEUzRjNGOUUwMDY0Nzg2OSAvKiBTb3VyY2VzICovLAotCQkJCTNCMDdCREU4MEUzRjNGOUUwMDY0Nzg2OSAvKiBGcmFtZXdvcmtzICovLAotCQkJKTsKLQkJCWJ1aWxkUnVsZXMgPSAoCi0JCQkpOwotCQkJZGVwZW5kZW5jaWVzID0gKAotCQkJCTNCMDdCREYxMEUzRjNGQUUwMDY0Nzg2OSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAotCQkJKTsKLQkJCW5hbWUgPSBXaWRnZXRGcmFtZXdvcmtUZXN0OwotCQkJcHJvZHVjdE5hbWUgPSBnVGVzdEV4YW1wbGVUZXN0OwotCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDNCMDdCREVBMEUzRjNGOUUwMDY0Nzg2OSAvKiBXaWRnZXRGcmFtZXdvcmtUZXN0ICovOwotCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKLQkJfTsKLQkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldEZyYW1ld29yayAqLyA9IHsKLQkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIldpZGdldEZyYW1ld29yayIgKi87Ci0JCQlidWlsZFBoYXNlcyA9ICgKLQkJCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLywKLQkJCQk4RDA3RjJDMzA0ODZDQzdBMDA3Q0QxRDAgLyogRnJhbWV3b3JrcyAqLywKLQkJCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLywKLQkJCQk4RDA3RjJCRjA0ODZDQzdBMDA3Q0QxRDAgLyogUmVzb3VyY2VzICovLAotCQkJCThEMDdGMkM1MDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXogKi8sCi0JCQkpOwotCQkJYnVpbGRSdWxlcyA9ICgKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkpOwotCQkJbmFtZSA9IFdpZGdldEZyYW1ld29yazsKLQkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyI7Ci0JCQlwcm9kdWN0TmFtZSA9IGdUZXN0RXhhbXBsZTsKLQkJCXByb2R1Y3RSZWZlcmVuY2UgPSA4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0LmZyYW1ld29yayAqLzsKLQkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKLQkJfTsKLS8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KLQkJMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0gewotCQkJaXNhID0gUEJYUHJvamVjdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0NjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJXaWRnZXRGcmFtZXdvcmsiICovOwotCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMi40IjsKLQkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOwotCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGdUZXN0RXhhbXBsZSAqLzsKLQkJCXByb2R1Y3RSZWZHcm91cCA9IDAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLzsKLQkJCXByb2plY3REaXJQYXRoID0gIiI7Ci0JCQlwcm9qZWN0Um9vdCA9ICIiOwotCQkJdGFyZ2V0cyA9ICgKLQkJCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0RnJhbWV3b3JrICovLAotCQkJCTNCMDdCREU5MEUzRjNGOUUwMDY0Nzg2OSAvKiBXaWRnZXRGcmFtZXdvcmtUZXN0ICovLAotCQkJCTQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovLAotCQkJCTQwMjREMUU5MTEzRDgzRkYwMEM3MDU5RSAvKiBUZXN0QW5kQnVpbGQgKi8sCi0JCQkpOwotCQl9OwotLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLyA9IHsKLQkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0vKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWFJlekJ1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQk4RDA3RjJDNTA0ODZDQzdBMDA3Q0QxRDAgLyogUmV6ICovID0gewotCQkJaXNhID0gUEJYUmV6QnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLS8qIEVuZCBQQlhSZXpCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQkJNDAyNEQxNjExMTNEN0QyNDAwQzcwNTlFIC8qIFNoZWxsU2NyaXB0ICovID0gewotCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJKTsKLQkJCWlucHV0UGF0aHMgPSAoCi0JCQkpOwotCQkJb3V0cHV0UGF0aHMgPSAoCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCQlzaGVsbFBhdGggPSAvYmluL3NoOwotCQkJc2hlbGxTY3JpcHQgPSAiL2Jpbi9iYXNoICRTUkNST09UL3J1bnRlc3RzLnNoICRCVUlMVF9QUk9EVUNUU19ESVIvV2lkZ2V0RnJhbWV3b3JrVGVzdFxuIjsKLQkJfTsKLS8qIEVuZCBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCi0JCTNCMDdCREU3MEUzRjNGOUUwMDY0Nzg2OSAvKiBTb3VyY2VzICovID0gewotCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJM0I3RUIxMjgwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjIGluIFNvdXJjZXMgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovID0gewotCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJM0I3RUIxMjUwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyBpbiBTb3VyY2VzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCi0JCTNCMDdCREYxMEUzRjNGQUUwMDY0Nzg2OSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi87Ci0JCQl0YXJnZXRQcm94eSA9IDNCMDdCREYwMEUzRjNGQUUwMDY0Nzg2OSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87Ci0JCX07Ci0JCTQwMjREMTY2MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDNCMDdCREU5MEUzRjNGOUUwMDY0Nzg2OSAvKiBXaWRnZXRGcmFtZXdvcmtUZXN0ICovOwotCQkJdGFyZ2V0UHJveHkgPSA0MDI0RDE2NTExM0Q3RDMxMDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk0MDI0RDFFRDExM0Q4NDA5MDBDNzA1OUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0RnJhbWV3b3JrICovOwotCQkJdGFyZ2V0UHJveHkgPSA0MDI0RDFFQzExM0Q4NDA5MDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk0MDI0RDFFRjExM0Q4NDBEMDBDNzA1OUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA0MDI0RDE2MjExM0Q3RDI0MDBDNzA1OUUgLyogVGVzdCAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDAyNEQxRUUxMTNEODQwRDAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLS8qIEVuZCBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KLQotLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLwotCQkzQjA3QkRFQzBFM0YzRjlGMDA2NDc4NjkgLyogRGVidWcgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTNCMDdCREVEMEUzRjNGOUYwMDY0Nzg2OSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCVBST0RVQ1RfTkFNRSA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwMjREMTYzMTEzRDdEMjQwMEM3MDU5RSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlQUk9EVUNUX05BTUUgPSBUZXN0QW5kQnVpbGQ7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQk0MDI0RDE2NDExM0Q3RDI0MDBDNzA1OUUgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlQUk9EVUNUX05BTUUgPSBUZXN0QW5kQnVpbGQ7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwMjREMUVBMTEzRDgzRkYwMEM3MDU5RSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlQUk9EVUNUX05BTUUgPSBUZXN0QW5kQnVpbGQ7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQk0MDI0RDFFQjExM0Q4M0ZGMDBDNzA1OUUgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlQUk9EVUNUX05BTUUgPSBUZXN0QW5kQnVpbGQ7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTRGQURDMjQzMDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAxOwotCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9IDE7Ci0JCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOwotCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKLQkJCQlJTlNUQUxMX1BBVEggPSAiQGxvYWRlcl9wYXRoLy4uL0ZyYW1ld29ya3MiOwotCQkJCVBST0RVQ1RfTkFNRSA9IFdpZGdldDsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7Ci0JCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKLQkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7Ci0JCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OwotCQkJCUlOU1RBTExfUEFUSCA9ICJAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3JrcyI7Ci0JCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0OwotCQkJfTsKLQkJCW5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJR0NDX1ZFUlNJT04gPSA0LjA7Ci0JCQkJU0RLUk9PVCA9IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGs7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQk0RkFEQzI0ODA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKLQkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKLQkJCX07Ci0JCQluYW1lID0gUmVsZWFzZTsKLQkJfTsKLS8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLwotCQkzQjA3QkRGNDBFM0YzRkI2MDA2NDc4NjkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIldpZGdldEZyYW1ld29ya1Rlc3QiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJM0IwN0JERUMwRTNGM0Y5RjAwNjQ3ODY5IC8qIERlYnVnICovLAotCQkJCTNCMDdCREVEMEUzRjNGOUYwMDY0Nzg2OSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwMjREMTY5MTEzRDdENDYwMEM3MDU5RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVGVzdCIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQk0MDI0RDE2MzExM0Q3RDI0MDBDNzA1OUUgLyogRGVidWcgKi8sCi0JCQkJNDAyNEQxNjQxMTNEN0QyNDAwQzcwNTlFIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDAyNEQxRjAxMTNEODQyQjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0QW5kQnVpbGQiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNDAyNEQxRUExMTNEODNGRjAwQzcwNTlFIC8qIERlYnVnICovLAotCQkJCTQwMjREMUVCMTEzRDgzRkYwMEM3MDU5RSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrIiAqLyA9IHsKLQkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAotCQkJCTRGQURDMjQzMDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLywKLQkJCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLywKLQkJCSk7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk0RkFEQzI0NjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJXaWRnZXRGcmFtZXdvcmsiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNEZBREMyNDcwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAotCQkJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0vKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCi0JfTsKLQlyb290T2JqZWN0ID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaCBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ0MTMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIyBFeGVjdXRlcyB0aGUgc2FtcGxlcyBhbmQgdGVzdHMgZm9yIHRoZSBHb29nbGUgVGVzdCBGcmFtZXdvcmsuCi0KLSMgSGVscCB0aGUgZHluYW1pYyBsaW5rZXIgZmluZCB0aGUgcGF0aCB0byB0aGUgbGlicmFyaWVzLgotZXhwb3J0IERZTERfRlJBTUVXT1JLX1BBVEg9JEJVSUxUX1BST0RVQ1RTX0RJUgotZXhwb3J0IERZTERfTElCUkFSWV9QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKLQotIyBDcmVhdGUgc29tZSBleGVjdXRhYmxlcy4KLXRlc3RfZXhlY3V0YWJsZXM9JEAKLQotIyBOb3cgZXhlY3V0ZSBlYWNoIG9uZSBpbiB0dXJuIGtlZXBpbmcgdHJhY2sgb2YgaG93IG1hbnkgc3VjY2VlZGVkIGFuZCBmYWlsZWQuCi1zdWNjZWVkZWQ9MAotZmFpbGVkPTAKLWZhaWxlZF9saXN0PSgpCi1mb3IgdGVzdCBpbiAke3Rlc3RfZXhlY3V0YWJsZXNbKl19OyBkbwotICAiJHRlc3QiCi0gIHJlc3VsdD0kPwotICBpZiBbICRyZXN1bHQgLWVxIDAgXTsgdGhlbgotICAgIHN1Y2NlZWRlZD0kKCggJHN1Y2NlZWRlZCArIDEgKSkKLSAgZWxzZQotICAgIGZhaWxlZD0kKCggZmFpbGVkICsgMSApKQotICAgIGZhaWxlZF9saXN0PSIkZmFpbGVkX2xpc3QgJHRlc3QiCi0gIGZpCi1kb25lCi0KLSMgUmVwb3J0IHRoZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHRvIHRoZSBjb25zb2xlLgotZWNobyAiVGVzdHMgY29tcGxldGUgd2l0aCAkc3VjY2VlZGVkIHN1Y2Nlc3NlcyBhbmQgJGZhaWxlZCBmYWlsdXJlcy4iCi1pZiBbICRmYWlsZWQgLW5lIDAgXTsgdGhlbgotICBlY2hvICJUaGUgZm9sbG93aW5nIHRlc3RzIGZhaWxlZDoiCi0gIGVjaG8gJGZhaWxlZF9saXN0Ci1maQotZXhpdCAkZmFpbGVkCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYyBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmM0ZTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCi0vLwotLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKLS8vIHdpZGdldC5jYwotLy8KLQotLy8gV2lkZ2V0IGlzIGEgdmVyeSBzaW1wbGUgY2xhc3MgdXNlZCBmb3IgZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIGd0ZXN0Ci0KLSNpbmNsdWRlICJ3aWRnZXQuaCIKLQotV2lkZ2V0OjpXaWRnZXQoaW50IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCi0gICAgOiBudW1iZXJfKG51bWJlciksCi0gICAgICBuYW1lXyhuYW1lKSB7fQotCi1XaWRnZXQ6On5XaWRnZXQoKSB7fQotCi1mbG9hdCBXaWRnZXQ6OkdldEZsb2F0VmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBudW1iZXJfOwotfQotCi1pbnQgV2lkZ2V0OjpHZXRJbnRWYWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obnVtYmVyXyk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFdpZGdldDo6R2V0U3RyaW5nVmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotdm9pZCBXaWRnZXQ6OkdldENoYXJQdHJWYWx1ZShjaGFyKiBidWZmZXIsIHNpemVfdCBtYXhfc2l6ZSkgY29uc3QgewotICAvLyBDb3B5IHRoZSBjaGFyKiByZXByZXNlbnRhdGlvbiBvZiBuYW1lXyBpbnRvIGJ1ZmZlciwgdXAgdG8gbWF4X3NpemUuCi0gIHN0cm5jcHkoYnVmZmVyLCBuYW1lXy5jX3N0cigpLCBtYXhfc2l6ZS0xKTsKLSAgYnVmZmVyW21heF9zaXplLTFdID0gJ1wwJzsKLSAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaCBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTVjZGMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHByZXN0b24uYS5qYWNrc29uQGdtYWlsLmNvbSAoUHJlc3RvbiBKYWNrc29uKQotLy8KLS8vIEdvb2dsZSBUZXN0IC0gRnJhbWV3b3JrU2FtcGxlCi0vLyB3aWRnZXQuaAotLy8KLQotLy8gV2lkZ2V0IGlzIGEgdmVyeSBzaW1wbGUgY2xhc3MgdXNlZCBmb3IgZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIGd0ZXN0LiBJdAotLy8gc2ltcGx5IHN0b3JlcyB0d28gdmFsdWVzIGEgc3RyaW5nIGFuZCBhbiBpbnRlZ2VyLCB3aGljaCBhcmUgcmV0dXJuZWQgdmlhCi0vLyBwdWJsaWMgYWNjZXNzb3JzIGluIG11bHRpcGxlIGZvcm1zLgotCi0jaW1wb3J0IDxzdHJpbmc+Ci0KLWNsYXNzIFdpZGdldCB7Ci0gcHVibGljOgotICBXaWRnZXQoaW50IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOwotICB+V2lkZ2V0KCk7Ci0KLSAgLy8gUHVibGljIGFjY2Vzc29ycyB0byBudW1iZXIgZGF0YQotICBmbG9hdCBHZXRGbG9hdFZhbHVlKCkgY29uc3Q7Ci0gIGludCBHZXRJbnRWYWx1ZSgpIGNvbnN0OwotCi0gIC8vIFB1YmxpYyBhY2Nlc3NvcnMgdG8gdGhlIHN0cmluZyBkYXRhCi0gIHN0ZDo6c3RyaW5nIEdldFN0cmluZ1ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgR2V0Q2hhclB0clZhbHVlKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IG1heF9zaXplKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIERhdGEgbWVtYmVycwotICBmbG9hdCBudW1iZXJfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLX07CmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjIGIvdGVzdGluZy9ndGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNTk5NC4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCi0vLwotLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKLS8vIHdpZGdldF90ZXN0LmNjCi0vLwotCi0vLyBUaGlzIGlzIGEgc2ltcGxlIHRlc3QgZmlsZSBmb3IgdGhlIFdpZGdldCBjbGFzcyBpbiB0aGUgV2lkZ2V0LmZyYW1ld29yawotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlIDxXaWRnZXQvd2lkZ2V0Lmg+Ci0KLS8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUKLS8vIFdpZGdldCBjbGFzcyBjb3JyZWN0bHkuCi1URVNUKFdpZGdldEluaXRpYWxpemVyVGVzdCwgVGVzdENvbnN0cnVjdG9yKSB7Ci0gIFdpZGdldCB3aWRnZXQoMS4wZiwgIm5hbWUiKTsKLSAgRVhQRUNUX0ZMT0FUX0VRKDEuMGYsIHdpZGdldC5HZXRGbG9hdFZhbHVlKCkpOwotICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIm5hbWUiKSwgd2lkZ2V0LkdldFN0cmluZ1ZhbHVlKCkpOwotfQotCi0vLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGZsb2F0IGFuZCBzdHJpbmcgdmFsdWVzIHRvIGludCBhbmQKLS8vIGNoYXIqLCByZXNwZWN0aXZlbHkuCi1URVNUKFdpZGdldEluaXRpYWxpemVyVGVzdCwgVGVzdENvbnZlcnNpb24pIHsKLSAgV2lkZ2V0IHdpZGdldCgxLjBmLCAibmFtZSIpOwotICBFWFBFQ1RfRVEoMSwgd2lkZ2V0LkdldEludFZhbHVlKCkpOwotCi0gIHNpemVfdCBtYXhfc2l6ZSA9IDEyODsKLSAgY2hhciBidWZmZXJbbWF4X3NpemVdOwotICB3aWRnZXQuR2V0Q2hhclB0clZhbHVlKGJ1ZmZlciwgbWF4X3NpemUpOwotICBFWFBFQ1RfU1RSRVEoIm5hbWUiLCBidWZmZXIpOwotfQotCi0vLyBVc2UgdGhlIEdvb2dsZSBUZXN0IG1haW4gdGhhdCBpcyBsaW5rZWQgaW50byB0aGUgZnJhbWV3b3JrLiBJdCBkb2VzIHNvbWV0aGluZwotLy8gbGlrZSB0aGlzOgotLy8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0vLyAgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLS8vICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLS8vIH0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaCBiL3Rlc3RpbmcvZ3Rlc3QveGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjMjI5Zi4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NjcmlwdHMvcnVudGVzdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgotCi0jIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KLWV4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKLWV4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCi0KLSMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCi10ZXN0X2V4ZWN1dGFibGVzPSgiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiCi0gICAgICAgICAgICAgICAgICAiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdCIKLSAgICAgICAgICAgICAgICAgICIkQlVJTFRfUFJPRFVDVFNfRElSL3NhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIgotICAgICAgICAgICAgICAgICAgIiRCVUlMVF9QUk9EVUNUU19ESVIvc2FtcGxlMV91bml0dGVzdC1zdGF0aWMiKQotCi0jIE5vdyBleGVjdXRlIGVhY2ggb25lIGluIHR1cm4ga2VlcGluZyB0cmFjayBvZiBob3cgbWFueSBzdWNjZWVkZWQgYW5kIGZhaWxlZC4gCi1zdWNjZWVkZWQ9MAotZmFpbGVkPTAKLWZhaWxlZF9saXN0PSgpCi1mb3IgdGVzdCBpbiAke3Rlc3RfZXhlY3V0YWJsZXNbKl19OyBkbwotICAiJHRlc3QiCi0gIHJlc3VsdD0kPwotICBpZiBbICRyZXN1bHQgLWVxIDAgXTsgdGhlbgotICAgIHN1Y2NlZWRlZD0kKCggJHN1Y2NlZWRlZCArIDEgKSkKLSAgZWxzZQotICAgIGZhaWxlZD0kKCggZmFpbGVkICsgMSApKQotICAgIGZhaWxlZF9saXN0PSIkZmFpbGVkX2xpc3QgJHRlc3QiCi0gIGZpCi1kb25lCi0KLSMgUmVwb3J0IHRoZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHRvIHRoZSBjb25zb2xlLgotZWNobyAiVGVzdHMgY29tcGxldGUgd2l0aCAkc3VjY2VlZGVkIHN1Y2Nlc3NlcyBhbmQgJGZhaWxlZCBmYWlsdXJlcy4iCi1pZiBbICRmYWlsZWQgLW5lIDAgXTsgdGhlbgotICBlY2hvICJUaGUgZm9sbG93aW5nIHRlc3RzIGZhaWxlZDoiCi0gIGVjaG8gJGZhaWxlZF9saXN0Ci1maQotZXhpdCAkZmFpbGVkCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IGIvdGVzdGluZy9ndGVzdC94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkZThjOS4uMDAwMDAwMAotLS0gYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkEgc2NyaXB0IHRvIHByZXBhcmUgdmVyc2lvbiBpbmZvcm10aW9uIGZvciB1c2UgdGhlIGd0ZXN0IEluZm8ucGxpc3QgZmlsZS4KLQotICBUaGlzIHNjcmlwdCBleHRyYWN0cyB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb25maWd1cmUuYWMgZmlsZSBhbmQKLSAgdXNlcyBpdCB0byBnZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIHNhbWUgaW5mb3JtYXRpb24uIFRoZQotICAjZGVmaW5lcyBpbiB0aGlzIGhlYWRlciBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mCi0gIHRoZSBJbmZvLnBsaXN0IG9mIHRoZSBmcmFtZXdvcmssIGdpdmluZyB0aGUgY29ycmVjdCB2YWx1ZSB0byB0aGUgdmVyc2lvbgotICBzaG93biBpbiB0aGUgRmluZGVyLgotCi0gIFRoaXMgc2NyaXB0IG1ha2VzIHRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnMgKHRoZXNlIGFyZSBmYXVsdHMgb2YgdGhlIHNjcmlwdCwKLSAgbm90IHByb2JsZW1zIHdpdGggdGhlIEF1dG9jb25mKToKLSAgICAxLiBUaGUgQUNfSU5JVCBtYWNybyB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGZpcnN0IDEwMjQgY2hhcmFjdGVycwotICAgICAgIG9mIGNvbmZpZ3VyZS5hYwotICAgIDIuIFRoZSB2ZXJzaW9uIHN0cmluZyB3aWxsIGJlIDMgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgYW5kIHdpbGwgYmUKLSAgICAgICBzdXJyb3VuZGVkIGJ5IHNxdXJlIGJyYWNrZXRzLCAiWyIgYW5kICJdIiAoZS5nLiBbMS4wLjFdKS4gVGhlIGZpcnN0Ci0gICAgICAgc2VnbWVudCByZXByZXNlbnRzIHRoZSBtYWpvciB2ZXJzaW9uLCB0aGUgc2Vjb25kIHJlcHJlc2VudHMgdGhlIG1pbm9yCi0gICAgICAgdmVyc2lvbiBhbmQgdGhlIHRoaXJkIHJlcHJlc2VudHMgdGhlIGZpeCB2ZXJzaW9uLgotICAgIDMuIE5vICIpIiBjaGFyYWN0ZXIgZXhpc3RzIGJldHdlZW4gdGhlIG9wZW5pbmcgIigiIGFuZCBjbG9zaW5nICIpIiBvZgotICAgICAgIEFDX0lOSVQsIGluY2x1ZGluZyBpbiBjb21tZW50cyBhbmQgY2hhcmFjdGVyIHN0cmluZ3MuCi0iIiIKLQotaW1wb3J0IHN5cwotaW1wb3J0IHJlCi0KLSMgUmVhZCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50ICh0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgVmVyc2lvbi5oKQotaWYgKGxlbihzeXMuYXJndikgPCAzKToKLSAgcHJpbnQgIlVzYWdlOiB2ZXJzaW9uZ2VuZXJhdGUucHkgaW5wdXRfZGlyIG91dHB1dF9kaXIiCi0gIHN5cy5leGl0KDEpCi1lbHNlOgotICBpbnB1dF9kaXIgPSBzeXMuYXJndlsxXQotICBvdXRwdXRfZGlyID0gc3lzLmFyZ3ZbMl0KLQotIyBSZWFkIHRoZSBmaXJzdCAxMDI0IGNoYXJhY3RlcnMgb2YgdGhlIGNvbmZpZ3VyZS5hYyBmaWxlCi1jb25maWdfZmlsZSA9IG9wZW4oIiVzL2NvbmZpZ3VyZS5hYyIgJSBpbnB1dF9kaXIsICdyJykKLWJ1ZmZlcl9zaXplID0gMTAyNAotb3BlbmluZ19zdHJpbmcgPSBjb25maWdfZmlsZS5yZWFkKGJ1ZmZlcl9zaXplKQotY29uZmlnX2ZpbGUuY2xvc2UoKQotCi0jIEV4dHJhY3QgdGhlIHZlcnNpb24gc3RyaW5nIGZyb20gdGhlIEFDX0lOSVQgbWFjcm8KLSMgICBUaGUgZm9sbG93aW5nIGluaXRfZXhwcmVzc2lvbiBtZWFuczoKLSMgICAgIEV4dHJhY3QgdGhyZWUgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgYW5kIHN1cnJvdW5kZWQgYnkgc3F1cmUKLSMgICAgIGJyYWNrZXRzKGUuZy4gIlsxLjAuMV0iKSBiZXR3ZWVuICJBQ19JTklUKCIgYW5kICIpIi4gRG8gbm90IGJlIGdyZWVkeQotIyAgICAgKCo/IGlzIHRoZSBub24tZ3JlZWR5IGZsYWcpIHNpbmNlIHRoYXQgd291bGQgcHVsbCBpbiBldmVyeXRoaW5nIGJldHdlZW4KLSMgICAgIHRoZSBmaXJzdCAiKCIgYW5kIHRoZSBsYXN0ICIpIiBpbiB0aGUgZmlsZS4KLXZlcnNpb25fZXhwcmVzc2lvbiA9IHJlLmNvbXBpbGUociJBQ19JTklUXCguKj9cWyhcZCspXC4oXGQrKVwuKFxkKylcXS4qP1wpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuRE9UQUxMKQotdmVyc2lvbl92YWx1ZXMgPSB2ZXJzaW9uX2V4cHJlc3Npb24uc2VhcmNoKG9wZW5pbmdfc3RyaW5nKQotbWFqb3JfdmVyc2lvbiA9IHZlcnNpb25fdmFsdWVzLmdyb3VwKDEpCi1taW5vcl92ZXJzaW9uID0gdmVyc2lvbl92YWx1ZXMuZ3JvdXAoMikKLWZpeF92ZXJzaW9uID0gdmVyc2lvbl92YWx1ZXMuZ3JvdXAoMykKLQotIyBXcml0ZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB0byBhIGhlYWRlciBmaWxlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQotIyBJbmZvLnBsaXN0IGZpbGUuCi1maWxlX2RhdGEgPSAiIiIvLwotLy8gRE8gTk9UIE1PRElGWSBUSElTIEZJTEUgKGJ1dCB5b3UgY2FuIGRlbGV0ZSBpdCkKLS8vCi0vLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSB0aGUgdmVyc2lvbmdlbmVyYXRlLnB5IHNjcmlwdC4gVGhpcyBzY3JpcHQKLS8vIGlzIGV4ZWN1dGVkIGluIGEgIlJ1biBTY3JpcHQiIGJ1aWxkIHBoYXNlIHdoZW4gY3JlYXRpbmcgZ3Rlc3QuZnJhbWV3b3JrLiBUaGlzCi0vLyBoZWFkZXIgZmlsZSBpcyBub3QgdXNlZCBkdXJpbmcgY29tcGlsYXRpb24gb2YgQy1zb3VyY2UuIFJhdGhlciwgaXQgc2ltcGx5Ci0vLyBkZWZpbmVzIHNvbWUgdmVyc2lvbiBzdHJpbmdzIGZvciBzdWJzdGl0dXRpb24gaW4gdGhlIEluZm8ucGxpc3QuIEJlY2F1c2Ugb2YKLS8vIHRoaXMsIHdlIGFyZSBub3Qgbm90IHJlc3RyaWN0ZWQgdG8gQy1zeW50YXggbm9yIGFyZSB3ZSB1c2luZyBpbmNsdWRlIGd1YXJkcy4KLS8vCi0KLSNkZWZpbmUgR1RFU1RfVkVSU0lPTklORk9fU0hPUlQgJXMuJXMKLSNkZWZpbmUgR1RFU1RfVkVSU0lPTklORk9fTE9ORyAlcy4lcy4lcwotCi0iIiIgJSAobWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbiwgbWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbiwgZml4X3ZlcnNpb24pCi12ZXJzaW9uX2ZpbGUgPSBvcGVuKCIlcy9WZXJzaW9uLmgiICUgb3V0cHV0X2RpciwgJ3cnKQotdmVyc2lvbl9maWxlLndyaXRlKGZpbGVfZGF0YSkKLXZlcnNpb25fZmlsZS5jbG9zZSgpCmRpZmYgLS1naXQgYS90ZXN0aW5nL2d0ZXN0L3hjb2RlL2d0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi90ZXN0aW5nL2d0ZXN0L3hjb2RlL2d0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTJhNjMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9ndGVzdC94Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNSArMCwwIEBACi0vLyAhJCpVVEY4KiQhCi17Ci0JYXJjaGl2ZVZlcnNpb24gPSAxOwotCWNsYXNzZXMgPSB7Ci0JfTsKLQlvYmplY3RWZXJzaW9uID0gNDY7Ci0Jb2JqZWN0cyA9IHsKLQotLyogQmVnaW4gUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KLQkJM0IyMzhGNUYwRTgyOEI1NDAwODQ2RTExIC8qIENoZWNrICovID0gewotCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OwotCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDNCMjM4RkEzMEU4MjhCQjYwMDg0NkUxMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiQ2hlY2siICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJM0IyMzhGNUUwRTgyOEI1NDAwODQ2RTExIC8qIFNoZWxsU2NyaXB0ICovLAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCQk0MDg5OUY5RDBGRkE3NDBGMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MEM4NDlGNzEwMUE0MzQ0MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MDg5QTA5ODBGRkFEMzRBMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MEM4NDlGOTEwMUE0MzQ5MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCSk7Ci0JCQluYW1lID0gQ2hlY2s7Ci0JCQlwcm9kdWN0TmFtZSA9IENoZWNrOwotCQl9OwotCQk0MEM0NEFEQzBFMzc5OEY0MDA4RkNDNTEgLyogVmVyc2lvbiBJbmZvICovID0gewotCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OwotCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzQ0QUU0MEUzNzk5MDUwMDhGQ0M1MSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVmVyc2lvbiBJbmZvIiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJCTQwQzQ0QURCMEUzNzk4RjQwMDhGQ0M1MSAvKiBHZW5lcmF0ZSBWZXJzaW9uLmggKi8sCi0JCQkpOwotCQkJY29tbWVudHMgPSAiVGhlIGdlbmVyYXRpb24gb2YgVmVyc2lvbi5oIG11c3QgYmUgcGVyZm9ybWVkIGluIGl0cyBvd24gdGFyZ2V0LiBTaW5jZSB0aGUgSW5mby5wbGlzdCBpcyBwcmVwcm9jZXNzZWQgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgYnVpbGQgcGhhc2VzIGluIGd0ZXN0LCB0aGUgVmVyc2lvbi5oIGZpbGUgd291bGQgbm90IGJlIHJlYWR5IGlmIGluY2x1ZGVkIGFzIGEgYnVpbGQgcGhhc2Ugb2YgdGhhdCB0YXJnZXQuIjsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCSk7Ci0JCQluYW1lID0gIlZlcnNpb24gSW5mbyI7Ci0JCQlwcm9kdWN0TmFtZSA9IFZlcnNpb24uaDsKLQkJfTsKLS8qIEVuZCBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLwotCQkyMjRBMTJBMzBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OwotCQkzQkY2RjJBMDBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCRjZGMjlGMEU3OUI1QUQwMDBGMkVFRSAvKiBndGVzdC10eXBlLXV0aWwuaCAqLzsgfTsKLQkJM0JGNkYyQTUwRTc5QjYxNjAwMEYyRUVFIC8qIGd0ZXN0LXR5cGVkLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCRjZGMkE0MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OwotCQk0MDQ4ODQzODBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZGVhdGgtdGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07Ci0JCTQwNDg4NDM5MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNEQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKLQkJNDA0ODg0M0EwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKLQkJNDA0ODg0M0IwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNERTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07Ci0JCTQwNDg4NDNDMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0RGMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07Ci0JCTQwNDg4NDNEMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcm9kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKLQkJNDA0ODg0NTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRjYwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRSAqLzsgfTsKLQkJNDA0ODg0QTAwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLzsgfTsKLQkJNDA0ODg0QTEwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWZpbGVwYXRoLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0UzMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oICovOyB9OwotCQk0MDQ4ODRBMjBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWludGVybmFsLmggKi87IH07Ci0JCTQwNDg4NEEzMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U1MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggKi87IH07Ci0JCTQwNDg4NEE0MEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTYwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oICovOyB9OwotCQk0MDQ4ODRBQzBFMkY3Q0Q5MDBDRjc2NTggLyogQ0hBTkdFUyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0QTkwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgKi87IH07Ci0JCTQwNDg4NEFEMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi87IH07Ci0JCTQwNDg4NEFFMEUyRjdDRDkwMENGNzY1OCAvKiBMSUNFTlNFIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODRBQjBFMkY3Q0Q5MDBDRjc2NTggLyogTElDRU5TRSAqLzsgfTsKLQkJNDA4OTlGM0EwRkZBNzBENDAwMEIyOUFFIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi87IH07Ci0JCTQwODk5RjUwMEZGQTcyODEwMDBCMjlBRSAvKiBndGVzdC10dXBsZS5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLzsgfTsKLQkJNDA4OTlGNTMwRkZBNzJBMDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovOyB9OwotCQk0MDg5QTA0NDBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovOyB9OwotCQk0MDg5QTA0NjBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovOyB9OwotCQk0MEM4NDhGRjEwMUEyMTE1MDA4MzY0MkEgLyogZ3Rlc3QtYWxsLmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjI0QTEyQTEwRTlFQURBNzAwQkQxN0ZEIC8qIGd0ZXN0LWFsbC5jYyAqLzsgfTsKLQkJNDBDODQ5MTUxMDFBMjFERjAwODM2NDJBIC8qIGd0ZXN0X21haW4uY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLzsgfTsKLQkJNDBDODQ5MTYxMDFBMjM1QjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi87IH07Ci0JCTQwQzg0OTIxMTAxQTIzQUQwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OwotCQk0MEM4NDk3ODEwMUEzNjU0MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OwotCQk0MEM4NDk4MDEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi87IH07Ci0JCTQwQzg0OTgyMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi87IH07Ci0JCTQwQzg0OTgzMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OwotCQk0MEM4NDk4RjEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovOyB9OwotCQk0MEM4NDk5MDEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovOyB9OwotCQk0MEM4NDk5MjEwMUEzNkE2MDA4MzY0MkEgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovOyB9OwotCQk0MEM4NDk5MzEwMUEzNkE2MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKLQkJNDBDODQ5QTIxMDFBMzcwNTAwODM2NDJBIC8qIGd0ZXN0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi87IH07Ci0JCTQwQzg0OUE0MTAxQTM3MTUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOyB9OwotCQk0NTM5QzkzNDBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzMwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07Ci0JCTQ1MzlDOTM4MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1saW5rZWRfcHRyLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTM1MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1saW5rZWRfcHRyLmggKi87IH07Ci0JCTQ1MzlDOTM5MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzkzNjBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCAqLzsgfTsKLQkJNDUzOUM5M0EwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzcwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCAqLzsgfTsKLQkJNDU2N0M4MTgxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTY3QzgxNzEyNjRGRjcxMDA3NzQwQkUgLyogZ3Rlc3QtcHJpbnRlcnMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07Ci0vKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KLQkJNDA4OTlGOUMwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwODk5RjQyMEZGQTcxODQwMDBCMjlBRTsKLQkJCXJlbW90ZUluZm8gPSBndGVzdF91bml0dGVzdDsKLQkJfTsKLQkJNDA4OUEwOTcwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRTsKLQkJCXJlbW90ZUluZm8gPSBzYW1wbGUxX3VuaXR0ZXN0OwotCQl9OwotCQk0MDhCRUMwRjEwNDZDRkU5MDBERUY1MjIgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0gewotCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OwotCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotCQkJcHJveHlUeXBlID0gMTsKLQkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBOwotCQkJcmVtb3RlSW5mbyA9ICJndGVzdC1zdGF0aWMiOwotCQl9OwotCQk0MEM0NEFFNTBFMzc5OTIyMDA4RkNDNTEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0gewotCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OwotCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotCQkJcHJveHlUeXBlID0gMTsKLQkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxOwotCQkJcmVtb3RlSW5mbyA9IFZlcnNpb24uaDsKLQkJfTsKLQkJNDBDODQ5N0MxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKLQkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKLQkJfTsKLQkJNDBDODQ5N0UxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQTsKLQkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfbWFpbi1zdGF0aWMiOwotCQl9OwotCQk0MEM4NDk4QjEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0gewotCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OwotCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotCQkJcHJveHlUeXBlID0gMTsKLQkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBOwotCQkJcmVtb3RlSW5mbyA9ICJndGVzdC1zdGF0aWMiOwotCQl9OwotCQk0MEM4NDk4RDEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0gewotCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OwotCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOwotCQkJcHJveHlUeXBlID0gMTsKLQkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBOwotCQkJcmVtb3RlSW5mbyA9ICJndGVzdF9tYWluLXN0YXRpYyI7Ci0JCX07Ci0JCTQwQzg0OTlCMTAxQTM2REMwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7Ci0JCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7Ci0JCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Ci0JCQlwcm94eVR5cGUgPSAxOwotCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkE7Ci0JCQlyZW1vdGVJbmZvID0gImd0ZXN0X21haW4tc3RhdGljIjsKLQkJfTsKLQkJNDBDODQ5OUQxMDFBMzZFNTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMDsKLQkJCXJlbW90ZUluZm8gPSAiZ3Rlc3QtZnJhbWV3b3JrIjsKLQkJfTsKLQkJNDBDODQ5OUYxMDFBMzZGMTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMDsKLQkJCXJlbW90ZUluZm8gPSAiZ3Rlc3QtZnJhbWV3b3JrIjsKLQkJfTsKLQkJNDBDODQ5RjYxMDFBNDM0NDAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQTsKLQkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIjsKLQkJfTsKLQkJNDBDODQ5RjgxMDFBNDM0OTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKLQkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKLQkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKLQkJCXByb3h5VHlwZSA9IDE7Ci0JCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTg5MTAxQTM2QTYwMDgzNjQyQTsKLQkJCXJlbW90ZUluZm8gPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOwotCQl9OwotLyogRW5kIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQk0MDQ4ODRBNTBFMkY3QzA0MDBDRjc2NTggLyogQ29weSBIZWFkZXJzIEludGVybmFsICovID0gewotCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlkc3RQYXRoID0gSGVhZGVycy9pbnRlcm5hbDsKLQkJCWRzdFN1YmZvbGRlclNwZWMgPSA2OwotCQkJZmlsZXMgPSAoCi0JCQkJNDA0ODg0QTAwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCi0JCQkJNDA0ODg0QTEwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWZpbGVwYXRoLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAotCQkJCTQwNDg4NEEyMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKLQkJCQk0NTM5QzkzODBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKLQkJCQk0NTM5QzkzOTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCi0JCQkJNDUzOUM5M0EwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCi0JCQkJNDA0ODg0QTMwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LXBvcnQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCi0JCQkJNDA0ODg0QTQwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKLQkJCQk0MDg5OUY1MDBGRkE3MjgxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCi0JCQkJM0JGNkYyQTAwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKLQkJCSk7Ci0JCQluYW1lID0gIkNvcHkgSGVhZGVycyBJbnRlcm5hbCI7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLS8qIEVuZCBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCi0JCTIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gImd0ZXN0LWFsbC5jYyI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTIyNEExMkEyMEU5RUFEQ0MwMEJEMTdGRCAvKiBndGVzdC10ZXN0LXBhcnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC10ZXN0LXBhcnQuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTNCMjM4QzEyMEU3RkUxM0MwMDg0NkUxMSAvKiBndGVzdF91bml0dGVzdC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGd0ZXN0X3VuaXR0ZXN0LmNjOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQkzQjg3RDIxMDBFOTZCOTJFMDAwRDE4NTIgLyogcnVudGVzdHMuc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnNjcmlwdC5zaDsgcGF0aCA9IHJ1bnRlc3RzLnNoOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQkzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC10eXBlLXV0aWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTNCRjZGMkE0MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC10eXBlZC10ZXN0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk0MDNFRTM3QzBFMzc3ODIyMDA0QkQxRTIgLyogdmVyc2lvbmdlbmVyYXRlLnB5ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQucHl0aG9uOyBwYXRoID0gdmVyc2lvbmdlbmVyYXRlLnB5OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk0MDQ4ODNEQjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZGVhdGgtdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtZGVhdGgtdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LW1lc3NhZ2UuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXNwaS5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDA0ODgzREUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0RGMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZ3Rlc3RfcHJlZF9pbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0UwMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcm9kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0X3Byb2QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0UzMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtZmlsZXBhdGguaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtaW50ZXJuYWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0U1MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wb3J0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk0MDQ4ODNFNjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1zdHJpbmcuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwNDg4M0Y2MEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gUkVBRE1FOyBwYXRoID0gLi4vUkVBRE1FOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07Ci0JCTQwNDg4NDBEMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9tYWluLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gZ3Rlc3RfbWFpbi5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDA0ODg0QTkwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ0hBTkdFUzsgcGF0aCA9IC4uL0NIQU5HRVM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNDA0ODg0QUEwRTJGN0NEOTAwQ0Y3NjU4IC8qIENPTlRSSUJVVE9SUyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBDT05UUklCVVRPUlM7IHBhdGggPSAuLi9DT05UUklCVVRPUlM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gTElDRU5TRTsgcGF0aCA9IC4uL0xJQ0VOU0U7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKLQkJNDA4OTlGNDMwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07Ci0JCTQwODk5RjREMEZGQTcyNzEwMDBCMjlBRSAvKiBndGVzdC10dXBsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHVwbGUuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwODlBMDEzMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLQkJNDA4OUEwMkMwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTEuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBzYW1wbGUxLmNjOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk0MDg5QTAyRDBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBzYW1wbGUxLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gc2FtcGxlMV91bml0dGVzdC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IGFyY2hpdmUuYXI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYmd0ZXN0LmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07Ci0JCTQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IGFyY2hpdmUuYXI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYmd0ZXN0X21haW4uYTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLQkJNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBndGVzdF91bml0dGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKLQkJNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OwotCQk0MEQ0Q0RGMTBFMzBFMDc0MDAyOTQ4MDEgLyogRGVidWdQcm9qZWN0LnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IERlYnVnUHJvamVjdC54Y2NvbmZpZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBGcmFtZXdvcmtUYXJnZXQueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwRDRDREYzMEUzMEUwNzQwMDI5NDgwMSAvKiBHZW5lcmFsLnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IEdlbmVyYWwueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQwRDRDREY0MEUzMEUwNzQwMDI5NDgwMSAvKiBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDBENENGNTEwRTMwRjVFMjAwMjk0ODAxIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBndGVzdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07Ci0JCTQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS10ZXN0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtbGlua2VkX3B0ci5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDUzOUM5MzcwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXBhcmFtLXV0aWwuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQ1NjdDODE3MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcHJpbnRlcnMuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0vKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQkJNDA4OTlGNDEwRkZBNzE4NDAwMEIyOUFFIC8qIEZyYW1ld29ya3MgKi8gPSB7Ci0JCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk0MEM4NDlBNDEwMUEzNzE1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCi0JCQkJNDBDODQ5MTYxMDFBMjM1QjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotCQk0MDg5QTAxMTBGRkFDRUZDMDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLyA9IHsKLQkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTQwQzg0OUEyMTAxQTM3MDUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKLQkJCQk0MEM4NDkyMTEwMUEyM0FEMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCTQwQzg0OTgxMTAxQTM2ODUwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovID0gewotCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNDBDODQ5ODIxMDFBMzY4NTAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLywKLQkJCQk0MEM4NDk4MzEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCTQwQzg0OTkxMTAxQTM2QTYwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovID0gewotCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNDBDODQ5OTIxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLywKLQkJCQk0MEM4NDk5MzEwMUEzNkE2MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0vKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCi0JCTAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLywKLQkJCQk0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLywKLQkJCQk0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovLAotCQkJCTQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi8sCi0JCQkJNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovLAotCQkJCTQwODlBMDEzMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLywKLQkJCQk0MEM4NDk5NzEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8sCi0JCQkpOwotCQkJbmFtZSA9IFByb2R1Y3RzOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGd0ZXN0ICovID0gewotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQk0MEQ0Q0RGMDBFMzBFMDc0MDAyOTQ4MDEgLyogQ29uZmlnICovLAotCQkJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8sCi0JCQkJNDBENENGNEUwRTMwRjVFMjAwMjk0ODAxIC8qIFJlc291cmNlcyAqLywKLQkJCQk0MDNFRTM3QjBFMzc3ODIyMDA0QkQxRTIgLyogU2NyaXB0cyAqLywKLQkJCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8sCi0JCQkpOwotCQkJbmFtZSA9IGd0ZXN0OwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJMDhGQjc3QUNGRTg0MTcwN0MwMkFBQzA3IC8qIFNvdXJjZSAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNDA0ODg0QTkwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgKi8sCi0JCQkJNDA0ODg0QUEwRTJGN0NEOTAwQ0Y3NjU4IC8qIENPTlRSSUJVVE9SUyAqLywKLQkJCQk0MDQ4ODRBQjBFMkY3Q0Q5MDBDRjc2NTggLyogTElDRU5TRSAqLywKLQkJCQk0MDQ4ODNGNjBFMkY3OTlCMDBDRjc2NTggLyogUkVBRE1FICovLAotCQkJCTQwNDg4M0Q5MEUyRjc5OUIwMENGNzY1OCAvKiBpbmNsdWRlICovLAotCQkJCTQwODlBMDJGMEZGQUNGODQwMDBCMjlBRSAvKiBzYW1wbGVzICovLAotCQkJCTQwNDg4NDA3MEUyRjc5OUIwMENGNzY1OCAvKiBzcmMgKi8sCi0JCQkJM0IyMzhCRjAwRTdGRTEzQjAwODQ2RTExIC8qIHRlc3QgKi8sCi0JCQkpOwotCQkJbmFtZSA9IFNvdXJjZTsKLQkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7Ci0JCX07Ci0JCTNCMjM4QkYwMEU3RkUxM0IwMDg0NkUxMSAvKiB0ZXN0ICovID0gewotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQkzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi8sCi0JCQkpOwotCQkJbmFtZSA9IHRlc3Q7Ci0JCQlwYXRoID0gLi4vdGVzdDsKLQkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKLQkJfTsKLQkJNDAzRUUzN0IwRTM3NzgyMjAwNEJEMUUyIC8qIFNjcmlwdHMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTQwM0VFMzdDMEUzNzc4MjIwMDRCRDFFMiAvKiB2ZXJzaW9uZ2VuZXJhdGUucHkgKi8sCi0JCQkJM0I4N0QyMTAwRTk2QjkyRTAwMEQxODUyIC8qIHJ1bnRlc3RzLnNoICovLAotCQkJKTsKLQkJCXBhdGggPSBTY3JpcHRzOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJNDA0ODgzRDkwRTJGNzk5QjAwQ0Y3NjU4IC8qIGluY2x1ZGUgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTQwNDg4M0RBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdCAqLywKLQkJCSk7Ci0JCQluYW1lID0gaW5jbHVkZTsKLQkJCXBhdGggPSAuLi9pbmNsdWRlOwotCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOwotCQl9OwotCQk0MDQ4ODNEQTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTQwNDg4M0UxMEUyRjc5OUIwMENGNzY1OCAvKiBpbnRlcm5hbCAqLywKLQkJCQkyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi8sCi0JCQkJNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLywKLQkJCQk0MDQ4ODNEQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oICovLAotCQkJCTQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi8sCi0JCQkJNDU2N0M4MTcxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggKi8sCi0JCQkJNDA0ODgzREQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oICovLAotCQkJCTQwNDg4M0RFMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oICovLAotCQkJCTQwNDg4M0RGMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdF9wcmVkX2ltcGwuaCAqLywKLQkJCQk0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovLAotCQkJCTNCRjZGMkE0MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggKi8sCi0JCQkpOwotCQkJcGF0aCA9IGd0ZXN0OwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJNDA0ODgzRTEwRTJGNzk5QjAwQ0Y3NjU4IC8qIGludGVybmFsICovID0gewotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQk0MDQ4ODNFMjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oICovLAotCQkJCTQwNDg4M0UzMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oICovLAotCQkJCTQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovLAotCQkJCTQ1MzlDOTM1MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1saW5rZWRfcHRyLmggKi8sCi0JCQkJNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi8sCi0JCQkJNDUzOUM5MzcwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwuaCAqLywKLQkJCQk0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovLAotCQkJCTQwNDg4M0U2MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCAqLywKLQkJCQk0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLywKLQkJCQkzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi8sCi0JCQkpOwotCQkJcGF0aCA9IGludGVybmFsOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJNDA0ODg0MDcwRTJGNzk5QjAwQ0Y3NjU4IC8qIHNyYyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMjI0QTEyQTEwRTlFQURBNzAwQkQxN0ZEIC8qIGd0ZXN0LWFsbC5jYyAqLywKLQkJCQk0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLywKLQkJCSk7Ci0JCQluYW1lID0gc3JjOwotCQkJcGF0aCA9IC4uL3NyYzsKLQkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKLQkJfTsKLQkJNDA4OUEwMkYwRkZBQ0Y4NDAwMEIyOUFFIC8qIHNhbXBsZXMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovLAotCQkJCTQwODlBMDJEMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmggKi8sCi0JCQkJNDA4OUEwMkUwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgKi8sCi0JCQkpOwotCQkJbmFtZSA9IHNhbXBsZXM7Ci0JCQlwYXRoID0gLi4vc2FtcGxlczsKLQkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKLQkJfTsKLQkJNDBENENERjAwRTMwRTA3NDAwMjk0ODAxIC8qIENvbmZpZyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLywKLQkJCQk0MEQ0Q0RGMjBFMzBFMDc0MDAyOTQ4MDEgLyogRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnICovLAotCQkJCTQwRDRDREYzMEUzMEUwNzQwMDI5NDgwMSAvKiBHZW5lcmFsLnhjY29uZmlnICovLAotCQkJCTQwRDRDREY0MEUzMEUwNzQwMDI5NDgwMSAvKiBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZyAqLywKLQkJCQk0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLywKLQkJCSk7Ci0JCQlwYXRoID0gQ29uZmlnOwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKLQkJNDBENENGNEUwRTMwRjVFMjAwMjk0ODAxIC8qIFJlc291cmNlcyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJNDBENENGNTEwRTMwRjVFMjAwMjk0ODAxIC8qIEluZm8ucGxpc3QgKi8sCi0JCQkpOwotCQkJcGF0aCA9IFJlc291cmNlczsKLQkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7Ci0JCX07Ci0vKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCi0JCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovID0gewotCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNDA0ODg0MzgwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCBpbiBIZWFkZXJzICovLAotCQkJCTQwNDg4NDM5MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggaW4gSGVhZGVycyAqLywKLQkJCQk0NTM5QzkzNDBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJNDU2N0M4MTgxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggaW4gSGVhZGVycyAqLywKLQkJCQkzQkY2RjJBNTBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJNDA0ODg0M0EwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXNwaS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJNDA0ODg0M0IwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggaW4gSGVhZGVycyAqLywKLQkJCQk0MDQ4ODQzQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggaW4gSGVhZGVycyAqLywKLQkJCQk0MDQ4ODQzRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJMjI0QTEyQTMwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oIGluIEhlYWRlcnMgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0vKiBFbmQgUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLwotCQk0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovID0gewotCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OwotCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwODk5RjRBMEZGQTcxQkMwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJCTQwODk5RjQwMEZGQTcxODQwMDBCMjlBRSAvKiBTb3VyY2VzICovLAotCQkJCTQwODk5RjQxMEZGQTcxODQwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovLAotCQkJKTsKLQkJCWJ1aWxkUnVsZXMgPSAoCi0JCQkpOwotCQkJZGVwZW5kZW5jaWVzID0gKAotCQkJCTQwQzg0OUEwMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAotCQkJKTsKLQkJCW5hbWUgPSAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIjsKLQkJCXByb2R1Y3ROYW1lID0gZ3Rlc3RfdW5pdHRlc3Q7Ci0JCQlwcm9kdWN0UmVmZXJlbmNlID0gNDA4OTlGNDMwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLzsKLQkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7Ci0JCX07Ci0JCTQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHsKLQkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDg5QTAyNDBGRkFDRjAxMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJCTQwODlBMDEwMEZGQUNFRkMwMDBCMjlBRSAvKiBTb3VyY2VzICovLAotCQkJCTQwODlBMDExMEZGQUNFRkMwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovLAotCQkJKTsKLQkJCWJ1aWxkUnVsZXMgPSAoCi0JCQkpOwotCQkJZGVwZW5kZW5jaWVzID0gKAotCQkJCTQwQzg0OTlFMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAotCQkJKTsKLQkJCW5hbWUgPSAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiOwotCQkJcHJvZHVjdE5hbWUgPSBzYW1wbGUxX3VuaXR0ZXN0OwotCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDQwODlBMDEzMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLzsKLQkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7Ci0JCX07Ci0JCTQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5MDIxMDFBMjEyRTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdC1zdGF0aWMiICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJNDBDODQ4RjcxMDFBMjA5QzAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCi0JCQkpOwotCQkJYnVpbGRSdWxlcyA9ICgKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkpOwotCQkJbmFtZSA9ICJndGVzdC1zdGF0aWMiOwotCQkJcHJvZHVjdE5hbWUgPSAiZ3Rlc3Qtc3RhdGljIjsKLQkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLzsKLQkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOwotCQl9OwotCQk0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5MTIxMDFBMjFEMjAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF9tYWluLXN0YXRpYyIgKi87Ci0JCQlidWlsZFBoYXNlcyA9ICgKLQkJCQk0MEM4NDkwODEwMUEyMTdFMDA4MzY0MkEgLyogU291cmNlcyAqLywKLQkJCSk7Ci0JCQlidWlsZFJ1bGVzID0gKAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCSk7Ci0JCQluYW1lID0gImd0ZXN0X21haW4tc3RhdGljIjsKLQkJCXByb2R1Y3ROYW1lID0gImd0ZXN0X21haW4tc3RhdGljIjsKLQkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOwotCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LnN0YXRpYyI7Ci0JCX07Ci0JCTQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC1zdGF0aWMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5ODQxMDFBMzY4NTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF91bml0dGVzdC1zdGF0aWMiICovOwotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJNDBDODQ5N0YxMDFBMzY4NTAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCi0JCQkJNDBDODQ5ODExMDFBMzY4NTAwODM2NDJBIC8qIEZyYW1ld29ya3MgKi8sCi0JCQkpOwotCQkJYnVpbGRSdWxlcyA9ICgKLQkJCSk7Ci0JCQlkZXBlbmRlbmNpZXMgPSAoCi0JCQkJNDBDODQ5N0IxMDFBMzY4NTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCi0JCQkJNDBDODQ5N0QxMDFBMzY4NTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCi0JCQkpOwotCQkJbmFtZSA9ICJndGVzdF91bml0dGVzdC1zdGF0aWMiOwotCQkJcHJvZHVjdE5hbWUgPSBndGVzdF91bml0dGVzdDsKLQkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDk4NzEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3QgKi87Ci0JCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOwotCQl9OwotCQk0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDBDODQ5OTQxMDFBMzZBNjAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyIgKi87Ci0JCQlidWlsZFBoYXNlcyA9ICgKLQkJCQk0MEM4NDk4RTEwMUEzNkE2MDA4MzY0MkEgLyogU291cmNlcyAqLywKLQkJCQk0MEM4NDk5MTEwMUEzNkE2MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLywKLQkJCSk7Ci0JCQlidWlsZFJ1bGVzID0gKAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCQk0MEM4NDk4QTEwMUEzNkE2MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MEM4NDk4QzEwMUEzNkE2MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCSk7Ci0JCQluYW1lID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKLQkJCXByb2R1Y3ROYW1lID0gc2FtcGxlMV91bml0dGVzdDsKLQkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MEM4NDk5NzEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi87Ci0JCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOwotCQl9OwotCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogZ3Rlc3QtZnJhbWV3b3JrICovID0gewotCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OwotCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3QtZnJhbWV3b3JrIiAqLzsKLQkJCWJ1aWxkUGhhc2VzID0gKAotCQkJCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovLAotCQkJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovLAotCQkJCTQwNDg4NEE1MEUyRjdDMDQwMENGNzY1OCAvKiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCi0JCQkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLywKLQkJCSk7Ci0JCQlidWlsZFJ1bGVzID0gKAotCQkJKTsKLQkJCWRlcGVuZGVuY2llcyA9ICgKLQkJCQk0MEM0NEFFNjBFMzc5OTIyMDA4RkNDNTEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MDhCRUMxMDEwNDZDRkU5MDBERUY1MjIgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCQk0MEM4NDk5QzEwMUEzNkRDMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKLQkJCSk7Ci0JCQluYW1lID0gImd0ZXN0LWZyYW1ld29yayI7Ci0JCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiOwotCQkJcHJvZHVjdE5hbWUgPSBndGVzdDsKLQkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOwotCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5mcmFtZXdvcmsiOwotCQl9OwotLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLwotCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7Ci0JCQlpc2EgPSBQQlhQcm9qZWN0OwotCQkJYXR0cmlidXRlcyA9IHsKLQkJCQlMYXN0VXBncmFkZUNoZWNrID0gMDQ2MDsKLQkJCX07Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNEZBREMyNDYwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiZ3Rlc3QiICovOwotCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMy4yIjsKLQkJCWRldmVsb3BtZW50UmVnaW9uID0gRW5nbGlzaDsKLQkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOwotCQkJa25vd25SZWdpb25zID0gKAotCQkJCUVuZ2xpc2gsCi0JCQkJSmFwYW5lc2UsCi0JCQkJRnJlbmNoLAotCQkJCUdlcm1hbiwKLQkJCQllbiwKLQkJCSk7Ci0JCQltYWluR3JvdXAgPSAwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ3Rlc3QgKi87Ci0JCQlwcm9kdWN0UmVmR3JvdXAgPSAwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi87Ci0JCQlwcm9qZWN0RGlyUGF0aCA9ICIiOwotCQkJcHJvamVjdFJvb3QgPSAiIjsKLQkJCXRhcmdldHMgPSAoCi0JCQkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIGd0ZXN0LWZyYW1ld29yayAqLywKLQkJCQk0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovLAotCQkJCTQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQSAvKiBndGVzdF9tYWluLXN0YXRpYyAqLywKLQkJCQk0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovLAotCQkJCTQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC1zdGF0aWMgKi8sCi0JCQkJNDA4OUEwMTIwRkZBQ0VGQzAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrICovLAotCQkJCTQwQzg0OTg5MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLywKLQkJCQkzQjIzOEY1RjBFODI4QjU0MDA4NDZFMTEgLyogQ2hlY2sgKi8sCi0JCQkJNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxIC8qIFZlcnNpb24gSW5mbyAqLywKLQkJCSk7Ci0JCX07Ci0vKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCi0KLS8qIEJlZ2luIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQk4RDA3RjJCRjA0ODZDQzdBMDA3Q0QxRDAgLyogUmVzb3VyY2VzICovID0gewotCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk0MDQ4ODQ1MDBFMkY3OTlCMDBDRjc2NTggLyogUkVBRE1FIGluIFJlc291cmNlcyAqLywKLQkJCQk0MDQ4ODRBQzBFMkY3Q0Q5MDBDRjc2NTggLyogQ0hBTkdFUyBpbiBSZXNvdXJjZXMgKi8sCi0JCQkJNDA0ODg0QUQwRTJGN0NEOTAwQ0Y3NjU4IC8qIENPTlRSSUJVVE9SUyBpbiBSZXNvdXJjZXMgKi8sCi0JCQkJNDA0ODg0QUUwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgaW4gUmVzb3VyY2VzICovLAotCQkJCTQwQzg0OTc4MTAxQTM2NTQwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gUmVzb3VyY2VzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQkzQjIzOEY1RTBFODI4QjU0MDA4NDZFMTEgLyogU2hlbGxTY3JpcHQgKi8gPSB7Ci0JCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkpOwotCQkJaW5wdXRQYXRocyA9ICgKLQkJCSk7Ci0JCQlvdXRwdXRQYXRocyA9ICgKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7Ci0JCQlzaGVsbFNjcmlwdCA9ICIjIFJlbWVtYmVyLCB0aGlzIFwiUnVuIFNjcmlwdFwiIGJ1aWxkIHBoYXNlIHdpbGwgYmUgZXhlY3V0ZWQgZnJvbSAkU1JDUk9PVFxuL2Jpbi9iYXNoIFNjcmlwdHMvcnVudGVzdHMuc2giOwotCQl9OwotCQk0MEM0NEFEQjBFMzc5OEY0MDA4RkNDNTEgLyogR2VuZXJhdGUgVmVyc2lvbi5oICovID0gewotCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJKTsKLQkJCWlucHV0UGF0aHMgPSAoCi0JCQkJIiQoU1JDUk9PVCkvU2NyaXB0cy92ZXJzaW9uZ2VuZXJhdGUucHkiLAotCQkJCSIkKFNSQ1JPT1QpLy4uL2NvbmZpZ3VyZS5hYyIsCi0JCQkpOwotCQkJbmFtZSA9ICJHZW5lcmF0ZSBWZXJzaW9uLmgiOwotCQkJb3V0cHV0UGF0aHMgPSAoCi0JCQkJIiQoUFJPSkVDVF9URU1QX0RJUikvVmVyc2lvbi5oIiwKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7Ci0JCQlzaGVsbFNjcmlwdCA9ICIjIFJlbWVtYmVyLCB0aGlzIFwiUnVuIFNjcmlwdFwiIGJ1aWxkIHBoYXNlIHdpbGwgYmUgZXhlY3V0ZWQgZnJvbSAkU1JDUk9PVFxuL3Vzci9iaW4vcHl0aG9uIFNjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IC4uLyAkUFJPSkVDVF9URU1QX0RJUiI7Ci0JCX07Ci0vKiBFbmQgUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLwotCQk0MDg5OUY0MDBGRkE3MTg0MDAwQjI5QUUgLyogU291cmNlcyAqLyA9IHsKLQkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTQwODk5RjUzMEZGQTcyQTAwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotCQk0MDg5QTAxMDBGRkFDRUZDMDAwQjI5QUUgLyogU291cmNlcyAqLyA9IHsKLQkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOwotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTQwODlBMDQ0MEZGQUQxQkUwMDBCMjlBRSAvKiBzYW1wbGUxLmNjIGluIFNvdXJjZXMgKi8sCi0JCQkJNDA4OUEwNDYwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLywKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJNDBDODQ4RjcxMDFBMjA5QzAwODM2NDJBIC8qIFNvdXJjZXMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk0MEM4NDhGRjEwMUEyMTE1MDA4MzY0MkEgLyogZ3Rlc3QtYWxsLmNjIGluIFNvdXJjZXMgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCTQwQzg0OTA4MTAxQTIxN0UwMDgzNjQyQSAvKiBTb3VyY2VzICovID0gewotCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNDBDODQ5MTUxMDFBMjFERjAwODM2NDJBIC8qIGd0ZXN0X21haW4uY2MgaW4gU291cmNlcyAqLywKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJNDBDODQ5N0YxMDFBMzY4NTAwODM2NDJBIC8qIFNvdXJjZXMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk0MEM4NDk4MDEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLywKLQkJCSk7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJNDBDODQ5OEUxMDFBMzZBNjAwODM2NDJBIC8qIFNvdXJjZXMgKi8gPSB7Ci0JCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQk0MEM4NDk4RjEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovLAotCQkJCTQwQzg0OTkwMTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCi0JCQkpOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovID0gewotCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7Ci0JCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwotCQkJZmlsZXMgPSAoCi0JCQkJNDA4OTlGM0EwRkZBNzBENDAwMEIyOUFFIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovLAotCQkJKTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KLQotLyogQmVnaW4gUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCi0JCTQwODk5RjlEMEZGQTc0MEYwMDBCMjlBRSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDQwODk5RjQyMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi87Ci0JCQl0YXJnZXRQcm94eSA9IDQwODk5RjlDMEZGQTc0MEYwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87Ci0JCX07Ci0JCTQwODlBMDk4MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDA4OUEwOTcwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDA4QkVDMTAxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDA4QkVDMEYxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDNDRBRTYwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxIC8qIFZlcnNpb24gSW5mbyAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDBDNDRBRTUwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDODQ5N0IxMDFBMzY4NTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDBDODQ5N0MxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDODQ5N0QxMDFBMzY4NTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovOwotCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk3RTEwMUEzNjg1MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk0MEM4NDk4QTEwMUEzNkE2MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovOwotCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk4QjEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotCQk0MEM4NDk4QzEwMUEzNkE2MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKLQkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7Ci0JCQl0YXJnZXQgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi87Ci0JCQl0YXJnZXRQcm94eSA9IDQwQzg0OThEMTAxQTM2QTYwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87Ci0JCX07Ci0JCTQwQzg0OTlDMTAxQTM2REMwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0gewotCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKLQkJCXRhcmdldCA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQSAvKiBndGVzdF9tYWluLXN0YXRpYyAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDBDODQ5OUIxMDFBMzZEQzAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDODQ5OUUxMDFBMzZFNTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIGd0ZXN0LWZyYW1ld29yayAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDBDODQ5OUQxMDFBMzZFNTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDODQ5QTAxMDFBMzZGMTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIGd0ZXN0LWZyYW1ld29yayAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDBDODQ5OUYxMDFBMzZGMTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDODQ5RjcxMDFBNDM0NDAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gNDBDODQ5N0ExMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LXN0YXRpYyAqLzsKLQkJCXRhcmdldFByb3h5ID0gNDBDODQ5RjYxMDFBNDM0NDAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKLQkJfTsKLQkJNDBDODQ5RjkxMDFBNDM0OTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7Ci0JCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OwotCQkJdGFyZ2V0ID0gNDBDODQ5ODkxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovOwotCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDlGODEwMUE0MzQ5MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOwotCQl9OwotLyogRW5kIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCi0JCTNCMjM4RjYwMEU4MjhCNTQwMDg0NkUxMSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87Ci0JCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87Ci0JCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCVBST0RVQ1RfTkFNRSA9IENoZWNrOwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQkzQjIzOEY2MTBFODI4QjU0MDA4NDZFMTEgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKLQkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOwotCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOwotCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKLQkJCQlQUk9EVUNUX05BTUUgPSBDaGVjazsKLQkJCQlTREtST09UID0gbWFjb3N4OwotCQkJCVpFUk9fTElOSyA9IE5POwotCQkJfTsKLQkJCW5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk0MDg5OUY0NTBGRkE3MTg1MDAwQjI5QUUgLyogRGVidWcgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi87Ci0JCQkJUFJPRFVDVF9OQU1FID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7Ci0JCQkJU0RLUk9PVCA9IG1hY29zeDsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTQwODk5RjQ2MEZGQTcxODUwMDBCMjlBRSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKLQkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOwotCQkJCVBST0RVQ1RfTkFNRSA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwODlBMDE1MEZGQUNFRkQwMDBCMjlBRSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7Ci0JCQkJUFJPRFVDVF9OQU1FID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsKLQkJCQlTREtST09UID0gbWFjb3N4OwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJNDA4OUEwMTYwRkZBQ0VGRDAwMEIyOUFFIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7Ci0JCQkJU0RLUk9PVCA9IG1hY29zeDsKLQkJCX07Ci0JCQluYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDBDNDRBREYwRTM3OThGNDAwOEZDQzUxIC8qIERlYnVnICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOwotCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKLQkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC43OwotCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQkJVEFSR0VUX05BTUUgPSBndGVzdDsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTQwQzQ0QUUwMEUzNzk4RjQwMDhGQ0M1MSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOwotCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKLQkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC43OwotCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQkJVEFSR0VUX05BTUUgPSBndGVzdDsKLQkJCX07Ci0JCQluYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDBDODQ4RkIxMDFBMjA5RDAwODM2NDJBIC8qIERlYnVnICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKLQkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7Ci0JCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCi0JCQkJCS4uLywKLQkJCQkJLi4vaW5jbHVkZS8sCi0JCQkJKTsKLQkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKLQkJCQlTREtST09UID0gbWFjb3N4OwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJNDBDODQ4RkMxMDFBMjA5RDAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOwotCQkJCUdDQ19JTkxJTkVTX0FSRV9QUklWQVRFX0VYVEVSTiA9IFlFUzsKLQkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IFlFUzsKLQkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7Ci0JCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKLQkJCQkJLi4vLAotCQkJCQkuLi9pbmNsdWRlLywKLQkJCQkpOwotCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwQzg0OTBFMTAxQTIxN0YwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCi0JCQkJCS4uLywKLQkJCQkJLi4vaW5jbHVkZS8sCi0JCQkJKTsKLQkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF9tYWluOwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQk0MEM4NDkwRjEwMUEyMTdGMDA4MzY0MkEgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCi0JCQkJCS4uLywKLQkJCQkJLi4vaW5jbHVkZS8sCi0JCQkJKTsKLQkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF9tYWluOwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwQzg0OTg1MTAxQTM2ODUwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7Ci0JCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uLzsKLQkJCQlQUk9EVUNUX05BTUUgPSBndGVzdF91bml0dGVzdDsKLQkJCQlTREtST09UID0gbWFjb3N4OwotCQkJfTsKLQkJCW5hbWUgPSBEZWJ1ZzsKLQkJfTsKLQkJNDBDODQ5ODYxMDFBMzY4NTAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOwotCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi87Ci0JCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfdW5pdHRlc3Q7Ci0JCQkJU0RLUk9PVCA9IG1hY29zeDsKLQkJCX07Ci0JCQluYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDBDODQ5OTUxMDFBMzZBNjAwODM2NDJBIC8qIERlYnVnICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKLQkJCQlQUk9EVUNUX05BTUUgPSAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiOwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQl9OwotCQkJbmFtZSA9IERlYnVnOwotCQl9OwotCQk0MEM4NDk5NjEwMUEzNkE2MDA4MzY0MkEgLyogUmVsZWFzZSAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7Ci0JCQkJUFJPRFVDVF9OQU1FID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKLQkJCQlTREtST09UID0gbWFjb3N4OwotCQkJfTsKLQkJCW5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7Ci0JCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKLQkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLzsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7Ci0JCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKLQkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOwotCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKLQkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAotCQkJCQkuLi8sCi0JCQkJCS4uL2luY2x1ZGUvLAotCQkJCSk7Ci0JCQkJSU5GT1BMSVNUX0ZJTEUgPSBSZXNvdXJjZXMvSW5mby5wbGlzdDsKLQkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpL1ZlcnNpb24uaCI7Ci0JCQkJSU5GT1BMSVNUX1BSRVBST0NFU1MgPSBZRVM7Ci0JCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7Ci0JCQkJU0RLUk9PVCA9IG1hY29zeDsKLQkJCQlWRVJTSU9OSU5HX1NZU1RFTSA9ICJhcHBsZS1nZW5lcmljIjsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi87Ci0JCQlidWlsZFNldHRpbmdzID0gewotCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOwotCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7Ci0JCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKLQkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7Ci0JCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKLQkJCQkJLi4vLAotCQkJCQkuLi9pbmNsdWRlLywKLQkJCQkpOwotCQkJCUlORk9QTElTVF9GSUxFID0gUmVzb3VyY2VzL0luZm8ucGxpc3Q7Ci0JCQkJSU5GT1BMSVNUX1BSRUZJWF9IRUFERVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS9WZXJzaW9uLmgiOwotCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gWUVTOwotCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OwotCQkJCVNES1JPT1QgPSBtYWNvc3g7Ci0JCQkJVkVSU0lPTklOR19TWVNURU0gPSAiYXBwbGUtZ2VuZXJpYyI7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKLQkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOwotCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGMTBFMzBFMDc0MDAyOTQ4MDEgLyogRGVidWdQcm9qZWN0LnhjY29uZmlnICovOwotCQkJYnVpbGRTZXR0aW5ncyA9IHsKLQkJCX07Ci0JCQluYW1lID0gRGVidWc7Ci0JCX07Ci0JCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0gewotCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247Ci0JCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREY0MEUzMEUwNzQwMDI5NDgwMSAvKiBSZWxlYXNlUHJvamVjdC54Y2NvbmZpZyAqLzsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQl9OwotCQkJbmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0vKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLwotCi0vKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KLQkJM0IyMzhGQTMwRTgyOEJCNjAwODQ2RTExIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJDaGVjayIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQkzQjIzOEY2MDBFODI4QjU0MDA4NDZFMTEgLyogRGVidWcgKi8sCi0JCQkJM0IyMzhGNjEwRTgyOEI1NDAwODQ2RTExIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDA4OTlGNEEwRkZBNzFCQzAwMEIyOUFFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNDA4OTlGNDUwRkZBNzE4NTAwMEIyOUFFIC8qIERlYnVnICovLAotCQkJCTQwODk5RjQ2MEZGQTcxODUwMDBCMjlBRSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwODlBMDI0MEZGQUNGMDEwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNDA4OUEwMTUwRkZBQ0VGRDAwMEIyOUFFIC8qIERlYnVnICovLAotCQkJCTQwODlBMDE2MEZGQUNFRkQwMDBCMjlBRSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwQzQ0QUU0MEUzNzk5MDUwMDhGQ0M1MSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVmVyc2lvbiBJbmZvIiAqLyA9IHsKLQkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAotCQkJCTQwQzQ0QURGMEUzNzk4RjQwMDhGQ0M1MSAvKiBEZWJ1ZyAqLywKLQkJCQk0MEM0NEFFMDBFMzc5OEY0MDA4RkNDNTEgLyogUmVsZWFzZSAqLywKLQkJCSk7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk0MEM4NDkwMjEwMUEyMTJFMDA4MzY0MkEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LXN0YXRpYyIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQk0MEM4NDhGQjEwMUEyMDlEMDA4MzY0MkEgLyogRGVidWcgKi8sCi0JCQkJNDBDODQ4RkMxMDFBMjA5RDAwODM2NDJBIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDBDODQ5MTIxMDFBMjFEMjAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF9tYWluLXN0YXRpYyIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQk0MEM4NDkwRTEwMUEyMTdGMDA4MzY0MkEgLyogRGVidWcgKi8sCi0JCQkJNDBDODQ5MEYxMDFBMjE3RjAwODM2NDJBIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLQkJNDBDODQ5ODQxMDFBMzY4NTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdF91bml0dGVzdC1zdGF0aWMiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNDBDODQ5ODUxMDFBMzY4NTAwODM2NDJBIC8qIERlYnVnICovLAotCQkJCTQwQzg0OTg2MTAxQTM2ODUwMDgzNjQyQSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTQwQzg0OTk0MTAxQTM2QTYwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiICovID0gewotCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKLQkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCi0JCQkJNDBDODQ5OTUxMDFBMzZBNjAwODM2NDJBIC8qIERlYnVnICovLAotCQkJCTQwQzg0OTk2MTAxQTM2QTYwMDgzNjQyQSAvKiBSZWxlYXNlICovLAotCQkJKTsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKLQkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7Ci0JCX07Ci0JCTRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3QtZnJhbWV3b3JrIiAqLyA9IHsKLQkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7Ci0JCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAotCQkJCTRGQURDMjQzMDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLywKLQkJCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLywKLQkJCSk7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7Ci0JCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOwotCQl9OwotCQk0RkFEQzI0NjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJndGVzdCIgKi8gPSB7Ci0JCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OwotCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKLQkJCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCi0JCQkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCi0JCQkpOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOwotCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKLQkJfTsKLS8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KLQl9OwotCXJvb3RPYmplY3QgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Ci19CmRpZmYgLS1naXQgYS9jb2JhbHQvYWNjb3VudC9CVUlMRC5nbiBiL3Rlc3RpbmcvbGliZnV6emVyL2Z1enplcl90ZXN0LmduaQpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gY29iYWx0L2FjY291bnQvQlVJTEQuZ24KY29weSB0byB0ZXN0aW5nL2xpYmZ1enplci9mdXp6ZXJfdGVzdC5nbmkKaW5kZXggMDJjY2UzZS4uOGJjNWQ3YyAxMDA2NDQKLS0tIGEvY29iYWx0L2FjY291bnQvQlVJTEQuZ24KKysrIGIvdGVzdGluZy9saWJmdXp6ZXIvZnV6emVyX3Rlc3QuZ25pCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAyMSBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDEzICsxMiw0IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLXN0YXRpY19saWJyYXJ5KCJhY2NvdW50IikgewotICBoYXNfcGVkYW50aWNfd2FybmluZ3MgPSB0cnVlCi0KLSAgc291cmNlcyA9IFsKLSAgICAiYWNjb3VudF9tYW5hZ2VyLmNjIiwKLSAgICAiYWNjb3VudF9tYW5hZ2VyLmgiLAotICBdCi0KLSAgZGVwcyA9IFsgIi8vc3RhcmJvYXJkOnN0YXJib2FyZF9oZWFkZXJzX29ubHkiIF0KLX0KKyMgSW50ZW50aW9uYWxseSBlbXB0eSwgc2VydmVzIGFzIGEgYnVpbGQgc3R1YgpkaWZmIC0tZ2l0IGEvY29iYWx0L2FjY291bnQvQlVJTEQuZ24gYi90ZXN0aW5nL3Rlc3QuZ25pCnNpbWlsYXJpdHkgaW5kZXggNjglCmNvcHkgZnJvbSBjb2JhbHQvYWNjb3VudC9CVUlMRC5nbgpjb3B5IHRvIHRlc3RpbmcvdGVzdC5nbmkKaW5kZXggMDJjY2UzZS4uMzcxYWM4MiAxMDA2NDQKLS0tIGEvY29iYWx0L2FjY291bnQvQlVJTEQuZ24KKysrIGIvdGVzdGluZy90ZXN0LmduaQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IDIwMjEgVGhlIENvYmFsdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyMyBUaGUgQ29iYWx0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwxMyArMTIsNSBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1zdGF0aWNfbGlicmFyeSgiYWNjb3VudCIpIHsKLSAgaGFzX3BlZGFudGljX3dhcm5pbmdzID0gdHJ1ZQotCi0gIHNvdXJjZXMgPSBbCi0gICAgImFjY291bnRfbWFuYWdlci5jYyIsCi0gICAgImFjY291bnRfbWFuYWdlci5oIiwKLSAgXQotCi0gIGRlcHMgPSBbICIvL3N0YXJib2FyZDpzdGFyYm9hcmRfaGVhZGVyc19vbmx5IiBdCi19CisjIFN0dWIgdmVyc2lvbiBmb3IgQ2hyb21lIGNvZGUsIHNpbXBseSBmb3J3YXJkIHRvIFN0YXJib2FyZAoraW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC90ZXN0LmduaSIpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbmdsZS9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L2FuZ2xlL0JVSUxELmduCmluZGV4IGJiYzA2N2YuLjA4OWNjODUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FuZ2xlL0JVSUxELmduCisrKyBiL3RoaXJkX3BhcnR5L2FuZ2xlL0JVSUxELmduCkBAIC03LDkgKzcsNyBAQAogaWYgKGFuZ2xlX2hhc19idWlsZCkgewogICBpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2xpbnV4L3BrZ19jb25maWcuZ25pIikKICAgaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy91aS5nbmkiKQotICBpZiAoIWlzX3N0YXJib2FyZCkgewotICAgIGltcG9ydCgiLy90ZXN0aW5nL2xpYmZ1enplci9mdXp6ZXJfdGVzdC5nbmkiKQotICB9CisgIGltcG9ydCgiLy90ZXN0aW5nL2xpYmZ1enplci9mdXp6ZXJfdGVzdC5nbmkiKQogCiAgIGlmIChpc19hbmRyb2lkKSB7CiAgICAgIyBhbmRyb2lkL3J1bGVzLmduaSBjYW4gb25seSBiZSBpbXBvcnRlZCBmb3IgQW5kcm9pZCB0YXJnZXRzCkBAIC0xMzc0LDcgKzEzNzIsNyBAQAogfQogCiBpZiAoYnVpbGRfd2l0aF9jaHJvbWl1bSAmJiAhaXNfY29tcG9uZW50X2J1aWxkICYmIGlzX2FuZHJvaWQgJiYKLSAgICBjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbikgeworICAgIGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSB7CiAgICMgUGFja2FnZSBBTkdMRSBsaWJyYXJpZXMKICAgYW5nbGVfYXBrKCJhbmdsZV9jaHJvbWl1bV9hcGsiKSB7CiAgICAgcGFja2FnZV9uYW1lID0gImNvbS5jaHJvbWl1bS5hbmdsZSIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FuZ2xlL2duaS9hbmdsZS5nbmkgYi90aGlyZF9wYXJ0eS9hbmdsZS9nbmkvYW5nbGUuZ25pCmluZGV4IDAxZDliYmEuLjc1ZWEwYzUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FuZ2xlL2duaS9hbmdsZS5nbmkKKysrIGIvdGhpcmRfcGFydHkvYW5nbGUvZ25pL2FuZ2xlLmduaQpAQCAtMTMsMTEgKzEzLDcgQEAKICAgaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9zYW5pdGl6ZXJzL3Nhbml0aXplcnMuZ25pIikKICAgaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy91aS5nbmkiKSAgIyBpbXBvcnQgdGhlIHVzZV94MTEgdmFyaWFibGUKICAgaW1wb3J0KCIvL2J1aWxkX292ZXJyaWRlcy9idWlsZC5nbmkiKQotICBpZiAoaXNfc3RhcmJvYXJkKSB7Ci0gICAgaW1wb3J0KCIvL3N0YXJib2FyZC9idWlsZC90ZXN0LmduaSIpCi0gIH0gZWxzZSB7Ci0gICAgaW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQotICB9CisgIGltcG9ydCgiLy90ZXN0aW5nL3Rlc3QuZ25pIikKICAgaWYgKGlzX2FuZHJvaWQpIHsKICAgICBpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2FuZHJvaWQvY29uZmlnLmduaSIpCiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy90ZXN0cy9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy90ZXN0cy9CVUlMRC5nbgppbmRleCA4ODZjNmQ0Li5hMmFiMTM3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvdGVzdHMvQlVJTEQuZ24KKysrIGIvdGhpcmRfcGFydHkvYW5nbGUvc3JjL3Rlc3RzL0JVSUxELmduCkBAIC0zLDExICszLDcgQEAKICMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9jaHJvbWVjYXN0X2J1aWxkLmduaSIpCi1pZiAoaXNfc3RhcmJvYXJkKSB7Ci0gIGltcG9ydCgiLy9zdGFyYm9hcmQvYnVpbGQvdGVzdC5nbmkiKQotfSBlbHNlIHsKLSAgaW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQotfQoraW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQogaW1wb3J0KCIuLi8uLi9nbmkvYW5nbGUuZ25pIikKIGltcG9ydCgiYW5nbGVfdW5pdHRlc3RzLmduaSIpCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL3NzbF9idWZmZXIuY2MgYi90aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3JjL3NzbC9zc2xfYnVmZmVyLmNjCmluZGV4IGU1MWVlOTIuLjVkZjgxMGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9zcmMvc3NsL3NzbF9idWZmZXIuY2MKKysrIGIvdGhpcmRfcGFydHkvYm9yaW5nc3NsL3NyYy9zc2wvc3NsX2J1ZmZlci5jYwpAQCAtMzgsMTMgKzM4LDcgQEAKIAogdm9pZCBTU0xCdWZmZXI6OkNsZWFyKCkgewogCi0vLyBUT0RPKGIvMjcwODY0MTE5KTogY2xlYW4gdXAgZGlyZWN0IHJlZmVyZW5jZXMgdG8gU3RhcmJvYXJkIEFQSXMgYW5kIHVzZQotLy8gT1BFTlNTTF9wb3J0Xyogc2hpbXMgZXZlcnl3aGVyZSBpbnN0ZWFkLgotI2lmZGVmIFNUQVJCT0FSRAotICBTYk1lbW9yeURlYWxsb2NhdGUoYnVmXyk7ICAvLyBBbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4KLSNlbHNlCiAgIE9QRU5TU0xfcG9ydF9mcmVlKGJ1Zl8pOyAgLy8gQWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0jZW5kaWYKICAgYnVmXyA9IG51bGxwdHI7CiAgIG9mZnNldF8gPSAwOwogICBzaXplXyA9IDA7CkBAIC02NiwxNCArNjAsOCBAQAogICAvLyBTaW5jZSB0aGlzIGJ1ZmZlciBnZXRzIGFsbG9jYXRlZCBxdWl0ZSBmcmVxdWVudGx5IGFuZCBkb2Vzbid0IGNvbnRhaW4gYW55CiAgIC8vIHNlbnNpdGl2ZSBkYXRhLCB3ZSBhbGxvY2F0ZSB3aXRoIG1hbGxvYyByYXRoZXIgdGhhbiB8T1BFTlNTTF9tYWxsb2N8IGFuZAogICAvLyBhdm9pZCB6ZXJvaW5nIG9uIGZyZWUuCi0gIC8vCi0gIC8vIFdlIG5lZWQgdG8gdXNlIFNiTWVtb3J5QWxsb2NhdGUgaW4gc3RhcmJvYXJkLgogICB1aW50OF90ICpuZXdfYnVmID0KLSNpZmRlZiBTVEFSQk9BUkQKLSAgICAgICh1aW50OF90ICopU2JNZW1vcnlBbGxvY2F0ZShuZXdfY2FwICsgU1NMM19BTElHTl9QQVlMT0FEIC0gMSk7Ci0jZWxzZQogICAgICAgKHVpbnQ4X3QgKilPUEVOU1NMX3BvcnRfbWFsbG9jKG5ld19jYXAgKyBTU0wzX0FMSUdOX1BBWUxPQUQgLSAxKTsKLSNlbmRpZgogICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7CiAgICAgT1BFTlNTTF9QVVRfRVJST1IoU1NMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtODUsMTEgKzczLDcgQEAKIAogICBpZiAoYnVmXyAhPSBOVUxMKSB7CiAgICAgT1BFTlNTTF9tZW1jcHkobmV3X2J1ZiArIG5ld19vZmZzZXQsIGJ1Zl8gKyBvZmZzZXRfLCBzaXplXyk7Ci0jaWZkZWYgU1RBUkJPQVJECi0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGJ1Zl8pOyAgLy8gQWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0jZWxzZQogICAgIE9QRU5TU0xfcG9ydF9mcmVlKGJ1Zl8pOyAgLy8gQWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0jZW5kaWYKICAgfQogCiAgIGJ1Zl8gPSBuZXdfYnVmOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYnJvdGxpL0JVSUxELmduIGIvdGhpcmRfcGFydHkvYnJvdGxpL0JVSUxELmduCmluZGV4IDQ5NTkwYjYuLmQwNTc4M2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2Jyb3RsaS9CVUlMRC5nbgorKysgYi90aGlyZF9wYXJ0eS9icm90bGkvQlVJTEQuZ24KQEAgLTIsOSArMiw3IEBACiAjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotaWYgKCFpc19zdGFyYm9hcmQpIHsKLSAgaW1wb3J0KCIvL3Rlc3RpbmcvbGliZnV6emVyL2Z1enplcl90ZXN0LmduaSIpCi19CitpbXBvcnQoIi8vdGVzdGluZy9saWJmdXp6ZXIvZnV6emVyX3Rlc3QuZ25pIikKIAogaWYgKGlzX3dpbikgewogICBpbXBvcnQoIi8vYnVpbGQvY29uZmlnL3dpbi92aXN1YWxfc3R1ZGlvX3ZlcnNpb24uZ25pIikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2RldnRvb2xzL2Zyb250X2VuZC9jb2JhbHQvY29iYWx0LmpzIGIvdGhpcmRfcGFydHkvZGV2dG9vbHMvZnJvbnRfZW5kL2NvYmFsdC9jb2JhbHQuanMKaW5kZXggYTA4NWM2Mi4uYzYyM2Y2OSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZGV2dG9vbHMvZnJvbnRfZW5kL2NvYmFsdC9jb2JhbHQuanMKKysrIGIvdGhpcmRfcGFydHkvZGV2dG9vbHMvZnJvbnRfZW5kL2NvYmFsdC9jb2JhbHQuanMKQEAgLTE0LDYgKzE0LDcgQEAKIAogICAgICAgICB0aGlzLl90YXJnZXQgPSBVSS5jb250ZXh0LmZsYXZvcihTREsuVGFyZ2V0KTsKICAgICAgICAgdGhpcy5fcnVudGltZUFnZW50ID0gdGhpcy5fdGFyZ2V0LnJ1bnRpbWVBZ2VudCgpOworICAgICAgICB0aGlzLl9jb2JhbHRBZ2VudCA9IHRoaXMuX3RhcmdldC5jb2JhbHRBZ2VudCgpOwogCiAgICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuX3NoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ2RpdicpOwogICAgICAgICB0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQgPSAnQ29iYWx0IENvbnNvbGUnOwpAQCAtMzIsNyArMzMsNyBAQAogICAgICAgICAgICAgdGhpcy5ydW4oYChmdW5jdGlvbigpIHsgd2luZG93Lmg1dmNjLnRyYWNlRXZlbnQuc3RvcCgpO30pKClgKTsKICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJTdG9wcGVkIFRyYWNlIik7CiAgICAgICAgIH0pKTsKLSAgICAgICAgdHJhY2VfZmlsZXMuZm9yRWFjaCggKGZpbGUpID0+IHsKKyAgICAgICAgdHJhY2VfZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gewogICAgICAgICAgICAgdHJhY2VDb250YWluZXIuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0Rvd25sb2FkICcgKyBmaWxlWzBdKSwgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJEb3dubG9hZCBUcmFjZSIpOwogICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZVsxXTsKQEAgLTQ2LDYgKzQ3LDU4IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0pOworICAgICAgICBjb25zdCBkZWJ1Z0xvZ0NvbnRhaW5lciA9IHRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywgJ2RlYnVnLWxvZy1jb250YWluZXInKTsKKyAgICAgICAgZGVidWdMb2dDb250YWluZXIuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0RlYnVnTG9nIE9uJyksIGV2ZW50ID0+IHsKKyAgICAgICAgICAgIHRoaXMuX2NvYmFsdEFnZW50Lmludm9rZV9zZW5kQ29uc29sZUNvbW1hbmQoeworICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdkZWJ1Z19sb2cnLCBtZXNzYWdlOiAnb24nCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSkpOworICAgICAgICBkZWJ1Z0xvZ0NvbnRhaW5lci5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnRGVidWdMb2cgT2ZmJyksIGV2ZW50ID0+IHsKKyAgICAgICAgICAgIHRoaXMuX2NvYmFsdEFnZW50Lmludm9rZV9zZW5kQ29uc29sZUNvbW1hbmQoeworICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdkZWJ1Z19sb2cnLCBtZXNzYWdlOiAnb2ZmJworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pKTsKKyAgICAgICAgY29uc3QgbGlmZWN5Y2xlQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCAnbGlmZWN5Y2xlLWNvbnRhaW5lcicpOworICAgICAgICBsaWZlY3ljbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0JsdXInKSwgZXZlbnQgPT4geworICAgICAgICAgICAgdGhpcy5fY29iYWx0QWdlbnQuaW52b2tlX3NlbmRDb25zb2xlQ29tbWFuZCh7IGNvbW1hbmQ6ICdibHVyJyB9KTsKKyAgICAgICAgfSkpOworICAgICAgICBsaWZlY3ljbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0ZvY3VzJyksIGV2ZW50ID0+IHsKKyAgICAgICAgICAgIHRoaXMuX2NvYmFsdEFnZW50Lmludm9rZV9zZW5kQ29uc29sZUNvbW1hbmQoeyBjb21tYW5kOiAnZm9jdXMnIH0pOworICAgICAgICB9KSk7CisgICAgICAgIGxpZmVjeWNsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ29uY2VhbCcpLCBldmVudCA9PiB7CisgICAgICAgICAgICB0aGlzLl9jb2JhbHRBZ2VudC5pbnZva2Vfc2VuZENvbnNvbGVDb21tYW5kKHsgY29tbWFuZDogJ2NvbmNlYWwnIH0pOworICAgICAgICB9KSk7CisgICAgICAgIGxpZmVjeWNsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnRnJlZXplJyksIGV2ZW50ID0+IHsKKyAgICAgICAgICAgIHRoaXMuX2NvYmFsdEFnZW50Lmludm9rZV9zZW5kQ29uc29sZUNvbW1hbmQoeyBjb21tYW5kOiAnZnJlZXplJyB9KTsKKyAgICAgICAgfSkpOworICAgICAgICBsaWZlY3ljbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1JldmVhbCcpLCBldmVudCA9PiB7CisgICAgICAgICAgICB0aGlzLl9jb2JhbHRBZ2VudC5pbnZva2Vfc2VuZENvbnNvbGVDb21tYW5kKHsgY29tbWFuZDogJ3JldmVhbCcgfSk7CisgICAgICAgIH0pKTsKKyAgICAgICAgbGlmZWN5Y2xlQ29udGFpbmVyLmFwcGVuZENoaWxkKFVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdRdWl0JyksIGV2ZW50ID0+IHsKKyAgICAgICAgICAgIHRoaXMuX2NvYmFsdEFnZW50Lmludm9rZV9zZW5kQ29uc29sZUNvbW1hbmQoeyBjb21tYW5kOiAncXVpdCcgfSk7CisgICAgICAgIH0pKTsKKyAgICAgICAgY29uc3QgY29uc29sZUNvbnRhaW5lciA9IHRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywgJ2NvbnNvbGUtY29udGFpbmVyJyk7CisgICAgICAgIGNvbnNvbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0RlYnVnQ29tbWFuZCcpLCBldmVudCA9PiB7CisgICAgICAgICAgICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29uc29sZS1vdXRwdXQnKVswXTsKKyAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkZWJ1Zy1jb21tYW5kJylbMF0udmFsdWU7CisgICAgICAgICAgICBpZiAoY29tbWFuZC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NvYmFsdEFnZW50Lmludm9rZV9nZXRDb25zb2xlQ29tbWFuZHMoKS50aGVuKHJlc3VsdCA9PiB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0LmNvbW1hbmRzLCB1bmRlZmluZWQsIDIpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jb2JhbHRBZ2VudC5pbnZva2Vfc2VuZENvbnNvbGVDb21tYW5kKHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZGVidWctbWVzc2FnZScpWzBdLnZhbHVlCisgICAgICAgICAgICAgICAgfSkudGhlbihyZXN1bHQgPT4geworICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbGVtZW50LmlubmVySFRNTCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgdW5kZWZpbmVkLCAyKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworICAgICAgICBjb25zb2xlQ29udGFpbmVyLmFwcGVuZENoaWxkKFVJLmNyZWF0ZUxhYmVsKCdDb21tYW5kOicpKTsKKyAgICAgICAgY29uc29sZUNvbnRhaW5lci5hcHBlbmRDaGlsZChVSS5jcmVhdGVJbnB1dCgnZGVidWctY29tbWFuZCcsICd0ZXh0JykpOworICAgICAgICBjb25zb2xlQ29udGFpbmVyLmFwcGVuZENoaWxkKFVJLmNyZWF0ZUxhYmVsKCdNZXNzYWdlOicpKTsKKyAgICAgICAgY29uc29sZUNvbnRhaW5lci5hcHBlbmRDaGlsZChVSS5jcmVhdGVJbnB1dCgnZGVidWctbWVzc2FnZScsICd0ZXh0JykpOworICAgICAgICBjb25zb2xlQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdwcmUnLCAnY29uc29sZS1vdXRwdXQnKTsKICAgICB9CiAKICAgICBhc3luYyBydW4oZXhwcmVzc2lvbikgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZGV2dG9vbHMvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2RldnRvb2xzX3Byb3RvY29sL2Jyb3dzZXJfcHJvdG9jb2wucGRsIGIvdGhpcmRfcGFydHkvZGV2dG9vbHMvdGhpcmRfcGFydHkvYmxpbmsvcHVibGljL2RldnRvb2xzX3Byb3RvY29sL2Jyb3dzZXJfcHJvdG9jb2wucGRsCmluZGV4IDAwOTFjMzIuLmU5ODE2MmYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2RldnRvb2xzL3RoaXJkX3BhcnR5L2JsaW5rL3B1YmxpYy9kZXZ0b29sc19wcm90b2NvbC9icm93c2VyX3Byb3RvY29sLnBkbAorKysgYi90aGlyZF9wYXJ0eS9kZXZ0b29scy90aGlyZF9wYXJ0eS9ibGluay9wdWJsaWMvZGV2dG9vbHNfcHJvdG9jb2wvYnJvd3Nlcl9wcm90b2NvbC5wZGwKQEAgLTgsNiArOCwyNyBAQAogICBtYWpvciAxCiAgIG1pbm9yIDMKIAorIyBUaGUgQ29iYWx0IGRvbWFpbiBkZWZpbmVzIGN1c3RvbSBtZXRob2RzIGFuZCBldmVudHMgZm9yIENvYmFsdAorZXhwZXJpbWVudGFsIGRvbWFpbiBDb2JhbHQKKyAgY29tbWFuZCBkaXNhYmxlCisKKyAgY29tbWFuZCBlbmFibGUKKworICBleHBlcmltZW50YWwgdHlwZSBDb25zb2xlQ29tbWFuZCBleHRlbmRzIG9iamVjdAorICAgIHByb3BlcnRpZXMKKyAgICAgIHN0cmluZyBjb21tYW5kCisgICAgICBzdHJpbmcgc2hvcnRIZWxwCisgICAgICBzdHJpbmcgbG9uZ0hlbHAKKworICBleHBlcmltZW50YWwgY29tbWFuZCBnZXRDb25zb2xlQ29tbWFuZHMKKyAgICByZXR1cm5zCisgICAgICBhcnJheSBvZiBDb25zb2xlQ29tbWFuZCBjb21tYW5kcworCisgIGV4cGVyaW1lbnRhbCBjb21tYW5kIHNlbmRDb25zb2xlQ29tbWFuZAorICAgIHBhcmFtZXRlcnMKKyAgICAgIHN0cmluZyBjb21tYW5kCisgICAgICBvcHRpb25hbCBzdHJpbmcgbWVzc2FnZQorCiBleHBlcmltZW50YWwgZG9tYWluIEFjY2Vzc2liaWxpdHkKICAgZGVwZW5kcyBvbiBET00KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzYjAyNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvQlVJTEQuZ24KQEAgLTAsMCArMSwyMTAgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMKKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQoIi8vYnVpbGRfb3ZlcnJpZGVzL2J1aWxkLmduaSIpCisKK2NvbmZpZygiZ3Rlc3RfY29uZmlnIikgeworICAjIHdlYnJ0YyB3YW50cyB0byBwdXNoIHRoaXMgY29uZmlnIHdpdGhvdXQgYSBwdWJsaWNfZGVwIGNoYWluCisgICMgVE9ETyhjcmJ1Zy5jb20vMTI0OTI1NCk6IGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoaXMKKyAgdmlzaWJpbGl0eSA9IFsKKyAgICAiOioiLCAgIyBnbW9jayBhbHNvIHNoYXJlcyB0aGlzIGNvbmZpZy4KKyAgICAiLy90ZXN0OioiLCAgIyB3ZWJydHMgc3RhbmRhbG9uZSBzZXR1cAorICAgICIvL3RoaXJkX3BhcnR5L3dlYnJ0Yy90ZXN0OioiLAorICBdCisKKyAgZGVmaW5lcyA9IFsKKyAgICAjIENocm9taXVtIGFsd2F5cyBsaW5rcyBnb29nbGV0ZXN0IHN0YXRpY2FsbHksIHNvIG5vIEFQSSBxdWFsaWZpZXIgaXMKKyAgICAjIG5lY2Vzc2FyeS4gVGhlIGRlZmluaXRpb24gaW4gZ3Rlc3QtcG9ydC5oIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZworICAgICMgY2F1c2VzIGNyYXNoZXMgaW4gY29udGVudF9icm93c2VydGVzdHMuCisgICAgIkdURVNUX0FQSV89IiwKKworICAgICMgSW4gb3JkZXIgdG8gYWxsb3cgcmVnZXggbWF0Y2hlcyBpbiBndGVzdCB0byBiZSBzaGFyZWQgYmV0d2VlbiBXaW5kb3dzCisgICAgIyBhbmQgb3RoZXIgc3lzdGVtcywgd2UgdGVsbCBndGVzdCB0byBhbHdheXMgdXNlIGl0cyBpbnRlcm5hbCBlbmdpbmUuCisgICAgIkdURVNUX0hBU19QT1NJWF9SRT0wIiwKKworICAgICMgRW5hYmxlcyBDKysxMSBmZWF0dXJlcy4KKyAgICAiR1RFU1RfTEFOR19DWFgxMT0xIiwKKworICAgICMgUHJldmVudHMgZ3Rlc3QgZnJvbSBpbmNsdWRpbmcgYm90aCA8dHIxL3R1cGxlPiBhbmQgPHR1cGxlPi4KKyAgICAiR1RFU1RfSEFTX1RSMV9UVVBMRT0wIiwKKyAgXQorCisgICMgR3Rlc3QgaGVhZGVycyBuZWVkIHRvIGJlIGFibGUgdG8gZmluZCB0aGVtc2VsdmVzLgorICBpbmNsdWRlX2RpcnMgPSBbCisgICAgIyJjdXN0b20iLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlIiwKKyAgXQorCisgIGlmIChpc193aW4pIHsKKyAgICBjZmxhZ3MgPSBbICIvd2Q0ODAwIiBdICAjIFVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgorICB9CisKKyAgIyBpZiAoZ3Rlc3RfZW5hYmxlX2Fic2xfcHJpbnRlcnMpIHsKKyAgIyAgIGNvbmZpZ3MgPSBbICIvL3RoaXJkX3BhcnR5L2Fic2VpbC1jcHA6YWJzbF9pbmNsdWRlX2NvbmZpZyIgXQorICAjICAgZGVmaW5lcyArPSBbICJHVEVTVF9IQVNfQUJTTD0xIiBdCisgICMgfQorfQorCitjb25maWcoImdtb2NrX2NvbmZpZyIpIHsKKyAgIyBHbW9jayBoZWFkZXJzIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZW1zZWx2ZXMuCisgIGluY2x1ZGVfZGlycyA9IFsKKyAgICAjImN1c3RvbSIsCisgICAgInNyYy9nb29nbGVtb2NrL2luY2x1ZGUiLAorICBdCisKKyAgaWYgKGlzX2NsYW5nKSB7CisgICAgIyBUT0RPKHRpa3V0YSk6IHJlbW92ZSB0aGlzIHdoZW4gdGhlIGlzc3VlIGlzIGZpeGVkLgorICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0L2lzc3Vlcy81MzMKKyAgICBjZmxhZ3MgPSBbICItV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlIiBdCisgIH0KK30KKworIyBEbyBOT1QgZGVwZW5kIG9uIHRoaXMgZGlyZWN0bHkuIFVzZSAvL3Rlc3RpbmcvZ3Rlc3QgaW5zdGVhZC4KKyMgU2VlIFJFQURNRS5jaHJvbWl1bSBmb3IgZGV0YWlscy4KK3NvdXJjZV9zZXQoImd0ZXN0IikgeworICB0ZXN0b25seSA9IHRydWUKKyAgc291cmNlcyA9IFsKKyAgICAjICJjdXN0b20vZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgiLAorICAgICMgImN1c3RvbS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vc3RhY2tfdHJhY2VfZ2V0dGVyLmNjIiwKKyAgICAjICJjdXN0b20vZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL3N0YWNrX3RyYWNlX2dldHRlci5oIiwKKworICAgICMgVE9ETyhjcmJ1Zy5jb20vMTAwOTU1Myk6IFJlbW92ZSB0aGlzIHdyYXBwZXIgYW5kIGN1c3RvbSB0ZW1wIGRpcgorICAgICMgYWZ0ZXIgcGx1bWJpbmcgYSB3b3JrYWJsZSB0ZW1wb3JhcnkgcGF0aCBpbnRvIGdvb2dsZXRlc3Qgb24gQW5kcm9pZC4KKyAgICAjICJjdXN0b20vZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2Nocm9tZV9jdXN0b21fdGVtcF9kaXIuY2MiLAorICAgICMgImN1c3RvbS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vY2hyb21lX2N1c3RvbV90ZW1wX2Rpci5oIiwKKyAgICAjICJjdXN0b20vZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0X3BvcnRfd3JhcHBlci5jYyIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtYXNzZXJ0aW9uLXJlc3VsdC5oIiwKKyAgICAic3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1hdGNoZXJzLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIiwKKyAgICAic3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oIiwKKyAgICAic3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaCIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaCIsCisKKyAgICAjInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgiLCAgIyBTdXBlcnNlZGVkLgorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wb3J0LmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oIiwKKyAgICAic3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC1hcmNoLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIsCisgICAgInNyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiLAorICAgICJzcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIiwKKworICAgICMic3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LWFsbC5jYyIsICAjIE5vdCBuZWVkZWQgYnkgb3VyIGJ1aWxkLgorICAgICJzcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtYXNzZXJ0aW9uLXJlc3VsdC5jYyIsCisgICAgInNyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIiwKKyAgICAic3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjIiwKKyAgICAic3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIiwKKyAgICAic3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LW1hdGNoZXJzLmNjIiwKKworICAgICMgZ3Rlc3RfcG9ydF93cmFwcGVyLmNjIGlzIHVzZWQgaW5zdGVhZCBvZiBndGVzdC1wb3J0LmNjLgorICAgICMgVE9ETyhjcmJ1Zy5jb20vMTAwOTU1Myk6IFJlLWVuYWJsZSB0aGlzIGZpbGUgYWZ0ZXIgcGx1bWJpbmcgYSB3b3JrYWJsZQorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBwYXRoIGludG8gZ29vZ2xldGVzdCBvbiBBbmRyb2lkLgorICAgICJzcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYyIsCisgICAgInNyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYyIsCisgICAgInNyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MiLAorICAgICJzcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyIsCisgICAgInNyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC5jYyIsCisgIF0KKworICAjIFNvbWUgZmlsZXMgaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIi4KKyAgaW5jbHVkZV9kaXJzID0gWyAic3JjL2dvb2dsZXRlc3QiLCAiLiIgXQorCisgIHB1YmxpY19jb25maWdzID0gWyAiOmd0ZXN0X2NvbmZpZyIgXQorCisgICMgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCisgIGNvbmZpZ3MgKz0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIgXQorCisgIGRlZmluZXMgPSBbXQorICBkZXBzID0gW10KKyAgaWYgKGlzX25hY2wgfHwgIWJ1aWxkX3dpdGhfY2hyb21pdW0pIHsKKyAgICBkZWZpbmVzICs9IFsgIkdURVNUX0RJU0FCTEVfUFJJTlRfU1RBQ0tfVFJBQ0UiIF0KKyAgICAjIHNvdXJjZXMgLT0gWworICAgICMgICAiY3VzdG9tL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9zdGFja190cmFjZV9nZXR0ZXIuY2MiLAorICAgICMgICAiY3VzdG9tL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9zdGFja190cmFjZV9nZXR0ZXIuaCIsCisgICAgIyBdCisgIH0gZWxzZSB7CisgICAgZGVwcyArPSBbICIvL2Jhc2UiIF0KKyAgfQorCisgIGlmIChpc19mdWNoc2lhKSB7CisgICAgZGVwcyArPSBbCisgICAgICAiLy90aGlyZF9wYXJ0eS9mdWNoc2lhLXNkay9zZGsvcGtnL2ZkaW8iLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnVjaHNpYS1zZGsvc2RrL3BrZy96eCIsCisgICAgXQorICB9CisKKyAgI2lmIChndGVzdF9lbmFibGVfYWJzbF9wcmludGVycykgeworICAjICBkZXBzICs9IFsgIi8vdGhpcmRfcGFydHkvYWJzZWlsLWNwcDphYnNsIiBdCisgICN9CisKKyAgIyBJZGVhbGx5IHdlIHdvdWxkIHdhbnQgdG8gcmVtb3ZlCisgICMgLy9zdGFyYm9hcmQvYnVpbGQvY29uZmlnOmRlZmF1bHRfcnR0aSBmcm9tIHRoZSBsaXN0IG9mIGNvbmZpZ3MgdG9vLgorICAjIFVuZm9ydHVuYXRlbHkgR04gZG9lc24ndCBwcm92aWRlIHVzIGEgd2F5IHRvIHJlbW92ZSB0aGluZ3MgZnJvbQorICAjIGRlcGVuZGVudHMnIGNvbmZpZ3MgbGlzdC4KKyAgIyBJdCBoYXBwZW5zIHRvIGJlIHRoYXQgYWxsX2RlcGVuZGVudF9jb25maWdzIGdldCBwcm9jZXNzZWQgYWZ0ZXIgZGVmYXVsdAorICAjIGNvbmZpZ3MsIHNvIHRoZSAtZnJ0dGkgZmxhZyBjb21lcyBhZnRlciB0aGUgLWZuby1ydHRpIGZsYWcgb24gdGhlIGNvbW1hbmQKKyAgIyBsaW5lLCBzbyBpdCBoYXBwZW5zIHRvIHdvcmsgaW4gdGhpcyBjYXNlLgorICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpydHRpIiBdCisKKyAgcHVibGljX2RlcHMgPSBbICAiLy9zdGFyYm9hcmQiICBdCit9CisKKyMgRG8gTk9UIGRlcGVuZCBvbiB0aGlzIGRpcmVjdGx5LiBVc2UgLy90ZXN0aW5nL2d0ZXN0Omd0ZXN0X21haW4gaW5zdGVhZC4KKyMgU2VlIFJFQURNRS5jaHJvbWl1bSBmb3IgZGV0YWlscy4KK3NvdXJjZV9zZXQoImd0ZXN0X21haW4iKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBzb3VyY2VzID0gWyAic3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0X21haW4uY2MiIF0KKyAgZGVwcyA9IFsgIjpndGVzdCIgXQorfQorCisjIERvIE5PVCBkZXBlbmQgb24gdGhpcyBkaXJlY3RseS4gVXNlIC8vdGVzdGluZy9nbW9jayBpbnN0ZWFkLgorIyBTZWUgUkVBRE1FLmNocm9taXVtIGZvciBkZXRhaWxzLgorc291cmNlX3NldCgiZ21vY2siKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBzb3VyY2VzID0gWworICAgICJzcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaCIsCisgICAgInNyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIiwKKyAgICAic3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1mdW5jdGlvbi1tb2NrZXIuaCIsCisgICAgInNyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIsCisgICAgInNyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1tYXRjaGVycy5oIiwKKyAgICAic3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1uaWNlLXN0cmljdC5oIiwKKyAgICAic3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiLAorICAgICJzcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiLAorCisgICAgIyJzcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmgiLCAgIyBTdXBlcnNlZGVkLgorICAgICJzcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIiwKKyAgICAic3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaCIsCisgICAgInNyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIsCisgICAgInNyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIiwKKyAgICAic3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1wcC5oIiwKKworICAgICMic3JjL2dvb2dsZW1vY2svc3JjL2dtb2NrLWFsbC5jYyIsICAjIE5vdCBuZWVkZWQgYnkgb3VyIGJ1aWxkLgorICAgICJzcmMvZ29vZ2xlbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYyIsCisgICAgInNyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYyIsCisgICAgInNyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1tYXRjaGVycy5jYyIsCisgICAgInNyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjIiwKKyAgICAic3JjL2dvb2dsZW1vY2svc3JjL2dtb2NrLmNjIiwKKyAgXQorCisgIHB1YmxpY19kZXBzID0gWyAiOmd0ZXN0IiBdCisKKyAgcHVibGljX2NvbmZpZ3MgPSBbICI6Z21vY2tfY29uZmlnIiBdCit9CisKKyMgRG8gTk9UIGRlcGVuZCBvbiB0aGlzIGRpcmVjdGx5LiBVc2UgLy90ZXN0aW5nL2dtb2NrOmdtb2NrX21haW4gaW5zdGVhZC4KKyMgU2VlIFJFQURNRS5jaHJvbWl1bSBmb3IgZGV0YWlscy4KK3N0YXRpY19saWJyYXJ5KCJnbW9ja19tYWluIikgeworICB0ZXN0b25seSA9IHRydWUKKyAgc291cmNlcyA9IFsgInNyYy9nb29nbGVtb2NrL3NyYy9nbW9ja19tYWluLmNjIiBdCisgIGRlcHMgPSBbICI6Z21vY2siIF0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvTUVUQURBVEEgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L01FVEFEQVRBCmluZGV4IDBiNmVhYjkuLjc4ZGZkNTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvTUVUQURBVEEKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9NRVRBREFUQQpAQCAtMSw2ICsxLDYgQEAKIG5hbWU6ICJnb29nbGV0ZXN0IgogZGVzY3JpcHRpb246Ci0gICJHb29nbGUgVGVzdCBpcyBHb29nbGUncyBDKysgdGVzdCBmcmFtZXdvcmsuIgorICAiR29vZ2xlIFRlc3QgaXMgR29vZ2xlJ3MgQysrIHRlc3QgZnJhbWV3b3JrLiBzcmMvIGlzIHRha2VuIGZyb20gZ2l0IGhhc2ggbGlzdGVkIGhlcmUuIEJVSUxELmduIGlzIGNvcGllZCBmcm9tIENocm9taXVtIGJyYW5jaC1oZWFkcy81NzM1IgogCiB0aGlyZF9wYXJ0eSB7CiAgIHVybCB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaAppbmRleCBiNmFiNjQ4Li45MDAyODMxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmgKQEAgLTM5LDcgKzM5LDExIEBACiAjaWZuZGVmIEdPT0dMRU1PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfCiAjZGVmaW5lIEdPT0dMRU1PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfCiAKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKKyNlbHNlCiAjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbmljZS1zdHJpY3QuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1uaWNlLXN0cmljdC5oCmluZGV4IGY0MjFkZWEuLjkxNzBjZTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1uaWNlLXN0cmljdC5oCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1uaWNlLXN0cmljdC5oCkBAIC0yMjUsOCArMjI1LDExIEBACiAgICAgICAiaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2dvb2dsZXRlc3QvIgogICAgICAgImdtb2NrX2Nvb2tfYm9vay5odG1sI05pY2VTdHJpY3ROYWdneSIpOwogICBTdHJpY3RNb2NrKCkgOiBNb2NrQ2xhc3MoKSB7CisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKCp0aGlzKSA9PSBzaXplb2YoTW9ja0NsYXNzKSwKICAgICAgICAgICAgICAgICAgICJUaGUgaW1wbCBzdWJjbGFzcyBzaG91bGRuJ3QgaW50cm9kdWNlIGFueSBwYWRkaW5nIik7CisjZW5kaWYgLy8gIUdURVNUX09TX1NUQVJCT0FSRCAtIGdpdmVzIE1TVkMgY29tcCBlcnJvciwgaSB0aGluayBkdWUgdG8gU3RhcmJvYXJkCisgICAgICAgLy8gcGFkZGluZyAgYi8yODgxNjYwMTcKICAgfQogCiAgIC8vIElkZWFsbHksIHdlIHdvdWxkIGluaGVyaXQgYmFzZSBjbGFzcydzIGNvbnN0cnVjdG9ycyB0aHJvdWdoIGEgdXNpbmcKQEAgLTIzOCwxNiArMjQxLDIyIEBACiAgIC8vIG1hZGUgZXhwbGljaXQuCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBPgogICBleHBsaWNpdCBTdHJpY3RNb2NrKEEmJiBhcmcpIDogTW9ja0NsYXNzKHN0ZDo6Zm9yd2FyZDxBPihhcmcpKSB7CisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKCp0aGlzKSA9PSBzaXplb2YoTW9ja0NsYXNzKSwKICAgICAgICAgICAgICAgICAgICJUaGUgaW1wbCBzdWJjbGFzcyBzaG91bGRuJ3QgaW50cm9kdWNlIGFueSBwYWRkaW5nIik7CisjZW5kaWYgLy8gIUdURVNUX09TX1NUQVJCT0FSRCAtIGdpdmVzIE1TVkMgY29tcCBlcnJvciwgaSB0aGluayBkdWUgdG8gU3RhcmJvYXJkCisgICAgICAgLy8gcGFkZGluZwogICB9CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRBcmcxLCB0eXBlbmFtZSBUQXJnMiwgdHlwZW5hbWUuLi4gQW4+CiAgIFN0cmljdE1vY2soVEFyZzEmJiBhcmcxLCBUQXJnMiYmIGFyZzIsIEFuJiYuLi4gYXJncykKICAgICAgIDogTW9ja0NsYXNzKHN0ZDo6Zm9yd2FyZDxUQXJnMT4oYXJnMSksIHN0ZDo6Zm9yd2FyZDxUQXJnMj4oYXJnMiksCiAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8QW4+KGFyZ3MpLi4uKSB7CisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKCp0aGlzKSA9PSBzaXplb2YoTW9ja0NsYXNzKSwKICAgICAgICAgICAgICAgICAgICJUaGUgaW1wbCBzdWJjbGFzcyBzaG91bGRuJ3QgaW50cm9kdWNlIGFueSBwYWRkaW5nIik7CisjZW5kaWYgLy8gIUdURVNUX09TX1NUQVJCT0FSRCAtIGdpdmVzIE1TVkMgY29tcCBlcnJvciwgaSB0aGluayBkdWUgdG8gU3RhcmJvYXJkCisgICAgICAgLy8gcGFkZGluZwogICB9CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xlbW9jay9zcmMvZ21vY2staW50ZXJuYWwtdXRpbHMuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYwppbmRleCBiYjBhNjk4Li4xZDQ0NmM0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYworKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYwpAQCAtMzUsNiArMzUsMTAgQEAKIAogI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCiAKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL2xvZy5oIgorI2VuZGlmCisKICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSA8YXJyYXk+CkBAIC0xNTgsMTMgKzE2MiwyMyBAQAogCiAgIGlmIChzZXZlcml0eSA9PSBrV2FybmluZykgewogICAgIC8vIFByaW50cyBhIEdNT0NLIFdBUk5JTkcgbWFya2VyIHRvIG1ha2UgdGhlIHdhcm5pbmdzIGVhc2lseSBzZWFyY2hhYmxlLgorI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKICAgICBzdGQ6OmNvdXQgPDwgIlxuR01PQ0sgV0FSTklORzoiOworI2VuZGlmCiAgIH0KICAgLy8gUHJlLXBlbmRzIGEgbmV3LWxpbmUgdG8gbWVzc2FnZSBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggb25lLgogICBpZiAobWVzc2FnZS5lbXB0eSgpIHx8IG1lc3NhZ2VbMF0gIT0gJ1xuJykgeworI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyNlbmRpZgogICB9CisKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgU0JfTE9HKElORk8pIDw8ICJcbkdNT0NLIiA8PCAoKHNldmVyaXR5ID09IGtXYXJuaW5nKSA/ICIgV0FSTklORyIgOiAiIikKKyAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgbWVzc2FnZTsKKyNlbHNlCiAgIHN0ZDo6Y291dCA8PCBtZXNzYWdlOworI2VuZGlmCiAgIGlmIChzdGFja19mcmFtZXNfdG9fc2tpcCA+PSAwKSB7CiAjaWZkZWYgTkRFQlVHCiAgICAgLy8gSW4gb3B0IG1vZGUsIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBza2lwIG5vIHN0YWNrIGZyYW1lLgpAQCAtMTc3LDEzICsxOTEsMjYgQEAKIAogICAgIC8vIEFwcGVuZHMgYSBuZXctbGluZSB0byBtZXNzYWdlIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggb25lLgogICAgIGlmICghbWVzc2FnZS5lbXB0eSgpICYmICptZXNzYWdlLnJiZWdpbigpICE9ICdcbicpIHsKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgICAgIFNCX0xPRyhJTkZPKSA8PCAiXG4iOworI2Vsc2UKICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworI2VuZGlmCiAgICAgfQorCisjaWYgR1RFU1RfT1NfU1RBUkJPQVJECisgICAgU0JfTE9HKElORk8pIDw8ICJTdGFjayB0cmFjZTpcbiIKKyAgICAgICAgICAgICAgICAgPDwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgKKyAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCksIGFjdHVhbF90b19za2lwKTsKKyAgfQorICBTQl9MT0coSU5GTykgPDwgOjpzdGQ6OmZsdXNoOworI2Vsc2UKICAgICBzdGQ6OmNvdXQgPDwgIlN0YWNrIHRyYWNlOlxuIgogICAgICAgICAgICAgICA8PCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKAogICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSwgYWN0dWFsX3RvX3NraXApOwogICB9CiAgIHN0ZDo6Y291dCA8PCA6OnN0ZDo6Zmx1c2g7CisjZW5kaWYKIH0KIAogR1RFU1RfQVBJXyBXaXRob3V0TWF0Y2hlcnMgR2V0V2l0aG91dE1hdGNoZXJzKCkgeyByZXR1cm4gV2l0aG91dE1hdGNoZXJzKCk7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZW1vY2svc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGVtb2NrL3NyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjCmluZGV4IGI2NzE5MjEuLjc5YWE4MWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZW1vY2svc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xlbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYwpAQCAtNjQ4LDggKzY0OCwxMiBAQAogICAgICAgLy8gUlVOX0FMTF9URVNUUygpIGhhcyBhbHJlYWR5IHJldHVybmVkIHdoZW4gdGhpcyBkZXN0cnVjdG9yIGlzCiAgICAgICAvLyBjYWxsZWQuICBUaGVyZWZvcmUgd2UgY2Fubm90IHVzZSB0aGUgbm9ybWFsIEdvb2dsZSBUZXN0CiAgICAgICAvLyBmYWlsdXJlIHJlcG9ydGluZyBtZWNoYW5pc20uCisjaWYgR1RFU1RfT1NfU1RBUkJPQVJECisgICAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisjZWxzZQogICAgICAgX2V4aXQoMSk7ICAvLyBXZSBjYW5ub3QgY2FsbCBleGl0KCkgYXMgaXQgaXMgbm90IHJlZW50cmFudCBhbmQKICAgICAgICAgICAgICAgICAgLy8gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhbGxlZC4KKyNlbmRpZiAvLyBHVEVTVF9PU19TVEFSQk9BUkQKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaAppbmRleCAwYzZlNzVjLi4xY2Y1NTYzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaApAQCAtMTM0OSw5ICsxMzQ5LDIxIEBACiBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sIGNvbnN0IFQxJiBsaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHJocykgeworI2lmIGRlZmluZWQoX01TQ19WRVIpCitHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0Mzg5IC8qIHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCAqLykKKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3NpZ24tY29tcGFyZSIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3Nob3J0ZW4tNjQtdG8tMzIiCisjZW5kaWYKICAgaWYgKGxocyA9PSByaHMpIHsKICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwogICB9CisjaWYgZGVmaW5lZChfTVNDX1ZFUikKK0dURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQorI2VsaWYgZGVmaW5lZChfX2NsYW5nX18pCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKIAogICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaAppbmRleCAzYWMzOWNkLi4yMDI5ZmUwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaApAQCAtNjA4LDExICs2MDgsMTEgQEAKICAgYm9vbCBBZGRUZXN0TmFtZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogY2FzZV9uYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZSkgewogICAgIGlmIChyZWdpc3RlcmVkXykgewotICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICBwb3NpeDo6UHJpbnRGKAogICAgICAgICAgICAgICAiJXMgVGVzdCAlcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlICIKICAgICAgICAgICAgICAgIlJFR0lTVEVSX1RZUEVEX1RFU1RfU1VJVEVfUCglcywgLi4uKS5cbiIsCiAgICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLCB0ZXN0X25hbWUsIGNhc2VfbmFtZSk7Ci0gICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgIHBvc2l4OjpGbHVzaCgpOwogICAgICAgcG9zaXg6OkFib3J0KCk7CiAgICAgfQogICAgIHJlZ2lzdGVyZWRfdGVzdHNfLmluc2VydCgKQEAgLTY1NCw3ICs2NTQsNyBAQAogLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiAnc3RyJzsKIC8vIHJldHVybnMgTlVMTCBpZiBubyBjb21tYSBpcyBmb3VuZCBpbiAnc3RyJy4KIGlubGluZSBjb25zdCBjaGFyKiBTa2lwQ29tbWEoY29uc3QgY2hhciogc3RyKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbW1hID0gc3RyY2hyKHN0ciwgJywnKTsKKyAgY29uc3QgY2hhciogY29tbWEgPSBwb3NpeDo6U3RyQ2hyKHN0ciwgJywnKTsKICAgaWYgKGNvbW1hID09IG51bGxwdHIpIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQpAQCAtNjY2LDcgKzY2Niw3IEBACiAvLyBSZXR1cm5zIHRoZSBwcmVmaXggb2YgJ3N0cicgYmVmb3JlIHRoZSBmaXJzdCBjb21tYSBpbiBpdDsgcmV0dXJucwogLy8gdGhlIGVudGlyZSBzdHJpbmcgaWYgaXQgY29udGFpbnMgbm8gY29tbWEuCiBpbmxpbmUgc3RkOjpzdHJpbmcgR2V0UHJlZml4VW50aWxDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKLSAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICBjb25zdCBjaGFyKiBjb21tYSA9IHBvc2l4OjpTdHJDaHIoc3RyLCAnLCcpOwogICByZXR1cm4gY29tbWEgPT0gbnVsbHB0ciA/IHN0ciA6IHN0ZDo6c3RyaW5nKHN0ciwgY29tbWEpOwogfQogCkBAIC03ODksMTEgKzc4OSwxMSBAQAogICAgIHN0ZDo6c3RyaW5nIHRlc3RfbmFtZSA9CiAgICAgICAgIFN0cmlwVHJhaWxpbmdTcGFjZXMoR2V0UHJlZml4VW50aWxDb21tYSh0ZXN0X25hbWVzKSk7CiAgICAgaWYgKCFzdGF0ZS0+VGVzdEV4aXN0cyh0ZXN0X25hbWUpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgY29kZSBsb2NhdGlvbiBmb3IgdGVzdCAlcy4lcyBhdCAlcy4iLAorICAgICAgcG9zaXg6OlByaW50RigiRmFpbGVkIHRvIGdldCBjb2RlIGxvY2F0aW9uIGZvciB0ZXN0ICVzLiVzIGF0ICVzLiIsCiAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgdGVzdF9uYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihjb2RlX2xvY2F0aW9uLmZpbGUuY19zdHIoKSwgY29kZV9sb2NhdGlvbi5saW5lKQogICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwotICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICBwb3NpeDo6Rmx1c2goKTsKICAgICAgIHBvc2l4OjpBYm9ydCgpOwogICAgIH0KICAgICBjb25zdCBDb2RlTG9jYXRpb24mIHRlc3RfbG9jYXRpb24gPSBzdGF0ZS0+R2V0Q29kZUxvY2F0aW9uKHRlc3RfbmFtZSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC1hcmNoLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC1hcmNoLmgKaW5kZXggZjAyNWRiNy4uYjcwYTY5MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaApAQCAtMzYsNyArMzYsOSBAQAogI2RlZmluZSBHT09HTEVURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9BUkNIX0hfCiAKIC8vIERldGVybWluZXMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIEdvb2dsZSBUZXN0IGlzIGNvbXBpbGVkLgotI2lmZGVmIF9fQ1lHV0lOX18KKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyMgZGVmaW5lIEdURVNUX09TX1NUQVJCT0FSRCAxCisjZWxpZiBfX0NZR1dJTl9fCiAjZGVmaW5lIEdURVNUX09TX0NZR1dJTiAxCiAjZWxpZiBkZWZpbmVkKF9fTUlOR1dfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX01JTkdXNjRfXykKICNkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAxCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaAppbmRleCBlMTc4NzgyLi5jYjA4NDdiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgKQEAgLTI1NSwzNCArMjU1LDUwIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOyBjYWxsaW5nIGEgbWFya2VkIGZ1bmN0aW9uCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZ2VuZXJhdGUgYSBjb21waWxlciB3YXJuaW5nCiAKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCiAjaW5jbHVkZSA8Y3R5cGUuaD4gICAvLyBmb3IgaXNzcGFjZSwgZXRjCiAjaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBmb3IgcHRyZGlmZl90CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2lmbmRlZiBfV0lOMzJfV0NFCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKKyNlbHNlICAvLyAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3NwaW5fbG9jay5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc3RyaW5nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgorI2VuZGlmICAvLyAhZGVmaW5lZChTVEFSQk9BUkQpCisKKyNpZiBkZWZpbmVkIF9fQVBQTEVfXworI2luY2x1ZGUgPEF2YWlsYWJpbGl0eU1hY3Jvcy5oPgorI2luY2x1ZGUgPFRhcmdldENvbmRpdGlvbmFscy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8Y2Vycm5vPgogLy8gI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4gIC8vIEd1YXJkZWQgYnkgR1RFU1RfSVNfVEhSRUFEU0FGRSBiZWxvdwogI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPGxvY2FsZT4KLSNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogLy8gI2luY2x1ZGUgPG11dGV4PiAgLy8gR3VhcmRlZCBieSBHVEVTVF9JU19USFJFQURTQUZFIGJlbG93CiAjaW5jbHVkZSA8dHVwbGU+CiAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmICAvLyAhX1dJTjMyX1dDRQotCi0jaWYgZGVmaW5lZCBfX0FQUExFX18KLSNpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KLSNpbmNsdWRlIDxUYXJnZXRDb25kaXRpb25hbHMuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaCIKICNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaCIKQEAgLTMzNiw2ICszNTIsMTMgQEAKICNkZWZpbmUgR1RFU1RfRElTQUJMRV9NU0NfREVQUkVDQVRFRF9QT1BfKCkgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCiAjZW5kaWYKIAorI2lmIEdURVNUX09TX1NUQVJCT0FSRAorIyBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAorIyBkZWZpbmUgR1RFU1RfSEFTX1BPU0lYX1JFIDAKKyMgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyMgZGVmaW5lIEdURVNUX0hBU19TRUggMAorIyBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAwCisjZWxzZSAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECiAvLyBCcmluZ3MgaW4gZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXgKIC8vIG5hbWVzcGFjZSAocmVhZCwgd3JpdGUsIGNsb3NlLCBjaGRpciwgaXNhdHR5LCBzdGF0KS4gV2UgZG8gbm90IGN1cnJlbnRseQogLy8gdXNlIHRoZW0gb24gV2luZG93cyBNb2JpbGUuCkBAIC0zNjYsNiArMzg5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmdzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyNlbmRpZiAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECiAKICNpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECiAvLyBVc2VkIHRvIGRlZmluZSBfX0FORFJPSURfQVBJX18gbWF0Y2hpbmcgdGhlIHRhcmdldCBOREsgQVBJIGxldmVsLgpAQCAtOTgyLDE0ICsxMDA2LDIxIEBACiB9OwogCiAjaWYgIWRlZmluZWQoR1RFU1RfTE9HXykKLQorI2lmIEdURVNUX09TX1NUQVJCT0FSRAorI2RlZmluZSBHVEVTVF9MT0dfIFNCX0xPRworI2Vsc2UKICNkZWZpbmUgR1RFU1RfTE9HXyhzZXZlcml0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICA6OnRlc3Rpbmc6OmludGVybmFsOjpHVGVzdExvZyg6OnRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF8jI3NldmVyaXR5LCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIC5HZXRTdHJlYW0oKQorI2VuZGlmCiAKIGlubGluZSB2b2lkIExvZ1RvU3RkZXJyKCkge30KKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKK2lubGluZSB2b2lkIEZsdXNoSW5mb0xvZygpIHt9CisjZWxzZQogaW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2gobnVsbHB0cik7IH0KKyNlbmRpZgogCiAjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0xPR18pCiAKQEAgLTExNjksNiArMTIwMCwxMDQgQEAKICNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKIAogLy8gRGVmaW5lcyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKyNpZiBkZWZpbmVkKEdURVNUX09TX1NUQVJCT0FSRCkKK2NsYXNzIE11dGV4IHsKKyBwdWJsaWM6CisgIGVudW0gTXV0ZXhUeXBlIHsga1N0YXRpYyA9IDAsIGtEeW5hbWljID0gMSB9OworICAvLyBXZSByZWx5IG9uIGtTdGF0aWNNdXRleCBiZWluZyAwIGFzIGl0IGlzIHRvIHdoYXQgdGhlIGxpbmtlciBpbml0aWFsaXplcworICAvLyB0eXBlXyBpbiBzdGF0aWMgbXV0ZXhlcy4gIGNyaXRpY2FsX3NlY3Rpb25fIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF6aWx5CisgIC8vIGluIFRocmVhZFNhZmVMYXp5SW5pdCgpLgorICBlbnVtIFN0YXRpY0NvbnN0cnVjdG9yU2VsZWN0b3IgeyBrU3RhdGljTXV0ZXggPSAwIH07CisgIC8vIFRoaXMgY29uc3RydWN0b3IgaW50ZW50aW9uYWxseSBkb2VzIG5vdGhpbmcuICBJdCByZWxpZXMgb24gdHlwZV8gYmVpbmcKKyAgLy8gc3RhdGljYWxseSBpbml0aWFsaXplZCB0byAwIChlZmZlY3RpdmVseSBzZXR0aW5nIGl0IHRvIGtTdGF0aWMpIGFuZCBvbgorICAvLyBUaHJlYWRTYWZlTGF6eUluaXQoKSB0byBsYXppbHkgaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgbWVtYmVycy4KKyAgZXhwbGljaXQgTXV0ZXgoU3RhdGljQ29uc3RydWN0b3JTZWxlY3RvciAvKmR1bW15Ki8pIHt9CisgIE11dGV4KCkgOiB0eXBlXyhrRHluYW1pYykgeyBTYk11dGV4Q3JlYXRlKCZtdXRleF8pOyB9CisgIH5NdXRleCgpIHsKKyAgICBpZiAodHlwZV8gIT0ga1N0YXRpYykgeworICAgICAgU2JNdXRleERlc3Ryb3koJm11dGV4Xyk7CisgICAgfQorICB9CisgIHZvaWQgTG9jaygpIHsKKyAgICBMYXp5SW5pdCgpOworICAgIFNiTXV0ZXhBY3F1aXJlKCZtdXRleF8pOworICB9CisgIHZvaWQgVW5sb2NrKCkgeyBTYk11dGV4UmVsZWFzZSgmbXV0ZXhfKTsgfQorICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7fQorIHByaXZhdGU6CisgIHZvaWQgTGF6eUluaXQoKSB7CisgICAgaWYgKHR5cGVfID09IGtTdGF0aWMgJiYgIWluaXRpYWxpemVkXykgeworICAgICAgc3RhdGljIHN0YXJib2FyZDo6U3BpbkxvY2sgc19sb2NrOworICAgICAgc19sb2NrLkFjcXVpcmUoKTsKKyAgICAgIGlmICghaW5pdGlhbGl6ZWRfKSB7CisgICAgICAgIFNiTXV0ZXhDcmVhdGUoJm11dGV4Xyk7CisgICAgICAgIGluaXRpYWxpemVkXyA9IHRydWU7CisgICAgICB9CisgICAgICBzX2xvY2suUmVsZWFzZSgpOworICAgIH0KKyAgfQorICBTYk11dGV4IG11dGV4XzsKKyAgZnJpZW5kIGNsYXNzIEdUZXN0TXV0ZXhMb2NrOworICBib29sIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAvLyBGb3Igc3RhdGljIG11dGV4ZXMsIHdlIHJlbHkgb24gdHlwZV8gbWVtYmVyIGJlaW5nIGluaXRpYWxpemVkIHRvIHplcm8KKyAgLy8gYnkgdGhlIGxpbmtlci4KKyAgTXV0ZXhUeXBlIHR5cGVfOworfTsKKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorI2RlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleCg6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleDo6a1N0YXRpY011dGV4KQorLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAorLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCisvLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4KiBtdXRleCkgOiBtdXRleF8obXV0ZXgpIHsKKyAgICBtdXRleF8tPkxvY2soKTsKKyAgfSAgLy8gTk9MSU5UCisgIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQorIHByaXZhdGU6CisgIE11dGV4KiBtdXRleF87Cit9OwordHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgeworICAgIGtleV8gPSBTYlRocmVhZENyZWF0ZUxvY2FsS2V5KAorICAgICAgICBbXSh2b2lkKiB2YWx1ZSkgeyBkZWxldGUgc3RhdGljX2Nhc3Q8VCo+KHZhbHVlKTsgfSk7CisgICAgU0JfRENIRUNLKGtleV8gIT0ga1NiVGhyZWFkTG9jYWxLZXlJbnZhbGlkKTsKKyAgfQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiBUaHJlYWRMb2NhbCgpIHsKKyAgICBkZWZhdWx0X3ZhbHVlXyA9IHZhbHVlOworICAgIHNldCh2YWx1ZSk7CisgIH0KKyAgflRocmVhZExvY2FsKCkgeworICAgIFNiVGhyZWFkRGVzdHJveUxvY2FsS2V5KGtleV8pOworICB9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KKyAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9CisgIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpHZXRPckNyZWF0ZVZhbHVlKCkgPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQqIEdldE9yQ3JlYXRlVmFsdWUoKSBjb25zdCB7CisgICAgVCogcHRyID0gc3RhdGljX2Nhc3Q8VCo+KFNiVGhyZWFkR2V0TG9jYWxWYWx1ZShrZXlfKSk7CisgICAgaWYgKHB0cikgeworICAgICAgcmV0dXJuIHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgVCogbmV3X3ZhbHVlID0gbmV3IFQoZGVmYXVsdF92YWx1ZV8pOworICAgICAgYm9vbCBpc19zZXQgPSBTYlRocmVhZFNldExvY2FsVmFsdWUoa2V5XywgbmV3X3ZhbHVlKTsKKyAgICAgIFNCX0NIRUNLKGlzX3NldCk7CisgICAgICByZXR1cm4gbmV3X3ZhbHVlOworICAgIH0KKyAgfQorICBUIGRlZmF1bHRfdmFsdWVfOworICBTYlRocmVhZExvY2FsS2V5IGtleV87Cit9OworCisjZWxzZSAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECiAjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQogCiAjaWYgR1RFU1RfT1NfV0lORE9XUwpAQCAtMTg1Nyw2ICsxOTg2LDcgQEAKIH07CiAKICNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKIAogLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0CiAvLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgpAQCAtMTkzNSw4ICsyMDY1LDkwIEBACiAvLyBzdGFuZGFyZCBmdW5jdGlvbnMgYXMgbWFjcm9zLCB0aGUgd3JhcHBlciBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lCiAvLyBhcyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KIAorCisjaWYgR1RFU1RfT1NfU1RBUkJPQVJECit0eXBlZGVmIGludCBGSUxFOworI2VuZGlmCisKIG5hbWVzcGFjZSBwb3NpeCB7CiAKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKwordHlwZWRlZiBTYkZpbGVJbmZvIFN0YXRTdHJ1Y3Q7CisKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIC8qZmlsZSovKSB7IHJldHVybiAwOyB9CitpbmxpbmUgaW50IElzQVRUWShGSUxFKiAvKmZpbGUqLykgeyByZXR1cm4gU2JMb2dJc1R0eSgpID8gMSA6IDA7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsKKyAgcmV0dXJuIFNiRmlsZUdldFBhdGhJbmZvKHBhdGgsIGJ1ZikgPyAwIDogLTE7Cit9CitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBTYlN0cmluZ0NvbXBhcmVOb0Nhc2UoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBTYlN0cmluZ0R1cGxpY2F0ZShzcmMpOyB9CitpbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gU2JGaWxlRGVsZXRlKGRpcik7IH0KK2lubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7IHJldHVybiBzdC5pc19kaXJlY3Rvcnk7IH0KKworaW5saW5lIGNvbnN0IGNoYXIqIFN0ck5DcHkoY2hhciogZGVzdCwgY29uc3QgY2hhciogc3JjLCBzaXplX3QgbikgeworICBzdHJuY3B5KGRlc3QsIHNyYywgc3RhdGljX2Nhc3Q8aW50PihuKSk7CisgIHJldHVybiBkZXN0OworfQorCitpbmxpbmUgRklMRSogRk9wZW4oY29uc3QgY2hhciogLypwYXRoKi8sIGNvbnN0IGNoYXIqIC8qbW9kZSovKSB7IHJldHVybiBOVUxMOyB9CitpbmxpbmUgaW50IEZDbG9zZShGSUxFKiAvKmZwKi8pIHsgcmV0dXJuIC0xOyB9CitpbmxpbmUgY29uc3QgY2hhciogU3RyRXJyb3IoaW50IC8qZXJybnVtKi8pIHsgcmV0dXJuICJOL0EiOyB9CisKK2lubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogLypuYW1lKi8pIHsgcmV0dXJuIE5VTEw7IH0KK2lubGluZSB2b2lkIEFib3J0KCkgeyBTYlN5c3RlbUJyZWFrSW50b0RlYnVnZ2VyKCk7IH0KKworaW5saW5lIGludCBWU05QcmludEYoY2hhciogb3V0X2J1ZmZlciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKKyAgcmV0dXJuIFNiU3RyaW5nRm9ybWF0KG91dF9idWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyk7Cit9CisKK2lubGluZSBzaXplX3QgU3RyTGVuKGNvbnN0IGNoYXIgKnN0cikgeworICByZXR1cm4gc3RybGVuKHN0cik7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpTdHJDaHIoY29uc3QgY2hhciAqc3RyLCBjaGFyIGMpIHsKKyAgcmV0dXJuIHN0cmNocihzdHIsIGMpOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqU3RyUkNocihjb25zdCBjaGFyICpzdHIsIGNoYXIgYykgeworICByZXR1cm4gc3RycmNocihzdHIsIGMpOworfQorCitpbmxpbmUgaW50IFN0ck5DbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbikgeworICByZXR1cm4gc3RybmNtcChzMSwgczIsIG4pOworfQorCitpbmxpbmUgdm9pZCAqTWVtU2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikgeworICByZXR1cm4gbWVtc2V0KHMsIGMsIG4pOworfQorCitpbmxpbmUgdm9pZCBBc3NlcnQoYm9vbCBiKSB7IFNCX0NIRUNLKGIpOyB9CisKK2lubGluZSBpbnQgTWtEaXIoY29uc3QgY2hhciogcGF0aCwgaW50IC8qbW9kZSovKSB7CisgIHJldHVybiBTYkRpcmVjdG9yeUNyZWF0ZShwYXRoKSA/IDAgOiAtMTsKK30KKworaW5saW5lIHZvaWQgVlByaW50Rihjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJncykgeworICBTYkxvZ0Zvcm1hdChmb3JtYXQsIGFyZ3MpOworfQorCitpbmxpbmUgdm9pZCBQcmludEYoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICBWUHJpbnRGKGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKworaW5saW5lIHZvaWQgRmx1c2goKSB7IFNiTG9nRmx1c2goKTsgfQorCitpbmxpbmUgdm9pZCAqTWFsbG9jKHNpemVfdCBuKSB7IHJldHVybiBTYk1lbW9yeUFsbG9jYXRlKG4pOyB9CitpbmxpbmUgdm9pZCBGcmVlKHZvaWQgKnApIHsgcmV0dXJuIFNiTWVtb3J5RGVhbGxvY2F0ZShwKTsgfQorCisjZWxzZSAvLyBHVEVTVF9PU19TVEFSQk9BUkQKKwogLy8gRnVuY3Rpb25zIHdpdGggYSBkaWZmZXJlbnQgbmFtZSBvbiBXaW5kb3dzLgogCiAjaWYgR1RFU1RfT1NfV0lORE9XUwpAQCAtMjA4Miw4ICsyMjk0LDIwIEBACiBbW25vcmV0dXJuXV0gaW5saW5lIHZvaWQgQWJvcnQoKSB7IGFib3J0KCk7IH0KICNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKIAorI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKKworaW5saW5lIHZvaWQgU05QcmludEYoY2hhciogb3V0X2J1ZmZlciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZvcm1hdCwuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICBWU05QcmludEYob3V0X2J1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgcG9zaXgKIAorI2lmIEdURVNUX09TX1NUQVJCT0FSRAorIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIGludGVybmFsOjpwb3NpeDo6U05QcmludEYKKyNlbHNlICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKIC8vIE1TVkMgImRlcHJlY2F0ZXMiIHNucHJpbnRmIGFuZCBpc3N1ZXMgd2FybmluZ3Mgd2hlcmV2ZXIgaXQgaXMgdXNlZC4gIEluCiAvLyBvcmRlciB0byBhdm9pZCB0aGVzZSB3YXJuaW5ncywgd2UgbmVlZCB0byB1c2UgX3NucHJpbnRmIG9yIF9zbnByaW50Zl9zIG9uCiAvLyBNU1ZDLWJhc2VkIHBsYXRmb3Jtcy4gIFdlIG1hcCB0aGUgR1RFU1RfU05QUklOVEZfIG1hY3JvIHRvIHRoZSBhcHByb3ByaWF0ZQpAQCAtMjA5OSw2ICsyMzIzLDcgQEAKICNlbHNlCiAjZGVmaW5lIEdURVNUX1NOUFJJTlRGXyBzbnByaW50ZgogI2VuZGlmCisjZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAogCiAvLyBUaGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlIHRoZSBjb21waWxlciBzdXBwb3J0cy4KIC8vCkBAIC0yMTYxLDcgKzIzODYsMTEgQEAKICNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfRkxBRykKIAogI2lmICFkZWZpbmVkKEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18pCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogI2RlZmluZSBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfIDEKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfIDAKKyNlbmRpZiAvLyAhZGVmaW5lZChTVEFSQk9BUkQpCiAjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18pCiAKICNpZiAhZGVmaW5lZChHVEVTVF9ERUNMQVJFX2Jvb2xfKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYwppbmRleCBmNmVlOTBjLi45YTMzZTU4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYworKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYwpAQCAtOTYsNyArOTYsNyBAQAogRmlsZVBhdGggRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSB7CiAjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8fCAgICAgICAgIFwKICAgICBHVEVTVF9PU19XSU5ET1dTX1JUIHx8IEdURVNUX09TX0VTUDgyNjYgfHwgR1RFU1RfT1NfRVNQMzIgfHwgXAotICAgIEdURVNUX09TX1hURU5TQQorICAgIEdURVNUX09TX1hURU5TQSB8fCBHVEVTVF9PU19TVEFSQk9BUkQKICAgLy8gVGhlc2UgcGxhdGZvcm1zIGRvIG5vdCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCiAgIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgogICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOwpAQCAtMTMzLDkgKzEzMyw5IEBACiAvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCiAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgogY29uc3QgY2hhciogRmlsZVBhdGg6OkZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKLSAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtQYXRoU2VwYXJhdG9yKTsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBpbnRlcm5hbDo6cG9zaXg6OlN0clJDaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOwogI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3RfYWx0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X2FsdF9zZXAgPSBpbnRlcm5hbDo6cG9zaXg6OlN0clJDaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOwogICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLgogICBpZiAobGFzdF9hbHRfc2VwICE9IG51bGxwdHIgJiYKICAgICAgIChsYXN0X3NlcCA9PSBudWxscHRyIHx8IGxhc3RfYWx0X3NlcCA+IGxhc3Rfc2VwKSkgewpAQCAtMzI3LDcgKzMyNyw3IEBACiAgIC8vIGRvIG5vdGhpbmcKICAgaW50IHJlc3VsdCA9IDA7CiAjZWxzZQotICBpbnQgcmVzdWx0ID0gbWtkaXIocGF0aG5hbWVfLmNfc3RyKCksIDA3NzcpOworICBpbnQgcmVzdWx0ID0gcG9zaXg6Ok1rRGlyKHBhdGhuYW1lXy5jX3N0cigpLCAwNzc3KTsKICNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKIAogICBpZiAocmVzdWx0ID09IC0xKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYwppbmRleCAzMmMyN2MyLi5hNGJmMGRlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKIAorI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtNTAsNiArNTEsNyBAQAogI2Vsc2UKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1RBUkJPQVJECiAKICNpZiBHVEVTVF9PU19NQUMKICNpbmNsdWRlIDxtYWNoL21hY2hfaW5pdC5oPgpAQCAtOTAsNyArOTIsNyBAQAogbmFtZXNwYWNlIHRlc3RpbmcgewogbmFtZXNwYWNlIGludGVybmFsIHsKIAotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBHVEVTVF9PU19TVEFSQk9BUkQKIC8vIE1TVkMgYW5kIEMrK0J1aWxkZXIgZG8gbm90IHByb3ZpZGUgYSBkZWZpbml0aW9uIG9mIFNUREVSUl9GSUxFTk8uCiBjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IDE7CiBjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IDI7CkBAIC02NzUsNyArNjc3LDcgQEAKICAgICByZWdmcmVlKCZwYXJ0aWFsX3JlZ2V4Xyk7CiAgICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOwogICB9Ci0gIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKKyAgcG9zaXg6OkZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKIH0KIAogLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgpAQCAtOTI4LDggKzkzMCw4IEBACiAvLyBJbXBsZW1lbnRzIHRoZSBSRSBjbGFzcy4KIAogUkU6On5SRSgpIHsKLSAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOwotICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KGZ1bGxfcGF0dGVybl8pKTsKKyAgcG9zaXg6OkZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKKyAgcG9zaXg6OkZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOwogfQogCiAvLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCkBAIC05NjAsNyArOTYyLDcgQEAKICAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCiAgIC8vIGZ1bGwgbWF0Y2g6IHdlIG5lZWQgc3BhY2UgdG8gcHJlcGVuZCBhICdeJywgYXBwZW5kIGEgJyQnLCBhbmQKICAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLgotICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGxlbiArIDMpKTsKKyAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHBvc2l4OjpNYWxsb2MobGVuICsgMykpOwogICBmdWxsX3BhdHRlcm5fID0gYnVmZmVyOwogCiAgIGlmICgqcmVnZXggIT0gJ14nKQpAQCAtMTAyNiw3ICsxMDI4LDcgQEAKIEdUZXN0TG9nOjp+R1Rlc3RMb2coKSB7CiAgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsOwogICBpZiAoc2V2ZXJpdHlfID09IEdURVNUX0ZBVEFMKSB7Ci0gICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkZsdXNoKCk7CiAgICAgcG9zaXg6OkFib3J0KCk7CiAgIH0KIH0KQEAgLTExMTQsNyArMTExNiw3IEBACiAgICAgfQogICAgIGZpbGVuYW1lXyA9IHN0ZDo6bW92ZShuYW1lX3RlbXBsYXRlKTsKICNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICAgIGZmbHVzaChudWxscHRyKTsKKyAgICBwb3NpeDo6Rmx1c2goKTsKICAgICBkdXAyKGNhcHR1cmVkX2ZkLCBmZF8pOwogICAgIGNsb3NlKGNhcHR1cmVkX2ZkKTsKICAgfQpAQCAtMTEyNCw3ICsxMTI2LDcgQEAKICAgc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJpbmcoKSB7CiAgICAgaWYgKHVuY2FwdHVyZWRfZmRfICE9IC0xKSB7CiAgICAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyZWFtLgotICAgICAgZmZsdXNoKG51bGxwdHIpOworICAgICAgcG9zaXg6OkZsdXNoKCk7CiAgICAgICBkdXAyKHVuY2FwdHVyZWRfZmRfLCBmZF8pOwogICAgICAgY2xvc2UodW5jYXB0dXJlZF9mZF8pOwogICAgICAgdW5jYXB0dXJlZF9mZF8gPSAtMTsKQEAgLTExOTcsMTEgKzExOTksMTYgQEAKICNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgogCiBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSkgeworI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKICAgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOwogICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihmdGVsbChmaWxlKSk7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgogfQogCiBzdGQ6OnN0cmluZyBSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKSB7CisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogICBjb25zdCBzaXplX3QgZmlsZV9zaXplID0gR2V0RmlsZVNpemUoZmlsZSk7CiAgIGNoYXIqIGNvbnN0IGJ1ZmZlciA9IG5ldyBjaGFyW2ZpbGVfc2l6ZV07CiAKQEAgLTEyMjIsNiArMTIyOSw5IEBACiAgIGRlbGV0ZVtdIGJ1ZmZlcjsKIAogICByZXR1cm4gY29udGVudDsKKyNlbHNlCisgIHJldHVybiBzdGQ6OnN0cmluZygpOworI2VuZGlmCiB9CiAKICNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVApAQCAtMTI5MCw3ICsxMzAwLDcgQEAKICAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKICAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCiAgICAgICAgIDw8ICIgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsKLSAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIHBvc2l4OjpQcmludEYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwogICAgIGZmbHVzaChzdGRvdXQpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTMwNyw3ICsxMzE3LDcgQEAKICAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKICAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCiAgICAgICAgIDw8ICIgaGFzIHZhbHVlICIgPDwgc3RyIDw8ICIsIHdoaWNoIG92ZXJmbG93cy5cbiI7Ci0gICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBwb3NpeDo6UHJpbnRGKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTEzNDgsNyArMTM1OCw3IEBACiAgIGludDMyX3QgcmVzdWx0ID0gZGVmYXVsdF92YWx1ZTsKICAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiRW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCBlbnZfdmFyLCBzdHJpbmdfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkgewotICAgIHByaW50ZigiVGhlIGRlZmF1bHQgdmFsdWUgJXMgaXMgdXNlZC5cbiIsCisgICAgcG9zaXg6OlByaW50RigiVGhlIGRlZmF1bHQgdmFsdWUgJXMgaXMgdXNlZC5cbiIsCiAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgZGVmYXVsdF92YWx1ZSkuR2V0U3RyaW5nKCkuY19zdHIoKSk7CiAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKaW5kZXggZWI3YzhkMS4uMWFiY2VkNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXRlc3QtcGFydC5jYwpAQCAtNjgsNyArNjgsNyBAQAogLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UGFydFJlc3VsdEFycmF5OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0IHsKICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCkpIHsKLSAgICBwcmludGYoIlxuSW52YWxpZCBpbmRleCAoJWQpIGludG8gVGVzdFBhcnRSZXN1bHRBcnJheS5cbiIsIGluZGV4KTsKKyAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiXG5JbnZhbGlkIGluZGV4ICglZCkgaW50byBUZXN0UGFydFJlc3VsdEFycmF5LlxuIiwgaW5kZXgpOwogICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKICAgfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYwppbmRleCBhMjgyOGI4Li5hMGRjYzJhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3Qvc3JjL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKQEAgLTkxLDkgKzkxLDkgQEAKIAogICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JzX3N0ciA9IGVycm9ycy5HZXRTdHJpbmcoKTsKICAgaWYgKGVycm9yc19zdHIgIT0gIiIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksCisgICAgcG9zaXg6OlByaW50RigiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKICAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkZsdXNoKCk7CiAgICAgcG9zaXg6OkFib3J0KCk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9zcmMvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC5jYwppbmRleCAxMGNmZjhlLi43NmEwZjcyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC5jYworKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3NyYy9nb29nbGV0ZXN0L3NyYy9ndGVzdC5jYwpAQCAtMzIsNiArMzIsMTIgQEAKIAogI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCiAKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvZXp0aW1lL2V6dGltZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vZmlsZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKKyNlbmRpZgorCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNTgsNyArNjQsMTIgQEAKICNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKICNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaCIKIAotI2lmIEdURVNUX09TX0xJTlVYCisKKworI2lmIEdURVNUX09TX1NUQVJCT0FSRAorLy8gU3RhcmJvYXJkIGRvZXMgbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgaW5jbHVkZXMuCisKKyNlbGlmIEdURVNUX09TX0xJTlVYCiAKICNpbmNsdWRlIDxmY250bC5oPiAgIC8vIE5PTElOVAogI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gTk9MSU5UCkBAIC0xODIsNiArMTkzLDggQEAKIC8vIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgogYm9vbCBnX2hlbHBfZmxhZyA9IGZhbHNlOwogCisKKyNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECiAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIE9wZW4gRmlsZSBmb3IgV3JpdGluZwogc3RhdGljIEZJTEUqIE9wZW5GaWxlRm9yV3JpdGluZyhjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUpIHsKICAgRklMRSogZmlsZW91dCA9IG51bGxwdHI7CkBAIC0xOTYsNiArMjA5LDcgQEAKICAgfQogICByZXR1cm4gZmlsZW91dDsKIH0KKyNlbmRpZgogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIApAQCAtMzY1LDYgKzM3OSwxNyBAQAogICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBmbGFnZmlsZSB0byByZWFkIGNvbW1hbmQtbGluZSBmbGFncyBmcm9tLiIpOwogI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCiAKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgdG90YWxfc2hhcmRzLAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigidG90YWxfc2hhcmRzIiwgLTEpLAorICAgICJUaGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcyB0byBzcGxpdCB0ZXN0IGNhc2VzIGludG8uIik7CitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHNoYXJkX2luZGV4LAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigic2hhcmRfaW5kZXgiLCAtMSksCisgICAgIlRoZSBzaGFyZCBpbmRleCB0aGF0IGRldGVybWluZXMgdGhlIHN1YnNldCBvZiB1bml0IHRlc3RzIHJ1biBpbiB0aGUgc2hhcmQuIik7CisjZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAorCiBuYW1lc3BhY2UgdGVzdGluZyB7CiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCkBAIC0xMTI2LDEwICsxMTUxLDE0IEBACiAvLyBhcm91bmQgc3ViamVjdCB0byBhZGp1c3RtZW50cyBieSB0aGUgc3lzdGVtLCB0byBtZWFzdXJlIGVsYXBzZWQgdGltZSB1c2UKIC8vIFRpbWVyIGluc3RlYWQuCiBUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCkgeworI2lmIEdURVNUX09TX1NUQVJCT0FSRAorICByZXR1cm4gU2JUaW1lR2V0Tm93KCkgLyBrU2JUaW1lTWlsbGlzZWNvbmQ7CisjZWxzZQogICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCiAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkgLQogICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OmZyb21fdGltZV90KDApKQogICAgICAgLmNvdW50KCk7CisjZW5kaWYgLy8gR1RFU1RfT1NfU1RBUkJPQVJECiB9CiAKIC8vIFV0aWxpdGllcwpAQCAtMzE0Myw4ICszMTcyLDggQEAKIC8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0Lgogc3RhdGljIHZvaWQgUHJpbnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewogICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzdWx0ID0gUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOwotICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7Ci0gIGZmbHVzaChzdGRvdXQpOworICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiJXNcbiIsIHJlc3VsdC5jX3N0cigpKTsKKyAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKICAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAogICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKQEAgLTMyMzIsNyArMzI2MSw3IEBACiAgIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X2NvbG9yID0gYy5jX3N0cigpOwogCiAgIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJhdXRvIikpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01JTkdXCisjaWYgKEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTUlOR1cpIHx8IEdURVNUX09TX1NUQVJCT0FSRAogICAgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCiAgICAgLy8gY29uc29sZSB0aGVyZSBkb2VzIHN1cHBvcnQgY29sb3JzLgogICAgIHJldHVybiBzdGRvdXRfaXNfdHR5OwpAQCAtMzI3OCwxMyArMzMwNywxNyBAQAogICAgIEdURVNUX09TX1dJTkRPV1NfUEhPTkUgfHwgR1RFU1RfT1NfV0lORE9XU19SVCB8fCBkZWZpbmVkKEVTUF9QTEFURk9STSkKICAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBBbHdheXNGYWxzZSgpOwogI2Vsc2UKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgc3RhdGljIGNvbnN0IGJvb2wgaW5fY29sb3JfbW9kZSA9IFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkoMCkgIT0gMCk7CisjZWxzZQogICBzdGF0aWMgY29uc3QgYm9vbCBpbl9jb2xvcl9tb2RlID0KICAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsKKyNlbmRpZiAvLyBHVEVTVF9PU19TVEFSQk9BUkQKICAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBpbl9jb2xvcl9tb2RlICYmIChjb2xvciAhPSBHVGVzdENvbG9yOjprRGVmYXVsdCk7CiAjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1pPUwogCiAgIGlmICghdXNlX2NvbG9yKSB7Ci0gICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgIHBvc2l4OjpWUHJpbnRGKGZtdCwgYXJncyk7CiAgICAgdmFfZW5kKGFyZ3MpOwogICAgIHJldHVybjsKICAgfQpAQCAtMzMwMiwxOCArMzMzNSwxOCBAQAogICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCiAgIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5CiAgIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCi0gIGZmbHVzaChzdGRvdXQpOworICBwb3NpeDo6Rmx1c2goKTsKICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwgbmV3X2NvbG9yKTsKIAotICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHBvc2l4OjpWUHJpbnRGKGZtdCwgYXJncyk7CiAKLSAgZmZsdXNoKHN0ZG91dCk7CisgIHBvc2l4OjpGbHVzaCgpOwogICAvLyBSZXN0b3JlcyB0aGUgdGV4dCBjb2xvci4KICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwgb2xkX2NvbG9yX2F0dHJzKTsKICNlbHNlCi0gIHByaW50ZigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgcHJpbnRmKCJcMDMzW20iKTsgIC8vIFJlc2V0cyB0aGUgdGVybWluYWwgdG8gZGVmYXVsdC4KKyAgcG9zaXg6OlByaW50RigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7CisgIHBvc2l4OjpWUHJpbnRGKGZtdCwgYXJncyk7CisgIHBvc2l4OjpQcmludEYoIlwwMzNbbSIpOyAgLy8gUmVzZXRzIHRoZSB0ZXJtaW5hbCB0byBkZWZhdWx0LgogI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQogICB2YV9lbmQoYXJncyk7CiB9CkBAIC0zMzI4LDEzICszMzYxLDEzIEBACiAgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3BhcmFtID0gdGVzdF9pbmZvLnZhbHVlX3BhcmFtKCk7CiAKICAgaWYgKHR5cGVfcGFyYW0gIT0gbnVsbHB0ciB8fCB2YWx1ZV9wYXJhbSAhPSBudWxscHRyKSB7Ci0gICAgcHJpbnRmKCIsIHdoZXJlICIpOworICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIsIHdoZXJlICIpOwogICAgIGlmICh0eXBlX3BhcmFtICE9IG51bGxwdHIpIHsKLSAgICAgIHByaW50ZigiJXMgPSAlcyIsIGtUeXBlUGFyYW1MYWJlbCwgdHlwZV9wYXJhbSk7Ci0gICAgICBpZiAodmFsdWVfcGFyYW0gIT0gbnVsbHB0cikgcHJpbnRmKCIgYW5kICIpOworICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiVzID0gJXMiLCBrVHlwZVBhcmFtTGFiZWwsIHR5cGVfcGFyYW0pOworICAgICAgaWYgKHZhbHVlX3BhcmFtICE9IG51bGxwdHIpIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIgYW5kICIpOwogICAgIH0KICAgICBpZiAodmFsdWVfcGFyYW0gIT0gbnVsbHB0cikgewotICAgICAgcHJpbnRmKCIlcyA9ICVzIiwga1ZhbHVlUGFyYW1MYWJlbCwgdmFsdWVfcGFyYW0pOworICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiVzID0gJXMiLCBrVmFsdWVQYXJhbUxhYmVsLCB2YWx1ZV9wYXJhbSk7CiAgICAgfQogICB9CiB9CkBAIC0zMzQ2LDcgKzMzNzksNyBAQAogIHB1YmxpYzoKICAgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKCkge30KICAgc3RhdGljIHZvaWQgUHJpbnRUZXN0TmFtZShjb25zdCBjaGFyKiB0ZXN0X3N1aXRlLCBjb25zdCBjaGFyKiB0ZXN0KSB7Ci0gICAgcHJpbnRmKCIlcy4lcyIsIHRlc3Rfc3VpdGUsIHRlc3QpOworICAgIHBvc2l4OjpQcmludEYoIiVzLiVzIiwgdGVzdF9zdWl0ZSwgdGVzdCk7CiAgIH0KIAogICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgb3ZlcnJpZGUgd2hhdCdzIGluIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBjbGFzcy4KQEAgLTMzODYsNyArMzQxOSw3IEBACiB2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoCiAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbikgewogICBpZiAoR1RFU1RfRkxBR19HRVQocmVwZWF0KSAhPSAxKQotICAgIHByaW50ZigiXG5SZXBlYXRpbmcgYWxsIHRlc3RzIChpdGVyYXRpb24gJWQpIC4gLiAuXG5cbiIsIGl0ZXJhdGlvbiArIDEpOworICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwgaXRlcmF0aW9uICsgMSk7CiAKICAgc3RkOjpzdHJpbmcgZiA9IEdURVNUX0ZMQUdfR0VUKGZpbHRlcik7CiAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbHRlciA9IGYuY19zdHIoKTsKQEAgLTMzOTksMTAgKzM0MzIsMTkgQEAKICAgfQogCiAgIGlmIChpbnRlcm5hbDo6U2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LCBmYWxzZSkpIHsKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgICBjb25zdCBpbnQzMl90IHNoYXJkX2luZGV4ID0gR1RFU1RfRkxBRyhzaGFyZF9pbmRleCk7CisgICAgY29uc3QgaW50MzJfdCB0b3RhbF9zaGFyZHMgPSBHVEVTVF9GTEFHKHRvdGFsX3NoYXJkcyk7CisgICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprWWVsbG93LAorICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAlZCBvZiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNoYXJkX2luZGV4KSArIDEsCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRvdGFsX3NoYXJkcykpOworI2Vsc2UgIC8vIEdURVNUX09TX1NUQVJCT0FSRAogICAgIGNvbnN0IGludDMyX3Qgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKTsKICAgICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtZZWxsb3csICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJWQgb2YgJXMuXG4iLAogICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLAogICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoa1Rlc3RUb3RhbFNoYXJkcykpOworI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKICAgfQogCiAgIGlmIChHVEVTVF9GTEFHX0dFVChzaHVmZmxlKSkgewpAQCAtMzQxMiwxNyArMzQ1NCwxNyBAQAogICB9CiAKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprR3JlZW4sICJbPT09PT09PT09PV0gIik7Ci0gIHByaW50ZigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKKyAgcG9zaXg6OlByaW50RigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKICAgICAgICAgIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3QudGVzdF90b19ydW5fY291bnQoKSkuY19zdHIoKSwKICAgICAgICAgIEZvcm1hdFRlc3RTdWl0ZUNvdW50KHVuaXRfdGVzdC50ZXN0X3N1aXRlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKLSAgZmZsdXNoKHN0ZG91dCk7CisgIHBvc2l4OjpGbHVzaCgpOwogfQogCiB2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KAogICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CiAgIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvcjo6a0dyZWVuLCAiWy0tLS0tLS0tLS1dICIpOwotICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC5cbiIpOwotICBmZmx1c2goc3Rkb3V0KTsKKyAgcG9zaXg6OlByaW50RigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLlxuIik7CisgIHBvc2l4OjpGbHVzaCgpOwogfQogCiAjaWZuZGVmIEdURVNUX1JFTU9WRV9MRUdBQ1lfVEVTVF9DQVNFQVBJXwpAQCAtMzQzMCwxMyArMzQ3MiwxMyBAQAogICBjb25zdCBzdGQ6OnN0cmluZyBjb3VudHMgPQogICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprR3JlZW4sICJbLS0tLS0tLS0tLV0gIik7Ci0gIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpKTsKKyAgcG9zaXg6OlByaW50RigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpKTsKICAgaWYgKHRlc3RfY2FzZS50eXBlX3BhcmFtKCkgPT0gbnVsbHB0cikgewotICAgIHByaW50ZigiXG4iKTsKKyAgICBwb3NpeDo6UHJpbnRGKCJcbiIpOwogICB9IGVsc2UgewotICAgIHByaW50ZigiLCB3aGVyZSAlcyA9ICVzXG4iLCBrVHlwZVBhcmFtTGFiZWwsIHRlc3RfY2FzZS50eXBlX3BhcmFtKCkpOworICAgIHBvc2l4OjpQcmludEYoIiwgd2hlcmUgJXMgPSAlc1xuIiwga1R5cGVQYXJhbUxhYmVsLCB0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpKTsKICAgfQotICBmZmx1c2goc3Rkb3V0KTsKKyAgcG9zaXg6OkZsdXNoKCk7CiB9CiAjZWxzZQogdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFN1aXRlU3RhcnQoCkBAIC0zNDQ0LDI4ICszNDg2LDI4IEBACiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9CiAgICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3Rfc3VpdGUudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprR3JlZW4sICJbLS0tLS0tLS0tLV0gIik7Ci0gIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X3N1aXRlLm5hbWUoKSk7CisgIHBvc2l4OjpQcmludEYoIiVzIGZyb20gJXMiLCBjb3VudHMuY19zdHIoKSwgdGVzdF9zdWl0ZS5uYW1lKCkpOwogICBpZiAodGVzdF9zdWl0ZS50eXBlX3BhcmFtKCkgPT0gbnVsbHB0cikgewotICAgIHByaW50ZigiXG4iKTsKKyAgICBwb3NpeDo6UHJpbnRGKCJcbiIpOwogICB9IGVsc2UgewotICAgIHByaW50ZigiLCB3aGVyZSAlcyA9ICVzXG4iLCBrVHlwZVBhcmFtTGFiZWwsIHRlc3Rfc3VpdGUudHlwZV9wYXJhbSgpKTsKKyAgICBwb3NpeDo6UHJpbnRGKCIsIHdoZXJlICVzID0gJXNcbiIsIGtUeXBlUGFyYW1MYWJlbCwgdGVzdF9zdWl0ZS50eXBlX3BhcmFtKCkpOwogICB9Ci0gIGZmbHVzaChzdGRvdXQpOworICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7CiB9CiAjZW5kaWYgIC8vIEdURVNUX1JFTU9WRV9MRUdBQ1lfVEVTVF9DQVNFQVBJXwogCiB2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewogICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtHcmVlbiwgIlsgUlVOICAgICAgXSAiKTsKICAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9zdWl0ZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOwotICBwcmludGYoIlxuIik7Ci0gIGZmbHVzaChzdGRvdXQpOworICBwb3NpeDo6UHJpbnRGKCJcbiIpOworICBwb3NpeDo6Rmx1c2goKTsKIH0KIAogdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdERpc2FibGVkKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprWWVsbG93LCAiWyBESVNBQkxFRCBdICIpOwogICBQcmludFRlc3ROYW1lKHRlc3RfaW5mby50ZXN0X3N1aXRlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7Ci0gIHByaW50ZigiXG4iKTsKLSAgZmZsdXNoKHN0ZG91dCk7CisgIHBvc2l4OjpQcmludEYoIlxuIik7CisgIGludGVybmFsOjpwb3NpeDo6Rmx1c2goKTsKIH0KIAogLy8gQ2FsbGVkIGFmdGVyIGFuIGFzc2VydGlvbiBmYWlsdXJlLgpAQCAtMzQ3OSw3ICszNTIxLDcgQEAKICAgICAgIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24KICAgICAgIC8vIChlLmcuIGV4cGVjdGVkIHRoaXMgYW5kIGdvdCB0aGF0KS4KICAgICAgIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICB9CiB9CiAKQEAgLTM0OTUsMTMgKzM1MzcsMTMgQEAKICAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+RmFpbGVkKCkpIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7CiAKICAgaWYgKEdURVNUX0ZMQUdfR0VUKHByaW50X3RpbWUpKSB7Ci0gICAgcHJpbnRmKCIgKCVzIG1zKVxuIiwKKyAgICBwb3NpeDo6UHJpbnRGKCIgKCVzIG1zKVxuIiwKICAgICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2luZm8ucmVzdWx0KCktPmVsYXBzZWRfdGltZSgpKQogICAgICAgICAgICAgICAgLmNfc3RyKCkpOwogICB9IGVsc2UgewotICAgIHByaW50ZigiXG4iKTsKKyAgICBwb3NpeDo6UHJpbnRGKCJcbiIpOwogICB9Ci0gIGZmbHVzaChzdGRvdXQpOworICBwb3NpeDo6Rmx1c2goKTsKIH0KIAogI2lmbmRlZiBHVEVTVF9SRU1PVkVfTEVHQUNZX1RFU1RfQ0FTRUFQSV8KQEAgLTM1MTEsOSArMzU1Myw5IEBACiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9CiAgICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOwogICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtHcmVlbiwgIlstLS0tLS0tLS0tXSAiKTsKLSAgcHJpbnRmKCIlcyBmcm9tICVzICglcyBtcyB0b3RhbClcblxuIiwgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCksCisgIHBvc2l4OjpQcmludEYoIiVzIGZyb20gJXMgKCVzIG1zIHRvdGFsKVxuXG4iLCBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSwKICAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKLSAgZmZsdXNoKHN0ZG91dCk7CisgIHBvc2l4OjpGbHVzaCgpOwogfQogI2Vsc2UKIHZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RTdWl0ZUVuZChjb25zdCBUZXN0U3VpdGUmIHRlc3Rfc3VpdGUpIHsKQEAgLTM1MjIsMjQgKzM1NjQsMjQgQEAKICAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KICAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9zdWl0ZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOwogICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtHcmVlbiwgIlstLS0tLS0tLS0tXSAiKTsKLSAgcHJpbnRmKCIlcyBmcm9tICVzICglcyBtcyB0b3RhbClcblxuIiwgY291bnRzLmNfc3RyKCksIHRlc3Rfc3VpdGUubmFtZSgpLAorICBwb3NpeDo6UHJpbnRGKCIlcyBmcm9tICVzICglcyBtcyB0b3RhbClcblxuIiwgY291bnRzLmNfc3RyKCksIHRlc3Rfc3VpdGUubmFtZSgpLAogICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X3N1aXRlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKLSAgZmZsdXNoKHN0ZG91dCk7CisgIHBvc2l4OjpGbHVzaCgpOwogfQogI2VuZGlmICAvLyBHVEVTVF9SRU1PVkVfTEVHQUNZX1RFU1RfQ0FTRUFQSV8KIAogdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgKICAgICBjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgewogICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtHcmVlbiwgIlstLS0tLS0tLS0tXSAiKTsKLSAgcHJpbnRmKCJHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd25cbiIpOwotICBmZmx1c2goc3Rkb3V0KTsKKyAgcG9zaXg6OlByaW50RigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duXG4iKTsKKyAgcG9zaXg6OkZsdXNoKCk7CiB9CiAKIC8vIEludGVybmFsIGhlbHBlciBmb3IgcHJpbnRpbmcgdGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzLgogdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgewogICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprUmVkLCAiWyAgRkFJTEVEICBdICIpOwotICBwcmludGYoIiVzLCBsaXN0ZWQgYmVsb3c6XG4iLCBGb3JtYXRUZXN0Q291bnQoZmFpbGVkX3Rlc3RfY291bnQpLmNfc3RyKCkpOworICBwb3NpeDo6UHJpbnRGKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X3N1aXRlX2NvdW50KCk7ICsraSkgewogICAgIGNvbnN0IFRlc3RTdWl0ZSYgdGVzdF9zdWl0ZSA9ICp1bml0X3Rlc3QuR2V0VGVzdFN1aXRlKGkpOwpAQCAtMzU1MiwxMiArMzU5NCwxMiBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICAgIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvcjo6a1JlZCwgIlsgIEZBSUxFRCAgXSAiKTsKLSAgICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X3N1aXRlLm5hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgICBwb3NpeDo6UHJpbnRGKCIlcy4lcyIsIHRlc3Rfc3VpdGUubmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKICAgICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7Ci0gICAgICBwcmludGYoIlxuIik7CisgICAgICBwb3NpeDo6UHJpbnRGKCJcbiIpOwogICAgIH0KICAgfQotICBwcmludGYoIlxuJTJkIEZBSUxFRCAlc1xuIiwgZmFpbGVkX3Rlc3RfY291bnQsCisgIHBvc2l4OjpQcmludEYoIlxuJTJkIEZBSUxFRCAlc1xuIiwgZmFpbGVkX3Rlc3RfY291bnQsCiAgICAgICAgICBmYWlsZWRfdGVzdF9jb3VudCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CiB9CiAKQEAgLTM1NzMsMTIgKzM2MTUsMTIgQEAKICAgICB9CiAgICAgaWYgKHRlc3Rfc3VpdGUuYWRfaG9jX3Rlc3RfcmVzdWx0KCkuRmFpbGVkKCkpIHsKICAgICAgIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvcjo6a1JlZCwgIlsgIEZBSUxFRCAgXSAiKTsKLSAgICAgIHByaW50ZigiJXM6IFNldFVwVGVzdFN1aXRlIG9yIFRlYXJEb3duVGVzdFN1aXRlXG4iLCB0ZXN0X3N1aXRlLm5hbWUoKSk7CisgICAgICBwb3NpeDo6UHJpbnRGKCIlczogU2V0VXBUZXN0U3VpdGUgb3IgVGVhckRvd25UZXN0U3VpdGVcbiIsIHRlc3Rfc3VpdGUubmFtZSgpKTsKICAgICAgICsrc3VpdGVfZmFpbHVyZV9jb3VudDsKICAgICB9CiAgIH0KICAgaWYgKHN1aXRlX2ZhaWx1cmVfY291bnQgPiAwKSB7Ci0gICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgVEVTVCAlc1xuIiwgc3VpdGVfZmFpbHVyZV9jb3VudCwKKyAgICBwb3NpeDo6UHJpbnRGKCJcbiUyZCBGQUlMRUQgVEVTVCAlc1xuIiwgc3VpdGVfZmFpbHVyZV9jb3VudCwKICAgICAgICAgICAgc3VpdGVfZmFpbHVyZV9jb3VudCA9PSAxID8gIlNVSVRFIiA6ICJTVUlURVMiKTsKICAgfQogfQpAQCAtMzYwMSwxMiArMzY0MywxMyBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICAgIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvcjo6a0dyZWVuLCAiWyAgU0tJUFBFRCBdICIpOwotICAgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3Rfc3VpdGUubmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKLSAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgIHBvc2l4OjpQcmludEYoIiVzLiVzIiwgdGVzdF9zdWl0ZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgICAgcG9zaXg6OlByaW50RigiXG4iKTsKICAgICB9CiAgIH0KIH0KIAorI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKIHZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprR3JlZW4sICJbPT09PT09PT09PV0gIik7CkBAIC0zNjQyLDggKzM2ODUsMTA5IEBACiAgICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQsIG51bV9kaXNhYmxlZCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CiAgIH0KICAgLy8gRW5zdXJlIHRoYXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIHByaW50ZWQgYmVmb3JlLCBlLmcuLCBoZWFwY2hlY2tlciBvdXRwdXQuCi0gIGZmbHVzaChzdGRvdXQpOworICBwb3NpeDo6Rmx1c2goKTsKIH0KKyNlbHNlICAvLyAhR1RFU1RfT1NfU1RBUkJPQVJECit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIC8vIER1ZSB0byB0aGUgdGVzdCBwcm9jZXNzZXMgcmVseWluZyBvbiByZWdleC1wYXJzaW5nIG9mIEdURVNUIHRlc3QgcmVzdWx0CisgIC8vIHN1bW1hcnkgb3V0cHV0LCB3ZSBtb2RpZnkgdGhpcyBzdGVwIHRvIGF0b21pY2FsbHkgb3V0cHV0IHRoZSBsb2dzIHRvIHN0ZG91dAorICAvLyB0byBhdm9pZCBvdGhlciBleHRlcm5hbCBTYkxvZ1JhdyBjYWxscyBmcm9tIGJlaW5nIGluc2VydGVkIGJldHdlZW4gY2FsbHMgdG8KKyAgLy8gcG9zaXg6UHJpbnRGKCkuCisgIC8vIFRoaXMgYmF0Y2hpbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdXRwdXQgaXMgd2VsbC1mb3JtYXR0ZWQgYXMgdGhlIHRlc3QKKyAgLy8gcnVubmVyIHNjcmlwdHMgYXJlIHNldHVwIHRvIGV4cGVjdC4KKyAgLy8gU2VlIGIvMjUxODI3NzQxCisgIHN0ZDo6c3RyaW5nc3RyZWFtIG91dF9zdHJlYW07CisgIG91dF9zdHJlYW0gPDwgIls9PT09PT09PT09XSAiOworCisgIG91dF9zdHJlYW0gPDwgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKQorICAgICAgICAgICAgIDw8ICIgZnJvbSAiCisgICAgICAgICAgICAgPDwgRm9ybWF0VGVzdFN1aXRlQ291bnQodW5pdF90ZXN0LnRlc3Rfc3VpdGVfdG9fcnVuX2NvdW50KCkpCisgICAgICAgICAgICAgPDwgIiByYW4uIjsKKworICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgeworICAgIG91dF9zdHJlYW0gPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpCisgICAgICAgICAgICAgICA8PCAiIG1zIHRvdGFsKSI7CisgIH0KKyAgb3V0X3N0cmVhbSA8PCBzdGQ6OmVuZGw7CisKKyAgb3V0X3N0cmVhbSA8PCAiWyAgUEFTU0VEICBdICIKKyAgICAgICAgICAgICA8PCBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKQorICAgICAgICAgICAgIDw8ICIuIgorICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKworICBpbnQgbnVtX2ZhaWx1cmVzID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmICghdW5pdF90ZXN0LlBhc3NlZCgpKSB7CisgICAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgICAgb3V0X3N0cmVhbSA8PCAiWyAgRkFJTEVEICBdICIKKyAgICAgICAgICAgICAgIDw8IEZvcm1hdFRlc3RDb3VudChmYWlsZWRfdGVzdF9jb3VudCkKKyAgICAgICAgICAgICAgIDw8ICIsIGxpc3RlZCBiZWxvdzoiCisgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBQcmludCBlYWNoIGZhaWxlZCB0ZXN0IGNhc2Ugd2l0aGluIHRoZSB1bml0IHRlc3QuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisgICAgICBpZiAoIXRlc3RfY2FzZS5zaG91bGRfcnVuKCkgfHwgKHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpID09IDApKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2opIHsKKyAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7CisgICAgICAgIGlmICghdGVzdF9pbmZvLnNob3VsZF9ydW4oKSB8fCB0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb3V0X3N0cmVhbSA8PCAiWyAgRkFJTEVEICBdICIKKyAgICAgICAgICAgICAgICAgICA8PCB0ZXN0X2Nhc2UubmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLm5hbWUoKTsKKworICAgICAgICAvLyBPdXRwdXQgdGhlIGZ1bGwgdGVzdCBjb21tZW50IGlmIHByZXNlbnQuCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOworICAgICAgICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMIHx8IHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKKyAgICAgICAgICBvdXRfc3RyZWFtIDw8ICIsIHdoZXJlICI7CisgICAgICAgICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgb3V0X3N0cmVhbSA8PCBrVHlwZVBhcmFtTGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9wYXJhbTsKKyAgICAgICAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIG91dF9zdHJlYW0gPDwgIiBhbmQgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG91dF9zdHJlYW0gPDwga1ZhbHVlUGFyYW1MYWJlbAorICAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZV9wYXJhbTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0X3N0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X3N0cmVhbSA8PCBudW1fZmFpbHVyZXMKKyAgICAgICAgICAgICAgIDw8ICIgRkFJTEVEICIKKyAgICAgICAgICAgICAgIDw8IChudW1fZmFpbHVyZXMgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpCisgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOworICBpZiAobnVtX2Rpc2FibGVkICYmICFHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgeworICAgIGlmICghbnVtX2ZhaWx1cmVzKSB7CisgICAgICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLgorICAgICAgb3V0X3N0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIG91dF9zdHJlYW0gPDwgIiAgWU9VIEhBVkUgIgorICAgICAgICAgICAgICAgPDwgbnVtX2Rpc2FibGVkCisgICAgICAgICAgICAgICA8PCAiIERJU0FCTEVEICIKKyAgICAgICAgICAgICAgIDw8IChudW1fZGlzYWJsZWQgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpCisgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgfQorICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4KKyAgcG9zaXg6OlByaW50RigiJXMiLCBvdXRfc3RyZWFtLnN0cigpLmNfc3RyKCkpOworICBwb3NpeDo6Rmx1c2goKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX09TX1NUQVJCT0FSRAogCiAvLyBFbmQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyCiAKQEAgLTM2NTQsNyArMzc5OCw3IEBACiAgcHVibGljOgogICBCcmllZlVuaXRUZXN0UmVzdWx0UHJpbnRlcigpIHt9CiAgIHN0YXRpYyB2b2lkIFByaW50VGVzdE5hbWUoY29uc3QgY2hhciogdGVzdF9zdWl0ZSwgY29uc3QgY2hhciogdGVzdCkgewotICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X3N1aXRlLCB0ZXN0KTsKKyAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiJXMuJXMiLCB0ZXN0X3N1aXRlLCB0ZXN0KTsKICAgfQogCiAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvdmVycmlkZSB3aGF0J3MgaW4gdGhlIFRlc3RFdmVudExpc3RlbmVyIGNsYXNzLgpAQCAtMzY5Nyw3ICszODQxLDcgQEAKICAgICAgIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24KICAgICAgIC8vIChlLmcuIGV4cGVjdGVkIHRoaXMgYW5kIGdvdCB0aGF0KS4KICAgICAgIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICB9CiB9CiAKQEAgLTM3MDgsNDYgKzM4NTIsNDYgQEAKICAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOwogCiAgICAgaWYgKEdURVNUX0ZMQUdfR0VUKHByaW50X3RpbWUpKSB7Ci0gICAgICBwcmludGYoIiAoJXMgbXMpXG4iLAorICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiAoJXMgbXMpXG4iLAogICAgICAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkKICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIlxuIik7CisgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiXG4iKTsKICAgICB9Ci0gICAgZmZsdXNoKHN0ZG91dCk7CisgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICB9CiB9CiAKIHZvaWQgQnJpZWZVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CiAgIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvcjo6a0dyZWVuLCAiWz09PT09PT09PT1dICIpOwotICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCisgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIlcyBmcm9tICVzIHJhbi4iLAogICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAogICAgICAgICAgRm9ybWF0VGVzdFN1aXRlQ291bnQodW5pdF90ZXN0LnRlc3Rfc3VpdGVfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOwogICBpZiAoR1RFU1RfRkxBR19HRVQocHJpbnRfdGltZSkpIHsKLSAgICBwcmludGYoIiAoJXMgbXMgdG90YWwpIiwKKyAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiICglcyBtcyB0b3RhbCkiLAogICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CiAgIH0KLSAgcHJpbnRmKCJcbiIpOworICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiXG4iKTsKICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprR3JlZW4sICJbICBQQVNTRUQgIF0gIik7Ci0gIHByaW50ZigiJXMuXG4iLCBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKS5jX3N0cigpKTsKKyAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiVzLlxuIiwgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSkuY19zdHIoKSk7CiAKICAgY29uc3QgaW50IHNraXBwZWRfdGVzdF9jb3VudCA9IHVuaXRfdGVzdC5za2lwcGVkX3Rlc3RfY291bnQoKTsKICAgaWYgKHNraXBwZWRfdGVzdF9jb3VudCA+IDApIHsKICAgICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtHcmVlbiwgIlsgIFNLSVBQRUQgXSAiKTsKLSAgICBwcmludGYoIiVzLlxuIiwgRm9ybWF0VGVzdENvdW50KHNraXBwZWRfdGVzdF9jb3VudCkuY19zdHIoKSk7CisgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiVzLlxuIiwgRm9ybWF0VGVzdENvdW50KHNraXBwZWRfdGVzdF9jb3VudCkuY19zdHIoKSk7CiAgIH0KIAogICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOwogICBpZiAobnVtX2Rpc2FibGVkICYmICFHVEVTVF9GTEFHX0dFVChhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKICAgICBpZiAodW5pdF90ZXN0LlBhc3NlZCgpKSB7Ci0gICAgICBwcmludGYoIlxuIik7ICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLgorICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIlxuIik7ICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLgogICAgIH0KICAgICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtZZWxsb3csICIgIFlPVSBIQVZFICVkIERJU0FCTEVEICVzXG5cbiIsCiAgICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQsIG51bV9kaXNhYmxlZCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CiAgIH0KICAgLy8gRW5zdXJlIHRoYXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIHByaW50ZWQgYmVmb3JlLCBlLmcuLCBoZWFwY2hlY2tlciBvdXRwdXQuCi0gIGZmbHVzaChzdGRvdXQpOworICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7CiB9CiAKIC8vIEVuZCBCcmllZlVuaXRUZXN0UmVzdWx0UHJpbnRlcgpAQCAtMzk3OCw2ICs0MTIyLDE5IEBACiAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKTsKIH07CiAKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKK3ZvaWQgV3JpdGVPdXB1dEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJm91dHB1dF9maWxlLCBjb25zdCBzdGQ6OnN0cmluZyAmZGF0YSkgeworICBTYkZpbGVFcnJvciBlcnI7CisgIHN0YXJib2FyZDo6U2NvcGVkRmlsZSBjYWNoZV9maWxlKAorICAgICAgb3V0cHV0X2ZpbGUuY19zdHIoKSwga1NiRmlsZUNyZWF0ZUFsd2F5cyB8IGtTYkZpbGVXcml0ZSwgTlVMTCwgJmVycik7CisgIC8vIFRPRE86IENoYW5nZSB0byBTQl9EQ0hFQ0sgb25jZSBhbGwgcGxhdGZvcm1zIGFyZSB2ZXJpZmllZAorICBpZihlcnIgIT0ga1NiRmlsZU9rKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAiIDw8IG91dHB1dF9maWxlIDw8ICIgZm9yIFhNTCBvdXRwdXQiOworICB9CisgIGNhY2hlX2ZpbGUuV3JpdGVBbGwoZGF0YS5jX3N0cigpLCBzdGF0aWNfY2FzdDxpbnQ+KGRhdGEuc2l6ZSgpKSk7Cit9CisjZW5kaWYKKwogLy8gQ3JlYXRlcyBhIG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIuCiBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSkKICAgICA6IG91dHB1dF9maWxlXyhvdXRwdXRfZmlsZSkgewpAQCAtMzk4OSwyMCArNDE0NiwyOSBAQAogLy8gQ2FsbGVkIGFmdGVyIHRoZSB1bml0IHRlc3QgZW5kcy4KIHZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBQcmludFhtbFVuaXRUZXN0KCZzdHJlYW0sIHVuaXRfdGVzdCk7CisKKyAgV3JpdGVPdXB1dEZpbGUob3V0cHV0X2ZpbGVfLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKSk7CisjZWxzZQogICBGSUxFKiB4bWxvdXQgPSBPcGVuRmlsZUZvcldyaXRpbmcob3V0cHV0X2ZpbGVfKTsKICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwogICBQcmludFhtbFVuaXRUZXN0KCZzdHJlYW0sIHVuaXRfdGVzdCk7CiAgIGZwcmludGYoeG1sb3V0LCAiJXMiLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsKICAgZmNsb3NlKHhtbG91dCk7CisjZW5kaWYKIH0KIAogdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Okxpc3RUZXN0c01hdGNoaW5nRmlsdGVyKAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RTdWl0ZSo+JiB0ZXN0X3N1aXRlcykgeworI2lmICFHVEVTVF9PU19TVEFSQk9BUkQKICAgRklMRSogeG1sb3V0ID0gT3BlbkZpbGVGb3JXcml0aW5nKG91dHB1dF9maWxlXyk7CiAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKICAgUHJpbnRYbWxUZXN0c0xpc3QoJnN0cmVhbSwgdGVzdF9zdWl0ZXMpOwogICBmcHJpbnRmKHhtbG91dCwgIiVzIiwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSkuY19zdHIoKSk7CiAgIGZjbG9zZSh4bWxvdXQpOworI2VuZGlmCiB9CiAKIC8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmIGlzX2F0dHJpYnV0ZQpAQCAtNDA5Niw2ICs0MjYyLDcgQEAKICAgcmV0dXJuIHNzLnN0cigpOwogfQogCisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogc3RhdGljIGJvb2wgUG9ydGFibGVMb2NhbHRpbWUodGltZV90IHNlY29uZHMsIHN0cnVjdCB0bSogb3V0KSB7CiAjaWYgZGVmaW5lZChfTVNDX1ZFUikKICAgcmV0dXJuIGxvY2FsdGltZV9zKG91dCwgJnNlY29uZHMpID09IDA7CkBAIC00MTE0LDEzICs0MjgxLDIxIEBACiAgIHJldHVybiBsb2NhbHRpbWVfcigmc2Vjb25kcywgb3V0KSAhPSBudWxscHRyOwogI2VuZGlmCiB9CisjZW5kaWYgLy8gIUdURVNUX09TX1NUQVJCT0FSRAogCiAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gZXBvY2ggdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIHN0cmluZyBpbiB0aGUgSVNPCiAvLyA4NjAxIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uCiBzdGQ6OnN0cmluZyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMShUaW1lSW5NaWxsaXMgbXMpIHsKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgRXpUaW1lRXhwbG9kZWQgdGltZV9zdHJ1Y3Q7CisgIGNvbnN0IEV6VGltZVQgc2Vjb25kcyA9IHN0YXRpY19jYXN0PEV6VGltZVQ+KG1zIC8gMTAwMCk7CisgIGlmIChFelRpbWVURXhwbG9kZUxvY2FsKCZzZWNvbmRzLCAmdGltZV9zdHJ1Y3QpID09IE5VTEwpIHsKKyNlbHNlCiAgIHN0cnVjdCB0bSB0aW1lX3N0cnVjdDsKLSAgaWYgKCFQb3J0YWJsZUxvY2FsdGltZShzdGF0aWNfY2FzdDx0aW1lX3Q+KG1zIC8gMTAwMCksICZ0aW1lX3N0cnVjdCkpCisgIGlmICghUG9ydGFibGVMb2NhbHRpbWUoc3RhdGljX2Nhc3Q8dGltZV90PihtcyAvIDEwMDApLCAmdGltZV9zdHJ1Y3QpKSB7CisjZW5kaWYKICAgICByZXR1cm4gIiI7CisgIH0KICAgLy8gWVlZWS1NTS1ERFRoaDptbTpzcy5zc3MKICAgcmV0dXJuIFN0cmVhbWFibGVUb1N0cmluZyh0aW1lX3N0cnVjdC50bV95ZWFyICsgMTkwMCkgKyAiLSIgKwogICAgICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fbW9uICsgMSkgKyAiLSIgKwpAQCAtNDUwMSwxMSArNDY3NiwxNyBAQAogCiB2b2lkIEpzb25Vbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBQcmludEpzb25Vbml0VGVzdCgmc3RyZWFtLCB1bml0X3Rlc3QpOworICBXcml0ZU91cHV0RmlsZShvdXRwdXRfZmlsZV8sIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pKTsKKyNlbHNlCiAgIEZJTEUqIGpzb25vdXQgPSBPcGVuRmlsZUZvcldyaXRpbmcob3V0cHV0X2ZpbGVfKTsKICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwogICBQcmludEpzb25Vbml0VGVzdCgmc3RyZWFtLCB1bml0X3Rlc3QpOwogICBmcHJpbnRmKGpzb25vdXQsICIlcyIsIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pLmNfc3RyKCkpOwogICBmY2xvc2UoanNvbm91dCk7CisjZW5kaWYKIH0KIAogLy8gUmV0dXJucyBhbiBKU09OLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4KQEAgLTQ1NjEsOSArNDc0MiwxNiBAQAogLy8gQ29udmVydHMgdGhlIGdpdmVuIGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlCiAvLyBSRkMzMzM5IGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uCiBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc1JGQzMzMzkoVGltZUluTWlsbGlzIG1zKSB7CisjaWYgR1RFU1RfT1NfU1RBUkJPQVJECisgIEV6VGltZUV4cGxvZGVkIHRpbWVfc3RydWN0OworICBjb25zdCBFelRpbWVUIHNlY29uZHMgPSBzdGF0aWNfY2FzdDxFelRpbWVUPihtcyAvIDEwMDApOworICBpZiAoRXpUaW1lVEV4cGxvZGVMb2NhbCgmc2Vjb25kcywgJnRpbWVfc3RydWN0KSA9PSBOVUxMKSB7CisjZWxzZQogICBzdHJ1Y3QgdG0gdGltZV9zdHJ1Y3Q7Ci0gIGlmICghUG9ydGFibGVMb2NhbHRpbWUoc3RhdGljX2Nhc3Q8dGltZV90PihtcyAvIDEwMDApLCAmdGltZV9zdHJ1Y3QpKQorICBpZiAoIVBvcnRhYmxlTG9jYWx0aW1lKHN0YXRpY19jYXN0PHRpbWVfdD4obXMgLyAxMDAwKSwgJnRpbWVfc3RydWN0KSkgeworI2VuZGlmCiAgICAgcmV0dXJuICIiOworICB9CiAgIC8vIFlZWVktTU0tRERUaGg6bW06c3MKICAgcmV0dXJuIFN0cmVhbWFibGVUb1N0cmluZyh0aW1lX3N0cnVjdC50bV95ZWFyICsgMTkwMCkgKyAiLSIgKwogICAgICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fbW9uICsgMSkgKyAiLSIgKwpAQCAtNTAxMywyNCArNTIwMSwyOCBAQAogICAgICAgICAgICAgcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggPyBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCA6ICIiKSB7CiAgICAgLy8gSWYgYSBwYXRoIHRvIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlIGlzIHNwZWNpZmllZC4uLgogICAgIGlmICghcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfLmVtcHR5KCkpIHsKKyNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECiAgICAgICAvLyBjcmVhdGUgdGhlIGZpbGUgd2l0aCBhIHNpbmdsZSAiMCIgY2hhcmFjdGVyIGluIGl0LiAgSS9PCiAgICAgICAvLyBlcnJvcnMgYXJlIGlnbm9yZWQgYXMgdGhlcmUncyBub3RoaW5nIGJldHRlciB3ZSBjYW4gZG8gYW5kIHdlCiAgICAgICAvLyBkb24ndCB3YW50IHRvIGZhaWwgdGhlIHRlc3QgYmVjYXVzZSBvZiB0aGlzLgogICAgICAgRklMRSogcGZpbGUgPSBwb3NpeDo6Rk9wZW4ocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfLmNfc3RyKCksICJ3Iik7CiAgICAgICBmd3JpdGUoIjAiLCAxLCAxLCBwZmlsZSk7CiAgICAgICBmY2xvc2UocGZpbGUpOworI2VuZGlmIC8vICFHVEVTVF9PU19TVEFSQk9BUkQKICAgICB9CiAgIH0KIAogICB+U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoKSB7CiAjaWYgIWRlZmluZWQgR1RFU1RfT1NfRVNQODI2NgogICAgIGlmICghcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfLmVtcHR5KCkpIHsKKyNpZiAhR1RFU1RfT1NfU1RBUkJPQVJECiAgICAgICBpbnQgcmV0dmFsID0gcmVtb3ZlKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXy5jX3N0cigpKTsKICAgICAgIGlmIChyZXR2YWwpIHsKICAgICAgICAgR1RFU1RfTE9HXyhFUlJPUikgPDwgIkZhaWxlZCB0byByZW1vdmUgcHJlbWF0dXJlIGV4aXQgZmlsZXBhdGggXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyA8PCAiXCIgd2l0aCBlcnJvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJldHZhbDsKICAgICAgIH0KKyNlbmRpZiAvLyAhR1RFU1RfT1NfU1RBUkJPQVJECiAgICAgfQogI2VuZGlmCiAgIH0KQEAgLTUzMjcsNiArNTUxOSw4IEBACiAgICAgIChkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19pMzg2X18pKSkKICAgICAgIC8vIHdpdGggY2xhbmcvZ2NjIHdlIGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBvbiB4ODYgYnkgaW52b2tpbmcgaW50MwogICAgICAgYXNtKCJpbnQzIik7CisjZWxpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgICAgIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKTsKICNlbHNlCiAgICAgICAvLyBEZXJlZmVyZW5jZSBudWxscHRyIHRocm91Z2ggYSB2b2xhdGlsZSBwb2ludGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCiAgICAgICAvLyBmcm9tIHJlbW92aW5nLiBXZSB1c2UgdGhpcyByYXRoZXIgdGhhbiBhYm9ydCgpIG9yIF9fYnVpbHRpbl90cmFwKCkgZm9yCkBAIC01ODU2LDEwICs2MDUwLDEwIEBACiAgICAgICAgICAgICAgIHRlc3RfcmVzdWx0LkdldFRlc3RQYXJ0UmVzdWx0KGopOwogICAgICAgICAgIGlmICh0ZXN0X3BhcnRfcmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1NraXApIHsKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXN1bHQgPSB0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIHJlc3VsdC5jX3N0cigpKTsKKyAgICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIlc1xuIiwgcmVzdWx0LmNfc3RyKCkpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICAgICAgfSBlbHNlIGlmICghVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKICAgICAgICAgZm9yIChpbnQgdGVzdF9pbmRleCA9IDA7IHRlc3RfaW5kZXggPCB0b3RhbF90ZXN0X3N1aXRlX2NvdW50KCk7CiAgICAgICAgICAgICAgdGVzdF9pbmRleCsrKSB7CkBAIC01OTQ5LDEwICs2MTQzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUgXCIlc1wiICIKICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllZCBieSB0aGUgJXMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4iLAogICAgICAgICAgICAgICAgICAgICB0ZXN0X3NoYXJkX2ZpbGUsIGtUZXN0U2hhcmRTdGF0dXNGaWxlKTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwogICAgIH0KLSAgICBmY2xvc2UoZmlsZSk7CisgICAgcG9zaXg6OkZDbG9zZShmaWxlKTsKICAgfQogfQogCkBAIC01OTY4LDggKzYxNjIsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorI2lmIEdURVNUX09TX1NUQVJCT0FSRAorICBjb25zdCBpbnQzMl90IHRvdGFsX3NoYXJkcyA9IEdURVNUX0ZMQUcodG90YWxfc2hhcmRzKTsKKyAgY29uc3QgaW50MzJfdCBzaGFyZF9pbmRleCA9IEdURVNUX0ZMQUcoc2hhcmRfaW5kZXgpOworI2Vsc2UgIC8vIEdURVNUX09TX1NUQVJCT0FSRAogICBjb25zdCBpbnQzMl90IHRvdGFsX3NoYXJkcyA9IEludDMyRnJvbUVudk9yRGllKHRvdGFsX3NoYXJkc19lbnYsIC0xKTsKICAgY29uc3QgaW50MzJfdCBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKHNoYXJkX2luZGV4X2VudiwgLTEpOworI2VuZGlmICAvLyBHVEVTVF9PU19TVEFSQk9BUkQKIAogICBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTk3OSw3ICs2MTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RUb3RhbFNoYXJkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdW5zZXQuXG4iOwogICAgIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvcjo6a1JlZCwgIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOworICAgIGludGVybmFsOjpwb3NpeDo6Rmx1c2goKTsKICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzICE9IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7CiAgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKQEAgLTU5ODcsNyArNjE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgPSAiIDw8IHRvdGFsX3NoYXJkcwogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIHVuc2V0LlxuIjsKICAgICBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3I6OmtSZWQsICIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7CiAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwogICB9IGVsc2UgaWYgKHNoYXJkX2luZGV4IDwgMCB8fCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpIHsKICAgICBjb25zdCBNZXNzYWdlIG1zZyA9CkBAIC01OTk2LDcgKzYxOTUsNyBAQAogICAgICAgICAgICAgICAgICAgPDwgIiwgYnV0IHlvdSBoYXZlICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICI9IiA8PCBzaGFyZF9pbmRleAogICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICI9IiA8PCB0b3RhbF9zaGFyZHMgPDwgIi5cbiI7CiAgICAgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yOjprUmVkLCAiJXMiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7CisgICAgaW50ZXJuYWw6OnBvc2l4OjpGbHVzaCgpOwogICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgfQogCkBAIC02MDM2LDEyICs2MjM1LDE5IEBACiAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QvYmxvYi9tYXN0ZXIvZ29vZ2xldGVzdC9kb2NzL2FkdmFuY2VkLm1kCiAvLyAuIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCiBpbnQgVW5pdFRlc3RJbXBsOjpGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpIHsKKyNpZiBHVEVTVF9PU19TVEFSQk9BUkQKKyAgY29uc3QgaW50MzJfdCB0b3RhbF9zaGFyZHMgPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/CisgICAgICBHVEVTVF9GTEFHKHRvdGFsX3NoYXJkcykgOiAtMTsKKyAgY29uc3QgaW50MzJfdCBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KKyAgICAgIEdURVNUX0ZMQUcoc2hhcmRfaW5kZXgpIDogLTE7CisjZWxzZSAgLy8gR1RFU1RfT1NfU1RBUkJPQVJECiAgIGNvbnN0IGludDMyX3QgdG90YWxfc2hhcmRzID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbnQzMkZyb21FbnZPckRpZShrVGVzdFRvdGFsU2hhcmRzLCAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtMTsKICAgY29uc3QgaW50MzJfdCBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLTE7CisjZW5kaWYgIC8vIEdURVNUX09TX1NUQVJCT0FSRAogCiAgIGNvbnN0IFBvc2l0aXZlQW5kTmVnYXRpdmVVbml0VGVzdEZpbHRlciBndGVzdF9mbGFnX2ZpbHRlcigKICAgICAgIEdURVNUX0ZMQUdfR0VUKGZpbHRlcikpOwpAQCAtNjA5OCwxNCArNjMwNCwxNCBAQAogICBpZiAoc3RyICE9IG51bGxwdHIpIHsKICAgICBmb3IgKGludCBpID0gMDsgKnN0ciAhPSAnXDAnOyArK3N0cikgewogICAgICAgaWYgKGkgPj0gbWF4X2xlbmd0aCkgewotICAgICAgICBwcmludGYoIi4uLiIpOworICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiLi4uIik7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgaWYgKCpzdHIgPT0gJ1xuJykgewotICAgICAgICBwcmludGYoIlxcbiIpOworICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiXFxuIik7CiAgICAgICAgIGkgKz0gMjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiJWMiLCAqc3RyKTsKKyAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiVjIiwgKnN0cik7CiAgICAgICAgICsraTsKICAgICAgIH0KICAgICB9CkBAIC02MTI1LDI3ICs2MzMxLDI4IEBACiAgICAgICBpZiAodGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcl8pIHsKICAgICAgICAgaWYgKCFwcmludGVkX3Rlc3Rfc3VpdGVfbmFtZSkgewogICAgICAgICAgIHByaW50ZWRfdGVzdF9zdWl0ZV9uYW1lID0gdHJ1ZTsKLSAgICAgICAgICBwcmludGYoIiVzLiIsIHRlc3Rfc3VpdGUtPm5hbWUoKSk7CisgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIiVzLiIsIHRlc3Rfc3VpdGUtPm5hbWUoKSk7CiAgICAgICAgICAgaWYgKHRlc3Rfc3VpdGUtPnR5cGVfcGFyYW0oKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgIyAlcyA9ICIsIGtUeXBlUGFyYW1MYWJlbCk7CisgICAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiICAjICVzID0gIiwga1R5cGVQYXJhbUxhYmVsKTsKICAgICAgICAgICAgIC8vIFdlIHByaW50IHRoZSB0eXBlIHBhcmFtZXRlciBvbiBhIHNpbmdsZSBsaW5lIHRvIG1ha2UKICAgICAgICAgICAgIC8vIHRoZSBvdXRwdXQgZWFzeSB0byBwYXJzZSBieSBhIHByb2dyYW0uCiAgICAgICAgICAgICBQcmludE9uT25lTGluZSh0ZXN0X3N1aXRlLT50eXBlX3BhcmFtKCksIGtNYXhQYXJhbUxlbmd0aCk7CiAgICAgICAgICAgfQotICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OlByaW50RigiXG4iKTsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIiAgJXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIgICVzIiwgdGVzdF9pbmZvLT5uYW1lKCkpOwogICAgICAgICBpZiAodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICBwcmludGYoIiAgIyAlcyA9ICIsIGtWYWx1ZVBhcmFtTGFiZWwpOworICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6UHJpbnRGKCIgICMgJXMgPSAiLCBrVmFsdWVQYXJhbUxhYmVsKTsKICAgICAgICAgICAvLyBXZSBwcmludCB0aGUgdmFsdWUgcGFyYW1ldGVyIG9uIGEgc2luZ2xlIGxpbmUgdG8gbWFrZSB0aGUKICAgICAgICAgICAvLyBvdXRwdXQgZWFzeSB0byBwYXJzZSBieSBhIHByb2dyYW0uCiAgICAgICAgICAgUHJpbnRPbk9uZUxpbmUodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpLCBrTWF4UGFyYW1MZW5ndGgpOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpQcmludEYoIlxuIik7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIGZmbHVzaChzdGRvdXQpOworICBpbnRlcm5hbDo6cG9zaXg6OkZsdXNoKCk7CisjaWYgIUdURVNUX09TX1NUQVJCT0FSRAogICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2Zvcm1hdCA9IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCk7CiAgIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiIHx8IG91dHB1dF9mb3JtYXQgPT0gImpzb24iKSB7CiAgICAgRklMRSogZmlsZW91dCA9IE9wZW5GaWxlRm9yV3JpdGluZygKQEAgLTYxNjMsNiArNjM3MCw3IEBACiAgICAgZnByaW50ZihmaWxlb3V0LCAiJXMiLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsKICAgICBmY2xvc2UoZmlsZW91dCk7CiAgIH0KKyNlbmRpZgogfQogCiAvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCkBAIC02NTQ4LDYgKzY3NTYsMTAgQEAKICAgR1RFU1RfSU5URVJOQUxfUEFSU0VfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7CiAgIEdURVNUX0lOVEVSTkFMX1BBUlNFX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7CiAgIEdURVNUX0lOVEVSTkFMX1BBUlNFX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7CisjaWYgR1RFU1RfT1NfU1RBUkJPQVJECisgIEdURVNUX0lOVEVSTkFMX1BBUlNFX0ZMQUcodG90YWxfc2hhcmRzKTsKKyAgR1RFU1RfSU5URVJOQUxfUEFSU0VfRkxBRyhzaGFyZF9pbmRleCk7CisjZW5kaWYgLy8gIEdURVNUX09TX1NUQVJCT0FSRAogICByZXR1cm4gZmFsc2U7CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnZweC9wbGF0Zm9ybXMvbGludXgteDY0L2xpYnZweC1saW51eC14NjQuc2ggYi90aGlyZF9wYXJ0eS9saWJ2cHgvcGxhdGZvcm1zL2xpbnV4LXg2NC9saWJ2cHgtbGludXgteDY0LnNoCmluZGV4IDg0NTdmZmUuLmQzZTBhYWMgMTAwNzU1Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnZweC9wbGF0Zm9ybXMvbGludXgteDY0L2xpYnZweC1saW51eC14NjQuc2gKKysrIGIvdGhpcmRfcGFydHkvbGlidnB4L3BsYXRmb3Jtcy9saW51eC14NjQvbGlidnB4LWxpbnV4LXg2NC5zaApAQCAtMTksNiArMTksNiBAQAogCiBta2RpciBsaW51eC14NjQKIGNkIGxpbnV4LXg2NAotLi4vY29uZmlndXJlIC0tZGlzYWJsZS12cDggLS1kaXNhYmxlLWV4YW1wbGVzIC0tZGlzYWJsZS13ZWJtLWlvIC0tZGlzYWJsZS12cDktZW5jb2RlciAtLWRpc2FibGUtdW5pdC10ZXN0cyAtLWVuYWJsZS1zdGF0aWMgLS1kaXNhYmxlLXNoYXJlZCAtLWVuYWJsZS1tdWx0aXRocmVhZCAtLWVuYWJsZS12cDktaGlnaGJpdGRlcHRoIC0tZGlzYWJsZS10b29scyAtLWRpc2FibGUtZG9jcyAtLWVuYWJsZS1ydW50aW1lLWNwdS1kZXRlY3QgLS1lbmFibGUtcG9zdHByb2MgLS1lbmFibGUtdnA5LXRlbXBvcmFsLWRlbm9pc2luZyAtLXRhcmdldD14ODZfNjQtbGludXgtZ2NjCisuLi9jb25maWd1cmUgLS1kaXNhYmxlLXZwOCAtLWRpc2FibGUtZXhhbXBsZXMgLS1kaXNhYmxlLXdlYm0taW8gLS1kaXNhYmxlLXZwOS1lbmNvZGVyIC0tZGlzYWJsZS11bml0LXRlc3RzIC0tZW5hYmxlLXNoYXJlZCAtLWVuYWJsZS1tdWx0aXRocmVhZCAtLWVuYWJsZS12cDktaGlnaGJpdGRlcHRoIC0tZGlzYWJsZS10b29scyAtLWRpc2FibGUtZG9jcyAtLWVuYWJsZS1ydW50aW1lLWNwdS1kZXRlY3QgLS1lbmFibGUtcG9zdHByb2MgLS1lbmFibGUtdnA5LXRlbXBvcmFsLWRlbm9pc2luZyAtLXRhcmdldD14ODZfNjQtbGludXgtZ2NjCiBtYWtlIFY9MSAtagogbWFrZSBsaWJ2cHhfc3Jjcy50eHQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnZweC9wbGF0Zm9ybXMvbGludXgteDY0L2xpYnZweC5zby42IGIvdGhpcmRfcGFydHkvbGlidnB4L3BsYXRmb3Jtcy9saW51eC14NjQvbGlidnB4LnNvLjYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDE4NzZhMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnZweC9wbGF0Zm9ybXMvbGludXgteDY0L2xpYnZweC5zby42CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L2xpYnhtbC9CVUlMRC5nbgppbmRleCBiNzI1ZTA5Li43MTk5NTMyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvQlVJTEQuZ24KKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL0JVSUxELmduCkBAIC00LDExICs0LDEyIEBACiAKICMgRGVmaW5lIGFuICJvc19pbmNsdWRlIiB2YXJpYWJsZSB0aGF0IHBvaW50cyBhdCB0aGUgT1Mtc3BlY2lmaWMgZ2VuZXJhdGVkCiAjIGhlYWRlcnMuICBUaGVzZSB3ZXJlIGdlbmVyYXRlZCBieSBydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0IG9mZmxpbmUuCi1pZiAoaXNfc3RhcmJvYXJkKSB7CitpZiAodXNlX2NvYmFsdF9jdXN0b21pemF0aW9ucykgewogICBvc19pbmNsdWRlID0gInN0YXJib2FyZCIKLX0gZWxzZSBpZiAoaXNfbGludXggfHwgaXNfYW5kcm9pZCB8fCBpc19uYWNsIHx8IGlzX2Z1Y2hzaWEpIHsKK30gZWxzZQoraWYgKGlzX2xpbnV4IHx8IGlzX2Nocm9tZW9zIHx8IGlzX2FuZHJvaWQgfHwgaXNfbmFjbCB8fCBpc19mdWNoc2lhKSB7CiAgIG9zX2luY2x1ZGUgPSAibGludXgiCi19IGVsc2UgaWYgKGlzX21hYyB8fCBpc19pb3MpIHsKK30gZWxzZSBpZiAoaXNfYXBwbGUpIHsKICAgb3NfaW5jbHVkZSA9ICJtYWMiCiB9IGVsc2UgaWYgKGlzX3dpbikgewogICBvc19pbmNsdWRlID0gIndpbjMyIgpAQCAtNzQsNyArNzUsNyBAQAogICAgICAgICAiLVduby11bnVzZWQtYnV0LXNldC12YXJpYWJsZSIsCiAgICAgICBdCiAgICAgfQotICB9IGVsc2UgaWYgKGlzX2xpbnV4KSB7CisgIH0gZWxzZSBpZiAoaXNfbGludXggfHwgaXNfY2hyb21lb3MpIHsKICAgICBjZmxhZ3MgPSBbCiAgICAgICAjIGdjYyBzcGl0cyBvdXQgYSBidW5jaCBvZiB3YXJuaW5ncyBhYm91dCBwYXNzaW5nIHRvbyBtYW55IGFyZ3VtZW50cyB0bwogICAgICAgIyBfX3htbFNpbXBsZUVycm9yLgpAQCAtODMsNDUgKzg0LDQ1IEBACiAgIH0KIH0KIAotaWYgKCFpc19zdGFyYm9hcmQpIHsKLSAgc3RhdGljX2xpYnJhcnkoInhtbF9yZWFkZXIiKSB7Ci0gICAgIyBEbyBub3QgZXhwYW5kIHRoaXMgdmlzaWJpbGl0eSBsaXN0IHdpdGhvdXQgZmlyc3QgY29uc3VsdGluZyB3aXRoIHRoZQotICAgICMgU2VjdXJpdHkgVGVhbS4KLSAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgIi8vYmFzZS90ZXN0OnRlc3Rfc3VwcG9ydCIsCi0gICAgICAiLy9jb21wb25lbnRzL3BvbGljeS9jb3JlL2NvbW1vbjp1bml0X3Rlc3RzIiwKLSAgICAgICIvL3NlcnZpY2VzL2RhdGFfZGVjb2RlcjoqIiwKLSAgICAgICIvL3Rvb2xzL3RyYWZmaWNfYW5ub3RhdGlvbi9hdWRpdG9yOmF1ZGl0b3Jfc291cmNlcyIsCi0gICAgXQotICAgIGlmIChpc193aW4pIHsKLSAgICAgIHZpc2liaWxpdHkgKz0gWyAiLy9jb21wb25lbnRzL3dpZmkiIF0KLSAgICB9Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICJjaHJvbWl1bS94bWxfcmVhZGVyLmNjIiwKLSAgICAgICJjaHJvbWl1bS94bWxfcmVhZGVyLmgiLAotICAgIF0KLSAgICBkZXBzID0gWwotICAgICAgIjpsaWJ4bWwiLAotICAgICAgIjpsaWJ4bWxfdXRpbHMiLAotICAgIF0KLSAgICBjb25maWdzICs9IFsgIjpsaWJ4bWxfY29uZmlnIiBdCitpZiAoIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsgICMgZXhjbHVkZSBsaWJyYXJpZXMgInhtbF9yZWFkZXIiIGFuZCAieG1sX3dyaXRlciIKK3N0YXRpY19saWJyYXJ5KCJ4bWxfcmVhZGVyIikgeworICAjIERvIG5vdCBleHBhbmQgdGhpcyB2aXNpYmlsaXR5IGxpc3Qgd2l0aG91dCBmaXJzdCBjb25zdWx0aW5nIHdpdGggdGhlCisgICMgU2VjdXJpdHkgVGVhbS4KKyAgdmlzaWJpbGl0eSA9IFsKKyAgICAiLy9iYXNlL3Rlc3Q6dGVzdF9zdXBwb3J0IiwKKyAgICAiLy9jb21wb25lbnRzL3BvbGljeS9jb3JlL2NvbW1vbjp1bml0X3Rlc3RzIiwKKyAgICAiLy9zZXJ2aWNlcy9kYXRhX2RlY29kZXI6KiIsCisgICAgIi8vdG9vbHMvdHJhZmZpY19hbm5vdGF0aW9uL2F1ZGl0b3I6YXVkaXRvcl9zb3VyY2VzIiwKKyAgXQorICBpZiAoaXNfd2luKSB7CisgICAgdmlzaWJpbGl0eSArPSBbICIvL2NvbXBvbmVudHMvd2lmaSIgXQogICB9Ci0KLSAgc3RhdGljX2xpYnJhcnkoInhtbF93cml0ZXIiKSB7Ci0gICAgIyBUaGUgWG1sV3JpdGVyIGlzIGNvbnNpZGVyZWQgc2FmZSB0byB1c2UgZnJvbSBhbnkgdGFyZ2V0LgotICAgIHZpc2liaWxpdHkgPSBbICIqIiBdCi0gICAgc291cmNlcyA9IFsKLSAgICAgICJjaHJvbWl1bS94bWxfd3JpdGVyLmNjIiwKLSAgICAgICJjaHJvbWl1bS94bWxfd3JpdGVyLmgiLAotICAgIF0KLSAgICBkZXBzID0gWwotICAgICAgIjpsaWJ4bWwiLAotICAgICAgIjpsaWJ4bWxfdXRpbHMiLAotICAgIF0KLSAgICBjb25maWdzICs9IFsgIjpsaWJ4bWxfY29uZmlnIiBdCi0gIH0KKyAgc291cmNlcyA9IFsKKyAgICAiY2hyb21pdW0veG1sX3JlYWRlci5jYyIsCisgICAgImNocm9taXVtL3htbF9yZWFkZXIuaCIsCisgIF0KKyAgZGVwcyA9IFsKKyAgICAiOmxpYnhtbCIsCisgICAgIjpsaWJ4bWxfdXRpbHMiLAorICBdCisgIGNvbmZpZ3MgKz0gWyAiOmxpYnhtbF9jb25maWciIF0KIH0KIAorc3RhdGljX2xpYnJhcnkoInhtbF93cml0ZXIiKSB7CisgICMgVGhlIFhtbFdyaXRlciBpcyBjb25zaWRlcmVkIHNhZmUgdG8gdXNlIGZyb20gYW55IHRhcmdldC4KKyAgdmlzaWJpbGl0eSA9IFsgIioiIF0KKyAgc291cmNlcyA9IFsKKyAgICAiY2hyb21pdW0veG1sX3dyaXRlci5jYyIsCisgICAgImNocm9taXVtL3htbF93cml0ZXIuaCIsCisgIF0KKyAgZGVwcyA9IFsKKyAgICAiOmxpYnhtbCIsCisgICAgIjpsaWJ4bWxfdXRpbHMiLAorICBdCisgIGNvbmZpZ3MgKz0gWyAiOmxpYnhtbF9jb25maWciIF0KK30KK30gICMgZXhjbHVkZSBsaWJyYXJpZXMgInhtbF9yZWFkZXIiIGFuZCAieG1sX3dyaXRlciIKKwogc3RhdGljX2xpYnJhcnkoImxpYnhtbF91dGlscyIpIHsKICAgIyBEbyBub3QgZXhwYW5kIHRoaXMgdmlzaWJpbGl0eSBsaXN0IHdpdGhvdXQgZmlyc3QgY29uc3VsdGluZyB3aXRoIHRoZQogICAjIFNlY3VyaXR5IFRlYW0uCkBAIC0xNDQsMTUgKzE0NSwxNyBAQAogICAjIERvIG5vdCBleHBhbmQgdGhpcyB2aXNpYmlsaXR5IGxpc3Qgd2l0aG91dCBmaXJzdCBjb25zdWx0aW5nIHdpdGggdGhlCiAgICMgU2VjdXJpdHkgVGVhbS4KICAgdmlzaWJpbGl0eSA9IFsKKyAgICAiOmxpYnhtbF91dGlscyIsCiAgICAgIjp4bWxfcmVhZGVyIiwKICAgICAiOnhtbF93cml0ZXIiLAotICAgICI6bGlieG1sX3V0aWxzIiwKKyAgICAiLy9jaHJvbWVjYXN0L2ludGVybmFsIiwKICAgICAiLy90ZXN0aW5nL2xpYmZ1enplci8qIiwKICAgICAiLy90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci8qIiwKICAgICAiLy90aGlyZF9wYXJ0eS9mb250Y29uZmlnIiwKICAgICAiLy90aGlyZF9wYXJ0eS9saWJ4c2x0IiwKKyAgICAiLy90aGlyZF9wYXJ0eS9tYWxkb2NhLyoiLAogICBdCi0gIGlmIChpc19zdGFyYm9hcmQpIHsKKyAgaWYgKHVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKICAgICB2aXNpYmlsaXR5ICs9IFsKICAgICAgICIvL2Jhc2UvdGVzdDp0ZXN0X3N1cHBvcnQiLAogICAgICAgIi8vY29iYWx0L2Jhc2UiLApAQCAtMTcyLDExICsxNzUsNiBAQAogICAjIENvbW1lbnRlZCBvdXQgc291cmNlcyBhcmUgbGlieG1sMiBmaWxlcyB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlLiBUaGV5IGFyZQogICAjIGhlcmUgdG8gbWFrZSBpdCBlYXN5IHRvIGlkZW50aWZ5IGZpbGVzIHdoaWNoIGFyZSBuZXcuCiAgIHNvdXJjZXMgPSBbCi0gICAgImxpbnV4L2NvbmZpZy5oIiwKLSAgICAibGludXgvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oIiwKLSAgICAibWFjL2NvbmZpZy5oIiwKLSAgICAibWFjL2luY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaCIsCi0KICAgICAjInNyYy9ET0NCcGFyc2VyLmMiLAogICAgICJzcmMvSFRNTHBhcnNlci5jIiwKICAgICAic3JjL0hUTUx0cmVlLmMiLApAQCAtMjQ1LDggKzI0Myw2IEBACiAgICAgInNyYy9pbmNsdWRlL2xpYnhtbC94cGF0aC5oIiwKICAgICAic3JjL2luY2x1ZGUvbGlieG1sL3hwYXRoSW50ZXJuYWxzLmgiLAogICAgICJzcmMvaW5jbHVkZS9saWJ4bWwveHBvaW50ZXIuaCIsCi0gICAgInNyYy9pbmNsdWRlL3dpbjMyY29uZmlnLmgiLAotICAgICJzcmMvaW5jbHVkZS93c29ja2NvbXBhdC5oIiwKIAogICAgICMic3JjL2xlZ2FjeS5jIiwKICAgICAic3JjL2xpYnhtbC5oIiwKQEAgLTI5NywxMyArMjkzLDExIEBACiAgICAgInNyYy94cG9pbnRlci5jIiwKICAgICAjInNyYy94emxpYi5jIiwKICAgICAic3JjL3h6bGliLmgiLAotICAgICJ3aW4zMi9jb25maWcuaCIsCi0gICAgIndpbjMyL2luY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaCIsCiAgIF0KIAotICBpZiAoIWlzX3N0YXJib2FyZCkgewotICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQotICB9CitpZiAoIXVzZV9jb2JhbHRfY3VzdG9taXphdGlvbnMpIHsKKyAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCit9CiAgIGNvbmZpZ3MgKz0gWwogICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKIApAQCAtMzExLDcgKzMwNSwyOCBAQAogICAgICI6bGlieG1sX3dhcm5pbmdzIiwKICAgXQogCisgIGlmIChpc19saW51eCB8fCBpc19jaHJvbWVvcykgeworICAgIHNvdXJjZXMgKz0gWworICAgICAgImxpbnV4L2NvbmZpZy5oIiwKKyAgICAgICJsaW51eC9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmgiLAorICAgIF0KKyAgfQorCisgIGlmIChpc19tYWMpIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICJtYWMvY29uZmlnLmgiLAorICAgICAgIm1hYy9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmgiLAorICAgIF0KKyAgfQorCiAgIGlmIChpc193aW4pIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICJzcmMvaW5jbHVkZS93aW4zMmNvbmZpZy5oIiwKKyAgICAgICJzcmMvaW5jbHVkZS93c29ja2NvbXBhdC5oIiwKKyAgICAgICJ3aW4zMi9jb25maWcuaCIsCisgICAgICAid2luMzIvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oIiwKKyAgICBdCisKICAgICAjIGxpYnhtbDIgYWxyZWFkeSBkZWZpbmVzIFdJTjMyX0xFQU5fQU5EX01FQU4uCiAgICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy93aW46bGVhbl9hbmRfbWVhbiIgXQogICB9CkBAIC0zMjAsNyArMzM1LDcgQEAKICAgcHVibGljX2RlcHMgPSBbICIvL3RoaXJkX3BhcnR5L2ljdTppY3V1YyIgXQogICBkZXBzID0gWyAiLy90aGlyZF9wYXJ0eS96bGliIiBdCiAKLSAgaWYgKGlzX21hYyB8fCBpc19pb3MgfHwgaXNfYW5kcm9pZCB8fCBpc19mdWNoc2lhKSB7CisgIGlmIChpc19hcHBsZSB8fCBpc19hbmRyb2lkIHx8IGlzX2Z1Y2hzaWEpIHsKICAgICAjIGh0dHA6Ly93d3cueG1sc29mdC5vcmcvdGhyZWFkcy5odG1sIHNheXMgdGhhdCB0aGlzIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcKICAgICAjIGxpYnhtbCBmcm9tIHNldmVyYWwgdGhyZWFkcywgd2hpY2ggY2FuIHBvc3NpYmx5IGhhcHBlbiBpbiBjaHJvbWUuIE9uCiAgICAgIyBsaW51eCwgdGhpcyBpcyBwaWNrZWQgdXAgYnkgdHJhbnNpdGl2aXR5IGZyb20gcGtnLWNvbmZpZyBvdXRwdXQgZnJvbQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL0RJUl9NRVRBREFUQSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9ESVJfTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMzBiMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9ESVJfTUVUQURBVEEKQEAgLTAsMCArMSwzIEBACittb25vcmFpbDogeworICBjb21wb25lbnQ6ICJCbGluaz5YTUwiCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvTUVUQURBVEEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvTUVUQURBVEEKaW5kZXggMjMwZjM2NC4uMzg3MzgxYSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL01FVEFEQVRBCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9NRVRBREFUQQpAQCAtNSwxNSArNSwxMyBAQAogdGhpcmRfcGFydHkgewogICB1cmwgewogICAgIHR5cGU6IEdJVAotICAgIHZhbHVlOiAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy90aGlyZF9wYXJ0eS9saWJ4bWwiCisgICAgdmFsdWU6ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIgogICB9Ci0gICMgTk9URTogVGhpcyBpcyBAdjIuOS4xMCByZWxlYXNlIHRhZywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJlcG8KLSAgIyB2ZXJzaW9uIGV4YWN0bHksIGJlY2F1c2Ugb2YgdmFyaW91cyBpbnRlcm1lZGlhdGUgQ2hyb21pdW0gY2hhbmdlcwotICB2ZXJzaW9uOiAiNDA1ZTI1MWMiCisgIHZlcnNpb246ICI5Ni4wLjQ2NjQuMTUzIgogICBsYXN0X3VwZ3JhZGVfZGF0ZSB7Ci0gICAgeWVhcjogMjAyMAotICAgIG1vbnRoOiA1Ci0gICAgZGF5OiAxCisgICAgeWVhcjogMjAyMworICAgIG1vbnRoOiA2CisgICAgZGF5OiAyNwogICB9CiAgIGxpY2Vuc2VfdHlwZTogTk9USUNFCiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvT1dORVJTIGIvdGhpcmRfcGFydHkvbGlieG1sL09XTkVSUwppbmRleCA0OTRlOWVmLi41MzY1OThjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvT1dORVJTCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9PV05FUlMKQEAgLTIsNiArMiw0IEBACiAjIGEgQ0wgdG8gYWRkIHlvdXJzZWxmIGhlcmUuCiBkY2hlbmdAY2hyb21pdW0ub3JnCiBzY2hlbm5leUBjaHJvbWl1bS5vcmcKLXBhbG1lckBjaHJvbWl1bS5vcmcKLQotIyBDT01QT05FTlQ6IEJsaW5rPlhNTAoramFyaGFyQGNocm9taXVtLm9yZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL1JFQURNRS5jaHJvbWl1bSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9SRUFETUUuY2hyb21pdW0KaW5kZXggNjM4MzIwZS4uMWQxZDc3MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL1JFQURNRS5jaHJvbWl1bQorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvUkVBRE1FLmNocm9taXVtCkBAIC0xLDcgKzEsNyBAQAogTmFtZTogbGlieG1sCiBVUkw6IGh0dHA6Ly94bWxzb2Z0Lm9yZwotVmVyc2lvbjogZTRmYjM2ODQxODAwMDM4YzI4OTk5NzQzMmNhNTQ3YzliZmVmOWRiMQotQ1BFUHJlZml4OiBjcGU6L2E6eG1sc29mdDpsaWJ4bWwyOjIuOS45CitWZXJzaW9uOiBkZWE5MWM5N2RlYmVhYzdjMWFhZjljMTlmNzkwMjk4MDllMjNhMzUzCitDUEVQcmVmaXg6IGNwZTovYTp4bWxzb2Z0OmxpYnhtbDI6Mi45LjEyCiBMaWNlbnNlOiBNSVQKIExpY2Vuc2UgRmlsZTogc3JjL0NvcHlyaWdodAogU2VjdXJpdHkgQ3JpdGljYWw6IHllcwpAQCAtMjAsMTAgKzIwLDggQEAKICAgICBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vNzA4NDMzCiAtIGxpYnhtbDItMi45LjQtc2VjdXJpdHkteHBhdGgtbm9kZXRhYi11YWYucGF0Y2g6IFNlZSBodHRwczovL2NyYnVnLmNvbS83MDU0NDUKIC0gY2hyb21pdW0taXNzdWUtNzA4NDM0LnBhdGNoOiBHdWFyZCBhZ2FpbnN0IGlucHV0IGNvdW50ZXIgb3ZlcmZsb3cuCi0tIHJldmVydC1ub24tcmVjdXJzaXZlLXhtbC1wYXJzaW5nLnBhdGNoOiBNYWtpbmcgcGFydHMgb2YgdGhlIFhNTCBwYXJzZXIKLSAgICBub24tcmVjdXJzaXZlIGJyb2tlIGEgZmV3IHdlYiBwbGF0Zm9ybSB0ZXN0cy4KLS0gYWRkLW1pc3NpbmctaWZkZWYtaW4teG1sLXJlYWRlci5wYXRjaDogQnVnIGZpeCBmb3Jnb3QgdG8gZ3VhcmQgZnVuY3Rpb25hbGl0eQotICAgIHdpdGggYXBwcm9wcmlhdGUgI2lmZGVmLgorLSBjaHJvbWl1bS1pc3N1ZS0xMTM4NTU1LnBhdGNoOiBDaGFuZ2UgVFJVRSB0byAxIGZvciBJQ1U2OCB3aGljaCByZW1vdmUgdGhlCisgICNkZWZpbmUgb2YgVFJVRS4KIC0gQWRkIGhlbHBlciBjbGFzc2VzIGluIHRoZSBjaHJvbWl1bS8gc3ViZGlyZWN0b3J5LgogLSBEZWxldGUgdmFyaW91cyB1bnVzZWQgZmlsZXMsIHNlZSBjaHJvbWl1bS9yb2xsLnB5CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9jaHJvbWl1bS9hZGQtbWlzc2luZy1pZmRlZi1pbi14bWwtcmVhZGVyLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL2FkZC1taXNzaW5nLWlmZGVmLWluLXhtbC1yZWFkZXIucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Y2QxNWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL2FkZC1taXNzaW5nLWlmZGVmLWluLXhtbC1yZWFkZXIucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0tLS0gYS94bWxyZWFkZXIuYwotKysrIGIveG1scmVhZGVyLmMKLUBAIC0yMjYyLDggKzIyNjIsMTAgQEAgeG1sRnJlZVRleHRSZWFkZXIoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpIHsKLSAJICAgIHJlYWRlci0+ZGljdCA9IE5VTEw7Ci0gCWlmICgocmVhZGVyLT5jdHh0LT52Y3R4dC52c3RhdGVUYWIgIT0gTlVMTCkgJiYKLSAJICAgIChyZWFkZXItPmN0eHQtPnZjdHh0LnZzdGF0ZU1heCA+IDApKXsKLSsjaWZkZWYgTElCWE1MX1JFR0VYUF9FTkFCTEVECi0gICAgICAgICAgICAgd2hpbGUgKHJlYWRlci0+Y3R4dC0+dmN0eHQudnN0YXRlTnIgPiAwKQotICAgICAgICAgICAgICAgICB4bWxWYWxpZGF0ZVBvcEVsZW1lbnQoJnJlYWRlci0+Y3R4dC0+dmN0eHQsIE5VTEwsIE5VTEwsIE5VTEwpOwotKyNlbmRpZiAvKiBMSUJYTUxfUkVHRVhQX0VOQUJMRUQgKi8KLSAJICAgIHhtbEZyZWUocmVhZGVyLT5jdHh0LT52Y3R4dC52c3RhdGVUYWIpOwotIAkgICAgcmVhZGVyLT5jdHh0LT52Y3R4dC52c3RhdGVUYWIgPSBOVUxMOwotIAkgICAgcmVhZGVyLT5jdHh0LT52Y3R4dC52c3RhdGVNYXggPSAwOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL3JldmVydC1ub24tcmVjdXJzaXZlLXhtbC1wYXJzaW5nLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL3JldmVydC1ub24tcmVjdXJzaXZlLXhtbC1wYXJzaW5nLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFjN2MyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9jaHJvbWl1bS9yZXZlcnQtbm9uLXJlY3Vyc2l2ZS14bWwtcGFyc2luZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi1kaWZmIC0tZ2l0IGEvcGFyc2VyLmMgYi9wYXJzZXIuYwotaW5kZXggMDcyZWIyMmQuLmY4NjNlZGQxIDEwMDY0NAotLS0tIGEvcGFyc2VyLmMKLSsrKyBiL3BhcnNlci5jCi1AQCAtOTYsMTIgKzk2LDYgQEAgeG1sQ3JlYXRlRW50aXR5UGFyc2VyQ3R4dEludGVybmFsKGNvbnN0IHhtbENoYXIgKlVSTCwgY29uc3QgeG1sQ2hhciAqSUQsCi0gCi0gc3RhdGljIHZvaWQgeG1sSGFsdFBhcnNlcih4bWxQYXJzZXJDdHh0UHRyIGN0eHQpOwotIAotLXN0YXRpYyBpbnQKLS14bWxQYXJzZUVsZW1lbnRTdGFydCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpOwotLQotLXN0YXRpYyB2b2lkCi0teG1sUGFyc2VFbGVtZW50RW5kKHhtbFBhcnNlckN0eHRQdHIgY3R4dCk7Ci0tCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCQkJCQkJCQkJKgotICAqCUFyYml0cmFyeSBsaW1pdHMgc2V0IGluIHRoZSBwYXJzZXIuIFNlZSBYTUxfUEFSU0VfSFVHRQkJKgotQEAgLTE4MjgsNiArMTgyMiw3IEBAIG5vZGVQb3AoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KQotICAgICByZXR1cm4gKHJldCk7Ci0gfQotIAotKyNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECi0gLyoqCi0gICogbmFtZU5zUHVzaDoKLSAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAotQEAgLTE4NjMsMTEgKzE4NTgsNiBAQCBuYW1lTnNQdXNoKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgY29uc3QgeG1sQ2hhciAqIHZhbHVlLAotIAkgICAgZ290byBtZW1fZXJyb3I7Ci0gICAgICAgICB9Ci0gCWN0eHQtPnB1c2hUYWIgPSB0bXAyOwotLSAgICB9IGVsc2UgaWYgKGN0eHQtPnB1c2hUYWIgPT0gTlVMTCkgewotLSAgICAgICAgY3R4dC0+cHVzaFRhYiA9ICh2b2lkICoqKSB4bWxNYWxsb2MoY3R4dC0+bmFtZU1heCAqIDMgKgotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN0eHQtPnB1c2hUYWJbMF0pKTsKLS0gICAgICAgIGlmIChjdHh0LT5wdXNoVGFiID09IE5VTEwpCi0tICAgICAgICAgICAgZ290byBtZW1fZXJyb3I7Ci0gICAgIH0KLSAgICAgY3R4dC0+bmFtZVRhYltjdHh0LT5uYW1lTnJdID0gdmFsdWU7Ci0gICAgIGN0eHQtPm5hbWUgPSB2YWx1ZTsKLUBAIC0xODc5LDcgKzE4NjksNiBAQCBtZW1fZXJyb3I6Ci0gICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKLSAgICAgcmV0dXJuICgtMSk7Ci0gfQotLSNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECi0gLyoqCi0gICogbmFtZU5zUG9wOgotICAqIEBjdHh0OiBhbiBYTUwgcGFyc2VyIGNvbnRleHQKLUBAIC05ODEyLDEwICs5ODAxLDkgQEAgeG1sUGFyc2VDRFNlY3QoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gCi0gdm9pZAotIHhtbFBhcnNlQ29udGVudCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKLS0gICAgaW50IG5hbWVOciA9IGN0eHQtPm5hbWVOcjsKLS0KLSAgICAgR1JPVzsKLSAgICAgd2hpbGUgKChSQVcgIT0gMCkgJiYKLSsJICAgKChSQVcgIT0gJzwnKSB8fCAoTlhUKDEpICE9ICcvJykpICYmCi0gCSAgIChjdHh0LT5pbnN0YXRlICE9IFhNTF9QQVJTRVJfRU9GKSkgewotIAljb25zdCB4bWxDaGFyICp0ZXN0ID0gQ1VSX1BUUjsKLSAJdW5zaWduZWQgaW50IGNvbnMgPSBjdHh0LT5pbnB1dC0+Y29uc3VtZWQ7Ci1AQCAtOTg0OSwxMyArOTgzNyw3IEBAIHhtbFBhcnNlQ29udGVudCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKLSAJICogRm91cnRoIGNhc2UgOiAgYSBzdWItZWxlbWVudC4KLSAJICovCi0gCWVsc2UgaWYgKCpjdXIgPT0gJzwnKSB7Ci0tICAgICAgICAgICAgaWYgKE5YVCgxKSA9PSAnLycpIHsKLS0gICAgICAgICAgICAgICAgaWYgKGN0eHQtPm5hbWVOciA8PSBuYW1lTnIpCi0tICAgICAgICAgICAgICAgICAgICBicmVhazsKLS0JICAgICAgICB4bWxQYXJzZUVsZW1lbnRFbmQoY3R4dCk7Ci0tICAgICAgICAgICAgfSBlbHNlIHsKLS0JICAgICAgICB4bWxQYXJzZUVsZW1lbnRTdGFydChjdHh0KTsKLS0gICAgICAgICAgICB9Ci0rCSAgICB4bWxQYXJzZUVsZW1lbnQoY3R4dCk7Ci0gCX0KLSAKLSAJLyoKLUBAIC05ODkwLDcgKzk4NzIsNyBAQCB4bWxQYXJzZUNvbnRlbnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gICogeG1sUGFyc2VFbGVtZW50OgotICAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0Ci0gICoKLS0gKiBwYXJzZSBhbiBYTUwgZWxlbWVudAotKyAqIHBhcnNlIGFuIFhNTCBlbGVtZW50LCB0aGlzIGlzIGhpZ2hseSByZWN1cnNpdmUKLSAgKgotICAqIFszOV0gZWxlbWVudCA6Oj0gRW1wdHlFbGVtVGFnIHwgU1RhZyBjb250ZW50IEVUYWcKLSAgKgotQEAgLTk5MDIsMjMgKzk4ODQsNiBAQCB4bWxQYXJzZUNvbnRlbnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gCi0gdm9pZAotIHhtbFBhcnNlRWxlbWVudCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKLS0gICAgaWYgKHhtbFBhcnNlRWxlbWVudFN0YXJ0KGN0eHQpICE9IDApCi0tICAgICAgICByZXR1cm47Ci0tICAgIHhtbFBhcnNlQ29udGVudChjdHh0KTsKLS0gICAgaWYgKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9FT0YpCi0tCXJldHVybjsKLS0gICAgeG1sUGFyc2VFbGVtZW50RW5kKGN0eHQpOwotLX0KLS0KLS0vKioKLS0gKiB4bWxQYXJzZUVsZW1lbnRTdGFydDoKLS0gKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAotLSAqCi0tICogUGFyc2UgdGhlIHN0YXJ0IG9mIGFuIFhNTCBlbGVtZW50LiBSZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IsIDAgaWYgYW4KLS0gKiBvcGVuaW5nIHRhZyB3YXMgcGFyc2VkLCAxIGlmIGFuIGVtcHR5IGVsZW1lbnQgd2FzIHBhcnNlZC4KLS0gKi8KLS1zdGF0aWMgaW50Ci0teG1sUGFyc2VFbGVtZW50U3RhcnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gICAgIGNvbnN0IHhtbENoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCA9IE5VTEw7Ci0gICAgIGNvbnN0IHhtbENoYXIgKlVSSSA9IE5VTEw7Ci1AQCAtOTkzMyw3ICs5ODk4LDcgQEAgeG1sUGFyc2VFbGVtZW50U3RhcnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gCQkgIkV4Y2Vzc2l2ZSBkZXB0aCBpbiBkb2N1bWVudDogJWQgdXNlIFhNTF9QQVJTRV9IVUdFIG9wdGlvblxuIiwKLSAJCQkgIHhtbFBhcnNlck1heERlcHRoKTsKLSAJeG1sSGFsdFBhcnNlcihjdHh0KTsKLS0JcmV0dXJuKC0xKTsKLSsJcmV0dXJuOwotICAgICB9Ci0gCi0gICAgIC8qIENhcHR1cmUgc3RhcnQgcG9zaXRpb24gKi8KLUBAIC05OTYwLDE3ICs5OTI1LDEyIEBAIHhtbFBhcnNlRWxlbWVudFN0YXJ0KHhtbFBhcnNlckN0eHRQdHIgY3R4dCkgewotIAluYW1lID0geG1sUGFyc2VTdGFydFRhZyhjdHh0KTsKLSAjZW5kaWYgLyogTElCWE1MX1NBWDFfRU5BQkxFRCAqLwotICAgICBpZiAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0VPRikKLS0JcmV0dXJuKC0xKTsKLSsJcmV0dXJuOwotICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gCXNwYWNlUG9wKGN0eHQpOwotLSAgICAgICAgcmV0dXJuKC0xKTsKLSsgICAgICAgIHJldHVybjsKLSAgICAgfQotLSAgICBpZiAoY3R4dC0+c2F4MikKLS0gICAgICAgIG5hbWVOc1B1c2goY3R4dCwgbmFtZSwgcHJlZml4LCBVUkksIGN0eHQtPm5zTnIgLSBuc05yKTsKLS0jaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAotLSAgICBlbHNlCi0tICAgICAgICBuYW1lUHVzaChjdHh0LCBuYW1lKTsKLS0jZW5kaWYgLyogTElCWE1MX1NBWDFfRU5BQkxFRCAqLwotKyAgICBuYW1lUHVzaChjdHh0LCBuYW1lKTsKLSAgICAgcmV0ID0gY3R4dC0+bm9kZTsKLSAKLSAjaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKLUBAIC0xMDAxMSw3ICs5OTcxLDcgQEAgeG1sUGFyc2VFbGVtZW50U3RhcnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gCSAgIG5vZGVfaW5mby5ub2RlID0gcmV0OwotIAkgICB4bWxQYXJzZXJBZGROb2RlSW5mbyhjdHh0LCAmbm9kZV9pbmZvKTsKLSAJfQotLQlyZXR1cm4oMSk7Ci0rCXJldHVybjsKLSAgICAgfQotICAgICBpZiAoUkFXID09ICc+JykgewotICAgICAgICAgTkVYVDE7Ci1AQCAtMTAwMzksMzkgKzk5OTksNDEgQEAgeG1sUGFyc2VFbGVtZW50U3RhcnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gCSAgIG5vZGVfaW5mby5ub2RlID0gcmV0OwotIAkgICB4bWxQYXJzZXJBZGROb2RlSW5mbyhjdHh0LCAmbm9kZV9pbmZvKTsKLSAJfQotLQlyZXR1cm4oLTEpOwotKwlyZXR1cm47Ci0gICAgIH0KLSAKLS0gICAgcmV0dXJuKDApOwotLX0KLS0KLS0vKioKLS0gKiB4bWxQYXJzZUVsZW1lbnRFbmQ6Ci0tICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKLS0gKgotLSAqIFBhcnNlIHRoZSBlbmQgb2YgYW4gWE1MIGVsZW1lbnQuCi0tICovCi0tc3RhdGljIHZvaWQKLS14bWxQYXJzZUVsZW1lbnRFbmQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0tICAgIHhtbFBhcnNlck5vZGVJbmZvIG5vZGVfaW5mbzsKLS0gICAgeG1sTm9kZVB0ciByZXQgPSBjdHh0LT5ub2RlOwotKyAgICAvKgotKyAgICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDoKLSsgICAgICovCi0rICAgIHhtbFBhcnNlQ29udGVudChjdHh0KTsKLSsgICAgaWYgKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9FT0YpCi0rCXJldHVybjsKLSsgICAgaWYgKCFJU19CWVRFX0NIQVIoUkFXKSkgewotKyAgICAgICAgeG1sRmF0YWxFcnJNc2dTdHJJbnRTdHIoY3R4dCwgWE1MX0VSUl9UQUdfTk9UX0ZJTklTSEVELAotKwkgIlByZW1hdHVyZSBlbmQgb2YgZGF0YSBpbiB0YWcgJXMgbGluZSAlZFxuIiwKLSsJCSAgICAgICAgICAgICAgICBuYW1lLCBsaW5lLCBOVUxMKTsKLSAKLS0gICAgaWYgKGN0eHQtPm5hbWVOciA8PSAwKQotLSAgICAgICAgcmV0dXJuOwotKwkvKgotKwkgKiBlbmQgb2YgcGFyc2luZyBvZiB0aGlzIG5vZGUuCi0rCSAqLwotKwlub2RlUG9wKGN0eHQpOwotKwluYW1lUG9wKGN0eHQpOwotKwlzcGFjZVBvcChjdHh0KTsKLSsJaWYgKG5zTnIgIT0gY3R4dC0+bnNOcikKLSsJICAgIG5zUG9wKGN0eHQsIGN0eHQtPm5zTnIgLSBuc05yKTsKLSsJcmV0dXJuOwotKyAgICB9Ci0gCi0gICAgIC8qCi0gICAgICAqIHBhcnNlIHRoZSBlbmQgb2YgdGFnOiAnPC8nIHNob3VsZCBiZSBoZXJlLgotICAgICAgKi8KLSAgICAgaWYgKGN0eHQtPnNheDIpIHsKLS0gICAgICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCA9IGN0eHQtPnB1c2hUYWJbY3R4dC0+bmFtZU5yICogMyAtIDNdOwotLSAgICAgICAgY29uc3QgeG1sQ2hhciAqVVJJID0gY3R4dC0+cHVzaFRhYltjdHh0LT5uYW1lTnIgKiAzIC0gMl07Ci0tICAgICAgICBpbnQgbnNOciA9IChwdHJkaWZmX3QpIGN0eHQtPnB1c2hUYWJbY3R4dC0+bmFtZU5yICogMyAtIDFdOwotLQl4bWxQYXJzZUVuZFRhZzIoY3R4dCwgcHJlZml4LCBVUkksIDAsIG5zTnIsIDApOwotKwl4bWxQYXJzZUVuZFRhZzIoY3R4dCwgcHJlZml4LCBVUkksIGxpbmUsIGN0eHQtPm5zTnIgLSBuc05yLCB0bGVuKTsKLSAJbmFtZVBvcChjdHh0KTsKLSAgICAgfQotICNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECi0tICAgIGVsc2UKLS0JeG1sUGFyc2VFbmRUYWcxKGN0eHQsIDApOwotKyAgICAgIGVsc2UKLSsJeG1sUGFyc2VFbmRUYWcxKGN0eHQsIGxpbmUpOwotICNlbmRpZiAvKiBMSUJYTUxfU0FYMV9FTkFCTEVEICovCi0gCi0gICAgIC8qCi1AQCAtMTIzODgsNiArMTIzNTAsMTMgQEAgeG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQoeG1sU0FYSGFuZGxlclB0ciBzYXgsIHZvaWQgKnVzZXJfZGF0YSwKLSAJcmV0dXJuKE5VTEwpOwotICAgICB9Ci0gICAgIGN0eHQtPmRpY3ROYW1lcyA9IDE7Ci0rICAgIGN0eHQtPnB1c2hUYWIgPSAodm9pZCAqKikgeG1sTWFsbG9jKGN0eHQtPm5hbWVNYXggKiAzICogc2l6ZW9mKHhtbENoYXIgKikpOwotKyAgICBpZiAoY3R4dC0+cHVzaFRhYiA9PSBOVUxMKSB7Ci0rICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7Ci0rCXhtbEZyZWVQYXJzZXJJbnB1dEJ1ZmZlcihidWYpOwotKwl4bWxGcmVlUGFyc2VyQ3R4dChjdHh0KTsKLSsJcmV0dXJuKE5VTEwpOwotKyAgICB9Ci0gICAgIGlmIChzYXggIT0gTlVMTCkgewotICNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECi0gCWlmIChjdHh0LT5zYXggIT0gKHhtbFNBWEhhbmRsZXJQdHIpICZ4bWxEZWZhdWx0U0FYSGFuZGxlcikKLUBAIC0xNDgzNSw2ICsxNDgwNCwxNiBAQCB4bWxDdHh0UmVzZXRQdXNoKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgY29uc3QgY2hhciAqY2h1bmssCi0gCi0gICAgIHhtbEN0eHRSZXNldChjdHh0KTsKLSAKLSsgICAgaWYgKGN0eHQtPnB1c2hUYWIgPT0gTlVMTCkgewotKyAgICAgICAgY3R4dC0+cHVzaFRhYiA9ICh2b2lkICoqKSB4bWxNYWxsb2MoY3R4dC0+bmFtZU1heCAqIDMgKgotKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoeG1sQ2hhciAqKSk7Ci0rICAgICAgICBpZiAoY3R4dC0+cHVzaFRhYiA9PSBOVUxMKSB7Ci0rCSAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7Ci0rICAgICAgICAgICAgeG1sRnJlZVBhcnNlcklucHV0QnVmZmVyKGJ1Zik7Ci0rICAgICAgICAgICAgcmV0dXJuKDEpOwotKyAgICAgICAgfQotKyAgICB9Ci0rCi0gICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICBjdHh0LT5kaXJlY3RvcnkgPSBOVUxMOwotICAgICB9IGVsc2UgewotZGlmZiAtLWdpdCBhL3Jlc3VsdC9lcnJvcnMvNzU0OTQ3LnhtbC5lcnIgYi9yZXN1bHQvZXJyb3JzLzc1NDk0Ny54bWwuZXJyCi1pbmRleCA1MWU5YjRlZC4uZjQ1Y2I1YTIgMTAwNjQ0Ci0tLS0gYS9yZXN1bHQvZXJyb3JzLzc1NDk0Ny54bWwuZXJyCi0rKysgYi9yZXN1bHQvZXJyb3JzLzc1NDk0Ny54bWwuZXJyCi1AQCAtMiw2ICsyLDYgQEAKLSBCeXRlczogMHhFRSAweDVEIDB4NUQgMHgzRQotIDxkPjwhW0NEQVRBWzAwMDAwMDAwMDAwMDDuXV0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS0uL3Rlc3QvZXJyb3JzLzc1NDk0Ny54bWw6MTogcGFyc2VyIGVycm9yIDogRW5kVGFnOiAnPC8nIG5vdCBmb3VuZAotKy4vdGVzdC9lcnJvcnMvNzU0OTQ3LnhtbDoxOiBwYXJzZXIgZXJyb3IgOiBQcmVtYXR1cmUgZW5kIG9mIGRhdGEgaW4gdGFnIGQgbGluZSAxCi0gPGQ+PCFbQ0RBVEFbMDAwMDAwMDAwMDAwMO5dXT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLWRpZmYgLS1naXQgYS9yZXN1bHQvZXJyb3JzLzc1OTM5OC54bWwuZXJyIGIvcmVzdWx0L2Vycm9ycy83NTkzOTgueG1sLmVycgotaW5kZXggYmM5ZTVlMDMuLmY2MDM2YTNiIDEwMDY0NAotLS0tIGEvcmVzdWx0L2Vycm9ycy83NTkzOTgueG1sLmVycgotKysrIGIvcmVzdWx0L2Vycm9ycy83NTkzOTgueG1sLmVycgotQEAgLTEsMTAgKzEsMTAgQEAKLSAuL3Rlc3QvZXJyb3JzLzc1OTM5OC54bWw6MjEwOiBwYXJzZXIgZXJyb3IgOiBTdGFydFRhZzogaW52YWxpZCBlbGVtZW50IG5hbWUKLSBuZWVkIHRvIHdvcnJ5IGFib3V0IHBhcnNlcnMgd2hpPCEgZG9uJ3QgZXhwYW5kIFBFcmVmcyBmaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0tLi90ZXN0L2Vycm9ycy83NTkzOTgueG1sOjMwOTogcGFyc2VyIGVycm9yIDogT3BlbmluZyBhbmQgZW5kaW5nIHRhZyBtaXNtYXRjaDog4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSW4oSWbSBsaW5lIDIwNSBhbmQgdGVybWRlZgotKy4vdGVzdC9lcnJvcnMvNzU5Mzk4LnhtbDozMDk6IHBhcnNlciBlcnJvciA6IE9wZW5pbmcgYW5kIGVuZGluZyB0YWcgbWlzbWF0Y2g6IOKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKEluKElm0gbGluZSAzMDggYW5kIHRlcm1kZWYKLSBhbmQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlaXIgY29udGVudCBhbmQgc3RydWN0dXJlLjwvdGVybWRlZj4gPHRlcm1kZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0tLi90ZXN0L2Vycm9ycy83NTkzOTgueG1sOjMxNDogcGFyc2VyIGVycm9yIDogT3BlbmluZyBhbmQgZW5kaW5nIHRhZyBtaXNtYXRjaDogc3BlYyBsaW5lIDIwNSBhbmQgcAotKy4vdGVzdC9lcnJvcnMvNzU5Mzk4LnhtbDozMTQ6IHBhcnNlciBlcnJvciA6IE9wZW5pbmcgYW5kIGVuZGluZyB0YWcgbWlzbWF0Y2g6IHNwZWMgbGluZSA1MCBhbmQgcAotIGRhdGEgYW5kIHRoZSBpbmZvcm1hdGlvbiBpdCBtdXN0IHByb3ZpZGUgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotIC4vdGVzdC9lcnJvcnMvNzU5Mzk4LnhtbDozMTY6IHBhcnNlciBlcnJvciA6IEV4dHJhIGNvbnRlbnQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9jaHJvbWl1bS9yb2xsLnB5IGIvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL3JvbGwucHkKaW5kZXggYTc1YzNiYi4uZWYyM2Q0YyAxMDA3NTUKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL3JvbGwucHkKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL2Nocm9taXVtL3JvbGwucHkKQEAgLTM0LDEyICszNCw2IEBACiAjIDMuIE9uIE1hYywgaW5zdGFsbCB0aGVzZSBwYWNrYWdlcyB3aXRoIGJyZXc6CiAjICAgICAgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBwa2djb25maWcgaWN1NGMKICMKLSMgICAgSW1wb3J0YW50ISBCZWZvcmUgcnVubmluZyByb2xsLnB5LCBzZXQgdGhlc2UgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMgc28gdGhlCi0jICAgIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGZpbmQgSUNVOgotIyAgICAgIGV4cG9ydCBMREZMQUdTPSItTC9wYXRoL3RvL2hvbWVicmV3L29wdC9pY3U0Yy9saWIiCi0jICAgICAgZXhwb3J0IENQUEZMQUdTPSItSS9wYXRoL3RvL2hvbWVicmV3L29wdC9pY3U0Yy9pbmNsdWRlIgotIyAgICAgIGV4cG9ydCBQS0dfQ09ORklHX1BBVEg9Ii9wYXRoL3RvL2hvbWVicmV3L29wdC9pY3U0Yy9saWIvcGtnY29uZmlnIgotIwogIyBQcm9jZWR1cmU6CiAjCiAjIFdhcm5pbmc6IFRoaXMgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZS4gUnVuIGl0IG9uIGEgY2xlYW4gYnJhbmNoLgpAQCAtNjYsMjAgKzYwLDE2IEBACiAjCiAjIDMuIE9uIE1hYywgaW4gdGhlIENocm9taXVtIHNyYyBkaXJlY3Rvcnk6CiAjICAgIGEuIGdpdCBjbCBwYXRjaCA8R2Vycml0IElzc3VlIElEPgotIyAgICBiLiB0aGlyZF9wYXJ0eS9saWJ4bWwvY2hyb21pdW0vcm9sbC5weSAtLW1hYworIyAgICBiLiB0aGlyZF9wYXJ0eS9saWJ4bWwvY2hyb21pdW0vcm9sbC5weSAtLW1hYyAtLWljdTRjX3BhdGg9fi9ob21lYnJldy9vcHQvaWN1NGMKICMgICAgYy4gTWFrZSBhbmQgY29tbWl0IGFueSBmaW5hbCBjaGFuZ2VzIHRvIFJFQURNRS5jaHJvbWl1bSwgQlVJTEQuZ24sIGV0Yy4KICMgICAgZC4gZ2l0IGNsIHVwbG9hZAogIyAgICBlLiBDb21wbGV0ZSB0aGUgcmV2aWV3IGFzIHVzdWFsCiAKIFBBVENIRVMgPSBbCi0gICAgIyBUT0RPKGRjaGVuZyk6IHJlYWNoIG91dCB1cHN0cmVhbSB0byBzZWUgd2hhdCdzIGdvaW5nIG9uIGhlcmUuCi0gICAgJ3JldmVydC1ub24tcmVjdXJzaXZlLXhtbC1wYXJzaW5nLnBhdGNoJywKICAgICAnY2hyb21pdW0taXNzdWUtNTk5NDI3LnBhdGNoJywKICAgICAnY2hyb21pdW0taXNzdWUtNjI4NTgxLnBhdGNoJywKICAgICAnbGlieG1sMi0yLjkuNC1zZWN1cml0eS14cGF0aC1ub2RldGFiLXVhZi5wYXRjaCcsCiAgICAgJ2Nocm9taXVtLWlzc3VlLTcwODQzNC5wYXRjaCcsCi0gICAgIyBUT0RPKGRjaGVuZyk6IE1lcmdlIHRoaXMgYmFjayB1cHN0cmVhbS4KLSAgICAnYWRkLW1pc3NpbmctaWZkZWYtaW4teG1sLXJlYWRlci5wYXRjaCcsCiBdCiAKIApAQCAtNDA1LDE3ICszOTUsMjIgQEAKICAgICAgICAgICAgICAgICBYTUxfV0lOMzJfQ09ORklHVVJFX09QVElPTlMpCiAKICAgICAgICAgICAgICMgQWRkIGFuZCBjb21taXQgdGhlIHJlc3VsdC4KLSAgICAgICAgICAgIHNodXRpbC5tb3ZlKCdWQzEwL2NvbmZpZy5oJywgJy4uLy4uL3dpbjMyL2NvbmZpZy5oJykKKyAgICAgICAgICAgIHNodXRpbC5tb3ZlKCcuLi9jb25maWcuaCcsICcuLi8uLi93aW4zMi9jb25maWcuaCcpCiAgICAgICAgICAgICBnaXQoJ2FkZCcsICcuLi8uLi93aW4zMi9jb25maWcuaCcpCiAgICAgICAgICAgICBzaHV0aWwubW92ZSgnLi4vaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oJywKICAgICAgICAgICAgICAgICAgICAgICAgICcuLi8uLi93aW4zMi9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmgnKQogICAgICAgICAgICAgZ2l0KCdhZGQnLCAnLi4vLi4vd2luMzIvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oJykKLSAgICAgICAgICAgIGdpdCgnY29tbWl0JywgJy1tJywgJ1dpbmRvd3MnKQorICAgICAgICAgICAgZ2l0KCdjb21taXQnLCAnLS1hbGxvdy1lbXB0eScsICctbScsICdXaW5kb3dzJykKICAgICAgICAgICAgIGdpdCgnY2xlYW4nLCAnLWYnKQogICAgIHByaW50KCdOb3cgcHVzaCB0byBNYWMgYW5kIHJ1biBzdGVwcyB0aGVyZS4nKQogCiAKLWRlZiByb2xsX2xpYnhtbF9tYWMoc3JjX3BhdGgpOgorZGVmIHJvbGxfbGlieG1sX21hYyhzcmNfcGF0aCwgaWN1NGNfcGF0aCk6CisgICAgaWN1NGNfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoaWN1NGNfcGF0aCkpCisgICAgb3MuZW52aXJvblsiTERGTEFHUyJdID0gIi1MIiArIG9zLnBhdGguam9pbihpY3U0Y19wYXRoLCAnbGliJykKKyAgICBvcy5lbnZpcm9uWyJDUFBGTEFHUyJdID0gIi1JIiArIG9zLnBhdGguam9pbihpY3U0Y19wYXRoLCAnaW5jbHVkZScpCisgICAgb3MuZW52aXJvblsiUEtHX0NPTkZJR19QQVRIIl0gPSBvcy5wYXRoLmpvaW4oaWN1NGNfcGF0aCwgJ2xpYi9wa2djb25maWcnKQorCiAgICAgZnVsbF9wYXRoX3RvX3RoaXJkX3BhcnR5X2xpYnhtbCA9IG9zLnBhdGguam9pbigKICAgICAgICAgc3JjX3BhdGgsIFRISVJEX1BBUlRZX0xJQlhNTF9TUkMsICcuLicpCiAKQEAgLTQ1OSw2ICs0NTQsOSBAQAogICAgICAgICB0eXBlPXN0ciwKICAgICAgICAgbmFyZ3M9Jz8nLAogICAgICAgICBoZWxwPSdUaGUgcGF0aCB0byB0aGUgbG9jYWwgY2xvbmUgb2YgdGhlIGxpYnhtbDIgZ2l0IHJlcG8uJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1pY3U0Y19wYXRoJywKKyAgICAgICAgaGVscD0nVGhlIHBhdGggdG8gdGhlIGhvbWVicmV3IGluc3RhbGxhdGlvbiBvZiBpY3U0Yy4nKQogICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKICAgICBpZiBhcmdzLmxpbnV4OgpAQCAtNDcxLDcgKzQ2OSwxMiBAQAogICAgIGVsaWYgYXJncy53aW4zMjoKICAgICAgICAgcm9sbF9saWJ4bWxfd2luMzIoc3JjX2RpcikKICAgICBlbGlmIGFyZ3MubWFjOgotICAgICAgICByb2xsX2xpYnhtbF9tYWMoc3JjX2RpcikKKyAgICAgICAgaWN1NGNfcGF0aCA9IGFyZ3MuaWN1NGNfcGF0aAorICAgICAgICBpZiBub3QgaWN1NGNfcGF0aDoKKyAgICAgICAgICAgIHByaW50KCdTcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBob21lYnJldyBpbnN0YWxsYXRpb24gb2YgaWN1NGMgd2l0aCAtLWljdTRjX3BhdGguJykKKyAgICAgICAgICAgIHByaW50KCcgIGV4OiByb2xsLnB5IC0tbWFjIC0taWN1NGNfcGF0aD1+L2hvbWVicmV3L29wdC9pY3U0YycpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICByb2xsX2xpYnhtbF9tYWMoc3JjX2RpciwgaWN1NGNfcGF0aCkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL2xpbnV4L2NvbmZpZy5oIGIvdGhpcmRfcGFydHkvbGlieG1sL2xpbnV4L2NvbmZpZy5oCmluZGV4IGUzMzQyNDAuLjI1MTcyYjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9saW51eC9jb25maWcuaAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvbGludXgvY29uZmlnLmgKQEAgLTEsNiArMSw5IEBACiAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCiAvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KIAorLyogQSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZnVzZSBhcGlidWlsZC5weSAqLworI2RlZmluZSBBVFRSSUJVVEVfREVTVFJVQ1RPUiBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkKKwogLyogVHlwZSBjYXN0IGZvciB0aGUgZ2V0aG9zdGJ5bmFtZSgpIGFyZ3VtZW50ICovCiAjZGVmaW5lIEdFVEhPU1RCWU5BTUVfQVJHX0NBU1QgLyoqLwogCkBAIC0xMCw2ICsxMyw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvbmFtZXNlci5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9BUlBBX05BTUVTRVJfSCAxCiAKKy8qIERlZmluZSBpZiBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgaXMgYWNjZXB0ZWQgKi8KKyNkZWZpbmUgSEFWRV9BVFRSSUJVVEVfREVTVFJVQ1RPUiAxCisKIC8qIFdoZXRoZXIgc3RydWN0IHNvY2thZGRyOjpfX3NzX2ZhbWlseSBleGlzdHMgKi8KIC8qICN1bmRlZiBIQVZFX0JST0tFTl9TU19GQU1JTFkgKi8KIApAQCAtMjQwLDE5ICsyNDYsMTkgQEAKICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiIKIAogLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX05BTUUgIiIKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICJsaWJ4bWwyIgogCiAvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIiCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJsaWJ4bWwyIDIuOS4xMiIKIAogLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiIKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ4bWwyIgogCiAvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLwogI2RlZmluZSBQQUNLQUdFX1VSTCAiIgogCiAvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiIKKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIyLjkuMTIiCiAKIC8qIFR5cGUgY2FzdCBmb3IgdGhlIHNlbmQoKSBmdW5jdGlvbiAybmQgYXJnICovCiAjZGVmaW5lIFNFTkRfQVJHMl9DQVNUIC8qKi8KQEAgLTI2Nyw3ICsyNzMsNyBAQAogI2RlZmluZSBWQV9MSVNUX0lTX0FSUkFZIDEKIAogLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI2RlZmluZSBWRVJTSU9OICIyLjkuMTAiCisjZGVmaW5lIFZFUlNJT04gIjIuOS4xMiIKIAogLyogRGV0ZXJtaW5lIHdoYXQgc29ja2V0IGxlbmd0aCAoc29ja2xlbl90KSBkYXRhIHR5cGUgaXMgKi8KICNkZWZpbmUgWE1MX1NPQ0tMRU5fVCBzb2NrbGVuX3QKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9saW51eC9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmggYi90aGlyZF9wYXJ0eS9saWJ4bWwvbGludXgvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oCmluZGV4IDM3ZjY3M2UuLjRjMzY0ZTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9saW51eC9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmgKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL2xpbnV4L2luY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaApAQCAtMjksMjEgKzI5LDIxIEBACiAgKgogICogdGhlIHZlcnNpb24gc3RyaW5nIGxpa2UgIjEuMi4zIgogICovCi0jZGVmaW5lIExJQlhNTF9ET1RURURfVkVSU0lPTiAiMi45LjEwIgorI2RlZmluZSBMSUJYTUxfRE9UVEVEX1ZFUlNJT04gIjIuOS4xMiIKIAogLyoqCiAgKiBMSUJYTUxfVkVSU0lPTjoKICAqCiAgKiB0aGUgdmVyc2lvbiBudW1iZXI6IDEuMi4zIHZhbHVlIGlzIDEwMjAzCiAgKi8KLSNkZWZpbmUgTElCWE1MX1ZFUlNJT04gMjA5MTAKKyNkZWZpbmUgTElCWE1MX1ZFUlNJT04gMjA5MTIKIAogLyoqCiAgKiBMSUJYTUxfVkVSU0lPTl9TVFJJTkc6CiAgKgogICogdGhlIHZlcnNpb24gbnVtYmVyIHN0cmluZywgMS4yLjMgdmFsdWUgaXMgIjEwMjAzIgogICovCi0jZGVmaW5lIExJQlhNTF9WRVJTSU9OX1NUUklORyAiMjA5MTAiCisjZGVmaW5lIExJQlhNTF9WRVJTSU9OX1NUUklORyAiMjA5MTIiCiAKIC8qKgogICogTElCWE1MX1ZFUlNJT05fRVhUUkE6CkBAIC01OCw3ICs1OCw3IEBACiAgKiBNYWNybyB0byBjaGVjayB0aGF0IHRoZSBsaWJ4bWwgdmVyc2lvbiBpbiB1c2UgaXMgY29tcGF0aWJsZSB3aXRoCiAgKiB0aGUgdmVyc2lvbiB0aGUgc29mdHdhcmUgaGFzIGJlZW4gY29tcGlsZWQgYWdhaW5zdAogICovCi0jZGVmaW5lIExJQlhNTF9URVNUX1ZFUlNJT04geG1sQ2hlY2tWZXJzaW9uKDIwOTEwKTsKKyNkZWZpbmUgTElCWE1MX1RFU1RfVkVSU0lPTiB4bWxDaGVja1ZlcnNpb24oMjA5MTIpOwogCiAjaWZuZGVmIFZNUwogI2lmIDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9saW51eC94bWwyLWNvbmZpZyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9saW51eC94bWwyLWNvbmZpZwppbmRleCA3YTI3MWQ0Li4zNzE3ZmY5IDEwMDc1NQotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvbGludXgveG1sMi1jb25maWcKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL2xpbnV4L3htbDItY29uZmlnCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICA7OwogCiAgICAgLS12ZXJzaW9uKQotCWVjaG8gMi45LjEwCisJZWNobyAyLjkuMTIKIAlleGl0IDAKIAk7OwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvbWFjL2NvbmZpZy5oIGIvdGhpcmRfcGFydHkvbGlieG1sL21hYy9jb25maWcuaAppbmRleCAxNmNkMGFlLi4yN2E3OWVjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvbWFjL2NvbmZpZy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9tYWMvY29uZmlnLmgKQEAgLTEsNiArMSw5IEBACiAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCiAvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KIAorLyogQSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZnVzZSBhcGlidWlsZC5weSAqLworI2RlZmluZSBBVFRSSUJVVEVfREVTVFJVQ1RPUiBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkKKwogLyogVHlwZSBjYXN0IGZvciB0aGUgZ2V0aG9zdGJ5bmFtZSgpIGFyZ3VtZW50ICovCiAjZGVmaW5lIEdFVEhPU1RCWU5BTUVfQVJHX0NBU1QgLyoqLwogCkBAIC0xMCw2ICsxMyw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvbmFtZXNlci5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9BUlBBX05BTUVTRVJfSCAxCiAKKy8qIERlZmluZSBpZiBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgaXMgYWNjZXB0ZWQgKi8KKyNkZWZpbmUgSEFWRV9BVFRSSUJVVEVfREVTVFJVQ1RPUiAxCisKIC8qIFdoZXRoZXIgc3RydWN0IHNvY2thZGRyOjpfX3NzX2ZhbWlseSBleGlzdHMgKi8KIC8qICN1bmRlZiBIQVZFX0JST0tFTl9TU19GQU1JTFkgKi8KIApAQCAtODUsOSArOTEsNiBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYXRoLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX01BVEhfSCAxCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLQogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KICNkZWZpbmUgSEFWRV9NTUFQIDEKIApAQCAtMTU5LDYgKzE2Miw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU9fSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1NURExJQl9IIDEKIApAQCAtMjQwLDI0ICsyNDYsMjYgQEAKICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiIKIAogLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX05BTUUgIiIKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICJsaWJ4bWwyIgogCiAvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIiCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJsaWJ4bWwyIDIuOS4xMiIKIAogLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiIKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ4bWwyIgogCiAvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLwogI2RlZmluZSBQQUNLQUdFX1VSTCAiIgogCiAvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiIKKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIyLjkuMTIiCiAKIC8qIFR5cGUgY2FzdCBmb3IgdGhlIHNlbmQoKSBmdW5jdGlvbiAybmQgYXJnICovCiAjZGVmaW5lIFNFTkRfQVJHMl9DQVNUIC8qKi8KIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisvKiBEZWZpbmUgdG8gMSBpZiBhbGwgb2YgdGhlIEM5MCBzdGFuZGFyZCBoZWFkZXJzIGV4aXN0IChub3QganVzdCB0aGUgb25lcworICAgcmVxdWlyZWQgaW4gYSBmcmVlc3RhbmRpbmcgZW52aXJvbm1lbnQpLiBUaGlzIG1hY3JvIGlzIHByb3ZpZGVkIGZvcgorICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eTsgbmV3IGNvZGUgbmVlZCBub3QgdXNlIGl0LiAqLwogI2RlZmluZSBTVERDX0hFQURFUlMgMQogCiAvKiBTdXBwb3J0IGZvciBJUHY2ICovCkBAIC0yNjcsNyArMjc1LDcgQEAKICNkZWZpbmUgVkFfTElTVF9JU19BUlJBWSAxCiAKIC8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSNkZWZpbmUgVkVSU0lPTiAiMi45LjEwIgorI2RlZmluZSBWRVJTSU9OICIyLjkuMTIiCiAKIC8qIERldGVybWluZSB3aGF0IHNvY2tldCBsZW5ndGggKHNvY2tsZW5fdCkgZGF0YSB0eXBlIGlzICovCiAjZGVmaW5lIFhNTF9TT0NLTEVOX1Qgc29ja2xlbl90CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvbWFjL2luY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9tYWMvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oCmluZGV4IDM3ZjY3M2UuLjRjMzY0ZTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9tYWMvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9tYWMvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oCkBAIC0yOSwyMSArMjksMjEgQEAKICAqCiAgKiB0aGUgdmVyc2lvbiBzdHJpbmcgbGlrZSAiMS4yLjMiCiAgKi8KLSNkZWZpbmUgTElCWE1MX0RPVFRFRF9WRVJTSU9OICIyLjkuMTAiCisjZGVmaW5lIExJQlhNTF9ET1RURURfVkVSU0lPTiAiMi45LjEyIgogCiAvKioKICAqIExJQlhNTF9WRVJTSU9OOgogICoKICAqIHRoZSB2ZXJzaW9uIG51bWJlcjogMS4yLjMgdmFsdWUgaXMgMTAyMDMKICAqLwotI2RlZmluZSBMSUJYTUxfVkVSU0lPTiAyMDkxMAorI2RlZmluZSBMSUJYTUxfVkVSU0lPTiAyMDkxMgogCiAvKioKICAqIExJQlhNTF9WRVJTSU9OX1NUUklORzoKICAqCiAgKiB0aGUgdmVyc2lvbiBudW1iZXIgc3RyaW5nLCAxLjIuMyB2YWx1ZSBpcyAiMTAyMDMiCiAgKi8KLSNkZWZpbmUgTElCWE1MX1ZFUlNJT05fU1RSSU5HICIyMDkxMCIKKyNkZWZpbmUgTElCWE1MX1ZFUlNJT05fU1RSSU5HICIyMDkxMiIKIAogLyoqCiAgKiBMSUJYTUxfVkVSU0lPTl9FWFRSQToKQEAgLTU4LDcgKzU4LDcgQEAKICAqIE1hY3JvIHRvIGNoZWNrIHRoYXQgdGhlIGxpYnhtbCB2ZXJzaW9uIGluIHVzZSBpcyBjb21wYXRpYmxlIHdpdGgKICAqIHRoZSB2ZXJzaW9uIHRoZSBzb2Z0d2FyZSBoYXMgYmVlbiBjb21waWxlZCBhZ2FpbnN0CiAgKi8KLSNkZWZpbmUgTElCWE1MX1RFU1RfVkVSU0lPTiB4bWxDaGVja1ZlcnNpb24oMjA5MTApOworI2RlZmluZSBMSUJYTUxfVEVTVF9WRVJTSU9OIHhtbENoZWNrVmVyc2lvbigyMDkxMik7CiAKICNpZm5kZWYgVk1TCiAjaWYgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9DTWFrZUxpc3RzLnR4dCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczODY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3NzIgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjE1KQorCitmaWxlKFNUUklOR1MgImNvbmZpZ3VyZS5hYyIgQ09ORklHVVJFX0FDX0xJTkVTKQorZm9yZWFjaChsaW5lICR7Q09ORklHVVJFX0FDX0xJTkVTfSkKKwlpZihsaW5lIE1BVENIRVMgW1tebTRfZGVmaW5lXChcWyhNQUpPUl9WRVJTSU9OfE1JTk9SX1ZFUlNJT058TUlDUk9fVkVSU0lPTilcXSxbIFx0XSooWzAtOV0rKVwpJF1dKQorCQlzZXQoTElCWE1MXyR7Q01BS0VfTUFUQ0hfMX0gJHtDTUFLRV9NQVRDSF8yfSkKKwllbHNlaWYobGluZSBNQVRDSEVTICJeKExJQlhNTF9NQUpPUl9WRVJTSU9OfExJQlhNTF9NSU5PUl9WRVJTSU9OfExJQlhNTF9NSUNST19WRVJTSU9OKT0oWzAtOV0rKSQiKQorCQlzZXQoJHtDTUFLRV9NQVRDSF8xfSAke0NNQUtFX01BVENIXzJ9KQorCWVuZGlmKCkKK2VuZGZvcmVhY2goKQorc2V0KFZFUlNJT04gIiR7TElCWE1MX01BSk9SX1ZFUlNJT059LiR7TElCWE1MX01JTk9SX1ZFUlNJT059LiR7TElCWE1MX01JQ1JPX1ZFUlNJT059IikKKworcHJvamVjdChsaWJ4bWwyIFZFUlNJT04gJHtWRVJTSU9OfSBMQU5HVUFHRVMgQykKKworaW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKK2luY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZXMpCitpbmNsdWRlKENoZWNrTGlicmFyeUV4aXN0cykKK2luY2x1ZGUoQ2hlY2tTdHJ1Y3RIYXNNZW1iZXIpCitpbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQoraW5jbHVkZShDTWFrZVBhY2thZ2VDb25maWdIZWxwZXJzKQoraW5jbHVkZShHTlVJbnN0YWxsRGlycykKKworb3B0aW9uKEJVSUxEX1NIQVJFRF9MSUJTICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIiBPTikKK3NldChMSUJYTUwyX1dJVEhfQVVUT01BVEEgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX0MxNE4gIkFkZCB0aGUgQ2Fub25pY2FsaXphdGlvbiBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfQ0FUQUxPRyAiQWRkIHRoZSBDYXRhbG9nIHN1cHBvcnQiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9ERUJVRyAiQWRkIHRoZSBkZWJ1Z2dpbmcgbW9kdWxlIiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfRE9DQiAiQWRkIERvY2Jvb2sgU0dNTCBzdXBwb3J0IiBPTikKK3NldChMSUJYTUwyX1dJVEhfRVhQUiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfRlRQICJBZGQgdGhlIEZUUCBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfSFRNTCAiQWRkIHRoZSBIVE1MIHN1cHBvcnQiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9IVFRQICJBZGQgdGhlIEhUVFAgc3VwcG9ydCIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX0lDT05WICJBZGQgSUNPTlYgc3VwcG9ydCIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX0lDVSAiQWRkIElDVSBzdXBwb3J0IiBPRkYpCitvcHRpb24oTElCWE1MMl9XSVRIX0lTTzg4NTlYICJBZGQgSVNPODg1OVggc3VwcG9ydCBpZiBubyBpY29udiIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX0xFR0FDWSAiQWRkIGRlcHJlY2F0ZWQgQVBJcyBmb3IgY29tcGF0aWJpbGl0eSIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX0xaTUEgIlVzZSBsaWJsem1hIiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfTUVNX0RFQlVHICJBZGQgdGhlIG1lbW9yeSBkZWJ1Z2dpbmcgbW9kdWxlIiBPRkYpCitvcHRpb24oTElCWE1MMl9XSVRIX01PRFVMRVMgIkFkZCB0aGUgZHluYW1pYyBtb2R1bGVzIHN1cHBvcnQiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9PVVRQVVQgIkFkZCB0aGUgc2VyaWFsaXphdGlvbiBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfUEFUVEVSTiAiQWRkIHRoZSB4bWxQYXR0ZXJuIHNlbGVjdGlvbiBpbnRlcmZhY2UiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9QUk9HUkFNUyAiQnVpbGQgcHJvZ3JhbXMiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9QVVNIICJBZGQgdGhlIFBVU0ggcGFyc2VyIGludGVyZmFjZXMiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9QWVRIT04gIkJ1aWxkIFB5dGhvbiBiaW5kaW5ncyIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX1JFQURFUiAiQWRkIHRoZSB4bWxSZWFkZXIgcGFyc2luZyBpbnRlcmZhY2UiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9SRUdFWFBTICJBZGQgUmVndWxhciBFeHByZXNzaW9ucyBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfUlVOX0RFQlVHICJBZGQgdGhlIHJ1bnRpbWUgZGVidWdnaW5nIG1vZHVsZSIgT0ZGKQorb3B0aW9uKExJQlhNTDJfV0lUSF9TQVgxICJBZGQgdGhlIG9sZGVyIFNBWDEgaW50ZXJmYWNlIiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfU0NIRU1BUyAiQWRkIFJlbGF4LU5HIGFuZCBTY2hlbWFzIHN1cHBvcnQiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9TQ0hFTUFUUk9OICJBZGQgU2NoZW1hdHJvbiBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfVEVTVFMgIkJ1aWxkIHRlc3RzIiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfVEhSRUFEUyAiQWRkIG11bHRpdGhyZWFkIHN1cHBvcnQiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9USFJFQURfQUxMT0MgIkFkZCBwZXItdGhyZWFkIG1lbW9yeSIgT0ZGKQorb3B0aW9uKExJQlhNTDJfV0lUSF9UUkVFICJBZGQgdGhlIERPTSBsaWtlIHRyZWUgbWFuaXB1bGF0aW9uIEFQSXMiIE9OKQorc2V0KExJQlhNTDJfV0lUSF9UUklPIE9GRikKK3NldChMSUJYTUwyX1dJVEhfVU5JQ09ERSBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfVkFMSUQgIkFkZCB0aGUgRFREIHZhbGlkYXRpb24gc3VwcG9ydCIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX1dSSVRFUiAiQWRkIHRoZSB4bWxXcml0ZXIgc2F2aW5nIGludGVyZmFjZSIgT04pCitvcHRpb24oTElCWE1MMl9XSVRIX1hJTkNMVURFICJBZGQgdGhlIFhJbmNsdWRlIHN1cHBvcnQiIE9OKQorb3B0aW9uKExJQlhNTDJfV0lUSF9YUEFUSCAiQWRkIHRoZSBYUEFUSCBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfWFBUUiAiQWRkIHRoZSBYUG9pbnRlciBzdXBwb3J0IiBPTikKK29wdGlvbihMSUJYTUwyX1dJVEhfWkxJQiAiVXNlIGxpYnoiIE9OKQorc2V0KExJQlhNTDJfWE1MQ09ORl9XT1JLSU5HX0RJUiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gQ0FDSEUgUEFUSCAiV29ya2luZyBkaXJlY3RvcnkgZm9yIFhNTCBDb25mb3JtYW5jZSBUZXN0IFN1aXRlIikKKworaWYoTElCWE1MMl9XSVRIX0lDT05WKQorCWZpbmRfcGFja2FnZShJY29udiBSRVFVSVJFRCkKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX0lDVSkKKwlmaW5kX3BhY2thZ2UoSUNVIFJFUVVJUkVEIENPTVBPTkVOVFMgZGF0YSBpMThuIHVjKQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfTFpNQSkKKwlmaW5kX3BhY2thZ2UoTGliTFpNQSBSRVFVSVJFRCkKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX1BZVEhPTikKKwljaGVja19pbmNsdWRlX2ZpbGVzKHVuaXN0ZC5oIEhBVkVfVU5JU1REX0gpCisJY2hlY2tfc3ltYm9sX2V4aXN0cyhGX0dFVEZMIGZjbnRsLmggSEFWRV9GX0dFVEZMKQorCWlmKEhBVkVfVU5JU1REX0ggQU5EIEhBVkVfRl9HRVRGTCkKKwkJZmluZF9wYWNrYWdlKFB5dGhvbiBDT01QT05FTlRTIEludGVycHJldGVyIERldmVsb3BtZW50IFJFUVVJUkVEKQorCWVsc2UoKQorCQlmaW5kX3BhY2thZ2UoUHl0aG9uMiBDT01QT05FTlRTIEludGVycHJldGVyIERldmVsb3BtZW50IFJFUVVJUkVEKQorCQlhZGRfbGlicmFyeShQeXRob246OlB5dGhvbiBBTElBUyBQeXRob24yOjpQeXRob24pCisJCXNldChQeXRob25fRVhFQ1VUQUJMRSAke1B5dGhvbjJfRVhFQ1VUQUJMRX0pCisJCXNldChQeXRob25fU0lURUFSQ0ggJHtQeXRob24yX1NJVEVBUkNIfSkKKwllbmRpZigpCisJc2V0KExJQlhNTDJfUFlUSE9OX0lOU1RBTExfRElSICR7UHl0aG9uX1NJVEVBUkNIfSBDQUNIRSBQQVRIICJQeXRob24gYmluZGluZ3MgaW5zdGFsbCBkaXJlY3RvcnkiKQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfVEhSRUFEUykKKwlmaW5kX3BhY2thZ2UoVGhyZWFkcyBSRVFVSVJFRCkKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX1pMSUIpCisJZmluZF9wYWNrYWdlKFpMSUIgUkVRVUlSRUQpCitlbmRpZigpCisKK2ZvcmVhY2goVkFSSUFCTEUgSU4gSVRFTVMgV0lUSF9BVVRPTUFUQSBXSVRIX0MxNE4gV0lUSF9DQVRBTE9HIFdJVEhfREVCVUcgV0lUSF9ET0NCIFdJVEhfRVhQUiBXSVRIX0ZUUCBXSVRIX0hUTUwgV0lUSF9IVFRQIFdJVEhfSUNPTlYgV0lUSF9JQ1UgV0lUSF9JU084ODU5WCBXSVRIX0xFR0FDWSBXSVRIX0xaTUEgV0lUSF9NRU1fREVCVUcgV0lUSF9NT0RVTEVTIFdJVEhfT1VUUFVUIFdJVEhfUEFUVEVSTiBXSVRIX1BVU0ggV0lUSF9SRUFERVIgV0lUSF9SRUdFWFBTIFdJVEhfUlVOX0RFQlVHIFdJVEhfU0FYMSBXSVRIX1NDSEVNQVMgV0lUSF9TQ0hFTUFUUk9OIFdJVEhfVEhSRUFEUyBXSVRIX1RIUkVBRF9BTExPQyBXSVRIX1RSRUUgV0lUSF9UUklPIFdJVEhfVU5JQ09ERSBXSVRIX1ZBTElEIFdJVEhfV1JJVEVSIFdJVEhfWElOQ0xVREUgV0lUSF9YUEFUSCBXSVRIX1hQVFIgV0lUSF9aTElCKQorCWlmKExJQlhNTDJfJHtWQVJJQUJMRX0pCisJCXNldCgke1ZBUklBQkxFfSAxKQorCWVsc2UoKQorCQlzZXQoJHtWQVJJQUJMRX0gMCkKKwllbmRpZigpCitlbmRmb3JlYWNoKCkKKworc2V0KExJQlhNTF9WRVJTSU9OICR7TElCWE1MX01BSk9SX1ZFUlNJT059MCR7TElCWE1MX01JTk9SX1ZFUlNJT059MCR7TElCWE1MX01JQ1JPX1ZFUlNJT059KQorc2V0KExJQlhNTF9WRVJTSU9OX1NUUklORyAiJHtMSUJYTUxfVkVSU0lPTn0iKQorc2V0KExJQlhNTF9WRVJTSU9OX0VYVFJBICIiKQorc2V0KExJQlhNTF9WRVJTSU9OX05VTUJFUiAke0xJQlhNTF9WRVJTSU9OfSkKKworc2V0KE1PRFVMRV9FWFRFTlNJT04gIiR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSIpCisKK3NldChQQUNLQUdFICJsaWJ4bWwyIikKK3NldChQQUNLQUdFX0JVR1JFUE9SVCAieG1sQGdub21lLm9yZyIpCitzZXQoUEFDS0FHRV9OQU1FICJsaWJ4bWwyIikKK3NldChQQUNLQUdFX1NUUklORyAibGlieG1sMiAke1ZFUlNJT059IikKK3NldChQQUNLQUdFX1RBUk5BTUUgImxpYnhtbDIiKQorc2V0KFBBQ0tBR0VfVVJMICJodHRwOi8vd3d3LnhtbHNvZnQub3JnLyIpCitzZXQoUEFDS0FHRV9WRVJTSU9OICR7VkVSU0lPTn0pCisKK2lmKExJQkxaTUFfRk9VTkQpCisJbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIExpYkxaTUE6OkxpYkxaTUEpCitlbmRpZigpCisKK2lmKFRocmVhZHNfRk9VTkQpCisJbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIFRocmVhZHM6OlRocmVhZHMpCitlbmRpZigpCisKK2lmKFpMSUJfRk9VTkQpCisJbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIFpMSUI6OlpMSUIpCitlbmRpZigpCisKK2lmKE1TVkMpCisJY29uZmlndXJlX2ZpbGUoaW5jbHVkZS93aW4zMmNvbmZpZy5oIGNvbmZpZy5oIENPUFlPTkxZKQorZWxzZSgpCisJY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorCQl2b2lkIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKQorCQlmKHZvaWQpIHt9CisJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KKwkiIEFUVFJJQlVURV9ERVNUUlVDVE9SKQorCWNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKwkJI2luY2x1ZGUgPG5ldGRiLmg+CisJCWludCBtYWluKCkgeyAodm9pZCkgZ2V0aG9zdGJ5bmFtZSgoY29uc3QgY2hhciopIFwiXCIpOyByZXR1cm4gMDsgfQorCSIgR0VUSE9TVEJZTkFNRV9BUkdfQ0FTVF9DT05TVCkKKwlpZihOT1QgR0VUSE9TVEJZTkFNRV9BUkdfQ0FTVF9DT05TVCkKKwkJc2V0KEdFVEhPU1RCWU5BTUVfQVJHX0NBU1QgIihjaGFyICopIikKKwllbHNlKCkKKwkJc2V0KEdFVEhPU1RCWU5BTUVfQVJHX0NBU1QgIi8qKi8iKQorCWVuZGlmKCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKGFycGEvaW5ldC5oIEhBVkVfQVJQQV9JTkVUX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhhcnBhL25hbWVzZXIuaCBIQVZFX0FSUEFfTkFNRVNFUl9IKQorCWNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSIgc3NfZmFtaWx5ICJzeXMvc29ja2V0Lmg7c3lzL3R5cGVzLmgiIEhBVkVfU1NfRkFNSUxZKQorCWNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSIgX19zc19mYW1pbHkgInN5cy9zb2NrZXQuaDtzeXMvdHlwZXMuaCIgSEFWRV9CUk9LRU5fU1NfRkFNSUxZKQorCWlmKEhBVkVfQlJPS0VOX1NTX0ZBTUlMWSkKKwkJc2V0KHNzX2ZhbWlseSBfX3NzX2ZhbWlseSkKKwllbmRpZigpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGNsYXNzIEhBVkVfQ0xBU1MpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhjdHlwZS5oIEhBVkVfQ1RZUEVfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKGRpcmVudC5oIEhBVkVfRElSRU5UX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhkbGZjbi5oIEhBVkVfRExGQ05fSCkKKwljaGVja19saWJyYXJ5X2V4aXN0cyhkbCBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCisJY2hlY2tfaW5jbHVkZV9maWxlcyhkbC5oIEhBVkVfRExfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKGVycm5vLmggSEFWRV9FUlJOT19IKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMoZmNudGwuaCBIQVZFX0ZDTlRMX0gpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGZpbml0ZSBIQVZFX0ZJTklURSkKKwljaGVja19pbmNsdWRlX2ZpbGVzKGZsb2F0LmggSEFWRV9GTE9BVF9IKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhmcGNsYXNzIEhBVkVfRlBDTEFTUykKKwljaGVja19mdW5jdGlvbl9leGlzdHMoZnByaW50ZiBIQVZFX0ZQUklOVEYpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGZwX2NsYXNzIEhBVkVfRlBfQ0xBU1MpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGZ0aW1lIEhBVkVfRlRJTUUpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGFkZHJpbmZvIEhBVkVfR0VUQUREUklORk8pCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldHRpbWVvZmRheSBIQVZFX0dFVFRJTUVPRkRBWSkKKwljaGVja19pbmNsdWRlX2ZpbGVzKGludHR5cGVzLmggSEFWRV9JTlRUWVBFU19IKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhpc2FzY2lpIEhBVkVfSVNBU0NJSSkKKwljaGVja19mdW5jdGlvbl9leGlzdHMoaXNpbmYgSEFWRV9JU0lORikKKwljaGVja19mdW5jdGlvbl9leGlzdHMoaXNuYW4gSEFWRV9JU05BTikKKwljaGVja19mdW5jdGlvbl9leGlzdHMoaXNuYW5kIEhBVkVfSVNOQU5EKQorCWNoZWNrX2xpYnJhcnlfZXhpc3RzKGhpc3RvcnkgYXBwZW5kX2hpc3RvcnkgIiIgSEFWRV9MSUJISVNUT1JZKQorCWNoZWNrX2xpYnJhcnlfZXhpc3RzKGx6bWEgbHptYV9jb2RlICIiIEhBVkVfTElCTFpNQSkKKwljaGVja19saWJyYXJ5X2V4aXN0cyhwdGhyZWFkIHB0aHJlYWRfam9pbiAiIiBIQVZFX0xJQlBUSFJFQUQpCisJY2hlY2tfbGlicmFyeV9leGlzdHMocmVhZGxpbmUgcmVhZGxpbmUgIiIgSEFWRV9MSUJSRUFETElORSkKKwljaGVja19saWJyYXJ5X2V4aXN0cyh6IGd6cmVhZCAiIiBIQVZFX0xJQlopCisJY2hlY2tfaW5jbHVkZV9maWxlcyhsaW1pdHMuaCBIQVZFX0xJTUlUU19IKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsb2NhbHRpbWUgSEFWRV9MT0NBTFRJTUUpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhsem1hLmggSEFWRV9MWk1BX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhtYWxsb2MuaCBIQVZFX01BTExPQ19IKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMobWF0aC5oIEhBVkVfTUFUSF9IKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMobWVtb3J5LmggSEFWRV9NRU1PUllfSCkKKwljaGVja19mdW5jdGlvbl9leGlzdHMobW1hcCBIQVZFX01NQVApCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKG11bm1hcCBIQVZFX01VTk1BUCkKKwljaGVja19zeW1ib2xfZXhpc3RzKERJUiBuZGlyLmggSEFWRV9ORElSX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhuZXRkYi5oIEhBVkVfTkVUREJfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKG5ldGluZXQvaW4uaCBIQVZFX05FVElORVRfSU5fSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHBvbGwuaCBIQVZFX1BPTExfSCkKKwljaGVja19mdW5jdGlvbl9leGlzdHMocHJpbnRmIEhBVkVfUFJJTlRGKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMocHRocmVhZC5oIEhBVkVfUFRIUkVBRF9IKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhwdXRlbnYgSEFWRV9QVVRFTlYpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHJhbmQgSEFWRV9SQU5EKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhyYW5kX3IgSEFWRV9SQU5EX1IpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhyZXNvbHYuaCBIQVZFX1JFU09MVl9IKQorCWNoZWNrX2xpYnJhcnlfZXhpc3RzKGRsZCBzaGxfbG9hZCAiIiBIQVZFX1NITExPQUQpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNpZ25hbCBIQVZFX1NJR05BTCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHNpZ25hbC5oIEhBVkVfU0lHTkFMX0gpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNucHJpbnRmIEhBVkVfU05QUklOVEYpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNwcmludGYgSEFWRV9TUFJJTlRGKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzcmFuZCBIQVZFX1NSQU5EKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzc2NhbmYgSEFWRV9TU0NBTkYpCisJY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHN0YXQgSEFWRV9TVEFUKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMoc3RkYXJnLmggSEFWRV9TVERBUkdfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHN0ZGludC5oIEhBVkVfU1RESU5UX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhzdGRsaWIuaCBIQVZFX1NURExJQl9IKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzdHJmdGltZSBIQVZFX1NUUkZUSU1FKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMoc3RyaW5ncy5oIEhBVkVfU1RSSU5HU19IKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMoc3RyaW5nLmggSEFWRV9TVFJJTkdfSCkKKwljaGVja19zeW1ib2xfZXhpc3RzKERJUiBzeXMvZGlyLmggSEFWRV9TWVNfRElSX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyhzeXMvbW1hbi5oIEhBVkVfU1lTX01NQU5fSCkKKwljaGVja19zeW1ib2xfZXhpc3RzKERJUiBzeXMvbmRpci5oIEhBVkVfU1lTX05ESVJfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHN5cy9zZWxlY3QuaCBIQVZFX1NZU19TRUxFQ1RfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHN5cy9zb2NrZXQuaCBIQVZFX1NZU19TT0NLRVRfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHN5cy9zdGF0LmggSEFWRV9TWVNfU1RBVF9IKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMoc3lzL3RpbWViLmggSEFWRV9TWVNfVElNRUJfSCkKKwljaGVja19pbmNsdWRlX2ZpbGVzKHN5cy90aW1lLmggSEFWRV9TWVNfVElNRV9IKQorCWNoZWNrX2luY2x1ZGVfZmlsZXMoc3lzL3R5cGVzLmggSEFWRV9TWVNfVFlQRVNfSCkKKwljaGVja19mdW5jdGlvbl9leGlzdHModGltZSBIQVZFX1RJTUUpCisJY2hlY2tfaW5jbHVkZV9maWxlcyh0aW1lLmggSEFWRV9USU1FX0gpCisJY2hlY2tfaW5jbHVkZV9maWxlcyh1bmlzdGQuaCBIQVZFX1VOSVNURF9IKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyh2YV9jb3B5IEhBVkVfVkFfQ09QWSkKKwljaGVja19mdW5jdGlvbl9leGlzdHModmZwcmludGYgSEFWRV9WRlBSSU5URikKKwljaGVja19mdW5jdGlvbl9leGlzdHModnNucHJpbnRmIEhBVkVfVlNOUFJJTlRGKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyh2c3ByaW50ZiBIQVZFX1ZTUFJJTlRGKQorCWNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhfX3ZhX2NvcHkgSEFWRV9fX1ZBX0NPUFkpCisJY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorCQkjaW5jbHVkZSA8c3RkbGliLmg+CisJCSNpbmNsdWRlIDxpY29udi5oPgorCQlleHRlcm4KKwkJI2lmZGVmIF9fY3BsdXNwbHVzCisJCVwiQ1wiCisJCSNlbmRpZgorCQkjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKwkJc2l6ZV90IGljb252KGljb252X3QgY2QsIGNoYXIqKiBpbmJ1Ziwgc2l6ZV90KiBpbmJ5dGVzbGVmdCwgY2hhcioqIG91dGJ1Ziwgc2l6ZV90KiBvdXRieXRlc2xlZnQpOworCQkjZWxzZQorCQlzaXplX3QgaWNvbnYoKTsKKwkJI2VuZGlmCisJCWludCBtYWluKCkgeyByZXR1cm4gMDsgfQorCSIgSUNPTlZfQ09OU1RfVEVTVCkKKwlpZihOT1QgSUNPTlZfQ09OU1RfVEVTVCkKKwkJc2V0KElDT05WX0NPTlNUICJjb25zdCIpCisJZW5kaWYoKQorCXNldChMVF9PQkpESVIgIi5saWJzLyIpCisJY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorCQkjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCWludCBtYWluKCkgeyAodm9pZCkgc2VuZCgxLCAoY29uc3QgY2hhciopIFwiXCIsIDEsIDEpOyByZXR1cm4gMDsgfQorCSIgU0VORF9BUkcyX0NBU1RfQ09OU1QpCisJaWYoTk9UIFNFTkRfQVJHMl9DQVNUX0NPTlNUKQorCQlzZXQoU0VORF9BUkcyX0NBU1QgIihjaGFyICopIikKKwllbHNlKCkKKwkJc2V0KFNFTkRfQVJHMl9DQVNUICIvKiovIikKKwllbmRpZigpCisJY2hlY2tfaW5jbHVkZV9maWxlcygiZmxvYXQuaDtzdGRhcmcuaDtzdGRsaWIuaDtzdHJpbmcuaCIgU1REQ19IRUFERVJTKQorCWNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKwkJI2luY2x1ZGUgPHN0ZGFyZy5oPgorCQl2b2lkIGEodmFfbGlzdCogYXApIHt9OworCQlpbnQgbWFpbigpIHsgdmFfbGlzdCBhcDEsIGFwMjsgYSgmYXAxKTsgYXAyID0gKHZhX2xpc3QpIGFwMTsgcmV0dXJuIDA7IH0KKwkiIFZBX0xJU1RfSVNfQVJSQVlfVEVTVCkKKwlpZihWQV9MSVNUX0lTX0FSUkFZX1RFU1QpCisJCXNldChWQV9MSVNUX0lTX0FSUkFZIEZBTFNFKQorCWVsc2UoKQorCQlzZXQoVkFfTElTVF9JU19BUlJBWSBUUlVFKQorCWVuZGlmKCkKKwljaGVja19jX3NvdXJjZV9jb21waWxlcygiCisJCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwkJI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQlpbnQgbWFpbigpIHsgKHZvaWQpIGdldHNvY2tvcHQoMSwgMSwgMSwgTlVMTCwgKHNvY2tsZW5fdCopIE5VTEwpOyByZXR1cm4gMDsgfQorCSIgWE1MX1NPQ0tMRU5fVF9TT0NLTEVOX1QpCisJaWYoWE1MX1NPQ0tMRU5fVF9TT0NLTEVOX1QpCisJCXNldChYTUxfU09DS0xFTl9UIHNvY2tsZW5fdCkKKwllbHNlKCkKKwkJY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorCQkJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCQkJI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkJCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkJCWludCBtYWluKCkgeyAodm9pZCkgZ2V0c29ja29wdCgxLCAxLCAxLCBOVUxMLCAoc2l6ZV90KikgTlVMTCk7IHJldHVybiAwOyB9CisJCSIgWE1MX1NPQ0tMRU5fVF9TSVpFX1QpCisJCWlmKFhNTF9TT0NLTEVOX1RfU0laRV9UKQorCQkJc2V0KFhNTF9TT0NLTEVOX1Qgc2l6ZV90KQorCQllbHNlKCkKKwkJCWNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKwkJCQkjaW5jbHVkZSA8c3RkZGVmLmg+CisJCQkJI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkJCQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCQkJaW50IG1haW4oKSB7ICh2b2lkKSBnZXRzb2Nrb3B0ICgxLCAxLCAxLCBOVUxMLCAoaW50KikgTlVMTCk7IHJldHVybiAwOyB9CisJCQkiIFhNTF9TT0NLTEVOX1RfSU5UKQorCQkJc2V0KFhNTF9TT0NLTEVOX1QgaW50KQorCQllbmRpZigpCisJZW5kaWYoKQorCWNvbmZpZ3VyZV9maWxlKGNvbmZpZy5oLmNtYWtlLmluIGNvbmZpZy5oKQorZW5kaWYoKQorCitzZXQoCisJTElCWE1MMl9IRFJTCisJaW5jbHVkZS9saWJ4bWwvYzE0bi5oCisJaW5jbHVkZS9saWJ4bWwvY2F0YWxvZy5oCisJaW5jbHVkZS9saWJ4bWwvY2h2YWxpZC5oCisJaW5jbHVkZS9saWJ4bWwvZGVidWdYTUwuaAorCWluY2x1ZGUvbGlieG1sL2RpY3QuaAorCWluY2x1ZGUvbGlieG1sL0RPQ0JwYXJzZXIuaAorCWluY2x1ZGUvbGlieG1sL2VuY29kaW5nLmgKKwlpbmNsdWRlL2xpYnhtbC9lbnRpdGllcy5oCisJaW5jbHVkZS9saWJ4bWwvZ2xvYmFscy5oCisJaW5jbHVkZS9saWJ4bWwvaGFzaC5oCisJaW5jbHVkZS9saWJ4bWwvSFRNTHBhcnNlci5oCisJaW5jbHVkZS9saWJ4bWwvSFRNTHRyZWUuaAorCWluY2x1ZGUvbGlieG1sL2xpc3QuaAorCWluY2x1ZGUvbGlieG1sL25hbm9mdHAuaAorCWluY2x1ZGUvbGlieG1sL25hbm9odHRwLmgKKwlpbmNsdWRlL2xpYnhtbC9wYXJzZXIuaAorCWluY2x1ZGUvbGlieG1sL3BhcnNlckludGVybmFscy5oCisJaW5jbHVkZS9saWJ4bWwvcGF0dGVybi5oCisJaW5jbHVkZS9saWJ4bWwvcmVsYXhuZy5oCisJaW5jbHVkZS9saWJ4bWwvU0FYLmgKKwlpbmNsdWRlL2xpYnhtbC9TQVgyLmgKKwlpbmNsdWRlL2xpYnhtbC9zY2hlbWFzSW50ZXJuYWxzLmgKKwlpbmNsdWRlL2xpYnhtbC9zY2hlbWF0cm9uLmgKKwlpbmNsdWRlL2xpYnhtbC90aHJlYWRzLmgKKwlpbmNsdWRlL2xpYnhtbC90cmVlLmgKKwlpbmNsdWRlL2xpYnhtbC91cmkuaAorCWluY2x1ZGUvbGlieG1sL3ZhbGlkLmgKKwlpbmNsdWRlL2xpYnhtbC94aW5jbHVkZS5oCisJaW5jbHVkZS9saWJ4bWwveGxpbmsuaAorCWluY2x1ZGUvbGlieG1sL3htbElPLmgKKwlpbmNsdWRlL2xpYnhtbC94bWxhdXRvbWF0YS5oCisJaW5jbHVkZS9saWJ4bWwveG1sZXJyb3IuaAorCWluY2x1ZGUvbGlieG1sL3htbGV4cG9ydHMuaAorCWluY2x1ZGUvbGlieG1sL3htbG1lbW9yeS5oCisJaW5jbHVkZS9saWJ4bWwveG1sbW9kdWxlLmgKKwlpbmNsdWRlL2xpYnhtbC94bWxyZWFkZXIuaAorCWluY2x1ZGUvbGlieG1sL3htbHJlZ2V4cC5oCisJaW5jbHVkZS9saWJ4bWwveG1sc2F2ZS5oCisJaW5jbHVkZS9saWJ4bWwveG1sc2NoZW1hcy5oCisJaW5jbHVkZS9saWJ4bWwveG1sc2NoZW1hc3R5cGVzLmgKKwlpbmNsdWRlL2xpYnhtbC94bWxzdHJpbmcuaAorCWluY2x1ZGUvbGlieG1sL3htbHVuaWNvZGUuaAorCWluY2x1ZGUvbGlieG1sL3htbHdyaXRlci5oCisJaW5jbHVkZS9saWJ4bWwveHBhdGguaAorCWluY2x1ZGUvbGlieG1sL3hwYXRoSW50ZXJuYWxzLmgKKwlpbmNsdWRlL2xpYnhtbC94cG9pbnRlci5oCispCisKK3NldCgKKwlMSUJYTUwyX1NSQ1MKKwlidWYuYworCWMxNG4uYworCWNhdGFsb2cuYworCWNodmFsaWQuYworCWRlYnVnWE1MLmMKKwlkaWN0LmMKKwllbmNvZGluZy5jCisJZW50aXRpZXMuYworCWVycm9yLmMKKwlnbG9iYWxzLmMKKwloYXNoLmMKKwlIVE1McGFyc2VyLmMKKwlIVE1MdHJlZS5jCisJbGVnYWN5LmMKKwlsaXN0LmMKKwluYW5vZnRwLmMKKwluYW5vaHR0cC5jCisJcGFyc2VyLmMKKwlwYXJzZXJJbnRlcm5hbHMuYworCXBhdHRlcm4uYworCXJlbGF4bmcuYworCVNBWC5jCisJU0FYMi5jCisJc2NoZW1hdHJvbi5jCisJdGhyZWFkcy5jCisJdHJlZS5jCisJdXJpLmMKKwl2YWxpZC5jCisJeGluY2x1ZGUuYworCXhsaW5rLmMKKwl4bWxJTy5jCisJeG1sbWVtb3J5LmMKKwl4bWxtb2R1bGUuYworCXhtbHJlYWRlci5jCisJeG1scmVnZXhwLmMKKwl4bWxzYXZlLmMKKwl4bWxzY2hlbWFzLmMKKwl4bWxzY2hlbWFzdHlwZXMuYworCXhtbHN0cmluZy5jCisJeG1sdW5pY29kZS5jCisJeG1sd3JpdGVyLmMKKwl4cGF0aC5jCisJeHBvaW50ZXIuYworCXh6bGliLmMKKykKKworaWYoV0lOMzIpCisJbGlzdChBUFBFTkQgTElCWE1MMl9TUkNTIHdpbjMyL2xpYnhtbDIucmMpCisJZmlsZSgKKwkJV1JJVEUKKwkJJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3JjVmVyc2lvbi5oCisJCSIjZGVmaW5lIExJQlhNTF9NQUpPUl9WRVJTSU9OICR7TElCWE1MX01BSk9SX1ZFUlNJT059XG4iCisJCSIjZGVmaW5lIExJQlhNTF9NSU5PUl9WRVJTSU9OICR7TElCWE1MX01JTk9SX1ZFUlNJT059XG4iCisJCSIjZGVmaW5lIExJQlhNTF9NSUNST19WRVJTSU9OICR7TElCWE1MX01JQ1JPX1ZFUlNJT059XG4iCisJCSIjZGVmaW5lIExJQlhNTF9ET1RURURfVkVSU0lPTiBcIiR7VkVSU0lPTn1cIlxuIgorCSkKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX1NBWDEpCisJbGlzdChBUFBFTkQgTElCWE1MMl9TUkNTIERPQ0JwYXJzZXIuYykKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX1RSSU8pCisJbGlzdChBUFBFTkQgTElCWE1MMl9TUkNTIHRyaW8uYyB0cmlvc3RyLmMpCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KExpYlhtbDIgJHtMSUJYTUwyX0hEUlN9ICR7TElCWE1MMl9TUkNTfSkKK2FkZF9saWJyYXJ5KExpYlhtbDI6OkxpYlhtbDIgQUxJQVMgTGliWG1sMikKKworaWYoTk9UIEJVSUxEX1NIQVJFRF9MSUJTKQorCXRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKExpYlhtbDIgSU5URVJGQUNFIExJQlhNTF9TVEFUSUMpCisJc2V0KFhNTF9DRkxBR1MgIi1ETElCWE1MX1NUQVRJQyIpCitlbmRpZigpCisKK2lmKExJQlhNTDJfV0lUSF9USFJFQURTKQorCXRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKExpYlhtbDIgUFJJVkFURSBfUkVFTlRSQU5UKQorCWlmKFdJTjMyKQorCQl0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyhMaWJYbWwyIFBSSVZBVEUgSEFWRV9XSU4zMl9USFJFQURTKQorCWVuZGlmKCkKK2VuZGlmKCkKKwordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoCisJTGliWG1sMgorCVBVQkxJQworCSQ8QlVJTERfSU5URVJGQUNFOiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfT4KKwkkPEJVSUxEX0lOVEVSRkFDRToke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZT4KKwkkPElOU1RBTExfSU5URVJGQUNFOiQ8SU5TVEFMTF9QUkVGSVg+LyR7Q01BS0VfSU5TVEFMTF9JTkNMVURFRElSfS9saWJ4bWwyPgorKQorCitpZihIQVZFX0RMT1BFTikKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoTGliWG1sMiBQUklWQVRFIGRsKQorCXNldChNT0RVTEVfUExBVEZPUk1fTElCUyAiLWxkbCIpCitlbmRpZigpCisKK2lmKEhBVkVfU0hMTE9BRCkKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoTGliWG1sMiBQUklWQVRFIGRsZCkKKwlzZXQoTU9EVUxFX1BMQVRGT1JNX0xJQlMgIi1sZGxkIikKK2VuZGlmKCkKKworaWYoVU5JWCkKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoTGliWG1sMiBQUklWQVRFIG0pCisJc2V0KE1fTElCUyAiLWxtIikKK2VuZGlmKCkKKworaWYoV0lOMzIpCisJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKExpYlhtbDIgUFJJVkFURSB3czJfMzIpCisJc2V0KFdJTjMyX0VYVFJBX0xJQkFERCAiLWx3czJfMzIiKQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfSUNPTlYpCisJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKExpYlhtbDIgUFVCTElDIEljb252OjpJY29udikKKwlpZihOT1QgSWNvbnZfSVNfQlVJTFRfSU4pCisJCXNldChJQ09OVl9MSUJTICItbGljb252IikKKwllbmRpZigpCitlbmRpZigpCisKK2lmKExJQlhNTDJfV0lUSF9JQ1UpCisJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKExpYlhtbDIgUFJJVkFURSBJQ1U6OmRhdGEgSUNVOjppMThuIElDVTo6dWMpCisJaWYoV0lOMzIpCisJCXNldChJQ1VfTElCUyAiLWxpY3VkdCAtbGljdWluIC1saWN1dWMiKQorCWVsc2UoKQorCQlzZXQoSUNVX0xJQlMgIi1saWN1ZGF0YSAtbGljdWkxOG4gLWxpY3V1YyIpCisJZW5kaWYoKQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfTFpNQSkKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoTGliWG1sMiBQUklWQVRFIExpYkxaTUE6OkxpYkxaTUEpCisJc2V0KExaTUFfTElCUyAiLWxsem1hIikKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX1RIUkVBRFMpCisJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKExpYlhtbDIgUFJJVkFURSBUaHJlYWRzOjpUaHJlYWRzKQorCXNldChUSFJFQURfTElCUyAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfWkxJQikKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoTGliWG1sMiBQUklWQVRFIFpMSUI6OlpMSUIpCisJc2V0KFpfTElCUyAiLWx6IikKK2VuZGlmKCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKAorCUxpYlhtbDIKKwlQUk9QRVJUSUVTCisJSU1QT1JUX1BSRUZJWCBsaWIKKwlPVVRQVVRfTkFNRSB4bWwyCisJUE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERSBPTgorCVBSRUZJWCBsaWIKKwlWRVJTSU9OICR7UFJPSkVDVF9WRVJTSU9OfQorKQorCitpZihNU1ZDKQorCWlmKEJVSUxEX1NIQVJFRF9MSUJTKQorCQlzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoCisJCQlMaWJYbWwyCisJCQlQUk9QRVJUSUVTCisJCQlERUJVR19QT1NURklYIGQKKwkJKQorCWVsc2UoKQorCQlzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoCisJCQlMaWJYbWwyCisJCQlQUk9QRVJUSUVTCisJCQlERUJVR19QT1NURklYIHNkCisJCQlNSU5TSVpFUkVMX1BPU1RGSVggcworCQkJUkVMRUFTRV9QT1NURklYIHMKKwkJCVJFTFdJVEhERUJJTkZPX1BPU1RGSVggcworCQkpCisJZW5kaWYoKQorZW5kaWYoKQorCitpbnN0YWxsKEZJTEVTICR7TElCWE1MMl9IRFJTfSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfSU5DTFVERURJUn0vbGlieG1sMi9saWJ4bWwgQ09NUE9ORU5UIGRldmVsb3BtZW50KQorCitpbnN0YWxsKAorCVRBUkdFVFMJTGliWG1sMgorCUVYUE9SVCBMaWJYbWwyCisJQVJDSElWRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSBDT01QT05FTlQgZGV2ZWxvcG1lbnQKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9IENPTVBPTkVOVCBydW50aW1lIE5BTUVMSU5LX0NPTVBPTkVOVCBkZXZlbG9wbWVudAorCVJVTlRJTUUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0gQ09NUE9ORU5UIHJ1bnRpbWUKKykKKworaWYoTVNWQyBBTkQgQlVJTERfU0hBUkVEX0xJQlMpCisJaW5zdGFsbChGSUxFUyAkPFRBUkdFVF9QREJfRklMRTpMaWJYbWwyPiBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfQklORElSfSBDT05GSUdVUkFUSU9OUyBEZWJ1ZyBSZWxXaXRoRGViSW5mbyBDT01QT05FTlQgZGVidWcpCitlbmRpZigpCisKK2lmKExJQlhNTDJfV0lUSF9QUk9HUkFNUykKKwlzZXQoCisJCVBST0dSQU1TCisJCXhtbGNhdGFsb2cKKwkJeG1sbGludAorCSkKKwlmb3JlYWNoKFBST0dSQU0gJHtQUk9HUkFNU30pCisJCWFkZF9leGVjdXRhYmxlKCR7UFJPR1JBTX0gJHtQUk9HUkFNfS5jKQorCQlhZGRfZXhlY3V0YWJsZShMaWJYbWwyOjoke1BST0dSQU19IEFMSUFTICR7UFJPR1JBTX0pCisJCXRhcmdldF9saW5rX2xpYnJhcmllcygke1BST0dSQU19IExpYlhtbDIpCisJCWlmKEhBVkVfTElCSElTVE9SWSkKKwkJCXRhcmdldF9saW5rX2xpYnJhcmllcygke1BST0dSQU19IGhpc3RvcnkpCisJCWVuZGlmKCkKKwkJaWYoSEFWRV9MSUJSRUFETElORSkKKwkJCXRhcmdldF9saW5rX2xpYnJhcmllcygke1BST0dSQU19IHJlYWRsaW5lKQorCQllbmRpZigpCisJCWluc3RhbGwoVEFSR0VUUwkke1BST0dSQU19IEVYUE9SVCBMaWJYbWwyIFJVTlRJTUUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0gQ09NUE9ORU5UIHByb2dyYW1zKQorCWVuZGZvcmVhY2goKQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfVEVTVFMpCisJZW5hYmxlX3Rlc3RpbmcoKQorCXNldCgKKwkJVEVTVFMKKwkJcnVueG1sY29uZgorCQlydW5zdWl0ZQorCQl0ZXN0YXBpCisJCXRlc3RBdXRvbWF0YQorCQl0ZXN0QzE0TgorCQl0ZXN0Y2hhcgorCQl0ZXN0ZGljdAorCQl0ZXN0SFRNTAorCQl0ZXN0TW9kdWxlCisJCXRlc3RsaW1pdHMKKwkJdGVzdFJlYWRlcgorCQl0ZXN0cmVjdXJzZQorCQl0ZXN0UmVnZXhwCisJCXRlc3RSZWxheAorCQl0ZXN0U0FYCisJCXRlc3RTY2hlbWFzCisJCXRlc3RVUkkKKwkJdGVzdFhQYXRoCisJKQorCWZvcmVhY2goVEVTVCAke1RFU1RTfSkKKwkJYWRkX2V4ZWN1dGFibGUoJHtURVNUfSAke1RFU1R9LmMpCisJCXRhcmdldF9saW5rX2xpYnJhcmllcygke1RFU1R9IExpYlhtbDIpCisJZW5kZm9yZWFjaCgpCisJaWYoRVhJU1RTICR7TElCWE1MMl9YTUxDT05GX1dPUktJTkdfRElSfS94bWxjb25mL3htbGNvbmYueG1sKQorCQlhZGRfdGVzdChOQU1FIHJ1bnhtbGNvbmYgQ09NTUFORCBydW54bWxjb25mIFdPUktJTkdfRElSRUNUT1JZICR7TElCWE1MMl9YTUxDT05GX1dPUktJTkdfRElSfSkKKwllbmRpZigpCisJaWYoTk9UIFdJTjMyKQorCQlhZGRfdGVzdChOQU1FIHRlc3RhcGkgQ09NTUFORCB0ZXN0YXBpKQorCWVuZGlmKCkKKwlhZGRfdGVzdChOQU1FIHRlc3RjaGFyIENPTU1BTkQgdGVzdGNoYXIpCisJYWRkX3Rlc3QoTkFNRSB0ZXN0ZGljdCBDT01NQU5EIHRlc3RkaWN0KQorCWFkZF90ZXN0KE5BTUUgdGVzdHJlY3Vyc2UgQ09NTUFORCB0ZXN0cmVjdXJzZSBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisJaWYoVGhyZWFkc19GT1VORCkKKwkJc2V0KAorCQkJVEVTVFNfVEhSRUFEUworCQkJcnVudGVzdAorCQkJdGVzdFRocmVhZHMKKwkJKQorCQlmb3JlYWNoKFRFU1QgJHtURVNUU19USFJFQURTfSkKKwkJCWFkZF9leGVjdXRhYmxlKCR7VEVTVH0gJHtURVNUfS5jKQorCQkJaWYoV0lOMzIpCisJCQkJdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoJHtURVNUfSBQUklWQVRFIEhBVkVfV0lOMzJfVEhSRUFEUykKKwkJCWVuZGlmKCkKKwkJCXRhcmdldF9saW5rX2xpYnJhcmllcygke1RFU1R9IExpYlhtbDIgVGhyZWFkczo6VGhyZWFkcykKKwkJZW5kZm9yZWFjaCgpCisJCWFkZF90ZXN0KE5BTUUgcnVudGVzdCBDT01NQU5EIHJ1bnRlc3QgLS1vdXQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKwkJYWRkX3Rlc3QoTkFNRSB0ZXN0VGhyZWFkcyBDT01NQU5EIHRlc3RUaHJlYWRzIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKwllbmRpZigpCitlbmRpZigpCisKK2lmKExJQlhNTDJfV0lUSF9QWVRIT04pCisJZXhlY3V0ZV9wcm9jZXNzKAorCQlDT01NQU5ECisJCSR7UHl0aG9uX0VYRUNVVEFCTEV9CisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9weXRob24vZ2VuZXJhdG9yLnB5CisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kb2MvbGlieG1sMi1hcGkueG1sCisJCSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9weXRob24vbGlieG1sMi1weXRob24tYXBpLnhtbAorCQlXT1JLSU5HX0RJUkVDVE9SWQorCQkke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKwkpCisJZmlsZShSRUFEIHB5dGhvbi9saWJ4bWwucHkgTElCWE1MX1BZKQorCWZpbGUoV1JJVEUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnhtbDIucHkuaW4gIiR7TElCWE1MX1BZfSIpCisJZmlsZShSRUFEICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJ4bWwyY2xhc3MucHkgTElCWE1MMkNMQVNTX1BZKQorCWZpbGUoQVBQRU5EICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJ4bWwyLnB5LmluICIke0xJQlhNTDJDTEFTU19QWX0iKQorCWNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJ4bWwyLnB5LmluIGxpYnhtbDIucHkgQ09QWU9OTFkpCisJYWRkX2xpYnJhcnkoCisJCUxpYlhtbDJNb2QKKwkJbGlieG1sMi1weS5jCisJCWxpYnhtbDItcHkuaAorCQlweXRob24vbGlieG1sLmMKKwkJcHl0aG9uL2xpYnhtbF93cmFwLmgKKwkJcHl0aG9uL3R5cGVzLmMKKwkpCisJdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoCisJCUxpYlhtbDJNb2QKKwkJUFVCTElDCisJCSQ8QlVJTERfSU5URVJGQUNFOiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9weXRob24+CisJKQorCXRhcmdldF9saW5rX2xpYnJhcmllcyhMaWJYbWwyTW9kIExpYlhtbDIgUHl0aG9uOjpQeXRob24pCisJc2V0X3RhcmdldF9wcm9wZXJ0aWVzKAorCQlMaWJYbWwyTW9kCisJCVBST1BFUlRJRVMKKwkJSU1QT1JUX1BSRUZJWCBsaWIKKwkJT1VUUFVUX05BTUUgeG1sMm1vZAorCQlQUkVGSVggbGliCisJCVZFUlNJT04gJHtQUk9KRUNUX1ZFUlNJT059CisJKQorCWluc3RhbGwoCisJCVRBUkdFVFMJTGliWG1sMk1vZAorCQlBUkNISVZFIERFU1RJTkFUSU9OICR7TElCWE1MMl9QWVRIT05fSU5TVEFMTF9ESVJ9IENPTVBPTkVOVCBkZXZlbG9wbWVudAorCQlMSUJSQVJZIERFU1RJTkFUSU9OICR7TElCWE1MMl9QWVRIT05fSU5TVEFMTF9ESVJ9IENPTVBPTkVOVCBydW50aW1lIE5BTUVMSU5LX0NPTVBPTkVOVCBkZXZlbG9wbWVudAorCQlSVU5USU1FIERFU1RJTkFUSU9OICR7TElCWE1MMl9QWVRIT05fSU5TVEFMTF9ESVJ9IENPTVBPTkVOVCBydW50aW1lCisJKQorCWlmKE1TVkMgQU5EIEJVSUxEX1NIQVJFRF9MSUJTKQorCQlpbnN0YWxsKEZJTEVTICQ8VEFSR0VUX1BEQl9GSUxFOkxpYlhtbDJNb2Q+IERFU1RJTkFUSU9OICR7TElCWE1MMl9QWVRIT05fSU5TVEFMTF9ESVJ9IENPTkZJR1VSQVRJT05TIERlYnVnIFJlbFdpdGhEZWJJbmZvIENPTVBPTkVOVCBkZWJ1ZykKKwllbmRpZigpCisJaW5zdGFsbChGSUxFUyBweXRob24vZHJ2X2xpYnhtbDIucHkgREVTVElOQVRJT04gJHtMSUJYTUwyX1BZVEhPTl9JTlNUQUxMX0RJUn0gQ09NUE9ORU5UIHJ1bnRpbWUpCisJaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlieG1sMi5weSBERVNUSU5BVElPTiAke0xJQlhNTDJfUFlUSE9OX0lOU1RBTExfRElSfSBDT01QT05FTlQgcnVudGltZSkKK2VuZGlmKCkKKworaW5zdGFsbChGSUxFUyBsaWJ4bWwuMyBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTUFORElSfS9tYW4zIENPTVBPTkVOVCBkb2N1bWVudGF0aW9uKQoraW5zdGFsbChGSUxFUyBkb2MveG1sY2F0YWxvZy4xIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9NQU5ESVJ9L21hbjEgQ09NUE9ORU5UIGRvY3VtZW50YXRpb24pCitpbnN0YWxsKEZJTEVTIGRvYy94bWxsaW50LjEgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX01BTkRJUn0vbWFuMSBDT01QT05FTlQgZG9jdW1lbnRhdGlvbikKK2luc3RhbGwoRElSRUNUT1JZIGRvYy8gREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0RBVEFESVJ9L2RvYy9saWJ4bWwyIENPTVBPTkVOVCBkb2N1bWVudGF0aW9uIFBBVFRFUk4gTWFrZWZpbGUuKiBFWENMVURFKQorCitjb25maWd1cmVfcGFja2FnZV9jb25maWdfZmlsZSgKKwlsaWJ4bWwyLWNvbmZpZy5jbWFrZS5jbWFrZS5pbiBsaWJ4bWwyLWNvbmZpZy5jbWFrZQorCUlOU1RBTExfREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vY21ha2UvbGlieG1sMi0ke1BST0pFQ1RfVkVSU0lPTn0KKykKKworaW5zdGFsbCgKKwlGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlieG1sMi1jb25maWcuY21ha2UKKwlERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfS9jbWFrZS9saWJ4bWwyLSR7UFJPSkVDVF9WRVJTSU9OfQorCUNPTVBPTkVOVCBkZXZlbG9wbWVudAorKQorCit3cml0ZV9iYXNpY19wYWNrYWdlX3ZlcnNpb25fZmlsZSgKKwkke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlieG1sMi1jb25maWctdmVyc2lvbi5jbWFrZQorCVZFUlNJT04gJHtQUk9KRUNUX1ZFUlNJT059CisJQ09NUEFUSUJJTElUWSBFeGFjdFZlcnNpb24KKykKKworaW5zdGFsbCgKKwlGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlieG1sMi1jb25maWctdmVyc2lvbi5jbWFrZQorCURFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L2NtYWtlL2xpYnhtbDItJHtQUk9KRUNUX1ZFUlNJT059CisJQ09NUE9ORU5UIGRldmVsb3BtZW50CispCisKK2luc3RhbGwoCisJRVhQT1JUIExpYlhtbDIKKwlERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfS9jbWFrZS9saWJ4bWwyLSR7UFJPSkVDVF9WRVJTSU9OfQorCU5BTUVTUEFDRSBMaWJYbWwyOjoKKwlGSUxFIGxpYnhtbDItZXhwb3J0LmNtYWtlCisJQ09NUE9ORU5UIGRldmVsb3BtZW50CispCisKK2NvbmZpZ3VyZV9maWxlKGluY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaC5pbiBsaWJ4bWwveG1sdmVyc2lvbi5oKQoraW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlieG1sL3htbHZlcnNpb24uaCBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfSU5DTFVERURJUn0vbGlieG1sMi9saWJ4bWwgQ09NUE9ORU5UIGRldmVsb3BtZW50KQorCitpZihNU1ZDKQorCWNvbmZpZ3VyZV9maWxlKGluY2x1ZGUvbGlieG1sL3htbHdpbjMydmVyc2lvbi5oLmluIGxpYnhtbC94bWx3aW4zMnZlcnNpb24uaCkKKwlpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJ4bWwveG1sd2luMzJ2ZXJzaW9uLmggREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9L2xpYnhtbDIvbGlieG1sIENPTVBPTkVOVCBkZXZlbG9wbWVudCkKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX1BZVEhPTikKKwlzZXQocHJlZml4ICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCisJY29uZmlndXJlX2ZpbGUocHl0aG9uL3NldHVwLnB5LmluIHNldHVwLnB5IEBPTkxZKQorZW5kaWYoKQorCitzZXQoWE1MX0lOQ0xVREVESVIgIi1JXCR7aW5jbHVkZWRpcn0vbGlieG1sMiIpCitzZXQoWE1MX0xJQkRJUiAiLUxcJHtsaWJkaXJ9IikKK3NldChYTUxfTElCUyAiLWx4bWwyIikKK3NldChYTUxfUFJJVkFURV9MSUJTICIke1pfTElCU30gJHtMWk1BX0xJQlN9ICR7VEhSRUFEX0xJQlN9ICR7SUNPTlZfTElCU30gJHtJQ1VfTElCU30gJHtNX0xJQlN9IikKKworZmlsZShSRUxBVElWRV9QQVRIIFBBQ0tBR0VfUkVMQVRJVkVfUEFUSCAiJHtDTUFLRV9JTlNUQUxMX0ZVTExfTElCRElSfS9wa2djb25maWciICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiLyQiICIiIFBBQ0tBR0VfUkVMQVRJVkVfUEFUSCAiJHtQQUNLQUdFX1JFTEFUSVZFX1BBVEh9IikKKworc2V0KHByZWZpeCAiXCR7cGNmaWxlZGlyfS8ke1BBQ0tBR0VfUkVMQVRJVkVfUEFUSH0iKQorc2V0KGV4ZWNfcHJlZml4ICJcJHtwcmVmaXh9IikKK3NldChsaWJkaXIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0iKQorc2V0KGluY2x1ZGVkaXIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9IikKK2NvbmZpZ3VyZV9maWxlKGxpYnhtbC0yLjAucGMuaW4gbGlieG1sLTIuMC5wYyBAT05MWSkKK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnhtbC0yLjAucGMgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vcGtnY29uZmlnIENPTVBPTkVOVCBkZXZlbG9wbWVudCkKKworc2V0KHByZWZpeCAiXCQoY2QgXCJcJChkaXJuYW1lIFwiXCQwXCIpXCI7IHB3ZCAtUCkvLi4iKQorY29uZmlndXJlX2ZpbGUoeG1sMi1jb25maWcuaW4geG1sMi1jb25maWcgQE9OTFkpCitpbnN0YWxsKFBST0dSQU1TICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS94bWwyLWNvbmZpZyBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfQklORElSfSBDT01QT05FTlQgZGV2ZWxvcG1lbnQpCisKK3NldChYTUxfSU5DTFVERURJUiAiLUkke0NNQUtFX0lOU1RBTExfRlVMTF9JTkNMVURFRElSfS9saWJ4bWwyIikKK3NldChYTUxfTElCRElSICItTCR7Q01BS0VfSU5TVEFMTF9GVUxMX0xJQkRJUn0iKQorY29uZmlndXJlX2ZpbGUoeG1sMkNvbmYuc2guaW4geG1sMkNvbmYuc2ggQE9OTFkpCitpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS94bWwyQ29uZi5zaCBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSBDT01QT05FTlQgZGV2ZWxvcG1lbnQpCisKK3NldChDUEFDS19DT01QT05FTlRfREVWRUxPUE1FTlRfREVQRU5EUyBydW50aW1lKQorc2V0KENQQUNLX0NPTVBPTkVOVF9QUk9HUkFNU19ERVBFTkRTIHJ1bnRpbWUpCitzZXQoQ1BBQ0tfREVCX0NPTVBPTkVOVF9JTlNUQUxMIE9OKQorc2V0KENQQUNLX0RFQklBTl9ERVZFTE9QTUVOVF9QQUNLQUdFX0RFUEVORFMgIiR7UEFDS0FHRV9UQVJOQU1FfSIpCitzZXQoQ1BBQ0tfREVCSUFOX0RFVkVMT1BNRU5UX1BBQ0tBR0VfTkFNRSAiJHtQQUNLQUdFX1RBUk5BTUV9LWRldiIpCitzZXQoQ1BBQ0tfREVCSUFOX0RFVkVMT1BNRU5UX1BBQ0tBR0VfU0VDVElPTiAibGliZGV2ZWwiKQorc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX0hPTUVQQUdFICR7UEFDS0FHRV9VUkx9KQorc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX05BTUUgJHtQQUNLQUdFX1RBUk5BTUV9KQorc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX1NFQ1RJT04gImRldmVsIikKK3NldChDUEFDS19ERUJJQU5fUFJPR1JBTVNfUEFDS0FHRV9ERVBFTkRTICIke1BBQ0tBR0VfVEFSTkFNRX0iKQorc2V0KENQQUNLX0RFQklBTl9QUk9HUkFNU19QQUNLQUdFX05BTUUgIiR7UEFDS0FHRV9UQVJOQU1FfS11dGlscyIpCitzZXQoQ1BBQ0tfREVCSUFOX1BST0dSQU1TX1BBQ0tBR0VfU0VDVElPTiAidXRpbHMiKQorc2V0KENQQUNLX0RFQklBTl9SVU5USU1FX1BBQ0tBR0VfTkFNRSAke1BBQ0tBR0VfVEFSTkFNRX0pCitzZXQoQ1BBQ0tfREVCSUFOX1JVTlRJTUVfUEFDS0FHRV9SRUNPTU1FTkRTICIke1BBQ0tBR0VfVEFSTkFNRX0tdXRpbHMiKQorc2V0KENQQUNLX0RFQklBTl9SVU5USU1FX1BBQ0tBR0VfU0VDVElPTiAibGlicyIpCitzZXQoQ1BBQ0tfTlNJU19QQUNLQUdFX05BTUUgJHtQQUNLQUdFX1NUUklOR30pCitzZXQoQ1BBQ0tfTlNJU19VUkxfSU5GT19BQk9VVCAke1BBQ0tBR0VfVVJMfSkKK3NldChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgJHtQQUNLQUdFX0JVR1JFUE9SVH0pCitzZXQoQ1BBQ0tfUEFDS0FHRV9ESVNQTEFZX05BTUUgJHtQQUNLQUdFX1NUUklOR30pCitzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiJHtQQUNLQUdFX1RBUk5BTUV9LSR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9OQU1FICR7UEFDS0FHRV9UQVJOQU1FfSkKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059KQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NQUpPUiAke0xJQlhNTF9NQUpPUl9WRVJTSU9OfSkKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fTUlOT1IgJHtMSUJYTUxfTUlOT1JfVkVSU0lPTn0pCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX1BBVENIICR7TElCWE1MX01JQ1JPX1ZFUlNJT059KQorc2V0KENQQUNLX1JFU09VUkNFX0ZJTEVfTElDRU5TRSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ29weXJpZ2h0KQorc2V0KENQQUNLX1JQTV9DT01QT05FTlRfSU5TVEFMTCBPTikKK3NldChDUEFDS19SUE1fZGV2ZWxvcG1lbnRfUEFDS0FHRV9OQU1FICIke1BBQ0tBR0VfTkFNRX0tZGV2ZWwiKQorc2V0KENQQUNLX1JQTV9kZXZlbG9wbWVudF9QQUNLQUdFX1JFUVVJUkVTICIke1BBQ0tBR0VfTkFNRX0iKQorc2V0KENQQUNLX1JQTV9QQUNLQUdFX0dST1VQICJEZXZlbG9wbWVudC9MaWJyYXJpZXMiKQorc2V0KENQQUNLX1JQTV9QQUNLQUdFX05BTUUgJHtQQUNLQUdFX1RBUk5BTUV9KQorc2V0KENQQUNLX1JQTV9QQUNLQUdFX1VSTCAke1BBQ0tBR0VfVVJMfSkKK3NldChDUEFDS19SUE1fcHJvZ3JhbXNfUEFDS0FHRV9OQU1FICIke1BBQ0tBR0VfTkFNRX0tdXRpbHMiKQorc2V0KENQQUNLX1JQTV9wcm9ncmFtc19QQUNLQUdFX1JFUVVJUkVTICIke1BBQ0tBR0VfTkFNRX0iKQorc2V0KENQQUNLX1JQTV9ydW50aW1lX1BBQ0tBR0VfTkFNRSAiJHtQQUNLQUdFX05BTUV9IikKK3NldChDUEFDS19SUE1fcnVudGltZV9QQUNLQUdFX1NVR0dFU1RTICIke1BBQ0tBR0VfTkFNRX0tdXRpbHMiKQorCitpbmNsdWRlKENQYWNrKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9DT1BZSU5HIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjEzMTg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQgaW4gdGhlIHNvdXJjZSBjb2RlIChlLmcuIHRoZSBmaWxlcyBoYXNoLmMsCi1saXN0LmMgYW5kIHRoZSB0cmlvIGZpbGVzLCB3aGljaCBhcmUgY292ZXJlZCBieSBhIHNpbWlsYXIgbGljZW5jZSBidXQKLXdpdGggZGlmZmVyZW50IENvcHlyaWdodCBub3RpY2VzKSBhbGwgdGhlIGZpbGVzIGFyZToKLQotIENvcHlyaWdodCAoQykgMTk5OC0yMDEyIERhbmllbCBWZWlsbGFyZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVyLQotbmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVC0KLU5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL0hUTUxwYXJzZXIuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvSFRNTHBhcnNlci5jCmluZGV4IDEzMTJkZGUuLmY3NDIxMzQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvSFRNTHBhcnNlci5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvSFRNTHBhcnNlci5jCkBAIC0yOTksNyArMjk5LDcgQEAKIAogI2RlZmluZSBVUFBFUiAodG91cHBlcigqY3R4dC0+aW5wdXQtPmN1cikpCiAKLSNkZWZpbmUgU0tJUCh2YWwpIGN0eHQtPm5iQ2hhcnMgKz0gKHZhbCksY3R4dC0+aW5wdXQtPmN1ciArPSAodmFsKSxjdHh0LT5pbnB1dC0+Y29sKz0odmFsKQorI2RlZmluZSBTS0lQKHZhbCkgY3R4dC0+aW5wdXQtPmN1ciArPSAodmFsKSxjdHh0LT5pbnB1dC0+Y29sKz0odmFsKQogCiAjZGVmaW5lIE5YVCh2YWwpIGN0eHQtPmlucHV0LT5jdXJbKHZhbCldCiAKQEAgLTMzMyw3ICszMzMsNyBAQAogICAgIGlmICgqKGN0eHQtPmlucHV0LT5jdXIpID09ICdcbicpIHsJCQkJCVwKIAljdHh0LT5pbnB1dC0+bGluZSsrOyBjdHh0LT5pbnB1dC0+Y29sID0gMTsJCQlcCiAgICAgfSBlbHNlIGN0eHQtPmlucHV0LT5jb2wrKzsJCQkJCQlcCi0gICAgY3R4dC0+dG9rZW4gPSAwOyBjdHh0LT5pbnB1dC0+Y3VyICs9IGw7IGN0eHQtPm5iQ2hhcnMrKzsJCVwKKyAgICBjdHh0LT50b2tlbiA9IDA7IGN0eHQtPmlucHV0LT5jdXIgKz0gbDsJCQkJXAogICB9IHdoaWxlICgwKQogCiAvKioqKioqKioqKioqCkBAIC00MTcsNiArNDE3LDEwIEBACiAKIHN0YXRpYyBpbnQKIGh0bWxDdXJyZW50Q2hhcih4bWxQYXJzZXJDdHh0UHRyIGN0eHQsIGludCAqbGVuKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3VyOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICB1bnNpZ25lZCBpbnQgdmFsOworCiAgICAgaWYgKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9FT0YpCiAJcmV0dXJuKDApOwogCkBAIC00MjQsOTkgKzQyOCwyOSBAQAogCSpsZW4gPSAwOwogCXJldHVybihjdHh0LT50b2tlbik7CiAgICAgfQotICAgIGlmIChjdHh0LT5jaGFyc2V0ID09IFhNTF9DSEFSX0VOQ09ESU5HX1VURjgpIHsKLQkvKgotCSAqIFdlIGFyZSBzdXBwb3NlZCB0byBoYW5kbGUgVVRGOCwgY2hlY2sgaXQncyB2YWxpZAotCSAqIEZyb20gcmZjMjA0NDogZW5jb2Rpbmcgb2YgdGhlIFVuaWNvZGUgdmFsdWVzIG9uIFVURi04OgotCSAqCi0JICogVUNTLTQgcmFuZ2UgKGhleC4pICAgICAgICAgICBVVEYtOCBvY3RldCBzZXF1ZW5jZSAoYmluYXJ5KQotCSAqIDAwMDAgMDAwMC0wMDAwIDAwN0YgICAweHh4eHh4eAotCSAqIDAwMDAgMDA4MC0wMDAwIDA3RkYgICAxMTB4eHh4eCAxMHh4eHh4eAotCSAqIDAwMDAgMDgwMC0wMDAwIEZGRkYgICAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotCSAqCi0JICogQ2hlY2sgZm9yIHRoZSAweDExMDAwMCBsaW1pdCB0b28KLQkgKi8KLQljb25zdCB1bnNpZ25lZCBjaGFyICpjdXIgPSBjdHh0LT5pbnB1dC0+Y3VyOwotCXVuc2lnbmVkIGNoYXIgYzsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JYyA9ICpjdXI7Ci0JaWYgKGMgJiAweDgwKSB7Ci0JICAgIGlmIChjdXJbMV0gPT0gMCkgewotCQl4bWxQYXJzZXJJbnB1dEdyb3coY3R4dC0+aW5wdXQsIElOUFVUX0NIVU5LKTsKLSAgICAgICAgICAgICAgICBjdXIgPSBjdHh0LT5pbnB1dC0+Y3VyOwotICAgICAgICAgICAgfQotCSAgICBpZiAoKGN1clsxXSAmIDB4YzApICE9IDB4ODApCi0JCWdvdG8gZW5jb2RpbmdfZXJyb3I7Ci0JICAgIGlmICgoYyAmIDB4ZTApID09IDB4ZTApIHsKLQotCQlpZiAoY3VyWzJdID09IDApIHsKLQkJICAgIHhtbFBhcnNlcklucHV0R3JvdyhjdHh0LT5pbnB1dCwgSU5QVVRfQ0hVTkspOwotICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdHh0LT5pbnB1dC0+Y3VyOwotICAgICAgICAgICAgICAgIH0KLQkJaWYgKChjdXJbMl0gJiAweGMwKSAhPSAweDgwKQotCQkgICAgZ290byBlbmNvZGluZ19lcnJvcjsKLQkJaWYgKChjICYgMHhmMCkgPT0gMHhmMCkgewotCQkgICAgaWYgKGN1clszXSA9PSAwKSB7Ci0JCQl4bWxQYXJzZXJJbnB1dEdyb3coY3R4dC0+aW5wdXQsIElOUFVUX0NIVU5LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1ciA9IGN0eHQtPmlucHV0LT5jdXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJICAgIGlmICgoKGMgJiAweGY4KSAhPSAweGYwKSB8fAotCQkJKChjdXJbM10gJiAweGMwKSAhPSAweDgwKSkKLQkJCWdvdG8gZW5jb2RpbmdfZXJyb3I7Ci0JCSAgICAvKiA0LWJ5dGUgY29kZSAqLwotCQkgICAgKmxlbiA9IDQ7Ci0JCSAgICB2YWwgPSAoY3VyWzBdICYgMHg3KSA8PCAxODsKLQkJICAgIHZhbCB8PSAoY3VyWzFdICYgMHgzZikgPDwgMTI7Ci0JCSAgICB2YWwgfD0gKGN1clsyXSAmIDB4M2YpIDw8IDY7Ci0JCSAgICB2YWwgfD0gY3VyWzNdICYgMHgzZjsKLQkJfSBlbHNlIHsKLQkJICAvKiAzLWJ5dGUgY29kZSAqLwotCQkgICAgKmxlbiA9IDM7Ci0JCSAgICB2YWwgPSAoY3VyWzBdICYgMHhmKSA8PCAxMjsKLQkJICAgIHZhbCB8PSAoY3VyWzFdICYgMHgzZikgPDwgNjsKLQkJICAgIHZhbCB8PSBjdXJbMl0gJiAweDNmOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgLyogMi1ieXRlIGNvZGUgKi8KLQkJKmxlbiA9IDI7Ci0JCXZhbCA9IChjdXJbMF0gJiAweDFmKSA8PCA2OwotCQl2YWwgfD0gY3VyWzFdICYgMHgzZjsKLQkgICAgfQotCSAgICBpZiAoIUlTX0NIQVIodmFsKSkgewotCSAgICAgICAgaHRtbFBhcnNlRXJySW50KGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAotCQkJCSJDaGFyIDB4JVggb3V0IG9mIGFsbG93ZWQgcmFuZ2VcbiIsIHZhbCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuKHZhbCk7Ci0JfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoKmN0eHQtPmlucHV0LT5jdXIgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAoY3R4dC0+aW5wdXQtPmN1ciA8IGN0eHQtPmlucHV0LT5lbmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0bWxQYXJzZUVyckludChjdHh0LCBYTUxfRVJSX0lOVkFMSURfQ0hBUiwKLQkJCQkiQ2hhciAweCVYIG91dCBvZiBhbGxvd2VkIHJhbmdlXG4iLCAwKTsKLSAgICAgICAgICAgICAgICAqbGVuID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm4oJyAnKTsKLSAgICAgICAgICAgIH0KLQkgICAgLyogMS1ieXRlIGNvZGUgKi8KLQkgICAgKmxlbiA9IDE7Ci0JICAgIHJldHVybigoaW50KSAqY3R4dC0+aW5wdXQtPmN1cik7Ci0JfQotICAgIH0KLSAgICAvKgotICAgICAqIEFzc3VtZSBpdCdzIGEgZml4ZWQgbGVuZ3RoIGVuY29kaW5nICgxKSB3aXRoCi0gICAgICogYSBjb21wYXRpYmxlIGVuY29kaW5nIGZvciB0aGUgQVNDSUkgc2V0LCBzaW5jZQotICAgICAqIFhNTCBjb25zdHJ1Y3RzIG9ubHkgdXNlIDwgMTI4IGNoYXJzCi0gICAgICovCi0gICAgKmxlbiA9IDE7Ci0gICAgaWYgKChpbnQpICpjdHh0LT5pbnB1dC0+Y3VyIDwgMHg4MCkKLQlyZXR1cm4oKGludCkgKmN0eHQtPmlucHV0LT5jdXIpOwotCi0gICAgLyoKLSAgICAgKiBIdW1tIHRoaXMgaXMgYmFkLCBkbyBhbiBhdXRvbWF0aWMgZmxvdyBjb252ZXJzaW9uCi0gICAgICovCi0gICAgeworICAgIGlmIChjdHh0LT5jaGFyc2V0ICE9IFhNTF9DSEFSX0VOQ09ESU5HX1VURjgpIHsKICAgICAgICAgeG1sQ2hhciAqIGd1ZXNzOwogICAgICAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGhhbmRsZXI7CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIGl0J3MgYSBmaXhlZCBsZW5ndGggZW5jb2RpbmcgKDEpIHdpdGgKKyAgICAgICAgICogYSBjb21wYXRpYmxlIGVuY29kaW5nIGZvciB0aGUgQVNDSUkgc2V0LCBzaW5jZQorICAgICAgICAgKiBIVE1MIGNvbnN0cnVjdHMgb25seSB1c2UgPCAxMjggY2hhcnMKKyAgICAgICAgICovCisgICAgICAgIGlmICgoaW50KSAqY3R4dC0+aW5wdXQtPmN1ciA8IDB4ODApIHsKKyAgICAgICAgICAgICpsZW4gPSAxOworICAgICAgICAgICAgaWYgKCgqY3R4dC0+aW5wdXQtPmN1ciA9PSAwKSAmJgorICAgICAgICAgICAgICAgIChjdHh0LT5pbnB1dC0+Y3VyIDwgY3R4dC0+aW5wdXQtPmVuZCkpIHsKKyAgICAgICAgICAgICAgICBodG1sUGFyc2VFcnJJbnQoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFyIDB4JVggb3V0IG9mIGFsbG93ZWQgcmFuZ2VcbiIsIDApOworICAgICAgICAgICAgICAgIHJldHVybignICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKChpbnQpICpjdHh0LT5pbnB1dC0+Y3VyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEh1bW0gdGhpcyBpcyBiYWQsIGRvIGFuIGF1dG9tYXRpYyBmbG93IGNvbnZlcnNpb24KKyAgICAgICAgICovCiAgICAgICAgIGd1ZXNzID0gaHRtbEZpbmRFbmNvZGluZyhjdHh0KTsKICAgICAgICAgaWYgKGd1ZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgIHhtbFN3aXRjaEVuY29kaW5nKGN0eHQsIFhNTF9DSEFSX0VOQ09ESU5HXzg4NTlfMSk7CkBAIC01MjYsNyArNDYwLDEyIEBACiAgICAgICAgICAgICBjdHh0LT5pbnB1dC0+ZW5jb2RpbmcgPSBndWVzczsKICAgICAgICAgICAgIGhhbmRsZXIgPSB4bWxGaW5kQ2hhckVuY29kaW5nSGFuZGxlcigoY29uc3QgY2hhciAqKSBndWVzcyk7CiAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgeG1sU3dpdGNoVG9FbmNvZGluZyhjdHh0LCBoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIERvbid0IHVzZSBVVEYtOCBlbmNvZGVyIHdoaWNoIGlzbid0IHJlcXVpcmVkIGFuZAorICAgICAgICAgICAgICAgICAqIGNhbiBwcm9kdWNlIGludmFsaWQgVVRGLTguCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJFcXVhbChCQURfQ0FTVCBoYW5kbGVyLT5uYW1lLCBCQURfQ0FTVCAiVVRGLTgiKSkKKyAgICAgICAgICAgICAgICAgICAgeG1sU3dpdGNoVG9FbmNvZGluZyhjdHh0LCBoYW5kbGVyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9FTkNPRElORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGVuY29kaW5nICVzIiwgZ3Vlc3MsIE5VTEwpOwpAQCAtNTM1LDcgKzQ3NCw4NiBAQAogICAgICAgICBjdHh0LT5jaGFyc2V0ID0gWE1MX0NIQVJfRU5DT0RJTkdfVVRGODsKICAgICB9CiAKLSAgICByZXR1cm4oeG1sQ3VycmVudENoYXIoY3R4dCwgbGVuKSk7CisgICAgLyoKKyAgICAgKiBXZSBhcmUgc3VwcG9zZWQgdG8gaGFuZGxlIFVURjgsIGNoZWNrIGl0J3MgdmFsaWQKKyAgICAgKiBGcm9tIHJmYzIwNDQ6IGVuY29kaW5nIG9mIHRoZSBVbmljb2RlIHZhbHVlcyBvbiBVVEYtODoKKyAgICAgKgorICAgICAqIFVDUy00IHJhbmdlIChoZXguKSAgICAgICAgICAgVVRGLTggb2N0ZXQgc2VxdWVuY2UgKGJpbmFyeSkKKyAgICAgKiAwMDAwIDAwMDAtMDAwMCAwMDdGICAgMHh4eHh4eHgKKyAgICAgKiAwMDAwIDAwODAtMDAwMCAwN0ZGICAgMTEweHh4eHggMTB4eHh4eHgKKyAgICAgKiAwMDAwIDA4MDAtMDAwMCBGRkZGICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKyAgICAgKgorICAgICAqIENoZWNrIGZvciB0aGUgMHgxMTAwMDAgbGltaXQgdG9vCisgICAgICovCisgICAgY3VyID0gY3R4dC0+aW5wdXQtPmN1cjsKKyAgICBjID0gKmN1cjsKKyAgICBpZiAoYyAmIDB4ODApIHsKKyAgICAgICAgaWYgKChjICYgMHg0MCkgPT0gMCkKKyAgICAgICAgICAgIGdvdG8gZW5jb2RpbmdfZXJyb3I7CisgICAgICAgIGlmIChjdXJbMV0gPT0gMCkgeworICAgICAgICAgICAgeG1sUGFyc2VySW5wdXRHcm93KGN0eHQtPmlucHV0LCBJTlBVVF9DSFVOSyk7CisgICAgICAgICAgICBjdXIgPSBjdHh0LT5pbnB1dC0+Y3VyOworICAgICAgICB9CisgICAgICAgIGlmICgoY3VyWzFdICYgMHhjMCkgIT0gMHg4MCkKKyAgICAgICAgICAgIGdvdG8gZW5jb2RpbmdfZXJyb3I7CisgICAgICAgIGlmICgoYyAmIDB4ZTApID09IDB4ZTApIHsKKworICAgICAgICAgICAgaWYgKGN1clsyXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgeG1sUGFyc2VySW5wdXRHcm93KGN0eHQtPmlucHV0LCBJTlBVVF9DSFVOSyk7CisgICAgICAgICAgICAgICAgY3VyID0gY3R4dC0+aW5wdXQtPmN1cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY3VyWzJdICYgMHhjMCkgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuY29kaW5nX2Vycm9yOworICAgICAgICAgICAgaWYgKChjICYgMHhmMCkgPT0gMHhmMCkgeworICAgICAgICAgICAgICAgIGlmIChjdXJbM10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB4bWxQYXJzZXJJbnB1dEdyb3coY3R4dC0+aW5wdXQsIElOUFVUX0NIVU5LKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyID0gY3R4dC0+aW5wdXQtPmN1cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgoYyAmIDB4ZjgpICE9IDB4ZjApIHx8CisgICAgICAgICAgICAgICAgICAgICgoY3VyWzNdICYgMHhjMCkgIT0gMHg4MCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5jb2RpbmdfZXJyb3I7CisgICAgICAgICAgICAgICAgLyogNC1ieXRlIGNvZGUgKi8KKyAgICAgICAgICAgICAgICAqbGVuID0gNDsKKyAgICAgICAgICAgICAgICB2YWwgPSAoY3VyWzBdICYgMHg3KSA8PCAxODsKKyAgICAgICAgICAgICAgICB2YWwgfD0gKGN1clsxXSAmIDB4M2YpIDw8IDEyOworICAgICAgICAgICAgICAgIHZhbCB8PSAoY3VyWzJdICYgMHgzZikgPDwgNjsKKyAgICAgICAgICAgICAgICB2YWwgfD0gY3VyWzNdICYgMHgzZjsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDwgMHgxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmNvZGluZ19lcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIDMtYnl0ZSBjb2RlICovCisgICAgICAgICAgICAgICAgKmxlbiA9IDM7CisgICAgICAgICAgICAgICAgdmFsID0gKGN1clswXSAmIDB4ZikgPDwgMTI7CisgICAgICAgICAgICAgICAgdmFsIHw9IChjdXJbMV0gJiAweDNmKSA8PCA2OworICAgICAgICAgICAgICAgIHZhbCB8PSBjdXJbMl0gJiAweDNmOworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAweDgwMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmNvZGluZ19lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiAyLWJ5dGUgY29kZSAqLworICAgICAgICAgICAgKmxlbiA9IDI7CisgICAgICAgICAgICB2YWwgPSAoY3VyWzBdICYgMHgxZikgPDwgNjsKKyAgICAgICAgICAgIHZhbCB8PSBjdXJbMV0gJiAweDNmOworICAgICAgICAgICAgaWYgKHZhbCA8IDB4ODApCisgICAgICAgICAgICAgICAgZ290byBlbmNvZGluZ19lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUlTX0NIQVIodmFsKSkgeworICAgICAgICAgICAgaHRtbFBhcnNlRXJySW50KGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFyIDB4JVggb3V0IG9mIGFsbG93ZWQgcmFuZ2VcbiIsIHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCgqY3R4dC0+aW5wdXQtPmN1ciA9PSAwKSAmJgorICAgICAgICAgICAgKGN0eHQtPmlucHV0LT5jdXIgPCBjdHh0LT5pbnB1dC0+ZW5kKSkgeworICAgICAgICAgICAgaHRtbFBhcnNlRXJySW50KGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFyIDB4JVggb3V0IG9mIGFsbG93ZWQgcmFuZ2VcbiIsIDApOworICAgICAgICAgICAgKmxlbiA9IDE7CisgICAgICAgICAgICByZXR1cm4oJyAnKTsKKyAgICAgICAgfQorICAgICAgICAvKiAxLWJ5dGUgY29kZSAqLworICAgICAgICAqbGVuID0gMTsKKyAgICAgICAgcmV0dXJuKChpbnQpICpjdHh0LT5pbnB1dC0+Y3VyKTsKKyAgICB9CiAKIGVuY29kaW5nX2Vycm9yOgogICAgIC8qCkBAIC01NjAsNyArNTc4LDE2IEBACiAJCSAgICAgQkFEX0NBU1QgYnVmZmVyLCBOVUxMKTsKICAgICB9CiAKLSAgICBjdHh0LT5jaGFyc2V0ID0gWE1MX0NIQVJfRU5DT0RJTkdfODg1OV8xOworICAgIC8qCisgICAgICogRG9uJ3Qgc3dpdGNoIGVuY29kaW5ncyB0d2ljZS4gTm90ZSB0aGF0IGlmIHRoZXJlJ3MgYW4gZW5jb2Rlciwgd2UKKyAgICAgKiBzaG91bGRuJ3QgcmVjZWl2ZSBpbnZhbGlkIFVURi04IGFueXdheS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBpZiBjdHh0LT5pbnB1dC0+YnVmID09IE5VTEwsIHN3aXRjaGluZyBlbmNvZGluZ3MgaXMKKyAgICAgKiBpbXBvc3NpYmxlLCBzZWUgR2l0bGFiIGlzc3VlICMzNC4KKyAgICAgKi8KKyAgICBpZiAoKGN0eHQtPmlucHV0LT5idWYgIT0gTlVMTCkgJiYKKyAgICAgICAgKGN0eHQtPmlucHV0LT5idWYtPmVuY29kZXIgPT0gTlVMTCkpCisgICAgICAgIHhtbFN3aXRjaEVuY29kaW5nKGN0eHQsIFhNTF9DSEFSX0VOQ09ESU5HXzg4NTlfMSk7CiAgICAgKmxlbiA9IDE7CiAgICAgcmV0dXJuKChpbnQpICpjdHh0LT5pbnB1dC0+Y3VyKTsKIH0KQEAgLTU4Nyw3ICs2MTQsNiBAQAogCQljdHh0LT5pbnB1dC0+bGluZSsrOyBjdHh0LT5pbnB1dC0+Y29sID0gMTsKIAkgICAgfSBlbHNlIGN0eHQtPmlucHV0LT5jb2wrKzsKIAkgICAgY3R4dC0+aW5wdXQtPmN1cisrOwotCSAgICBjdHh0LT5uYkNoYXJzKys7CiAJICAgIGlmICgqY3R4dC0+aW5wdXQtPmN1ciA9PSAwKQogCQl4bWxQYXJzZXJJbnB1dEdyb3coY3R4dC0+aW5wdXQsIElOUFVUX0NIVU5LKTsKIAl9CkBAIC0xMDQ5LDEwMiArMTA3NSwyNjYgQEAKIH0KIH07CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpvbGRUYWc7CisgICAgY29uc3QgY2hhciAqbmV3VGFnOworfSBodG1sU3RhcnRDbG9zZUVudHJ5OworCiAvKgogICogc3RhcnQgdGFncyB0aGF0IGltcGx5IHRoZSBlbmQgb2YgY3VycmVudCBlbGVtZW50CiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHRtbFN0YXJ0Q2xvc2VbXSA9IHsKLSJmb3JtIiwJCSJmb3JtIiwgInAiLCAiaHIiLCAiaDEiLCAiaDIiLCAiaDMiLCAiaDQiLCAiaDUiLCAiaDYiLAotCQkiZGwiLCAidWwiLCAib2wiLCAibWVudSIsICJkaXIiLCAiYWRkcmVzcyIsICJwcmUiLAotCQkibGlzdGluZyIsICJ4bXAiLCAiaGVhZCIsIE5VTEwsCi0iaGVhZCIsCQkicCIsIE5VTEwsCi0idGl0bGUiLAkicCIsIE5VTEwsCi0iYm9keSIsCQkiaGVhZCIsICJzdHlsZSIsICJsaW5rIiwgInRpdGxlIiwgInAiLCBOVUxMLAotImZyYW1lc2V0IiwJImhlYWQiLCAic3R5bGUiLCAibGluayIsICJ0aXRsZSIsICJwIiwgTlVMTCwKLSJsaSIsCQkicCIsICJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiIsICJkbCIsICJhZGRyZXNzIiwKLQkJInByZSIsICJsaXN0aW5nIiwgInhtcCIsICJoZWFkIiwgImxpIiwgTlVMTCwKLSJociIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJoMSIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJoMiIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJoMyIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJoNCIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJoNSIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJoNiIsCQkicCIsICJoZWFkIiwgTlVMTCwKLSJkaXIiLAkJInAiLCAiaGVhZCIsIE5VTEwsCi0iYWRkcmVzcyIsCSJwIiwgImhlYWQiLCAidWwiLCBOVUxMLAotInByZSIsCQkicCIsICJoZWFkIiwgInVsIiwgTlVMTCwKLSJsaXN0aW5nIiwJInAiLCAiaGVhZCIsIE5VTEwsCi0ieG1wIiwJCSJwIiwgImhlYWQiLCBOVUxMLAotImJsb2NrcXVvdGUiLAkicCIsICJoZWFkIiwgTlVMTCwKLSJkbCIsCQkicCIsICJkdCIsICJtZW51IiwgImRpciIsICJhZGRyZXNzIiwgInByZSIsICJsaXN0aW5nIiwKLQkJInhtcCIsICJoZWFkIiwgTlVMTCwKLSJkdCIsCQkicCIsICJtZW51IiwgImRpciIsICJhZGRyZXNzIiwgInByZSIsICJsaXN0aW5nIiwgInhtcCIsCi0gICAgICAgICAgICAgICAgImhlYWQiLCAiZGQiLCBOVUxMLAotImRkIiwJCSJwIiwgIm1lbnUiLCAiZGlyIiwgImFkZHJlc3MiLCAicHJlIiwgImxpc3RpbmciLCAieG1wIiwKLSAgICAgICAgICAgICAgICAiaGVhZCIsICJkdCIsIE5VTEwsCi0idWwiLAkJInAiLCAiaGVhZCIsICJvbCIsICJtZW51IiwgImRpciIsICJhZGRyZXNzIiwgInByZSIsCi0JCSJsaXN0aW5nIiwgInhtcCIsIE5VTEwsCi0ib2wiLAkJInAiLCAiaGVhZCIsICJ1bCIsIE5VTEwsCi0ibWVudSIsCQkicCIsICJoZWFkIiwgInVsIiwgTlVMTCwKLSJwIiwJCSJwIiwgImhlYWQiLCAiaDEiLCAiaDIiLCAiaDMiLCAiaDQiLCAiaDUiLCAiaDYiLCBGT05UU1RZTEUsIE5VTEwsCi0iZGl2IiwJCSJwIiwgImhlYWQiLCBOVUxMLAotIm5vc2NyaXB0IiwJInNjcmlwdCIsIE5VTEwsCi0iY2VudGVyIiwJImZvbnQiLCAiYiIsICJpIiwgInAiLCAiaGVhZCIsIE5VTEwsCi0iYSIsCQkiYSIsICJoZWFkIiwgTlVMTCwKLSJjYXB0aW9uIiwJInAiLCBOVUxMLAotImNvbGdyb3VwIiwJImNhcHRpb24iLCAiY29sZ3JvdXAiLCAiY29sIiwgInAiLCBOVUxMLAotImNvbCIsCQkiY2FwdGlvbiIsICJjb2wiLCAicCIsIE5VTEwsCi0idGFibGUiLAkicCIsICJoZWFkIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwgInByZSIsCi0JCSJsaXN0aW5nIiwgInhtcCIsICJhIiwgTlVMTCwKLSJ0aCIsCQkidGgiLCAidGQiLCAicCIsICJzcGFuIiwgImZvbnQiLCAiYSIsICJiIiwgImkiLCAidSIsIE5VTEwsCi0idGQiLAkJInRoIiwgInRkIiwgInAiLCAic3BhbiIsICJmb250IiwgImEiLCAiYiIsICJpIiwgInUiLCBOVUxMLAotInRyIiwJCSJ0aCIsICJ0ZCIsICJ0ciIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJwIiwgTlVMTCwKLSJ0aGVhZCIsCSJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsIE5VTEwsCi0idGZvb3QiLAkidGgiLCAidGQiLCAidHIiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGhlYWQiLAotCQkidGJvZHkiLCAicCIsIE5VTEwsCi0idGJvZHkiLAkidGgiLCAidGQiLCAidHIiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGhlYWQiLAotCQkidGZvb3QiLCAidGJvZHkiLCAicCIsIE5VTEwsCi0ib3B0Z3JvdXAiLAkib3B0aW9uIiwgTlVMTCwKLSJvcHRpb24iLAkib3B0aW9uIiwgTlVMTCwKLSJmaWVsZHNldCIsCSJsZWdlbmQiLCAicCIsICJoZWFkIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwKLQkJInByZSIsICJsaXN0aW5nIiwgInhtcCIsICJhIiwgTlVMTCwKLS8qIG1vc3QgdGFncyBpbiBpbiBGT05UU1RZTEUsIFBIUkFTRSBhbmQgU1BFQ0lBTCBzaG91bGQgY2xvc2UgPGhlYWQ+ICovCi0idHQiLAkJImhlYWQiLCBOVUxMLAotImkiLAkJImhlYWQiLCBOVUxMLAotImIiLAkJImhlYWQiLCBOVUxMLAotInUiLAkJImhlYWQiLCBOVUxMLAotInMiLAkJImhlYWQiLCBOVUxMLAotInN0cmlrZSIsCSJoZWFkIiwgTlVMTCwKLSJiaWciLAkJImhlYWQiLCBOVUxMLAotInNtYWxsIiwJImhlYWQiLCBOVUxMLAotCi0iZW0iLAkJImhlYWQiLCBOVUxMLAotInN0cm9uZyIsCSJoZWFkIiwgTlVMTCwKLSJkZm4iLAkJImhlYWQiLCBOVUxMLAotImNvZGUiLAkJImhlYWQiLCBOVUxMLAotInNhbXAiLAkJImhlYWQiLCBOVUxMLAotImtiZCIsCQkiaGVhZCIsIE5VTEwsCi0idmFyIiwJCSJoZWFkIiwgTlVMTCwKLSJjaXRlIiwJCSJoZWFkIiwgTlVMTCwKLSJhYmJyIiwJCSJoZWFkIiwgTlVMTCwKLSJhY3JvbnltIiwJImhlYWQiLCBOVUxMLAotCi0vKiAiYSIgKi8KLSJpbWciLAkJImhlYWQiLCBOVUxMLAotLyogImFwcGxldCIgKi8KLS8qICJlbWJlZCIgKi8KLS8qICJvYmplY3QiICovCi0iZm9udCIsCQkiaGVhZCIsIE5VTEwsCi0vKiAiYmFzZWZvbnQiICovCi0iYnIiLAkJImhlYWQiLCBOVUxMLAotLyogInNjcmlwdCIgKi8KLSJtYXAiLAkJImhlYWQiLCBOVUxMLAotInEiLAkJImhlYWQiLCBOVUxMLAotInN1YiIsCQkiaGVhZCIsIE5VTEwsCi0ic3VwIiwJCSJoZWFkIiwgTlVMTCwKLSJzcGFuIiwJCSJoZWFkIiwgTlVMTCwKLSJiZG8iLAkJImhlYWQiLCBOVUxMLAotImlmcmFtZSIsCSJoZWFkIiwgTlVMTCwKLU5VTEwKK3N0YXRpYyBjb25zdCBodG1sU3RhcnRDbG9zZUVudHJ5IGh0bWxTdGFydENsb3NlW10gPSB7CisgICAgeyAiYSIsICJhIiB9LAorICAgIHsgImEiLCAiZmllbGRzZXQiIH0sCisgICAgeyAiYSIsICJ0YWJsZSIgfSwKKyAgICB7ICJhIiwgInRkIiB9LAorICAgIHsgImEiLCAidGgiIH0sCisgICAgeyAiYWRkcmVzcyIsICJkZCIgfSwKKyAgICB7ICJhZGRyZXNzIiwgImRsIiB9LAorICAgIHsgImFkZHJlc3MiLCAiZHQiIH0sCisgICAgeyAiYWRkcmVzcyIsICJmb3JtIiB9LAorICAgIHsgImFkZHJlc3MiLCAibGkiIH0sCisgICAgeyAiYWRkcmVzcyIsICJ1bCIgfSwKKyAgICB7ICJiIiwgImNlbnRlciIgfSwKKyAgICB7ICJiIiwgInAiIH0sCisgICAgeyAiYiIsICJ0ZCIgfSwKKyAgICB7ICJiIiwgInRoIiB9LAorICAgIHsgImJpZyIsICJwIiB9LAorICAgIHsgImNhcHRpb24iLCAiY29sIiB9LAorICAgIHsgImNhcHRpb24iLCAiY29sZ3JvdXAiIH0sCisgICAgeyAiY2FwdGlvbiIsICJ0Ym9keSIgfSwKKyAgICB7ICJjYXB0aW9uIiwgInRmb290IiB9LAorICAgIHsgImNhcHRpb24iLCAidGhlYWQiIH0sCisgICAgeyAiY2FwdGlvbiIsICJ0ciIgfSwKKyAgICB7ICJjb2wiLCAiY29sIiB9LAorICAgIHsgImNvbCIsICJjb2xncm91cCIgfSwKKyAgICB7ICJjb2wiLCAidGJvZHkiIH0sCisgICAgeyAiY29sIiwgInRmb290IiB9LAorICAgIHsgImNvbCIsICJ0aGVhZCIgfSwKKyAgICB7ICJjb2wiLCAidHIiIH0sCisgICAgeyAiY29sZ3JvdXAiLCAiY29sZ3JvdXAiIH0sCisgICAgeyAiY29sZ3JvdXAiLCAidGJvZHkiIH0sCisgICAgeyAiY29sZ3JvdXAiLCAidGZvb3QiIH0sCisgICAgeyAiY29sZ3JvdXAiLCAidGhlYWQiIH0sCisgICAgeyAiY29sZ3JvdXAiLCAidHIiIH0sCisgICAgeyAiZGQiLCAiZHQiIH0sCisgICAgeyAiZGlyIiwgImRkIiB9LAorICAgIHsgImRpciIsICJkbCIgfSwKKyAgICB7ICJkaXIiLCAiZHQiIH0sCisgICAgeyAiZGlyIiwgImZvcm0iIH0sCisgICAgeyAiZGlyIiwgInVsIiB9LAorICAgIHsgImRsIiwgImZvcm0iIH0sCisgICAgeyAiZGwiLCAibGkiIH0sCisgICAgeyAiZHQiLCAiZGQiIH0sCisgICAgeyAiZHQiLCAiZGwiIH0sCisgICAgeyAiZm9udCIsICJjZW50ZXIiIH0sCisgICAgeyAiZm9udCIsICJ0ZCIgfSwKKyAgICB7ICJmb250IiwgInRoIiB9LAorICAgIHsgImZvcm0iLCAiZm9ybSIgfSwKKyAgICB7ICJoMSIsICJmaWVsZHNldCIgfSwKKyAgICB7ICJoMSIsICJmb3JtIiB9LAorICAgIHsgImgxIiwgImxpIiB9LAorICAgIHsgImgxIiwgInAiIH0sCisgICAgeyAiaDEiLCAidGFibGUiIH0sCisgICAgeyAiaDIiLCAiZmllbGRzZXQiIH0sCisgICAgeyAiaDIiLCAiZm9ybSIgfSwKKyAgICB7ICJoMiIsICJsaSIgfSwKKyAgICB7ICJoMiIsICJwIiB9LAorICAgIHsgImgyIiwgInRhYmxlIiB9LAorICAgIHsgImgzIiwgImZpZWxkc2V0IiB9LAorICAgIHsgImgzIiwgImZvcm0iIH0sCisgICAgeyAiaDMiLCAibGkiIH0sCisgICAgeyAiaDMiLCAicCIgfSwKKyAgICB7ICJoMyIsICJ0YWJsZSIgfSwKKyAgICB7ICJoNCIsICJmaWVsZHNldCIgfSwKKyAgICB7ICJoNCIsICJmb3JtIiB9LAorICAgIHsgImg0IiwgImxpIiB9LAorICAgIHsgImg0IiwgInAiIH0sCisgICAgeyAiaDQiLCAidGFibGUiIH0sCisgICAgeyAiaDUiLCAiZmllbGRzZXQiIH0sCisgICAgeyAiaDUiLCAiZm9ybSIgfSwKKyAgICB7ICJoNSIsICJsaSIgfSwKKyAgICB7ICJoNSIsICJwIiB9LAorICAgIHsgImg1IiwgInRhYmxlIiB9LAorICAgIHsgImg2IiwgImZpZWxkc2V0IiB9LAorICAgIHsgImg2IiwgImZvcm0iIH0sCisgICAgeyAiaDYiLCAibGkiIH0sCisgICAgeyAiaDYiLCAicCIgfSwKKyAgICB7ICJoNiIsICJ0YWJsZSIgfSwKKyAgICB7ICJoZWFkIiwgImEiIH0sCisgICAgeyAiaGVhZCIsICJhYmJyIiB9LAorICAgIHsgImhlYWQiLCAiYWNyb255bSIgfSwKKyAgICB7ICJoZWFkIiwgImFkZHJlc3MiIH0sCisgICAgeyAiaGVhZCIsICJiIiB9LAorICAgIHsgImhlYWQiLCAiYmRvIiB9LAorICAgIHsgImhlYWQiLCAiYmlnIiB9LAorICAgIHsgImhlYWQiLCAiYmxvY2txdW90ZSIgfSwKKyAgICB7ICJoZWFkIiwgImJvZHkiIH0sCisgICAgeyAiaGVhZCIsICJiciIgfSwKKyAgICB7ICJoZWFkIiwgImNlbnRlciIgfSwKKyAgICB7ICJoZWFkIiwgImNpdGUiIH0sCisgICAgeyAiaGVhZCIsICJjb2RlIiB9LAorICAgIHsgImhlYWQiLCAiZGQiIH0sCisgICAgeyAiaGVhZCIsICJkZm4iIH0sCisgICAgeyAiaGVhZCIsICJkaXIiIH0sCisgICAgeyAiaGVhZCIsICJkaXYiIH0sCisgICAgeyAiaGVhZCIsICJkbCIgfSwKKyAgICB7ICJoZWFkIiwgImR0IiB9LAorICAgIHsgImhlYWQiLCAiZW0iIH0sCisgICAgeyAiaGVhZCIsICJmaWVsZHNldCIgfSwKKyAgICB7ICJoZWFkIiwgImZvbnQiIH0sCisgICAgeyAiaGVhZCIsICJmb3JtIiB9LAorICAgIHsgImhlYWQiLCAiZnJhbWVzZXQiIH0sCisgICAgeyAiaGVhZCIsICJoMSIgfSwKKyAgICB7ICJoZWFkIiwgImgyIiB9LAorICAgIHsgImhlYWQiLCAiaDMiIH0sCisgICAgeyAiaGVhZCIsICJoNCIgfSwKKyAgICB7ICJoZWFkIiwgImg1IiB9LAorICAgIHsgImhlYWQiLCAiaDYiIH0sCisgICAgeyAiaGVhZCIsICJociIgfSwKKyAgICB7ICJoZWFkIiwgImkiIH0sCisgICAgeyAiaGVhZCIsICJpZnJhbWUiIH0sCisgICAgeyAiaGVhZCIsICJpbWciIH0sCisgICAgeyAiaGVhZCIsICJrYmQiIH0sCisgICAgeyAiaGVhZCIsICJsaSIgfSwKKyAgICB7ICJoZWFkIiwgImxpc3RpbmciIH0sCisgICAgeyAiaGVhZCIsICJtYXAiIH0sCisgICAgeyAiaGVhZCIsICJtZW51IiB9LAorICAgIHsgImhlYWQiLCAib2wiIH0sCisgICAgeyAiaGVhZCIsICJwIiB9LAorICAgIHsgImhlYWQiLCAicHJlIiB9LAorICAgIHsgImhlYWQiLCAicSIgfSwKKyAgICB7ICJoZWFkIiwgInMiIH0sCisgICAgeyAiaGVhZCIsICJzYW1wIiB9LAorICAgIHsgImhlYWQiLCAic21hbGwiIH0sCisgICAgeyAiaGVhZCIsICJzcGFuIiB9LAorICAgIHsgImhlYWQiLCAic3RyaWtlIiB9LAorICAgIHsgImhlYWQiLCAic3Ryb25nIiB9LAorICAgIHsgImhlYWQiLCAic3ViIiB9LAorICAgIHsgImhlYWQiLCAic3VwIiB9LAorICAgIHsgImhlYWQiLCAidGFibGUiIH0sCisgICAgeyAiaGVhZCIsICJ0dCIgfSwKKyAgICB7ICJoZWFkIiwgInUiIH0sCisgICAgeyAiaGVhZCIsICJ1bCIgfSwKKyAgICB7ICJoZWFkIiwgInZhciIgfSwKKyAgICB7ICJoZWFkIiwgInhtcCIgfSwKKyAgICB7ICJociIsICJmb3JtIiB9LAorICAgIHsgImkiLCAiY2VudGVyIiB9LAorICAgIHsgImkiLCAicCIgfSwKKyAgICB7ICJpIiwgInRkIiB9LAorICAgIHsgImkiLCAidGgiIH0sCisgICAgeyAibGVnZW5kIiwgImZpZWxkc2V0IiB9LAorICAgIHsgImxpIiwgImxpIiB9LAorICAgIHsgImxpbmsiLCAiYm9keSIgfSwKKyAgICB7ICJsaW5rIiwgImZyYW1lc2V0IiB9LAorICAgIHsgImxpc3RpbmciLCAiZGQiIH0sCisgICAgeyAibGlzdGluZyIsICJkbCIgfSwKKyAgICB7ICJsaXN0aW5nIiwgImR0IiB9LAorICAgIHsgImxpc3RpbmciLCAiZmllbGRzZXQiIH0sCisgICAgeyAibGlzdGluZyIsICJmb3JtIiB9LAorICAgIHsgImxpc3RpbmciLCAibGkiIH0sCisgICAgeyAibGlzdGluZyIsICJ0YWJsZSIgfSwKKyAgICB7ICJsaXN0aW5nIiwgInVsIiB9LAorICAgIHsgIm1lbnUiLCAiZGQiIH0sCisgICAgeyAibWVudSIsICJkbCIgfSwKKyAgICB7ICJtZW51IiwgImR0IiB9LAorICAgIHsgIm1lbnUiLCAiZm9ybSIgfSwKKyAgICB7ICJtZW51IiwgInVsIiB9LAorICAgIHsgIm9sIiwgImZvcm0iIH0sCisgICAgeyAib2wiLCAidWwiIH0sCisgICAgeyAib3B0aW9uIiwgIm9wdGdyb3VwIiB9LAorICAgIHsgIm9wdGlvbiIsICJvcHRpb24iIH0sCisgICAgeyAicCIsICJhZGRyZXNzIiB9LAorICAgIHsgInAiLCAiYmxvY2txdW90ZSIgfSwKKyAgICB7ICJwIiwgImJvZHkiIH0sCisgICAgeyAicCIsICJjYXB0aW9uIiB9LAorICAgIHsgInAiLCAiY2VudGVyIiB9LAorICAgIHsgInAiLCAiY29sIiB9LAorICAgIHsgInAiLCAiY29sZ3JvdXAiIH0sCisgICAgeyAicCIsICJkZCIgfSwKKyAgICB7ICJwIiwgImRpciIgfSwKKyAgICB7ICJwIiwgImRpdiIgfSwKKyAgICB7ICJwIiwgImRsIiB9LAorICAgIHsgInAiLCAiZHQiIH0sCisgICAgeyAicCIsICJmaWVsZHNldCIgfSwKKyAgICB7ICJwIiwgImZvcm0iIH0sCisgICAgeyAicCIsICJmcmFtZXNldCIgfSwKKyAgICB7ICJwIiwgImgxIiB9LAorICAgIHsgInAiLCAiaDIiIH0sCisgICAgeyAicCIsICJoMyIgfSwKKyAgICB7ICJwIiwgImg0IiB9LAorICAgIHsgInAiLCAiaDUiIH0sCisgICAgeyAicCIsICJoNiIgfSwKKyAgICB7ICJwIiwgImhlYWQiIH0sCisgICAgeyAicCIsICJociIgfSwKKyAgICB7ICJwIiwgImxpIiB9LAorICAgIHsgInAiLCAibGlzdGluZyIgfSwKKyAgICB7ICJwIiwgIm1lbnUiIH0sCisgICAgeyAicCIsICJvbCIgfSwKKyAgICB7ICJwIiwgInAiIH0sCisgICAgeyAicCIsICJwcmUiIH0sCisgICAgeyAicCIsICJ0YWJsZSIgfSwKKyAgICB7ICJwIiwgInRib2R5IiB9LAorICAgIHsgInAiLCAidGQiIH0sCisgICAgeyAicCIsICJ0Zm9vdCIgfSwKKyAgICB7ICJwIiwgInRoIiB9LAorICAgIHsgInAiLCAidGl0bGUiIH0sCisgICAgeyAicCIsICJ0ciIgfSwKKyAgICB7ICJwIiwgInVsIiB9LAorICAgIHsgInAiLCAieG1wIiB9LAorICAgIHsgInByZSIsICJkZCIgfSwKKyAgICB7ICJwcmUiLCAiZGwiIH0sCisgICAgeyAicHJlIiwgImR0IiB9LAorICAgIHsgInByZSIsICJmaWVsZHNldCIgfSwKKyAgICB7ICJwcmUiLCAiZm9ybSIgfSwKKyAgICB7ICJwcmUiLCAibGkiIH0sCisgICAgeyAicHJlIiwgInRhYmxlIiB9LAorICAgIHsgInByZSIsICJ1bCIgfSwKKyAgICB7ICJzIiwgInAiIH0sCisgICAgeyAic2NyaXB0IiwgIm5vc2NyaXB0IiB9LAorICAgIHsgInNtYWxsIiwgInAiIH0sCisgICAgeyAic3BhbiIsICJ0ZCIgfSwKKyAgICB7ICJzcGFuIiwgInRoIiB9LAorICAgIHsgInN0cmlrZSIsICJwIiB9LAorICAgIHsgInN0eWxlIiwgImJvZHkiIH0sCisgICAgeyAic3R5bGUiLCAiZnJhbWVzZXQiIH0sCisgICAgeyAidGJvZHkiLCAidGJvZHkiIH0sCisgICAgeyAidGJvZHkiLCAidGZvb3QiIH0sCisgICAgeyAidGQiLCAidGJvZHkiIH0sCisgICAgeyAidGQiLCAidGQiIH0sCisgICAgeyAidGQiLCAidGZvb3QiIH0sCisgICAgeyAidGQiLCAidGgiIH0sCisgICAgeyAidGQiLCAidHIiIH0sCisgICAgeyAidGZvb3QiLCAidGJvZHkiIH0sCisgICAgeyAidGgiLCAidGJvZHkiIH0sCisgICAgeyAidGgiLCAidGQiIH0sCisgICAgeyAidGgiLCAidGZvb3QiIH0sCisgICAgeyAidGgiLCAidGgiIH0sCisgICAgeyAidGgiLCAidHIiIH0sCisgICAgeyAidGhlYWQiLCAidGJvZHkiIH0sCisgICAgeyAidGhlYWQiLCAidGZvb3QiIH0sCisgICAgeyAidGl0bGUiLCAiYm9keSIgfSwKKyAgICB7ICJ0aXRsZSIsICJmcmFtZXNldCIgfSwKKyAgICB7ICJ0ciIsICJ0Ym9keSIgfSwKKyAgICB7ICJ0ciIsICJ0Zm9vdCIgfSwKKyAgICB7ICJ0ciIsICJ0ciIgfSwKKyAgICB7ICJ0dCIsICJwIiB9LAorICAgIHsgInUiLCAicCIgfSwKKyAgICB7ICJ1IiwgInRkIiB9LAorICAgIHsgInUiLCAidGgiIH0sCisgICAgeyAidWwiLCAiYWRkcmVzcyIgfSwKKyAgICB7ICJ1bCIsICJmb3JtIiB9LAorICAgIHsgInVsIiwgIm1lbnUiIH0sCisgICAgeyAidWwiLCAib2wiIH0sCisgICAgeyAidWwiLCAicHJlIiB9LAorICAgIHsgInhtcCIsICJkZCIgfSwKKyAgICB7ICJ4bXAiLCAiZGwiIH0sCisgICAgeyAieG1wIiwgImR0IiB9LAorICAgIHsgInhtcCIsICJmaWVsZHNldCIgfSwKKyAgICB7ICJ4bXAiLCAiZm9ybSIgfSwKKyAgICB7ICJ4bXAiLCAibGkiIH0sCisgICAgeyAieG1wIiwgInRhYmxlIiB9LAorICAgIHsgInhtcCIsICJ1bCIgfQogfTsKIAogLyoKQEAgLTEyMTQsOSArMTQwNCw2IEBACiAgICAge05VTEwsICAgIDEwMH0gLyogRGVmYXVsdCBwcmlvcml0eSAqLwogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIqKiBodG1sU3RhcnRDbG9zZUluZGV4WzEwMF07Ci1zdGF0aWMgaW50IGh0bWxTdGFydENsb3NlSW5kZXhpbml0aWFsaXplZCA9IDA7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgogICoJZnVuY3Rpb25zIHRvIGhhbmRsZSBIVE1MIHNwZWNpZmljIGRhdGEJCQkqCkBAIC0xMjI2LDI0ICsxNDEzLDE4IEBACiAvKioKICAqIGh0bWxJbml0QXV0b0Nsb3NlOgogICoKLSAqIEluaXRpYWxpemUgdGhlIGh0bWxTdGFydENsb3NlSW5kZXggZm9yIGZhc3QgbG9va3VwIG9mIGNsb3NpbmcgdGFncyBuYW1lcy4KLSAqIFRoaXMgaXMgbm90IHJlZW50cmFudC4gQ2FsbCB4bWxJbml0UGFyc2VyKCkgb25jZSBiZWZvcmUgcHJvY2Vzc2luZyBpbgotICogY2FzZSBvZiB1c2UgaW4gbXVsdGl0aHJlYWRlZCBwcm9ncmFtcy4KKyAqIFRoaXMgaXMgYSBuby1vcCBub3cuCiAgKi8KIHZvaWQKIGh0bWxJbml0QXV0b0Nsb3NlKHZvaWQpIHsKLSAgICBpbnQgaW5keCwgaSA9IDA7Cit9CiAKLSAgICBpZiAoaHRtbFN0YXJ0Q2xvc2VJbmRleGluaXRpYWxpemVkKSByZXR1cm47CitzdGF0aWMgaW50CitodG1sQ29tcGFyZVRhZ3MoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpIHsKKyAgICBjb25zdCB4bWxDaGFyICp0YWcgPSAoY29uc3QgeG1sQ2hhciAqKSBrZXk7CisgICAgY29uc3QgaHRtbEVsZW1EZXNjICpkZXNjID0gKGNvbnN0IGh0bWxFbGVtRGVzYyAqKSBtZW1iZXI7CiAKLSAgICBmb3IgKGluZHggPSAwO2luZHggPCAxMDA7aW5keCArKykgaHRtbFN0YXJ0Q2xvc2VJbmRleFtpbmR4XSA9IE5VTEw7Ci0gICAgaW5keCA9IDA7Ci0gICAgd2hpbGUgKChodG1sU3RhcnRDbG9zZVtpXSAhPSBOVUxMKSAmJiAoaW5keCA8IDEwMCAtIDEpKSB7Ci0gICAgICAgIGh0bWxTdGFydENsb3NlSW5kZXhbaW5keCsrXSA9IChjb25zdCBjaGFyKiopICZodG1sU3RhcnRDbG9zZVtpXTsKLQl3aGlsZSAoaHRtbFN0YXJ0Q2xvc2VbaV0gIT0gTlVMTCkgaSsrOwotCWkrKzsKLSAgICB9Ci0gICAgaHRtbFN0YXJ0Q2xvc2VJbmRleGluaXRpYWxpemVkID0gMTsKKyAgICByZXR1cm4oeG1sU3RyY2FzZWNtcCh0YWcsIEJBRF9DQVNUIGRlc2MtPm5hbWUpKTsKIH0KIAogLyoqCkBAIC0xMjU2LDE0ICsxNDM3LDEyIEBACiAgKi8KIGNvbnN0IGh0bWxFbGVtRGVzYyAqCiBodG1sVGFnTG9va3VwKGNvbnN0IHhtbENoYXIgKnRhZykgewotICAgIHVuc2lnbmVkIGludCBpOworICAgIGlmICh0YWcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IChzaXplb2YoaHRtbDQwRWxlbWVudFRhYmxlKSAvCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoaHRtbDQwRWxlbWVudFRhYmxlWzBdKSk7aSsrKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY2FzZWNtcCh0YWcsIEJBRF9DQVNUIGh0bWw0MEVsZW1lbnRUYWJsZVtpXS5uYW1lKSkKLQkgICAgcmV0dXJuKChodG1sRWxlbURlc2NQdHIpICZodG1sNDBFbGVtZW50VGFibGVbaV0pOwotICAgIH0KLSAgICByZXR1cm4oTlVMTCk7CisgICAgcmV0dXJuKChjb25zdCBodG1sRWxlbURlc2MgKikgYnNlYXJjaCh0YWcsIGh0bWw0MEVsZW1lbnRUYWJsZSwKKyAgICAgICAgICAgICAgICBzaXplb2YoaHRtbDQwRWxlbWVudFRhYmxlKSAvIHNpemVvZihodG1sRWxlbURlc2MpLAorICAgICAgICAgICAgICAgIHNpemVvZihodG1sRWxlbURlc2MpLCBodG1sQ29tcGFyZVRhZ3MpKTsKIH0KIAogLyoqCkBAIC0xMjg0LDYgKzE0NjMsMTkgQEAKIH0KIAogCitzdGF0aWMgaW50CitodG1sQ29tcGFyZVN0YXJ0Q2xvc2UoY29uc3Qgdm9pZCAqdmtleSwgY29uc3Qgdm9pZCAqbWVtYmVyKSB7CisgICAgY29uc3QgaHRtbFN0YXJ0Q2xvc2VFbnRyeSAqa2V5ID0gKGNvbnN0IGh0bWxTdGFydENsb3NlRW50cnkgKikgdmtleTsKKyAgICBjb25zdCBodG1sU3RhcnRDbG9zZUVudHJ5ICplbnRyeSA9IChjb25zdCBodG1sU3RhcnRDbG9zZUVudHJ5ICopIG1lbWJlcjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gc3RyY21wKGtleS0+b2xkVGFnLCBlbnRyeS0+b2xkVGFnKTsKKyAgICBpZiAocmV0ID09IDApCisgICAgICAgIHJldCA9IHN0cmNtcChrZXktPm5ld1RhZywgZW50cnktPm5ld1RhZyk7CisKKyAgICByZXR1cm4ocmV0KTsKK30KKwogLyoqCiAgKiBodG1sQ2hlY2tBdXRvQ2xvc2U6CiAgKiBAbmV3dGFnOiAgVGhlIG5ldyB0YWcgbmFtZQpAQCAtMTI5MSwzNyArMTQ4MywyMSBAQAogICoKICAqIENoZWNrcyB3aGV0aGVyIHRoZSBuZXcgdGFnIGlzIG9uZSBvZiB0aGUgcmVnaXN0ZXJlZCB2YWxpZCB0YWdzIGZvcgogICogY2xvc2luZyBvbGQuCi0gKiBJbml0aWFsaXplIHRoZSBodG1sU3RhcnRDbG9zZUluZGV4IGZvciBmYXN0IGxvb2t1cCBvZiBjbG9zaW5nIHRhZ3MgbmFtZXMuCiAgKgogICogUmV0dXJucyAwIGlmIG5vLCAxIGlmIHllcy4KICAqLwogc3RhdGljIGludAogaHRtbENoZWNrQXV0b0Nsb3NlKGNvbnN0IHhtbENoYXIgKiBuZXd0YWcsIGNvbnN0IHhtbENoYXIgKiBvbGR0YWcpCiB7Ci0gICAgaW50IGksIGluZHg7Ci0gICAgY29uc3QgY2hhciAqKmNsb3NlZCA9IE5VTEw7CisgICAgaHRtbFN0YXJ0Q2xvc2VFbnRyeSBrZXk7CisgICAgdm9pZCAqcmVzOwogCi0gICAgaWYgKGh0bWxTdGFydENsb3NlSW5kZXhpbml0aWFsaXplZCA9PSAwKQotICAgICAgICBodG1sSW5pdEF1dG9DbG9zZSgpOwotCi0gICAgLyogaW5lZmZpY2llbnQsIGJ1dCBub3QgYSBiaWcgZGVhbCAqLwotICAgIGZvciAoaW5keCA9IDA7IGluZHggPCAxMDA7IGluZHgrKykgewotICAgICAgICBjbG9zZWQgPSBodG1sU3RhcnRDbG9zZUluZGV4W2luZHhdOwotICAgICAgICBpZiAoY2xvc2VkID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICBpZiAoeG1sU3RyRXF1YWwoQkFEX0NBU1QgKiBjbG9zZWQsIG5ld3RhZykpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpID0gY2xvc2VkIC0gaHRtbFN0YXJ0Q2xvc2U7Ci0gICAgaSsrOwotICAgIHdoaWxlIChodG1sU3RhcnRDbG9zZVtpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh4bWxTdHJFcXVhbChCQURfQ0FTVCBodG1sU3RhcnRDbG9zZVtpXSwgb2xkdGFnKSkgewotICAgICAgICAgICAgcmV0dXJuICgxKTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisgICAga2V5Lm9sZFRhZyA9IChjb25zdCBjaGFyICopIG9sZHRhZzsKKyAgICBrZXkubmV3VGFnID0gKGNvbnN0IGNoYXIgKikgbmV3dGFnOworICAgIHJlcyA9IGJzZWFyY2goJmtleSwgaHRtbFN0YXJ0Q2xvc2UsCisgICAgICAgICAgICBzaXplb2YoaHRtbFN0YXJ0Q2xvc2UpIC8gc2l6ZW9mKGh0bWxTdGFydENsb3NlRW50cnkpLAorICAgICAgICAgICAgc2l6ZW9mKGh0bWxTdGFydENsb3NlRW50cnkpLCBodG1sQ29tcGFyZVN0YXJ0Q2xvc2UpOworICAgIHJldHVybihyZXMgIT0gTlVMTCk7CiB9CiAKIC8qKgpAQCAtMjQ4OSw3ICsyNjY1LDYgQEAKIAkgICAgY291bnQgPSBpbiAtIGN0eHQtPmlucHV0LT5jdXI7CiAJICAgIHJldCA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgY3R4dC0+aW5wdXQtPmN1ciwgY291bnQpOwogCSAgICBjdHh0LT5pbnB1dC0+Y3VyID0gaW47Ci0JICAgIGN0eHQtPm5iQ2hhcnMgKz0gY291bnQ7CiAJICAgIGN0eHQtPmlucHV0LT5jb2wgKz0gY291bnQ7CiAJICAgIHJldHVybihyZXQpOwogCX0KQEAgLTI3OTYsNDcgKzI5NzEsMzkgQEAKIHN0YXRpYyB4bWxDaGFyICoKIGh0bWxQYXJzZVN5c3RlbUxpdGVyYWwoaHRtbFBhcnNlckN0eHRQdHIgY3R4dCkgewogICAgIHNpemVfdCBsZW4gPSAwLCBzdGFydFBvc2l0aW9uID0gMDsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpbnQgcXVvdGU7CiAgICAgeG1sQ2hhciAqcmV0ID0gTlVMTDsKIAotICAgIGlmIChDVVIgPT0gJyInKSB7Ci0gICAgICAgIE5FWFQ7Ci0KLSAgICAgICAgaWYgKENVUl9QVFIgPCBCQVNFX1BUUikKLSAgICAgICAgICAgIHJldHVybihyZXQpOwotICAgICAgICBzdGFydFBvc2l0aW9uID0gQ1VSX1BUUiAtIEJBU0VfUFRSOwotCi0Jd2hpbGUgKChJU19DSEFSX0NIKENVUikpICYmIChDVVIgIT0gJyInKSkgewotCSAgICBORVhUOwotCSAgICBsZW4rKzsKLQl9Ci0JaWYgKCFJU19DSEFSX0NIKENVUikpIHsKLQkgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfTElURVJBTF9OT1RfRklOSVNIRUQsCi0JCQkgIlVuZmluaXNoZWQgU3lzdGVtTGl0ZXJhbFxuIiwgTlVMTCwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkgICAgcmV0ID0geG1sU3RybmR1cCgoQkFTRV9QVFIrc3RhcnRQb3NpdGlvbiksIGxlbik7Ci0JICAgIE5FWFQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKENVUiA9PSAnXCcnKSB7Ci0gICAgICAgIE5FWFQ7Ci0KLSAgICAgICAgaWYgKENVUl9QVFIgPCBCQVNFX1BUUikKLSAgICAgICAgICAgIHJldHVybihyZXQpOwotICAgICAgICBzdGFydFBvc2l0aW9uID0gQ1VSX1BUUiAtIEJBU0VfUFRSOwotCi0Jd2hpbGUgKChJU19DSEFSX0NIKENVUikpICYmIChDVVIgIT0gJ1wnJykpIHsKLQkgICAgTkVYVDsKLQkgICAgbGVuKys7Ci0JfQotCWlmICghSVNfQ0hBUl9DSChDVVIpKSB7Ci0JICAgIGh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX0xJVEVSQUxfTk9UX0ZJTklTSEVELAotCQkJICJVbmZpbmlzaGVkIFN5c3RlbUxpdGVyYWxcbiIsIE5VTEwsIE5VTEwpOwotCX0gZWxzZSB7Ci0JICAgIHJldCA9IHhtbFN0cm5kdXAoKEJBU0VfUFRSK3N0YXJ0UG9zaXRpb24pLCBsZW4pOwotCSAgICBORVhUOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoKENVUiAhPSAnIicpICYmIChDVVIgIT0gJ1wnJykpIHsKIAlodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9MSVRFUkFMX05PVF9TVEFSVEVELAotCSAgICAgICAgICAgICAiIG9yICcgZXhwZWN0ZWRcbiIsIE5VTEwsIE5VTEwpOworCSAgICAgICAgICAgICAiU3lzdGVtTGl0ZXJhbCBcIiBvciAnIGV4cGVjdGVkXG4iLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBxdW90ZSA9IENVUjsKKyAgICBORVhUOworCisgICAgaWYgKENVUl9QVFIgPCBCQVNFX1BUUikKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgc3RhcnRQb3NpdGlvbiA9IENVUl9QVFIgLSBCQVNFX1BUUjsKKworICAgIHdoaWxlICgoQ1VSICE9IDApICYmIChDVVIgIT0gcXVvdGUpKSB7CisgICAgICAgIC8qIFRPRE86IEhhbmRsZSBVVEYtOCAqLworICAgICAgICBpZiAoIUlTX0NIQVJfQ0goQ1VSKSkgeworICAgICAgICAgICAgaHRtbFBhcnNlRXJySW50KGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNoYXIgaW4gU3lzdGVtTGl0ZXJhbCAweCVYXG4iLCBDVVIpOworICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgfQorICAgICAgICBORVhUOworICAgICAgICBsZW4rKzsKKyAgICB9CisgICAgaWYgKENVUiAhPSBxdW90ZSkgeworICAgICAgICBodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9MSVRFUkFMX05PVF9GSU5JU0hFRCwKKyAgICAgICAgICAgICAgICAgICAgICJVbmZpbmlzaGVkIFN5c3RlbUxpdGVyYWxcbiIsIE5VTEwsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIE5FWFQ7CisgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgIHJldCA9IHhtbFN0cm5kdXAoKEJBU0VfUFRSK3N0YXJ0UG9zaXRpb24pLCBsZW4pOwogICAgIH0KIAogICAgIHJldHVybihyZXQpOwpAQCAtMjg1Niw1MSArMzAyMyw0MiBAQAogc3RhdGljIHhtbENoYXIgKgogaHRtbFBhcnNlUHViaWRMaXRlcmFsKGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKICAgICBzaXplX3QgbGVuID0gMCwgc3RhcnRQb3NpdGlvbiA9IDA7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IHF1b3RlOwogICAgIHhtbENoYXIgKnJldCA9IE5VTEw7CisKKyAgICBpZiAoKENVUiAhPSAnIicpICYmIChDVVIgIT0gJ1wnJykpIHsKKwlodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9MSVRFUkFMX05PVF9TVEFSVEVELAorCSAgICAgICAgICAgICAiUHViaWRMaXRlcmFsIFwiIG9yICcgZXhwZWN0ZWRcbiIsIE5VTEwsIE5VTEwpOworICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHF1b3RlID0gQ1VSOworICAgIE5FWFQ7CisKICAgICAvKgogICAgICAqIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOYW1lQ2hhcikqCiAgICAgICovCi0gICAgaWYgKENVUiA9PSAnIicpIHsKLSAgICAgICAgTkVYVDsKKyAgICBpZiAoQ1VSX1BUUiA8IEJBU0VfUFRSKQorICAgICAgICByZXR1cm4ocmV0KTsKKyAgICBzdGFydFBvc2l0aW9uID0gQ1VSX1BUUiAtIEJBU0VfUFRSOwogCi0gICAgICAgIGlmIChDVVJfUFRSIDwgQkFTRV9QVFIpCi0gICAgICAgICAgICByZXR1cm4ocmV0KTsKLSAgICAgICAgc3RhcnRQb3NpdGlvbiA9IENVUl9QVFIgLSBCQVNFX1BUUjsKLQotICAgICAgICB3aGlsZSAoSVNfUFVCSURDSEFSX0NIKENVUikpIHsKLSAgICAgICAgICAgIGxlbisrOwotICAgICAgICAgICAgTkVYVDsKKyAgICB3aGlsZSAoKENVUiAhPSAwKSAmJiAoQ1VSICE9IHF1b3RlKSkgeworICAgICAgICBpZiAoIUlTX1BVQklEQ0hBUl9DSChDVVIpKSB7CisgICAgICAgICAgICBodG1sUGFyc2VFcnJJbnQoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2hhciBpbiBQdWJpZExpdGVyYWwgMHglWFxuIiwgQ1VSKTsKKyAgICAgICAgICAgIGVyciA9IDE7CiAgICAgICAgIH0KLQotCWlmIChDVVIgIT0gJyInKSB7Ci0JICAgIGh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX0xJVEVSQUxfTk9UX0ZJTklTSEVELAotCSAgICAgICAgICAgICAgICAgIlVuZmluaXNoZWQgUHViaWRMaXRlcmFsXG4iLCBOVUxMLCBOVUxMKTsKLQl9IGVsc2UgewotCSAgICByZXQgPSB4bWxTdHJuZHVwKChCQVNFX1BUUiArIHN0YXJ0UG9zaXRpb24pLCBsZW4pOwotCSAgICBORVhUOwotCX0KLSAgICB9IGVsc2UgaWYgKENVUiA9PSAnXCcnKSB7CisgICAgICAgIGxlbisrOwogICAgICAgICBORVhUOworICAgIH0KIAotICAgICAgICBpZiAoQ1VSX1BUUiA8IEJBU0VfUFRSKQotICAgICAgICAgICAgcmV0dXJuKHJldCk7Ci0gICAgICAgIHN0YXJ0UG9zaXRpb24gPSBDVVJfUFRSIC0gQkFTRV9QVFI7Ci0KLSAgICAgICAgd2hpbGUgKChJU19QVUJJRENIQVJfQ0goQ1VSKSkgJiYgKENVUiAhPSAnXCcnKSl7Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgIE5FWFQ7Ci0gICAgICAgIH0KLQotCWlmIChDVVIgIT0gJ1wnJykgewotCSAgICBodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9MSVRFUkFMX05PVF9GSU5JU0hFRCwKLQkgICAgICAgICAgICAgICAgICJVbmZpbmlzaGVkIFB1YmlkTGl0ZXJhbFxuIiwgTlVMTCwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkgICAgcmV0ID0geG1sU3RybmR1cCgoQkFTRV9QVFIgKyBzdGFydFBvc2l0aW9uKSwgbGVuKTsKLQkgICAgTkVYVDsKLQl9CisgICAgaWYgKENVUiAhPSAnIicpIHsKKyAgICAgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfTElURVJBTF9OT1RfRklOSVNIRUQsCisgICAgICAgICAgICAgICAgICAgICAiVW5maW5pc2hlZCBQdWJpZExpdGVyYWxcbiIsIE5VTEwsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0JaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfTElURVJBTF9OT1RfU1RBUlRFRCwKLQkgICAgICAgICAgICAgIlB1YmlkTGl0ZXJhbCBcIiBvciAnIGV4cGVjdGVkXG4iLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgTkVYVDsKKyAgICAgICAgaWYgKGVyciA9PSAwKQorICAgICAgICAgICAgcmV0ID0geG1sU3RybmR1cCgoQkFTRV9QVFIgKyBzdGFydFBvc2l0aW9uKSwgbGVuKTsKICAgICB9CiAKICAgICByZXR1cm4ocmV0KTsKQEAgLTI5MzUsNyArMzA5Myw3IEBACiAKICAgICBTSFJJTks7CiAgICAgY3VyID0gQ1VSX0NIQVIobCk7Ci0gICAgd2hpbGUgKElTX0NIQVJfQ0goY3VyKSkgeworICAgIHdoaWxlIChjdXIgIT0gMCkgewogCWlmICgoY3VyID09ICc8JykgJiYgKE5YVCgxKSA9PSAnLycpKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogT25lIHNob3VsZCBicmVhayBoZXJlLCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBjbGVhcjoKQEAgLTI5NjYsNyArMzEyNCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAl9Ci0JQ09QWV9CVUYobCxidWYsbmJjaGFyLGN1cik7CisgICAgICAgIGlmIChJU19DSEFSKGN1cikpIHsKKwkgICAgQ09QWV9CVUYobCxidWYsbmJjaGFyLGN1cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sUGFyc2VFcnJJbnQoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2hhciBpbiBDREFUQSAweCVYXG4iLCBjdXIpOworICAgICAgICB9CiAJaWYgKG5iY2hhciA+PSBIVE1MX1BBUlNFUl9CSUdfQlVGRkVSX1NJWkUpIHsKICAgICAgICAgICAgIGJ1ZltuYmNoYXJdID0gMDsKIAkgICAgaWYgKGN0eHQtPnNheC0+Y2RhdGFCbG9jayE9IE5VTEwpIHsKQEAgLTI5ODQsMTQgKzMxNDcsNiBAQAogCWN1ciA9IENVUl9DSEFSKGwpOwogICAgIH0KIAotICAgIGlmICgoIShJU19DSEFSX0NIKGN1cikpKSAmJiAoISgoY3VyID09IDApICYmIChjdHh0LT5wcm9ncmVzc2l2ZSkpKSkgewotICAgICAgICBodG1sUGFyc2VFcnJJbnQoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNoYXIgaW4gQ0RBVEEgMHglWFxuIiwgY3VyKTsKLSAgICAgICAgaWYgKGN0eHQtPmlucHV0LT5jdXIgPCBjdHh0LT5pbnB1dC0+ZW5kKSB7Ci0gICAgICAgICAgICBORVhUOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKChuYmNoYXIgIT0gMCkgJiYgKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoIWN0eHQtPmRpc2FibGVTQVgpKSB7CiAgICAgICAgIGJ1ZltuYmNoYXJdID0gMDsKIAlpZiAoY3R4dC0+c2F4LT5jZGF0YUJsb2NrIT0gTlVMTCkgewpAQCAtMzIzOSw3ICszMzk0LDcgQEAKIAkgICAgfQogICAgICAgICAgICAgU0tJUF9CTEFOS1M7CiAJICAgIGN1ciA9IENVUl9DSEFSKGwpOwotCSAgICB3aGlsZSAoSVNfQ0hBUihjdXIpICYmIChjdXIgIT0gJz4nKSkgeworCSAgICB3aGlsZSAoKGN1ciAhPSAwKSAmJiAoY3VyICE9ICc+JykpIHsKIAkJaWYgKGxlbiArIDUgPj0gc2l6ZSkgewogCQkgICAgeG1sQ2hhciAqdG1wOwogCkBAIC0zMjU4LDcgKzM0MTMsMTMgQEAKIAkJICAgIEdST1c7CiAJCSAgICBjb3VudCA9IDA7CiAJCX0KLQkJQ09QWV9CVUYobCxidWYsbGVuLGN1cik7CisgICAgICAgICAgICAgICAgaWYgKElTX0NIQVIoY3VyKSkgeworCQkgICAgQ09QWV9CVUYobCxidWYsbGVuLGN1cik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaHRtbFBhcnNlRXJySW50KGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2hhciBpbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIweCVYXG4iLCBjdXIpOworICAgICAgICAgICAgICAgIH0KIAkJTkVYVEwobCk7CiAJCWN1ciA9IENVUl9DSEFSKGwpOwogCQlpZiAoY3VyID09IDApIHsKQEAgLTMzMDcsNiArMzQ2OCw3IEBACiAgICAgaW50IHEsIHFsOwogICAgIGludCByLCBybDsKICAgICBpbnQgY3VyLCBsOworICAgIGludCBuZXh0LCBubDsKICAgICB4bWxQYXJzZXJJbnB1dFN0YXRlIHN0YXRlOwogCiAgICAgLyoKQEAgLTMzMjgsMTcgKzM0OTAsMzIgQEAKICAgICBsZW4gPSAwOwogICAgIGJ1ZltsZW5dID0gMDsKICAgICBxID0gQ1VSX0NIQVIocWwpOwotICAgIGlmICghSVNfQ0hBUihxKSkKKyAgICBpZiAocSA9PSAwKQogICAgICAgICBnb3RvIHVuZmluaXNoZWQ7CiAgICAgTkVYVEwocWwpOwogICAgIHIgPSBDVVJfQ0hBUihybCk7Ci0gICAgaWYgKCFJU19DSEFSKHIpKQorICAgIGlmIChyID09IDApCiAgICAgICAgIGdvdG8gdW5maW5pc2hlZDsKICAgICBORVhUTChybCk7CiAgICAgY3VyID0gQ1VSX0NIQVIobCk7Ci0gICAgd2hpbGUgKElTX0NIQVIoY3VyKSAmJgorICAgIHdoaWxlICgoY3VyICE9IDApICYmCiAgICAgICAgICAgICgoY3VyICE9ICc+JykgfHwKIAkgICAgKHIgIT0gJy0nKSB8fCAocSAhPSAnLScpKSkgeworCU5FWFRMKGwpOworCW5leHQgPSBDVVJfQ0hBUihubCk7CisJaWYgKG5leHQgPT0gMCkgeworCSAgICBTSFJJTks7CisJICAgIEdST1c7CisJICAgIG5leHQgPSBDVVJfQ0hBUihubCk7CisJfQorCisJaWYgKChxID09ICctJykgJiYgKHIgPT0gJy0nKSAmJiAoY3VyID09ICchJykgJiYgKG5leHQgPT0gJz4nKSkgeworCSAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfQ09NTUVOVF9OT1RfRklOSVNIRUQsCisJCSAgICAgICAiQ29tbWVudCBpbmNvcnJlY3RseSBjbG9zZWQgYnkgJy0tIT4nIiwgTlVMTCwgTlVMTCk7CisJICBjdXIgPSAnPic7CisJICBicmVhazsKKwl9CisKIAlpZiAobGVuICsgNSA+PSBzaXplKSB7CiAJICAgIHhtbENoYXIgKnRtcDsKIApAQCAtMzM1MiwyMSArMzUyOSwyMiBAQAogCSAgICB9CiAJICAgIGJ1ZiA9IHRtcDsKIAl9Ci0JQ09QWV9CVUYocWwsYnVmLGxlbixxKTsKKyAgICAgICAgaWYgKElTX0NIQVIocSkpIHsKKwkgICAgQ09QWV9CVUYocWwsYnVmLGxlbixxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh0bWxQYXJzZUVyckludChjdHh0LCBYTUxfRVJSX0lOVkFMSURfQ0hBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjaGFyIGluIGNvbW1lbnQgMHglWFxuIiwgcSk7CisgICAgICAgIH0KKwogCXEgPSByOwogCXFsID0gcmw7CiAJciA9IGN1cjsKIAlybCA9IGw7Ci0JTkVYVEwobCk7Ci0JY3VyID0gQ1VSX0NIQVIobCk7Ci0JaWYgKGN1ciA9PSAwKSB7Ci0JICAgIFNIUklOSzsKLQkgICAgR1JPVzsKLQkgICAgY3VyID0gQ1VSX0NIQVIobCk7Ci0JfQorCWN1ciA9IG5leHQ7CisJbCA9IG5sOwogICAgIH0KICAgICBidWZbbGVuXSA9IDA7Ci0gICAgaWYgKElTX0NIQVIoY3VyKSkgeworICAgIGlmIChjdXIgPT0gJz4nKSB7CiAgICAgICAgIE5FWFQ7CiAJaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+Y29tbWVudCAhPSBOVUxMKSAmJgogCSAgICAoIWN0eHQtPmRpc2FibGVTQVgpKQpAQCAtMzQwNywxMyArMzU4NSwxNiBAQAogICAgICAgICAoKE5YVCgyKSA9PSAneCcpIHx8IE5YVCgyKSA9PSAnWCcpKSB7CiAJU0tJUCgzKTsKIAl3aGlsZSAoQ1VSICE9ICc7JykgewotCSAgICBpZiAoKENVUiA+PSAnMCcpICYmIChDVVIgPD0gJzknKSkKLQkgICAgICAgIHZhbCA9IHZhbCAqIDE2ICsgKENVUiAtICcwJyk7Ci0JICAgIGVsc2UgaWYgKChDVVIgPj0gJ2EnKSAmJiAoQ1VSIDw9ICdmJykpCi0JICAgICAgICB2YWwgPSB2YWwgKiAxNiArIChDVVIgLSAnYScpICsgMTA7Ci0JICAgIGVsc2UgaWYgKChDVVIgPj0gJ0EnKSAmJiAoQ1VSIDw9ICdGJykpCi0JICAgICAgICB2YWwgPSB2YWwgKiAxNiArIChDVVIgLSAnQScpICsgMTA7Ci0JICAgIGVsc2UgeworCSAgICBpZiAoKENVUiA+PSAnMCcpICYmIChDVVIgPD0gJzknKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAweDExMDAwMCkKKwkgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIChDVVIgLSAnMCcpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoQ1VSID49ICdhJykgJiYgKENVUiA8PSAnZicpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDB4MTEwMDAwKQorCSAgICAgICAgICAgIHZhbCA9IHZhbCAqIDE2ICsgKENVUiAtICdhJykgKyAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKENVUiA+PSAnQScpICYmIChDVVIgPD0gJ0YnKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAweDExMDAwMCkKKwkgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIChDVVIgLSAnQScpICsgMTA7CisgICAgICAgICAgICB9IGVsc2UgewogCSAgICAgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9IRVhfQ0hBUlJFRiwKIAkJICAgICAgICAgICAgICJodG1sUGFyc2VDaGFyUmVmOiBtaXNzaW5nIHNlbWljb2xvblxuIiwKIAkJCSAgICAgTlVMTCwgTlVMTCk7CkBAIC0zNDI2LDkgKzM2MDcsMTAgQEAKICAgICB9IGVsc2UgaWYgICgoQ1VSID09ICcmJykgJiYgKE5YVCgxKSA9PSAnIycpKSB7CiAJU0tJUCgyKTsKIAl3aGlsZSAoQ1VSICE9ICc7JykgewotCSAgICBpZiAoKENVUiA+PSAnMCcpICYmIChDVVIgPD0gJzknKSkKLQkgICAgICAgIHZhbCA9IHZhbCAqIDEwICsgKENVUiAtICcwJyk7Ci0JICAgIGVsc2UgeworCSAgICBpZiAoKENVUiA+PSAnMCcpICYmIChDVVIgPD0gJzknKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAweDExMDAwMCkKKwkgICAgICAgICAgICB2YWwgPSB2YWwgKiAxMCArIChDVVIgLSAnMCcpOworICAgICAgICAgICAgfSBlbHNlIHsKIAkgICAgICAgIGh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX0lOVkFMSURfREVDX0NIQVJSRUYsCiAJCSAgICAgICAgICAgICAiaHRtbFBhcnNlQ2hhclJlZjogbWlzc2luZyBzZW1pY29sb25cbiIsCiAJCQkgICAgIE5VTEwsIE5VTEwpOwpAQCAtMzQ0Nyw2ICszNjI5LDkgQEAKICAgICAgKi8KICAgICBpZiAoSVNfQ0hBUih2YWwpKSB7CiAgICAgICAgIHJldHVybih2YWwpOworICAgIH0gZWxzZSBpZiAodmFsID49IDB4MTEwMDAwKSB7CisJaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAorCQkgICAgICJodG1sUGFyc2VDaGFyUmVmOiB2YWx1ZSB0b28gbGFyZ2VcbiIsIE5VTEwsIE5VTEwpOwogICAgIH0gZWxzZSB7CiAJaHRtbFBhcnNlRXJySW50KGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAogCQkJImh0bWxQYXJzZUNoYXJSZWY6IGludmFsaWQgeG1sQ2hhciB2YWx1ZSAlZFxuIiwKQEAgLTM1MDYsOSArMzY5MSwxMiBAQAogICAgIGlmIChDVVIgIT0gJz4nKSB7CiAJaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfRE9DVFlQRV9OT1RfRklOSVNIRUQsCiAJICAgICAgICAgICAgICJET0NUWVBFIGltcHJvcGVybHkgdGVybWluYXRlZFxuIiwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIC8qIFdlIHNob3VsZG4ndCB0cnkgdG8gcmVzeW5jaHJvbml6ZSAuLi4gKi8KKyAgICAgICAgLyogSWdub3JlIGJvZ3VzIGNvbnRlbnQgKi8KKyAgICAgICAgd2hpbGUgKChDVVIgIT0gMCkgJiYgKENVUiAhPSAnPicpKQorICAgICAgICAgICAgTkVYVDsKICAgICB9Ci0gICAgTkVYVDsKKyAgICBpZiAoQ1VSID09ICc+JykKKyAgICAgICAgTkVYVDsKIAogICAgIC8qCiAgICAgICogQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkgdG8gdGhlIERPQ1RZUEUKQEAgLTM3ODYsNyArMzk3NCw3IEBACiAKIAogCS8qIER1bXAgdGhlIGJvZ3VzIHRhZyBsaWtlIGJyb3dzZXJzIGRvICovCi0Jd2hpbGUgKChJU19DSEFSX0NIKENVUikpICYmIChDVVIgIT0gJz4nKSAmJgorCXdoaWxlICgoQ1VSICE9IDApICYmIChDVVIgIT0gJz4nKSAmJgogICAgICAgICAgICAgICAgKGN0eHQtPmluc3RhdGUgIT0gWE1MX1BBUlNFUl9FT0YpKQogCSAgICBORVhUOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0zODQyLDExICs0MDMwLDkgQEAKICAgICAgKiAoUyBBdHRyaWJ1dGUpKiBTPwogICAgICAqLwogICAgIFNLSVBfQkxBTktTOwotICAgIHdoaWxlICgoSVNfQ0hBUl9DSChDVVIpKSAmJgorICAgIHdoaWxlICgoQ1VSICE9IDApICYmCiAgICAgICAgICAgIChDVVIgIT0gJz4nKSAmJgogCSAgICgoQ1VSICE9ICcvJykgfHwgKE5YVCgxKSAhPSAnPicpKSkgewotCWxvbmcgY29ucyA9IGN0eHQtPm5iQ2hhcnM7Ci0KIAlHUk9XOwogCWF0dG5hbWUgPSBodG1sUGFyc2VBdHRyaWJ1dGUoY3R4dCwgJmF0dHZhbHVlKTsKICAgICAgICAgaWYgKGF0dG5hbWUgIT0gTlVMTCkgewpAQCAtMzkwNSw3ICs0MDkxLDcgQEAKIAkgICAgICAgIHhtbEZyZWUoYXR0dmFsdWUpOwogCSAgICAvKiBEdW1wIHRoZSBib2d1cyBhdHRyaWJ1dGUgc3RyaW5nIHVwIHRvIHRoZSBuZXh0IGJsYW5rIG9yCiAJICAgICAqIHRoZSBlbmQgb2YgdGhlIHRhZy4gKi8KLQkgICAgd2hpbGUgKChJU19DSEFSX0NIKENVUikpICYmCisJICAgIHdoaWxlICgoQ1VSICE9IDApICYmCiAJICAgICAgICAgICAhKElTX0JMQU5LX0NIKENVUikpICYmIChDVVIgIT0gJz4nKSAmJgogCQkgICAoKENVUiAhPSAnLycpIHx8IChOWFQoMSkgIT0gJz4nKSkpCiAJCU5FWFQ7CkBAIC0zOTEzLDEyICs0MDk5LDYgQEAKIAogZmFpbGVkOgogCVNLSVBfQkxBTktTOwotICAgICAgICBpZiAoY29ucyA9PSBjdHh0LT5uYkNoYXJzKSB7Ci0JICAgIGh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAotCSAgICAgICAgICAgICAgICAgImh0bWxQYXJzZVN0YXJ0VGFnOiBwcm9ibGVtIHBhcnNpbmcgYXR0cmlidXRlc1xuIiwKLQkJCSBOVUxMLCBOVUxMKTsKLQkgICAgYnJlYWs7Ci0JfQogICAgIH0KIAogICAgIC8qCkBAIC0zOTg2LDE5ICs0MTY2LDE0IEBACiAgICAgICogV2Ugc2hvdWxkIGRlZmluaXRlbHkgYmUgYXQgdGhlIGVuZGluZyAiUz8gJz4nIiBwYXJ0CiAgICAgICovCiAgICAgU0tJUF9CTEFOS1M7Ci0gICAgaWYgKCghSVNfQ0hBUl9DSChDVVIpKSB8fCAoQ1VSICE9ICc+JykpIHsKKyAgICBpZiAoQ1VSICE9ICc+JykgewogICAgICAgICBodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9HVF9SRVFVSVJFRCwKIAkgICAgICAgICAgICAgIkVuZCB0YWcgOiBleHBlY3RlZCAnPidcbiIsIE5VTEwsIE5VTEwpOwotCWlmIChjdHh0LT5yZWNvdmVyeSkgewotCSAgICAvKgotCSAgICAgKiBXZSdyZSBub3QgYXQgdGhlIGVuZGluZyA+ICEhCi0JICAgICAqIEVycm9yLCB1bmxlc3MgaW4gcmVjb3ZlciBtb2RlIHdoZXJlIHdlIHNlYXJjaCBmb3J3YXJkcwotCSAgICAgKiB1bnRpbCB3ZSBmaW5kIGEgPgotCSAgICAgKi8KLQkgICAgd2hpbGUgKENVUiAhPSAnXDAnICYmIENVUiAhPSAnPicpIE5FWFQ7Ci0JICAgIE5FWFQ7Ci0JfQotICAgIH0gZWxzZQorICAgICAgICAvKiBTa2lwIHRvIG5leHQgJz4nICovCisgICAgICAgIHdoaWxlICgoQ1VSICE9IDApICYmIChDVVIgIT0gJz4nKSkKKyAgICAgICAgICAgIE5FWFQ7CisgICAgfQorICAgIGlmIChDVVIgPT0gJz4nKQogICAgICAgICBORVhUOwogCiAgICAgLyoKQEAgLTQwMzksMTIgKzQyMTQsMTAgQEAKICAgICAgKiBXaXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUgYXV0b2Nsb3NlIG1heSBoYXZlIHBvcHBlZCBzdHVmZiBvdXQKICAgICAgKiBvZiB0aGUgc3RhY2suCiAgICAgICovCi0gICAgaWYgKCF4bWxTdHJFcXVhbChuYW1lLCBjdHh0LT5uYW1lKSkgewotICAgICAgICBpZiAoKGN0eHQtPm5hbWUgIT0gTlVMTCkgJiYgKCF4bWxTdHJFcXVhbChjdHh0LT5uYW1lLCBuYW1lKSkpIHsKLSAgICAgICAgICAgIGh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX1RBR19OQU1FX01JU01BVENILAotCSAgICAgICAgICAgICAgICAgIk9wZW5pbmcgYW5kIGVuZGluZyB0YWcgbWlzbWF0Y2g6ICVzIGFuZCAlc1xuIiwKLQkJCSBuYW1lLCBjdHh0LT5uYW1lKTsKLSAgICAgICAgfQorICAgIGlmICgoY3R4dC0+bmFtZSAhPSBOVUxMKSAmJiAoIXhtbFN0ckVxdWFsKGN0eHQtPm5hbWUsIG5hbWUpKSkgeworICAgICAgICBodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9UQUdfTkFNRV9NSVNNQVRDSCwKKyAgICAgICAgICAgICAgICAgICAgICJPcGVuaW5nIGFuZCBlbmRpbmcgdGFnIG1pc21hdGNoOiAlcyBhbmQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lLCBjdHh0LT5uYW1lKTsKICAgICB9CiAKICAgICAvKgpAQCAtNDE1OSw4ICs0MzMyLDYgQEAKICAgICBjdXJyZW50Tm9kZSA9IHhtbFN0cmR1cChjdHh0LT5uYW1lKTsKICAgICBkZXB0aCA9IGN0eHQtPm5hbWVOcjsKICAgICB3aGlsZSAoMSkgewotCWxvbmcgY29ucyA9IGN0eHQtPm5iQ2hhcnM7Ci0KICAgICAgICAgR1JPVzsKIAogICAgICAgICBpZiAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0VPRikKQEAgLTQxODgsNyArNDM1OSw3IEBACiAJCQkgImh0bWxQYXJzZVN0YXJ0VGFnOiBpbnZhbGlkIGVsZW1lbnQgbmFtZVxuIiwKIAkJCSBOVUxMLCBOVUxMKTsKIAkgICAgICAgIC8qIER1bXAgdGhlIGJvZ3VzIHRhZyBsaWtlIGJyb3dzZXJzIGRvICovCi0gICAgICAgIHdoaWxlICgoSVNfQ0hBUl9DSChDVVIpKSAmJiAoQ1VSICE9ICc+JykpCisgICAgICAgICAgICAgICAgd2hpbGUgKChDVVIgIT0gMCkgJiYgKENVUiAhPSAnPicpKQogCSAgICAgICAgICAgIE5FWFQ7CiAKIAkgICAgICAgIGlmIChjdXJyZW50Tm9kZSAhPSBOVUxMKQpAQCAtNDI4MCwxNSArNDQ1MSw2IEBACiAJICAgIGVsc2UgewogCQlodG1sUGFyc2VDaGFyRGF0YShjdHh0KTsKIAkgICAgfQotCi0JICAgIGlmIChjb25zID09IGN0eHQtPm5iQ2hhcnMpIHsKLQkJaWYgKGN0eHQtPm5vZGUgIT0gTlVMTCkgewotCQkgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCi0JCSAgICAgICAgICAgICAgICAgImRldGVjdGVkIGFuIGVycm9yIGluIGVsZW1lbnQgY29udGVudFxuIiwKLQkJCQkgTlVMTCwgTlVMTCk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KIAl9CiAgICAgICAgIEdST1c7CiAgICAgfQpAQCAtNDQwMyw3ICs0NTY1LDcgQEAKICAgICAgKi8KICAgICBjdXJyZW50Tm9kZSA9IHhtbFN0cmR1cChjdHh0LT5uYW1lKTsKICAgICBkZXB0aCA9IGN0eHQtPm5hbWVOcjsKLSAgICB3aGlsZSAoSVNfQ0hBUl9DSChDVVIpKSB7CisgICAgd2hpbGUgKENVUiAhPSAwKSB7CiAJb2xkcHRyID0gY3R4dC0+aW5wdXQtPmN1cjsKIAlodG1sUGFyc2VDb250ZW50KGN0eHQpOwogCWlmIChvbGRwdHI9PWN0eHQtPmlucHV0LT5jdXIpIGJyZWFrOwpAQCAtNDQyMCw3ICs0NTgyLDcgQEAKICAgICAgICBub2RlX2luZm8ubm9kZSA9IGN0eHQtPm5vZGU7CiAgICAgICAgeG1sUGFyc2VyQWRkTm9kZUluZm8oY3R4dCwgJm5vZGVfaW5mbyk7CiAgICAgfQotICAgIGlmICghSVNfQ0hBUl9DSChDVVIpKSB7CisgICAgaWYgKENVUiA9PSAwKSB7CiAJaHRtbEF1dG9DbG9zZU9uRW5kKGN0eHQpOwogICAgIH0KIApAQCAtNDQ0MSw3ICs0NjAzLDcgQEAKICAgICAgICB4bWxQYXJzZXJBZGROb2RlSW5mbyhjdHh0LCBjdHh0LT5ub2RlSW5mbyk7CiAgICAgICAgaHRtbE5vZGVJbmZvUG9wKGN0eHQpOwogICAgIH0KLSAgICBpZiAoIUlTX0NIQVJfQ0goQ1VSKSkgeworICAgIGlmIChDVVIgPT0gMCkgewogICAgICAgIGh0bWxBdXRvQ2xvc2VPbkVuZChjdHh0KTsKICAgICB9CiB9CkBAIC00NTU5LDggKzQ3MjEsNiBAQAogICAgIGN1cnJlbnROb2RlID0geG1sU3RyZHVwKGN0eHQtPm5hbWUpOwogICAgIGRlcHRoID0gY3R4dC0+bmFtZU5yOwogICAgIHdoaWxlICgxKSB7Ci0JbG9uZyBjb25zID0gY3R4dC0+bmJDaGFyczsKLQogICAgICAgICBHUk9XOwogCiAgICAgICAgIGlmIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKQpAQCAtNDU5MCw3ICs0NzUwLDcgQEAKIAkJCSAiaHRtbFBhcnNlU3RhcnRUYWc6IGludmFsaWQgZWxlbWVudCBuYW1lXG4iLAogCQkJIE5VTEwsIE5VTEwpOwogCSAgICAgICAgLyogRHVtcCB0aGUgYm9ndXMgdGFnIGxpa2UgYnJvd3NlcnMgZG8gKi8KLQkgICAgICAgIHdoaWxlICgoSVNfQ0hBUl9DSChDVVIpKSAmJiAoQ1VSICE9ICc+JykpCisJICAgICAgICB3aGlsZSAoKENVUiA9PSAwKSAmJiAoQ1VSICE9ICc+JykpCiAJICAgICAgICAgICAgTkVYVDsKIAogCSAgICAgICAgaHRtbFBhcnNlckZpbmlzaEVsZW1lbnRQYXJzaW5nKGN0eHQpOwpAQCAtNDY5NCwxNSArNDg1NCw2IEBACiAJICAgIGVsc2UgewogCQlodG1sUGFyc2VDaGFyRGF0YShjdHh0KTsKIAkgICAgfQotCi0JICAgIGlmIChjb25zID09IGN0eHQtPm5iQ2hhcnMpIHsKLQkJaWYgKGN0eHQtPm5vZGUgIT0gTlVMTCkgewotCQkgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCi0JCSAgICAgICAgICAgICAgICAgImRldGVjdGVkIGFuIGVycm9yIGluIGVsZW1lbnQgY29udGVudFxuIiwKLQkJCQkgTlVMTCwgTlVMTCk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KIAl9CiAgICAgICAgIEdST1c7CiAgICAgfQpAQCAtNDk2Niw3ICs1MTE3LDYgQEAKICAgICBjdHh0LT52Y3R4dC53YXJuaW5nID0geG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nOwogICAgIGN0eHQtPnJlY29yZF9pbmZvID0gMDsKICAgICBjdHh0LT52YWxpZGF0ZSA9IDA7Ci0gICAgY3R4dC0+bmJDaGFycyA9IDA7CiAgICAgY3R4dC0+Y2hlY2tJbmRleCA9IDA7CiAgICAgY3R4dC0+Y2F0YWxvZ3MgPSBOVUxMOwogICAgIHhtbEluaXROb2RlSW5mb1NlcSgmY3R4dC0+bm9kZV9zZXEpOwpAQCAtNTEyNiw3ICs1Mjc2LDcgQEAKICAqIEBmaXJzdDogIHRoZSBmaXJzdCBjaGFyIHRvIGxvb2t1cAogICogQG5leHQ6ICB0aGUgbmV4dCBjaGFyIHRvIGxvb2t1cCBvciB6ZXJvCiAgKiBAdGhpcmQ6ICB0aGUgbmV4dCBjaGFyIHRvIGxvb2t1cCBvciB6ZXJvCi0gKiBAY29tbWVudDogZmxhZyB0byBmb3JjZSBjaGVja2luZyBpbnNpZGUgY29tbWVudHMKKyAqIEBpZ25vcmVhdHRydmFsOiBza2lwIG92ZXIgYXR0cmlidXRlIHZhbHVlcwogICoKICAqIFRyeSB0byBmaW5kIGlmIGEgc2VxdWVuY2UgKGZpcnN0LCBuZXh0LCB0aGlyZCkgb3IgIGp1c3QgKGZpcnN0IG5leHQpIG9yCiAgKiAoZmlyc3QpIGlzIGF2YWlsYWJsZSBpbiB0aGUgaW5wdXQgc3RyZWFtLgpAQCAtNTE0MCwxMyArNTI5MCwxMSBAQAogICovCiBzdGF0aWMgaW50CiBodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShodG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxDaGFyIGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciBuZXh0LCB4bWxDaGFyIHRoaXJkLCBpbnQgaXNjb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlnbm9yZWF0dHJ2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyIG5leHQsIHhtbENoYXIgdGhpcmQsIGludCBpZ25vcmVhdHRydmFsKQogewogICAgIGludCBiYXNlLCBsZW47CiAgICAgaHRtbFBhcnNlcklucHV0UHRyIGluOwogICAgIGNvbnN0IHhtbENoYXIgKmJ1ZjsKLSAgICBpbnQgaW5jb21tZW50ID0gMDsKICAgICBpbnQgaW52YWx1ZSA9IDA7CiAgICAgY2hhciB2YWxkZWxsaW0gPSAweDA7CiAKQEAgLTUxNTgsOCArNTMwNiwxMSBAQAogICAgIGlmIChiYXNlIDwgMCkKICAgICAgICAgcmV0dXJuICgtMSk7CiAKLSAgICBpZiAoY3R4dC0+Y2hlY2tJbmRleCA+IGJhc2UpCisgICAgaWYgKGN0eHQtPmNoZWNrSW5kZXggPiBiYXNlKSB7CiAgICAgICAgIGJhc2UgPSBjdHh0LT5jaGVja0luZGV4OworICAgICAgICAvKiBBYnVzZSBoYXNQRXJlZnMgbWVtYmVyIHRvIHJlc3RvcmUgY3VycmVudCBzdGF0ZS4gKi8KKyAgICAgICAgaW52YWx1ZSA9IGN0eHQtPmhhc1BFcmVmcyAmIDEgPyAxIDogMDsKKyAgICB9CiAKICAgICBpZiAoaW4tPmJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIGJ1ZiA9IGluLT5iYXNlOwpAQCAtNTE3NSwxNCArNTMyNiw2IEBACiAgICAgZWxzZSBpZiAobmV4dCkKICAgICAgICAgbGVuLS07CiAgICAgZm9yICg7IGJhc2UgPCBsZW47IGJhc2UrKykgewotICAgICAgICBpZiAoKCFpbmNvbW1lbnQpICYmIChiYXNlICsgNCA8IGxlbikgJiYgKCFpc2NvbW1lbnQpKSB7Ci0gICAgICAgICAgICBpZiAoKGJ1ZltiYXNlXSA9PSAnPCcpICYmIChidWZbYmFzZSArIDFdID09ICchJykgJiYKLSAgICAgICAgICAgICAgICAoYnVmW2Jhc2UgKyAyXSA9PSAnLScpICYmIChidWZbYmFzZSArIDNdID09ICctJykpIHsKLSAgICAgICAgICAgICAgICBpbmNvbW1lbnQgPSAxOwotICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBpbmNyZW1lbnQgcGFzdCA8ISAtIHNvbWUgcGVvcGxlIHVzZSA8IS0tPiAqLwotICAgICAgICAgICAgICAgIGJhc2UgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICBpZiAoaWdub3JlYXR0cnZhbCkgewogICAgICAgICAgICAgaWYgKGJ1ZltiYXNlXSA9PSAnIicgfHwgYnVmW2Jhc2VdID09ICdcJycpIHsKICAgICAgICAgICAgICAgICBpZiAoaW52YWx1ZSkgewpAQCAtNTE5OSwxNiArNTM0Miw2IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGluY29tbWVudCkgewotICAgICAgICAgICAgaWYgKGJhc2UgKyAzID4gbGVuKQotICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOwotICAgICAgICAgICAgaWYgKChidWZbYmFzZV0gPT0gJy0nKSAmJiAoYnVmW2Jhc2UgKyAxXSA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgKGJ1ZltiYXNlICsgMl0gPT0gJz4nKSkgewotICAgICAgICAgICAgICAgIGluY29tbWVudCA9IDA7Ci0gICAgICAgICAgICAgICAgYmFzZSArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKGJ1ZltiYXNlXSA9PSBmaXJzdCkgewogICAgICAgICAgICAgaWYgKHRoaXJkICE9IDApIHsKICAgICAgICAgICAgICAgICBpZiAoKGJ1ZltiYXNlICsgMV0gIT0gbmV4dCkgfHwgKGJ1ZltiYXNlICsgMl0gIT0gdGhpcmQpKQpAQCAtNTIzNSw4ICs1MzY4LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gKGJhc2UgLSAoaW4tPmN1ciAtIGluLT5iYXNlKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCghaW5jb21tZW50KSAmJiAoIWludmFsdWUpKQotICAgICAgICBjdHh0LT5jaGVja0luZGV4ID0gYmFzZTsKKyAgICBjdHh0LT5jaGVja0luZGV4ID0gYmFzZTsKKyAgICAvKiBBYnVzZSBoYXNQRXJlZnMgbWVtYmVyIHRvIHRyYWNrIGN1cnJlbnQgc3RhdGUuICovCisgICAgaWYgKGludmFsdWUpCisgICAgICAgIGN0eHQtPmhhc1BFcmVmcyB8PSAxOworICAgIGVsc2UKKyAgICAgICAgY3R4dC0+aGFzUEVyZWZzICY9IH4xOwogI2lmZGVmIERFQlVHX1BVU0gKICAgICBpZiAobmV4dCA9PSAwKQogICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTUyNTMsNzkgKzUzOTAsMzggQEAKIH0KIAogLyoqCi0gKiBodG1sUGFyc2VMb29rdXBDaGFyczoKKyAqIGh0bWxQYXJzZUxvb2t1cENvbW1lbnRFbmQ6CiAgKiBAY3R4dDogYW4gSFRNTCBwYXJzZXIgY29udGV4dAotICogQHN0b3A6IEFycmF5IG9mIGNoYXJzLCB3aGljaCBzdG9wIHRoZSBsb29rdXAuCi0gKiBAc3RvcExlbjogTGVuZ3RoIG9mIHN0b3AtQXJyYXkKICAqCi0gKiBUcnkgdG8gZmluZCBpZiBhbnkgY2hhciBvZiB0aGUgc3RvcC1BcnJheSBpcyBhdmFpbGFibGUgaW4gdGhlIGlucHV0Ci0gKiBzdHJlYW0uCisgKiBUcnkgdG8gZmluZCBhIGNvbW1lbnQgZW5kIHRhZyBpbiB0aGUgaW5wdXQgc3RyZWFtCisgKiBUaGUgc2VhcmNoIGluY2x1ZGVzICItLT4iIGFzIHdlbGwgYXMgV0hBVFdHLXJlY29tbWVuZGVkIGluY29ycmVjdGx5LWNsb3NlZCB0YWdzLgorICogKFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjcGFyc2UtZXJyb3ItaW5jb3JyZWN0bHktY2xvc2VkLWNvbW1lbnQpCiAgKiBUaGlzIGZ1bmN0aW9uIGhhcyBhIHNpZGUgZWZmZWN0IG9mIChwb3NzaWJseSkgaW5jcmVtZW50aW5nIGN0eHQtPmNoZWNrSW5kZXgKICAqIHRvIGF2b2lkIHJlc2Nhbm5pbmcgc2VxdWVuY2VzIG9mIGJ5dGVzLCBpdCBET0VTIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlCiAgKiBwYXJzZXIsIGRvIG5vdCB1c2UgbGliZXJhbGx5LgorICogVGhpcyB3cmFwcyB0byBodG1sUGFyc2VMb29rdXBTZXF1ZW5jZSgpCiAgKgotICogUmV0dXJucyB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgcGFyc2luZyBwb2ludCBpZiBhIHN0b3BDaGFyCi0gKiAgICAgIGlzIGF2YWlsYWJsZSwgLTEgb3RoZXJ3aXNlLgorICogUmV0dXJucyB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgcGFyc2luZyBwb2ludCBpZiB0aGUgZnVsbCBzZXF1ZW5jZSBpcyBhdmFpbGFibGUsIC0xIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGludAotaHRtbFBhcnNlTG9va3VwQ2hhcnMoaHRtbFBhcnNlckN0eHRQdHIgY3R4dCwgY29uc3QgeG1sQ2hhciAqIHN0b3AsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcExlbikKK2h0bWxQYXJzZUxvb2t1cENvbW1lbnRFbmQoaHRtbFBhcnNlckN0eHRQdHIgY3R4dCkKIHsKLSAgICBpbnQgYmFzZSwgbGVuOwotICAgIGh0bWxQYXJzZXJJbnB1dFB0ciBpbjsKLSAgICBjb25zdCB4bWxDaGFyICpidWY7Ci0gICAgaW50IGluY29tbWVudCA9IDA7Ci0gICAgaW50IGk7CisgICAgaW50IG1hcmsgPSAwOworICAgIGludCBjdXIgPSBDVVJfUFRSIC0gQkFTRV9QVFI7CiAKLSAgICBpbiA9IGN0eHQtPmlucHV0OwotICAgIGlmIChpbiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKC0xKTsKLQotICAgIGJhc2UgPSBpbi0+Y3VyIC0gaW4tPmJhc2U7Ci0gICAgaWYgKGJhc2UgPCAwKQotICAgICAgICByZXR1cm4gKC0xKTsKLQotICAgIGlmIChjdHh0LT5jaGVja0luZGV4ID4gYmFzZSkKLSAgICAgICAgYmFzZSA9IGN0eHQtPmNoZWNrSW5kZXg7Ci0KLSAgICBpZiAoaW4tPmJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIGJ1ZiA9IGluLT5iYXNlOwotICAgICAgICBsZW4gPSBpbi0+bGVuZ3RoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZiA9IHhtbEJ1ZkNvbnRlbnQoaW4tPmJ1Zi0+YnVmZmVyKTsKLSAgICAgICAgbGVuID0geG1sQnVmVXNlKGluLT5idWYtPmJ1ZmZlcik7CisgICAgd2hpbGUgKG1hcmsgPj0gMCkgeworCW1hcmsgPSBodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnLScsICctJywgMCwgMCk7CisJaWYgKChtYXJrIDwgMCkgfHwKKwkgICAgKE5YVChtYXJrKzIpID09ICc+JykgfHwKKwkgICAgKChOWFQobWFyaysyKSA9PSAnIScpICYmIChOWFQobWFyayszKSA9PSAnPicpKSkgeworCSAgICByZXR1cm4gbWFyazsKKwl9CisJY3R4dC0+Y2hlY2tJbmRleCA9IGN1ciArIG1hcmsgKyAxOwogICAgIH0KLQotICAgIGZvciAoOyBiYXNlIDwgbGVuOyBiYXNlKyspIHsKLSAgICAgICAgaWYgKCFpbmNvbW1lbnQgJiYgKGJhc2UgKyA0IDwgbGVuKSkgewotICAgICAgICAgICAgaWYgKChidWZbYmFzZV0gPT0gJzwnKSAmJiAoYnVmW2Jhc2UgKyAxXSA9PSAnIScpICYmCi0gICAgICAgICAgICAgICAgKGJ1ZltiYXNlICsgMl0gPT0gJy0nKSAmJiAoYnVmW2Jhc2UgKyAzXSA9PSAnLScpKSB7Ci0gICAgICAgICAgICAgICAgaW5jb21tZW50ID0gMTsKLSAgICAgICAgICAgICAgICAvKiBkbyBub3QgaW5jcmVtZW50IHBhc3QgPCEgLSBzb21lIHBlb3BsZSB1c2UgPCEtLT4gKi8KLSAgICAgICAgICAgICAgICBiYXNlICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluY29tbWVudCkgewotICAgICAgICAgICAgaWYgKGJhc2UgKyAzID4gbGVuKQotICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOwotICAgICAgICAgICAgaWYgKChidWZbYmFzZV0gPT0gJy0nKSAmJiAoYnVmW2Jhc2UgKyAxXSA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgKGJ1ZltiYXNlICsgMl0gPT0gJz4nKSkgewotICAgICAgICAgICAgICAgIGluY29tbWVudCA9IDA7Ci0gICAgICAgICAgICAgICAgYmFzZSArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0b3BMZW47ICsraSkgewotICAgICAgICAgICAgaWYgKGJ1ZltiYXNlXSA9PSBzdG9wW2ldKSB7Ci0gICAgICAgICAgICAgICAgY3R4dC0+Y2hlY2tJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChiYXNlIC0gKGluLT5jdXIgLSBpbi0+YmFzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGN0eHQtPmNoZWNrSW5kZXggPSBiYXNlOwotICAgIHJldHVybiAoLTEpOworICAgIHJldHVybiBtYXJrOwogfQogCisKIC8qKgogICogaHRtbFBhcnNlVHJ5T3JGaW5pc2g6CiAgKiBAY3R4dDogIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQKQEAgLTUzMzksNyArNTQzNSw3IEBACiBodG1sUGFyc2VUcnlPckZpbmlzaChodG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBpbnQgdGVybWluYXRlKSB7CiAgICAgaW50IHJldCA9IDA7CiAgICAgaHRtbFBhcnNlcklucHV0UHRyIGluOwotICAgIGludCBhdmFpbCA9IDA7CisgICAgcHRyZGlmZl90IGF2YWlsID0gMDsKICAgICB4bWxDaGFyIGN1ciwgbmV4dDsKIAogICAgIGh0bWxQYXJzZXJOb2RlSW5mbyBub2RlX2luZm87CkBAIC01NDA0LDcgKzU1MDAsOCBAQAogCWlmIChpbi0+YnVmID09IE5VTEwpCiAJICAgIGF2YWlsID0gaW4tPmxlbmd0aCAtIChpbi0+Y3VyIC0gaW4tPmJhc2UpOwogCWVsc2UKLQkgICAgYXZhaWwgPSB4bWxCdWZVc2UoaW4tPmJ1Zi0+YnVmZmVyKSAtIChpbi0+Y3VyIC0gaW4tPmJhc2UpOworCSAgICBhdmFpbCA9IChwdHJkaWZmX3QpeG1sQnVmVXNlKGluLT5idWYtPmJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAoaW4tPmN1ciAtIGluLT5iYXNlKTsKIAlpZiAoKGF2YWlsID09IDApICYmICh0ZXJtaW5hdGUpKSB7CiAJICAgIGh0bWxBdXRvQ2xvc2VPbkVuZChjdHh0KTsKIAkgICAgaWYgKChjdHh0LT5uYW1lTnIgPT0gMCkgJiYgKGN0eHQtPmluc3RhdGUgIT0gWE1MX1BBUlNFUl9FT0YpKSB7CkBAIC01NDE4LDYgKzU1MTUsMTIgQEAKIAl9CiAgICAgICAgIGlmIChhdmFpbCA8IDEpCiAJICAgIGdvdG8gZG9uZTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBpcyBkb25lIHRvIG1ha2UgcHJvZ3Jlc3MgYW5kIGF2b2lkIGFuIGluZmluaXRlIGxvb3AKKyAgICAgICAgICogaWYgYSBwYXJzaW5nIGF0dGVtcHQgd2FzIGFib3J0ZWQgYnkgaGl0dGluZyBhIE5VTCBieXRlLiBBZnRlcgorICAgICAgICAgKiBjaGFuZ2luZyBodG1sQ3VycmVudENoYXIsIHRoaXMgcHJvYmFibHkgaXNuJ3QgbmVjZXNzYXJ5IGFueW1vcmUuCisgICAgICAgICAqIFdlIHNob3VsZCBjb25zaWRlciByZW1vdmluZyB0aGlzIGNoZWNrLgorICAgICAgICAgKi8KIAljdXIgPSBpbi0+Y3VyWzBdOwogCWlmIChjdXIgPT0gMCkgewogCSAgICBTS0lQKDEpOwpAQCAtNTQ0MCw3ICs1NTQzLDggQEAKIAkJICAgIGlmIChpbi0+YnVmID09IE5VTEwpCiAJCQlhdmFpbCA9IGluLT5sZW5ndGggLSAoaW4tPmN1ciAtIGluLT5iYXNlKTsKIAkJICAgIGVsc2UKLQkJCWF2YWlsID0geG1sQnVmVXNlKGluLT5idWYtPmJ1ZmZlcikgLSAoaW4tPmN1ciAtIGluLT5iYXNlKTsKKwkJCWF2YWlsID0gKHB0cmRpZmZfdCl4bWxCdWZVc2UoaW4tPmJ1Zi0+YnVmZmVyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbi0+Y3VyIC0gaW4tPmJhc2UpOwogCQl9CiAJCWlmICgoY3R4dC0+c2F4KSAmJiAoY3R4dC0+c2F4LT5zZXREb2N1bWVudExvY2F0b3IpKQogCQkgICAgY3R4dC0+c2F4LT5zZXREb2N1bWVudExvY2F0b3IoY3R4dC0+dXNlckRhdGEsCkBAIC01NDU3LDcgKzU1NjEsNyBAQAogCQkgICAgKFVQUCg2KSA9PSAnWScpICYmIChVUFAoNykgPT0gJ1AnKSAmJgogCQkgICAgKFVQUCg4KSA9PSAnRScpKSB7CiAJCSAgICBpZiAoKCF0ZXJtaW5hdGUpICYmCi0JCSAgICAgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc+JywgMCwgMCwgMCwgMSkgPCAwKSkKKwkJICAgICAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJz4nLCAwLCAwLCAxKSA8IDApKQogCQkJZ290byBkb25lOwogI2lmZGVmIERFQlVHX1BVU0gKIAkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LApAQCAtNTQ4Miw3ICs1NTg2LDggQEAKIAkJaWYgKGluLT5idWYgPT0gTlVMTCkKIAkJICAgIGF2YWlsID0gaW4tPmxlbmd0aCAtIChpbi0+Y3VyIC0gaW4tPmJhc2UpOwogCQllbHNlCi0JCSAgICBhdmFpbCA9IHhtbEJ1ZlVzZShpbi0+YnVmLT5idWZmZXIpIC0gKGluLT5jdXIgLSBpbi0+YmFzZSk7CisJCSAgICBhdmFpbCA9IChwdHJkaWZmX3QpeG1sQnVmVXNlKGluLT5idWYtPmJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbi0+Y3VyIC0gaW4tPmJhc2UpOwogCQkvKgogCQkgKiBubyBjaGFycyBpbiBidWZmZXIKIAkJICovCkBAIC01NTAyLDggKzU2MDcsNyBAQAogCQljdXIgPSBpbi0+Y3VyWzBdOwogCSAgICAgICAgaWYgKChjdXIgPT0gJzwnKSAmJiAobmV4dCA9PSAnIScpICYmCiAJCSAgICAoaW4tPmN1clsyXSA9PSAnLScpICYmIChpbi0+Y3VyWzNdID09ICctJykpIHsKLQkJICAgIGlmICgoIXRlcm1pbmF0ZSkgJiYKLQkJICAgICAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJy0nLCAnLScsICc+JywgMSwgMSkgPCAwKSkKKwkJICAgIGlmICgoIXRlcm1pbmF0ZSkgJiYgKGh0bWxQYXJzZUxvb2t1cENvbW1lbnRFbmQoY3R4dCkgPCAwKSkKIAkJCWdvdG8gZG9uZTsKICNpZmRlZiBERUJVR19QVVNICiAJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTU1MTMsNyArNTYxNyw3IEBACiAJCSAgICBjdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9NSVNDOwogCSAgICAgICAgfSBlbHNlIGlmICgoY3VyID09ICc8JykgJiYgKG5leHQgPT0gJz8nKSkgewogCQkgICAgaWYgKCghdGVybWluYXRlKSAmJgotCQkgICAgICAgIChodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnPicsIDAsIDAsIDAsIDEpIDwgMCkpCisJCSAgICAgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc+JywgMCwgMCwgMCkgPCAwKSkKIAkJCWdvdG8gZG9uZTsKICNpZmRlZiBERUJVR19QVVNICiAJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTU1MjcsNyArNTYzMSw3IEBACiAJCSAgICAoVVBQKDYpID09ICdZJykgJiYgKFVQUCg3KSA9PSAnUCcpICYmCiAJCSAgICAoVVBQKDgpID09ICdFJykpIHsKIAkJICAgIGlmICgoIXRlcm1pbmF0ZSkgJiYKLQkJICAgICAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJz4nLCAwLCAwLCAwLCAxKSA8IDApKQorCQkgICAgICAgIChodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnPicsIDAsIDAsIDEpIDwgMCkpCiAJCQlnb3RvIGRvbmU7CiAjaWZkZWYgREVCVUdfUFVTSAogCQkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCkBAIC01NTQzLDcgKzU2NDcsNyBAQAogCQkgICAgICAgICAgIChhdmFpbCA8IDkpKSB7CiAJCSAgICBnb3RvIGRvbmU7CiAJCX0gZWxzZSB7Ci0JCSAgICBjdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9TVEFSVF9UQUc7CisJCSAgICBjdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9DT05URU5UOwogI2lmZGVmIERFQlVHX1BVU0gKIAkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJICAgICJIUFA6IGVudGVyaW5nIFNUQVJUX1RBR1xuIik7CkBAIC01NTU1LDE1ICs1NjU5LDE1IEBACiAJCWlmIChpbi0+YnVmID09IE5VTEwpCiAJCSAgICBhdmFpbCA9IGluLT5sZW5ndGggLSAoaW4tPmN1ciAtIGluLT5iYXNlKTsKIAkJZWxzZQotCQkgICAgYXZhaWwgPSB4bWxCdWZVc2UoaW4tPmJ1Zi0+YnVmZmVyKSAtIChpbi0+Y3VyIC0gaW4tPmJhc2UpOworCQkgICAgYXZhaWwgPSAocHRyZGlmZl90KXhtbEJ1ZlVzZShpbi0+YnVmLT5idWZmZXIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4tPmN1ciAtIGluLT5iYXNlKTsKIAkJaWYgKGF2YWlsIDwgMikKIAkJICAgIGdvdG8gZG9uZTsKIAkJY3VyID0gaW4tPmN1clswXTsKIAkJbmV4dCA9IGluLT5jdXJbMV07CiAJCWlmICgoY3VyID09ICc8JykgJiYgKG5leHQgPT0gJyEnKSAmJgogCQkgICAgKGluLT5jdXJbMl0gPT0gJy0nKSAmJiAoaW4tPmN1clszXSA9PSAnLScpKSB7Ci0JCSAgICBpZiAoKCF0ZXJtaW5hdGUpICYmCi0JCSAgICAgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICctJywgJy0nLCAnPicsIDEsIDEpIDwgMCkpCisJCSAgICBpZiAoKCF0ZXJtaW5hdGUpICYmIChodG1sUGFyc2VMb29rdXBDb21tZW50RW5kKGN0eHQpIDwgMCkpCiAJCQlnb3RvIGRvbmU7CiAjaWZkZWYgREVCVUdfUFVTSAogCQkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCkBAIC01NTczLDcgKzU2NzcsNyBAQAogCQkgICAgY3R4dC0+aW5zdGF0ZSA9IFhNTF9QQVJTRVJfUFJPTE9HOwogCSAgICAgICAgfSBlbHNlIGlmICgoY3VyID09ICc8JykgJiYgKG5leHQgPT0gJz8nKSkgewogCQkgICAgaWYgKCghdGVybWluYXRlKSAmJgotCQkgICAgICAgIChodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnPicsIDAsIDAsIDAsIDEpIDwgMCkpCisJCSAgICAgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc+JywgMCwgMCwgMCkgPCAwKSkKIAkJCWdvdG8gZG9uZTsKICNpZmRlZiBERUJVR19QVVNICiAJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTU1ODUsNyArNTY4OSw3IEBACiAJCSAgICAgICAgICAgKGF2YWlsIDwgNCkpIHsKIAkJICAgIGdvdG8gZG9uZTsKIAkJfSBlbHNlIHsKLQkJICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX1NUQVJUX1RBRzsKKwkJICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTlRFTlQ7CiAjaWZkZWYgREVCVUdfUFVTSAogCQkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJCQkgICAgIkhQUDogZW50ZXJpbmcgU1RBUlRfVEFHXG4iKTsKQEAgLTU1OTYsNyArNTcwMCw4IEBACiAJCWlmIChpbi0+YnVmID09IE5VTEwpCiAJCSAgICBhdmFpbCA9IGluLT5sZW5ndGggLSAoaW4tPmN1ciAtIGluLT5iYXNlKTsKIAkJZWxzZQotCQkgICAgYXZhaWwgPSB4bWxCdWZVc2UoaW4tPmJ1Zi0+YnVmZmVyKSAtIChpbi0+Y3VyIC0gaW4tPmJhc2UpOworCQkgICAgYXZhaWwgPSAocHRyZGlmZl90KXhtbEJ1ZlVzZShpbi0+YnVmLT5idWZmZXIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4tPmN1ciAtIGluLT5iYXNlKTsKIAkJaWYgKGF2YWlsIDwgMSkKIAkJICAgIGdvdG8gZG9uZTsKIAkJY3VyID0gaW4tPmN1clswXTsKQEAgLTU2MDksOCArNTcxNCw3IEBACiAJCW5leHQgPSBpbi0+Y3VyWzFdOwogCSAgICAgICAgaWYgKChjdXIgPT0gJzwnKSAmJiAobmV4dCA9PSAnIScpICYmCiAJCSAgICAoaW4tPmN1clsyXSA9PSAnLScpICYmIChpbi0+Y3VyWzNdID09ICctJykpIHsKLQkJICAgIGlmICgoIXRlcm1pbmF0ZSkgJiYKLQkJICAgICAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJy0nLCAnLScsICc+JywgMSwgMSkgPCAwKSkKKwkJICAgIGlmICgoIXRlcm1pbmF0ZSkgJiYgKGh0bWxQYXJzZUxvb2t1cENvbW1lbnRFbmQoY3R4dCkgPCAwKSkKIAkJCWdvdG8gZG9uZTsKICNpZmRlZiBERUJVR19QVVNICiAJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTU2MjAsNyArNTcyNCw3IEBACiAJCSAgICBjdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9FUElMT0c7CiAJICAgICAgICB9IGVsc2UgaWYgKChjdXIgPT0gJzwnKSAmJiAobmV4dCA9PSAnPycpKSB7CiAJCSAgICBpZiAoKCF0ZXJtaW5hdGUpICYmCi0JCSAgICAgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc+JywgMCwgMCwgMCwgMSkgPCAwKSkKKwkJICAgICAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJz4nLCAwLCAwLCAwKSA8IDApKQogCQkJZ290byBkb25lOwogI2lmZGVmIERFQlVHX1BVU0gKIAkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LApAQCAtNTY4NCw3ICs1Nzg4LDcgQEAKIAkJICAgIGJyZWFrOwogCQl9CiAJCWlmICgoIXRlcm1pbmF0ZSkgJiYKLQkJICAgIChodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnPicsIDAsIDAsIDAsIDEpIDwgMCkpCisJCSAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJz4nLCAwLCAwLCAxKSA8IDApKQogCQkgICAgZ290byBkb25lOwogCiAgICAgICAgICAgICAgICAgLyogQ2FwdHVyZSBzdGFydCBwb3NpdGlvbiAqLwpAQCAtNTc3Niw3ICs1ODgwLDYgQEAKIAkgICAgfQogICAgICAgICAgICAgY2FzZSBYTUxfUEFSU0VSX0NPTlRFTlQ6IHsKIAkJeG1sQ2hhciBjaHJbMl0gPSB7IDAsIDAgfTsKLQkJbG9uZyBjb25zOwogCiAgICAgICAgICAgICAgICAgLyoKIAkJICogSGFuZGxlIHByZXBhcnNlZCBlbnRpdGllcyBhbmQgY2hhclJlZgpAQCAtNTgyMSw3ICs1OTI0LDYgQEAKIAkJICAgIGdvdG8gZG9uZTsKIAkJY3VyID0gaW4tPmN1clswXTsKIAkJbmV4dCA9IGluLT5jdXJbMV07Ci0JCWNvbnMgPSBjdHh0LT5uYkNoYXJzOwogCQlpZiAoKHhtbFN0ckVxdWFsKGN0eHQtPm5hbWUsIEJBRF9DQVNUInNjcmlwdCIpKSB8fAogCQkgICAgKHhtbFN0ckVxdWFsKGN0eHQtPm5hbWUsIEJBRF9DQVNUInN0eWxlIikpKSB7CiAJCSAgICAvKgpAQCAtNTgzMSw3ICs1OTMzLDcgQEAKIAkJICAgICAgICBpbnQgaWR4OwogCQkJeG1sQ2hhciB2YWw7CiAKLQkJCWlkeCA9IGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc8JywgJy8nLCAwLCAwLCAwKTsKKwkJCWlkeCA9IGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc8JywgJy8nLCAwLCAwKTsKIAkJCWlmIChpZHggPCAwKQogCQkJICAgIGdvdG8gZG9uZTsKIAkJICAgICAgICB2YWwgPSBpbi0+Y3VyW2lkeCArIDJdOwpAQCAtNTg1OCw3ICs1OTYwLDcgQEAKIAkJCShVUFAoNikgPT0gJ1knKSAmJiAoVVBQKDcpID09ICdQJykgJiYKIAkJCShVUFAoOCkgPT0gJ0UnKSkgewogCQkJaWYgKCghdGVybWluYXRlKSAmJgotCQkJICAgIChodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnPicsIDAsIDAsIDAsIDEpIDwgMCkpCisJCQkgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc+JywgMCwgMCwgMSkgPCAwKSkKIAkJCSAgICBnb3RvIGRvbmU7CiAJCQlodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0hUTUxfU1RSVUNVUkVfRVJST1IsCiAJCQkgICAgICAgICAgICAgIk1pc3BsYWNlZCBET0NUWVBFIGRlY2xhcmF0aW9uXG4iLApAQCAtNTg2Niw5ICs1OTY4LDcgQEAKIAkJCWh0bWxQYXJzZURvY1R5cGVEZWNsKGN0eHQpOwogCQkgICAgfSBlbHNlIGlmICgoY3VyID09ICc8JykgJiYgKG5leHQgPT0gJyEnKSAmJgogCQkJKGluLT5jdXJbMl0gPT0gJy0nKSAmJiAoaW4tPmN1clszXSA9PSAnLScpKSB7Ci0JCQlpZiAoKCF0ZXJtaW5hdGUpICYmCi0JCQkgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKAotCQkJCWN0eHQsICctJywgJy0nLCAnPicsIDEsIDEpIDwgMCkpCisJCQlpZiAoKCF0ZXJtaW5hdGUpICYmIChodG1sUGFyc2VMb29rdXBDb21tZW50RW5kKGN0eHQpIDwgMCkpCiAJCQkgICAgZ290byBkb25lOwogI2lmZGVmIERFQlVHX1BVU0gKIAkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LApAQCAtNTg3OCw3ICs1OTc4LDcgQEAKIAkJCWN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTlRFTlQ7CiAJCSAgICB9IGVsc2UgaWYgKChjdXIgPT0gJzwnKSAmJiAobmV4dCA9PSAnPycpKSB7CiAJCQlpZiAoKCF0ZXJtaW5hdGUpICYmCi0JCQkgICAgKGh0bWxQYXJzZUxvb2t1cFNlcXVlbmNlKGN0eHQsICc+JywgMCwgMCwgMCwgMSkgPCAwKSkKKwkJCSAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJz4nLCAwLCAwLCAwKSA8IDApKQogCQkJICAgIGdvdG8gZG9uZTsKICNpZmRlZiBERUJVR19QVVNICiAJCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTU4OTcsMjQgKzU5OTcsMzUgQEAKICNlbmRpZgogCQkJYnJlYWs7CiAJCSAgICB9IGVsc2UgaWYgKGN1ciA9PSAnPCcpIHsKLQkJCWN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX1NUQVJUX1RBRzsKLQkJCWN0eHQtPmNoZWNrSW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghdGVybWluYXRlKSAmJiAobmV4dCA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT25seSBzd2l0Y2ggdG8gU1RBUlRfVEFHIGlmIHRoZSBuZXh0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhcnRzIGEgdmFsaWQgbmFtZS4gT3RoZXJ3aXNlLCBodG1sUGFyc2VTdGFydFRhZworICAgICAgICAgICAgICAgICAgICAgICAgICogbWlnaHQgcmV0dXJuIHdpdGhvdXQgY29uc3VtaW5nIGFsbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB1cCB0byB0aGUgZmluYWwgJz4nLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKElTX0FTQ0lJX0xFVFRFUihuZXh0KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dCA9PSAnXycpIHx8IChuZXh0ID09ICc6JykgfHwgKG5leHQgPT0gJy4nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX1NUQVJUX1RBRzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5jaGVja0luZGV4ID0gMDsKICNpZmRlZiBERUJVR19QVVNICi0JCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCQkiSFBQOiBlbnRlcmluZyBTVEFSVF9UQUdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhQUDogZW50ZXJpbmcgU1RBUlRfVEFHXG4iKTsKICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9OQU1FX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbFBhcnNlVHJ5T3JGaW5pc2g6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZWxlbWVudCBuYW1lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sQ2hlY2tQYXJhZ3JhcGgoY3R4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eHQtPnNheC0+Y2hhcmFjdGVycyAhPSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+c2F4LT5jaGFyYWN0ZXJzKGN0eHQtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmN1ciwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWJyZWFrOwotCQkgICAgfSBlbHNlIGlmIChjdXIgPT0gJyYnKSB7Ci0JCQlpZiAoKCF0ZXJtaW5hdGUpICYmCi0JCQkgICAgKGh0bWxQYXJzZUxvb2t1cENoYXJzKGN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICI7ID4vIiwgNCkgPCAwKSkKLQkJCSAgICBnb3RvIGRvbmU7Ci0jaWZkZWYgREVCVUdfUFVTSAotCQkJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCi0JCQkJIkhQUDogUGFyc2luZyBSZWZlcmVuY2VcbiIpOwotI2VuZGlmCi0JCQkvKiBUT0RPOiBjaGVjayBnZW5lcmF0aW9uIG9mIHN1YnRyZWVzIGlmIG5vZW50ICEhISAqLwotCQkJaHRtbFBhcnNlUmVmZXJlbmNlKGN0eHQpOwogCQkgICAgfSBlbHNlIHsKIAkJICAgICAgICAvKgogCQkJICogY2hlY2sgdGhhdCB0aGUgdGV4dCBzZXF1ZW5jZSBpcyBjb21wbGV0ZQpAQCAtNTkyMywyNSArNjAzNCwyNCBAQAogCQkJICogZGF0YSBkZXRlY3Rpb24uCiAJCQkgKi8KIAkJCWlmICgoIXRlcm1pbmF0ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHRtbFBhcnNlTG9va3VwQ2hhcnMoY3R4dCwgQkFEX0NBU1QgIjwmIiwgMikgPCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJzwnLCAwLCAwLCAwKSA8IDApKQogCQkJICAgIGdvdG8gZG9uZTsKIAkJCWN0eHQtPmNoZWNrSW5kZXggPSAwOwogI2lmZGVmIERFQlVHX1BVU0gKIAkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJCSJIUFA6IFBhcnNpbmcgY2hhciBkYXRhXG4iKTsKICNlbmRpZgotCQkJaHRtbFBhcnNlQ2hhckRhdGEoY3R4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN0eHQtPmluc3RhdGUgIT0gWE1MX1BBUlNFUl9FT0YpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1ciAhPSAnPCcpICYmIChpbi0+Y3VyIDwgaW4tPmVuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID09ICcmJykgeworCQkJICAgICAgICBodG1sUGFyc2VSZWZlcmVuY2UoY3R4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCSAgICAgICAgaHRtbFBhcnNlQ2hhckRhdGEoY3R4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ciA9IGluLT5jdXJbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCSAgICB9CiAJCX0KLQkJaWYgKGNvbnMgPT0gY3R4dC0+bmJDaGFycykgewotCQkgICAgaWYgKGN0eHQtPm5vZGUgIT0gTlVMTCkgewotCQkJaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCi0JCQkgICAgICAgICAgICAgImRldGVjdGVkIGFuIGVycm9yIGluIGVsZW1lbnQgY29udGVudFxuIiwKLQkJCQkgICAgIE5VTEwsIE5VTEwpOwotCQkgICAgfQotCQkgICAgTkVYVDsKLQkJICAgIGJyZWFrOwotCQl9CiAKIAkJYnJlYWs7CiAJICAgIH0KQEAgLTU5NDksNyArNjA1OSw3IEBACiAJCWlmIChhdmFpbCA8IDIpCiAJCSAgICBnb3RvIGRvbmU7CiAJCWlmICgoIXRlcm1pbmF0ZSkgJiYKLQkJICAgIChodG1sUGFyc2VMb29rdXBTZXF1ZW5jZShjdHh0LCAnPicsIDAsIDAsIDAsIDEpIDwgMCkpCisJCSAgICAoaHRtbFBhcnNlTG9va3VwU2VxdWVuY2UoY3R4dCwgJz4nLCAwLCAwLCAwKSA8IDApKQogCQkgICAgZ290byBkb25lOwogCQlodG1sUGFyc2VFbmRUYWcoY3R4dCk7CiAJCWlmIChjdHh0LT5uYW1lTnIgPT0gMCkgewpAQCAtNjEzMSwxMiArNjI0MSwxMiBAQAogCWludCByZXM7CiAKIAlyZXMgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2goY3R4dC0+aW5wdXQtPmJ1Ziwgc2l6ZSwgY2h1bmspOworICAgICAgICB4bWxCdWZTZXRJbnB1dEJhc2VDdXIoY3R4dC0+aW5wdXQtPmJ1Zi0+YnVmZmVyLCBjdHh0LT5pbnB1dCwgYmFzZSwgY3VyKTsKIAlpZiAocmVzIDwgMCkgewogCSAgICBjdHh0LT5lcnJObyA9IFhNTF9QQVJTRVJfRU9GOwogCSAgICBjdHh0LT5kaXNhYmxlU0FYID0gMTsKIAkgICAgcmV0dXJuIChYTUxfUEFSU0VSX0VPRik7CiAJfQotICAgICAgICB4bWxCdWZTZXRJbnB1dEJhc2VDdXIoY3R4dC0+aW5wdXQtPmJ1Zi0+YnVmZmVyLCBjdHh0LT5pbnB1dCwgYmFzZSwgY3VyKTsKICNpZmRlZiBERUJVR19QVVNICiAJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJIUFA6IHB1c2hlZCAlZFxuIiwgc2l6ZSk7CiAjZW5kaWYKQEAgLTYxNTUsMTIgKzYyNjUsMTIgQEAKIAkJc2l6ZV90IGN1cnJlbnQgPSBjdHh0LT5pbnB1dC0+Y3VyIC0gY3R4dC0+aW5wdXQtPmJhc2U7CiAKIAkJbmJjaGFycyA9IHhtbENoYXJFbmNJbnB1dChpbiwgdGVybWluYXRlKTsKKwkJeG1sQnVmU2V0SW5wdXRCYXNlQ3VyKGluLT5idWZmZXIsIGN0eHQtPmlucHV0LCBiYXNlLCBjdXJyZW50KTsKIAkJaWYgKG5iY2hhcnMgPCAwKSB7CiAJCSAgICBodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0VOQ09ESU5HLAogCQkJICAgICAgICAgImVuY29kZXIgZXJyb3JcbiIsIE5VTEwsIE5VTEwpOwogCQkgICAgcmV0dXJuKFhNTF9FUlJfSU5WQUxJRF9FTkNPRElORyk7CiAJCX0KLQkJeG1sQnVmU2V0SW5wdXRCYXNlQ3VyKGluLT5idWZmZXIsIGN0eHQtPmlucHV0LCBiYXNlLCBjdXJyZW50KTsKIAkgICAgfQogCX0KICAgICB9CkBAIC02NjkyLDcgKzY4MDIsNiBAQAogICAgIGN0eHQtPnZjdHh0LmVycm9yID0geG1sUGFyc2VyVmFsaWRpdHlFcnJvcjsKICAgICBjdHh0LT52Y3R4dC53YXJuaW5nID0geG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nOwogICAgIGN0eHQtPnJlY29yZF9pbmZvID0gMDsKLSAgICBjdHh0LT5uYkNoYXJzID0gMDsKICAgICBjdHh0LT5jaGVja0luZGV4ID0gMDsKICAgICBjdHh0LT5pblN1YnNldCA9IDA7CiAgICAgY3R4dC0+ZXJyTm8gPSBYTUxfRVJSX09LOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9IVE1MdHJlZS5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9IVE1MdHJlZS5jCmluZGV4IGZlNWQwODYuLjdhMmI4NTUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvSFRNTHRyZWUuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL0hUTUx0cmVlLmMKQEAgLTUxOCw3ICs1MTgsNyBAQAogICAgIGJ1ZiA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUob3V0LCBoYW5kbGVyKTsKICAgICBpZiAoYnVmID09IE5VTEwpIHJldHVybigwKTsKIAotICAgIGh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dChidWYsIGRvYywgY3VyLCBlbmNvZGluZywgZm9ybWF0KTsKKyAgICBodG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoYnVmLCBkb2MsIGN1ciwgTlVMTCwgZm9ybWF0KTsKIAogICAgIHJldCA9IHhtbE91dHB1dEJ1ZmZlckNsb3NlKGJ1Zik7CiAgICAgcmV0dXJuKHJldCk7CkBAIC02NzAsMTMgKzY3MCwxMSBAQAogICogQGJ1ZjogIHRoZSBIVE1MIGJ1ZmZlciBvdXRwdXQKICAqIEBkb2M6ICB0aGUgZG9jdW1lbnQKICAqIEBjdXI6ICB0aGUgYXR0cmlidXRlIHBvaW50ZXIKLSAqIEBlbmNvZGluZzogIHRoZSBlbmNvZGluZyBzdHJpbmcKICAqCiAgKiBEdW1wIGFuIEhUTUwgYXR0cmlidXRlCiAgKi8KIHN0YXRpYyB2b2lkCi1odG1sQXR0ckR1bXBPdXRwdXQoeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZiwgeG1sRG9jUHRyIGRvYywgeG1sQXR0clB0ciBjdXIsCi0JICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZyBBVFRSSUJVVEVfVU5VU0VEKSB7CitodG1sQXR0ckR1bXBPdXRwdXQoeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZiwgeG1sRG9jUHRyIGRvYywgeG1sQXR0clB0ciBjdXIpIHsKICAgICB4bWxDaGFyICp2YWx1ZTsKIAogICAgIC8qCkBAIC03MDYsNDkgKzcwNCwyMiBAQAogCQkgKCF4bWxTdHJjYXNlY21wKGN1ci0+bmFtZSwgQkFEX0NBU1QgInNyYyIpKSB8fAogCQkgKCgheG1sU3RyY2FzZWNtcChjdXItPm5hbWUsIEJBRF9DQVNUICJuYW1lIikpICYmCiAJCSAgKCF4bWxTdHJjYXNlY21wKGN1ci0+cGFyZW50LT5uYW1lLCBCQURfQ0FTVCAiYSIpKSkpKSB7CisJCXhtbENoYXIgKmVzY2FwZWQ7CiAJCXhtbENoYXIgKnRtcCA9IHZhbHVlOwotCQkvKiB4bWxVUklFc2NhcGVTdHIoKSBlc2NhcGVzICciJyBzbyBpdCBjYW4gYmUgc2FmZWx5IHVzZWQuICovCi0JCXhtbEJ1ZkNDYXQoYnVmLT5idWZmZXIsICJcIiIpOwogCiAJCXdoaWxlIChJU19CTEFOS19DSCgqdG1wKSkgdG1wKys7CiAKLQkJLyogVVJJIEVzY2FwZSBldmVyeXRoaW5nLCBleGNlcHQgc2VydmVyIHNpZGUgaW5jbHVkZXMuICovCi0JCWZvciAoIDsgOyApIHsKLQkJICAgIHhtbENoYXIgKmVzY2FwZWQ7Ci0JCSAgICB4bWxDaGFyIGVuZENoYXI7Ci0JCSAgICB4bWxDaGFyICplbmQgPSBOVUxMOwotCQkgICAgeG1sQ2hhciAqc3RhcnQgPSAoeG1sQ2hhciAqKXhtbFN0cnN0cih0bXAsIEJBRF9DQVNUICI8IS0tIik7Ci0JCSAgICBpZiAoc3RhcnQgIT0gTlVMTCkgewotCQkJZW5kID0gKHhtbENoYXIgKil4bWxTdHJzdHIodG1wLCBCQURfQ0FTVCAiLS0+Iik7Ci0JCQlpZiAoZW5kICE9IE5VTEwpIHsKLQkJCSAgICAqc3RhcnQgPSAnXDAnOwotCQkJfQotCQkgICAgfQotCi0JCSAgICAvKiBFc2NhcGUgdGhlIHdob2xlIHN0cmluZywgb3IgdW50aWwgc3RhcnQgKHNldCB0byAnXDAnKS4gKi8KLQkJICAgIGVzY2FwZWQgPSB4bWxVUklFc2NhcGVTdHIodG1wLCBCQURfQ0FTVCJALzo9PzsjJSYsKyIpOwotCQkgICAgaWYgKGVzY2FwZWQgIT0gTlVMTCkgewotCQkgICAgICAgIHhtbEJ1ZkNhdChidWYtPmJ1ZmZlciwgZXNjYXBlZCk7Ci0JCSAgICAgICAgeG1sRnJlZShlc2NhcGVkKTsKLQkJICAgIH0gZWxzZSB7Ci0JCSAgICAgICAgeG1sQnVmQ2F0KGJ1Zi0+YnVmZmVyLCB0bXApOwotCQkgICAgfQotCi0JCSAgICBpZiAoZW5kID09IE5VTEwpIHsgLyogRXZlcnl0aGluZyBoYXMgYmVlbiB3cml0dGVuLiAqLwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICAgIC8qIERvIG5vdCBlc2NhcGUgYW55dGhpbmcgd2l0aGluIHNlcnZlciBzaWRlIGluY2x1ZGVzLiAqLwotCQkgICAgKnN0YXJ0ID0gJzwnOyAvKiBSZXN0b3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgIjwhLS0iLiAqLwotCQkgICAgZW5kICs9IDM7IC8qIHN0cmxlbigiLS0+IikgKi8KLQkJICAgIGVuZENoYXIgPSAqZW5kOwotCQkgICAgKmVuZCA9ICdcMCc7Ci0JCSAgICB4bWxCdWZDYXQoYnVmLT5idWZmZXIsIHN0YXJ0KTsKLQkJICAgICplbmQgPSBlbmRDaGFyOwotCQkgICAgdG1wID0gZW5kOworCQkvKgorCQkgKiB0aGUgPCBhbmQgPiBoYXZlIGFscmVhZHkgYmVlbiBlc2NhcGVkIGF0IHRoZSBlbnRpdHkgbGV2ZWwKKwkJICogQW5kIGRvaW5nIHNvIGhlcmUgYnJlYWtzIHNlcnZlciBzaWRlIGluY2x1ZGVzCisJCSAqLworCQllc2NhcGVkID0geG1sVVJJRXNjYXBlU3RyKHRtcCwgQkFEX0NBU1QiQC86PT87IyUmLCs8PiIpOworCQlpZiAoZXNjYXBlZCAhPSBOVUxMKSB7CisJCSAgICB4bWxCdWZXcml0ZVF1b3RlZFN0cmluZyhidWYtPmJ1ZmZlciwgZXNjYXBlZCk7CisJCSAgICB4bWxGcmVlKGVzY2FwZWQpOworCQl9IGVsc2UgeworCQkgICAgeG1sQnVmV3JpdGVRdW90ZWRTdHJpbmcoYnVmLT5idWZmZXIsIHZhbHVlKTsKIAkJfQotCi0JCXhtbEJ1ZkNDYXQoYnVmLT5idWZmZXIsICJcIiIpOwogCSAgICB9IGVsc2UgewogCQl4bWxCdWZXcml0ZVF1b3RlZFN0cmluZyhidWYtPmJ1ZmZlciwgdmFsdWUpOwogCSAgICB9CkBAIC03NjAsNjIgKzczMSwyMSBAQAogfQogCiAvKioKLSAqIGh0bWxBdHRyTGlzdER1bXBPdXRwdXQ6Ci0gKiBAYnVmOiAgdGhlIEhUTUwgYnVmZmVyIG91dHB1dAotICogQGRvYzogIHRoZSBkb2N1bWVudAotICogQGN1cjogIHRoZSBmaXJzdCBhdHRyaWJ1dGUgcG9pbnRlcgotICogQGVuY29kaW5nOiAgdGhlIGVuY29kaW5nIHN0cmluZwotICoKLSAqIER1bXAgYSBsaXN0IG9mIEhUTUwgYXR0cmlidXRlcwotICovCi1zdGF0aWMgdm9pZAotaHRtbEF0dHJMaXN0RHVtcE91dHB1dCh4bWxPdXRwdXRCdWZmZXJQdHIgYnVmLCB4bWxEb2NQdHIgZG9jLCB4bWxBdHRyUHRyIGN1ciwgY29uc3QgY2hhciAqZW5jb2RpbmcpIHsKLSAgICBpZiAoY3VyID09IE5VTEwpIHsKLQlyZXR1cm47Ci0gICAgfQotICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewotICAgICAgICBodG1sQXR0ckR1bXBPdXRwdXQoYnVmLCBkb2MsIGN1ciwgZW5jb2RpbmcpOwotCWN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci19Ci0KLQotCi0vKioKLSAqIGh0bWxOb2RlTGlzdER1bXBPdXRwdXQ6Ci0gKiBAYnVmOiAgdGhlIEhUTUwgYnVmZmVyIG91dHB1dAotICogQGRvYzogIHRoZSBkb2N1bWVudAotICogQGN1cjogIHRoZSBmaXJzdCBub2RlCi0gKiBAZW5jb2Rpbmc6ICB0aGUgZW5jb2Rpbmcgc3RyaW5nCi0gKiBAZm9ybWF0OiAgc2hvdWxkIGZvcm1hdHRpbmcgc3BhY2VzIGJlZW4gYWRkZWQKLSAqCi0gKiBEdW1wIGFuIEhUTUwgbm9kZSBsaXN0LCByZWN1cnNpdmUgYmVoYXZpb3VyLGNoaWxkcmVuIGFyZSBwcmludGVkIHRvby4KLSAqLwotc3RhdGljIHZvaWQKLWh0bWxOb2RlTGlzdER1bXBPdXRwdXQoeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZiwgeG1sRG9jUHRyIGRvYywKLQkgICAgICAgICAgICAgICB4bWxOb2RlUHRyIGN1ciwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGludCBmb3JtYXQpIHsKLSAgICBpZiAoY3VyID09IE5VTEwpIHsKLQlyZXR1cm47Ci0gICAgfQotICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewotICAgICAgICBodG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoYnVmLCBkb2MsIGN1ciwgZW5jb2RpbmcsIGZvcm1hdCk7Ci0JY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLX0KLQotLyoqCiAgKiBodG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQ6CiAgKiBAYnVmOiAgdGhlIEhUTUwgYnVmZmVyIG91dHB1dAogICogQGRvYzogIHRoZSBkb2N1bWVudAogICogQGN1cjogIHRoZSBjdXJyZW50IG5vZGUKLSAqIEBlbmNvZGluZzogIHRoZSBlbmNvZGluZyBzdHJpbmcKKyAqIEBlbmNvZGluZzogIHRoZSBlbmNvZGluZyBzdHJpbmcgKHVudXNlZCkKICAqIEBmb3JtYXQ6ICBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZAogICoKICAqIER1bXAgYW4gSFRNTCBub2RlLCByZWN1cnNpdmUgYmVoYXZpb3VyLGNoaWxkcmVuIGFyZSBwcmludGVkIHRvby4KICAqLwogdm9pZAogaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0KHhtbE91dHB1dEJ1ZmZlclB0ciBidWYsIHhtbERvY1B0ciBkb2MsCi0JICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIGN1ciwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGludCBmb3JtYXQpIHsKKwkgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgY3VyLCBjb25zdCBjaGFyICplbmNvZGluZyBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQpIHsKKyAgICB4bWxOb2RlUHRyIHJvb3QsIHBhcmVudDsKKyAgICB4bWxBdHRyUHRyIGF0dHI7CiAgICAgY29uc3QgaHRtbEVsZW1EZXNjICogaW5mbzsKIAogICAgIHhtbEluaXRQYXJzZXIoKTsKQEAgLTgyMywxNzIgKzc1MywyMTMgQEAKICAgICBpZiAoKGN1ciA9PSBOVUxMKSB8fCAoYnVmID09IE5VTEwpKSB7CiAJcmV0dXJuOwogICAgIH0KLSAgICAvKgotICAgICAqIFNwZWNpYWwgY2FzZXMuCi0gICAgICovCi0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfRFREX05PREUpCi0JcmV0dXJuOwotICAgIGlmICgoY3VyLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpIHx8Ci0gICAgICAgIChjdXItPnR5cGUgPT0gWE1MX0RPQ1VNRU5UX05PREUpKXsKLQlodG1sRG9jQ29udGVudER1bXBPdXRwdXQoYnVmLCAoeG1sRG9jUHRyKSBjdXIsIGVuY29kaW5nKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSB7Ci0gICAgICAgIGh0bWxBdHRyRHVtcE91dHB1dChidWYsIGRvYywgKHhtbEF0dHJQdHIpIGN1ciwgZW5jb2RpbmcpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBIVE1MX1RFWFRfTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgewotCSAgICBpZiAoKChjdXItPm5hbWUgPT0gKGNvbnN0IHhtbENoYXIgKil4bWxTdHJpbmdUZXh0KSB8fAotCQkgKGN1ci0+bmFtZSAhPSAoY29uc3QgeG1sQ2hhciAqKXhtbFN0cmluZ1RleHROb2VuYykpICYmCi0JCSgoY3VyLT5wYXJlbnQgPT0gTlVMTCkgfHwKLQkJICgoeG1sU3RyY2FzZWNtcChjdXItPnBhcmVudC0+bmFtZSwgQkFEX0NBU1QgInNjcmlwdCIpKSAmJgotCQkgICh4bWxTdHJjYXNlY21wKGN1ci0+cGFyZW50LT5uYW1lLCBCQURfQ0FTVCAic3R5bGUiKSkpKSkgewotCQl4bWxDaGFyICpidWZmZXI7CiAKLQkJYnVmZmVyID0geG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoZG9jLCBjdXItPmNvbnRlbnQpOwotCQlpZiAoYnVmZmVyICE9IE5VTEwpIHsKLQkJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKilidWZmZXIpOwotCQkgICAgeG1sRnJlZShidWZmZXIpOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPmNvbnRlbnQpOwotCSAgICB9Ci0JfQotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBIVE1MX0NPTU1FTlRfTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgewotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI8IS0tIik7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPmNvbnRlbnQpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICItLT4iKTsKLQl9Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IEhUTUxfUElfTk9ERSkgewotCWlmIChjdXItPm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIjw/Iik7Ci0JeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0JaWYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIiAiKTsKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+Y29udGVudCk7Ci0JfQotCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIj4iKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gSFRNTF9FTlRJVFlfUkVGX05PREUpIHsKLSAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiJiIpOwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI7Iik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IEhUTUxfUFJFU0VSVkVfTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgewotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKLQl9Ci0JcmV0dXJuOwotICAgIH0KKyAgICByb290ID0gY3VyOworICAgIHBhcmVudCA9IGN1ci0+cGFyZW50OworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHN3aXRjaCAoY3VyLT50eXBlKSB7CisgICAgICAgIGNhc2UgWE1MX0hUTUxfRE9DVU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfRE9DVU1FTlRfTk9ERToKKyAgICAgICAgICAgIGlmICgoKHhtbERvY1B0cikgY3VyKS0+aW50U3Vic2V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBodG1sRHRkRHVtcE91dHB1dChidWYsICh4bWxEb2NQdHIpIGN1ciwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogQWx3YXlzIHZhbGlkYXRlIGN1ci0+cGFyZW50IHdoZW4gZGVzY2VuZGluZy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY3VyLT5wYXJlbnQgPT0gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLT5jaGlsZHJlbjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAvKgotICAgICAqIEdldCBzcGVjaWZpYyBIVE1MIGluZm8gZm9yIHRoYXQgbm9kZS4KLSAgICAgKi8KLSAgICBpZiAoY3VyLT5ucyA9PSBOVUxMKQotCWluZm8gPSBodG1sVGFnTG9va3VwKGN1ci0+bmFtZSk7Ci0gICAgZWxzZQotCWluZm8gPSBOVUxMOworICAgICAgICBjYXNlIFhNTF9FTEVNRU5UX05PREU6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU29tZSB1c2VycyBsaWtlIGx4bWwgYXJlIGtub3duIHRvIHBhc3Mgbm9kZXMgd2l0aCBhIGNvcnJ1cHRlZAorICAgICAgICAgICAgICogdHJlZSBzdHJ1Y3R1cmUuIEZhbGwgYmFjayB0byBhIHJlY3Vyc2l2ZSBjYWxsIHRvIGhhbmRsZSB0aGlzCisgICAgICAgICAgICAgKiBjYXNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGN1ci0+cGFyZW50ICE9IHBhcmVudCkgJiYgKGN1ci0+Y2hpbGRyZW4gIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBodG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoYnVmLCBkb2MsIGN1ciwgZW5jb2RpbmcsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI8Iik7Ci0gICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKLSAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bnMtPnByZWZpeCk7Ci0JeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiOiIpOwotICAgIH0KLSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICBpZiAoY3VyLT5uc0RlZikKLQl4bWxOc0xpc3REdW1wT3V0cHV0KGJ1ZiwgY3VyLT5uc0RlZik7Ci0gICAgaWYgKGN1ci0+cHJvcGVydGllcyAhPSBOVUxMKQotICAgICAgICBodG1sQXR0ckxpc3REdW1wT3V0cHV0KGJ1ZiwgZG9jLCBjdXItPnByb3BlcnRpZXMsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBHZXQgc3BlY2lmaWMgSFRNTCBpbmZvIGZvciB0aGF0IG5vZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjdXItPm5zID09IE5VTEwpCisgICAgICAgICAgICAgICAgaW5mbyA9IGh0bWxUYWdMb29rdXAoY3VyLT5uYW1lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmZvID0gTlVMTDsKIAotICAgIGlmICgoaW5mbyAhPSBOVUxMKSAmJiAoaW5mby0+ZW1wdHkpKSB7Ci0gICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIj4iKTsKLQlpZiAoKGZvcm1hdCkgJiYgKCFpbmZvLT5pc2lubGluZSkgJiYgKGN1ci0+bmV4dCAhPSBOVUxMKSkgewotCSAgICBpZiAoKGN1ci0+bmV4dC0+dHlwZSAhPSBIVE1MX1RFWFRfTk9ERSkgJiYKLQkJKGN1ci0+bmV4dC0+dHlwZSAhPSBIVE1MX0VOVElUWV9SRUZfTk9ERSkgJiYKLQkJKGN1ci0+cGFyZW50ICE9IE5VTEwpICYmCi0JCShjdXItPnBhcmVudC0+bmFtZSAhPSBOVUxMKSAmJgotCQkoY3VyLT5wYXJlbnQtPm5hbWVbMF0gIT0gJ3AnKSkgLyogcCwgcHJlLCBwYXJhbSAqLwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOwotCX0KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmICgoKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB8fCAoY3VyLT5jb250ZW50ID09IE5VTEwpKSAmJgotCShjdXItPmNoaWxkcmVuID09IE5VTEwpKSB7Ci0gICAgICAgIGlmICgoaW5mbyAhPSBOVUxMKSAmJiAoaW5mby0+c2F2ZUVuZFRhZyAhPSAwKSAmJgotCSAgICAoeG1sU3RyY21wKEJBRF9DQVNUIGluZm8tPm5hbWUsIEJBRF9DQVNUICJodG1sIikpICYmCi0JICAgICh4bWxTdHJjbXAoQkFEX0NBU1QgaW5mby0+bmFtZSwgQkFEX0NBU1QgImJvZHkiKSkpIHsKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiPiIpOwotCX0gZWxzZSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIj48LyIpOworICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiPCIpOwogICAgICAgICAgICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5ucy0+cHJlZml4KTsKICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI6Iik7CiAgICAgICAgICAgICB9Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI+Iik7Ci0JfQotCWlmICgoZm9ybWF0KSAmJiAoY3VyLT5uZXh0ICE9IE5VTEwpICYmCi0gICAgICAgICAgICAoaW5mbyAhPSBOVUxMKSAmJiAoIWluZm8tPmlzaW5saW5lKSkgewotCSAgICBpZiAoKGN1ci0+bmV4dC0+dHlwZSAhPSBIVE1MX1RFWFRfTk9ERSkgJiYKLQkJKGN1ci0+bmV4dC0+dHlwZSAhPSBIVE1MX0VOVElUWV9SRUZfTk9ERSkgJiYKLQkJKGN1ci0+cGFyZW50ICE9IE5VTEwpICYmCi0JCShjdXItPnBhcmVudC0+bmFtZSAhPSBOVUxMKSAmJgotCQkoY3VyLT5wYXJlbnQtPm5hbWVbMF0gIT0gJ3AnKSkgLyogcCwgcHJlLCBwYXJhbSAqLwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOwotCX0KLQlyZXR1cm47Ci0gICAgfQotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIj4iKTsKLSAgICBpZiAoKGN1ci0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKSAmJgotCShjdXItPmNvbnRlbnQgIT0gTlVMTCkpIHsKLQkgICAgLyoKLQkgICAgICogVXNlcyB0aGUgT3V0cHV0QnVmZmVyIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgY29udmVydAotCSAgICAgKiBpbnZhbGlkcyB0byBjaGFycmVmcwotCSAgICAgKi8KKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgaWYgKGN1ci0+bnNEZWYpCisgICAgICAgICAgICAgICAgeG1sTnNMaXN0RHVtcE91dHB1dChidWYsIGN1ci0+bnNEZWYpOworICAgICAgICAgICAgYXR0ciA9IGN1ci0+cHJvcGVydGllczsKKyAgICAgICAgICAgIHdoaWxlIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBodG1sQXR0ckR1bXBPdXRwdXQoYnVmLCBkb2MsIGF0dHIpOworICAgICAgICAgICAgICAgIGF0dHIgPSBhdHRyLT5uZXh0OworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopIGN1ci0+Y29udGVudCk7Ci0gICAgfQotICAgIGlmIChjdXItPmNoaWxkcmVuICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChmb3JtYXQpICYmIChpbmZvICE9IE5VTEwpICYmICghaW5mby0+aXNpbmxpbmUpICYmCi0JICAgIChjdXItPmNoaWxkcmVuLT50eXBlICE9IEhUTUxfVEVYVF9OT0RFKSAmJgotCSAgICAoY3VyLT5jaGlsZHJlbi0+dHlwZSAhPSBIVE1MX0VOVElUWV9SRUZfTk9ERSkgJiYKLQkgICAgKGN1ci0+Y2hpbGRyZW4gIT0gY3VyLT5sYXN0KSAmJgotCSAgICAoY3VyLT5uYW1lICE9IE5VTEwpICYmCi0JICAgIChjdXItPm5hbWVbMF0gIT0gJ3AnKSkgLyogcCwgcHJlLCBwYXJhbSAqLwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOwotCWh0bWxOb2RlTGlzdER1bXBPdXRwdXQoYnVmLCBkb2MsIGN1ci0+Y2hpbGRyZW4sIGVuY29kaW5nLCBmb3JtYXQpOwotICAgICAgICBpZiAoKGZvcm1hdCkgJiYgKGluZm8gIT0gTlVMTCkgJiYgKCFpbmZvLT5pc2lubGluZSkgJiYKLQkgICAgKGN1ci0+bGFzdC0+dHlwZSAhPSBIVE1MX1RFWFRfTk9ERSkgJiYKLQkgICAgKGN1ci0+bGFzdC0+dHlwZSAhPSBIVE1MX0VOVElUWV9SRUZfTk9ERSkgJiYKLQkgICAgKGN1ci0+Y2hpbGRyZW4gIT0gY3VyLT5sYXN0KSAmJgotCSAgICAoY3VyLT5uYW1lICE9IE5VTEwpICYmCi0JICAgIChjdXItPm5hbWVbMF0gIT0gJ3AnKSkgLyogcCwgcHJlLCBwYXJhbSAqLwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOwotICAgIH0KLSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI8LyIpOwotICAgIGlmICgoY3VyLT5ucyAhPSBOVUxMKSAmJiAoY3VyLT5ucy0+cHJlZml4ICE9IE5VTEwpKSB7Ci0gICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIjoiKTsKLSAgICB9Ci0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiPiIpOwotICAgIGlmICgoZm9ybWF0KSAmJiAoaW5mbyAhPSBOVUxMKSAmJiAoIWluZm8tPmlzaW5saW5lKSAmJgotCShjdXItPm5leHQgIT0gTlVMTCkpIHsKLSAgICAgICAgaWYgKChjdXItPm5leHQtPnR5cGUgIT0gSFRNTF9URVhUX05PREUpICYmCi0JICAgIChjdXItPm5leHQtPnR5cGUgIT0gSFRNTF9FTlRJVFlfUkVGX05PREUpICYmCi0JICAgIChjdXItPnBhcmVudCAhPSBOVUxMKSAmJgotCSAgICAoY3VyLT5wYXJlbnQtPm5hbWUgIT0gTlVMTCkgJiYKLQkgICAgKGN1ci0+cGFyZW50LT5uYW1lWzBdICE9ICdwJykpIC8qIHAsIHByZSwgcGFyYW0gKi8KLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiXG4iKTsKKyAgICAgICAgICAgIGlmICgoaW5mbyAhPSBOVUxMKSAmJiAoaW5mby0+ZW1wdHkpKSB7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiPiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjdXItPmNoaWxkcmVuID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGluZm8gIT0gTlVMTCkgJiYgKGluZm8tPnNhdmVFbmRUYWcgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHhtbFN0cmNtcChCQURfQ0FTVCBpbmZvLT5uYW1lLCBCQURfQ0FTVCAiaHRtbCIpKSAmJgorICAgICAgICAgICAgICAgICAgICAoeG1sU3RyY21wKEJBRF9DQVNUIGluZm8tPm5hbWUsIEJBRF9DQVNUICJib2R5IikpKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIj4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI+PC8iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiOiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI+Iik7CisgICAgICAgICAgICAgICAgaWYgKChmb3JtYXQpICYmIChpbmZvICE9IE5VTEwpICYmICghaW5mby0+aXNpbmxpbmUpICYmCisgICAgICAgICAgICAgICAgICAgIChjdXItPmNoaWxkcmVuLT50eXBlICE9IEhUTUxfVEVYVF9OT0RFKSAmJgorICAgICAgICAgICAgICAgICAgICAoY3VyLT5jaGlsZHJlbi0+dHlwZSAhPSBIVE1MX0VOVElUWV9SRUZfTk9ERSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1ci0+Y2hpbGRyZW4gIT0gY3VyLT5sYXN0KSAmJgorICAgICAgICAgICAgICAgICAgICAoY3VyLT5uYW1lICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgIChjdXItPm5hbWVbMF0gIT0gJ3AnKSkgLyogcCwgcHJlLCBwYXJhbSAqLworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOworICAgICAgICAgICAgICAgIHBhcmVudCA9IGN1cjsKKyAgICAgICAgICAgICAgICBjdXIgPSBjdXItPmNoaWxkcmVuOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdCkgJiYgKGN1ci0+bmV4dCAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgIChpbmZvICE9IE5VTEwpICYmICghaW5mby0+aXNpbmxpbmUpKSB7CisgICAgICAgICAgICAgICAgaWYgKChjdXItPm5leHQtPnR5cGUgIT0gSFRNTF9URVhUX05PREUpICYmCisgICAgICAgICAgICAgICAgICAgIChjdXItPm5leHQtPnR5cGUgIT0gSFRNTF9FTlRJVFlfUkVGX05PREUpICYmCisgICAgICAgICAgICAgICAgICAgIChwYXJlbnQgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBhcmVudC0+bmFtZSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAocGFyZW50LT5uYW1lWzBdICE9ICdwJykpIC8qIHAsIHByZSwgcGFyYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfQVRUUklCVVRFX05PREU6CisgICAgICAgICAgICBodG1sQXR0ckR1bXBPdXRwdXQoYnVmLCBkb2MsICh4bWxBdHRyUHRyKSBjdXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIVE1MX1RFWFRfTk9ERToKKyAgICAgICAgICAgIGlmIChjdXItPmNvbnRlbnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICgoKGN1ci0+bmFtZSA9PSAoY29uc3QgeG1sQ2hhciAqKXhtbFN0cmluZ1RleHQpIHx8CisgICAgICAgICAgICAgICAgIChjdXItPm5hbWUgIT0gKGNvbnN0IHhtbENoYXIgKil4bWxTdHJpbmdUZXh0Tm9lbmMpKSAmJgorICAgICAgICAgICAgICAgICgocGFyZW50ID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICgoeG1sU3RyY2FzZWNtcChwYXJlbnQtPm5hbWUsIEJBRF9DQVNUICJzY3JpcHQiKSkgJiYKKyAgICAgICAgICAgICAgICAgICh4bWxTdHJjYXNlY21wKHBhcmVudC0+bmFtZSwgQkFEX0NBU1QgInN0eWxlIikpKSkpIHsKKyAgICAgICAgICAgICAgICB4bWxDaGFyICpidWZmZXI7CisKKyAgICAgICAgICAgICAgICBidWZmZXIgPSB4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudChkb2MsIGN1ci0+Y29udGVudCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSFRNTF9DT01NRU5UX05PREU6CisgICAgICAgICAgICBpZiAoY3VyLT5jb250ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI8IS0tIik7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+Y29udGVudCk7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiLS0+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhUTUxfUElfTk9ERToKKyAgICAgICAgICAgIGlmIChjdXItPm5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIjw/Iik7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIVE1MX0VOVElUWV9SRUZfTk9ERToKKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIiYiKTsKKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiOyIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIVE1MX1BSRVNFUlZFX05PREU6CisgICAgICAgICAgICBpZiAoY3VyLT5jb250ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoY3VyID09IHJvb3QpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKGN1ci0+bmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXIgPSBwYXJlbnQ7CisgICAgICAgICAgICAvKiBjdXItPnBhcmVudCB3YXMgdmFsaWRhdGVkIHdoZW4gZGVzY2VuZGluZy4gKi8KKyAgICAgICAgICAgIHBhcmVudCA9IGN1ci0+cGFyZW50OworCisgICAgICAgICAgICBpZiAoKGN1ci0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKSB8fAorICAgICAgICAgICAgICAgIChjdXItPnR5cGUgPT0gWE1MX0RPQ1VNRU5UX05PREUpKSB7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChmb3JtYXQpICYmIChjdXItPm5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICBpbmZvID0gaHRtbFRhZ0xvb2t1cChjdXItPm5hbWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBpZiAoKGZvcm1hdCkgJiYgKGluZm8gIT0gTlVMTCkgJiYgKCFpbmZvLT5pc2lubGluZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1ci0+bGFzdC0+dHlwZSAhPSBIVE1MX1RFWFRfTk9ERSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1ci0+bGFzdC0+dHlwZSAhPSBIVE1MX0VOVElUWV9SRUZfTk9ERSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1ci0+Y2hpbGRyZW4gIT0gY3VyLT5sYXN0KSAmJgorICAgICAgICAgICAgICAgICAgICAoY3VyLT5uYW1lICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgIChjdXItPm5hbWVbMF0gIT0gJ3AnKSkgLyogcCwgcHJlLCBwYXJhbSAqLworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOworCisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiPC8iKTsKKyAgICAgICAgICAgICAgICBpZiAoKGN1ci0+bnMgIT0gTlVMTCkgJiYgKGN1ci0+bnMtPnByZWZpeCAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5ucy0+cHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAiOiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICI+Iik7CisKKyAgICAgICAgICAgICAgICBpZiAoKGZvcm1hdCkgJiYgKGluZm8gIT0gTlVMTCkgJiYgKCFpbmZvLT5pc2lubGluZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1ci0+bmV4dCAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGN1ci0+bmV4dC0+dHlwZSAhPSBIVE1MX1RFWFRfTk9ERSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjdXItPm5leHQtPnR5cGUgIT0gSFRNTF9FTlRJVFlfUkVGX05PREUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50ICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50LT5uYW1lICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50LT5uYW1lWzBdICE9ICdwJykpIC8qIHAsIHByZSwgcGFyYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC05OTcsNjMgKzk2OCw0NSBAQAogICogQGJ1ZjogIHRoZSBIVE1MIGJ1ZmZlciBvdXRwdXQKICAqIEBkb2M6ICB0aGUgZG9jdW1lbnQKICAqIEBjdXI6ICB0aGUgY3VycmVudCBub2RlCi0gKiBAZW5jb2Rpbmc6ICB0aGUgZW5jb2Rpbmcgc3RyaW5nCisgKiBAZW5jb2Rpbmc6ICB0aGUgZW5jb2Rpbmcgc3RyaW5nICh1bnVzZWQpCiAgKgogICogRHVtcCBhbiBIVE1MIG5vZGUsIHJlY3Vyc2l2ZSBiZWhhdmlvdXIsY2hpbGRyZW4gYXJlIHByaW50ZWQgdG9vLAogICogYW5kIGZvcm1hdHRpbmcgcmV0dXJucy9zcGFjZXMgYXJlIGFkZGVkLgogICovCiB2b2lkCiBodG1sTm9kZUR1bXBPdXRwdXQoeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZiwgeG1sRG9jUHRyIGRvYywKLQkgICAgICAgICAgIHhtbE5vZGVQdHIgY3VyLCBjb25zdCBjaGFyICplbmNvZGluZykgewotICAgIGh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dChidWYsIGRvYywgY3VyLCBlbmNvZGluZywgMSk7CisJICAgICAgICAgICB4bWxOb2RlUHRyIGN1ciwgY29uc3QgY2hhciAqZW5jb2RpbmcgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIGh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dChidWYsIGRvYywgY3VyLCBOVUxMLCAxKTsKIH0KIAogLyoqCiAgKiBodG1sRG9jQ29udGVudER1bXBGb3JtYXRPdXRwdXQ6CiAgKiBAYnVmOiAgdGhlIEhUTUwgYnVmZmVyIG91dHB1dAogICogQGN1cjogIHRoZSBkb2N1bWVudAotICogQGVuY29kaW5nOiAgdGhlIGVuY29kaW5nIHN0cmluZworICogQGVuY29kaW5nOiAgdGhlIGVuY29kaW5nIHN0cmluZyAodW51c2VkKQogICogQGZvcm1hdDogIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkCiAgKgogICogRHVtcCBhbiBIVE1MIGRvY3VtZW50LgogICovCiB2b2lkCiBodG1sRG9jQ29udGVudER1bXBGb3JtYXRPdXRwdXQoeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZiwgeG1sRG9jUHRyIGN1ciwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCBpbnQgZm9ybWF0KSB7Ci0gICAgaW50IHR5cGU7Ci0KLSAgICB4bWxJbml0UGFyc2VyKCk7Ci0KLSAgICBpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAoY3VyID09IE5VTEwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKgotICAgICAqIGZvcmNlIHRvIG91dHB1dCB0aGUgc3R1ZmYgYXMgSFRNTCwgZXNwZWNpYWxseSBmb3IgZW50aXRpZXMKLSAgICAgKi8KLSAgICB0eXBlID0gY3VyLT50eXBlOwotICAgIGN1ci0+dHlwZSA9IFhNTF9IVE1MX0RPQ1VNRU5UX05PREU7Ci0gICAgaWYgKGN1ci0+aW50U3Vic2V0ICE9IE5VTEwpIHsKLSAgICAgICAgaHRtbER0ZER1bXBPdXRwdXQoYnVmLCBjdXIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB7Ci0gICAgICAgIGh0bWxOb2RlTGlzdER1bXBPdXRwdXQoYnVmLCBjdXIsIGN1ci0+Y2hpbGRyZW4sIGVuY29kaW5nLCBmb3JtYXQpOwotICAgIH0KLSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsICJcbiIpOwotICAgIGN1ci0+dHlwZSA9ICh4bWxFbGVtZW50VHlwZSkgdHlwZTsKKwkgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nIEFUVFJJQlVURV9VTlVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCkgeworICAgIGh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dChidWYsIGN1ciwgKHhtbE5vZGVQdHIpIGN1ciwgTlVMTCwgZm9ybWF0KTsKIH0KIAogLyoqCiAgKiBodG1sRG9jQ29udGVudER1bXBPdXRwdXQ6CiAgKiBAYnVmOiAgdGhlIEhUTUwgYnVmZmVyIG91dHB1dAogICogQGN1cjogIHRoZSBkb2N1bWVudAotICogQGVuY29kaW5nOiAgdGhlIGVuY29kaW5nIHN0cmluZworICogQGVuY29kaW5nOiAgdGhlIGVuY29kaW5nIHN0cmluZyAodW51c2VkKQogICoKICAqIER1bXAgYW4gSFRNTCBkb2N1bWVudC4gRm9ybWF0dGluZyByZXR1cm4vc3BhY2VzIGFyZSBhZGRlZC4KICAqLwogdm9pZAogaHRtbERvY0NvbnRlbnREdW1wT3V0cHV0KHhtbE91dHB1dEJ1ZmZlclB0ciBidWYsIHhtbERvY1B0ciBjdXIsCi0JICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZykgewotICAgIGh0bWxEb2NDb250ZW50RHVtcEZvcm1hdE91dHB1dChidWYsIGN1ciwgZW5jb2RpbmcsIDEpOworCSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIGh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dChidWYsIGN1ciwgKHhtbE5vZGVQdHIpIGN1ciwgTlVMTCwgMSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL01ha2VmaWxlLmFtCmluZGV4IGJlMWE4ODMuLmE5Mjg0YjkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvTWFrZWZpbGUuYW0KKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9NYWtlZmlsZS5hbQpAQCAtMiw5ICsyLDkgQEAKIAogQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKIAotU1VCRElSUyA9IGluY2x1ZGUgLiBkb2MgZXhhbXBsZSB4c3RjICQoUFlUSE9OX1NVQkRJUikKK1NVQkRJUlMgPSBpbmNsdWRlIC4gZG9jIGV4YW1wbGUgZnV6eiB4c3RjICQoUFlUSE9OX1NVQkRJUikKIAotRElTVF9TVUJESVJTID0gaW5jbHVkZSAuIGRvYyBleGFtcGxlIHB5dGhvbiB4c3RjCitESVNUX1NVQkRJUlMgPSBpbmNsdWRlIC4gZG9jIGV4YW1wbGUgZnV6eiBweXRob24geHN0YwogCiBBTV9DUFBGTEFHUyA9IC1JJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUgLUkkKHNyY2RpcikvaW5jbHVkZQogCkBAIC0yMTAsNiArMjEwLDcgQEAKIAkgICAgJChDSEVDS0VSKSAuL3J1bnhtbGNvbmYkKEVYRUVYVCkKIAlAKGlmIFsgIiQoUFlUSE9OX1NVQkRJUikiICE9ICIiIF0gOyB0aGVuIGNkIHB5dGhvbiA7IFwKIAkgICAgJChNQUtFKSB0ZXN0cyA7IGZpKQorCUBjZCBmdXp6OyAkKE1BS0UpIHRlc3RzCiAKIGNoZWNrOiBhbGwgcnVudGVzdHMKIApAQCAtOTA2LDE0ICs5MDcsMTYgQEAKIAkgIGlmIFsgISAtZCAkJGkgXSA7IHRoZW4gXAogCSAgaWYgWyAhIC1mICQoc3JjZGlyKS9yZXN1bHQvcmVnZXhwLyQkbmFtZSBdIDsgdGhlbiBcCiAJICAgICAgZWNobyBOZXcgdGVzdCBmaWxlICQkbmFtZSA7IFwKLQkgICAgICAkKENIRUNLRVIpICQodG9wX2J1aWxkZGlyKS90ZXN0UmVnZXhwIC1pICQkaSA+ICQoc3JjZGlyKS9yZXN1bHQvcmVnZXhwLyQkbmFtZTsgXAorCSAgICAgICQoQ0hFQ0tFUikgJCh0b3BfYnVpbGRkaXIpL3Rlc3RSZWdleHAgLWkgJCRpID4gJChzcmNkaXIpL3Jlc3VsdC9yZWdleHAvJCRuYW1lIDI+ICQoc3JjZGlyKS9yZXN1bHQvcmVnZXhwLyQkbmFtZS5lcnIgOyBcCisJICAgICAgaWYgWyAhIC1zICIkKHNyY2RpcikvcmVzdWx0L3JlZ2V4cC8kJG5hbWUuZXJyIiBdIDsgdGhlbiBybSAkKHNyY2RpcikvcmVzdWx0L3JlZ2V4cC8kJG5hbWUuZXJyOyBmaSA7IFwKIAkgICAgICBncmVwICJNT1JZIEFMTE8iIC5tZW1kdW1wICB8IGdyZXAgLXYgIk1FTU9SWSBBTExPQ0FURUQgOiAwIjtcCiAJICBlbHNlIFwKLQkgICAgICBsb2c9YCQoQ0hFQ0tFUikgJCh0b3BfYnVpbGRkaXIpL3Rlc3RSZWdleHAgLWkgJCRpIDI+JjEgPiByZXN1bHQuJCRuYW1lIDsgXAorCSAgICAgIGxvZz1gJChDSEVDS0VSKSAkKHRvcF9idWlsZGRpcikvdGVzdFJlZ2V4cCAtaSAkJGkgPiByZXN1bHQuJCRuYW1lIDI+IGVycm9yLiQkbmFtZSA7IFwKIAkgICAgICBncmVwICJNT1JZIEFMTE8iIC5tZW1kdW1wICB8IGdyZXAgLXYgIk1FTU9SWSBBTExPQ0FURUQgOiAwIjtcCi0JICAgICAgZGlmZiAkKHNyY2RpcikvcmVzdWx0L3JlZ2V4cC8kJG5hbWUgcmVzdWx0LiQkbmFtZWAgOyBcCi0JICAgICAgaWYgWyAtbiAiJCRsb2ciIF0gOyB0aGVuIGVjaG8gJCRuYW1lIHJlc3VsdCA7IGVjaG8gIiQkbG9nIiA7IGZpIDsgXAotCSAgICAgIHJtIHJlc3VsdC4kJG5hbWUgOyBcCisJICAgICAgZGlmZiAkKHNyY2RpcikvcmVzdWx0L3JlZ2V4cC8kJG5hbWUgcmVzdWx0LiQkbmFtZSA7IFwKKwkgICAgICBpZiBbIC1zICIkKHNyY2RpcikvcmVzdWx0L3JlZ2V4cC8kJG5hbWUuZXJyIiAtbyAtcyAiZXJyb3IuJCRuYW1lIiBdIDsgdGhlbiBkaWZmICQoc3JjZGlyKS9yZXN1bHQvcmVnZXhwLyQkbmFtZS5lcnIgZXJyb3IuJCRuYW1lIDsgZmlgIDsgXAorCSAgICAgIGlmIFsgLW4gIiQkbG9nIiBdIDsgdGhlbiBlY2hvICQkbmFtZSByZXN1bHQgOyBlY2hvICQkbG9nIDsgZmkgOyBcCisJICAgICAgcm0gcmVzdWx0LiQkbmFtZSBlcnJvci4kJG5hbWUgOyBcCiAJICBmaSA7IGZpIDsgZG9uZSkKIAogIyBEaXNhYmxlZCBmb3Igbm93CkBAIC0xMjU3LDYgKzEyNjAsNyBAQAogCSAgICAgZGJnZW4ucGwgZGJnZW5hdHRyLnBsIHJlZ3Jlc3Npb25zLnB5IHJlZ3Jlc3Npb25zLnhtbCBcCiAJICAgICBSRUFETUUudGVzdHMgTWFrZWZpbGUudGVzdHMgbGlieG1sMi5zeW1zIHRpbXNvcnQuaCBcCiAJICAgICBSRUFETUUuek9TIFwKKwkgICAgIENNYWtlTGlzdHMudHh0IGNvbmZpZy5oLmNtYWtlLmluIGxpYnhtbDItY29uZmlnLmNtYWtlLmNtYWtlLmluIFwKIAkgICAgICQoQ1ZTX0VYVFJBX0RJU1QpCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9TQVgyLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL1NBWDIuYwppbmRleCA5ZGYwMTg0Li45OTAxOWE5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL1NBWDIuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL1NBWDIuYwpAQCAtMTY2MywyMyArMTY2MywyMyBAQAogCX0KICAgICB9CiAKLSAgICAvKgotICAgICAqIEluc2VydCBhbGwgdGhlIGRlZmF1bHRlZCBhdHRyaWJ1dGVzIGZyb20gdGhlIERURCBlc3BlY2lhbGx5IG5hbWVzcGFjZXMKLSAgICAgKi8KLSAgICBpZiAoKCFjdHh0LT5odG1sKSAmJgotCSgoY3R4dC0+bXlEb2MtPmludFN1YnNldCAhPSBOVUxMKSB8fAotCSAoY3R4dC0+bXlEb2MtPmV4dFN1YnNldCAhPSBOVUxMKSkpIHsKLQl4bWxDaGVja0RlZmF1bHRlZEF0dHJpYnV0ZXMoY3R4dCwgbmFtZSwgcHJlZml4LCBhdHRzKTsKLSAgICB9CisgICAgaWYgKCFjdHh0LT5odG1sKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEluc2VydCBhbGwgdGhlIGRlZmF1bHRlZCBhdHRyaWJ1dGVzIGZyb20gdGhlIERURCBlc3BlY2lhbGx5CisgICAgICAgICAqIG5hbWVzcGFjZXMKKyAgICAgICAgICovCisgICAgICAgIGlmICgoY3R4dC0+bXlEb2MtPmludFN1YnNldCAhPSBOVUxMKSB8fAorICAgICAgICAgICAgKGN0eHQtPm15RG9jLT5leHRTdWJzZXQgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHhtbENoZWNrRGVmYXVsdGVkQXR0cmlidXRlcyhjdHh0LCBuYW1lLCBwcmVmaXgsIGF0dHMpOworICAgICAgICB9CiAKLSAgICAvKgotICAgICAqIHByb2Nlc3MgYWxsIHRoZSBhdHRyaWJ1dGVzIHdob3NlIG5hbWUgc3RhcnQgd2l0aCAieG1sbnMiCi0gICAgICovCi0gICAgaWYgKGF0dHMgIT0gTlVMTCkgewotICAgICAgICBpID0gMDsKLQlhdHQgPSBhdHRzW2krK107Ci0JdmFsdWUgPSBhdHRzW2krK107Ci0JaWYgKCFjdHh0LT5odG1sKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIHByb2Nlc3MgYWxsIHRoZSBhdHRyaWJ1dGVzIHdob3NlIG5hbWUgc3RhcnQgd2l0aCAieG1sbnMiCisgICAgICAgICAqLworICAgICAgICBpZiAoYXR0cyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGF0dCA9IGF0dHNbaSsrXTsKKyAgICAgICAgICAgIHZhbHVlID0gYXR0c1tpKytdOwogCSAgICB3aGlsZSAoKGF0dCAhPSBOVUxMKSAmJiAodmFsdWUgIT0gTlVMTCkpIHsKIAkJaWYgKChhdHRbMF0gPT0gJ3gnKSAmJiAoYXR0WzFdID09ICdtJykgJiYgKGF0dFsyXSA9PSAnbCcpICYmCiAJCSAgICAoYXR0WzNdID09ICduJykgJiYgKGF0dFs0XSA9PSAncycpKQpAQCAtMTY4OCwzMCArMTY4OCwzMCBAQAogCQlhdHQgPSBhdHRzW2krK107CiAJCXZhbHVlID0gYXR0c1tpKytdOwogCSAgICB9Ci0JfQotICAgIH0KKyAgICAgICAgfQogCi0gICAgLyoKLSAgICAgKiBTZWFyY2ggdGhlIG5hbWVzcGFjZSwgbm90ZSB0aGF0IHNpbmNlIHRoZSBhdHRyaWJ1dGVzIGhhdmUgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgdGhlIGxvY2FsIG5hbWVzcGFjZXMgYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBucyA9IHhtbFNlYXJjaE5zKGN0eHQtPm15RG9jLCByZXQsIHByZWZpeCk7Ci0gICAgaWYgKChucyA9PSBOVUxMKSAmJiAocGFyZW50ICE9IE5VTEwpKQotCW5zID0geG1sU2VhcmNoTnMoY3R4dC0+bXlEb2MsIHBhcmVudCwgcHJlZml4KTsKLSAgICBpZiAoKHByZWZpeCAhPSBOVUxMKSAmJiAobnMgPT0gTlVMTCkpIHsKLQlucyA9IHhtbE5ld05zKHJldCwgTlVMTCwgcHJlZml4KTsKLQl4bWxOc1dhcm5Nc2coY3R4dCwgWE1MX05TX0VSUl9VTkRFRklORURfTkFNRVNQQUNFLAotCQkgICAgICJOYW1lc3BhY2UgcHJlZml4ICVzIGlzIG5vdCBkZWZpbmVkXG4iLAotCQkgICAgIHByZWZpeCwgTlVMTCk7Ci0gICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBTZWFyY2ggdGhlIG5hbWVzcGFjZSwgbm90ZSB0aGF0IHNpbmNlIHRoZSBhdHRyaWJ1dGVzIGhhdmUgYmVlbgorICAgICAgICAgKiBwcm9jZXNzZWQsIHRoZSBsb2NhbCBuYW1lc3BhY2VzIGFyZSBhdmFpbGFibGUuCisgICAgICAgICAqLworICAgICAgICBucyA9IHhtbFNlYXJjaE5zKGN0eHQtPm15RG9jLCByZXQsIHByZWZpeCk7CisgICAgICAgIGlmICgobnMgPT0gTlVMTCkgJiYgKHBhcmVudCAhPSBOVUxMKSkKKyAgICAgICAgICAgIG5zID0geG1sU2VhcmNoTnMoY3R4dC0+bXlEb2MsIHBhcmVudCwgcHJlZml4KTsKKyAgICAgICAgaWYgKChwcmVmaXggIT0gTlVMTCkgJiYgKG5zID09IE5VTEwpKSB7CisgICAgICAgICAgICBucyA9IHhtbE5ld05zKHJldCwgTlVMTCwgcHJlZml4KTsKKyAgICAgICAgICAgIHhtbE5zV2Fybk1zZyhjdHh0LCBYTUxfTlNfRVJSX1VOREVGSU5FRF9OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVzcGFjZSBwcmVmaXggJXMgaXMgbm90IGRlZmluZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBOVUxMKTsKKyAgICAgICAgfQogCi0gICAgLyoKLSAgICAgKiBzZXQgdGhlIG5hbWVzcGFjZSBub2RlLCBtYWtpbmcgc3VyZSB0aGF0IGlmIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAqIGlzIHVuYm91bmQgb24gYSBwYXJlbnQgd2Ugc2ltcGx5IGtlZXAgaXQgTlVMTAotICAgICAqLwotICAgIGlmICgobnMgIT0gTlVMTCkgJiYgKG5zLT5ocmVmICE9IE5VTEwpICYmCi0JKChucy0+aHJlZlswXSAhPSAwKSB8fCAobnMtPnByZWZpeCAhPSBOVUxMKSkpCi0JeG1sU2V0TnMocmV0LCBucyk7CisgICAgICAgIC8qCisgICAgICAgICAqIHNldCB0aGUgbmFtZXNwYWNlIG5vZGUsIG1ha2luZyBzdXJlIHRoYXQgaWYgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAqIGlzIHVuYm91bmQgb24gYSBwYXJlbnQgd2Ugc2ltcGx5IGtlZXAgaXQgTlVMTAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChucyAhPSBOVUxMKSAmJiAobnMtPmhyZWYgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICgobnMtPmhyZWZbMF0gIT0gMCkgfHwgKG5zLT5wcmVmaXggIT0gTlVMTCkpKQorICAgICAgICAgICAgeG1sU2V0TnMocmV0LCBucyk7CisgICAgfQogCiAgICAgLyoKICAgICAgKiBwcm9jZXNzIGFsbCB0aGUgb3RoZXIgYXR0cmlidXRlcwpAQCAtMjQ5MywyMCArMjQ5MywyMSBAQAogfQogCiAvKioKLSAqIHhtbFNBWDJDaGFyYWN0ZXJzOgorICogeG1sU0FYMlRleHQ6CiAgKiBAY3R4OiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpCiAgKiBAY2g6ICBhIHhtbENoYXIgc3RyaW5nCiAgKiBAbGVuOiB0aGUgbnVtYmVyIG9mIHhtbENoYXIKKyAqIEB0eXBlOiB0ZXh0IG9yIGNkYXRhCiAgKgotICogcmVjZWl2aW5nIHNvbWUgY2hhcnMgZnJvbSB0aGUgcGFyc2VyLgorICogQXBwZW5kIGNoYXJhY3RlcnMuCiAgKi8KLXZvaWQKLXhtbFNBWDJDaGFyYWN0ZXJzKHZvaWQgKmN0eCwgY29uc3QgeG1sQ2hhciAqY2gsIGludCBsZW4pCitzdGF0aWMgdm9pZAoreG1sU0FYMlRleHQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBjb25zdCB4bWxDaGFyICpjaCwgaW50IGxlbiwKKyAgICAgICAgICAgIHhtbEVsZW1lbnRUeXBlIHR5cGUpCiB7Ci0gICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0ID0gKHhtbFBhcnNlckN0eHRQdHIpIGN0eDsKICAgICB4bWxOb2RlUHRyIGxhc3RDaGlsZDsKIAotICAgIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuOworICAgIGlmIChjdHh0ID09IE5VTEwpIHJldHVybjsKICNpZmRlZiBERUJVR19TQVgKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkgICAgIlNBWC54bWxTQVgyQ2hhcmFjdGVycyglLjMwcywgJWQpXG4iLCBjaCwgbGVuKTsKQEAgLTI1MzUsNyArMjUzNiwxMCBAQAogICAgICAqIGVsZW1lbnRzLiBVc2UgYW4gYXR0cmlidXRlIGluIHRoZSBzdHJ1Y3R1cmUgISEhCiAgICAgICovCiAgICAgaWYgKGxhc3RDaGlsZCA9PSBOVUxMKSB7Ci0gICAgICAgIGxhc3RDaGlsZCA9IHhtbFNBWDJUZXh0Tm9kZShjdHh0LCBjaCwgbGVuKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gWE1MX1RFWFRfTk9ERSkKKyAgICAgICAgICAgIGxhc3RDaGlsZCA9IHhtbFNBWDJUZXh0Tm9kZShjdHh0LCBjaCwgbGVuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFzdENoaWxkID0geG1sTmV3Q0RhdGFCbG9jayhjdHh0LT5teURvYywgY2gsIGxlbik7CiAJaWYgKGxhc3RDaGlsZCAhPSBOVUxMKSB7CiAJICAgIGN0eHQtPm5vZGUtPmNoaWxkcmVuID0gbGFzdENoaWxkOwogCSAgICBjdHh0LT5ub2RlLT5sYXN0ID0gbGFzdENoaWxkOwpAQCAtMjU0OSw4ICsyNTUzLDkgQEAKIAl9CiAgICAgfSBlbHNlIHsKIAlpbnQgY29hbGVzY2VUZXh0ID0gKGxhc3RDaGlsZCAhPSBOVUxMKSAmJgotCSAgICAobGFzdENoaWxkLT50eXBlID09IFhNTF9URVhUX05PREUpICYmCi0JICAgIChsYXN0Q2hpbGQtPm5hbWUgPT0geG1sU3RyaW5nVGV4dCk7CisJICAgIChsYXN0Q2hpbGQtPnR5cGUgPT0gdHlwZSkgJiYKKwkgICAgKCh0eXBlICE9IFhNTF9URVhUX05PREUpIHx8CisgICAgICAgICAgICAgKGxhc3RDaGlsZC0+bmFtZSA9PSB4bWxTdHJpbmdUZXh0KSk7CiAJaWYgKChjb2FsZXNjZVRleHQpICYmIChjdHh0LT5ub2RlbWVtICE9IDApKSB7CiAJICAgIC8qCiAJICAgICAqIFRoZSB3aG9sZSBwb2ludCBvZiBtYWludGFpbmluZyBub2RlbGVuIGFuZCBub2RlbWVtLApAQCAtMjYwNyw3ICsyNjEyLDEwIEBACiAJICAgIH0KIAl9IGVsc2UgewogCSAgICAvKiBNaXhlZCBjb250ZW50LCBmaXJzdCB0aW1lICovCi0JICAgIGxhc3RDaGlsZCA9IHhtbFNBWDJUZXh0Tm9kZShjdHh0LCBjaCwgbGVuKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IFhNTF9URVhUX05PREUpCisgICAgICAgICAgICAgICAgbGFzdENoaWxkID0geG1sU0FYMlRleHROb2RlKGN0eHQsIGNoLCBsZW4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxhc3RDaGlsZCA9IHhtbE5ld0NEYXRhQmxvY2soY3R4dC0+bXlEb2MsIGNoLCBsZW4pOwogCSAgICBpZiAobGFzdENoaWxkICE9IE5VTEwpIHsKIAkJeG1sQWRkQ2hpbGQoY3R4dC0+bm9kZSwgbGFzdENoaWxkKTsKIAkJaWYgKGN0eHQtPm5vZGUtPmNoaWxkcmVuICE9IE5VTEwpIHsKQEAgLTI2MjAsNiArMjYyOCwyMCBAQAogfQogCiAvKioKKyAqIHhtbFNBWDJDaGFyYWN0ZXJzOgorICogQGN0eDogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KQorICogQGNoOiAgYSB4bWxDaGFyIHN0cmluZworICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCisgKgorICogcmVjZWl2aW5nIHNvbWUgY2hhcnMgZnJvbSB0aGUgcGFyc2VyLgorICovCit2b2lkCit4bWxTQVgyQ2hhcmFjdGVycyh2b2lkICpjdHgsIGNvbnN0IHhtbENoYXIgKmNoLCBpbnQgbGVuKQoreworICAgIHhtbFNBWDJUZXh0KCh4bWxQYXJzZXJDdHh0UHRyKSBjdHgsIGNoLCBsZW4sIFhNTF9URVhUX05PREUpOworfQorCisvKioKICAqIHhtbFNBWDJJZ25vcmFibGVXaGl0ZXNwYWNlOgogICogQGN0eDogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KQogICogQGNoOiAgYSB4bWxDaGFyIHN0cmluZwpAQCAtMjc3NSwyNyArMjc5Nyw3IEBACiB2b2lkCiB4bWxTQVgyQ0RhdGFCbG9jayh2b2lkICpjdHgsIGNvbnN0IHhtbENoYXIgKnZhbHVlLCBpbnQgbGVuKQogewotICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dCA9ICh4bWxQYXJzZXJDdHh0UHRyKSBjdHg7Ci0gICAgeG1sTm9kZVB0ciByZXQsIGxhc3RDaGlsZDsKLQotICAgIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuOwotI2lmZGVmIERFQlVHX1NBWAotICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAotCSAgICAiU0FYLnBjZGF0YSglLjEwcywgJWQpXG4iLCB2YWx1ZSwgbGVuKTsKLSNlbmRpZgotICAgIGxhc3RDaGlsZCA9IHhtbEdldExhc3RDaGlsZChjdHh0LT5ub2RlKTsKLSNpZmRlZiBERUJVR19TQVhfVFJFRQotICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAotCSAgICAiYWRkIGNoYXJzIHRvICVzIFxuIiwgY3R4dC0+bm9kZS0+bmFtZSk7Ci0jZW5kaWYKLSAgICBpZiAoKGxhc3RDaGlsZCAhPSBOVUxMKSAmJgotICAgICAgICAobGFzdENoaWxkLT50eXBlID09IFhNTF9DREFUQV9TRUNUSU9OX05PREUpKSB7Ci0JeG1sVGV4dENvbmNhdChsYXN0Q2hpbGQsIHZhbHVlLCBsZW4pOwotICAgIH0gZWxzZSB7Ci0JcmV0ID0geG1sTmV3Q0RhdGFCbG9jayhjdHh0LT5teURvYywgdmFsdWUsIGxlbik7Ci0JaWYgKHhtbEFkZENoaWxkKGN0eHQtPm5vZGUsIHJldCkgPT0gTlVMTCkKLQkJeG1sRnJlZU5vZGUocmV0KTsKLSAgICB9CisgICAgeG1sU0FYMlRleHQoKHhtbFBhcnNlckN0eHRQdHIpIGN0eCwgdmFsdWUsIGxlbiwgWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSk7CiB9CiAKIHN0YXRpYyBpbnQgeG1sU0FYMkRlZmF1bHRWZXJzaW9uVmFsdWUgPSAyOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9hY2xvY2FsLm00IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9hY2xvY2FsLm00CmluZGV4IDFmYzgwMDAuLmE2NzE5NDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvYWNsb2NhbC5tNAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2FjbG9jYWwubTQKQEAgLTEsNCArMSw0IEBACi0jIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xNi4yIC0qLSBBdXRvY29uZiAtKi0KKyMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjE2LjMgLSotIEF1dG9jb25mIC0qLQogCiAjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogCkBAIC0xNCw4ICsxNCw4IEBACiBtNF9pZm5kZWYoW0FDX0NPTkZJR19NQUNST19ESVJTXSwgW200X2RlZnVuKFtfQU1fQ09ORklHX01BQ1JPX0RJUlNdLCBbXSltNF9kZWZ1bihbQUNfQ09ORklHX01BQ1JPX0RJUlNdLCBbX0FNX0NPTkZJR19NQUNST19ESVJTKCRAKV0pXSkKIG00X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCiAgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKLW00X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjldLCwKLVttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42OS4KK200X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNzFdLCwKK1ttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi43MS4KIFlvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCiBJZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KIFRvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgJ2F1dG9yZWNvbmYnLl0pXSkKQEAgLTMxMSw3ICszMTEsNyBAQAogW2FtX19hcGlfdmVyc2lvbj0nMS4xNicKIGRubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KIGRubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCi1tNF9pZihbJDFdLCBbMS4xNi4yXSwgW10sCittNF9pZihbJDFdLCBbMS4xNi4zXSwgW10sCiAgICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCiBdKQogCkBAIC0zMjcsNyArMzI3LDcgQEAKICMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KICMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBTV9JTklUX0FVVE9NQUtFLgogQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAotW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTYuMl0pZG5sCitbQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xNi4zXSlkbmwKIG00X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCiAgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKIF9BTV9BVVRPQ09ORl9WRVJTSU9OKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSldKQpAQCAtMTAxNSwxMiArMTAxNSw3IEBACiBbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAogQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCiBpZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7Ci0gICopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7Ci0gIGVzYWMKKyAgTUlTU0lORz0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9taXNzaW5nJyIKIGZpCiAjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKIGlmIGV2YWwgIiRNSVNTSU5HIC0taXMtbGlnaHR3ZWlnaHQiOyB0aGVuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2J1Zi5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9idWYuYwppbmRleCA4YWQxOGExLi4yNDM2OGQzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2J1Zi5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvYnVmLmMKQEAgLTEzMzQsOCArMTMzNCwxMiBAQAogaW50CiB4bWxCdWZTZXRJbnB1dEJhc2VDdXIoeG1sQnVmUHRyIGJ1ZiwgeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJhc2UsIHNpemVfdCBjdXIpIHsKLSAgICBpZiAoKGlucHV0ID09IE5VTEwpIHx8IChidWYgPT0gTlVMTCkgfHwgKGJ1Zi0+ZXJyb3IpKQorICAgIGlmIChpbnB1dCA9PSBOVUxMKQogICAgICAgICByZXR1cm4oLTEpOworICAgIGlmICgoYnVmID09IE5VTEwpIHx8IChidWYtPmVycm9yKSkgeworICAgICAgICBpbnB1dC0+YmFzZSA9IGlucHV0LT5jdXIgPSBpbnB1dC0+ZW5kID0gQkFEX0NBU1QgIiI7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQogICAgIENIRUNLX0NPTVBBVChidWYpCiAgICAgaW5wdXQtPmJhc2UgPSAmYnVmLT5jb250ZW50W2Jhc2VdOwogICAgIGlucHV0LT5jdXIgPSBpbnB1dC0+YmFzZSArIGN1cjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvY29uZmlnLmguY21ha2UuaW4gYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2NvbmZpZy5oLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjNjOTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2NvbmZpZy5oLmNtYWtlLmluCkBAIC0wLDAgKzEsMjg4IEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSBpcyBhY2NlcHRlZCAqLworI2NtYWtlZGVmaW5lIEFUVFJJQlVURV9ERVNUUlVDVE9SIDEKKworLyogVHlwZSBjYXN0IGZvciB0aGUgZ2V0aG9zdGJ5bmFtZSgpIGFyZ3VtZW50ICovCisjY21ha2VkZWZpbmUgR0VUSE9TVEJZTkFNRV9BUkdfQ0FTVCBAR0VUSE9TVEJZTkFNRV9BUkdfQ0FTVEAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhcnBhL2luZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9uYW1lc2VyLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQVJQQV9OQU1FU0VSX0ggMQorCisvKiBXaGV0aGVyIHN0cnVjdCBzb2NrYWRkcjo6X19zc19mYW1pbHkgZXhpc3RzICovCisjY21ha2VkZWZpbmUgSEFWRV9CUk9LRU5fU1NfRkFNSUxZIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjdHlwZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0NUWVBFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RJUkVOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RMRkNOX0ggMQorCisvKiBIYXZlIGRsb3BlbiBiYXNlZCBkc28gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RMT1BFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ETF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0VSUk5PX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRkNOVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmxvYXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9GTE9BVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0ZQUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0aW1lJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0ZUSU1FIDEKKworLyogRGVmaW5lIGlmIGdldGFkZHJpbmZvIGlzIHRoZXJlICovCisjY21ha2VkZWZpbmUgSEFWRV9HRVRBRERSSU5GTyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2FzY2lpJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0lTQVNDSUkgMQorCisvKiBEZWZpbmUgaWYgaXNpbmYgaXMgdGhlcmUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0lTSU5GIDEKKworLyogRGVmaW5lIGlmIGlzbmFuIGlzIHRoZXJlICovCisjY21ha2VkZWZpbmUgSEFWRV9JU05BTiAxCisKKy8qIERlZmluZSBpZiBoaXN0b3J5IGxpYnJhcnkgaXMgdGhlcmUgKC1saGlzdG9yeSkgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJQkhJU1RPUlkgMQorCisvKiBEZWZpbmUgaWYgcHRocmVhZCBsaWJyYXJ5IGlzIHRoZXJlICgtbHB0aHJlYWQpICovCisjY21ha2VkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKKworLyogRGVmaW5lIGlmIHJlYWRsaW5lIGxpYnJhcnkgaXMgdGhlcmUgKC1scmVhZGxpbmUpICovCisjY21ha2VkZWZpbmUgSEFWRV9MSUJSRUFETElORSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElNSVRTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvY2FsdGltZScgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9MT0NBTFRJTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGx6bWEuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9MWk1BX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX01BTExPQ19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYXRoLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTUFUSF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW1hcCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9NTUFQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtdW5tYXAnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTVVOTUFQIDEKKworLyogbW1hcCgpIGlzIG5vIGdvb2Qgd2l0aG91dCBtdW5tYXAoKSAqLworI2lmIGRlZmluZWQoSEFWRV9NTUFQKSAmJiAhZGVmaW5lZChIQVZFX01VTk1BUCkKKyMgIHVuZGVmIC8qKi8gSEFWRV9NTUFQCisjZW5kaWYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05ESVJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVREQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUE9MTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwcmludGYnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUFJJTlRGIDEKKworLyogRGVmaW5lIGlmIDxwdGhyZWFkLmg+IGlzIHRoZXJlICovCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB1dGVudicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9QVVRFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJhbmQnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUkFORCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmFuZF9yJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1JBTkRfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cmVzb2x2Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUkVTT0xWX0ggMQorCisvKiBIYXZlIHNobF9sb2FkIGJhc2VkIGRzbyAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0hMTE9BRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnbmFsJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NJR05BTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzcHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NQUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNyYW5kJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NSQU5EIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzc2NhbmYnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1NDQU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdGF0JyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUQVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUREFSR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmZ0aW1lJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUkZUSU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX0RJUl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19NTUFOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KKyAgICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfTkRJUl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1lJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1RJTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogV2hldGhlciB2YV9jb3B5KCkgaXMgYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgSEFWRV9WQV9DT1BZIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2ZnByaW50ZicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9WRlBSSU5URiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1ZTTlBSSU5URiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNwcmludGYnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVlNQUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHpsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9aTElCX0ggMQorCisvKiBXaGV0aGVyIF9fdmFfY29weSgpIGlzIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfX19WQV9DT1BZIDEKKworLyogRGVmaW5lIGFzIGNvbnN0IGlmIHRoZSBkZWNsYXJhdGlvbiBvZiBpY29udigpIG5lZWRzIGNvbnN0LiAqLworI2RlZmluZSBJQ09OVl9DT05TVCBASUNPTlZfQ09OU1RACisKKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSB3aGVyZSBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuICovCisjY21ha2VkZWZpbmUgTFRfT0JKRElSICJATFRfT0JKRElSQCIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjZGVmaW5lIFBBQ0tBR0UgIkBQQUNLQUdFQCIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJAUEFDS0FHRV9CVUdSRVBPUlRAIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiQFBBQ0tBR0VfTkFNRUAiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkBQQUNLQUdFX1NUUklOR0AiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJAUEFDS0FHRV9UQVJOQU1FQCIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9VUkwgIkBQQUNLQUdFX1VSTEAiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCisKKy8qIFR5cGUgY2FzdCBmb3IgdGhlIHNlbmQoKSBmdW5jdGlvbiAybmQgYXJnICovCisjY21ha2VkZWZpbmUgU0VORF9BUkcyX0NBU1QgQFNFTkRfQVJHMl9DQVNUQAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNjbWFrZWRlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBTdXBwb3J0IGZvciBJUHY2ICovCisjY21ha2VkZWZpbmUgU1VQUE9SVF9JUDYgMQorCisvKiBEZWZpbmUgaWYgdmFfbGlzdCBpcyBhbiBhcnJheSB0eXBlICovCisjY21ha2VkZWZpbmUgVkFfTElTVF9JU19BUlJBWSAxCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyNjbWFrZWRlZmluZSBWRVJTSU9OICJAVkVSU0lPTkAiCisKKy8qIERldGVybWluZSB3aGF0IHNvY2tldCBsZW5ndGggKHNvY2tsZW5fdCkgZGF0YSB0eXBlIGlzICovCisjY21ha2VkZWZpbmUgWE1MX1NPQ0tMRU5fVCBAWE1MX1NPQ0tMRU5fVEAKKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50MzJfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKyNjbWFrZWRlZmluZSBfVUlOVDMyX1QgQF9VSU5UMzJfVEAKKworLyogc3NfZmFtaWx5IGlzIG5vdCBkZWZpbmVkIGhlcmUsIHVzZSBfX3NzX2ZhbWlseSBpbnN0ZWFkICovCisjY21ha2VkZWZpbmUgc3NfZmFtaWx5IEBzc19mYW1pbHlACisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAzMiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworI2NtYWtlZGVmaW5lIHVpbnQzMl90IEB1aW50MzJfdEAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvY29uZmlnLmguaW4gYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2NvbmZpZy5oLmluCmluZGV4IGE3NTE3NjkuLmE1NWQ0ZTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvY29uZmlnLmguaW4KKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9jb25maWcuaC5pbgpAQCAtMSw1ICsxLDggQEAKIC8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwogCisvKiBBIGZvcm0gdGhhdCB3aWxsIG5vdCBjb25mdXNlIGFwaWJ1aWxkLnB5ICovCisjdW5kZWYgQVRUUklCVVRFX0RFU1RSVUNUT1IKKwogLyogVHlwZSBjYXN0IGZvciB0aGUgZ2V0aG9zdGJ5bmFtZSgpIGFyZ3VtZW50ICovCiAjdW5kZWYgR0VUSE9TVEJZTkFNRV9BUkdfQ0FTVAogCkBAIC05LDYgKzEyLDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9uYW1lc2VyLmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfQVJQQV9OQU1FU0VSX0gKIAorLyogRGVmaW5lIGlmIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSBpcyBhY2NlcHRlZCAqLworI3VuZGVmIEhBVkVfQVRUUklCVVRFX0RFU1RSVUNUT1IKKwogLyogV2hldGhlciBzdHJ1Y3Qgc29ja2FkZHI6Ol9fc3NfZmFtaWx5IGV4aXN0cyAqLwogI3VuZGVmIEhBVkVfQlJPS0VOX1NTX0ZBTUlMWQogCkBAIC04NCw5ICs5MCw2IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hdGguaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9NQVRIX0gKIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1tYXAnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfTU1BUAogCkBAIC0xNTgsNiArMTYxLDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfU1RESU5UX0gKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURElPX0gKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9TVERMSUJfSAogCkBAIC0yNTYsNyArMjYyLDkgQEAKIC8qIFR5cGUgY2FzdCBmb3IgdGhlIHNlbmQoKSBmdW5jdGlvbiAybmQgYXJnICovCiAjdW5kZWYgU0VORF9BUkcyX0NBU1QKIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisvKiBEZWZpbmUgdG8gMSBpZiBhbGwgb2YgdGhlIEM5MCBzdGFuZGFyZCBoZWFkZXJzIGV4aXN0IChub3QganVzdCB0aGUgb25lcworICAgcmVxdWlyZWQgaW4gYSBmcmVlc3RhbmRpbmcgZW52aXJvbm1lbnQpLiBUaGlzIG1hY3JvIGlzIHByb3ZpZGVkIGZvcgorICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eTsgbmV3IGNvZGUgbmVlZCBub3QgdXNlIGl0LiAqLwogI3VuZGVmIFNURENfSEVBREVSUwogCiAvKiBTdXBwb3J0IGZvciBJUHY2ICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2NvbmZpZ3VyZS5hYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvY29uZmlndXJlLmFjCmluZGV4IDA5NDE4YWYuLjViMTYxYTU0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2NvbmZpZ3VyZS5hYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2NvbmZpZ3VyZS5hYwpAQCAtMSwxNSArMSwyMCBAQAogZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCiBBQ19QUkVSRVEoWzIuNjNdKQotQUNfSU5JVAorCittNF9kZWZpbmUoW01BSk9SX1ZFUlNJT05dLCAyKQorbTRfZGVmaW5lKFtNSU5PUl9WRVJTSU9OXSwgOSkKK200X2RlZmluZShbTUlDUk9fVkVSU0lPTl0sIDEyKQorCitBQ19JTklUKFtsaWJ4bWwyXSxbTUFKT1JfVkVSU0lPTi5NSU5PUl9WRVJTSU9OLk1JQ1JPX1ZFUlNJT05dKQogQUNfQ09ORklHX1NSQ0RJUihbZW50aXRpZXMuY10pCiBBQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQogQU1fTUFJTlRBSU5FUl9NT0RFKFtlbmFibGVdKQogQUNfQ09ORklHX01BQ1JPX0RJUihbbTRdKQogQUNfQ0FOT05JQ0FMX0hPU1QKIAotTElCWE1MX01BSk9SX1ZFUlNJT049MgotTElCWE1MX01JTk9SX1ZFUlNJT049OQotTElCWE1MX01JQ1JPX1ZFUlNJT049MTAKK0xJQlhNTF9NQUpPUl9WRVJTSU9OPU1BSk9SX1ZFUlNJT04KK0xJQlhNTF9NSU5PUl9WRVJTSU9OPU1JTk9SX1ZFUlNJT04KK0xJQlhNTF9NSUNST19WRVJTSU9OPU1JQ1JPX1ZFUlNJT04KIExJQlhNTF9NSUNST19WRVJTSU9OX1NVRkZJWD0KIExJQlhNTF9WRVJTSU9OPSRMSUJYTUxfTUFKT1JfVkVSU0lPTi4kTElCWE1MX01JTk9SX1ZFUlNJT04uJExJQlhNTF9NSUNST19WRVJTSU9OJExJQlhNTF9NSUNST19WRVJTSU9OX1NVRkZJWAogTElCWE1MX1ZFUlNJT05fSU5GTz1gZXhwciAkTElCWE1MX01BSk9SX1ZFUlNJT04gKyAkTElCWE1MX01JTk9SX1ZFUlNJT05gOiRMSUJYTUxfTUlDUk9fVkVSU0lPTjokTElCWE1MX01JTk9SX1ZFUlNJT04KQEAgLTUwLDcgKzU1LDcgQEAKIAogVkVSU0lPTj0ke0xJQlhNTF9WRVJTSU9OfQogCi1BTV9JTklUX0FVVE9NQUtFKGxpYnhtbDIsICRWRVJTSU9OKQorQU1fSU5JVF9BVVRPTUFLRShbZm9yZWlnbl0pCiAKICMgU3VwcG9ydCBzaWxlbnQgYnVpbGQgcnVsZXMsIHJlcXVpcmVzIGF0IGxlYXN0IGF1dG9tYWtlLTEuMTEuIERpc2FibGUKICMgYnkgZWl0aGVyIHBhc3NpbmcgLS1kaXNhYmxlLXNpbGVudC1ydWxlcyB0byBjb25maWd1cmUgb3IgcGFzc2luZyBWPTEKQEAgLTY0MSw2ICs2NDYsMTcgQEAKICAgICAgIFtUeXBlIGNhc3QgZm9yIHRoZSBzZW5kKCkgZnVuY3Rpb24gMm5kIGFyZ10pCiBmaQogCitkbmwgQ2hlY2tpbmcgd2hldGhlciBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgaXMgYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpIGlzIGFjY2VwdGVkXSkKK0FDX1RSWV9DT01QSUxFMihbCit2b2lkIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKQorZih2b2lkKSB7fV0sIFtdLCBbCisgIEFDX01TR19SRVNVTFQoeWVzKQorICBBQ19ERUZJTkUoW0hBVkVfQVRUUklCVVRFX0RFU1RSVUNUT1JdLCBbMV0sW0RlZmluZSBpZiBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgaXMgYWNjZXB0ZWRdKQorICBBQ19ERUZJTkUoW0FUVFJJQlVURV9ERVNUUlVDVE9SXSwgW19fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKV0sW0EgZm9ybSB0aGF0IHdpbGwgbm90IGNvbmZ1c2UgYXBpYnVpbGQucHldKV0sWworICBBQ19NU0dfUkVTVUxUKG5vKV0pCisKKwogZG5sICoqKioqKioqKioqKioqKioqKioqKioqQ2hlY2tpbmcgZm9yIGF2YWlsYWJpbGl0eSBvZiBJUHY2KioqKioqKioqKioqKioqKioqKgogCiBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIElQdjZdKQpAQCAtMTUwMyw4ICsxNTE5LDggQEAKIAogICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKHVuaWNvZGUvdWNudi5oLAogICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBpY3UpCi0gICAgICAgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPl0sWwotICAgICAgICBVQ29udmVydGVyICp1dGYgPSB1Y252X29wZW4oIlVURi04IiwgTlVMTCk7XSxbCisgICAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPl1dLCBbWworICAgICAgICBVQ29udmVydGVyICp1dGYgPSB1Y252X29wZW4oIlVURi04IiwgTlVMTCk7XV0pXSxbCiAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgICAgICAgICAgaGF2ZV9saWJpY3U9eWVzXSxbCiAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKQEAgLTE1MTUsOCArMTUzMSw4IEBACiAgICAgICAgICAgICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAke0lDVV9MSUJTfSIKICAgICAgICAgICAgICAgICBMSUJTPSIke0xJQlN9IC1saWN1Y29yZSIKIAotICAgICAgICAgICAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8dW5pY29kZS91Y252Lmg+XSxbCi0gICAgICAgIFVDb252ZXJ0ZXIgKnV0ZiA9IHVjbnZfb3BlbigiVVRGLTgiLCBOVUxMKTtdLFsKKyAgICAgICAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPl1dLCBbWworICAgICAgICBVQ29udmVydGVyICp1dGYgPSB1Y252X29wZW4oIlVURi04IiwgTlVMTCk7XV0pXSxbCiAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgICAgICAgICAgICAgICBoYXZlX2xpYmljdT15ZXMKICAgICAgICAgICAgICAgICAgICAgSUNVX0xJQlM9IiR7SUNVX0xJQlN9IC1saWN1Y29yZSIKQEAgLTE3MDQsNyArMTcyMCw3IEBACiBsbiAtcyAkc3JjZGlyL0NvcHlyaWdodCBDT1BZSU5HCiAKICMga2VlcCBvbiBvbmUgbGluZSBmb3IgY3lnd2luIGMuZi4gIzEzMDg5NgotQUNfQ09ORklHX0ZJTEVTKFtsaWJ4bWwyLnNwZWM6bGlieG1sLnNwZWMuaW4gTWFrZWZpbGUgaW5jbHVkZS9NYWtlZmlsZSBpbmNsdWRlL2xpYnhtbC9NYWtlZmlsZSBkb2MvTWFrZWZpbGUgZG9jL2V4YW1wbGVzL01ha2VmaWxlIGRvYy9kZXZoZWxwL01ha2VmaWxlIGV4YW1wbGUvTWFrZWZpbGUgcHl0aG9uL01ha2VmaWxlIHB5dGhvbi90ZXN0cy9NYWtlZmlsZSB4c3RjL01ha2VmaWxlIGluY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaCBsaWJ4bWwtMi4wLnBjIGxpYnhtbC0yLjAtdW5pbnN0YWxsZWQucGMgbGlieG1sMi1jb25maWcuY21ha2VdKQorQUNfQ09ORklHX0ZJTEVTKFtsaWJ4bWwyLnNwZWM6bGlieG1sLnNwZWMuaW4gTWFrZWZpbGUgaW5jbHVkZS9NYWtlZmlsZSBpbmNsdWRlL2xpYnhtbC9NYWtlZmlsZSBkb2MvTWFrZWZpbGUgZG9jL2V4YW1wbGVzL01ha2VmaWxlIGRvYy9kZXZoZWxwL01ha2VmaWxlIGV4YW1wbGUvTWFrZWZpbGUgZnV6ei9NYWtlZmlsZSBweXRob24vTWFrZWZpbGUgcHl0aG9uL3Rlc3RzL01ha2VmaWxlIHhzdGMvTWFrZWZpbGUgaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oIGxpYnhtbC0yLjAucGMgbGlieG1sLTIuMC11bmluc3RhbGxlZC5wYyBsaWJ4bWwyLWNvbmZpZy5jbWFrZV0pCiBBQ19DT05GSUdfRklMRVMoW3B5dGhvbi9zZXR1cC5weV0sIFtjaG1vZCAreCBweXRob24vc2V0dXAucHldKQogQUNfQ09ORklHX0ZJTEVTKFt4bWwyLWNvbmZpZ10sIFtjaG1vZCAreCB4bWwyLWNvbmZpZ10pCiBBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZW5jb2RpbmcuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZW5jb2RpbmcuYwppbmRleCA4M2Y2NGE0Li41ZTUwYzE1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2VuY29kaW5nLmMKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9lbmNvZGluZy5jCkBAIC0xNzAsNyArMTcwLDcgQEAKICAqIFJldHVybnMgMCBpZiBzdWNjZXNzLCBvciAtMSBvdGhlcndpc2UKICAqIFRoZSB2YWx1ZSBvZiBAaW5sZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkCiAgKiAgICAgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgZWxzZSB1bnByZWRpY3RhYmxlLgotICogVGhlIHZhbHVlIG9mIEBvdXRsZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkLgorICogVGhlIHZhbHVlIG9mIEBvdXRsZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIHByb2R1Y2VkLgogICovCiBzdGF0aWMgaW50CiBhc2NpaVRvVVRGOCh1bnNpZ25lZCBjaGFyKiBvdXQsIGludCAqb3V0bGVuLApAQCAtMjE3LDcgKzIxNyw3IEBACiAgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcywgLTIgaWYgdGhlIHRyYW5zY29kaW5nIGZhaWxzLCBvciAtMSBvdGhlcndpc2UKICAqIFRoZSB2YWx1ZSBvZiBAaW5sZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkCiAgKiAgICAgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgZWxzZSB1bnByZWRpY3RhYmxlLgotICogVGhlIHZhbHVlIG9mIEBvdXRsZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkLgorICogVGhlIHZhbHVlIG9mIEBvdXRsZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIHByb2R1Y2VkLgogICovCiBzdGF0aWMgaW50CiBVVEY4VG9hc2NpaSh1bnNpZ25lZCBjaGFyKiBvdXQsIGludCAqb3V0bGVuLApAQCAtMzAxLDcgKzMwMSw3IEBACiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpZiBzdWNjZXNzLCBvciAtMSBvdGhlcndpc2UKICAqIFRoZSB2YWx1ZSBvZiBAaW5sZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkCiAgKiAgICAgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgZWxzZSB1bnByZWRpY3RhYmxlLgotICogVGhlIHZhbHVlIG9mIEBvdXRsZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkLgorICogVGhlIHZhbHVlIG9mIEBvdXRsZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIHByb2R1Y2VkLgogICovCiBpbnQKIGlzb2xhdDFUb1VURjgodW5zaWduZWQgY2hhciogb3V0LCBpbnQgKm91dGxlbiwKQEAgLTM3Myw2ICszNzMsMTEgQEAKICAgICBpZiAobGVuIDwgMCkKIAlyZXR1cm4oLTEpOwogCisgICAgLyoKKyAgICAgKiBGSVhNRTogQ29udmVyc2lvbiBmdW5jdGlvbnMgbXVzdCBhc3N1cmUgdmFsaWQgVVRGLTgsIHNvIHdlIGhhdmUKKyAgICAgKiB0byBjaGVjayBmb3IgVVRGLTggdmFsaWRpdHkuIFByZWZlcmFibHksIHRoaXMgY29udmVydGVyIHNob3VsZG4ndAorICAgICAqIGJlIHVzZWQgYXQgYWxsLgorICAgICAqLwogICAgIG1lbWNweShvdXQsIGluYiwgbGVuKTsKIAogICAgICpvdXRsZW4gPSBsZW47CkBAIC0zOTYsNyArNDAxLDcgQEAKICAgICAgICAgICAgb3IgLTEgb3RoZXJ3aXNlCiAgKiBUaGUgdmFsdWUgb2YgQGlubGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBjb25zdW1lZAogICogICAgIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zaXRpdmUsIGVsc2UgdW5wcmVkaWN0YWJsZS4KLSAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBjb25zdW1lZC4KKyAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBwcm9kdWNlZC4KICAqLwogaW50CiBVVEY4VG9pc29sYXQxKHVuc2lnbmVkIGNoYXIqIG91dCwgaW50ICpvdXRsZW4sCkBAIC00OTYsMTMgKzUwMSwxOCBAQAogewogICAgIHVuc2lnbmVkIGNoYXIqIG91dHN0YXJ0ID0gb3V0OwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHByb2Nlc3NlZCA9IGluYjsKLSAgICB1bnNpZ25lZCBjaGFyKiBvdXRlbmQgPSBvdXQgKyAqb3V0bGVuOworICAgIHVuc2lnbmVkIGNoYXIqIG91dGVuZDsKICAgICB1bnNpZ25lZCBzaG9ydCogaW4gPSAodW5zaWduZWQgc2hvcnQqKSBpbmI7CiAgICAgdW5zaWduZWQgc2hvcnQqIGluZW5kOwogICAgIHVuc2lnbmVkIGludCBjLCBkLCBpbmxlbjsKICAgICB1bnNpZ25lZCBjaGFyICp0bXA7CiAgICAgaW50IGJpdHM7CiAKKyAgICBpZiAoKm91dGxlbiA9PSAwKSB7CisgICAgICAgICppbmxlbmIgPSAwOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIG91dGVuZCA9IG91dCArICpvdXRsZW47CiAgICAgaWYgKCgqaW5sZW5iICUgMikgPT0gMSkKICAgICAgICAgKCppbmxlbmIpLS07CiAgICAgaW5sZW4gPSAqaW5sZW5iIC8gMjsKQEAgLTE0ODMsMTYgKzE0OTMsMjUgQEAKICAgICBpZiAoKGhhbmRsZXIgPT0gTlVMTCkgfHwgKGhhbmRsZXJzID09IE5VTEwpKSB7CiAgICAgICAgIHhtbEVuY29kaW5nRXJyKFhNTF9JMThOX05PX0hBTkRMRVIsCiAJCSJ4bWxSZWdpc3RlckNoYXJFbmNvZGluZ0hhbmRsZXI6IE5VTEwgaGFuZGxlciAhXG4iLCBOVUxMKTsKLQlyZXR1cm47CisgICAgICAgIGdvdG8gZnJlZV9oYW5kbGVyOwogICAgIH0KIAogICAgIGlmIChuYkNoYXJFbmNvZGluZ0hhbmRsZXIgPj0gTUFYX0VOQ09ESU5HX0hBTkRMRVJTKSB7CiAgICAgICAgIHhtbEVuY29kaW5nRXJyKFhNTF9JMThOX0VYQ0VTU19IQU5ETEVSLAogCSJ4bWxSZWdpc3RlckNoYXJFbmNvZGluZ0hhbmRsZXI6IFRvbyBtYW55IGhhbmRsZXIgcmVnaXN0ZXJlZCwgc2VlICVzXG4iLAogCSAgICAgICAgICAgICAgICJNQVhfRU5DT0RJTkdfSEFORExFUlMiKTsKLQlyZXR1cm47CisgICAgICAgIGdvdG8gZnJlZV9oYW5kbGVyOwogICAgIH0KICAgICBoYW5kbGVyc1tuYkNoYXJFbmNvZGluZ0hhbmRsZXIrK10gPSBoYW5kbGVyOworICAgIHJldHVybjsKKworZnJlZV9oYW5kbGVyOgorICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGhhbmRsZXItPm5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgeG1sRnJlZShoYW5kbGVyLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICB4bWxGcmVlKGhhbmRsZXIpOworICAgIH0KIH0KIAogLyoqCkBAIC0xNzg0LDcgKzE4MDMsNyBAQAogICogQGNkOgkJaWNvbnYgY29udmVydGVyIGRhdGEgc3RydWN0dXJlCiAgKiBAb3V0OiAgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSByZXN1bHQKICAqIEBvdXRsZW46ICB0aGUgbGVuZ3RoIG9mIEBvdXQKLSAqIEBpbjogIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBJU08gTGF0aW4gMSBjaGFycworICogQGluOiAgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGlucHV0IGJ5dGVzCiAgKiBAaW5sZW46ICB0aGUgbGVuZ3RoIG9mIEBpbgogICoKICAqIFJldHVybnMgMCBpZiBzdWNjZXNzLCBvcgpAQCAtMTc5NSw3ICsxODE0LDcgQEAKICAqCiAgKiBUaGUgdmFsdWUgb2YgQGlubGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBjb25zdW1lZAogICogICAgIGFzIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zaXRpdmUsIGVsc2UgdW5wcmVkaWN0YWJsZS4KLSAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBjb25zdW1lZC4KKyAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBwcm9kdWNlZC4KICAqLwogc3RhdGljIGludAogeG1sSWNvbnZXcmFwcGVyKGljb252X3QgY2QsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsZW4sCkBAIC0xODUxLDcgKzE4NzAsNyBAQAogICogQHRvVW5pY29kZSA6IG5vbi16ZXJvIGlmIHRvVW5pY29kZS4gMCBvdGhlcndpc2UuCiAgKiBAb3V0OiAgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSByZXN1bHQKICAqIEBvdXRsZW46ICB0aGUgbGVuZ3RoIG9mIEBvdXQKLSAqIEBpbjogIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBJU08gTGF0aW4gMSBjaGFycworICogQGluOiAgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGlucHV0IGJ5dGVzCiAgKiBAaW5sZW46ICB0aGUgbGVuZ3RoIG9mIEBpbgogICogQGZsdXNoOiBpZiB0cnVlLCBpbmRpY2F0ZXMgZW5kIG9mIGlucHV0CiAgKgpAQCAtMTg2Myw3ICsxODgyLDcgQEAKICAqCiAgKiBUaGUgdmFsdWUgb2YgQGlubGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBjb25zdW1lZAogICogICAgIGFzIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zaXRpdmUsIGVsc2UgdW5wcmVkaWN0YWJsZS4KLSAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBjb25zdW1lZC4KKyAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBwcm9kdWNlZC4KICAqLwogc3RhdGljIGludAogeG1sVWNvbnZXcmFwcGVyKHVjb252X3QgKmNkLCBpbnQgdG9Vbmljb2RlLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bGVuLApAQCAtMTkxMiw2ICsxOTMxLDI1IEBACiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKgorICogeG1sRW5jSW5wdXRDaHVuazoKKyAqIEBoYW5kbGVyOiAgZW5jb2RpbmcgaGFuZGxlcgorICogQG91dDogIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgcmVzdWx0CisgKiBAb3V0bGVuOiAgdGhlIGxlbmd0aCBvZiBAb3V0CisgKiBAaW46ICBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW5wdXQgYnl0ZXMKKyAqIEBpbmxlbjogIHRoZSBsZW5ndGggb2YgQGluCisgKiBAZmx1c2g6ICBmbHVzaCAoSUNVLXJlbGF0ZWQpCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG9yCisgKiAgICAgLTEgYnkgbGFjayBvZiBzcGFjZSwgb3IKKyAqICAgICAtMiBpZiB0aGUgdHJhbnNjb2RpbmcgZmFpbHMgKGZvciAqaW4gaXMgbm90IHZhbGlkIHV0Zjggc3RyaW5nIG9yCisgKiAgICAgICAgdGhlIHJlc3VsdCBvZiB0cmFuc2Zvcm1hdGlvbiBjYW4ndCBmaXQgaW50byB0aGUgZW5jb2Rpbmcgd2Ugd2FudCksIG9yCisgKiAgICAgLTMgaWYgdGhlcmUgdGhlIGxhc3QgYnl0ZSBjYW4ndCBmb3JtIGEgc2luZ2xlIG91dHB1dCBjaGFyLgorICoKKyAqIFRoZSB2YWx1ZSBvZiBAaW5sZW4gYWZ0ZXIgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGNvbnN1bWVkCisgKiAgICAgYXMgdGhlIHJldHVybiB2YWx1ZSBpcyAwLCBlbHNlIHVucHJlZGljdGFibGUuCisgKiBUaGUgdmFsdWUgb2YgQG91dGxlbiBhZnRlciByZXR1cm4gaXMgdGhlIG51bWJlciBvZiBvY3RldHMgcHJvZHVjZWQuCisgKi8KIHN0YXRpYyBpbnQKIHhtbEVuY0lucHV0Q2h1bmsoeG1sQ2hhckVuY29kaW5nSGFuZGxlciAqaGFuZGxlciwgdW5zaWduZWQgY2hhciAqb3V0LAogICAgICAgICAgICAgICAgICBpbnQgKm91dGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCAqaW5sZW4sIGludCBmbHVzaCkgewpAQCAtMTkyMCw2ICsxOTU4LDggQEAKIAogICAgIGlmIChoYW5kbGVyLT5pbnB1dCAhPSBOVUxMKSB7CiAgICAgICAgIHJldCA9IGhhbmRsZXItPmlucHV0KG91dCwgb3V0bGVuLCBpbiwgaW5sZW4pOworICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgcmV0ID0gMDsKICAgICB9CiAjaWZkZWYgTElCWE1MX0lDT05WX0VOQUJMRUQKICAgICBlbHNlIGlmIChoYW5kbGVyLT5pY29udl9pbiAhPSBOVUxMKSB7CkBAIC0xOTQxLDcgKzE5ODEsMjUgQEAKICAgICByZXR1cm4ocmV0KTsKIH0KIAotLyogUmV0dXJucyAtNCBpZiBubyBvdXRwdXQgZnVuY3Rpb24gd2FzIGZvdW5kLiAqLworLyoqCisgKiB4bWxFbmNPdXRwdXRDaHVuazoKKyAqIEBoYW5kbGVyOiAgZW5jb2RpbmcgaGFuZGxlcgorICogQG91dDogIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgcmVzdWx0CisgKiBAb3V0bGVuOiAgdGhlIGxlbmd0aCBvZiBAb3V0CisgKiBAaW46ICBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW5wdXQgYnl0ZXMKKyAqIEBpbmxlbjogIHRoZSBsZW5ndGggb2YgQGluCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG9yCisgKiAgICAgLTEgYnkgbGFjayBvZiBzcGFjZSwgb3IKKyAqICAgICAtMiBpZiB0aGUgdHJhbnNjb2RpbmcgZmFpbHMgKGZvciAqaW4gaXMgbm90IHZhbGlkIHV0Zjggc3RyaW5nIG9yCisgKiAgICAgICAgdGhlIHJlc3VsdCBvZiB0cmFuc2Zvcm1hdGlvbiBjYW4ndCBmaXQgaW50byB0aGUgZW5jb2Rpbmcgd2Ugd2FudCksIG9yCisgKiAgICAgLTMgaWYgdGhlcmUgdGhlIGxhc3QgYnl0ZSBjYW4ndCBmb3JtIGEgc2luZ2xlIG91dHB1dCBjaGFyLgorICogICAgIC00IGlmIG5vIG91dHB1dCBmdW5jdGlvbiB3YXMgZm91bmQuCisgKgorICogVGhlIHZhbHVlIG9mIEBpbmxlbiBhZnRlciByZXR1cm4gaXMgdGhlIG51bWJlciBvZiBvY3RldHMgY29uc3VtZWQKKyAqICAgICBhcyB0aGUgcmV0dXJuIHZhbHVlIGlzIDAsIGVsc2UgdW5wcmVkaWN0YWJsZS4KKyAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBwcm9kdWNlZC4KKyAqLwogc3RhdGljIGludAogeG1sRW5jT3V0cHV0Q2h1bmsoeG1sQ2hhckVuY29kaW5nSGFuZGxlciAqaGFuZGxlciwgdW5zaWduZWQgY2hhciAqb3V0LAogICAgICAgICAgICAgICAgICAgaW50ICpvdXRsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgKmlubGVuKSB7CkBAIC0xOTQ5LDYgKzIwMDcsOCBAQAogCiAgICAgaWYgKGhhbmRsZXItPm91dHB1dCAhPSBOVUxMKSB7CiAgICAgICAgIHJldCA9IGhhbmRsZXItPm91dHB1dChvdXQsIG91dGxlbiwgaW4sIGlubGVuKTsKKyAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgIHJldCA9IDA7CiAgICAgfQogI2lmZGVmIExJQlhNTF9JQ09OVl9FTkFCTEVECiAgICAgZWxzZSBpZiAoaGFuZGxlci0+aWNvbnZfb3V0ICE9IE5VTEwpIHsKQEAgLTE5NTgsNyArMjAxOCw3IEBACiAjaWZkZWYgTElCWE1MX0lDVV9FTkFCTEVECiAgICAgZWxzZSBpZiAoaGFuZGxlci0+dWNvbnZfb3V0ICE9IE5VTEwpIHsKICAgICAgICAgcmV0ID0geG1sVWNvbnZXcmFwcGVyKGhhbmRsZXItPnVjb252X291dCwgMCwgb3V0LCBvdXRsZW4sIGluLCBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogI2VuZGlmIC8qIExJQlhNTF9JQ1VfRU5BQkxFRCAqLwogICAgIGVsc2UgewpAQCAtMjA1NCw3ICsyMTE0LDcgQEAKICAgICAgKi8KICAgICBpZiAocmV0ID09IC0zKSByZXQgPSAwOwogICAgIGlmIChyZXQgPT0gLTEpIHJldCA9IDA7Ci0gICAgcmV0dXJuKHJldCk7CisgICAgcmV0dXJuKHdyaXR0ZW4gPyB3cml0dGVuIDogcmV0KTsKIH0KIAogLyoqCkBAIC0yMTg0LDcgKzIyNDQsNyBAQAogICAgICAqLwogICAgIGlmIChyZXQgPT0gLTMpIHJldCA9IDA7CiAgICAgaWYgKHJldCA9PSAtMSkgcmV0ID0gMDsKLSAgICByZXR1cm4ocmV0KTsKKyAgICByZXR1cm4oY19vdXQgPyBjX291dCA6IHJldCk7CiB9CiAKIC8qKgpAQCAtMjM5NCw3ICsyNDU0LDcgQEAKIHsKICAgICBpbnQgcmV0OwogICAgIHNpemVfdCB3cml0dGVuOwotICAgIHNpemVfdCB3cml0dGVudG90ID0gMDsKKyAgICBpbnQgd3JpdHRlbnRvdCA9IDA7CiAgICAgc2l6ZV90IHRvY29udjsKICAgICBpbnQgY19pbjsKICAgICBpbnQgY19vdXQ7CkBAIC0yNDI3LDcgKzI0ODcsNyBAQAogCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkiaW5pdGlhbGl6ZWQgZW5jb2RlclxuIik7CiAjZW5kaWYKLSAgICAgICAgcmV0dXJuKDApOworICAgICAgICByZXR1cm4oY19vdXQpOwogICAgIH0KIAogICAgIC8qCkBAIC0yNTQwLDcgKzI2MDAsNyBAQAogICAgICAgICAgICAgZ290byByZXRyeTsKIAl9CiAgICAgfQotICAgIHJldHVybihyZXQpOworICAgIHJldHVybih3cml0dGVudG90ID8gd3JpdHRlbnRvdCA6IHJldCk7CiB9CiAjZW5kaWYKIApAQCAtMjU2OSw3ICsyNjI5LDYgQEAKICAgICBpbnQgd3JpdHRlbjsKICAgICBpbnQgd3JpdHRlbnRvdCA9IDA7CiAgICAgaW50IHRvY29udjsKLSAgICBpbnQgb3V0cHV0ID0gMDsKIAogICAgIGlmIChoYW5kbGVyID09IE5VTEwpIHJldHVybigtMSk7CiAgICAgaWYgKG91dCA9PSBOVUxMKSByZXR1cm4oLTEpOwpAQCAtMjYyMiw4ICsyNjgxLDYgQEAKICAgICAgICAgcmV0ID0gLTM7CiAgICAgfQogCi0gICAgaWYgKHJldCA+PSAwKSBvdXRwdXQgKz0gcmV0OwotCiAgICAgLyoKICAgICAgKiBBdHRlbXB0IHRvIGhhbmRsZSBlcnJvciBjYXNlcwogICAgICAqLwpAQCAtMjcwNSw3ICsyNzYyLDcgQEAKICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAJfQogICAgIH0KLSAgICByZXR1cm4ocmV0KTsKKyAgICByZXR1cm4od3JpdHRlbnRvdCA/IHdyaXR0ZW50b3QgOiByZXQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZW50aXRpZXMuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZW50aXRpZXMuYwppbmRleCA0YjQxZmU5Li44MzA3NDcxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2VudGl0aWVzLmMKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9lbnRpdGllcy5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAkgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgICB4bWxEaWN0UHRyIGRpY3QgPSBOVUxMOwogICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUgPSBOVUxMOwotICAgIHhtbEVudGl0eVB0ciByZXQ7CisgICAgeG1sRW50aXR5UHRyIHJldCwgcHJlZGVmOwogCiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKIAlyZXR1cm4oTlVMTCk7CkBAIC0yMjQsNiArMjI0LDQ0IEBACiAgICAgICAgIGNhc2UgWE1MX0lOVEVSTkFMX0dFTkVSQUxfRU5USVRZOgogICAgICAgICBjYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFk6CiAgICAgICAgIGNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZOgorICAgICAgICAgICAgcHJlZGVmID0geG1sR2V0UHJlZGVmaW5lZEVudGl0eShuYW1lKTsKKyAgICAgICAgICAgIGlmIChwcmVkZWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCB2YWxpZCA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiA0LjYgUHJlZGVmaW5lZCBFbnRpdGllcyAqLworICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFkpICYmCisgICAgICAgICAgICAgICAgICAgIChjb250ZW50ICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjID0gcHJlZGVmLT5jb250ZW50WzBdOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoKGNvbnRlbnRbMF0gPT0gYykgJiYgKGNvbnRlbnRbMV0gPT0gMCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKGMgPT0gJz4nKSB8fCAoYyA9PSAnXCcnKSB8fCAoYyA9PSAnIicpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjb250ZW50WzBdID09ICcmJykgJiYgKGNvbnRlbnRbMV0gPT0gJyMnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMl0gPT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqaGV4ID0gQkFEX0NBU1QgIjAxMjM0NTY3ODlBQkNERUYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbENoYXIgcmVmW10gPSAiMDA7IjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlswXSA9IGhleFtjIC8gMTYgJSAxNl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmWzFdID0gaGV4W2MgJSAxNl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFN0cmNhc2VjbXAoJmNvbnRlbnRbM10sIHJlZikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyIHJlZltdID0gIjAwOyI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZbMF0gPSAnMCcgKyBjIC8gMTAgJSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZbMV0gPSAnMCcgKyBjICUgMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFN0ckVxdWFsKCZjb250ZW50WzJdLCByZWYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAgICAgICAgICAgICB4bWxFbnRpdGllc0VycihYTUxfRVJSX0VOVElUWV9QUk9DRVNTSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxBZGRFbnRpdHk6IGludmFsaWQgcmVkZWNsYXJhdGlvbiBvZiBwcmVkZWZpbmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZW50aXR5Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAJICAgIGlmIChkdGQtPmVudGl0aWVzID09IE5VTEwpCiAJCWR0ZC0+ZW50aXRpZXMgPSB4bWxIYXNoQ3JlYXRlRGljdCgwLCBkaWN0KTsKIAkgICAgdGFibGUgPSBkdGQtPmVudGl0aWVzOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9lcnJvci5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9lcnJvci5jCmluZGV4IDg2ZWE0ODcuLmFjMmFhNzMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZXJyb3IuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Vycm9yLmMKQEAgLTczLDYgKzczLDcgQEAKIAogICAgIGlmICh4bWxHZW5lcmljRXJyb3JDb250ZXh0ID09IE5VTEwpCiAJeG1sR2VuZXJpY0Vycm9yQ29udGV4dCA9ICh2b2lkICopIHN0ZGVycjsKKwogI2lmbmRlZiBTVEFSQk9BUkQKICAgICB2YV9zdGFydChhcmdzLCBtc2cpOwogICAgIHZmcHJpbnRmKChGSUxFICopeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgbXNnLCBhcmdzKTsKQEAgLTU2Miw2ICs1NjMsNyBAQAogCSAqIG9mIHRoZSB1c3VhbCAiYmFzZSIgKGRvYy0+VVJMKSBmb3IgdGhlIG5vZGUgKGJ1ZyAxNTI2MjMpLgogCSAqLwogICAgICAgICB4bWxOb2RlUHRyIHByZXYgPSBiYXNlcHRyOworICAgICAgICBjaGFyICpocmVmID0gTlVMTDsKIAlpbnQgaW5jbGNvdW50ID0gMDsKIAl3aGlsZSAocHJldiAhPSBOVUxMKSB7CiAJICAgIGlmIChwcmV2LT5wcmV2ID09IE5VTEwpCkBAIC01NjksMjEgKzU3MSwyMCBAQAogCSAgICBlbHNlIHsKIAkgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2OwogCQlpZiAocHJldi0+dHlwZSA9PSBYTUxfWElOQ0xVREVfU1RBUlQpIHsKLQkJICAgIGlmICgtLWluY2xjb3VudCA8IDApCi0JCSAgICAgICAgYnJlYWs7CisJCSAgICBpZiAoaW5jbGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1pbmNsY291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gKGNoYXIgKikgeG1sR2V0UHJvcChwcmV2LCBCQURfQ0FTVCAiaHJlZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYgIT0gTlVMTCkKKwkJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KIAkJfSBlbHNlIGlmIChwcmV2LT50eXBlID09IFhNTF9YSU5DTFVERV9FTkQpCiAJCSAgICBpbmNsY291bnQrKzsKIAkgICAgfQogCX0KLQlpZiAocHJldiAhPSBOVUxMKSB7Ci0JICAgIGlmIChwcmV2LT50eXBlID09IFhNTF9YSU5DTFVERV9TVEFSVCkgewotCQlwcmV2LT50eXBlID0gWE1MX0VMRU1FTlRfTk9ERTsKLQkJdG8tPmZpbGUgPSAoY2hhciAqKSB4bWxHZXRQcm9wKHByZXYsIEJBRF9DQVNUICJocmVmIik7Ci0JCXByZXYtPnR5cGUgPSBYTUxfWElOQ0xVREVfU1RBUlQ7Ci0JICAgIH0gZWxzZSB7Ci0JCXRvLT5maWxlID0gKGNoYXIgKikgeG1sR2V0UHJvcChwcmV2LCBCQURfQ0FTVCAiaHJlZiIpOwotCSAgICB9Ci0JfSBlbHNlCisgICAgICAgIGlmIChocmVmICE9IE5VTEwpCisgICAgICAgICAgICB0by0+ZmlsZSA9IGhyZWY7CisJZWxzZQogI2VuZGlmCiAJICAgIHRvLT5maWxlID0gKGNoYXIgKikgeG1sU3RyZHVwKGJhc2VwdHItPmRvYy0+VVJMKTsKIAlpZiAoKHRvLT5maWxlID09IE5VTEwpICYmIChub2RlICE9IE5VTEwpICYmIChub2RlLT5kb2MgIT0gTlVMTCkpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9NYWtlZmlsZS5hbSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQ4NzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTQwIEBACitBVVRPTUFLRV9PUFRJT05TID0gLVduby1zeW50YXgKK0VYVFJBX1BST0dSQU1TID0gZ2VuU2VlZCBodG1sIHJlZ2V4cCBzY2hlbWEgdXJpIHhtbCB4cGF0aAorY2hlY2tfUFJPR1JBTVMgPSB0ZXN0RnV6emVyCitFWFRSQV9ESVNUID0gaHRtbC5kaWN0IHJlZ2V4cC5kaWN0IHNjaGVtYS5kaWN0IHhtbC5kaWN0IHhwYXRoLmRpY3QgXAorCSAgICAgc2VlZC91cmkgc2VlZC9yZWdleHAgZnV6ei5oCitDTEVBTkZJTEVTID0gJChFWFRSQV9QUk9HUkFNUykKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9saWJ4bWwyLmxhCitMREFERCA9ICQoU1RBVElDX0JJTkFSSUVTKSAkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYSAkKFRIUkVBRF9MSUJTKSAkKFpfTElCUykgJChMWk1BX0xJQlMpICQoSUNPTlZfTElCUykgJChNX0xJQlMpICQoV0lOMzJfRVhUUkFfTElCQUREKQorCitYTUxfTUFYX0xFTiA9IDgwMDAwCisjIFNpbmdsZSBxdW90ZXMgdG8gYXZvaWQgd2lsZGNhcmQgZXhwYW5zaW9uIGJ5IHRoZSBzaGVsbAorWE1MX1NFRURfQ09SUFVTX1NSQyA9IFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0LyonIFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0L2Vycm9ycy8qLnhtbCcgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvZXJyb3JzMTAvKi54bWwnIFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0L25hbWVzcGFjZXMvKicgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvdmFsaWQvKi54bWwnIFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0L1ZDLyonIFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0L1ZDTS8qJyBcCisgICAgJyQodG9wX3NyY2RpcikvdGVzdC9YSW5jbHVkZS9kb2NzLyonIFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0L3htbGlkLyonCisKK3Rlc3RGdXp6ZXJfU09VUkNFUyA9IHRlc3RGdXp6ZXIuYyBmdXp6LmMKKworLlBIT05ZOiB0ZXN0cyBjb3JwdXMgY2xlYW4tY29ycHVzCisKK2NvcnB1czogc2VlZC9odG1sLnN0YW1wIHNlZWQvc2NoZW1hLnN0YW1wIHNlZWQveG1sLnN0YW1wIHNlZWQveHBhdGguc3RhbXAKKwordGVzdHM6IHRlc3RGdXp6ZXIkKEVYRUVYVCkgY29ycHVzCisJQGVjaG8gIiMjIFJ1bm5pbmcgZnV6emVyIHRlc3RzIgorCUAuL3Rlc3RGdXp6ZXIkKEVYRUVYVCkKKworY2xlYW4tY29ycHVzOgorCXJtIC1yZiBzZWVkL2h0bWwuc3RhbXAgc2VlZC9odG1sCisJcm0gLXJmIHNlZWQvc2NoZW1hLnN0YW1wIHNlZWQvc2NoZW1hCisJcm0gLXJmIHNlZWQveG1sLnN0YW1wIHNlZWQveG1sCisJcm0gLXJmIHNlZWQveHBhdGguc3RhbXAgc2VlZC94cGF0aAorCisjIFNlZWQgY29ycHVzCisKK2dlblNlZWRfU09VUkNFUyA9IGdlblNlZWQuYyBmdXp6LmMKKworIyBYTUwgZnV6emVyCisKK3NlZWQveG1sLnN0YW1wOiBnZW5TZWVkJChFWEVFWFQpCisJQG1rZGlyIC1wIHNlZWQveG1sCisJQC4vZ2VuU2VlZCQoRVhFRVhUKSB4bWwgJChYTUxfU0VFRF9DT1JQVVNfU1JDKQorCUB0b3VjaCBzZWVkL3htbC5zdGFtcAorCit4bWxfU09VUkNFUyA9IHhtbC5jIGZ1enouYworeG1sX0xERkxBR1MgPSAtZnNhbml0aXplPWZ1enplcgorCitmdXp6LXhtbDogeG1sJChFWEVFWFQpIHNlZWQveG1sLnN0YW1wCisJQG1rZGlyIC1wIGNvcnB1cy94bWwKKwkuL3htbCQoRVhFRVhUKSBcCisJICAgIC1kaWN0PXhtbC5kaWN0IFwKKwkgICAgLW1heF9sZW49JChYTUxfTUFYX0xFTikgXAorCSAgICAtdGltZW91dD0yMCBcCisJICAgIGNvcnB1cy94bWwgc2VlZC94bWwKKworIyBIVE1MIGZ1enplcgorCitzZWVkL2h0bWwuc3RhbXA6IGdlblNlZWQkKEVYRUVYVCkKKwlAbWtkaXIgLXAgc2VlZC9odG1sCisJQC4vZ2VuU2VlZCQoRVhFRVhUKSBodG1sICckKHRvcF9zcmNkaXIpL3Rlc3QvSFRNTC8qJworCUB0b3VjaCBzZWVkL2h0bWwuc3RhbXAKKworaHRtbF9TT1VSQ0VTID0gaHRtbC5jIGZ1enouYworaHRtbF9MREZMQUdTID0gLWZzYW5pdGl6ZT1mdXp6ZXIKKworZnV6ei1odG1sOiBodG1sJChFWEVFWFQpIHNlZWQvaHRtbC5zdGFtcAorCUBta2RpciAtcCBjb3JwdXMvaHRtbAorCS4vaHRtbCQoRVhFRVhUKSBcCisJICAgIC1kaWN0PWh0bWwuZGljdCBcCisJICAgIC1tYXhfbGVuPTEwMDAwMDAgXAorCSAgICAtdGltZW91dD0xMCBcCisJICAgIGNvcnB1cy9odG1sIHNlZWQvaHRtbAorCisjIFJlZ2V4cCBmdXp6ZXIKKworcmVnZXhwX1NPVVJDRVMgPSByZWdleHAuYyBmdXp6LmMKK3JlZ2V4cF9MREZMQUdTID0gLWZzYW5pdGl6ZT1mdXp6ZXIKKworZnV6ei1yZWdleHA6IHJlZ2V4cCQoRVhFRVhUKQorCUBta2RpciAtcCBjb3JwdXMvcmVnZXhwCisJLi9yZWdleHAkKEVYRUVYVCkgXAorCSAgICAtZGljdD1yZWdleHAuZGljdCBcCisJICAgIC1tYXhfbGVuPTIwMCBcCisJICAgIC10aW1lb3V0PTUgXAorCSAgICBjb3JwdXMvcmVnZXhwICQoc3JjZGlyKS9zZWVkL3JlZ2V4cAorCisjIFVSSSBmdXp6ZXIKKwordXJpX1NPVVJDRVMgPSB1cmkuYyBmdXp6LmMKK3VyaV9MREZMQUdTID0gLWZzYW5pdGl6ZT1mdXp6ZXIKKworZnV6ei11cmk6IHVyaSQoRVhFRVhUKQorCUBta2RpciAtcCBjb3JwdXMvdXJpCisJLi91cmkkKEVYRUVYVCkgXAorCSAgICAtbWF4X2xlbj0xMDAwMCBcCisJICAgIC10aW1lb3V0PTIgXAorCSAgICBjb3JwdXMvdXJpICQoc3JjZGlyKS9zZWVkL3VyaQorCisjIFhNTCBTY2hlbWEgZnV6emVyCisKK3NlZWQvc2NoZW1hLnN0YW1wOiBnZW5TZWVkJChFWEVFWFQpCisJQG1rZGlyIC1wIHNlZWQvc2NoZW1hCisJQC4vZ2VuU2VlZCQoRVhFRVhUKSBzY2hlbWEgJyQodG9wX3NyY2RpcikvdGVzdC9zY2hlbWFzLyoueHNkJworCUB0b3VjaCBzZWVkL3NjaGVtYS5zdGFtcAorCitzY2hlbWFfU09VUkNFUyA9IHNjaGVtYS5jIGZ1enouYworc2NoZW1hX0xERkxBR1MgPSAtZnNhbml0aXplPWZ1enplcgorCitmdXp6LXNjaGVtYTogc2NoZW1hJChFWEVFWFQpIHNlZWQvc2NoZW1hLnN0YW1wCisJQG1rZGlyIC1wIGNvcnB1cy9zY2hlbWEKKwkuL3NjaGVtYSQoRVhFRVhUKSBcCisJICAgIC1kaWN0PXNjaGVtYS5kaWN0IFwKKwkgICAgLW1heF9sZW49JChYTUxfTUFYX0xFTikgXAorCSAgICAtdGltZW91dD0yMCBcCisJICAgIGNvcnB1cy9zY2hlbWEgc2VlZC9zY2hlbWEKKworIyBYUGF0aCBmdXp6ZXIKKworc2VlZC94cGF0aC5zdGFtcDogZ2VuU2VlZCQoRVhFRVhUKQorCUBta2RpciAtcCBzZWVkL3hwYXRoCisJQC4vZ2VuU2VlZCQoRVhFRVhUKSB4cGF0aCAiJCh0b3BfYnVpbGRkaXIpL3Rlc3QvWFBhdGgiCisJQHRvdWNoIHNlZWQveHBhdGguc3RhbXAKKworeHBhdGhfU09VUkNFUyA9IHhwYXRoLmMgZnV6ei5jCit4cGF0aF9MREZMQUdTID0gLWZzYW5pdGl6ZT1mdXp6ZXIKKworZnV6ei14cGF0aDogeHBhdGgkKEVYRUVYVCkgc2VlZC94cGF0aC5zdGFtcAorCUBta2RpciAtcCBjb3JwdXMveHBhdGgKKwkuL3hwYXRoJChFWEVFWFQpIFwKKwkgICAgLWRpY3Q9eHBhdGguZGljdCBcCisJICAgIC1tYXhfbGVuPTEwMDAwIFwKKwkgICAgLXRpbWVvdXQ9MjAgXAorCSAgICBjb3JwdXMveHBhdGggc2VlZC94cGF0aAorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovTWFrZWZpbGUuaW4gYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMWVkYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk3MyBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xNi4zIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LTIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKK1ZQQVRIID0gQHNyY2RpckAKK2FtX19pc19nbnVfbWFrZSA9IHsgXAorICBpZiB0ZXN0IC16ICckKE1BS0VMRVZFTCknOyB0aGVuIFwKKyAgICBmYWxzZTsgXAorICBlbGlmIHRlc3QgLW4gJyQoTUFLRV9IT1NUKSc7IHRoZW4gXAorICAgIHRydWU7IFwKKyAgZWxpZiB0ZXN0IC1uICckKE1BS0VfVkVSU0lPTiknICYmIHRlc3QgLW4gJyQoQ1VSRElSKSc7IHRoZW4gXAorICAgIHRydWU7IFwKKyAgZWxzZSBcCisgICAgZmFsc2U7IFwKKyAgZmk7IFwKK30KK2FtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24gPSBcCisgIGNhc2UgJCR7dGFyZ2V0X29wdGlvbi19IGluIFwKKyAgICAgID8pIDs7IFwKKyAgICAgICopIGVjaG8gImFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb246IGludGVybmFsIGVycm9yOiBpbnZhbGlkIiBcCisgICAgICAgICAgICAgICJ0YXJnZXQgb3B0aW9uICckJHt0YXJnZXRfb3B0aW9uLX0nIHNwZWNpZmllZCIgPiYyOyBcCisgICAgICAgICBleGl0IDE7OyBcCisgIGVzYWM7IFwKKyAgaGFzX29wdD1ubzsgXAorICBzYW5lX21ha2VmbGFncz0kJE1BS0VGTEFHUzsgXAorICBpZiAkKGFtX19pc19nbnVfbWFrZSk7IHRoZW4gXAorICAgIHNhbmVfbWFrZWZsYWdzPSQkTUZMQUdTOyBcCisgIGVsc2UgXAorICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAorICAgICAgKlxcW1wgXAldKikgXAorICAgICAgICBicz1cXDsgXAorICAgICAgICBzYW5lX21ha2VmbGFncz1gcHJpbnRmICclc1xuJyAiJCRNQUtFRkxBR1MiIFwKKyAgICAgICAgICB8IHNlZCAicy8kJGJzJCRic1skJGJzICQkYnMJXSovL2ciYDs7IFwKKyAgICBlc2FjOyBcCisgIGZpOyBcCisgIHNraXBfbmV4dD1ubzsgXAorICBzdHJpcF90cmFpbG9wdCAoKSBcCisgIHsgXAorICAgIGZsZz1gcHJpbnRmICclc1xuJyAiJCRmbGciIHwgc2VkICJzLyQkMS4qJCQvLyJgOyBcCisgIH07IFwKKyAgZm9yIGZsZyBpbiAkJHNhbmVfbWFrZWZsYWdzOyBkbyBcCisgICAgdGVzdCAkJHNraXBfbmV4dCA9IHllcyAmJiB7IHNraXBfbmV4dD1ubzsgY29udGludWU7IH07IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICo9KnwtLSopIGNvbnRpbnVlOzsgXAorICAgICAgICAtKkkpIHN0cmlwX3RyYWlsb3B0ICdJJzsgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC0qST8qKSBzdHJpcF90cmFpbG9wdCAnSSc7OyBcCisgICAgICAgIC0qTykgc3RyaXBfdHJhaWxvcHQgJ08nOyBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLSpPPyopIHN0cmlwX3RyYWlsb3B0ICdPJzs7IFwKKyAgICAgICAgLSpsKSBzdHJpcF90cmFpbG9wdCAnbCc7IHNraXBfbmV4dD15ZXM7OyBcCisgICAgICAtKmw/Kikgc3RyaXBfdHJhaWxvcHQgJ2wnOzsgXAorICAgICAgLVtkRURtXSkgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC1bSlRdKSBza2lwX25leHQ9eWVzOzsgXAorICAgIGVzYWM7IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICokJHRhcmdldF9vcHRpb24qKSBoYXNfb3B0PXllczsgYnJlYWs7OyBcCisgICAgZXNhYzsgXAorICBkb25lOyBcCisgIHRlc3QgJCRoYXNfb3B0ID0geWVzCithbV9fbWFrZV9kcnlydW4gPSAodGFyZ2V0X29wdGlvbj1uOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQorYW1fX21ha2Vfa2VlcGdvaW5nID0gKHRhcmdldF9vcHRpb249azsgJChhbV9fbWFrZV9ydW5uaW5nX3dpdGhfb3B0aW9uKSkKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0VYVFJBX1BST0dSQU1TID0gZ2VuU2VlZCQoRVhFRVhUKSBodG1sJChFWEVFWFQpIHJlZ2V4cCQoRVhFRVhUKSBcCisJc2NoZW1hJChFWEVFWFQpIHVyaSQoRVhFRVhUKSB4bWwkKEVYRUVYVCkgeHBhdGgkKEVYRUVYVCkKK2NoZWNrX1BST0dSQU1TID0gdGVzdEZ1enplciQoRVhFRVhUKQorc3ViZGlyID0gZnV6egorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCAkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKGFtX19ESVNUX0NPTU1PTikKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX2dlblNlZWRfT0JKRUNUUyA9IGdlblNlZWQuJChPQkpFWFQpIGZ1enouJChPQkpFWFQpCitnZW5TZWVkX09CSkVDVFMgPSAkKGFtX2dlblNlZWRfT0JKRUNUUykKK2dlblNlZWRfTERBREQgPSAkKExEQUREKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK2dlblNlZWRfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwkkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKQorQU1fVl9sdCA9ICQoYW1fX3ZfbHRfQEFNX1ZAKQorYW1fX3ZfbHRfID0gJChhbV9fdl9sdF9AQU1fREVGQVVMVF9WQCkKK2FtX192X2x0XzAgPSAtLXNpbGVudAorYW1fX3ZfbHRfMSA9IAorYW1faHRtbF9PQkpFQ1RTID0gaHRtbC4kKE9CSkVYVCkgZnV6ei4kKE9CSkVYVCkKK2h0bWxfT0JKRUNUUyA9ICQoYW1faHRtbF9PQkpFQ1RTKQoraHRtbF9MREFERCA9ICQoTERBREQpCitodG1sX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKQoraHRtbF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChodG1sX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2FtX3JlZ2V4cF9PQkpFQ1RTID0gcmVnZXhwLiQoT0JKRVhUKSBmdXp6LiQoT0JKRVhUKQorcmVnZXhwX09CSkVDVFMgPSAkKGFtX3JlZ2V4cF9PQkpFQ1RTKQorcmVnZXhwX0xEQUREID0gJChMREFERCkKK3JlZ2V4cF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgJCh0b3BfYnVpbGRkaXIpL2xpYnhtbDIubGEgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3JlZ2V4cF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChyZWdleHBfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fc2NoZW1hX09CSkVDVFMgPSBzY2hlbWEuJChPQkpFWFQpIGZ1enouJChPQkpFWFQpCitzY2hlbWFfT0JKRUNUUyA9ICQoYW1fc2NoZW1hX09CSkVDVFMpCitzY2hlbWFfTERBREQgPSAkKExEQUREKQorc2NoZW1hX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKQorc2NoZW1hX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKHNjaGVtYV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV90ZXN0RnV6emVyX09CSkVDVFMgPSB0ZXN0RnV6emVyLiQoT0JKRVhUKSBmdXp6LiQoT0JKRVhUKQordGVzdEZ1enplcl9PQkpFQ1RTID0gJChhbV90ZXN0RnV6emVyX09CSkVDVFMpCit0ZXN0RnV6emVyX0xEQUREID0gJChMREFERCkKK3Rlc3RGdXp6ZXJfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwkkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKQorYW1fdXJpX09CSkVDVFMgPSB1cmkuJChPQkpFWFQpIGZ1enouJChPQkpFWFQpCit1cmlfT0JKRUNUUyA9ICQoYW1fdXJpX09CSkVDVFMpCit1cmlfTERBREQgPSAkKExEQUREKQordXJpX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKQordXJpX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKHVyaV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV94bWxfT0JKRUNUUyA9IHhtbC4kKE9CSkVYVCkgZnV6ei4kKE9CSkVYVCkKK3htbF9PQkpFQ1RTID0gJChhbV94bWxfT0JKRUNUUykKK3htbF9MREFERCA9ICQoTERBREQpCit4bWxfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpICQodG9wX2J1aWxkZGlyKS9saWJ4bWwyLmxhIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkgJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkgJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkgJChhbV9fREVQRU5ERU5DSUVTXzEpCit4bWxfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoeG1sX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2FtX3hwYXRoX09CSkVDVFMgPSB4cGF0aC4kKE9CSkVYVCkgZnV6ei4kKE9CSkVYVCkKK3hwYXRoX09CSkVDVFMgPSAkKGFtX3hwYXRoX09CSkVDVFMpCit4cGF0aF9MREFERCA9ICQoTERBREQpCit4cGF0aF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgJCh0b3BfYnVpbGRkaXIpL2xpYnhtbDIubGEgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3hwYXRoX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKHhwYXRoX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0FNX1ZfUCA9ICQoYW1fX3ZfUF9AQU1fVkApCithbV9fdl9QXyA9ICQoYW1fX3ZfUF9AQU1fREVGQVVMVF9WQCkKK2FtX192X1BfMCA9IGZhbHNlCithbV9fdl9QXzEgPSA6CitBTV9WX0dFTiA9ICQoYW1fX3ZfR0VOX0BBTV9WQCkKK2FtX192X0dFTl8gPSAkKGFtX192X0dFTl9AQU1fREVGQVVMVF9WQCkKK2FtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgICAiICRAOworYW1fX3ZfR0VOXzEgPSAKK0FNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKK2FtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCithbV9fdl9hdF8wID0gQAorYW1fX3ZfYXRfMSA9IAorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19tYXliZV9yZW1ha2VfZGVwZmlsZXMgPSBkZXBmaWxlcworYW1fX2RlcGZpbGVzX3JlbWFkZSA9IC4vJChERVBESVIpL2Z1enouUG8gLi8kKERFUERJUikvZ2VuU2VlZC5QbyBcCisJLi8kKERFUERJUikvaHRtbC5QbyAuLyQoREVQRElSKS9yZWdleHAuUG8gXAorCS4vJChERVBESVIpL3NjaGVtYS5QbyAuLyQoREVQRElSKS90ZXN0RnV6emVyLlBvIFwKKwkuLyQoREVQRElSKS91cmkuUG8gLi8kKERFUERJUikveG1sLlBvIC4vJChERVBESVIpL3hwYXRoLlBvCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0FNX1ZfQ0MgPSAkKGFtX192X0NDX0BBTV9WQCkKK2FtX192X0NDXyA9ICQoYW1fX3ZfQ0NfQEFNX0RFRkFVTFRfVkApCithbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgICAiICRAOworYW1fX3ZfQ0NfMSA9IAorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitBTV9WX0NDTEQgPSAkKGFtX192X0NDTERfQEFNX1ZAKQorYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfQEFNX0RFRkFVTFRfVkApCithbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAgICIgJEA7CithbV9fdl9DQ0xEXzEgPSAKK1NPVVJDRVMgPSAkKGdlblNlZWRfU09VUkNFUykgJChodG1sX1NPVVJDRVMpICQocmVnZXhwX1NPVVJDRVMpIFwKKwkkKHNjaGVtYV9TT1VSQ0VTKSAkKHRlc3RGdXp6ZXJfU09VUkNFUykgJCh1cmlfU09VUkNFUykgXAorCSQoeG1sX1NPVVJDRVMpICQoeHBhdGhfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQoZ2VuU2VlZF9TT1VSQ0VTKSAkKGh0bWxfU09VUkNFUykgJChyZWdleHBfU09VUkNFUykgXAorCSQoc2NoZW1hX1NPVVJDRVMpICQodGVzdEZ1enplcl9TT1VSQ0VTKSAkKHVyaV9TT1VSQ0VTKSBcCisJJCh4bWxfU09VUkNFUykgJCh4cGF0aF9TT1VSQ0VTKQorYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCisgIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAorICAgIG58bm98Tk8pIGZhbHNlOzsgXAorICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCisgIGVzYWMKK2FtX190YWdnZWRfZmlsZXMgPSAkKEhFQURFUlMpICQoU09VUkNFUykgJChUQUdTX0ZJTEVTKSAkKExJU1ApCisjIFJlYWQgYSBsaXN0IG9mIG5ld2xpbmUtc2VwYXJhdGVkIHN0cmluZ3MgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsCisjIGFuZCBwcmludCBlYWNoIG9mIHRoZW0gb25jZSwgd2l0aG91dCBkdXBsaWNhdGVzLiAgSW5wdXQgb3JkZXIgaXMKKyMgKm5vdCogcHJlc2VydmVkLgorYW1fX3VuaXF1aWZ5X2lucHV0ID0gJChBV0spICdcCisgIEJFR0lOIHsgbm9uZW1wdHkgPSAwOyB9IFwKKyAgeyBpdGVtc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKyAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBpdGVtcykgcHJpbnQgaTsgfTsgfSBcCisnCisjIE1ha2Ugc3VyZSB0aGUgbGlzdCBvZiBzb3VyY2VzIGlzIHVuaXF1ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UsCisjIGUuZy4sIHRoZSBzYW1lIHNvdXJjZSBmaWxlIG1pZ2h0IGJlIHNoYXJlZCBhbW9uZyBfU09VUkNFUyB2YXJpYWJsZXMKKyMgZm9yIGRpZmZlcmVudCBwcm9ncmFtcy9saWJyYXJpZXMuCithbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzID0gXAorICBsaXN0PSckKGFtX190YWdnZWRfZmlsZXMpJzsgXAorICB1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorICBkb25lIHwgJChhbV9fdW5pcXVpZnlfaW5wdXQpYAorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworYW1fX0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX3NyY2RpcikvZGVwY29tcCBSRUFETUUKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JBU0VfVEhSRUFEX0xJQlMgPSBAQkFTRV9USFJFQURfTElCU0AKK0MxNE5fT0JKID0gQEMxNE5fT0JKQAorQ0FUQUxPR19PQkogPSBAQ0FUQUxPR19PQkpACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0NZR1dJTl9FWFRSQV9MREZMQUdTID0gQENZR1dJTl9FWFRSQV9MREZMQUdTQAorQ1lHV0lOX0VYVFJBX1BZVEhPTl9MSUJBREQgPSBAQ1lHV0lOX0VYVFJBX1BZVEhPTl9MSUJBRERACitERUJVR19PQkogPSBAREVCVUdfT0JKQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RPQ0JfT0JKID0gQERPQ0JfT0JKQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitFWFRSQV9DRkxBR1MgPSBARVhUUkFfQ0ZMQUdTQAorRkdSRVAgPSBARkdSRVBACitGVFBfT0JKID0gQEZUUF9PQkpACitHUkVQID0gQEdSRVBACitIQVZFX0lTSU5GID0gQEhBVkVfSVNJTkZACitIQVZFX0lTTkFOID0gQEhBVkVfSVNOQU5ACitIVE1MX0RJUiA9IEBIVE1MX0RJUkAKK0hUTUxfT0JKID0gQEhUTUxfT0JKQAorSFRUUF9PQkogPSBASFRUUF9PQkpACitJQ09OVl9MSUJTID0gQElDT05WX0xJQlNACitJQ1VfQ0ZMQUdTID0gQElDVV9DRkxBR1NACitJQ1VfTElCUyA9IEBJQ1VfTElCU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJYTUxfTUFKT1JfVkVSU0lPTiA9IEBMSUJYTUxfTUFKT1JfVkVSU0lPTkAKK0xJQlhNTF9NSUNST19WRVJTSU9OID0gQExJQlhNTF9NSUNST19WRVJTSU9OQAorTElCWE1MX01JTk9SX1ZFUlNJT04gPSBATElCWE1MX01JTk9SX1ZFUlNJT05ACitMSUJYTUxfVkVSU0lPTiA9IEBMSUJYTUxfVkVSU0lPTkAKK0xJQlhNTF9WRVJTSU9OX0VYVFJBID0gQExJQlhNTF9WRVJTSU9OX0VYVFJBQAorTElCWE1MX1ZFUlNJT05fSU5GTyA9IEBMSUJYTUxfVkVSU0lPTl9JTkZPQAorTElCWE1MX1ZFUlNJT05fTlVNQkVSID0gQExJQlhNTF9WRVJTSU9OX05VTUJFUkAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitMVF9TWVNfTElCUkFSWV9QQVRIID0gQExUX1NZU19MSUJSQVJZX1BBVEhACitMWk1BX0NGTEFHUyA9IEBMWk1BX0NGTEFHU0AKK0xaTUFfTElCUyA9IEBMWk1BX0xJQlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOSUZFU1RfVE9PTCA9IEBNQU5JRkVTVF9UT09MQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTU9EVUxFX0VYVEVOU0lPTiA9IEBNT0RVTEVfRVhURU5TSU9OQAorTU9EVUxFX1BMQVRGT1JNX0xJQlMgPSBATU9EVUxFX1BMQVRGT1JNX0xJQlNACitNViA9IEBNVkAKK01fTElCUyA9IEBNX0xJQlNACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BFUkwgPSBAUEVSTEAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1BLR19DT05GSUdfTElCRElSID0gQFBLR19DT05GSUdfTElCRElSQAorUEtHX0NPTkZJR19QQVRIID0gQFBLR19DT05GSUdfUEFUSEAKK1BZVEhPTiA9IEBQWVRIT05ACitQWVRIT05fSU5DTFVERVMgPSBAUFlUSE9OX0lOQ0xVREVTQAorUFlUSE9OX0xJQlMgPSBAUFlUSE9OX0xJQlNACitQWVRIT05fU0lURV9QQUNLQUdFUyA9IEBQWVRIT05fU0lURV9QQUNLQUdFU0AKK1BZVEhPTl9TVUJESVIgPSBAUFlUSE9OX1NVQkRJUkAKK1BZVEhPTl9URVNUUyA9IEBQWVRIT05fVEVTVFNACitQWVRIT05fVkVSU0lPTiA9IEBQWVRIT05fVkVSU0lPTkAKK1JBTkxJQiA9IEBSQU5MSUJACitSRExfTElCUyA9IEBSRExfTElCU0AKK1JFQURFUl9URVNUID0gQFJFQURFUl9URVNUQAorUkVMREFURSA9IEBSRUxEQVRFQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVEFUSUNfQklOQVJJRVMgPSBAU1RBVElDX0JJTkFSSUVTQAorU1RSSVAgPSBAU1RSSVBACitUQVIgPSBAVEFSQAorVEVTVF9DMTROID0gQFRFU1RfQzE0TkAKK1RFU1RfQ0FUQUxPRyA9IEBURVNUX0NBVEFMT0dACitURVNUX0RFQlVHID0gQFRFU1RfREVCVUdACitURVNUX0hUTUwgPSBAVEVTVF9IVE1MQAorVEVTVF9NT0RVTEVTID0gQFRFU1RfTU9EVUxFU0AKK1RFU1RfUEFUVEVSTiA9IEBURVNUX1BBVFRFUk5ACitURVNUX1BIVE1MID0gQFRFU1RfUEhUTUxACitURVNUX1BVU0ggPSBAVEVTVF9QVVNIQAorVEVTVF9SRUdFWFBTID0gQFRFU1RfUkVHRVhQU0AKK1RFU1RfU0FYID0gQFRFU1RfU0FYQAorVEVTVF9TQ0hFTUFTID0gQFRFU1RfU0NIRU1BU0AKK1RFU1RfU0NIRU1BVFJPTiA9IEBURVNUX1NDSEVNQVRST05ACitURVNUX1RIUkVBRFMgPSBAVEVTVF9USFJFQURTQAorVEVTVF9WQUxJRCA9IEBURVNUX1ZBTElEQAorVEVTVF9WVElNRSA9IEBURVNUX1ZUSU1FQAorVEVTVF9YSU5DTFVERSA9IEBURVNUX1hJTkNMVURFQAorVEVTVF9YUEFUSCA9IEBURVNUX1hQQVRIQAorVEVTVF9YUFRSID0gQFRFU1RfWFBUUkAKK1RIUkVBRF9DRkxBR1MgPSBAVEhSRUFEX0NGTEFHU0AKK1RIUkVBRF9MSUJTID0gQFRIUkVBRF9MSUJTQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorVkVSU0lPTl9TQ1JJUFRfRkxBR1MgPSBAVkVSU0lPTl9TQ1JJUFRfRkxBR1NACitXR0VUID0gQFdHRVRACitXSU4zMl9FWFRSQV9MREZMQUdTID0gQFdJTjMyX0VYVFJBX0xERkxBR1NACitXSU4zMl9FWFRSQV9MSUJBREQgPSBAV0lOMzJfRVhUUkFfTElCQUREQAorV0lOMzJfRVhUUkFfUFlUSE9OX0xJQkFERCA9IEBXSU4zMl9FWFRSQV9QWVRIT05fTElCQUREQAorV0lUSF9DMTROID0gQFdJVEhfQzE0TkAKK1dJVEhfQ0FUQUxPRyA9IEBXSVRIX0NBVEFMT0dACitXSVRIX0RFQlVHID0gQFdJVEhfREVCVUdACitXSVRIX0RPQ0IgPSBAV0lUSF9ET0NCQAorV0lUSF9GVFAgPSBAV0lUSF9GVFBACitXSVRIX0hUTUwgPSBAV0lUSF9IVE1MQAorV0lUSF9IVFRQID0gQFdJVEhfSFRUUEAKK1dJVEhfSUNPTlYgPSBAV0lUSF9JQ09OVkAKK1dJVEhfSUNVID0gQFdJVEhfSUNVQAorV0lUSF9JU084ODU5WCA9IEBXSVRIX0lTTzg4NTlYQAorV0lUSF9MRUdBQ1kgPSBAV0lUSF9MRUdBQ1lACitXSVRIX0xaTUEgPSBAV0lUSF9MWk1BQAorV0lUSF9NRU1fREVCVUcgPSBAV0lUSF9NRU1fREVCVUdACitXSVRIX01PRFVMRVMgPSBAV0lUSF9NT0RVTEVTQAorV0lUSF9PVVRQVVQgPSBAV0lUSF9PVVRQVVRACitXSVRIX1BBVFRFUk4gPSBAV0lUSF9QQVRURVJOQAorV0lUSF9QVVNIID0gQFdJVEhfUFVTSEAKK1dJVEhfUkVBREVSID0gQFdJVEhfUkVBREVSQAorV0lUSF9SRUdFWFBTID0gQFdJVEhfUkVHRVhQU0AKK1dJVEhfUlVOX0RFQlVHID0gQFdJVEhfUlVOX0RFQlVHQAorV0lUSF9TQVgxID0gQFdJVEhfU0FYMUAKK1dJVEhfU0NIRU1BUyA9IEBXSVRIX1NDSEVNQVNACitXSVRIX1NDSEVNQVRST04gPSBAV0lUSF9TQ0hFTUFUUk9OQAorV0lUSF9USFJFQURTID0gQFdJVEhfVEhSRUFEU0AKK1dJVEhfVEhSRUFEX0FMTE9DID0gQFdJVEhfVEhSRUFEX0FMTE9DQAorV0lUSF9UUkVFID0gQFdJVEhfVFJFRUAKK1dJVEhfVFJJTyA9IEBXSVRIX1RSSU9ACitXSVRIX1ZBTElEID0gQFdJVEhfVkFMSURACitXSVRIX1dSSVRFUiA9IEBXSVRIX1dSSVRFUkAKK1dJVEhfWElOQ0xVREUgPSBAV0lUSF9YSU5DTFVERUAKK1dJVEhfWFBBVEggPSBAV0lUSF9YUEFUSEAKK1dJVEhfWFBUUiA9IEBXSVRIX1hQVFJACitXSVRIX1pMSUIgPSBAV0lUSF9aTElCQAorWElOQ0xVREVfT0JKID0gQFhJTkNMVURFX09CSkAKK1hNTExJTlQgPSBAWE1MTElOVEAKK1hNTF9DRkxBR1MgPSBAWE1MX0NGTEFHU0AKK1hNTF9JTkNMVURFRElSID0gQFhNTF9JTkNMVURFRElSQAorWE1MX0xJQkRJUiA9IEBYTUxfTElCRElSQAorWE1MX0xJQlMgPSBAWE1MX0xJQlNACitYTUxfTElCVE9PTExJQlMgPSBAWE1MX0xJQlRPT0xMSUJTQAorWE1MX1BSSVZBVEVfTElCUyA9IEBYTUxfUFJJVkFURV9MSUJTQAorWFBBVEhfT0JKID0gQFhQQVRIX09CSkAKK1hQVFJfT0JKID0gQFhQVFJfT0JKQAorWFNMVFBST0MgPSBAWFNMVFBST0NACitaX0NGTEFHUyA9IEBaX0NGTEFHU0AKK1pfTElCUyA9IEBaX0xJQlNACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorcHl0aG9uZGlyID0gQHB5dGhvbmRpckAKK3J1bnN0YXRlZGlyID0gQHJ1bnN0YXRlZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gLVduby1zeW50YXgKK0VYVFJBX0RJU1QgPSBodG1sLmRpY3QgcmVnZXhwLmRpY3Qgc2NoZW1hLmRpY3QgeG1sLmRpY3QgeHBhdGguZGljdCBcCisJICAgICBzZWVkL3VyaSBzZWVkL3JlZ2V4cCBmdXp6LmgKKworQ0xFQU5GSUxFUyA9ICQoRVhUUkFfUFJPR1JBTVMpCitBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitERVBFTkRFTkNJRVMgPSAkKHRvcF9idWlsZGRpcikvbGlieG1sMi5sYQorTERBREQgPSAkKFNUQVRJQ19CSU5BUklFUykgJCh0b3BfYnVpbGRkaXIpL2xpYnhtbDIubGEgJChUSFJFQURfTElCUykgJChaX0xJQlMpICQoTFpNQV9MSUJTKSAkKElDT05WX0xJQlMpICQoTV9MSUJTKSAkKFdJTjMyX0VYVFJBX0xJQkFERCkKK1hNTF9NQVhfTEVOID0gODAwMDAKKyMgU2luZ2xlIHF1b3RlcyB0byBhdm9pZCB3aWxkY2FyZCBleHBhbnNpb24gYnkgdGhlIHNoZWxsCitYTUxfU0VFRF9DT1JQVVNfU1JDID0gXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvKicgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvZXJyb3JzLyoueG1sJyBcCisgICAgJyQodG9wX3NyY2RpcikvdGVzdC9lcnJvcnMxMC8qLnhtbCcgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvbmFtZXNwYWNlcy8qJyBcCisgICAgJyQodG9wX3NyY2RpcikvdGVzdC92YWxpZC8qLnhtbCcgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvVkMvKicgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QvVkNNLyonIFwKKyAgICAnJCh0b3Bfc3JjZGlyKS90ZXN0L1hJbmNsdWRlL2RvY3MvKicgXAorICAgICckKHRvcF9zcmNkaXIpL3Rlc3QveG1saWQvKicKKwordGVzdEZ1enplcl9TT1VSQ0VTID0gdGVzdEZ1enplci5jIGZ1enouYworCisjIFNlZWQgY29ycHVzCitnZW5TZWVkX1NPVVJDRVMgPSBnZW5TZWVkLmMgZnV6ei5jCit4bWxfU09VUkNFUyA9IHhtbC5jIGZ1enouYworeG1sX0xERkxBR1MgPSAtZnNhbml0aXplPWZ1enplcgoraHRtbF9TT1VSQ0VTID0gaHRtbC5jIGZ1enouYworaHRtbF9MREZMQUdTID0gLWZzYW5pdGl6ZT1mdXp6ZXIKKworIyBSZWdleHAgZnV6emVyCityZWdleHBfU09VUkNFUyA9IHJlZ2V4cC5jIGZ1enouYworcmVnZXhwX0xERkxBR1MgPSAtZnNhbml0aXplPWZ1enplcgorCisjIFVSSSBmdXp6ZXIKK3VyaV9TT1VSQ0VTID0gdXJpLmMgZnV6ei5jCit1cmlfTERGTEFHUyA9IC1mc2FuaXRpemU9ZnV6emVyCitzY2hlbWFfU09VUkNFUyA9IHNjaGVtYS5jIGZ1enouYworc2NoZW1hX0xERkxBR1MgPSAtZnNhbml0aXplPWZ1enplcgoreHBhdGhfU09VUkNFUyA9IHhwYXRoLmMgZnV6ei5jCit4cGF0aF9MREZMQUdTID0gLWZzYW5pdGl6ZT1mdXp6ZXIKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBmdXp6L01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiBmdXp6L01ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fbWF5YmVfcmVtYWtlX2RlcGZpbGVzKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fbWF5YmVfcmVtYWtlX2RlcGZpbGVzKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2NsZWFuLWNoZWNrUFJPR1JBTVM6CisJQGxpc3Q9JyQoY2hlY2tfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CisKK2dlblNlZWQkKEVYRUVYVCk6ICQoZ2VuU2VlZF9PQkpFQ1RTKSAkKGdlblNlZWRfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2dlblNlZWRfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZ2VuU2VlZCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoTElOSykgJChnZW5TZWVkX09CSkVDVFMpICQoZ2VuU2VlZF9MREFERCkgJChMSUJTKQorCitodG1sJChFWEVFWFQpOiAkKGh0bWxfT0JKRUNUUykgJChodG1sX0RFUEVOREVOQ0lFUykgJChFWFRSQV9odG1sX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGh0bWwkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGh0bWxfTElOSykgJChodG1sX09CSkVDVFMpICQoaHRtbF9MREFERCkgJChMSUJTKQorCityZWdleHAkKEVYRUVYVCk6ICQocmVnZXhwX09CSkVDVFMpICQocmVnZXhwX0RFUEVOREVOQ0lFUykgJChFWFRSQV9yZWdleHBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcmVnZXhwJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChyZWdleHBfTElOSykgJChyZWdleHBfT0JKRUNUUykgJChyZWdleHBfTERBREQpICQoTElCUykKKworc2NoZW1hJChFWEVFWFQpOiAkKHNjaGVtYV9PQkpFQ1RTKSAkKHNjaGVtYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfc2NoZW1hX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHNjaGVtYSQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoc2NoZW1hX0xJTkspICQoc2NoZW1hX09CSkVDVFMpICQoc2NoZW1hX0xEQUREKSAkKExJQlMpCisKK3Rlc3RGdXp6ZXIkKEVYRUVYVCk6ICQodGVzdEZ1enplcl9PQkpFQ1RTKSAkKHRlc3RGdXp6ZXJfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Rlc3RGdXp6ZXJfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdEZ1enplciQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh0ZXN0RnV6emVyX09CSkVDVFMpICQodGVzdEZ1enplcl9MREFERCkgJChMSUJTKQorCit1cmkkKEVYRUVYVCk6ICQodXJpX09CSkVDVFMpICQodXJpX0RFUEVOREVOQ0lFUykgJChFWFRSQV91cmlfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdXJpJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJCh1cmlfTElOSykgJCh1cmlfT0JKRUNUUykgJCh1cmlfTERBREQpICQoTElCUykKKworeG1sJChFWEVFWFQpOiAkKHhtbF9PQkpFQ1RTKSAkKHhtbF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfeG1sX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHhtbCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoeG1sX0xJTkspICQoeG1sX09CSkVDVFMpICQoeG1sX0xEQUREKSAkKExJQlMpCisKK3hwYXRoJChFWEVFWFQpOiAkKHhwYXRoX09CSkVDVFMpICQoeHBhdGhfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3hwYXRoX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHhwYXRoJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJCh4cGF0aF9MSU5LKSAkKHhwYXRoX09CSkVDVFMpICQoeHBhdGhfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Z1enouUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dlblNlZWQuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2h0bWwuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JlZ2V4cC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2NoZW1hLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0RnV6emVyLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS91cmkuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3htbC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveHBhdGguUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorCiskKGFtX19kZXBmaWxlc19yZW1hZGUpOgorCUAkKE1LRElSX1ApICQoQEQpCisJQGVjaG8gJyMgZHVtbXknID4kQC10ICYmICQoYW1fX212KSAkQC10ICRACisKK2FtLS1kZXBmaWxlczogJChhbV9fZGVwZmlsZXNfcmVtYWRlKQorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAtbyAkQCAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoYW1fX3RhZ2dlZF9maWxlcykKKwkkKGFtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMpOyBta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IHRhZ3MtYW0KK1RBR1M6IHRhZ3MKKwordGFncy1hbTogJChUQUdTX0RFUEVOREVOQ0lFUykgJChhbV9fdGFnZ2VkX2ZpbGVzKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCSQoYW1fX2RlZmluZV91bmlxX3RhZ2dlZF9maWxlcyk7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IGN0YWdzLWFtCisKK0NUQUdTOiBjdGFncworY3RhZ3MtYW06ICQoVEFHU19ERVBFTkRFTkNJRVMpICQoYW1fX3RhZ2dlZF9maWxlcykKKwkkKGFtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMpOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorY3Njb3BlbGlzdDogY3Njb3BlbGlzdC1hbQorCitjc2NvcGVsaXN0LWFtOiAkKGFtX190YWdnZWRfZmlsZXMpCisJbGlzdD0nJChhbV9fdGFnZ2VkX2ZpbGVzKSc7IFwKKwljYXNlICIkKHNyY2RpcikiIGluIFwKKwkgIFtcXC9dKiB8ID86W1xcL10qKSBzZGlyPSIkKHNyY2RpcikiIDs7IFwKKwkgICopIHNkaXI9JChzdWJkaXIpLyQoc3JjZGlyKSA7OyBcCisJZXNhYzsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBcCisJICAgIGVjaG8gIiQoc3ViZGlyKS8kJGkiOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAiJCRzZGlyLyQkaSI7IFwKKwkgIGZpOyBcCisJZG9uZSA+PiAkKHRvcF9idWlsZGRpcikvY3Njb3BlLmZpbGVzCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0ZGlyLWFtCisKK2Rpc3RkaXItYW06ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQoY2hlY2tfUFJPR1JBTVMpCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICAgaW5zdGFsbDsgXAorCWVsc2UgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCisJZmkKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwkJLXJtIC1mIC4vJChERVBESVIpL2Z1enouUG8KKwktcm0gLWYgLi8kKERFUERJUikvZ2VuU2VlZC5QbworCS1ybSAtZiAuLyQoREVQRElSKS9odG1sLlBvCisJLXJtIC1mIC4vJChERVBESVIpL3JlZ2V4cC5QbworCS1ybSAtZiAuLyQoREVQRElSKS9zY2hlbWEuUG8KKwktcm0gLWYgLi8kKERFUERJUikvdGVzdEZ1enplci5QbworCS1ybSAtZiAuLyQoREVQRElSKS91cmkuUG8KKwktcm0gLWYgLi8kKERFUERJUikveG1sLlBvCisJLXJtIC1mIC4vJChERVBESVIpL3hwYXRoLlBvCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJCS1ybSAtZiAuLyQoREVQRElSKS9mdXp6LlBvCisJLXJtIC1mIC4vJChERVBESVIpL2dlblNlZWQuUG8KKwktcm0gLWYgLi8kKERFUERJUikvaHRtbC5QbworCS1ybSAtZiAuLyQoREVQRElSKS9yZWdleHAuUG8KKwktcm0gLWYgLi8kKERFUERJUikvc2NoZW1hLlBvCisJLXJtIC1mIC4vJChERVBESVIpL3Rlc3RGdXp6ZXIuUG8KKwktcm0gLWYgLi8kKERFUERJUikvdXJpLlBvCisJLXJtIC1mIC4vJChERVBESVIpL3htbC5QbworCS1ybSAtZiAuLyQoREVQRElSKS94cGF0aC5QbworCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogY2hlY2stYW0gaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgVEFHUyBhbGwgYWxsLWFtIGFtLS1kZXBmaWxlcyBjaGVjayBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY3Njb3BlbGlzdC1hbSBcCisJY3RhZ3MgY3RhZ3MtYW0gZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCisJaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAorCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB0YWdzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworLlBSRUNJT1VTOiBNYWtlZmlsZQorCisKKy5QSE9OWTogdGVzdHMgY29ycHVzIGNsZWFuLWNvcnB1cworCitjb3JwdXM6IHNlZWQvaHRtbC5zdGFtcCBzZWVkL3NjaGVtYS5zdGFtcCBzZWVkL3htbC5zdGFtcCBzZWVkL3hwYXRoLnN0YW1wCisKK3Rlc3RzOiB0ZXN0RnV6emVyJChFWEVFWFQpIGNvcnB1cworCUBlY2hvICIjIyBSdW5uaW5nIGZ1enplciB0ZXN0cyIKKwlALi90ZXN0RnV6emVyJChFWEVFWFQpCisKK2NsZWFuLWNvcnB1czoKKwlybSAtcmYgc2VlZC9odG1sLnN0YW1wIHNlZWQvaHRtbAorCXJtIC1yZiBzZWVkL3NjaGVtYS5zdGFtcCBzZWVkL3NjaGVtYQorCXJtIC1yZiBzZWVkL3htbC5zdGFtcCBzZWVkL3htbAorCXJtIC1yZiBzZWVkL3hwYXRoLnN0YW1wIHNlZWQveHBhdGgKKworIyBYTUwgZnV6emVyCisKK3NlZWQveG1sLnN0YW1wOiBnZW5TZWVkJChFWEVFWFQpCisJQG1rZGlyIC1wIHNlZWQveG1sCisJQC4vZ2VuU2VlZCQoRVhFRVhUKSB4bWwgJChYTUxfU0VFRF9DT1JQVVNfU1JDKQorCUB0b3VjaCBzZWVkL3htbC5zdGFtcAorCitmdXp6LXhtbDogeG1sJChFWEVFWFQpIHNlZWQveG1sLnN0YW1wCisJQG1rZGlyIC1wIGNvcnB1cy94bWwKKwkuL3htbCQoRVhFRVhUKSBcCisJICAgIC1kaWN0PXhtbC5kaWN0IFwKKwkgICAgLW1heF9sZW49JChYTUxfTUFYX0xFTikgXAorCSAgICAtdGltZW91dD0yMCBcCisJICAgIGNvcnB1cy94bWwgc2VlZC94bWwKKworIyBIVE1MIGZ1enplcgorCitzZWVkL2h0bWwuc3RhbXA6IGdlblNlZWQkKEVYRUVYVCkKKwlAbWtkaXIgLXAgc2VlZC9odG1sCisJQC4vZ2VuU2VlZCQoRVhFRVhUKSBodG1sICckKHRvcF9zcmNkaXIpL3Rlc3QvSFRNTC8qJworCUB0b3VjaCBzZWVkL2h0bWwuc3RhbXAKKworZnV6ei1odG1sOiBodG1sJChFWEVFWFQpIHNlZWQvaHRtbC5zdGFtcAorCUBta2RpciAtcCBjb3JwdXMvaHRtbAorCS4vaHRtbCQoRVhFRVhUKSBcCisJICAgIC1kaWN0PWh0bWwuZGljdCBcCisJICAgIC1tYXhfbGVuPTEwMDAwMDAgXAorCSAgICAtdGltZW91dD0xMCBcCisJICAgIGNvcnB1cy9odG1sIHNlZWQvaHRtbAorCitmdXp6LXJlZ2V4cDogcmVnZXhwJChFWEVFWFQpCisJQG1rZGlyIC1wIGNvcnB1cy9yZWdleHAKKwkuL3JlZ2V4cCQoRVhFRVhUKSBcCisJICAgIC1kaWN0PXJlZ2V4cC5kaWN0IFwKKwkgICAgLW1heF9sZW49MjAwIFwKKwkgICAgLXRpbWVvdXQ9NSBcCisJICAgIGNvcnB1cy9yZWdleHAgJChzcmNkaXIpL3NlZWQvcmVnZXhwCisKK2Z1enotdXJpOiB1cmkkKEVYRUVYVCkKKwlAbWtkaXIgLXAgY29ycHVzL3VyaQorCS4vdXJpJChFWEVFWFQpIFwKKwkgICAgLW1heF9sZW49MTAwMDAgXAorCSAgICAtdGltZW91dD0yIFwKKwkgICAgY29ycHVzL3VyaSAkKHNyY2Rpcikvc2VlZC91cmkKKworIyBYTUwgU2NoZW1hIGZ1enplcgorCitzZWVkL3NjaGVtYS5zdGFtcDogZ2VuU2VlZCQoRVhFRVhUKQorCUBta2RpciAtcCBzZWVkL3NjaGVtYQorCUAuL2dlblNlZWQkKEVYRUVYVCkgc2NoZW1hICckKHRvcF9zcmNkaXIpL3Rlc3Qvc2NoZW1hcy8qLnhzZCcKKwlAdG91Y2ggc2VlZC9zY2hlbWEuc3RhbXAKKworZnV6ei1zY2hlbWE6IHNjaGVtYSQoRVhFRVhUKSBzZWVkL3NjaGVtYS5zdGFtcAorCUBta2RpciAtcCBjb3JwdXMvc2NoZW1hCisJLi9zY2hlbWEkKEVYRUVYVCkgXAorCSAgICAtZGljdD1zY2hlbWEuZGljdCBcCisJICAgIC1tYXhfbGVuPSQoWE1MX01BWF9MRU4pIFwKKwkgICAgLXRpbWVvdXQ9MjAgXAorCSAgICBjb3JwdXMvc2NoZW1hIHNlZWQvc2NoZW1hCisKKyMgWFBhdGggZnV6emVyCisKK3NlZWQveHBhdGguc3RhbXA6IGdlblNlZWQkKEVYRUVYVCkKKwlAbWtkaXIgLXAgc2VlZC94cGF0aAorCUAuL2dlblNlZWQkKEVYRUVYVCkgeHBhdGggIiQodG9wX2J1aWxkZGlyKS90ZXN0L1hQYXRoIgorCUB0b3VjaCBzZWVkL3hwYXRoLnN0YW1wCisKK2Z1enoteHBhdGg6IHhwYXRoJChFWEVFWFQpIHNlZWQveHBhdGguc3RhbXAKKwlAbWtkaXIgLXAgY29ycHVzL3hwYXRoCisJLi94cGF0aCQoRVhFRVhUKSBcCisJICAgIC1kaWN0PXhwYXRoLmRpY3QgXAorCSAgICAtbWF4X2xlbj0xMDAwMCBcCisJICAgIC10aW1lb3V0PTIwIFwKKwkgICAgY29ycHVzL3hwYXRoIHNlZWQveHBhdGgKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L1JFQURNRSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3NWFkOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9SRUFETUUKQEAgLTAsMCArMSwxOSBAQAorbGliRnV6emVyIGluc3RydWN0aW9ucyBmb3IgbGlieG1sMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTZXQgY29tcGlsZXIgYW5kIG9wdGlvbnM6CisKKyAgICBleHBvcnQgQ0M9Y2xhbmcKKyAgICBleHBvcnQgQ0ZMQUdTPSItZyAtZnNhbml0aXplPWZ1enplci1uby1saW5rLGFkZHJlc3MsdW5kZWZpbmVkIFwKKyAgICAgICAgLWZuby1zYW5pdGl6ZS1yZWNvdmVyPWFsbCBcCisgICAgICAgIC1ERlVaWklOR19CVUlMRF9NT0RFX1VOU0FGRV9GT1JfUFJPRFVDVElPTiIKKworQnVpbGQgbGlieG1sMiB3aXRoIGluc3RydW1lbnRhdGlvbjoKKworICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1weXRob24KKyAgICBtYWtlCisKK1J1biBmdXp6ZXJzOgorCisgICAgbWFrZSAtQyBmdXp6IGZ1enoteG1sCisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9mdXp6LmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovZnV6ei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjEzNmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovZnV6ei5jCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogZnV6ei5jOiBDb21tb24gZnVuY3Rpb25zIGZvciBmdXp6aW5nLgorICoKKyAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8bGlieG1sL2hhc2guaD4KKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGlieG1sL3BhcnNlckludGVybmFscy5oPgorI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbElPLmg+CisjaW5jbHVkZSAiZnV6ei5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKK30geG1sRnV6ekVudGl0eUluZm87CisKKy8qIFNpbmdsZSBzdGF0aWMgaW5zdGFuY2UgZm9yIG5vdyAqLworc3RhdGljIHN0cnVjdCB7CisgICAgLyogT3JpZ2luYWwgZGF0YSAqLworICAgIGNvbnN0IGNoYXIgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisKKyAgICAvKiBSZW1haW5pbmcgZGF0YSAqLworICAgIGNvbnN0IGNoYXIgKnB0cjsKKyAgICBzaXplX3QgcmVtYWluaW5nOworCisgICAgLyogQnVmZmVyIGZvciB1bmVzY2FwZWQgc3RyaW5ncyAqLworICAgIGNoYXIgKm91dEJ1ZjsKKyAgICBjaGFyICpvdXRQdHI7IC8qIEZyZWUgc3BhY2UgYXQgZW5kIG9mIGJ1ZmZlciAqLworCisgICAgeG1sSGFzaFRhYmxlUHRyIGVudGl0aWVzOyAvKiBNYXBzIFVSTHMgdG8geG1sRnV6ekVudGl0eUluZm9zICovCisKKyAgICAvKiBUaGUgZmlyc3QgZW50aXR5IGlzIHRoZSBtYWluIGVudGl0eS4gKi8KKyAgICBjb25zdCBjaGFyICptYWluVXJsOworICAgIHhtbEZ1enpFbnRpdHlJbmZvICptYWluRW50aXR5OworfSBmdXp6RGF0YTsKKworLyoqCisgKiB4bWxGdXp6RXJyb3JGdW5jOgorICoKKyAqIEFuIGVycm9yIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGRpc2NhcmRzIGFsbCBlcnJvcnMuCisgKi8KK3ZvaWQKK3htbEZ1enpFcnJvckZ1bmModm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKm1zZyBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAuLi4pIHsKK30KKworLyoqCisgKiB4bWxGdXp6RGF0YUluaXQ6CisgKgorICogSW5pdGlhbGl6ZSBmdXp6IGRhdGEgcHJvdmlkZXIuCisgKi8KK3ZvaWQKK3htbEZ1enpEYXRhSW5pdChjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGZ1enpEYXRhLmRhdGEgPSBkYXRhOworICAgIGZ1enpEYXRhLnNpemUgPSBzaXplOworICAgIGZ1enpEYXRhLnB0ciA9IGRhdGE7CisgICAgZnV6ekRhdGEucmVtYWluaW5nID0gc2l6ZTsKKworICAgIGZ1enpEYXRhLm91dEJ1ZiA9IHhtbE1hbGxvYyhzaXplICsgMSk7CisgICAgZnV6ekRhdGEub3V0UHRyID0gZnV6ekRhdGEub3V0QnVmOworCisgICAgZnV6ekRhdGEuZW50aXRpZXMgPSB4bWxIYXNoQ3JlYXRlKDgpOworICAgIGZ1enpEYXRhLm1haW5VcmwgPSBOVUxMOworICAgIGZ1enpEYXRhLm1haW5FbnRpdHkgPSBOVUxMOworfQorCisvKioKKyAqIHhtbEZ1enpEYXRhRnJlZToKKyAqCisgKiBDbGVhbnVwIGZ1enogZGF0YSBwcm92aWRlci4KKyAqLwordm9pZAoreG1sRnV6ekRhdGFDbGVhbnVwKHZvaWQpIHsKKyAgICB4bWxGcmVlKGZ1enpEYXRhLm91dEJ1Zik7CisgICAgeG1sSGFzaEZyZWUoZnV6ekRhdGEuZW50aXRpZXMsIHhtbEhhc2hEZWZhdWx0RGVhbGxvY2F0b3IpOworfQorCisvKioKKyAqIHhtbEZ1enpSZWFkSW50OgorICogQHNpemU6ICBzaXplIG9mIHN0cmluZyBpbiBieXRlcworICoKKyAqIFJlYWQgYW4gaW50ZWdlciBmcm9tIHRoZSBmdXp6IGRhdGEuCisgKi8KK2ludAoreG1sRnV6elJlYWRJbnQoKSB7CisgICAgaW50IHJldDsKKworICAgIGlmIChmdXp6RGF0YS5yZW1haW5pbmcgPCBzaXplb2YoaW50KSkKKyAgICAgICAgcmV0dXJuKDApOworICAgIG1lbWNweSgmcmV0LCBmdXp6RGF0YS5wdHIsIHNpemVvZihpbnQpKTsKKyAgICBmdXp6RGF0YS5wdHIgKz0gc2l6ZW9mKGludCk7CisgICAgZnV6ekRhdGEucmVtYWluaW5nIC09IHNpemVvZihpbnQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB4bWxGdXp6UmVhZFJlbWFpbmluZzoKKyAqIEBzaXplOiAgc2l6ZSBvZiBzdHJpbmcgaW4gYnl0ZXMKKyAqCisgKiBSZWFkIHJlbWFpbmluZyBieXRlcyBmcm9tIGZ1enogZGF0YS4KKyAqLworY29uc3QgY2hhciAqCit4bWxGdXp6UmVhZFJlbWFpbmluZyhzaXplX3QgKnNpemUpIHsKKyAgICBjb25zdCBjaGFyICpyZXQgPSBmdXp6RGF0YS5wdHI7CisKKyAgICAqc2l6ZSA9IGZ1enpEYXRhLnJlbWFpbmluZzsKKyAgICBmdXp6RGF0YS5wdHIgKz0gZnV6ekRhdGEucmVtYWluaW5nOworICAgIGZ1enpEYXRhLnJlbWFpbmluZyA9IDA7CisKKyAgICByZXR1cm4ocmV0KTsKK30KKworLyoKKyAqIHhtbEZ1enpXcml0ZVN0cmluZzoKKyAqIEBvdXQ6ICBvdXRwdXQgZmlsZQorICogQHN0cjogIHN0cmluZyB0byB3cml0ZQorICoKKyAqIFdyaXRlIGEgcmFuZG9tLWxlbmd0aCBzdHJpbmcgdG8gZmlsZSBpbiBhIGZvcm1hdCBzaW1pbGFyIHRvCisgKiBGdXp6ZWREYXRhUHJvdmlkZXIuIEJhY2tzbGFzaCBmb2xsb3dlZCBieSBuZXdsaW5lIG1hcmtzIHRoZSBlbmQgb2YgdGhlCisgKiBzdHJpbmcuIFR3byBiYWNrc2xhc2hlcyBhcmUgdXNlZCB0byBlc2NhcGUgYSBiYWNrc2xhc2guCisgKi8KK3ZvaWQKK3htbEZ1enpXcml0ZVN0cmluZyhGSUxFICpvdXQsIGNvbnN0IGNoYXIgKnN0cikgeworICAgIGZvciAoOyAqc3RyOyBzdHIrKykgeworICAgICAgICBpbnQgYyA9ICh1bnNpZ25lZCBjaGFyKSAqc3RyOworICAgICAgICBwdXRjKGMsIG91dCk7CisgICAgICAgIGlmIChjID09ICdcXCcpCisgICAgICAgICAgICBwdXRjKGMsIG91dCk7CisgICAgfQorICAgIHB1dGMoJ1xcJywgb3V0KTsKKyAgICBwdXRjKCdcbicsIG91dCk7Cit9CisKKy8qKgorICogeG1sRnV6elJlYWRTdHJpbmc6CisgKiBAc2l6ZTogIHNpemUgb2Ygc3RyaW5nIGluIGJ5dGVzCisgKgorICogUmVhZCBhIHJhbmRvbS1sZW5ndGggc3RyaW5nIGZyb20gdGhlIGZ1enogZGF0YS4KKyAqCisgKiBUaGUgZm9ybWF0IGlzIHNpbWlsYXIgdG8gbGliRnV6emVyJ3MgRnV6emVkRGF0YVByb3ZpZGVyIGJ1dCB0cmVhdHMKKyAqIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBuZXdsaW5lIGFzIGVuZCBvZiBzdHJpbmcuIFRoaXMgbWFrZXMgdGhlIGZ1enogZGF0YQorICogbW9yZSByZWFkYWJsZS4gQSBiYWNrc2xhc2ggY2hhcmFjdGVyIGlzIGVzY2FwZWQgd2l0aCBhbm90aGVyIGJhY2tzbGFzaC4KKyAqCisgKiBSZXR1cm5zIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZyBvciBOVUxMIGlmIHRoZSBmdXp6IGRhdGEgaXMgZXhoYXVzdGVkLgorICovCitjb25zdCBjaGFyICoKK3htbEZ1enpSZWFkU3RyaW5nKHNpemVfdCAqc2l6ZSkgeworICAgIGNvbnN0IGNoYXIgKm91dCA9IGZ1enpEYXRhLm91dFB0cjsKKworICAgIHdoaWxlIChmdXp6RGF0YS5yZW1haW5pbmcgPiAwKSB7CisgICAgICAgIGludCBjID0gKmZ1enpEYXRhLnB0cisrOworICAgICAgICBmdXp6RGF0YS5yZW1haW5pbmctLTsKKworICAgICAgICBpZiAoKGMgPT0gJ1xcJykgJiYgKGZ1enpEYXRhLnJlbWFpbmluZyA+IDApKSB7CisgICAgICAgICAgICBpbnQgYzIgPSAqZnV6ekRhdGEucHRyOworCisgICAgICAgICAgICBpZiAoYzIgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGZ1enpEYXRhLnB0cisrOworICAgICAgICAgICAgICAgIGZ1enpEYXRhLnJlbWFpbmluZy0tOworICAgICAgICAgICAgICAgICpzaXplID0gZnV6ekRhdGEub3V0UHRyIC0gb3V0OworICAgICAgICAgICAgICAgICpmdXp6RGF0YS5vdXRQdHIrKyA9ICdcMCc7CisgICAgICAgICAgICAgICAgcmV0dXJuKG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYzIgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGZ1enpEYXRhLnB0cisrOworICAgICAgICAgICAgICAgIGZ1enpEYXRhLnJlbWFpbmluZy0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKmZ1enpEYXRhLm91dFB0cisrID0gYzsKKyAgICB9CisKKyAgICBpZiAoZnV6ekRhdGEub3V0UHRyID4gb3V0KSB7CisgICAgICAgICpzaXplID0gZnV6ekRhdGEub3V0UHRyIC0gb3V0OworICAgICAgICAqZnV6ekRhdGEub3V0UHRyKysgPSAnXDAnOworICAgICAgICByZXR1cm4ob3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4oTlVMTCk7Cit9CisKKy8qKgorICogeG1sRnV6elJlYWRFbnRpdGllczoKKyAqCisgKiBSZWFkIGVudGl0aWVzIGxpa2UgdGhlIG1haW4gWE1MIGZpbGUsIGV4dGVybmFsIERURHMsIGV4dGVybmFsIHBhcnNlZAorICogZW50aXRpZXMgZnJvbSBmdXp6IGRhdGEuCisgKi8KK3ZvaWQKK3htbEZ1enpSZWFkRW50aXRpZXModm9pZCkgeworICAgIHNpemVfdCBudW0gPSAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCAqZW50aXR5OworICAgICAgICBzaXplX3QgdXJsU2l6ZSwgZW50aXR5U2l6ZTsKKyAgICAgICAgeG1sRnV6ekVudGl0eUluZm8gKmVudGl0eUluZm87CisgICAgICAgIAorICAgICAgICB1cmwgPSB4bWxGdXp6UmVhZFN0cmluZygmdXJsU2l6ZSk7CisgICAgICAgIGlmICh1cmwgPT0gTlVMTCkgYnJlYWs7CisKKyAgICAgICAgZW50aXR5ID0geG1sRnV6elJlYWRTdHJpbmcoJmVudGl0eVNpemUpOworICAgICAgICBpZiAoZW50aXR5ID09IE5VTEwpIGJyZWFrOworCisgICAgICAgIGlmICh4bWxIYXNoTG9va3VwKGZ1enpEYXRhLmVudGl0aWVzLCAoeG1sQ2hhciAqKXVybCkgPT0gTlVMTCkgeworICAgICAgICAgICAgZW50aXR5SW5mbyA9IHhtbE1hbGxvYyhzaXplb2YoeG1sRnV6ekVudGl0eUluZm8pKTsKKyAgICAgICAgICAgIGlmIChlbnRpdHlJbmZvID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbnRpdHlJbmZvLT5kYXRhID0gZW50aXR5OworICAgICAgICAgICAgZW50aXR5SW5mby0+c2l6ZSA9IGVudGl0eVNpemU7CisKKyAgICAgICAgICAgIHhtbEhhc2hBZGRFbnRyeShmdXp6RGF0YS5lbnRpdGllcywgKHhtbENoYXIgKil1cmwsIGVudGl0eUluZm8pOworCisgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBmdXp6RGF0YS5tYWluVXJsID0gdXJsOworICAgICAgICAgICAgICAgIGZ1enpEYXRhLm1haW5FbnRpdHkgPSBlbnRpdHlJbmZvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiB4bWxGdXp6TWFpblVybDoKKyAqCisgKiBSZXR1cm5zIHRoZSBtYWluIFVSTC4KKyAqLworY29uc3QgY2hhciAqCit4bWxGdXp6TWFpblVybCh2b2lkKSB7CisgICAgcmV0dXJuKGZ1enpEYXRhLm1haW5VcmwpOworfQorCisvKioKKyAqIHhtbEZ1enpNYWluRW50aXR5OgorICogQHNpemU6ICBzaXplIG9mIHRoZSBtYWluIGVudGl0eSBpbiBieXRlcworICoKKyAqIFJldHVybnMgdGhlIG1haW4gZW50aXR5LgorICovCitjb25zdCBjaGFyICoKK3htbEZ1enpNYWluRW50aXR5KHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChmdXp6RGF0YS5tYWluRW50aXR5ID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAqc2l6ZSA9IGZ1enpEYXRhLm1haW5FbnRpdHktPnNpemU7CisgICAgcmV0dXJuKGZ1enpEYXRhLm1haW5FbnRpdHktPmRhdGEpOworfQorCisvKioKKyAqIHhtbEZ1enpFbnRpdHlMb2FkZXI6CisgKgorICogVGhlIGVudGl0eSBsb2FkZXIgZm9yIGZ1enogZGF0YS4KKyAqLworeG1sUGFyc2VySW5wdXRQdHIKK3htbEZ1enpFbnRpdHlMb2FkZXIoY29uc3QgY2hhciAqVVJMLCBjb25zdCBjaGFyICpJRCBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKKyAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dDsKKyAgICB4bWxGdXp6RW50aXR5SW5mbyAqZW50aXR5OworCisgICAgaWYgKFVSTCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgZW50aXR5ID0geG1sSGFzaExvb2t1cChmdXp6RGF0YS5lbnRpdGllcywgKHhtbENoYXIgKikgVVJMKTsKKyAgICBpZiAoZW50aXR5ID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKworICAgIGlucHV0ID0geG1sTmV3SW5wdXRTdHJlYW0oY3R4dCk7CisgICAgaW5wdXQtPmZpbGVuYW1lID0gTlVMTDsKKyAgICBpbnB1dC0+YnVmID0geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVNZW0oZW50aXR5LT5kYXRhLCBlbnRpdHktPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpOworICAgIGlmIChpbnB1dC0+YnVmID09IE5VTEwpIHsKKyAgICAgICAgeG1sRnJlZUlucHV0U3RyZWFtKGlucHV0KTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpbnB1dC0+YmFzZSA9IGlucHV0LT5jdXIgPSB4bWxCdWZDb250ZW50KGlucHV0LT5idWYtPmJ1ZmZlcik7CisgICAgaW5wdXQtPmVuZCA9IGlucHV0LT5iYXNlICsgZW50aXR5LT5zaXplOworCisgICAgcmV0dXJuIGlucHV0OworfQorCisvKioKKyAqIHhtbEZ1enpFeHRyYWN0U3RyaW5nczoKKyAqCisgKiBFeHRyYWN0IEMgc3RyaW5ncyBmcm9tIGlucHV0IGRhdGEuIFVzZSBleGFjdC1zaXplIGFsbG9jYXRpb25zIHRvIGRldGVjdAorICogcG90ZW50aWFsIG1lbW9yeSBlcnJvcnMuCisgKi8KK3NpemVfdAoreG1sRnV6ekV4dHJhY3RTdHJpbmdzKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBjaGFyICoqc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3RyaW5ncykgeworICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gZGF0YTsKKyAgICBjb25zdCBjaGFyICplbmQgPSBkYXRhICsgc2l6ZTsKKyAgICBzaXplX3QgaSA9IDAsIHJldDsKKworICAgIHdoaWxlIChpIDwgbnVtU3RyaW5ncykgeworICAgICAgICBzaXplX3Qgc3RyU2l6ZSA9IGVuZCAtIHN0YXJ0OworICAgICAgICBjb25zdCBjaGFyICp6ZXJvID0gbWVtY2hyKHN0YXJ0LCAwLCBzdHJTaXplKTsKKworICAgICAgICBpZiAoemVybyAhPSBOVUxMKQorICAgICAgICAgICAgc3RyU2l6ZSA9IHplcm8gLSBzdGFydDsKKworICAgICAgICBzdHJpbmdzW2ldID0geG1sTWFsbG9jKHN0clNpemUgKyAxKTsKKyAgICAgICAgbWVtY3B5KHN0cmluZ3NbaV0sIHN0YXJ0LCBzdHJTaXplKTsKKyAgICAgICAgc3RyaW5nc1tpXVtzdHJTaXplXSA9ICdcMCc7CisKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoemVybyAhPSBOVUxMKQorICAgICAgICAgICAgc3RhcnQgPSB6ZXJvICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0ID0gaTsKKworICAgIHdoaWxlIChpIDwgbnVtU3RyaW5ncykgeworICAgICAgICBzdHJpbmdzW2ldID0gTlVMTDsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybihyZXQpOworfQorCitjaGFyICoKK3htbFNsdXJwRmlsZShjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgKnNpemVSZXQpIHsKKyAgICBGSUxFICpmaWxlOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgY2hhciAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIGlmICgoc3RhdChwYXRoLCAmc3RhdGJ1ZikgIT0gMCkgfHwgKCFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKKyAgICBmaWxlID0gZm9wZW4ocGF0aCwgInJiIik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIGRhdGEgPSB4bWxNYWxsb2Moc2l6ZSArIDEpOworICAgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZyZWFkKGRhdGEsIDEsIHNpemUsIGZpbGUpICE9IHNpemUpIHsKKyAgICAgICAgICAgIHhtbEZyZWUoZGF0YSk7CisgICAgICAgICAgICBkYXRhID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFbc2l6ZV0gPSAwOworICAgICAgICAgICAgaWYgKHNpemVSZXQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAqc2l6ZVJldCA9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworCisgICAgcmV0dXJuKGRhdGEpOworfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovZnV6ei5oIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L2Z1enouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFiMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L2Z1enouaApAQCAtMCwwICsxLDkxIEBACisvKgorICogZnV6ei5oOiBDb21tb24gZnVuY3Rpb25zIGFuZCBtYWNyb3MgZm9yIGZ1enppbmcuCisgKgorICogU2VlIENvcHlyaWdodCBmb3IgdGhlIHN0YXR1cyBvZiB0aGlzIHNvZnR3YXJlLgorICovCisKKyNpZm5kZWYgX19YTUxfRlVaWkVSQ09NTU9OX0hfXworI2RlZmluZSBfX1hNTF9GVVpaRVJDT01NT05fSF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKKyAgI2RlZmluZSBIQVZFX0hUTUxfRlVaWkVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKKyAgI2RlZmluZSBIQVZFX1JFR0VYUF9GVVpaRVIKKyNlbmRpZgorI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKKyAgI2RlZmluZSBIQVZFX1NDSEVNQV9GVVpaRVIKKyNlbmRpZgorI2lmIDEKKyAgI2RlZmluZSBIQVZFX1VSSV9GVVpaRVIKKyNlbmRpZgorI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKSAmJiBcCisgICAgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpICYmIFwKKyAgICBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKQorICAjZGVmaW5lIEhBVkVfWE1MX0ZVWlpFUgorI2VuZGlmCisjaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKKyAgI2RlZmluZSBIQVZFX1hQQVRIX0ZVWlpFUgorI2VuZGlmCisKK2ludAorTExWTUZ1enplckluaXRpYWxpemUoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpOworCitpbnQKK0xMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpOworCit2b2lkCit4bWxGdXp6RXJyb3JGdW5jKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICptc2cgQVRUUklCVVRFX1VOVVNFRCwKKyAgICAgICAgICAgICAgICAgLi4uKTsKKwordm9pZAoreG1sRnV6ekRhdGFJbml0KGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKTsKKwordm9pZAoreG1sRnV6ekRhdGFDbGVhbnVwKHZvaWQpOworCitpbnQKK3htbEZ1enpSZWFkSW50KHZvaWQpOworCitjb25zdCBjaGFyICoKK3htbEZ1enpSZWFkUmVtYWluaW5nKHNpemVfdCAqc2l6ZSk7CisKK3ZvaWQKK3htbEZ1enpXcml0ZVN0cmluZyhGSUxFICpvdXQsIGNvbnN0IGNoYXIgKnN0cik7CisKK2NvbnN0IGNoYXIgKgoreG1sRnV6elJlYWRTdHJpbmcoc2l6ZV90ICpzaXplKTsKKwordm9pZAoreG1sRnV6elJlYWRFbnRpdGllcyh2b2lkKTsKKworY29uc3QgY2hhciAqCit4bWxGdXp6TWFpblVybCh2b2lkKTsKKworY29uc3QgY2hhciAqCit4bWxGdXp6TWFpbkVudGl0eShzaXplX3QgKnNpemUpOworCit4bWxQYXJzZXJJbnB1dFB0cgoreG1sRnV6ekVudGl0eUxvYWRlcihjb25zdCBjaGFyICpVUkwsIGNvbnN0IGNoYXIgKklELCB4bWxQYXJzZXJDdHh0UHRyIGN0eHQpOworCitzaXplX3QKK3htbEZ1enpFeHRyYWN0U3RyaW5ncyhjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgY2hhciAqKnN0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN0cmluZ3MpOworCitjaGFyICoKK3htbFNsdXJwRmlsZShjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgKnNpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19YTUxfRlVaWkVSQ09NTU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovZ2VuU2VlZC5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L2dlblNlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjAzODAyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L2dlblNlZWQuYwpAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIHhtbFNlZWQuYzogR2VuZXJhdGUgdGhlIFhNTCBzZWVkIGNvcnB1cyBmb3IgZnV6emluZy4KKyAqCisgKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2xvYi5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8bGlieG1sL0hUTUxwYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KKyNpbmNsdWRlIDxsaWJ4bWwveG1sc2NoZW1hcy5oPgorI2luY2x1ZGUgImZ1enouaCIKKworI2RlZmluZSBQQVRIX1NJWkUgNTAwCisjZGVmaW5lIFNFRURfQlVGX1NJWkUgMTYzODQKKyNkZWZpbmUgRVhQUl9TSVpFIDQ1MDAKKwordHlwZWRlZiBpbnQKKygqZmlsZUZ1bmMpKGNvbnN0IGNoYXIgKmJhc2UsIEZJTEUgKm91dCk7CisKK3R5cGVkZWYgaW50CisoKm1haW5GdW5jKShjb25zdCBjaGFyICphcmcpOworCitzdGF0aWMgc3RydWN0IHsKKyAgICBGSUxFICpvdXQ7CisgICAgeG1sSGFzaFRhYmxlUHRyIGVudGl0aWVzOyAvKiBNYXBzIFVSTHMgdG8geG1sRnV6ekVudGl0eUluZm9zICovCisgICAgeG1sRXh0ZXJuYWxFbnRpdHlMb2FkZXIgb2xkTG9hZGVyOworICAgIGZpbGVGdW5jIHByb2Nlc3NGaWxlOworICAgIGNvbnN0IGNoYXIgKmZ1enplcjsKKyAgICBpbnQgY291bnRlcjsKKyAgICBjaGFyIGN3ZFtQQVRIX1NJWkVdOworfSBnbG9iYWxEYXRhOworCisvKgorICogQSBjdXN0b20gZW50aXR5IGxvYWRlciB0aGF0IHdyaXRlcyBhbGwgZXh0ZXJuYWwgRFREcyBvciBlbnRpdGllcyB0byBhCisgKiBzaW5nbGUgZmlsZSBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHhtbEZ1enpFbnRpdHlMb2FkZXIuCisgKi8KK3N0YXRpYyB4bWxQYXJzZXJJbnB1dFB0cgorZnV6ekVudGl0eVJlY29yZGVyKGNvbnN0IGNoYXIgKlVSTCwgY29uc3QgY2hhciAqSUQsCisgICAgICAgICAgICAgICAgICAgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CisgICAgeG1sUGFyc2VySW5wdXRQdHIgaW47CisgICAgc3RhdGljIGNvbnN0IGludCBjaHVua1NpemUgPSAxNjM4NDsKKyAgICBpbnQgbGVuOworCisgICAgaW4gPSB4bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKFVSTCwgSUQsIGN0eHQpOworICAgIGlmIChpbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisKKyAgICBpZiAoZ2xvYmFsRGF0YS5lbnRpdGllcyA9PSBOVUxMKSB7CisgICAgICAgIGdsb2JhbERhdGEuZW50aXRpZXMgPSB4bWxIYXNoQ3JlYXRlKDQpOworICAgIH0gZWxzZSBpZiAoeG1sSGFzaExvb2t1cChnbG9iYWxEYXRhLmVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgeG1sQ2hhciAqKSBVUkwpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuKGluKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGxlbiA9IHhtbFBhcnNlcklucHV0QnVmZmVyR3Jvdyhpbi0+YnVmLCBjaHVua1NpemUpOworICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nICVzXG4iLCBVUkwpOworICAgICAgICAgICAgeG1sRnJlZUlucHV0U3RyZWFtKGluKTsKKyAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGxlbiA+IDApOworCisgICAgeG1sRnV6eldyaXRlU3RyaW5nKGdsb2JhbERhdGEub3V0LCBVUkwpOworICAgIHhtbEZ1enpXcml0ZVN0cmluZyhnbG9iYWxEYXRhLm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgeG1sQnVmQ29udGVudChpbi0+YnVmLT5idWZmZXIpKTsKKworICAgIHhtbEZyZWVJbnB1dFN0cmVhbShpbik7CisKKyAgICB4bWxIYXNoQWRkRW50cnkoZ2xvYmFsRGF0YS5lbnRpdGllcywgKGNvbnN0IHhtbENoYXIgKikgVVJMLCBOVUxMKTsKKworICAgIHJldHVybih4bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKFVSTCwgSUQsIGN0eHQpKTsKK30KKworc3RhdGljIHZvaWQKK2Z1enpSZWNvcmRlckluaXQoRklMRSAqb3V0KSB7CisgICAgZ2xvYmFsRGF0YS5vdXQgPSBvdXQ7CisgICAgZ2xvYmFsRGF0YS5lbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoOCk7CisgICAgZ2xvYmFsRGF0YS5vbGRMb2FkZXIgPSB4bWxHZXRFeHRlcm5hbEVudGl0eUxvYWRlcigpOworICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKGZ1enpFbnRpdHlSZWNvcmRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitmdXp6UmVjb3JkZXJDbGVhbnVwKCkgeworICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKGdsb2JhbERhdGEub2xkTG9hZGVyKTsKKyAgICB4bWxIYXNoRnJlZShnbG9iYWxEYXRhLmVudGl0aWVzLCB4bWxIYXNoRGVmYXVsdERlYWxsb2NhdG9yKTsKKyAgICBnbG9iYWxEYXRhLm91dCA9IE5VTEw7CisgICAgZ2xvYmFsRGF0YS5lbnRpdGllcyA9IE5VTEw7CisgICAgZ2xvYmFsRGF0YS5vbGRMb2FkZXIgPSBOVUxMOworfQorCisjaWZkZWYgSEFWRV9YTUxfRlVaWkVSCitzdGF0aWMgaW50Citwcm9jZXNzWG1sKGNvbnN0IGNoYXIgKmRvY0ZpbGUsIEZJTEUgKm91dCkgeworICAgIGludCBvcHRzID0gWE1MX1BBUlNFX05PRU5UIHwgWE1MX1BBUlNFX0RURExPQUQ7CisgICAgeG1sRG9jUHRyIGRvYzsKKworICAgIGZ3cml0ZSgmb3B0cywgc2l6ZW9mKG9wdHMpLCAxLCBvdXQpOworCisgICAgZnV6elJlY29yZGVySW5pdChvdXQpOworCisgICAgZG9jID0geG1sUmVhZEZpbGUoZG9jRmlsZSwgTlVMTCwgb3B0cyk7CisgICAgeG1sWEluY2x1ZGVQcm9jZXNzRmxhZ3MoZG9jLCBvcHRzKTsKKyAgICB4bWxGcmVlRG9jKGRvYyk7CisKKyAgICBmdXp6UmVjb3JkZXJDbGVhbnVwKCk7CisKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSFRNTF9GVVpaRVIKK3N0YXRpYyBpbnQKK3Byb2Nlc3NIdG1sKGNvbnN0IGNoYXIgKmRvY0ZpbGUsIEZJTEUgKm91dCkgeworICAgIGNoYXIgYnVmW1NFRURfQlVGX1NJWkVdOworICAgIEZJTEUgKmZpbGU7CisgICAgc2l6ZV90IHNpemU7CisgICAgaW50IG9wdHMgPSAwOworCisgICAgZndyaXRlKCZvcHRzLCBzaXplb2Yob3B0cyksIDEsIG91dCk7CisKKyAgICAvKiBDb3B5IGZpbGUgKi8KKyAgICBmaWxlID0gZm9wZW4oZG9jRmlsZSwgInJiIik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IG9wZW4gJXNcbiIsIGRvY0ZpbGUpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgc2l6ZSA9IGZyZWFkKGJ1ZiwgMSwgU0VFRF9CVUZfU0laRSwgZmlsZSk7CisgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgIGZ3cml0ZShidWYsIDEsIHNpemUsIG91dCk7CisgICAgfSB3aGlsZSAoc2l6ZSA9PSBTRUVEX0JVRl9TSVpFKTsKKyAgICBmY2xvc2UoZmlsZSk7CisKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0NIRU1BX0ZVWlpFUgorc3RhdGljIGludAorcHJvY2Vzc1NjaGVtYShjb25zdCBjaGFyICpkb2NGaWxlLCBGSUxFICpvdXQpIHsKKyAgICB4bWxTY2hlbWFQdHIgc2NoZW1hOworICAgIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgcGN0eHQ7CisKKyAgICBmdXp6UmVjb3JkZXJJbml0KG91dCk7CisKKyAgICBwY3R4dCA9IHhtbFNjaGVtYU5ld1BhcnNlckN0eHQoZG9jRmlsZSk7CisgICAgeG1sU2NoZW1hU2V0UGFyc2VyRXJyb3JzKHBjdHh0LCB4bWxGdXp6RXJyb3JGdW5jLCB4bWxGdXp6RXJyb3JGdW5jLCBOVUxMKTsKKyAgICBzY2hlbWEgPSB4bWxTY2hlbWFQYXJzZShwY3R4dCk7CisgICAgeG1sU2NoZW1hRnJlZVBhcnNlckN0eHQocGN0eHQpOworICAgIHhtbFNjaGVtYUZyZWUoc2NoZW1hKTsKKworICAgIGZ1enpSZWNvcmRlckNsZWFudXAoKTsKKworICAgIHJldHVybigwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50Citwcm9jZXNzUGF0dGVybihjb25zdCBjaGFyICpwYXR0ZXJuKSB7CisgICAgZ2xvYl90IGdsb2JidWY7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHJlcywgaTsKKworICAgIHJlcyA9IGdsb2IocGF0dGVybiwgMCwgTlVMTCwgJmdsb2JidWYpOworICAgIGlmIChyZXMgPT0gR0xPQl9OT01BVENIKQorICAgICAgICByZXR1cm4oMCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgbWF0Y2ggcGF0dGVybiAlc1xuIiwgcGF0dGVybik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGdsb2JidWYuZ2xfcGF0aGM7IGkrKykgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgICAgICBjaGFyIG91dFBhdGhbUEFUSF9TSVpFXTsKKyAgICAgICAgY2hhciAqZGlyQnVmID0gTlVMTDsKKyAgICAgICAgY2hhciAqYmFzZUJ1ZiA9IE5VTEw7CisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsICpkaXIsICpiYXNlOworICAgICAgICBGSUxFICpvdXQgPSBOVUxMOworICAgICAgICBpbnQgZGlyQ2hhbmdlZCA9IDA7CisgICAgICAgIHNpemVfdCBzaXplOworCisgICAgICAgIHBhdGggPSBnbG9iYnVmLmdsX3BhdGh2W2ldOworCisgICAgICAgIGlmICgoc3RhdChwYXRoLCAmc3RhdGJ1ZikgIT0gMCkgfHwgKCFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZGlyQnVmID0gKGNoYXIgKikgeG1sQ2hhclN0cmR1cChwYXRoKTsKKyAgICAgICAgYmFzZUJ1ZiA9IChjaGFyICopIHhtbENoYXJTdHJkdXAocGF0aCk7CisgICAgICAgIGlmICgoZGlyQnVmID09IE5VTEwpIHx8IChiYXNlQnVmID09IE5VTEwpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZGlyID0gZGlybmFtZShkaXJCdWYpOworICAgICAgICBiYXNlID0gYmFzZW5hbWUoYmFzZUJ1Zik7CisKKyAgICAgICAgc2l6ZSA9IHNucHJpbnRmKG91dFBhdGgsIHNpemVvZihvdXRQYXRoKSwgInNlZWQvJXMvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRGF0YS5mdXp6ZXIsIGJhc2UpOworICAgICAgICBpZiAoc2l6ZSA+PSBQQVRIX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY3JlYXRpbmcgcGF0aCBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG91dCA9IGZvcGVuKG91dFBhdGgsICJ3YiIpOworICAgICAgICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3Qgb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgb3V0UGF0aCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZGlyKGRpcikgIT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBjaGRpciB0byAlc1xuIiwgZGlyKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBkaXJDaGFuZ2VkID0gMTsKKyAgICAgICAgaWYgKGdsb2JhbERhdGEucHJvY2Vzc0ZpbGUoYmFzZSwgb3V0KSAhPSAwKQorICAgICAgICAgICAgcmV0ID0gLTE7CisKK2Vycm9yOgorICAgICAgICBpZiAob3V0ICE9IE5VTEwpCisgICAgICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICAgICAgeG1sRnJlZShkaXJCdWYpOworICAgICAgICB4bWxGcmVlKGJhc2VCdWYpOworICAgICAgICBpZiAoKGRpckNoYW5nZWQpICYmIChjaGRpcihnbG9iYWxEYXRhLmN3ZCkgIT0gMCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgY2hkaXIgdG8gJXNcbiIsIGdsb2JhbERhdGEuY3dkKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CisgICAgcmV0dXJuKHJldCk7Cit9CisKKyNpZmRlZiBIQVZFX1hQQVRIX0ZVWlpFUgorc3RhdGljIGludAorcHJvY2Vzc1hQYXRoKGNvbnN0IGNoYXIgKnRlc3REaXIsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBjb25zdCBjaGFyICpzdWJkaXIsIGludCB4cHRyKSB7CisgICAgY2hhciBwYXR0ZXJuW1BBVEhfU0laRV07CisgICAgZ2xvYl90IGdsb2JidWY7CisgICAgc2l6ZV90IGksIHNpemU7CisgICAgaW50IHJldCA9IDAsIHJlczsKKworICAgIHNpemUgPSBzbnByaW50ZihwYXR0ZXJuLCBzaXplb2YocGF0dGVybiksICIlcy8lcy8lcyoiLAorICAgICAgICAgICAgICAgICAgICB0ZXN0RGlyLCBzdWJkaXIsIHByZWZpeCk7CisgICAgaWYgKHNpemUgPj0gUEFUSF9TSVpFKQorICAgICAgICByZXR1cm4oLTEpOworICAgIHJlcyA9IGdsb2IocGF0dGVybiwgMCwgTlVMTCwgJmdsb2JidWYpOworICAgIGlmIChyZXMgPT0gR0xPQl9OT01BVENIKQorICAgICAgICByZXR1cm4oMCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgbWF0Y2ggcGF0dGVybiAlc1xuIiwgcGF0dGVybik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGdsb2JidWYuZ2xfcGF0aGM7IGkrKykgeworICAgICAgICBjaGFyICpwYXRoID0gZ2xvYmJ1Zi5nbF9wYXRodltpXTsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICAgICAgRklMRSAqaW47CisgICAgICAgIGNoYXIgZXhwcltFWFBSX1NJWkVdOworCisgICAgICAgIGlmICgoc3RhdChwYXRoLCAmc3RhdGJ1ZikgIT0gMCkgfHwgKCFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW4gPSBmb3BlbihwYXRoLCAicmIiKTsKKyAgICAgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoZmdldHMoZXhwciwgRVhQUl9TSVpFLCBpbikgPiAwKSB7CisgICAgICAgICAgICBjaGFyIG91dFBhdGhbUEFUSF9TSVpFXTsKKyAgICAgICAgICAgIEZJTEUgKm91dDsKKyAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBleHByW2pdICE9IDA7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoZXhwcltqXSA9PSAnXHInIHx8IGV4cHJbal0gPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBleHByW2pdID0gMDsKKworICAgICAgICAgICAgc2l6ZSA9IHNucHJpbnRmKG91dFBhdGgsIHNpemVvZihvdXRQYXRoKSwgInNlZWQveHBhdGgvJXMtJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGdsb2JhbERhdGEuY291bnRlcik7CisgICAgICAgICAgICBpZiAoc2l6ZSA+PSBQQVRIX1NJWkUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA9IGZvcGVuKG91dFBhdGgsICJ3YiIpOworICAgICAgICAgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4cHRyKSB7CisgICAgICAgICAgICAgICAgeG1sRnV6eldyaXRlU3RyaW5nKG91dCwgZXhwcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgeHB0ckV4cHJbRVhQUl9TSVpFKzEwMF07CisKKyAgICAgICAgICAgICAgICAvKiBXcmFwIFhQYXRoIGV4cHJlc3Npb25zIGFzIFhQb2ludGVyICovCisgICAgICAgICAgICAgICAgc25wcmludGYoeHB0ckV4cHIsIHNpemVvZih4cHRyRXhwciksICJ4cG9pbnRlciglcykiLCBleHByKTsKKyAgICAgICAgICAgICAgICB4bWxGdXp6V3JpdGVTdHJpbmcob3V0LCB4cHRyRXhwcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHhtbEZ1enpXcml0ZVN0cmluZyhvdXQsIGRhdGEpOworCisgICAgICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICAgICAgICAgIGdsb2JhbERhdGEuY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgZmNsb3NlKGluKTsKKyAgICB9CisKKyAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CisKKyAgICByZXR1cm4ocmV0KTsKK30KKworaW50Citwcm9jZXNzWFBhdGhEaXIoY29uc3QgY2hhciAqdGVzdERpcikgeworICAgIGNoYXIgcGF0dGVybltQQVRIX1NJWkVdOworICAgIGdsb2JfdCBnbG9iYnVmOworICAgIHNpemVfdCBpLCBzaXplOworICAgIGludCByZXQgPSAwOworCisgICAgZ2xvYmFsRGF0YS5jb3VudGVyID0gMTsKKyAgICBpZiAocHJvY2Vzc1hQYXRoKHRlc3REaXIsICIiLCAiZXhwciIsICI8ZD48L2Q+IiwgImV4cHIiLCAwKSAhPSAwKQorICAgICAgICByZXQgPSAtMTsKKworICAgIHNpemUgPSBzbnByaW50ZihwYXR0ZXJuLCBzaXplb2YocGF0dGVybiksICIlcy9kb2NzLyoiLCB0ZXN0RGlyKTsKKyAgICBpZiAoc2l6ZSA+PSBQQVRIX1NJWkUpCisgICAgICAgIHJldHVybigxKTsKKyAgICBpZiAoZ2xvYihwYXR0ZXJuLCAwLCBOVUxMLCAmZ2xvYmJ1ZikgIT0gMCkKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdsb2JidWYuZ2xfcGF0aGM7IGkrKykgeworICAgICAgICBjaGFyICpwYXRoID0gZ2xvYmJ1Zi5nbF9wYXRodltpXTsKKyAgICAgICAgY2hhciAqZGF0YTsKKyAgICAgICAgY29uc3QgY2hhciAqZG9jRmlsZTsKKworICAgICAgICBkYXRhID0geG1sU2x1cnBGaWxlKHBhdGgsIE5VTEwpOworICAgICAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRvY0ZpbGUgPSBiYXNlbmFtZShwYXRoKTsKKworICAgICAgICBnbG9iYWxEYXRhLmNvdW50ZXIgPSAxOworICAgICAgICBpZiAocHJvY2Vzc1hQYXRoKHRlc3REaXIsIGRvY0ZpbGUsIGRvY0ZpbGUsIGRhdGEsICJ0ZXN0cyIsIDApICE9IDApCisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgaWYgKHByb2Nlc3NYUGF0aCh0ZXN0RGlyLCBkb2NGaWxlLCBkb2NGaWxlLCBkYXRhLCAieHB0ciIsIDEpICE9IDApCisgICAgICAgICAgICByZXQgPSAtMTsKKworICAgICAgICB4bWxGcmVlKGRhdGEpOworICAgIH0KKworICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKKworICAgIHJldHVybihyZXQpOworfQorI2VuZGlmCisKK2ludAorbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKKyAgICBtYWluRnVuYyBwcm9jZXNzQXJnID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpmdXp6ZXI7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHhwYXRoID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmIChhcmdjIDwgMykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBzZWVkIFtGVVpaRVJdIFtQQVRURVJOLi4uXVxuIik7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICB4bWxTZXRHZW5lcmljRXJyb3JGdW5jKE5VTEwsIHhtbEZ1enpFcnJvckZ1bmMpOworCisgICAgZnV6emVyID0gYXJndlsxXTsKKyAgICBpZiAoc3RyY21wKGZ1enplciwgImh0bWwiKSA9PSAwKSB7CisjaWZkZWYgSEFWRV9IVE1MX0ZVWlpFUgorICAgICAgICBwcm9jZXNzQXJnID0gcHJvY2Vzc1BhdHRlcm47CisgICAgICAgIGdsb2JhbERhdGEucHJvY2Vzc0ZpbGUgPSBwcm9jZXNzSHRtbDsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoc3RyY21wKGZ1enplciwgInNjaGVtYSIpID09IDApIHsKKyNpZmRlZiBIQVZFX1NDSEVNQV9GVVpaRVIKKyAgICAgICAgcHJvY2Vzc0FyZyA9IHByb2Nlc3NQYXR0ZXJuOworICAgICAgICBnbG9iYWxEYXRhLnByb2Nlc3NGaWxlID0gcHJvY2Vzc1NjaGVtYTsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoc3RyY21wKGZ1enplciwgInhtbCIpID09IDApIHsKKyNpZmRlZiBIQVZFX1hNTF9GVVpaRVIKKyAgICAgICAgcHJvY2Vzc0FyZyA9IHByb2Nlc3NQYXR0ZXJuOworICAgICAgICBnbG9iYWxEYXRhLnByb2Nlc3NGaWxlID0gcHJvY2Vzc1htbDsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoc3RyY21wKGZ1enplciwgInhwYXRoIikgPT0gMCkgeworI2lmZGVmIEhBVkVfWFBBVEhfRlVaWkVSCisgICAgICAgIHByb2Nlc3NBcmcgPSBwcm9jZXNzWFBhdGhEaXI7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gZnV6emVyICVzXG4iLCBmdXp6ZXIpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIGdsb2JhbERhdGEuZnV6emVyID0gZnV6emVyOworCisgICAgaWYgKGdldGN3ZChnbG9iYWxEYXRhLmN3ZCwgUEFUSF9TSVpFKSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIGlmIChwcm9jZXNzQXJnICE9IE5VTEwpCisgICAgICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspCisgICAgICAgICAgICBwcm9jZXNzQXJnKGFyZ3ZbaV0pOworCisgICAgcmV0dXJuKHJldCk7Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9odG1sLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovaHRtbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmIzZGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovaHRtbC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBodG1sLmM6IGEgbGliRnV6emVyIHRhcmdldCB0byB0ZXN0IHNldmVyYWwgSFRNTCBwYXJzZXIgaW50ZXJmYWNlcy4KKyAqCisgKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCisgKi8KKworI2luY2x1ZGUgPGxpYnhtbC9IVE1McGFyc2VyLmg+CisjaW5jbHVkZSA8bGlieG1sL0hUTUx0cmVlLmg+CisjaW5jbHVkZSA8bGlieG1sL2NhdGFsb2cuaD4KKyNpbmNsdWRlICJmdXp6LmgiCisKK2ludAorTExWTUZ1enplckluaXRpYWxpemUoaW50ICphcmdjIEFUVFJJQlVURV9VTlVTRUQsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICoqKmFyZ3YgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHhtbEluaXRQYXJzZXIoKTsKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisgICAgeG1sSW5pdGlhbGl6ZUNhdGFsb2coKTsKKyNlbmRpZgorICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMoTlVMTCwgeG1sRnV6ekVycm9yRnVuYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBtYXhDaHVua1NpemUgPSAxMjg7CisgICAgaHRtbERvY1B0ciBkb2M7CisgICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsKKyAgICB4bWxPdXRwdXRCdWZmZXJQdHIgb3V0OworICAgIGNvbnN0IGNoYXIgKmRvY0J1ZmZlcjsKKyAgICBzaXplX3QgZG9jU2l6ZSwgY29uc3VtZWQsIGNodW5rU2l6ZTsKKyAgICBpbnQgb3B0cywgb3V0U2l6ZTsKKworICAgIHhtbEZ1enpEYXRhSW5pdChkYXRhLCBzaXplKTsKKyAgICBvcHRzID0geG1sRnV6elJlYWRJbnQoKTsKKworICAgIGRvY0J1ZmZlciA9IHhtbEZ1enpSZWFkUmVtYWluaW5nKCZkb2NTaXplKTsKKyAgICBpZiAoZG9jQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgeG1sRnV6ekRhdGFDbGVhbnVwKCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICAvKiBQdWxsIHBhcnNlciAqLworCisgICAgZG9jID0gaHRtbFJlYWRNZW1vcnkoZG9jQnVmZmVyLCBkb2NTaXplLCBOVUxMLCBOVUxMLCBvcHRzKTsKKworICAgIC8qCisgICAgICogQWxzbyB0ZXN0IHRoZSBzZXJpYWxpemVyLiBDYWxsIGh0bWxEb2NDb250ZW50RHVtcE91dHB1dCB3aXRoIG91cgorICAgICAqIG93biBidWZmZXIgdG8gYXZvaWQgZW5jb2RpbmcgdGhlIG91dHB1dC4gVGhlIEhUTUwgZW5jb2RpbmcgaXMKKyAgICAgKiBleGNydWNpYXRpbmdseSBzbG93IChzZWUgaHRtbEVudGl0eVZhbHVlTG9va3VwKS4KKyAgICAgKi8KKyAgICBvdXQgPSB4bWxBbGxvY091dHB1dEJ1ZmZlcihOVUxMKTsKKyAgICBodG1sRG9jQ29udGVudER1bXBPdXRwdXQob3V0LCBkb2MsIE5VTEwpOworICAgIHhtbE91dHB1dEJ1ZmZlckNsb3NlKG91dCk7CisKKyAgICB4bWxGcmVlRG9jKGRvYyk7CisKKyAgICAvKiBQdXNoIHBhcnNlciAqLworCisgICAgY3R4dCA9IGh0bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CisgICAgaHRtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdHMpOworCisgICAgZm9yIChjb25zdW1lZCA9IDA7IGNvbnN1bWVkIDwgZG9jU2l6ZTsgY29uc3VtZWQgKz0gY2h1bmtTaXplKSB7CisgICAgICAgIGNodW5rU2l6ZSA9IGRvY1NpemUgLSBjb25zdW1lZDsKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA+IG1heENodW5rU2l6ZSkKKyAgICAgICAgICAgIGNodW5rU2l6ZSA9IG1heENodW5rU2l6ZTsKKyAgICAgICAgaHRtbFBhcnNlQ2h1bmsoY3R4dCwgZG9jQnVmZmVyICsgY29uc3VtZWQsIGNodW5rU2l6ZSwgMCk7CisgICAgfQorCisgICAgaHRtbFBhcnNlQ2h1bmsoY3R4dCwgTlVMTCwgMCwgMSk7CisgICAgeG1sRnJlZURvYyhjdHh0LT5teURvYyk7CisgICAgaHRtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOworCisgICAgLyogQ2xlYW51cCAqLworCisgICAgeG1sRnV6ekRhdGFDbGVhbnVwKCk7CisgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKworICAgIHJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L2h0bWwuZGljdCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9odG1sLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0NDRjMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9odG1sLmRpY3QKQEAgLTAsMCArMSwxMjQgQEAKK2VsZW1fYT0iPGE+PC9hPiIKK2VsZW1fYWJicj0iPGFiYnI+PC9hYmJyPiIKK2VsZW1fYWNyb255bT0iPGFjcm9ueW0+PC9hY3JvbnltPiIKK2VsZW1fYWRkcmVzcz0iPGFkZHJlc3M+PC9hZGRyZXNzPiIKK2VsZW1fYXBwbGV0PSI8YXBwbGV0PjwvYXBwbGV0PiIKK2VsZW1fYXJlYT0iPGFyZWE+IgorZWxlbV9iPSI8Yj48L2I+IgorZWxlbV9iYXNlPSI8YmFzZT4iCitlbGVtX2Jhc2Vmb250PSI8YmFzZWZvbnQ+IgorZWxlbV9iZG89IjxiZG8+PC9iZG8+IgorZWxlbV9iaWc9IjxiaWc+PC9iaWc+IgorZWxlbV9ibG9ja3F1b3RlPSI8YmxvY2txdW90ZT48L2Jsb2NrcXVvdGU+IgorZWxlbV9ib2R5PSI8Ym9keT48L2JvZHk+IgorZWxlbV9icj0iPGJyPiIKK2VsZW1fYnV0dG9uPSI8YnV0dG9uPjwvYnV0dG9uPiIKK2VsZW1fY2FwdGlvbj0iPGNhcHRpb24+PC9jYXB0aW9uPiIKK2VsZW1fY2VudGVyPSI8Y2VudGVyPjwvY2VudGVyPiIKK2VsZW1fY2l0ZT0iPGNpdGU+PC9jaXRlPiIKK2VsZW1fY29kZT0iPGNvZGU+PC9jb2RlPiIKK2VsZW1fY29sPSI8Y29sPiIKK2VsZW1fY29sZ3JvdXA9Ijxjb2xncm91cD48L2NvbGdyb3VwPiIKK2VsZW1fZGQ9IjxkZD48L2RkPiIKK2VsZW1fZGVsPSI8ZGVsPjwvZGVsPiIKK2VsZW1fZGZuPSI8ZGZuPjwvZGZuPiIKK2VsZW1fZGlyPSI8ZGlyPjwvZGlyPiIKK2VsZW1fZGl2PSI8ZGl2PjwvZGl2PiIKK2VsZW1fZGw9IjxkbD48L2RsPiIKK2VsZW1fZHQ9IjxkdD48L2R0PiIKK2VsZW1fZW09IjxlbT48L2VtPiIKK2VsZW1fZW1iZWQ9IjxlbWJlZD48L2VtYmVkPiIKK2VsZW1fZmllbGRzZXQ9IjxmaWVsZHNldD48L2ZpZWxkc2V0PiIKK2VsZW1fZm9udD0iPGZvbnQ+PC9mb250PiIKK2VsZW1fZm9ybT0iPGZvcm0+PC9mb3JtPiIKK2VsZW1fZnJhbWU9IjxmcmFtZT4iCitlbGVtX2ZyYW1lc2V0PSI8ZnJhbWVzZXQ+PC9mcmFtZXNldD4iCitlbGVtX2gxPSI8aDE+PC9oMT4iCitlbGVtX2gyPSI8aDI+PC9oMj4iCitlbGVtX2gzPSI8aDM+PC9oMz4iCitlbGVtX2g0PSI8aDQ+PC9oND4iCitlbGVtX2g1PSI8aDU+PC9oNT4iCitlbGVtX2g2PSI8aDY+PC9oNj4iCitlbGVtX2hlYWQ9IjxoZWFkPjwvaGVhZD4iCitlbGVtX2hyPSI8aHI+IgorZWxlbV9odG1sPSI8aHRtbD48L2h0bWw+IgorZWxlbV9pPSI8aT48L2k+IgorZWxlbV9pZnJhbWU9IjxpZnJhbWU+PC9pZnJhbWU+IgorZWxlbV9pbWc9IjxpbWc+IgorZWxlbV9pbnB1dD0iPGlucHV0PiIKK2VsZW1faW5zPSI8aW5zPjwvaW5zPiIKK2VsZW1faXNpbmRleD0iPGlzaW5kZXg+IgorZWxlbV9rYmQ9IjxrYmQ+PC9rYmQ+IgorZWxlbV9sYWJlbD0iPGxhYmVsPjwvbGFiZWw+IgorZWxlbV9sZWdlbmQ9IjxsZWdlbmQ+PC9sZWdlbmQ+IgorZWxlbV9saT0iPGxpPjwvbGk+IgorZWxlbV9saW5rPSI8bGluaz4iCitlbGVtX21hcD0iPG1hcD48L21hcD4iCitlbGVtX21lbnU9IjxtZW51PjwvbWVudT4iCitlbGVtX21ldGE9IjxtZXRhPiIKK2VsZW1fbm9mcmFtZXM9Ijxub2ZyYW1lcz48L25vZnJhbWVzPiIKK2VsZW1fbm9zY3JpcHQ9Ijxub3NjcmlwdD48L25vc2NyaXB0PiIKK2VsZW1fb2JqZWN0PSI8b2JqZWN0Pjwvb2JqZWN0PiIKK2VsZW1fb2w9IjxvbD48L29sPiIKK2VsZW1fb3B0Z3JvdXA9IjxvcHRncm91cD48L29wdGdyb3VwPiIKK2VsZW1fb3B0aW9uPSI8b3B0aW9uPjwvb3B0aW9uPiIKK2VsZW1fcD0iPHA+PC9wPiIKK2VsZW1fcGFyYW09IjxwYXJhbT4iCitlbGVtX3ByZT0iPHByZT48L3ByZT4iCitlbGVtX3E9IjxxPjwvcT4iCitlbGVtX3M9IjxzPjwvcz4iCitlbGVtX3NhbXA9IjxzYW1wPjwvc2FtcD4iCitlbGVtX3NjcmlwdD0iPHNjcmlwdD48L3NjcmlwdD4iCitlbGVtX3NlbGVjdD0iPHNlbGVjdD48L3NlbGVjdD4iCitlbGVtX3NtYWxsPSI8c21hbGw+PC9zbWFsbD4iCitlbGVtX3NwYW49IjxzcGFuPjwvc3Bhbj4iCitlbGVtX3N0cmlrZT0iPHN0cmlrZT48L3N0cmlrZT4iCitlbGVtX3N0cm9uZz0iPHN0cm9uZz48L3N0cm9uZz4iCitlbGVtX3N0eWxlPSI8c3R5bGU+PC9zdHlsZT4iCitlbGVtX3N1Yj0iPHN1Yj48L3N1Yj4iCitlbGVtX3N1cD0iPHN1cD48L3N1cD4iCitlbGVtX3RhYmxlPSI8dGFibGU+PC90YWJsZT4iCitlbGVtX3Rib2R5PSI8dGJvZHk+PC90Ym9keT4iCitlbGVtX3RkPSI8dGQ+PC90ZD4iCitlbGVtX3RleHRhcmVhPSI8dGV4dGFyZWE+PC90ZXh0YXJlYT4iCitlbGVtX3Rmb290PSI8dGZvb3Q+PC90Zm9vdD4iCitlbGVtX3RoPSI8dGg+PC90aD4iCitlbGVtX3RoZWFkPSI8dGhlYWQ+PC90aGVhZD4iCitlbGVtX3RpdGxlPSI8dGl0bGU+PC90aXRsZT4iCitlbGVtX3RyPSI8dHI+PC90cj4iCitlbGVtX3R0PSI8dHQ+PC90dD4iCitlbGVtX3U9Ijx1PjwvdT4iCitlbGVtX3VsPSI8dWw+PC91bD4iCitlbGVtX3Zhcj0iPHZhcj48L3Zhcj4iCisKK2F0dHJfaWQ9IiBpZD1cIlwiIgorYXR0cl9zdHlsZT0iIHN0eWxlPVwiXCIiCisKK2NvbW1lbnQ9IjwhLS0gLS0+IgorCitkb2N0eXBlPSI8IURPQ1RZUEUgZD4iCitkb2N0eXBlX3N5c3RlbT0iPCFET0NUWVBFIHMgU1lTVEVNIFwidVwiPiIKK2RvY3R5cGVfcHVibGljPSI8IURPQ1RZUEUgcCBQVUJMSUMgXCJpXCIgXCJ1XCI+IgorCitwaT0iPD9hPz4iCisKK3JlZl9sdD0iJmx0OyIKK3JlZl9ndD0iJmd0OyIKK3JlZl9hbXA9IiZhbXA7IgorcmVmX2Fwb3M9IiZhcG9zOyIKK3JlZl9xdW90PSImcXVvdDsiCityZWZfZGVjPSImIzk7IgorcmVmX2hleD0iJiN4QTsiCisKK2NzX3V0Zjg9IlVURi04IgorY3NfdXRmMTY9IlVURi0xNiIKK2NzX3V0ZjE2bGU9IlVURi0xNkxFIgorY3NfdXRmMTZiZT0iVVRGLTE2QkUiCitjc191Y3MyPSJVQ1MtMiIKK2NzX3VjczQ9IlVDUy00IgorY3NfbGF0aW4xPSJJU08tODg1OS0xIgorY3NfYXNjaWk9IkFTQ0lJIgorY3NfZWJjZGljPSJFQkNESUMiCitjc19pc28yMDIyanA9IklTTy0yMDIyLUpQIgorY3Nfc2hpZnRfamlzPSJTSElGVF9KSVMiCitjc19ldWNfanA9IkVVQy1KUCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9yZWdleHAuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9yZWdleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjEyMTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3JlZ2V4cC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiByZWdleHAuYzogYSBsaWJGdXp6ZXIgdGFyZ2V0IHRvIHRlc3QgdGhlIHJlZ2V4cCBtb2R1bGUuCisgKgorICogU2VlIENvcHlyaWdodCBmb3IgdGhlIHN0YXR1cyBvZiB0aGlzIHNvZnR3YXJlLgorICovCisKKyNpbmNsdWRlIDxsaWJ4bWwveG1scmVnZXhwLmg+CisjaW5jbHVkZSAiZnV6ei5oIgorCitpbnQKK0xMVk1GdXp6ZXJJbml0aWFsaXplKGludCAqYXJnYyBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqKiphcmd2IEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICB4bWxTZXRHZW5lcmljRXJyb3JGdW5jKE5VTEwsIHhtbEZ1enpFcnJvckZ1bmMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHhtbFJlZ2V4cFB0ciByZWdleHA7CisgICAgY2hhciAqc3RyWzJdID0geyBOVUxMLCBOVUxMIH07CisgICAgc2l6ZV90IG51bVN0cmluZ3M7CisKKyAgICBpZiAoc2l6ZSA+IDIwMCkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgbnVtU3RyaW5ncyA9IHhtbEZ1enpFeHRyYWN0U3RyaW5ncyhkYXRhLCBzaXplLCBzdHIsIDIpOworCisgICAgLyogQ1VSX1NDSEFSIGRvZXNuJ3QgaGFuZGxlIGludmFsaWQgVVRGLTggYW5kIG1heSBjYXVzZSBpbmZpbml0ZSBsb29wcy4gKi8KKyAgICBpZiAoeG1sQ2hlY2tVVEY4KEJBRF9DQVNUIHN0clswXSkgIT0gMCkgeworICAgICAgICByZWdleHAgPSB4bWxSZWdleHBDb21waWxlKEJBRF9DQVNUIHN0clswXSk7CisgICAgICAgIC8qIHhtbFJlZ2V4cEV4ZWMgaGFzIHBhdGhvbG9naWNhbCBwZXJmb3JtYW5jZSBpbiB0b28gbWFueSBjYXNlcy4gKi8KKyNpZiAwCisgICAgICAgIGlmICgocmVnZXhwICE9IE5VTEwpICYmIChudW1TdHJpbmdzID49IDIpKSB7CisgICAgICAgICAgICB4bWxSZWdleHBFeGVjKHJlZ2V4cCwgQkFEX0NBU1Qgc3RyWzFdKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHhtbFJlZ0ZyZWVSZWdleHAocmVnZXhwKTsKKyAgICB9CisKKyAgICB4bWxGcmVlKHN0clswXSk7CisgICAgeG1sRnJlZShzdHJbMV0pOworICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3JlZ2V4cC5kaWN0IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3JlZ2V4cC5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDY2NmQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovcmVnZXhwLmRpY3QKQEAgLTAsMCArMSwxNTUgQEAKK3F1YW50X2FueT0iKiIKK3F1YW50X29wdD0iPyIKK3F1YW50X3NvbWU9IisiCitxdWFudF9udW09InsxLDJ9IgorCitkb3Q9Ii4iCiticmFuY2g9InxhIgorcGFyZW5zPSIoKSIKK3BhcmVuc19pbm5lcj0iKSgiCitwb3NfZ3JvdXA9IlthXSIKK25lZ19ncm91cD0iW15hXSIKK2NsYXNzX3N1YnRyYWN0aW9uPSJbYS1bYl1dIgorCitlc2Nfc3BhY2U9IlxccyIKK2VzY19pbml0aWFsPSJcXGkiCitlc2NfbmFtZT0iXFxjIgorZXNjX2RpZ2l0PSJcXGQiCitlc2Nfd29yZD0iXFx3IgorCitjYXRfbGV0dGVyPSJcXHB7TH0iCitjYXRfbWFyaz0iXFxwe019IgorY2F0X251bWJlcj0iXFxwe059IgorY2F0X3B1bmN0PSJcXHB7UH0iCitjYXRfc3ltPSJcXHB7U30iCitjYXRfc2VwPSJcXHB7Wn0iCitjYXRfb3RoZXI9IlxccHtDfSIKKworYmxvY2tfYWVnZWFuX251bWJlcnM9IlxccHtJc0FlZ2Vhbk51bWJlcnN9IgorYmxvY2tfYWxwaGFiZXRpY19wcmVzZW50YXRpb25fZm9ybXM9IlxccHtJc0FscGhhYmV0aWNQcmVzZW50YXRpb25Gb3Jtc30iCitibG9ja19hcmFiaWM9IlxccHtJc0FyYWJpY30iCitibG9ja19hcmFiaWNfcHJlc2VudGF0aW9uX2Zvcm1zX2E9IlxccHtJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQX0iCitibG9ja19hcmFiaWNfcHJlc2VudGF0aW9uX2Zvcm1zX2I9IlxccHtJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQn0iCitibG9ja19hcm1lbmlhbj0iXFxwe0lzQXJtZW5pYW59IgorYmxvY2tfYXJyb3dzPSJcXHB7SXNBcnJvd3N9IgorYmxvY2tfYmFzaWNfbGF0aW49IlxccHtJc0Jhc2ljTGF0aW59IgorYmxvY2tfYmVuZ2FsaT0iXFxwe0lzQmVuZ2FsaX0iCitibG9ja19ibG9ja19lbGVtZW50cz0iXFxwe0lzQmxvY2tFbGVtZW50c30iCitibG9ja19ib3BvbW9mbz0iXFxwe0lzQm9wb21vZm99IgorYmxvY2tfYm9wb21vZm9fZXh0ZW5kZWQ9IlxccHtJc0JvcG9tb2ZvRXh0ZW5kZWR9IgorYmxvY2tfYm94X2RyYXdpbmc9IlxccHtJc0JveERyYXdpbmd9IgorYmxvY2tfYnJhaWxsZV9wYXR0ZXJucz0iXFxwe0lzQnJhaWxsZVBhdHRlcm5zfSIKK2Jsb2NrX2J1aGlkPSJcXHB7SXNCdWhpZH0iCitibG9ja19ieXphbnRpbmVfbXVzaWNhbF9zeW1ib2xzPSJcXHB7SXNCeXphbnRpbmVNdXNpY2FsU3ltYm9sc30iCitibG9ja19jX2pfa19jb21wYXRpYmlsaXR5PSJcXHB7SXNDSktDb21wYXRpYmlsaXR5fSIKK2Jsb2NrX2Nfal9rX2NvbXBhdGliaWxpdHlfZm9ybXM9IlxccHtJc0NKS0NvbXBhdGliaWxpdHlGb3Jtc30iCitibG9ja19jX2pfa19jb21wYXRpYmlsaXR5X2lkZW9ncmFwaHM9IlxccHtJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzfSIKK2Jsb2NrX2Nfal9rX2NvbXBhdGliaWxpdHlfaWRlb2dyYXBoc19zdXBwbGVtZW50PSJcXHB7SXNDSktDb21wYXRpYmlsaXR5SWRlb2dyYXBoc1N1cHBsZW1lbnR9IgorYmxvY2tfY19qX2tfcmFkaWNhbHNfc3VwcGxlbWVudD0iXFxwe0lzQ0pLUmFkaWNhbHNTdXBwbGVtZW50fSIKK2Jsb2NrX2Nfal9rX3N5bWJvbHNhbmRfcHVuY3R1YXRpb249IlxccHtJc0NKS1N5bWJvbHNhbmRQdW5jdHVhdGlvbn0iCitibG9ja19jX2pfa191bmlmaWVkX2lkZW9ncmFwaHM9IlxccHtJc0NKS1VuaWZpZWRJZGVvZ3JhcGhzfSIKK2Jsb2NrX2Nfal9rX3VuaWZpZWRfaWRlb2dyYXBoc19leHRlbnNpb25fYT0iXFxwe0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BfSIKK2Jsb2NrX2Nqa191bmlmaWVkX2lkZW9ncmFwaHNfZXh0ZW5zaW9uX2I9IlxccHtJc0NKS1VuaWZpZWRJZGVvZ3JhcGhzRXh0ZW5zaW9uQn0iCitibG9ja19jaGVyb2tlZT0iXFxwe0lzQ2hlcm9rZWV9IgorYmxvY2tfY29tYmluaW5nX2RpYWNyaXRpY2FsX21hcmtzPSJcXHB7SXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzfSIKK2Jsb2NrX2NvbWJpbmluZ19kaWFjcml0aWNhbF9tYXJrc2Zvcl9zeW1ib2xzPSJcXHB7SXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9sc30iCitibG9ja19jb21iaW5pbmdfaGFsZl9tYXJrcz0iXFxwe0lzQ29tYmluaW5nSGFsZk1hcmtzfSIKK2Jsb2NrX2NvbWJpbmluZ19tYXJrc2Zvcl9zeW1ib2xzPSJcXHB7SXNDb21iaW5pbmdNYXJrc2ZvclN5bWJvbHN9IgorYmxvY2tfY29udHJvbF9waWN0dXJlcz0iXFxwe0lzQ29udHJvbFBpY3R1cmVzfSIKK2Jsb2NrX2N1cnJlbmN5X3N5bWJvbHM9IlxccHtJc0N1cnJlbmN5U3ltYm9sc30iCitibG9ja19jeXByaW90X3N5bGxhYmFyeT0iXFxwe0lzQ3lwcmlvdFN5bGxhYmFyeX0iCitibG9ja19jeXJpbGxpYz0iXFxwe0lzQ3lyaWxsaWN9IgorYmxvY2tfY3lyaWxsaWNfc3VwcGxlbWVudD0iXFxwe0lzQ3lyaWxsaWNTdXBwbGVtZW50fSIKK2Jsb2NrX2Rlc2VyZXQ9IlxccHtJc0Rlc2VyZXR9IgorYmxvY2tfZGV2YW5hZ2FyaT0iXFxwe0lzRGV2YW5hZ2FyaX0iCitibG9ja19kaW5nYmF0cz0iXFxwe0lzRGluZ2JhdHN9IgorYmxvY2tfZW5jbG9zZWRfYWxwaGFudW1lcmljcz0iXFxwe0lzRW5jbG9zZWRBbHBoYW51bWVyaWNzfSIKK2Jsb2NrX2VuY2xvc2VkX2Nqa19sZXR0ZXJzYW5kX21vbnRocz0iXFxwe0lzRW5jbG9zZWRDSktMZXR0ZXJzYW5kTW9udGhzfSIKK2Jsb2NrX2V0aGlvcGljPSJcXHB7SXNFdGhpb3BpY30iCitibG9ja19nZW5lcmFsX3B1bmN0dWF0aW9uPSJcXHB7SXNHZW5lcmFsUHVuY3R1YXRpb259IgorYmxvY2tfZ2VvbWV0cmljX3NoYXBlcz0iXFxwe0lzR2VvbWV0cmljU2hhcGVzfSIKK2Jsb2NrX2dlb3JnaWFuPSJcXHB7SXNHZW9yZ2lhbn0iCitibG9ja19nb3RoaWM9IlxccHtJc0dvdGhpY30iCitibG9ja19ncmVlaz0iXFxwe0lzR3JlZWt9IgorYmxvY2tfZ3JlZWtfZXh0ZW5kZWQ9IlxccHtJc0dyZWVrRXh0ZW5kZWR9IgorYmxvY2tfZ3JlZWthbmRfY29wdGljPSJcXHB7SXNHcmVla2FuZENvcHRpY30iCitibG9ja19ndWphcmF0aT0iXFxwe0lzR3VqYXJhdGl9IgorYmxvY2tfZ3VybXVraGk9IlxccHtJc0d1cm11a2hpfSIKK2Jsb2NrX2hhbGZ3aWR0aGFuZF9mdWxsd2lkdGhfZm9ybXM9IlxccHtJc0hhbGZ3aWR0aGFuZEZ1bGx3aWR0aEZvcm1zfSIKK2Jsb2NrX2hhbmd1bF9jb21wYXRpYmlsaXR5X2phbW89IlxccHtJc0hhbmd1bENvbXBhdGliaWxpdHlKYW1vfSIKK2Jsb2NrX2hhbmd1bF9qYW1vPSJcXHB7SXNIYW5ndWxKYW1vfSIKK2Jsb2NrX2hhbmd1bF9zeWxsYWJsZXM9IlxccHtJc0hhbmd1bFN5bGxhYmxlc30iCitibG9ja19oYW51bm9vPSJcXHB7SXNIYW51bm9vfSIKK2Jsb2NrX2hlYnJldz0iXFxwe0lzSGVicmV3fSIKK2Jsb2NrX2hpZ2hfcHJpdmF0ZV91c2Vfc3Vycm9nYXRlcz0iXFxwe0lzSGlnaFByaXZhdGVVc2VTdXJyb2dhdGVzfSIKK2Jsb2NrX2hpZ2hfc3Vycm9nYXRlcz0iXFxwe0lzSGlnaFN1cnJvZ2F0ZXN9IgorYmxvY2tfaGlyYWdhbmE9IlxccHtJc0hpcmFnYW5hfSIKK2Jsb2NrX2lwYV9leHRlbnNpb25zPSJcXHB7SXNJUEFFeHRlbnNpb25zfSIKK2Jsb2NrX2lkZW9ncmFwaGljX2Rlc2NyaXB0aW9uX2NoYXJhY3RlcnM9IlxccHtJc0lkZW9ncmFwaGljRGVzY3JpcHRpb25DaGFyYWN0ZXJzfSIKK2Jsb2NrX2thbmJ1bj0iXFxwe0lzS2FuYnVufSIKK2Jsb2NrX2thbmd4aV9yYWRpY2Fscz0iXFxwe0lzS2FuZ3hpUmFkaWNhbHN9IgorYmxvY2tfa2FubmFkYT0iXFxwe0lzS2FubmFkYX0iCitibG9ja19rYXRha2FuYT0iXFxwe0lzS2F0YWthbmF9IgorYmxvY2tfa2F0YWthbmFfcGhvbmV0aWNfZXh0ZW5zaW9ucz0iXFxwe0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnN9IgorYmxvY2tfa2htZXI9IlxccHtJc0tobWVyfSIKK2Jsb2NrX2tobWVyX3N5bWJvbHM9IlxccHtJc0tobWVyU3ltYm9sc30iCitibG9ja19sYW89IlxccHtJc0xhb30iCitibG9ja19sYXRpbjFTdXBwbGVtZW50PSJcXHB7SXNMYXRpbjFTdXBwbGVtZW50fSIKK2Jsb2NrX2xhdGluX2V4dGVuZGVkX2E9IlxccHtJc0xhdGluRXh0ZW5kZWRBfSIKK2Jsb2NrX2xhdGluX2V4dGVuZGVkX2I9IlxccHtJc0xhdGluRXh0ZW5kZWRCfSIKK2Jsb2NrX2xhdGluX2V4dGVuZGVkX2FkZGl0aW9uYWw9IlxccHtJc0xhdGluRXh0ZW5kZWRBZGRpdGlvbmFsfSIKK2Jsb2NrX2xldHRlcmxpa2Vfc3ltYm9scz0iXFxwe0lzTGV0dGVybGlrZVN5bWJvbHN9IgorYmxvY2tfbGltYnU9IlxccHtJc0xpbWJ1fSIKK2Jsb2NrX2xpbmVhcl9iX2lkZW9ncmFtcz0iXFxwe0lzTGluZWFyQklkZW9ncmFtc30iCitibG9ja19saW5lYXJfYl9zeWxsYWJhcnk9IlxccHtJc0xpbmVhckJTeWxsYWJhcnl9IgorYmxvY2tfbG93X3N1cnJvZ2F0ZXM9IlxccHtJc0xvd1N1cnJvZ2F0ZXN9IgorYmxvY2tfbWFsYXlhbGFtPSJcXHB7SXNNYWxheWFsYW19IgorYmxvY2tfbWF0aGVtYXRpY2FsX2FscGhhbnVtZXJpY19zeW1ib2xzPSJcXHB7SXNNYXRoZW1hdGljYWxBbHBoYW51bWVyaWNTeW1ib2xzfSIKK2Jsb2NrX21hdGhlbWF0aWNhbF9vcGVyYXRvcnM9IlxccHtJc01hdGhlbWF0aWNhbE9wZXJhdG9yc30iCitibG9ja19taXNjZWxsYW5lb3VzX21hdGhlbWF0aWNhbF9zeW1ib2xzX2E9IlxccHtJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQX0iCitibG9ja19taXNjZWxsYW5lb3VzX21hdGhlbWF0aWNhbF9zeW1ib2xzX2I9IlxccHtJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQn0iCitibG9ja19taXNjZWxsYW5lb3VzX3N5bWJvbHM9IlxccHtJc01pc2NlbGxhbmVvdXNTeW1ib2xzfSIKK2Jsb2NrX21pc2NlbGxhbmVvdXNfc3ltYm9sc2FuZF9hcnJvd3M9IlxccHtJc01pc2NlbGxhbmVvdXNTeW1ib2xzYW5kQXJyb3dzfSIKK2Jsb2NrX21pc2NlbGxhbmVvdXNfdGVjaG5pY2FsPSJcXHB7SXNNaXNjZWxsYW5lb3VzVGVjaG5pY2FsfSIKK2Jsb2NrX21vbmdvbGlhbj0iXFxwe0lzTW9uZ29saWFufSIKK2Jsb2NrX211c2ljYWxfc3ltYm9scz0iXFxwe0lzTXVzaWNhbFN5bWJvbHN9IgorYmxvY2tfbXlhbm1hcj0iXFxwe0lzTXlhbm1hcn0iCitibG9ja19udW1iZXJfZm9ybXM9IlxccHtJc051bWJlckZvcm1zfSIKK2Jsb2NrX29naGFtPSJcXHB7SXNPZ2hhbX0iCitibG9ja19vbGRfaXRhbGljPSJcXHB7SXNPbGRJdGFsaWN9IgorYmxvY2tfb3B0aWNhbF9jaGFyYWN0ZXJfcmVjb2duaXRpb249IlxccHtJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbn0iCitibG9ja19vcml5YT0iXFxwe0lzT3JpeWF9IgorYmxvY2tfb3NtYW55YT0iXFxwe0lzT3NtYW55YX0iCitibG9ja19waG9uZXRpY19leHRlbnNpb25zPSJcXHB7SXNQaG9uZXRpY0V4dGVuc2lvbnN9IgorYmxvY2tfcHJpdmF0ZV91c2U9IlxccHtJc1ByaXZhdGVVc2V9IgorYmxvY2tfcHJpdmF0ZV91c2VfYXJlYT0iXFxwe0lzUHJpdmF0ZVVzZUFyZWF9IgorYmxvY2tfcnVuaWM9IlxccHtJc1J1bmljfSIKK2Jsb2NrX3NoYXZpYW49IlxccHtJc1NoYXZpYW59IgorYmxvY2tfc2luaGFsYT0iXFxwe0lzU2luaGFsYX0iCitibG9ja19zbWFsbF9mb3JtX3ZhcmlhbnRzPSJcXHB7SXNTbWFsbEZvcm1WYXJpYW50c30iCitibG9ja19zcGFjaW5nX21vZGlmaWVyX2xldHRlcnM9IlxccHtJc1NwYWNpbmdNb2RpZmllckxldHRlcnN9IgorYmxvY2tfc3BlY2lhbHM9IlxccHtJc1NwZWNpYWxzfSIKK2Jsb2NrX3N1cGVyc2NyaXB0c2FuZF9zdWJzY3JpcHRzPSJcXHB7SXNTdXBlcnNjcmlwdHNhbmRTdWJzY3JpcHRzfSIKK2Jsb2NrX3N1cHBsZW1lbnRhbF9hcnJvd3NfYT0iXFxwe0lzU3VwcGxlbWVudGFsQXJyb3dzQX0iCitibG9ja19zdXBwbGVtZW50YWxfYXJyb3dzX2I9IlxccHtJc1N1cHBsZW1lbnRhbEFycm93c0J9IgorYmxvY2tfc3VwcGxlbWVudGFsX21hdGhlbWF0aWNhbF9vcGVyYXRvcnM9IlxccHtJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9yc30iCitibG9ja19zdXBwbGVtZW50YXJ5X3ByaXZhdGVfdXNlX2FyZWFfYT0iXFxwe0lzU3VwcGxlbWVudGFyeVByaXZhdGVVc2VBcmVhQX0iCitibG9ja19zdXBwbGVtZW50YXJ5X3ByaXZhdGVfdXNlX2FyZWFfYj0iXFxwe0lzU3VwcGxlbWVudGFyeVByaXZhdGVVc2VBcmVhQn0iCitibG9ja19zeXJpYWM9IlxccHtJc1N5cmlhY30iCitibG9ja190YWdhbG9nPSJcXHB7SXNUYWdhbG9nfSIKK2Jsb2NrX3RhZ2JhbndhPSJcXHB7SXNUYWdiYW53YX0iCitibG9ja190YWdzPSJcXHB7SXNUYWdzfSIKK2Jsb2NrX3RhaV9sZT0iXFxwe0lzVGFpTGV9IgorYmxvY2tfdGFpX3h1YW5famluZ19zeW1ib2xzPSJcXHB7SXNUYWlYdWFuSmluZ1N5bWJvbHN9IgorYmxvY2tfdGFtaWw9IlxccHtJc1RhbWlsfSIKK2Jsb2NrX3RlbHVndT0iXFxwe0lzVGVsdWd1fSIKK2Jsb2NrX3RoYWFuYT0iXFxwe0lzVGhhYW5hfSIKK2Jsb2NrX3RoYWk9IlxccHtJc1RoYWl9IgorYmxvY2tfdGliZXRhbj0iXFxwe0lzVGliZXRhbn0iCitibG9ja191Z2FyaXRpYz0iXFxwe0lzVWdhcml0aWN9IgorYmxvY2tfdW5pZmllZF9jYW5hZGlhbl9hYm9yaWdpbmFsX3N5bGxhYmljcz0iXFxwe0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljc30iCitibG9ja192YXJpYXRpb25fc2VsZWN0b3JzPSJcXHB7SXNWYXJpYXRpb25TZWxlY3RvcnN9IgorYmxvY2tfdmFyaWF0aW9uX3NlbGVjdG9yc19zdXBwbGVtZW50PSJcXHB7SXNWYXJpYXRpb25TZWxlY3RvcnNTdXBwbGVtZW50fSIKK2Jsb2NrX3lpX3JhZGljYWxzPSJcXHB7SXNZaVJhZGljYWxzfSIKK2Jsb2NrX3lpX3N5bGxhYmxlcz0iXFxwe0lzWWlTeWxsYWJsZXN9IgorYmxvY2tfeWlqaW5nX2hleGFncmFtX3N5bWJvbHM9IlxccHtJc1lpamluZ0hleGFncmFtU3ltYm9sc30iCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2NoZW1hLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2NoZW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5YmZmZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zY2hlbWEuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogc2NoZW1hLmM6IGEgbGliRnV6emVyIHRhcmdldCB0byB0ZXN0IHRoZSBYTUwgU2NoZW1hIHByb2Nlc3Nvci4KKyAqCisgKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCisgKi8KKworI2luY2x1ZGUgPGxpYnhtbC9jYXRhbG9nLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbHNjaGVtYXMuaD4KKyNpbmNsdWRlICJmdXp6LmgiCisKK2ludAorTExWTUZ1enplckluaXRpYWxpemUoaW50ICphcmdjIEFUVFJJQlVURV9VTlVTRUQsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICoqKmFyZ3YgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHhtbEluaXRQYXJzZXIoKTsKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisgICAgeG1sSW5pdGlhbGl6ZUNhdGFsb2coKTsKKyNlbmRpZgorICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMoTlVMTCwgeG1sRnV6ekVycm9yRnVuYyk7CisgICAgeG1sU2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoeG1sRnV6ekVudGl0eUxvYWRlcik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBwY3R4dDsKKworICAgIGlmIChzaXplID4gNTAwMDApCisgICAgICAgIHJldHVybigwKTsKKworICAgIHhtbEZ1enpEYXRhSW5pdChkYXRhLCBzaXplKTsKKyAgICB4bWxGdXp6UmVhZEVudGl0aWVzKCk7CisKKyAgICBwY3R4dCA9IHhtbFNjaGVtYU5ld1BhcnNlckN0eHQoeG1sRnV6ek1haW5VcmwoKSk7CisgICAgeG1sU2NoZW1hU2V0UGFyc2VyRXJyb3JzKHBjdHh0LCB4bWxGdXp6RXJyb3JGdW5jLCB4bWxGdXp6RXJyb3JGdW5jLCBOVUxMKTsKKyAgICB4bWxTY2hlbWFGcmVlKHhtbFNjaGVtYVBhcnNlKHBjdHh0KSk7CisgICAgeG1sU2NoZW1hRnJlZVBhcnNlckN0eHQocGN0eHQpOworCisgICAgeG1sRnV6ekRhdGFDbGVhbnVwKCk7CisgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKworICAgIHJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NjaGVtYS5kaWN0IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NjaGVtYS5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGZkMzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2NoZW1hLmRpY3QKQEAgLTAsMCArMSw1NSBAQAorIyBUT0RPOiBBZGQgbW9yZSBsYW5ndWFnZSBlbGVtZW50cworCit4c19hbm5vdGF0aW9uPSI8eHM6YW5ub3RhdGlvbj48L3hzOmFubm90YXRpb24+IgorCit4c19hdHRyaWJ1dGU9Ijx4czphdHRyaWJ1dGUgbmFtZT0nYSc+PC94czphdHRyaWJ1dGU+IgoreHNfYXR0cmlidXRlX3JlcXVpcmVkPSI8eHM6YXR0cmlidXRlIG5hbWU9J2EnIHVzZT0ncmVxdWlyZWQnPjwveHM6YXR0cmlidXRlPiIKK3hzX2VsZW1lbnQ9Ijx4czplbGVtZW50IG5hbWU9J2UnPjwveHM6ZWxlbWVudD4iCisKKyMgUHJpbWl0aXZlIGRhdGF0eXBlcwordHlwZV9zdHJpbmc9IiB0eXBlPSd4czpzdHJpbmcnIgordHlwZV9ib29sZWFuPSIgdHlwZT0neHM6Ym9vbGVhbiciCit0eXBlX2RlY2ltYWw9IiB0eXBlPSd4czpkZWNpbWFsJyIKK3R5cGVfZmxvYXQ9IiB0eXBlPSd4czpmbG9hdCciCit0eXBlX2RvdWJsZT0iIHR5cGU9J3hzOmRvdWJsZSciCit0eXBlX2RhdGVfdGltZT0iIHR5cGU9J3hzOmRhdGVUaW1lJyIKK3R5cGVfdGltZT0iIHR5cGU9J3hzOnRpbWUnIgordHlwZV9kYXRlPSIgdHlwZT0neHM6ZGF0ZSciCit0eXBlX2dfeWVhcl9tb250aD0iIHR5cGU9J3hzOmdZZWFyTW9udGgnIgordHlwZV9nX3llYXI9IiB0eXBlPSd4czpnWWVhciciCit0eXBlX2dfbW9udGhfZGF5PSIgdHlwZT0neHM6Z01vbnRoRGF5JyIKK3R5cGVfZ19kYXk9IiB0eXBlPSd4czpnRGF5JyIKK3R5cGVfZ19tb250aD0iIHR5cGU9J3hzOmdNb250aCciCit0eXBlX2hleF9iaW5hcnk9IiB0eXBlPSd4czpoZXhCaW5hcnknIgordHlwZV9iYXNlNjRfYmluYXJ5PSIgdHlwZT0neHM6YmFzZTY0QmluYXJ5JyIKK3R5cGVfYW55X3VyaT0iIHR5cGU9J3hzOmFueVVSSSciCit0eXBlX3FuYW1lPSIgdHlwZT0neHM6UU5hbWUnIgordHlwZV9ub3RhdGlvbj0iIHR5cGU9J3hzOk5PVEFUSU9OJyIKKworIyBPY2N1cnMKK29jY3Vyc19taW49IiBtaW5PY2N1cnM9JzEnIgorb2NjdXJzX21heD0iIG1heE9jY3Vycz0nOSciCitvY2N1cnNfbWF4X3VuYm91bmRlZD0iIG1heE9jY3Vycz0ndW5ib3VuZGVkJyIKKworIyBTaW1wbGUgdHlwZQoreHNfcmVzdHJpY3Rpb25faW50ZWdlcj0iPHhzOnNpbXBsZVR5cGU+PHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmludGVnZXInPjwveHM6cmVzdHJpY3Rpb24+PC94czpzaW1wbGVUeXBlPiIKK3hzX3Jlc3RyaWN0aW9uX3N0cmluZz0iPHhzOnNpbXBsZVR5cGU+PHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+PC94czpyZXN0cmljdGlvbj48L3hzOnNpbXBsZVR5cGU+IgoreHNfbGlzdD0iPHhzOnNpbXBsZVR5cGU+PHhzOmxpc3Q+PC94czpsaXN0PjwveHM6c2ltcGxlVHlwZT4iCit4c191bmlvbj0iPHhzOnNpbXBsZVR5cGU+PHhzOnVuaW9uPjwveHM6dW5pb24+PC94czpzaW1wbGVUeXBlPiIKKworIyBSZXN0cmljdGlvbnMKK3hzX21pbl9leGNsdXNpdmU9Ijx4czptaW5FeGNsdXNpdmUgdmFsdWU9JzAnLz4iCit4c19taW5faW5jbHVzaXZlPSI8eHM6bWluSW5jbHVzaXZlIHZhbHVlPScwJy8+IgoreHNfbWF4X2V4Y2x1c2l2ZT0iPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0nOScvPiIKK3hzX21heF9pbmNsdXNpdmU9Ijx4czptYXhJbmNsdXNpdmUgdmFsdWU9JzknLz4iCit4c190b3RhbF9kaWdpdHM9Ijx4czp0b3RhbERpZ2l0cyB2YWx1ZT0nMycvPiIKK3hzX2ZyYWN0aW9uX2RpZ2l0cz0iPHhzOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSczJy8+IgoreHNfbGVuZ3RoPSI8eHM6bGVuZ3RoIHZhbHVlPSczJy8+IgoreHNfbWluX2xlbmd0aD0iPHhzOm1pbkxlbmd0aCB2YWx1ZT0nMycvPiIKK3hzX21heF9sZW5ndGg9Ijx4czptYXhMZW5ndGggdmFsdWU9JzMnLz4iCit4c19lbnVtZXJhdGlvbj0iPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdhJy8+IgoreHNfd2hpdGVfc3BhY2VfY29sbGFwc2U9Ijx4czp3aGl0ZVNwYWNlIHZhbHVlPSdjb2xsYXBzZScvPiIKK3hzX3doaXRlX3NwYWNlX3ByZXNlcnZlPSI8eHM6d2hpdGVTcGFjZSB2YWx1ZT0ncHJlc2VydmUnLz4iCit4c193aGl0ZV9zcGFjZV9yZXBsYWNlPSI8eHM6d2hpdGVTcGFjZSB2YWx1ZT0ncmVwbGFjZScvPiIKK3hzX3BhdHRlcm49Ijx4czpwYXR0ZXJuIHZhbHVlPSdhJy8+IgorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkNzc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTEwIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAwZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTExIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODNmOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTEyIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRkYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTEzIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU1MGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2JyYW5jaC0xMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5M2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YWY5YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxNzk5OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2ZGI4YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTYgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0Nzc5MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTcgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzNGY3MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3YThmNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTkgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnJhbmNoLTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkMGVlYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9icmFuY2gtOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwYTUwNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTEwIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDY4NWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTExIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmE3OTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTEyIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQxNmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTEzIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTFkNGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTE0IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY0YjQyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTE1IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjNzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTE2IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2M1ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2J1ZzMxNjMzOC0xNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2OGQwNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlMWUwYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNjVhNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmYWE5NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTYgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwMGExNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTcgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZmUxZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4YmI4YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTkgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnMzE2MzM4LTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1NmU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWczMTYzMzgtOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyNjkzMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0ZDJiNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljNzVjYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkNTYxZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3ODU4MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTYgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwNWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTcgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlMTY2MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvYnVnNDIwNTk2LTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NWE5MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9idWc0MjA1OTYtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC0xIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNiZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC0xMCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9jb250ZW50LTEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzE0NTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC0yIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTZiNjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC0zIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNmYzhkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC00IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M1ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC01IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM4NjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC02IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM2ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC03IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODY4ZGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC04IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E4N2QwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvY29udGVudC05IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWYwZDllCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2NvbnRlbnQtOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC0xIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAwMzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC0xMCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9oYXJkLTEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjI4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC0yIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM4YjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC0zIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE2ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC00IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNlODg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC01IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzBhM2VjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC02IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFhN2QwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC03IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE5ZWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC04IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTkxMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvaGFyZC05IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQxZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL2hhcmQtOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4ZWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9uY25hbWUtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiOWI5NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9uY25hbWUtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhNmEwOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9uY25hbWUtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlOTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9uY25hbWUtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvbmNuYW1lLTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyOTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9uY25hbWUtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0NDhmMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTEwIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3Jhbmdlcy0xMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFlZDNjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3Jhbmdlcy0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTExIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3Jhbmdlcy0xMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmViNWRlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3Jhbmdlcy0xMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTEyIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3Jhbmdlcy0xMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzNiYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3Jhbmdlcy0xMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2OWY3YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhM2EwOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3ZTlkYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhZDRhOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTYgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjOTc1OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTcgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4OTAzOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmMGJiNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTkgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzLTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzZmM0MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMtOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDRhOGViCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xMCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMyLTEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTJhYTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xMSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMyLTExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmUxODEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xMiBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC9yYW5nZXMyLTEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0xMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0yIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjZmN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi0zIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U3OGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi00IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDdiNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi01IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDkxNjhkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi02IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJhNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi03IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZiYWZiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi04IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjViZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAvcmFuZ2VzMi05IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNmMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvcmVnZXhwL3JhbmdlczItOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzE3OTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTAgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmNGIwYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4ZTBjYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNDI5NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmY2NkNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3Y2UyYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExMGE4MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTYgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzMDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTcgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkNTQyZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTkgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmZWE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0xOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMiBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTVmYmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjAgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzMDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2YTcwMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0NmY4NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3NTNiZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMTA1YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzZGE0NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjYgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZjhjMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjcgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiYmU0NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YTcwOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjkgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0ZDRlNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0yOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkN2JlODUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzAgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MWZmMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzEgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4N2IwZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzIgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjYWMzMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllM2ZjZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1YTNkNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzUgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtMzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyYTcwYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC0zNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzE4YzUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC01Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YWQ4OGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNiBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC02Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Nzg3NzIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC03Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWFkODUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtOCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC04Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTIwY2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtOSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei9zZWVkL3JlZ2V4cC94cGF0aC05Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzdjZTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC9yZWdleHAveHBhdGgtOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC91cmkvZG90IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvdXJpL2RvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVjOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvdXJpL2RvdApAQCAtMCwwICsxIEBACisuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvdXJpL2Z1bGwgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovc2VlZC91cmkvZnVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhlNThhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3NlZWQvdXJpL2Z1bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3Rlc3RGdXp6ZXIuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei90ZXN0RnV6emVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjN2ZmYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei90ZXN0RnV6emVyLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiB0ZXN0RnV6emVyLmM6IFRlc3QgcHJvZ3JhbSBmb3IgdGhlIGN1c3RvbSBlbnRpdHkgbG9hZGVyIHVzZWQgdG8gZnV6egorICogd2l0aCBtdWx0aXBsZSBpbnB1dHMuCisgKgorICogU2VlIENvcHlyaWdodCBmb3IgdGhlIHN0YXR1cyBvZiB0aGlzIHNvZnR3YXJlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbG9iLmg+CisjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgorI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbHN0cmluZy5oPgorI2luY2x1ZGUgImZ1enouaCIKKworI2lmZGVmIEhBVkVfSFRNTF9GVVpaRVIKKyAgI2RlZmluZSBMTFZNRnV6emVySW5pdGlhbGl6ZSBmdXp6SHRtbEluaXQKKyAgI2RlZmluZSBMTFZNRnV6emVyVGVzdE9uZUlucHV0IGZ1enpIdG1sCisgICNpbmNsdWRlICJodG1sLmMiCisgICN1bmRlZiBMTFZNRnV6emVySW5pdGlhbGl6ZQorICAjdW5kZWYgTExWTUZ1enplclRlc3RPbmVJbnB1dAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1JFR0VYUF9GVVpaRVIKKyAgI2RlZmluZSBMTFZNRnV6emVySW5pdGlhbGl6ZSBmdXp6UmVnZXhwSW5pdAorICAjZGVmaW5lIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQgZnV6elJlZ2V4cAorICAjaW5jbHVkZSAicmVnZXhwLmMiCisgICN1bmRlZiBMTFZNRnV6emVySW5pdGlhbGl6ZQorICAjdW5kZWYgTExWTUZ1enplclRlc3RPbmVJbnB1dAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NDSEVNQV9GVVpaRVIKKyAgI2RlZmluZSBMTFZNRnV6emVySW5pdGlhbGl6ZSBmdXp6U2NoZW1hSW5pdAorICAjZGVmaW5lIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQgZnV6elNjaGVtYQorICAjaW5jbHVkZSAic2NoZW1hLmMiCisgICN1bmRlZiBMTFZNRnV6emVySW5pdGlhbGl6ZQorICAjdW5kZWYgTExWTUZ1enplclRlc3RPbmVJbnB1dAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VSSV9GVVpaRVIKKyAgI2RlZmluZSBMTFZNRnV6emVySW5pdGlhbGl6ZSBmdXp6VXJpSW5pdAorICAjZGVmaW5lIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQgZnV6elVyaQorICAjaW5jbHVkZSAidXJpLmMiCisgICN1bmRlZiBMTFZNRnV6emVySW5pdGlhbGl6ZQorICAjdW5kZWYgTExWTUZ1enplclRlc3RPbmVJbnB1dAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1hNTF9GVVpaRVIKKyAgI2RlZmluZSBMTFZNRnV6emVySW5pdGlhbGl6ZSBmdXp6WG1sSW5pdAorICAjZGVmaW5lIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQgZnV6elhtbAorICAjaW5jbHVkZSAieG1sLmMiCisgICN1bmRlZiBMTFZNRnV6emVySW5pdGlhbGl6ZQorICAjdW5kZWYgTExWTUZ1enplclRlc3RPbmVJbnB1dAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1hQQVRIX0ZVWlpFUgorICAjZGVmaW5lIExMVk1GdXp6ZXJJbml0aWFsaXplIGZ1enpYUGF0aEluaXQKKyAgI2RlZmluZSBMTFZNRnV6emVyVGVzdE9uZUlucHV0IGZ1enpYUGF0aAorICAjaW5jbHVkZSAieHBhdGguYyIKKyAgI3VuZGVmIExMVk1GdXp6ZXJJbml0aWFsaXplCisgICN1bmRlZiBMTFZNRnV6emVyVGVzdE9uZUlucHV0CisjZW5kaWYKKwordHlwZWRlZiBpbnQKKygqaW5pdEZ1bmMpKGludCAqYXJnYywgY2hhciAqKiphcmd2KTsKK3R5cGVkZWYgaW50CisoKmZ1enpGdW5jKShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKK2ludCBudW1JbnB1dHM7CisKK3N0YXRpYyBpbnQKK3Rlc3RGdXp6ZXIoaW5pdEZ1bmMgaW5pdCwgZnV6ekZ1bmMgZnV6eiwgY29uc3QgY2hhciAqcGF0dGVybikgeworICAgIGdsb2JfdCBnbG9iYnVmOworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgaTsKKworICAgIGlmIChnbG9iKHBhdHRlcm4sIDAsIE5VTEwsICZnbG9iYnVmKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGF0dGVybiAlcyBtYXRjaGVzIG5vIGZpbGVzXG4iLCBwYXR0ZXJuKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBpZiAoaW5pdCAhPSBOVUxMKQorICAgICAgICBpbml0KE5VTEwsIE5VTEwpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdsb2JidWYuZ2xfcGF0aGM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2xvYmJ1Zi5nbF9wYXRodltpXTsKKyAgICAgICAgY2hhciAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisKKyAgICAgICAgZGF0YSA9IHhtbFNsdXJwRmlsZShwYXRoLCAmc2l6ZSk7CisgICAgICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgcmVhZCAlc1xuIiwgcGF0aCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGZ1enooZGF0YSwgc2l6ZSk7CisgICAgICAgIHhtbEZyZWUoZGF0YSk7CisKKyAgICAgICAgbnVtSW5wdXRzKys7CisgICAgfQorCisgICAgcmV0ID0gMDsKK2Vycm9yOgorICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKKyAgICByZXR1cm4ocmV0KTsKK30KKworI2lmZGVmIEhBVkVfWE1MX0ZVWlpFUgorc3RhdGljIGludAordGVzdEVudGl0eUxvYWRlcigpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBkYXRhW10gPQorICAgICAgICAiZG9jLnhtbFxcXG4iCisgICAgICAgICI8IURPQ1RZUEUgZG9jIFNZU1RFTSBcImRvYy5kdGRcIj5cbiIKKyAgICAgICAgIjxkb2M+JmVudDs8L2RvYz5cXFxuIgorICAgICAgICAiZG9jLmR0ZFxcXG4iCisgICAgICAgICI8IUVMRU1FTlQgZG9jICgjUENEQVRBKT5cbiIKKyAgICAgICAgIjwhRU5USVRZIGVudCBTWVNURU0gXCJlbnQudHh0XCI+XFxcbiIKKyAgICAgICAgImVudC50eHRcXFxuIgorICAgICAgICAiSGVsbG8sIHdvcmxkIVxcXG4iOworICAgIHN0YXRpYyB4bWxDaGFyIGV4cGVjdGVkW10gPQorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNIFwiZG9jLmR0ZFwiPlxuIgorICAgICAgICAiPGRvYz5IZWxsbywgd29ybGQhPC9kb2M+XG4iOworICAgIGNvbnN0IGNoYXIgKmRvY0J1ZmZlcjsKKyAgICBzaXplX3QgZG9jU2l6ZTsKKyAgICB4bWxEb2NQdHIgZG9jOworICAgIHhtbENoYXIgKm91dDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKHhtbEZ1enpFbnRpdHlMb2FkZXIpOworCisgICAgeG1sRnV6ekRhdGFJbml0KGRhdGEsIHNpemVvZihkYXRhKSAtIDEpOworICAgIHhtbEZ1enpSZWFkRW50aXRpZXMoKTsKKyAgICBkb2NCdWZmZXIgPSB4bWxGdXp6TWFpbkVudGl0eSgmZG9jU2l6ZSk7CisgICAgZG9jID0geG1sUmVhZE1lbW9yeShkb2NCdWZmZXIsIGRvY1NpemUsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBYTUxfUEFSU0VfTk9FTlQgfCBYTUxfUEFSU0VfRFRETE9BRCk7CisKKyAgICB4bWxEb2NEdW1wTWVtb3J5KGRvYywgJm91dCwgTlVMTCk7CisgICAgaWYgKHhtbFN0cmNtcChvdXQsIGV4cGVjdGVkKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXhwZWN0ZWQ6XG4lc0dvdDpcbiVzIiwgZXhwZWN0ZWQsIG91dCk7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorCisgICAgeG1sRnJlZShvdXQpOworICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICB4bWxGdXp6RGF0YUNsZWFudXAoKTsKKworICAgIHJldHVybihyZXQpOworfQorI2VuZGlmCisKK2ludAorbWFpbigpIHsKKyAgICBpbnQgcmV0ID0gMDsKKworI2lmZGVmIEhBVkVfWE1MX0ZVWlpFUgorICAgIGlmICh0ZXN0RW50aXR5TG9hZGVyKCkgIT0gMCkKKyAgICAgICAgcmV0ID0gMTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfSFRNTF9GVVpaRVIKKyAgICBpZiAodGVzdEZ1enplcihmdXp6SHRtbEluaXQsIGZ1enpIdG1sLCAic2VlZC9odG1sLyoiKSAhPSAwKQorICAgICAgICByZXQgPSAxOworI2VuZGlmCisjaWZkZWYgSEFWRV9SRUdFWFBfRlVaWkVSCisgICAgaWYgKHRlc3RGdXp6ZXIoZnV6elJlZ2V4cEluaXQsIGZ1enpSZWdleHAsICJzZWVkL3JlZ2V4cC8qIikgIT0gMCkKKyAgICAgICAgcmV0ID0gMTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU0NIRU1BX0ZVWlpFUgorICAgIGlmICh0ZXN0RnV6emVyKGZ1enpTY2hlbWFJbml0LCBmdXp6U2NoZW1hLCAic2VlZC9zY2hlbWEvKiIpICE9IDApCisgICAgICAgIHJldCA9IDE7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VSSV9GVVpaRVIKKyAgICBpZiAodGVzdEZ1enplcihOVUxMLCBmdXp6VXJpLCAic2VlZC91cmkvKiIpICE9IDApCisgICAgICAgIHJldCA9IDE7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1hNTF9GVVpaRVIKKyAgICBpZiAodGVzdEZ1enplcihmdXp6WG1sSW5pdCwgZnV6elhtbCwgInNlZWQveG1sLyoiKSAhPSAwKQorICAgICAgICByZXQgPSAxOworI2VuZGlmCisjaWZkZWYgSEFWRV9YUEFUSF9GVVpaRVIKKyAgICBpZiAodGVzdEZ1enplcihmdXp6WFBhdGhJbml0LCBmdXp6WFBhdGgsICJzZWVkL3hwYXRoLyoiKSAhPSAwKQorICAgICAgICByZXQgPSAxOworI2VuZGlmCisKKyAgICBpZiAocmV0ID09IDApCisgICAgICAgIHByaW50ZigiU3VjY2Vzc2Z1bGx5IHRlc3RlZCAlZCBpbnB1dHNcbiIsIG51bUlucHV0cyk7CisKKyAgICByZXR1cm4ocmV0KTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3VyaS5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3VyaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGMwOTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enovdXJpLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIHVyaS5jOiBhIGxpYkZ1enplciB0YXJnZXQgdG8gdGVzdCB0aGUgVVJJIG1vZHVsZS4KKyAqCisgKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCisgKi8KKworI2luY2x1ZGUgPGxpYnhtbC91cmkuaD4KKyNpbmNsdWRlICJmdXp6LmgiCisKK2ludAorTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHhtbFVSSVB0ciB1cmk7CisgICAgY2hhciAqc3RyWzJdID0geyBOVUxMLCBOVUxMIH07CisgICAgc2l6ZV90IG51bVN0cmluZ3M7CisKKyAgICBpZiAoc2l6ZSA+IDEwMDAwKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBudW1TdHJpbmdzID0geG1sRnV6ekV4dHJhY3RTdHJpbmdzKGRhdGEsIHNpemUsIHN0ciwgMik7CisKKyAgICB1cmkgPSB4bWxQYXJzZVVSSShzdHJbMF0pOworICAgIHhtbEZyZWUoeG1sU2F2ZVVyaSh1cmkpKTsKKyAgICB4bWxGcmVlVVJJKHVyaSk7CisKKyAgICB1cmkgPSB4bWxQYXJzZVVSSVJhdyhzdHJbMF0sIDEpOworICAgIHhtbEZyZWUoeG1sU2F2ZVVyaSh1cmkpKTsKKyAgICB4bWxGcmVlVVJJKHVyaSk7CisKKyAgICB4bWxGcmVlKHhtbFVSSVVuZXNjYXBlU3RyaW5nKHN0clswXSwgLTEsIE5VTEwpKTsKKyAgICB4bWxGcmVlKHhtbFVSSUVzY2FwZShCQURfQ0FTVCBzdHJbMF0pKTsKKyAgICB4bWxGcmVlKHhtbENhbm9uaWNQYXRoKEJBRF9DQVNUIHN0clswXSkpOworICAgIHhtbEZyZWUoeG1sUGF0aFRvVVJJKEJBRF9DQVNUIHN0clswXSkpOworCisgICAgaWYgKG51bVN0cmluZ3MgPj0gMikgeworICAgICAgICB4bWxGcmVlKHhtbEJ1aWxkVVJJKEJBRF9DQVNUIHN0clsxXSwgQkFEX0NBU1Qgc3RyWzBdKSk7CisgICAgICAgIHhtbEZyZWUoeG1sQnVpbGRSZWxhdGl2ZVVSSShCQURfQ0FTVCBzdHJbMV0sIEJBRF9DQVNUIHN0clswXSkpOworICAgICAgICB4bWxGcmVlKHhtbFVSSUVzY2FwZVN0cihCQURfQ0FTVCBzdHJbMF0sIEJBRF9DQVNUIHN0clsxXSkpOworICAgIH0KKworICAgIC8qIE1vZGlmaWVzIHN0cmluZywgc28gbXVzdCBjb21lIGxhc3QuICovCisgICAgeG1sTm9ybWFsaXplVVJJUGF0aChzdHJbMF0pOworCisgICAgeG1sRnJlZShzdHJbMF0pOworICAgIHhtbEZyZWUoc3RyWzFdKTsKKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enoveG1sLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enoveG1sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0YzRlZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei94bWwuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIHhtbC5jOiBhIGxpYkZ1enplciB0YXJnZXQgdG8gdGVzdCBzZXZlcmFsIFhNTCBwYXJzZXIgaW50ZXJmYWNlcy4KKyAqCisgKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCisgKi8KKworI2luY2x1ZGUgPGxpYnhtbC9jYXRhbG9nLmg+CisjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgorI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbGVycm9yLmg+CisjaW5jbHVkZSA8bGlieG1sL3hpbmNsdWRlLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbHJlYWRlci5oPgorI2luY2x1ZGUgImZ1enouaCIKKworaW50CitMTFZNRnV6emVySW5pdGlhbGl6ZShpbnQgKmFyZ2MgQVRUUklCVVRFX1VOVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKioqYXJndiBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgeG1sSW5pdFBhcnNlcigpOworI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKKyAgICB4bWxJbml0aWFsaXplQ2F0YWxvZygpOworI2VuZGlmCisgICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyhOVUxMLCB4bWxGdXp6RXJyb3JGdW5jKTsKKyAgICB4bWxTZXRFeHRlcm5hbEVudGl0eUxvYWRlcih4bWxGdXp6RW50aXR5TG9hZGVyKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK0xMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1heENodW5rU2l6ZSA9IDEyODsKKyAgICB4bWxEb2NQdHIgZG9jOworICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsKKyAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsKKyAgICB4bWxDaGFyICpvdXQ7CisgICAgY29uc3QgY2hhciAqZG9jQnVmZmVyLCAqZG9jVXJsOworICAgIHNpemVfdCBtYXhTaXplLCBkb2NTaXplLCBjb25zdW1lZCwgY2h1bmtTaXplOworICAgIGludCBvcHRzLCBvdXRTaXplOworCisgICAgeG1sRnV6ekRhdGFJbml0KGRhdGEsIHNpemUpOworICAgIG9wdHMgPSB4bWxGdXp6UmVhZEludCgpOworCisgICAgLyogTG93ZXIgbWF4aW11bSBzaXplIHdoZW4gcHJvY2Vzc2luZyBlbnRpdGllcyBmb3Igbm93LiAqLworICAgIG1heFNpemUgPSBvcHRzICYgWE1MX1BBUlNFX05PRU5UID8gNTAwMDAgOiA1MDAwMDA7CisgICAgaWYgKHNpemUgPiBtYXhTaXplKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICB4bWxGdXp6UmVhZEVudGl0aWVzKCk7CisgICAgZG9jQnVmZmVyID0geG1sRnV6ek1haW5FbnRpdHkoJmRvY1NpemUpOworICAgIGRvY1VybCA9IHhtbEZ1enpNYWluVXJsKCk7CisgICAgaWYgKGRvY0J1ZmZlciA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAvKiBQdWxsIHBhcnNlciAqLworCisgICAgZG9jID0geG1sUmVhZE1lbW9yeShkb2NCdWZmZXIsIGRvY1NpemUsIGRvY1VybCwgTlVMTCwgb3B0cyk7CisgICAgaWYgKG9wdHMgJiBYTUxfUEFSU0VfWElOQ0xVREUpCisgICAgICAgIHhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKGRvYywgb3B0cyk7CisgICAgLyogQWxzbyB0ZXN0IHRoZSBzZXJpYWxpemVyLiAqLworICAgIHhtbERvY0R1bXBNZW1vcnkoZG9jLCAmb3V0LCAmb3V0U2l6ZSk7CisgICAgeG1sRnJlZShvdXQpOworICAgIHhtbEZyZWVEb2MoZG9jKTsKKworICAgIC8qIFB1c2ggcGFyc2VyICovCisKKyAgICBjdHh0ID0geG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQoTlVMTCwgTlVMTCwgTlVMTCwgMCwgZG9jVXJsKTsKKyAgICBpZiAoY3R4dCA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgeG1sQ3R4dFVzZU9wdGlvbnMoY3R4dCwgb3B0cyk7CisKKyAgICBmb3IgKGNvbnN1bWVkID0gMDsgY29uc3VtZWQgPCBkb2NTaXplOyBjb25zdW1lZCArPSBjaHVua1NpemUpIHsKKyAgICAgICAgY2h1bmtTaXplID0gZG9jU2l6ZSAtIGNvbnN1bWVkOworICAgICAgICBpZiAoY2h1bmtTaXplID4gbWF4Q2h1bmtTaXplKQorICAgICAgICAgICAgY2h1bmtTaXplID0gbWF4Q2h1bmtTaXplOworICAgICAgICB4bWxQYXJzZUNodW5rKGN0eHQsIGRvY0J1ZmZlciArIGNvbnN1bWVkLCBjaHVua1NpemUsIDApOworICAgIH0KKworICAgIHhtbFBhcnNlQ2h1bmsoY3R4dCwgTlVMTCwgMCwgMSk7CisgICAgaWYgKG9wdHMgJiBYTUxfUEFSU0VfWElOQ0xVREUpCisgICAgICAgIHhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKGN0eHQtPm15RG9jLCBvcHRzKTsKKyAgICB4bWxGcmVlRG9jKGN0eHQtPm15RG9jKTsKKyAgICB4bWxGcmVlUGFyc2VyQ3R4dChjdHh0KTsKKworICAgIC8qIFJlYWRlciAqLworCisgICAgcmVhZGVyID0geG1sUmVhZGVyRm9yTWVtb3J5KGRvY0J1ZmZlciwgZG9jU2l6ZSwgTlVMTCwgTlVMTCwgb3B0cyk7CisgICAgaWYgKHJlYWRlciA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgd2hpbGUgKHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcikgPT0gMSkgeworICAgICAgICBpZiAoeG1sVGV4dFJlYWRlck5vZGVUeXBlKHJlYWRlcikgPT0gWE1MX0VMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgaW50IGksIG4gPSB4bWxUZXh0UmVhZGVyQXR0cmlidXRlQ291bnQocmVhZGVyKTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPG47IGkrKykgeworICAgICAgICAgICAgICAgIHhtbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVObyhyZWFkZXIsIGkpOworICAgICAgICAgICAgICAgIHdoaWxlICh4bWxUZXh0UmVhZGVyUmVhZEF0dHJpYnV0ZVZhbHVlKHJlYWRlcikgPT0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeG1sRnJlZVRleHRSZWFkZXIocmVhZGVyKTsKKworZXhpdDoKKyAgICB4bWxGdXp6RGF0YUNsZWFudXAoKTsKKyAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgIHJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3htbC5kaWN0IGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3htbC5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzllNmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enoveG1sLmRpY3QKQEAgLTAsMCArMSw4OSBAQAoreG1sX2RlY2w9Ijw/eG1sIHZlcnNpb249JzEuMCc/PiIKK3htbF9kZWNsX2xhdGluMT0iPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nSVNPLTg4NTktMSc/PiIKKworZWxlbV9zdGFydF9lbmQ9IjxhPjwvYT4iCitlbGVtX2VtcHR5PSI8YS8+IgorZWxlbV9uc19zdGFydF9lbmQ9IjxhOmEgeG1sbnM6YT0nYSc+PC9hOmE+IgorZWxlbV9uc19lbXB0eT0iPGE6YSB4bWxuczphPSdhJy8+IgorCithdHRyPSIgYT0nYSciCisKK25zX2RlY2w9IiB4bWxuczphPSdhJyIKK25zX2RlZmF1bHQ9IiB4bWxucz0nYSciCituc19wcmVmaXg9ImE6IgorCitjZGF0YV9zZWN0aW9uPSI8IVtDREFUQVsgXV0+IgorCitjb21tZW50PSI8IS0tIC0tPiIKKworcGk9Ijw/YT8+IgorCitlbGVtX2RlY2xfYW55PSI8IUVMRU1FTlQgYSBBTlk+IgorZWxlbV9kZWNsX2VtcHR5PSI8IUVMRU1FTlQgYSBFTVBUWT4iCitlbGVtX2RlY2xfY2hpbGRyZW49IjwhRUxFTUVOVCBhIChhKT4iCitlbGVtX2RlY2xfbWl4ZWQ9IjwhRUxFTUVOVCBhICgjUENEQVRBfGEpPiIKK2VsZW1fY2hpbGRyZW5fY2hvaWNlPSJ8YSIKK2VsZW1fY2hpbGRyZW5fc2VxPSIsYSIKK2VsZW1fY2hpbGRyZW5fc3ViX2Nob2ljZT0ifChhKSIKK2VsZW1fY2hpbGRyZW5fc3ViX3NlcT0iLChhKSIKK2VsZW1fcXVhbnRfYW55PSIqIgorZWxlbV9xdWFudF9vcHQ9Ij8iCitlbGVtX3F1YW50X3NvbWU9IisiCisKK2F0dGxpc3RfZGVjbF9jZGF0YV9yZXE9IjwhQVRUTElTVCBhIGEgQ0RBVEEgI1JFUVVJUkVEPiIKK2F0dGxpc3RfZGVjbF9jZGF0YV9pbXA9IjwhQVRUTElTVCBhIGEgQ0RBVEEgI0lNUExJRUQ+IgorYXR0bGlzdF9kZWNsX2NkYXRhX2RlZj0iPCFBVFRMSVNUIGEgYSBDREFUQSAnYSc+IgorYXR0bGlzdF9kZWNsX2NkYXRhX2ZpeD0iPCFBVFRMSVNUIGEgYSBDREFUQSAjRklYRUQgJ2EnPiIKK2F0dGxpc3RfZGVjbF9pZD0iPCFBVFRMSVNUIGEgYSBJRCAjSU1QTElFRD4iCithdHRsaXN0X2RlY2xfaWRyZWY9IjwhQVRUTElTVCBhIGEgSURSRUYgI0lNUExJRUQ+IgorYXR0bGlzdF9kZWNsX2lkcmVmcz0iPCFBVFRMSVNUIGEgYSBJRFJFRlMgI0lNUExJRUQ+IgorYXR0bGlzdF9kZWNsX2VudGl0eT0iPCFBVFRMSVNUIGEgYSBFTlRJVFkgI0lNUExJRUQ+IgorYXR0bGlzdF9kZWNsX2VudGl0aWVzPSI8IUFUVExJU1QgYSBhIEVOVElUSUVTICNJTVBMSUVEPiIKK2F0dGxpc3RfZGVjbF9ubXRva2VuPSI8IUFUVExJU1QgYSBhIE5NVE9LRU4gI0lNUExJRUQ+IgorYXR0bGlzdF9kZWNsX25tdG9rZW5zPSI8IUFUVExJU1QgYSBhIE5NVE9LRU5TICNJTVBMSUVEPiIKK2F0dGxpc3RfZGVjbF9lbnVtPSI8IUFUVExJU1QgYSBhIChhKSAjSU1QTElFRD4iCithdHRsaXN0X2RlY2xfbm90YXRpb249IjwhQVRUTElTVCBhIGEgTk9UQVRJT04gKGEpICNJTVBMSUVEPiIKKworaW5jbHVkZV9zZWN0PSI8IVtJTkNMVURFWyBdXT4iCitpZ25vcmVfc2VjdD0iPCFbSUdOT1JFWyBdXT4iCisKK2dlX2RlY2w9IjwhRU5USVRZIGEgJ2EnPiIKK2dlX2RlY2xfc3lzdGVtPSI8IUVOVElUWSBhIFNZU1RFTSAnYSc+IgorZ2VfZGVjbF9zeXN0ZW1fbmRhdGE9IjwhRU5USVRZIGEgU1lTVEVNICdhJyBOREFUQSBhPiIKK2dlX2RlY2xfcHVibGljPSI8IUVOVElUWSBhIFBVQkxJQyAnYScgJ2EnPiIKK2dlX2RlY2xfcHVibGljX25kYXRhPSI8IUVOVElUWSBhIFBVQkxJQyAnYScgJ2EnIE5EQVRBIGE+IgorCitwZV9kZWNsPSI8IUVOVElUWSAlIGEgJ2EnPiIKK3BlX2RlY2xfc3lzdGVtPSI8IUVOVElUWSAlIGEgU1lTVEVNICdhJz4iCitwZV9kZWNsX3B1YmxpYz0iPCFFTlRJVFkgJSBhIFBVQkxJQyAnYScgJ2EnPiIKKworY2hhcl9yZWZfZGVjPSImIzYwOyIKK2NoYXJfcmVmX2hleD0iJiN4M2M7IgorY2hhcl9yZWZfcXVvdGVkPSImIzM4OyM2MDsiCisKK2dlX3JlZl9sdD0iJmx0OyIKK2dlX3JlZl9ndD0iJmd0OyIKK2dlX3JlZl9hbXA9IiZhbXA7IgorZ2VfcmVmX2Fwb3M9IiZhcG9zOyIKK2dlX3JlZl9xdW90PSImcXVvdDsiCitnZV9yZWY9IiZhOyIKK2dlX3JlZl9xdW90ZWQ9IiYjMzg7YTsiCisKK3BlX3JlZj0iJWE7IgorcGVfcmVmX3F1b3RlZD0iJiMzNzthOyIKKworbm90YXRpb25fZGVjbF9wdWJsaWM9IjwhTk9UQVRJT04gYSBQVUJMSUMgJ2EnPiIKK25vdGF0aW9uX2RlY2xfc3lzdGVtPSI8IU5PVEFUSU9OIGEgU1lTVEVNICdhJz4iCisKK2NzX3V0Zjg9IlVURi04IgorY3NfdXRmMTY9IlVURi0xNiIKK2NzX3V0ZjE2bGU9IlVURi0xNkxFIgorY3NfdXRmMTZiZT0iVVRGLTE2QkUiCitjc191Y3MyPSJVQ1MtMiIKK2NzX3VjczQ9IlVDUy00IgorY3NfbGF0aW4xPSJJU08tODg1OS0xIgorY3NfYXNjaWk9IkFTQ0lJIgorY3NfZWJjZGljPSJFQkNESUMiCitjc19pc28yMDIyanA9IklTTy0yMDIyLUpQIgorY3Nfc2hpZnRfamlzPSJTSElGVF9KSVMiCitjc19ldWNfanA9IkVVQy1KUCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei94cGF0aC5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3hwYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NTJiZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvZnV6ei94cGF0aC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiB4cGF0aC5jOiBhIGxpYkZ1enplciB0YXJnZXQgdG8gdGVzdCBYUGF0aCBhbmQgWFBvaW50ZXIgZXhwcmVzc2lvbnMuCisgKgorICogU2VlIENvcHlyaWdodCBmb3IgdGhlIHN0YXR1cyBvZiB0aGlzIHNvZnR3YXJlLgorICovCisKKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGlieG1sL3hwb2ludGVyLmg+CisjaW5jbHVkZSAiZnV6ei5oIgorCitpbnQKK0xMVk1GdXp6ZXJJbml0aWFsaXplKGludCAqYXJnYyBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqKiphcmd2IEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICB4bWxJbml0UGFyc2VyKCk7CisgICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyhOVUxMLCB4bWxGdXp6RXJyb3JGdW5jKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK0xMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICB4bWxEb2NQdHIgZG9jOworICAgIGNvbnN0IGNoYXIgKmV4cHIsICp4bWw7CisgICAgc2l6ZV90IGV4cHJTaXplLCB4bWxTaXplOworCisgICAgaWYgKHNpemUgPiAxMDAwMCkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgeG1sRnV6ekRhdGFJbml0KGRhdGEsIHNpemUpOworCisgICAgZXhwciA9IHhtbEZ1enpSZWFkU3RyaW5nKCZleHByU2l6ZSk7CisgICAgeG1sID0geG1sRnV6elJlYWRTdHJpbmcoJnhtbFNpemUpOworCisgICAgLyogUmVjb3ZlcnkgbW9kZSBhbGxvd3MgbW9yZSBpbnB1dCB0byBiZSBmdXp6ZWQuICovCisgICAgZG9jID0geG1sUmVhZE1lbW9yeSh4bWwsIHhtbFNpemUsIE5VTEwsIE5VTEwsIFhNTF9QQVJTRV9SRUNPVkVSKTsKKyAgICBpZiAoZG9jICE9IE5VTEwpIHsKKyAgICAgICAgeG1sWFBhdGhDb250ZXh0UHRyIHhwY3R4dCA9IHhtbFhQYXRoTmV3Q29udGV4dChkb2MpOworCisgICAgICAgIC8qIE9wZXJhdGlvbiBsaW1pdCB0byBhdm9pZCB0aW1lb3V0ICovCisgICAgICAgIHhwY3R4dC0+b3BMaW1pdCA9IDUwMDAwMDsKKworICAgICAgICB4bWxYUGF0aEZyZWVPYmplY3QoeG1sWFB0ckV2YWwoQkFEX0NBU1QgZXhwciwgeHBjdHh0KSk7CisgICAgICAgIHhtbFhQYXRoRnJlZUNvbnRleHQoeHBjdHh0KTsKKyAgICB9CisgICAgeG1sRnJlZURvYyhkb2MpOworCisgICAgeG1sRnV6ekRhdGFDbGVhbnVwKCk7CisgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKworICAgIHJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3hwYXRoLmRpY3QgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2Z1enoveHBhdGguZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUzNzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9mdXp6L3hwYXRoLmRpY3QKQEAgLTAsMCArMSw5NCBAQAorIyBYTUwKKworZWxlbV9hPSI8YT48L2E+IgorZWxlbV9iPSI8Yj48L2I+IgorZWxlbV9jPSI8Yz48L2M+IgorZWxlbV9kPSI8ZD48L2Q+IgorZWxlbV9lbXB0eT0iPGEvPiIKK2VsZW1fbnNfYT0iPGE6YSB4bWxuczphPSdhJz48L2E6YT4iCitlbGVtX25zX2I9IjxiOmIgeG1sbnM6Yj0nYic+PC9iOmI+IgorCithdHRyX2E9IiBhPSdhJyIKK2F0dHJfYj0iIGI9J2InIgorCituc19kZWNsPSIgeG1sbnM6YT0nYSciCituc19kZWZhdWx0PSIgeG1sbnM9J2EnIgorbnNfcHJlZml4X2E9ImE6IgorbnNfcHJlZml4X2I9ImI6IgorCitjZGF0YV9zZWN0aW9uPSI8IVtDREFUQVsgXV0+IgorCitjb21tZW50PSI8IS0tIC0tPiIKKworcGk9Ijw/YT8+IgorCisjIFhQYXRoCisKK2F4aXNfYW5jZXN0b3I9ImFuY2VzdG9yOjoiCitheGlzX2FuY2VzdG9yX29yX3NlbGY9ImFuY2VzdG9yLW9yLXNlbGY6OiIKK2F4aXNfYXR0cmlidXRlPSJhdHRyaWJ1dGU6OiIKK2F4aXNfYXR0cmlidXRlX2FiYnJldj0iQCIKK2F4aXNfY2hpbGQ9ImNoaWxkOjoiCitheGlzX2Rlc2NlbmRhbnQ9ImRlc2NlbmRhbnQ6OiIKK2F4aXNfZGVzY2VuZGFudF9vcl9zZWxmPSJkZXNjZW5kYW50LW9yLXNlbGY6OiIKK2F4aXNfZm9sbG93aW5nPSJmb2xsb3dpbmc6OiIKK2F4aXNfZm9sbG93aW5nX3NpYmxpbmc9ImZvbGxvd2luZy1zaWJsaW5nOjoiCitheGlzX25hbWVzcGFjZT0ibmFtZXNwYWNlOjoiCitheGlzX3BhcmVudD0icGFyZW50OjoiCitheGlzX3ByZWNlZGluZz0icHJlY2VkaW5nOjoiCitheGlzX3ByZWNlZGluZ19zaWJsaW5ncz0icHJlY2VkaW5nLXNpYmxpbmc6OiIKK2F4aXNfc2VsZj0ic2VsZjo6IgorCitub2RlX3Rlc3RfbnM9ImE6IgorCit2YWxfbnVtPSI9KDEuMCkiCit2YWxfc3RyX3NxPSI9KCdhJykiCit2YWxfc3RyX2RxPSI9KFwiYVwiKSIKK3ZhbF9ub2RlX3NldD0iPSgqKSIKK3ZhbF9lbGVtPSI9KGIpIgorCitzdGVwX3Jvb3Q9Ii8iCitzdGVwX2Rlc2NlbmRhbnQ9Ii8vIgorc3RlcF9hbnk9Ii8vKiIKK3N0ZXBfYW55X2w9IiovLyIKK3N0ZXBfZWxlbT0iLy9iIgorc3RlcF9uc19lbGVtPSIvL2E6YSIKK3N0ZXBfY29tbWVudD0iLy9jb21tZW50KCkiCitzdGVwX25vZGU9Ii8vbm9kZSgpIgorc3RlcF9ub2RlX2w9Im5vZGUoKS8vIgorc3RlcF9waT0iLy9wcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiCitzdGVwX3RleHQ9Ii8vdGV4dCgpIgorc3RlcF9wYXJlbnQ9Ii4uLyIKKworb3BfcGx1cz0iKzEiCitvcF9taW51cz0iIC0gMSIKK29wX25lZz0iLSIKK29wX211bD0iKjEiCitvcF9kaXY9IiBkaXYgMSIKK29wX21vZD0iIG1vZCAxIgorb3BfYW5kPSIgYW5kIDEiCitvcF9vcj0iIG9yIDEiCitvcF9uZT0iIT0xIgorb3BfbHQ9IjwxIgorb3BfZ3Q9Ij4xIgorb3BfbGU9Ijw9MSIKK29wX2dlPSI+PTEiCitvcF9wcmVkaWNhdGVfbnVtPSJbMV0iCitvcF9wcmVkaWNhdGVfbGFzdD0iW2xhc3QoKV0iCitvcF9wcmVkaWNhdGVfc3RyPSJbJ2EnXSIKK29wX3ByZWRpY2F0ZT0iWzE9MV0iCitvcF9hcmdfbnVtPSIsMSIKK29wX2FyZ19zdHI9IiwnYSciCitvcF9hcmdfbm9kZT0iLCoiCitvcF91bmlvbj0ifC8vYiIKKwordmFyX251bT0iPSRmIgordmFyX2Jvb2w9Ij0kYiIKK3Zhcl9zdHI9Ij0kcyIKK3Zhcl9ub2RlX3NldD0iPSRuIgorCisjIFVuaWNvZGUKKwordXRmOF8yPSJceEMzXHg4NCIKK3V0ZjhfMz0iXHhFMlx4ODBceDlDIgordXRmOF80PSJceEYwXHg5Rlx4OThceDgwIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC9NYWtlZmlsZS5hbSBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvaW5jbHVkZS9saWJ4bWwvTWFrZWZpbGUuYW0KaW5kZXggY2Y5Mjk3YS4uMzI4YzE4MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC9NYWtlZmlsZS5hbQorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL01ha2VmaWxlLmFtCkBAIC01MSw0ICs1MSw0IEBACiAJCXhtbHNhdmUuaCBcCiAJCXNjaGVtYXRyb24uaAogCi1FWFRSQV9ESVNUID0geG1sdmVyc2lvbi5oLmluCitFWFRSQV9ESVNUID0geG1sdmVyc2lvbi5oLmluIHhtbHdpbjMydmVyc2lvbi5oLmluCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL2MxNG4uaCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvaW5jbHVkZS9saWJ4bWwvYzE0bi5oCmluZGV4IGQ3NDg0N2QuLmFmOTNkZTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvaW5jbHVkZS9saWJ4bWwvYzE0bi5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvaW5jbHVkZS9saWJ4bWwvYzE0bi5oCkBAIC0xNiwxNyArMTYsMTkgQEAKICAqLwogI2lmbmRlZiBfX1hNTF9DMTROX0hfXwogI2RlZmluZSBfX1hNTF9DMTROX0hfXworCisjaW5jbHVkZSA8bGlieG1sL3htbHZlcnNpb24uaD4KKwogI2lmZGVmIExJQlhNTF9DMTROX0VOQUJMRUQKICNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKIAorI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CisjaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+CisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAotI2luY2x1ZGUgPGxpYnhtbC94bWx2ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGlieG1sL3RyZWUuaD4KLSNpbmNsdWRlIDxsaWJ4bWwveHBhdGguaD4KLQogLyoKICAqIFhNTCBDYW5vbmljYWxpemF0aW9uCiAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtYzE0bgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC9wYXJzZXIuaCBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvaW5jbHVkZS9saWJ4bWwvcGFyc2VyLmgKaW5kZXggMzAyMGIyMC4uMGJhMWMzOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC9wYXJzZXIuaAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL3BhcnNlci5oCkBAIC0xNjksNiArMTY5LDggQEAKICAgICBYTUxfUEFSU0VfUkVBREVSID0gNQogfSB4bWxQYXJzZXJNb2RlOwogCit0eXBlZGVmIHN0cnVjdCBfeG1sU3RhcnRUYWcgeG1sU3RhcnRUYWc7CisKIC8qKgogICogeG1sUGFyc2VyQ3R4dDoKICAqCkBAIC0yMzEsNyArMjMzLDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgbmFtZU1heDsgICAgICAgLyogTWF4IGRlcHRoIG9mIHRoZSBwYXJzaW5nIHN0YWNrICovCiAgICAgY29uc3QgeG1sQ2hhciAqICAgKm5hbWVUYWI7ICAgICAgIC8qIGFycmF5IG9mIG5vZGVzICovCiAKLSAgICBsb25nICAgICAgICAgICAgICAgbmJDaGFyczsgICAgICAgLyogbnVtYmVyIG9mIHhtbENoYXIgcHJvY2Vzc2VkICovCisgICAgbG9uZyAgICAgICAgICAgICAgIG5iQ2hhcnM7ICAgICAgIC8qIHVudXNlZCAqLwogICAgIGxvbmcgICAgICAgICAgICBjaGVja0luZGV4OyAgICAgICAvKiB1c2VkIGJ5IHByb2dyZXNzaXZlIHBhcnNpbmcgbG9va3VwICovCiAgICAgaW50ICAgICAgICAgICAgIGtlZXBCbGFua3M7ICAgICAgIC8qIHVnbHkgYnV0IC4uLiAqLwogICAgIGludCAgICAgICAgICAgICBkaXNhYmxlU0FYOyAgICAgICAvKiBTQVggY2FsbGJhY2tzIGFyZSBkaXNhYmxlZCAqLwpAQCAtMjgwLDcgKzI4Miw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgIG5zTWF4OyAgICAgICAgIC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheXMgKi8KICAgICBjb25zdCB4bWxDaGFyICogICAqbnNUYWI7ICAgICAgICAgLyogdGhlIGFycmF5IG9mIHByZWZpeC9uYW1lc3BhY2UgbmFtZSAqLwogICAgIGludCAgICAgICAgICAgICAgICphdHRhbGxvY3M7ICAgICAvKiB3aGljaCBhdHRyaWJ1dGUgd2VyZSBhbGxvY2F0ZWQgKi8KLSAgICB2b2lkICogICAgICAgICAgICAqcHVzaFRhYjsgICAgICAgLyogYXJyYXkgb2YgZGF0YSBmb3IgcHVzaCAqLworICAgIHhtbFN0YXJ0VGFnICAgICAgICpwdXNoVGFiOyAgICAgICAvKiBhcnJheSBvZiBkYXRhIGZvciBwdXNoICovCiAgICAgeG1sSGFzaFRhYmxlUHRyICAgIGF0dHNEZWZhdWx0OyAgIC8qIGRlZmF1bHRlZCBhdHRyaWJ1dGVzIGlmIGFueSAqLwogICAgIHhtbEhhc2hUYWJsZVB0ciAgICBhdHRzU3BlY2lhbDsgICAvKiBub24tQ0RBVEEgYXR0cmlidXRlcyBpZiBhbnkgKi8KICAgICBpbnQgICAgICAgICAgICAgICAgbnNXZWxsRm9ybWVkOyAgLyogaXMgdGhlIGRvY3VtZW50IFhNTCBOYW1lc3BhY2Ugb2theSAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC94bWxleHBvcnRzLmggYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL3htbGV4cG9ydHMuaAppbmRleCA5Y2MzZjEwLi5hY2VlZGU1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL3htbGV4cG9ydHMuaAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL3htbGV4cG9ydHMuaApAQCAtMyw0MyArMyw0NiBAQAogICogRGVzY3JpcHRpb246IG1hY3JvcyBmb3IgbWFya2luZyBzeW1ib2xzIGFzIGV4cG9ydGFibGUvaW1wb3J0YWJsZS4KICAqCiAgKiBDb3B5OiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogQXV0aG9yOiBJZ29yIFpsYXRvdmljIDxpZ29yQHpsYXRrb3ZpYy5jb20+CiAgKi8KIAogI2lmbmRlZiBfX1hNTF9FWFBPUlRTX0hfXwogI2RlZmluZSBfX1hNTF9FWFBPUlRTX0hfXwogCi0vKioKLSAqIFhNTFBVQkZVTiwgWE1MUFVCVkFSLCBYTUxDQUxMCi0gKgotICogTWFjcm9zIHdoaWNoIGRlY2xhcmUgYW4gZXhwb3J0YWJsZSBmdW5jdGlvbiwgYW4gZXhwb3J0YWJsZSB2YXJpYWJsZSBhbmQKLSAqIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgZnVuY3Rpb25zLgotICoKLSAqIFBsZWFzZSB1c2UgYW4gZXh0cmEgYmxvY2sgZm9yIGV2ZXJ5IHBsYXRmb3JtL2NvbXBpbGVyIGNvbWJpbmF0aW9uIHdoZW4KLSAqIG1vZGlmeWluZyB0aGlzLCByYXRoZXIgdGhhbiBvdmVybG9uZyAjaWZkZWYgbGluZXMuIFRoaXMgaGVscHMKLSAqIHJlYWRhYmlsaXR5IGFzIHdlbGwgYXMgdGhlIGZhY3QgdGhhdCBkaWZmZXJlbnQgY29tcGlsZXJzIG9uIHRoZSBzYW1lCi0gKiBwbGF0Zm9ybSBtaWdodCBuZWVkIGRpZmZlcmVudCBkZWZpbml0aW9ucy4KLSAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisvKiogRE9DX0RJU0FCTEUgKi8KKworI2lmZGVmIExJQlhNTF9TVEFUSUMKKyAgI2RlZmluZSBYTUxQVUJMSUMKKyNlbGlmIGRlZmluZWQoSU5fTElCWE1MKQorICAjZGVmaW5lIFhNTFBVQkxJQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCisgICNkZWZpbmUgWE1MUFVCTElDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExJQlhNTF9GQVNUQ0FMTCkKKyAgI2RlZmluZSBYTUxDQUxMIF9fZmFzdGNhbGwKKyNlbHNlCisgICNkZWZpbmUgWE1MQ0FMTCBfX2NkZWNsCisjZW5kaWYKKyNkZWZpbmUgWE1MQ0RFQ0wgX19jZGVjbAorCisvKiogRE9DX0VOQUJMRSAqLworI2Vsc2UgLyogbm90IFdpbmRvd3MgKi8KIAogLyoqCi0gKiBYTUxQVUJGVU46CisgKiBYTUxQVUJMSUM6CiAgKgotICogTWFjcm9zIHdoaWNoIGRlY2xhcmUgYW4gZXhwb3J0YWJsZSBmdW5jdGlvbgorICogTWFjcm8gd2hpY2ggZGVjbGFyZXMgYSBwdWJsaWMgc3ltYm9sCiAgKi8KLSNkZWZpbmUgWE1MUFVCRlVOCi0vKioKLSAqIFhNTFBVQlZBUjoKLSAqCi0gKiBNYWNyb3Mgd2hpY2ggZGVjbGFyZSBhbiBleHBvcnRhYmxlIHZhcmlhYmxlCi0gKi8KLSNkZWZpbmUgWE1MUFVCVkFSIGV4dGVybgorI2RlZmluZSBYTUxQVUJMSUMKKwogLyoqCiAgKiBYTUxDQUxMOgogICoKLSAqIE1hY3JvcyB3aGljaCBkZWNsYXJlIHRoZSBjYWxsZWQgY29udmVudGlvbiBmb3IgZXhwb3J0ZWQgZnVuY3Rpb25zCisgKiBNYWNybyB3aGljaCBkZWNsYXJlcyB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZvciBleHBvcnRlZCBmdW5jdGlvbnMKICAqLwogI2RlZmluZSBYTUxDQUxMCisKIC8qKgogICogWE1MQ0RFQ0w6CiAgKgpAQCAtNDgsMTAxICs1MSwyMSBAQAogICovCiAjZGVmaW5lIFhNTENERUNMCiAKLS8qKiBET0NfRElTQUJMRSAqLworI2VuZGlmIC8qIHBsYXRmb3JtIHN3aXRjaCAqLwogCi0vKiBXaW5kb3dzIHBsYXRmb3JtIHdpdGggTVMgY29tcGlsZXIgKi8KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19MQl9YQjFfXykgJiYgICAgIFwKLSAgICAhZGVmaW5lZChfX0xCX1hCMzYwX18pCi0gICN1bmRlZiBYTUxQVUJGVU4KLSAgI3VuZGVmIFhNTFBVQlZBUgotICAjdW5kZWYgWE1MQ0FMTAotICAjdW5kZWYgWE1MQ0RFQ0wKLSAgI2lmIGRlZmluZWQoSU5fTElCWE1MKSAmJiAhZGVmaW5lZChMSUJYTUxfU1RBVElDKQotICAgICNkZWZpbmUgWE1MUFVCRlVOIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotICAgICNkZWZpbmUgWE1MUFVCVkFSIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotICAjZWxzZQotICAgICNkZWZpbmUgWE1MUFVCRlVOCi0gICAgI2lmICFkZWZpbmVkKExJQlhNTF9TVEFUSUMpCi0gICAgICAjZGVmaW5lIFhNTFBVQlZBUiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuCi0gICAgI2Vsc2UKLSAgICAgICNkZWZpbmUgWE1MUFVCVkFSIGV4dGVybgotICAgICNlbmRpZgotICAjZW5kaWYKLSAgI2lmIGRlZmluZWQoTElCWE1MX0ZBU1RDQUxMKQotICAgICNkZWZpbmUgWE1MQ0FMTCBfX2Zhc3RjYWxsCi0gICNlbHNlCi0gICAgI2RlZmluZSBYTUxDQUxMIF9fY2RlY2wKLSAgI2VuZGlmCi0gICNkZWZpbmUgWE1MQ0RFQ0wgX19jZGVjbAotI2VuZGlmCisvKgorICogWE1MUFVCRlVOOgorICoKKyAqIE1hY3JvIHdoaWNoIGRlY2xhcmVzIGFuIGV4cG9ydGFibGUgZnVuY3Rpb24KKyAqLworI2RlZmluZSBYTUxQVUJGVU4gWE1MUFVCTElDCiAKLS8qIFdpbmRvd3MgcGxhdGZvcm0gd2l0aCBCb3JsYW5kIGNvbXBpbGVyICovCi0jaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAjdW5kZWYgWE1MUFVCRlVOCi0gICN1bmRlZiBYTUxQVUJWQVIKLSAgI3VuZGVmIFhNTENBTEwKLSAgI3VuZGVmIFhNTENERUNMCi0gICNpZiBkZWZpbmVkKElOX0xJQlhNTCkgJiYgIWRlZmluZWQoTElCWE1MX1NUQVRJQykKLSAgICAjZGVmaW5lIFhNTFBVQkZVTiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSAgICAjZGVmaW5lIFhNTFBVQlZBUiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgZXh0ZXJuCi0gICNlbHNlCi0gICAgI2RlZmluZSBYTUxQVUJGVU4KLSAgICAjaWYgIWRlZmluZWQoTElCWE1MX1NUQVRJQykKLSAgICAgICNkZWZpbmUgWE1MUFVCVkFSIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4KLSAgICAjZWxzZQotICAgICAgI2RlZmluZSBYTUxQVUJWQVIgZXh0ZXJuCi0gICAgI2VuZGlmCi0gICNlbmRpZgotICAjZGVmaW5lIFhNTENBTEwgX19jZGVjbAotICAjZGVmaW5lIFhNTENERUNMIF9fY2RlY2wKLSNlbmRpZgotCi0vKiBXaW5kb3dzIHBsYXRmb3JtIHdpdGggR05VIGNvbXBpbGVyIChNaW5ndykgKi8KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfX01JTkdXMzJfXykKLSAgI3VuZGVmIFhNTFBVQkZVTgotICAjdW5kZWYgWE1MUFVCVkFSCi0gICN1bmRlZiBYTUxDQUxMCi0gICN1bmRlZiBYTUxDREVDTAotICAvKgotICAgKiBpZiBkZWZpbmVkKElOX0xJQlhNTCkgdGhpcyByYWlzZXMgcHJvYmxlbXMgb24gbWluZ3cgd2l0aCBtc3lzCi0gICAqIF9pbXBfX3htbEZyZWUgbGlzdGVkIGFzIG1pc3NpbmcuIFRyeSB0byB3b3JrYXJvdW5kIHRoZSBwcm9ibGVtCi0gICAqIGJ5IGFsc28gbWFraW5nIHRoYXQgZGVjbGFyYXRpb24gd2hlbiBjb21waWxpbmcgY2xpZW50IGNvZGUuCi0gICAqLwotICAjaWYgZGVmaW5lZChJTl9MSUJYTUwpICYmICFkZWZpbmVkKExJQlhNTF9TVEFUSUMpCi0gICAgI2RlZmluZSBYTUxQVUJGVU4gX19kZWNsc3BlYyhkbGxleHBvcnQpCi0gICAgI2RlZmluZSBYTUxQVUJWQVIgX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybgotICAjZWxzZQotICAgICNkZWZpbmUgWE1MUFVCRlVOCi0gICAgI2lmICFkZWZpbmVkKExJQlhNTF9TVEFUSUMpCi0gICAgICAjZGVmaW5lIFhNTFBVQlZBUiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuCi0gICAgI2Vsc2UKLSAgICAgICNkZWZpbmUgWE1MUFVCVkFSIGV4dGVybgotICAgICNlbmRpZgotICAjZW5kaWYKLSAgI2RlZmluZSBYTUxDQUxMIF9fY2RlY2wKLSAgI2RlZmluZSBYTUxDREVDTCBfX2NkZWNsCi0jZW5kaWYKLQotLyogQ3lnd2luIHBsYXRmb3JtIChkb2VzIG5vdCBkZWZpbmUgX1dJTjMyKSwgR05VIGNvbXBpbGVyICovCi0jaWYgZGVmaW5lZChfX0NZR1dJTl9fKQotICAjdW5kZWYgWE1MUFVCRlVOCi0gICN1bmRlZiBYTUxQVUJWQVIKLSAgI3VuZGVmIFhNTENBTEwKLSAgI3VuZGVmIFhNTENERUNMCi0gICNpZiBkZWZpbmVkKElOX0xJQlhNTCkgJiYgIWRlZmluZWQoTElCWE1MX1NUQVRJQykKLSAgICAjZGVmaW5lIFhNTFBVQkZVTiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSAgICAjZGVmaW5lIFhNTFBVQlZBUiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lIFhNTFBVQkZVTgotICAgICNpZiAhZGVmaW5lZChMSUJYTUxfU1RBVElDKQotICAgICAgI2RlZmluZSBYTUxQVUJWQVIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybgotICAgICNlbHNlCi0gICAgICAjZGVmaW5lIFhNTFBVQlZBUiBleHRlcm4KLSAgICAjZW5kaWYKLSAgI2VuZGlmCi0gICNkZWZpbmUgWE1MQ0FMTCBfX2NkZWNsCi0gICNkZWZpbmUgWE1MQ0RFQ0wgX19jZGVjbAotI2VuZGlmCisvKioKKyAqIFhNTFBVQlZBUjoKKyAqCisgKiBNYWNybyB3aGljaCBkZWNsYXJlcyBhbiBleHBvcnRhYmxlIHZhcmlhYmxlCisgKi8KKyNkZWZpbmUgWE1MUFVCVkFSIFhNTFBVQkxJQyBleHRlcm4KIAogLyogQ29tcGF0aWJpbGl0eSAqLwogI2lmICFkZWZpbmVkKExJQlhNTF9ETExfSU1QT1JUKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC94cGF0aC5oIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9pbmNsdWRlL2xpYnhtbC94cGF0aC5oCmluZGV4IGE0MzAzZmYuLjUzOTU5M2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvaW5jbHVkZS9saWJ4bWwveHBhdGguaAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2luY2x1ZGUvbGlieG1sL3hwYXRoLmgKQEAgLTM1OSw4ICszNTksNiBAQAogICAgIHVuc2lnbmVkIGxvbmcgb3BMaW1pdDsKICAgICB1bnNpZ25lZCBsb25nIG9wQ291bnQ7CiAgICAgaW50IGRlcHRoOwotICAgIGludCBtYXhEZXB0aDsKLSAgICBpbnQgbWF4UGFyc2VyRGVwdGg7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9saWJ4bWwubTQgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbC5tNAppbmRleCBiNWRmOTE1Li4wOWRlOWZlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbC5tNAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbC5tNApAQCAtMSw0ICsxLDYgQEAKICMgQ29uZmlndXJlIHBhdGhzIGZvciBMSUJYTUwyCisjIFNpbW9uIEpvc2Vmc3NvbiAyMDIwLTAyLTEyCisjIEZpeCBhdXRvY29uZiAyLjcwKyB3YXJuaW5ncwogIyBNaWtlIEhvbW1leSAyMDA0LTA2LTE5CiAjIHVzZSBDUFBGTEFHUyBpbnN0ZWFkIG9mIENGTEFHUwogIyBUb3NoaW8gS3VyYXRvbWkgMjAwMS0wNC0yMQpAQCAtNTgsNyArNjAsOCBAQAogZG5sIChBbHNvIHNhbml0eSBjaGVja3MgdGhlIHJlc3VsdHMgb2YgeG1sMi1jb25maWcgdG8gc29tZSBleHRlbnQpCiBkbmwKICAgICAgIHJtIC1mIGNvbmYueG1sdGVzdAotICAgICAgQUNfVFJZX1JVTihbCisgICAgICBBQ19SVU5fSUZFTFNFKAorICAgICAgICAgICAgW0FDX0xBTkdfU09VUkNFKFtbCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTEzMyw3ICsxMzYsNyBAQAogICAgIH0KICAgcmV0dXJuIDE7CiB9Ci1dLCwgbm9feG1sPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCitdXSldLCwgbm9feG1sPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCiAgICAgICAgQ1BQRkxBR1M9IiRhY19zYXZlX0NQUEZMQUdTIgogICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCiAgICAgIGZpCkBAIC0xNTYsMTAgKzE1OSwxMSBAQAogICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIGxpYnhtbCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKICAgICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRYTUxfQ1BQRkxBR1MiCiAgICAgICAgICAgTElCUz0iJExJQlMgJFhNTF9MSUJTIgotICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKwkgIEFDX0xJTktfSUZFTFNFKAorICAgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbWwogI2luY2x1ZGUgPGxpYnhtbC94bWx2ZXJzaW9uLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLV0sICAgICAgWyBMSUJYTUxfVEVTVF9WRVJTSU9OOyByZXR1cm4gMDtdLAorXV0sICAgIFtbIExJQlhNTF9URVNUX1ZFUlNJT047IHJldHVybiAwO11dKV0sCiAgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gY29tcGlsZWQsIGJ1dCBkaWQgbm90IHJ1bi4gVGhpcyB1c3VhbGx5IG1lYW5zIgogICAgICAgICAgIGVjaG8gIioqKiB0aGF0IHRoZSBydW4tdGltZSBsaW5rZXIgaXMgbm90IGZpbmRpbmcgTElCWE1MIG9yIGZpbmRpbmcgdGhlIHdyb25nIgogICAgICAgICAgIGVjaG8gIioqKiB2ZXJzaW9uIG9mIExJQlhNTC4gSWYgaXQgaXMgbm90IGZpbmRpbmcgTElCWE1MLCB5b3UnbGwgbmVlZCB0byBzZXQgeW91ciIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvbGlieG1sMi1jb25maWcuY21ha2UuY21ha2UuaW4gYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbDItY29uZmlnLmNtYWtlLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTg2YWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbDItY29uZmlnLmNtYWtlLmNtYWtlLmluCkBAIC0wLDAgKzEsMTM2IEBACisjIGxpYnhtbDItY29uZmlnLmNtYWtlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIExpYnhtbDIgY21ha2UgbW9kdWxlLgorIyBUaGlzIG1vZHVsZSBzZXRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorIworIyA6OgorIworIyAgIExJQlhNTDJfSU5DTFVERV9ESVIgICAgICAgIC0gRGlyZWN0b3J5IHdoZXJlIExpYlhtbDIgaGVhZGVycyBhcmUgbG9jYXRlZC4KKyMgICBMSUJYTUwyX0lOQ0xVREVfRElSUyAgICAgICAtIGxpc3Qgb2YgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgbmVlZGVkIHRvIHVzZSBMaWJYbWwyLgorIyAgIExJQlhNTDJfTElCUkFSWSAgICAgICAgICAgIC0gcGF0aCB0byB0aGUgTGliWG1sMiBsaWJyYXJ5LgorIyAgIExJQlhNTDJfTElCUkFSSUVTICAgICAgICAgIC0geG1sMiBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0LgorIyAgIExJQlhNTDJfREVGSU5JVElPTlMgICAgICAgIC0gdGhlIGNvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBMaWJYbWwyLgorIyAgIExJQlhNTDJfVkVSU0lPTl9NQUpPUiAgICAgIC0gVGhlIG1ham9yIHZlcnNpb24gb2YgbGlieG1sMi4KKyMgICBMSUJYTUwyX1ZFUlNJT05fTUlOT1IgICAgICAtIFRoZSBtaW5vciB2ZXJzaW9uIG9mIGxpYnhtbDIuCisjICAgTElCWE1MMl9WRVJTSU9OX1BBVENIICAgICAgLSBUaGUgcGF0Y2ggdmVyc2lvbiBvZiBsaWJ4bWwyLgorIyAgIExJQlhNTDJfVkVSU0lPTl9TVFJJTkcgICAgIC0gdmVyc2lvbiBudW1iZXIgYXMgYSBzdHJpbmcgKGV4OiAiMi4zLjQiKQorIyAgIExJQlhNTDJfTU9EVUxFUyAgICAgICAgICAgIC0gd2hldGhlciBsaWJ4bWwyIGhhcyBkc28gc3VwcG9ydAorIyAgIExJQlhNTDJfWE1MTElOVF9FWEVDVVRBQkxFIC0gcGF0aCB0byB0aGUgWE1MIGNoZWNraW5nIHRvb2wgeG1sbGludCBjb21pbmcgd2l0aCBMaWJYbWwyCisKK2luY2x1ZGUoIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vbGlieG1sMi1leHBvcnQuY21ha2UiKQorCitAUEFDS0FHRV9JTklUQAorCitzZXQoTElCWE1MMl9WRVJTSU9OX01BSk9SICBATElCWE1MX01BSk9SX1ZFUlNJT05AKQorc2V0KExJQlhNTDJfVkVSU0lPTl9NSU5PUiAgQExJQlhNTF9NSU5PUl9WRVJTSU9OQCkKK3NldChMSUJYTUwyX1ZFUlNJT05fUEFUQ0ggIEBMSUJYTUxfTUlDUk9fVkVSU0lPTkApCitzZXQoTElCWE1MMl9WRVJTSU9OX1NUUklORyAiQFZFUlNJT05AIikKK3NldChMSUJYTUwyX0lOU1RBTExfUFJFRklYICR7UEFDS0FHRV9QUkVGSVhfRElSfSkKK3NldChMSUJYTUwyX0lOQ0xVREVfRElSICAgICR7UEFDS0FHRV9QUkVGSVhfRElSfS9AQ01BS0VfSU5TVEFMTF9JTkNMVURFRElSQC9saWJ4bWwyKQorc2V0KExJQlhNTDJfTElCUkFSWV9ESVIgICAgJHtQQUNLQUdFX1BSRUZJWF9ESVJ9L0BDTUFLRV9JTlNUQUxMX0xJQkRJUkApCisKK21hY3JvKHNlbGVjdF9saWJyYXJ5X2xvY2F0aW9uIHRhcmdldCBiYXNlbmFtZSkKKyAgaWYoVEFSR0VUICR7dGFyZ2V0fSkKKyAgICBmb3JlYWNoKHByb3BlcnR5IElOIElURU1TIElNUE9SVEVEX0xPQ0FUSU9OIElNUE9SVEVEX0lNUExJQikKKyAgICAgIGdldF90YXJnZXRfcHJvcGVydHkoJHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fREVCVUcgJHt0YXJnZXR9ICR7cHJvcGVydHl9X0RFQlVHKQorICAgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eSgke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9NSU5TSVpFUkVMICR7dGFyZ2V0fSAke3Byb3BlcnR5fV9NSU5TSVpFUkVMKQorICAgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eSgke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxFQVNFICR7dGFyZ2V0fSAke3Byb3BlcnR5fV9SRUxFQVNFKQorICAgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eSgke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxXSVRIREVCSU5GTyAke3RhcmdldH0gJHtwcm9wZXJ0eX1fUkVMV0lUSERFQklORk8pCisKKyAgICAgIGlmKCR7YmFzZW5hbWV9XyR7cHJvcGVydHl9X0RFQlVHIEFORCAke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxFQVNFKQorICAgICAgICBzZXQoJHtiYXNlbmFtZX1fTElCUkFSWSBkZWJ1ZyAkeyR7YmFzZW5hbWV9XyR7cHJvcGVydHl9X0RFQlVHfSBvcHRpbWl6ZWQgJHske2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxFQVNFfSkKKyAgICAgIGVsc2VpZigke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9ERUJVRyBBTkQgJHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fUkVMV0lUSERFQklORk8pCisgICAgICAgIHNldCgke2Jhc2VuYW1lfV9MSUJSQVJZIGRlYnVnICR7JHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fREVCVUd9IG9wdGltaXplZCAkeyR7YmFzZW5hbWV9XyR7cHJvcGVydHl9X1JFTFdJVEhERUJJTkZPfSkKKyAgICAgIGVsc2VpZigke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9ERUJVRyBBTkQgJHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fTUlOU0laRVJFTCkKKyAgICAgICAgc2V0KCR7YmFzZW5hbWV9X0xJQlJBUlkgZGVidWcgJHske2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9ERUJVR30gb3B0aW1pemVkICR7JHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fTUlOU0laRVJFTH0pCisgICAgICBlbHNlaWYoJHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fUkVMRUFTRSkKKyAgICAgICAgc2V0KCR7YmFzZW5hbWV9X0xJQlJBUlkgJHske2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxFQVNFfSkKKyAgICAgIGVsc2VpZigke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxXSVRIREVCSU5GTykKKyAgICAgICAgc2V0KCR7YmFzZW5hbWV9X0xJQlJBUlkgJHske2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9SRUxXSVRIREVCSU5GT30pCisgICAgICBlbHNlaWYoJHtiYXNlbmFtZX1fJHtwcm9wZXJ0eX1fTUlOU0laRVJFTCkKKyAgICAgICAgc2V0KCR7YmFzZW5hbWV9X0xJQlJBUlkgJHske2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9NSU5TSVpFUkVMfSkKKyAgICAgIGVsc2VpZigke2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9ERUJVRykKKyAgICAgICAgc2V0KCR7YmFzZW5hbWV9X0xJQlJBUlkgJHske2Jhc2VuYW1lfV8ke3Byb3BlcnR5fV9ERUJVR30pCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworbWFjcm8oc2VsZWN0X2V4ZWN1dGFibGVfbG9jYXRpb24gdGFyZ2V0IGJhc2VuYW1lKQorICBpZihUQVJHRVQgJHt0YXJnZXR9KQorICAgIGdldF90YXJnZXRfcHJvcGVydHkoJHtiYXNlbmFtZX1fSU1QT1JURURfTE9DQVRJT05fREVCVUcgJHt0YXJnZXR9IElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHKQorICAgIGdldF90YXJnZXRfcHJvcGVydHkoJHtiYXNlbmFtZX1fSU1QT1JURURfTE9DQVRJT05fTUlOU0laRVJFTCAke3RhcmdldH0gSU1QT1JURURfTE9DQVRJT05fTUlOU0laRVJFTCkKKyAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KCR7YmFzZW5hbWV9X0lNUE9SVEVEX0xPQ0FUSU9OX1JFTEVBU0UgJHt0YXJnZXR9IElNUE9SVEVEX0xPQ0FUSU9OX1JFTEVBU0UpCisgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eSgke2Jhc2VuYW1lfV9JTVBPUlRFRF9MT0NBVElPTl9SRUxXSVRIREVCSU5GTyAke3RhcmdldH0gSU1QT1JURURfTE9DQVRJT05fUkVMV0lUSERFQklORk8pCisKKyAgICBpZigke2Jhc2VuYW1lfV9JTVBPUlRFRF9MT0NBVElPTl9SRUxFQVNFKQorICAgICAgc2V0KCR7YmFzZW5hbWV9X0VYRUNVVEFCTEUgJHske2Jhc2VuYW1lfV9JTVBPUlRFRF9MT0NBVElPTl9SRUxFQVNFfSkKKyAgICBlbHNlaWYoJHtiYXNlbmFtZX1fSU1QT1JURURfTE9DQVRJT05fUkVMV0lUSERFQklORk8pCisgICAgICBzZXQoJHtiYXNlbmFtZX1fRVhFQ1VUQUJMRSAkeyR7YmFzZW5hbWV9X0lNUE9SVEVEX0xPQ0FUSU9OX1JFTFdJVEhERUJJTkZPfSkKKyAgICBlbHNlaWYoJHtiYXNlbmFtZX1fSU1QT1JURURfTE9DQVRJT05fTUlOU0laRVJFTCkKKyAgICAgIHNldCgke2Jhc2VuYW1lfV9FWEVDVVRBQkxFICR7JHtiYXNlbmFtZX1fSU1QT1JURURfTE9DQVRJT05fTUlOU0laRVJFTH0pCisgICAgZWxzZWlmKCR7YmFzZW5hbWV9X0lNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHKQorICAgICAgc2V0KCR7YmFzZW5hbWV9X0VYRUNVVEFCTEUgJHske2Jhc2VuYW1lfV9JTVBPUlRFRF9MT0NBVElPTl9ERUJVR30pCisgICAgZW5kaWYoKQorICBlbmRpZigpCitlbmRtYWNybygpCisKK3NlbGVjdF9saWJyYXJ5X2xvY2F0aW9uKExpYlhtbDI6OkxpYlhtbDIgTElCWE1MMikKK3NlbGVjdF9leGVjdXRhYmxlX2xvY2F0aW9uKExpYlhtbDI6OnhtbGNhdGFsb2cgTElCWE1MMl9YTUxDQVRBTE9HKQorc2VsZWN0X2V4ZWN1dGFibGVfbG9jYXRpb24oTGliWG1sMjo6eG1sbGludCBMSUJYTUwyX1hNTExJTlQpCisKK3NldChMSUJYTUwyX0xJQlJBUklFUyAke0xJQlhNTDJfTElCUkFSWX0pCitzZXQoTElCWE1MMl9JTkNMVURFX0RJUlMgJHtMSUJYTUwyX0lOQ0xVREVfRElSfSkKKworaW5jbHVkZShDTWFrZUZpbmREZXBlbmRlbmN5TWFjcm8pCisKK3NldChMSUJYTUwyX1NIQVJFRCBAQlVJTERfU0hBUkVEX0xJQlNAKQorc2V0KExJQlhNTDJfV0lUSF9JQ09OViBATElCWE1MMl9XSVRIX0lDT05WQCkKK3NldChMSUJYTUwyX1dJVEhfVEhSRUFEUyBATElCWE1MMl9XSVRIX1RIUkVBRFNAKQorc2V0KExJQlhNTDJfV0lUSF9JQ1UgQExJQlhNTDJfV0lUSF9JQ1VAKQorc2V0KExJQlhNTDJfV0lUSF9MWk1BIEBMSUJYTUwyX1dJVEhfTFpNQUApCitzZXQoTElCWE1MMl9XSVRIX1pMSUIgQExJQlhNTDJfV0lUSF9aTElCQCkKKworaWYoTElCWE1MMl9XSVRIX0lDT05WKQorICBmaW5kX2RlcGVuZGVuY3koSWNvbnYpCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICAgICR7SWNvbnZfTElCUkFSSUVTfSkKKyAgbGlzdChBUFBFTkQgTElCWE1MMl9JTkNMVURFX0RJUlMgJHtJY29udl9JTkNMVURFX0RJUlN9KQorZW5kaWYoKQorCitpZihOT1QgTElCWE1MMl9TSEFSRUQpCisgIHNldChMSUJYTUwyX0RFRklOSVRJT05TIC1ETElCWE1MX1NUQVRJQykKKworICBpZihMSUJYTUwyX1dJVEhfVEhSRUFEUykKKyAgICBmaW5kX2RlcGVuZGVuY3koVGhyZWFkcykKKyAgICBsaXN0KEFQUEVORCBMSUJYTUwyX0xJQlJBUklFUyAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorICBlbmRpZigpCisKKyAgaWYoTElCWE1MMl9XSVRIX0lDVSkKKyAgICBmaW5kX2RlcGVuZGVuY3koSUNVIENPTVBPTkVOVFMgZGF0YSBpMThuIHVjKQorICAgIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICAgICR7SUNVX0xJQlJBUklFU30pCisgIGVuZGlmKCkKKworICBpZihMSUJYTUwyX1dJVEhfTFpNQSkKKyAgICBmaW5kX2RlcGVuZGVuY3koTGliTFpNQSkKKyAgICBsaXN0KEFQUEVORCBMSUJYTUwyX0xJQlJBUklFUyAgICAke0xJQkxaTUFfTElCUkFSSUVTfSkKKyAgZW5kaWYoKQorCisgIGlmKExJQlhNTDJfV0lUSF9aTElCKQorICAgIGZpbmRfZGVwZW5kZW5jeShaTElCKQorICAgIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICAgICR7WkxJQl9MSUJSQVJJRVN9KQorICBlbmRpZigpCisKKyAgaWYoVU5JWCkKKyAgICBsaXN0KEFQUEVORCBMSUJYTUwyX0xJQlJBUklFUyBtKQorICBlbmRpZigpCisKKyAgaWYoV0lOMzIpCisgICAgbGlzdChBUFBFTkQgTElCWE1MMl9MSUJSQVJJRVMgd3MyXzMyKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgd2hldGhlciBsaWJ4bWwyIGhhcyBkc28gc3VwcG9ydAorc2V0KExJQlhNTDJfTU9EVUxFUyBATElCWE1MMl9XSVRIX01PRFVMRVNAKQorCittYXJrX2FzX2FkdmFuY2VkKExJQlhNTDJfTElCUkFSWSBMSUJYTUwyX1hNTENBVEFMT0dfRVhFQ1VUQUJMRSBMSUJYTUwyX1hNTExJTlRfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvbGlieG1sMi1jb25maWcuY21ha2UuaW4gYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbDItY29uZmlnLmNtYWtlLmluCmluZGV4IDZiMTZmYzIuLjQ5ODk2OTAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvbGlieG1sMi1jb25maWcuY21ha2UuaW4KKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9saWJ4bWwyLWNvbmZpZy5jbWFrZS5pbgpAQCAtMiwxNyArMiwyNiBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQogIwogIyBMaWJ4bWwyIGNtYWtlIG1vZHVsZS4KLSMgVEhpcyBtb2R1bGUgc2V0cyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyMgVGhpcyBtb2R1bGUgc2V0cyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKICMKICMgOjoKICMKLSMgICBMSUJYTUwyX0lOQ0xVREVfRElSUyAgICAgIC0gRGlyZWN0b3J5IHdoZXJlIGxpYnhtbDIgaGVhZGVycyBhcmUgbG9jYXRlZC4KLSMgICBMSUJYTUwyX0xJQlJBUklFUyAgICAgICAgIC0geG1sMiBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0LgotIyAgIExJQlhNTDJfVkVSU0lPTl9NQUpPUiAgICAgLSBUaGUgbWFqb3IgdmVyc2lvbiBvZiBsaWJ4bWwyLgotIyAgIExJQlhNTDJfVkVSU0lPTl9NSU5PUiAgICAgLSBUaGUgbWlub3IgdmVyc2lvbiBvZiBsaWJ4bWwyLgotIyAgIExJQlhNTDJfVkVSU0lPTl9QQVRDSCAgICAgLSBUaGUgcGF0Y2ggdmVyc2lvbiBvZiBsaWJ4bWwyLgotIyAgIExJQlhNTDJfVkVSU0lPTl9TVFJJTkcgICAgLSB2ZXJzaW9uIG51bWJlciBhcyBhIHN0cmluZyAoZXg6ICIyLjMuNCIpCi0jICAgTElCWE1MMl9NT0RVTEVTICAgICAgICAgICAtIHdoZXRoZXIgbGlieG1sMiBhcyBkc28gc3VwcG9ydAorIyAgIExJQlhNTDJfSU5DTFVERV9ESVIgICAgICAgIC0gRGlyZWN0b3J5IHdoZXJlIExpYlhtbDIgaGVhZGVycyBhcmUgbG9jYXRlZC4KKyMgICBMSUJYTUwyX0lOQ0xVREVfRElSUyAgICAgICAtIGxpc3Qgb2YgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgbmVlZGVkIHRvIHVzZSBMaWJYbWwyLgorIyAgIExJQlhNTDJfTElCUkFSWSAgICAgICAgICAgIC0gcGF0aCB0byB0aGUgTGliWG1sMiBsaWJyYXJ5LgorIyAgIExJQlhNTDJfTElCUkFSSUVTICAgICAgICAgIC0geG1sMiBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0LgorIyAgIExJQlhNTDJfREVGSU5JVElPTlMgICAgICAgIC0gdGhlIGNvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBMaWJYbWwyLgorIyAgIExJQlhNTDJfVkVSU0lPTl9NQUpPUiAgICAgIC0gVGhlIG1ham9yIHZlcnNpb24gb2YgbGlieG1sMi4KKyMgICBMSUJYTUwyX1ZFUlNJT05fTUlOT1IgICAgICAtIFRoZSBtaW5vciB2ZXJzaW9uIG9mIGxpYnhtbDIuCisjICAgTElCWE1MMl9WRVJTSU9OX1BBVENIICAgICAgLSBUaGUgcGF0Y2ggdmVyc2lvbiBvZiBsaWJ4bWwyLgorIyAgIExJQlhNTDJfVkVSU0lPTl9TVFJJTkcgICAgIC0gdmVyc2lvbiBudW1iZXIgYXMgYSBzdHJpbmcgKGV4OiAiMi4zLjQiKQorIyAgIExJQlhNTDJfTU9EVUxFUyAgICAgICAgICAgIC0gd2hldGhlciBsaWJ4bWwyIGhhcyBkc28gc3VwcG9ydAorIyAgIExJQlhNTDJfWE1MTElOVF9FWEVDVVRBQkxFIC0gcGF0aCB0byB0aGUgWE1MIGNoZWNraW5nIHRvb2wgeG1sbGludCBjb21pbmcgd2l0aCBMaWJYbWwyCisjCisjIFRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgZGVmaW5lZDoKKyMKKyMgICBMaWJYbWwyOjpMaWJYbWwyICAgICAgICAgIC0gdGhlIExpYlhtbDIgbGlicmFyeQorIyAgIExpYlhtbDI6OnhtbGxpbnQgICAgICAgICAgLSB0aGUgeG1sbGludCBjb21tYW5kLWxpbmUgZXhlY3V0YWJsZQogCiBnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9saWJ4bWwyX3Jvb3RkaXIgJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS8uLi8uLi8uLi8gQUJTT0xVVEUpCiAKQEAgLTIwLDMxICsyOSw4NyBAQAogc2V0KExJQlhNTDJfVkVSU0lPTl9NSU5PUiAgQExJQlhNTF9NSU5PUl9WRVJTSU9OQCkKIHNldChMSUJYTUwyX1ZFUlNJT05fTUlDUk8gIEBMSUJYTUxfTUlDUk9fVkVSU0lPTkApCiBzZXQoTElCWE1MMl9WRVJTSU9OX1NUUklORyAiQFZFUlNJT05AIikKK3NldChMSUJYTUwyX0RFRklOSVRJT05TICAgICJAWE1MX0NGTEFHU0AiKQogc2V0KExJQlhNTDJfSU5TVEFMTF9QUkVGSVggJHtfbGlieG1sMl9yb290ZGlyfSkKLXNldChMSUJYTUwyX0lOQ0xVREVfRElSUyAgICR7X2xpYnhtbDJfcm9vdGRpcn0vaW5jbHVkZSAke19saWJ4bWwyX3Jvb3RkaXJ9L2luY2x1ZGUvbGlieG1sMikKK3NldChMSUJYTUwyX0lOQ0xVREVfRElSICAgICR7X2xpYnhtbDJfcm9vdGRpcn0vaW5jbHVkZS9saWJ4bWwyKQogc2V0KExJQlhNTDJfTElCUkFSWV9ESVIgICAgJHtfbGlieG1sMl9yb290ZGlyfS9saWIpCi1zZXQoTElCWE1MMl9MSUJSQVJJRVMgICAgICAtTCR7TElCWE1MMl9MSUJSQVJZX0RJUn0gLWx4bWwyKQogCi1pZihAV0lUSF9USFJFQURTQCkKLSAgZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCi0gIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCitmaW5kX2xpYnJhcnkoTElCWE1MMl9MSUJSQVJZIE5BTUVTIHhtbDIgSElOVFMgJHtMSUJYTUwyX0xJQlJBUllfRElSfSBOT19ERUZBVUxUX1BBVEgpCitmaW5kX3Byb2dyYW0oTElCWE1MMl9YTUxDQVRBTE9HX0VYRUNVVEFCTEUgTkFNRVMgeG1sY2F0YWxvZyBISU5UUyAke19saWJ4bWwyX3Jvb3RkaXJ9L2JpbiBOT19ERUZBVUxUX1BBVEgpCitmaW5kX3Byb2dyYW0oTElCWE1MMl9YTUxMSU5UX0VYRUNVVEFCTEUgTkFNRVMgeG1sbGludCBISU5UUyAke19saWJ4bWwyX3Jvb3RkaXJ9L2JpbiBOT19ERUZBVUxUX1BBVEgpCisKK3NldChMSUJYTUwyX0xJQlJBUklFUyAke0xJQlhNTDJfTElCUkFSWX0pCitzZXQoTElCWE1MMl9JTkNMVURFX0RJUlMgJHtMSUJYTUwyX0lOQ0xVREVfRElSfSkKK3Vuc2V0KExJQlhNTDJfSU5URVJGQUNFX0xJTktfTElCUkFSSUVTKQorCitpbmNsdWRlKENNYWtlRmluZERlcGVuZGVuY3lNYWNybykKKworc2V0KExJQlhNTDJfV0lUSF9JQ09OViBAV0lUSF9JQ09OVkApCitzZXQoTElCWE1MMl9XSVRIX1RIUkVBRFMgQFdJVEhfVEhSRUFEU0ApCitzZXQoTElCWE1MMl9XSVRIX0lDVSBAV0lUSF9JQ1VAKQorc2V0KExJQlhNTDJfV0lUSF9MWk1BIEBXSVRIX0xaTUFAKQorc2V0KExJQlhNTDJfV0lUSF9aTElCIEBXSVRIX1pMSUJAKQorCitpZihMSUJYTUwyX1dJVEhfSUNPTlYpCisgIGZpbmRfZGVwZW5kZW5jeShJY29udikKKyAgbGlzdChBUFBFTkQgTElCWE1MMl9MSUJSQVJJRVMgICAgJHtJY29udl9MSUJSQVJJRVN9KQorICBsaXN0KEFQUEVORCBMSUJYTUwyX0lOQ0xVREVfRElSUyAke0ljb252X0lOQ0xVREVfRElSU30pCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfSU5URVJGQUNFX0xJTktfTElCUkFSSUVTICJJY29udjo6SWNvbnYiKQogZW5kaWYoKQogCi1pZihAV0lUSF9MWk1BQCkKLSAgZmluZF9wYWNrYWdlKExpYkxaTUEgUkVRVUlSRUQpCitpZihMSUJYTUwyX1dJVEhfVEhSRUFEUykKKyAgZmluZF9kZXBlbmRlbmN5KFRocmVhZHMpCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICAgICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfSU5URVJGQUNFX0xJTktfTElCUkFSSUVTICJcJDxMSU5LX09OTFk6VGhyZWFkczo6VGhyZWFkcz4iKQorZW5kaWYoKQorCitpZihMSUJYTUwyX1dJVEhfSUNVKQorICBmaW5kX2RlcGVuZGVuY3koSUNVIENPTVBPTkVOVFMgZGF0YSBpMThuIHVjKQorICBsaXN0KEFQUEVORCBMSUJYTUwyX0xJQlJBUklFUyAgICAke0lDVV9MSUJSQVJJRVN9KQorICBsaXN0KEFQUEVORCBMSUJYTUwyX0lOVEVSRkFDRV9MSU5LX0xJQlJBUklFUyAiXCQ8TElOS19PTkxZOklDVTo6ZGF0YT47XCQ8TElOS19PTkxZOklDVTo6aTE4bj47XCQ8TElOS19PTkxZOklDVTo6dWM+IikKK2VuZGlmKCkKKworaWYoTElCWE1MMl9XSVRIX0xaTUEpCisgIGZpbmRfZGVwZW5kZW5jeShMaWJMWk1BKQogICBsaXN0KEFQUEVORCBMSUJYTUwyX0xJQlJBUklFUyAgICAke0xJQkxaTUFfTElCUkFSSUVTfSkKLSAgbGlzdChBUFBFTkQgTElCWE1MMl9JTkNMVURFX0RJUlMgJHtMSUJMWk1BX0lOQ0xVREVfRElSU30pCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfSU5URVJGQUNFX0xJTktfTElCUkFSSUVTICJcJDxMSU5LX09OTFk6TGliTFpNQTo6TGliTFpNQT4iKQogZW5kaWYoKQogCi1pZihAV0lUSF9aTElCQCkKLSAgZmluZF9wYWNrYWdlKFpMSUIgUkVRVUlSRUQpCitpZihMSUJYTUwyX1dJVEhfWkxJQikKKyAgZmluZF9kZXBlbmRlbmN5KFpMSUIpCiAgIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICAgICR7WkxJQl9MSUJSQVJJRVN9KQotICBsaXN0KEFQUEVORCBMSUJYTUwyX0lOQ0xVREVfRElSUyAke1pMSUJfSU5DTFVERV9ESVJTfSkKKyAgbGlzdChBUFBFTkQgTElCWE1MMl9JTlRFUkZBQ0VfTElOS19MSUJSQVJJRVMgIlwkPExJTktfT05MWTpaTElCOjpaTElCPiIpCiBlbmRpZigpCiAKLWxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTIEBJQ1VfTElCU0AgQElDT05WX0xJQlNAIEBNX0xJQlNAIEBXSU4zMl9FWFRSQV9MSUJBRERAIEBMSUJTQCkKK2lmKFVOSVgpCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfTElCUkFSSUVTICAgIG0pCisgIGxpc3QoQVBQRU5EIExJQlhNTDJfSU5URVJGQUNFX0xJTktfTElCUkFSSUVTICJcJDxMSU5LX09OTFk6bT4iKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgbGlzdChBUFBFTkQgTElCWE1MMl9MSUJSQVJJRVMgICAgd3MyXzMyKQorICBsaXN0KEFQUEVORCBMSUJYTUwyX0lOVEVSRkFDRV9MSU5LX0xJQlJBUklFUyAiXCQ8TElOS19PTkxZOndzMl8zMj4iKQorZW5kaWYoKQogCiAjIHdoZXRoZXIgbGlieG1sMiBoYXMgZHNvIHN1cHBvcnQKIHNldChMSUJYTUwyX01PRFVMRVMgQFdJVEhfTU9EVUxFU0ApCiAKLW1hcmtfYXNfYWR2YW5jZWQoIExJQlhNTDJfSU5DTFVERV9ESVJTIExJQlhNTDJfTElCUkFSSUVTICkKK21hcmtfYXNfYWR2YW5jZWQoTElCWE1MMl9MSUJSQVJZIExJQlhNTDJfWE1MQ0FUQUxPR19FWEVDVVRBQkxFIExJQlhNTDJfWE1MTElOVF9FWEVDVVRBQkxFKQorCitpZihOT1QgVEFSR0VUIExpYlhtbDI6OkxpYlhtbDIgQU5EIERFRklORUQgTElCWE1MMl9MSUJSQVJZIEFORCBERUZJTkVEIExJQlhNTDJfSU5DTFVERV9ESVJTKQorICBhZGRfbGlicmFyeShMaWJYbWwyOjpMaWJYbWwyIFVOS05PV04gSU1QT1JURUQpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhMaWJYbWwyOjpMaWJYbWwyIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04gIiR7TElCWE1MMl9MSUJSQVJZfSIpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhMaWJYbWwyOjpMaWJYbWwyIFBST1BFUlRJRVMgSU5URVJGQUNFX0NPTVBJTEVfT1BUSU9OUyAiJHtMSUJYTUwyX0RFRklOSVRJT05TfSIpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhMaWJYbWwyOjpMaWJYbWwyIFBST1BFUlRJRVMgSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVMgIiR7TElCWE1MMl9JTkNMVURFX0RJUlN9IikKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKExpYlhtbDI6OkxpYlhtbDIgUFJPUEVSVElFUyBJTlRFUkZBQ0VfTElOS19MSUJSQVJJRVMgIiR7TElCWE1MMl9JTlRFUkZBQ0VfTElOS19MSUJSQVJJRVN9IikKK2VuZGlmKCkKKworaWYoTk9UIFRBUkdFVCBMaWJYbWwyOjp4bWxjYXRhbG9nIEFORCBERUZJTkVEIExJQlhNTDJfWE1MQ0FUQUxPR19FWEVDVVRBQkxFKQorICBhZGRfZXhlY3V0YWJsZShMaWJYbWwyOjp4bWxjYXRhbG9nIElNUE9SVEVEKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoTGliWG1sMjo6eG1sY2F0YWxvZyBQUk9QRVJUSUVTIElNUE9SVEVEX0xPQ0FUSU9OICIke0xJQlhNTDJfWE1MQ0FUQUxPR19FWEVDVVRBQkxFfSIpCitlbmRpZigpCisKK2lmKE5PVCBUQVJHRVQgTGliWG1sMjo6eG1sbGludCBBTkQgREVGSU5FRCBMSUJYTUwyX1hNTExJTlRfRVhFQ1VUQUJMRSkKKyAgYWRkX2V4ZWN1dGFibGUoTGliWG1sMjo6eG1sbGludCBJTVBPUlRFRCkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKExpYlhtbDI6OnhtbGxpbnQgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAiJHtMSUJYTUwyX1hNTExJTlRfRVhFQ1VUQUJMRX0iKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9saWJ4bWwyLnNwZWMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbDIuc3BlYwppbmRleCBkMmE1ZmZiLi5iM2VjYTRmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbDIuc3BlYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL2xpYnhtbDIuc3BlYwpAQCAtMiw3ICsyLDcgQEAKIAogU3VtbWFyeTogTGlicmFyeSBwcm92aWRpbmcgWE1MIGFuZCBIVE1MIHN1cHBvcnQKIE5hbWU6IGxpYnhtbDIKLVZlcnNpb246IDIuOS4xMAorVmVyc2lvbjogMi45LjEyCiBSZWxlYXNlOiAxJXs/ZGlzdH0lez9leHRyYV9yZWxlYXNlfQogTGljZW5zZTogTUlUCiBHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCkBAIC0yMDQsNiArMjA0LDYgQEAKICVlbmRpZiAjIHdpdGhfcHl0aG9uMwogCiAlY2hhbmdlbG9nCi0qIEZyaSBBcHIgMTAgMjAyMCBEYW5pZWwgVmVpbGxhcmQgPHZlaWxsYXJkQHJlZGhhdC5jb20+Ci0tIHVwc3RyZWFtIHJlbGVhc2UgMi45LjEwIHNlZSBodHRwOi8veG1sc29mdC5vcmcvbmV3cy5odG1sCisqIFR1ZSBBdWcgIDMgMjAyMSBEYW5pZWwgVmVpbGxhcmQgPHZlaWxsYXJkQHJlZGhhdC5jb20+CistIHVwc3RyZWFtIHJlbGVhc2UgMi45LjEyIHNlZSBodHRwOi8veG1sc29mdC5vcmcvbmV3cy5odG1sCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvcGFyc2VyLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3BhcnNlci5jCmluZGV4IDg3ZDllNjEuLmQ1YjcyZTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvcGFyc2VyLmMKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9wYXJzZXIuYwpAQCAtODcsNiArODcsMTMgQEAKICNpbmNsdWRlICJidWYuaCIKICNpbmNsdWRlICJlbmMuaCIKIAorc3RydWN0IF94bWxTdGFydFRhZyB7CisgICAgY29uc3QgeG1sQ2hhciAqcHJlZml4OworICAgIGNvbnN0IHhtbENoYXIgKlVSSTsKKyAgICBpbnQgbGluZTsKKyAgICBpbnQgbnNOcjsKK307CisKIHN0YXRpYyB2b2lkCiB4bWxGYXRhbEVycih4bWxQYXJzZXJDdHh0UHRyIGN0eHQsIHhtbFBhcnNlckVycm9ycyBlcnJvciwgY29uc3QgY2hhciAqaW5mbyk7CiAKQEAgLTk2LDYgKzEwMywxMiBAQAogCiBzdGF0aWMgdm9pZCB4bWxIYWx0UGFyc2VyKHhtbFBhcnNlckN0eHRQdHIgY3R4dCk7CiAKK3N0YXRpYyBpbnQKK3htbFBhcnNlRWxlbWVudFN0YXJ0KHhtbFBhcnNlckN0eHRQdHIgY3R4dCk7CisKK3N0YXRpYyB2b2lkCit4bWxQYXJzZUVsZW1lbnRFbmQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCiAgKglBcmJpdHJhcnkgbGltaXRzIHNldCBpbiB0aGUgcGFyc2VyLiBTZWUgWE1MX1BBUlNFX0hVR0UJCSoKQEAgLTEyNyw2ICsxNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgeG1sRW50aXR5UHRyIGVudCwgc2l6ZV90IHJlcGxhY2VtZW50KQogewogICAgIHNpemVfdCBjb25zdW1lZCA9IDA7CisgICAgaW50IGk7CiAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKGN0eHQtPm9wdGlvbnMgJiBYTUxfUEFSU0VfSFVHRSkpCiAgICAgICAgIHJldHVybiAoMCk7CkBAIC0xNzEsNiArMTg1LDI4IEBACiAJICAgIHJlcCA9IE5VTEw7CiAJfQogICAgIH0KKworICAgIC8qCisgICAgICogUHJldmVudCBlbnRpdHkgZXhwb25lbnRpYWwgY2hlY2ssIG5vdCBqdXN0IHJlcGxhY2VtZW50IHdoaWxlCisgICAgICogcGFyc2luZyB0aGUgRFRECisgICAgICogVGhlIGNoZWNrIGlzIHBvdGVudGlhbGx5IGNvc3RseSBzbyBkbyB0aGF0IG9ubHkgb25jZSBpbiBhIHRob3VzYW5kCisgICAgICovCisgICAgaWYgKChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRFREKSAmJiAoY3R4dC0+bmJlbnRpdGllcyA+IDEwMDAwKSAmJgorICAgICAgICAoY3R4dC0+bmJlbnRpdGllcyAlIDEwMjQgPT0gMCkpIHsKKwlmb3IgKGkgPSAwO2kgPCBjdHh0LT5pbnB1dE5yO2krKykgeworCSAgICBjb25zdW1lZCArPSBjdHh0LT5pbnB1dFRhYltpXS0+Y29uc3VtZWQgKworCSAgICAgICAgICAgICAgIChjdHh0LT5pbnB1dFRhYltpXS0+Y3VyIC0gY3R4dC0+aW5wdXRUYWJbaV0tPmJhc2UpOworCX0KKwlpZiAoY3R4dC0+bmJlbnRpdGllcyA+IGNvbnN1bWVkICogWE1MX1BBUlNFUl9OT05fTElORUFSKSB7CisJICAgIHhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfRU5USVRZX0xPT1AsIE5VTEwpOworCSAgICBjdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9FT0Y7CisJICAgIHJldHVybiAoMSk7CisJfQorCWNvbnN1bWVkID0gMDsKKyAgICB9CisKKworCiAgICAgaWYgKHJlcGxhY2VtZW50ICE9IDApIHsKIAlpZiAocmVwbGFjZW1lbnQgPCBYTUxfTUFYX1RFWFRfTEVOR1RIKQogCSAgICByZXR1cm4oMCk7CkBAIC0xMDc0LDExICsxMTEwLDE1IEBACiAgKi8KIHN0YXRpYyB2b2lkCiB4bWxEZXRlY3RTQVgyKHhtbFBhcnNlckN0eHRQdHIgY3R4dCkgeworICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OwogICAgIGlmIChjdHh0ID09IE5VTEwpIHJldHVybjsKKyAgICBzYXggPSBjdHh0LT5zYXg7CiAjaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAotICAgIGlmICgoY3R4dC0+c2F4KSAmJiAgKGN0eHQtPnNheC0+aW5pdGlhbGl6ZWQgPT0gWE1MX1NBWDJfTUFHSUMpICYmCi0gICAgICAgICgoY3R4dC0+c2F4LT5zdGFydEVsZW1lbnROcyAhPSBOVUxMKSB8fAotICAgICAgICAgKGN0eHQtPnNheC0+ZW5kRWxlbWVudE5zICE9IE5VTEwpKSkgY3R4dC0+c2F4MiA9IDE7CisgICAgaWYgKChzYXgpICYmICAoc2F4LT5pbml0aWFsaXplZCA9PSBYTUxfU0FYMl9NQUdJQykgJiYKKyAgICAgICAgKChzYXgtPnN0YXJ0RWxlbWVudE5zICE9IE5VTEwpIHx8CisgICAgICAgICAoc2F4LT5lbmRFbGVtZW50TnMgIT0gTlVMTCkgfHwKKyAgICAgICAgICgoc2F4LT5zdGFydEVsZW1lbnQgPT0gTlVMTCkgJiYgKHNheC0+ZW5kRWxlbWVudCA9PSBOVUxMKSkpKQorICAgICAgICBjdHh0LT5zYXgyID0gMTsKICNlbHNlCiAgICAgY3R4dC0+c2F4MiA9IDE7CiAjZW5kaWYgLyogTElCWE1MX1NBWDFfRU5BQkxFRCAqLwpAQCAtMTgyOSwxMyArMTg2OSwxNCBAQAogICAgIHJldHVybiAocmV0KTsKIH0KIAotI2lmZGVmIExJQlhNTF9QVVNIX0VOQUJMRUQKIC8qKgogICogbmFtZU5zUHVzaDoKICAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0CiAgKiBAdmFsdWU6ICB0aGUgZWxlbWVudCBuYW1lCiAgKiBAcHJlZml4OiAgdGhlIGVsZW1lbnQgcHJlZml4CiAgKiBAVVJJOiAgdGhlIGVsZW1lbnQgbmFtZXNwYWNlIG5hbWUKKyAqIEBsaW5lOiAgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgZm9yIGVycm9yIG1lc3NhZ2VzCisgKiBAbnNOcjogIHRoZSBudW1iZXIgb2YgbmFtZXNwYWNlcyBwdXNoZWQgb24gdGhlIG5hbWVzcGFjZSB0YWJsZQogICoKICAqIFB1c2hlcyBhIG5ldyBlbGVtZW50IG5hbWUvcHJlZml4L1VSTCBvbiB0b3Agb2YgdGhlIG5hbWUgc3RhY2sKICAqCkBAIC0xODQzLDExICsxODg0LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQKIG5hbWVOc1B1c2goeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBjb25zdCB4bWxDaGFyICogdmFsdWUsCi0gICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCwgY29uc3QgeG1sQ2hhciAqVVJJLCBpbnQgbnNOcikKKyAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqcHJlZml4LCBjb25zdCB4bWxDaGFyICpVUkksIGludCBsaW5lLCBpbnQgbnNOcikKIHsKKyAgICB4bWxTdGFydFRhZyAqdGFnOworCiAgICAgaWYgKGN0eHQtPm5hbWVOciA+PSBjdHh0LT5uYW1lTWF4KSB7CiAgICAgICAgIGNvbnN0IHhtbENoYXIgKiAqdG1wOwotICAgICAgICB2b2lkICoqdG1wMjsKKyAgICAgICAgeG1sU3RhcnRUYWcgKnRtcDI7CiAgICAgICAgIGN0eHQtPm5hbWVNYXggKj0gMjsKICAgICAgICAgdG1wID0gKGNvbnN0IHhtbENoYXIgKiAqKSB4bWxSZWFsbG9jKCh4bWxDaGFyICogKiljdHh0LT5uYW1lVGFiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+bmFtZU1heCAqCkBAIC0xODU3LDI1ICsxOTAwLDMzIEBACiAJICAgIGdvdG8gbWVtX2Vycm9yOwogICAgICAgICB9CiAJY3R4dC0+bmFtZVRhYiA9IHRtcDsKLSAgICAgICAgdG1wMiA9ICh2b2lkICoqKSB4bWxSZWFsbG9jKCh2b2lkICogKiljdHh0LT5wdXNoVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+bmFtZU1heCAqIDMgKgorICAgICAgICB0bXAyID0gKHhtbFN0YXJ0VGFnICopIHhtbFJlYWxsb2MoKHZvaWQgKiAqKWN0eHQtPnB1c2hUYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5uYW1lTWF4ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdHh0LT5wdXNoVGFiWzBdKSk7CiAgICAgICAgIGlmICh0bXAyID09IE5VTEwpIHsKIAkgICAgY3R4dC0+bmFtZU1heCAvPSAyOwogCSAgICBnb3RvIG1lbV9lcnJvcjsKICAgICAgICAgfQogCWN0eHQtPnB1c2hUYWIgPSB0bXAyOworICAgIH0gZWxzZSBpZiAoY3R4dC0+cHVzaFRhYiA9PSBOVUxMKSB7CisgICAgICAgIGN0eHQtPnB1c2hUYWIgPSAoeG1sU3RhcnRUYWcgKikgeG1sTWFsbG9jKGN0eHQtPm5hbWVNYXggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3R4dC0+cHVzaFRhYlswXSkpOworICAgICAgICBpZiAoY3R4dC0+cHVzaFRhYiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBtZW1fZXJyb3I7CiAgICAgfQogICAgIGN0eHQtPm5hbWVUYWJbY3R4dC0+bmFtZU5yXSA9IHZhbHVlOwogICAgIGN0eHQtPm5hbWUgPSB2YWx1ZTsKLSAgICBjdHh0LT5wdXNoVGFiW2N0eHQtPm5hbWVOciAqIDNdID0gKHZvaWQgKikgcHJlZml4OwotICAgIGN0eHQtPnB1c2hUYWJbY3R4dC0+bmFtZU5yICogMyArIDFdID0gKHZvaWQgKikgVVJJOwotICAgIGN0eHQtPnB1c2hUYWJbY3R4dC0+bmFtZU5yICogMyArIDJdID0gKHZvaWQgKikgKHB0cmRpZmZfdCkgbnNOcjsKKyAgICB0YWcgPSAmY3R4dC0+cHVzaFRhYltjdHh0LT5uYW1lTnJdOworICAgIHRhZy0+cHJlZml4ID0gcHJlZml4OworICAgIHRhZy0+VVJJID0gVVJJOworICAgIHRhZy0+bGluZSA9IGxpbmU7CisgICAgdGFnLT5uc05yID0gbnNOcjsKICAgICByZXR1cm4gKGN0eHQtPm5hbWVOcisrKTsKIG1lbV9lcnJvcjoKICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CiAgICAgcmV0dXJuICgtMSk7CiB9CisjaWZkZWYgTElCWE1MX1BVU0hfRU5BQkxFRAogLyoqCiAgKiBuYW1lTnNQb3A6CiAgKiBAY3R4dDogYW4gWE1MIHBhcnNlciBjb250ZXh0CkBAIC0yMDUxLDcgKzIxMDIsNyBAQAogICAgICgodW5zaWduZWQgY2hhciAqKSBzKVsgOSBdID09IGMxMCApCiAKICNkZWZpbmUgU0tJUCh2YWwpIGRvIHsJCQkJCQkJXAotICAgIGN0eHQtPm5iQ2hhcnMgKz0gKHZhbCksY3R4dC0+aW5wdXQtPmN1ciArPSAodmFsKSxjdHh0LT5pbnB1dC0+Y29sKz0odmFsKTsJCQlcCisgICAgY3R4dC0+aW5wdXQtPmN1ciArPSAodmFsKSxjdHh0LT5pbnB1dC0+Y29sKz0odmFsKTsJCQlcCiAgICAgaWYgKCpjdHh0LT5pbnB1dC0+Y3VyID09IDApCQkJCQkJXAogICAgICAgICB4bWxQYXJzZXJJbnB1dEdyb3coY3R4dC0+aW5wdXQsIElOUFVUX0NIVU5LKTsJCQlcCiAgIH0gd2hpbGUgKDApCkBAIC0yMDYyLDcgKzIxMTMsNiBAQAogCWlmICgqKGN0eHQtPmlucHV0LT5jdXIpID09ICdcbicpIHsJCQkJXAogCWN0eHQtPmlucHV0LT5saW5lKys7IGN0eHQtPmlucHV0LT5jb2wgPSAxOwkJCVwKIAl9IGVsc2UgY3R4dC0+aW5wdXQtPmNvbCsrOwkJCQkJXAotCWN0eHQtPm5iQ2hhcnMrKzsJCQkJCQlcCiAJY3R4dC0+aW5wdXQtPmN1cisrOwkJCQkJCVwKICAgICB9CQkJCQkJCQkJXAogICAgIGlmICgqY3R4dC0+aW5wdXQtPmN1ciA9PSAwKQkJCQkJCVwKQEAgLTIxMTUsNyArMjE2NSw2IEBACiAjZGVmaW5lIE5FWFQxIHsJCQkJCQkJCVwKIAljdHh0LT5pbnB1dC0+Y29sKys7CQkJCQkJXAogCWN0eHQtPmlucHV0LT5jdXIrKzsJCQkJCQlcCi0JY3R4dC0+bmJDaGFycysrOwkJCQkJCVwKIAlpZiAoKmN0eHQtPmlucHV0LT5jdXIgPT0gMCkJCQkJCVwKIAkgICAgeG1sUGFyc2VySW5wdXRHcm93KGN0eHQtPmlucHV0LCBJTlBVVF9DSFVOSyk7CQlcCiAgICAgfQpAQCAtMjE1Miw3ICsyMjAxLDcgQEAKICAgICAgKiBJdCdzIE9rYXkgdG8gdXNlIENVUi9ORVhUIGhlcmUgc2luY2UgYWxsIHRoZSBibGFua3MgYXJlIG9uCiAgICAgICogdGhlIEFTQ0lJIHJhbmdlLgogICAgICAqLwotICAgIGlmICgoY3R4dC0+aW5wdXROciA9PSAxKSAmJiAoY3R4dC0+aW5zdGF0ZSAhPSBYTUxfUEFSU0VSX0RURCkpIHsKKyAgICBpZiAoY3R4dC0+aW5zdGF0ZSAhPSBYTUxfUEFSU0VSX0RURCkgewogCWNvbnN0IHhtbENoYXIgKmN1cjsKIAkvKgogCSAqIGlmIHdlIGFyZSBpbiB0aGUgZG9jdW1lbnQgY29udGVudCwgZ28gcmVhbGx5IGZhc3QKQEAgLTIzMjgsNyArMjM3Nyw2IEBACiAJaWYgKFJBVyA9PSAnOycpIHsKIAkgICAgLyogb24gcHVycG9zZSB0byBhdm9pZCByZWVudHJhbmN5IHByb2JsZW1zIHdpdGggTkVYVCBhbmQgU0tJUCAqLwogCSAgICBjdHh0LT5pbnB1dC0+Y29sKys7Ci0JICAgIGN0eHQtPm5iQ2hhcnMgKys7CiAJICAgIGN0eHQtPmlucHV0LT5jdXIrKzsKIAl9CiAgICAgfSBlbHNlIGlmICAoKFJBVyA9PSAnJicpICYmIChOWFQoMSkgPT0gJyMnKSkgewpAQCAtMjM1Nyw3ICsyNDA1LDYgQEAKIAlpZiAoUkFXID09ICc7JykgewogCSAgICAvKiBvbiBwdXJwb3NlIHRvIGF2b2lkIHJlZW50cmFuY3kgcHJvYmxlbXMgd2l0aCBORVhUIGFuZCBTS0lQICovCiAJICAgIGN0eHQtPmlucHV0LT5jb2wrKzsKLQkgICAgY3R4dC0+bmJDaGFycyArKzsKIAkgICAgY3R4dC0+aW5wdXQtPmN1cisrOwogCX0KICAgICB9IGVsc2UgewpAQCAtMjY4MCw4ICsyNzI3LDEwIEBACiAJCXJlcCA9IHhtbFN0cmluZ0RlY29kZUVudGl0aWVzKGN0eHQsIGVudC0+Y29udGVudCwgd2hhdCwKIAkJCSAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKIAkJY3R4dC0+ZGVwdGgtLTsKLQkJaWYgKHJlcCA9PSBOVUxMKQorCQlpZiAocmVwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50LT5jb250ZW50WzBdID0gMDsKICAgICAgICAgICAgICAgICAgICAgZ290byBpbnRfZXJyb3I7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY3VycmVudCA9IHJlcDsKICAgICAgICAgICAgICAgICB3aGlsZSAoKmN1cnJlbnQgIT0gMCkgeyAvKiBub24gaW5wdXQgY29uc3VtaW5nIGxvb3AgKi8KQEAgLTI3MzYsOCArMjc4NSwxMSBAQAogCQlyZXAgPSB4bWxTdHJpbmdEZWNvZGVFbnRpdGllcyhjdHh0LCBlbnQtPmNvbnRlbnQsIHdoYXQsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CiAJCWN0eHQtPmRlcHRoLS07Ci0JCWlmIChyZXAgPT0gTlVMTCkKKwkJaWYgKHJlcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnQtPmNvbnRlbnQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudC0+Y29udGVudFswXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW50X2Vycm9yOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcmVwOwogICAgICAgICAgICAgICAgIHdoaWxlICgqY3VycmVudCAhPSAwKSB7IC8qIG5vbiBpbnB1dCBjb25zdW1pbmcgbG9vcCAqLwogICAgICAgICAgICAgICAgICAgICBidWZmZXJbbmJjaGFycysrXSA9ICpjdXJyZW50Kys7CkBAIC0zMzI5LDcgKzMzODEsNiBAQAogICAgICAgICAgICAgfQogCSAgICByZXQgPSB4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIGN0eHQtPmlucHV0LT5jdXIsIGNvdW50KTsKIAkgICAgY3R4dC0+aW5wdXQtPmN1ciA9IGluOwotCSAgICBjdHh0LT5uYkNoYXJzICs9IGNvdW50OwogCSAgICBjdHh0LT5pbnB1dC0+Y29sICs9IGNvdW50OwogCSAgICBpZiAocmV0ID09IE5VTEwpCiAJICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CkBAIC0zNDUyLDcgKzM1MDMsNiBAQAogICAgICAgICAgICAgfQogCSAgICByZXQgPSB4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIGN0eHQtPmlucHV0LT5jdXIsIGNvdW50KTsKIAkgICAgY3R4dC0+aW5wdXQtPmN1ciA9IGluOwotCSAgICBjdHh0LT5uYkNoYXJzICs9IGNvdW50OwogCSAgICBjdHh0LT5pbnB1dC0+Y29sICs9IGNvdW50OwogCSAgICBpZiAocmV0ID09IE5VTEwpIHsKIAkgICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKQEAgLTM0ODksMTAgKzM1MzksMTAgQEAKICAgICB3aGlsZSAoKmluICE9IDAgJiYgKmluID09ICpjbXApIHsKIAkrK2luOwogCSsrY21wOwotCWN0eHQtPmlucHV0LT5jb2wrKzsKICAgICB9CiAgICAgaWYgKCpjbXAgPT0gMCAmJiAoKmluID09ICc+JyB8fCBJU19CTEFOS19DSCAoKmluKSkpIHsKIAkvKiBzdWNjZXNzICovCisJY3R4dC0+aW5wdXQtPmNvbCArPSBpbiAtIGN0eHQtPmlucHV0LT5jdXI7CiAJY3R4dC0+aW5wdXQtPmN1ciA9IGluOwogCXJldHVybiAoY29uc3QgeG1sQ2hhciopIDE7CiAgICAgfQpAQCAtNDIwMiw2ICs0MjUyLDcgQEAKIAl9CiAJY291bnQrKzsKIAlpZiAoY291bnQgPiA1MCkgeworCSAgICBTSFJJTks7CiAJICAgIEdST1c7CiAJICAgIGNvdW50ID0gMDsKICAgICAgICAgICAgIGlmIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKSB7CkBAIC00Mjg5LDYgKzQzNDAsNyBAQAogCWJ1ZltsZW4rK10gPSBjdXI7CiAJY291bnQrKzsKIAlpZiAoY291bnQgPiA1MCkgeworCSAgICBTSFJJTks7CiAJICAgIEdST1c7CiAJICAgIGNvdW50ID0gMDsKICAgICAgICAgICAgIGlmIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKSB7CkBAIC00NTA0LDcgKzQ1NTYsNyBAQAogICAgICAgICAgICAgaWYgKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9FT0YpCiAJCXJldHVybjsKIAkgICAgaW4gPSBjdHh0LT5pbnB1dC0+Y3VyOwotCX0gd2hpbGUgKCgoKmluID49IDB4MjApICYmICgqaW4gPD0gMHg3RikpIHx8ICgqaW4gPT0gMHgwOSkpOworCX0gd2hpbGUgKCgoKmluID49IDB4MjApICYmICgqaW4gPD0gMHg3RikpIHx8ICgqaW4gPT0gMHgwOSkgfHwgKCppbiA9PSAweDBhKSk7CiAJbmJjaGFyID0gMDsKICAgICB9CiAgICAgY3R4dC0+aW5wdXQtPmxpbmUgPSBsaW5lOwpAQCAtNDU2OSw2ICs0NjIxLDcgQEAKIAl9CiAJY291bnQrKzsKIAlpZiAoY291bnQgPiA1MCkgeworCSAgICBTSFJJTks7CiAJICAgIEdST1c7CiAJICAgIGNvdW50ID0gMDsKICAgICAgICAgICAgIGlmIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKQpAQCAtNDc3NCw2ICs0ODI3LDcgQEAKIAogCWNvdW50Kys7CiAJaWYgKGNvdW50ID4gNTApIHsKKwkgICAgU0hSSU5LOwogCSAgICBHUk9XOwogCSAgICBjb3VudCA9IDA7CiAgICAgICAgICAgICBpZiAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0VPRikgewpAQCAtNDk4NSw3ICs1MDM5LDcgQEAKIAkgICAgY3R4dC0+aW5wdXQtPmNvbCsrOwogCSAgICBnb3RvIGdldF9tb3JlOwogCX0KLSAgICB9IHdoaWxlICgoKCppbiA+PSAweDIwKSAmJiAoKmluIDw9IDB4N0YpKSB8fCAoKmluID09IDB4MDkpKTsKKyAgICB9IHdoaWxlICgoKCppbiA+PSAweDIwKSAmJiAoKmluIDw9IDB4N0YpKSB8fCAoKmluID09IDB4MDkpIHx8ICgqaW4gPT0gMHgwYSkpOwogICAgIHhtbFBhcnNlQ29tbWVudENvbXBsZXgoY3R4dCwgYnVmLCBsZW4sIHNpemUpOwogICAgIGN0eHQtPmluc3RhdGUgPSBzdGF0ZTsKICAgICByZXR1cm47CkBAIC01MTg0LDYgKzUyMzgsNyBAQAogCQl9CiAJCWNvdW50Kys7CiAJCWlmIChjb3VudCA+IDUwKSB7CisJCSAgICBTSFJJTks7CiAJCSAgICBHUk9XOwogICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0VPRikgewogICAgICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShidWYpOwpAQCAtNjA4MCwxNCArNjEzNSwyMCBAQAogCSAgICBORVhUOwogCSAgICBpZiAoZWxlbSA9PSBOVUxMKSB7CiAJICAgICAgICByZXQgPSB4bWxOZXdEb2NFbGVtZW50Q29udGVudChjdHh0LT5teURvYywgTlVMTCwgWE1MX0VMRU1FTlRfQ09OVEVOVF9PUik7Ci0JCWlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCQlpZiAocmV0ID09IE5VTEwpIHsKKwkJICAgIHhtbEZyZWVEb2NFbGVtZW50Q29udGVudChjdHh0LT5teURvYywgY3VyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICAgICAgICAgIH0KIAkJcmV0LT5jMSA9IGN1cjsKIAkJaWYgKGN1ciAhPSBOVUxMKQogCQkgICAgY3VyLT5wYXJlbnQgPSByZXQ7CiAJCWN1ciA9IHJldDsKIAkgICAgfSBlbHNlIHsKIAkgICAgICAgIG4gPSB4bWxOZXdEb2NFbGVtZW50Q29udGVudChjdHh0LT5teURvYywgTlVMTCwgWE1MX0VMRU1FTlRfQ09OVEVOVF9PUik7Ci0JCWlmIChuID09IE5VTEwpIHJldHVybihOVUxMKTsKKwkJaWYgKG4gPT0gTlVMTCkgeworCQkgICAgeG1sRnJlZURvY0VsZW1lbnRDb250ZW50KGN0eHQtPm15RG9jLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgICAgICAgICAgfQogCQluLT5jMSA9IHhtbE5ld0RvY0VsZW1lbnRDb250ZW50KGN0eHQtPm15RG9jLCBlbGVtLCBYTUxfRUxFTUVOVF9DT05URU5UX0VMRU1FTlQpOwogCQlpZiAobi0+YzEgIT0gTlVMTCkKIAkJICAgIG4tPmMxLT5wYXJlbnQgPSBuOwpAQCAtNjE5MCw2ICs2MjUxLDggQEAKIAlTS0lQX0JMQU5LUzsKICAgICAgICAgY3VyID0gcmV0ID0geG1sUGFyc2VFbGVtZW50Q2hpbGRyZW5Db250ZW50RGVjbFByaXYoY3R4dCwgaW5wdXRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggKyAxKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE5VTEwpOwogCVNLSVBfQkxBTktTOwogCUdST1c7CiAgICAgfSBlbHNlIHsKQEAgLTYzMjMsNiArNjM4NiwxMSBAQAogCSAgICBTS0lQX0JMQU5LUzsKIAkgICAgbGFzdCA9IHhtbFBhcnNlRWxlbWVudENoaWxkcmVuQ29udGVudERlY2xQcml2KGN0eHQsIGlucHV0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggKyAxKTsKKyAgICAgICAgICAgIGlmIChsYXN0ID09IE5VTEwpIHsKKwkJaWYgKHJldCAhPSBOVUxMKQorCQkgICAgeG1sRnJlZURvY0VsZW1lbnRDb250ZW50KGN0eHQtPm15RG9jLCByZXQpOworCQlyZXR1cm4oTlVMTCk7CisgICAgICAgICAgICB9CiAJICAgIFNLSVBfQkxBTktTOwogCX0gZWxzZSB7CiAJICAgIGVsZW0gPSB4bWxQYXJzZU5hbWUoY3R4dCk7CkBAIC02ODQ4LDYgKzY5MTYsNyBAQAogeG1sUGFyc2VUZXh0RGVjbCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKICAgICB4bWxDaGFyICp2ZXJzaW9uOwogICAgIGNvbnN0IHhtbENoYXIgKmVuY29kaW5nOworICAgIGludCBvbGRzdGF0ZTsKIAogICAgIC8qCiAgICAgICogV2Uga25vdyB0aGF0ICc8P3htbCcgaXMgaGVyZS4KQEAgLTY4NTksNiArNjkyOCwxMCBAQAogCXJldHVybjsKICAgICB9CiAKKyAgICAvKiBBdm9pZCBleHBhbnNpb24gb2YgcGFyYW1ldGVyIGVudGl0aWVzIHdoZW4gc2tpcHBpbmcgYmxhbmtzLiAqLworICAgIG9sZHN0YXRlID0gY3R4dC0+aW5zdGF0ZTsKKyAgICBjdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9TVEFSVDsKKwogICAgIGlmIChTS0lQX0JMQU5LUyA9PSAwKSB7CiAJeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9TUEFDRV9SRVFVSVJFRCwKIAkJICAgICAgICJTcGFjZSBuZWVkZWQgYWZ0ZXIgJzw/eG1sJ1xuIik7CkBAIC02ODg2LDYgKzY5NTksNyBAQAogCS8qCiAJICogVGhlIFhNTCBSRUMgaW5zdHJ1Y3RzIHVzIHRvIHN0b3AgcGFyc2luZyByaWdodCBoZXJlCiAJICovCisgICAgICAgIGN0eHQtPmluc3RhdGUgPSBvbGRzdGF0ZTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoKGVuY29kaW5nID09IE5VTEwpICYmIChjdHh0LT5lcnJObyA9PSBYTUxfRVJSX09LKSkgewpAQCAtNjkwNSw2ICs2OTc5LDggQEAKIAlNT1ZFVE9fRU5EVEFHKENVUl9QVFIpOwogCU5FWFQ7CiAgICAgfQorCisgICAgY3R4dC0+aW5zdGF0ZSA9IG9sZHN0YXRlOwogfQogCiAvKioKQEAgLTcxNDcsNiArNzIyMyw3IEBACiAJICAgIGVudC0+Y2hlY2tlZCB8PSAxOwogCWlmIChyZXQgPT0gWE1MX0VSUl9FTlRJVFlfTE9PUCkgewogCSAgICB4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0VOVElUWV9MT09QLCBOVUxMKTsKKyAgICAgICAgICAgIHhtbEhhbHRQYXJzZXIoY3R4dCk7CiAJICAgIHhtbEZyZWVOb2RlTGlzdChsaXN0KTsKIAkgICAgcmV0dXJuOwogCX0KQEAgLTc5MjcsNiArODAwNCw5IEBACiAgICAgICAgICAgICB4bWxDaGFyIHN0YXJ0WzRdOwogICAgICAgICAgICAgeG1sQ2hhckVuY29kaW5nIGVuYzsKIAorCSAgICBpZiAoeG1sUGFyc2VyRW50aXR5Q2hlY2soY3R4dCwgMCwgZW50aXR5LCAwKSkKKwkgICAgICAgIHJldHVybjsKKwogCSAgICBpZiAoKGVudGl0eS0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpICYmCiAJICAgICAgICAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfUEFSU0VfTk9FTlQpID09IDApICYmCiAJCSgoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9EVERWQUxJRCkgPT0gMCkgJiYKQEAgLTg4MjUsNiArODkwNSw3IEBACiAJfQogCWlmICgqY21wID09IDAgJiYgKCppbiA9PSAnPicgfHwgSVNfQkxBTktfQ0ggKCppbikpKSB7CiAJICAgIC8qIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIGN0eHQtPmlucHV0LT5jb2wgKz0gaW4gLSBjdHh0LT5pbnB1dC0+Y3VyOwogCSAgICBjdHh0LT5pbnB1dC0+Y3VyID0gaW47CiAJICAgIHJldHVybigoY29uc3QgeG1sQ2hhciopIDEpOwogCX0KQEAgLTk2MjUsMTAgKzk3MDYsOCBAQAogICovCiAKIHN0YXRpYyB2b2lkCi14bWxQYXJzZUVuZFRhZzIoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBjb25zdCB4bWxDaGFyICpwcmVmaXgsCi0gICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqVVJJLCBpbnQgbGluZSwgaW50IG5zTnIsIGludCB0bGVuKSB7Cit4bWxQYXJzZUVuZFRhZzIoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBjb25zdCB4bWxTdGFydFRhZyAqdGFnKSB7CiAgICAgY29uc3QgeG1sQ2hhciAqbmFtZTsKLSAgICBzaXplX3QgY3VyTGVuZ3RoOwogCiAgICAgR1JPVzsKICAgICBpZiAoKFJBVyAhPSAnPCcpIHx8IChOWFQoMSkgIT0gJy8nKSkgewpAQCAtOTYzNywyNCArOTcxNiwxMCBAQAogICAgIH0KICAgICBTS0lQKDIpOwogCi0gICAgY3VyTGVuZ3RoID0gY3R4dC0+aW5wdXQtPmVuZCAtIGN0eHQtPmlucHV0LT5jdXI7Ci0gICAgaWYgKCh0bGVuID4gMCkgJiYgKGN1ckxlbmd0aCA+PSAoc2l6ZV90KXRsZW4pICYmCi0gICAgICAgICh4bWxTdHJuY21wKGN0eHQtPmlucHV0LT5jdXIsIGN0eHQtPm5hbWUsIHRsZW4pID09IDApKSB7Ci0gICAgICAgIGlmICgoY3VyTGVuZ3RoID49IChzaXplX3QpKHRsZW4gKyAxKSkgJiYKLQkgICAgKGN0eHQtPmlucHV0LT5jdXJbdGxlbl0gPT0gJz4nKSkgewotCSAgICBjdHh0LT5pbnB1dC0+Y3VyICs9IHRsZW4gKyAxOwotCSAgICBjdHh0LT5pbnB1dC0+Y29sICs9IHRsZW4gKyAxOwotCSAgICBnb3RvIGRvbmU7Ci0JfQotCWN0eHQtPmlucHV0LT5jdXIgKz0gdGxlbjsKLQljdHh0LT5pbnB1dC0+Y29sICs9IHRsZW47Ci0JbmFtZSA9ICh4bWxDaGFyKikxOwotICAgIH0gZWxzZSB7Ci0JaWYgKHByZWZpeCA9PSBOVUxMKQotCSAgICBuYW1lID0geG1sUGFyc2VOYW1lQW5kQ29tcGFyZShjdHh0LCBjdHh0LT5uYW1lKTsKLQllbHNlCi0JICAgIG5hbWUgPSB4bWxQYXJzZVFOYW1lQW5kQ29tcGFyZShjdHh0LCBjdHh0LT5uYW1lLCBwcmVmaXgpOwotICAgIH0KKyAgICBpZiAodGFnLT5wcmVmaXggPT0gTlVMTCkKKyAgICAgICAgbmFtZSA9IHhtbFBhcnNlTmFtZUFuZENvbXBhcmUoY3R4dCwgY3R4dC0+bmFtZSk7CisgICAgZWxzZQorICAgICAgICBuYW1lID0geG1sUGFyc2VRTmFtZUFuZENvbXBhcmUoY3R4dCwgY3R4dC0+bmFtZSwgdGFnLT5wcmVmaXgpOwogCiAgICAgLyoKICAgICAgKiBXZSBzaG91bGQgZGVmaW5pdGVseSBiZSBhdCB0aGUgZW5kaW5nICJTPyAnPiciIHBhcnQKQEAgLTk2NzYsMjUgKzk3NDEsMjIgQEAKICAgICAgKi8KICAgICBpZiAobmFtZSAhPSAoeG1sQ2hhciopMSkgewogICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSBuYW1lID0gQkFEX0NBU1QgInVucGFyc2FibGUiOwotICAgICAgICBpZiAoKGxpbmUgPT0gMCkgJiYgKGN0eHQtPm5vZGUgIT0gTlVMTCkpCi0gICAgICAgICAgICBsaW5lID0gY3R4dC0+bm9kZS0+bGluZTsKICAgICAgICAgeG1sRmF0YWxFcnJNc2dTdHJJbnRTdHIoY3R4dCwgWE1MX0VSUl9UQUdfTkFNRV9NSVNNQVRDSCwKIAkJICAgICAiT3BlbmluZyBhbmQgZW5kaW5nIHRhZyBtaXNtYXRjaDogJXMgbGluZSAlZCBhbmQgJXNcbiIsCi0JCSAgICAgICAgICAgICAgICBjdHh0LT5uYW1lLCBsaW5lLCBuYW1lKTsKKwkJICAgICAgICAgICAgICAgIGN0eHQtPm5hbWUsIHRhZy0+bGluZSwgbmFtZSk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBTQVg6IEVuZCBvZiBUYWcKICAgICAgKi8KLWRvbmU6CiAgICAgaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+ZW5kRWxlbWVudE5zICE9IE5VTEwpICYmCiAJKCFjdHh0LT5kaXNhYmxlU0FYKSkKLQljdHh0LT5zYXgtPmVuZEVsZW1lbnROcyhjdHh0LT51c2VyRGF0YSwgY3R4dC0+bmFtZSwgcHJlZml4LCBVUkkpOworCWN0eHQtPnNheC0+ZW5kRWxlbWVudE5zKGN0eHQtPnVzZXJEYXRhLCBjdHh0LT5uYW1lLCB0YWctPnByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLT5VUkkpOwogCiAgICAgc3BhY2VQb3AoY3R4dCk7Ci0gICAgaWYgKG5zTnIgIT0gMCkKLQluc1BvcChjdHh0LCBuc05yKTsKLSAgICByZXR1cm47CisgICAgaWYgKHRhZy0+bnNOciAhPSAwKQorCW5zUG9wKGN0eHQsIHRhZy0+bnNOcik7CiB9CiAKIC8qKgpAQCAtOTc3Niw2ICs5ODM4LDcgQEAKIAlzbCA9IGw7CiAJY291bnQrKzsKIAlpZiAoY291bnQgPiA1MCkgeworCSAgICBTSFJJTks7CiAJICAgIEdST1c7CiAgICAgICAgICAgICBpZiAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0VPRikgewogCQl4bWxGcmVlKGJ1Zik7CkBAIC05ODA5LDE5ICs5ODcyLDE5IEBACiB9CiAKIC8qKgotICogeG1sUGFyc2VDb250ZW50OgorICogeG1sUGFyc2VDb250ZW50SW50ZXJuYWw6CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAogICoKLSAqIFBhcnNlIGEgY29udGVudDoKLSAqCi0gKiBbNDNdIGNvbnRlbnQgOjo9IChlbGVtZW50IHwgQ2hhckRhdGEgfCBSZWZlcmVuY2UgfCBDRFNlY3QgfCBQSSB8IENvbW1lbnQpKgorICogUGFyc2UgYSBjb250ZW50IHNlcXVlbmNlLiBTdG9wcyBhdCBFT0Ygb3IgJzwvJy4gTGVhdmVzIGNoZWNraW5nIG9mCisgKiB1bmV4cGVjdGVkIEVPRiB0byB0aGUgY2FsbGVyLgogICovCiAKLXZvaWQKLXhtbFBhcnNlQ29udGVudCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKK3N0YXRpYyB2b2lkCit4bWxQYXJzZUNvbnRlbnRJbnRlcm5hbCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKKyAgICBpbnQgbmFtZU5yID0gY3R4dC0+bmFtZU5yOworCiAgICAgR1JPVzsKICAgICB3aGlsZSAoKFJBVyAhPSAwKSAmJgotCSAgICgoUkFXICE9ICc8JykgfHwgKE5YVCgxKSAhPSAnLycpKSAmJgogCSAgIChjdHh0LT5pbnN0YXRlICE9IFhNTF9QQVJTRVJfRU9GKSkgewogCWNvbnN0IHhtbENoYXIgKnRlc3QgPSBDVVJfUFRSOwogCXVuc2lnbmVkIGludCBjb25zID0gY3R4dC0+aW5wdXQtPmNvbnN1bWVkOwpAQCAtOTg1NSw3ICs5OTE4LDEzIEBACiAJICogRm91cnRoIGNhc2UgOiAgYSBzdWItZWxlbWVudC4KIAkgKi8KIAllbHNlIGlmICgqY3VyID09ICc8JykgewotCSAgICB4bWxQYXJzZUVsZW1lbnQoY3R4dCk7CisgICAgICAgICAgICBpZiAoTlhUKDEpID09ICcvJykgeworICAgICAgICAgICAgICAgIGlmIChjdHh0LT5uYW1lTnIgPD0gbmFtZU5yKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgICAgIHhtbFBhcnNlRWxlbWVudEVuZChjdHh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJICAgICAgICB4bWxQYXJzZUVsZW1lbnRTdGFydChjdHh0KTsKKyAgICAgICAgICAgIH0KIAl9CiAKIAkvKgpAQCAtOTg4NywxMCArOTk1NiwzNCBAQAogfQogCiAvKioKKyAqIHhtbFBhcnNlQ29udGVudDoKKyAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0CisgKgorICogUGFyc2UgYSBjb250ZW50IHNlcXVlbmNlLiBTdG9wcyBhdCBFT0Ygb3IgJzwvJy4KKyAqCisgKiBbNDNdIGNvbnRlbnQgOjo9IChlbGVtZW50IHwgQ2hhckRhdGEgfCBSZWZlcmVuY2UgfCBDRFNlY3QgfCBQSSB8IENvbW1lbnQpKgorICovCisKK3ZvaWQKK3htbFBhcnNlQ29udGVudCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKKyAgICBpbnQgbmFtZU5yID0gY3R4dC0+bmFtZU5yOworCisgICAgeG1sUGFyc2VDb250ZW50SW50ZXJuYWwoY3R4dCk7CisKKyAgICBpZiAoKGN0eHQtPmluc3RhdGUgIT0gWE1MX1BBUlNFUl9FT0YpICYmIChjdHh0LT5uYW1lTnIgPiBuYW1lTnIpKSB7CisgICAgICAgIGNvbnN0IHhtbENoYXIgKm5hbWUgPSBjdHh0LT5uYW1lVGFiW2N0eHQtPm5hbWVOciAtIDFdOworICAgICAgICBpbnQgbGluZSA9IGN0eHQtPnB1c2hUYWJbY3R4dC0+bmFtZU5yIC0gMV0ubGluZTsKKyAgICAgICAgeG1sRmF0YWxFcnJNc2dTdHJJbnRTdHIoY3R4dCwgWE1MX0VSUl9UQUdfTk9UX0ZJTklTSEVELAorICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEgaW4gdGFnICVzIGxpbmUgJWRcbiIsCisJCW5hbWUsIGxpbmUsIE5VTEwpOworICAgIH0KK30KKworLyoqCiAgKiB4bWxQYXJzZUVsZW1lbnQ6CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAogICoKLSAqIHBhcnNlIGFuIFhNTCBlbGVtZW50LCB0aGlzIGlzIGhpZ2hseSByZWN1cnNpdmUKKyAqIHBhcnNlIGFuIFhNTCBlbGVtZW50CiAgKgogICogWzM5XSBlbGVtZW50IDo6PSBFbXB0eUVsZW1UYWcgfCBTVGFnIGNvbnRlbnQgRVRhZwogICoKQEAgLTk5MDIsNiArOTk5NSwzNCBAQAogCiB2b2lkCiB4bWxQYXJzZUVsZW1lbnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CisgICAgaWYgKHhtbFBhcnNlRWxlbWVudFN0YXJ0KGN0eHQpICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHhtbFBhcnNlQ29udGVudEludGVybmFsKGN0eHQpOworICAgIGlmIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKQorCXJldHVybjsKKworICAgIGlmIChDVVIgPT0gMCkgeworICAgICAgICBjb25zdCB4bWxDaGFyICpuYW1lID0gY3R4dC0+bmFtZVRhYltjdHh0LT5uYW1lTnIgLSAxXTsKKyAgICAgICAgaW50IGxpbmUgPSBjdHh0LT5wdXNoVGFiW2N0eHQtPm5hbWVOciAtIDFdLmxpbmU7CisgICAgICAgIHhtbEZhdGFsRXJyTXNnU3RySW50U3RyKGN0eHQsIFhNTF9FUlJfVEFHX05PVF9GSU5JU0hFRCwKKyAgICAgICAgICAgICAgICAiUHJlbWF0dXJlIGVuZCBvZiBkYXRhIGluIHRhZyAlcyBsaW5lICVkXG4iLAorCQluYW1lLCBsaW5lLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHhtbFBhcnNlRWxlbWVudEVuZChjdHh0KTsKK30KKworLyoqCisgKiB4bWxQYXJzZUVsZW1lbnRTdGFydDoKKyAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0CisgKgorICogUGFyc2UgdGhlIHN0YXJ0IG9mIGFuIFhNTCBlbGVtZW50LiBSZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IsIDAgaWYgYW4KKyAqIG9wZW5pbmcgdGFnIHdhcyBwYXJzZWQsIDEgaWYgYW4gZW1wdHkgZWxlbWVudCB3YXMgcGFyc2VkLgorICovCitzdGF0aWMgaW50Cit4bWxQYXJzZUVsZW1lbnRTdGFydCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKICAgICBjb25zdCB4bWxDaGFyICpuYW1lOwogICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCA9IE5VTEw7CiAgICAgY29uc3QgeG1sQ2hhciAqVVJJID0gTlVMTDsKQEAgLTk5MTYsNyArMTAwMzcsNyBAQAogCQkgIkV4Y2Vzc2l2ZSBkZXB0aCBpbiBkb2N1bWVudDogJWQgdXNlIFhNTF9QQVJTRV9IVUdFIG9wdGlvblxuIiwKIAkJCSAgeG1sUGFyc2VyTWF4RGVwdGgpOwogCXhtbEhhbHRQYXJzZXIoY3R4dCk7Ci0JcmV0dXJuOworCXJldHVybigtMSk7CiAgICAgfQogCiAgICAgLyogQ2FwdHVyZSBzdGFydCBwb3NpdGlvbiAqLwpAQCAtOTk0MywxMiArMTAwNjQsMTIgQEAKIAluYW1lID0geG1sUGFyc2VTdGFydFRhZyhjdHh0KTsKICNlbmRpZiAvKiBMSUJYTUxfU0FYMV9FTkFCTEVEICovCiAgICAgaWYgKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9FT0YpCi0JcmV0dXJuOworCXJldHVybigtMSk7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewogCXNwYWNlUG9wKGN0eHQpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybigtMSk7CiAgICAgfQotICAgIG5hbWVQdXNoKGN0eHQsIG5hbWUpOworICAgIG5hbWVOc1B1c2goY3R4dCwgbmFtZSwgcHJlZml4LCBVUkksIGxpbmUsIGN0eHQtPm5zTnIgLSBuc05yKTsKICAgICByZXQgPSBjdHh0LT5ub2RlOwogCiAjaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKQEAgLTk5ODksNyArMTAxMTAsNyBAQAogCSAgIG5vZGVfaW5mby5ub2RlID0gcmV0OwogCSAgIHhtbFBhcnNlckFkZE5vZGVJbmZvKGN0eHQsICZub2RlX2luZm8pOwogCX0KLQlyZXR1cm47CisJcmV0dXJuKDEpOwogICAgIH0KICAgICBpZiAoUkFXID09ICc+JykgewogICAgICAgICBORVhUMTsKQEAgLTEwMDE3LDQxICsxMDEzOCwzNiBAQAogCSAgIG5vZGVfaW5mby5ub2RlID0gcmV0OwogCSAgIHhtbFBhcnNlckFkZE5vZGVJbmZvKGN0eHQsICZub2RlX2luZm8pOwogCX0KLQlyZXR1cm47CisJcmV0dXJuKC0xKTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OgotICAgICAqLwotICAgIHhtbFBhcnNlQ29udGVudChjdHh0KTsKLSAgICBpZiAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0VPRikKLQlyZXR1cm47Ci0gICAgaWYgKCFJU19CWVRFX0NIQVIoUkFXKSkgewotICAgICAgICB4bWxGYXRhbEVyck1zZ1N0ckludFN0cihjdHh0LCBYTUxfRVJSX1RBR19OT1RfRklOSVNIRUQsCi0JICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEgaW4gdGFnICVzIGxpbmUgJWRcbiIsCi0JCSAgICAgICAgICAgICAgICBuYW1lLCBsaW5lLCBOVUxMKTsKKyAgICByZXR1cm4oMCk7Cit9CiAKLQkvKgotCSAqIGVuZCBvZiBwYXJzaW5nIG9mIHRoaXMgbm9kZS4KLQkgKi8KLQlub2RlUG9wKGN0eHQpOwotCW5hbWVQb3AoY3R4dCk7Ci0Jc3BhY2VQb3AoY3R4dCk7Ci0JaWYgKG5zTnIgIT0gY3R4dC0+bnNOcikKLQkgICAgbnNQb3AoY3R4dCwgY3R4dC0+bnNOciAtIG5zTnIpOwotCXJldHVybjsKLSAgICB9CisvKioKKyAqIHhtbFBhcnNlRWxlbWVudEVuZDoKKyAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0CisgKgorICogUGFyc2UgdGhlIGVuZCBvZiBhbiBYTUwgZWxlbWVudC4KKyAqLworc3RhdGljIHZvaWQKK3htbFBhcnNlRWxlbWVudEVuZCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKKyAgICB4bWxQYXJzZXJOb2RlSW5mbyBub2RlX2luZm87CisgICAgeG1sTm9kZVB0ciByZXQgPSBjdHh0LT5ub2RlOworCisgICAgaWYgKGN0eHQtPm5hbWVOciA8PSAwKQorICAgICAgICByZXR1cm47CiAKICAgICAvKgogICAgICAqIHBhcnNlIHRoZSBlbmQgb2YgdGFnOiAnPC8nIHNob3VsZCBiZSBoZXJlLgogICAgICAqLwogICAgIGlmIChjdHh0LT5zYXgyKSB7Ci0JeG1sUGFyc2VFbmRUYWcyKGN0eHQsIHByZWZpeCwgVVJJLCBsaW5lLCBjdHh0LT5uc05yIC0gbnNOciwgdGxlbik7CisJeG1sUGFyc2VFbmRUYWcyKGN0eHQsICZjdHh0LT5wdXNoVGFiW2N0eHQtPm5hbWVOciAtIDFdKTsKIAluYW1lUG9wKGN0eHQpOwogICAgIH0KICNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECi0gICAgICBlbHNlCi0JeG1sUGFyc2VFbmRUYWcxKGN0eHQsIGxpbmUpOworICAgIGVsc2UKKwl4bWxQYXJzZUVuZFRhZzEoY3R4dCwgMCk7CiAjZW5kaWYgLyogTElCWE1MX1NBWDFfRU5BQkxFRCAqLwogCiAgICAgLyoKQEAgLTExMzIxLDYgKzExNDM3LDcgQEAKIAkgICAgICAgIGNvbnN0IHhtbENoYXIgKm5hbWU7CiAJCWNvbnN0IHhtbENoYXIgKnByZWZpeCA9IE5VTEw7CiAJCWNvbnN0IHhtbENoYXIgKlVSSSA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IGxpbmUgPSBjdHh0LT5pbnB1dC0+bGluZTsKIAkJaW50IG5zTnIgPSBjdHh0LT5uc05yOwogCiAJCWlmICgoYXZhaWwgPCAyKSAmJiAoY3R4dC0+aW5wdXROciA9PSAxKSkKQEAgLTExNDE4LDEyICsxMTUzNSw3IEBACiAJCSAgICBub2RlUG9wKGN0eHQpOwogCQkgICAgc3BhY2VQb3AoY3R4dCk7CiAJCX0KLQkJaWYgKGN0eHQtPnNheDIpCi0JCSAgICBuYW1lTnNQdXNoKGN0eHQsIG5hbWUsIHByZWZpeCwgVVJJLCBjdHh0LT5uc05yIC0gbnNOcik7Ci0jaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAotCQllbHNlCi0JCSAgICBuYW1lUHVzaChjdHh0LCBuYW1lKTsKLSNlbmRpZiAvKiBMSUJYTUxfU0FYMV9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgbmFtZU5zUHVzaChjdHh0LCBuYW1lLCBwcmVmaXgsIFVSSSwgbGluZSwgY3R4dC0+bnNOciAtIG5zTnIpOwogCiAJCWN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTlRFTlQ7CiAgICAgICAgICAgICAgICAgY3R4dC0+cHJvZ3Jlc3NpdmUgPSAxOwpAQCAtMTE1NDAsMTEgKzExNjUyLDcgQEAKIAkJICAgIH0KIAkJfQogCQlpZiAoY3R4dC0+c2F4MikgewotCQkgICAgeG1sUGFyc2VFbmRUYWcyKGN0eHQsCi0JCSAgICAgICAgICAgICh2b2lkICopIGN0eHQtPnB1c2hUYWJbY3R4dC0+bmFtZU5yICogMyAtIDNdLAotCQkgICAgICAgICAgICAodm9pZCAqKSBjdHh0LT5wdXNoVGFiW2N0eHQtPm5hbWVOciAqIDMgLSAyXSwgMCwKLQkJICAgICAgICAgICAgKGludCkgKHB0cmRpZmZfdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+cHVzaFRhYltjdHh0LT5uYW1lTnIgKiAzIC0gMV0sIDApOworCSAgICAgICAgICAgIHhtbFBhcnNlRW5kVGFnMihjdHh0LCAmY3R4dC0+cHVzaFRhYltjdHh0LT5uYW1lTnIgLSAxXSk7CiAJCSAgICBuYW1lTnNQb3AoY3R4dCk7CiAJCX0KICNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECkBAIC0xMjIwNiwxMiArMTIzMTQsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCXJlcyA9IHhtbFBhcnNlcklucHV0QnVmZmVyUHVzaChjdHh0LT5pbnB1dC0+YnVmLCBzaXplLCBjaHVuayk7CisgICAgICAgIHhtbEJ1ZlNldElucHV0QmFzZUN1cihjdHh0LT5pbnB1dC0+YnVmLT5idWZmZXIsIGN0eHQtPmlucHV0LCBiYXNlLCBjdXIpOwogCWlmIChyZXMgPCAwKSB7CiAJICAgIGN0eHQtPmVyck5vID0gWE1MX1BBUlNFUl9FT0Y7CiAJICAgIHhtbEhhbHRQYXJzZXIoY3R4dCk7CiAJICAgIHJldHVybiAoWE1MX1BBUlNFUl9FT0YpOwogCX0KLSAgICAgICAgeG1sQnVmU2V0SW5wdXRCYXNlQ3VyKGN0eHQtPmlucHV0LT5idWYtPmJ1ZmZlciwgY3R4dC0+aW5wdXQsIGJhc2UsIGN1cik7CiAjaWZkZWYgREVCVUdfUFVTSAogCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiUFA6IHB1c2hlZCAlZFxuIiwgc2l6ZSk7CiAjZW5kaWYKQEAgLTEyMjI2LDYgKzEyMzM0LDcgQEAKIAkJc2l6ZV90IGN1cnJlbnQgPSBjdHh0LT5pbnB1dC0+Y3VyIC0gY3R4dC0+aW5wdXQtPmJhc2U7CiAKIAkJbmJjaGFycyA9IHhtbENoYXJFbmNJbnB1dChpbiwgdGVybWluYXRlKTsKKwkJeG1sQnVmU2V0SW5wdXRCYXNlQ3VyKGluLT5idWZmZXIsIGN0eHQtPmlucHV0LCBiYXNlLCBjdXJyZW50KTsKIAkJaWYgKG5iY2hhcnMgPCAwKSB7CiAJCSAgICAvKiBUT0RPIDIuNi4wICovCiAJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTEyMjMzLDcgKzEyMzQyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgeG1sSGFsdFBhcnNlcihjdHh0KTsKIAkJICAgIHJldHVybihYTUxfRVJSX0lOVkFMSURfRU5DT0RJTkcpOwogCQl9Ci0JCXhtbEJ1ZlNldElucHV0QmFzZUN1cihpbi0+YnVmZmVyLCBjdHh0LT5pbnB1dCwgYmFzZSwgY3VycmVudCk7CiAJICAgIH0KIAl9CiAgICAgfQpAQCAtMTIzNjgsMTMgKzEyNDc2LDYgQEAKIAlyZXR1cm4oTlVMTCk7CiAgICAgfQogICAgIGN0eHQtPmRpY3ROYW1lcyA9IDE7Ci0gICAgY3R4dC0+cHVzaFRhYiA9ICh2b2lkICoqKSB4bWxNYWxsb2MoY3R4dC0+bmFtZU1heCAqIDMgKiBzaXplb2YoeG1sQ2hhciAqKSk7Ci0gICAgaWYgKGN0eHQtPnB1c2hUYWIgPT0gTlVMTCkgewotICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7Ci0JeG1sRnJlZVBhcnNlcklucHV0QnVmZmVyKGJ1Zik7Ci0JeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7Ci0JcmV0dXJuKE5VTEwpOwotICAgIH0KICAgICBpZiAoc2F4ICE9IE5VTEwpIHsKICNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAJaWYgKGN0eHQtPnNheCAhPSAoeG1sU0FYSGFuZGxlclB0cikgJnhtbERlZmF1bHRTQVhIYW5kbGVyKQpAQCAtMTMxNjMsNyArMTMyNjQsNyBAQAogCiAvKioKICAqIHhtbFBhcnNlQmFsYW5jZWRDaHVua01lbW9yeToKLSAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgdGhlIGNodW5rIHBlcnRhaW5zIHRvCisgKiBAZG9jOiAgdGhlIGRvY3VtZW50IHRoZSBjaHVuayBwZXJ0YWlucyB0byAobXVzdCBub3QgYmUgTlVMTCkKICAqIEBzYXg6ICB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKHBvc3NpYmx5IE5VTEwpCiAgKiBAdXNlcl9kYXRhOiAgVGhlIHVzZXIgZGF0YSByZXR1cm5lZCBvbiBTQVggY2FsbGJhY2tzIChwb3NzaWJseSBOVUxMKQogICogQGRlcHRoOiAgVXNlZCBmb3IgbG9vcCBkZXRlY3Rpb24sIHVzZSAwCkBAIC0xMzYxNSw3ICsxMzcxNiw3IEBACiAjaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogLyoqCiAgKiB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlSZWNvdmVyOgotICogQGRvYzogIHRoZSBkb2N1bWVudCB0aGUgY2h1bmsgcGVydGFpbnMgdG8KKyAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgdGhlIGNodW5rIHBlcnRhaW5zIHRvIChtdXN0IG5vdCBiZSBOVUxMKQogICogQHNheDogIHRoZSBTQVggaGFuZGxlciBibG9jayAocG9zc2libHkgTlVMTCkKICAqIEB1c2VyX2RhdGE6ICBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKHBvc3NpYmx5IE5VTEwpCiAgKiBAZGVwdGg6ICBVc2VkIGZvciBsb29wIGRldGVjdGlvbiwgdXNlIDAKQEAgLTEzNjg3LDYgKzEzNzg4LDcgQEAKICAgICB9IGVsc2UgewogCXhtbEN0eHRVc2VPcHRpb25zSW50ZXJuYWwoY3R4dCwgWE1MX1BBUlNFX05PRElDVCwgTlVMTCk7CiAgICAgfQorICAgIC8qIGRvYyA9PSBOVUxMIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBoaXN0b3JpYyByZWFzb25zICovCiAgICAgaWYgKGRvYyAhPSBOVUxMKSB7CiAJbmV3RG9jLT5pbnRTdWJzZXQgPSBkb2MtPmludFN1YnNldDsKIAluZXdEb2MtPmV4dFN1YnNldCA9IGRvYy0+ZXh0U3Vic2V0OwpAQCAtMTM3MDMsNiArMTM4MDUsNyBAQAogICAgIH0KICAgICB4bWxBZGRDaGlsZCgoeG1sTm9kZVB0cikgbmV3RG9jLCBuZXdSb290KTsKICAgICBub2RlUHVzaChjdHh0LCBuZXdSb290KTsKKyAgICAvKiBkb2MgPT0gTlVMTCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgaGlzdG9yaWMgcmVhc29ucyAqLwogICAgIGlmIChkb2MgPT0gTlVMTCkgewogCWN0eHQtPm15RG9jID0gbmV3RG9jOwogICAgIH0gZWxzZSB7CkBAIC0xMzc3Miw4ICsxMzg3NSw4IEBACiAgICAgeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7CiAgICAgbmV3RG9jLT5pbnRTdWJzZXQgPSBOVUxMOwogICAgIG5ld0RvYy0+ZXh0U3Vic2V0ID0gTlVMTDsKLSAgICBpZihkb2MgIT0gTlVMTCkKLQluZXdEb2MtPm9sZE5zID0gTlVMTDsKKyAgICAvKiBUaGlzIGxlYWtzIHRoZSBuYW1lc3BhY2UgbGlzdCBpZiBkb2MgPT0gTlVMTCAqLworICAgIG5ld0RvYy0+b2xkTnMgPSBOVUxMOwogICAgIHhtbEZyZWVEb2MobmV3RG9jKTsKIAogICAgIHJldHVybihyZXQpOwpAQCAtMTQwNTUsNyArMTQxNTgsNyBAQAogCiAgICAgaWYgKChjdHh0LT53ZWxsRm9ybWVkKSB8fCByZWNvdmVyeSkgewogICAgICAgICByZXQgPSBjdHh0LT5teURvYzsKLQlpZiAocmV0ICE9IE5VTEwpIHsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoY3R4dC0+aW5wdXQtPmJ1ZiAhPSBOVUxMKSkgewogCSAgICBpZiAoY3R4dC0+aW5wdXQtPmJ1Zi0+Y29tcHJlc3NlZCA+IDApCiAJCXJldC0+Y29tcHJlc3Npb24gPSA5OwogCSAgICBlbHNlCkBAIC0xNDU4Niw4ICsxNDY4OSw5IEBACiAgICAgaWYgKHhtbFBhcnNlckluaXRpYWxpemVkICE9IDApCiAJcmV0dXJuOwogCi0jaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKExJQlhNTF9TVEFUSUMpIHx8IGRlZmluZWQoTElCWE1MX1NUQVRJQ19GT1JfRExMKSkKLQlhdGV4aXQoeG1sQ2xlYW51cFBhcnNlcik7CisjaWYgZGVmaW5lZChfV0lOMzIpICYmICghZGVmaW5lZChMSUJYTUxfU1RBVElDKSB8fCBkZWZpbmVkKExJQlhNTF9TVEFUSUNfRk9SX0RMTCkpCisgICAgaWYgKHhtbEZyZWUgPT0gZnJlZSkKKyAgICAgICAgYXRleGl0KHhtbENsZWFudXBQYXJzZXIpOwogI2VuZGlmCiAKICNpZmRlZiBMSUJYTUxfVEhSRUFEX0VOQUJMRUQKQEAgLTE0NjY4LDYgKzE0NzcyLDIwIEBACiAgICAgeG1sUGFyc2VySW5pdGlhbGl6ZWQgPSAwOwogfQogCisjaWYgZGVmaW5lZChIQVZFX0FUVFJJQlVURV9ERVNUUlVDVE9SKSAmJiAhZGVmaW5lZChMSUJYTUxfU1RBVElDKSAmJiBcCisgICAgIWRlZmluZWQoX1dJTjMyKQorc3RhdGljIHZvaWQKK0FUVFJJQlVURV9ERVNUUlVDVE9SCit4bWxEZXN0cnVjdG9yKHZvaWQpIHsKKyAgICAvKgorICAgICAqIENhbGxpbmcgY3VzdG9tIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMgaW4gYSBkZXN0cnVjdG9yIGNhbiBjYXVzZQorICAgICAqIHByb2JsZW1zLCBmb3IgZXhhbXBsZSB3aXRoIE5va29naXJpLgorICAgICAqLworICAgIGlmICh4bWxGcmVlID09IGZyZWUpCisgICAgICAgIHhtbENsZWFudXBQYXJzZXIoKTsKK30KKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKICAqCU5ldyBzZXQgKDIuNi4wKSBvZiBzaW1wbGVyIGFuZCBtb3JlIGZsZXhpYmxlIEFQSXMJCSoKQEAgLTE0NzU2LDcgKzE0ODc0LDYgQEAKICAgICBjdHh0LT52Y3R4dC53YXJuaW5nID0geG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nOwogI2VuZGlmCiAgICAgY3R4dC0+cmVjb3JkX2luZm8gPSAwOwotICAgIGN0eHQtPm5iQ2hhcnMgPSAwOwogICAgIGN0eHQtPmNoZWNrSW5kZXggPSAwOwogICAgIGN0eHQtPmluU3Vic2V0ID0gMDsKICAgICBjdHh0LT5lcnJObyA9IFhNTF9FUlJfT0s7CkBAIC0xNDgyMiwxNiArMTQ5MzksNiBAQAogCiAgICAgeG1sQ3R4dFJlc2V0KGN0eHQpOwogCi0gICAgaWYgKGN0eHQtPnB1c2hUYWIgPT0gTlVMTCkgewotICAgICAgICBjdHh0LT5wdXNoVGFiID0gKHZvaWQgKiopIHhtbE1hbGxvYyhjdHh0LT5uYW1lTWF4ICogMyAqCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhtbENoYXIgKikpOwotICAgICAgICBpZiAoY3R4dC0+cHVzaFRhYiA9PSBOVUxMKSB7Ci0JICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKLSAgICAgICAgICAgIHhtbEZyZWVQYXJzZXJJbnB1dEJ1ZmZlcihidWYpOwotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKICAgICAgICAgY3R4dC0+ZGlyZWN0b3J5ID0gTlVMTDsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9wYXJzZXJJbnRlcm5hbHMuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvcGFyc2VySW50ZXJuYWxzLmMKaW5kZXggOGZjM2Q2My4uMGQyYzE2YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9wYXJzZXJJbnRlcm5hbHMuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3BhcnNlckludGVybmFscy5jCkBAIC01MjQsOCArNTI0LDYgQEAKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAvKiAxLWJ5dGUgY29kZSAqLwogICAgICAgICAgICAgY3R4dC0+aW5wdXQtPmN1cisrOwotCi0gICAgICAgIGN0eHQtPm5iQ2hhcnMrKzsKICAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiBBc3N1bWUgaXQncyBhIGZpeGVkIGxlbmd0aCBlbmNvZGluZyAoMSkgd2l0aApAQCAtNTM4LDcgKzUzNiw2IEBACiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgY3R4dC0+aW5wdXQtPmNvbCsrOwogICAgICAgICBjdHh0LT5pbnB1dC0+Y3VyKys7Ci0gICAgICAgIGN0eHQtPm5iQ2hhcnMrKzsKICAgICB9CiAgICAgaWYgKCpjdHh0LT5pbnB1dC0+Y3VyID09IDApCiAgICAgICAgIHhtbFBhcnNlcklucHV0R3JvdyhjdHh0LT5pbnB1dCwgSU5QVVRfQ0hVTkspOwpAQCAtNjgyLDcgKzY3OSw2IEBACiAJICAgIH0KIAkgICAgaWYgKCpjdHh0LT5pbnB1dC0+Y3VyID09IDB4RCkgewogCQlpZiAoY3R4dC0+aW5wdXQtPmN1clsxXSA9PSAweEEpIHsKLQkJICAgIGN0eHQtPm5iQ2hhcnMrKzsKIAkJICAgIGN0eHQtPmlucHV0LT5jdXIrKzsKIAkJfQogCQlyZXR1cm4oMHhBKTsKQEAgLTY5OCw3ICs2OTQsNiBAQAogICAgICpsZW4gPSAxOwogICAgIGlmICgqY3R4dC0+aW5wdXQtPmN1ciA9PSAweEQpIHsKIAlpZiAoY3R4dC0+aW5wdXQtPmN1clsxXSA9PSAweEEpIHsKLQkgICAgY3R4dC0+bmJDaGFycysrOwogCSAgICBjdHh0LT5pbnB1dC0+Y3VyKys7CiAJfQogCXJldHVybigweEEpOwpAQCAtMTE2Myw2ICsxMTU4LDExIEBACiAgICAgICAgICAgICAgKiBOb3RlOiB0aGlzIGlzIGEgYml0IGRhbmdlcm91cywgYnV0IHRoYXQncyB3aGF0IGl0CiAgICAgICAgICAgICAgKiB0YWtlcyB0byB1c2UgbmVhcmx5IGNvbXBhdGlibGUgc2lnbmF0dXJlIGZvciBkaWZmZXJlbnQKICAgICAgICAgICAgICAqIGVuY29kaW5ncy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGSVhNRTogRW5jb2RlcnMgbWlnaHQgYnVmZmVyIHBhcnRpYWwgYnl0ZSBzZXF1ZW5jZXMsIHNvCisgICAgICAgICAgICAgKiB0aGlzIHByb2JhYmx5IGNhbid0IHdvcmsuIFdlIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgYW5kCisgICAgICAgICAgICAgKiBtYWtlIHN1cmUgdGhhdCBjYWxsZXJzIG5ldmVyIHRyeSB0byBzd2l0Y2ggdGhlIGVuY29kaW5nCisgICAgICAgICAgICAgKiB0d2ljZS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgeG1sQ2hhckVuY0Nsb3NlRnVuYyhpbnB1dC0+YnVmLT5lbmNvZGVyKTsKICAgICAgICAgICAgIGlucHV0LT5idWYtPmVuY29kZXIgPSBoYW5kbGVyOwpAQCAtMTc1OCw3ICsxNzU4LDYgQEAKICAgICAgICAgY3R4dC0+b3B0aW9ucyB8PSBYTUxfUEFSU0VfTk9FTlQ7CiAgICAgfQogICAgIGN0eHQtPnJlY29yZF9pbmZvID0gMDsKLSAgICBjdHh0LT5uYkNoYXJzID0gMDsKICAgICBjdHh0LT5jaGVja0luZGV4ID0gMDsKICAgICBjdHh0LT5pblN1YnNldCA9IDA7CiAgICAgY3R4dC0+ZXJyTm8gPSBYTUxfRVJSX09LOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy9ydW50ZXN0LmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3J1bnRlc3QuYwppbmRleCAzMjEyMTMwLi4zMjFkMDE2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3J1bnRlc3QuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3J1bnRlc3QuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiB9OwogCiBzdGF0aWMgaW50IHVwZGF0ZV9yZXN1bHRzID0gMDsKK3N0YXRpYyBjaGFyKiB0ZW1wX2RpcmVjdG9yeSA9IE5VTEw7CiBzdGF0aWMgaW50IGNoZWNrVGVzdEZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogCiAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCkBAIC0xNjk5LDcgKzE3MDAsNyBAQAogICAgIGNoYXIgKnRlbXA7CiAKICAgICBuYl90ZXN0cysrOwotICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CisgICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCB0ZW1wX2RpcmVjdG9yeSwgIi5yZXMiKTsKICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgIGZhdGFsRXJyb3IoKTsKQEAgLTE4MTgsNyArMTgxOSw3IEBACiAjZW5kaWYKICAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgIHJldHVybigxKTsKLSAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOworICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgdGVtcF9kaXJlY3RvcnksICIucmVzIik7CiAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgICBmYXRhbEVycm9yKCk7CkBAIC0yMDMwLDcgKzIwMzEsNyBAQAogICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgIHJldHVybigxKTsKLSAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOworICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgdGVtcF9kaXJlY3RvcnksICIucmVzIik7CiAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgICBmYXRhbEVycm9yKCk7CkBAIC0yMTA3LDE2ICsyMTA4LDE2IEBACiAJICAgIHhtbERvY0R1bXBNZW1vcnkoZG9jLCAoeG1sQ2hhciAqKikgJmJhc2UsICZzaXplKTsKIAl9CiAJcmVzID0gY29tcGFyZUZpbGVNZW0ocmVzdWx0LCBiYXNlLCBzaXplKTsKLQlpZiAocmVzICE9IDApIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZCBpbiAlc1xuIiwgZmlsZW5hbWUsIHJlc3VsdCk7Ci0JICAgIHJldHVybigtMSk7Ci0JfQogICAgIH0KICAgICBpZiAoZG9jICE9IE5VTEwpIHsKIAlpZiAoYmFzZSAhPSBOVUxMKQogCSAgICB4bWxGcmVlKChjaGFyICopYmFzZSk7CiAJeG1sRnJlZURvYyhkb2MpOwogICAgIH0KKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZCBpbiAlc1xuIiwgZmlsZW5hbWUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQogICAgIGlmIChlcnIgIT0gTlVMTCkgewogCXJlcyA9IGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpOwogCWlmIChyZXMgIT0gMCkgewpAQCAtMjE3Nyw3ICsyMTc4LDcgQEAKIAogICAgIG5iX3Rlc3RzKys7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKKwl0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsIHRlbXBfZGlyZWN0b3J5LCAiLnJlcyIpOwogCWlmICh0ZW1wID09IE5VTEwpIHsKIAkgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKIAkgICAgZmF0YWxFcnJvcigpOwpAQCAtMjQwNiw3ICsyNDA3LDcgQEAKICAgICBpbnQgbGVuLCByZXQgPSAwOwogICAgIGNoYXIgKnRlbXA7CiAKLSAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOworICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgdGVtcF9kaXJlY3RvcnksICIucmVzIik7CiAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgICBmYXRhbEVycm9yKCk7CkBAIC0yNjA1LDcgKzI2MDYsNyBAQAogCXJldHVybigtMSk7CiAgICAgfQogCi0gICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKKyAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsIHRlbXBfZGlyZWN0b3J5LCAiLnJlcyIpOwogICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICAgZmF0YWxFcnJvcigpOwpAQCAtMjcwMyw3ICsyNzA0LDcgQEAKICAgICBjaGFyIHN0clsxMDI0XTsKICAgICBpbnQgcmVzID0gMCwgaSwgcmV0OwogCi0gICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKKyAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsIHRlbXBfZGlyZWN0b3J5LCAiLnJlcyIpOwogICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICAgZmF0YWxFcnJvcigpOwpAQCAtMzAwNyw3ICszMDA4LDcgQEAKIAlyZXR1cm4oLTEpOwogICAgIH0KIAotICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsICIiLCAiLnJlcyIpOworICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsIHRlbXBfZGlyZWN0b3J5LCAiLnJlcyIpOwogICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICAgZmF0YWxFcnJvcigpOwpAQCAtMzE3OCw3ICszMTc5LDcgQEAKIAlyZXR1cm4oLTEpOwogICAgIH0KIAotICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsICIiLCAiLnJlcyIpOworICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsIHRlbXBfZGlyZWN0b3J5LCAiLnJlcyIpOwogICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICAgZmF0YWxFcnJvcigpOwpAQCAtMzUyOCw3ICszNTI5LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwogCXJldHVybigtMSk7CiAgICAgfQotICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CisgICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCB0ZW1wX2RpcmVjdG9yeSwgIi5yZXMiKTsKICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgIGZhdGFsRXJyb3IoKTsKQEAgLTQ1NjUsNiArNDU2Niw4IEBACiAJICAgIHVwZGF0ZV9yZXN1bHRzID0gMTsKICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FdLCAiLXF1aWV0IikpCiAJICAgIHRlc3RzX3F1aWV0ID0gMTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FdLCAiLS1vdXQiKSkKKwkgICAgdGVtcF9kaXJlY3RvcnkgPSBhcmd2WysrYV07CiAJZWxzZSB7CiAJICAgIGZvciAoaSA9IDA7IHRlc3REZXNjcmlwdGlvbnNbaV0uZnVuYyAhPSBOVUxMOyBpKyspIHsKIAkgICAgICAgIGlmIChzdHJzdHIodGVzdERlc2NyaXB0aW9uc1tpXS5kZXNjLCBhcmd2W2FdKSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy90ZXN0YXBpLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3Rlc3RhcGkuYwppbmRleCA4YTRlMjNlLi42ZjE5YzZmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3Rlc3RhcGkuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3Rlc3RhcGkuYwpAQCAtMjg0Myw3ICsyODQzLDcgQEAKICAgICBpbnQgbl9idWY7CiAgICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fY3VyOwotICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAodW51c2VkKSAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICAgaW50IG5fZm9ybWF0OwpAQCAtMjg5Niw3ICsyODk2LDcgQEAKICAgICBpbnQgbl9idWY7CiAgICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fY3VyOwotICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAodW51c2VkKSAqLwogICAgIGludCBuX2VuY29kaW5nOwogCiAgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fYnVmKyspIHsKQEAgLTMzOTcsNyArMzM5Nyw3IEBACiAgICAgaW50IG5fZG9jOwogICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICAgaW50IG5fY3VyOwotICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAodW51c2VkKSAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICAgaW50IG5fZm9ybWF0OwpAQCAtMzQ1Nyw3ICszNDU3LDcgQEAKICAgICBpbnQgbl9kb2M7CiAgICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgICBpbnQgbl9jdXI7Ci0gICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2Rpbmcgc3RyaW5nICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2Rpbmcgc3RyaW5nICh1bnVzZWQpICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAKICAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewpAQCAtMTM2MTEsNyArMTM2MTEsNyBAQAogI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHRoZSBjaHVuayBwZXJ0YWlucyB0byAqLworICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCB0aGUgY2h1bmsgcGVydGFpbnMgdG8gKG11c3Qgbm90IGJlIE5VTEwpICovCiAgICAgaW50IG5fZG9jOwogICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKHBvc3NpYmx5IE5VTEwpICovCiAgICAgaW50IG5fc2F4OwpAQCAtMTM2ODcsNyArMTM2ODcsNyBAQAogI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHRoZSBjaHVuayBwZXJ0YWlucyB0byAqLworICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCB0aGUgY2h1bmsgcGVydGFpbnMgdG8gKG11c3Qgbm90IGJlIE5VTEwpICovCiAgICAgaW50IG5fZG9jOwogICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKHBvc3NpYmx5IE5VTEwpICovCiAgICAgaW50IG5fc2F4OwpAQCAtMjkyMzgsNiArMjkyMzgsMzMgQEAKIAogCiBzdGF0aWMgaW50Cit0ZXN0X3htbFBvcE91dHB1dENhbGxiYWNrcyh2b2lkKSB7CisgICAgaW50IHRlc3RfcmV0ID0gMDsKKworI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworCisgICAgICAgIHJldF92YWwgPSB4bWxQb3BPdXRwdXRDYWxsYmFja3MoKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUG9wT3V0cHV0Q2FsbGJhY2tzIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgZnVuY3Rpb25fdGVzdHMrKzsKKyNlbmRpZgorCisgICAgcmV0dXJuKHRlc3RfcmV0KTsKK30KKworCitzdGF0aWMgaW50CiB0ZXN0X3htbFJlZ2lzdGVyRGVmYXVsdElucHV0Q2FsbGJhY2tzKHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCkBAIC0yOTMxMyw3ICsyOTM0MCw3IEBACiB0ZXN0X3htbElPKHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCi0gICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4bWxJTyA6IDQwIG9mIDUwIGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sSU8gOiA0MSBvZiA1MSBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFsbG9jT3V0cHV0QnVmZmVyKCk7CiAgICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBbGxvY1BhcnNlcklucHV0QnVmZmVyKCk7CiAgICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGVja0ZpbGVuYW1lKCk7CkBAIC0yOTM1NCw2ICsyOTM4MSw3IEBACiAgICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2goKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyUmVhZCgpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUG9wSW5wdXRDYWxsYmFja3MoKTsKKyAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBvcE91dHB1dENhbGxiYWNrcygpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnaXN0ZXJEZWZhdWx0SW5wdXRDYWxsYmFja3MoKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2lzdGVyRGVmYXVsdE91dHB1dENhbGxiYWNrcygpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnaXN0ZXJIVFRQUG9zdENhbGxiYWNrcygpOwpAQCAtMzQyNDAsMjcgKzM0MjY4LDI3IEBACiAgICAgbG9uZyByZXRfdmFsOwogICAgIHhtbFNhdmVDdHh0UHRyIGN0eHQ7IC8qIGEgZG9jdW1lbnQgc2F2aW5nIGNvbnRleHQgKi8KICAgICBpbnQgbl9jdHh0OwotICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIHRvcCBub2RlIG9mIHRoZSBzdWJ0cmVlIHRvIHNhdmUgKi8KLSAgICBpbnQgbl9ub2RlOworICAgIHhtbE5vZGVQdHIgY3VyOyAvKiAgKi8KKyAgICBpbnQgbl9jdXI7CiAKICAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNhdmVDdHh0UHRyO25fY3R4dCsrKSB7Ci0gICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CisgICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgIGN0eHQgPSBnZW5feG1sU2F2ZUN0eHRQdHIobl9jdHh0LCAwKTsKLSAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CisgICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKIAotICAgICAgICByZXRfdmFsID0geG1sU2F2ZVRyZWUoY3R4dCwgbm9kZSk7CisgICAgICAgIHJldF92YWwgPSB4bWxTYXZlVHJlZShjdHh0LCBjdXIpOwogICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgICBkZXNfeG1sU2F2ZUN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKLSAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlVHJlZSIsCiAJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKIAkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKLSAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy90cmVlLmMgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3RyZWUuYwppbmRleCA1NGJmZGM0Li41YzIyOTQ4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3RyZWUuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3RyZWUuYwpAQCAtMTMxMCw2ICsxMzEwLDE2IEBACiAJCWVsc2UKIAkJICAgIHRtcCA9IDA7CiAJCXdoaWxlICh0bXAgIT0gJzsnKSB7IC8qIE5vbiBpbnB1dCBjb25zdW1pbmcgbG9vcCAqLworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBJZiB5b3UgZmluZCBhbiBpbnRlZ2VyIG92ZXJmbG93IGhlcmUgd2hlbiBmdXp6aW5nLAorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgYnVnIGlzIHByb2JhYmx5IGVsc2V3aGVyZS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICogb25seSByZWNlaXZlIGVudGl0aWVzIHRoYXQgd2VyZSBhbHJlYWR5IHZhbGlkYXRlZCBieQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcGFyc2VyLCB0eXBpY2FsbHkgYnkgeG1sUGFyc2VBdHRWYWx1ZUNvbXBsZXgKKyAgICAgICAgICAgICAgICAgICAgICogY2FsbGluZyB4bWxTdHJpbmdEZWNvZGVFbnRpdGllcy4KKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogU28gaXQncyBiZXR0ZXIgKm5vdCogdG8gY2hlY2sgZm9yIG92ZXJmbG93IHRvCisgICAgICAgICAgICAgICAgICAgICAqIHBvdGVudGlhbGx5IGRpc2NvdmVyIG5ldyBidWdzLgorICAgICAgICAgICAgICAgICAgICAgKi8KIAkJICAgIGlmICgodG1wID49ICcwJykgJiYgKHRtcCA8PSAnOScpKQogCQkJY2hhcnZhbCA9IGNoYXJ2YWwgKiAxNiArICh0bXAgLSAnMCcpOwogCQkgICAgZWxzZSBpZiAoKHRtcCA+PSAnYScpICYmICh0bXAgPD0gJ2YnKSkKQEAgLTEzMzgsNiArMTM0OCw3IEBACiAJCWVsc2UKIAkJICAgIHRtcCA9IDA7CiAJCXdoaWxlICh0bXAgIT0gJzsnKSB7IC8qIE5vbiBpbnB1dCBjb25zdW1pbmcgbG9vcHMgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3csIHNlZSBhYm92ZS4gKi8KIAkJICAgIGlmICgodG1wID49ICcwJykgJiYgKHRtcCA8PSAnOScpKQogCQkJY2hhcnZhbCA9IGNoYXJ2YWwgKiAxMCArICh0bXAgLSAnMCcpOwogCQkgICAgZWxzZSB7CkBAIC0xNTE3LDYgKzE1MjgsNyBAQAogCQljdXIgKz0gMzsKIAkJdG1wID0gKmN1cjsKIAkJd2hpbGUgKHRtcCAhPSAnOycpIHsgLyogTm9uIGlucHV0IGNvbnN1bWluZyBsb29wICovCisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93LCBzZWUgYWJvdmUuICovCiAJCSAgICBpZiAoKHRtcCA+PSAnMCcpICYmICh0bXAgPD0gJzknKSkKIAkJCWNoYXJ2YWwgPSBjaGFydmFsICogMTYgKyAodG1wIC0gJzAnKTsKIAkJICAgIGVsc2UgaWYgKCh0bXAgPj0gJ2EnKSAmJiAodG1wIDw9ICdmJykpCkBAIC0xNTM5LDYgKzE1NTEsNyBAQAogCQljdXIgKz0gMjsKIAkJdG1wID0gKmN1cjsKIAkJd2hpbGUgKHRtcCAhPSAnOycpIHsgLyogTm9uIGlucHV0IGNvbnN1bWluZyBsb29wcyAqLworICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdywgc2VlIGFib3ZlLiAqLwogCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpCiAJCQljaGFydmFsID0gY2hhcnZhbCAqIDEwICsgKHRtcCAtICcwJyk7CiAJCSAgICBlbHNlIHsKQEAgLTE2NDksNiArMTY2MiwxMCBAQAogCiAgICAgaWYgKCF4bWxCdWZJc0VtcHR5KGJ1ZikpIHsKIAlub2RlID0geG1sTmV3RG9jVGV4dChkb2MsIE5VTEwpOworICAgICAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICB4bWxCdWZGcmVlKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgIH0KIAlub2RlLT5jb250ZW50ID0geG1sQnVmRGV0YWNoKGJ1Zik7CiAKIAlpZiAobGFzdCA9PSBOVUxMKSB7CkBAIC0xODg0LDEyICsxOTAxLDYgQEAKICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewogICAgICAgICB4bWxOb2RlUHRyIHRtcDsKIAotICAgICAgICBpZigheG1sQ2hlY2tVVEY4KHZhbHVlKSkgewotICAgICAgICAgICAgeG1sVHJlZUVycihYTUxfVFJFRV9OT1RfVVRGOCwgKHhtbE5vZGVQdHIpIGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoZG9jICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwotICAgICAgICB9CiAgICAgICAgIGN1ci0+Y2hpbGRyZW4gPSB4bWxOZXdEb2NUZXh0KGRvYywgdmFsdWUpOwogICAgICAgICBjdXItPmxhc3QgPSBOVUxMOwogICAgICAgICB0bXAgPSBjdXItPmNoaWxkcmVuOwpAQCAtMjAwOSw2ICsyMDIwLDExIEBACiAgKiBAdmFsdWU6ICB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQogICoKICAqIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjYXJyaWVkIGJ5IGEgZG9jdW1lbnQuCisgKiBOT1RFOiBAdmFsdWUgaXMgc3VwcG9zZWQgdG8gYmUgYSBwaWVjZSBvZiBYTUwgQ0RBVEEsIHNvIGl0IGFsbG93cyBlbnRpdHkKKyAqICAgICAgIHJlZmVyZW5jZXMsIGJ1dCBYTUwgc3BlY2lhbCBjaGFycyBuZWVkIHRvIGJlIGVzY2FwZWQgZmlyc3QgYnkgdXNpbmcKKyAqICAgICAgIHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KCkuIFVzZSB4bWxOZXdQcm9wKCkgaWYgeW91IGRvbid0IG5lZWQKKyAqICAgICAgIGVudGl0aWVzIHN1cHBvcnQuCisgKgogICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZQogICovCiB4bWxBdHRyUHRyCkBAIC00NTU0LDYgKzQ1NzAsNyBAQAogICAgIGlmIChkb2MgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgIHJldCA9IHhtbE5ld0RvYyhkb2MtPnZlcnNpb24pOwogICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworICAgIHJldC0+dHlwZSA9IGRvYy0+dHlwZTsKICAgICBpZiAoZG9jLT5uYW1lICE9IE5VTEwpCiAgICAgICAgIHJldC0+bmFtZSA9IHhtbE1lbVN0cmR1cChkb2MtPm5hbWUpOwogICAgIGlmIChkb2MtPmVuY29kaW5nICE9IE5VTEwpCkBAIC00ODc2LDcgKzQ4OTMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dCA9ICgoeG1sQXR0clB0cikgY3VyKS0+cGFyZW50OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV4dCA9IGN1ci0+cGFyZW50OworICAgICAgICAgICAgeG1sRnJlZShidWYpOworICAgICAgICAgICAgeG1sRnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qCkBAIC02NTcxLDYgKzY1OTAsMTYgQEAKIAkJYXR0ckRlY2wgPSB4bWxHZXREdGRRQXR0ckRlc2MoZG9jLT5leHRTdWJzZXQsCiAJCSAgICBlbGVtUU5hbWUsIG5hbWUsIE5VTEwpOwogCSAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoeG1sU3RyRXF1YWwobnNOYW1lLCBYTUxfWE1MX05BTUVTUEFDRSkpIHsKKwkgICAgLyoKKwkgICAgKiBUaGUgWE1MIG5hbWVzcGFjZSBtdXN0IGJlIGJvdW5kIHRvIHByZWZpeCAneG1sJy4KKwkgICAgKi8KKwkgICAgYXR0ckRlY2wgPSB4bWxHZXREdGRRQXR0ckRlc2MoZG9jLT5pbnRTdWJzZXQsCisJCWVsZW1RTmFtZSwgbmFtZSwgQkFEX0NBU1QgInhtbCIpOworCSAgICBpZiAoKGF0dHJEZWNsID09IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldCAhPSBOVUxMKSkgeworCQlhdHRyRGVjbCA9IHhtbEdldER0ZFFBdHRyRGVzYyhkb2MtPmV4dFN1YnNldCwKKwkJICAgIGVsZW1RTmFtZSwgbmFtZSwgQkFEX0NBU1QgInhtbCIpOworCSAgICB9CiAJfSBlbHNlIHsKIAkgICAgeG1sTnNQdHIgKm5zTGlzdCwgKmN1cjsKIApAQCAtNjkxNywxMiArNjk0Niw2IEBACiAJaWYgKHZhbHVlICE9IE5VTEwpIHsKIAkgICAgeG1sTm9kZVB0ciB0bXA7CiAKLQkgICAgaWYoIXhtbENoZWNrVVRGOCh2YWx1ZSkpIHsKLQkgICAgICAgIHhtbFRyZWVFcnIoWE1MX1RSRUVfTk9UX1VURjgsICh4bWxOb2RlUHRyKSBub2RlLT5kb2MsCi0JICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChub2RlLT5kb2MgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgbm9kZS0+ZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwotCSAgICB9CiAJICAgIHByb3AtPmNoaWxkcmVuID0geG1sTmV3RG9jVGV4dChub2RlLT5kb2MsIHZhbHVlKTsKIAkgICAgcHJvcC0+bGFzdCA9IE5VTEw7CiAJICAgIHRtcCA9IHByb3AtPmNoaWxkcmVuOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy91cmkuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvdXJpLmMKaW5kZXggZGZlMTc1ZS4uY2JjMmQwMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy91cmkuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3VyaS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIElOX0xJQlhNTAogI2luY2x1ZGUgImxpYnhtbC5oIgogCisjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDxsaWJ4bWwveG1sbWVtb3J5Lmg+CkBAIC0zMjksOSArMzMwLDE0IEBACiAKICAgICBpZiAoSVNBX0RJR0lUKGN1cikpIHsKIAl3aGlsZSAoSVNBX0RJR0lUKGN1cikpIHsKLQkgICAgcG9ydCA9IHBvcnQgKiAxMCArICgqY3VyIC0gJzAnKTsKLSAgICAgICAgICAgIGlmIChwb3J0ID4gOTk5OTk5OTkpCi0gICAgICAgICAgICAgICAgcG9ydCA9IDk5OTk5OTk5OworICAgICAgICAgICAgaW50IGRpZ2l0ID0gKmN1ciAtICcwJzsKKworICAgICAgICAgICAgaWYgKHBvcnQgPiBJTlRfTUFYIC8gMTApCisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgcG9ydCAqPSAxMDsKKyAgICAgICAgICAgIGlmIChwb3J0ID4gSU5UX01BWCAtIGRpZ2l0KQorICAgICAgICAgICAgICAgIHJldHVybigxKTsKKwkgICAgcG9ydCArPSBkaWdpdDsKIAogCSAgICBjdXIrKzsKIAl9CkBAIC0xNzUwLDExICsxNzU2LDYgQEAKICAgICB4bWxVUklQdHIgdXJpOwogICAgIGludCByZXQyOwogCi0jZGVmaW5lIE5VTExDSEsocCkgaWYoIXApIHsgXAotICAgICAgICAgeG1sVVJJRXJyTWVtb3J5KCJlc2NhcGluZyBVUkkgdmFsdWVcbiIpOyBcCi0gICAgICAgICB4bWxGcmVlVVJJKHVyaSk7IFwKLSAgICAgICAgIHJldHVybiBOVUxMOyB9IFwKLQogICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKIApAQCAtMTc3Niw2ICsxNzc3LDEyIEBACiAKICAgICByZXQgPSBOVUxMOwogCisjZGVmaW5lIE5VTExDSEsocCkgaWYoIXApIHsgXAorICAgICAgICAgeG1sVVJJRXJyTWVtb3J5KCJlc2NhcGluZyBVUkkgdmFsdWVcbiIpOyBcCisgICAgICAgICB4bWxGcmVlVVJJKHVyaSk7IFwKKyAgICAgICAgIHhtbEZyZWUocmV0KTsgXAorICAgICAgICAgcmV0dXJuIE5VTEw7IH0gXAorCiAgICAgaWYgKHVyaS0+c2NoZW1lKSB7CiAgICAgICAgIHNlZ21lbnQgPSB4bWxVUklFc2NhcGVTdHIoQkFEX0NBU1QgdXJpLT5zY2hlbWUsIEJBRF9DQVNUICIrLS4iKTsKICAgICAgICAgTlVMTENISyhzZWdtZW50KQpAQCAtMTc5Niw3ICsxODAzLDcgQEAKICAgICBpZiAodXJpLT51c2VyKSB7CiAgICAgICAgIHNlZ21lbnQgPSB4bWxVUklFc2NhcGVTdHIoQkFEX0NBU1QgdXJpLT51c2VyLCBCQURfQ0FTVCAiOzomPSskLCIpOwogICAgICAgICBOVUxMQ0hLKHNlZ21lbnQpCi0JCXJldCA9IHhtbFN0cmNhdChyZXQsQkFEX0NBU1QgIi8vIik7CisgICAgICAgIHJldCA9IHhtbFN0cmNhdChyZXQsQkFEX0NBU1QgIi8vIik7CiAgICAgICAgIHJldCA9IHhtbFN0cmNhdChyZXQsIHNlZ21lbnQpOwogICAgICAgICByZXQgPSB4bWxTdHJjYXQocmV0LCBCQURfQ0FTVCAiQCIpOwogICAgICAgICB4bWxGcmVlKHNlZ21lbnQpOwpAQCAtMTgwNSw4ICsxODEyLDggQEAKICAgICBpZiAodXJpLT5zZXJ2ZXIpIHsKICAgICAgICAgc2VnbWVudCA9IHhtbFVSSUVzY2FwZVN0cihCQURfQ0FTVCB1cmktPnNlcnZlciwgQkFEX0NBU1QgIi8/OzpAIik7CiAgICAgICAgIE5VTExDSEsoc2VnbWVudCkKLQkJaWYgKHVyaS0+dXNlciA9PSBOVUxMKQotCQlyZXQgPSB4bWxTdHJjYXQocmV0LCBCQURfQ0FTVCAiLy8iKTsKKyAgICAgICAgaWYgKHVyaS0+dXNlciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0ID0geG1sU3RyY2F0KHJldCwgQkFEX0NBU1QgIi8vIik7CiAgICAgICAgIHJldCA9IHhtbFN0cmNhdChyZXQsIHNlZ21lbnQpOwogICAgICAgICB4bWxGcmVlKHNlZ21lbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvd2luMzIvTWFrZWZpbGUubXN2YyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvd2luMzIvTWFrZWZpbGUubXN2YwppbmRleCBmNmEwMTgyLi43MjViMGNhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3dpbjMyL01ha2VmaWxlLm1zdmMKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy93aW4zMi9NYWtlZmlsZS5tc3ZjCkBAIC0xMDYsNiArMTA2LDExIEBACiBMREZMQUdTID0gJChMREZMQUdTKQogIWVuZGlmCiAKKyMgYXBwZW5kIENGTEFHUyBldGMuIHBhc3NlZCBvbiBjb21tYW5kIGxpbmUKK0NQUEZMQUdTID0gJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykKK0xERkxBR1MgPSAkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykKKwogIyBMaWJ4bWwgb2JqZWN0IGZpbGVzLgogWE1MX09CSlMgPSAkKFhNTF9JTlRESVIpXGJ1Zi5vYmpcCiAJJChYTUxfSU5URElSKVxjMTRuLm9ialwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMvd2luMzIvY29uZmlndXJlLmpzIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy93aW4zMi9jb25maWd1cmUuanMKaW5kZXggZTJhYjMxZC4uY2VjNjRjNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy93aW4zMi9jb25maWd1cmUuanMKKysrIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy93aW4zMi9jb25maWd1cmUuanMKQEAgLTIwOCwxNSArMjA4LDE1IEBACiAJd2hpbGUgKGNmLkF0RW5kT2ZTdHJlYW0gIT0gdHJ1ZSkgewogCQlsbiA9IGNmLlJlYWRMaW5lKCk7CiAJCXMgPSBuZXcgU3RyaW5nKGxuKTsKLQkJaWYgKHMuc2VhcmNoKC9eTElCWE1MX01BSk9SX1ZFUlNJT049LykgIT0gLTEpIHsKLQkJCXZmLldyaXRlTGluZShzKTsKLQkJCXZlck1ham9yID0gcy5zdWJzdHJpbmcocy5pbmRleE9mKCI9IikgKyAxLCBzLmxlbmd0aCk7Ci0JCX0gZWxzZSBpZihzLnNlYXJjaCgvXkxJQlhNTF9NSU5PUl9WRVJTSU9OPS8pICE9IC0xKSB7Ci0JCQl2Zi5Xcml0ZUxpbmUocyk7Ci0JCQl2ZXJNaW5vciA9IHMuc3Vic3RyaW5nKHMuaW5kZXhPZigiPSIpICsgMSwgcy5sZW5ndGgpOwotCQl9IGVsc2UgaWYocy5zZWFyY2goL15MSUJYTUxfTUlDUk9fVkVSU0lPTj0vKSAhPSAtMSkgewotCQkJdmYuV3JpdGVMaW5lKHMpOwotCQkJdmVyTWljcm8gPSBzLnN1YnN0cmluZyhzLmluZGV4T2YoIj0iKSArIDEsIHMubGVuZ3RoKTsKKwkJaWYgKG0gPSBzLm1hdGNoKC9ebTRfZGVmaW5lXChcW01BSk9SX1ZFUlNJT05cXSwgKFx3KylcKS8pKSB7CisJCQl2Zi5Xcml0ZUxpbmUoIkxJQlhNTF9NQUpPUl9WRVJTSU9OPSIgKyBtWzFdKTsKKwkJCXZlck1ham9yID0gbVsxXTsKKwkJfSBlbHNlIGlmKG0gPSBzLm1hdGNoKC9ebTRfZGVmaW5lXChcW01JTk9SX1ZFUlNJT05cXSwgKFx3KylcKS8pKSB7CisJCQl2Zi5Xcml0ZUxpbmUoIkxJQlhNTF9NSU5PUl9WRVJTSU9OPSIgKyBtWzFdKTsKKwkJCXZlck1pbm9yID0gbVsxXTsKKwkJfSBlbHNlIGlmKG0gPSBzLm1hdGNoKC9ebTRfZGVmaW5lXChcW01JQ1JPX1ZFUlNJT05cXSwgKFx3KylcKS8pKSB7CisJCQl2Zi5Xcml0ZUxpbmUoIkxJQlhNTF9NSUNST19WRVJTSU9OPSIgKyBtWzFdKTsKKwkJCXZlck1pY3JvID0gbVsxXTsKIAkJfSBlbHNlIGlmKHMuc2VhcmNoKC9eTElCWE1MX01JQ1JPX1ZFUlNJT05fU1VGRklYPS8pICE9IC0xKSB7CiAJCQl2Zi5Xcml0ZUxpbmUocyk7CiAJCQl2ZXJNaWNyb1N1ZmZpeCA9IHMuc3Vic3RyaW5nKHMuaW5kZXhPZigiPSIpICsgMSwgcy5sZW5ndGgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94bWxJTy5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94bWxJTy5jCmluZGV4IDhlMWQzYjEuLjA4Zjc5MDcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveG1sSU8uYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3htbElPLmMKQEAgLTM0MzksNyArMzQzOSw3IEBACiAgICAgICAgICAgICBpZiAob3V0LT53cml0ZWNhbGxiYWNrKQogCSAgICAgICAgbmJjaGFycyA9IHhtbEJ1ZlVzZShvdXQtPmNvbnYpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG5iY2hhcnMgPSByZXQ7CisgICAgICAgICAgICAgICAgbmJjaGFycyA9IHJldCA+PSAwID8gcmV0IDogMDsKIAl9IGVsc2UgewogCSAgICByZXQgPSB4bWxCdWZBZGQob3V0LT5idWZmZXIsIChjb25zdCB4bWxDaGFyICopIGJ1ZiwgY2h1bmspOwogCSAgICBpZiAocmV0ICE9IDApCkBAIC0zNjM3LDcgKzM2MzcsNyBAQAogICAgICAgICAgICAgaWYgKG91dC0+d3JpdGVjYWxsYmFjaykKIAkgICAgICAgIG5iY2hhcnMgPSB4bWxCdWZVc2Uob3V0LT5jb252KTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuYmNoYXJzID0gcmV0OworICAgICAgICAgICAgICAgIG5iY2hhcnMgPSByZXQgPj0gMCA/IHJldCA6IDA7CiAJfSBlbHNlIHsKIAkgICAgcmV0ID0gZXNjYXBpbmcoeG1sQnVmRW5kKG91dC0+YnVmZmVyKSwgJmNodW5rLCBzdHIsICZjb25zKTsKIAkgICAgaWYgKChyZXQgPCAwKSB8fCAoY2h1bmsgPT0gMCkpIC8qIGNodW5rPT0wID0+IG5vdGhpbmcgZG9uZSAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94bWxyZWFkZXIuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveG1scmVhZGVyLmMKaW5kZXggYjYwM2M3Mi4uNzJlNDBiMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94bWxyZWFkZXIuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3htbHJlYWRlci5jCkBAIC00OCw2ICs0OCwxMyBAQAogCiAjZGVmaW5lIE1BWF9FUlJfTVNHX1NJWkUgNjQwMDAKIAorI2lmZGVmIEZVWlpJTkdfQlVJTERfTU9ERV9VTlNBRkVfRk9SX1BST0RVQ1RJT04KKy8qIEtlZXBpbmcgZnJlZSBvYmplY3RzIGNhbiBoaWRlIG1lbW9yeSBlcnJvcnMuICovCisjZGVmaW5lIE1BWF9GUkVFX05PREVTIDEKKyNlbHNlCisjZGVmaW5lIE1BWF9GUkVFX05PREVTIDEwMAorI2VuZGlmCisKIC8qCiAgKiBUaGUgZm9sbG93aW5nIFZBX0NPUFkgd2FzIGNvZGVkIGZvbGxvd2luZyBhbiBleGFtcGxlIGluCiAgKiB0aGUgU2FtYmEgcHJvamVjdC4gIEl0IG1heSBub3QgYmUgc3VmZmljaWVudCBmb3Igc29tZQpAQCAtMjc5LDYgKzI4Niw1OSBAQAogfQogCiAvKioKKyAqIHhtbFRleHRSZWFkZXJXYWxrUmVtb3ZlUmVmOgorICogQGRhdGE6ICBDb250ZW50cyBvZiBjdXJyZW50IGxpbmsKKyAqIEB1c2VyOiAgVmFsdWUgc3VwcGxpZWQgYnkgdGhlIHVzZXIKKyAqCisgKiBSZXR1cm5zIDAgdG8gYWJvcnQgdGhlIHdhbGsgb3IgMSB0byBjb250aW51ZQorICovCitzdGF0aWMgaW50Cit4bWxUZXh0UmVhZGVyV2Fsa1JlbW92ZVJlZihjb25zdCB2b2lkICpkYXRhLCB2b2lkICp1c2VyKQoreworICAgIHhtbFJlZlB0ciByZWYgPSAoeG1sUmVmUHRyKWRhdGE7CisgICAgeG1sQXR0clB0ciBhdHRyID0gKHhtbEF0dHJQdHIpdXNlcjsKKworICAgIGlmIChyZWYtPmF0dHIgPT0gYXR0cikgeyAvKiBNYXRjaGVkOiByZW1vdmUgYW5kIHRlcm1pbmF0ZSB3YWxrICovCisgICAgICAgIHJlZi0+bmFtZSA9IHhtbFN0cmR1cChhdHRyLT5uYW1lKTsKKyAgICAgICAgcmVmLT5hdHRyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKioKKyAqIHhtbFRleHRSZWFkZXJSZW1vdmVSZWY6CisgKiBAZG9jOiAgdGhlIGRvY3VtZW50CisgKiBAYXR0cjogIHRoZSBhdHRyaWJ1dGUKKyAqCisgKiBSZW1vdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZSBmcm9tIHRoZSBSZWYgdGFibGUgbWFpbnRhaW5lZCBpbnRlcm5hbGx5LgorICoKKyAqIFJldHVybnMgLTEgaWYgdGhlIGxvb2t1cCBmYWlsZWQgYW5kIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQKK3htbFRleHRSZWFkZXJSZW1vdmVSZWYoeG1sRG9jUHRyIGRvYywgeG1sQXR0clB0ciBhdHRyKSB7CisgICAgeG1sTGlzdFB0ciByZWZfbGlzdDsKKyAgICB4bWxSZWZUYWJsZVB0ciB0YWJsZTsKKyAgICB4bWxDaGFyICpJRDsKKworICAgIGlmIChkb2MgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKyAgICBpZiAoYXR0ciA9PSBOVUxMKSByZXR1cm4oLTEpOworICAgIHRhYmxlID0gKHhtbFJlZlRhYmxlUHRyKSBkb2MtPnJlZnM7CisgICAgaWYgKHRhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBJRCA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgYXR0ci0+Y2hpbGRyZW4sIDEpOworICAgIGlmIChJRCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oLTEpOworICAgIHJlZl9saXN0ID0geG1sSGFzaExvb2t1cCh0YWJsZSwgSUQpOworICAgIHhtbEZyZWUoSUQpOworICAgIGlmKHJlZl9saXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAoLTEpOworICAgIHhtbExpc3RXYWxrKHJlZl9saXN0LCB4bWxUZXh0UmVhZGVyV2Fsa1JlbW92ZVJlZiwgYXR0cik7CisgICAgcmV0dXJuKDApOworfQorCisvKioKICAqIHhtbFRleHRSZWFkZXJGcmVlUHJvcDoKICAqIEByZWFkZXI6ICB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkCiAgKiBAY3VyOiAgdGhlIG5vZGUKQEAgLTI5OSwxOCArMzU5LDIwIEBACiAJeG1sRGVyZWdpc3Rlck5vZGVEZWZhdWx0VmFsdWUoKHhtbE5vZGVQdHIpIGN1cik7CiAKICAgICAvKiBDaGVjayBmb3IgSUQgcmVtb3ZhbCAtPiBsZWFkaW5nIHRvIGludmFsaWQgcmVmZXJlbmNlcyAhICovCi0gICAgaWYgKChjdXItPnBhcmVudCAhPSBOVUxMKSAmJiAoY3VyLT5wYXJlbnQtPmRvYyAhPSBOVUxMKSAmJgotCSgoY3VyLT5wYXJlbnQtPmRvYy0+aW50U3Vic2V0ICE9IE5VTEwpIHx8Ci0JIChjdXItPnBhcmVudC0+ZG9jLT5leHRTdWJzZXQgIT0gTlVMTCkpKSB7CisgICAgaWYgKChjdXItPnBhcmVudCAhPSBOVUxMKSAmJiAoY3VyLT5wYXJlbnQtPmRvYyAhPSBOVUxMKSkgewogICAgICAgICBpZiAoeG1sSXNJRChjdXItPnBhcmVudC0+ZG9jLCBjdXItPnBhcmVudCwgY3VyKSkKIAkgICAgeG1sVGV4dFJlYWRlclJlbW92ZUlEKGN1ci0+cGFyZW50LT5kb2MsIGN1cik7CisJaWYgKCgoY3VyLT5wYXJlbnQtPmRvYy0+aW50U3Vic2V0ICE9IE5VTEwpIHx8CisJICAgICAoY3VyLT5wYXJlbnQtPmRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpKSAmJgorICAgICAgICAgICAgKHhtbElzUmVmKGN1ci0+cGFyZW50LT5kb2MsIGN1ci0+cGFyZW50LCBjdXIpKSkKKyAgICAgICAgICAgIHhtbFRleHRSZWFkZXJSZW1vdmVSZWYoY3VyLT5wYXJlbnQtPmRvYywgY3VyKTsKICAgICB9CiAgICAgaWYgKGN1ci0+Y2hpbGRyZW4gIT0gTlVMTCkKICAgICAgICAgeG1sVGV4dFJlYWRlckZyZWVOb2RlTGlzdChyZWFkZXIsIGN1ci0+Y2hpbGRyZW4pOwogCiAgICAgRElDVF9GUkVFKGN1ci0+bmFtZSk7CiAgICAgaWYgKChyZWFkZXIgIT0gTlVMTCkgJiYgKHJlYWRlci0+Y3R4dCAhPSBOVUxMKSAmJgotICAgICAgICAocmVhZGVyLT5jdHh0LT5mcmVlQXR0cnNOciA8IDEwMCkpIHsKKyAgICAgICAgKHJlYWRlci0+Y3R4dC0+ZnJlZUF0dHJzTnIgPCBNQVhfRlJFRV9OT0RFUykpIHsKICAgICAgICAgY3VyLT5uZXh0ID0gcmVhZGVyLT5jdHh0LT5mcmVlQXR0cnM7CiAJcmVhZGVyLT5jdHh0LT5mcmVlQXR0cnMgPSBjdXI7CiAJcmVhZGVyLT5jdHh0LT5mcmVlQXR0cnNOcisrOwpAQCAtNDExLDcgKzQ3Myw3IEBACiAJICAgIGlmICgoKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB8fAogCQkgKGN1ci0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSkgJiYKIAkgICAgICAgIChyZWFkZXIgIT0gTlVMTCkgJiYgKHJlYWRlci0+Y3R4dCAhPSBOVUxMKSAmJgotCQkocmVhZGVyLT5jdHh0LT5mcmVlRWxlbXNOciA8IDEwMCkpIHsKKwkJKHJlYWRlci0+Y3R4dC0+ZnJlZUVsZW1zTnIgPCBNQVhfRlJFRV9OT0RFUykpIHsKIAkgICAgICAgIGN1ci0+bmV4dCA9IHJlYWRlci0+Y3R4dC0+ZnJlZUVsZW1zOwogCQlyZWFkZXItPmN0eHQtPmZyZWVFbGVtcyA9IGN1cjsKIAkJcmVhZGVyLT5jdHh0LT5mcmVlRWxlbXNOcisrOwpAQCAtNDk5LDcgKzU2MSw3IEBACiAgICAgaWYgKCgoY3VyLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHx8CiAJIChjdXItPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkpICYmCiAJKHJlYWRlciAhPSBOVUxMKSAmJiAocmVhZGVyLT5jdHh0ICE9IE5VTEwpICYmCi0JKHJlYWRlci0+Y3R4dC0+ZnJlZUVsZW1zTnIgPCAxMDApKSB7CisJKHJlYWRlci0+Y3R4dC0+ZnJlZUVsZW1zTnIgPCBNQVhfRlJFRV9OT0RFUykpIHsKIAljdXItPm5leHQgPSByZWFkZXItPmN0eHQtPmZyZWVFbGVtczsKIAlyZWFkZXItPmN0eHQtPmZyZWVFbGVtcyA9IGN1cjsKIAlyZWFkZXItPmN0eHQtPmZyZWVFbGVtc05yKys7CkBAIC0xNDM2LDYgKzE0OTgsOCBAQAogICAgICAgICAgICAgKHJlYWRlci0+bm9kZS0+cHJldi0+dHlwZSAhPSBYTUxfRFREX05PREUpKSB7CiAJICAgIHhtbE5vZGVQdHIgdG1wID0gcmVhZGVyLT5ub2RlLT5wcmV2OwogCSAgICBpZiAoKHRtcC0+ZXh0cmEgJiBOT0RFX0lTX1BSRVNFUlZFRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChvbGRub2RlID09IHRtcCkKKyAgICAgICAgICAgICAgICAgICAgb2xkbm9kZSA9IE5VTEw7CiAJCXhtbFVubGlua05vZGUodG1wKTsKIAkJeG1sVGV4dFJlYWRlckZyZWVOb2RlKHJlYWRlciwgdG1wKTsKIAkgICAgfQpAQCAtMTUyMSw3ICsxNTg1LDggQEAKICAgICAvKgogICAgICAqIEhhbmRsZSBYSW5jbHVkZSBpZiBhc2tlZCBmb3IKICAgICAgKi8KLSAgICBpZiAoKHJlYWRlci0+eGluY2x1ZGUpICYmIChyZWFkZXItPm5vZGUgIT0gTlVMTCkgJiYKKyAgICBpZiAoKHJlYWRlci0+eGluY2x1ZGUpICYmIChyZWFkZXItPmluX3hpbmNsdWRlID09IDApICYmCisgICAgICAgIChyZWFkZXItPm5vZGUgIT0gTlVMTCkgJiYKIAkocmVhZGVyLT5ub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmCiAJKHJlYWRlci0+bm9kZS0+bnMgIT0gTlVMTCkgJiYKIAkoKHhtbFN0ckVxdWFsKHJlYWRlci0+bm9kZS0+bnMtPmhyZWYsIFhJTkNMVURFX05TKSkgfHwKQEAgLTIyNjAsNiArMjMyNSw3IEBACiAgICAgaWYgKHJlYWRlci0+Y3R4dCAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChyZWFkZXItPmRpY3QgPT0gcmVhZGVyLT5jdHh0LT5kaWN0KQogCSAgICByZWFkZXItPmRpY3QgPSBOVUxMOworI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECiAJaWYgKChyZWFkZXItPmN0eHQtPnZjdHh0LnZzdGF0ZVRhYiAhPSBOVUxMKSAmJgogCSAgICAocmVhZGVyLT5jdHh0LT52Y3R4dC52c3RhdGVNYXggPiAwKSl7CiAjaWZkZWYgTElCWE1MX1JFR0VYUF9FTkFCTEVECkBAIC0yMjcwLDYgKzIzMzYsNyBAQAogCSAgICByZWFkZXItPmN0eHQtPnZjdHh0LnZzdGF0ZVRhYiA9IE5VTEw7CiAJICAgIHJlYWRlci0+Y3R4dC0+dmN0eHQudnN0YXRlTWF4ID0gMDsKIAl9CisjZW5kaWYgLyogTElCWE1MX1ZBTElEX0VOQUJMRUQgKi8KIAlpZiAocmVhZGVyLT5jdHh0LT5teURvYyAhPSBOVUxMKSB7CiAJICAgIGlmIChyZWFkZXItPnByZXNlcnZlID09IDApCiAJCXhtbFRleHRSZWFkZXJGcmVlRG9jKHJlYWRlciwgcmVhZGVyLT5jdHh0LT5teURvYyk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3htbHNhdmUuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveG1sc2F2ZS5jCmluZGV4IDBlNjk4YmIuLjQ4OTUwNWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveG1sc2F2ZS5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveG1sc2F2ZS5jCkBAIC01OTAsNyArNTkwLDYgQEAKIHN0YXRpYyB2b2lkCiB4aHRtbE5vZGVEdW1wT3V0cHV0KHhtbFNhdmVDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgY3VyKTsKICNlbmRpZgotc3RhdGljIHZvaWQgeG1sTm9kZUxpc3REdW1wT3V0cHV0KHhtbFNhdmVDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgY3VyKTsKIHN0YXRpYyB2b2lkIHhtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBjdXIpOwogdm9pZCB4bWxOc0xpc3REdW1wT3V0cHV0KHhtbE91dHB1dEJ1ZmZlclB0ciBidWYsIHhtbE5zUHRyIGN1cik7CiBzdGF0aWMgaW50IHhtbERvY0NvbnRlbnREdW1wT3V0cHV0KHhtbFNhdmVDdHh0UHRyIGN0eHQsIHhtbERvY1B0ciBjdXIpOwpAQCAtNzA1LDYgKzcwNCw3IEBACiBzdGF0aWMgdm9pZAogeG1sRHRkRHVtcE91dHB1dCh4bWxTYXZlQ3R4dFB0ciBjdHh0LCB4bWxEdGRQdHIgZHRkKSB7CiAgICAgeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZjsKKyAgICB4bWxOb2RlUHRyIGN1cjsKICAgICBpbnQgZm9ybWF0LCBsZXZlbDsKIAogICAgIGlmIChkdGQgPT0gTlVMTCkgcmV0dXJuOwpAQCAtNzQyLDcgKzc0Miw5IEBACiAgICAgbGV2ZWwgPSBjdHh0LT5sZXZlbDsKICAgICBjdHh0LT5mb3JtYXQgPSAwOwogICAgIGN0eHQtPmxldmVsID0gLTE7Ci0gICAgeG1sTm9kZUxpc3REdW1wT3V0cHV0KGN0eHQsIGR0ZC0+Y2hpbGRyZW4pOworICAgIGZvciAoY3VyID0gZHRkLT5jaGlsZHJlbjsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICB4bWxOb2RlRHVtcE91dHB1dEludGVybmFsKGN0eHQsIGN1cik7CisgICAgfQogICAgIGN0eHQtPmZvcm1hdCA9IGZvcm1hdDsKICAgICBjdHh0LT5sZXZlbCA9IGxldmVsOwogICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIl0+Iik7CkBAIC03NzYsNTggKzc3OCw5IEBACiAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiXCIiKTsKIH0KIAotLyoqCi0gKiB4bWxBdHRyTGlzdER1bXBPdXRwdXQ6Ci0gKiBAYnVmOiAgdGhlIFhNTCBidWZmZXIgb3V0cHV0Ci0gKiBAZG9jOiAgdGhlIGRvY3VtZW50Ci0gKiBAY3VyOiAgdGhlIGZpcnN0IGF0dHJpYnV0ZSBwb2ludGVyCi0gKiBAZW5jb2Rpbmc6ICBhbiBvcHRpb25hbCBlbmNvZGluZyBzdHJpbmcKLSAqCi0gKiBEdW1wIGEgbGlzdCBvZiBYTUwgYXR0cmlidXRlcwotICovCi1zdGF0aWMgdm9pZAoteG1sQXR0ckxpc3REdW1wT3V0cHV0KHhtbFNhdmVDdHh0UHRyIGN0eHQsIHhtbEF0dHJQdHIgY3VyKSB7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSByZXR1cm47Ci0gICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgIHhtbEF0dHJEdW1wT3V0cHV0KGN0eHQsIGN1cik7Ci0JY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLX0KLQotCi0KLS8qKgotICogeG1sTm9kZUxpc3REdW1wT3V0cHV0OgotICogQGN1cjogIHRoZSBmaXJzdCBub2RlCi0gKgotICogRHVtcCBhbiBYTUwgbm9kZSBsaXN0LCByZWN1cnNpdmUgYmVoYXZpb3VyLCBjaGlsZHJlbiBhcmUgcHJpbnRlZCB0b28uCi0gKi8KLXN0YXRpYyB2b2lkCi14bWxOb2RlTGlzdER1bXBPdXRwdXQoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBjdXIpIHsKLSAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOwotCi0gICAgaWYgKGN1ciA9PSBOVUxMKSByZXR1cm47Ci0gICAgYnVmID0gY3R4dC0+YnVmOwotICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewotCWlmICgoY3R4dC0+Zm9ybWF0ID09IDEpICYmICh4bWxJbmRlbnRUcmVlT3V0cHV0KSAmJgotCSAgICAoKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB8fAotCSAgICAgKGN1ci0+dHlwZSA9PSBYTUxfQ09NTUVOVF9OT0RFKSB8fAotCSAgICAgKGN1ci0+dHlwZSA9PSBYTUxfUElfTk9ERSkpKQotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGN0eHQtPmluZGVudF9zaXplICoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eHQtPmxldmVsID4gY3R4dC0+aW5kZW50X25yID8KLQkJCQkgIGN0eHQtPmluZGVudF9uciA6IGN0eHQtPmxldmVsKSwKLQkJCQkgY3R4dC0+aW5kZW50KTsKLSAgICAgICAgeG1sTm9kZUR1bXBPdXRwdXRJbnRlcm5hbChjdHh0LCBjdXIpOwotCWlmIChjdHh0LT5mb3JtYXQgPT0gMSkgewotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOwotCX0KLQljdXIgPSBjdXItPm5leHQ7Ci0gICAgfQotfQotCiAjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogLyoqCi0gKiB4bWxOb2RlRHVtcE91dHB1dEludGVybmFsOgorICogaHRtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWw6CiAgKiBAY3VyOiAgdGhlIGN1cnJlbnQgbm9kZQogICoKICAqIER1bXAgYW4gSFRNTCBub2RlLCByZWN1cnNpdmUgYmVoYXZpb3VyLCBjaGlsZHJlbiBhcmUgcHJpbnRlZCB0b28uCkBAIC04OTMsNTcgKzg0NiwxMjYgQEAKICAqLwogc3RhdGljIHZvaWQKIHhtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBjdXIpIHsKLSAgICBpbnQgZm9ybWF0OwotICAgIHhtbE5vZGVQdHIgdG1wOworICAgIGludCBmb3JtYXQgPSBjdHh0LT5mb3JtYXQ7CisgICAgeG1sTm9kZVB0ciB0bXAsIHJvb3QsIHVuZm9ybWF0dGVkTm9kZSA9IE5VTEwsIHBhcmVudDsKKyAgICB4bWxBdHRyUHRyIGF0dHI7CiAgICAgeG1sQ2hhciAqc3RhcnQsICplbmQ7CiAgICAgeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZjsKIAogICAgIGlmIChjdXIgPT0gTlVMTCkgcmV0dXJuOwogICAgIGJ1ZiA9IGN0eHQtPmJ1ZjsKLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9YSU5DTFVERV9TVEFSVCkKLQlyZXR1cm47Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfWElOQ0xVREVfRU5EKQotCXJldHVybjsKLSAgICBpZiAoKGN1ci0+dHlwZSA9PSBYTUxfRE9DVU1FTlRfTk9ERSkgfHwKLSAgICAgICAgKGN1ci0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKSkgewotCXhtbERvY0NvbnRlbnREdW1wT3V0cHV0KGN0eHQsICh4bWxEb2NQdHIpIGN1cik7Ci0JcmV0dXJuOwotICAgIH0KLSNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECi0gICAgaWYgKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9YSFRNTCkgewotICAgICAgICB4aHRtbE5vZGVEdW1wT3V0cHV0KGN0eHQsIGN1cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCgoY3VyLT50eXBlICE9IFhNTF9OQU1FU1BBQ0VfREVDTCkgJiYgKGN1ci0+ZG9jICE9IE5VTEwpICYmCi0gICAgICAgICAoY3VyLT5kb2MtPnR5cGUgPT0gWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSkgJiYKLSAgICAgICAgICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9TQVZFX0FTX1hNTCkgPT0gMCkpIHx8Ci0gICAgICAgIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfQVNfSFRNTCkpIHsKLQlodG1sTm9kZUR1bXBPdXRwdXRJbnRlcm5hbChjdHh0LCBjdXIpOwotCXJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9EVERfTk9ERSkgewotICAgICAgICB4bWxEdGREdW1wT3V0cHV0KGN0eHQsICh4bWxEdGRQdHIpIGN1cik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9ET0NVTUVOVF9GUkFHX05PREUpIHsKLSAgICAgICAgeG1sTm9kZUxpc3REdW1wT3V0cHV0KGN0eHQsIGN1ci0+Y2hpbGRyZW4pOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9ERUNMKSB7Ci0gICAgICAgIHhtbEJ1ZkR1bXBFbGVtZW50RGVjbChidWYtPmJ1ZmZlciwgKHhtbEVsZW1lbnRQdHIpIGN1cik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9BVFRSSUJVVEVfREVDTCkgewotICAgICAgICB4bWxCdWZEdW1wQXR0cmlidXRlRGVjbChidWYtPmJ1ZmZlciwgKHhtbEF0dHJpYnV0ZVB0cikgY3VyKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0VOVElUWV9ERUNMKSB7Ci0gICAgICAgIHhtbEJ1ZkR1bXBFbnRpdHlEZWNsKGJ1Zi0+YnVmZmVyLCAoeG1sRW50aXR5UHRyKSBjdXIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSB7Ci0JaWYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSB7CisKKyAgICByb290ID0gY3VyOworICAgIHBhcmVudCA9IGN1ci0+cGFyZW50OworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHN3aXRjaCAoY3VyLT50eXBlKSB7CisgICAgICAgIGNhc2UgWE1MX0RPQ1VNRU5UX05PREU6CisgICAgICAgIGNhc2UgWE1MX0hUTUxfRE9DVU1FTlRfTk9ERToKKwkgICAgeG1sRG9jQ29udGVudER1bXBPdXRwdXQoY3R4dCwgKHhtbERvY1B0cikgY3VyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfRFREX05PREU6CisgICAgICAgICAgICB4bWxEdGREdW1wT3V0cHV0KGN0eHQsICh4bWxEdGRQdHIpIGN1cik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFhNTF9ET0NVTUVOVF9GUkFHX05PREU6CisgICAgICAgICAgICAvKiBBbHdheXMgdmFsaWRhdGUgY3VyLT5wYXJlbnQgd2hlbiBkZXNjZW5kaW5nLiAqLworICAgICAgICAgICAgaWYgKChjdXItPnBhcmVudCA9PSBwYXJlbnQpICYmIChjdXItPmNoaWxkcmVuICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gY3VyOworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+Y2hpbGRyZW47CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisJICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWE1MX0VMRU1FTlRfREVDTDoKKyAgICAgICAgICAgIHhtbEJ1ZkR1bXBFbGVtZW50RGVjbChidWYtPmJ1ZmZlciwgKHhtbEVsZW1lbnRQdHIpIGN1cik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFhNTF9BVFRSSUJVVEVfREVDTDoKKyAgICAgICAgICAgIHhtbEJ1ZkR1bXBBdHRyaWJ1dGVEZWNsKGJ1Zi0+YnVmZmVyLCAoeG1sQXR0cmlidXRlUHRyKSBjdXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfRU5USVRZX0RFQ0w6CisgICAgICAgICAgICB4bWxCdWZEdW1wRW50aXR5RGVjbChidWYtPmJ1ZmZlciwgKHhtbEVudGl0eVB0cikgY3VyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWE1MX0VMRU1FTlRfTk9ERToKKwkgICAgaWYgKChjdXIgIT0gcm9vdCkgJiYgKGN0eHQtPmZvcm1hdCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICh4bWxJbmRlbnRUcmVlT3V0cHV0KSkKKwkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBjdHh0LT5pbmRlbnRfc2l6ZSAqCisJCQkJICAgICAoY3R4dC0+bGV2ZWwgPiBjdHh0LT5pbmRlbnRfbnIgPworCQkJCSAgICAgIGN0eHQtPmluZGVudF9uciA6IGN0eHQtPmxldmVsKSwKKwkJCQkgICAgIGN0eHQtPmluZGVudCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTb21lIHVzZXJzIGxpa2UgbHhtbCBhcmUga25vd24gdG8gcGFzcyBub2RlcyB3aXRoIGEgY29ycnVwdGVkCisgICAgICAgICAgICAgKiB0cmVlIHN0cnVjdHVyZS4gRmFsbCBiYWNrIHRvIGEgcmVjdXJzaXZlIGNhbGwgdG8gaGFuZGxlIHRoaXMKKyAgICAgICAgICAgICAqIGNhc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoY3VyLT5wYXJlbnQgIT0gcGFyZW50KSAmJiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIHhtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoY3R4dCwgY3VyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiPCIpOworICAgICAgICAgICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5ucy0+cHJlZml4KTsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI6Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKKyAgICAgICAgICAgIGlmIChjdXItPm5zRGVmKQorICAgICAgICAgICAgICAgIHhtbE5zTGlzdER1bXBPdXRwdXRDdHh0KGN0eHQsIGN1ci0+bnNEZWYpOworICAgICAgICAgICAgZm9yIChhdHRyID0gY3VyLT5wcm9wZXJ0aWVzOyBhdHRyICE9IE5VTEw7IGF0dHIgPSBhdHRyLT5uZXh0KQorICAgICAgICAgICAgICAgIHhtbEF0dHJEdW1wT3V0cHV0KGN0eHQsIGF0dHIpOworCisgICAgICAgICAgICBpZiAoY3VyLT5jaGlsZHJlbiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfTk9fRU1QVFkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmZvcm1hdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVXU05vblNpZyhjdHh0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAyLCAiLz4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDEpOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICI+PC8iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDApOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gY3VyLT5jaGlsZHJlbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcC0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bXAtPnR5cGUgPT0gWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG1wLT50eXBlID09IFhNTF9FTlRJVFlfUkVGX05PREUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+Zm9ybWF0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmZvcm1hdHRlZE5vZGUgPSBjdXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmZvcm1hdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDEpOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIj4iKTsKKyAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDEpIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7CisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmxldmVsID49IDApIGN0eHQtPmxldmVsKys7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gY3VyOworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+Y2hpbGRyZW47CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWE1MX1RFWFRfTk9ERToKKwkgICAgaWYgKGN1ci0+Y29udGVudCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCSAgICBpZiAoY3VyLT5uYW1lICE9IHhtbFN0cmluZ1RleHROb2VuYykgewogICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKGJ1ZiwgY3VyLT5jb250ZW50LCBjdHh0LT5lc2NhcGUpOwogCSAgICB9IGVsc2UgewpAQCAtOTUyLDEzOSArOTc0LDEzNiBAQAogCQkgKi8KIAkJeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKSBjdXItPmNvbnRlbnQpOwogCSAgICB9Ci0JfQorCSAgICBicmVhazsKIAotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfUElfTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgewotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICI8PyIpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLQkgICAgaWYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSB7Ci0JICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDIpCi0JICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVXU05vblNpZyhjdHh0LCAwKTsKLQkgICAgICAgIGVsc2UKLQkgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICIgIik7Ci0JCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPmNvbnRlbnQpOwotCSAgICB9Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIj8+Iik7Ci0JfSBlbHNlIHsKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAyLCAiPD8iKTsKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0JICAgIGlmIChjdHh0LT5mb3JtYXQgPT0gMikKLQkgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlV1NOb25TaWcoY3R4dCwgMCk7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIj8+Iik7Ci0JfQotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfQ09NTUVOVF9OT0RFKSB7Ci0JaWYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNCwgIjwhLS0iKTsKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+Y29udGVudCk7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMywgIi0tPiIpOwotCX0KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0VOVElUWV9SRUZfTk9ERSkgewotICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICImIik7Ci0JeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0gICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIjsiKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgPT0gTlVMTCB8fCAqY3VyLT5jb250ZW50ID09ICdcMCcpIHsKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxMiwgIjwhW0NEQVRBW11dPiIpOwotCX0gZWxzZSB7Ci0JICAgIHN0YXJ0ID0gZW5kID0gY3VyLT5jb250ZW50OwotCSAgICB3aGlsZSAoKmVuZCAhPSAnXDAnKSB7Ci0JCWlmICgoKmVuZCA9PSAnXScpICYmICgqKGVuZCArIDEpID09ICddJykgJiYKLQkJICAgICgqKGVuZCArIDIpID09ICc+JykpIHsKLQkJICAgIGVuZCA9IGVuZCArIDI7Ci0JCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDksICI8IVtDREFUQVsiKTsKLQkJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgZW5kIC0gc3RhcnQsIChjb25zdCBjaGFyICopc3RhcnQpOwotCQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7Ci0JCSAgICBzdGFydCA9IGVuZDsKLQkJfQotCQllbmQrKzsKLQkgICAgfQotCSAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0JCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopc3RhcnQpOwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICJdXT4iKTsKLQkgICAgfQotCX0KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSB7Ci0JeG1sQXR0ckR1bXBPdXRwdXQoY3R4dCwgKHhtbEF0dHJQdHIpIGN1cik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9OQU1FU1BBQ0VfREVDTCkgewotCXhtbE5zRHVtcE91dHB1dEN0eHQoY3R4dCwgKHhtbE5zUHRyKSBjdXIpOwotCXJldHVybjsKLSAgICB9CisgICAgICAgIGNhc2UgWE1MX1BJX05PREU6CisJICAgIGlmICgoY3VyICE9IHJvb3QpICYmIChjdHh0LT5mb3JtYXQgPT0gMSkgJiYgKHhtbEluZGVudFRyZWVPdXRwdXQpKQorCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGN0eHQtPmluZGVudF9zaXplICoKKwkJCQkgICAgIChjdHh0LT5sZXZlbCA+IGN0eHQtPmluZGVudF9uciA/CisJCQkJICAgICAgY3R4dC0+aW5kZW50X25yIDogY3R4dC0+bGV2ZWwpLAorCQkJCSAgICAgY3R4dC0+aW5kZW50KTsKIAotICAgIGZvcm1hdCA9IGN0eHQtPmZvcm1hdDsKLSAgICBpZiAoZm9ybWF0ID09IDEpIHsKLQl0bXAgPSBjdXItPmNoaWxkcmVuOwotCXdoaWxlICh0bXAgIT0gTlVMTCkgewotCSAgICBpZiAoKHRtcC0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSB8fAotCQkodG1wLT50eXBlID09IFhNTF9DREFUQV9TRUNUSU9OX05PREUpIHx8Ci0JCSh0bXAtPnR5cGUgPT0gWE1MX0VOVElUWV9SRUZfTk9ERSkpIHsKLQkJY3R4dC0+Zm9ybWF0ID0gMDsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgdG1wID0gdG1wLT5uZXh0OwotCX0KLSAgICB9Ci0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiPCIpOwotICAgIGlmICgoY3VyLT5ucyAhPSBOVUxMKSAmJiAoY3VyLT5ucy0+cHJlZml4ICE9IE5VTEwpKSB7Ci0gICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIjoiKTsKLSAgICB9CisgICAgICAgICAgICBpZiAoY3VyLT5jb250ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICI8PyIpOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICIgIik7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWN1ci0+Y29udGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIj8+Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjw/Iik7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmZvcm1hdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDApOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIj8+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotICAgIGlmIChjdXItPm5zRGVmKQotICAgICAgICB4bWxOc0xpc3REdW1wT3V0cHV0Q3R4dChjdHh0LCBjdXItPm5zRGVmKTsKLSAgICBpZiAoY3VyLT5wcm9wZXJ0aWVzICE9IE5VTEwpCi0gICAgICAgIHhtbEF0dHJMaXN0RHVtcE91dHB1dChjdHh0LCBjdXItPnByb3BlcnRpZXMpOworICAgICAgICBjYXNlIFhNTF9DT01NRU5UX05PREU6CisJICAgIGlmICgoY3VyICE9IHJvb3QpICYmIChjdHh0LT5mb3JtYXQgPT0gMSkgJiYgKHhtbEluZGVudFRyZWVPdXRwdXQpKQorCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGN0eHQtPmluZGVudF9zaXplICoKKwkJCQkgICAgIChjdHh0LT5sZXZlbCA+IGN0eHQtPmluZGVudF9uciA/CisJCQkJICAgICAgY3R4dC0+aW5kZW50X25yIDogY3R4dC0+bGV2ZWwpLAorCQkJCSAgICAgY3R4dC0+aW5kZW50KTsKIAotICAgIGlmICgoKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB8fCAoY3VyLT5jb250ZW50ID09IE5VTEwpKSAmJgotCShjdXItPmNoaWxkcmVuID09IE5VTEwpICYmICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9TQVZFX05PX0VNUFRZKSA9PSAwKSkgewotICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDIpCi0gICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDApOwotICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICIvPiIpOwotCWN0eHQtPmZvcm1hdCA9IGZvcm1hdDsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdHh0LT5mb3JtYXQgPT0gMikKLSAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVXU05vblNpZyhjdHh0LCAxKTsKLSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7Ci0gICAgaWYgKChjdXItPnR5cGUgIT0gWE1MX0VMRU1FTlRfTk9ERSkgJiYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSkgewotCXhtbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKGJ1ZiwgY3VyLT5jb250ZW50LCBjdHh0LT5lc2NhcGUpOwotICAgIH0KLSAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB7Ci0JaWYgKGN0eHQtPmZvcm1hdCA9PSAxKSB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOwotCWlmIChjdHh0LT5sZXZlbCA+PSAwKSBjdHh0LT5sZXZlbCsrOwotCXhtbE5vZGVMaXN0RHVtcE91dHB1dChjdHh0LCBjdXItPmNoaWxkcmVuKTsKLQlpZiAoY3R4dC0+bGV2ZWwgPiAwKSBjdHh0LT5sZXZlbC0tOwotCWlmICgoeG1sSW5kZW50VHJlZU91dHB1dCkgJiYgKGN0eHQtPmZvcm1hdCA9PSAxKSkKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBjdHh0LT5pbmRlbnRfc2l6ZSAqCi0JICAgICAgICAgICAgICAgICAgICAgICAgIChjdHh0LT5sZXZlbCA+IGN0eHQtPmluZGVudF9uciA/Ci0JCQkJICBjdHh0LT5pbmRlbnRfbnIgOiBjdHh0LT5sZXZlbCksCi0JCQkJIGN0eHQtPmluZGVudCk7Ci0gICAgfQotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjwvIik7Ci0gICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKLSAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bnMtPnByZWZpeCk7Ci0JeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOiIpOwotICAgIH0KKyAgICAgICAgICAgIGlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNCwgIjwhLS0iKTsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICItLT4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0gICAgaWYgKGN0eHQtPmZvcm1hdCA9PSAyKQotICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDApOwotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIj4iKTsKLSAgICBjdHh0LT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIGNhc2UgWE1MX0VOVElUWV9SRUZfTk9ERToKKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIiYiKTsKKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOyIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICAgICAgaWYgKGN1ci0+Y29udGVudCA9PSBOVUxMIHx8ICpjdXItPmNvbnRlbnQgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMTIsICI8IVtDREFUQVtdXT4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgPSBjdXItPmNvbnRlbnQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKCplbmQgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKCplbmQgPT0gJ10nKSAmJiAoKihlbmQgKyAxKSA9PSAnXScpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKihlbmQgKyAyKSA9PSAnPicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCA5LCAiPCFbQ0RBVEFbIik7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMywgIl1dPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW5kKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSBlbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCA5LCAiPCFbQ0RBVEFbIik7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKilzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMywgIl1dPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWE1MX0FUVFJJQlVURV9OT0RFOgorICAgICAgICAgICAgeG1sQXR0ckR1bXBPdXRwdXQoY3R4dCwgKHhtbEF0dHJQdHIpIGN1cik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFhNTF9OQU1FU1BBQ0VfREVDTDoKKyAgICAgICAgICAgIHhtbE5zRHVtcE91dHB1dEN0eHQoY3R4dCwgKHhtbE5zUHRyKSBjdXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gcm9vdCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoKGN0eHQtPmZvcm1hdCA9PSAxKSAmJgorICAgICAgICAgICAgICAgIChjdXItPnR5cGUgIT0gWE1MX1hJTkNMVURFX1NUQVJUKSAmJgorICAgICAgICAgICAgICAgIChjdXItPnR5cGUgIT0gWE1MX1hJTkNMVURFX0VORCkpCisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiXG4iKTsKKyAgICAgICAgICAgIGlmIChjdXItPm5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyID0gcGFyZW50OworICAgICAgICAgICAgLyogY3VyLT5wYXJlbnQgd2FzIHZhbGlkYXRlZCB3aGVuIGRlc2NlbmRpbmcuICovCisgICAgICAgICAgICBwYXJlbnQgPSBjdXItPnBhcmVudDsKKworICAgICAgICAgICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmxldmVsID4gMCkgY3R4dC0+bGV2ZWwtLTsKKyAgICAgICAgICAgICAgICBpZiAoKHhtbEluZGVudFRyZWVPdXRwdXQpICYmIChjdHh0LT5mb3JtYXQgPT0gMSkpCisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgY3R4dC0+aW5kZW50X3NpemUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4dC0+bGV2ZWwgPiBjdHh0LT5pbmRlbnRfbnIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+aW5kZW50X25yIDogY3R4dC0+bGV2ZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5pbmRlbnQpOworCisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAyLCAiPC8iKTsKKyAgICAgICAgICAgICAgICBpZiAoKGN1ci0+bnMgIT0gTlVMTCkgJiYgKGN1ci0+bnMtPnByZWZpeCAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI6Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmZvcm1hdCA9PSAyKQorICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVdTTm9uU2lnKGN0eHQsIDApOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIj4iKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXIgPT0gdW5mb3JtYXR0ZWROb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eHQtPmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgdW5mb3JtYXR0ZWROb2RlID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qKgpAQCAtMTIyNCw3ICsxMjQzLDkgQEAKIAkJZWxzZQogI2VuZGlmCiAJCSAgICB4bWxOb2RlRHVtcE91dHB1dEludGVybmFsKGN0eHQsIGNoaWxkKTsKLQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLT50eXBlICE9IFhNTF9YSU5DTFVERV9TVEFSVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNoaWxkLT50eXBlICE9IFhNTF9YSU5DTFVERV9FTkQpKQorICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOwogCQljaGlsZCA9IGNoaWxkLT5uZXh0OwogCSAgICB9CiAJfQpAQCAtMTM5Niw0MCArMTQxNyw2IEBACiB9CiAKIC8qKgotICogeGh0bWxOb2RlTGlzdER1bXBPdXRwdXQ6Ci0gKiBAYnVmOiAgdGhlIFhNTCBidWZmZXIgb3V0cHV0Ci0gKiBAZG9jOiAgdGhlIFhIVE1MIGRvY3VtZW50Ci0gKiBAY3VyOiAgdGhlIGZpcnN0IG5vZGUKLSAqIEBsZXZlbDogdGhlIGltYnJpY2F0aW9uIGxldmVsIGZvciBpbmRlbnRpbmcKLSAqIEBmb3JtYXQ6IGlzIGZvcm1hdHRpbmcgYWxsb3dlZAotICogQGVuY29kaW5nOiAgYW4gb3B0aW9uYWwgZW5jb2Rpbmcgc3RyaW5nCi0gKgotICogRHVtcCBhbiBYTUwgbm9kZSBsaXN0LCByZWN1cnNpdmUgYmVoYXZpb3VyLCBjaGlsZHJlbiBhcmUgcHJpbnRlZCB0b28uCi0gKiBOb3RlIHRoYXQgQGZvcm1hdCA9IDEgcHJvdmlkZSBub2RlIGluZGVudGluZyBvbmx5IGlmIHhtbEluZGVudFRyZWVPdXRwdXQgPSAxCi0gKiBvciB4bWxLZWVwQmxhbmtzRGVmYXVsdCgwKSB3YXMgY2FsbGVkCi0gKi8KLXN0YXRpYyB2b2lkCi14aHRtbE5vZGVMaXN0RHVtcE91dHB1dCh4bWxTYXZlQ3R4dFB0ciBjdHh0LCB4bWxOb2RlUHRyIGN1cikgewotICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7Ci0KLSAgICBpZiAoY3VyID09IE5VTEwpIHJldHVybjsKLSAgICBidWYgPSBjdHh0LT5idWY7Ci0gICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0JaWYgKChjdHh0LT5mb3JtYXQgPT0gMSkgJiYgKHhtbEluZGVudFRyZWVPdXRwdXQpICYmCi0JICAgIChjdXItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkpCi0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgY3R4dC0+aW5kZW50X3NpemUgKgotCSAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4dC0+bGV2ZWwgPiBjdHh0LT5pbmRlbnRfbnIgPwotCQkJCSAgY3R4dC0+aW5kZW50X25yIDogY3R4dC0+bGV2ZWwpLAotCQkJCSBjdHh0LT5pbmRlbnQpOwotICAgICAgICB4aHRtbE5vZGVEdW1wT3V0cHV0KGN0eHQsIGN1cik7Ci0JaWYgKGN0eHQtPmZvcm1hdCA9PSAxKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7Ci0JfQotCWN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qKgogICogeGh0bWxOb2RlRHVtcE91dHB1dDoKICAqIEBidWY6ICB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQKICAqIEBkb2M6ICB0aGUgWEhUTUwgZG9jdW1lbnQKQEAgLTE0NDIsNDggKzE0MjksMTk1IEBACiAgKi8KIHN0YXRpYyB2b2lkCiB4aHRtbE5vZGVEdW1wT3V0cHV0KHhtbFNhdmVDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgY3VyKSB7Ci0gICAgaW50IGZvcm1hdCwgYWRkbWV0YSA9IDA7Ci0gICAgeG1sTm9kZVB0ciB0bXA7CisgICAgaW50IGZvcm1hdCA9IGN0eHQtPmZvcm1hdCwgYWRkbWV0YTsKKyAgICB4bWxOb2RlUHRyIHRtcCwgcm9vdCwgdW5mb3JtYXR0ZWROb2RlID0gTlVMTDsKICAgICB4bWxDaGFyICpzdGFydCwgKmVuZDsKLSAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOworICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWYgPSBjdHh0LT5idWY7CiAKICAgICBpZiAoY3VyID09IE5VTEwpIHJldHVybjsKLSAgICBpZiAoKGN1ci0+dHlwZSA9PSBYTUxfRE9DVU1FTlRfTk9ERSkgfHwKLSAgICAgICAgKGN1ci0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKSkgewotICAgICAgICB4bWxEb2NDb250ZW50RHVtcE91dHB1dChjdHh0LCAoeG1sRG9jUHRyKSBjdXIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfWElOQ0xVREVfU1RBUlQpCi0JcmV0dXJuOwotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX1hJTkNMVURFX0VORCkKLQlyZXR1cm47Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfTkFNRVNQQUNFX0RFQ0wpIHsKLQl4bWxOc0R1bXBPdXRwdXRDdHh0KGN0eHQsICh4bWxOc1B0cikgY3VyKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0RURF9OT0RFKSB7Ci0gICAgICAgIHhtbER0ZER1bXBPdXRwdXQoY3R4dCwgKHhtbER0ZFB0cikgY3VyKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0RPQ1VNRU5UX0ZSQUdfTk9ERSkgewotICAgICAgICB4aHRtbE5vZGVMaXN0RHVtcE91dHB1dChjdHh0LCBjdXItPmNoaWxkcmVuKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGJ1ZiA9IGN0eHQtPmJ1ZjsKLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9FTEVNRU5UX0RFQ0wpIHsKLSAgICAgICAgeG1sQnVmRHVtcEVsZW1lbnREZWNsKGJ1Zi0+YnVmZmVyLCAoeG1sRWxlbWVudFB0cikgY3VyKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9ERUNMKSB7Ci0gICAgICAgIHhtbEJ1ZkR1bXBBdHRyaWJ1dGVEZWNsKGJ1Zi0+YnVmZmVyLCAoeG1sQXR0cmlidXRlUHRyKSBjdXIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfRU5USVRZX0RFQ0wpIHsKLSAgICAgICAgeG1sQnVmRHVtcEVudGl0eURlY2woYnVmLT5idWZmZXIsICh4bWxFbnRpdHlQdHIpIGN1cik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9URVhUX05PREUpIHsKLQlpZiAoY3VyLT5jb250ZW50ICE9IE5VTEwpIHsKKworICAgIHJvb3QgPSBjdXI7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgc3dpdGNoIChjdXItPnR5cGUpIHsKKyAgICAgICAgY2FzZSBYTUxfRE9DVU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgeG1sRG9jQ29udGVudER1bXBPdXRwdXQoY3R4dCwgKHhtbERvY1B0cikgY3VyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfTkFNRVNQQUNFX0RFQ0w6CisJICAgIHhtbE5zRHVtcE91dHB1dEN0eHQoY3R4dCwgKHhtbE5zUHRyKSBjdXIpOworCSAgICBicmVhazsKKworICAgICAgICBjYXNlIFhNTF9EVERfTk9ERToKKyAgICAgICAgICAgIHhtbER0ZER1bXBPdXRwdXQoY3R4dCwgKHhtbER0ZFB0cikgY3VyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfRE9DVU1FTlRfRlJBR19OT0RFOgorICAgICAgICAgICAgaWYgKGN1ci0+Y2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICBjdXIgPSBjdXItPmNoaWxkcmVuOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfRUxFTUVOVF9ERUNMOgorICAgICAgICAgICAgeG1sQnVmRHVtcEVsZW1lbnREZWNsKGJ1Zi0+YnVmZmVyLCAoeG1sRWxlbWVudFB0cikgY3VyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfQVRUUklCVVRFX0RFQ0w6CisgICAgICAgICAgICB4bWxCdWZEdW1wQXR0cmlidXRlRGVjbChidWYtPmJ1ZmZlciwgKHhtbEF0dHJpYnV0ZVB0cikgY3VyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfRU5USVRZX0RFQ0w6CisgICAgICAgICAgICB4bWxCdWZEdW1wRW50aXR5RGVjbChidWYtPmJ1ZmZlciwgKHhtbEVudGl0eVB0cikgY3VyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgYWRkbWV0YSA9IDA7CisKKwkgICAgaWYgKChjdXIgIT0gcm9vdCkgJiYgKGN0eHQtPmZvcm1hdCA9PSAxKSAmJiAoeG1sSW5kZW50VHJlZU91dHB1dCkpCisJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgY3R4dC0+aW5kZW50X3NpemUgKgorCQkJCSAgICAgKGN0eHQtPmxldmVsID4gY3R4dC0+aW5kZW50X25yID8KKwkJCQkgICAgICBjdHh0LT5pbmRlbnRfbnIgOiBjdHh0LT5sZXZlbCksCisJCQkJICAgICBjdHh0LT5pbmRlbnQpOworCisgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI8Iik7CisgICAgICAgICAgICBpZiAoKGN1ci0+bnMgIT0gTlVMTCkgJiYgKGN1ci0+bnMtPnByZWZpeCAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIjoiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7CisgICAgICAgICAgICBpZiAoY3VyLT5uc0RlZikKKyAgICAgICAgICAgICAgICB4bWxOc0xpc3REdW1wT3V0cHV0Q3R4dChjdHh0LCBjdXItPm5zRGVmKTsKKyAgICAgICAgICAgIGlmICgoeG1sU3RyRXF1YWwoY3VyLT5uYW1lLCBCQURfQ0FTVCAiaHRtbCIpICYmCisgICAgICAgICAgICAgICAgKGN1ci0+bnMgPT0gTlVMTCkgJiYgKGN1ci0+bnNEZWYgPT0gTlVMTCkpKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAzLjEuMS4gU3RyaWN0bHkgQ29uZm9ybWluZyBEb2N1bWVudHMgQS4zLjEuMSAzLworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdXItPnByb3BlcnRpZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB4aHRtbEF0dHJMaXN0RHVtcE91dHB1dChjdHh0LCBjdXItPnByb3BlcnRpZXMpOworCisgICAgICAgICAgICBpZiAoKGN1ci0+cGFyZW50ICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgKGN1ci0+cGFyZW50LT5wYXJlbnQgPT0gKHhtbE5vZGVQdHIpIGN1ci0+ZG9jKSAmJgorICAgICAgICAgICAgICAgIHhtbFN0ckVxdWFsKGN1ci0+bmFtZSwgQkFEX0NBU1QiaGVhZCIpICYmCisgICAgICAgICAgICAgICAgeG1sU3RyRXF1YWwoY3VyLT5wYXJlbnQtPm5hbWUsIEJBRF9DQVNUImh0bWwiKSkgeworCisgICAgICAgICAgICAgICAgdG1wID0gY3VyLT5jaGlsZHJlbjsKKyAgICAgICAgICAgICAgICB3aGlsZSAodG1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFN0ckVxdWFsKHRtcC0+bmFtZSwgQkFEX0NBU1QibWV0YSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICpodHRwZXF1aXY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBlcXVpdiA9IHhtbEdldFByb3AodG1wLCBCQURfQ0FTVCJodHRwLWVxdWl2Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cGVxdWl2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU3RyY2FzZWNtcChodHRwZXF1aXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0NBU1QiQ29udGVudC1UeXBlIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKGh0dHBlcXVpdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKGh0dHBlcXVpdik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGFkZG1ldGEgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3VyLT5jaGlsZHJlbiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCgoY3VyLT5ucyA9PSBOVUxMKSB8fCAoY3VyLT5ucy0+cHJlZml4ID09IE5VTEwpKSAmJgorICAgICAgICAgICAgICAgICAgICAoKHhodG1sSXNFbXB0eShjdXIpID09IDEpICYmIChhZGRtZXRhID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBDLjIuIEVtcHR5IEVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICIgLz4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkbWV0YSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxJbmRlbnRUcmVlT3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGN0eHQtPmluZGVudF9zaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHh0LT5sZXZlbCArIDEgPiBjdHh0LT5pbmRlbnRfbnIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+aW5kZW50X25yIDogY3R4dC0+bGV2ZWwgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmluZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHh0LT5lbmNvZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3R4dC0+ZW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDUsICJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCA0LCAiXCIgLz4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHh0LT5mb3JtYXQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiPiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIEMuMy4gRWxlbWVudCBNaW5pbWl6YXRpb24gYW5kIEVtcHR5IEVsZW1lbnQgQ29udGVudAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAyLCAiPC8iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7CisgICAgICAgICAgICAgICAgaWYgKGFkZG1ldGEgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sSW5kZW50VHJlZU91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGN0eHQtPmluZGVudF9zaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eHQtPmxldmVsICsgMSA+IGN0eHQtPmluZGVudF9uciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmluZGVudF9uciA6IGN0eHQtPmxldmVsICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmluZGVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+ZW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiljdHh0LT5lbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDUsICJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNCwgIlwiIC8+Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmZvcm1hdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGN1ci0+Y2hpbGRyZW47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0bXAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0bXAtPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG1wLT50eXBlID09IFhNTF9FTlRJVFlfUkVGX05PREUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5mb3JtYXR0ZWROb2RlID0gY3VyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDEpIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7CisgICAgICAgICAgICAgICAgaWYgKGN0eHQtPmxldmVsID49IDApIGN0eHQtPmxldmVsKys7CisgICAgICAgICAgICAgICAgY3VyID0gY3VyLT5jaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYTUxfVEVYVF9OT0RFOgorCSAgICBpZiAoY3VyLT5jb250ZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAJICAgIGlmICgoY3VyLT5uYW1lID09IHhtbFN0cmluZ1RleHQpIHx8CiAJCShjdXItPm5hbWUgIT0geG1sU3RyaW5nVGV4dE5vZW5jKSkgewogICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKGJ1ZiwgY3VyLT5jb250ZW50LCBjdHh0LT5lc2NhcGUpOwpAQCAtMTQ5MywyODYgKzE2MjcsMTE1IEBACiAJCSAqLwogCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopIGN1ci0+Y29udGVudCk7CiAJICAgIH0KLQl9CisJICAgIGJyZWFrOwogCi0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9QSV9OT0RFKSB7Ci0JaWYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjw/Iik7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotCSAgICBpZiAoY3VyLT5jb250ZW50ICE9IE5VTEwpIHsKLQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiICIpOwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKLQkgICAgfQotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICI/PiIpOwotCX0gZWxzZSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjw/Iik7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICI/PiIpOwotCX0KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0NPTU1FTlRfTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgewotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDQsICI8IS0tIik7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPmNvbnRlbnQpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICItLT4iKTsKLQl9Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9FTlRJVFlfUkVGX05PREUpIHsKLSAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiJiIpOwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI7Iik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9DREFUQV9TRUNUSU9OX05PREUpIHsKLQlpZiAoY3VyLT5jb250ZW50ID09IE5VTEwgfHwgKmN1ci0+Y29udGVudCA9PSAnXDAnKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMTIsICI8IVtDREFUQVtdXT4iKTsKLQl9IGVsc2UgewotCSAgICBzdGFydCA9IGVuZCA9IGN1ci0+Y29udGVudDsKLQkgICAgd2hpbGUgKCplbmQgIT0gJ1wwJykgewotCQlpZiAoKmVuZCA9PSAnXScgJiYgKihlbmQgKyAxKSA9PSAnXScgJiYgKihlbmQgKyAyKSA9PSAnPicpIHsKLQkJICAgIGVuZCA9IGVuZCArIDI7Ci0JCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDksICI8IVtDREFUQVsiKTsKLQkJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgZW5kIC0gc3RhcnQsIChjb25zdCBjaGFyICopc3RhcnQpOwotCQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7Ci0JCSAgICBzdGFydCA9IGVuZDsKLQkJfQotCQllbmQrKzsKLQkgICAgfQotCSAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0JCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopc3RhcnQpOwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICJdXT4iKTsKLQkgICAgfQotCX0KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSB7Ci0gICAgICAgIHhtbEF0dHJEdW1wT3V0cHV0KGN0eHQsICh4bWxBdHRyUHRyKSBjdXIpOwotCXJldHVybjsKLSAgICB9CisgICAgICAgIGNhc2UgWE1MX1BJX05PREU6CisgICAgICAgICAgICBpZiAoY3VyLT5jb250ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICI8PyIpOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICIgIik7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWN1ci0+Y29udGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIj8+Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjw/Iik7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAyLCAiPz4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgZm9ybWF0ID0gY3R4dC0+Zm9ybWF0OwotICAgIGlmIChmb3JtYXQgPT0gMSkgewotCXRtcCA9IGN1ci0+Y2hpbGRyZW47Ci0Jd2hpbGUgKHRtcCAhPSBOVUxMKSB7Ci0JICAgIGlmICgodG1wLT50eXBlID09IFhNTF9URVhUX05PREUpIHx8Ci0JCSh0bXAtPnR5cGUgPT0gWE1MX0VOVElUWV9SRUZfTk9ERSkpIHsKLQkJZm9ybWF0ID0gMDsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgdG1wID0gdG1wLT5uZXh0OwotCX0KLSAgICB9Ci0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiPCIpOwotICAgIGlmICgoY3VyLT5ucyAhPSBOVUxMKSAmJiAoY3VyLT5ucy0+cHJlZml4ICE9IE5VTEwpKSB7Ci0gICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5zLT5wcmVmaXgpOwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIjoiKTsKLSAgICB9CisgICAgICAgIGNhc2UgWE1MX0NPTU1FTlRfTk9ERToKKyAgICAgICAgICAgIGlmIChjdXItPmNvbnRlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNCwgIjwhLS0iKTsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5jb250ZW50KTsKKyAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICItLT4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0gICAgaWYgKGN1ci0+bnNEZWYpCi0gICAgICAgIHhtbE5zTGlzdER1bXBPdXRwdXRDdHh0KGN0eHQsIGN1ci0+bnNEZWYpOwotICAgIGlmICgoeG1sU3RyRXF1YWwoY3VyLT5uYW1lLCBCQURfQ0FTVCAiaHRtbCIpICYmCi0JKGN1ci0+bnMgPT0gTlVMTCkgJiYgKGN1ci0+bnNEZWYgPT0gTlVMTCkpKSB7Ci0JLyoKLQkgKiAzLjEuMS4gU3RyaWN0bHkgQ29uZm9ybWluZyBEb2N1bWVudHMgQS4zLjEuMSAzLwotCSAqLwotCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwKLQkJIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIiIpOwotICAgIH0KLSAgICBpZiAoY3VyLT5wcm9wZXJ0aWVzICE9IE5VTEwpCi0gICAgICAgIHhodG1sQXR0ckxpc3REdW1wT3V0cHV0KGN0eHQsIGN1ci0+cHJvcGVydGllcyk7CisgICAgICAgIGNhc2UgWE1MX0VOVElUWV9SRUZfTk9ERToKKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIiYiKTsKKyAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOyIpOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBpZiAoKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSAmJgotICAgICAgICAoY3VyLT5wYXJlbnQgIT0gTlVMTCkgJiYKLSAgICAgICAgKGN1ci0+cGFyZW50LT5wYXJlbnQgPT0gKHhtbE5vZGVQdHIpIGN1ci0+ZG9jKSAmJgotICAgICAgICB4bWxTdHJFcXVhbChjdXItPm5hbWUsIEJBRF9DQVNUImhlYWQiKSAmJgotICAgICAgICB4bWxTdHJFcXVhbChjdXItPnBhcmVudC0+bmFtZSwgQkFEX0NBU1QiaHRtbCIpKSB7Ci0KLSAgICAgICAgdG1wID0gY3VyLT5jaGlsZHJlbjsKLSAgICAgICAgd2hpbGUgKHRtcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoeG1sU3RyRXF1YWwodG1wLT5uYW1lLCBCQURfQ0FTVCJtZXRhIikpIHsKLSAgICAgICAgICAgICAgICB4bWxDaGFyICpodHRwZXF1aXY7Ci0KLSAgICAgICAgICAgICAgICBodHRwZXF1aXYgPSB4bWxHZXRQcm9wKHRtcCwgQkFEX0NBU1QiaHR0cC1lcXVpdiIpOwotICAgICAgICAgICAgICAgIGlmIChodHRwZXF1aXYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU3RyY2FzZWNtcChodHRwZXF1aXYsIEJBRF9DQVNUIkNvbnRlbnQtVHlwZSIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoaHR0cGVxdWl2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgICAgICBpZiAoY3VyLT5jb250ZW50ID09IE5VTEwgfHwgKmN1ci0+Y29udGVudCA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxMiwgIjwhW0NEQVRBW11dPiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCA9IGN1ci0+Y29udGVudDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKmVuZCAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqZW5kID09ICddJyAmJiAqKGVuZCArIDEpID09ICddJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKihlbmQgKyAyKSA9PSAnPicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZCArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDksICI8IVtDREFUQVsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKGh0dHBlcXVpdik7CisgICAgICAgICAgICAgICAgICAgIGVuZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICJdXT4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0bXAgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFhNTF9BVFRSSUJVVEVfTk9ERToKKyAgICAgICAgICAgIHhtbEF0dHJEdW1wT3V0cHV0KGN0eHQsICh4bWxBdHRyUHRyKSBjdXIpOworCSAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICAgICAgYWRkbWV0YSA9IDE7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gcm9vdCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoY3R4dC0+Zm9ybWF0ID09IDEpCisgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiXG4iKTsKKyAgICAgICAgICAgIGlmIChjdXItPm5leHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBwYXJlbnQgc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZSBidXQgd2Ugd2FudCB0byBoYW5kbGUKKyAgICAgICAgICAgICAqIGNvcnJ1cHRlZCBkb2N1bWVudHMgZ3JhY2VmdWxseS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGN1ci0+cGFyZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY3VyID0gY3VyLT5wYXJlbnQ7CisKKyAgICAgICAgICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgIGlmIChjdHh0LT5sZXZlbCA+IDApIGN0eHQtPmxldmVsLS07CisgICAgICAgICAgICAgICAgaWYgKCh4bWxJbmRlbnRUcmVlT3V0cHV0KSAmJiAoY3R4dC0+Zm9ybWF0ID09IDEpKQorICAgICAgICAgICAgICAgICAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGN0eHQtPmluZGVudF9zaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eHQtPmxldmVsID4gY3R4dC0+aW5kZW50X25yID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmluZGVudF9uciA6IGN0eHQtPmxldmVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+aW5kZW50KTsKKworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjwvIik7CisgICAgICAgICAgICAgICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5ucy0+cHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOworICAgICAgICAgICAgICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIj4iKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXIgPT0gdW5mb3JtYXR0ZWROb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eHQtPmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgdW5mb3JtYXR0ZWROb2RlID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSAmJiAoY3VyLT5jaGlsZHJlbiA9PSBOVUxMKSkgewotCWlmICgoKGN1ci0+bnMgPT0gTlVMTCkgfHwgKGN1ci0+bnMtPnByZWZpeCA9PSBOVUxMKSkgJiYKLQkgICAgKCh4aHRtbElzRW1wdHkoY3VyKSA9PSAxKSAmJiAoYWRkbWV0YSA9PSAwKSkpIHsKLQkgICAgLyoKLQkgICAgICogQy4yLiBFbXB0eSBFbGVtZW50cwotCSAgICAgKi8KLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiIC8+Iik7Ci0JfSBlbHNlIHsKLQkJaWYgKGFkZG1ldGEgPT0gMSkgewotCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiPiIpOwotCQkJaWYgKGN0eHQtPmZvcm1hdCA9PSAxKSB7Ci0JCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiXG4iKTsKLQkJCQlpZiAoeG1sSW5kZW50VHJlZU91dHB1dCkKLQkJCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBjdHh0LT5pbmRlbnRfc2l6ZSAqCi0JCQkJCShjdHh0LT5sZXZlbCArIDEgPiBjdHh0LT5pbmRlbnRfbnIgPwotCQkJCQljdHh0LT5pbmRlbnRfbnIgOiBjdHh0LT5sZXZlbCArIDEpLCBjdHh0LT5pbmRlbnQpOwotCQkJfQotCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLAotCQkJCSI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD0iKTsKLQkJCWlmIChjdHh0LT5lbmNvZGluZykgewotCQkJCXhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdHh0LT5lbmNvZGluZyk7Ci0JCQl9IGVsc2UgewotCQkJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNSwgIlVURi04Iik7Ci0JCQl9Ci0JCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDQsICJcIiAvPiIpOwotCQkJaWYgKGN0eHQtPmZvcm1hdCA9PSAxKQotCQkJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7Ci0JCX0KLQkgICAgLyoKLQkgICAgICogQy4zLiBFbGVtZW50IE1pbmltaXphdGlvbiBhbmQgRW1wdHkgRWxlbWVudCBDb250ZW50Ci0JICAgICAqLwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDIsICI8LyIpOwotCSAgICBpZiAoKGN1ci0+bnMgIT0gTlVMTCkgJiYgKGN1ci0+bnMtPnByZWZpeCAhPSBOVUxMKSkgewotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopY3VyLT5ucy0+cHJlZml4KTsKLQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOiIpOwotCSAgICB9Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICI+Iik7Ci0JfQotCXJldHVybjsKLSAgICB9Ci0gICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiPiIpOwotCWlmIChhZGRtZXRhID09IDEpIHsKLQkJaWYgKGN0eHQtPmZvcm1hdCA9PSAxKSB7Ci0JCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOwotCQkJaWYgKHhtbEluZGVudFRyZWVPdXRwdXQpCi0JCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBjdHh0LT5pbmRlbnRfc2l6ZSAqCi0JCQkJKGN0eHQtPmxldmVsICsgMSA+IGN0eHQtPmluZGVudF9uciA/Ci0JCQkJY3R4dC0+aW5kZW50X25yIDogY3R4dC0+bGV2ZWwgKyAxKSwgY3R4dC0+aW5kZW50KTsKLQkJfQotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsCi0JCQkiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9Iik7Ci0JCWlmIChjdHh0LT5lbmNvZGluZykgewotCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN0eHQtPmVuY29kaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNSwgIlVURi04Iik7Ci0JCX0KLQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCA0LCAiXCIgLz4iKTsKLQl9Ci0gICAgaWYgKChjdXItPnR5cGUgIT0gWE1MX0VMRU1FTlRfTk9ERSkgJiYgKGN1ci0+Y29udGVudCAhPSBOVUxMKSkgewotCXhtbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKGJ1ZiwgY3VyLT5jb250ZW50LCBjdHh0LT5lc2NhcGUpOwotICAgIH0KLQotI2lmIDAKLSAgICAvKgotICAgICogVGhpcyB3YXMgcmVtb3ZlZCBkdWUgdG8gcHJvYmxlbXMgd2l0aCBIVE1MIHByb2Nlc3NvcnMuCi0gICAgKiBTZWUgYnVnICMzNDUxNDcuCi0gICAgKi8KLSAgICAvKgotICAgICAqIDQuOC4gU2NyaXB0IGFuZCBTdHlsZSBlbGVtZW50cwotICAgICAqLwotICAgIGlmICgoY3VyLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmCi0JKCh4bWxTdHJFcXVhbChjdXItPm5hbWUsIEJBRF9DQVNUICJzY3JpcHQiKSkgfHwKLQkgKHhtbFN0ckVxdWFsKGN1ci0+bmFtZSwgQkFEX0NBU1QgInN0eWxlIikpKSAmJgotCSgoY3VyLT5ucyA9PSBOVUxMKSB8fAotCSAoeG1sU3RyRXF1YWwoY3VyLT5ucy0+aHJlZiwgWEhUTUxfTlNfTkFNRSkpKSkgewotCXhtbE5vZGVQdHIgY2hpbGQgPSBjdXItPmNoaWxkcmVuOwotCi0Jd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLQkgICAgaWYgKGNoaWxkLT50eXBlID09IFhNTF9URVhUX05PREUpIHsKLQkJaWYgKCh4bWxTdHJjaHIoY2hpbGQtPmNvbnRlbnQsICc8JykgPT0gTlVMTCkgJiYKLQkJICAgICh4bWxTdHJjaHIoY2hpbGQtPmNvbnRlbnQsICcmJykgPT0gTlVMTCkgJiYKLQkJICAgICh4bWxTdHJzdHIoY2hpbGQtPmNvbnRlbnQsIEJBRF9DQVNUICJdXT4iKSA9PSBOVUxMKSkgewotCQkgICAgLyogTm90aGluZyB0byBlc2NhcGUsIHNvIGp1c3Qgb3V0cHV0IGFzIGlzLi4uICovCi0JCSAgICAvKiBGSVhNRTogU2hvdWxkIHdlIGRvIHNvbWV0aGluZyBhYm91dCAiLS0iIGFsc28/ICovCi0JCSAgICBpbnQgbGV2ZWwgPSBjdHh0LT5sZXZlbDsKLQkJICAgIGludCBpbmRlbnQgPSBjdHh0LT5mb3JtYXQ7Ci0KLQkJICAgIGN0eHQtPmxldmVsID0gMDsKLQkJICAgIGN0eHQtPmZvcm1hdCA9IDA7Ci0JCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopIGNoaWxkLT5jb250ZW50KTsKLQkJICAgIC8qIChXZSBjYW5ub3QgdXNlIHhodG1sTm9kZUR1bXBPdXRwdXQoKSBoZXJlIGJlY2F1c2UKLQkJICAgICAqIHdlIHdpc2ggdG8gbGVhdmUgJz4nIHVuZXNjYXBlZCEpICovCi0JCSAgICBjdHh0LT5sZXZlbCA9IGxldmVsOwotCQkgICAgY3R4dC0+Zm9ybWF0ID0gaW5kZW50OwotCQl9IGVsc2UgewotCQkgICAgLyogV2UgbXVzdCB1c2UgYSBDREFUQSBzZWN0aW9uLiAgVW5mb3J0dW5hdGVseSwKLQkJICAgICAqIHRoaXMgd2lsbCBicmVhayBDU1MgYW5kIEphdmFTY3JpcHQgd2hlbiByZWFkIGJ5Ci0JCSAgICAgKiBhIGJyb3dzZXIgaW4gSFRNTDQtY29tcGxpYW50IG1vZGUuIDotKCAqLwotCQkgICAgc3RhcnQgPSBlbmQgPSBjaGlsZC0+Y29udGVudDsKLQkJICAgIHdoaWxlICgqZW5kICE9ICdcMCcpIHsKLQkJCWlmICgqZW5kID09ICddJyAmJgotCQkJICAgICooZW5kICsgMSkgPT0gJ10nICYmCi0JCQkgICAgKihlbmQgKyAyKSA9PSAnPicpIHsKLQkJCSAgICBlbmQgPSBlbmQgKyAyOwotCQkJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOwotCQkJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgZW5kIC0gc3RhcnQsCi0JCQkJCQkgKGNvbnN0IGNoYXIgKilzdGFydCk7Ci0JCQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7Ci0JCQkgICAgc3RhcnQgPSBlbmQ7Ci0JCQl9Ci0JCQllbmQrKzsKLQkJICAgIH0KLQkJICAgIGlmIChzdGFydCAhPSBlbmQpIHsKLQkJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOwotCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBlbmQgLSBzdGFydCwKLQkJCSAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopc3RhcnQpOwotCQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJaW50IGxldmVsID0gY3R4dC0+bGV2ZWw7Ci0JCWludCBpbmRlbnQgPSBjdHh0LT5mb3JtYXQ7Ci0KLQkJY3R4dC0+bGV2ZWwgPSAwOwotCQljdHh0LT5mb3JtYXQgPSAwOwotCQl4aHRtbE5vZGVEdW1wT3V0cHV0KGN0eHQsIGNoaWxkKTsKLQkJY3R4dC0+bGV2ZWwgPSBsZXZlbDsKLQkJY3R4dC0+Zm9ybWF0ID0gaW5kZW50OwotCSAgICB9Ci0JICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGN1ci0+Y2hpbGRyZW4gIT0gTlVMTCkgewotCWludCBpbmRlbnQgPSBjdHh0LT5mb3JtYXQ7Ci0KLQlpZiAoZm9ybWF0ID09IDEpIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7Ci0JaWYgKGN0eHQtPmxldmVsID49IDApIGN0eHQtPmxldmVsKys7Ci0JY3R4dC0+Zm9ybWF0ID0gZm9ybWF0OwotCXhodG1sTm9kZUxpc3REdW1wT3V0cHV0KGN0eHQsIGN1ci0+Y2hpbGRyZW4pOwotCWlmIChjdHh0LT5sZXZlbCA+IDApIGN0eHQtPmxldmVsLS07Ci0JY3R4dC0+Zm9ybWF0ID0gaW5kZW50OwotCWlmICgoeG1sSW5kZW50VHJlZU91dHB1dCkgJiYgKGZvcm1hdCA9PSAxKSkKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBjdHh0LT5pbmRlbnRfc2l6ZSAqCi0JICAgICAgICAgICAgICAgICAgICAgICAgIChjdHh0LT5sZXZlbCA+IGN0eHQtPmluZGVudF9uciA/Ci0JCQkJICBjdHh0LT5pbmRlbnRfbnIgOiBjdHh0LT5sZXZlbCksCi0JCQkJIGN0eHQtPmluZGVudCk7Ci0gICAgfQotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMiwgIjwvIik7Ci0gICAgaWYgKChjdXItPm5zICE9IE5VTEwpICYmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkpIHsKLSAgICAgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKWN1ci0+bnMtPnByZWZpeCk7Ci0JeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxLCAiOiIpOwotICAgIH0KLQotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKGJ1ZiwgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIj4iKTsKIH0KICNlbmRpZgogCkBAIC0xOTMyLDEyICsxODk1LDI1IEBACiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZSB3cml0dGVuIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IKICAqLwogbG9uZwoteG1sU2F2ZVRyZWUoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBub2RlKQoreG1sU2F2ZVRyZWUoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBjdXIpCiB7CiAgICAgbG9uZyByZXQgPSAwOwogCi0gICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChub2RlID09IE5VTEwpKSByZXR1cm4oLTEpOwotICAgIHhtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoY3R4dCwgbm9kZSk7CisgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChjdXIgPT0gTlVMTCkpIHJldHVybigtMSk7CisjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAorICAgIGlmIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfWEhUTUwpIHsKKyAgICAgICAgeGh0bWxOb2RlRHVtcE91dHB1dChjdHh0LCBjdXIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICB9CisgICAgaWYgKCgoY3VyLT50eXBlICE9IFhNTF9OQU1FU1BBQ0VfREVDTCkgJiYgKGN1ci0+ZG9jICE9IE5VTEwpICYmCisgICAgICAgICAoY3VyLT5kb2MtPnR5cGUgPT0gWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSkgJiYKKyAgICAgICAgICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9TQVZFX0FTX1hNTCkgPT0gMCkpIHx8CisgICAgICAgIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfQVNfSFRNTCkpIHsKKwlodG1sTm9kZUR1bXBPdXRwdXRJbnRlcm5hbChjdHh0LCBjdXIpOworCXJldHVybihyZXQpOworICAgIH0KKyNlbmRpZgorICAgIHhtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoY3R4dCwgY3VyKTsKICAgICByZXR1cm4ocmV0KTsKIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94bWxzdHJpbmcuYyBiL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveG1sc3RyaW5nLmMKaW5kZXggNzgwYzY0My4uNjJkMzA1MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94bWxzdHJpbmcuYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3htbHN0cmluZy5jCkBAIC0xMzAsMTYgKzEzMCwxOCBAQAogCiBpbnQKIHhtbFN0cmNtcChjb25zdCB4bWxDaGFyICpzdHIxLCBjb25zdCB4bWxDaGFyICpzdHIyKSB7Ci0gICAgcmVnaXN0ZXIgaW50IHRtcDsKLQogICAgIGlmIChzdHIxID09IHN0cjIpIHJldHVybigwKTsKICAgICBpZiAoc3RyMSA9PSBOVUxMKSByZXR1cm4oLTEpOwogICAgIGlmIChzdHIyID09IE5VTEwpIHJldHVybigxKTsKKyNpZmRlZiBGVVpaSU5HX0JVSUxEX01PREVfVU5TQUZFX0ZPUl9QUk9EVUNUSU9OCisgICAgcmV0dXJuKHN0cmNtcCgoY29uc3QgY2hhciAqKXN0cjEsIChjb25zdCBjaGFyICopc3RyMikpOworI2Vsc2UKICAgICBkbyB7Ci0gICAgICAgIHRtcCA9ICpzdHIxKysgLSAqc3RyMjsKKyAgICAgICAgaW50IHRtcCA9ICpzdHIxKysgLSAqc3RyMjsKICAgICAgICAgaWYgKHRtcCAhPSAwKSByZXR1cm4odG1wKTsKICAgICB9IHdoaWxlICgqc3RyMisrICE9IDApOwogICAgIHJldHVybiAwOworI2VuZGlmCiB9CiAKIC8qKgpAQCAtMTU4LDEwICsxNjAsMTQgQEAKICAgICBpZiAoc3RyMSA9PSBzdHIyKSByZXR1cm4oMSk7CiAgICAgaWYgKHN0cjEgPT0gTlVMTCkgcmV0dXJuKDApOwogICAgIGlmIChzdHIyID09IE5VTEwpIHJldHVybigwKTsKKyNpZmRlZiBGVVpaSU5HX0JVSUxEX01PREVfVU5TQUZFX0ZPUl9QUk9EVUNUSU9OCisgICAgcmV0dXJuKHN0cmNtcCgoY29uc3QgY2hhciAqKXN0cjEsIChjb25zdCBjaGFyICopc3RyMikgPT0gMCk7CisjZWxzZQogICAgIGRvIHsKICAgICAgICAgaWYgKCpzdHIxKysgIT0gKnN0cjIpIHJldHVybigwKTsKICAgICB9IHdoaWxlICgqc3RyMisrKTsKICAgICByZXR1cm4oMSk7CisjZW5kaWYKIH0KIAogLyoqCkBAIC0yMDQsMTggKzIxMCwxNSBAQAogCiBpbnQKIHhtbFN0cm5jbXAoY29uc3QgeG1sQ2hhciAqc3RyMSwgY29uc3QgeG1sQ2hhciAqc3RyMiwgaW50IGxlbikgewotICAgIHJlZ2lzdGVyIGludCB0bXA7Ci0KICAgICBpZiAobGVuIDw9IDApIHJldHVybigwKTsKICAgICBpZiAoc3RyMSA9PSBzdHIyKSByZXR1cm4oMCk7CiAgICAgaWYgKHN0cjEgPT0gTlVMTCkgcmV0dXJuKC0xKTsKICAgICBpZiAoc3RyMiA9PSBOVUxMKSByZXR1cm4oMSk7Ci0jaWZkZWYgX19HTlVDX18KLSAgICB0bXAgPSBzdHJuY21wKChjb25zdCBjaGFyICopc3RyMSwgKGNvbnN0IGNoYXIgKilzdHIyLCBsZW4pOwotICAgIHJldHVybiB0bXA7CisjaWZkZWYgRlVaWklOR19CVUlMRF9NT0RFX1VOU0FGRV9GT1JfUFJPRFVDVElPTgorICAgIHJldHVybihzdHJuY21wKChjb25zdCBjaGFyICopc3RyMSwgKGNvbnN0IGNoYXIgKilzdHIyLCBsZW4pKTsKICNlbHNlCiAgICAgZG8gewotICAgICAgICB0bXAgPSAqc3RyMSsrIC0gKnN0cjI7CisgICAgICAgIGludCB0bXAgPSAqc3RyMSsrIC0gKnN0cjI7CiAgICAgICAgIGlmICh0bXAgIT0gMCB8fCAtLWxlbiA9PSAwKSByZXR1cm4odG1wKTsKICAgICB9IHdoaWxlICgqc3RyMisrICE9IDApOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94cGF0aC5jIGIvdGhpcmRfcGFydHkvbGlieG1sL3NyYy94cGF0aC5jCmluZGV4IDllYzUzM2QuLmRkYmMzNWQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC9zcmMveHBhdGguYworKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvc3JjL3hwYXRoLmMKQEAgLTEzOCw2ICsxMzgsMTcgQEAKICNkZWZpbmUgWFBBVEhfTUFYX05PREVTRVRfTEVOR1RIIDEwMDAwMDAwCiAKIC8qCisgKiBYUEFUSF9NQVhfUkVDUlVTSU9OX0RFUFRIOgorICogTWF4aW11bSBhbW91bnQgb2YgbmVzdGVkIGZ1bmN0aW9ucyBjYWxscyB3aGVuIHBhcnNpbmcgb3IgZXZhbHVhdGluZworICogZXhwcmVzc2lvbnMKKyAqLworI2lmZGVmIEZVWlpJTkdfQlVJTERfTU9ERV9VTlNBRkVfRk9SX1BST0RVQ1RJT04KKyNkZWZpbmUgWFBBVEhfTUFYX1JFQ1VSU0lPTl9ERVBUSCA1MDAKKyNlbHNlCisjZGVmaW5lIFhQQVRIX01BWF9SRUNVUlNJT05fREVQVEggNTAwMAorI2VuZGlmCisKKy8qCiAgKiBUT0RPOgogICogVGhlcmUgYXJlIGEgZmV3IHNwb3RzIHdoZXJlIHNvbWUgdGVzdHMgYXJlIGRvbmUgd2hpY2ggZGVwZW5kIHVwb24gYXNjaWkKICAqIGRhdGEuICBUaGVzZSBzaG91bGQgYmUgZW5oYW5jZWQgZm9yIGZ1bGwgVVRGOCBzdXBwb3J0IChzZWUgcGFydGljdWxhcmx5CkBAIC00NzksMTQgKzQ5MCw2IEBACiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgSU5GSU5JVFkKLSNkZWZpbmUgSU5GSU5JVFkgKERCTF9NQVggKiBEQkxfTUFYKQotI2VuZGlmCi0KLSNpZm5kZWYgTkFOCi0jZGVmaW5lIE5BTiAoSU5GSU5JVFkgLyBJTkZJTklUWSkKLSNlbmRpZgotCiBkb3VibGUgeG1sWFBhdGhOQU47CiBkb3VibGUgeG1sWFBhdGhQSU5GOwogZG91YmxlIHhtbFhQYXRoTklORjsKQEAgLTQ5NiwxMSArNDk5LDE0IEBACiAgKgogICogSW5pdGlhbGl6ZSB0aGUgWFBhdGggZW52aXJvbm1lbnQKICAqLworQVRUUklCVVRFX05PX1NBTklUSVpFKCJmbG9hdC1kaXZpZGUtYnktemVybyIpCiB2b2lkCiB4bWxYUGF0aEluaXQodm9pZCkgewotICAgIHhtbFhQYXRoTkFOID0gTkFOOwotICAgIHhtbFhQYXRoUElORiA9IElORklOSVRZOwotICAgIHhtbFhQYXRoTklORiA9IC1JTkZJTklUWTsKKyAgICAvKiBNU1ZDIGRvZXNuJ3QgYWxsb3cgZGl2aXNpb24gYnkgemVybyBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gKi8KKyAgICBkb3VibGUgemVybyA9IDAuMDsKKyAgICB4bWxYUGF0aE5BTiA9IDAuMCAvIHplcm87CisgICAgeG1sWFBhdGhQSU5GID0gMS4wIC8gemVybzsKKyAgICB4bWxYUGF0aE5JTkYgPSAteG1sWFBhdGhQSU5GOwogfQogCiAvKioKQEAgLTUyOSw5ICs1MzUsOSBAQAogI2lmZGVmIGlzaW5mCiAgICAgcmV0dXJuIGlzaW5mKHZhbCkgPyAodmFsID4gMCA/IDEgOiAtMSkgOiAwOwogI2Vsc2UKLSAgICBpZiAodmFsID49IElORklOSVRZKQorICAgIGlmICh2YWwgPj0geG1sWFBhdGhQSU5GKQogICAgICAgICByZXR1cm4gMTsKLSAgICBpZiAodmFsIDw9IC1JTkZJTklUWSkKKyAgICBpZiAodmFsIDw9IC14bWxYUGF0aFBJTkYpCiAgICAgICAgIHJldHVybiAtMTsKICAgICByZXR1cm4gMDsKICNlbmRpZgpAQCAtMTc0OCw3ICsxNzU0LDYgQEAKIHN0YXRpYyBpbnQgeG1sWFBhdGhEZWJ1Z09iak1heFhTTFRUcmVlID0gMDsKIHN0YXRpYyBpbnQgeG1sWFBhdGhEZWJ1Z09iak1heEFsbCA9IDA7CiAKLS8qIFJFVklTSVQgVE9ETzogTWFrZSB0aGlzIHN0YXRpYyB3aGVuIGNvbW1pdHRpbmcgKi8KIHN0YXRpYyB2b2lkCiB4bWxYUGF0aERlYnVnT2JqVXNhZ2VSZXNldCh4bWxYUGF0aENvbnRleHRQdHIgY3R4dCkKIHsKQEAgLTIwNjMsNyArMjA2OCw2IEBACiAgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJBbGwtLTsKIH0KIAotLyogUkVWSVNJVCBUT0RPOiBNYWtlIHRoaXMgc3RhdGljIHdoZW4gY29tbWl0dGluZyAqLwogc3RhdGljIHZvaWQKIHhtbFhQYXRoRGVidWdPYmpVc2FnZURpc3BsYXkoeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQpCiB7CkBAIC01ODY2LDEwICs1ODcwLDEwIEBACiAgICAgZG91YmxlIHJldDsKIAogICAgIGlmIChub2RlID09IE5VTEwpCi0JcmV0dXJuKE5BTik7CisJcmV0dXJuKHhtbFhQYXRoTkFOKTsKICAgICBzdHJ2YWwgPSB4bWxYUGF0aENhc3ROb2RlVG9TdHJpbmcobm9kZSk7CiAgICAgaWYgKHN0cnZhbCA9PSBOVUxMKQotCXJldHVybihOQU4pOworCXJldHVybih4bWxYUGF0aE5BTik7CiAgICAgcmV0ID0geG1sWFBhdGhDYXN0U3RyaW5nVG9OdW1iZXIoc3RydmFsKTsKICAgICB4bWxGcmVlKHN0cnZhbCk7CiAKQEAgLTU4OTAsNyArNTg5NCw3IEBACiAgICAgZG91YmxlIHJldDsKIAogICAgIGlmIChucyA9PSBOVUxMKQotCXJldHVybihOQU4pOworCXJldHVybih4bWxYUGF0aE5BTik7CiAgICAgc3RyID0geG1sWFBhdGhDYXN0Tm9kZVNldFRvU3RyaW5nKG5zKTsKICAgICByZXQgPSB4bWxYUGF0aENhc3RTdHJpbmdUb051bWJlcihzdHIpOwogICAgIHhtbEZyZWUoc3RyKTsKQEAgLTU5MTAsMTMgKzU5MTQsMTMgQEAKICAgICBkb3VibGUgcmV0ID0gMC4wOwogCiAgICAgaWYgKHZhbCA9PSBOVUxMKQotCXJldHVybihOQU4pOworCXJldHVybih4bWxYUGF0aE5BTik7CiAgICAgc3dpdGNoICh2YWwtPnR5cGUpIHsKICAgICBjYXNlIFhQQVRIX1VOREVGSU5FRDoKICNpZmRlZiBERUJVR19FWFBSCiAJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJOVU1CRVI6IHVuZGVmaW5lZFxuIik7CiAjZW5kaWYKLQlyZXQgPSBOQU47CisJcmV0ID0geG1sWFBhdGhOQU47CiAJYnJlYWs7CiAgICAgY2FzZSBYUEFUSF9OT0RFU0VUOgogICAgIGNhc2UgWFBBVEhfWFNMVF9UUkVFOgpAQCAtNTkzNiw3ICs1OTQwLDcgQEAKICAgICBjYXNlIFhQQVRIX1JBTkdFOgogICAgIGNhc2UgWFBBVEhfTE9DQVRJT05TRVQ6CiAJVE9ETzsKLQlyZXQgPSBOQU47CisJcmV0ID0geG1sWFBhdGhOQU47CiAJYnJlYWs7CiAgICAgfQogICAgIHJldHVybihyZXQpOwpAQCAtNjEyMiw5ICs2MTI2LDYgQEAKICAgICByZXQtPmNvbnRleHRTaXplID0gLTE7CiAgICAgcmV0LT5wcm94aW1pdHlQb3NpdGlvbiA9IC0xOwogCi0gICAgcmV0LT5tYXhEZXB0aCA9IElOVF9NQVg7Ci0gICAgcmV0LT5tYXhQYXJzZXJEZXB0aCA9IElOVF9NQVg7Ci0KICNpZmRlZiBYUF9ERUZBVUxUX0NBQ0hFX09OCiAgICAgaWYgKHhtbFhQYXRoQ29udGV4dFNldENhY2hlKHJldCwgMSwgLTEsIDApID09IC0xKSB7CiAJeG1sWFBhdGhGcmVlQ29udGV4dChyZXQpOwpAQCAtNzU2Niw3ICs3NTY3LDcgQEAKICAgICBDSEVDS19UWVBFKFhQQVRIX05VTUJFUik7CiAgICAgYXJnMSA9IGN0eHQtPnZhbHVlLT5mbG9hdHZhbDsKICAgICBpZiAoYXJnMiA9PSAwKQotCWN0eHQtPnZhbHVlLT5mbG9hdHZhbCA9IE5BTjsKKwljdHh0LT52YWx1ZS0+ZmxvYXR2YWwgPSB4bWxYUGF0aE5BTjsKICAgICBlbHNlIHsKIAljdHh0LT52YWx1ZS0+ZmxvYXR2YWwgPSBmbW9kKGFyZzEsIGFyZzIpOwogICAgIH0KQEAgLTk5OTYsNyArOTk5Nyw3IEBACiAgICAgaWYgKGN1ciA9PSBOVUxMKSByZXR1cm4oMCk7CiAgICAgd2hpbGUgKElTX0JMQU5LX0NIKCpjdXIpKSBjdXIrKzsKICAgICBpZiAoKCpjdXIgIT0gJy4nKSAmJiAoKCpjdXIgPCAnMCcpIHx8ICgqY3VyID4gJzknKSkgJiYgKCpjdXIgIT0gJy0nKSkgewotICAgICAgICByZXR1cm4oTkFOKTsKKyAgICAgICAgcmV0dXJuKHhtbFhQYXRoTkFOKTsKICAgICB9CiAgICAgaWYgKCpjdXIgPT0gJy0nKSB7CiAJaXNuZWcgPSAxOwpAQCAtMTAwMzIsNyArMTAwMzMsNyBAQAogCiAgICAgICAgIGN1cisrOwogCWlmICgoKCpjdXIgPCAnMCcpIHx8ICgqY3VyID4gJzknKSkgJiYgKCFvaykpIHsKLQkgICAgcmV0dXJuKE5BTik7CisJICAgIHJldHVybih4bWxYUGF0aE5BTik7CiAJfQogICAgICAgICB3aGlsZSAoKmN1ciA9PSAnMCcpIHsKIAkgICAgZnJhYyA9IGZyYWMgKyAxOwpAQCAtMTAwNjUsNyArMTAwNjYsNyBAQAogICAgICAgfQogICAgIH0KICAgICB3aGlsZSAoSVNfQkxBTktfQ0goKmN1cikpIGN1cisrOwotICAgIGlmICgqY3VyICE9IDApIHJldHVybihOQU4pOworICAgIGlmICgqY3VyICE9IDApIHJldHVybih4bWxYUGF0aE5BTik7CiAgICAgaWYgKGlzbmVnKSByZXQgPSAtcmV0OwogICAgIGlmIChpc19leHBvbmVudF9uZWdhdGl2ZSkgZXhwb25lbnQgPSAtZXhwb25lbnQ7CiAgICAgcmV0ICo9IHBvdygxMC4wLCAoZG91YmxlKWV4cG9uZW50KTsKQEAgLTEwOTUyLDkgKzEwOTUzLDEzIEBACiAgICAgeG1sWFBhdGhDb250ZXh0UHRyIHhwY3R4dCA9IGN0eHQtPmNvbnRleHQ7CiAKICAgICBpZiAoeHBjdHh0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHhwY3R4dC0+ZGVwdGggPj0geHBjdHh0LT5tYXhQYXJzZXJEZXB0aCkKKyAgICAgICAgaWYgKHhwY3R4dC0+ZGVwdGggPj0gWFBBVEhfTUFYX1JFQ1VSU0lPTl9ERVBUSCkKICAgICAgICAgICAgIFhQX0VSUk9SKFhQQVRIX1JFQ1VSU0lPTl9MSU1JVF9FWENFRURFRCk7Ci0gICAgICAgIHhwY3R4dC0+ZGVwdGggKz0gMTsKKyAgICAgICAgLyoKKyAgICAgICAgICogUGFyc2luZyBhIHNpbmdsZSAnKCcgcHVzaGVzIGFib3V0IDEwIGZ1bmN0aW9ucyBvbiB0aGUgY2FsbCBzdGFjaworICAgICAgICAgKiBiZWZvcmUgcmVjdXJzaW5nIQorICAgICAgICAgKi8KKyAgICAgICAgeHBjdHh0LT5kZXB0aCArPSAxMDsKICAgICB9CiAKICAgICB4bWxYUGF0aENvbXBBbmRFeHByKGN0eHQpOwpAQCAtMTA5ODAsNyArMTA5ODUsNyBAQAogICAgIH0KIAogICAgIGlmICh4cGN0eHQgIT0gTlVMTCkKLSAgICAgICAgeHBjdHh0LT5kZXB0aCAtPSAxOworICAgICAgICB4cGN0eHQtPmRlcHRoIC09IDEwOwogfQogCiAvKioKQEAgLTExNjY5LDExICsxMTY3NCwxMSBAQAogICAgICAgICByZXMgPSB4bWxYUGF0aENvbXBPcEV2YWxUb0Jvb2xlYW4oY3R4dCwgZmlsdGVyT3AsIDEpOwogCiAgICAgICAgIGlmIChjdHh0LT5lcnJvciAhPSBYUEFUSF9FWFBSRVNTSU9OX09LKQotICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuICovCiAgICAgICAgICAgICB4bWxYUGF0aEVycihjdHh0LCBYUEFUSF9FWFBSX0VSUk9SKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKChyZXMgIT0gMCkgJiYgKChwb3MgPj0gbWluUG9zKSAmJiAocG9zIDw9IG1heFBvcykpKSB7CkBAIC0xMTY5MiwxNSArMTE2OTcsNyBAQAogCiAgICAgICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgICAgICAgaWYgKHBvcyA9PSBtYXhQb3MpIHsKLSAgICAgICAgICAgICAgICAvKiBDbGVhciByZW1haW5pbmcgbm9kZXMgYW5kIGV4aXQgbG9vcC4gKi8KLSAgICAgICAgICAgICAgICBpZiAoaGFzTnNOb2RlcykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkrKzsgaSA8IHNldC0+bm9kZU5yOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZXQtPm5vZGVUYWJbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5vZGUgIT0gTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9kZS0+dHlwZSA9PSBYTUxfTkFNRVNQQUNFX0RFQ0wpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFhQYXRoTm9kZVNldEZyZWVOcygoeG1sTnNQdHIpIG5vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTE3MDgsNiArMTE3MDUsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIEZyZWUgcmVtYWluaW5nIG5vZGVzLiAqLworICAgIGlmIChoYXNOc05vZGVzKSB7CisgICAgICAgIGZvciAoOyBpIDwgc2V0LT5ub2RlTnI7IGkrKykgeworICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlID0gc2V0LT5ub2RlVGFiW2ldOworICAgICAgICAgICAgaWYgKChub2RlICE9IE5VTEwpICYmIChub2RlLT50eXBlID09IFhNTF9OQU1FU1BBQ0VfREVDTCkpCisgICAgICAgICAgICAgICAgeG1sWFBhdGhOb2RlU2V0RnJlZU5zKCh4bWxOc1B0cikgbm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBzZXQtPm5vZGVOciA9IGo7CiAKICAgICAvKiBJZiB0b28gbWFueSBlbGVtZW50cyB3ZXJlIHJlbW92ZWQsIHNocmluayB0YWJsZSB0byBwcmVzZXJ2ZSBtZW1vcnkuICovCkBAIC0xMTcyOCw3ICsxMTczNCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLWV4aXQ6CiAgICAgeHBjdHh0LT5ub2RlID0gb2xkbm9kZTsKICAgICB4cGN0eHQtPmRvYyA9IG9sZGRvYzsKICAgICB4cGN0eHQtPmNvbnRleHRTaXplID0gb2xkY3M7CkBAIC0xMTc5MywxMSArMTE3OTgsMTEgQEAKICAgICAgICAgcmVzID0geG1sWFBhdGhDb21wT3BFdmFsVG9Cb29sZWFuKGN0eHQsIGZpbHRlck9wLCAxKTsKIAogICAgICAgICBpZiAoY3R4dC0+ZXJyb3IgIT0gWFBBVEhfRVhQUkVTU0lPTl9PSykKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbiAqLwogICAgICAgICAgICAgeG1sWFBhdGhFcnIoY3R4dCwgWFBBVEhfRVhQUl9FUlJPUik7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgocmVzICE9IDApICYmICgocG9zID49IG1pblBvcykgJiYgKHBvcyA8PSBtYXhQb3MpKSkgewpAQCAtMTE4MTUsMTAgKzExODIwLDcgQEAKIAogICAgICAgICBpZiAocmVzICE9IDApIHsKICAgICAgICAgICAgIGlmIChwb3MgPT0gbWF4UG9zKSB7Ci0gICAgICAgICAgICAgICAgLyogQ2xlYXIgcmVtYWluaW5nIG5vZGVzIGFuZCBleGl0IGxvb3AuICovCi0gICAgICAgICAgICAgICAgZm9yIChpKys7IGkgPCBsb2NzZXQtPmxvY05yOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sWFBhdGhGcmVlT2JqZWN0KGxvY3NldC0+bG9jVGFiW2ldKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMTgyNiw2ICsxMTgyOCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogRnJlZSByZW1haW5pbmcgbm9kZXMuICovCisgICAgZm9yICg7IGkgPCBsb2NzZXQtPmxvY05yOyBpKyspCisgICAgICAgIHhtbFhQYXRoRnJlZU9iamVjdChsb2NzZXQtPmxvY1RhYltpXSk7CisKICAgICBsb2NzZXQtPmxvY05yID0gajsKIAogICAgIC8qIElmIHRvbyBtYW55IGVsZW1lbnRzIHdlcmUgcmVtb3ZlZCwgc2hyaW5rIHRhYmxlIHRvIHByZXNlcnZlIG1lbW9yeS4gKi8KQEAgLTExODQ2LDcgKzExODUyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotZXhpdDoKICAgICB4cGN0eHQtPm5vZGUgPSBvbGRub2RlOwogICAgIHhwY3R4dC0+ZG9jID0gb2xkZG9jOwogICAgIHhwY3R4dC0+Y29udGV4dFNpemUgPSBvbGRjczsKQEAgLTExODg0LDcgKzExODg5LDcgQEAKICAgICAgICAgICAgICAgICAieG1sWFBhdGhDb21wT3BFdmFsUHJlZGljYXRlOiBFeHBlY3RlZCBhIHByZWRpY2F0ZVxuIik7CiAgICAgICAgICAgICBYUF9FUlJPUihYUEFUSF9JTlZBTElEX09QRVJBTkQpOwogCX0KLSAgICAgICAgaWYgKGN0eHQtPmNvbnRleHQtPmRlcHRoID49IGN0eHQtPmNvbnRleHQtPm1heERlcHRoKQorICAgICAgICBpZiAoY3R4dC0+Y29udGV4dC0+ZGVwdGggPj0gWFBBVEhfTUFYX1JFQ1VSU0lPTl9ERVBUSCkKICAgICAgICAgICAgIFhQX0VSUk9SKFhQQVRIX1JFQ1VSU0lPTl9MSU1JVF9FWENFRURFRCk7CiAgICAgICAgIGN0eHQtPmNvbnRleHQtPmRlcHRoICs9IDE7CiAJeG1sWFBhdGhDb21wT3BFdmFsUHJlZGljYXRlKGN0eHQsICZjb21wLT5zdGVwc1tvcC0+Y2gxXSwgc2V0LApAQCAtMTI2MDAsNyArMTI2MDUsNyBAQAogICAgIENIRUNLX0VSUk9SMDsKICAgICBpZiAoT1BfTElNSVRfRVhDRUVERUQoY3R4dCwgMSkpCiAgICAgICAgIHJldHVybigwKTsKLSAgICBpZiAoY3R4dC0+Y29udGV4dC0+ZGVwdGggPj0gY3R4dC0+Y29udGV4dC0+bWF4RGVwdGgpCisgICAgaWYgKGN0eHQtPmNvbnRleHQtPmRlcHRoID49IFhQQVRIX01BWF9SRUNVUlNJT05fREVQVEgpCiAgICAgICAgIFhQX0VSUk9SMChYUEFUSF9SRUNVUlNJT05fTElNSVRfRVhDRUVERUQpOwogICAgIGN0eHQtPmNvbnRleHQtPmRlcHRoICs9IDE7CiAgICAgY29tcCA9IGN0eHQtPmNvbXA7CkBAIC0xMjc0MSw3ICsxMjc0Niw3IEBACiAgICAgQ0hFQ0tfRVJST1IwOwogICAgIGlmIChPUF9MSU1JVF9FWENFRURFRChjdHh0LCAxKSkKICAgICAgICAgcmV0dXJuKDApOwotICAgIGlmIChjdHh0LT5jb250ZXh0LT5kZXB0aCA+PSBjdHh0LT5jb250ZXh0LT5tYXhEZXB0aCkKKyAgICBpZiAoY3R4dC0+Y29udGV4dC0+ZGVwdGggPj0gWFBBVEhfTUFYX1JFQ1VSU0lPTl9ERVBUSCkKICAgICAgICAgWFBfRVJST1IwKFhQQVRIX1JFQ1VSU0lPTl9MSU1JVF9FWENFRURFRCk7CiAgICAgY3R4dC0+Y29udGV4dC0+ZGVwdGggKz0gMTsKICAgICBjb21wID0gY3R4dC0+Y29tcDsKQEAgLTEyOTU5LDcgKzEyOTY0LDcgQEAKICAgICBDSEVDS19FUlJPUjA7CiAgICAgaWYgKE9QX0xJTUlUX0VYQ0VFREVEKGN0eHQsIDEpKQogICAgICAgICByZXR1cm4oMCk7Ci0gICAgaWYgKGN0eHQtPmNvbnRleHQtPmRlcHRoID49IGN0eHQtPmNvbnRleHQtPm1heERlcHRoKQorICAgIGlmIChjdHh0LT5jb250ZXh0LT5kZXB0aCA+PSBYUEFUSF9NQVhfUkVDVVJTSU9OX0RFUFRIKQogICAgICAgICBYUF9FUlJPUjAoWFBBVEhfUkVDVVJTSU9OX0xJTUlUX0VYQ0VFREVEKTsKICAgICBjdHh0LT5jb250ZXh0LT5kZXB0aCArPSAxOwogICAgIGNvbXAgPSBjdHh0LT5jb21wOwpAQCAtMTM4MzUsNyArMTM4NDAsOCBAQAogCWRvIHsKIAkgICAgY3VyID0gY3VyLT5wYXJlbnQ7CiAJICAgIGRlcHRoLS07Ci0JICAgIGlmICgoY3VyID09IE5VTEwpIHx8IChjdXIgPT0gbGltaXQpKQorCSAgICBpZiAoKGN1ciA9PSBOVUxMKSB8fCAoY3VyID09IGxpbWl0KSB8fAorICAgICAgICAgICAgICAgIChjdXItPnR5cGUgPT0gWE1MX0RPQ1VNRU5UX05PREUpKQogCSAgICAgICAgZ290byBkb25lOwogCSAgICBpZiAoY3VyLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHsKIAkJcmV0ID0geG1sU3RyZWFtUG9wKHBhdHN0cmVhbSk7CkBAIC0xNDEwNiw4ICsxNDExMiw3IEBACiAJICAgIH0KIAl9CiAKLQlzdHJlYW0gPSB4bWxQYXR0ZXJuY29tcGlsZShzdHIsIGRpY3QsIFhNTF9QQVRURVJOX1hQQVRILAotCQkJJm5hbWVzcGFjZXNbMF0pOworCXN0cmVhbSA9IHhtbFBhdHRlcm5jb21waWxlKHN0ciwgZGljdCwgWE1MX1BBVFRFUk5fWFBBVEgsIG5hbWVzcGFjZXMpOwogCWlmIChuYW1lc3BhY2VzICE9IE5VTEwpIHsKIAkgICAgeG1sRnJlZSgoeG1sQ2hhciAqKiluYW1lc3BhY2VzKTsKIAl9CkBAIC0xNDE5Myw3ICsxNDE5OCw3IEBACiAgICAgLyogUmVjdXJzZSAqLwogICAgIGN0eHQgPSBwY3R4dC0+Y29udGV4dDsKICAgICBpZiAoY3R4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChjdHh0LT5kZXB0aCA+PSBjdHh0LT5tYXhEZXB0aCkKKyAgICAgICAgaWYgKGN0eHQtPmRlcHRoID49IFhQQVRIX01BWF9SRUNVUlNJT05fREVQVEgpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGN0eHQtPmRlcHRoICs9IDE7CiAgICAgfQpAQCAtMTQyMjYsNyArMTQyMzEsNyBAQAogICAgICAgICByZXR1cm4oY29tcCk7CiAjZW5kaWYKIAotICAgIHhtbFhQYXRoSW5pdCgpOworICAgIHhtbEluaXRQYXJzZXIoKTsKIAogICAgIHBjdHh0ID0geG1sWFBhdGhOZXdQYXJzZXJDb250ZXh0KHN0ciwgY3R4dCk7CiAgICAgaWYgKHBjdHh0ID09IE5VTEwpCkBAIC0xNDMxNSw3ICsxNDMyMCw3IEBACiAKICAgICBpZiAoY29tcCA9PSBOVUxMKQogCXJldHVybigtMSk7Ci0gICAgeG1sWFBhdGhJbml0KCk7CisgICAgeG1sSW5pdFBhcnNlcigpOwogCiAjaWZuZGVmIExJQlhNTF9USFJFQURfRU5BQkxFRAogICAgIHJlZW50YW5jZSsrOwpAQCAtMTQ0NjAsNyArMTQ0NjUsNyBAQAogCiAgICAgQ0hFQ0tfQ1RYVChjdHgpCiAKLSAgICB4bWxYUGF0aEluaXQoKTsKKyAgICB4bWxJbml0UGFyc2VyKCk7CiAKICAgICBjdHh0ID0geG1sWFBhdGhOZXdQYXJzZXJDb250ZXh0KHN0ciwgY3R4KTsKICAgICBpZiAoY3R4dCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlieG1sL3dpbjMyL2NvbmZpZy5oIGIvdGhpcmRfcGFydHkvbGlieG1sL3dpbjMyL2NvbmZpZy5oCmluZGV4IDMyNGI3NGYuLjU0MzkyZjQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnhtbC93aW4zMi9jb25maWcuaAorKysgYi90aGlyZF9wYXJ0eS9saWJ4bWwvd2luMzIvY29uZmlnLmgKQEAgLTUsNyArNSw4IEBACiAjZGVmaW5lIEhBVkVfU1REQVJHX0gKICNkZWZpbmUgSEFWRV9NQUxMT0NfSAogI2RlZmluZSBIQVZFX0VSUk5PX0gKLSNkZWZpbmUgSEFWRV9TVERJTlRfSAorI2RlZmluZSBTRU5EX0FSRzJfQ0FTVAorI2RlZmluZSBHRVRIT1NUQllOQU1FX0FSR19DQVNUCiAKICNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCiAjdW5kZWYgSEFWRV9FUlJOT19ICkBAIC05MCw3ICs5MSw3IEBACiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQogI2RlZmluZSBta2RpcihwLG0pIF9ta2RpcihwKQotI2lmIF9NU0NfVkVSIDwgMTkwMCAvLyBDYW5ub3QgZGVmaW5lIHRoaXMgaW4gVlMgMjAxNSBhbmQgYWJvdmUhCisjaWYgX01TQ19WRVIgPCAxOTAwCiAjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgogI2VuZGlmCiAjaWYgX01TQ19WRVIgPCAxNTAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ4bWwvd2luMzIvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oIGIvdGhpcmRfcGFydHkvbGlieG1sL3dpbjMyL2luY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaAppbmRleCAyOGVjZjA4Li4zMTU5M2VkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ4bWwvd2luMzIvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYnhtbC93aW4zMi9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmgKQEAgLTI5LDIxICsyOSwyMSBAQAogICoKICAqIHRoZSB2ZXJzaW9uIHN0cmluZyBsaWtlICIxLjIuMyIKICAqLwotI2RlZmluZSBMSUJYTUxfRE9UVEVEX1ZFUlNJT04gIjIuOS4xMCIKKyNkZWZpbmUgTElCWE1MX0RPVFRFRF9WRVJTSU9OICIyLjkuMTIiCiAKIC8qKgogICogTElCWE1MX1ZFUlNJT046CiAgKgogICogdGhlIHZlcnNpb24gbnVtYmVyOiAxLjIuMyB2YWx1ZSBpcyAxMDIwMwogICovCi0jZGVmaW5lIExJQlhNTF9WRVJTSU9OIDIwOTEwCisjZGVmaW5lIExJQlhNTF9WRVJTSU9OIDIwOTEyCiAKIC8qKgogICogTElCWE1MX1ZFUlNJT05fU1RSSU5HOgogICoKICAqIHRoZSB2ZXJzaW9uIG51bWJlciBzdHJpbmcsIDEuMi4zIHZhbHVlIGlzICIxMDIwMyIKICAqLwotI2RlZmluZSBMSUJYTUxfVkVSU0lPTl9TVFJJTkcgIjIwOTEwIgorI2RlZmluZSBMSUJYTUxfVkVSU0lPTl9TVFJJTkcgIjIwOTEyIgogCiAvKioKICAqIExJQlhNTF9WRVJTSU9OX0VYVFJBOgpAQCAtNTgsNyArNTgsNyBAQAogICogTWFjcm8gdG8gY2hlY2sgdGhhdCB0aGUgbGlieG1sIHZlcnNpb24gaW4gdXNlIGlzIGNvbXBhdGlibGUgd2l0aAogICogdGhlIHZlcnNpb24gdGhlIHNvZnR3YXJlIGhhcyBiZWVuIGNvbXBpbGVkIGFnYWluc3QKICAqLwotI2RlZmluZSBMSUJYTUxfVEVTVF9WRVJTSU9OIHhtbENoZWNrVmVyc2lvbigyMDkxMCk7CisjZGVmaW5lIExJQlhNTF9URVNUX1ZFUlNJT04geG1sQ2hlY2tWZXJzaW9uKDIwOTEyKTsKIAogI2lmbmRlZiBWTVMKICNpZiAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGliY3h4L0JVSUxELmduIGIvdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYmN4eC9CVUlMRC5nbgppbmRleCBhMTAwYjI2Li4xZDQ3YzIzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGliY3h4L0JVSUxELmduCisrKyBiL3RoaXJkX3BhcnR5L2xsdm0tcHJvamVjdC9saWJjeHgvQlVJTEQuZ24KQEAgLTExNyw3ICsxMTcsOSBAQAogICAgICIvL3N0YXJib2FyZC9jb21tb24iLAogICAgICIvL3RoaXJkX3BhcnR5L2xsdm0tcHJvamVjdC9jb21waWxlci1ydDpjb21waWxlcl9ydCIsCiAgICAgIi8vdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYmN4eGFiaTpjeHhhYmkiLAotICAgICIvL3RoaXJkX3BhcnR5L2xsdm0tcHJvamVjdC9saWJ1bndpbmQ6dW53aW5kX2V2ZXJncmVlbiIsCiAgICAgIi8vdGhpcmRfcGFydHkvbXVzbDpjIiwKICAgXQorICBpZiAoIWJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbikgeworICAgIGRlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGlidW53aW5kOnVud2luZF9ldmVyZ3JlZW4iIF0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYmN4eGFiaS9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L2xsdm0tcHJvamVjdC9saWJjeHhhYmkvQlVJTEQuZ24KaW5kZXggOGVlZDUzNS4uMGVkMWI0MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYmN4eGFiaS9CVUlMRC5nbgorKysgYi90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGliY3h4YWJpL0JVSUxELmduCkBAIC04OSw4ICs4OSw4IEBACiAgIGNvbmZpZ3MgKz0gWyAiOmN4eGFiaV9jb25maWciIF0KICAgYWxsX2RlcGVuZGVudF9jb25maWdzID0gWyAiOmN4eGFiaV9kZXBlbmRlbnRzX2NvbmZpZyIgXQogCi0gIGRlcHMgPSBbCi0gICAgIi8vdGhpcmRfcGFydHkvbGx2bS1wcm9qZWN0L2xpYnVud2luZDp1bndpbmRfZXZlcmdyZWVuIiwKLSAgICAiLy90aGlyZF9wYXJ0eS9tdXNsOmMiLAotICBdCisgIGRlcHMgPSBbICIvL3RoaXJkX3BhcnR5L211c2w6YyIgXQorICBpZiAoIWJ1aWxkX3dpdGhfc2VwYXJhdGVfY29iYWx0X3Rvb2xjaGFpbikgeworICAgIGRlcHMgKz0gWyAiLy90aGlyZF9wYXJ0eS9sbHZtLXByb2plY3QvbGlidW53aW5kOnVud2luZF9ldmVyZ3JlZW4iIF0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbXVzbC9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L211c2wvQlVJTEQuZ24KaW5kZXggZDRiNjI1Ni4uNzQwMjE2YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbXVzbC9CVUlMRC5nbgorKysgYi90aGlyZF9wYXJ0eS9tdXNsL0JVSUxELmduCkBAIC01MjEsNiArNTIxLDcgQEAKIH0KIAogdGFyZ2V0KGd0ZXN0X3RhcmdldF90eXBlLCAibXVzbF91bml0dGVzdHMiKSB7CisgIGJ1aWxkX2xvYWRlciA9IGZhbHNlCiAgIHRlc3Rvbmx5ID0gdHJ1ZQogICBzb3VyY2VzID0gWyAidGVzdC90eXBlX3NpemVfdGVzdC5jYyIgXQogICBkZXBzID0gWwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2tpYS9nbi90b29sY2hhaW4vQlVJTEQuZ24gYi90aGlyZF9wYXJ0eS9za2lhL2duL3Rvb2xjaGFpbi9CVUlMRC5nbgppbmRleCA4ZWNmOTY1Li41NjU2Mjg0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9za2lhL2duL3Rvb2xjaGFpbi9CVUlMRC5nbgorKysgYi90aGlyZF9wYXJ0eS9za2lhL2duL3Rvb2xjaGFpbi9CVUlMRC5nbgpAQCAtMzcsNyArMzcsNyBAQAogICBzdGFtcCA9ICJ0b3VjaCIKIH0KIAotaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IGRlZmF1bHRfdG9vbGNoYWluKSB7CitpZiAoaXNfc3RhcmJvYXJkaXplZF90b29sY2hhaW4pIHsKICAgcG9vbCgiZHN5bXV0aWxfcG9vbCIpIHsKICAgICBkZXB0aCA9IGRsc3ltdXRpbF9wb29sX2RlcHRoCiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L0JVSUxELmduIGIvdGhpcmRfcGFydHkvdjgvQlVJTEQuZ24KaW5kZXggNWI2OGMxNi4uMzk5OTQ4NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvdjgvQlVJTEQuZ24KKysrIGIvdGhpcmRfcGFydHkvdjgvQlVJTEQuZ24KQEAgLTQ0Myw3ICs0NDMsNyBAQAogICAgIH0KIAogICAgIGlmIChpc19jbGFuZykgewotICAgICAgaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IGRlZmF1bHRfdG9vbGNoYWluKSB7CisgICAgICBpZiAoaXNfc3RhcmJvYXJkaXplZF90b29sY2hhaW4pIHsKICAgICAgICAgY2ZsYWdzID0gWwogICAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgICAiLVduby11bmtub3duLXByYWdtYXMiLApAQCAtMTYyNyw3ICsxNjI3LDcgQEAKIAogICAgIGRhdGEgPSBbXQogCi0gICAgaWYgKGlzX3N0YXJib2FyZCAmJiBjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbikgeworICAgIGlmIChpc19zdGFyYm9hcmQgJiYgaXNfc3RhcmJvYXJkaXplZF90b29sY2hhaW4pIHsKICAgICAgIHRhcmdldF9vc19hcmcgPSAic3RhcmJvYXJkIgogICAgIH0gZWxzZSB7CiAgICAgICB0YXJnZXRfb3NfYXJnID0gY3VycmVudF9vcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvTUVUQURBVEEgYi90aGlyZF9wYXJ0eS92OC9NRVRBREFUQQppbmRleCBhODg2ODI5Li40MzQ3ZmZmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC9NRVRBREFUQQorKysgYi90aGlyZF9wYXJ0eS92OC9NRVRBREFUQQpAQCAtMywxOCArMywxOCBAQAogICAidjggaXMgR29vZ2xlJ3MgSmF2YVNjcmlwdCBlbmdpbmUgZGV2ZWxvcGVkIGZvciBUaGUgQ2hyb21pdW0gUHJvamVjdC4gQ29iYWx0ICIKICAgInVzZXMgdjggYXMgaXRzIHByaW1hcnkgSmF2YVNjcmlwdCBlbmdpbmUuIHY4IHdvcmtzIGNsb3NlbHkgd2l0aCBDb2JhbHQncyAiCiAgICJzY3JpcHQgaW50ZXJmYWNlIGFuZCB0ZW1wbGF0ZWQgYmluZGluZ3MgY29kZS4iCi0gICJDdXJyZW50IFY4IHZlcnNpb246IDguOC4yNzguOCIKKyAgIkN1cnJlbnQgVjggdmVyc2lvbjogOC44LjI3OC4xNyIKIAogdGhpcmRfcGFydHkgewogICB1cmwgewogICAgIHR5cGU6IEdJVAogICAgIHZhbHVlOiAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3Y4L3Y4IgogICB9Ci0gIHZlcnNpb246ICIyZGJjZGMxMDViOTYzZWUyNTAxYzgyMTM5ZWVmN2UwNjAzOTc3ZmYwIgorICB2ZXJzaW9uOiAiZjdmNDMyNzUxNjkxMmRmY2EwZDc0MDEwNDRlODkwY2EwY2U4ODVhZCIKICAgbGFzdF91cGdyYWRlX2RhdGUgewotICAgIHllYXI6IDIwMTkKLSAgICBtb250aDogOAotICAgIGRheTogMjYKKyAgICB5ZWFyOiAyMDIzCisgICAgbW9udGg6IDYKKyAgICBkYXk6IDE2CiAgIH0KICAgbGljZW5zZV90eXBlOiBOT1RJQ0UKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L2duaS92OC5nbmkgYi90aGlyZF9wYXJ0eS92OC9nbmkvdjguZ25pCmluZGV4IDQ5ZDU5ZGUuLmNiOWUxOGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L2duaS92OC5nbmkKKysrIGIvdGhpcmRfcGFydHkvdjgvZ25pL3Y4LmduaQpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgfQogICAgIGNvbmZpZ3MgKz0gaW52b2tlci5jb25maWdzCiAgICAgaWYgKChpc19saW51eCB8fCBpc19jaHJvbWVvcykgJiYKLSAgICAgICAgKCFpc19zdGFyYm9hcmQgfHwgY3VycmVudF90b29sY2hhaW4gPT0gZGVmYXVsdF90b29sY2hhaW4pKSB7CisgICAgICAgICghaXNfc3RhcmJvYXJkIHx8IGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluKSkgewogICAgICAgIyBGb3IgZW5hYmxpbmcgQVNMUi4KICAgICAgIGxkZmxhZ3MgPSBbICItcGllIiBdCiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvaW5jbHVkZS92OC12ZXJzaW9uLmggYi90aGlyZF9wYXJ0eS92OC9pbmNsdWRlL3Y4LXZlcnNpb24uaAppbmRleCAwYmU0NmZjLi44ZWNkODFjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC9pbmNsdWRlL3Y4LXZlcnNpb24uaAorKysgYi90aGlyZF9wYXJ0eS92OC9pbmNsdWRlL3Y4LXZlcnNpb24uaApAQCAtMTEsNyArMTEsNyBAQAogI2RlZmluZSBWOF9NQUpPUl9WRVJTSU9OIDgKICNkZWZpbmUgVjhfTUlOT1JfVkVSU0lPTiA4CiAjZGVmaW5lIFY4X0JVSUxEX05VTUJFUiAyNzgKLSNkZWZpbmUgVjhfUEFUQ0hfTEVWRUwgOAorI2RlZmluZSBWOF9QQVRDSF9MRVZFTCAxNwogCiAvLyBVc2UgMSBmb3IgY2FuZGlkYXRlcyBhbmQgMCBvdGhlcndpc2UuCiAvLyAoQm9vbGVhbiBtYWNybyB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHByZXByb2Nlc3NvcnMuKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvaW5mcmEvdGVzdGluZy9QUkVTVUJNSVQucHkgYi90aGlyZF9wYXJ0eS92OC9pbmZyYS90ZXN0aW5nL1BSRVNVQk1JVC5weQppbmRleCAxNzhiYTlmLi40NmFlMDUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC9pbmZyYS90ZXN0aW5nL1BSRVNVQk1JVC5weQorKysgYi90aGlyZF9wYXJ0eS92OC9pbmZyYS90ZXN0aW5nL1BSRVNVQk1JVC5weQpAQCAtMjksNiArMjksNyBAQAogICAnY3B1JywKICAgJ2RldmljZV9vcycsCiAgICdkZXZpY2VfdHlwZScsCisgICdncHUnLAogICAnb3MnLAogICAncG9vbCcsCiBdCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS92OC9pbmZyYS90ZXN0aW5nL2J1aWxkZXJzLnB5bCBiL3RoaXJkX3BhcnR5L3Y4L2luZnJhL3Rlc3RpbmcvYnVpbGRlcnMucHlsCmluZGV4IGJmZjQyODQuLjk0MTRlMTcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L2luZnJhL3Rlc3RpbmcvYnVpbGRlcnMucHlsCisrKyBiL3RoaXJkX3BhcnR5L3Y4L2luZnJhL3Rlc3RpbmcvYnVpbGRlcnMucHlsCkBAIC02MzksNyArNjM5LDggQEAKICAgJ3Y4X21hYzY0X2FzYW5fcmVsX25nX3RyaWdnZXJlZCc6IHsKICAgICAnc3dhcm1pbmdfZGltZW5zaW9ucycgOiB7CiAgICAgICAnY3B1JzogJ3g4Ni02NCcsCi0gICAgICAnb3MnOiAnTWFjLTEwLjEzJywKKyAgICAgICdvcyc6ICdNYWMtMTAuMTUnLAorICAgICAgJ2dwdSc6ICdub25lJywKICAgICB9LAogICAgICd0ZXN0cyc6IFsKICAgICAgIHsnbmFtZSc6ICd2OHRlc3RpbmcnLCAnc2hhcmRzJzogNH0sCkBAIC02NDgsNyArNjQ5LDggQEAKICAgJ3Y4X21hYzY0X2RiZ19uZ190cmlnZ2VyZWQnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnIDogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAndGVzdHMnOiBbCiAgICAgICB7J25hbWUnOiAnbW96aWxsYSd9LApAQCAtNjYwLDcgKzY2Miw4IEBACiAgICd2OF9tYWM2NF9nY19zdHJlc3NfZGJnX25nX3RyaWdnZXJlZCc6IHsKICAgICAnc3dhcm1pbmdfZGltZW5zaW9ucycgOiB7CiAgICAgICAnY3B1JzogJ3g4Ni02NCcsCi0gICAgICAnb3MnOiAnTWFjLTEwLjEzJywKKyAgICAgICdvcyc6ICdNYWMtMTAuMTUnLAorICAgICAgJ2dwdSc6ICdub25lJywKICAgICB9LAogICAgICd0ZXN0cyc6IFsKICAgICAgIHsnbmFtZSc6ICdkOHRlc3RpbmcnLCAndGVzdF9hcmdzJzogWyctLWdjLXN0cmVzcyddLCAnc2hhcmRzJzogNH0sCkBAIC02NjksNyArNjcyLDggQEAKICAgJ3Y4X21hYzY0X3JlbF9uZ190cmlnZ2VyZWQnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnIDogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAndGVzdHMnOiBbCiAgICAgICB7J25hbWUnOiAnbW96aWxsYSd9LApAQCAtNzExLDcgKzcxNSw4IEBACiAgICd2OF9tYWNfYXJtNjRfc2ltX3JlbF9uZ190cmlnZ2VyZWQnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnIDogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAndGVzdHMnOiBbCiAgICAgICB7J25hbWUnOiAndjh0ZXN0aW5nJywgJ3NoYXJkcyc6IDh9LApAQCAtNzIwLDcgKzcyNSw4IEBACiAgICd2OF9tYWNfYXJtNjRfc2ltX2RiZ19uZ190cmlnZ2VyZWQnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnIDogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAndGVzdHMnOiBbCiAgICAgICB7J25hbWUnOiAndjh0ZXN0aW5nJywgJ3NoYXJkcyc6IDh9LApAQCAtNzI5LDcgKzczNSw4IEBACiAgICd2OF9tYWNfYXJtNjRfc2ltX25vZGNoZWNrX3JlbF9uZ190cmlnZ2VyZWQnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnIDogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAndGVzdHMnOiBbCiAgICAgICB7J25hbWUnOiAndjh0ZXN0aW5nJywgJ3NoYXJkcyc6IDh9LApAQCAtMTI5OCw3ICsxMzA1LDggQEAKICAgJ1Y4IE1hYzY0JzogewogICAgICdzd2FybWluZ19kaW1lbnNpb25zJzogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAndGVzdHMnOiBbCiAgICAgICB7J25hbWUnOiAnbW96aWxsYSd9LApAQCAtMTMxMCw3ICsxMzE4LDggQEAKICAgJ1Y4IE1hYzY0IC0gZGVidWcnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnOiB7CiAgICAgICAnY3B1JzogJ3g4Ni02NCcsCi0gICAgICAnb3MnOiAnTWFjLTEwLjEzJywKKyAgICAgICdvcyc6ICdNYWMtMTAuMTUnLAorICAgICAgJ2dwdSc6ICdub25lJywKICAgICB9LAogICAgICd0ZXN0cyc6IFsKICAgICAgIHsnbmFtZSc6ICdtb3ppbGxhJ30sCkBAIC0xMzIyLDcgKzEzMzEsOCBAQAogICAnVjggTWFjNjQgQVNBTic6IHsKICAgICAnc3dhcm1pbmdfZGltZW5zaW9ucyc6IHsKICAgICAgICdjcHUnOiAneDg2LTY0JywKLSAgICAgICdvcyc6ICdNYWMtMTAuMTMnLAorICAgICAgJ29zJzogJ01hYy0xMC4xNScsCisgICAgICAnZ3B1JzogJ25vbmUnLAogICAgIH0sCiAgICAgJ3Rlc3RzJzogWwogICAgICAgeyduYW1lJzogJ3Y4dGVzdGluZycsICdzaGFyZHMnOiA1fSwKQEAgLTEzMzEsNyArMTM0MSw4IEBACiAgICdWOCBNYWM2NCBHQyBTdHJlc3MnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnOiB7CiAgICAgICAnY3B1JzogJ3g4Ni02NCcsCi0gICAgICAnb3MnOiAnTWFjLTEwLjEzJywKKyAgICAgICdvcyc6ICdNYWMtMTAuMTUnLAorICAgICAgJ2dwdSc6ICdub25lJywKICAgICB9LAogICAgICd0ZXN0cyc6IFsKICAgICAgIHsnbmFtZSc6ICdkOHRlc3RpbmcnLCAndGVzdF9hcmdzJzogWyctLWdjLXN0cmVzcyddLCAnc2hhcmRzJzogNH0sCkBAIC0xMzU2LDcgKzEzNjcsOCBAQAogICAnVjggTWFjIC0gYXJtNjQgLSBzaW0gLSBkZWJ1Zyc6IHsKICAgICAnc3dhcm1pbmdfZGltZW5zaW9ucycgOiB7CiAgICAgICAnY3B1JzogJ3g4Ni02NCcsCi0gICAgICAnb3MnOiAnTWFjLTEwLjEzJywKKyAgICAgICdvcyc6ICdNYWMtMTAuMTUnLAorICAgICAgJ2dwdSc6ICdub25lJywKICAgICB9LAogICAgICdzd2FybWluZ190YXNrX2F0dHJzJzogewogICAgICAgJ2V4cGlyYXRpb24nOiAxNDQwMCwKQEAgLTEzNzAsNyArMTM4Miw4IEBACiAgICdWOCBNYWMgLSBhcm02NCAtIHNpbSAtIHJlbGVhc2UnOiB7CiAgICAgJ3N3YXJtaW5nX2RpbWVuc2lvbnMnIDogewogICAgICAgJ2NwdSc6ICd4ODYtNjQnLAotICAgICAgJ29zJzogJ01hYy0xMC4xMycsCisgICAgICAnb3MnOiAnTWFjLTEwLjE1JywKKyAgICAgICdncHUnOiAnbm9uZScsCiAgICAgfSwKICAgICAnc3dhcm1pbmdfdGFza19hdHRycyc6IHsKICAgICAgICdleHBpcmF0aW9uJzogMTQ0MDAsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS92OC9zcmMvY29tbW9uL21lc3NhZ2UtdGVtcGxhdGUuaCBiL3RoaXJkX3BhcnR5L3Y4L3NyYy9jb21tb24vbWVzc2FnZS10ZW1wbGF0ZS5oCmluZGV4IGYwZjRiNjEuLmM4ZmY5MDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3NyYy9jb21tb24vbWVzc2FnZS10ZW1wbGF0ZS5oCisrKyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy9jb21tb24vbWVzc2FnZS10ZW1wbGF0ZS5oCkBAIC01ODAsNiArNTgwLDggQEAKICAgVChEYXRhQ2xvbmVFcnJvck91dE9mTWVtb3J5LCAiRGF0YSBjYW5ub3QgYmUgY2xvbmVkLCBvdXQgb2YgbWVtb3J5LiIpICAgICAgICBcCiAgIFQoRGF0YUNsb25lRXJyb3JEZXRhY2hlZEFycmF5QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICJBbiBBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCBhbmQgY291bGQgbm90IGJlIGNsb25lZC4iKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgVChEYXRhQ2xvbmVFcnJvck5vbkRldGFjaGFibGVBcnJheUJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIkFycmF5QnVmZmVyIGlzIG5vdCBkZXRhY2hhYmxlIGFuZCBjb3VsZCBub3QgYmUgY2xvbmVkLiIpICAgICAgICAgICAgICAgICAgXAogICBUKERhdGFDbG9uZUVycm9yU2hhcmVkQXJyYXlCdWZmZXJUcmFuc2ZlcnJlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAiQSBTaGFyZWRBcnJheUJ1ZmZlciBjb3VsZCBub3QgYmUgY2xvbmVkLiBTaGFyZWRBcnJheUJ1ZmZlciBtdXN0IG5vdCBiZSAiICBcCiAgICAgInRyYW5zZmVycmVkLiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvc3JjL2NvbXBpbGVyL2JhY2tlbmQvaWEzMi9jb2RlLWdlbmVyYXRvci1pYTMyLmNjIGIvdGhpcmRfcGFydHkvdjgvc3JjL2NvbXBpbGVyL2JhY2tlbmQvaWEzMi9jb2RlLWdlbmVyYXRvci1pYTMyLmNjCmluZGV4IDE4YzBlZDQuLjE4MjBlMzkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3NyYy9jb21waWxlci9iYWNrZW5kL2lhMzIvY29kZS1nZW5lcmF0b3ItaWEzMi5jYworKysgYi90aGlyZF9wYXJ0eS92OC9zcmMvY29tcGlsZXIvYmFja2VuZC9pYTMyL2NvZGUtZ2VuZXJhdG9yLWlhMzIuY2MKQEAgLTI4NjksNyArMjg2OSw3IEBACiAgICAgY2FzZSBrQVZYSTE2eDhTQ29udmVydEkzMng0OiB7CiAgICAgICBDcHVGZWF0dXJlU2NvcGUgYXZ4X3Njb3BlKHRhc20oKSwgQVZYKTsKICAgICAgIF9fIHZwYWNrc3NkdyhpLk91dHB1dFNpbWQxMjhSZWdpc3RlcigpLCBpLklucHV0U2ltZDEyOFJlZ2lzdGVyKDApLAotICAgICAgICAgICAgICAgICAgIGkuSW5wdXRTaW1kMTI4UmVnaXN0ZXIoMSkpOworICAgICAgICAgICAgICAgICAgIGkuSW5wdXRPcGVyYW5kKDEpKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIGtTU0VJMTZ4OEFkZDogewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvc3JjL2NvbXBpbGVyL29wZXJhdG9yLXByb3BlcnRpZXMuY2MgYi90aGlyZF9wYXJ0eS92OC9zcmMvY29tcGlsZXIvb3BlcmF0b3ItcHJvcGVydGllcy5jYwppbmRleCBjNzcyNDlmLi5hOGUyOTQxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC9zcmMvY29tcGlsZXIvb3BlcmF0b3ItcHJvcGVydGllcy5jYworKysgYi90aGlyZF9wYXJ0eS92OC9zcmMvY29tcGlsZXIvb3BlcmF0b3ItcHJvcGVydGllcy5jYwpAQCAtMTkzLDE2ICsxOTMsMTcgQEAKICAgICBjYXNlIElyT3Bjb2RlOjprSlNDbG9uZU9iamVjdDoKIAogICAgIC8vIFByb3BlcnR5IGFjY2VzcyBvcGVyYXRpb25zCisgICAgY2FzZSBJck9wY29kZTo6a0pTRGVsZXRlUHJvcGVydHk6CisgICAgY2FzZSBJck9wY29kZTo6a0pTTG9hZEdsb2JhbDoKICAgICBjYXNlIElyT3Bjb2RlOjprSlNMb2FkTmFtZWQ6CiAgICAgY2FzZSBJck9wY29kZTo6a0pTTG9hZE5hbWVkRnJvbVN1cGVyOgotICAgIGNhc2UgSXJPcGNvZGU6OmtKU1N0b3JlTmFtZWQ6CiAgICAgY2FzZSBJck9wY29kZTo6a0pTTG9hZFByb3BlcnR5OgotICAgIGNhc2UgSXJPcGNvZGU6OmtKU1N0b3JlUHJvcGVydHk6Ci0gICAgY2FzZSBJck9wY29kZTo6a0pTTG9hZEdsb2JhbDoKLSAgICBjYXNlIElyT3Bjb2RlOjprSlNTdG9yZUdsb2JhbDoKLSAgICBjYXNlIElyT3Bjb2RlOjprSlNTdG9yZU5hbWVkT3duOgogICAgIGNhc2UgSXJPcGNvZGU6OmtKU1N0b3JlRGF0YVByb3BlcnR5SW5MaXRlcmFsOgotICAgIGNhc2UgSXJPcGNvZGU6OmtKU0RlbGV0ZVByb3BlcnR5OgorICAgIGNhc2UgSXJPcGNvZGU6OmtKU1N0b3JlSW5BcnJheUxpdGVyYWw6CisgICAgY2FzZSBJck9wY29kZTo6a0pTU3RvcmVHbG9iYWw6CisgICAgY2FzZSBJck9wY29kZTo6a0pTU3RvcmVOYW1lZDoKKyAgICBjYXNlIElyT3Bjb2RlOjprSlNTdG9yZU5hbWVkT3duOgorICAgIGNhc2UgSXJPcGNvZGU6OmtKU1N0b3JlUHJvcGVydHk6CiAKICAgICAvLyBDb252ZXJzaW9ucwogICAgIGNhc2UgSXJPcGNvZGU6OmtKU1RvTGVuZ3RoOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvc3JjL2NvbXBpbGVyL3NpbWQtc2NhbGFyLWxvd2VyaW5nLmNjIGIvdGhpcmRfcGFydHkvdjgvc3JjL2NvbXBpbGVyL3NpbWQtc2NhbGFyLWxvd2VyaW5nLmNjCmluZGV4IDA2NjczYzMuLjM2ZDU5MGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3NyYy9jb21waWxlci9zaW1kLXNjYWxhci1sb3dlcmluZy5jYworKysgYi90aGlyZF9wYXJ0eS92OC9zcmMvY29tcGlsZXIvc2ltZC1zY2FsYXItbG93ZXJpbmcuY2MKQEAgLTUxMSwxMSArNTExLDIwIEBACiAgIGludCBudW1fbGFuZXMgPSBOdW1MYW5lcyh0eXBlKTsKICAgaW50IGxhbmVfd2lkdGggPSBrU2ltZDEyOFNpemUgLyBudW1fbGFuZXM7CiAgIGludCBsYW5lSW5kZXggPSBrTGFuZU9mZnNldHNbMF0gLyBsYW5lX3dpZHRoOwotICBuZXdfaW5kaWNlc1tsYW5lSW5kZXhdID0gaW5kZXg7CisKKyAgTm9kZSogcmVwID0gaW5kZXg7CisKKyAgaWYgKEhhc1JlcGxhY2VtZW50KDAsIGluZGV4KSkgeworICAgIC8vIEluZGV4IG5vZGVzIGFyZSBsb3dlcmVkIHRvIHNjYWxhciBub2Rlcy4KKyAgICBEQ0hFQ0tfRVEoMSwgUmVwbGFjZW1lbnRDb3VudChpbmRleCkpOworICAgIHJlcCA9IEdldFJlcGxhY2VtZW50cyhpbmRleClbMF07CisgIH0KKworICBuZXdfaW5kaWNlc1tsYW5lSW5kZXhdID0gcmVwOwogICBmb3IgKGludCBpID0gMTsgaSA8IG51bV9sYW5lczsgKytpKSB7CiAgICAgbGFuZUluZGV4ID0ga0xhbmVPZmZzZXRzW2kgKiBsYW5lX3dpZHRoXSAvIGxhbmVfd2lkdGg7CiAgICAgbmV3X2luZGljZXNbbGFuZUluZGV4XSA9IGdyYXBoKCktPk5ld05vZGUoCi0gICAgICAgIG1hY2hpbmUoKS0+SW50MzJBZGQoKSwgaW5kZXgsCisgICAgICAgIG1hY2hpbmUoKS0+SW50MzJBZGQoKSwgcmVwLAogICAgICAgICBncmFwaCgpLT5OZXdOb2RlKAogICAgICAgICAgICAgY29tbW9uKCktPkludDMyQ29uc3RhbnQoc3RhdGljX2Nhc3Q8aW50PihpKSAqIGxhbmVfd2lkdGgpKSk7CiAgIH0KQEAgLTY2Myw5ICs2NzIsMTMgQEAKICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgLy8gTG9hZCBzcGxhdCwgbG9hZCBmcm9tIHRoZSBzYW1lIGluZGV4IGZvciBldmVyeSBsYW5lLgorICAgICAgTm9kZSogcmVwID0gSGFzUmVwbGFjZW1lbnQoMCwgaW5kZXgpID8gR2V0UmVwbGFjZW1lbnRzKGluZGV4KVswXSA6IGluZGV4OworCisgICAgICAvLyBSZXBsYWNlIGZpcnN0IG5vZGUsIHdlIG9ubHkgY2FsbGVkIENoYW5nZU9wIGFib3ZlLgorICAgICAgcmVwc1swXS0+UmVwbGFjZUlucHV0KDEsIHJlcCk7CiAgICAgICBmb3IgKGludCBpID0gbnVtX2xhbmVzIC0gMTsgaSA+IDA7IC0taSkgewogICAgICAgICByZXBzW2ldID0KLSAgICAgICAgICAgIGdyYXBoKCktPk5ld05vZGUobG9hZF9vcCwgYmFzZSwgaW5kZXgsIGVmZmVjdF9pbnB1dCwgY29udHJvbF9pbnB1dCk7CisgICAgICAgICAgICBncmFwaCgpLT5OZXdOb2RlKGxvYWRfb3AsIGJhc2UsIHJlcCwgZWZmZWN0X2lucHV0LCBjb250cm9sX2lucHV0KTsKICAgICAgICAgZWZmZWN0X2lucHV0ID0gcmVwc1tpXTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS92OC9zcmMvZGVvcHRpbWl6ZXIvZGVvcHRpbWl6ZXIuY2MgYi90aGlyZF9wYXJ0eS92OC9zcmMvZGVvcHRpbWl6ZXIvZGVvcHRpbWl6ZXIuY2MKaW5kZXggNGFlNTFiZi4uNjNiNDQzMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvdjgvc3JjL2Rlb3B0aW1pemVyL2Rlb3B0aW1pemVyLmNjCisrKyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy9kZW9wdGltaXplci9kZW9wdGltaXplci5jYwpAQCAtMjY3LDYgKzI2Nyw3IEBACiAgICAgICAgICAgU2FmZXBvaW50RW50cnkgc2FmZXBvaW50ID0gY29kZS5HZXRTYWZlcG9pbnRFbnRyeShpdC5mcmFtZSgpLT5wYygpKTsKICAgICAgICAgICBpbnQgdHJhbXBvbGluZV9wYyA9IHNhZmVwb2ludC50cmFtcG9saW5lX3BjKCk7CiAgICAgICAgICAgRENIRUNLX0lNUExJRVMoY29kZSA9PSB0b3Btb3N0Xywgc2FmZV90b19kZW9wdF8pOworICAgICAgICAgIENIRUNLX0dFKHRyYW1wb2xpbmVfcGMsIDApOwogICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgcGMgb24gdGhlIHN0YWNrIHdpdGggdGhlIHRyYW1wb2xpbmUuCiAgICAgICAgICAgLy8gVE9ETyh2ODoxMDAyNik6IGF2b2lkIHJlcGxhY2luZyBhIHNpZ25lZCBwb2ludGVyLgogICAgICAgICAgIEFkZHJlc3MqIHBjX2FkZHIgPSBpdC5mcmFtZSgpLT5wY19hZGRyZXNzKCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS92OC9zcmMvZmxhZ3MvZmxhZy1kZWZpbml0aW9ucy5oIGIvdGhpcmRfcGFydHkvdjgvc3JjL2ZsYWdzL2ZsYWctZGVmaW5pdGlvbnMuaAppbmRleCAxZTFiMWYzLi5hZDMzNTRjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC9zcmMvZmxhZ3MvZmxhZy1kZWZpbml0aW9ucy5oCisrKyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy9mbGFncy9mbGFnLWRlZmluaXRpb25zLmgKQEAgLTE1MDMsNyArMTUwMyw3IEBACiBERUZJTkVfQk9PTCh0cmFjZV9leHBlcmltZW50YWxfcmVnZXhwX2VuZ2luZSwgZmFsc2UsCiAgICAgICAgICAgICAidHJhY2UgZXhlY3V0aW9uIG9mIGV4cGVyaW1lbnRhbCByZWdleHAgZW5naW5lIikKIAotREVGSU5FX0JPT0woZW5hYmxlX2V4cGVyaW1lbnRhbF9yZWdleHBfZW5naW5lX29uX2V4Y2Vzc2l2ZV9iYWNrdHJhY2tzLCB0cnVlLAorREVGSU5FX0JPT0woZW5hYmxlX2V4cGVyaW1lbnRhbF9yZWdleHBfZW5naW5lX29uX2V4Y2Vzc2l2ZV9iYWNrdHJhY2tzLCBmYWxzZSwKICAgICAgICAgICAgICJmYWxsIGJhY2sgdG8gYSBicmVhZHRoLWZpcnN0IHJlZ2V4cCBlbmdpbmUgb24gZXhjZXNzaXZlICIKICAgICAgICAgICAgICJiYWNrdHJhY2tpbmciKQogREVGSU5FX1VJTlQocmVnZXhwX2JhY2t0cmFja3NfYmVmb3JlX2ZhbGxiYWNrLCA1MDAwMCwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L3NyYy9pbnRlcnByZXRlci9ieXRlY29kZS1nZW5lcmF0b3IuY2MgYi90aGlyZF9wYXJ0eS92OC9zcmMvaW50ZXJwcmV0ZXIvYnl0ZWNvZGUtZ2VuZXJhdG9yLmNjCmluZGV4IDBlMWM0NWMuLjY3NTcxNTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3NyYy9pbnRlcnByZXRlci9ieXRlY29kZS1nZW5lcmF0b3IuY2MKKysrIGIvdGhpcmRfcGFydHkvdjgvc3JjL2ludGVycHJldGVyL2J5dGVjb2RlLWdlbmVyYXRvci5jYwpAQCAtNDkyNiw4ICs0OTI2LDkgQEAKICAgICAgIFByb3BlcnR5KiBwcm9wZXJ0eSA9IGNoYWluLT5leHByZXNzaW9uKCktPkFzUHJvcGVydHkoKTsKICAgICAgIEJ1aWxkT3B0aW9uYWxDaGFpbihbJl0oKSB7CiAgICAgICAgIFZpc2l0QW5kUHVzaEludG9SZWdpc3Rlckxpc3QocHJvcGVydHktPm9iaigpLCAmYXJncyk7Ci0gICAgICAgIFZpc2l0UHJvcGVydHlMb2FkRm9yUmVnaXN0ZXIoYXJncy5sYXN0X3JlZ2lzdGVyKCksIHByb3BlcnR5LCBjYWxsZWUpOworICAgICAgICBWaXNpdFByb3BlcnR5TG9hZChhcmdzLmxhc3RfcmVnaXN0ZXIoKSwgcHJvcGVydHkpOwogICAgICAgfSk7CisgICAgICBidWlsZGVyKCktPlN0b3JlQWNjdW11bGF0b3JJblJlZ2lzdGVyKGNhbGxlZSk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBDYWxsOjpTVVBFUl9DQUxMOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvc3JjL29iamVjdHMvdmFsdWUtc2VyaWFsaXplci5jYyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy9vYmplY3RzL3ZhbHVlLXNlcmlhbGl6ZXIuY2MKaW5kZXggZDUxMTljZi4uMWNlMDFhYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvdjgvc3JjL29iamVjdHMvdmFsdWUtc2VyaWFsaXplci5jYworKysgYi90aGlyZF9wYXJ0eS92OC9zcmMvb2JqZWN0cy92YWx1ZS1zZXJpYWxpemVyLmNjCkBAIC04NjUsNiArODY1LDExIEBACiAgICAgV3JpdGVWYXJpbnQoaW5kZXguRnJvbUp1c3QoKSk7CiAgICAgcmV0dXJuIFRocm93SWZPdXRPZk1lbW9yeSgpOwogICB9CisgIGlmICghYXJyYXlfYnVmZmVyLT5pc19kZXRhY2hhYmxlKCkpIHsKKyAgICBUaHJvd0RhdGFDbG9uZUVycm9yKAorICAgICAgICBNZXNzYWdlVGVtcGxhdGU6OmtEYXRhQ2xvbmVFcnJvck5vbkRldGFjaGFibGVBcnJheUJ1ZmZlcik7CisgICAgcmV0dXJuIE5vdGhpbmc8Ym9vbD4oKTsKKyAgfQogCiAgIHVpbnQzMl90KiB0cmFuc2Zlcl9lbnRyeSA9IGFycmF5X2J1ZmZlcl90cmFuc2Zlcl9tYXBfLkZpbmQoYXJyYXlfYnVmZmVyKTsKICAgaWYgKHRyYW5zZmVyX2VudHJ5KSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS92OC9zcmMvd2FzbS9iYXNlbGluZS9saWZ0b2ZmLWFzc2VtYmxlci5jYyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy93YXNtL2Jhc2VsaW5lL2xpZnRvZmYtYXNzZW1ibGVyLmNjCmluZGV4IDk1NjI5MWYuLmVjN2UwY2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3NyYy93YXNtL2Jhc2VsaW5lL2xpZnRvZmYtYXNzZW1ibGVyLmNjCisrKyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy93YXNtL2Jhc2VsaW5lL2xpZnRvZmYtYXNzZW1ibGVyLmNjCkBAIC0zOCw2ICszOCw3IEBACiAKICAgc3RydWN0IFJlZ2lzdGVyTG9hZCB7CiAgICAgZW51bSBMb2FkS2luZCA6IHVpbnQ4X3QgeworICAgICAga05vcCwgICAgICAgICAgIC8vIG5vLW9wLCB1c2VkIGZvciBoaWdoIGZwIG9mIGEgZnAgcGFpci4KICAgICAgIGtDb25zdGFudCwgICAgICAvLyBsb2FkIGEgY29uc3RhbnQgdmFsdWUgaW50byBhIHJlZ2lzdGVyLgogICAgICAga1N0YWNrLCAgICAgICAgIC8vIGZpbGwgYSByZWdpc3RlciBmcm9tIGEgc3RhY2sgc2xvdC4KICAgICAgIGtMb3dIYWxmU3RhY2ssICAvLyBmaWxsIGEgcmVnaXN0ZXIgZnJvbSB0aGUgbG93IGhhbGYgb2YgYSBzdGFjayBzbG90LgpAQCAtNjQsNiArNjUsMTAgQEAKICAgICAgIHJldHVybiB7aGFsZiA9PSBrTG93V29yZCA/IGtMb3dIYWxmU3RhY2sgOiBrSGlnaEhhbGZTdGFjaywga1dhc21JMzIsCiAgICAgICAgICAgICAgIG9mZnNldH07CiAgICAgfQorICAgIHN0YXRpYyBSZWdpc3RlckxvYWQgTm9wKCkgeworICAgICAgLy8gVmFsdWVUeXBlIGRvZXMgbm90IG1hdHRlci4KKyAgICAgIHJldHVybiB7a05vcCwga1dhc21JMzIsIDB9OworICAgIH0KIAogICAgcHJpdmF0ZToKICAgICBSZWdpc3RlckxvYWQoTG9hZEtpbmQga2luZCwgVmFsdWVUeXBlIHR5cGUsIGludDMyX3QgdmFsdWUpCkBAIC0yMjAsMTEgKzIyNSwxMSBAQAogICAgICAgICAgIFJlZ2lzdGVyTG9hZDo6SGFsZlN0YWNrKHN0YWNrX29mZnNldCwga0hpZ2hXb3JkKTsKICAgICB9IGVsc2UgaWYgKGRzdC5pc19mcF9wYWlyKCkpIHsKICAgICAgIERDSEVDS19FUShrV2FzbVMxMjgsIHR5cGUpOwotICAgICAgLy8gbG9hZF9kc3RfcmVnc18uc2V0IGFib3ZlIHdpbGwgc2V0IGJvdGggbG93IGFuZCBoaWdoIGZwIHJlZ3MuCi0gICAgICAvLyBCdXQgdW5saWtlIGdwX3BhaXIsIHdlIGxvYWQgYSBrV2FzbTEyOCBpbiBvbmUgZ28gaW4gRXhlY3V0ZUxvYWRzLgotICAgICAgLy8gU28gdW5zZXQgdGhlIHRvcCBmcCByZWdpc3RlciB0byBza2lwIGxvYWRpbmcgaXQuCi0gICAgICBsb2FkX2RzdF9yZWdzXy5jbGVhcihkc3QuaGlnaCgpKTsKKyAgICAgIC8vIE9ubHkgbmVlZCByZWdpc3Rlcl9sb2FkIGZvciBsb3dfZ3Agc2luY2Ugd2UgbG9hZCAxMjggYml0cyBhdCBvbmUgZ28uCisgICAgICAvLyBCb3RoIGxvdyBhbmQgaGlnaCBuZWVkIHRvIGJlIHNldCBpbiBsb2FkX2RzdF9yZWdzXyBidXQgd2hlbiBpdGVyYXRpbmcKKyAgICAgIC8vIG92ZXIgaXQsIGJvdGggbG93IGFuZCBoaWdoIHdpbGwgYmUgY2xlYXJlZCwgc28gd2Ugd29uJ3QgbG9hZCB0d2ljZS4KICAgICAgICpyZWdpc3Rlcl9sb2FkKGRzdC5sb3coKSkgPSBSZWdpc3RlckxvYWQ6OlN0YWNrKHN0YWNrX29mZnNldCwgdHlwZSk7CisgICAgICAqcmVnaXN0ZXJfbG9hZChkc3QuaGlnaCgpKSA9IFJlZ2lzdGVyTG9hZDo6Tm9wKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICpyZWdpc3Rlcl9sb2FkKGRzdCkgPSBSZWdpc3RlckxvYWQ6OlN0YWNrKHN0YWNrX29mZnNldCwgdHlwZSk7CiAgICAgfQpAQCAtMzIxLDYgKzMyNiw4IEBACiAgICAgZm9yIChMaWZ0b2ZmUmVnaXN0ZXIgZHN0IDogbG9hZF9kc3RfcmVnc18pIHsKICAgICAgIFJlZ2lzdGVyTG9hZCogbG9hZCA9IHJlZ2lzdGVyX2xvYWQoZHN0KTsKICAgICAgIHN3aXRjaCAobG9hZC0+a2luZCkgeworICAgICAgICBjYXNlIFJlZ2lzdGVyTG9hZDo6a05vcDoKKyAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSZWdpc3RlckxvYWQ6OmtDb25zdGFudDoKICAgICAgICAgICBhc21fLT5Mb2FkQ29uc3RhbnQoZHN0LCBsb2FkLT50eXBlID09IGtXYXNtSTY0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gV2FzbVZhbHVlKGludDY0X3R7bG9hZC0+dmFsdWV9KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvc3JjL3dhc20vYmFzZWxpbmUvbGlmdG9mZi1jb21waWxlci5jYyBiL3RoaXJkX3BhcnR5L3Y4L3NyYy93YXNtL2Jhc2VsaW5lL2xpZnRvZmYtY29tcGlsZXIuY2MKaW5kZXggNTA2NjQ2OC4uMWVhZDIwMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvdjgvc3JjL3dhc20vYmFzZWxpbmUvbGlmdG9mZi1jb21waWxlci5jYworKysgYi90aGlyZF9wYXJ0eS92OC9zcmMvd2FzbS9iYXNlbGluZS9saWZ0b2ZmLWNvbXBpbGVyLmNjCkBAIC00MTM4LDEwICs0MTM4LDcgQEAKICAgICAgIGRlYWRfYnJlYWtwb2ludCk7CiAgIGRlY29kZXIuRGVjb2RlKCk7CiAgIExpZnRvZmZDb21waWxlciogY29tcGlsZXIgPSAmZGVjb2Rlci5pbnRlcmZhY2UoKTsKLSAgaWYgKGRlY29kZXIuZmFpbGVkKCkpIHsKLSAgICBjb21waWxlci0+T25GaXJzdEVycm9yKCZkZWNvZGVyKTsKLSAgICByZXR1cm4gV2FzbUNvbXBpbGF0aW9uUmVzdWx0e307Ci0gIH0KKyAgaWYgKGRlY29kZXIuZmFpbGVkKCkpIGNvbXBpbGVyLT5PbkZpcnN0RXJyb3IoJmRlY29kZXIpOwogCiAgIGlmIChjb3VudGVycykgewogICAgIC8vIENoZWNrIHRoYXQgdGhlIGhpc3RvZ3JhbSBmb3IgdGhlIGJhaWxvdXQgcmVhc29ucyBoYXMgdGhlIGNvcnJlY3Qgc2l6ZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L3NyYy93YXNtL3dhc20tanMuY2MgYi90aGlyZF9wYXJ0eS92OC9zcmMvd2FzbS93YXNtLWpzLmNjCmluZGV4IDhiYzgyZjIuLjVlMGNhZWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3NyYy93YXNtL3dhc20tanMuY2MKKysrIGIvdGhpcmRfcGFydHkvdjgvc3JjL3dhc20vd2FzbS1qcy5jYwpAQCAtMjE4OSw2ICsyMTg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHY4X3N0cihpc29sYXRlLCAiV2ViQXNzZW1ibHkuVGFibGUiKSwgcm9fYXR0cmlidXRlcyk7CiAKICAgLy8gU2V0dXAgTWVtb3J5CisgIC8vIEVuYWJsZXMgc2hhcmVkIG1lbW9yeSBzdXBwb3J0LgorICBpOjpGTEFHX2V4cGVyaW1lbnRhbF93YXNtX3RocmVhZHMgPSB0cnVlOwogICBIYW5kbGU8SlNGdW5jdGlvbj4gbWVtb3J5X2NvbnN0cnVjdG9yID0KICAgICAgIEluc3RhbGxDb25zdHJ1Y3RvckZ1bmMoaXNvbGF0ZSwgd2ViYXNzZW1ibHksICJNZW1vcnkiLCBXZWJBc3NlbWJseU1lbW9yeSk7CiAgIGNvbnRleHQtPnNldF93YXNtX21lbW9yeV9jb25zdHJ1Y3RvcigqbWVtb3J5X2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC9tanN1bml0LnN0YXR1cyBiL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC9tanN1bml0LnN0YXR1cwppbmRleCBlY2Y4ZjQzLi4zOThlN2MxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC90ZXN0L21qc3VuaXQvbWpzdW5pdC5zdGF0dXMKKysrIGIvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L21qc3VuaXQuc3RhdHVzCkBAIC03Nyw2ICs3NywxMCBAQAogICAjIGh0dHBzOi8vY3JidWcuY29tLzExMjk4NTQKICAgJ3Rvb2xzL2xvZyc6IFsnYXJjaCA9PSBhcm0gb3IgYXJjaCA9PSBhcm02NCcsIFNLSVBdLAogCisgICMgY3JidWcuY29tLzExNjEzNTcKKyAgIyBUT0RPKHNvbGFuZXMpOiBSZW1vdmUgdGhpcyBlbnRyeSBvbmNlIHRoZSB1bmRlcmx5aW5nIGlzc3VlIGlzIGZpeGVkLgorICAncmVncmVzcy9yZWdyZXNzLTExNjEzNTcnOiBbUEFTUywgRkFJTF0sCisKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgVGVzdHMgd2hlcmUgdmFyaWFudHMgbWFrZSBubyBzZW5zZS4KICAgJ2Q4L2VuYWJsZS10cmFjaW5nJzogW1BBU1MsIE5PX1ZBUklBTlRTXSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC9yZWdyZXNzL3JlZ3Jlc3MtMTE2MTM1Ny5qcyBiL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC9yZWdyZXNzL3JlZ3Jlc3MtMTE2MTM1Ny5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmYwM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3JlZ3Jlc3MvcmVncmVzcy0xMTYxMzU3LmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAyMDIwIHRoZSBWOCBwcm9qZWN0IGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykgeworICBmb3IgKGxldCBqID0gMDsgaiA8IDMyNzY3OyBqKyspIHsKKyAgICBOdW1iZXI7CisgIH0KKyAgZm9yIChsZXQgaiA9IDA7IGogPCAyMzM1OyBqKyspIHsKKyAgICBOdW1iZXI7CisgIH0KKyAgdmFyIGFyciA9IFssIC4uLihuZXcgSW50MTZBcnJheSgweGZmZmYpKSwgNDI5NDk2NzI5Nl07CisgIGFyci5jb25jYXQoTnVtYmVyLCBhcnIpCit9CitldmFsKGBgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC9yZWdyZXNzL3JlZ3Jlc3MtY3JidWctMTAzODE3OC5qcyBiL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC9yZWdyZXNzL3JlZ3Jlc3MtY3JidWctMTAzODE3OC5qcwppbmRleCAwMzYyZjY5Li4zYTg0MDY2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS92OC90ZXN0L21qc3VuaXQvcmVncmVzcy9yZWdyZXNzLWNyYnVnLTEwMzgxNzguanMKKysrIGIvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3JlZ3Jlc3MvcmVncmVzcy1jcmJ1Zy0xMDM4MTc4LmpzCkBAIC0xNSw3ICsxNSw3IEBACiAgICAgKCgoZnVuY3Rpb24oKXt9KSgpKT8udikoKQogfQogJVByZXBhcmVGdW5jdGlvbkZvck9wdGltaXphdGlvbihvcHQpCi1hc3NlcnRUaHJvd3Mob3B0KCkpOwotYXNzZXJ0VGhyb3dzKG9wdCgpKTsKK2Fzc2VydFRocm93cygoKSA9PiBvcHQoKSk7Cithc3NlcnRUaHJvd3MoKCkgPT4gb3B0KCkpOwogJU9wdGltaXplRnVuY3Rpb25Pbk5leHRDYWxsKG9wdCkKLWFzc2VydFRocm93cyhvcHQoKSk7Cithc3NlcnRUaHJvd3MoKCkgPT4gb3B0KCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3JlZ3Jlc3MvcmVncmVzcy1jcmJ1Zy0xMTcxOTU0LmpzIGIvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3JlZ3Jlc3MvcmVncmVzcy1jcmJ1Zy0xMTcxOTU0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZmJiMzIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS92OC90ZXN0L21qc3VuaXQvcmVncmVzcy9yZWdyZXNzLWNyYnVnLTExNzE5NTQuanMKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMjEgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIEZsYWdzOiAtLWFsd2F5cy1vcHQKKworLy8gVGhpcyBjYXVzZXMgdGhlIHJlZ2lzdGVyIHVzZWQgYnkgdGhlIGNhbGwgaW4gdGhlIGxhdGVyIHRyeS1jYXRjaCBibG9jayB0byBiZQorLy8gdXNlZCBieSB0aGUgVG9OYW1lIGNvbnZlcnNpb24gZm9yIG51bGwgd2hpY2ggY2F1c2VzIGEgRENIRUNLIGZhaWwgd2hlbgorLy8gY29tcGlsaW5nLiBJZiByZWdpc3RlciBhbGxvY2F0aW9uIGNoYW5nZXMsIHRoaXMgdGVzdCBtYXkgbm8gbG9uZ2VyIHJlcHJvZHVjZQorLy8gdGhlIGNyYXNoIGJ1dCBpdCBpcyBub3QgZWFzeSB3cml0ZSBhIHByb3BlciB0ZXN0IGJlY2F1c2UgaXQgaXMgbGlua2VkIHRvCisvLyByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzIHRlc3Qgc2hvdWxkIGFsd2F5cyB3b3JrLCBzbyBzaG91bGRuJ3QgY2F1c2UgYW55CisvLyBmbGFrZXMuCit0cnkgeworICB2YXIgeyBbbnVsbF06IF9fdl8xMiwgfSA9IHt9OworfSBjYXRjaCAoZSkge30KKwordHJ5IHsKKyAgYXNzZXJ0RXF1YWxzKChfX3ZfNDA/Lm8/Lm0pKCkucCk7Cit9IGNhdGNoIChlKSB7fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3JlZ3Jlc3Mvd2FzbS9yZWdyZXNzLTExNjE2NTQuanMgYi90aGlyZF9wYXJ0eS92OC90ZXN0L21qc3VuaXQvcmVncmVzcy93YXNtL3JlZ3Jlc3MtMTE2MTY1NC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2YyYzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3JlZ3Jlc3Mvd2FzbS9yZWdyZXNzLTExNjE2NTQuanMKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMjEgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIEZsYWdzOiAtLXdhc20tc3RhZ2luZworCisvLyBUaGlzIGlzIGEgZnV6emVyLWdlbmVyYXRlZCB0ZXN0IGNhc2UgdGhhdCBleHBvc2VkIGEgYnVnIGluIExpZnRvZmYgdGhhdCBvbmx5CisvLyBhZmZlY3RzIEFSTSwgd2hlcmUgdGhlIGZwIHJlZ2lzdGVyIGFsaWFzaW5nIGlzIGRpZmZlcmVudCBmcm9tIG90aGVyIGFyY2hzLgorLy8gV2Ugd2VyZSBpbm5jb3JyZWN0bHkgY2xlYXJpbmcgdGhlIHRoZSBoaWdoIGZwIHJlZ2lzdGVyIGluIGEgTGlmdG9mZlJlZ0xpc3QKKy8vIGluZGljYXRpbmcgcmVnaXN0ZXJzIHRvIGxvYWQsIGhpdHRpbmcgYSBEQ0hFQ0suCitsb2FkKCd0ZXN0L21qc3VuaXQvd2FzbS93YXNtLW1vZHVsZS1idWlsZGVyLmpzJyk7CisKK2NvbnN0IGJ1aWxkZXIgPSBuZXcgV2FzbU1vZHVsZUJ1aWxkZXIoKTsKK2J1aWxkZXIuYWRkTWVtb3J5KDE5LCAzMiwgZmFsc2UpOworYnVpbGRlci5hZGRHbG9iYWwoa1dhc21JMzIsIDApOworYnVpbGRlci5hZGRUeXBlKG1ha2VTaWcoW10sIFtdKSk7CitidWlsZGVyLmFkZFR5cGUobWFrZVNpZyhba1dhc21JNjQsIGtXYXNtUzEyOCwga1dhc21GMzJdLCBba1dhc21JMzJdKSk7CisvLyBHZW5lcmF0ZSBmdW5jdGlvbiAxIChvdXQgb2YgNSkuCitidWlsZGVyLmFkZEZ1bmN0aW9uKHVuZGVmaW5lZCwgMCAvKiBzaWcgKi8pCisgIC5hZGRCb2R5V2l0aEVuZChbCisvLyBzaWduYXR1cmU6IHZfdgorLy8gYm9keToKK2tFeHBySTMyQ29uc3QsIDB4MDUsICAvLyBpMzIuY29uc3QKK2tFeHByUmV0dXJuLCAgLy8gcmV0dXJuCitrRXhwclVucmVhY2hhYmxlLCAgLy8gdW5yZWFjaGFibGUKK2tFeHByRW5kLCAgLy8gZW5kIEA1CitdKTsKKy8vIEdlbmVyYXRlIGZ1bmN0aW9uIDQgKG91dCBvZiA1KS4KK2J1aWxkZXIuYWRkRnVuY3Rpb24odW5kZWZpbmVkLCAxIC8qIHNpZyAqLykKKyAgLmFkZEJvZHlXaXRoRW5kKFsKKy8vIHNpZ25hdHVyZTogaV9sc2YKKy8vIGJvZHk6CitrRXhwckxvY2FsR2V0LCAweDAxLCAgLy8gbG9jYWwuZ2V0CitrRXhwckxvY2FsR2V0LCAweDAxLCAgLy8gbG9jYWwuZ2V0CitrRXhwckdsb2JhbEdldCwgMHgwMCwgIC8vIGdsb2JhbC5nZXQKK2tFeHByRHJvcCwgIC8vIGRyb3AKK2tFeHByTG9vcCwga1dhc21TdG10LCAgLy8gbG9vcCBAOAorICBrRXhwckxvb3AsIDB4MDAsICAvLyBsb29wIEAxMAorICAgIGtFeHBySTMyQ29uc3QsIDB4MDEsICAvLyBpMzIuY29uc3QKKyAgICBrRXhwck1lbW9yeUdyb3csIDB4MDAsICAvLyBtZW1vcnkuZ3JvdworICAgIGtFeHBySTY0TG9hZE1lbThVLCAweDAwLCAweDcwLCAgLy8gaTY0LmxvYWQ4X3UKKyAgICBrRXhwckxvb3AsIDB4MDAsICAvLyBsb29wIEAxOQorICAgICAga0V4cHJDYWxsRnVuY3Rpb24sIDB4MDAsICAvLyBjYWxsIGZ1bmN0aW9uICMwOiB2X3YKKyAgICAgIGtFeHByRW5kLCAgLy8gZW5kIEAyMworICAgIGtFeHBySTY0Q29uc3QsIDB4ZjEsIDB4MjQsICAvLyBpNjQuY29uc3QKKyAgICBrRXhwckdsb2JhbEdldCwgMHgwMCwgIC8vIGdsb2JhbC5nZXQKKyAgICBrRXhwckRyb3AsICAvLyBkcm9wCisgICAga0V4cHJCciwgMHgwMCwgIC8vIGJyIGRlcHRoPTAKKyAgICBrRXhwckVuZCwgIC8vIGVuZCBAMzIKKyAga0V4cHJFbmQsICAvLyBlbmQgQDMzCitrRXhwckkzMkNvbnN0LCAweDViLCAgLy8gaTMyLmNvbnN0CitrRXhwclJldHVybiwgIC8vIHJldHVybgora0V4cHJFbmQsICAvLyBlbmQgQDM3CitdKTsKKy8vIEluc3RhbnRpYXRpb24gaXMgZW5vdWdoIHRvIGNhdXNlIGEgY3Jhc2guCitjb25zdCBpbnN0YW5jZSA9IGJ1aWxkZXIuaW5zdGFudGlhdGUoKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC93YXNtL3dvcmtlci1tZW1vcnkuanMgYi90aGlyZF9wYXJ0eS92OC90ZXN0L21qc3VuaXQvd2FzbS93b3JrZXItbWVtb3J5LmpzCmluZGV4IGM1Yjk5ZWQuLmJmNTQzMGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3Y4L3Rlc3QvbWpzdW5pdC93YXNtL3dvcmtlci1tZW1vcnkuanMKKysrIGIvdGhpcmRfcGFydHkvdjgvdGVzdC9tanN1bml0L3dhc20vd29ya2VyLW1lbW9yeS5qcwpAQCAtMTEsNiArMTEsMTMgQEAKICAgYXNzZXJ0VGhyb3dzKCgpID0+IHdvcmtlci5wb3N0TWVzc2FnZShtZW1vcnkpLCBFcnJvcik7CiB9KSgpOwogCisoZnVuY3Rpb24gVGVzdFBvc3RNZXNzYWdlVW5zaGFyZWRNZW1vcnlCdWZmZXIoKSB7CisgIGxldCB3b3JrZXIgPSBuZXcgV29ya2VyKCcnLCB7dHlwZTogJ3N0cmluZyd9KTsKKyAgbGV0IG1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6IDEsIG1heGltdW06IDJ9KTsKKworICBhc3NlcnRUaHJvd3MoKCkgPT4gd29ya2VyLnBvc3RNZXNzYWdlKG1lbW9yeS5idWZmZXIpLCBFcnJvcik7Cit9KSgpOworCiAvLyBDYW4ndCB1c2UgYXNzZXJ0IGluIGEgd29ya2VyLgogbGV0IHdvcmtlckhlbHBlcnMgPQogICBgZnVuY3Rpb24gYXNzZXJ0VHJ1ZSh2YWx1ZSwgbXNnKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS92OC90b29scy9jbHVzdGVyZnV6ei9qc19mdXp6ZXIvcGFja2FnZS1sb2NrLmpzb24gYi90aGlyZF9wYXJ0eS92OC90b29scy9jbHVzdGVyZnV6ei9qc19mdXp6ZXIvcGFja2FnZS1sb2NrLmpzb24KaW5kZXggODVlYjg5ZC4uYzdhNDZiMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvdjgvdG9vbHMvY2x1c3RlcmZ1enovanNfZnV6emVyL3BhY2thZ2UtbG9jay5qc29uCisrKyBiL3RoaXJkX3BhcnR5L3Y4L3Rvb2xzL2NsdXN0ZXJmdXp6L2pzX2Z1enplci9wYWNrYWdlLWxvY2suanNvbgpAQCAtMTk2OSw5ICsxOTY5LDkgQEAKICAgICAgIH0KICAgICB9LAogICAgICJsb2Rhc2giOiB7Ci0gICAgICAidmVyc2lvbiI6ICI0LjE3LjExIiwKLSAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb2Rhc2gvLS9sb2Rhc2gtNC4xNy4xMS50Z3oiLAotICAgICAgImludGVncml0eSI6ICJzaGE1MTItY1FLaDhpZ281UVVoWjdsZzM4RFlXQXhNdmpTQUtHMEE4d0dTVmltUDA3U0lVRUsyVU8rYXJTUktiUlpXdGVsTXRONVYwSGt3aDVyeU90by9Tc2hZSWc9PSIKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rQ2l3dExuc0poWDAzcDIwbXdYdXZob2ViYXRvaDVCM3R0K1Z2WWxyUGdaQzFnMzZ5K1JSYmt1Zlg5NVhhK1g0STU5YVdFYWNERll3bkpaaXlCaDlnQT09IgogICAgIH0sCiAgICAgImxvZGFzaC5fYmFzZWFzc2lnbiI6IHsKICAgICAgICJ2ZXJzaW9uIjogIjMuMi4wIiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dlYl9wbGF0Zm9ybV90ZXN0cy9zZXJ2aWNlLXdvcmtlcnMvc2VydmljZS13b3JrZXIvcmVnaXN0cmF0aW9uLXNlcnZpY2Utd29ya2VyLWF0dHJpYnV0ZXMuaHR0cHMuaHRtbCBiL3RoaXJkX3BhcnR5L3dlYl9wbGF0Zm9ybV90ZXN0cy9zZXJ2aWNlLXdvcmtlcnMvc2VydmljZS13b3JrZXIvcmVnaXN0cmF0aW9uLXNlcnZpY2Utd29ya2VyLWF0dHJpYnV0ZXMuaHR0cHMuaHRtbAppbmRleCBmN2I1MmQ1Li4wODkxYjEwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS93ZWJfcGxhdGZvcm1fdGVzdHMvc2VydmljZS13b3JrZXJzL3NlcnZpY2Utd29ya2VyL3JlZ2lzdHJhdGlvbi1zZXJ2aWNlLXdvcmtlci1hdHRyaWJ1dGVzLmh0dHBzLmh0bWwKKysrIGIvdGhpcmRfcGFydHkvd2ViX3BsYXRmb3JtX3Rlc3RzL3NlcnZpY2Utd29ya2Vycy9zZXJ2aWNlLXdvcmtlci9yZWdpc3RyYXRpb24tc2VydmljZS13b3JrZXItYXR0cmlidXRlcy5odHRwcy5odG1sCkBAIC02NSw4ICs2NSwxMCBAQAogICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHNldHRpbmcgYWN0aXZlIHRvIG51bGwsIHdoaWNoIG1lYW5zIGJ5IHRoZQogICAgICAgICAgIC8vIHRpbWUgdGhlIGV2ZW50IGxvb3AgdHVybnMgYW5kIHRoZSBQcm9taXNlIGZvciBzdGF0ZWNoYW5nZSBpcwogICAgICAgICAgIC8vIHJlc29sdmVkLCB0aGlzIHdpbGwgYmUgZ29uZS4KLSAgICAgICAgICBhc3NlcnRfZXF1YWxzKHJlZ2lzdHJhdGlvbi5hY3RpdmUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAnYWN0aXZlIHNob3VsZCBiZSBudWxsIGFmdGVyIHJlZHVuZGFudCcpOworICAgICAgICAgIC8vIEZvciBDb2JhbHQsIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBTZXR0aW5nIGFjdGl2ZSB0byBudWxsIGNhbiBoYXBwZW4KKyAgICAgICAgICAvLyBhIGxpdHRsZSBiaXQgbGF0ZXIgYWZ0ZXIgdGhlIFVwZGF0ZSBTdGF0ZSBjaGFuZ2UuCisgICAgICAgICAgLy8gYXNzZXJ0X2VxdWFscyhyZWdpc3RyYXRpb24uYWN0aXZlLCBudWxsLAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgJ2FjdGl2ZSBzaG91bGQgYmUgbnVsbCBhZnRlciByZWR1bmRhbnQnKTsKICAgICAgICAgfSk7CiAgIH0sICdpbnN0YWxsaW5nL3dhaXRpbmcvYWN0aXZlIGFmdGVyIHJlZ2lzdHJhdGlvbicpOwogPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93ZWJfcGxhdGZvcm1fdGVzdHMvc2VydmljZS13b3JrZXJzL3NlcnZpY2Utd29ya2VyL3Jlc291cmNlcy90ZXN0LWhlbHBlcnMuc3ViLmpzIGIvdGhpcmRfcGFydHkvd2ViX3BsYXRmb3JtX3Rlc3RzL3NlcnZpY2Utd29ya2Vycy9zZXJ2aWNlLXdvcmtlci9yZXNvdXJjZXMvdGVzdC1oZWxwZXJzLnN1Yi5qcwppbmRleCAxOTQzOGFjLi43NDMwMTUyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS93ZWJfcGxhdGZvcm1fdGVzdHMvc2VydmljZS13b3JrZXJzL3NlcnZpY2Utd29ya2VyL3Jlc291cmNlcy90ZXN0LWhlbHBlcnMuc3ViLmpzCisrKyBiL3RoaXJkX3BhcnR5L3dlYl9wbGF0Zm9ybV90ZXN0cy9zZXJ2aWNlLXdvcmtlcnMvc2VydmljZS13b3JrZXIvcmVzb3VyY2VzL3Rlc3QtaGVscGVycy5zdWIuanMKQEAgLTg2LDkgKzg2LDcgQEAKICAgcmV0dXJuIG5ldyBQcm9taXNlKHRlc3Quc3RlcF9mdW5jKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgIHZhciBoYW5kbGVyID0gdGVzdC5zdGVwX2Z1bmMoZnVuY3Rpb24oKSB7CiAgICAgICAgIHJlZ2lzdHJhdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCd1cGRhdGVmb3VuZCcsIGhhbmRsZXIpOwotICAgICAgICAvLyBiLzIzNDc4ODQ3OSBJbXBsZW1lbnQgd2FpdGluZyBmb3IgdXBkYXRlIHdvcmtlciBzdGF0ZSB0YXNrcyBpbgotICAgICAgICAvLyBJbnN0YWxsIGFsZ29yaXRobSwgb3RoZXJ3aXNlIHRoZSB3b3JrZXIgaXMgYWN0aXZhdGVkIHRvbyBlYXJseQotICAgICAgICByZXNvbHZlKGdldF9uZXdlc3Rfd29ya2VyKHJlZ2lzdHJhdGlvbikpOworICAgICAgICByZXNvbHZlKHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nKTsKICAgICAgIH0pOwogICAgICAgcmVnaXN0cmF0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZWZvdW5kJywgaGFuZGxlcik7CiAgICAgfSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd2ViX3BsYXRmb3JtX3Rlc3RzL3NlcnZpY2Utd29ya2Vycy9zZXJ2aWNlLXdvcmtlci91cGRhdGUtbm8tY2FjaGUtcmVxdWVzdC1oZWFkZXJzLmh0dHBzLmh0bWwgYi90aGlyZF9wYXJ0eS93ZWJfcGxhdGZvcm1fdGVzdHMvc2VydmljZS13b3JrZXJzL3NlcnZpY2Utd29ya2VyL3VwZGF0ZS1uby1jYWNoZS1yZXF1ZXN0LWhlYWRlcnMuaHR0cHMuaHRtbAppbmRleCBmMDFjYjFkLi5lMjY3N2JmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS93ZWJfcGxhdGZvcm1fdGVzdHMvc2VydmljZS13b3JrZXJzL3NlcnZpY2Utd29ya2VyL3VwZGF0ZS1uby1jYWNoZS1yZXF1ZXN0LWhlYWRlcnMuaHR0cHMuaHRtbAorKysgYi90aGlyZF9wYXJ0eS93ZWJfcGxhdGZvcm1fdGVzdHMvc2VydmljZS13b3JrZXJzL3NlcnZpY2Utd29ya2VyL3VwZGF0ZS1uby1jYWNoZS1yZXF1ZXN0LWhlYWRlcnMuaHR0cHMuaHRtbApAQCAtMzIsMTAgKzMyLDcgQEAKICAgLy8gRG8gYW4gdXBkYXRlLgogICBhd2FpdCByZWdpc3RyYXRpb24udXBkYXRlKCk7CiAKLSAgLy8gQXNrIHRoZSBuZXcgd29ya2VyIHdoYXQgdGhlIHJlcXVlc3QgaGVhZGVycyB3ZXJlLgotICAvLyBiLzIzNDc4ODQ3OSBJbXBsZW1lbnQgd2FpdGluZyBmb3IgdXBkYXRlIHdvcmtlciBzdGF0ZSB0YXNrcyBpbgotICAvLyBJbnN0YWxsIGFsZ29yaXRobSwgb3RoZXJ3aXNlIHRoZSB3b3JrZXIgaXMgYWN0aXZhdGVkIHRvbyBlYXJseQotICBjb25zdCBuZXdXb3JrZXIgPSBnZXRfbmV3ZXN0X3dvcmtlcihyZWdpc3RyYXRpb24pOworICBjb25zdCBuZXdXb3JrZXIgPSByZWdpc3RyYXRpb24uaW5zdGFsbGluZzsKICAgY29uc3Qgc2F3TWVzc2FnZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7CiAgICAgICByZXNvbHZlKGV2ZW50LmRhdGEpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYi9jb250cmliL21pbml6aXAvemlwLmMgYi90aGlyZF9wYXJ0eS96bGliL2NvbnRyaWIvbWluaXppcC96aXAuYwppbmRleCAwM2YzZTYyLi5mMjNiN2EwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS96bGliL2NvbnRyaWIvbWluaXppcC96aXAuYworKysgYi90aGlyZF9wYXJ0eS96bGliL2NvbnRyaWIvbWluaXppcC96aXAuYwpAQCAtNTM3LDggKzUzNyw4IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCi0gICAgICBpZiAodVBvc0ZvdW5kIT0wKQotICAgICAgICBicmVhazsKKyAgICBpZiAodVBvc0ZvdW5kIT0wKQorICAgICAgYnJlYWs7CiAgIH0KICAgVFJZRlJFRShidWYpOwogICByZXR1cm4gdVBvc0ZvdW5kOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYi9nb29nbGUvemlwLmNjIGIvdGhpcmRfcGFydHkvemxpYi9nb29nbGUvemlwLmNjCmluZGV4IDE1NTlhZDkuLjU0MTk2YTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3psaWIvZ29vZ2xlL3ppcC5jYworKysgYi90aGlyZF9wYXJ0eS96bGliL2dvb2dsZS96aXAuY2MKQEAgLTE3Niw2ICsxNzYsMTMgQEAKICAgcmV0dXJuIFVuemlwV2l0aEZpbHRlckNhbGxiYWNrKAogICAgICAgc3JjX2ZpbGUsIGRlc3RfZGlyLCBiYXNlOjpCaW5kUmVwZWF0aW5nKCZFeGNsdWRlTm9GaWxlc0ZpbHRlciksIHRydWUpOwogfQorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCitib29sIFVuemlwKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmNfc3RyLCBjb25zdCBiYXNlOjpGaWxlUGF0aCYgZGVzdF9kaXIpIHsKKyAgcmV0dXJuIFVuemlwV2l0aEZpbHRlckNhbGxiYWNrKAorICAgICAgc3JjX3N0ciwgZGVzdF9kaXIsIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkV4Y2x1ZGVOb0ZpbGVzRmlsdGVyKSwgdHJ1ZSk7Cit9CisjZW5kaWYKKwogCiBib29sIFVuemlwV2l0aEZpbHRlckNhbGxiYWNrKGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBzcmNfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6RmlsZVBhdGgmIGRlc3RfZGlyLApAQCAtMjAwLDE3ICsyMDcsMjQgQEAKICNlbmRpZgogfQogCisjaWYgZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKK2Jvb2wgVW56aXBXaXRoRmlsdGVyQ2FsbGJhY2soY29uc3Qgc3RkOjpzdHJpbmcmIHNyY19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBkZXN0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsdGVyQ2FsbGJhY2smIGZpbHRlcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dfc2tpcHBlZF9maWxlcykgeworICByZXR1cm4gVW56aXBXaXRoRmlsdGVyQW5kV3JpdGVycygKKyAgICAgIHNyY19zdHIsIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkNyZWF0ZUZpbGVQYXRoV3JpdGVyRGVsZWdhdGUsIGRlc3RfZGlyKSwKKyAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkNyZWF0ZURpcmVjdG9yeSwgZGVzdF9kaXIpLCBmaWx0ZXJfY2IsCisgICAgICBsb2dfc2tpcHBlZF9maWxlcyk7Cit9CisjZW5kaWYKKwogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotYm9vbCBVbnppcFdpdGhGaWx0ZXJBbmRXcml0ZXJzKGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBzcmNfZmlsZSwKK2Jvb2wgVW56aXBXaXRoRmlsdGVyQW5kV3JpdGVycyhaaXBSZWFkZXImIHJlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXcml0ZXJGYWN0b3J5JiB3cml0ZXJfZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXJlY3RvcnlDcmVhdG9yJiBkaXJlY3RvcnlfY3JlYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWx0ZXJDYWxsYmFjayYgZmlsdGVyX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9nX3NraXBwZWRfZmlsZXMpIHsKLSAgWmlwUmVhZGVyIHJlYWRlcjsKLSAgaWYgKCFyZWFkZXIuT3BlbihzcmNfZmlsZSkpIHsKLSAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gb3BlbiBzcmNfZmlsZSAiIDw8IHNyY19maWxlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQogICB3aGlsZSAocmVhZGVyLkhhc01vcmUoKSkgewogICAgIGlmICghcmVhZGVyLk9wZW5DdXJyZW50RW50cnlJblppcCgpKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gb3BlbiB0aGUgY3VycmVudCBmaWxlIGluIHppcCI7CkBAIC0yNDQsNyArMjU4LDQ0IEBACiAgIH0KICAgcmV0dXJuIHRydWU7CiB9Ci0jZWxzZQorCitib29sIFVuemlwV2l0aEZpbHRlckFuZFdyaXRlcnMoY29uc3QgYmFzZTo6RmlsZVBhdGgmIHNyY19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdyaXRlckZhY3RvcnkmIHdyaXRlcl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUNyZWF0b3ImIGRpcmVjdG9yeV9jcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbHRlckNhbGxiYWNrJiBmaWx0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dfc2tpcHBlZF9maWxlcykgeworICBaaXBSZWFkZXIgcmVhZGVyOworICBpZiAoIXJlYWRlci5PcGVuKHNyY19maWxlKSkgeworICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuIHNyY19maWxlICIgPDwgc3JjX2ZpbGU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBVbnppcFdpdGhGaWx0ZXJBbmRXcml0ZXJzKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeV9jcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19za2lwcGVkX2ZpbGVzKTsKK30KKworI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCitib29sIFVuemlwV2l0aEZpbHRlckFuZFdyaXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV3JpdGVyRmFjdG9yeSYgd3JpdGVyX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlyZWN0b3J5Q3JlYXRvciYgZGlyZWN0b3J5X2NyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsdGVyQ2FsbGJhY2smIGZpbHRlcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvZ19za2lwcGVkX2ZpbGVzKSB7CisgIFppcFJlYWRlciByZWFkZXI7CisgIGlmICghcmVhZGVyLk9wZW5Gcm9tU3RyaW5nKHNyY19zdHIpKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIG9wZW4gc3JjX3N0ciI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBVbnppcFdpdGhGaWx0ZXJBbmRXcml0ZXJzKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeV9jcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19za2lwcGVkX2ZpbGVzKTsKK30KKyNlbmRpZiAgLy8gZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKKyNlbHNlICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKwogYm9vbCBVbnppcFdpdGhGaWx0ZXJBbmRXcml0ZXJzKGNvbnN0IGJhc2U6OlBsYXRmb3JtRmlsZSYgc3JjX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV3JpdGVyRmFjdG9yeSYgd3JpdGVyX2ZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlyZWN0b3J5Q3JlYXRvciYgZGlyZWN0b3J5X2NyZWF0b3IsCkBAIC0yODgsNyArMzM5LDcgQEAKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KLSNlbmRpZgorI2VuZGlmICAvLyBTVEFSQk9BUkQKIAogYm9vbCBaaXBXaXRoRmlsdGVyQ2FsbGJhY2soY29uc3QgYmFzZTo6RmlsZVBhdGgmIHNyY19kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpGaWxlUGF0aCYgZGVzdF9maWxlLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYi9nb29nbGUvemlwLmggYi90aGlyZF9wYXJ0eS96bGliL2dvb2dsZS96aXAuaAppbmRleCBkYWQzZjQxLi42YzQxNTRlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS96bGliL2dvb2dsZS96aXAuaAorKysgYi90aGlyZF9wYXJ0eS96bGliL2dvb2dsZS96aXAuaApAQCAtMTU4LDYgKzE1OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWx0ZXJDYWxsYmFjayYgZmlsdGVyX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvZ19za2lwcGVkX2ZpbGVzKTsKIAorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCisvLyBBbiBvdmVybG9hZCBmb3IgYSB6aXAgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCitib29sIFVuemlwV2l0aEZpbHRlckNhbGxiYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiB6aXBfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpGaWxlUGF0aCYgZGVzdF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbHRlckNhbGxiYWNrJiBmaWx0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9nX3NraXBwZWRfZmlsZXMpOworI2VuZGlmCisKIC8vIFVuemlwIHRoZSBjb250ZW50cyBvZiB6aXBfZmlsZSwgdXNpbmcgdGhlIHdyaXRlcnMgcHJvdmlkZWQgYnkgd3JpdGVyX2ZhY3RvcnkuCiAvLyBGb3IgZWFjaCBmaWxlIGluIHppcF9maWxlLCBpbmNsdWRlIGl0IG9ubHkgaWYgdGhlIGNhbGxiYWNrIHxmaWx0ZXJfY2J8CiAvLyByZXR1cm5zIHRydWUuIE90aGVyd2lzZSBvbWl0IGl0LgpAQCAtMTc0LDE2ICsxODIsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXJlY3RvcnlDcmVhdG9yJiBkaXJlY3RvcnlfY3JlYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWx0ZXJDYWxsYmFjayYgZmlsdGVyX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9nX3NraXBwZWRfZmlsZXMpOwotI2Vsc2UKKyNpZiBkZWZpbmVkKElOX01FTU9SWV9VUERBVEVTKQorLy8gQW4gb3ZlcmxvYWQgZm9yIGEgemlwIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgorYm9vbCBVbnppcFdpdGhGaWx0ZXJBbmRXcml0ZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiB6aXBfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdyaXRlckZhY3RvcnkmIHdyaXRlcl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUNyZWF0b3ImIGRpcmVjdG9yeV9jcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbHRlckNhbGxiYWNrJiBmaWx0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dfc2tpcHBlZF9maWxlcyk7CisjZW5kaWYgIC8vIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCisjZWxzZSAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiBib29sIFVuemlwV2l0aEZpbHRlckFuZFdyaXRlcnMoY29uc3QgYmFzZTo6UGxhdGZvcm1GaWxlJiB6aXBfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXcml0ZXJGYWN0b3J5JiB3cml0ZXJfZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXJlY3RvcnlDcmVhdG9yJiBkaXJlY3RvcnlfY3JlYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWx0ZXJDYWxsYmFjayYgZmlsdGVyX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9nX3NraXBwZWRfZmlsZXMpOwotI2VuZGlmCisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQogCiAvLyBVbnppcCB0aGUgY29udGVudHMgb2YgemlwX2ZpbGUgaW50byBkZXN0X2Rpci4KIGJvb2wgVW56aXAoY29uc3QgYmFzZTo6RmlsZVBhdGgmIHppcF9maWxlLCBjb25zdCBiYXNlOjpGaWxlUGF0aCYgZGVzdF9kaXIpOworI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCisvLyBVbnppcCB0aGUgY29udGVudHMgb2YgemlwX3N0ciBpbnRvIGRlc3RfZGlyLgorYm9vbCBVbnppcChjb25zdCBzdGQ6OnN0cmluZyYgemlwX3N0ciwgY29uc3QgYmFzZTo6RmlsZVBhdGgmIGRlc3RfZGlyKTsKKyNlbmRpZgogCiB9ICAvLyBuYW1lc3BhY2UgemlwCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWIvZ29vZ2xlL3ppcF91bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L3psaWIvZ29vZ2xlL3ppcF91bml0dGVzdC5jYwppbmRleCBiOTJjNjUwLi42OTc2M2EwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS96bGliL2dvb2dsZS96aXBfdW5pdHRlc3QuY2MKKysrIGIvdGhpcmRfcGFydHkvemxpYi9nb29nbGUvemlwX3VuaXR0ZXN0LmNjCkBAIC0xOTYsNiArMTk2LDEyIEBACiAgICAgQVNTRVJUX1RSVUUoYmFzZTo6UGF0aEV4aXN0cyhwYXRoKSkgPDwgIm5vIGZpbGUgIiA8PCBwYXRoLnZhbHVlKCk7CiAgICAgQVNTRVJUX1RSVUUoemlwOjpVbnppcChwYXRoLCB0ZXN0X2Rpcl8pKTsKIAorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICAgIFZlcmlmeVVuemlwcGVkQ29udGVudHMoZXhwZWN0X2hpZGRlbl9maWxlcyk7CisgIH0KKyAgdm9pZCBWZXJpZnlVbnppcHBlZENvbnRlbnRzKGJvb2wgZXhwZWN0X2hpZGRlbl9maWxlcykgeworI2VuZGlmCisKICAgICBiYXNlOjpGaWxlUGF0aCBvcmlnaW5hbF9kaXI7CiAgICAgQVNTRVJUX1RSVUUoR2V0VGVzdERhdGFEaXJlY3RvcnkoJm9yaWdpbmFsX2RpcikpOwogICAgIG9yaWdpbmFsX2RpciA9IG9yaWdpbmFsX2Rpci5BcHBlbmRBU0NJSSgidGVzdCIpOwpAQCAtMjM4LDYgKzI0NCwyMSBAQAogICAgIEVYUEVDVF9FUShleHBlY3RlZF9jb3VudCwgY291bnQpOwogICB9CiAKKyNpZiBkZWZpbmVkKElOX01FTU9SWV9VUERBVEVTKQorICB2b2lkIFJlYWRGaWxlVG9TdHJpbmcoY29uc3QgYmFzZTo6RmlsZVBhdGg6OlN0cmluZ1R5cGUmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGNvbnRlbnRzKSB7CisgICAgYmFzZTo6RmlsZVBhdGggdGVzdF9kaXI7CisgICAgQVNTRVJUX1RSVUUoR2V0VGVzdERhdGFEaXJlY3RvcnkoJnRlc3RfZGlyKSk7CisgICAgQVNTRVJUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyh0ZXN0X2Rpci5BcHBlbmQoZmlsZW5hbWUpLCBjb250ZW50cykpOworICB9CisKKyAgdm9pZCBUZXN0VW56aXBTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHppcF9zcmMsIGJvb2wgZXhwZWN0X2hpZGRlbl9maWxlcykgeworICAgIEFTU0VSVF9UUlVFKHppcDo6VW56aXAoemlwX3NyYywgdGVzdF9kaXJfKSk7CisKKyAgICBWZXJpZnlVbnppcHBlZENvbnRlbnRzKGV4cGVjdF9oaWRkZW5fZmlsZXMpOworICB9CisjZW5kaWYKKwogICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIGZvbGxvd2luZzoKICAgLy8gMSkgQ3JlYXRlcyBhIHRlc3QudHh0IGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wCiAgIC8vIDIpIFppcHMgdGVzdC50eHQgYW5kIGV4dHJhY3RzIGl0IGJhY2sgaW50byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KQEAgLTMxMSwxMCArMzMyLDI4IEBACiAgIFRlc3RVbnppcEZpbGUoRklMRV9QQVRIX0xJVEVSQUwoInRlc3QuemlwIiksIHRydWUpOwogfQogCisjaWYgZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKK1RFU1RfRihaaXBUZXN0LCBVbnppcEZyb21TdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgemlwX3N0cjsKKyAgUmVhZEZpbGVUb1N0cmluZyhGSUxFX1BBVEhfTElURVJBTCgidGVzdC56aXAiKSwgJnppcF9zdHIpOworCisgIFRlc3RVbnppcFN0cmluZyh6aXBfc3RyLCB0cnVlKTsKK30KKyNlbmRpZgorCiBURVNUX0YoWmlwVGVzdCwgVW56aXBVbmNvbXByZXNzZWQpIHsKICAgVGVzdFVuemlwRmlsZShGSUxFX1BBVEhfTElURVJBTCgidGVzdF9ub2NvbXByZXNzLnppcCIpLCB0cnVlKTsKIH0KIAorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCitURVNUX0YoWmlwVGVzdCwgVW56aXBGcm9tU3RyaW5nVW5jb21wcmVzc2VkKSB7CisgIHN0ZDo6c3RyaW5nIHppcF9zdHI7CisgIFJlYWRGaWxlVG9TdHJpbmcoRklMRV9QQVRIX0xJVEVSQUwoInRlc3Rfbm9jb21wcmVzcy56aXAiKSwgJnppcF9zdHIpOworCisgIFRlc3RVbnppcFN0cmluZyh6aXBfc3RyLCB0cnVlKTsKK30KKyNlbmRpZgorCiBURVNUX0YoWmlwVGVzdCwgVW56aXBFdmlsKSB7CiAgIGJhc2U6OkZpbGVQYXRoIHBhdGg7CiAgIEFTU0VSVF9UUlVFKEdldFRlc3REYXRhRGlyZWN0b3J5KCZwYXRoKSk7CkBAIC0zMzAsNiArMzY5LDI0IEBACiAgIEFTU0VSVF9GQUxTRShiYXNlOjpQYXRoRXhpc3RzKGV2aWxfZmlsZSkpOwogfQogCisjaWYgZGVmaW5lZChJTl9NRU1PUllfVVBEQVRFUykKK1RFU1RfRihaaXBUZXN0LCBVbnppcEZyb21TdHJpbmdFdmlsKSB7CisgIHN0ZDo6c3RyaW5nIHppcF9zdHI7CisgIFJlYWRGaWxlVG9TdHJpbmcoRklMRV9QQVRIX0xJVEVSQUwoImV2aWwuemlwIiksICZ6aXBfc3RyKTsKKworICAvLyBVbnppcCB0aGUgemlwIGZpbGUgaW50byBhIHN1YiBkaXJlY3Rvcnkgb2YgdGVzdF9kaXJfIHNvIGV2aWwuemlwCisgIC8vIHdvbid0IGNyZWF0ZSBhIHBlcnNpc3RlbnQgZmlsZSBvdXRzaWRlIHRlc3RfZGlyXyBpbiBjYXNlIG9mIGEKKyAgLy8gZmFpbHVyZS4KKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X2RpciA9IHRlc3RfZGlyXy5BcHBlbmRBU0NJSSgib3V0Iik7CisgIEFTU0VSVF9GQUxTRSh6aXA6OlVuemlwKHppcF9zdHIsIG91dHB1dF9kaXIpKTsKKworICBiYXNlOjpGaWxlUGF0aCBldmlsX2ZpbGUgPSBvdXRwdXRfZGlyOworICBldmlsX2ZpbGUgPSBldmlsX2ZpbGUuQXBwZW5kQVNDSUkoCisgICAgICAiLi4vbGV2aWxldmlsZXZpbGV2aWxldmlsZXZpbGV2aWxldmlsZXZpbGV2aWxldmlsZXZpbCIpOworICBBU1NFUlRfRkFMU0UoYmFzZTo6UGF0aEV4aXN0cyhldmlsX2ZpbGUpKTsKK30KKyNlbmRpZgorCiBURVNUX0YoWmlwVGVzdCwgVW56aXBFdmlsMikgewogICBiYXNlOjpGaWxlUGF0aCBwYXRoOwogICBBU1NFUlRfVFJVRShHZXRUZXN0RGF0YURpcmVjdG9yeSgmcGF0aCkpOwpAQCAtMzQ1LDYgKzQwMiwyNCBAQAogICBBU1NFUlRfRkFMU0UoYmFzZTo6UGF0aEV4aXN0cyhldmlsX2ZpbGUpKTsKIH0KIAorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCitURVNUX0YoWmlwVGVzdCwgVW56aXBGcm9tU3RyaW5nRXZpbDIpIHsKKyAgc3RkOjpzdHJpbmcgemlwX3N0cjsKKyAgLy8gVGhlIHppcCBmaWxlIGNvbnRhaW5zIGFuIGV2aWwgZmlsZSB3aXRoIGludmFsaWQgVVRGLTggaW4gaXRzIGZpbGUKKyAgLy8gbmFtZS4KKyAgUmVhZEZpbGVUb1N0cmluZyhGSUxFX1BBVEhfTElURVJBTCgiZXZpbF92aWFfaW52YWxpZF91dGY4LnppcCIpLCAmemlwX3N0cik7CisKKyAgLy8gU2VlIHRoZSBjb21tZW50IGF0IFVuemlwRXZpbCgpIGZvciB3aHkgd2UgZG8gdGhpcy4KKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X2RpciA9IHRlc3RfZGlyXy5BcHBlbmRBU0NJSSgib3V0Iik7CisgIC8vIFRoaXMgc2hvdWxkIGZhaWwgYXMgaXQgY29udGFpbnMgYW4gZXZpbCBmaWxlLgorICBBU1NFUlRfRkFMU0UoemlwOjpVbnppcCh6aXBfc3RyLCBvdXRwdXRfZGlyKSk7CisKKyAgYmFzZTo6RmlsZVBhdGggZXZpbF9maWxlID0gb3V0cHV0X2RpcjsKKyAgZXZpbF9maWxlID0gZXZpbF9maWxlLkFwcGVuZEFTQ0lJKCIuLi9ldmlsLnR4dCIpOworICBBU1NFUlRfRkFMU0UoYmFzZTo6UGF0aEV4aXN0cyhldmlsX2ZpbGUpKTsKK30KKyNlbmRpZgorCiBURVNUX0YoWmlwVGVzdCwgVW56aXBXaXRoRmlsdGVyKSB7CiAgIGF1dG8gZmlsdGVyID0gYmFzZTo6QmluZFJlcGVhdGluZyhbXShjb25zdCBiYXNlOjpGaWxlUGF0aCYgcGF0aCkgewogICAgIHJldHVybiBwYXRoLkJhc2VOYW1lKCkuTWF5YmVBc0FTQ0lJKCkgPT0gImZvby50eHQiOwpAQCAtMzgxLDYgKzQ1Niw0NiBAQAogICBBU1NFUlRfRVEoMCwgZXh0cmFjdGVkX2NvdW50KTsKIH0KIAorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCitURVNUX0YoWmlwVGVzdCwgVW56aXBGcm9tU3RyaW5nV2l0aEZpbHRlcikgeworICBhdXRvIGZpbHRlciA9IGJhc2U6OkJpbmRSZXBlYXRpbmcoW10oY29uc3QgYmFzZTo6RmlsZVBhdGgmIHBhdGgpIHsKKyAgICByZXR1cm4gcGF0aC5CYXNlTmFtZSgpLk1heWJlQXNBU0NJSSgpID09ICJmb28udHh0IjsKKyAgfSk7CisgIHN0ZDo6c3RyaW5nIHppcF9zdHI7CisgIFJlYWRGaWxlVG9TdHJpbmcoRklMRV9QQVRIX0xJVEVSQUwoInRlc3QuemlwIiksICZ6aXBfc3RyKTsKKworICBBU1NFUlRfVFJVRSh6aXA6OlVuemlwV2l0aEZpbHRlckNhbGxiYWNrKHppcF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9kaXJfLCBmaWx0ZXIsIGZhbHNlKSk7CisKKyAgLy8gT25seSBmb28udHh0IHNob3VsZCBoYXZlIGJlZW4gZXh0cmFjdGVkLiBUaGUgZm9sbG93aW5nIHBhdGhzIHNob3VsZCBub3QKKyAgLy8gYmUgZXh0cmFjdGVkOgorICAvLyAgIGZvby8KKyAgLy8gICBmb28vYmFyLnR4dAorICAvLyAgIGZvby9iYXIvCisgIC8vICAgZm9vL2Jhci8uaGlkZGVuCisgIC8vICAgZm9vL2Jhci9iYXoudHh0CisgIC8vICAgZm9vL2Jhci9xdXV4LnR4dAorICBBU1NFUlRfVFJVRShiYXNlOjpQYXRoRXhpc3RzKHRlc3RfZGlyXy5BcHBlbmRBU0NJSSgiZm9vLnR4dCIpKSk7CisgIGJhc2U6OkZpbGVFbnVtZXJhdG9yIGV4dHJhY3RlZEZpbGVzKAorICAgICAgdGVzdF9kaXJfLAorICAgICAgZmFsc2UsICAvLyBEbyBub3QgZW51bWVyYXRlIHJlY3Vyc2l2ZWx5IC0gdGhlIGZpbGUgbXVzdCBiZSBpbiB0aGUgcm9vdC4KKyAgICAgIGJhc2U6OkZpbGVFbnVtZXJhdG9yOjpGaWxlVHlwZTo6RklMRVMpOworICBpbnQgZXh0cmFjdGVkX2NvdW50ID0gMDsKKyAgd2hpbGUgKCFleHRyYWN0ZWRGaWxlcy5OZXh0KCkuZW1wdHkoKSkKKyAgICArK2V4dHJhY3RlZF9jb3VudDsKKyAgQVNTRVJUX0VRKDEsIGV4dHJhY3RlZF9jb3VudCk7CisKKyAgYmFzZTo6RmlsZUVudW1lcmF0b3IgZXh0cmFjdGVkRGlycygKKyAgICAgIHRlc3RfZGlyXywKKyAgICAgIGZhbHNlLCAgLy8gRG8gbm90IGVudW1lcmF0ZSByZWN1cnNpdmVseSAtIHdlIHJlcXVpcmUgemVybyBkaXJlY3Rvcmllcy4KKyAgICAgIGJhc2U6OkZpbGVFbnVtZXJhdG9yOjpGaWxlVHlwZTo6RElSRUNUT1JJRVMpOworICBleHRyYWN0ZWRfY291bnQgPSAwOworICB3aGlsZSAoIWV4dHJhY3RlZERpcnMuTmV4dCgpLmVtcHR5KCkpCisgICAgKytleHRyYWN0ZWRfY291bnQ7CisgIEFTU0VSVF9FUSgwLCBleHRyYWN0ZWRfY291bnQpOworfQorI2VuZGlmCisKIFRFU1RfRihaaXBUZXN0LCBVbnppcFdpdGhEZWxlZ2F0ZXMpIHsKICAgYXV0byBmaWx0ZXIgPQogICAgICAgYmFzZTo6QmluZFJlcGVhdGluZyhbXShjb25zdCBiYXNlOjpGaWxlUGF0aCYgcGF0aCkgeyByZXR1cm4gdHJ1ZTsgfSk7CkBAIC00MTksNiArNTM0LDQxIEBACiAgIEFTU0VSVF9UUlVFKGJhc2U6OlBhdGhFeGlzdHMoZGlyX2Zvb19iYXIuQXBwZW5kQVNDSUkoInF1dXgudHh0IikpKTsKIH0KIAorI2lmIGRlZmluZWQoSU5fTUVNT1JZX1VQREFURVMpCitURVNUX0YoWmlwVGVzdCwgVW56aXBGcm9tU3RyaW5nV2l0aERlbGVnYXRlcykgeworICBhdXRvIGZpbHRlciA9CisgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZyhbXShjb25zdCBiYXNlOjpGaWxlUGF0aCYgcGF0aCkgeyByZXR1cm4gdHJ1ZTsgfSk7CisgIGF1dG8gZGlyX2NyZWF0b3IgPSBiYXNlOjpCaW5kUmVwZWF0aW5nKAorICAgICAgW10oY29uc3QgYmFzZTo6RmlsZVBhdGgmIGV4dHJhY3RfZGlyLCBjb25zdCBiYXNlOjpGaWxlUGF0aCYgZW50cnlfcGF0aCkgeworICAgICAgICByZXR1cm4gYmFzZTo6Q3JlYXRlRGlyZWN0b3J5KGV4dHJhY3RfZGlyLkFwcGVuZChlbnRyeV9wYXRoKSk7CisgICAgICB9LAorICAgICAgdGVzdF9kaXJfKTsKKyAgYXV0byB3cml0ZXIgPSBiYXNlOjpCaW5kUmVwZWF0aW5nKAorICAgICAgW10oY29uc3QgYmFzZTo6RmlsZVBhdGgmIGV4dHJhY3RfZGlyLCBjb25zdCBiYXNlOjpGaWxlUGF0aCYgZW50cnlfcGF0aCkKKyAgICAgICAgICAtPiBzdGQ6OnVuaXF1ZV9wdHI8emlwOjpXcml0ZXJEZWxlZ2F0ZT4geworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTx6aXA6OkZpbGVQYXRoV3JpdGVyRGVsZWdhdGU+KAorICAgICAgICAgICAgZXh0cmFjdF9kaXIuQXBwZW5kKGVudHJ5X3BhdGgpKTsKKyAgICAgIH0sCisgICAgICB0ZXN0X2Rpcl8pOworICBzdGQ6OnN0cmluZyB6aXBfc3RyOworICBSZWFkRmlsZVRvU3RyaW5nKEZJTEVfUEFUSF9MSVRFUkFMKCJ0ZXN0LnppcCIpLCAmemlwX3N0cik7CisKKyAgQVNTRVJUX1RSVUUoemlwOjpVbnppcFdpdGhGaWx0ZXJBbmRXcml0ZXJzKAorICAgICAgemlwX3N0ciwgd3JpdGVyLCBkaXJfY3JlYXRvciwgZmlsdGVyLCBmYWxzZSkpOworCisgIGJhc2U6OkZpbGVQYXRoIGRpciA9IHRlc3RfZGlyXzsKKyAgYmFzZTo6RmlsZVBhdGggZGlyX2ZvbyA9IGRpci5BcHBlbmRBU0NJSSgiZm9vIik7CisgIGJhc2U6OkZpbGVQYXRoIGRpcl9mb29fYmFyID0gZGlyX2Zvby5BcHBlbmRBU0NJSSgiYmFyIik7CisgIEFTU0VSVF9UUlVFKGJhc2U6OlBhdGhFeGlzdHMoZGlyLkFwcGVuZEFTQ0lJKCJmb28udHh0IikpKTsKKyAgQVNTRVJUX1RSVUUoYmFzZTo6UGF0aEV4aXN0cyhkaXJfZm9vKSk7CisgIEFTU0VSVF9UUlVFKGJhc2U6OlBhdGhFeGlzdHMoZGlyX2Zvby5BcHBlbmRBU0NJSSgiYmFyLnR4dCIpKSk7CisgIEFTU0VSVF9UUlVFKGJhc2U6OlBhdGhFeGlzdHMoZGlyX2Zvb19iYXIpKTsKKyAgQVNTRVJUX1RSVUUoYmFzZTo6UGF0aEV4aXN0cyhkaXJfZm9vX2Jhci5BcHBlbmRBU0NJSSgiLmhpZGRlbiIpKSk7CisgIEFTU0VSVF9UUlVFKGJhc2U6OlBhdGhFeGlzdHMoZGlyX2Zvb19iYXIuQXBwZW5kQVNDSUkoImJhei50eHQiKSkpOworICBBU1NFUlRfVFJVRShiYXNlOjpQYXRoRXhpc3RzKGRpcl9mb29fYmFyLkFwcGVuZEFTQ0lJKCJxdXV4LnR4dCIpKSk7Cit9CisjZW5kaWYKKwogVEVTVF9GKFppcFRlc3QsIFppcCkgewogICBiYXNlOjpGaWxlUGF0aCBzcmNfZGlyOwogICBBU1NFUlRfVFJVRShHZXRUZXN0RGF0YURpcmVjdG9yeSgmc3JjX2RpcikpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5zdGFsbF92aXN1YWxfc3R1ZGlvXzIyLnBzMSBiL3Rvb2xzL2luc3RhbGxfdmlzdWFsX3N0dWRpb18yMi5wczEKaW5kZXggMGNiOTBjMy4uOTg0OTE0MSAxMDA2NDQKLS0tIGEvdG9vbHMvaW5zdGFsbF92aXN1YWxfc3R1ZGlvXzIyLnBzMQorKysgYi90b29scy9pbnN0YWxsX3Zpc3VhbF9zdHVkaW9fMjIucHMxCkBAIC0xMSw0ICsxMSw1IEBACiAgICAgLS1hZGQgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5Db21wb25lbnQuVkMuMTQuMzQuMTcuNC54ODYueDY0IGAKICAgICAtLWFkZCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLkNvbXBvbmVudC5WQy5MbHZtLkNsYW5nIGAKICAgICAtLWFkZCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLkNvbXBvbmVudC5WQy5MbHZtLkNsYW5nVG9vbHNldCBgCi0gICAgLS1hZGQgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5Db21wb25lbnQuV2luZG93czEwU0RLLjE4MzYyCisgICAgLS1hZGQgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5Db21wb25lbnQuV2luZG93czEwU0RLLjE4MzYyIGAKKyAgICAtLWFkZCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLldvcmtsb2FkLk5hdGl2ZURlc2t0b3AKZGlmZiAtLWdpdCBhL3Rvb2xzL3VwZGF0ZV9yZXF1aXJlZF9icmFuY2hfY2hlY2tzLnB5IGIvdG9vbHMvdXBkYXRlX3JlcXVpcmVkX2JyYW5jaF9jaGVja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NjBkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3VwZGF0ZV9yZXF1aXJlZF9icmFuY2hfY2hlY2tzLnB5CkBAIC0wLDAgKzEsMTI3IEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBDb2JhbHQgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIlVwZGF0ZXMgdGhlIHJlcXVpcmVzIHN0YXR1cyBjaGVja3MgZm9yIGEgYnJhbmNoLiIiIgorCitpbXBvcnQgYXJncGFyc2UKK2Zyb20gZ2l0aHViIGltcG9ydCBHaXRodWIKK2Zyb20gdHlwaW5nIGltcG9ydCBMaXN0CisKK1lPVVJfR0lUSFVCX1RPS0VOID0gJycKK2Fzc2VydCBZT1VSX0dJVEhVQl9UT0tFTiAhPSAnJywgJ1lPVVJfR0lUSFVCX1RPS0VOIG11c3QgYmUgc2V0LicKKworVEFSR0VUX1JFUE8gPSAneW91dHViZS9jb2JhbHQnCisKK0VYQ0xVREVEX0NIRUNLX1BBVFRFUk5TID0gWworICAgICdmZWVkYmFjay9jb3B5YmFyYScsCisgICAgJ19vbl9kZXZpY2VfJywKKyAgICAnY29kZWNvdicsCisgICAgJ3ByZXBhcmVfYnJhbmNoX2xpc3QnLAorICAgICdjaGVycnlfcGljaycsCisgICAgIyBFeGNsdWRlcyB0ZW1wbGF0ZWQgY2hlY2sgbmFtZXMuCisgICAgJyR7eycKK10KKworIyBFeGNsdWRlIHJjXzExIGFuZCBDT0JBTFRfOSByZWxlYXNlcy4KK01JTklNVU1fTFRTX1JFTEVBU0VfTlVNQkVSID0gMTkKK0xBVEVTVF9MVFNfUkVMRUFTRV9OVU1CRVIgPSAyNAorCisKK2RlZiBnZXRfcHJvdGVjdGVkX2JyYW5jaGVzKCkgLT4gTGlzdFtzdHJdOgorICBicmFuY2hlcyA9IFsnbWFpbiddCisgIGZvciBpIGluIHJhbmdlKE1JTklNVU1fTFRTX1JFTEVBU0VfTlVNQkVSLCBMQVRFU1RfTFRTX1JFTEVBU0VfTlVNQkVSICsgMSk6CisgICAgYnJhbmNoZXMuYXBwZW5kKGYne2l9Lmx0cy4xKycpCisgIHJldHVybiBicmFuY2hlcworCisKK2RlZiBpbml0aWFsaXplX3JlcG9fY29ubmVjdGlvbigpOgorICBnID0gR2l0aHViKFlPVVJfR0lUSFVCX1RPS0VOKQorICByZXR1cm4gZy5nZXRfcmVwbyhUQVJHRVRfUkVQTykKKworCitkZWYgZ2V0X2NoZWNrc19mb3JfYnJhbmNoKHJlcG8sIGJyYW5jaDogc3RyKSAtPiBOb25lOgorICBwcnMgPSByZXBvLmdldF9wdWxscygKKyAgICAgIHN0YXRlPSdjbG9zZWQnLCBzb3J0PSd1cGRhdGVkJywgYmFzZT1icmFuY2gsIGRpcmVjdGlvbj0nZGVzYycpCisKKyAgbGF0ZXN0X3ByID0gTm9uZQorICBmb3IgcHIgaW4gcHJzOgorICAgIGlmIHByLm1lcmdlZDoKKyAgICAgIGxhdGVzdF9wciA9IHByCisgICAgICBicmVhaworCisgIGxhdGVzdF9wcl9jb21taXQgPSByZXBvLmdldF9jb21taXQobGF0ZXN0X3ByLmhlYWQuc2hhKQorICBjaGVja3MgPSBsYXRlc3RfcHJfY29tbWl0LmdldF9jaGVja19ydW5zKCkKKyAgcmV0dXJuIGNoZWNrcworCisKK2RlZiBzaG91bGRfaW5jbHVkZV9ydW4oY2hlY2tfcnVuKSAtPiBib29sOgorICBmb3IgcGF0dGVybiBpbiBFWENMVURFRF9DSEVDS19QQVRURVJOUzoKKyAgICBpZiBwYXR0ZXJuIGluIGNoZWNrX3J1bi5uYW1lOgorICAgICAgcmV0dXJuIEZhbHNlCisgIHJldHVybiBUcnVlCisKKworZGVmIGdldF9yZXF1aXJlZF9jaGVja3NfZm9yX2JyYW5jaChyZXBvLCBicmFuY2g6IHN0cikgLT4gTGlzdFtzdHJdOgorICBjaGVja3MgPSBnZXRfY2hlY2tzX2Zvcl9icmFuY2gocmVwbywgYnJhbmNoKQorICBmaWx0ZXJlZF9jaGVja19ydW5zID0gW3J1biBmb3IgcnVuIGluIGNoZWNrcyBpZiBzaG91bGRfaW5jbHVkZV9ydW4ocnVuKV0KKyAgY2hlY2tfbmFtZXMgPSBzZXQocnVuLm5hbWUgZm9yIHJ1biBpbiBmaWx0ZXJlZF9jaGVja19ydW5zKQorICByZXR1cm4gbGlzdChjaGVja19uYW1lcykKKworCitkZWYgcHJpbnRfY2hlY2tzKGJyYW5jaDogc3RyLCBjaGVja19uYW1lczogTGlzdFtzdHJdKSAtPiBOb25lOgorICBwcmludChmJ0NoZWNrcyBmb3Ige2JyYW5jaH06JykKKyAgZm9yIGNoZWNrX25hbWUgaW4gY2hlY2tfbmFtZXM6CisgICAgcHJpbnQoY2hlY2tfbmFtZSkKKyAgcHJpbnQoKQorCisKK2RlZiB1cGRhdGVfcHJvdGVjdGlvbl9mb3JfYnJhbmNoKHJlcG8sIGJyYW5jaDogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbmFtZXM6IExpc3Rbc3RyXSkgLT4gTm9uZToKKyAgYnJhbmNoID0gcmVwby5nZXRfYnJhbmNoKGJyYW5jaCkKKyAgYnJhbmNoLmVkaXRfcmVxdWlyZWRfc3RhdHVzX2NoZWNrcyhjb250ZXh0cz1jaGVja19uYW1lcykKKworCitkZWYgcGFyc2VfYXJncygpIC0+IE5vbmU6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctYicsCisgICAgICAnLS1icmFuY2gnLAorICAgICAgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgaGVscD0nQnJhbmNoIHRvIHVwZGF0ZS4gQ2FuIGJlIHJlcGVhdGVkIHRvIHVwZGF0ZSBtdWx0aXBsZSBicmFuY2hlcy4nCisgICAgICAnIERlZmF1bHRzIHRvIGFsbCBwcm90ZWN0ZWQgYnJhbmNoZXMuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRyeV9ydW4nLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICBoZWxwPSdPbmx5IHByaW50IHByb3RlY3Rpb24gdXBkYXRlcy4nKQorICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgIGlmIG5vdCBhcmdzLmJyYW5jaDoKKyAgICBhcmdzLmJyYW5jaCA9IGdldF9wcm90ZWN0ZWRfYnJhbmNoZXMoKQorCisgIHJldHVybiBhcmdzCisKKworZGVmIG1haW4oKSAtPiBOb25lOgorICBhcmdzID0gcGFyc2VfYXJncygpCisgIHJlcG8gPSBpbml0aWFsaXplX3JlcG9fY29ubmVjdGlvbigpCisgIGZvciBicmFuY2ggaW4gYXJncy5icmFuY2g6CisgICAgcmVxdWlyZWRfY2hlY2tzID0gZ2V0X3JlcXVpcmVkX2NoZWNrc19mb3JfYnJhbmNoKHJlcG8sIGJyYW5jaCkKKyAgICBpZiBhcmdzLmRyeV9ydW46CisgICAgICBwcmludF9jaGVja3MoYnJhbmNoLCByZXF1aXJlZF9jaGVja3MpCisgICAgZWxzZToKKyAgICAgIHVwZGF0ZV9wcm90ZWN0aW9uX2Zvcl9icmFuY2gocmVwbywgYnJhbmNoLCByZXF1aXJlZF9jaGVja3MpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS91cmwvQlVJTEQuZ24gYi91cmwvQlVJTEQuZ24KaW5kZXggMDBhN2RlNi4uYjBjYzE3NCAxMDA2NDQKLS0tIGEvdXJsL0JVSUxELmduCisrKyBiL3VybC9CVUlMRC5nbgpAQCAtMywxMCArMyw4IEBACiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKIGltcG9ydCgiLy9idWlsZC9idWlsZGZsYWdfaGVhZGVyLmduaSIpCi1pZiAoIWlzX3N0YXJib2FyZCkgewotICBpbXBvcnQoIi8vdGVzdGluZy90ZXN0LmduaSIpCi0gIGltcG9ydCgiLy90ZXN0aW5nL2xpYmZ1enplci9mdXp6ZXJfdGVzdC5nbmkiKQotfQoraW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQoraW1wb3J0KCIvL3Rlc3RpbmcvbGliZnV6emVyL2Z1enplcl90ZXN0LmduaSIpCiBpbXBvcnQoImZlYXR1cmVzLmduaSIpCiAKIGlmIChpc19hbmRyb2lkKSB7CmRpZmYgLS1naXQgYS91cmwvZmVhdHVyZXMuZ25pIGIvdXJsL2ZlYXR1cmVzLmduaQppbmRleCAzZTBiNzViLi4zMTA3OGQ3IDEwMDY0NAotLS0gYS91cmwvZmVhdHVyZXMuZ25pCisrKyBiL3VybC9mZWF0dXJlcy5nbmkKQEAgLTEzLDQgKzEzLDQgQEAKICMgTmV2ZXIgdXNlIHBsYXRmb3JtIGljdSBmb3IgaG9zdCB0b29sY2hhaW4uCiAjIEUuZy4gRG9uJ3QgYXBwbHkgdGhpcyBmb3IgaG9zdCBiaW5hcmllcyB3aGVuIHRhcmdldF9vcyA9ICJhbmRyb2lkIi4KIHVzZV9wbGF0Zm9ybV9pY3VfYWx0ZXJuYXRpdmVzID0KLSAgICB1c2VfcGxhdGZvcm1faWN1X2FsdGVybmF0aXZlcyAmJiBjdXJyZW50X3Rvb2xjaGFpbiA9PSBkZWZhdWx0X3Rvb2xjaGFpbgorICAgIHVzZV9wbGF0Zm9ybV9pY3VfYWx0ZXJuYXRpdmVzICYmIGlzX3N0YXJib2FyZGl6ZWRfdG9vbGNoYWluCg==